From 63287fef9c3290a1e11b5e83bff648b385ad80ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Tue, 27 Aug 2024 23:35:02 +0200 Subject: [PATCH 001/829] [rubygems/rubygems] Fix grammar in one spec description https://github.com/rubygems/rubygems/commit/a1046466c9 --- spec/bundler/install/git_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/bundler/install/git_spec.rb b/spec/bundler/install/git_spec.rb index caed4571e5ebb0..d1f6b7a7ca7538 100644 --- a/spec/bundler/install/git_spec.rb +++ b/spec/bundler/install/git_spec.rb @@ -63,7 +63,7 @@ expect(the_bundle).to include_gems "foo 2.0", source: "git@#{lib_path("foo")}" end - it "should allows git repos that are missing but not being installed" do + it "allows git repos that are missing but not being installed" do revision = build_git("foo").ref_for("HEAD") gemfile <<-G From 08b92b67ffdfbfaf53974457308b719f6e2d0d24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Tue, 27 Aug 2024 23:35:43 +0200 Subject: [PATCH 002/829] [rubygems/rubygems] Don't blow up when explicit version is removed from some git sources `version` is actually an attribute of the dependency, not of the git source. Sometimes it's passed to the git source to be able to fake a gemspec in case there's no gemspec in the source, but it should not be used for source comparison. https://github.com/rubygems/rubygems/commit/d936fbd78e --- lib/bundler/source/git.rb | 4 ++-- spec/bundler/install/gemfile/git_spec.rb | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/lib/bundler/source/git.rb b/lib/bundler/source/git.rb index 9ce74adc2c1ce4..08a41a59ba66e7 100644 --- a/lib/bundler/source/git.rb +++ b/lib/bundler/source/git.rb @@ -70,13 +70,13 @@ def to_gemfile end def hash - [self.class, uri, ref, branch, name, version, glob, submodules].hash + [self.class, uri, ref, branch, name, glob, submodules].hash end def eql?(other) other.is_a?(Git) && uri == other.uri && ref == other.ref && branch == other.branch && name == other.name && - version == other.version && glob == other.glob && + glob == other.glob && submodules == other.submodules end diff --git a/spec/bundler/install/gemfile/git_spec.rb b/spec/bundler/install/gemfile/git_spec.rb index d76a33f07607f5..a544080fe6c1d3 100644 --- a/spec/bundler/install/gemfile/git_spec.rb +++ b/spec/bundler/install/gemfile/git_spec.rb @@ -1107,6 +1107,25 @@ run "require 'new_file'" expect(out).to eq("USING GIT") end + + it "doesn't explode when removing an explicit exact version from a git gem with dependencies" do + build_lib "activesupport", "7.1.4", path: lib_path("rails/activesupport") + build_git "rails", "7.1.4", path: lib_path("rails") do |s| + s.add_dependency "activesupport", "= 7.1.4" + end + + install_gemfile <<-G + source "https://gem.repo1" + gem "rails", "7.1.4", :git => "#{lib_path("rails")}" + G + + install_gemfile <<-G + source "https://gem.repo1" + gem "rails", :git => "#{lib_path("rails")}" + G + + expect(the_bundle).to include_gem "rails 7.1.4", "activesupport 7.1.4" + end end describe "bundle install after the remote has been updated" do From 830ff66e2c7315470580dd8531f4c10b0200aed5 Mon Sep 17 00:00:00 2001 From: Matt Brictson Date: Sat, 24 Aug 2024 14:16:59 -0700 Subject: [PATCH 003/829] [rubygems/rubygems] Emit progress to stderr when `--parseable` is passed to `bundle outdated` Before, `bundle outdated --parseable` (or `--porcelain`) caused output to be completely silenced during definition resolution, so nothing was printed at all until the table of outdated gems was printed. With this change, `--parseable`/`--porcelain` now prints progress to stderr during resolution. E.g.: ``` Fetching gem metadata from https://rubygems.org/......... Resolving dependencies... ``` This provides a better user experience, especially when `outdated --parseable` takes several seconds or more. The report of outdated gems is still printed to stdout, and the exit status codes are unchanged, so the fundamental contract with other tools consuming the `outdated --parseable` result should not be affected. https://github.com/rubygems/rubygems/commit/7d4bb43570 --- lib/bundler/cli/outdated.rb | 2 +- lib/bundler/ui/shell.rb | 12 ++++++++++++ lib/bundler/ui/silent.rb | 4 ++++ spec/bundler/commands/outdated_spec.rb | 25 +++++++++++++++++++++++-- 4 files changed, 40 insertions(+), 3 deletions(-) diff --git a/lib/bundler/cli/outdated.rb b/lib/bundler/cli/outdated.rb index ec42e631bb7545..64a83fd57e4ed0 100644 --- a/lib/bundler/cli/outdated.rb +++ b/lib/bundler/cli/outdated.rb @@ -54,7 +54,7 @@ def run end if options[:parseable] - Bundler.ui.silence(&definition_resolution) + Bundler.ui.progress(&definition_resolution) else definition_resolution.call end diff --git a/lib/bundler/ui/shell.rb b/lib/bundler/ui/shell.rb index 32367a44f06e5f..6df1512a5b867d 100644 --- a/lib/bundler/ui/shell.rb +++ b/lib/bundler/ui/shell.rb @@ -119,6 +119,10 @@ def silence(&blk) with_level("silent", &blk) end + def progress(&blk) + with_output_stream(:stderr, &blk) + end + def unprinted_warnings [] end @@ -170,6 +174,14 @@ def with_level(level) ensure @level = original end + + def with_output_stream(symbol) + original = output_stream + self.output_stream = symbol + yield + ensure + @output_stream = original + end end end end diff --git a/lib/bundler/ui/silent.rb b/lib/bundler/ui/silent.rb index 9ca2a8b485c32c..83d31d4b5530e6 100644 --- a/lib/bundler/ui/silent.rb +++ b/lib/bundler/ui/silent.rb @@ -84,6 +84,10 @@ def silence yield end + def progress + yield + end + def unprinted_warnings @warnings end diff --git a/spec/bundler/commands/outdated_spec.rb b/spec/bundler/commands/outdated_spec.rb index 55706df0d6791e..8bf3a468b4a821 100644 --- a/spec/bundler/commands/outdated_spec.rb +++ b/spec/bundler/commands/outdated_spec.rb @@ -438,19 +438,40 @@ def test_group_option(group) G end - it "outputs a sorted list of outdated gems with a more minimal format" do + it "outputs a sorted list of outdated gems with a more minimal format to stdout" do minimal_output = "activesupport (newest 3.0, installed 2.3.5, requested = 2.3.5)\n" \ "weakling (newest 0.2, installed 0.0.3, requested ~> 0.0.1)" subject expect(out).to eq(minimal_output) end + + it "outputs progress to stderr" do + subject + expect(err).to include("Fetching gem metadata") + end end context "and no gems are outdated" do - it "has empty output" do + before do + build_repo2 do + build_gem "activesupport", "3.0" + end + + install_gemfile <<-G + source "https://gem.repo2" + gem "activesupport", "3.0" + G + end + + it "does not output to stdout" do subject expect(out).to be_empty end + + it "outputs progress to stderr" do + subject + expect(err).to include("Fetching gem metadata") + end end end From e3f00df2278f8b23278cffc74db11b10c4bf030b Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Thu, 29 Aug 2024 15:05:00 -0400 Subject: [PATCH 004/829] Drop support for Motorola 68000 The last Motorla 68000 architecture CPU was released 1994, so we can probably drop support for it. --- gc.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/gc.c b/gc.c index 899a846af208b0..554185273720dc 100644 --- a/gc.c +++ b/gc.c @@ -2244,11 +2244,6 @@ static void each_stack_location(const VALUE *stack_start, const VALUE *stack_end, void (*cb)(void *data, VALUE obj), void *data) { gc_mark_locations(stack_start, stack_end, cb, data); - -#if defined(__mc68000__) - gc_mark_locations((VALUE*)((char*)stack_start + 2), - (VALUE*)((char*)stack_end - 2), cb, data); -#endif } struct mark_machine_stack_location_maybe_data { From ca7b3d467d8ea2c86fb1fadc5c5eae28db54639c Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Thu, 29 Aug 2024 16:27:11 -0400 Subject: [PATCH 005/829] Combine gc_mark_locations and each_stack_location Also renames the new function each_location_ptr to be consistent with each_location. --- gc.c | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/gc.c b/gc.c index 554185273720dc..163f117adc3e46 100644 --- a/gc.c +++ b/gc.c @@ -2111,19 +2111,16 @@ each_location(register const VALUE *x, register long n, void (*cb)(void *data, V } static void -gc_mark_locations(const VALUE *start, const VALUE *end, void (*cb)(void *, VALUE), void *data) +each_location_ptr(const VALUE *start, const VALUE *end, void (*cb)(void *, VALUE), void *data) { - long n; - if (end <= start) return; - n = end - start; - each_location(start, n, cb, data); + each_location(start, end - start, cb, data); } void rb_gc_mark_locations(const VALUE *start, const VALUE *end) { - gc_mark_locations(start, end, rb_gc_impl_mark_maybe, rb_gc_get_objspace()); + each_location_ptr(start, end, rb_gc_impl_mark_maybe, rb_gc_get_objspace()); } void @@ -2240,12 +2237,6 @@ mark_m_tbl(void *objspace, struct rb_id_table *tbl) ((start) = STACK_END, (end) = STACK_START) : ((start) = STACK_START, (end) = STACK_END+(appendix))) #endif -static void -each_stack_location(const VALUE *stack_start, const VALUE *stack_end, void (*cb)(void *data, VALUE obj), void *data) -{ - gc_mark_locations(stack_start, stack_end, cb, data); -} - struct mark_machine_stack_location_maybe_data { void *objspace; #ifdef RUBY_ASAN_ENABLED @@ -2270,7 +2261,7 @@ gc_mark_machine_stack_location_maybe(void *data, VALUE obj) &fake_frame_start, &fake_frame_end ); if (is_fake_frame) { - each_stack_location(fake_frame_start, fake_frame_end, rb_gc_impl_mark_maybe, objspace); + each_location_ptr(ec, fake_frame_start, fake_frame_end, rb_gc_impl_mark_maybe, objspace); } #endif } @@ -2293,10 +2284,10 @@ static void mark_current_machine_context(void *objspace, rb_execution_context_t *ec) { emscripten_scan_stack(rb_mark_locations); - each_stack_location(rb_stack_range_tmp[0], rb_stack_range_tmp[1], rb_gc_impl_mark_maybe, objspace); + each_location_ptr(rb_stack_range_tmp[0], rb_stack_range_tmp[1], rb_gc_impl_mark_maybe, objspace); emscripten_scan_registers(rb_mark_locations); - each_stack_location(rb_stack_range_tmp[0], rb_stack_range_tmp[1], rb_gc_impl_mark_maybe, objspace); + each_location_ptr(rb_stack_range_tmp[0], rb_stack_range_tmp[1], rb_gc_impl_mark_maybe, objspace); } # else // use Asyncify version @@ -2306,10 +2297,10 @@ mark_current_machine_context(void *objspace, rb_execution_context_t *ec) VALUE *stack_start, *stack_end; SET_STACK_END; GET_STACK_BOUNDS(stack_start, stack_end, 1); - each_stack_location(stack_start, stack_end, rb_gc_impl_mark_maybe, objspace); + each_location_ptr(stack_start, stack_end, rb_gc_impl_mark_maybe, objspace); rb_wasm_scan_locals(rb_mark_locations); - each_stack_location(rb_stack_range_tmp[0], rb_stack_range_tmp[1], rb_gc_impl_mark_maybe, objspace); + each_location_ptr(rb_stack_range_tmp[0], rb_stack_range_tmp[1], rb_gc_impl_mark_maybe, objspace); } # endif @@ -2344,7 +2335,7 @@ mark_current_machine_context(void *objspace, rb_execution_context_t *ec) }; each_location(save_regs_gc_mark.v, numberof(save_regs_gc_mark.v), gc_mark_machine_stack_location_maybe, &data); - each_stack_location(stack_start, stack_end, gc_mark_machine_stack_location_maybe, &data); + each_location_ptr(stack_start, stack_end, gc_mark_machine_stack_location_maybe, &data); } #endif @@ -2363,7 +2354,7 @@ rb_gc_mark_machine_context(const rb_execution_context_t *ec) #endif }; - each_stack_location(stack_start, stack_end, gc_mark_machine_stack_location_maybe, &data); + each_location_ptr(stack_start, stack_end, gc_mark_machine_stack_location_maybe, &data); int num_regs = sizeof(ec->machine.regs)/(sizeof(VALUE)); each_location((VALUE*)&ec->machine.regs, num_regs, gc_mark_machine_stack_location_maybe, &data); } From 89bbb9a888fe0c1ea46192791fa0a324d909e34c Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Fri, 30 Aug 2024 10:45:25 -0400 Subject: [PATCH 006/829] Fix call to each_location_ptr for ASAN --- gc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gc.c b/gc.c index 163f117adc3e46..c0ade04377d643 100644 --- a/gc.c +++ b/gc.c @@ -2261,7 +2261,7 @@ gc_mark_machine_stack_location_maybe(void *data, VALUE obj) &fake_frame_start, &fake_frame_end ); if (is_fake_frame) { - each_location_ptr(ec, fake_frame_start, fake_frame_end, rb_gc_impl_mark_maybe, objspace); + each_location_ptr(fake_frame_start, fake_frame_end, rb_gc_impl_mark_maybe, objspace); } #endif } From eef2121cf3e755cdf33538647d40993d296f9a04 Mon Sep 17 00:00:00 2001 From: Alan Wu Date: Fri, 30 Aug 2024 15:40:46 -0400 Subject: [PATCH 007/829] [macOS CI] Delete big SDKs to avoid exhausting disk space Lately we've seen frequent failures on macOS GitHub Action runs due to disk space issues. Poking with du(1) revealed that /Library/Developer/CoreSimulator/Caches/dyld was growing to be multiple gigbytes. Deleting unused stuff is a known workaround to space issues. https://github.com/actions/runner-images/issues/2840#issuecomment-790492173 --- .github/workflows/macos.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 5b4121c7178e1c..646a3736f4a108 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -80,6 +80,14 @@ jobs: sudo sysctl -w kern.coredump=1 sudo chmod -R +rwx /cores/ + - name: Delete unused SDKs + # To free up disk space to not run out during the run + run: | + sudo rm -rf ~/.dotnet + sudo rm -rf /Library/Android + sudo rm -rf /Library/Developer/CoreSimulator + continue-on-error: true + - name: Run configure run: ../src/configure -C --disable-install-doc ${ruby_configure_args} From 2d944dde7010997b519594670c9792b5f0f22736 Mon Sep 17 00:00:00 2001 From: Burdette Lamar Date: Fri, 30 Aug 2024 21:23:03 -0500 Subject: [PATCH 008/829] [DOC] Related for Array#[] (#11487) --- array.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/array.c b/array.c index 2d407e04d51430..318449abb48292 100644 --- a/array.c +++ b/array.c @@ -1878,6 +1878,7 @@ static VALUE rb_ary_aref2(VALUE ary, VALUE b, VALUE e); * # Raises TypeError (no implicit conversion of Symbol into Integer): * a[:foo] * + * Related: see {Methods for Fetching}[rdoc-ref:Array@Methods+for+Fetching]. */ VALUE @@ -8576,7 +8577,7 @@ rb_ary_deconstruct(VALUE ary) * * These methods do not modify +self+. * - * - #[]: Returns one or more elements. + * - #[], #slice: Returns consecutive elements as determined by a given argument. * - #fetch: Returns the element at a given offset. * - #first: Returns one or more leading elements. * - #last: Returns one or more trailing elements. @@ -8598,7 +8599,6 @@ rb_ary_deconstruct(VALUE ary) * - #take: Returns leading elements as determined by a given index. * - #drop_while: Returns trailing elements as determined by a given block. * - #take_while: Returns leading elements as determined by a given block. - * - #slice: Returns consecutive elements as determined by a given argument. * - #sort: Returns all elements in an order determined by <=> or a given block. * - #reverse: Returns all elements in reverse order. * - #compact: Returns an array containing all non-+nil+ elements. From a85dc3e9723fc02f3449340fa4a206fc9534ca08 Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Fri, 30 Aug 2024 21:07:01 +0100 Subject: [PATCH 009/829] [DOC] Rationalize aliases --- hash.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/hash.c b/hash.c index 2f31fe562f3c91..c6b65c095c29eb 100644 --- a/hash.c +++ b/hash.c @@ -7019,10 +7019,9 @@ static const rb_data_type_t env_data_type = { * - #empty?: Returns whether there are no entries. * - #eql?: Returns whether a given object is equal to +self+. * - #hash: Returns the integer hash code. - * - #has_value?: Returns whether a given object is a value in +self+. - * - #include?, #has_key?, #member?, #key?: Returns whether a given object is a key in +self+. - * - #length, #size: Returns the count of entries. - * - #value?: Returns whether a given object is a value in +self+. + * - #has_value? (aliased as #value?): Returns whether a given object is a value in +self+. + * - #include? (aliased as #has_key?, #member?, #key?): Returns whether a given object is a key in +self+. + * - #size (aliased as #length): Returns the count of entries. * * ==== Methods for Comparing * @@ -7049,10 +7048,10 @@ static const rb_data_type_t env_data_type = { * * ==== Methods for Assigning * - * - #[]=, #store: Associates a given key with a given value. + * - #[]= (aliased as #store): Associates a given key with a given value. * - #merge: Returns the hash formed by merging each given hash into a copy of +self+. - * - #merge!, #update: Merges each given hash into +self+. - * - #replace: Replaces the entire contents of +self+ with the contents of a given hash. + * - #update (aliased as #merge!): Merges each given hash into +self+. + * - #replace (aliased as #initialize_copy): Replaces the entire contents of +self+ with the contents of a given hash. * * ==== Methods for Deleting * @@ -7062,7 +7061,7 @@ static const rb_data_type_t env_data_type = { * - #compact!: Removes all +nil+-valued entries from +self+. * - #delete: Removes the entry for a given key. * - #delete_if: Removes entries selected by a given block. - * - #filter!, #select!: Keep only those entries selected by a given block. + * - #select! (aliased as #filter!): Keep only those entries selected by a given block. * - #keep_if: Keep only those entries selected by a given block. * - #reject!: Removes entries selected by a given block. * - #shift: Removes and returns the first entry. @@ -7071,18 +7070,18 @@ static const rb_data_type_t env_data_type = { * * - #compact: Returns a copy of +self+ with all +nil+-valued entries removed. * - #except: Returns a copy of +self+ with entries removed for specified keys. - * - #filter, #select: Returns a copy of +self+ with only those entries selected by a given block. + * - #select (aliased as #filter): Returns a copy of +self+ with only those entries selected by a given block. * - #reject: Returns a copy of +self+ with entries removed as specified by a given block. * - #slice: Returns a hash containing the entries for given keys. * * ==== Methods for Iterating - * - #each, #each_pair: Calls a given block with each key-value pair. + * - #each_pair (aliased as #each): Calls a given block with each key-value pair. * - #each_key: Calls a given block with each key. * - #each_value: Calls a given block with each value. * * ==== Methods for Converting * - * - #inspect, #to_s: Returns a new String containing the hash entries. + * - #inspect (aliased as #to_s): Returns a new String containing the hash entries. * - #to_a: Returns a new array of 2-element arrays; * each nested array contains a key-value pair from +self+. * - #to_h: Returns +self+ if a +Hash+; From f1a7966187886e5b62e22126bd7e83fb005973a2 Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Fri, 30 Aug 2024 21:30:24 +0100 Subject: [PATCH 010/829] [DOC] Rationalize aliases in What's Here --- enum.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/enum.c b/enum.c index f734d1814246b6..b044da20d26a81 100644 --- a/enum.c +++ b/enum.c @@ -4955,7 +4955,7 @@ enum_compact(VALUE obj) * * These methods return information about the \Enumerable other than the elements themselves: * - * - #include?, #member?: Returns +true+ if self == object, +false+ otherwise. + * - #member? (aliased as #include?): Returns +true+ if self == object, +false+ otherwise. * - #all?: Returns +true+ if all elements meet a specified criterion; +false+ otherwise. * - #any?: Returns +true+ if any element meets a specified criterion; +false+ otherwise. * - #none?: Returns +true+ if no element meets a specified criterion; +false+ otherwise. @@ -4970,7 +4970,7 @@ enum_compact(VALUE obj) * * Leading, trailing, or all elements: * - * - #entries, #to_a: Returns all elements. + * - #to_a (aliased as #entries): Returns all elements. * - #first: Returns the first element or leading elements. * - #take: Returns a specified number of leading elements. * - #drop: Returns a specified number of trailing elements. @@ -5005,8 +5005,8 @@ enum_compact(VALUE obj) * * These methods return elements that meet a specified criterion: * - * - #find, #detect: Returns an element selected by the block. - * - #find_all, #filter, #select: Returns elements selected by the block. + * - #find (aliased as #detect): Returns an element selected by the block. + * - #find_all (aliased as #filter, #select): Returns elements selected by the block. * - #find_index: Returns the index of an element selected by a given object or block. * - #reject: Returns elements not rejected by the block. * - #uniq: Returns elements that are not duplicates. @@ -5031,14 +5031,14 @@ enum_compact(VALUE obj) * * === Other Methods * - * - #map, #collect: Returns objects returned by the block. + * - #collect (aliased as #map): Returns objects returned by the block. * - #filter_map: Returns truthy objects returned by the block. - * - #flat_map, #collect_concat: Returns flattened objects returned by the block. + * - #flat_map (aliased as #collect_concat): Returns flattened objects returned by the block. * - #grep: Returns elements selected by a given object * or objects returned by a given block. * - #grep_v: Returns elements selected by a given object * or objects returned by a given block. - * - #reduce, #inject: Returns the object formed by combining all elements. + * - #inject (aliased as #reduce): Returns the object formed by combining all elements. * - #sum: Returns the sum of the elements, using method +. * - #zip: Combines each element with elements from other enumerables; * returns the n-tuples or calls the block with each. From a2b3cb65ea4d8b9f2d57f027531875bcaab812bf Mon Sep 17 00:00:00 2001 From: Mari Imaizumi Date: Sat, 31 Aug 2024 12:26:47 +0900 Subject: [PATCH 011/829] [ruby/reline] Implement re-read-init-file (https://github.com/ruby/reline/pull/740) https://github.com/ruby/reline/commit/59e4ade807 --- lib/reline/config.rb | 24 +++++++++++++++++------- lib/reline/line_editor.rb | 4 ++++ test/reline/test_config.rb | 15 +++++++++++++++ 3 files changed, 36 insertions(+), 7 deletions(-) diff --git a/lib/reline/config.rb b/lib/reline/config.rb index 16ed7eee05b4cb..12b2d22237b880 100644 --- a/lib/reline/config.rb +++ b/lib/reline/config.rb @@ -29,6 +29,17 @@ class InvalidInputrc < RuntimeError attr_accessor :autocompletion def initialize + reset_variables + end + + def reset + if editing_mode_is?(:vi_command) + @editing_mode_label = :vi_insert + end + @oneshot_key_bindings.clear + end + + def reset_variables @additional_key_bindings = { # from inputrc emacs: Reline::KeyActor::Base.new, vi_insert: Reline::KeyActor::Base.new, @@ -54,13 +65,7 @@ def initialize @convert_meta = true if seven_bit_encoding?(Reline::IOGate.encoding) @loaded = false @enable_bracketed_paste = true - end - - def reset - if editing_mode_is?(:vi_command) - @editing_mode_label = :vi_insert - end - @oneshot_key_bindings.clear + @show_mode_in_prompt = false end def editing_mode @@ -360,6 +365,11 @@ def parse_keyseq(str) ret end + def reload + reset_variables + read + end + private def seven_bit_encoding?(encoding) encoding == Encoding::US_ASCII end diff --git a/lib/reline/line_editor.rb b/lib/reline/line_editor.rb index 9c97415050b233..5f7f00c979d5b0 100644 --- a/lib/reline/line_editor.rb +++ b/lib/reline/line_editor.rb @@ -2554,4 +2554,8 @@ def finish private def set_next_action_state(type, value) @next_action_state = [type, value] end + + private def re_read_init_file(_key) + @config.reload + end end diff --git a/test/reline/test_config.rb b/test/reline/test_config.rb index c14069d11704b3..172c965fde5e91 100644 --- a/test/reline/test_config.rb +++ b/test/reline/test_config.rb @@ -13,6 +13,7 @@ def setup Dir.chdir(@tmpdir) Reline.test_mode @config = Reline::Config.new + @inputrc_backup = ENV['INPUTRC'] end def teardown @@ -20,6 +21,7 @@ def teardown FileUtils.rm_rf(@tmpdir) Reline.test_reset @config.reset + ENV['INPUTRC'] = @inputrc_backup end def additional_key_bindings(keymap_label) @@ -562,4 +564,17 @@ def test_relative_xdg_config_home ENV['XDG_CONFIG_HOME'] = xdg_config_home_backup ENV['HOME'] = home_backup end + + def test_reload + inputrc = "#{@tmpdir}/inputrc" + ENV['INPUTRC'] = inputrc + + File.write(inputrc, "set emacs-mode-string !") + @config.read + assert_equal '!', @config.emacs_mode_string + + File.write(inputrc, "set emacs-mode-string ?") + @config.reload + assert_equal '?', @config.emacs_mode_string + end end From 818e3037ed8635ae2ed63a5d783cb347d9166764 Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Wed, 29 May 2024 11:31:20 -0700 Subject: [PATCH 012/829] [ruby/zlib] Bump up 3.1.1 https://github.com/ruby/zlib/commit/d756bb0a0f --- ext/zlib/zlib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/zlib/zlib.c b/ext/zlib/zlib.c index aad9f8d28a4374..50d8dd40c6580c 100644 --- a/ext/zlib/zlib.c +++ b/ext/zlib/zlib.c @@ -25,7 +25,7 @@ # define VALGRIND_MAKE_MEM_UNDEFINED(p, n) 0 #endif -#define RUBY_ZLIB_VERSION "3.1.0" +#define RUBY_ZLIB_VERSION "3.1.1" #ifndef RB_PASS_CALLED_KEYWORDS # define rb_class_new_instance_kw(argc, argv, klass, kw_splat) rb_class_new_instance(argc, argv, klass) From 53d8dca3b3621332938ee82a5feb0e18b0d169d1 Mon Sep 17 00:00:00 2001 From: git Date: Sat, 31 Aug 2024 05:05:21 +0000 Subject: [PATCH 013/829] Update default gems list at 818e3037ed8635ae2ed63a5d783cb3 [ci skip] --- NEWS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/NEWS.md b/NEWS.md index 1dffd2dad0be92..ddebdb4abc57d1 100644 --- a/NEWS.md +++ b/NEWS.md @@ -83,6 +83,7 @@ The following default gems are updated. * resolv 0.4.0 * stringio 3.1.2 * strscan 3.1.1 +* zlib 3.1.1 The following bundled gems are updated. From 7900128ab2d8c1d3c52e9c3e14df3ccdd9b3d7c5 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Tue, 27 Aug 2024 14:23:38 +0900 Subject: [PATCH 014/829] [ruby/uri] Bump up 0.13.1 https://github.com/ruby/uri/commit/31ec9cea66 --- lib/uri/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/uri/version.rb b/lib/uri/version.rb index 2dafa57d59a2b5..bfe3f476708714 100644 --- a/lib/uri/version.rb +++ b/lib/uri/version.rb @@ -1,6 +1,6 @@ module URI # :stopdoc: - VERSION_CODE = '001300'.freeze + VERSION_CODE = '001301'.freeze VERSION = VERSION_CODE.scan(/../).collect{|n| n.to_i}.join('.').freeze # :startdoc: end From a4ede0c4a8e5c6caa01a187fb902bda64da5eb8f Mon Sep 17 00:00:00 2001 From: git Date: Sat, 31 Aug 2024 05:15:46 +0000 Subject: [PATCH 015/829] Update default gems list at 7900128ab2d8c1d3c52e9c3e14df3c [ci skip] --- NEWS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/NEWS.md b/NEWS.md index ddebdb4abc57d1..a3bf28e27e155a 100644 --- a/NEWS.md +++ b/NEWS.md @@ -83,6 +83,7 @@ The following default gems are updated. * resolv 0.4.0 * stringio 3.1.2 * strscan 3.1.1 +* uri 0.13.1 * zlib 3.1.1 The following bundled gems are updated. From f304afd26d22a6c9922399f3eaf0865ff64d95a7 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Sat, 31 Aug 2024 14:18:04 +0900 Subject: [PATCH 016/829] Added check method with released version of rubygems.org --- tool/sync_default_gems.rb | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/tool/sync_default_gems.rb b/tool/sync_default_gems.rb index 11a3a1a0da8727..c0b7617eb5b947 100755 --- a/tool/sync_default_gems.rb +++ b/tool/sync_default_gems.rb @@ -397,11 +397,38 @@ def sync_default_gems(gem) sync_lib gem, upstream end + check_prerelease_version(gem) + # Architecture-dependent files must not pollute libdir. rm_rf(Dir["lib/**/*.#{RbConfig::CONFIG['DLEXT']}"]) replace_rdoc_ref_all end + def check_prerelease_version(gem) + return if gem == "rubygems" + + gem = gem.downcase + + require "net/https" + require "json" + require "uri" + + uri = URI("https://rubygems.org/api/v1/versions/#{gem}/latest.json") + response = Net::HTTP.get(uri) + latest_version = JSON.parse(response)["version"] + + gemspec = [ + "lib/#{gem}/#{gem}.gemspec", + "lib/#{gem}.gemspec", + "ext/#{gem}/#{gem}.gemspec", + "ext/#{gem.split("-").join("/")}/#{gem}.gemspec", + "lib/#{gem.split("-").first}/#{gem}.gemspec", + "lib/#{gem.split("-").join("/")}/#{gem}.gemspec", + ].find{|gemspec| File.exist?(gemspec)} + spec = Gem::Specification.load(gemspec) + puts "#{gem}-#{spec.version} is not latest version of rubygems.org" if spec.version.to_s != latest_version + end + def ignore_file_pattern_for(gem) patterns = [] From 32f134bb8541b21b941c49c68b5bf91cf62c97dc Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Sat, 31 Aug 2024 14:19:20 +0900 Subject: [PATCH 017/829] Added pre-release suffix for development version of default gems https://github.com/ruby/stringio/issues/81 --- ext/fiddle/lib/fiddle/version.rb | 2 +- ext/stringio/stringio.c | 2 +- ext/strscan/strscan.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ext/fiddle/lib/fiddle/version.rb b/ext/fiddle/lib/fiddle/version.rb index 6c5109dca8d3ef..3444e24f926a2a 100644 --- a/ext/fiddle/lib/fiddle/version.rb +++ b/ext/fiddle/lib/fiddle/version.rb @@ -1,3 +1,3 @@ module Fiddle - VERSION = "1.1.3" + VERSION = "1.1.3.dev" end diff --git a/ext/stringio/stringio.c b/ext/stringio/stringio.c index 74515901e0ecd9..07e970f2957e7e 100644 --- a/ext/stringio/stringio.c +++ b/ext/stringio/stringio.c @@ -13,7 +13,7 @@ **********************************************************************/ static const char *const -STRINGIO_VERSION = "3.1.2"; +STRINGIO_VERSION = "3.1.2.dev"; #include diff --git a/ext/strscan/strscan.c b/ext/strscan/strscan.c index fad35925a82851..606c44bc965923 100644 --- a/ext/strscan/strscan.c +++ b/ext/strscan/strscan.c @@ -22,7 +22,7 @@ extern size_t onig_region_memsize(const struct re_registers *regs); #include -#define STRSCAN_VERSION "3.1.1" +#define STRSCAN_VERSION "3.1.1.dev" /* ======================================================================= Data Type Definitions From 2afde63eef459681fc4cbe60a861bfcdb7a80b75 Mon Sep 17 00:00:00 2001 From: git Date: Sat, 31 Aug 2024 05:22:36 +0000 Subject: [PATCH 018/829] * remove trailing spaces. [ci skip] --- tool/sync_default_gems.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tool/sync_default_gems.rb b/tool/sync_default_gems.rb index c0b7617eb5b947..8c43052d561b9a 100755 --- a/tool/sync_default_gems.rb +++ b/tool/sync_default_gems.rb @@ -427,7 +427,7 @@ def check_prerelease_version(gem) ].find{|gemspec| File.exist?(gemspec)} spec = Gem::Specification.load(gemspec) puts "#{gem}-#{spec.version} is not latest version of rubygems.org" if spec.version.to_s != latest_version - end + end def ignore_file_pattern_for(gem) patterns = [] From 365ededfdf4fa33000411e63d7a1c2d6063ff812 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sat, 31 Aug 2024 14:43:35 +0900 Subject: [PATCH 019/829] [ruby/io-console] io-console is considered Ractor-safe https://github.com/ruby/io-console/commit/b1adc15af7 --- ext/io/console/console.c | 4 ++++ test/io/console/test_ractor.rb | 24 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 test/io/console/test_ractor.rb diff --git a/ext/io/console/console.c b/ext/io/console/console.c index 38f6b5b7af42a3..489869894e357c 100644 --- a/ext/io/console/console.c +++ b/ext/io/console/console.c @@ -1764,6 +1764,10 @@ io_getpass(int argc, VALUE *argv, VALUE io) void Init_console(void) { +#ifdef HAVE_RB_EXT_RACTOR_SAFE + RB_EXT_RACTOR_SAFE(true); +#endif + #undef rb_intern id_getc = rb_intern("getc"); id_gets = rb_intern("gets"); diff --git a/test/io/console/test_ractor.rb b/test/io/console/test_ractor.rb new file mode 100644 index 00000000000000..0bbd39cdeefdc8 --- /dev/null +++ b/test/io/console/test_ractor.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true +require 'test/unit' +require 'rbconfig' + +class TestIOConsoleInRactor < Test::Unit::TestCase + def test_ractor + ext = "/io/console.#{RbConfig::CONFIG['DLEXT']}" + path = $".find {|path| path.end_with?(ext)} + assert_in_out_err(%W[-r#{path}], "#{<<~"begin;"}\n#{<<~'end;'}", ["true"], []) + begin; + $VERBOSE = nil + r = Ractor.new do + $stdout.console_mode + rescue SystemCallError + true + rescue Ractor::UnsafeError + false + else + true # should not success + end + puts r.take + end; + end +end if defined? Ractor From 5dbb67a5938579feb506b4ca59c0a39963681588 Mon Sep 17 00:00:00 2001 From: git Date: Sat, 31 Aug 2024 05:46:57 +0000 Subject: [PATCH 020/829] Update default gems list at 365ededfdf4fa33000411e63d7a1c2 [ci skip] --- NEWS.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/NEWS.md b/NEWS.md index a3bf28e27e155a..6ff0fa3fcfbca0 100644 --- a/NEWS.md +++ b/NEWS.md @@ -71,7 +71,7 @@ The following default gems are updated. * RubyGems 3.6.0.dev * bundler 2.6.0.dev * erb 4.0.4 -* fiddle 1.1.3 +* fiddle 1.1.3.dev * io-console 0.7.2 * irb 1.14.0 * json 2.7.2 @@ -81,8 +81,8 @@ The following default gems are updated. * rdoc 6.7.0 * reline 0.5.9 * resolv 0.4.0 -* stringio 3.1.2 -* strscan 3.1.1 +* stringio 3.1.2.dev +* strscan 3.1.1.dev * uri 0.13.1 * zlib 3.1.1 From 4a1ea9b63ae24918e7aaddcb41de5dbe0f500d7f Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sat, 31 Aug 2024 16:17:13 +0900 Subject: [PATCH 021/829] [ruby/io-console] Store console IO in Ractor-local storage Ractor requires a shareable class has shareable constants only, but IO is not shareable unless frozen. https://github.com/ruby/io-console/commit/65e0ff895c --- ext/io/console/console.c | 67 ++++++++++++++++++++++++++++++---- test/io/console/test_ractor.rb | 10 +++++ 2 files changed, 70 insertions(+), 7 deletions(-) diff --git a/ext/io/console/console.c b/ext/io/console/console.c index 489869894e357c..91e12d9ff758dc 100644 --- a/ext/io/console/console.c +++ b/ext/io/console/console.c @@ -81,7 +81,7 @@ getattr(int fd, conmode *t) #define CSI "\x1b\x5b" -static ID id_getc, id_console, id_close; +static ID id_getc, id_close; static ID id_gets, id_flush, id_chomp_bang; #if defined HAVE_RUBY_FIBER_SCHEDULER_H @@ -1566,6 +1566,56 @@ rb_io_closed_p(VALUE io) } #endif +#ifdef HAVE_RB_EXT_RACTOR_SAFE +#include "ruby/ractor.h" +static rb_ractor_local_key_t key_console_dev; + +static bool +console_dev_get(VALUE klass, VALUE *dev) +{ + return rb_ractor_local_storage_value_lookup(key_console_dev, dev); +} + +static void +console_dev_set(VALUE klass, VALUE value) +{ + rb_ractor_local_storage_value_set(key_console_dev, value); +} + +static void +console_dev_remove(VALUE klass) +{ + console_dev_set(klass, Qnil); +} + +#else + +static ID id_console; + +static bool +console_dev_get(VALUE klass, VALUE *dev) +{ + if (rb_const_defined(klass, id_console)) { + *dev = rb_const_get(klass, id_console); + return true; + } + return false; +} + +static void +console_dev_set(VALUE klass, VALUE value) +{ + rb_const_set(klass, id_console, value); +} + +static void +console_dev_remove(VALUE klass) +{ + rb_const_remove(klass, id_console); +} + +#endif + /* * call-seq: * IO.console -> # @@ -1594,10 +1644,9 @@ console_dev(int argc, VALUE *argv, VALUE klass) // Force the class to be File. if (klass == rb_cIO) klass = rb_cFile; - if (rb_const_defined(klass, id_console)) { - con = rb_const_get(klass, id_console); + if (console_dev_get(klass, &con)) { if (!RB_TYPE_P(con, T_FILE) || RTEST(rb_io_closed_p(con))) { - rb_const_remove(klass, id_console); + console_dev_remove(klass); con = 0; } } @@ -1606,7 +1655,7 @@ console_dev(int argc, VALUE *argv, VALUE klass) if (sym == ID2SYM(id_close) && argc == 1) { if (con) { rb_io_close(con); - rb_const_remove(klass, id_console); + console_dev_remove(klass); con = 0; } return Qnil; @@ -1647,7 +1696,7 @@ console_dev(int argc, VALUE *argv, VALUE klass) #ifdef CONSOLE_DEVICE_FOR_WRITING rb_io_set_write_io(con, out); #endif - rb_const_set(klass, id_console, con); + console_dev_set(klass, con); } if (sym) { @@ -1769,11 +1818,15 @@ Init_console(void) #endif #undef rb_intern +#ifdef HAVE_RB_EXT_RACTOR_SAFE + key_console_dev = rb_ractor_local_storage_value_newkey(); +#else + id_console = rb_intern("console"); +#endif id_getc = rb_intern("getc"); id_gets = rb_intern("gets"); id_flush = rb_intern("flush"); id_chomp_bang = rb_intern("chomp!"); - id_console = rb_intern("console"); id_close = rb_intern("close"); #define init_rawmode_opt_id(name) \ rawmode_opt_ids[kwd_##name] = rb_intern(#name) diff --git a/test/io/console/test_ractor.rb b/test/io/console/test_ractor.rb index 0bbd39cdeefdc8..b30988f47e0c11 100644 --- a/test/io/console/test_ractor.rb +++ b/test/io/console/test_ractor.rb @@ -20,5 +20,15 @@ def test_ractor end puts r.take end; + + assert_in_out_err(%W[-r#{path}], "#{<<~"begin;"}\n#{<<~'end;'}", ["true"], []) + begin; + console = IO.console + $VERBOSE = nil + r = Ractor.new do + IO.console + end + puts console.class == r.take.class + end; end end if defined? Ractor From e69945fc57efba5c8895c21235e109145865952d Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sat, 31 Aug 2024 17:34:21 +0900 Subject: [PATCH 022/829] [ruby/io-console] Workaround for old TruffleRuby https://github.com/ruby/io-console/commit/f10c946ac7 --- ext/io/console/console.c | 12 +++++++++--- ext/io/console/extconf.rb | 1 + 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/ext/io/console/console.c b/ext/io/console/console.c index 91e12d9ff758dc..e59f5bf8781e0f 100644 --- a/ext/io/console/console.c +++ b/ext/io/console/console.c @@ -1566,7 +1566,13 @@ rb_io_closed_p(VALUE io) } #endif -#ifdef HAVE_RB_EXT_RACTOR_SAFE +#if defined(RB_EXT_RACTOR_SAFE) && defined(HAVE_RB_RACTOR_LOCAL_STORAGE_VALUE_NEWKEY) +# define USE_RACTOR_STORAGE 1 +#else +# define USE_RACTOR_STORAGE 0 +#endif + +#if USE_RACTOR_STORAGE #include "ruby/ractor.h" static rb_ractor_local_key_t key_console_dev; @@ -1813,12 +1819,12 @@ io_getpass(int argc, VALUE *argv, VALUE io) void Init_console(void) { -#ifdef HAVE_RB_EXT_RACTOR_SAFE +#if USE_RACTOR_STORAGE RB_EXT_RACTOR_SAFE(true); #endif #undef rb_intern -#ifdef HAVE_RB_EXT_RACTOR_SAFE +#if USE_RACTOR_STORAGE key_console_dev = rb_ractor_local_storage_value_newkey(); #else id_console = rb_intern("console"); diff --git a/ext/io/console/extconf.rb b/ext/io/console/extconf.rb index 0cd8eaea0f40fb..6161b747b5fca9 100644 --- a/ext/io/console/extconf.rb +++ b/ext/io/console/extconf.rb @@ -10,6 +10,7 @@ have_func("rb_io_get_write_io") have_func("rb_io_closed_p") have_func("rb_io_open_descriptor") +have_func("rb_ractor_local_storage_value_newkey") is_wasi = /wasi/ =~ MakeMakefile::RbConfig::CONFIG["platform"] # `ok` can be `true`, `false`, or `nil`: From d6fc8f3d572f777d434e18f81147371c1f33ad6c Mon Sep 17 00:00:00 2001 From: Durable Programming Team Date: Wed, 28 Aug 2024 16:53:26 -0400 Subject: [PATCH 023/829] [rubygems/rubygems] fix `@license` typo preventing licenses from being correctly unmarshalled https://github.com/rubygems/rubygems/commit/d6ba7ef79f --- lib/rubygems/specification.rb | 2 +- test/rubygems/test_gem_safe_marshal.rb | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/rubygems/specification.rb b/lib/rubygems/specification.rb index d0e0e4e91ac6ab..594d882c6b6c05 100644 --- a/lib/rubygems/specification.rb +++ b/lib/rubygems/specification.rb @@ -1318,7 +1318,7 @@ def self._load(str) spec.instance_variable_set :@has_rdoc, array[15] spec.instance_variable_set :@new_platform, array[16] spec.instance_variable_set :@platform, array[16].to_s - spec.instance_variable_set :@license, array[17] + spec.instance_variable_set :@licenses, [array[17]] spec.instance_variable_set :@metadata, array[18] spec.instance_variable_set :@loaded, false spec.instance_variable_set :@activated, false diff --git a/test/rubygems/test_gem_safe_marshal.rb b/test/rubygems/test_gem_safe_marshal.rb index ebb000a9efba8a..1085aca9fd705e 100644 --- a/test/rubygems/test_gem_safe_marshal.rb +++ b/test/rubygems/test_gem_safe_marshal.rb @@ -305,6 +305,18 @@ def test_rational end end + def test_gem_spec_unmarshall_license + spec = Gem::Specification.new do |s| + s.name = "hi" + s.version = "1.2.3" + s.license = "MIT" + end + + unmarshalled_spec = Gem::SafeMarshal.safe_load(Marshal.dump(spec)) + + assert_equal ["MIT"], unmarshalled_spec.license + end + def test_gem_spec_disallowed_symbol e = assert_raise(Gem::SafeMarshal::Visitors::ToRuby::UnpermittedSymbolError) do spec = Gem::Specification.new do |s| From 44771e4a7925ef97fbe66a1f6113cddf49a761fe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 30 Aug 2024 02:41:03 +0000 Subject: [PATCH 024/829] Bump github/codeql-action from 3.26.5 to 3.26.6 Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.26.5 to 3.26.6. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/2c779ab0d087cd7fe7b826087247c2c81f27bfa6...4dd16135b69a43b6c8efb853346f8437d92d3c93) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/codeql-analysis.yml | 8 ++++---- .github/workflows/scorecards.yml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index acef86d7b5b3aa..8346f056f46fdd 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -77,15 +77,15 @@ jobs: run: sudo rm /usr/lib/ruby/vendor_ruby/rubygems/defaults/operating_system.rb - name: Initialize CodeQL - uses: github/codeql-action/init@2c779ab0d087cd7fe7b826087247c2c81f27bfa6 # v3.26.5 + uses: github/codeql-action/init@4dd16135b69a43b6c8efb853346f8437d92d3c93 # v3.26.6 with: languages: ${{ matrix.language }} - name: Autobuild - uses: github/codeql-action/autobuild@2c779ab0d087cd7fe7b826087247c2c81f27bfa6 # v3.26.5 + uses: github/codeql-action/autobuild@4dd16135b69a43b6c8efb853346f8437d92d3c93 # v3.26.6 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@2c779ab0d087cd7fe7b826087247c2c81f27bfa6 # v3.26.5 + uses: github/codeql-action/analyze@4dd16135b69a43b6c8efb853346f8437d92d3c93 # v3.26.6 with: category: '/language:${{ matrix.language }}' upload: False @@ -115,7 +115,7 @@ jobs: continue-on-error: true - name: Upload SARIF - uses: github/codeql-action/upload-sarif@2c779ab0d087cd7fe7b826087247c2c81f27bfa6 # v3.26.5 + uses: github/codeql-action/upload-sarif@4dd16135b69a43b6c8efb853346f8437d92d3c93 # v3.26.6 with: sarif_file: sarif-results/${{ matrix.language }}.sarif continue-on-error: true diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml index 406dd41c57a58a..5641c4d3d49b39 100644 --- a/.github/workflows/scorecards.yml +++ b/.github/workflows/scorecards.yml @@ -67,6 +67,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: 'Upload to code-scanning' - uses: github/codeql-action/upload-sarif@2c779ab0d087cd7fe7b826087247c2c81f27bfa6 # v3.26.5 + uses: github/codeql-action/upload-sarif@4dd16135b69a43b6c8efb853346f8437d92d3c93 # v3.26.6 with: sarif_file: results.sarif From afd12873e0db8bbdc9a1b3bf155a723d37211ece Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sun, 1 Sep 2024 12:00:12 +0900 Subject: [PATCH 025/829] Update dependencies of io-console --- ext/io/console/depend | 1 + 1 file changed, 1 insertion(+) diff --git a/ext/io/console/depend b/ext/io/console/depend index 2907722dbca861..e66b6f4f5d2144 100644 --- a/ext/io/console/depend +++ b/ext/io/console/depend @@ -169,6 +169,7 @@ console.o: $(hdrdir)/ruby/io.h console.o: $(hdrdir)/ruby/missing.h console.o: $(hdrdir)/ruby/onigmo.h console.o: $(hdrdir)/ruby/oniguruma.h +console.o: $(hdrdir)/ruby/ractor.h console.o: $(hdrdir)/ruby/ruby.h console.o: $(hdrdir)/ruby/st.h console.o: $(hdrdir)/ruby/subst.h From 37db194c02fcaefd167304d30041666ec3914c40 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sun, 1 Sep 2024 12:29:23 +0900 Subject: [PATCH 026/829] [ruby/io-console] Support older rubies https://github.com/ruby/io-console/commit/cad8169568 --- ext/io/console/console.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ext/io/console/console.c b/ext/io/console/console.c index e59f5bf8781e0f..d7f3485b49cd9c 100644 --- a/ext/io/console/console.c +++ b/ext/io/console/console.c @@ -1598,14 +1598,14 @@ console_dev_remove(VALUE klass) static ID id_console; -static bool +static int console_dev_get(VALUE klass, VALUE *dev) { if (rb_const_defined(klass, id_console)) { *dev = rb_const_get(klass, id_console); - return true; + return 1; } - return false; + return 0; } static void From 185602e696980ba776465842fc0398eba2acb677 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sun, 1 Sep 2024 12:37:02 +0900 Subject: [PATCH 027/829] [ruby/io-console] Fix mixing declarations and code for older versions https://github.com/ruby/io-console/commit/504292b487 --- ext/io/console/console.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/ext/io/console/console.c b/ext/io/console/console.c index d7f3485b49cd9c..85e6a0613eed59 100644 --- a/ext/io/console/console.c +++ b/ext/io/console/console.c @@ -1538,10 +1538,8 @@ console_clear_screen(VALUE io) static VALUE io_open_descriptor_fallback(VALUE klass, int descriptor, int mode, VALUE path, VALUE timeout, void *encoding) { - rb_update_max_fd(descriptor); - VALUE arguments[2] = { - INT2NUM(descriptor), + (rb_update_max_fd(descriptor), INT2NUM(descriptor)), INT2FIX(mode), }; From 4aa3491bd235fd16fbef7ba24181bc838aa29abb Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Thu, 29 Aug 2024 17:38:59 +0900 Subject: [PATCH 028/829] Skip RDoc related feature if Gem::RDoc is not available --- lib/rubygems/commands/setup_command.rb | 2 ++ test/rubygems/test_gem_commands_install_command.rb | 4 ++-- test/rubygems/test_gem_commands_update_command.rb | 2 +- test/rubygems/test_gem_rdoc.rb | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/rubygems/commands/setup_command.rb b/lib/rubygems/commands/setup_command.rb index 9f47b795f118dd..bb2246ca319281 100644 --- a/lib/rubygems/commands/setup_command.rb +++ b/lib/rubygems/commands/setup_command.rb @@ -336,6 +336,8 @@ def install_rdoc require_relative "../rdoc" + return false unless defined?(Gem::RDoc) + fake_spec = Gem::Specification.new "rubygems", Gem::VERSION def fake_spec.full_gem_path File.expand_path "../../..", __dir__ diff --git a/test/rubygems/test_gem_commands_install_command.rb b/test/rubygems/test_gem_commands_install_command.rb index 5b09512ac45c24..1bd96600f33983 100644 --- a/test/rubygems/test_gem_commands_install_command.rb +++ b/test/rubygems/test_gem_commands_install_command.rb @@ -667,7 +667,7 @@ def test_execute_rdoc assert_path_exist File.join(a2.doc_dir, "ri") assert_path_exist File.join(a2.doc_dir, "rdoc") - end + end if defined?(Gem::RDoc) def test_execute_rdoc_with_path specs = spec_fetcher do |fetcher| @@ -703,7 +703,7 @@ def test_execute_rdoc_with_path wait_for_child_process_to_exit assert_path_exist "whatever/doc/a-2", "documentation not installed" - end + end if defined?(Gem::RDoc) def test_execute_saves_build_args specs = spec_fetcher do |fetcher| diff --git a/test/rubygems/test_gem_commands_update_command.rb b/test/rubygems/test_gem_commands_update_command.rb index 194ebb030a8fed..642a62a3736643 100644 --- a/test/rubygems/test_gem_commands_update_command.rb +++ b/test/rubygems/test_gem_commands_update_command.rb @@ -506,7 +506,7 @@ def test_execute_rdoc a2 = @specs["a-2"] assert_path_exist File.join(a2.doc_dir, "rdoc") - end + end if defined?(Gem::RDoc) def test_execute_named spec_fetcher do |fetcher| diff --git a/test/rubygems/test_gem_rdoc.rb b/test/rubygems/test_gem_rdoc.rb index f9b1df6cd55aa1..19ccf1e5871b70 100644 --- a/test/rubygems/test_gem_rdoc.rb +++ b/test/rubygems/test_gem_rdoc.rb @@ -134,4 +134,4 @@ def test_setup_unwritable FileUtils.rm_r @a.doc_dir end end -end +end if defined?(Gem::RDoc) From eb144ef91e0b7f01cbe915bac2ac29bd532e1c28 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Thu, 29 Aug 2024 17:41:16 +0900 Subject: [PATCH 029/829] Skip show_doc tests if RDoc is not available --- test/irb/test_command.rb | 2 +- test/irb/test_input_method.rb | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/test/irb/test_command.rb b/test/irb/test_command.rb index 567c3216ccec2f..69931e3e4f95a7 100644 --- a/test/irb/test_command.rb +++ b/test/irb/test_command.rb @@ -765,7 +765,7 @@ def test_show_doc ensure # this is the only way to reset the redefined method without coupling the test with its implementation EnvUtil.suppress_warning { load "irb/command/help.rb" } - end + end if defined?(RDoc) def test_show_doc_without_rdoc _, err = without_rdoc do diff --git a/test/irb/test_input_method.rb b/test/irb/test_input_method.rb index 9d0f393ce001c8..915297f56c104d 100644 --- a/test/irb/test_input_method.rb +++ b/test/irb/test_input_method.rb @@ -1,7 +1,10 @@ # frozen_string_literal: false require "irb" -require "rdoc" +begin + require "rdoc" +rescue LoadError +end require_relative "helper" module TestIRB @@ -188,4 +191,4 @@ def has_rdoc_content? File.exist?(RDoc::RI::Paths::BASE) end end -end +end if defined?(RDoc) From 745b4775c5d8b28f6e5fa26b928239dabf966b45 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Mon, 2 Sep 2024 11:28:22 +0900 Subject: [PATCH 030/829] [ruby/logger] Bump up 1.6.1 https://github.com/ruby/logger/commit/bda937b4cc --- lib/logger/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/logger/version.rb b/lib/logger/version.rb index 202b6e4fbaed53..2a0801be633474 100644 --- a/lib/logger/version.rb +++ b/lib/logger/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true class Logger - VERSION = "1.6.0" + VERSION = "1.6.1" end From 0642f71a326aaefa8e50aa1b5b70d2f021984b91 Mon Sep 17 00:00:00 2001 From: git Date: Mon, 2 Sep 2024 02:30:26 +0000 Subject: [PATCH 031/829] Update default gems list at 745b4775c5d8b28f6e5fa26b928239 [ci skip] --- NEWS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/NEWS.md b/NEWS.md index 6ff0fa3fcfbca0..071bd13ca16b50 100644 --- a/NEWS.md +++ b/NEWS.md @@ -75,6 +75,7 @@ The following default gems are updated. * io-console 0.7.2 * irb 1.14.0 * json 2.7.2 +* logger 1.6.1 * net-http 0.4.1 * optparse 0.5.0 * prism 1.0.0 From 73c39a5f93d3ad4514a06158e2bb7622496372b9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Sep 2024 02:53:56 +0000 Subject: [PATCH 032/829] Bump actions/upload-artifact from 4.3.6 to 4.4.0 Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4.3.6 to 4.4.0. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/834a144ee995460fba8ed112a2fc961b36a5ec5a...50769540e7f4bd5e21e526ee35c689e35e0d6874) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/wasm.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/wasm.yml b/.github/workflows/wasm.yml index 51eeb7a75b2ae7..3a5a5923928a39 100644 --- a/.github/workflows/wasm.yml +++ b/.github/workflows/wasm.yml @@ -136,7 +136,7 @@ jobs: - run: tar cfz ../install.tar.gz -C ../install . - name: Upload artifacts - uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 + uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0 with: name: ruby-wasm-install path: ${{ github.workspace }}/install.tar.gz @@ -164,7 +164,7 @@ jobs: - name: Save Pull Request number if: ${{ github.event_name == 'pull_request' }} run: echo "${{ github.event.pull_request.number }}" >> ${{ github.workspace }}/github-pr-info.txt - - uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 + - uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0 if: ${{ github.event_name == 'pull_request' }} with: name: github-pr-info From 7d47f3c94f4c38f9b236716c9f98b928895d6b2d Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Mon, 2 Sep 2024 02:05:21 -0700 Subject: [PATCH 033/829] redmine-backporter: Clarify the actual control flow The `rev && has_commit(rev, "ruby_#{TARGET_VERSION.tr('.','_')}")` case seems to be used if and only if it's manually specified in the argument to the done command. It was hard to notice it with the previous code. --- tool/redmine-backporter.rb | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/tool/redmine-backporter.rb b/tool/redmine-backporter.rb index 73d375b146f22c..475054641b37f0 100755 --- a/tool/redmine-backporter.rb +++ b/tool/redmine-backporter.rb @@ -351,10 +351,9 @@ class << @changesets next end - if rev.nil? && log = find_git_log("##@issue]") - /^commit (?\h{40})$/ =~ log - end - if log && rev + if rev && has_commit(rev, "ruby_#{TARGET_VERSION.tr('.','_')}") + notes = "ruby_#{TARGET_VERSION.tr('.','_')} commit:#{rev}." + elsif rev.nil? && (log = find_git_log("##@issue]")) && /^commit (?\h{40})$/ =~ log str = log[/merge revision\(s\) ([^:]+)(?=:)/] if str str.sub!(/\Amerge/, 'merged') @@ -368,10 +367,6 @@ class << @changesets str << notes end notes = str - elsif rev && has_commit(rev, "ruby_#{TARGET_VERSION.tr('.','_')}") - # Backport commit's log doesn't have the issue number. - # Instead of that manually it's provided. - notes = "ruby_#{TARGET_VERSION.tr('.','_')} commit:#{rev}." else puts "no commit is found whose log include ##@issue" next From b6e7e903a09e1577adc2f17600ca40dee80a0534 Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Mon, 2 Sep 2024 02:25:28 -0700 Subject: [PATCH 034/829] redmine-backporter: Support matching multiple revs with `done` command --- tool/redmine-backporter.rb | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tool/redmine-backporter.rb b/tool/redmine-backporter.rb index 475054641b37f0..7f08eb8d1a956b 100755 --- a/tool/redmine-backporter.rb +++ b/tool/redmine-backporter.rb @@ -353,14 +353,14 @@ class << @changesets if rev && has_commit(rev, "ruby_#{TARGET_VERSION.tr('.','_')}") notes = "ruby_#{TARGET_VERSION.tr('.','_')} commit:#{rev}." - elsif rev.nil? && (log = find_git_log("##@issue]")) && /^commit (?\h{40})$/ =~ log - str = log[/merge revision\(s\) ([^:]+)(?=:)/] - if str - str.sub!(/\Amerge/, 'merged') - str.gsub!(/\h{8,40}/, 'commit:\0') - str = "ruby_#{TARGET_VERSION.tr('.','_')} commit:#{rev} #{str}." + elsif rev.nil? && (log = find_git_log("##@issue]")) && !(revs = log.scan(/^commit (\h{40})$/).flatten).empty? + commits = revs.map { |rev| "commit:#{rev}" }.join(", ") + if merged_revs = log[/merge revision\(s\) ([^:]+)(?=:)/] + merged_revs.sub!(/\Amerge/, 'merged') + merged_revs.gsub!(/\h{8,40}/, 'commit:\0') + str = "ruby_#{TARGET_VERSION.tr('.','_')} #{commits} #{merged_revs}." else - str = "ruby_#{TARGET_VERSION.tr('.','_')} commit:#{rev}." + str = "ruby_#{TARGET_VERSION.tr('.','_')} #{commits}." end if notes str << "\n" From 9d522cc44d256bcad157f9dc351c7dfce146c848 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Wed, 28 Aug 2024 12:30:35 +0200 Subject: [PATCH 035/829] [rubygems/rubygems] Make ruby-core check not depend on ENV I found it useful to be able to use `GEM_COMMAND` outside of a ruby-core env, so I made the ruby-core env detection not depend on it. https://github.com/rubygems/rubygems/commit/6cb389c290 --- spec/bundler/support/env.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/bundler/support/env.rb b/spec/bundler/support/env.rb index 4d99c892cd48c0..2d13c449fe9d83 100644 --- a/spec/bundler/support/env.rb +++ b/spec/bundler/support/env.rb @@ -3,7 +3,7 @@ module Spec module Env def ruby_core? - !ENV["GEM_COMMAND"].nil? + File.exist?(File.expand_path("../../../lib/bundler/bundler.gemspec", __dir__)) end end end From 3d83df2b963476df91d22199e589955ed08d4af6 Mon Sep 17 00:00:00 2001 From: Jun Aruga Date: Fri, 30 Aug 2024 12:17:00 +0200 Subject: [PATCH 036/829] .travis.yml: Allow failures for arm64/arm32 pipelines. Right now, the arm64 servers on Travis took around 7 hours to start the jobs. Therefore, allow failures for the arm64 and arm32 pipelines https://app.travis-ci.com/github/ruby/ruby/builds/272105049 --- .travis.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 7fad46c601a125..8c7d0fa38ca980 100644 --- a/.travis.yml +++ b/.travis.yml @@ -112,12 +112,12 @@ matrix: # https://github.com/rubygems/rubygems/issues/7132 - <<: *arm32-linux allow_failures: - # Allow failures for the unstable jobs. - # - name: arm64-linux + # The arm64 is very slow to start the jobs. + - name: arm64-linux - name: ppc64le-linux - name: s390x-linux - # The 2nd arm64 pipeline may be unstable. - # - name: arm32-linux + # The arm64 is very slow to start the jobs. + - name: arm32-linux fast_finish: true before_script: From c853e48fc17e906c8965d76e09e4553923e4dd75 Mon Sep 17 00:00:00 2001 From: Jun Aruga Date: Sat, 31 Aug 2024 08:39:57 +0200 Subject: [PATCH 037/829] .travis.yml: Drop all the pipelines due to jobs not starting. Remove `.travis.yml` as a temporary workaround. --- .travis.yml | 153 ---------------------------------------------------- 1 file changed, 153 deletions(-) delete mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 8c7d0fa38ca980..00000000000000 --- a/.travis.yml +++ /dev/null @@ -1,153 +0,0 @@ -# -*- YAML -*- -# Copyright (C) 2011 Urabe, Shyouhei. All rights reserved. -# -# This file is a part of the programming language Ruby. Permission is hereby -# granted, to either redistribute or modify this file, provided that the -# conditions mentioned in the file COPYING are met. Consult the file for -# details. - -# When you see Travis CI issues, or you are interested in understanding how to -# manage, please check the link below. -# https://github.com/ruby/ruby/wiki/CI-Servers#travis-ci - -# We enable Travis on the specific branches or forked repositories here. -if: >- - (repo != ruby/ruby OR branch = master OR branch =~ /^ruby_\d_\d$/) - AND (commit_message !~ /\[DOC\]/) - -language: c - -os: linux - -dist: jammy - -git: - quiet: true - -env: - global: - - NPROC="$(nproc)" - - JOBS="-j${NPROC}" - # SETARCH are overridden when necessary. See below. - - SETARCH= - # https://github.com/travis-ci/travis-build/blob/e411371dda21430a60f61b8f3f57943d2fe4d344/lib/travis/build/bash/travis_apt_get_options.bash#L7 - - travis_apt_get_options='--allow-downgrades --allow-remove-essential --allow-change-held-packages' - - travis_apt_get_options="-yq --no-install-suggests --no-install-recommends $travis_apt_get_options" - # -g0 disables backtraces when SEGV. Do not set that. - - debugflags=-ggdb3 - - RUBY_TESTOPTS="$JOBS -q --tty=no" - -.org.ruby-lang.ci.matrix-definitions: - - &gcc-11 - compiler: gcc-11 - before_install: - - tool/travis_retry.sh sudo bash -c "rm -rf '${TRAVIS_ROOT}/var/lib/apt/lists/'* && exec apt-get update -yq" - - >- - tool/travis_retry.sh sudo -E apt-get $travis_apt_get_options install - gcc-11 - g++-11 - libffi-dev - libncurses-dev - libncursesw5-dev - libreadline-dev - libssl-dev - libyaml-dev - openssl - zlib1g-dev - - gcc-11 --version - - &arm64-linux - name: arm64-linux - arch: arm64 - <<: *gcc-11 - - &ppc64le-linux - name: ppc64le-linux - arch: ppc64le - <<: *gcc-11 - - &s390x-linux - name: s390x-linux - arch: s390x - <<: *gcc-11 - env: - # Avoid possible test failures with the zlib applying the following patch - # on s390x CPU architecture. - # https://github.com/madler/zlib/pull/410 - - DFLTCC=0 - - &arm32-linux - name: arm32-linux - arch: arm64 - # https://packages.ubuntu.com/jammy/crossbuild-essential-armhf - compiler: arm-linux-gnueabihf-gcc - env: - - SETARCH='setarch linux32 --verbose --32bit' - # Still keep the -O1 for only arm32, while we want to test with the - # default optflags -O3. - # Because bootstraptest/test_ractor.rb fails with segfualt with the - # default -O3. - # https://bugs.ruby-lang.org/issues/19981 - - optflags=-O1 - before_install: - - sudo dpkg --add-architecture armhf - - tool/travis_retry.sh sudo bash -c "rm -rf '${TRAVIS_ROOT}/var/lib/apt/lists/'* && exec apt-get update -yq" - - >- - tool/travis_retry.sh sudo -E apt-get $travis_apt_get_options install - crossbuild-essential-armhf - libc6:armhf - libstdc++-10-dev:armhf - libffi-dev:armhf - libncurses-dev:armhf - libncursesw5-dev:armhf - libreadline-dev:armhf - libssl-dev:armhf - libyaml-dev:armhf - linux-libc-dev:armhf - zlib1g-dev:armhf - -matrix: - include: - - <<: *arm64-linux - - <<: *ppc64le-linux - - <<: *s390x-linux - # FIXME: lib/rubygems/util.rb:104 glob_files_in_dir - - # :411:in glob: File name too long - (Errno::ENAMETOOLONG) - # https://github.com/rubygems/rubygems/issues/7132 - - <<: *arm32-linux - allow_failures: - # The arm64 is very slow to start the jobs. - - name: arm64-linux - - name: ppc64le-linux - - name: s390x-linux - # The arm64 is very slow to start the jobs. - - name: arm32-linux - fast_finish: true - -before_script: - - lscpu - - ./autogen.sh - - mkdir build - - cd build - - $SETARCH ../configure -C --disable-install-doc --prefix=$(pwd)/install - - $SETARCH make -s $JOBS - - make -s $JOBS install - # Useful info to report issues to the Ruby. - - $SETARCH $(pwd)/install/bin/ruby -v - # Useful info To report issues to the RubyGems. - - $SETARCH $(pwd)/install/bin/gem env - -script: - - $SETARCH make -s test - - ../tool/travis_wait.sh $SETARCH make -s test-all RUBYOPT="-w" - - ../tool/travis_wait.sh $SETARCH make -s test-spec - -# We want to be notified when something happens. -notifications: - webhooks: - urls: - # ruby-lang slack: ruby/simpler-alerts-bot (travis) - - secure: mRsoS/UbqDkKkW5p3AEqM27d4SZnV6Gsylo3bm8T/deltQzTsGzZwrm7OIBXZv0UFZdE68XmPlyHfZFLSP2V9QZ7apXMf9/vw0GtcSe1gchtnjpAPF6lYBn7nMCbVPPx9cS0dwL927fjdRM1vj7IKZ2bk4F0lAJ25R25S6teqdk= - on_success: never - on_failure: always - email: - recipients: - - jun.aruga@gmail.com - on_success: never - on_failure: always From 4303a02f46fd37c0e70eb95b6703d44406691c34 Mon Sep 17 00:00:00 2001 From: Jun Aruga Date: Mon, 2 Sep 2024 14:47:18 +0200 Subject: [PATCH 038/829] CI: windows.yml: Drop pull-request - path-ignore. It's to avoid the stucking "Windows result" job. It seems only the files included in the list of the pull-request - path-ignore, GitHub Actions "Windows result" permanently waits for the jobs that don't exist. --- .github/workflows/windows.yml | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index dde781b9eeda69..190710d745bf82 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -9,13 +9,8 @@ on: - '**/.document' - '.*.yml' pull_request: - paths-ignore: - - 'doc/**' - - '**/man/*' - - '**.md' - - '**.rdoc' - - '**/.document' - - '.*.yml' + # Do not use paths-ignore for required status checks + # https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/collaborating-on-repositories-with-code-quality-features/troubleshooting-required-status-checks#handling-skipped-but-required-checks merge_group: concurrency: From b00b0d5f8fb9b3e39c55289b67b9320ebaddd5d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Fri, 30 Aug 2024 18:47:17 +0200 Subject: [PATCH 039/829] [rubygems/rubygems] Improve insecure gem overwrite message https://github.com/rubygems/rubygems/commit/7c71dac22e --- lib/bundler/errors.rb | 10 +++++----- lib/bundler/rubygems_gem_installer.rb | 2 +- spec/bundler/commands/install_spec.rb | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/bundler/errors.rb b/lib/bundler/errors.rb index c29b1bfed89122..35b5a55038e489 100644 --- a/lib/bundler/errors.rb +++ b/lib/bundler/errors.rb @@ -217,15 +217,15 @@ def initialize(orig_exception, msg) end class InsecureInstallPathError < BundlerError - def initialize(path) + def initialize(name, path) + @name = name @path = path end def message - "The installation path is insecure. Bundler cannot continue.\n" \ - "#{@path} is world-writable (without sticky bit).\n" \ - "Bundler cannot safely replace gems in world-writeable directories due to potential vulnerabilities.\n" \ - "Please change the permissions of this directory or choose a different install path." + "Bundler cannot reinstall #{@name} because there's a previous installation of it at #{@path} that is unsafe to remove.\n" \ + "The parent of #{@path} is world-writable and does not have the sticky bit set, making it insecure to remove due to potential vulnerabilities.\n" \ + "Please change the permissions of #{File.dirname(@path)} or choose a different install path." end status_code(38) diff --git a/lib/bundler/rubygems_gem_installer.rb b/lib/bundler/rubygems_gem_installer.rb index 4d4fd20fea6706..3ec73452b35fb3 100644 --- a/lib/bundler/rubygems_gem_installer.rb +++ b/lib/bundler/rubygems_gem_installer.rb @@ -155,7 +155,7 @@ def strict_rm_rf(dir) parent_st = File.stat(parent) if parent_st.world_writable? && !parent_st.sticky? - raise InsecureInstallPathError.new(parent) + raise InsecureInstallPathError.new(spec.full_name, dir) end begin diff --git a/spec/bundler/commands/install_spec.rb b/spec/bundler/commands/install_spec.rb index c89ed0c870563b..d4bc1d2922e246 100644 --- a/spec/bundler/commands/install_spec.rb +++ b/spec/bundler/commands/install_spec.rb @@ -1055,7 +1055,7 @@ def run bundle "install --redownload", raise_on_error: false - expect(err).to include("The installation path is insecure. Bundler cannot continue.") + expect(err).to include("Bundler cannot reinstall foo-1.0.0 because there's a previous installation of it at #{gems_path}/foo-1.0.0 that is unsafe to remove") end end From bb511c3f10918efdcc4d5efd980561903e67dc10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Fri, 30 Aug 2024 18:57:20 +0200 Subject: [PATCH 040/829] [rubygems/rubygems] Don't try to remove previous install folder if it's empty Ruby ships with empty directories for default gems. If Ruby installations has unsafe world-writable permissions, we will complain when about to install a gem that happens to be also a default gem, because we'll start by removing the previous install folder and that's supposed to be insecure due to too loose permissions. However, if the folder is empty, we don't actually need to remove anything, so we can skip the whole thing, avoiding the errors. https://github.com/rubygems/rubygems/commit/2f3cd8ac4e --- lib/bundler/rubygems_gem_installer.rb | 1 + spec/bundler/commands/install_spec.rb | 28 +++++++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/lib/bundler/rubygems_gem_installer.rb b/lib/bundler/rubygems_gem_installer.rb index 3ec73452b35fb3..858ebf32cf4a8e 100644 --- a/lib/bundler/rubygems_gem_installer.rb +++ b/lib/bundler/rubygems_gem_installer.rb @@ -150,6 +150,7 @@ def prepare_extension_build(extension_dir) def strict_rm_rf(dir) return unless File.exist?(dir) + return if Dir.empty?(dir) parent = File.dirname(dir) parent_st = File.stat(parent) diff --git a/spec/bundler/commands/install_spec.rb b/spec/bundler/commands/install_spec.rb index d4bc1d2922e246..9353d24d95225d 100644 --- a/spec/bundler/commands/install_spec.rb +++ b/spec/bundler/commands/install_spec.rb @@ -1059,6 +1059,34 @@ def run end end + describe "when gems path is world writable (no sticky bit set), but previous install is just an empty dir (like it happens with default gems)", :permissions do + let(:gems_path) { bundled_app("vendor/#{Bundler.ruby_scope}/gems") } + let(:full_path) { gems_path.join("foo-1.0.0") } + + before do + build_repo4 do + build_gem "foo", "1.0.0" do |s| + s.write "CHANGELOG.md", "foo" + end + end + + gemfile <<-G + source "https://gem.repo4" + gem 'foo' + G + end + + it "does not try to remove the directory and thus don't abort with an error about unsafe directory removal" do + bundle "config set --local path vendor" + + FileUtils.mkdir_p(gems_path) + FileUtils.chmod(0o777, gems_path) + Dir.mkdir(full_path) + + bundle "install" + end + end + describe "when bundle cache path does not have write access", :permissions do let(:cache_path) { bundled_app("vendor/#{Bundler.ruby_scope}/cache") } From fe2db1bed9effe7ae18a39e3068ce7d957cc894c Mon Sep 17 00:00:00 2001 From: tomoya ishida Date: Mon, 2 Sep 2024 23:34:35 +0900 Subject: [PATCH 041/829] [ruby/reline] Get console handle again and retry when Win32API call fails (https://github.com/ruby/reline/pull/734) https://github.com/ruby/reline/commit/66291b5e3c --- lib/reline/io/windows.rb | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/lib/reline/io/windows.rb b/lib/reline/io/windows.rb index 6ba4b830d6225e..40025db5046fcc 100644 --- a/lib/reline/io/windows.rb +++ b/lib/reline/io/windows.rb @@ -159,14 +159,24 @@ def call(*args) FILE_NAME_INFO = 2 ENABLE_VIRTUAL_TERMINAL_PROCESSING = 4 + # Calling Win32API with console handle is reported to fail after executing some external command. + # We need to refresh console handle and retry the call again. + private def call_with_console_handle(win32func, *args) + val = win32func.call(@hConsoleHandle, *args) + return val if val != 0 + + @hConsoleHandle = @GetStdHandle.call(STD_OUTPUT_HANDLE) + win32func.call(@hConsoleHandle, *args) + end + private def getconsolemode mode = "\000\000\000\000" - @GetConsoleMode.call(@hConsoleHandle, mode) + call_with_console_handle(@GetConsoleMode, mode) mode.unpack1('L') end private def setconsolemode(mode) - @SetConsoleMode.call(@hConsoleHandle, mode) + call_with_console_handle(@SetConsoleMode, mode) end #if @legacy_console @@ -334,7 +344,7 @@ def get_console_screen_buffer_info # [18,2] dwMaximumWindowSize.X # [20,2] dwMaximumWindowSize.Y csbi = 0.chr * 22 - return if @GetConsoleScreenBufferInfo.call(@hConsoleHandle, csbi) == 0 + return if call_with_console_handle(@GetConsoleScreenBufferInfo, csbi) == 0 csbi end @@ -355,14 +365,14 @@ def cursor_pos end def move_cursor_column(val) - @SetConsoleCursorPosition.call(@hConsoleHandle, cursor_pos.y * 65536 + val) + call_with_console_handle(@SetConsoleCursorPosition, cursor_pos.y * 65536 + val) end def move_cursor_up(val) if val > 0 y = cursor_pos.y - val y = 0 if y < 0 - @SetConsoleCursorPosition.call(@hConsoleHandle, y * 65536 + cursor_pos.x) + call_with_console_handle(@SetConsoleCursorPosition, y * 65536 + cursor_pos.x) elsif val < 0 move_cursor_down(-val) end @@ -374,7 +384,7 @@ def move_cursor_down(val) screen_height = get_screen_size.first y = cursor_pos.y + val y = screen_height - 1 if y > (screen_height - 1) - @SetConsoleCursorPosition.call(@hConsoleHandle, (cursor_pos.y + val) * 65536 + cursor_pos.x) + call_with_console_handle(@SetConsoleCursorPosition, (cursor_pos.y + val) * 65536 + cursor_pos.x) elsif val < 0 move_cursor_up(-val) end @@ -385,8 +395,8 @@ def erase_after_cursor attributes = csbi[8, 2].unpack1('S') cursor = csbi[4, 4].unpack1('L') written = 0.chr * 4 - @FillConsoleOutputCharacter.call(@hConsoleHandle, 0x20, get_screen_size.last - cursor_pos.x, cursor, written) - @FillConsoleOutputAttribute.call(@hConsoleHandle, attributes, get_screen_size.last - cursor_pos.x, cursor, written) + call_with_console_handle(@FillConsoleOutputCharacter, 0x20, get_screen_size.last - cursor_pos.x, cursor, written) + call_with_console_handle(@FillConsoleOutputAttribute, attributes, get_screen_size.last - cursor_pos.x, cursor, written) end def scroll_down(val) @@ -404,7 +414,7 @@ def scroll_down(val) scroll_rectangle = [0, val, buffer_width, buffer_lines - val].pack('s4') destination_origin = 0 # y * 65536 + x fill = [' '.ord, attributes].pack('SS') - @ScrollConsoleScreenBuffer.call(@hConsoleHandle, scroll_rectangle, nil, destination_origin, fill) + call_with_console_handle(@ScrollConsoleScreenBuffer, scroll_rectangle, nil, destination_origin, fill) else origin_x = x + 1 origin_y = y - window_top + 1 @@ -423,9 +433,9 @@ def clear_screen fill_length = buffer_width * (window_bottom - window_top + 1) screen_topleft = window_top * 65536 written = 0.chr * 4 - @FillConsoleOutputCharacter.call(@hConsoleHandle, 0x20, fill_length, screen_topleft, written) - @FillConsoleOutputAttribute.call(@hConsoleHandle, attributes, fill_length, screen_topleft, written) - @SetConsoleCursorPosition.call(@hConsoleHandle, screen_topleft) + call_with_console_handle(@FillConsoleOutputCharacter, 0x20, fill_length, screen_topleft, written) + call_with_console_handle(@FillConsoleOutputAttribute, attributes, fill_length, screen_topleft, written) + call_with_console_handle(@SetConsoleCursorPosition, screen_topleft) else @output.write "\e[2J" "\e[H" end @@ -439,14 +449,14 @@ def hide_cursor size = 100 visible = 0 # 0 means false cursor_info = [size, visible].pack('Li') - @SetConsoleCursorInfo.call(@hConsoleHandle, cursor_info) + call_with_console_handle(@SetConsoleCursorInfo, cursor_info) end def show_cursor size = 100 visible = 1 # 1 means true cursor_info = [size, visible].pack('Li') - @SetConsoleCursorInfo.call(@hConsoleHandle, cursor_info) + call_with_console_handle(@SetConsoleCursorInfo, cursor_info) end def set_winch_handler(&handler) From b539b43b2b25529e679401091836ac7de4df3beb Mon Sep 17 00:00:00 2001 From: Burdette Lamar Date: Mon, 2 Sep 2024 10:36:49 -0500 Subject: [PATCH 042/829] [ruby/rdoc] [DOC] Fix links (https://github.com/ruby/rdoc/pull/1169) https://github.com/ruby/rdoc/commit/a576ff890f --- doc/rdoc/markup_reference.rb | 4 ---- lib/rdoc.rb | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/doc/rdoc/markup_reference.rb b/doc/rdoc/markup_reference.rb index d1901b86e2cb7a..bb2dc67eca9bb3 100644 --- a/doc/rdoc/markup_reference.rb +++ b/doc/rdoc/markup_reference.rb @@ -918,10 +918,6 @@ # # - Linked: https://github.com links to https://github.com. # -# [Protocol +www+] -# -# - Linked: www.yahoo.com links to www.yahoo.com. -# # [Protocol +ftp+] # # - Linked: ftp://nosuch.site links to ftp://nosuch.site. diff --git a/lib/rdoc.rb b/lib/rdoc.rb index 209042ed0e861d..3821569f45fae5 100644 --- a/lib/rdoc.rb +++ b/lib/rdoc.rb @@ -21,7 +21,7 @@ # see RDoc::Markup and refer to rdoc --help for command line usage. # # If you want to set the default markup format see -# RDoc::Markup@Supported+Formats +# RDoc::Markup@Markup+Formats # # If you want to store rdoc configuration in your gem (such as the default # markup format) see RDoc::Options@Saved+Options From 1f00f6a09ef8c973be699ad27ab3df3787b4f7af Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Mon, 12 Aug 2024 20:18:34 +0900 Subject: [PATCH 043/829] [rubygems/rubygems] Avoid another race condition of open mode Instead, just open in CREATE and APPEND mode. Also, move the workaround for old Solaris as fallback to retry. https://github.com/rubygems/rubygems/commit/2daad257be --- lib/rubygems.rb | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/lib/rubygems.rb b/lib/rubygems.rb index 2b52cde0a7494c..c51ba69203cbc2 100644 --- a/lib/rubygems.rb +++ b/lib/rubygems.rb @@ -798,24 +798,20 @@ def self.open_file(path, flags, &block) File.open(path, flags, &block) end + MODE_TO_FLOCK = IO::RDONLY | IO::APPEND | IO::CREAT # :nodoc: + ## # Open a file with given flags, and protect access with flock def self.open_file_with_flock(path, &block) - flags = File.exist?(path) ? "r+" : "a+" - - File.open(path, flags) do |io| + File.open(path, MODE_TO_FLOCK) do |io| begin io.flock(File::LOCK_EX) rescue Errno::ENOSYS, Errno::ENOTSUP + rescue Errno::ENOLCK # NFS + raise unless Thread.main == Thread.current end yield io - rescue Errno::ENOLCK # NFS - if Thread.main != Thread.current - raise - else - open_file(path, flags, &block) - end end end From c1fecc5eabba5bb22a3ebd5616fa50ad612ef4d9 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Mon, 12 Aug 2024 20:38:09 +0900 Subject: [PATCH 044/829] [rubygems/rubygems] Simplify `Gem.read_binary` and `Gem.write_binary` Since `Gem.open_file` no longer locks the target file and is same as `File.open` now, simply `Gem.read_binary` should read in binary mode. Also the body of `Gem.write_binary` is same as `File.binwrite`. https://github.com/rubygems/rubygems/commit/44df9045df --- lib/rubygems.rb | 8 ++------ test/rubygems/test_gem_installer.rb | 14 +++++++------- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/lib/rubygems.rb b/lib/rubygems.rb index c51ba69203cbc2..bd9f240e2091d5 100644 --- a/lib/rubygems.rb +++ b/lib/rubygems.rb @@ -773,18 +773,14 @@ def self.refresh # Safely read a file in binary mode on all platforms. def self.read_binary(path) - open_file(path, "rb+", &:read) - rescue Errno::EACCES, Errno::EROFS - open_file(path, "rb", &:read) + File.binread(path) end ## # Safely write a file in binary mode on all platforms. def self.write_binary(path, data) - open_file(path, "wb") do |io| - io.write data - end + File.binwrite(path, data) rescue Errno::ENOSPC # If we ran out of space but the file exists, it's *guaranteed* to be corrupted. File.delete(path) if File.exist?(path) diff --git a/test/rubygems/test_gem_installer.rb b/test/rubygems/test_gem_installer.rb index 52498cdd6d6c8f..a61d1b6fff28d6 100644 --- a/test/rubygems/test_gem_installer.rb +++ b/test/rubygems/test_gem_installer.rb @@ -2386,10 +2386,10 @@ def test_leaves_no_empty_cached_spec_when_no_more_disk_space installer = Gem::Installer.for_spec @spec installer.gem_home = @gemhome - File.class_eval do - alias_method :original_write, :write + File.singleton_class.class_eval do + alias_method :original_binwrite, :binwrite - def write(data) + def binwrite(path, data) raise Errno::ENOSPC end end @@ -2400,10 +2400,10 @@ def write(data) assert_path_not_exist @spec.spec_file ensure - File.class_eval do - remove_method :write - alias_method :write, :original_write - remove_method :original_write + File.singleton_class.class_eval do + remove_method :binwrite + alias_method :binwrite, :original_binwrite + remove_method :original_binwrite end end From 1b82d6346227dd451003802a09f4abed5eb732bd Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Fri, 30 Aug 2024 15:17:06 -0400 Subject: [PATCH 045/829] Fix flaky test_latest_gc_info_need_major_by It's possible for a GC to run between the calls of GC.latest_gc_info, which would cause the test to fail. We can disable GC so that GC only triggers manually. --- test/ruby/test_gc.rb | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/test/ruby/test_gc.rb b/test/ruby/test_gc.rb index 9029f2bda800b1..43444fe8e74d38 100644 --- a/test/ruby/test_gc.rb +++ b/test/ruby/test_gc.rb @@ -374,15 +374,17 @@ def test_latest_gc_info_need_major_by objects.append(100.times.map { '*' }) end - # We need to ensure that no GC gets ran before the call to GC.start since - # it would trigger a major GC. Assertions could allocate objects and - # trigger a GC so we don't run assertions until we perform the major GC. - need_major_by = GC.latest_gc_info(:need_major_by) - GC.start(full_mark: false) # should be upgraded to major - major_by = GC.latest_gc_info(:major_by) - - assert_not_nil(need_major_by) - assert_not_nil(major_by) + EnvUtil.without_gc do + # We need to ensure that no GC gets ran before the call to GC.start since + # it would trigger a major GC. Assertions could allocate objects and + # trigger a GC so we don't run assertions until we perform the major GC. + need_major_by = GC.latest_gc_info(:need_major_by) + GC.start(full_mark: false) # should be upgraded to major + major_by = GC.latest_gc_info(:major_by) + + assert_not_nil(need_major_by) + assert_not_nil(major_by) + end end def test_latest_gc_info_weak_references_count From c93d07ed7448f332379cf21b4b7b649b057e5671 Mon Sep 17 00:00:00 2001 From: yui-knk Date: Mon, 26 Aug 2024 09:22:35 +0900 Subject: [PATCH 046/829] [Bug #20695] Do not create needless string object in parser `set_parser_s_value` does nothing in parser therefore no need to create string object in parser `set_yylval_node`. # Object allocation Run `ruby benchmarks/lobsters/benchmark.rb` with the patch ```diff diff --git a/benchmarks/lobsters/benchmark.rb b/benchmarks/lobsters/benchmark.rb index 240c50c..6cdd0ac 100644 --- a/benchmarks/lobsters/benchmark.rb +++ b/benchmarks/lobsters/benchmark.rb @@ -7,6 +7,8 @@ Dir.chdir __dir__ use_gemfile require_relative 'config/environment' +printf "allocated_after_load=%d\n", GC.stat(:total_allocated_objects) +exit require_relative "route_generator" # For an in-mem DB, we need to load all data on every boot ``` ## Before ``` ruby 3.4.0dev (2024-08-31T18:30:25Z master d6fc8f3d57) [arm64-darwin21] ... allocated_after_load=2143519 ``` ## After ``` ruby 3.4.0dev (2024-09-01T00:40:04Z fix_bugs_20695 d1bae52f75) [arm64-darwin21] ... allocated_after_load=1579662 ``` ## Ruby 3.3.0 for reference ``` ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [arm64-darwin21] ... allocated_after_load=1732702 ``` --- parse.y | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/parse.y b/parse.y index b92f9936401329..5139ee99e6f3e3 100644 --- a/parse.y +++ b/parse.y @@ -6908,11 +6908,7 @@ static void tokaddmbc(struct parser_params *p, int c, rb_encoding *enc); static enum yytokentype parse_string(struct parser_params*,rb_strterm_literal_t*); static enum yytokentype here_document(struct parser_params*,rb_strterm_heredoc_t*); -#ifndef RIPPER -#define set_parser_s_value(x) (void)(x) -#else -#define set_parser_s_value(x) (p->s_value = (x)) -#endif +#define set_parser_s_value(x) (ifdef_ripper(p->s_value = (x), (void)0)) # define set_yylval_node(x) { \ YYLTYPE _cur_loc; \ From a33416a3339de040bb4d2621d0bbae14b0e7aed3 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Mon, 2 Sep 2024 20:26:14 +0900 Subject: [PATCH 047/829] Fix runnable symlinks Fix symlinks to executable as relative paths from `bin` directory. --- tool/lib/path.rb | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tool/lib/path.rb b/tool/lib/path.rb index 5582b2851e46ba..f16a164338d66a 100644 --- a/tool/lib/path.rb +++ b/tool/lib/path.rb @@ -40,7 +40,7 @@ def clean_link(src, dest) # Extensions to FileUtils module Mswin - def ln_safe(src, dest, *opt) + def ln_safe(src, dest, real_src, *opt) cmd = ["mklink", dest.tr("/", "\\"), src.tr("/", "\\")] cmd[1, 0] = opt return if system("cmd", "/c", *cmd) @@ -48,23 +48,23 @@ def ln_safe(src, dest, *opt) puts cmd.join(" ") end - def ln_dir_safe(src, dest) + def ln_dir_safe(src, dest, real_src) ln_safe(src, dest, "/d") end end module HardlinkExcutable - def ln_exe(src, dest) + def ln_exe(relative_src, dest, src) ln(src, dest, force: true) end end - def ln_safe(src, dest) + def ln_safe(src, dest, real_src) ln_sf(src, dest) rescue Errno::ENOENT # Windows disallows to create broken symboic links, probably because # it is a kind of reparse points. - raise if File.exist?(src) + raise if File.exist?(real_src) end alias ln_dir_safe ln_safe @@ -75,16 +75,16 @@ def ln_relative(src, dest, executable = false) parent = File.dirname(dest) File.directory?(parent) or mkdir_p(parent) if executable - return (ln_exe(src, dest) if File.exist?(src)) + return (ln_exe(relative(src, parent), dest, src) if File.exist?(src)) end - clean_link(relative(src, parent), dest) {|s, d| ln_safe(s, d)} + clean_link(relative(src, parent), dest) {|s, d| ln_safe(s, d, src)} end def ln_dir_relative(src, dest) return if File.identical?(src, dest) parent = File.dirname(dest) File.directory?(parent) or mkdir_p(parent) - clean_link(relative(src, parent), dest) {|s, d| ln_dir_safe(s, d)} + clean_link(relative(src, parent), dest) {|s, d| ln_dir_safe(s, d, src)} end case (CROSS_COMPILING || RUBY_PLATFORM) From 24c51e1cbba4ed5a681d6dc7bad572ee422105db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Thu, 22 Aug 2024 22:15:56 +0200 Subject: [PATCH 048/829] Let automatiek convert requires that are indented to require_relative as well --- lib/rubygems/vendor/net-http/lib/net/https.rb | 2 +- lib/rubygems/vendor/optparse/lib/optparse.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/rubygems/vendor/net-http/lib/net/https.rb b/lib/rubygems/vendor/net-http/lib/net/https.rb index d2784f0be08774..f104c85c8134d4 100644 --- a/lib/rubygems/vendor/net-http/lib/net/https.rb +++ b/lib/rubygems/vendor/net-http/lib/net/https.rb @@ -4,7 +4,7 @@ = net/https -- SSL/TLS enhancement for Gem::Net::HTTP. This file has been merged with net/http. There is no longer any need to - require 'rubygems/vendor/net-http/lib/net/https' to use HTTPS. + require_relative 'https' to use HTTPS. See Gem::Net::HTTP for details on how to make HTTPS connections. diff --git a/lib/rubygems/vendor/optparse/lib/optparse.rb b/lib/rubygems/vendor/optparse/lib/optparse.rb index 59374317201d8b..00dc7c8a67355d 100644 --- a/lib/rubygems/vendor/optparse/lib/optparse.rb +++ b/lib/rubygems/vendor/optparse/lib/optparse.rb @@ -1084,7 +1084,7 @@ def compsys(to, name = File.basename($0)) # :nodoc: Switch::OptionalArgument.new do |pkg| if pkg begin - require 'rubygems/vendor/optparse/lib/optparse/version' + require_relative 'optparse/version' rescue LoadError else show_version(*pkg.split(/,/)) or From 053caa313b52910a5d5fb5e8d305f2abf80ede95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Thu, 22 Aug 2024 22:16:36 +0200 Subject: [PATCH 049/829] Fix `gem exec rails new foo` failing on Ruby 3.2 The default version of securerandom (0.2.2) gets activated by RubyGems, but does not match Rails requirements (>= 0.3), leading to an error like this: ``` $ gem exec rails new repro /Users/deivid/Code/rubygems/rubygems/lib/rubygems/specification.rb:2246:in `raise_if_conflicts': Unable to activate activesupport-7.2.1, because securerandom-0.2.2 conflicts with securerandom (>= 0.3) (Gem::ConflictError) from /Users/deivid/Code/rubygems/rubygems/lib/rubygems/specification.rb:1383:in `activate' from /Users/deivid/Code/rubygems/rubygems/lib/rubygems/specification.rb:1421:in `block in activate_dependencies' from /Users/deivid/Code/rubygems/rubygems/lib/rubygems/specification.rb:1403:in `each' from /Users/deivid/Code/rubygems/rubygems/lib/rubygems/specification.rb:1403:in `activate_dependencies' from /Users/deivid/Code/rubygems/rubygems/lib/rubygems/specification.rb:1385:in `activate' from /Users/deivid/Code/rubygems/rubygems/lib/rubygems/core_ext/kernel_gem.rb:62:in `block in gem' from /Users/deivid/Code/rubygems/rubygems/lib/rubygems/core_ext/kernel_gem.rb:62:in `synchronize' from /Users/deivid/Code/rubygems/rubygems/lib/rubygems/core_ext/kernel_gem.rb:62:in `gem' from /Users/deivid/Code/rubygems/rubygems/lib/rubygems/commands/exec_command.rb:193:in `activate!' from /Users/deivid/Code/rubygems/rubygems/lib/rubygems/commands/exec_command.rb:73:in `execute' from /Users/deivid/Code/rubygems/rubygems/lib/rubygems/command.rb:326:in `invoke_with_build_args' from /Users/deivid/Code/rubygems/rubygems/lib/rubygems/command_manager.rb:255:in `invoke_command' from /Users/deivid/Code/rubygems/rubygems/lib/rubygems/command_manager.rb:194:in `process_args' from /Users/deivid/Code/rubygems/rubygems/lib/rubygems/command_manager.rb:152:in `run' from /Users/deivid/Code/rubygems/rubygems/lib/rubygems/gem_runner.rb:56:in `run' from /Users/deivid/code/rubygems/rubygems/exe/gem:12:in `
' ``` Vendoring our own securerandom fixes the issue since that way we avoid activating the gem internally. --- lib/rubygems/vendor/resolv/lib/resolv.rb | 6 +- lib/rubygems/vendor/securerandom/.document | 1 + .../securerandom/lib/random/formatter.rb | 373 ++++++++++++++++++ .../vendor/securerandom/lib/securerandom.rb | 96 +++++ tool/bundler/vendor_gems.rb | 1 + 5 files changed, 474 insertions(+), 3 deletions(-) create mode 100644 lib/rubygems/vendor/securerandom/.document create mode 100644 lib/rubygems/vendor/securerandom/lib/random/formatter.rb create mode 100644 lib/rubygems/vendor/securerandom/lib/securerandom.rb diff --git a/lib/rubygems/vendor/resolv/lib/resolv.rb b/lib/rubygems/vendor/resolv/lib/resolv.rb index ac0ba0b3136a79..0301f4f161da03 100644 --- a/lib/rubygems/vendor/resolv/lib/resolv.rb +++ b/lib/rubygems/vendor/resolv/lib/resolv.rb @@ -5,7 +5,7 @@ require 'io/wait' begin - require 'securerandom' + require_relative '../../securerandom/lib/securerandom' rescue LoadError end @@ -602,10 +602,10 @@ def extract_resources(msg, name, typeclass) # :nodoc: } end - if defined? SecureRandom + if defined? Gem::SecureRandom def self.random(arg) # :nodoc: begin - SecureRandom.random_number(arg) + Gem::SecureRandom.random_number(arg) rescue NotImplementedError rand(arg) end diff --git a/lib/rubygems/vendor/securerandom/.document b/lib/rubygems/vendor/securerandom/.document new file mode 100644 index 00000000000000..0c43bbd6b38177 --- /dev/null +++ b/lib/rubygems/vendor/securerandom/.document @@ -0,0 +1 @@ +# Vendored files do not need to be documented diff --git a/lib/rubygems/vendor/securerandom/lib/random/formatter.rb b/lib/rubygems/vendor/securerandom/lib/random/formatter.rb new file mode 100644 index 00000000000000..14a1a528aa4668 --- /dev/null +++ b/lib/rubygems/vendor/securerandom/lib/random/formatter.rb @@ -0,0 +1,373 @@ +# -*- coding: us-ascii -*- +# frozen_string_literal: true + +# == \Random number formatter. +# +# Formats generated random numbers in many manners. When 'random/formatter' +# is required, several methods are added to empty core module Random::Formatter, +# making them available as Random's instance and module methods. +# +# Standard library Gem::SecureRandom is also extended with the module, and the methods +# described below are available as a module methods in it. +# +# === Examples +# +# Generate random hexadecimal strings: +# +# require 'random/formatter' +# +# prng = Random.new +# prng.hex(10) #=> "52750b30ffbc7de3b362" +# prng.hex(10) #=> "92b15d6c8dc4beb5f559" +# prng.hex(13) #=> "39b290146bea6ce975c37cfc23" +# # or just +# Random.hex #=> "1aed0c631e41be7f77365415541052ee" +# +# Generate random base64 strings: +# +# prng.base64(10) #=> "EcmTPZwWRAozdA==" +# prng.base64(10) #=> "KO1nIU+p9DKxGg==" +# prng.base64(12) #=> "7kJSM/MzBJI+75j8" +# Random.base64(4) #=> "bsQ3fQ==" +# +# Generate random binary strings: +# +# prng.random_bytes(10) #=> "\016\t{\370g\310pbr\301" +# prng.random_bytes(10) #=> "\323U\030TO\234\357\020\a\337" +# Random.random_bytes(6) #=> "\xA1\xE6Lr\xC43" +# +# Generate alphanumeric strings: +# +# prng.alphanumeric(10) #=> "S8baxMJnPl" +# prng.alphanumeric(10) #=> "aOxAg8BAJe" +# Random.alphanumeric #=> "TmP9OsJHJLtaZYhP" +# +# Generate UUIDs: +# +# prng.uuid #=> "2d931510-d99f-494a-8c67-87feb05e1594" +# prng.uuid #=> "bad85eb9-0713-4da7-8d36-07a8e4b00eab" +# Random.uuid #=> "f14e0271-de96-45cc-8911-8910292a42cd" +# +# All methods are available in the standard library Gem::SecureRandom, too: +# +# Gem::SecureRandom.hex #=> "05b45376a30c67238eb93b16499e50cf" + +module Random::Formatter + + # Generate a random binary string. + # + # The argument _n_ specifies the length of the result string. + # + # If _n_ is not specified or is nil, 16 is assumed. + # It may be larger in future. + # + # The result may contain any byte: "\x00" - "\xff". + # + # require 'random/formatter' + # + # Random.random_bytes #=> "\xD8\\\xE0\xF4\r\xB2\xFC*WM\xFF\x83\x18\xF45\xB6" + # # or + # prng = Random.new + # prng.random_bytes #=> "m\xDC\xFC/\a\x00Uf\xB2\xB2P\xBD\xFF6S\x97" + def random_bytes(n=nil) + n = n ? n.to_int : 16 + gen_random(n) + end + + # Generate a random hexadecimal string. + # + # The argument _n_ specifies the length, in bytes, of the random number to be generated. + # The length of the resulting hexadecimal string is twice of _n_. + # + # If _n_ is not specified or is nil, 16 is assumed. + # It may be larger in the future. + # + # The result may contain 0-9 and a-f. + # + # require 'random/formatter' + # + # Random.hex #=> "eb693ec8252cd630102fd0d0fb7c3485" + # # or + # prng = Random.new + # prng.hex #=> "91dc3bfb4de5b11d029d376634589b61" + def hex(n=nil) + random_bytes(n).unpack1("H*") + end + + # Generate a random base64 string. + # + # The argument _n_ specifies the length, in bytes, of the random number + # to be generated. The length of the result string is about 4/3 of _n_. + # + # If _n_ is not specified or is nil, 16 is assumed. + # It may be larger in the future. + # + # The result may contain A-Z, a-z, 0-9, "+", "/" and "=". + # + # require 'random/formatter' + # + # Random.base64 #=> "/2BuBuLf3+WfSKyQbRcc/A==" + # # or + # prng = Random.new + # prng.base64 #=> "6BbW0pxO0YENxn38HMUbcQ==" + # + # See RFC 3548 for the definition of base64. + def base64(n=nil) + [random_bytes(n)].pack("m0") + end + + # Generate a random URL-safe base64 string. + # + # The argument _n_ specifies the length, in bytes, of the random number + # to be generated. The length of the result string is about 4/3 of _n_. + # + # If _n_ is not specified or is nil, 16 is assumed. + # It may be larger in the future. + # + # The boolean argument _padding_ specifies the padding. + # If it is false or nil, padding is not generated. + # Otherwise padding is generated. + # By default, padding is not generated because "=" may be used as a URL delimiter. + # + # The result may contain A-Z, a-z, 0-9, "-" and "_". + # "=" is also used if _padding_ is true. + # + # require 'random/formatter' + # + # Random.urlsafe_base64 #=> "b4GOKm4pOYU_-BOXcrUGDg" + # # or + # prng = Random.new + # prng.urlsafe_base64 #=> "UZLdOkzop70Ddx-IJR0ABg" + # + # prng.urlsafe_base64(nil, true) #=> "i0XQ-7gglIsHGV2_BNPrdQ==" + # prng.urlsafe_base64(nil, true) #=> "-M8rLhr7JEpJlqFGUMmOxg==" + # + # See RFC 3548 for the definition of URL-safe base64. + def urlsafe_base64(n=nil, padding=false) + s = [random_bytes(n)].pack("m0") + s.tr!("+/", "-_") + s.delete!("=") unless padding + s + end + + # Generate a random v4 UUID (Universally Unique IDentifier). + # + # require 'random/formatter' + # + # Random.uuid #=> "2d931510-d99f-494a-8c67-87feb05e1594" + # Random.uuid #=> "bad85eb9-0713-4da7-8d36-07a8e4b00eab" + # # or + # prng = Random.new + # prng.uuid #=> "62936e70-1815-439b-bf89-8492855a7e6b" + # + # The version 4 UUID is purely random (except the version). + # It doesn't contain meaningful information such as MAC addresses, timestamps, etc. + # + # The result contains 122 random bits (15.25 random bytes). + # + # See RFC4122[https://datatracker.ietf.org/doc/html/rfc4122] for details of UUID. + # + def uuid + ary = random_bytes(16).unpack("NnnnnN") + ary[2] = (ary[2] & 0x0fff) | 0x4000 + ary[3] = (ary[3] & 0x3fff) | 0x8000 + "%08x-%04x-%04x-%04x-%04x%08x" % ary + end + + alias uuid_v4 uuid + + # Generate a random v7 UUID (Universally Unique IDentifier). + # + # require 'random/formatter' + # + # Random.uuid_v7 # => "0188d4c3-1311-7f96-85c7-242a7aa58f1e" + # Random.uuid_v7 # => "0188d4c3-16fe-744f-86af-38fa04c62bb5" + # Random.uuid_v7 # => "0188d4c3-1af8-764f-b049-c204ce0afa23" + # Random.uuid_v7 # => "0188d4c3-1e74-7085-b14f-ef6415dc6f31" + # # |<--sorted-->| |<----- random ---->| + # + # # or + # prng = Random.new + # prng.uuid_v7 # => "0188ca51-5e72-7950-a11d-def7ff977c98" + # + # The version 7 UUID starts with the least significant 48 bits of a 64 bit + # Unix timestamp (milliseconds since the epoch) and fills the remaining bits + # with random data, excluding the version and variant bits. + # + # This allows version 7 UUIDs to be sorted by creation time. Time ordered + # UUIDs can be used for better database index locality of newly inserted + # records, which may have a significant performance benefit compared to random + # data inserts. + # + # The result contains 74 random bits (9.25 random bytes). + # + # Note that this method cannot be made reproducable because its output + # includes not only random bits but also timestamp. + # + # See draft-ietf-uuidrev-rfc4122bis[https://datatracker.ietf.org/doc/draft-ietf-uuidrev-rfc4122bis/] + # for details of UUIDv7. + # + # ==== Monotonicity + # + # UUIDv7 has millisecond precision by default, so multiple UUIDs created + # within the same millisecond are not issued in monotonically increasing + # order. To create UUIDs that are time-ordered with sub-millisecond + # precision, up to 12 bits of additional timestamp may added with + # +extra_timestamp_bits+. The extra timestamp precision comes at the expense + # of random bits. Setting extra_timestamp_bits: 12 provides ~244ns + # of precision, but only 62 random bits (7.75 random bytes). + # + # prng = Random.new + # Array.new(4) { prng.uuid_v7(extra_timestamp_bits: 12) } + # # => + # ["0188d4c7-13da-74f9-8b53-22a786ffdd5a", + # "0188d4c7-13da-753b-83a5-7fb9b2afaeea", + # "0188d4c7-13da-754a-88ea-ac0baeedd8db", + # "0188d4c7-13da-7557-83e1-7cad9cda0d8d"] + # # |<--- sorted --->| |<-- random --->| + # + # Array.new(4) { prng.uuid_v7(extra_timestamp_bits: 8) } + # # => + # ["0188d4c7-3333-7a95-850a-de6edb858f7e", + # "0188d4c7-3333-7ae8-842e-bc3a8b7d0cf9", # <- out of order + # "0188d4c7-3333-7ae2-995a-9f135dc44ead", # <- out of order + # "0188d4c7-3333-7af9-87c3-8f612edac82e"] + # # |<--- sorted -->||<---- random --->| + # + # Any rollbacks of the system clock will break monotonicity. UUIDv7 is based + # on UTC, which excludes leap seconds and can rollback the clock. To avoid + # this, the system clock can synchronize with an NTP server configured to use + # a "leap smear" approach. NTP or PTP will also be needed to synchronize + # across distributed nodes. + # + # Counters and other mechanisms for stronger guarantees of monotonicity are + # not implemented. Applications with stricter requirements should follow + # {Section 6.2}[https://www.ietf.org/archive/id/draft-ietf-uuidrev-rfc4122bis-07.html#monotonicity_counters] + # of the specification. + # + def uuid_v7(extra_timestamp_bits: 0) + case (extra_timestamp_bits = Integer(extra_timestamp_bits)) + when 0 # min timestamp precision + ms = Process.clock_gettime(Process::CLOCK_REALTIME, :millisecond) + rand = random_bytes(10) + rand.setbyte(0, rand.getbyte(0) & 0x0f | 0x70) # version + rand.setbyte(2, rand.getbyte(2) & 0x3f | 0x80) # variant + "%08x-%04x-%s" % [ + (ms & 0x0000_ffff_ffff_0000) >> 16, + (ms & 0x0000_0000_0000_ffff), + rand.unpack("H4H4H12").join("-") + ] + + when 12 # max timestamp precision + ms, ns = Process.clock_gettime(Process::CLOCK_REALTIME, :nanosecond) + .divmod(1_000_000) + extra_bits = ns * 4096 / 1_000_000 + rand = random_bytes(8) + rand.setbyte(0, rand.getbyte(0) & 0x3f | 0x80) # variant + "%08x-%04x-7%03x-%s" % [ + (ms & 0x0000_ffff_ffff_0000) >> 16, + (ms & 0x0000_0000_0000_ffff), + extra_bits, + rand.unpack("H4H12").join("-") + ] + + when (0..12) # the generic version is slower than the special cases above + rand_a, rand_b1, rand_b2, rand_b3 = random_bytes(10).unpack("nnnN") + rand_mask_bits = 12 - extra_timestamp_bits + ms, ns = Process.clock_gettime(Process::CLOCK_REALTIME, :nanosecond) + .divmod(1_000_000) + "%08x-%04x-%04x-%04x-%04x%08x" % [ + (ms & 0x0000_ffff_ffff_0000) >> 16, + (ms & 0x0000_0000_0000_ffff), + 0x7000 | + ((ns * (1 << extra_timestamp_bits) / 1_000_000) << rand_mask_bits) | + rand_a & ((1 << rand_mask_bits) - 1), + 0x8000 | (rand_b1 & 0x3fff), + rand_b2, + rand_b3 + ] + + else + raise ArgumentError, "extra_timestamp_bits must be in 0..12" + end + end + + # Internal interface to Random; Generate random data _n_ bytes. + private def gen_random(n) + self.bytes(n) + end + + # Generate a string that randomly draws from a + # source array of characters. + # + # The argument _source_ specifies the array of characters from which + # to generate the string. + # The argument _n_ specifies the length, in characters, of the string to be + # generated. + # + # The result may contain whatever characters are in the source array. + # + # require 'random/formatter' + # + # prng.choose([*'l'..'r'], 16) #=> "lmrqpoonmmlqlron" + # prng.choose([*'0'..'9'], 5) #=> "27309" + private def choose(source, n) + size = source.size + m = 1 + limit = size + while limit * size <= 0x100000000 + limit *= size + m += 1 + end + result = ''.dup + while m <= n + rs = random_number(limit) + is = rs.digits(size) + (m-is.length).times { is << 0 } + result << source.values_at(*is).join('') + n -= m + end + if 0 < n + rs = random_number(limit) + is = rs.digits(size) + if is.length < n + (n-is.length).times { is << 0 } + else + is.pop while n < is.length + end + result.concat source.values_at(*is).join('') + end + result + end + + # The default character list for #alphanumeric. + ALPHANUMERIC = [*'A'..'Z', *'a'..'z', *'0'..'9'] + + # Generate a random alphanumeric string. + # + # The argument _n_ specifies the length, in characters, of the alphanumeric + # string to be generated. + # The argument _chars_ specifies the character list which the result is + # consist of. + # + # If _n_ is not specified or is nil, 16 is assumed. + # It may be larger in the future. + # + # The result may contain A-Z, a-z and 0-9, unless _chars_ is specified. + # + # require 'random/formatter' + # + # Random.alphanumeric #=> "2BuBuLf3WfSKyQbR" + # # or + # prng = Random.new + # prng.alphanumeric(10) #=> "i6K93NdqiH" + # + # Random.alphanumeric(4, chars: [*"0".."9"]) #=> "2952" + # # or + # prng = Random.new + # prng.alphanumeric(10, chars: [*"!".."/"]) #=> ",.,++%/''." + def alphanumeric(n = nil, chars: ALPHANUMERIC) + n = 16 if n.nil? + choose(chars, n) + end +end diff --git a/lib/rubygems/vendor/securerandom/lib/securerandom.rb b/lib/rubygems/vendor/securerandom/lib/securerandom.rb new file mode 100644 index 00000000000000..8ce86f2c96c436 --- /dev/null +++ b/lib/rubygems/vendor/securerandom/lib/securerandom.rb @@ -0,0 +1,96 @@ +# -*- coding: us-ascii -*- +# frozen_string_literal: true + +require 'random/formatter' + +# == Secure random number generator interface. +# +# This library is an interface to secure random number generators which are +# suitable for generating session keys in HTTP cookies, etc. +# +# You can use this library in your application by requiring it: +# +# require 'rubygems/vendor/securerandom/lib/securerandom' +# +# It supports the following secure random number generators: +# +# * openssl +# * /dev/urandom +# * Win32 +# +# Gem::SecureRandom is extended by the Random::Formatter module which +# defines the following methods: +# +# * alphanumeric +# * base64 +# * choose +# * gen_random +# * hex +# * rand +# * random_bytes +# * random_number +# * urlsafe_base64 +# * uuid +# +# These methods are usable as class methods of Gem::SecureRandom such as +# +Gem::SecureRandom.hex+. +# +# If a secure random number generator is not available, +# +NotImplementedError+ is raised. + +module Gem::SecureRandom + + # The version + VERSION = "0.3.1" + + class << self + # Returns a random binary string containing +size+ bytes. + # + # See Random.bytes + def bytes(n) + return gen_random(n) + end + + private + + # :stopdoc: + + # Implementation using OpenSSL + def gen_random_openssl(n) + return OpenSSL::Random.random_bytes(n) + end + + # Implementation using system random device + def gen_random_urandom(n) + ret = Random.urandom(n) + unless ret + raise NotImplementedError, "No random device" + end + unless ret.length == n + raise NotImplementedError, "Unexpected partial read from random device: only #{ret.length} for #{n} bytes" + end + ret + end + + begin + # Check if Random.urandom is available + Random.urandom(1) + alias gen_random gen_random_urandom + rescue RuntimeError + begin + require 'openssl' + rescue NoMethodError + raise NotImplementedError, "No random device" + else + alias gen_random gen_random_openssl + end + end + + # :startdoc: + + # Generate random data bytes for Random::Formatter + public :gen_random + end +end + +Gem::SecureRandom.extend(Random::Formatter) diff --git a/tool/bundler/vendor_gems.rb b/tool/bundler/vendor_gems.rb index f02d02656d2e45..9bb3d3b037afb6 100644 --- a/tool/bundler/vendor_gems.rb +++ b/tool/bundler/vendor_gems.rb @@ -10,6 +10,7 @@ gem "optparse", "0.4.0" gem "pub_grub", github: "jhawthorn/pub_grub" gem "resolv", "0.4.0" +gem "securerandom", "0.3.1" gem "timeout", "0.4.1" gem "thor", "1.3.0" gem "tsort", "0.2.0" From e66e3cf1b9160c657778d4a85e39a9cf1ae452f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Fri, 30 Aug 2024 14:37:28 +0200 Subject: [PATCH 050/829] Change automatiek to properly vendor securerandom Co-authored-by: Jean Boussier --- lib/rubygems/vendor/resolv/lib/resolv.rb | 2 +- .../securerandom/lib/random/formatter.rb | 22 +++++++++---------- .../vendor/securerandom/lib/securerandom.rb | 8 +++---- lib/rubygems/vendored_securerandom.rb | 4 ++++ 4 files changed, 20 insertions(+), 16 deletions(-) create mode 100644 lib/rubygems/vendored_securerandom.rb diff --git a/lib/rubygems/vendor/resolv/lib/resolv.rb b/lib/rubygems/vendor/resolv/lib/resolv.rb index 0301f4f161da03..0f5ded3b767a4e 100644 --- a/lib/rubygems/vendor/resolv/lib/resolv.rb +++ b/lib/rubygems/vendor/resolv/lib/resolv.rb @@ -5,7 +5,7 @@ require 'io/wait' begin - require_relative '../../securerandom/lib/securerandom' + require_relative '../../../vendored_securerandom' rescue LoadError end diff --git a/lib/rubygems/vendor/securerandom/lib/random/formatter.rb b/lib/rubygems/vendor/securerandom/lib/random/formatter.rb index 14a1a528aa4668..3544033340be3f 100644 --- a/lib/rubygems/vendor/securerandom/lib/random/formatter.rb +++ b/lib/rubygems/vendor/securerandom/lib/random/formatter.rb @@ -4,7 +4,7 @@ # == \Random number formatter. # # Formats generated random numbers in many manners. When 'random/formatter' -# is required, several methods are added to empty core module Random::Formatter, +# is required, several methods are added to empty core module Gem::Random::Formatter, # making them available as Random's instance and module methods. # # Standard library Gem::SecureRandom is also extended with the module, and the methods @@ -14,7 +14,7 @@ # # Generate random hexadecimal strings: # -# require 'random/formatter' +# require 'rubygems/vendor/securerandom/lib/random/formatter' # # prng = Random.new # prng.hex(10) #=> "52750b30ffbc7de3b362" @@ -52,7 +52,7 @@ # # Gem::SecureRandom.hex #=> "05b45376a30c67238eb93b16499e50cf" -module Random::Formatter +module Gem::Random::Formatter # Generate a random binary string. # @@ -63,7 +63,7 @@ module Random::Formatter # # The result may contain any byte: "\x00" - "\xff". # - # require 'random/formatter' + # require 'rubygems/vendor/securerandom/lib/random/formatter' # # Random.random_bytes #=> "\xD8\\\xE0\xF4\r\xB2\xFC*WM\xFF\x83\x18\xF45\xB6" # # or @@ -84,7 +84,7 @@ def random_bytes(n=nil) # # The result may contain 0-9 and a-f. # - # require 'random/formatter' + # require 'rubygems/vendor/securerandom/lib/random/formatter' # # Random.hex #=> "eb693ec8252cd630102fd0d0fb7c3485" # # or @@ -104,7 +104,7 @@ def hex(n=nil) # # The result may contain A-Z, a-z, 0-9, "+", "/" and "=". # - # require 'random/formatter' + # require 'rubygems/vendor/securerandom/lib/random/formatter' # # Random.base64 #=> "/2BuBuLf3+WfSKyQbRcc/A==" # # or @@ -132,7 +132,7 @@ def base64(n=nil) # The result may contain A-Z, a-z, 0-9, "-" and "_". # "=" is also used if _padding_ is true. # - # require 'random/formatter' + # require 'rubygems/vendor/securerandom/lib/random/formatter' # # Random.urlsafe_base64 #=> "b4GOKm4pOYU_-BOXcrUGDg" # # or @@ -152,7 +152,7 @@ def urlsafe_base64(n=nil, padding=false) # Generate a random v4 UUID (Universally Unique IDentifier). # - # require 'random/formatter' + # require 'rubygems/vendor/securerandom/lib/random/formatter' # # Random.uuid #=> "2d931510-d99f-494a-8c67-87feb05e1594" # Random.uuid #=> "bad85eb9-0713-4da7-8d36-07a8e4b00eab" @@ -178,7 +178,7 @@ def uuid # Generate a random v7 UUID (Universally Unique IDentifier). # - # require 'random/formatter' + # require 'rubygems/vendor/securerandom/lib/random/formatter' # # Random.uuid_v7 # => "0188d4c3-1311-7f96-85c7-242a7aa58f1e" # Random.uuid_v7 # => "0188d4c3-16fe-744f-86af-38fa04c62bb5" @@ -307,7 +307,7 @@ def uuid_v7(extra_timestamp_bits: 0) # # The result may contain whatever characters are in the source array. # - # require 'random/formatter' + # require 'rubygems/vendor/securerandom/lib/random/formatter' # # prng.choose([*'l'..'r'], 16) #=> "lmrqpoonmmlqlron" # prng.choose([*'0'..'9'], 5) #=> "27309" @@ -355,7 +355,7 @@ def uuid_v7(extra_timestamp_bits: 0) # # The result may contain A-Z, a-z and 0-9, unless _chars_ is specified. # - # require 'random/formatter' + # require 'rubygems/vendor/securerandom/lib/random/formatter' # # Random.alphanumeric #=> "2BuBuLf3WfSKyQbR" # # or diff --git a/lib/rubygems/vendor/securerandom/lib/securerandom.rb b/lib/rubygems/vendor/securerandom/lib/securerandom.rb index 8ce86f2c96c436..f83d2a74fc705a 100644 --- a/lib/rubygems/vendor/securerandom/lib/securerandom.rb +++ b/lib/rubygems/vendor/securerandom/lib/securerandom.rb @@ -1,7 +1,7 @@ # -*- coding: us-ascii -*- # frozen_string_literal: true -require 'random/formatter' +require_relative 'random/formatter' # == Secure random number generator interface. # @@ -18,7 +18,7 @@ # * /dev/urandom # * Win32 # -# Gem::SecureRandom is extended by the Random::Formatter module which +# Gem::SecureRandom is extended by the Gem::Random::Formatter module which # defines the following methods: # # * alphanumeric @@ -88,9 +88,9 @@ def gen_random_urandom(n) # :startdoc: - # Generate random data bytes for Random::Formatter + # Generate random data bytes for Gem::Random::Formatter public :gen_random end end -Gem::SecureRandom.extend(Random::Formatter) +Gem::SecureRandom.extend(Gem::Random::Formatter) diff --git a/lib/rubygems/vendored_securerandom.rb b/lib/rubygems/vendored_securerandom.rb new file mode 100644 index 00000000000000..0ce26905c455ec --- /dev/null +++ b/lib/rubygems/vendored_securerandom.rb @@ -0,0 +1,4 @@ +# frozen_string_literal: true + +module Gem::Random; end +require_relative "vendor/securerandom/lib/securerandom" From 81c71efc55740ac5bdeb5817703110fd879f3693 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Fri, 30 Aug 2024 14:38:29 +0200 Subject: [PATCH 051/829] Vendor `securerandom` in Bundler as well It is loaded by `Fetcher` so in most case it's fine. But if using `bundler/inline` and a gem need to be fetched, `securerandom` will be loaded and cause a conflict. Can be reproduced with: ```ruby require 'bundler/inline' gemfile do source 'https://rubygems.org' gem 'graphql', '~> 2.0' gem 'graphql-client', '~> 0.18' end require 'json' require 'graphql/client' require 'graphql/client/http' ``` Ref: https://github.com/rails/rails/pull/52473#issuecomment-2284667451 Co-authored-by: Jean Boussier --- lib/bundler/fetcher.rb | 4 +- lib/bundler/vendor/securerandom/.document | 1 + .../securerandom/lib/random/formatter.rb | 373 ++++++++++++++++++ .../vendor/securerandom/lib/securerandom.rb | 96 +++++ lib/bundler/vendored_securerandom.rb | 14 + 5 files changed, 486 insertions(+), 2 deletions(-) create mode 100644 lib/bundler/vendor/securerandom/.document create mode 100644 lib/bundler/vendor/securerandom/lib/random/formatter.rb create mode 100644 lib/bundler/vendor/securerandom/lib/securerandom.rb create mode 100644 lib/bundler/vendored_securerandom.rb diff --git a/lib/bundler/fetcher.rb b/lib/bundler/fetcher.rb index 6288b22dcd0636..14721623f9ded6 100644 --- a/lib/bundler/fetcher.rb +++ b/lib/bundler/fetcher.rb @@ -3,7 +3,7 @@ require_relative "vendored_persistent" require_relative "vendored_timeout" require "cgi" -require "securerandom" +require_relative "vendored_securerandom" require "zlib" module Bundler @@ -182,7 +182,7 @@ def user_agent agent << " ci/#{cis.join(",")}" if cis.any? # add a random ID so we can consolidate runs server-side - agent << " " << SecureRandom.hex(8) + agent << " " << Gem::SecureRandom.hex(8) # add any user agent strings set in the config extra_ua = Bundler.settings[:user_agent] diff --git a/lib/bundler/vendor/securerandom/.document b/lib/bundler/vendor/securerandom/.document new file mode 100644 index 00000000000000..0c43bbd6b38177 --- /dev/null +++ b/lib/bundler/vendor/securerandom/.document @@ -0,0 +1 @@ +# Vendored files do not need to be documented diff --git a/lib/bundler/vendor/securerandom/lib/random/formatter.rb b/lib/bundler/vendor/securerandom/lib/random/formatter.rb new file mode 100644 index 00000000000000..e4297097890a34 --- /dev/null +++ b/lib/bundler/vendor/securerandom/lib/random/formatter.rb @@ -0,0 +1,373 @@ +# -*- coding: us-ascii -*- +# frozen_string_literal: true + +# == \Random number formatter. +# +# Formats generated random numbers in many manners. When 'random/formatter' +# is required, several methods are added to empty core module Bundler::Random::Formatter, +# making them available as Random's instance and module methods. +# +# Standard library Bundler::SecureRandom is also extended with the module, and the methods +# described below are available as a module methods in it. +# +# === Examples +# +# Generate random hexadecimal strings: +# +# require 'bundler/vendor/securerandom/lib/random/formatter' +# +# prng = Random.new +# prng.hex(10) #=> "52750b30ffbc7de3b362" +# prng.hex(10) #=> "92b15d6c8dc4beb5f559" +# prng.hex(13) #=> "39b290146bea6ce975c37cfc23" +# # or just +# Random.hex #=> "1aed0c631e41be7f77365415541052ee" +# +# Generate random base64 strings: +# +# prng.base64(10) #=> "EcmTPZwWRAozdA==" +# prng.base64(10) #=> "KO1nIU+p9DKxGg==" +# prng.base64(12) #=> "7kJSM/MzBJI+75j8" +# Random.base64(4) #=> "bsQ3fQ==" +# +# Generate random binary strings: +# +# prng.random_bytes(10) #=> "\016\t{\370g\310pbr\301" +# prng.random_bytes(10) #=> "\323U\030TO\234\357\020\a\337" +# Random.random_bytes(6) #=> "\xA1\xE6Lr\xC43" +# +# Generate alphanumeric strings: +# +# prng.alphanumeric(10) #=> "S8baxMJnPl" +# prng.alphanumeric(10) #=> "aOxAg8BAJe" +# Random.alphanumeric #=> "TmP9OsJHJLtaZYhP" +# +# Generate UUIDs: +# +# prng.uuid #=> "2d931510-d99f-494a-8c67-87feb05e1594" +# prng.uuid #=> "bad85eb9-0713-4da7-8d36-07a8e4b00eab" +# Random.uuid #=> "f14e0271-de96-45cc-8911-8910292a42cd" +# +# All methods are available in the standard library Bundler::SecureRandom, too: +# +# Bundler::SecureRandom.hex #=> "05b45376a30c67238eb93b16499e50cf" + +module Bundler::Random::Formatter + + # Generate a random binary string. + # + # The argument _n_ specifies the length of the result string. + # + # If _n_ is not specified or is nil, 16 is assumed. + # It may be larger in future. + # + # The result may contain any byte: "\x00" - "\xff". + # + # require 'bundler/vendor/securerandom/lib/random/formatter' + # + # Random.random_bytes #=> "\xD8\\\xE0\xF4\r\xB2\xFC*WM\xFF\x83\x18\xF45\xB6" + # # or + # prng = Random.new + # prng.random_bytes #=> "m\xDC\xFC/\a\x00Uf\xB2\xB2P\xBD\xFF6S\x97" + def random_bytes(n=nil) + n = n ? n.to_int : 16 + gen_random(n) + end + + # Generate a random hexadecimal string. + # + # The argument _n_ specifies the length, in bytes, of the random number to be generated. + # The length of the resulting hexadecimal string is twice of _n_. + # + # If _n_ is not specified or is nil, 16 is assumed. + # It may be larger in the future. + # + # The result may contain 0-9 and a-f. + # + # require 'bundler/vendor/securerandom/lib/random/formatter' + # + # Random.hex #=> "eb693ec8252cd630102fd0d0fb7c3485" + # # or + # prng = Random.new + # prng.hex #=> "91dc3bfb4de5b11d029d376634589b61" + def hex(n=nil) + random_bytes(n).unpack1("H*") + end + + # Generate a random base64 string. + # + # The argument _n_ specifies the length, in bytes, of the random number + # to be generated. The length of the result string is about 4/3 of _n_. + # + # If _n_ is not specified or is nil, 16 is assumed. + # It may be larger in the future. + # + # The result may contain A-Z, a-z, 0-9, "+", "/" and "=". + # + # require 'bundler/vendor/securerandom/lib/random/formatter' + # + # Random.base64 #=> "/2BuBuLf3+WfSKyQbRcc/A==" + # # or + # prng = Random.new + # prng.base64 #=> "6BbW0pxO0YENxn38HMUbcQ==" + # + # See RFC 3548 for the definition of base64. + def base64(n=nil) + [random_bytes(n)].pack("m0") + end + + # Generate a random URL-safe base64 string. + # + # The argument _n_ specifies the length, in bytes, of the random number + # to be generated. The length of the result string is about 4/3 of _n_. + # + # If _n_ is not specified or is nil, 16 is assumed. + # It may be larger in the future. + # + # The boolean argument _padding_ specifies the padding. + # If it is false or nil, padding is not generated. + # Otherwise padding is generated. + # By default, padding is not generated because "=" may be used as a URL delimiter. + # + # The result may contain A-Z, a-z, 0-9, "-" and "_". + # "=" is also used if _padding_ is true. + # + # require 'bundler/vendor/securerandom/lib/random/formatter' + # + # Random.urlsafe_base64 #=> "b4GOKm4pOYU_-BOXcrUGDg" + # # or + # prng = Random.new + # prng.urlsafe_base64 #=> "UZLdOkzop70Ddx-IJR0ABg" + # + # prng.urlsafe_base64(nil, true) #=> "i0XQ-7gglIsHGV2_BNPrdQ==" + # prng.urlsafe_base64(nil, true) #=> "-M8rLhr7JEpJlqFGUMmOxg==" + # + # See RFC 3548 for the definition of URL-safe base64. + def urlsafe_base64(n=nil, padding=false) + s = [random_bytes(n)].pack("m0") + s.tr!("+/", "-_") + s.delete!("=") unless padding + s + end + + # Generate a random v4 UUID (Universally Unique IDentifier). + # + # require 'bundler/vendor/securerandom/lib/random/formatter' + # + # Random.uuid #=> "2d931510-d99f-494a-8c67-87feb05e1594" + # Random.uuid #=> "bad85eb9-0713-4da7-8d36-07a8e4b00eab" + # # or + # prng = Random.new + # prng.uuid #=> "62936e70-1815-439b-bf89-8492855a7e6b" + # + # The version 4 UUID is purely random (except the version). + # It doesn't contain meaningful information such as MAC addresses, timestamps, etc. + # + # The result contains 122 random bits (15.25 random bytes). + # + # See RFC4122[https://datatracker.ietf.org/doc/html/rfc4122] for details of UUID. + # + def uuid + ary = random_bytes(16).unpack("NnnnnN") + ary[2] = (ary[2] & 0x0fff) | 0x4000 + ary[3] = (ary[3] & 0x3fff) | 0x8000 + "%08x-%04x-%04x-%04x-%04x%08x" % ary + end + + alias uuid_v4 uuid + + # Generate a random v7 UUID (Universally Unique IDentifier). + # + # require 'bundler/vendor/securerandom/lib/random/formatter' + # + # Random.uuid_v7 # => "0188d4c3-1311-7f96-85c7-242a7aa58f1e" + # Random.uuid_v7 # => "0188d4c3-16fe-744f-86af-38fa04c62bb5" + # Random.uuid_v7 # => "0188d4c3-1af8-764f-b049-c204ce0afa23" + # Random.uuid_v7 # => "0188d4c3-1e74-7085-b14f-ef6415dc6f31" + # # |<--sorted-->| |<----- random ---->| + # + # # or + # prng = Random.new + # prng.uuid_v7 # => "0188ca51-5e72-7950-a11d-def7ff977c98" + # + # The version 7 UUID starts with the least significant 48 bits of a 64 bit + # Unix timestamp (milliseconds since the epoch) and fills the remaining bits + # with random data, excluding the version and variant bits. + # + # This allows version 7 UUIDs to be sorted by creation time. Time ordered + # UUIDs can be used for better database index locality of newly inserted + # records, which may have a significant performance benefit compared to random + # data inserts. + # + # The result contains 74 random bits (9.25 random bytes). + # + # Note that this method cannot be made reproducable because its output + # includes not only random bits but also timestamp. + # + # See draft-ietf-uuidrev-rfc4122bis[https://datatracker.ietf.org/doc/draft-ietf-uuidrev-rfc4122bis/] + # for details of UUIDv7. + # + # ==== Monotonicity + # + # UUIDv7 has millisecond precision by default, so multiple UUIDs created + # within the same millisecond are not issued in monotonically increasing + # order. To create UUIDs that are time-ordered with sub-millisecond + # precision, up to 12 bits of additional timestamp may added with + # +extra_timestamp_bits+. The extra timestamp precision comes at the expense + # of random bits. Setting extra_timestamp_bits: 12 provides ~244ns + # of precision, but only 62 random bits (7.75 random bytes). + # + # prng = Random.new + # Array.new(4) { prng.uuid_v7(extra_timestamp_bits: 12) } + # # => + # ["0188d4c7-13da-74f9-8b53-22a786ffdd5a", + # "0188d4c7-13da-753b-83a5-7fb9b2afaeea", + # "0188d4c7-13da-754a-88ea-ac0baeedd8db", + # "0188d4c7-13da-7557-83e1-7cad9cda0d8d"] + # # |<--- sorted --->| |<-- random --->| + # + # Array.new(4) { prng.uuid_v7(extra_timestamp_bits: 8) } + # # => + # ["0188d4c7-3333-7a95-850a-de6edb858f7e", + # "0188d4c7-3333-7ae8-842e-bc3a8b7d0cf9", # <- out of order + # "0188d4c7-3333-7ae2-995a-9f135dc44ead", # <- out of order + # "0188d4c7-3333-7af9-87c3-8f612edac82e"] + # # |<--- sorted -->||<---- random --->| + # + # Any rollbacks of the system clock will break monotonicity. UUIDv7 is based + # on UTC, which excludes leap seconds and can rollback the clock. To avoid + # this, the system clock can synchronize with an NTP server configured to use + # a "leap smear" approach. NTP or PTP will also be needed to synchronize + # across distributed nodes. + # + # Counters and other mechanisms for stronger guarantees of monotonicity are + # not implemented. Applications with stricter requirements should follow + # {Section 6.2}[https://www.ietf.org/archive/id/draft-ietf-uuidrev-rfc4122bis-07.html#monotonicity_counters] + # of the specification. + # + def uuid_v7(extra_timestamp_bits: 0) + case (extra_timestamp_bits = Integer(extra_timestamp_bits)) + when 0 # min timestamp precision + ms = Process.clock_gettime(Process::CLOCK_REALTIME, :millisecond) + rand = random_bytes(10) + rand.setbyte(0, rand.getbyte(0) & 0x0f | 0x70) # version + rand.setbyte(2, rand.getbyte(2) & 0x3f | 0x80) # variant + "%08x-%04x-%s" % [ + (ms & 0x0000_ffff_ffff_0000) >> 16, + (ms & 0x0000_0000_0000_ffff), + rand.unpack("H4H4H12").join("-") + ] + + when 12 # max timestamp precision + ms, ns = Process.clock_gettime(Process::CLOCK_REALTIME, :nanosecond) + .divmod(1_000_000) + extra_bits = ns * 4096 / 1_000_000 + rand = random_bytes(8) + rand.setbyte(0, rand.getbyte(0) & 0x3f | 0x80) # variant + "%08x-%04x-7%03x-%s" % [ + (ms & 0x0000_ffff_ffff_0000) >> 16, + (ms & 0x0000_0000_0000_ffff), + extra_bits, + rand.unpack("H4H12").join("-") + ] + + when (0..12) # the generic version is slower than the special cases above + rand_a, rand_b1, rand_b2, rand_b3 = random_bytes(10).unpack("nnnN") + rand_mask_bits = 12 - extra_timestamp_bits + ms, ns = Process.clock_gettime(Process::CLOCK_REALTIME, :nanosecond) + .divmod(1_000_000) + "%08x-%04x-%04x-%04x-%04x%08x" % [ + (ms & 0x0000_ffff_ffff_0000) >> 16, + (ms & 0x0000_0000_0000_ffff), + 0x7000 | + ((ns * (1 << extra_timestamp_bits) / 1_000_000) << rand_mask_bits) | + rand_a & ((1 << rand_mask_bits) - 1), + 0x8000 | (rand_b1 & 0x3fff), + rand_b2, + rand_b3 + ] + + else + raise ArgumentError, "extra_timestamp_bits must be in 0..12" + end + end + + # Internal interface to Random; Generate random data _n_ bytes. + private def gen_random(n) + self.bytes(n) + end + + # Generate a string that randomly draws from a + # source array of characters. + # + # The argument _source_ specifies the array of characters from which + # to generate the string. + # The argument _n_ specifies the length, in characters, of the string to be + # generated. + # + # The result may contain whatever characters are in the source array. + # + # require 'bundler/vendor/securerandom/lib/random/formatter' + # + # prng.choose([*'l'..'r'], 16) #=> "lmrqpoonmmlqlron" + # prng.choose([*'0'..'9'], 5) #=> "27309" + private def choose(source, n) + size = source.size + m = 1 + limit = size + while limit * size <= 0x100000000 + limit *= size + m += 1 + end + result = ''.dup + while m <= n + rs = random_number(limit) + is = rs.digits(size) + (m-is.length).times { is << 0 } + result << source.values_at(*is).join('') + n -= m + end + if 0 < n + rs = random_number(limit) + is = rs.digits(size) + if is.length < n + (n-is.length).times { is << 0 } + else + is.pop while n < is.length + end + result.concat source.values_at(*is).join('') + end + result + end + + # The default character list for #alphanumeric. + ALPHANUMERIC = [*'A'..'Z', *'a'..'z', *'0'..'9'] + + # Generate a random alphanumeric string. + # + # The argument _n_ specifies the length, in characters, of the alphanumeric + # string to be generated. + # The argument _chars_ specifies the character list which the result is + # consist of. + # + # If _n_ is not specified or is nil, 16 is assumed. + # It may be larger in the future. + # + # The result may contain A-Z, a-z and 0-9, unless _chars_ is specified. + # + # require 'bundler/vendor/securerandom/lib/random/formatter' + # + # Random.alphanumeric #=> "2BuBuLf3WfSKyQbR" + # # or + # prng = Random.new + # prng.alphanumeric(10) #=> "i6K93NdqiH" + # + # Random.alphanumeric(4, chars: [*"0".."9"]) #=> "2952" + # # or + # prng = Random.new + # prng.alphanumeric(10, chars: [*"!".."/"]) #=> ",.,++%/''." + def alphanumeric(n = nil, chars: ALPHANUMERIC) + n = 16 if n.nil? + choose(chars, n) + end +end diff --git a/lib/bundler/vendor/securerandom/lib/securerandom.rb b/lib/bundler/vendor/securerandom/lib/securerandom.rb new file mode 100644 index 00000000000000..e797054468edcc --- /dev/null +++ b/lib/bundler/vendor/securerandom/lib/securerandom.rb @@ -0,0 +1,96 @@ +# -*- coding: us-ascii -*- +# frozen_string_literal: true + +require_relative 'random/formatter' + +# == Secure random number generator interface. +# +# This library is an interface to secure random number generators which are +# suitable for generating session keys in HTTP cookies, etc. +# +# You can use this library in your application by requiring it: +# +# require 'bundler/vendor/securerandom/lib/securerandom' +# +# It supports the following secure random number generators: +# +# * openssl +# * /dev/urandom +# * Win32 +# +# Bundler::SecureRandom is extended by the Bundler::Random::Formatter module which +# defines the following methods: +# +# * alphanumeric +# * base64 +# * choose +# * gen_random +# * hex +# * rand +# * random_bytes +# * random_number +# * urlsafe_base64 +# * uuid +# +# These methods are usable as class methods of Bundler::SecureRandom such as +# +Bundler::SecureRandom.hex+. +# +# If a secure random number generator is not available, +# +NotImplementedError+ is raised. + +module Bundler::SecureRandom + + # The version + VERSION = "0.3.1" + + class << self + # Returns a random binary string containing +size+ bytes. + # + # See Random.bytes + def bytes(n) + return gen_random(n) + end + + private + + # :stopdoc: + + # Implementation using OpenSSL + def gen_random_openssl(n) + return OpenSSL::Random.random_bytes(n) + end + + # Implementation using system random device + def gen_random_urandom(n) + ret = Random.urandom(n) + unless ret + raise NotImplementedError, "No random device" + end + unless ret.length == n + raise NotImplementedError, "Unexpected partial read from random device: only #{ret.length} for #{n} bytes" + end + ret + end + + begin + # Check if Random.urandom is available + Random.urandom(1) + alias gen_random gen_random_urandom + rescue RuntimeError + begin + require 'openssl' + rescue NoMethodError + raise NotImplementedError, "No random device" + else + alias gen_random gen_random_openssl + end + end + + # :startdoc: + + # Generate random data bytes for Bundler::Random::Formatter + public :gen_random + end +end + +Bundler::SecureRandom.extend(Bundler::Random::Formatter) diff --git a/lib/bundler/vendored_securerandom.rb b/lib/bundler/vendored_securerandom.rb new file mode 100644 index 00000000000000..6c15f4a2b2aef5 --- /dev/null +++ b/lib/bundler/vendored_securerandom.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +# Use RubyGems vendored copy when available. Otherwise fallback to Bundler +# vendored copy. The vendored copy in Bundler can be removed once support for +# RubyGems 3.5.18 is dropped. + +begin + require "rubygems/vendored_securerandom" +rescue LoadError + module Bundler::Random; end + require_relative "vendor/securerandom/lib/securerandom" + Gem::SecureRandom = Bundler::SecureRandom + Gem::Random = Bundler::Random +end From d612f9fd347a3803ff8ecd3f2bef9cda2dbd3ad7 Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Mon, 2 Sep 2024 10:17:23 +0200 Subject: [PATCH 052/829] [flori/json] Remove outdated ifdef checks `json` requires Ruby 2.3, so `HAVE_RUBY_ENCODING_H` and `HAVE_RB_ENC_RAISE` are always true. https://github.com/flori/json/commit/5c8dc6b70a --- ext/json/fbuffer/fbuffer.h | 4 ---- ext/json/generator/generator.c | 5 +---- ext/json/parser/parser.c | 40 +++++++--------------------------- ext/json/parser/parser.rl | 36 ++++++------------------------ 4 files changed, 16 insertions(+), 69 deletions(-) diff --git a/ext/json/fbuffer/fbuffer.h b/ext/json/fbuffer/fbuffer.h index dc8f406b5b8594..7ece0cee95a7d5 100644 --- a/ext/json/fbuffer/fbuffer.h +++ b/ext/json/fbuffer/fbuffer.h @@ -31,12 +31,8 @@ # define RB_OBJ_STRING(obj) StringValueCStr(obj) #endif -#ifdef HAVE_RUBY_ENCODING_H #include "ruby/encoding.h" #define FORCE_UTF8(obj) rb_enc_associate((obj), rb_utf8_encoding()) -#else -#define FORCE_UTF8(obj) -#endif /* We don't need to guard objects for rbx, so let's do nothing at all. */ #ifndef RB_GC_GUARD diff --git a/ext/json/generator/generator.c b/ext/json/generator/generator.c index e9686192059840..766e199f74fb3c 100644 --- a/ext/json/generator/generator.c +++ b/ext/json/generator/generator.c @@ -947,23 +947,20 @@ static void generate_json_array(FBuffer *buffer, VALUE Vstate, JSON_Generator_St fbuffer_append_char(buffer, ']'); } -#ifdef HAVE_RUBY_ENCODING_H static int enc_utf8_compatible_p(rb_encoding *enc) { if (enc == rb_usascii_encoding()) return 1; if (enc == rb_utf8_encoding()) return 1; return 0; } -#endif static void generate_json_string(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj) { fbuffer_append_char(buffer, '"'); -#ifdef HAVE_RUBY_ENCODING_H if (!enc_utf8_compatible_p(rb_enc_get(obj))) { obj = rb_str_export_to_enc(obj, rb_utf8_encoding()); } -#endif + if (state->ascii_only) { convert_UTF8_to_JSON_ASCII(buffer, obj, state->script_safe); } else { diff --git a/ext/json/parser/parser.c b/ext/json/parser/parser.c index 7e44d469f8c7e2..128f683e0f45a3 100644 --- a/ext/json/parser/parser.c +++ b/ext/json/parser/parser.c @@ -3,28 +3,6 @@ #include "../fbuffer/fbuffer.h" #include "parser.h" -#if defined HAVE_RUBY_ENCODING_H -# define EXC_ENCODING rb_utf8_encoding(), -# ifndef HAVE_RB_ENC_RAISE -static void -enc_raise(rb_encoding *enc, VALUE exc, const char *fmt, ...) -{ - va_list args; - VALUE mesg; - - va_start(args, fmt); - mesg = rb_enc_vsprintf(enc, fmt, args); - va_end(args); - - rb_exc_raise(rb_exc_new3(exc, mesg)); -} -# define rb_enc_raise enc_raise -# endif -#else -# define EXC_ENCODING /* nothing */ -# define rb_enc_raise rb_raise -#endif - /* unicode */ static const signed char digit_values[256] = { @@ -555,7 +533,7 @@ cs = 0; {p = (( p + 10))-1;} p--; {p++; cs = 29; goto _out;} } else { - rb_enc_raise(EXC_ENCODING eParserError, "unexpected token at '%s'", p); + rb_enc_raise(rb_utf8_encoding(), eParserError, "unexpected token at '%s'", p); } } np = JSON_parse_float(json, p, pe, result); @@ -587,7 +565,7 @@ cs = 0; if (json->allow_nan) { *result = CInfinity; } else { - rb_enc_raise(EXC_ENCODING eParserError, "unexpected token at '%s'", p - 7); + rb_enc_raise(rb_utf8_encoding(), eParserError, "unexpected token at '%s'", p - 7); } } goto st29; @@ -597,7 +575,7 @@ cs = 0; if (json->allow_nan) { *result = CNaN; } else { - rb_enc_raise(EXC_ENCODING eParserError, "unexpected token at '%s'", p - 2); + rb_enc_raise(rb_utf8_encoding(), eParserError, "unexpected token at '%s'", p - 2); } } goto st29; @@ -1436,7 +1414,7 @@ case 16: if(cs >= JSON_array_first_final) { return p + 1; } else { - rb_enc_raise(EXC_ENCODING eParserError, "unexpected token at '%s'", p); + rb_enc_raise(rb_utf8_encoding(), eParserError, "unexpected token at '%s'", p); return NULL; } } @@ -1500,7 +1478,7 @@ static VALUE json_string_unescape(char *string, char *stringEnd, int intern, int ruby_xfree(bufferStart); } rb_enc_raise( - EXC_ENCODING eParserError, + rb_utf8_encoding(), eParserError, "incomplete unicode character escape sequence at '%s'", p ); } else { @@ -1513,7 +1491,7 @@ static VALUE json_string_unescape(char *string, char *stringEnd, int intern, int ruby_xfree(bufferStart); } rb_enc_raise( - EXC_ENCODING eParserError, + rb_utf8_encoding(), eParserError, "incomplete surrogate pair at '%s'", p ); } @@ -1777,7 +1755,6 @@ case 7: static VALUE convert_encoding(VALUE source) { -#ifdef HAVE_RUBY_ENCODING_H rb_encoding *enc = rb_enc_get(source); if (enc == rb_ascii8bit_encoding()) { if (OBJ_FROZEN(source)) { @@ -1787,8 +1764,7 @@ static VALUE convert_encoding(VALUE source) } else { source = rb_str_conv_enc(source, rb_enc_get(source), rb_utf8_encoding()); } -#endif - return source; + return source; } /* @@ -2089,7 +2065,7 @@ case 9: if (cs >= JSON_first_final && p == pe) { return result; } else { - rb_enc_raise(EXC_ENCODING eParserError, "unexpected token at '%s'", p); + rb_enc_raise(rb_utf8_encoding(), eParserError, "unexpected token at '%s'", p); return Qnil; } } diff --git a/ext/json/parser/parser.rl b/ext/json/parser/parser.rl index e2522918dc6728..873c1b30077049 100644 --- a/ext/json/parser/parser.rl +++ b/ext/json/parser/parser.rl @@ -1,28 +1,6 @@ #include "../fbuffer/fbuffer.h" #include "parser.h" -#if defined HAVE_RUBY_ENCODING_H -# define EXC_ENCODING rb_utf8_encoding(), -# ifndef HAVE_RB_ENC_RAISE -static void -enc_raise(rb_encoding *enc, VALUE exc, const char *fmt, ...) -{ - va_list args; - VALUE mesg; - - va_start(args, fmt); - mesg = rb_enc_vsprintf(enc, fmt, args); - va_end(args); - - rb_exc_raise(rb_exc_new3(exc, mesg)); -} -# define rb_enc_raise enc_raise -# endif -#else -# define EXC_ENCODING /* nothing */ -# define rb_enc_raise rb_raise -#endif - /* unicode */ static const signed char digit_values[256] = { @@ -222,14 +200,14 @@ static char *JSON_parse_object(JSON_Parser *json, char *p, char *pe, VALUE *resu if (json->allow_nan) { *result = CNaN; } else { - rb_enc_raise(EXC_ENCODING eParserError, "unexpected token at '%s'", p - 2); + rb_enc_raise(rb_utf8_encoding(), eParserError, "unexpected token at '%s'", p - 2); } } action parse_infinity { if (json->allow_nan) { *result = CInfinity; } else { - rb_enc_raise(EXC_ENCODING eParserError, "unexpected token at '%s'", p - 7); + rb_enc_raise(rb_utf8_encoding(), eParserError, "unexpected token at '%s'", p - 7); } } action parse_string { @@ -245,7 +223,7 @@ static char *JSON_parse_object(JSON_Parser *json, char *p, char *pe, VALUE *resu fexec p + 10; fhold; fbreak; } else { - rb_enc_raise(EXC_ENCODING eParserError, "unexpected token at '%s'", p); + rb_enc_raise(rb_utf8_encoding(), eParserError, "unexpected token at '%s'", p); } } np = JSON_parse_float(json, fpc, pe, result); @@ -447,7 +425,7 @@ static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *resul if(cs >= JSON_array_first_final) { return p + 1; } else { - rb_enc_raise(EXC_ENCODING eParserError, "unexpected token at '%s'", p); + rb_enc_raise(rb_utf8_encoding(), eParserError, "unexpected token at '%s'", p); return NULL; } } @@ -511,7 +489,7 @@ static VALUE json_string_unescape(char *string, char *stringEnd, int intern, int ruby_xfree(bufferStart); } rb_enc_raise( - EXC_ENCODING eParserError, + rb_utf8_encoding(), eParserError, "incomplete unicode character escape sequence at '%s'", p ); } else { @@ -524,7 +502,7 @@ static VALUE json_string_unescape(char *string, char *stringEnd, int intern, int ruby_xfree(bufferStart); } rb_enc_raise( - EXC_ENCODING eParserError, + rb_utf8_encoding(), eParserError, "incomplete surrogate pair at '%s'", p ); } @@ -849,7 +827,7 @@ static VALUE cParser_parse(VALUE self) if (cs >= JSON_first_final && p == pe) { return result; } else { - rb_enc_raise(EXC_ENCODING eParserError, "unexpected token at '%s'", p); + rb_enc_raise(rb_utf8_encoding(), eParserError, "unexpected token at '%s'", p); return Qnil; } } From f4883e790495da3fd9a8e44ade1099821429153c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20Barri=C3=A9?= Date: Mon, 2 Sep 2024 10:49:27 +0200 Subject: [PATCH 053/829] [flori/json] Use the compiled extension in test https://github.com/flori/json/commit/148afef84c --- test/json/json_generator_test.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/json/json_generator_test.rb b/test/json/json_generator_test.rb index 526bb8c1febd2c..19b4c7434f5272 100755 --- a/test/json/json_generator_test.rb +++ b/test/json/json_generator_test.rb @@ -243,7 +243,7 @@ def test_buffer_initial_length def test_gc if respond_to?(:assert_in_out_err) && !(RUBY_PLATFORM =~ /java/) - assert_in_out_err(%w[-rjson], <<-EOS, [], []) + assert_in_out_err(%w[-rjson -Ilib -Iext], <<-EOS, [], []) bignum_too_long_to_embed_as_string = 1234567890123456789012345 expect = bignum_too_long_to_embed_as_string.to_s GC.stress = true From 5fd3942466004daa0b07ed61acae1dee84ebdd75 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Tue, 3 Sep 2024 13:35:00 +0900 Subject: [PATCH 054/829] [ruby/optparse] Prefer `require_relative` https://github.com/ruby/optparse/commit/bb08cd47a8 --- lib/optparse.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/optparse.rb b/lib/optparse.rb index d52401a31b60da..50641867f08db7 100644 --- a/lib/optparse.rb +++ b/lib/optparse.rb @@ -1115,7 +1115,7 @@ def help_exit Switch::OptionalArgument.new do |pkg| if pkg begin - require 'optparse/version' + require_relative 'optparse/version' rescue LoadError else show_version(*pkg.split(/,/)) or From e7cb70be4eb7411204f73ee748e317fefaa0410a Mon Sep 17 00:00:00 2001 From: Zack Deveau Date: Fri, 23 Aug 2024 13:18:44 -0400 Subject: [PATCH 055/829] Improve String#rindex performance on OSX On OSX, String#rindex is slow due to the lack of `memrchr`. The fallback implementation finds a match by instead doing a `memcmp` on every single character in the search string looking for a substring match. For OSX hosts, this changeset introduces a simple `memrchr` implementation, `rb_memrchr`, that can be used instead. An example benchmark below demonstrates an 8000 char long search string with a 10 char substring near the end. ``` ruby-master | substring near the end | osx UTF-8 user system total real index 0.000111 0.000000 0.000111 ( 0.000110) rindex 0.000446 0.000005 0.000451 ( 0.000454) ``` ``` ruby-patched | substring near the end | osx UTF-8 user system total real index 0.000112 0.000000 0.000112 ( 0.000111) rindex 0.000057 0.000001 0.000058 ( 0.000057) ``` --- string.c | 41 +++++++++++++++++------------------------ 1 file changed, 17 insertions(+), 24 deletions(-) diff --git a/string.c b/string.c index 6a6b4c8b29664f..025382c0f4595d 100644 --- a/string.c +++ b/string.c @@ -4345,7 +4345,19 @@ rb_str_byteindex_m(int argc, VALUE *argv, VALUE str) return Qnil; } -#ifdef HAVE_MEMRCHR +#ifndef HAVE_MEMRCHR +static void* +memrchr(const char *search_str, int chr, long search_len) +{ + const char *ptr = search_str + search_len; + do { + if ((unsigned char)*(--ptr) == chr) return (void *)ptr; + } while (ptr >= search_str); + + return ((void *)0); +} +#endif + static long str_rindex(VALUE str, VALUE sub, const char *s, rb_encoding *enc) { @@ -4362,6 +4374,10 @@ str_rindex(VALUE str, VALUE sub, const char *s, rb_encoding *enc) c = *t & 0xff; searchlen = s - sbeg + 1; + if (memcmp(s, t, slen) == 0) { + return s - sbeg; + } + do { hit = memrchr(sbeg, c, searchlen); if (!hit) break; @@ -4377,29 +4393,6 @@ str_rindex(VALUE str, VALUE sub, const char *s, rb_encoding *enc) return -1; } -#else -static long -str_rindex(VALUE str, VALUE sub, const char *s, rb_encoding *enc) -{ - long slen; - char *sbeg, *e, *t; - - sbeg = RSTRING_PTR(str); - e = RSTRING_END(str); - t = RSTRING_PTR(sub); - slen = RSTRING_LEN(sub); - - while (s) { - if (memcmp(s, t, slen) == 0) { - return s - sbeg; - } - if (s <= sbeg) break; - s = rb_enc_prev_char(sbeg, s, e, enc); - } - - return -1; -} -#endif /* found index in byte */ static long From 20c3401543a92c3f310a03c4d2e664c463e390ef Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Mon, 2 Sep 2024 23:25:13 -0700 Subject: [PATCH 056/829] Drop `--profile ruby` on the release workflow --- .github/workflows/release.yml | 1 + tool/release.sh | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e335c965143494..8862a028217046 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -34,6 +34,7 @@ jobs: AWS_ACCESS_KEY_ID: ${{ secrets.FTP_R_L_O_AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.FTP_R_L_O_AWS_SECRET_ACCESS_KEY }} AWS_DEFAULT_REGION: us-west-2 + AWS_CLI_OPTS: # drop `--profile ruby` - name: Purge URLs of release package run: | diff --git a/tool/release.sh b/tool/release.sh index 6b8cf3ea504bfc..7afc95c9694e2c 100755 --- a/tool/release.sh +++ b/tool/release.sh @@ -5,6 +5,7 @@ # tool/release.sh 3.0.0-rc1 EXTS='.tar.gz .tar.xz .zip' +AWS_CLI_OPTS="${AWS_CLI_OPTS:=--profile ruby}" ver=$1 if [[ $ver =~ ^([1-9]\.[0-9])\.([0-9]|[1-9][0-9]|0-(preview[1-9]|rc[1-9]))$ ]]; then @@ -18,5 +19,5 @@ short=${BASH_REMATCH[1]} echo $ver echo $short for ext in $EXTS; do - aws --profile ruby s3 cp s3://ftp.r-l.o/pub/tmp/ruby-$ver-draft$ext s3://ftp.r-l.o/pub/ruby/$short/ruby-$ver$ext + aws $AWS_CLI_OPTS s3 cp s3://ftp.r-l.o/pub/tmp/ruby-$ver-draft$ext s3://ftp.r-l.o/pub/ruby/$short/ruby-$ver$ext done From ad613d088415fa9d9373ae0a2ef367311005f9c0 Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Mon, 2 Sep 2024 23:29:43 -0700 Subject: [PATCH 057/829] Try to fix AWS_CLI_OPTS with AWS_ACCESS_KEY_ID --- .github/workflows/release.yml | 1 - tool/release.sh | 6 +++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8862a028217046..e335c965143494 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -34,7 +34,6 @@ jobs: AWS_ACCESS_KEY_ID: ${{ secrets.FTP_R_L_O_AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.FTP_R_L_O_AWS_SECRET_ACCESS_KEY }} AWS_DEFAULT_REGION: us-west-2 - AWS_CLI_OPTS: # drop `--profile ruby` - name: Purge URLs of release package run: | diff --git a/tool/release.sh b/tool/release.sh index 7afc95c9694e2c..d467d8f24b8b38 100755 --- a/tool/release.sh +++ b/tool/release.sh @@ -5,7 +5,11 @@ # tool/release.sh 3.0.0-rc1 EXTS='.tar.gz .tar.xz .zip' -AWS_CLI_OPTS="${AWS_CLI_OPTS:=--profile ruby}" +if [[ -n $AWS_ACCESS_KEY_ID ]]; then + AWS_CLI_OPTS="" +else + AWS_CLI_OPTS="--profile ruby" +fi ver=$1 if [[ $ver =~ ^([1-9]\.[0-9])\.([0-9]|[1-9][0-9]|0-(preview[1-9]|rc[1-9]))$ ]]; then From 6986536488ba23c033c043ef8765438f22df7bf5 Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Mon, 2 Sep 2024 23:31:58 -0700 Subject: [PATCH 058/829] Experiment with removing --profile ruby for now --- tool/release.sh | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/tool/release.sh b/tool/release.sh index d467d8f24b8b38..4ab4809e7a62c5 100755 --- a/tool/release.sh +++ b/tool/release.sh @@ -5,11 +5,6 @@ # tool/release.sh 3.0.0-rc1 EXTS='.tar.gz .tar.xz .zip' -if [[ -n $AWS_ACCESS_KEY_ID ]]; then - AWS_CLI_OPTS="" -else - AWS_CLI_OPTS="--profile ruby" -fi ver=$1 if [[ $ver =~ ^([1-9]\.[0-9])\.([0-9]|[1-9][0-9]|0-(preview[1-9]|rc[1-9]))$ ]]; then @@ -23,5 +18,5 @@ short=${BASH_REMATCH[1]} echo $ver echo $short for ext in $EXTS; do - aws $AWS_CLI_OPTS s3 cp s3://ftp.r-l.o/pub/tmp/ruby-$ver-draft$ext s3://ftp.r-l.o/pub/ruby/$short/ruby-$ver$ext + aws s3 cp s3://ftp.r-l.o/pub/tmp/ruby-$ver-draft$ext s3://ftp.r-l.o/pub/ruby/$short/ruby-$ver$ext done From 1b8fb4860bebe077bdf24bfb1b0218fba959446e Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Mon, 2 Sep 2024 23:37:15 -0700 Subject: [PATCH 059/829] Revert "Experiment with removing --profile ruby for now" This reverts commit 6986536488ba23c033c043ef8765438f22df7bf5. We were just missing the secrets. --- tool/release.sh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tool/release.sh b/tool/release.sh index 4ab4809e7a62c5..d467d8f24b8b38 100755 --- a/tool/release.sh +++ b/tool/release.sh @@ -5,6 +5,11 @@ # tool/release.sh 3.0.0-rc1 EXTS='.tar.gz .tar.xz .zip' +if [[ -n $AWS_ACCESS_KEY_ID ]]; then + AWS_CLI_OPTS="" +else + AWS_CLI_OPTS="--profile ruby" +fi ver=$1 if [[ $ver =~ ^([1-9]\.[0-9])\.([0-9]|[1-9][0-9]|0-(preview[1-9]|rc[1-9]))$ ]]; then @@ -18,5 +23,5 @@ short=${BASH_REMATCH[1]} echo $ver echo $short for ext in $EXTS; do - aws s3 cp s3://ftp.r-l.o/pub/tmp/ruby-$ver-draft$ext s3://ftp.r-l.o/pub/ruby/$short/ruby-$ver$ext + aws $AWS_CLI_OPTS s3 cp s3://ftp.r-l.o/pub/tmp/ruby-$ver-draft$ext s3://ftp.r-l.o/pub/ruby/$short/ruby-$ver$ext done From 452eb24b1566f3fd8319e9eeb0ece6758eace08d Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Tue, 3 Sep 2024 16:11:34 +0900 Subject: [PATCH 060/829] Added missing client_payload for ruby-build --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e335c965143494..4880638037b65c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -96,7 +96,7 @@ jobs: -H "Accept: application/vnd.github+json" \ -H "X-GitHub-Api-Version: 2022-11-28" \ https://api.github.com/repos/rbenv/ruby-build/dispatches \ - -d '{"event_type": "update-ruby"}' + -d '{"event_type": "update-ruby", "client_payload": {"ruby_version": "${{ env.RUBY_VERSION }}", "openssl_version": "3.0.14"}}' - name: Update all-ruby definition run: | From 245ed2fc890f7f33526e1c0f42b79c30366493e6 Mon Sep 17 00:00:00 2001 From: zverok Date: Sun, 25 Aug 2024 20:58:47 +0300 Subject: [PATCH 061/829] Range#step: restore legacy behavior for String ranges --- range.c | 60 +++++++++++++++++++++-- spec/ruby/core/range/step_spec.rb | 80 +++++++++++++------------------ test/ruby/test_range.rb | 58 ++++++++++++++++++++-- 3 files changed, 144 insertions(+), 54 deletions(-) diff --git a/range.c b/range.c index 536568ba765f49..a52418d2cbe96b 100644 --- a/range.c +++ b/range.c @@ -309,6 +309,34 @@ range_each_func(VALUE range, int (*func)(VALUE, VALUE), VALUE arg) } } +// NB: Two functions below (step_i_iter and step_i) are used only to maintain the +// backward-compatible behavior for string ranges with integer steps. If that branch +// will be removed from range_step, these two can go, too. +static bool +step_i_iter(VALUE arg) +{ + VALUE *iter = (VALUE *)arg; + + if (FIXNUM_P(iter[0])) { + iter[0] -= INT2FIX(1) & ~FIXNUM_FLAG; + } + else { + iter[0] = rb_funcall(iter[0], '-', 1, INT2FIX(1)); + } + if (iter[0] != INT2FIX(0)) return false; + iter[0] = iter[1]; + return true; +} + +static int +step_i(VALUE i, VALUE arg) +{ + if (step_i_iter(arg)) { + rb_yield(i); + } + return 0; +} + static int discrete_object_p(VALUE obj) { @@ -430,9 +458,18 @@ range_step_size(VALUE range, VALUE args, VALUE eobj) * * For non-Numeric ranges, step absence is an error: * - * ('a'..'z').step { p _1 } + * (Time.utc(2022, 3, 1)..Time.utc(2022, 2, 24)).step { p _1 } * # raises: step is required for non-numeric ranges (ArgumentError) * + * For backward compatibility reasons, String ranges support the iteration both with + * string step and with integer step. In the latter case, the iteration is performed + * by calculating the next values with String#succ: + * + * ('a'..'e').step(2) { p _1 } + * # Prints: a, c, e + * ('a'..'e').step { p _1 } + * # Default step 1; prints: a, b, c, d, e + * */ static VALUE range_step(int argc, VALUE *argv, VALUE range) @@ -445,11 +482,15 @@ range_step(int argc, VALUE *argv, VALUE range) const VALUE b_num_p = rb_obj_is_kind_of(b, rb_cNumeric); const VALUE e_num_p = rb_obj_is_kind_of(e, rb_cNumeric); + // For backward compatibility reasons (conforming to behavior before 3.4), String supports + // both old behavior ('a'..).step(1) and new behavior ('a'..).step('a') + // Hence the additional conversion/addional checks. + const VALUE sb = rb_check_string_type(b); if (rb_check_arity(argc, 0, 1)) step = argv[0]; else { - if (b_num_p || (NIL_P(b) && e_num_p)) + if (b_num_p || !NIL_P(sb) || (NIL_P(b) && e_num_p)) step = INT2FIX(1); else rb_raise(rb_eArgError, "step is required for non-numeric ranges"); @@ -520,8 +561,19 @@ range_step(int argc, VALUE *argv, VALUE range) } else if (b_num_p && step_num_p && ruby_float_step(b, e, step, EXCL(range), TRUE)) { /* done */ - } - else { + } else if (!NIL_P(sb) && FIXNUM_P(step)) { + // backwards compatibility behavior for String only, when no step/Integer step is passed + // See discussion in https://bugs.ruby-lang.org/issues/18368 + + VALUE iter[2] = {INT2FIX(1), step}; + + if (NIL_P(e)) { + rb_str_upto_endless_each(sb, step_i, (VALUE)iter); + } + else { + rb_str_upto_each(sb, e, EXCL(range), step_i, (VALUE)iter); + } + } else { v = b; if (!NIL_P(e)) { if (b_num_p && step_num_p && r_less(step, INT2FIX(0)) < 0) { diff --git a/spec/ruby/core/range/step_spec.rb b/spec/ruby/core/range/step_spec.rb index f858a6a6bb891f..31cfd400ccc965 100644 --- a/spec/ruby/core/range/step_spec.rb +++ b/spec/ruby/core/range/step_spec.rb @@ -175,21 +175,21 @@ end describe "and String values" do - ruby_version_is ""..."3.4" do - it "yields String values incremented by #succ and less than or equal to end when not passed a step" do - ("A".."E").step { |x| ScratchPad << x } - ScratchPad.recorded.should == ["A", "B", "C", "D", "E"] - end + it "yields String values incremented by #succ and less than or equal to end when not passed a step" do + ("A".."E").step { |x| ScratchPad << x } + ScratchPad.recorded.should == ["A", "B", "C", "D", "E"] + end - it "yields String values incremented by #succ called Integer step times" do - ("A".."G").step(2) { |x| ScratchPad << x } - ScratchPad.recorded.should == ["A", "C", "E", "G"] - end + it "yields String values incremented by #succ called Integer step times" do + ("A".."G").step(2) { |x| ScratchPad << x } + ScratchPad.recorded.should == ["A", "C", "E", "G"] + end - it "raises a TypeError when passed a Float step" do - -> { ("A".."G").step(2.0) { } }.should raise_error(TypeError) - end + it "raises a TypeError when passed a Float step" do + -> { ("A".."G").step(2.0) { } }.should raise_error(TypeError) + end + ruby_version_is ""..."3.4" do it "calls #succ on begin and each element returned by #succ" do obj = mock("Range#step String start") obj.should_receive(:<=>).exactly(3).times.and_return(-1, -1, -1, 0) @@ -201,17 +201,13 @@ end ruby_version_is "3.4" do - it "raises an ArgumentError when not passed a step" do - -> { ("A".."E").step { } }.should raise_error(ArgumentError) - end - it "yields String values adjusted by step and less than or equal to end" do ("A".."AAA").step("A") { |x| ScratchPad << x } ScratchPad.recorded.should == ["A", "AA", "AAA"] end it "raises a TypeError when passed an incompatible type step" do - -> { ("A".."G").step(2) { } }.should raise_error(TypeError) + -> { ("A".."G").step([]) { } }.should raise_error(TypeError) end it "calls #+ on begin and each element returned by #+" do @@ -397,17 +393,13 @@ end ruby_version_is "3.4" do - it "raises an ArgumentError when not passed a step" do - -> { ("A".."E").step { } }.should raise_error(ArgumentError) - end - it "yields String values adjusted by step and less than or equal to end" do ("A"..."AAA").step("A") { |x| ScratchPad << x } ScratchPad.recorded.should == ["A", "AA"] end it "raises a TypeError when passed an incompatible type step" do - -> { ("A".."G").step(2) { } }.should raise_error(TypeError) + -> { ("A".."G").step([]) { } }.should raise_error(TypeError) end end end @@ -482,36 +474,30 @@ end describe "and String values" do - ruby_version_is ""..."3.4" do - it "yields String values incremented by #succ and less than or equal to end when not passed a step" do - eval("('A'..)").step { |x| break if x > "D"; ScratchPad << x } - ScratchPad.recorded.should == ["A", "B", "C", "D"] + it "yields String values incremented by #succ and less than or equal to end when not passed a step" do + eval("('A'..)").step { |x| break if x > "D"; ScratchPad << x } + ScratchPad.recorded.should == ["A", "B", "C", "D"] - ScratchPad.record [] - eval("('A'...)").step { |x| break if x > "D"; ScratchPad << x } - ScratchPad.recorded.should == ["A", "B", "C", "D"] - end + ScratchPad.record [] + eval("('A'...)").step { |x| break if x > "D"; ScratchPad << x } + ScratchPad.recorded.should == ["A", "B", "C", "D"] + end - it "yields String values incremented by #succ called Integer step times" do - eval("('A'..)").step(2) { |x| break if x > "F"; ScratchPad << x } - ScratchPad.recorded.should == ["A", "C", "E"] + it "yields String values incremented by #succ called Integer step times" do + eval("('A'..)").step(2) { |x| break if x > "F"; ScratchPad << x } + ScratchPad.recorded.should == ["A", "C", "E"] - ScratchPad.record [] - eval("('A'...)").step(2) { |x| break if x > "F"; ScratchPad << x } - ScratchPad.recorded.should == ["A", "C", "E"] - end + ScratchPad.record [] + eval("('A'...)").step(2) { |x| break if x > "F"; ScratchPad << x } + ScratchPad.recorded.should == ["A", "C", "E"] + end - it "raises a TypeError when passed a Float step" do - -> { eval("('A'..)").step(2.0) { } }.should raise_error(TypeError) - -> { eval("('A'...)").step(2.0) { } }.should raise_error(TypeError) - end + it "raises a TypeError when passed a Float step" do + -> { eval("('A'..)").step(2.0) { } }.should raise_error(TypeError) + -> { eval("('A'...)").step(2.0) { } }.should raise_error(TypeError) end ruby_version_is "3.4" do - it "raises an ArgumentError when not passed a step" do - -> { ("A"..).step { } }.should raise_error(ArgumentError) - end - it "yields String values adjusted by step" do eval("('A'..)").step("A") { |x| break if x > "AAA"; ScratchPad << x } ScratchPad.recorded.should == ["A", "AA", "AAA"] @@ -522,8 +508,8 @@ end it "raises a TypeError when passed an incompatible type step" do - -> { eval("('A'..)").step(2) { } }.should raise_error(TypeError) - -> { eval("('A'...)").step(2) { } }.should raise_error(TypeError) + -> { eval("('A'..)").step([]) { } }.should raise_error(TypeError) + -> { eval("('A'...)").step([]) { } }.should raise_error(TypeError) end end end diff --git a/test/ruby/test_range.rb b/test/ruby/test_range.rb index b7541424d113d5..6c591b31550bdd 100644 --- a/test/ruby/test_range.rb +++ b/test/ruby/test_range.rb @@ -427,11 +427,11 @@ def test_step_non_numeric_range assert_raise(ArgumentError) { (...'aaa').step('a') } # step is not provided - assert_raise(ArgumentError) { ('a'...'aaaa').step } + assert_raise(ArgumentError) { (Time.new(2022)...Time.new(2023)).step } # step is incompatible - assert_raise(TypeError) { ('a'...'aaaa').step(1) {} } - assert_raise(TypeError) { ('a'...'aaaa').step(1).to_a } + assert_raise(TypeError) { (Time.new(2022)...Time.new(2023)).step('a') {} } + assert_raise(TypeError) { (Time.new(2022)...Time.new(2023)).step('a').to_a } # step is compatible, but shouldn't convert into numeric domain: a = [] @@ -467,6 +467,58 @@ def test_step_non_numeric_range assert_equal([], a) end + def test_step_string_legacy + # finite + a = [] + ('a'..'g').step(2) { a << _1 } + assert_equal(%w[a c e g], a) + + assert_kind_of(Enumerator, ('a'..'g').step(2)) + assert_equal(%w[a c e g], ('a'..'g').step(2).to_a) + + a = [] + ('a'...'g').step(2) { a << _1 } + assert_equal(%w[a c e], a) + + assert_kind_of(Enumerator, ('a'...'g').step(2)) + assert_equal(%w[a c e], ('a'...'g').step(2).to_a) + + # endless + a = [] + ('a'...).step(2) { a << _1; break if a.size == 3 } + assert_equal(%w[a c e], a) + + assert_kind_of(Enumerator, ('a'...).step(2)) + assert_equal(%w[a c e], ('a'...).step(2).take(3)) + + # beginless + assert_raise(ArgumentError) { (...'g').step(2) {} } + assert_raise(ArgumentError) { (...'g').step(2) } + + # step is not provided + a = [] + ('a'..'d').step { a << _1 } + assert_equal(%w[a b c d], a) + + assert_kind_of(Enumerator, ('a'..'d').step) + assert_equal(%w[a b c d], ('a'..'d').step.to_a) + + a = [] + ('a'...'d').step { a << _1 } + assert_equal(%w[a b c], a) + + assert_kind_of(Enumerator, ('a'...'d').step) + assert_equal(%w[a b c], ('a'...'d').step.to_a) + + # endless + a = [] + ('a'...).step { a << _1; break if a.size == 3 } + assert_equal(%w[a b c], a) + + assert_kind_of(Enumerator, ('a'...).step) + assert_equal(%w[a b c], ('a'...).step.take(3)) + end + def test_step_bug15537 assert_equal([10.0, 9.0, 8.0, 7.0], (10 ..).step(-1.0).take(4)) assert_equal([10.0, 9.0, 8.0, 7.0], (10.0 ..).step(-1).take(4)) From b7fa2dd0d0b7328f8f713b7cf0332d1e34c20fe4 Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Tue, 3 Sep 2024 09:38:18 +0200 Subject: [PATCH 062/829] rb_enc_str_asciionly_p: avoid always fetching the encoding Profiling of `JSON.dump` shows a significant amount of time spent in `rb_enc_str_asciionly_p`, in large part because it fetches the encoding. It can be made twice as fast in this scenario by first checking the coderange and only falling back to fetching the encoding if the coderange is unknown. Additionally we can skip fetching the encoding for the common popular encodings. --- string.c | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/string.c b/string.c index 025382c0f4595d..0dd02f82537992 100644 --- a/string.c +++ b/string.c @@ -137,10 +137,10 @@ VALUE rb_cSymbol; } while (0) static inline bool -str_enc_fastpath(VALUE str) +str_encindex_fastpath(int encindex) { // The overwhelming majority of strings are in one of these 3 encodings. - switch (ENCODING_GET_INLINED(str)) { + switch (encindex) { case ENCINDEX_ASCII_8BIT: case ENCINDEX_UTF_8: case ENCINDEX_US_ASCII: @@ -150,6 +150,12 @@ str_enc_fastpath(VALUE str) } } +static inline bool +str_enc_fastpath(VALUE str) +{ + return str_encindex_fastpath(ENCODING_GET_INLINED(str)); +} + #define TERM_LEN(str) (str_enc_fastpath(str) ? 1 : rb_enc_mbminlen(rb_enc_from_index(ENCODING_GET(str)))) #define TERM_FILL(ptr, termlen) do {\ char *const term_fill_ptr = (ptr);\ @@ -862,16 +868,24 @@ rb_enc_str_coderange(VALUE str) return cr; } +static inline bool +rb_enc_str_asciicompat(VALUE str) +{ + int encindex = ENCODING_GET_INLINED(str); + return str_encindex_fastpath(encindex) || rb_enc_asciicompat(rb_enc_get_from_index(encindex)); +} + int rb_enc_str_asciionly_p(VALUE str) { - rb_encoding *enc = STR_ENC_GET(str); - - if (!rb_enc_asciicompat(enc)) - return FALSE; - else if (is_ascii_string(str)) - return TRUE; - return FALSE; + switch(ENC_CODERANGE(str)) { + case ENC_CODERANGE_UNKNOWN: + return rb_enc_str_asciicompat(str) && is_ascii_string(str); + case ENC_CODERANGE_7BIT: + return true; + default: + return false; + } } static inline void From af143d8a749ae0ba0f394521dd46bea824a354fa Mon Sep 17 00:00:00 2001 From: ydah Date: Tue, 3 Sep 2024 17:53:55 +0900 Subject: [PATCH 063/829] Implement UNDEF NODE keyword locations --- ast.c | 4 ++++ node_dump.c | 1 + parse.y | 2 ++ rubyparser.h | 1 + test/ruby/test_ast.rb | 8 ++++++++ 5 files changed, 16 insertions(+) diff --git a/ast.c b/ast.c index 338ab00819a37b..fd6a6dea890d61 100644 --- a/ast.c +++ b/ast.c @@ -775,6 +775,10 @@ node_locations(VALUE ast_value, const NODE *node) { enum node_type type = nd_type(node); switch (type) { + case NODE_UNDEF: + return rb_ary_new_from_args(2, + location_new(nd_code_loc(node)), + location_new(&RNODE_UNDEF(node)->keyword_loc)); case NODE_UNLESS: return rb_ary_new_from_args(4, location_new(nd_code_loc(node)), diff --git a/node_dump.c b/node_dump.c index f23aeca6f1ba41..2b9322bdb7c0a0 100644 --- a/node_dump.c +++ b/node_dump.c @@ -940,6 +940,7 @@ dump_node(VALUE buf, VALUE indent, int comment, const NODE * node) ANN("example: undef foo"); LAST_NODE; F_ARRAY(nd_undefs, RNODE_UNDEF, "nd_undefs"); + F_LOC(keyword_loc, RNODE_UNDEF); return; case NODE_CLASS: diff --git a/parse.y b/parse.y index 5139ee99e6f3e3..f8bca1ee5216a0 100644 --- a/parse.y +++ b/parse.y @@ -3156,6 +3156,7 @@ stmt : keyword_alias fitem {SET_LEX_STATE(EXPR_FNAME|EXPR_FITEM);} fitem | keyword_undef undef_list { nd_set_first_loc($2, @1.beg_pos); + RNODE_UNDEF($2)->keyword_loc = @1; $$ = $2; /*% ripper: undef!($:2) %*/ } @@ -12320,6 +12321,7 @@ rb_node_undef_new(struct parser_params *p, NODE *nd_undef, const YYLTYPE *loc) { rb_node_undef_t *n = NODE_NEWNODE(NODE_UNDEF, rb_node_undef_t, loc); n->nd_undefs = rb_parser_ary_new_capa_for_node(p, 1); + n->keyword_loc = NULL_LOC; rb_parser_ary_push_node(p, n->nd_undefs, nd_undef); return n; diff --git a/rubyparser.h b/rubyparser.h index 0af019850050c1..e46e99616d4d52 100644 --- a/rubyparser.h +++ b/rubyparser.h @@ -833,6 +833,7 @@ typedef struct RNode_UNDEF { NODE node; rb_parser_ary_t *nd_undefs; + rb_code_location_t keyword_loc; } rb_node_undef_t; typedef struct RNode_CLASS { diff --git a/test/ruby/test_ast.rb b/test/ruby/test_ast.rb index 936dd6d3e661aa..d21c57d88f3656 100644 --- a/test/ruby/test_ast.rb +++ b/test/ruby/test_ast.rb @@ -1338,6 +1338,14 @@ def test_unless_locations assert_locations(node.children[-1].locations, [[1, 0, 1, 10], [1, 2, 1, 8], nil, nil]) end + def test_undef_locations + node = RubyVM::AbstractSyntaxTree.parse("undef foo") + assert_locations(node.children[-1].locations, [[1, 0, 1, 9], [1, 0, 1, 5]]) + + node = RubyVM::AbstractSyntaxTree.parse("undef foo, bar") + assert_locations(node.children[-1].locations, [[1, 0, 1, 14], [1, 0, 1, 5]]) + end + private def assert_locations(locations, expected) ary = locations.map {|loc| loc && [loc.first_lineno, loc.first_column, loc.last_lineno, loc.last_column] } From a2243ee48bf6d68b0e5c713b5e7dd6bf3b57f62c Mon Sep 17 00:00:00 2001 From: ydah Date: Tue, 3 Sep 2024 16:12:30 +0900 Subject: [PATCH 064/829] Implement ALIAS NODE keyword locations --- ast.c | 4 ++++ node_dump.c | 3 ++- parse.y | 9 +++++---- rubyparser.h | 1 + test/ruby/test_ast.rb | 5 +++++ 5 files changed, 17 insertions(+), 5 deletions(-) diff --git a/ast.c b/ast.c index fd6a6dea890d61..d6d3e11d60dd59 100644 --- a/ast.c +++ b/ast.c @@ -775,6 +775,10 @@ node_locations(VALUE ast_value, const NODE *node) { enum node_type type = nd_type(node); switch (type) { + case NODE_ALIAS: + return rb_ary_new_from_args(2, + location_new(nd_code_loc(node)), + location_new(&RNODE_ALIAS(node)->keyword_loc)); case NODE_UNDEF: return rb_ary_new_from_args(2, location_new(nd_code_loc(node)), diff --git a/node_dump.c b/node_dump.c index 2b9322bdb7c0a0..6ab91bd853375a 100644 --- a/node_dump.c +++ b/node_dump.c @@ -922,8 +922,9 @@ dump_node(VALUE buf, VALUE indent, int comment, const NODE * node) ANN("format: alias [nd_1st] [nd_2nd]"); ANN("example: alias bar foo"); F_NODE(nd_1st, RNODE_ALIAS, "new name"); - LAST_NODE; F_NODE(nd_2nd, RNODE_ALIAS, "old name"); + LAST_NODE; + F_LOC(keyword_loc, RNODE_ALIAS); return; case NODE_VALIAS: diff --git a/parse.y b/parse.y index f8bca1ee5216a0..1dffac64f4f5e4 100644 --- a/parse.y +++ b/parse.y @@ -1138,7 +1138,7 @@ static rb_node_splat_t *rb_node_splat_new(struct parser_params *p, NODE *nd_head static rb_node_block_pass_t *rb_node_block_pass_new(struct parser_params *p, NODE *nd_body, const YYLTYPE *loc); static rb_node_defn_t *rb_node_defn_new(struct parser_params *p, ID nd_mid, NODE *nd_defn, const YYLTYPE *loc); static rb_node_defs_t *rb_node_defs_new(struct parser_params *p, NODE *nd_recv, ID nd_mid, NODE *nd_defn, const YYLTYPE *loc); -static rb_node_alias_t *rb_node_alias_new(struct parser_params *p, NODE *nd_1st, NODE *nd_2nd, const YYLTYPE *loc); +static rb_node_alias_t *rb_node_alias_new(struct parser_params *p, NODE *nd_1st, NODE *nd_2nd, const YYLTYPE *loc, const YYLTYPE *keyword_loc); static rb_node_valias_t *rb_node_valias_new(struct parser_params *p, ID nd_alias, ID nd_orig, const YYLTYPE *loc); static rb_node_undef_t *rb_node_undef_new(struct parser_params *p, NODE *nd_undef, const YYLTYPE *loc); static rb_node_class_t *rb_node_class_new(struct parser_params *p, NODE *nd_cpath, NODE *nd_body, NODE *nd_super, const YYLTYPE *loc); @@ -1246,7 +1246,7 @@ static rb_node_error_t *rb_node_error_new(struct parser_params *p, const YYLTYPE #define NEW_BLOCK_PASS(b,loc) rb_node_block_pass_new(p,b,loc) #define NEW_DEFN(i,s,loc) (NODE *)rb_node_defn_new(p,i,s,loc) #define NEW_DEFS(r,i,s,loc) (NODE *)rb_node_defs_new(p,r,i,s,loc) -#define NEW_ALIAS(n,o,loc) (NODE *)rb_node_alias_new(p,n,o,loc) +#define NEW_ALIAS(n,o,loc,k_loc) (NODE *)rb_node_alias_new(p,n,o,loc,k_loc) #define NEW_VALIAS(n,o,loc) (NODE *)rb_node_valias_new(p,n,o,loc) #define NEW_UNDEF(i,loc) (NODE *)rb_node_undef_new(p,i,loc) #define NEW_CLASS(n,b,s,loc) (NODE *)rb_node_class_new(p,n,b,s,loc) @@ -3128,7 +3128,7 @@ k_END : keyword_END lex_ctxt stmt : keyword_alias fitem {SET_LEX_STATE(EXPR_FNAME|EXPR_FITEM);} fitem { - $$ = NEW_ALIAS($2, $4, &@$); + $$ = NEW_ALIAS($2, $4, &@$, &@1); /*% ripper: alias!($:2, $:4) %*/ } | keyword_alias tGVAR tGVAR @@ -12297,11 +12297,12 @@ rb_node_block_pass_new(struct parser_params *p, NODE *nd_body, const YYLTYPE *lo } static rb_node_alias_t * -rb_node_alias_new(struct parser_params *p, NODE *nd_1st, NODE *nd_2nd, const YYLTYPE *loc) +rb_node_alias_new(struct parser_params *p, NODE *nd_1st, NODE *nd_2nd, const YYLTYPE *loc, const YYLTYPE *keyword_loc) { rb_node_alias_t *n = NODE_NEWNODE(NODE_ALIAS, rb_node_alias_t, loc); n->nd_1st = nd_1st; n->nd_2nd = nd_2nd; + n->keyword_loc = *keyword_loc; return n; } diff --git a/rubyparser.h b/rubyparser.h index e46e99616d4d52..a690394928c059 100644 --- a/rubyparser.h +++ b/rubyparser.h @@ -820,6 +820,7 @@ typedef struct RNode_ALIAS { struct RNode *nd_1st; struct RNode *nd_2nd; + rb_code_location_t keyword_loc; } rb_node_alias_t; typedef struct RNode_VALIAS { diff --git a/test/ruby/test_ast.rb b/test/ruby/test_ast.rb index d21c57d88f3656..cded28cf1f615c 100644 --- a/test/ruby/test_ast.rb +++ b/test/ruby/test_ast.rb @@ -1330,6 +1330,11 @@ def test_lineno_and_column assert_locations(node.locations, [[1, 0, 1, 5]]) end + def test_alias_locations + node = RubyVM::AbstractSyntaxTree.parse("alias foo bar") + assert_locations(node.children[-1].locations, [[1, 0, 1, 13], [1, 0, 1, 5]]) + end + def test_unless_locations node = RubyVM::AbstractSyntaxTree.parse("unless cond then 1 else 2 end") assert_locations(node.children[-1].locations, [[1, 0, 1, 29], [1, 0, 1, 6], [1, 12, 1, 16], [1, 26, 1, 29]]) From 3c63a01295b4219743b3d3e883fd4a4a616960a6 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Fri, 30 Aug 2024 13:05:24 -0400 Subject: [PATCH 065/829] Move responsibility of heap walking into Ruby This commit removes the need for the GC implementation to implement heap walking and instead Ruby will implement it. --- gc.c | 272 ++++++++++++++++++++++++-------------------------- gc/default.c | 41 ++++---- gc/gc.h | 1 - ractor_core.h | 6 -- vm.c | 4 +- vm_core.h | 8 +- 6 files changed, 160 insertions(+), 172 deletions(-) diff --git a/gc.c b/gc.c index c0ade04377d643..8665f719ab5e35 100644 --- a/gc.c +++ b/gc.c @@ -187,7 +187,7 @@ rb_gc_event_hook(VALUE obj, rb_event_flag_t event) void * rb_gc_get_objspace(void) { - return GET_VM()->objspace; + return GET_VM()->gc.objspace; } void @@ -337,7 +337,7 @@ void rb_vm_update_references(void *ptr); #define unless_objspace(objspace) \ void *objspace; \ rb_vm_t *unless_objspace_vm = GET_VM(); \ - if (unless_objspace_vm) objspace = unless_objspace_vm->objspace; \ + if (unless_objspace_vm) objspace = unless_objspace_vm->gc.objspace; \ else /* return; or objspace will be warned uninitialized */ #define RMOVED(obj) ((struct RMoved *)(obj)) @@ -865,7 +865,7 @@ rb_objspace_alloc(void) #endif void *objspace = rb_gc_impl_objspace_alloc(); - ruby_current_vm_ptr->objspace = objspace; + ruby_current_vm_ptr->gc.objspace = objspace; rb_gc_impl_objspace_init(objspace); @@ -2036,54 +2036,62 @@ ruby_stack_check(void) /* ==================== Marking ==================== */ +#define RB_GC_MARK_OR_TRAVERSE(func, obj_or_ptr, obj, check_obj) do { \ + if (!RB_SPECIAL_CONST_P(obj)) { \ + rb_vm_t *vm = GET_VM(); \ + if (LIKELY(vm->gc.mark_func_data == NULL)) { \ + (func)(vm->gc.objspace, (obj_or_ptr)); \ + } \ + else if (check_obj ? rb_gc_impl_pointer_to_heap_p(vm->gc.objspace, (const void *)obj) : true) { \ + GC_ASSERT(!rb_gc_impl_during_gc_p(vm->gc.objspace)); \ + struct gc_mark_func_data_struct *mark_func_data = vm->gc.mark_func_data; \ + vm->gc.mark_func_data = NULL; \ + mark_func_data->mark_func((obj), mark_func_data->data); \ + vm->gc.mark_func_data = mark_func_data; \ + } \ + } \ +} while (0) + static inline void -gc_mark_internal(void *objspace, VALUE obj) +gc_mark_internal(VALUE obj) { - if (RB_SPECIAL_CONST_P(obj)) return; - - rb_gc_impl_mark(objspace, obj); + RB_GC_MARK_OR_TRAVERSE(rb_gc_impl_mark, obj, obj, false); } void rb_gc_mark_movable(VALUE obj) { - gc_mark_internal(rb_gc_get_objspace(), obj); + gc_mark_internal(obj); } void rb_gc_mark_and_move(VALUE *ptr) { - if (SPECIAL_CONST_P(*ptr)) return; - - rb_gc_impl_mark_and_move(rb_gc_get_objspace(), ptr); + RB_GC_MARK_OR_TRAVERSE(rb_gc_impl_mark_and_move, ptr, *ptr, false); } static inline void -gc_mark_and_pin_internal(void *objspace, VALUE obj) +gc_mark_and_pin_internal(VALUE obj) { - if (RB_SPECIAL_CONST_P(obj)) return; - - rb_gc_impl_mark_and_pin(objspace, obj); + RB_GC_MARK_OR_TRAVERSE(rb_gc_impl_mark_and_pin, obj, obj, false); } void rb_gc_mark(VALUE obj) { - gc_mark_and_pin_internal(rb_gc_get_objspace(), obj); + gc_mark_and_pin_internal(obj); } static inline void -gc_mark_maybe_internal(void *objspace, VALUE obj) +gc_mark_maybe_internal(VALUE obj) { - if (RB_SPECIAL_CONST_P(obj)) return; - - rb_gc_impl_mark_maybe(objspace, obj); + RB_GC_MARK_OR_TRAVERSE(rb_gc_impl_mark_maybe, obj, obj, true); } void rb_gc_mark_maybe(VALUE obj) { - gc_mark_maybe_internal(rb_gc_get_objspace(), obj); + gc_mark_maybe_internal(obj); } void @@ -2098,36 +2106,42 @@ rb_gc_remove_weak(VALUE parent_obj, VALUE *ptr) rb_gc_impl_remove_weak(rb_gc_get_objspace(), parent_obj, ptr); } -ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS(static void each_location(register const VALUE *x, register long n, void (*cb)(void *data, VALUE), void *data)); +ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS(static void each_location(register const VALUE *x, register long n, void (*cb)(VALUE, void *), void *data)); static void -each_location(register const VALUE *x, register long n, void (*cb)(void *data, VALUE obj), void *data) +each_location(register const VALUE *x, register long n, void (*cb)(VALUE, void *), void *data) { VALUE v; while (n--) { v = *x; - cb(data, v); + cb(v, data); x++; } } static void -each_location_ptr(const VALUE *start, const VALUE *end, void (*cb)(void *, VALUE), void *data) +each_location_ptr(const VALUE *start, const VALUE *end, void (*cb)(VALUE, void *), void *data) { if (end <= start) return; each_location(start, end - start, cb, data); } +static void +gc_mark_maybe_each_location(VALUE obj, void *data) +{ + gc_mark_maybe_internal(obj); +} + void rb_gc_mark_locations(const VALUE *start, const VALUE *end) { - each_location_ptr(start, end, rb_gc_impl_mark_maybe, rb_gc_get_objspace()); + each_location_ptr(start, end, gc_mark_maybe_each_location, NULL); } void rb_gc_mark_values(long n, const VALUE *values) { for (long i = 0; i < n; i++) { - gc_mark_internal(rb_gc_get_objspace(), values[i]); + gc_mark_internal(values[i]); } } @@ -2135,16 +2149,14 @@ void rb_gc_mark_vm_stack_values(long n, const VALUE *values) { for (long i = 0; i < n; i++) { - gc_mark_and_pin_internal(rb_gc_get_objspace(), values[i]); + gc_mark_and_pin_internal(values[i]); } } static int mark_key(st_data_t key, st_data_t value, st_data_t data) { - void *objspace = (void *)data; - - gc_mark_and_pin_internal(objspace, (VALUE)key); + gc_mark_and_pin_internal((VALUE)key); return ST_CONTINUE; } @@ -2160,10 +2172,8 @@ rb_mark_set(st_table *tbl) static int mark_keyvalue(st_data_t key, st_data_t value, st_data_t data) { - void *objspace = (void *)data; - - gc_mark_internal(objspace, (VALUE)key); - gc_mark_internal(objspace, (VALUE)value); + gc_mark_internal((VALUE)key); + gc_mark_internal((VALUE)value); return ST_CONTINUE; } @@ -2171,10 +2181,8 @@ mark_keyvalue(st_data_t key, st_data_t value, st_data_t data) static int pin_key_pin_value(st_data_t key, st_data_t value, st_data_t data) { - void *objspace = (void *)data; - - gc_mark_and_pin_internal(objspace, (VALUE)key); - gc_mark_and_pin_internal(objspace, (VALUE)value); + gc_mark_and_pin_internal((VALUE)key); + gc_mark_and_pin_internal((VALUE)value); return ST_CONTINUE; } @@ -2182,25 +2190,23 @@ pin_key_pin_value(st_data_t key, st_data_t value, st_data_t data) static int pin_key_mark_value(st_data_t key, st_data_t value, st_data_t data) { - void *objspace = (void *)data; - - gc_mark_and_pin_internal(objspace, (VALUE)key); - gc_mark_internal(objspace, (VALUE)value); + gc_mark_and_pin_internal((VALUE)key); + gc_mark_internal((VALUE)value); return ST_CONTINUE; } static void -mark_hash(void *objspace, VALUE hash) +mark_hash(VALUE hash) { if (rb_hash_compare_by_id_p(hash)) { - rb_hash_stlike_foreach(hash, pin_key_mark_value, (st_data_t)objspace); + rb_hash_stlike_foreach(hash, pin_key_mark_value, 0); } else { - rb_hash_stlike_foreach(hash, mark_keyvalue, (st_data_t)objspace); + rb_hash_stlike_foreach(hash, mark_keyvalue, 0); } - gc_mark_internal(objspace, RHASH(hash)->ifnone); + gc_mark_internal(RHASH(hash)->ifnone); } void @@ -2208,13 +2214,13 @@ rb_mark_hash(st_table *tbl) { if (!tbl) return; - st_foreach(tbl, pin_key_pin_value, (st_data_t)rb_gc_get_objspace()); + st_foreach(tbl, pin_key_pin_value, 0); } static enum rb_id_table_iterator_result mark_method_entry_i(VALUE me, void *objspace) { - gc_mark_internal(objspace, me); + gc_mark_internal(me); return ID_TABLE_CONTINUE; } @@ -2237,22 +2243,13 @@ mark_m_tbl(void *objspace, struct rb_id_table *tbl) ((start) = STACK_END, (end) = STACK_START) : ((start) = STACK_START, (end) = STACK_END+(appendix))) #endif -struct mark_machine_stack_location_maybe_data { - void *objspace; -#ifdef RUBY_ASAN_ENABLED - const rb_execution_context_t *ec; -#endif -}; - static void -gc_mark_machine_stack_location_maybe(void *data, VALUE obj) +gc_mark_machine_stack_location_maybe(VALUE obj, void *data) { - void *objspace = ((struct mark_machine_stack_location_maybe_data *)data)->objspace; - - gc_mark_maybe_internal(objspace, obj); + gc_mark_maybe_internal(obj); #ifdef RUBY_ASAN_ENABLED - const rb_execution_context_t *ec = ((struct mark_machine_stack_location_maybe_data *)data)->ec; + const rb_execution_context_t *ec = (const rb_execution_context_t *)data; void *fake_frame_start; void *fake_frame_end; bool is_fake_frame = asan_get_fake_stack_extents( @@ -2261,7 +2258,7 @@ gc_mark_machine_stack_location_maybe(void *data, VALUE obj) &fake_frame_start, &fake_frame_end ); if (is_fake_frame) { - each_location_ptr(fake_frame_start, fake_frame_end, rb_gc_impl_mark_maybe, objspace); + each_location_ptr(fake_frame_start, fake_frame_end, gc_mark_maybe_each_location, NULL); } #endif } @@ -2281,26 +2278,26 @@ rb_mark_locations(void *begin, void *end) # if defined(__EMSCRIPTEN__) static void -mark_current_machine_context(void *objspace, rb_execution_context_t *ec) +mark_current_machine_context(rb_execution_context_t *ec) { emscripten_scan_stack(rb_mark_locations); - each_location_ptr(rb_stack_range_tmp[0], rb_stack_range_tmp[1], rb_gc_impl_mark_maybe, objspace); + each_location_ptr(rb_stack_range_tmp[0], rb_stack_range_tmp[1], gc_mark_maybe_each_location, NULL); emscripten_scan_registers(rb_mark_locations); - each_location_ptr(rb_stack_range_tmp[0], rb_stack_range_tmp[1], rb_gc_impl_mark_maybe, objspace); + each_location_ptr(rb_stack_range_tmp[0], rb_stack_range_tmp[1], gc_mark_maybe_each_location, NULL); } # else // use Asyncify version static void -mark_current_machine_context(void *objspace, rb_execution_context_t *ec) +mark_current_machine_context(rb_execution_context_t *ec) { VALUE *stack_start, *stack_end; SET_STACK_END; GET_STACK_BOUNDS(stack_start, stack_end, 1); - each_location_ptr(stack_start, stack_end, rb_gc_impl_mark_maybe, objspace); + each_location_ptr(stack_start, stack_end, gc_mark_maybe_each_location, NULL); rb_wasm_scan_locals(rb_mark_locations); - each_location_ptr(rb_stack_range_tmp[0], rb_stack_range_tmp[1], rb_gc_impl_mark_maybe, objspace); + each_location_ptr(rb_stack_range_tmp[0], rb_stack_range_tmp[1], gc_mark_maybe_each_location, NULL); } # endif @@ -2308,7 +2305,7 @@ mark_current_machine_context(void *objspace, rb_execution_context_t *ec) #else // !defined(__wasm__) static void -mark_current_machine_context(void *objspace, rb_execution_context_t *ec) +mark_current_machine_context(rb_execution_context_t *ec) { union { rb_jmp_buf j; @@ -2327,15 +2324,15 @@ mark_current_machine_context(void *objspace, rb_execution_context_t *ec) SET_STACK_END; GET_STACK_BOUNDS(stack_start, stack_end, 1); - struct mark_machine_stack_location_maybe_data data = { - .objspace = objspace, + void *data = #ifdef RUBY_ASAN_ENABLED - .ec = ec + ec; +#else + NULL; #endif - }; - each_location(save_regs_gc_mark.v, numberof(save_regs_gc_mark.v), gc_mark_machine_stack_location_maybe, &data); - each_location_ptr(stack_start, stack_end, gc_mark_machine_stack_location_maybe, &data); + each_location(save_regs_gc_mark.v, numberof(save_regs_gc_mark.v), gc_mark_machine_stack_location_maybe, data); + each_location_ptr(stack_start, stack_end, gc_mark_machine_stack_location_maybe, data); } #endif @@ -2347,24 +2344,22 @@ rb_gc_mark_machine_context(const rb_execution_context_t *ec) GET_STACK_BOUNDS(stack_start, stack_end, 0); RUBY_DEBUG_LOG("ec->th:%u stack_start:%p stack_end:%p", rb_ec_thread_ptr(ec)->serial, stack_start, stack_end); - struct mark_machine_stack_location_maybe_data data = { - .objspace = rb_gc_get_objspace(), + void *data = #ifdef RUBY_ASAN_ENABLED - .ec = ec + ec; +#else + NULL; #endif - }; - each_location_ptr(stack_start, stack_end, gc_mark_machine_stack_location_maybe, &data); + each_location_ptr(stack_start, stack_end, gc_mark_machine_stack_location_maybe, data); int num_regs = sizeof(ec->machine.regs)/(sizeof(VALUE)); - each_location((VALUE*)&ec->machine.regs, num_regs, gc_mark_machine_stack_location_maybe, &data); + each_location((VALUE*)&ec->machine.regs, num_regs, gc_mark_machine_stack_location_maybe, data); } static int rb_mark_tbl_i(st_data_t key, st_data_t value, st_data_t data) { - void *objspace = (void *)data; - - gc_mark_and_pin_internal(objspace, (VALUE)value); + gc_mark_and_pin_internal((VALUE)value); return ST_CONTINUE; } @@ -2374,21 +2369,21 @@ rb_mark_tbl(st_table *tbl) { if (!tbl || tbl->num_entries == 0) return; - st_foreach(tbl, rb_mark_tbl_i, (st_data_t)rb_gc_get_objspace()); + st_foreach(tbl, rb_mark_tbl_i, 0); } static void -gc_mark_tbl_no_pin(void *objspace, st_table *tbl) +gc_mark_tbl_no_pin(st_table *tbl) { if (!tbl || tbl->num_entries == 0) return; - st_foreach(tbl, gc_mark_tbl_no_pin_i, (st_data_t)objspace); + st_foreach(tbl, gc_mark_tbl_no_pin_i, 0); } void rb_mark_tbl_no_pin(st_table *tbl) { - gc_mark_tbl_no_pin(rb_gc_get_objspace(), tbl); + gc_mark_tbl_no_pin(tbl); } static enum rb_id_table_iterator_result @@ -2399,7 +2394,7 @@ mark_cvc_tbl_i(VALUE cvc_entry, void *objspace) entry = (struct rb_cvar_class_tbl_entry *)cvc_entry; RUBY_ASSERT(entry->cref == 0 || (BUILTIN_TYPE((VALUE)entry->cref) == T_IMEMO && IMEMO_TYPE_P(entry->cref, imemo_cref))); - gc_mark_internal(objspace, (VALUE)entry->cref); + gc_mark_internal((VALUE)entry->cref); return ID_TABLE_CONTINUE; } @@ -2424,8 +2419,8 @@ mark_const_table_i(VALUE value, void *objspace) { const rb_const_entry_t *ce = (const rb_const_entry_t *)value; - gc_mark_internal(objspace, ce->value); - gc_mark_internal(objspace, ce->file); + gc_mark_internal(ce->value); + gc_mark_internal(ce->file); return ID_TABLE_CONTINUE; } @@ -2442,10 +2437,10 @@ rb_gc_mark_roots(void *objspace, const char **categoryp) MARK_CHECKPOINT("vm"); rb_vm_mark(vm); - if (vm->self) gc_mark_internal(objspace, vm->self); + if (vm->self) gc_mark_internal(vm->self); MARK_CHECKPOINT("machine_context"); - mark_current_machine_context(objspace, ec); + mark_current_machine_context(ec); MARK_CHECKPOINT("end_proc"); rb_mark_end_proc(); @@ -2500,28 +2495,28 @@ rb_gc_mark_children(void *objspace, VALUE obj) break; } - gc_mark_internal(objspace, RBASIC(obj)->klass); + gc_mark_internal(RBASIC(obj)->klass); switch (BUILTIN_TYPE(obj)) { case T_CLASS: if (FL_TEST(obj, FL_SINGLETON)) { - gc_mark_internal(objspace, RCLASS_ATTACHED_OBJECT(obj)); + gc_mark_internal(RCLASS_ATTACHED_OBJECT(obj)); } // Continue to the shared T_CLASS/T_MODULE case T_MODULE: if (RCLASS_SUPER(obj)) { - gc_mark_internal(objspace, RCLASS_SUPER(obj)); + gc_mark_internal(RCLASS_SUPER(obj)); } mark_m_tbl(objspace, RCLASS_M_TBL(obj)); mark_cvc_tbl(objspace, obj); rb_cc_table_mark(obj); if (rb_shape_obj_too_complex(obj)) { - gc_mark_tbl_no_pin(objspace, (st_table *)RCLASS_IVPTR(obj)); + gc_mark_tbl_no_pin((st_table *)RCLASS_IVPTR(obj)); } else { for (attr_index_t i = 0; i < RCLASS_IV_COUNT(obj); i++) { - gc_mark_internal(objspace, RCLASS_IVPTR(obj)[i]); + gc_mark_internal(RCLASS_IVPTR(obj)[i]); } } @@ -2529,7 +2524,7 @@ rb_gc_mark_children(void *objspace, VALUE obj) rb_id_table_foreach_values(RCLASS_CONST_TBL(obj), mark_const_table_i, objspace); } - gc_mark_internal(objspace, RCLASS_EXT(obj)->classpath); + gc_mark_internal(RCLASS_EXT(obj)->classpath); break; case T_ICLASS: @@ -2537,11 +2532,11 @@ rb_gc_mark_children(void *objspace, VALUE obj) mark_m_tbl(objspace, RCLASS_M_TBL(obj)); } if (RCLASS_SUPER(obj)) { - gc_mark_internal(objspace, RCLASS_SUPER(obj)); + gc_mark_internal(RCLASS_SUPER(obj)); } if (RCLASS_INCLUDER(obj)) { - gc_mark_internal(objspace, RCLASS_INCLUDER(obj)); + gc_mark_internal(RCLASS_INCLUDER(obj)); } mark_m_tbl(objspace, RCLASS_CALLABLE_M_TBL(obj)); rb_cc_table_mark(obj); @@ -2550,19 +2545,19 @@ rb_gc_mark_children(void *objspace, VALUE obj) case T_ARRAY: if (ARY_SHARED_P(obj)) { VALUE root = ARY_SHARED_ROOT(obj); - gc_mark_internal(objspace, root); + gc_mark_internal(root); } else { long len = RARRAY_LEN(obj); const VALUE *ptr = RARRAY_CONST_PTR(obj); for (long i = 0; i < len; i++) { - gc_mark_internal(objspace, ptr[i]); + gc_mark_internal(ptr[i]); } } break; case T_HASH: - mark_hash(objspace, obj); + mark_hash(obj); break; case T_STRING: @@ -2572,10 +2567,10 @@ rb_gc_mark_children(void *objspace, VALUE obj) * points into the slot of the shared string. There may be code * using the RSTRING_PTR on the stack, which would pin this * string but not pin the shared string, causing it to move. */ - gc_mark_and_pin_internal(objspace, RSTRING(obj)->as.heap.aux.shared); + gc_mark_and_pin_internal(RSTRING(obj)->as.heap.aux.shared); } else { - gc_mark_internal(objspace, RSTRING(obj)->as.heap.aux.shared); + gc_mark_internal(RSTRING(obj)->as.heap.aux.shared); } } break; @@ -2588,7 +2583,7 @@ rb_gc_mark_children(void *objspace, VALUE obj) size_t *offset_list = (size_t *)RTYPEDDATA(obj)->type->function.dmark; for (size_t offset = *offset_list; offset != RUBY_REF_END; offset = *offset_list++) { - gc_mark_internal(objspace, *(VALUE *)((char *)ptr + offset)); + gc_mark_internal(*(VALUE *)((char *)ptr + offset)); } } else { @@ -2606,14 +2601,14 @@ rb_gc_mark_children(void *objspace, VALUE obj) rb_shape_t *shape = rb_shape_get_shape_by_id(ROBJECT_SHAPE_ID(obj)); if (rb_shape_obj_too_complex(obj)) { - gc_mark_tbl_no_pin(objspace, ROBJECT_IV_HASH(obj)); + gc_mark_tbl_no_pin(ROBJECT_IV_HASH(obj)); } else { const VALUE * const ptr = ROBJECT_IVPTR(obj); uint32_t len = ROBJECT_IV_COUNT(obj); for (uint32_t i = 0; i < len; i++) { - gc_mark_internal(objspace, ptr[i]); + gc_mark_internal(ptr[i]); } } @@ -2632,36 +2627,36 @@ rb_gc_mark_children(void *objspace, VALUE obj) case T_FILE: if (RFILE(obj)->fptr) { - gc_mark_internal(objspace, RFILE(obj)->fptr->self); - gc_mark_internal(objspace, RFILE(obj)->fptr->pathv); - gc_mark_internal(objspace, RFILE(obj)->fptr->tied_io_for_writing); - gc_mark_internal(objspace, RFILE(obj)->fptr->writeconv_asciicompat); - gc_mark_internal(objspace, RFILE(obj)->fptr->writeconv_pre_ecopts); - gc_mark_internal(objspace, RFILE(obj)->fptr->encs.ecopts); - gc_mark_internal(objspace, RFILE(obj)->fptr->write_lock); - gc_mark_internal(objspace, RFILE(obj)->fptr->timeout); + gc_mark_internal(RFILE(obj)->fptr->self); + gc_mark_internal(RFILE(obj)->fptr->pathv); + gc_mark_internal(RFILE(obj)->fptr->tied_io_for_writing); + gc_mark_internal(RFILE(obj)->fptr->writeconv_asciicompat); + gc_mark_internal(RFILE(obj)->fptr->writeconv_pre_ecopts); + gc_mark_internal(RFILE(obj)->fptr->encs.ecopts); + gc_mark_internal(RFILE(obj)->fptr->write_lock); + gc_mark_internal(RFILE(obj)->fptr->timeout); } break; case T_REGEXP: - gc_mark_internal(objspace, RREGEXP(obj)->src); + gc_mark_internal(RREGEXP(obj)->src); break; case T_MATCH: - gc_mark_internal(objspace, RMATCH(obj)->regexp); + gc_mark_internal(RMATCH(obj)->regexp); if (RMATCH(obj)->str) { - gc_mark_internal(objspace, RMATCH(obj)->str); + gc_mark_internal(RMATCH(obj)->str); } break; case T_RATIONAL: - gc_mark_internal(objspace, RRATIONAL(obj)->num); - gc_mark_internal(objspace, RRATIONAL(obj)->den); + gc_mark_internal(RRATIONAL(obj)->num); + gc_mark_internal(RRATIONAL(obj)->den); break; case T_COMPLEX: - gc_mark_internal(objspace, RCOMPLEX(obj)->real); - gc_mark_internal(objspace, RCOMPLEX(obj)->imag); + gc_mark_internal(RCOMPLEX(obj)->real); + gc_mark_internal(RCOMPLEX(obj)->imag); break; case T_STRUCT: { @@ -2669,7 +2664,7 @@ rb_gc_mark_children(void *objspace, VALUE obj) const VALUE * const ptr = RSTRUCT_CONST_PTR(obj); for (long i = 0; i < len; i++) { - gc_mark_internal(objspace, ptr[i]); + gc_mark_internal(ptr[i]); } break; @@ -3523,13 +3518,6 @@ ruby_gc_set_params(void) rb_gc_impl_set_params(rb_gc_get_objspace()); } -void -rb_gc_reachable_objects_from_callback(VALUE obj) -{ - rb_ractor_t *cr = GET_RACTOR(); - cr->mfd->mark_func(obj, cr->mfd->data); -} - void rb_objspace_reachable_objects_from(VALUE obj, void (func)(VALUE, void *), void *data) { @@ -3538,15 +3526,16 @@ rb_objspace_reachable_objects_from(VALUE obj, void (func)(VALUE, void *), void * if (rb_gc_impl_during_gc_p(rb_gc_get_objspace())) rb_bug("rb_objspace_reachable_objects_from() is not supported while during GC"); if (!RB_SPECIAL_CONST_P(obj)) { - rb_ractor_t *cr = GET_RACTOR(); + rb_vm_t *vm = GET_VM(); + struct gc_mark_func_data_struct *prev_mfd = vm->gc.mark_func_data; struct gc_mark_func_data_struct mfd = { .mark_func = func, .data = data, - }, *prev_mfd = cr->mfd; + }; - cr->mfd = &mfd; + vm->gc.mark_func_data = &mfd; rb_gc_mark_children(rb_gc_get_objspace(), obj); - cr->mfd = prev_mfd; + vm->gc.mark_func_data = prev_mfd; } } RB_VM_LOCK_LEAVE(); @@ -3570,19 +3559,22 @@ rb_objspace_reachable_objects_from_root(void (func)(const char *category, VALUE, { if (rb_gc_impl_during_gc_p(rb_gc_get_objspace())) rb_bug("rb_gc_impl_objspace_reachable_objects_from_root() is not supported while during GC"); - rb_ractor_t *cr = GET_RACTOR(); + rb_vm_t *vm = GET_VM(); + struct root_objects_data data = { .func = func, .data = passing_data, }; + + struct gc_mark_func_data_struct *prev_mfd = vm->gc.mark_func_data; struct gc_mark_func_data_struct mfd = { .mark_func = root_objects_from, .data = &data, - }, *prev_mfd = cr->mfd; + }; - cr->mfd = &mfd; + vm->gc.mark_func_data = &mfd; rb_gc_mark_roots(rb_gc_get_objspace(), &data.category); - cr->mfd = prev_mfd; + vm->gc.mark_func_data = prev_mfd; } /* diff --git a/gc/default.c b/gc/default.c index 9461c3d1ec8ccb..4bef4bb96d6efe 100644 --- a/gc/default.c +++ b/gc/default.c @@ -4650,32 +4650,29 @@ gc_grey(rb_objspace_t *objspace, VALUE obj) static void gc_mark(rb_objspace_t *objspace, VALUE obj) { - if (RB_LIKELY(during_gc)) { - rgengc_check_relation(objspace, obj); - if (!gc_mark_set(objspace, obj)) return; /* already marked */ - - if (0) { // for debug GC marking miss - if (objspace->rgengc.parent_object) { - RUBY_DEBUG_LOG("%p (%s) parent:%p (%s)", - (void *)obj, obj_type_name(obj), - (void *)objspace->rgengc.parent_object, obj_type_name(objspace->rgengc.parent_object)); - } - else { - RUBY_DEBUG_LOG("%p (%s)", (void *)obj, obj_type_name(obj)); - } - } + GC_ASSERT(during_gc); - if (RB_UNLIKELY(RB_TYPE_P(obj, T_NONE))) { - rb_obj_info_dump(obj); - rb_bug("try to mark T_NONE object"); /* check here will help debugging */ - } + rgengc_check_relation(objspace, obj); + if (!gc_mark_set(objspace, obj)) return; /* already marked */ - gc_aging(objspace, obj); - gc_grey(objspace, obj); + if (0) { // for debug GC marking miss + if (objspace->rgengc.parent_object) { + RUBY_DEBUG_LOG("%p (%s) parent:%p (%s)", + (void *)obj, obj_type_name(obj), + (void *)objspace->rgengc.parent_object, obj_type_name(objspace->rgengc.parent_object)); + } + else { + RUBY_DEBUG_LOG("%p (%s)", (void *)obj, obj_type_name(obj)); + } } - else { - rb_gc_reachable_objects_from_callback(obj); + + if (RB_UNLIKELY(RB_TYPE_P(obj, T_NONE))) { + rb_obj_info_dump(obj); + rb_bug("try to mark T_NONE object"); /* check here will help debugging */ } + + gc_aging(objspace, obj); + gc_grey(objspace, obj); } static inline void diff --git a/gc/gc.h b/gc/gc.h index 2ee96365f2ebc2..f0c8d8bbdd0de5 100644 --- a/gc/gc.h +++ b/gc/gc.h @@ -23,7 +23,6 @@ size_t rb_gc_obj_optimal_size(VALUE obj); void rb_gc_mark_children(void *objspace, VALUE obj); void rb_gc_update_object_references(void *objspace, VALUE obj); void rb_gc_update_vm_references(void *objspace); -void rb_gc_reachable_objects_from_callback(VALUE obj); void rb_gc_event_hook(VALUE obj, rb_event_flag_t event); void *rb_gc_get_objspace(void); size_t rb_size_mul_or_raise(size_t x, size_t y, VALUE exc); diff --git a/ractor_core.h b/ractor_core.h index e35be2f21c10d8..fd3cba3a1f409b 100644 --- a/ractor_core.h +++ b/ractor_core.h @@ -188,12 +188,6 @@ struct rb_ractor_struct { VALUE debug; void *newobj_cache; - - // gc.c rb_objspace_reachable_objects_from - struct gc_mark_func_data_struct { - void *data; - void (*mark_func)(VALUE v, void *data); - } *mfd; }; // rb_ractor_t is defined in vm_core.h diff --git a/vm.c b/vm.c index e92c823cd7f3f3..b1e0780d9e5b5c 100644 --- a/vm.c +++ b/vm.c @@ -3099,7 +3099,7 @@ ruby_vm_destruct(rb_vm_t *vm) } } - struct rb_objspace *objspace = vm->objspace; + struct rb_objspace *objspace = vm->gc.objspace; rb_vm_living_threads_init(vm); ruby_vm_run_at_exit_hooks(vm); @@ -4209,7 +4209,7 @@ Init_VM(void) rb_define_global_const("TOPLEVEL_BINDING", rb_binding_new()); #ifdef _WIN32 - rb_objspace_gc_enable(vm->objspace); + rb_objspace_gc_enable(vm->gc.objspace); #endif } vm_init_redefined_flag(); diff --git a/vm_core.h b/vm_core.h index 1219e4c225b66d..bce5f35763383c 100644 --- a/vm_core.h +++ b/vm_core.h @@ -748,7 +748,13 @@ typedef struct rb_vm_struct { VALUE coverages, me2counter; int coverage_mode; - struct rb_objspace *objspace; + struct { + struct rb_objspace *objspace; + struct gc_mark_func_data_struct { + void *data; + void (*mark_func)(VALUE v, void *data); + } *mark_func_data; + } gc; rb_at_exit_list *at_exit; From ad9d2c643504b3235602d5102a28545c4d06d148 Mon Sep 17 00:00:00 2001 From: tomoya ishida Date: Wed, 4 Sep 2024 00:19:40 +0900 Subject: [PATCH 066/829] [ruby/reline] Fix redisplay/insert_text called from pre_input_hook (https://github.com/ruby/reline/pull/742) * Fix redisplay/insert_text called from pre_input_hook * Rename insert_pasted_text to insert_multiline_text It is now used from Reline.insert_text which is not inserting pasted text https://github.com/ruby/reline/commit/694a540939 --- lib/reline.rb | 11 ++++--- lib/reline/line_editor.rb | 2 +- test/reline/yamatanooroti/test_rendering.rb | 34 +++++++++++++++++++++ 3 files changed, 42 insertions(+), 5 deletions(-) diff --git a/lib/reline.rb b/lib/reline.rb index b851144627ffc3..ddb0224180cb1f 100644 --- a/lib/reline.rb +++ b/lib/reline.rb @@ -324,14 +324,17 @@ def readline(prompt = '', add_hist = false) line_editor.prompt_proc = prompt_proc line_editor.auto_indent_proc = auto_indent_proc line_editor.dig_perfect_match_proc = dig_perfect_match_proc + + # Readline calls pre_input_hook just after printing the first prompt. + line_editor.print_nomultiline_prompt pre_input_hook&.call + unless Reline::IOGate.dumb? @dialog_proc_list.each_pair do |name_sym, d| line_editor.add_dialog_proc(name_sym, d.dialog_proc, d.context) end end - line_editor.print_nomultiline_prompt line_editor.update_dialogs line_editor.rerender @@ -343,7 +346,7 @@ def readline(prompt = '', add_hist = false) inputs.each do |key| if key.char == :bracketed_paste_start text = io_gate.read_bracketed_paste - line_editor.insert_pasted_text(text) + line_editor.insert_multiline_text(text) line_editor.scroll_into_view else line_editor.update(key) @@ -457,8 +460,8 @@ def ambiguous_width def_single_delegator :line_editor, :byte_pointer, :point def_single_delegator :line_editor, :byte_pointer=, :point= - def self.insert_text(*args, &block) - line_editor.insert_text(*args, &block) + def self.insert_text(text) + line_editor.insert_multiline_text(text) self end diff --git a/lib/reline/line_editor.rb b/lib/reline/line_editor.rb index 5f7f00c979d5b0..1fd6fe6970f7ed 100644 --- a/lib/reline/line_editor.rb +++ b/lib/reline/line_editor.rb @@ -1333,7 +1333,7 @@ def confirm_multiline_termination @confirm_multiline_termination_proc.(temp_buffer.join("\n") + "\n") end - def insert_pasted_text(text) + def insert_multiline_text(text) save_old_buffer pre = @buffer_of_lines[@line_index].byteslice(0, @byte_pointer) post = @buffer_of_lines[@line_index].byteslice(@byte_pointer..) diff --git a/test/reline/yamatanooroti/test_rendering.rb b/test/reline/yamatanooroti/test_rendering.rb index 883fcf53fb4ec9..c90d3d6a7f1092 100644 --- a/test/reline/yamatanooroti/test_rendering.rb +++ b/test/reline/yamatanooroti/test_rendering.rb @@ -1841,6 +1841,40 @@ def test_print_before_readline EOC end + def test_pre_input_hook_with_redisplay + code = <<~'RUBY' + puts 'Multiline REPL.' + Reline.pre_input_hook = -> do + Reline.insert_text 'abc' + Reline.redisplay # Reline doesn't need this but Readline requires calling redisplay + end + Reline.readline('prompt> ') + RUBY + start_terminal(6, 30, ['ruby', "-I#{@pwd}/lib", '-rreline', '-e', code], startup_message: 'Multiline REPL.') + assert_screen(<<~EOC) + Multiline REPL. + prompt> abc + EOC + end + + def test_pre_input_hook_with_multiline_text_insert + # Frequently used pattern of pre_input_hook + code = <<~'RUBY' + puts 'Multiline REPL.' + Reline.pre_input_hook = -> do + Reline.insert_text "abc\nef" + end + Reline.readline('>') + RUBY + start_terminal(6, 30, ['ruby', "-I#{@pwd}/lib", '-rreline', '-e', code], startup_message: 'Multiline REPL.') + write("\C-ad") + assert_screen(<<~EOC) + Multiline REPL. + >abc + def + EOC + end + def test_thread_safe start_terminal(6, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --auto-indent}, startup_message: 'Multiline REPL.') write("[Thread.new{Reline.readline'>'},Thread.new{Reline.readmultiline('>'){true}}].map(&:join).size\n") From 0889f640219f964d75ad334b65c516ba3eacf55b Mon Sep 17 00:00:00 2001 From: Mari Imaizumi Date: Wed, 4 Sep 2024 00:32:25 +0900 Subject: [PATCH 067/829] [ruby/reline] Add test for reset_variables in Reline::Config (https://github.com/ruby/reline/pull/741) * Fix reset variables * Add assertion for reload * Add helper method to get instance variable value of Reline::Config https://github.com/ruby/reline/commit/386f619ff5 --- lib/reline/config.rb | 3 ++- test/reline/test_config.rb | 40 +++++++++++++++++++++++--------------- 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/lib/reline/config.rb b/lib/reline/config.rb index 12b2d22237b880..6aa6ba8d9418a9 100644 --- a/lib/reline/config.rb +++ b/lib/reline/config.rb @@ -62,10 +62,11 @@ def reset_variables @keyseq_timeout = 500 @test_mode = false @autocompletion = false - @convert_meta = true if seven_bit_encoding?(Reline::IOGate.encoding) + @convert_meta = seven_bit_encoding?(Reline::IOGate.encoding) @loaded = false @enable_bracketed_paste = true @show_mode_in_prompt = false + @default_inputrc_path = nil end def editing_mode diff --git a/test/reline/test_config.rb b/test/reline/test_config.rb index 172c965fde5e91..68a102a599cf17 100644 --- a/test/reline/test_config.rb +++ b/test/reline/test_config.rb @@ -24,8 +24,12 @@ def teardown ENV['INPUTRC'] = @inputrc_backup end + def get_config_variable(variable) + @config.instance_variable_get(variable) + end + def additional_key_bindings(keymap_label) - @config.instance_variable_get(:@additional_key_bindings)[keymap_label].instance_variable_get(:@key_bindings) + get_config_variable(:@additional_key_bindings)[keymap_label].instance_variable_get(:@key_bindings) end def registered_key_bindings(keys) @@ -38,7 +42,7 @@ def test_read_lines set show-mode-in-prompt on LINES - assert_equal true, @config.instance_variable_get(:@show_mode_in_prompt) + assert_equal true, get_config_variable(:@show_mode_in_prompt) end def test_read_lines_with_variable @@ -46,7 +50,7 @@ def test_read_lines_with_variable set disable-completion on LINES - assert_equal true, @config.instance_variable_get(:@disable_completion) + assert_equal true, get_config_variable(:@disable_completion) end def test_string_value @@ -55,7 +59,7 @@ def test_string_value set emacs-mode-string Emacs LINES - assert_equal 'Emacs', @config.instance_variable_get(:@emacs_mode_string) + assert_equal 'Emacs', get_config_variable(:@emacs_mode_string) end def test_string_value_with_brackets @@ -64,7 +68,7 @@ def test_string_value_with_brackets set emacs-mode-string [Emacs] LINES - assert_equal '[Emacs]', @config.instance_variable_get(:@emacs_mode_string) + assert_equal '[Emacs]', get_config_variable(:@emacs_mode_string) end def test_string_value_with_brackets_and_quotes @@ -73,7 +77,7 @@ def test_string_value_with_brackets_and_quotes set emacs-mode-string "[Emacs]" LINES - assert_equal '[Emacs]', @config.instance_variable_get(:@emacs_mode_string) + assert_equal '[Emacs]', get_config_variable(:@emacs_mode_string) end def test_string_value_with_parens @@ -82,7 +86,7 @@ def test_string_value_with_parens set emacs-mode-string (Emacs) LINES - assert_equal '(Emacs)', @config.instance_variable_get(:@emacs_mode_string) + assert_equal '(Emacs)', get_config_variable(:@emacs_mode_string) end def test_string_value_with_parens_and_quotes @@ -91,7 +95,7 @@ def test_string_value_with_parens_and_quotes set emacs-mode-string "(Emacs)" LINES - assert_equal '(Emacs)', @config.instance_variable_get(:@emacs_mode_string) + assert_equal '(Emacs)', get_config_variable(:@emacs_mode_string) end def test_encoding_is_ascii @@ -105,7 +109,7 @@ def test_encoding_is_ascii def test_encoding_is_not_ascii @config = Reline::Config.new - assert_equal nil, @config.convert_meta + assert_equal false, @config.convert_meta end def test_invalid_keystroke @@ -169,7 +173,7 @@ def test_include $include included_partial LINES - assert_equal true, @config.instance_variable_get(:@show_mode_in_prompt) + assert_equal true, get_config_variable(:@show_mode_in_prompt) end def test_include_expand_path @@ -184,7 +188,7 @@ def test_include_expand_path $include ~/included_partial LINES - assert_equal true, @config.instance_variable_get(:@show_mode_in_prompt) + assert_equal true, get_config_variable(:@show_mode_in_prompt) ensure ENV['HOME'] = home_backup end @@ -198,7 +202,7 @@ def test_if $endif LINES - assert_equal '(cmd)', @config.instance_variable_get(:@vi_cmd_mode_string) + assert_equal '(cmd)', get_config_variable(:@vi_cmd_mode_string) end def test_if_with_false @@ -210,7 +214,7 @@ def test_if_with_false $endif LINES - assert_equal '[cmd]', @config.instance_variable_get(:@vi_cmd_mode_string) + assert_equal '[cmd]', get_config_variable(:@vi_cmd_mode_string) end def test_if_with_indent @@ -224,7 +228,7 @@ def test_if_with_indent $endif LINES - assert_equal '(cmd)', @config.instance_variable_get(:@vi_cmd_mode_string) + assert_equal '(cmd)', get_config_variable(:@vi_cmd_mode_string) end end @@ -446,7 +450,7 @@ def test_history_size set history-size 5000 LINES - assert_equal 5000, @config.instance_variable_get(:@history_size) + assert_equal 5000, get_config_variable(:@history_size) history = Reline::History.new(@config) history << "a\n" assert_equal 1, history.size @@ -477,7 +481,7 @@ def test_inputrc_raw_value set vi-ins-mode-string aaa aaa set vi-cmd-mode-string bbb ccc # comment LINES - assert_equal :vi_insert, @config.instance_variable_get(:@editing_mode_label) + assert_equal :vi_insert, get_config_variable(:@editing_mode_label) assert_equal 'aaa aaa', @config.vi_ins_mode_string assert_equal 'bbb ccc # comment', @config.vi_cmd_mode_string end @@ -576,5 +580,9 @@ def test_reload File.write(inputrc, "set emacs-mode-string ?") @config.reload assert_equal '?', @config.emacs_mode_string + + File.write(inputrc, "") + @config.reload + assert_equal '@', @config.emacs_mode_string end end From f1349924df3b5e9ff2a06453a142a914d5a2799f Mon Sep 17 00:00:00 2001 From: tomoya ishida Date: Wed, 4 Sep 2024 00:45:37 +0900 Subject: [PATCH 068/829] [ruby/irb] Fix easter_egg run without RDoc, fix input-method test run without RDoc (https://github.com/ruby/irb/pull/998) * EasterEgg no longer depend on RDoc * Run most of the input-method tests even if RDoc is not avialable https://github.com/ruby/irb/commit/30fa1595d9 --- lib/irb/easter-egg.rb | 12 +++++++----- test/irb/test_input_method.rb | 5 +++-- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/lib/irb/easter-egg.rb b/lib/irb/easter-egg.rb index 439e5755bd74d0..14dc93fc9c9a19 100644 --- a/lib/irb/easter-egg.rb +++ b/lib/irb/easter-egg.rb @@ -107,13 +107,14 @@ def render_frame(i) end private def easter_egg(type = nil) + print "\e[?1049h" type ||= [:logo, :dancing].sample case type when :logo - require "rdoc" - RDoc::RI::Driver.new.page do |io| - type = STDOUT.external_encoding == Encoding::UTF_8 ? :unicode_large : :ascii_large - io.write easter_egg_logo(type) + Pager.page do |io| + logo_type = STDOUT.external_encoding == Encoding::UTF_8 ? :unicode_large : :ascii_large + io.write easter_egg_logo(logo_type) + STDIN.raw { STDIN.getc } if io == STDOUT end when :dancing STDOUT.cooked do @@ -138,10 +139,11 @@ def render_frame(i) end rescue Interrupt ensure - print "\e[0m\e[?1049l" trap("SIGINT", prev_trap) end end + ensure + print "\e[0m\e[?1049l" end end end diff --git a/test/irb/test_input_method.rb b/test/irb/test_input_method.rb index 915297f56c104d..bd107551df4733 100644 --- a/test/irb/test_input_method.rb +++ b/test/irb/test_input_method.rb @@ -70,6 +70,7 @@ def test_initialization_without_use_autocomplete end def test_initialization_with_use_autocomplete + omit 'This test requires RDoc' unless defined?(RDoc) original_show_doc_proc = Reline.dialog_proc(:show_doc)&.dialog_proc empty_proc = Proc.new {} Reline.add_dialog_proc(:show_doc, empty_proc) @@ -190,5 +191,5 @@ def test_perfect_matching_handles_nil_namespace def has_rdoc_content? File.exist?(RDoc::RI::Paths::BASE) end - end -end if defined?(RDoc) + end if defined?(RDoc) +end From f7b097dea0491410dbb98db792c29d87abf888a6 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Tue, 3 Sep 2024 11:22:08 -0400 Subject: [PATCH 069/829] [PRISM] Keep script lines option for eval iseqs as well --- vm_eval.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/vm_eval.c b/vm_eval.c index 9834b7ff9e15da..807f3228546cac 100644 --- a/vm_eval.c +++ b/vm_eval.c @@ -1719,7 +1719,9 @@ pm_eval_make_iseq(VALUE src, VALUE fname, int line, // Add our empty local scope at the very end of the array for our eval // scope's locals. pm_options_scope_init(&result.options.scopes[scopes_count], 0); - VALUE error = pm_parse_string(&result, src, fname, NULL); + + VALUE script_lines; + VALUE error = pm_parse_string(&result, src, fname, ruby_vm_keep_script_lines ? &script_lines : NULL); // If the parse failed, clean up and raise. if (error != Qnil) { From 767d0a171668fbfcc5bbd9c060bb59d192717ce3 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Tue, 3 Sep 2024 13:16:24 -0400 Subject: [PATCH 070/829] [PRISM] Fix up compile warning for sign comparison --- prism_compile.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prism_compile.c b/prism_compile.c index 5bd02ed04f2bdf..d1c9d5431e044c 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -10405,7 +10405,7 @@ pm_parse_process(pm_parse_result_t *result, pm_node_t *node, VALUE *script_lines for (size_t index = 0; index < parser->newline_list.size; index++) { size_t offset = parser->newline_list.offsets[index]; - size_t length = index == parser->newline_list.size - 1 ? (parser->end - (parser->start + offset)) : (parser->newline_list.offsets[index + 1] - offset); + size_t length = index == parser->newline_list.size - 1 ? ((size_t) (parser->end - (parser->start + offset))) : (parser->newline_list.offsets[index + 1] - offset); rb_ary_push(*script_lines, rb_enc_str_new((const char *) parser->start + offset, length, scope_node->encoding)); } From 675529b9c662c0e69a71de12d7a22c68016186f5 Mon Sep 17 00:00:00 2001 From: Durable Programming Team Date: Mon, 2 Sep 2024 15:16:31 -0400 Subject: [PATCH 071/829] [rubygems/rubygems] standardize pretty-print output for Gem::Source and subclasses https://github.com/rubygems/rubygems/commit/6d5fbf82f1 --- lib/rubygems/source.rb | 16 +++++++++------- lib/rubygems/source/git.rb | 12 +++++++----- lib/rubygems/source/installed.rb | 4 +++- lib/rubygems/source/local.rb | 12 ++++++++---- lib/rubygems/source/specific_file.rb | 8 +++++--- test/rubygems/test_gem_source_git.rb | 6 ++++++ test/rubygems/test_gem_source_installed.rb | 5 +++++ test/rubygems/test_gem_source_local.rb | 5 +++++ test/rubygems/test_gem_source_specific_file.rb | 4 ++++ 9 files changed, 52 insertions(+), 20 deletions(-) diff --git a/lib/rubygems/source.rb b/lib/rubygems/source.rb index d90e311b65a197..4e5545982d6432 100644 --- a/lib/rubygems/source.rb +++ b/lib/rubygems/source.rb @@ -213,14 +213,16 @@ def download(spec, dir=Dir.pwd) end def pretty_print(q) # :nodoc: - q.group 2, "[Remote:", "]" do - q.breakable - q.text @uri.to_s - - if api = uri + q.object_group(self) do + q.group 2, "[Remote:", "]" do q.breakable - q.text "API URI: " - q.text api.to_s + q.text @uri.to_s + + if api = uri + q.breakable + q.text "API URI: " + q.text api.to_s + end end end end diff --git a/lib/rubygems/source/git.rb b/lib/rubygems/source/git.rb index bda63c6844d92c..34f6851bc40557 100644 --- a/lib/rubygems/source/git.rb +++ b/lib/rubygems/source/git.rb @@ -157,12 +157,14 @@ def install_dir # :nodoc: end def pretty_print(q) # :nodoc: - q.group 2, "[Git: ", "]" do - q.breakable - q.text @repository + q.object_group(self) do + q.group 2, "[Git: ", "]" do + q.breakable + q.text @repository - q.breakable - q.text @reference + q.breakable + q.text @reference + end end end diff --git a/lib/rubygems/source/installed.rb b/lib/rubygems/source/installed.rb index cbe12a05163642..f5c96fee5129b4 100644 --- a/lib/rubygems/source/installed.rb +++ b/lib/rubygems/source/installed.rb @@ -32,6 +32,8 @@ def download(spec, path) end def pretty_print(q) # :nodoc: - q.text "[Installed]" + q.object_group(self) do + q.text "[Installed]" + end end end diff --git a/lib/rubygems/source/local.rb b/lib/rubygems/source/local.rb index d81d8343a818ff..ba6eea1f9aa5c7 100644 --- a/lib/rubygems/source/local.rb +++ b/lib/rubygems/source/local.rb @@ -117,10 +117,14 @@ def download(spec, cache_dir = nil) # :nodoc: end def pretty_print(q) # :nodoc: - q.group 2, "[Local gems:", "]" do - q.breakable - q.seplist @specs.keys do |v| - q.text v.full_name + q.object_group(self) do + q.group 2, "[Local gems:", "]" do + q.breakable + if @specs + q.seplist @specs.keys do |v| + q.text v.full_name + end + end end end end diff --git a/lib/rubygems/source/specific_file.rb b/lib/rubygems/source/specific_file.rb index e9b27536469300..dde1d48a219d76 100644 --- a/lib/rubygems/source/specific_file.rb +++ b/lib/rubygems/source/specific_file.rb @@ -42,9 +42,11 @@ def download(spec, dir = nil) # :nodoc: end def pretty_print(q) # :nodoc: - q.group 2, "[SpecificFile:", "]" do - q.breakable - q.text @path + q.object_group(self) do + q.group 2, "[SpecificFile:", "]" do + q.breakable + q.text @path + end end end diff --git a/test/rubygems/test_gem_source_git.rb b/test/rubygems/test_gem_source_git.rb index 20e750a0d4000d..abcd55907ed096 100644 --- a/test/rubygems/test_gem_source_git.rb +++ b/test/rubygems/test_gem_source_git.rb @@ -292,6 +292,12 @@ def test_uri assert_equal Gem::URI(@repository), @source.uri end + def test_pretty_print + assert_equal "#\n", @source.pretty_inspect + end + def test_uri_hash assert_equal @hash, @source.uri_hash diff --git a/test/rubygems/test_gem_source_installed.rb b/test/rubygems/test_gem_source_installed.rb index 0d6171b0e52682..0ef14d7470cc92 100644 --- a/test/rubygems/test_gem_source_installed.rb +++ b/test/rubygems/test_gem_source_installed.rb @@ -32,4 +32,9 @@ def test_spaceship assert_equal(1, vendor.<=>(installed), "vendor <=> installed") assert_equal(-1, installed.<=>(vendor), "installed <=> vendor") end + + def test_pretty_print + local = Gem::Source::Installed.new + assert_equal "#\n", local.pretty_inspect + end end diff --git a/test/rubygems/test_gem_source_local.rb b/test/rubygems/test_gem_source_local.rb index c15e0e07c0a7f7..ed6aa24f940db1 100644 --- a/test/rubygems/test_gem_source_local.rb +++ b/test/rubygems/test_gem_source_local.rb @@ -104,4 +104,9 @@ def test_spaceship assert_equal(-1, specific.<=>(local), "specific <=> local") assert_equal(1, local.<=>(specific), "local <=> specific") end + + def test_pretty_print + local = Gem::Source::Local.new + assert_equal "#\n", local.pretty_inspect + end end diff --git a/test/rubygems/test_gem_source_specific_file.rb b/test/rubygems/test_gem_source_specific_file.rb index 3bc1901ee19926..bcc41684444f47 100644 --- a/test/rubygems/test_gem_source_specific_file.rb +++ b/test/rubygems/test_gem_source_specific_file.rb @@ -73,4 +73,8 @@ def test_spaceship assert_equal(0, a1_source.<=>(a1_source), "a1_source <=> a1_source") # rubocop:disable Lint/BinaryOperatorWithIdenticalOperands assert_equal(1, a2_source.<=>(a1_source), "a2_source <=> a1_source") end + + def test_pretty_print + assert_equal "#\n", @sf.pretty_inspect + end end From 53eaa67305611e29e45722036cd49b528ac32abf Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Tue, 3 Sep 2024 13:43:33 -0400 Subject: [PATCH 072/829] Unpoision the object in rb_gc_impl_garbage_object_p --- gc/default.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/gc/default.c b/gc/default.c index 4bef4bb96d6efe..96cdc75bc3f37f 100644 --- a/gc/default.c +++ b/gc/default.c @@ -1653,13 +1653,15 @@ rb_gc_impl_garbage_object_p(void *objspace_ptr, VALUE ptr) { rb_objspace_t *objspace = objspace_ptr; - switch (BUILTIN_TYPE(ptr)) { - case T_NONE: - case T_MOVED: - case T_ZOMBIE: - return true; - default: - break; + asan_unpoisoning_object(ptr) { + switch (BUILTIN_TYPE(ptr)) { + case T_NONE: + case T_MOVED: + case T_ZOMBIE: + return true; + default: + break; + } } return is_lazy_sweeping(objspace) && GET_HEAP_PAGE(ptr)->flags.before_sweep && From ef42e04a1a623df533815d3d9305a79fb69b1593 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Tue, 3 Sep 2024 13:44:09 -0400 Subject: [PATCH 073/829] Don't traverse garbage objects in heap traversal The object could be garbage (e.g. T_NONE, T_MOVED, or T_ZOMBIE) so we don't want to traverse those. --- gc.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/gc.c b/gc.c index 8665f719ab5e35..32347847973eae 100644 --- a/gc.c +++ b/gc.c @@ -2042,7 +2042,10 @@ ruby_stack_check(void) if (LIKELY(vm->gc.mark_func_data == NULL)) { \ (func)(vm->gc.objspace, (obj_or_ptr)); \ } \ - else if (check_obj ? rb_gc_impl_pointer_to_heap_p(vm->gc.objspace, (const void *)obj) : true) { \ + else if (check_obj ? \ + rb_gc_impl_pointer_to_heap_p(vm->gc.objspace, (const void *)obj) && \ + !rb_gc_impl_garbage_object_p(vm->gc.objspace, obj) : \ + true) { \ GC_ASSERT(!rb_gc_impl_during_gc_p(vm->gc.objspace)); \ struct gc_mark_func_data_struct *mark_func_data = vm->gc.mark_func_data; \ vm->gc.mark_func_data = NULL; \ From e7fbdf8187ab62bfbe8b2660eda01de94341412e Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Tue, 3 Sep 2024 13:45:54 -0400 Subject: [PATCH 074/829] Fix indentation broken in 53eaa67 [ci skip] --- gc/default.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gc/default.c b/gc/default.c index 96cdc75bc3f37f..999a960967e316 100644 --- a/gc/default.c +++ b/gc/default.c @@ -1655,11 +1655,11 @@ rb_gc_impl_garbage_object_p(void *objspace_ptr, VALUE ptr) asan_unpoisoning_object(ptr) { switch (BUILTIN_TYPE(ptr)) { - case T_NONE: - case T_MOVED: - case T_ZOMBIE: + case T_NONE: + case T_MOVED: + case T_ZOMBIE: return true; - default: + default: break; } } From 974b4043271b805c959b709183369bede3ba1fdb Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Wed, 4 Sep 2024 08:41:38 +0900 Subject: [PATCH 075/829] Bump up openssl-3.0.15 --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4880638037b65c..5534e3defec392 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -96,7 +96,7 @@ jobs: -H "Accept: application/vnd.github+json" \ -H "X-GitHub-Api-Version: 2022-11-28" \ https://api.github.com/repos/rbenv/ruby-build/dispatches \ - -d '{"event_type": "update-ruby", "client_payload": {"ruby_version": "${{ env.RUBY_VERSION }}", "openssl_version": "3.0.14"}}' + -d '{"event_type": "update-ruby", "client_payload": {"ruby_version": "${{ env.RUBY_VERSION }}", "openssl_version": "3.0.15"}}' - name: Update all-ruby definition run: | From 08f14b8d4cf2058e8f23f3c6dab37c82c5e73d70 Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Tue, 3 Sep 2024 18:21:01 -0700 Subject: [PATCH 076/829] Allow Errno::EACCES when testing connection timeout Some packaging systems that include support for running tests, such as OpenBSD's, do not allow outbound network connections during testing for security reasons. EACCES is the error raised by OpenBSD in this case. --- test/socket/test_tcp.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/socket/test_tcp.rb b/test/socket/test_tcp.rb index 7f9dc53cae266b..6a016da71d380b 100644 --- a/test/socket/test_tcp.rb +++ b/test/socket/test_tcp.rb @@ -70,7 +70,7 @@ def test_initialize_resolv_timeout end def test_initialize_connect_timeout - assert_raise(IO::TimeoutError, Errno::ENETUNREACH) do + assert_raise(IO::TimeoutError, Errno::ENETUNREACH, Errno::EACCES) do TCPSocket.new("192.0.2.1", 80, connect_timeout: 0) end end From ade240e5785eac173978304ca9acfe10d08f057e Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Wed, 4 Sep 2024 10:28:52 +0900 Subject: [PATCH 077/829] Adjust indents [ci skip] --- string.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/string.c b/string.c index 0dd02f82537992..3fefe7bef056df 100644 --- a/string.c +++ b/string.c @@ -879,12 +879,12 @@ int rb_enc_str_asciionly_p(VALUE str) { switch(ENC_CODERANGE(str)) { - case ENC_CODERANGE_UNKNOWN: - return rb_enc_str_asciicompat(str) && is_ascii_string(str); - case ENC_CODERANGE_7BIT: - return true; - default: - return false; + case ENC_CODERANGE_UNKNOWN: + return rb_enc_str_asciicompat(str) && is_ascii_string(str); + case ENC_CODERANGE_7BIT: + return true; + default: + return false; } } From 37d7ae06afb03ae5508bfd81033961559886bd6b Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Tue, 3 Sep 2024 20:19:55 +0900 Subject: [PATCH 078/829] [Bug #20708] Retry `open` on EINTR Co-Authored-By: Martin Dorey --- io.c | 5 ++++- test/ruby/test_io.rb | 32 +++++++++++++++++++++++++++++--- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/io.c b/io.c index 54b60b7357e5c0..590e8d11d74093 100644 --- a/io.c +++ b/io.c @@ -6956,7 +6956,10 @@ sysopen_func(void *ptr) static inline int rb_sysopen_internal(struct sysopen_struct *data) { - int fd = IO_WITHOUT_GVL_INT(sysopen_func, data); + int fd; + do { + fd = IO_WITHOUT_GVL_INT(sysopen_func, data); + } while (fd < 0 && errno == EINTR); if (0 <= fd) rb_update_max_fd(fd); return fd; diff --git a/test/ruby/test_io.rb b/test/ruby/test_io.rb index 8b4dc1ed98f746..1ca05ae362f6b6 100644 --- a/test/ruby/test_io.rb +++ b/test/ruby/test_io.rb @@ -3876,8 +3876,10 @@ def test_close_uninitialized end def test_open_fifo_does_not_block_other_threads - mkcdtmpdir { + mkcdtmpdir do File.mkfifo("fifo") + rescue NotImplementedError + else assert_separately([], <<-'EOS') t1 = Thread.new { open("fifo", "r") {|r| @@ -3892,8 +3894,32 @@ def test_open_fifo_does_not_block_other_threads t1_value, _ = assert_join_threads([t1, t2]) assert_equal("foo", t1_value) EOS - } - end if /mswin|mingw|bccwin|cygwin/ !~ RUBY_PLATFORM + end + end + + def test_open_fifo_restart_at_signal_intterupt + mkcdtmpdir do + File.mkfifo("fifo") + rescue NotImplementedError + else + wait = EnvUtil.apply_timeout_scale(0.1) + data = "writing to fifo" + + # Do not use assert_separately, because reading from stdin + # prevents to reproduce [Bug #20708] + assert_in_out_err(["-e", "#{<<~"begin;"}\n#{<<~'end;'}"], [], [data]) + wait, data = #{wait}, #{data.dump} + ; + begin; + trap(:USR1) {} + Thread.new do + sleep wait; Process.kill(:USR1, $$) + sleep wait; File.write("fifo", data) + end + puts File.read("fifo") + end; + end + end if Signal.list[:USR1] # Pointless on platforms without signal def test_open_flag make_tempfile do |t| From ab18b1b4f55d3d06e6e040d755e75b5b447198f3 Mon Sep 17 00:00:00 2001 From: ydah Date: Tue, 3 Sep 2024 16:20:52 +0900 Subject: [PATCH 079/829] Implement VALIAS NODE keyword locations --- ast.c | 4 ++++ node_dump.c | 1 + parse.y | 11 ++++++----- rubyparser.h | 1 + test/ruby/test_ast.rb | 8 ++++++++ 5 files changed, 20 insertions(+), 5 deletions(-) diff --git a/ast.c b/ast.c index d6d3e11d60dd59..12366dd432f7b4 100644 --- a/ast.c +++ b/ast.c @@ -789,6 +789,10 @@ node_locations(VALUE ast_value, const NODE *node) location_new(&RNODE_UNLESS(node)->keyword_loc), location_new(&RNODE_UNLESS(node)->then_keyword_loc), location_new(&RNODE_UNLESS(node)->end_keyword_loc)); + case NODE_VALIAS: + return rb_ary_new_from_args(2, + location_new(nd_code_loc(node)), + location_new(&RNODE_VALIAS(node)->keyword_loc)); case NODE_ARGS_AUX: case NODE_LAST: break; diff --git a/node_dump.c b/node_dump.c index 6ab91bd853375a..54a4eb0e64441a 100644 --- a/node_dump.c +++ b/node_dump.c @@ -933,6 +933,7 @@ dump_node(VALUE buf, VALUE indent, int comment, const NODE * node) ANN("example: alias $y $x"); F_ID(nd_alias, RNODE_VALIAS, "new name"); F_ID(nd_orig, RNODE_VALIAS, "old name"); + F_LOC(keyword_loc, RNODE_VALIAS); return; case NODE_UNDEF: diff --git a/parse.y b/parse.y index 1dffac64f4f5e4..6ebd60844adc51 100644 --- a/parse.y +++ b/parse.y @@ -1139,7 +1139,7 @@ static rb_node_block_pass_t *rb_node_block_pass_new(struct parser_params *p, NOD static rb_node_defn_t *rb_node_defn_new(struct parser_params *p, ID nd_mid, NODE *nd_defn, const YYLTYPE *loc); static rb_node_defs_t *rb_node_defs_new(struct parser_params *p, NODE *nd_recv, ID nd_mid, NODE *nd_defn, const YYLTYPE *loc); static rb_node_alias_t *rb_node_alias_new(struct parser_params *p, NODE *nd_1st, NODE *nd_2nd, const YYLTYPE *loc, const YYLTYPE *keyword_loc); -static rb_node_valias_t *rb_node_valias_new(struct parser_params *p, ID nd_alias, ID nd_orig, const YYLTYPE *loc); +static rb_node_valias_t *rb_node_valias_new(struct parser_params *p, ID nd_alias, ID nd_orig, const YYLTYPE *loc, const YYLTYPE *keyword_loc); static rb_node_undef_t *rb_node_undef_new(struct parser_params *p, NODE *nd_undef, const YYLTYPE *loc); static rb_node_class_t *rb_node_class_new(struct parser_params *p, NODE *nd_cpath, NODE *nd_body, NODE *nd_super, const YYLTYPE *loc); static rb_node_module_t *rb_node_module_new(struct parser_params *p, NODE *nd_cpath, NODE *nd_body, const YYLTYPE *loc); @@ -1247,7 +1247,7 @@ static rb_node_error_t *rb_node_error_new(struct parser_params *p, const YYLTYPE #define NEW_DEFN(i,s,loc) (NODE *)rb_node_defn_new(p,i,s,loc) #define NEW_DEFS(r,i,s,loc) (NODE *)rb_node_defs_new(p,r,i,s,loc) #define NEW_ALIAS(n,o,loc,k_loc) (NODE *)rb_node_alias_new(p,n,o,loc,k_loc) -#define NEW_VALIAS(n,o,loc) (NODE *)rb_node_valias_new(p,n,o,loc) +#define NEW_VALIAS(n,o,loc,k_loc) (NODE *)rb_node_valias_new(p,n,o,loc,k_loc) #define NEW_UNDEF(i,loc) (NODE *)rb_node_undef_new(p,i,loc) #define NEW_CLASS(n,b,s,loc) (NODE *)rb_node_class_new(p,n,b,s,loc) #define NEW_MODULE(n,b,loc) (NODE *)rb_node_module_new(p,n,b,loc) @@ -3133,7 +3133,7 @@ stmt : keyword_alias fitem {SET_LEX_STATE(EXPR_FNAME|EXPR_FITEM);} fitem } | keyword_alias tGVAR tGVAR { - $$ = NEW_VALIAS($2, $3, &@$); + $$ = NEW_VALIAS($2, $3, &@$, &@1); /*% ripper: var_alias!($:2, $:3) %*/ } | keyword_alias tGVAR tBACK_REF @@ -3141,7 +3141,7 @@ stmt : keyword_alias fitem {SET_LEX_STATE(EXPR_FNAME|EXPR_FITEM);} fitem char buf[2]; buf[0] = '$'; buf[1] = (char)RNODE_BACK_REF($3)->nd_nth; - $$ = NEW_VALIAS($2, rb_intern2(buf, 2), &@$); + $$ = NEW_VALIAS($2, rb_intern2(buf, 2), &@$, &@1); /*% ripper: var_alias!($:2, $:3) %*/ } | keyword_alias tGVAR tNTH_REF @@ -12308,11 +12308,12 @@ rb_node_alias_new(struct parser_params *p, NODE *nd_1st, NODE *nd_2nd, const YYL } static rb_node_valias_t * -rb_node_valias_new(struct parser_params *p, ID nd_alias, ID nd_orig, const YYLTYPE *loc) +rb_node_valias_new(struct parser_params *p, ID nd_alias, ID nd_orig, const YYLTYPE *loc, const YYLTYPE *keyword_loc) { rb_node_valias_t *n = NODE_NEWNODE(NODE_VALIAS, rb_node_valias_t, loc); n->nd_alias = nd_alias; n->nd_orig = nd_orig; + n->keyword_loc = *keyword_loc; return n; } diff --git a/rubyparser.h b/rubyparser.h index a690394928c059..5383c31f03b330 100644 --- a/rubyparser.h +++ b/rubyparser.h @@ -828,6 +828,7 @@ typedef struct RNode_VALIAS { ID nd_alias; ID nd_orig; + rb_code_location_t keyword_loc; } rb_node_valias_t; typedef struct RNode_UNDEF { diff --git a/test/ruby/test_ast.rb b/test/ruby/test_ast.rb index cded28cf1f615c..d1422fc2c0d6fc 100644 --- a/test/ruby/test_ast.rb +++ b/test/ruby/test_ast.rb @@ -1351,6 +1351,14 @@ def test_undef_locations assert_locations(node.children[-1].locations, [[1, 0, 1, 14], [1, 0, 1, 5]]) end + def test_valias_locations + node = RubyVM::AbstractSyntaxTree.parse("alias $foo $bar") + assert_locations(node.children[-1].locations, [[1, 0, 1, 15], [1, 0, 1, 5]]) + + node = RubyVM::AbstractSyntaxTree.parse("alias $foo $&") + assert_locations(node.children[-1].locations, [[1, 0, 1, 13], [1, 0, 1, 5]]) + end + private def assert_locations(locations, expected) ary = locations.map {|loc| loc && [loc.first_lineno, loc.first_column, loc.last_lineno, loc.last_column] } From a3e08718b4c6505564b6a36933477a6093a38c77 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Wed, 4 Sep 2024 14:44:30 +0900 Subject: [PATCH 080/829] Use bundler/inline to download diffy gem --- tool/format-release | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tool/format-release b/tool/format-release index 737148e0ce4674..258c25406d2649 100755 --- a/tool/format-release +++ b/tool/format-release @@ -1,6 +1,12 @@ #!/usr/bin/env ruby -# https://rubygems.org/gems/diffy -require "diffy" + +require "bundler/inline" + +gemfile do + source "https://rubygems.org" + gem "diffy" +end + require "open-uri" require "yaml" From e884d65094e7b10b3e4c2764c83ed68db67666ab Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Wed, 4 Sep 2024 12:59:02 +0900 Subject: [PATCH 081/829] Ignore blocks to `Test::Unit::Assertions#pend` silently Although `pend` in test-unit gem expects the block does not pass if it is given, our `pend` should ignore the block silently as same as it just skips the test with no message by default. Add an unused parameter, to suppress the warning for the block to be ignored. --- tool/lib/test/unit/assertions.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tool/lib/test/unit/assertions.rb b/tool/lib/test/unit/assertions.rb index aad422f7e7aa33..fe3351107ec407 100644 --- a/tool/lib/test/unit/assertions.rb +++ b/tool/lib/test/unit/assertions.rb @@ -522,7 +522,7 @@ def refute_same exp, act, msg = nil # Skips the current test. Gets listed at the end of the run but # doesn't cause a failure exit code. - def pend msg = nil, bt = caller + def pend msg = nil, bt = caller, &_ msg ||= "Skipped, no message given" @skip = true raise Test::Unit::PendedError, msg, bt From 7fc1fd8977d0012067d736a88cebe2bbd71fd64d Mon Sep 17 00:00:00 2001 From: git Date: Wed, 4 Sep 2024 07:02:15 +0000 Subject: [PATCH 082/829] Update bundled gems list as of 2024-09-04 --- NEWS.md | 2 +- gems/bundled_gems | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/NEWS.md b/NEWS.md index 071bd13ca16b50..235aeb0b72d0ee 100644 --- a/NEWS.md +++ b/NEWS.md @@ -92,7 +92,7 @@ The following bundled gems are updated. * minitest 5.25.1 * rake 13.2.1 * test-unit 3.6.2 -* rexml 3.3.6 +* rexml 3.3.7 * rss 0.3.1 * net-ftp 0.3.7 * net-imap 0.4.15 diff --git a/gems/bundled_gems b/gems/bundled_gems index 4e8ca298a0aff3..0e82d9e2fd5a39 100644 --- a/gems/bundled_gems +++ b/gems/bundled_gems @@ -10,7 +10,7 @@ minitest 5.25.1 https://github.com/minitest/minitest power_assert 2.0.3 https://github.com/ruby/power_assert 84e85124c5014a139af39161d484156cfe87a9ed rake 13.2.1 https://github.com/ruby/rake test-unit 3.6.2 https://github.com/test-unit/test-unit -rexml 3.3.6 https://github.com/ruby/rexml +rexml 3.3.7 https://github.com/ruby/rexml rss 0.3.1 https://github.com/ruby/rss net-ftp 0.3.7 https://github.com/ruby/net-ftp net-imap 0.4.15 https://github.com/ruby/net-imap From 56817865d64e898aac28e644bc44ee4e242f4ceb Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Wed, 4 Sep 2024 16:07:17 +0900 Subject: [PATCH 083/829] [rubygems/rubygems] Removed unused stringio Fixed https://github.com/rubygems/rubygems/pull/7996 https://github.com/rubygems/rubygems/commit/16bfcac883 --- lib/rubygems/remote_fetcher.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/rubygems/remote_fetcher.rb b/lib/rubygems/remote_fetcher.rb index c3a41592f670f5..4b5c74e0ea60e7 100644 --- a/lib/rubygems/remote_fetcher.rb +++ b/lib/rubygems/remote_fetcher.rb @@ -75,7 +75,6 @@ def self.fetcher def initialize(proxy=nil, dns=nil, headers={}) require_relative "core_ext/tcpsocket_init" if Gem.configuration.ipv4_fallback_enabled require_relative "vendored_net_http" - require "stringio" require_relative "vendor/uri/lib/uri" Socket.do_not_reverse_lookup = true From ae98d19cf97bf3ec70c4d1e2df9b90c7d0ecd130 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Wed, 4 Sep 2024 16:47:22 +0900 Subject: [PATCH 084/829] Test with Ubuntu 24.04 --- .github/workflows/ubuntu.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu.yml index ca1074f57b5ad1..83ec71b0b38f3d 100644 --- a/.github/workflows/ubuntu.yml +++ b/.github/workflows/ubuntu.yml @@ -42,6 +42,8 @@ jobs: - test_task: test-bundled-gems - test_task: check os: ubuntu-20.04 + - test_task: check + os: ubuntu-24.04 fail-fast: false env: From 036ca726bb9763690b7f6b7fe05ddf112d22ddc5 Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Wed, 4 Sep 2024 11:24:00 +0200 Subject: [PATCH 085/829] Fix documentation for String#index and String#byterindex --- string.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/string.c b/string.c index 3fefe7bef056df..d9569d1515c4e7 100644 --- a/string.c +++ b/string.c @@ -4480,7 +4480,7 @@ rb_str_rindex(VALUE str, VALUE sub, long pos) * $~ #=> # * * Integer argument +offset+, if given and non-negative, specifies the maximum starting position in the - * string to _end_ the search: + * string to _end_ the search: * * 'foo'.rindex('o', 0) # => nil * 'foo'.rindex('o', 1) # => 1 @@ -4613,7 +4613,7 @@ rb_str_byterindex(VALUE str, VALUE sub, long pos) * $~ #=> # * * Integer argument +offset+, if given and non-negative, specifies the maximum starting byte-based position in the - * string to _end_ the search: + * string to _end_ the search: * * 'foo'.byterindex('o', 0) # => nil * 'foo'.byterindex('o', 1) # => 1 From 9a766777d465dd408679880d2e070b4396b7c1a5 Mon Sep 17 00:00:00 2001 From: tomoya ishida Date: Wed, 4 Sep 2024 20:57:59 +0900 Subject: [PATCH 086/829] [ruby/reline] Split render_differential to LineEditor's rendering logic and actual differential rendering part (https://github.com/ruby/reline/pull/731) https://github.com/ruby/reline/commit/c90f08f7e3 --- lib/reline/line_editor.rb | 67 ++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 40 deletions(-) diff --git a/lib/reline/line_editor.rb b/lib/reline/line_editor.rb index 1fd6fe6970f7ed..c71a5f79eef9c5 100644 --- a/lib/reline/line_editor.rb +++ b/lib/reline/line_editor.rb @@ -176,9 +176,8 @@ def handle_signal scroll_into_view Reline::IOGate.move_cursor_up @rendered_screen.cursor_y @rendered_screen.base_y = Reline::IOGate.cursor_pos.y - @rendered_screen.lines = [] - @rendered_screen.cursor_y = 0 - render_differential + clear_rendered_screen_cache + render end private def handle_interrupted @@ -186,11 +185,11 @@ def handle_signal @interrupted = false clear_dialogs - scrolldown = render_differential - Reline::IOGate.scroll_down scrolldown + render + cursor_to_bottom_offset = @rendered_screen.lines.size - @rendered_screen.cursor_y + Reline::IOGate.scroll_down cursor_to_bottom_offset Reline::IOGate.move_cursor_column 0 - @rendered_screen.lines = [] - @rendered_screen.cursor_y = 0 + clear_rendered_screen_cache case @old_trap when 'DEFAULT', 'SYSTEM_DEFAULT' raise Interrupt @@ -460,28 +459,7 @@ def update_dialogs(key = nil) end def render_finished - clear_rendered_lines - render_full_content - end - - def clear_rendered_lines - Reline::IOGate.move_cursor_up @rendered_screen.cursor_y - Reline::IOGate.move_cursor_column 0 - - num_lines = @rendered_screen.lines.size - return unless num_lines && num_lines >= 1 - - Reline::IOGate.move_cursor_down num_lines - 1 - (num_lines - 1).times do - Reline::IOGate.erase_after_cursor - Reline::IOGate.move_cursor_up 1 - end - Reline::IOGate.erase_after_cursor - @rendered_screen.lines = [] - @rendered_screen.cursor_y = 0 - end - - def render_full_content + render_differential([], 0, 0) lines = @buffer_of_lines.size.times.map do |i| line = prompt_list[i] + modified_lines[i] wrapped_lines, = split_by_width(line, screen_width) @@ -495,10 +473,8 @@ def print_nomultiline_prompt @output.write @prompt if @prompt && !@is_multiline end - def render_differential + def render wrapped_cursor_x, wrapped_cursor_y = wrapped_cursor_position - - rendered_lines = @rendered_screen.lines new_lines = wrapped_prompt_and_input_lines.flatten(1)[screen_scroll_top, screen_height].map do |prompt, line| prompt_width = Reline::Unicode.calculate_width(prompt, true) [[0, prompt_width, prompt], [prompt_width, Reline::Unicode.calculate_width(line, true), line]] @@ -516,12 +492,21 @@ def render_differential x_range, y_range = dialog_range dialog, wrapped_cursor_y - screen_scroll_top y_range.each do |row| next if row < 0 || row >= screen_height + dialog_rows = new_lines[row] ||= [] # index 0 is for prompt, index 1 is for line, index 2.. is for dialog dialog_rows[index + 2] = [x_range.begin, dialog.width, dialog.contents[row - y_range.begin]] end end + render_differential new_lines, wrapped_cursor_x, wrapped_cursor_y - screen_scroll_top + end + + # Reflects lines to be rendered and new cursor position to the screen + # by calculating the difference from the previous render. + + private def render_differential(new_lines, new_cursor_x, new_cursor_y) + rendered_lines = @rendered_screen.lines cursor_y = @rendered_screen.cursor_y if new_lines != rendered_lines # Hide cursor while rendering to avoid cursor flickering. @@ -548,11 +533,14 @@ def render_differential @rendered_screen.lines = new_lines Reline::IOGate.show_cursor end - y = wrapped_cursor_y - screen_scroll_top - Reline::IOGate.move_cursor_column wrapped_cursor_x - Reline::IOGate.move_cursor_down y - cursor_y - @rendered_screen.cursor_y = y - new_lines.size - y + Reline::IOGate.move_cursor_column new_cursor_x + Reline::IOGate.move_cursor_down new_cursor_y - cursor_y + @rendered_screen.cursor_y = new_cursor_y + end + + private def clear_rendered_screen_cache + @rendered_screen.lines = [] + @rendered_screen.cursor_y = 0 end def upper_space_height(wrapped_cursor_y) @@ -564,7 +552,7 @@ def rest_height(wrapped_cursor_y) end def rerender - render_differential unless @in_pasting + render unless @in_pasting end class DialogProcScope @@ -1978,9 +1966,8 @@ def finish private def ed_clear_screen(key) Reline::IOGate.clear_screen @screen_size = Reline::IOGate.get_screen_size - @rendered_screen.lines = [] @rendered_screen.base_y = 0 - @rendered_screen.cursor_y = 0 + clear_rendered_screen_cache end alias_method :clear_screen, :ed_clear_screen From 83334ebb3c8056534974873b528f44fc0622cd22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Mon, 2 Sep 2024 20:21:00 +0200 Subject: [PATCH 087/829] [rubygems/rubygems] Load gemspecs in the context of its parent also when using local overrides https://github.com/rubygems/rubygems/commit/0a6c1c53ce --- lib/bundler/source/git.rb | 9 +++++--- spec/bundler/install/gemfile/git_spec.rb | 26 ++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/lib/bundler/source/git.rb b/lib/bundler/source/git.rb index 08a41a59ba66e7..4e94645f6b8ad6 100644 --- a/lib/bundler/source/git.rb +++ b/lib/bundler/source/git.rb @@ -392,9 +392,12 @@ def fetch def validate_spec(_spec); end def load_gemspec(file) - stub = Gem::StubSpecification.gemspec_stub(file, install_path.parent, install_path.parent) - stub.full_gem_path = Pathname.new(file).dirname.expand_path(root).to_s - StubSpecification.from_stub(stub) + dirname = Pathname.new(file).dirname + SharedHelpers.chdir(dirname.to_s) do + stub = Gem::StubSpecification.gemspec_stub(file, install_path.parent, install_path.parent) + stub.full_gem_path = dirname.expand_path(root).to_s + StubSpecification.from_stub(stub) + end end def git_scope diff --git a/spec/bundler/install/gemfile/git_spec.rb b/spec/bundler/install/gemfile/git_spec.rb index a544080fe6c1d3..83b3c06cbe82f2 100644 --- a/spec/bundler/install/gemfile/git_spec.rb +++ b/spec/bundler/install/gemfile/git_spec.rb @@ -836,6 +836,32 @@ expect(the_bundle).to include_gems "rails 2.3.2" end + it "runs the gemspec in the context of its parent directory, when using local overrides" do + build_git "foo", path: lib_path("foo"), gemspec: false do |s| + s.write lib_path("foo/lib/foo/version.rb"), %(FOO_VERSION = '1.0') + s.write "foo.gemspec", <<-G + $:.unshift Dir.pwd + require 'lib/foo/version' + Gem::Specification.new do |s| + s.name = 'foo' + s.author = 'no one' + s.version = FOO_VERSION + s.summary = 'Foo' + s.files = Dir["lib/**/*.rb"] + end + G + end + + gemfile <<-G + source "https://gem.repo1" + gem "foo", :git => "https://github.com/gems/foo", branch: "main" + G + + bundle %(config set local.foo #{lib_path("foo")}) + + expect(the_bundle).to include_gems "foo 1.0" + end + it "installs from git even if a rubygems gem is present" do build_gem "foo", "1.0", path: lib_path("fake_foo"), to_system: true do |s| s.write "lib/foo.rb", "raise 'FAIL'" From a3f589640fd443deea230c27efd6bdfc92f5817f Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Wed, 4 Sep 2024 12:38:30 +0200 Subject: [PATCH 088/829] Time#strftime: grow the buffer faster Use a classic doubling of capacity rather than only adding twice as much capacity as is already known to be needed. ``` compare-ruby: ruby 3.4.0dev (2024-09-04T09:21:53Z opt-strftime-2 ae98d19cf9) +YJIT [arm64-darwin23] built-ruby: ruby 3.4.0dev (2024-09-04T11:46:02Z opt-strftime-growth 586263d6fb) +YJIT [arm64-darwin23] warming up... | |compare-ruby|built-ruby| |:---------------------------|-----------:|---------:| |time.strftime("%FT%T") | 1.754M| 1.889M| | | -| 1.08x| |time.strftime("%FT%T.%3N") | 1.508M| 1.749M| | | -| 1.16x| |time.strftime("%FT%T.%6N") | 1.488M| 1.756M| | | -| 1.18x| compare-ruby: ruby 3.4.0dev (2024-09-04T09:21:53Z opt-strftime-2 ae98d19cf9) +YJIT [arm64-darwin23] built-ruby: ruby 3.4.0dev (2024-09-04T09:21:53Z opt-strftime-2 ae98d19cf9) +YJIT [arm64-darwin23] warming up... ``` --- benchmark/time_strftime.yml | 7 +++++++ strftime.c | 4 +++- 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 benchmark/time_strftime.yml diff --git a/benchmark/time_strftime.yml b/benchmark/time_strftime.yml new file mode 100644 index 00000000000000..28f62aec87a20d --- /dev/null +++ b/benchmark/time_strftime.yml @@ -0,0 +1,7 @@ +prelude: | + # frozen_string_literal: true + time = Time.now +benchmark: + - time.strftime("%FT%T") # 19B + - time.strftime("%FT%T.%3N") # 23B + - time.strftime("%FT%T.%6N") # 26B diff --git a/strftime.c b/strftime.c index 33e7d3fdb8c519..906e8360a98f43 100644 --- a/strftime.c +++ b/strftime.c @@ -171,7 +171,9 @@ resize_buffer(VALUE ftime, char *s, const char **start, const char **endp, ptrdiff_t n, size_t maxsize) { size_t len = s - *start; - size_t nlen = len + n * 2; + size_t need = len + n * 2; + size_t nlen = rb_str_capacity(ftime); + while (nlen < need) nlen <<= 1; if (nlen < len || nlen > maxsize) { return 0; From 5c3a52627f945670dd6929614db56c154ebfe552 Mon Sep 17 00:00:00 2001 From: ydah Date: Wed, 4 Sep 2024 21:54:43 +0900 Subject: [PATCH 089/829] [ruby/prism] containt ==> contains https://github.com/ruby/prism/commit/fa65b66237 --- prism/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/prism/config.yml b/prism/config.yml index b7c673813b46f5..3d496dec3b24bd 100644 --- a/prism/config.yml +++ b/prism/config.yml @@ -2933,7 +2933,7 @@ nodes: a, (b, *) = 1, 2, 3, 4 ^ - If the `*` is omitted, the field will containt an `ImplicitRestNode` + If the `*` is omitted, the field will contains an `ImplicitRestNode` a, (b,) = 1, 2, 3, 4 ^ @@ -3020,7 +3020,7 @@ nodes: a, b, * = 1, 2, 3, 4 ^ - If the `*` is omitted, the field will containt an `ImplicitRestNode` + If the `*` is omitted, the field will contains an `ImplicitRestNode` a, b, = 1, 2, 3, 4 ^ From dbb8f97eaa4c6c7e36c797c7b1d9a803db2623ea Mon Sep 17 00:00:00 2001 From: ydah Date: Wed, 4 Sep 2024 21:55:33 +0900 Subject: [PATCH 090/829] [ruby/prism] essentialy ==> essentially https://github.com/ruby/prism/commit/9c68c01bcd --- lib/prism/parse_result.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/prism/parse_result.rb b/lib/prism/parse_result.rb index c3b4bc88875537..ae026b42ac0447 100644 --- a/lib/prism/parse_result.rb +++ b/lib/prism/parse_result.rb @@ -155,7 +155,7 @@ def code_units_offset(byte_offset, encoding) # Specialized version of `code_units_column` that does not depend on # `code_units_offset`, which is a more expensive operation. This is - # essentialy the same as `Prism::Source#column`. + # essentially the same as `Prism::Source#column`. def code_units_column(byte_offset, encoding) byte_offset - line_start(byte_offset) end From a246188695fd5c27a843f4e56aafeb560d3fb47a Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Wed, 4 Sep 2024 09:03:19 -0400 Subject: [PATCH 091/829] [ruby/prism] Update config.yml https://github.com/ruby/prism/commit/369b2c1304 --- prism/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prism/config.yml b/prism/config.yml index 3d496dec3b24bd..976d0ebf0ca56e 100644 --- a/prism/config.yml +++ b/prism/config.yml @@ -2933,7 +2933,7 @@ nodes: a, (b, *) = 1, 2, 3, 4 ^ - If the `*` is omitted, the field will contains an `ImplicitRestNode` + If the `*` is omitted, this field will contain an `ImplicitRestNode` a, (b,) = 1, 2, 3, 4 ^ From da0460a2e1a4a22368b01647af92a689980f7c24 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Wed, 4 Sep 2024 09:03:22 -0400 Subject: [PATCH 092/829] [ruby/prism] Update config.yml https://github.com/ruby/prism/commit/8a3fa9f46e --- prism/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prism/config.yml b/prism/config.yml index 976d0ebf0ca56e..585d17a4c6c789 100644 --- a/prism/config.yml +++ b/prism/config.yml @@ -3020,7 +3020,7 @@ nodes: a, b, * = 1, 2, 3, 4 ^ - If the `*` is omitted, the field will contains an `ImplicitRestNode` + If the `*` is omitted, this field will contain an `ImplicitRestNode` a, b, = 1, 2, 3, 4 ^ From ae84c017d6c3cb920b5ccdcf733942b79ddf09e9 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Wed, 4 Sep 2024 09:29:18 -0400 Subject: [PATCH 093/829] Remove unused allocatable_pages field in objspace --- gc/default.c | 1 - 1 file changed, 1 deletion(-) diff --git a/gc/default.c b/gc/default.c index 999a960967e316..918a4ffa629efb 100644 --- a/gc/default.c +++ b/gc/default.c @@ -511,7 +511,6 @@ typedef struct rb_objspace { struct { struct heap_page **sorted; size_t allocated_pages; - size_t allocatable_pages; size_t sorted_length; uintptr_t range[2]; size_t freeable_pages; From 2e5a7d768b0b83a8184eb9e2c5a7560de3e5e78a Mon Sep 17 00:00:00 2001 From: Takuya Noguchi Date: Mon, 5 Sep 2022 19:56:30 +0000 Subject: [PATCH 094/829] [rubygems/rubygems] Improve `bundle add` manpage * Fix synopsis for mutually exclusive options. * Add more descriptive examples. Signed-off-by: Takuya Noguchi https://github.com/rubygems/rubygems/commit/c0f1efda69 Co-authored-by: Jerome Dalbert --- lib/bundler/man/bundle-add.1 | 43 ++++++++++++++++---------- lib/bundler/man/bundle-add.1.ronn | 51 ++++++++++++++++++++++--------- lib/bundler/man/bundle-binstubs.1 | 2 +- lib/bundler/man/bundle-cache.1 | 2 +- lib/bundler/man/bundle-check.1 | 2 +- lib/bundler/man/bundle-clean.1 | 2 +- lib/bundler/man/bundle-config.1 | 2 +- lib/bundler/man/bundle-console.1 | 2 +- lib/bundler/man/bundle-doctor.1 | 2 +- lib/bundler/man/bundle-exec.1 | 2 +- lib/bundler/man/bundle-gem.1 | 2 +- lib/bundler/man/bundle-help.1 | 2 +- lib/bundler/man/bundle-info.1 | 2 +- lib/bundler/man/bundle-init.1 | 2 +- lib/bundler/man/bundle-inject.1 | 2 +- lib/bundler/man/bundle-install.1 | 2 +- lib/bundler/man/bundle-list.1 | 2 +- lib/bundler/man/bundle-lock.1 | 2 +- lib/bundler/man/bundle-open.1 | 2 +- lib/bundler/man/bundle-outdated.1 | 2 +- lib/bundler/man/bundle-platform.1 | 2 +- lib/bundler/man/bundle-plugin.1 | 2 +- lib/bundler/man/bundle-pristine.1 | 2 +- lib/bundler/man/bundle-remove.1 | 2 +- lib/bundler/man/bundle-show.1 | 2 +- lib/bundler/man/bundle-update.1 | 2 +- lib/bundler/man/bundle-version.1 | 2 +- lib/bundler/man/bundle-viz.1 | 2 +- lib/bundler/man/bundle.1 | 2 +- lib/bundler/man/gemfile.5 | 2 +- 30 files changed, 92 insertions(+), 58 deletions(-) diff --git a/lib/bundler/man/bundle-add.1 b/lib/bundler/man/bundle-add.1 index ca82383c321542..dae05bd9458701 100644 --- a/lib/bundler/man/bundle-add.1 +++ b/lib/bundler/man/bundle-add.1 @@ -1,24 +1,12 @@ .\" generated with nRonn/v0.11.1 .\" https://github.com/n-ronn/nronn/tree/0.11.1 -.TH "BUNDLE\-ADD" "1" "August 2024" "" +.TH "BUNDLE\-ADD" "1" "September 2024" "" .SH "NAME" \fBbundle\-add\fR \- Add gem to the Gemfile and run bundle install .SH "SYNOPSIS" -\fBbundle add\fR \fIGEM_NAME\fR [\-\-group=GROUP] [\-\-version=VERSION] [\-\-source=SOURCE] [\-\-path=PATH] [\-\-git=GIT] [\-\-github=GITHUB] [\-\-branch=BRANCH] [\-\-ref=REF] [\-\-skip\-install] [\-\-strict] [\-\-optimistic] +\fBbundle add\fR \fIGEM_NAME\fR [\-\-group=GROUP] [\-\-version=VERSION] [\-\-source=SOURCE] [\-\-path=PATH] [\-\-git=GIT|\-\-github=GITHUB] [\-\-branch=BRANCH] [\-\-ref=REF] [\-\-skip\-install] [\-\-strict|\-\-optimistic] .SH "DESCRIPTION" -Adds the named gem to the Gemfile and run \fBbundle install\fR\. \fBbundle install\fR can be avoided by using the flag \fB\-\-skip\-install\fR\. -.P -Example: -.P -bundle add rails -.P -bundle add rails \-\-version "< 3\.0, > 1\.1" -.P -bundle add rails \-\-version "~> 5\.0\.0" \-\-source "https://gems\.example\.com" \-\-group "development" -.P -bundle add rails \-\-skip\-install -.P -bundle add rails \-\-group "development, test" +Adds the named gem to the [\fBGemfile(5)\fR][Gemfile(5)] and run \fBbundle install\fR\. \fBbundle install\fR can be avoided by using the flag \fB\-\-skip\-install\fR\. .SH "OPTIONS" .TP \fB\-\-version\fR, \fB\-v\fR @@ -56,4 +44,27 @@ Adds optimistic declaration of version\. .TP \fB\-\-strict\fR Adds strict declaration of version\. - +.SH "EXAMPLES" +.IP "1." 4 +You can add the \fBrails\fR gem to the Gemfile without any version restriction\. The source of the gem will be the global source\. +.IP +\fBbundle add rails\fR +.IP "2." 4 +You can add the \fBrails\fR gem with version greater than 1\.1 (not including 1\.1) and less than 3\.0\. +.IP +\fBbundle add rails \-\-version "> 1\.1, < 3\.0"\fR +.IP "3." 4 +You can use the \fBhttps://gems\.example\.com\fR custom source and assign the gem to a group\. +.IP +\fBbundle add rails \-\-version "~> 5\.0\.0" \-\-source "https://gems\.example\.com" \-\-group "development"\fR +.IP "4." 4 +The following adds the \fBgem\fR entry to the Gemfile without installing the gem\. You can install gems later via \fBbundle install\fR\. +.IP +\fBbundle add rails \-\-skip\-install\fR +.IP "5." 4 +You can assign the gem to more than one group\. +.IP +\fBbundle add rails \-\-group "development, test"\fR +.IP "" 0 +.SH "SEE ALSO" +Gemfile(5) \fIhttps://bundler\.io/man/gemfile\.5\.html\fR, bundle\-remove(1) \fIbundle\-remove\.1\.html\fR diff --git a/lib/bundler/man/bundle-add.1.ronn b/lib/bundler/man/bundle-add.1.ronn index 37c92e5fcdc70d..8b38c7a2483047 100644 --- a/lib/bundler/man/bundle-add.1.ronn +++ b/lib/bundler/man/bundle-add.1.ronn @@ -1,26 +1,19 @@ bundle-add(1) -- Add gem to the Gemfile and run bundle install -================================================================ +============================================================== ## SYNOPSIS -`bundle add` [--group=GROUP] [--version=VERSION] [--source=SOURCE] [--path=PATH] [--git=GIT] [--github=GITHUB] [--branch=BRANCH] [--ref=REF] [--skip-install] [--strict] [--optimistic] +`bundle add` [--group=GROUP] [--version=VERSION] [--source=SOURCE] + [--path=PATH] [--git=GIT|--github=GITHUB] [--branch=BRANCH] [--ref=REF] + [--skip-install] [--strict|--optimistic] ## DESCRIPTION -Adds the named gem to the Gemfile and run `bundle install`. `bundle install` can be avoided by using the flag `--skip-install`. -Example: - -bundle add rails - -bundle add rails --version "< 3.0, > 1.1" - -bundle add rails --version "~> 5.0.0" --source "https://gems.example.com" --group "development" - -bundle add rails --skip-install - -bundle add rails --group "development, test" +Adds the named gem to the [`Gemfile(5)`][Gemfile(5)] and run `bundle install`. +`bundle install` can be avoided by using the flag `--skip-install`. ## OPTIONS + * `--version`, `-v`: Specify version requirements(s) for the added gem. @@ -56,3 +49,33 @@ bundle add rails --group "development, test" * `--strict`: Adds strict declaration of version. + +## EXAMPLES + +1. You can add the `rails` gem to the Gemfile without any version restriction. + The source of the gem will be the global source. + + `bundle add rails` + +2. You can add the `rails` gem with version greater than 1.1 (not including 1.1) and less than 3.0. + + `bundle add rails --version "> 1.1, < 3.0"` + +3. You can use the `https://gems.example.com` custom source and assign the gem + to a group. + + `bundle add rails --version "~> 5.0.0" --source "https://gems.example.com" --group "development"` + +4. The following adds the `gem` entry to the Gemfile without installing the + gem. You can install gems later via `bundle install`. + + `bundle add rails --skip-install` + +5. You can assign the gem to more than one group. + + `bundle add rails --group "development, test"` + +## SEE ALSO + +[Gemfile(5)](https://bundler.io/man/gemfile.5.html), +[bundle-remove(1)](bundle-remove.1.html) diff --git a/lib/bundler/man/bundle-binstubs.1 b/lib/bundler/man/bundle-binstubs.1 index ab47bf97bb2de6..56c9966e75c1ca 100644 --- a/lib/bundler/man/bundle-binstubs.1 +++ b/lib/bundler/man/bundle-binstubs.1 @@ -1,6 +1,6 @@ .\" generated with nRonn/v0.11.1 .\" https://github.com/n-ronn/nronn/tree/0.11.1 -.TH "BUNDLE\-BINSTUBS" "1" "August 2024" "" +.TH "BUNDLE\-BINSTUBS" "1" "September 2024" "" .SH "NAME" \fBbundle\-binstubs\fR \- Install the binstubs of the listed gems .SH "SYNOPSIS" diff --git a/lib/bundler/man/bundle-cache.1 b/lib/bundler/man/bundle-cache.1 index 981b3c791aa219..d634eef203ee37 100644 --- a/lib/bundler/man/bundle-cache.1 +++ b/lib/bundler/man/bundle-cache.1 @@ -1,6 +1,6 @@ .\" generated with nRonn/v0.11.1 .\" https://github.com/n-ronn/nronn/tree/0.11.1 -.TH "BUNDLE\-CACHE" "1" "August 2024" "" +.TH "BUNDLE\-CACHE" "1" "September 2024" "" .SH "NAME" \fBbundle\-cache\fR \- Package your needed \fB\.gem\fR files into your application .SH "SYNOPSIS" diff --git a/lib/bundler/man/bundle-check.1 b/lib/bundler/man/bundle-check.1 index 5e6f69530c4ce9..e15a41e4fddba4 100644 --- a/lib/bundler/man/bundle-check.1 +++ b/lib/bundler/man/bundle-check.1 @@ -1,6 +1,6 @@ .\" generated with nRonn/v0.11.1 .\" https://github.com/n-ronn/nronn/tree/0.11.1 -.TH "BUNDLE\-CHECK" "1" "August 2024" "" +.TH "BUNDLE\-CHECK" "1" "September 2024" "" .SH "NAME" \fBbundle\-check\fR \- Verifies if dependencies are satisfied by installed gems .SH "SYNOPSIS" diff --git a/lib/bundler/man/bundle-clean.1 b/lib/bundler/man/bundle-clean.1 index 751bcfe9ed58e6..aa5ccf7594fffc 100644 --- a/lib/bundler/man/bundle-clean.1 +++ b/lib/bundler/man/bundle-clean.1 @@ -1,6 +1,6 @@ .\" generated with nRonn/v0.11.1 .\" https://github.com/n-ronn/nronn/tree/0.11.1 -.TH "BUNDLE\-CLEAN" "1" "August 2024" "" +.TH "BUNDLE\-CLEAN" "1" "September 2024" "" .SH "NAME" \fBbundle\-clean\fR \- Cleans up unused gems in your bundler directory .SH "SYNOPSIS" diff --git a/lib/bundler/man/bundle-config.1 b/lib/bundler/man/bundle-config.1 index a81869114d95f6..47104fb5c65b4d 100644 --- a/lib/bundler/man/bundle-config.1 +++ b/lib/bundler/man/bundle-config.1 @@ -1,6 +1,6 @@ .\" generated with nRonn/v0.11.1 .\" https://github.com/n-ronn/nronn/tree/0.11.1 -.TH "BUNDLE\-CONFIG" "1" "August 2024" "" +.TH "BUNDLE\-CONFIG" "1" "September 2024" "" .SH "NAME" \fBbundle\-config\fR \- Set bundler configuration options .SH "SYNOPSIS" diff --git a/lib/bundler/man/bundle-console.1 b/lib/bundler/man/bundle-console.1 index bd998476862df9..f2b2ddaed055bc 100644 --- a/lib/bundler/man/bundle-console.1 +++ b/lib/bundler/man/bundle-console.1 @@ -1,6 +1,6 @@ .\" generated with nRonn/v0.11.1 .\" https://github.com/n-ronn/nronn/tree/0.11.1 -.TH "BUNDLE\-CONSOLE" "1" "August 2024" "" +.TH "BUNDLE\-CONSOLE" "1" "September 2024" "" .SH "NAME" \fBbundle\-console\fR \- Deprecated way to open an IRB session with the bundle pre\-loaded .SH "SYNOPSIS" diff --git a/lib/bundler/man/bundle-doctor.1 b/lib/bundler/man/bundle-doctor.1 index 1d383e2a48f83b..f225d0cd791fbe 100644 --- a/lib/bundler/man/bundle-doctor.1 +++ b/lib/bundler/man/bundle-doctor.1 @@ -1,6 +1,6 @@ .\" generated with nRonn/v0.11.1 .\" https://github.com/n-ronn/nronn/tree/0.11.1 -.TH "BUNDLE\-DOCTOR" "1" "August 2024" "" +.TH "BUNDLE\-DOCTOR" "1" "September 2024" "" .SH "NAME" \fBbundle\-doctor\fR \- Checks the bundle for common problems .SH "SYNOPSIS" diff --git a/lib/bundler/man/bundle-exec.1 b/lib/bundler/man/bundle-exec.1 index 0b1a7316012009..e16b7bc7474b56 100644 --- a/lib/bundler/man/bundle-exec.1 +++ b/lib/bundler/man/bundle-exec.1 @@ -1,6 +1,6 @@ .\" generated with nRonn/v0.11.1 .\" https://github.com/n-ronn/nronn/tree/0.11.1 -.TH "BUNDLE\-EXEC" "1" "August 2024" "" +.TH "BUNDLE\-EXEC" "1" "September 2024" "" .SH "NAME" \fBbundle\-exec\fR \- Execute a command in the context of the bundle .SH "SYNOPSIS" diff --git a/lib/bundler/man/bundle-gem.1 b/lib/bundler/man/bundle-gem.1 index ee3d8e27883907..e6e58cd409382f 100644 --- a/lib/bundler/man/bundle-gem.1 +++ b/lib/bundler/man/bundle-gem.1 @@ -1,6 +1,6 @@ .\" generated with nRonn/v0.11.1 .\" https://github.com/n-ronn/nronn/tree/0.11.1 -.TH "BUNDLE\-GEM" "1" "August 2024" "" +.TH "BUNDLE\-GEM" "1" "September 2024" "" .SH "NAME" \fBbundle\-gem\fR \- Generate a project skeleton for creating a rubygem .SH "SYNOPSIS" diff --git a/lib/bundler/man/bundle-help.1 b/lib/bundler/man/bundle-help.1 index cd28a1ec3a06e3..d7a05f824e972f 100644 --- a/lib/bundler/man/bundle-help.1 +++ b/lib/bundler/man/bundle-help.1 @@ -1,6 +1,6 @@ .\" generated with nRonn/v0.11.1 .\" https://github.com/n-ronn/nronn/tree/0.11.1 -.TH "BUNDLE\-HELP" "1" "August 2024" "" +.TH "BUNDLE\-HELP" "1" "September 2024" "" .SH "NAME" \fBbundle\-help\fR \- Displays detailed help for each subcommand .SH "SYNOPSIS" diff --git a/lib/bundler/man/bundle-info.1 b/lib/bundler/man/bundle-info.1 index ace71632826d8a..6b401a57f42bca 100644 --- a/lib/bundler/man/bundle-info.1 +++ b/lib/bundler/man/bundle-info.1 @@ -1,6 +1,6 @@ .\" generated with nRonn/v0.11.1 .\" https://github.com/n-ronn/nronn/tree/0.11.1 -.TH "BUNDLE\-INFO" "1" "August 2024" "" +.TH "BUNDLE\-INFO" "1" "September 2024" "" .SH "NAME" \fBbundle\-info\fR \- Show information for the given gem in your bundle .SH "SYNOPSIS" diff --git a/lib/bundler/man/bundle-init.1 b/lib/bundler/man/bundle-init.1 index 1a7557f048a224..f2e444c7c283f8 100644 --- a/lib/bundler/man/bundle-init.1 +++ b/lib/bundler/man/bundle-init.1 @@ -1,6 +1,6 @@ .\" generated with nRonn/v0.11.1 .\" https://github.com/n-ronn/nronn/tree/0.11.1 -.TH "BUNDLE\-INIT" "1" "August 2024" "" +.TH "BUNDLE\-INIT" "1" "September 2024" "" .SH "NAME" \fBbundle\-init\fR \- Generates a Gemfile into the current working directory .SH "SYNOPSIS" diff --git a/lib/bundler/man/bundle-inject.1 b/lib/bundler/man/bundle-inject.1 index 9508d97786080d..8eb3633837cf0c 100644 --- a/lib/bundler/man/bundle-inject.1 +++ b/lib/bundler/man/bundle-inject.1 @@ -1,6 +1,6 @@ .\" generated with nRonn/v0.11.1 .\" https://github.com/n-ronn/nronn/tree/0.11.1 -.TH "BUNDLE\-INJECT" "1" "August 2024" "" +.TH "BUNDLE\-INJECT" "1" "September 2024" "" .SH "NAME" \fBbundle\-inject\fR \- Add named gem(s) with version requirements to Gemfile .SH "SYNOPSIS" diff --git a/lib/bundler/man/bundle-install.1 b/lib/bundler/man/bundle-install.1 index 5856a255ac10b3..7539d18f81fd9b 100644 --- a/lib/bundler/man/bundle-install.1 +++ b/lib/bundler/man/bundle-install.1 @@ -1,6 +1,6 @@ .\" generated with nRonn/v0.11.1 .\" https://github.com/n-ronn/nronn/tree/0.11.1 -.TH "BUNDLE\-INSTALL" "1" "August 2024" "" +.TH "BUNDLE\-INSTALL" "1" "September 2024" "" .SH "NAME" \fBbundle\-install\fR \- Install the dependencies specified in your Gemfile .SH "SYNOPSIS" diff --git a/lib/bundler/man/bundle-list.1 b/lib/bundler/man/bundle-list.1 index 081014bba8cae6..5cbb1c3cfe6215 100644 --- a/lib/bundler/man/bundle-list.1 +++ b/lib/bundler/man/bundle-list.1 @@ -1,6 +1,6 @@ .\" generated with nRonn/v0.11.1 .\" https://github.com/n-ronn/nronn/tree/0.11.1 -.TH "BUNDLE\-LIST" "1" "August 2024" "" +.TH "BUNDLE\-LIST" "1" "September 2024" "" .SH "NAME" \fBbundle\-list\fR \- List all the gems in the bundle .SH "SYNOPSIS" diff --git a/lib/bundler/man/bundle-lock.1 b/lib/bundler/man/bundle-lock.1 index dc7ac86bc71d31..5f0d43a9aa9041 100644 --- a/lib/bundler/man/bundle-lock.1 +++ b/lib/bundler/man/bundle-lock.1 @@ -1,6 +1,6 @@ .\" generated with nRonn/v0.11.1 .\" https://github.com/n-ronn/nronn/tree/0.11.1 -.TH "BUNDLE\-LOCK" "1" "August 2024" "" +.TH "BUNDLE\-LOCK" "1" "September 2024" "" .SH "NAME" \fBbundle\-lock\fR \- Creates / Updates a lockfile without installing .SH "SYNOPSIS" diff --git a/lib/bundler/man/bundle-open.1 b/lib/bundler/man/bundle-open.1 index 9a3eba09d815c4..fb5ff1fee71cb3 100644 --- a/lib/bundler/man/bundle-open.1 +++ b/lib/bundler/man/bundle-open.1 @@ -1,6 +1,6 @@ .\" generated with nRonn/v0.11.1 .\" https://github.com/n-ronn/nronn/tree/0.11.1 -.TH "BUNDLE\-OPEN" "1" "August 2024" "" +.TH "BUNDLE\-OPEN" "1" "September 2024" "" .SH "NAME" \fBbundle\-open\fR \- Opens the source directory for a gem in your bundle .SH "SYNOPSIS" diff --git a/lib/bundler/man/bundle-outdated.1 b/lib/bundler/man/bundle-outdated.1 index 85865f52c96466..ea3005dd87d829 100644 --- a/lib/bundler/man/bundle-outdated.1 +++ b/lib/bundler/man/bundle-outdated.1 @@ -1,6 +1,6 @@ .\" generated with nRonn/v0.11.1 .\" https://github.com/n-ronn/nronn/tree/0.11.1 -.TH "BUNDLE\-OUTDATED" "1" "August 2024" "" +.TH "BUNDLE\-OUTDATED" "1" "September 2024" "" .SH "NAME" \fBbundle\-outdated\fR \- List installed gems with newer versions available .SH "SYNOPSIS" diff --git a/lib/bundler/man/bundle-platform.1 b/lib/bundler/man/bundle-platform.1 index 52c657fd99157b..c3058175fc8d75 100644 --- a/lib/bundler/man/bundle-platform.1 +++ b/lib/bundler/man/bundle-platform.1 @@ -1,6 +1,6 @@ .\" generated with nRonn/v0.11.1 .\" https://github.com/n-ronn/nronn/tree/0.11.1 -.TH "BUNDLE\-PLATFORM" "1" "August 2024" "" +.TH "BUNDLE\-PLATFORM" "1" "September 2024" "" .SH "NAME" \fBbundle\-platform\fR \- Displays platform compatibility information .SH "SYNOPSIS" diff --git a/lib/bundler/man/bundle-plugin.1 b/lib/bundler/man/bundle-plugin.1 index 07b85c4d1862ab..34437d99739e19 100644 --- a/lib/bundler/man/bundle-plugin.1 +++ b/lib/bundler/man/bundle-plugin.1 @@ -1,6 +1,6 @@ .\" generated with nRonn/v0.11.1 .\" https://github.com/n-ronn/nronn/tree/0.11.1 -.TH "BUNDLE\-PLUGIN" "1" "August 2024" "" +.TH "BUNDLE\-PLUGIN" "1" "September 2024" "" .SH "NAME" \fBbundle\-plugin\fR \- Manage Bundler plugins .SH "SYNOPSIS" diff --git a/lib/bundler/man/bundle-pristine.1 b/lib/bundler/man/bundle-pristine.1 index 255585cb7e2a74..103c6f68ae040b 100644 --- a/lib/bundler/man/bundle-pristine.1 +++ b/lib/bundler/man/bundle-pristine.1 @@ -1,6 +1,6 @@ .\" generated with nRonn/v0.11.1 .\" https://github.com/n-ronn/nronn/tree/0.11.1 -.TH "BUNDLE\-PRISTINE" "1" "August 2024" "" +.TH "BUNDLE\-PRISTINE" "1" "September 2024" "" .SH "NAME" \fBbundle\-pristine\fR \- Restores installed gems to their pristine condition .SH "SYNOPSIS" diff --git a/lib/bundler/man/bundle-remove.1 b/lib/bundler/man/bundle-remove.1 index 082617a29e6317..4a2ed4eb132007 100644 --- a/lib/bundler/man/bundle-remove.1 +++ b/lib/bundler/man/bundle-remove.1 @@ -1,6 +1,6 @@ .\" generated with nRonn/v0.11.1 .\" https://github.com/n-ronn/nronn/tree/0.11.1 -.TH "BUNDLE\-REMOVE" "1" "August 2024" "" +.TH "BUNDLE\-REMOVE" "1" "September 2024" "" .SH "NAME" \fBbundle\-remove\fR \- Removes gems from the Gemfile .SH "SYNOPSIS" diff --git a/lib/bundler/man/bundle-show.1 b/lib/bundler/man/bundle-show.1 index 95335f6b360ac5..dfbb43921855b3 100644 --- a/lib/bundler/man/bundle-show.1 +++ b/lib/bundler/man/bundle-show.1 @@ -1,6 +1,6 @@ .\" generated with nRonn/v0.11.1 .\" https://github.com/n-ronn/nronn/tree/0.11.1 -.TH "BUNDLE\-SHOW" "1" "August 2024" "" +.TH "BUNDLE\-SHOW" "1" "September 2024" "" .SH "NAME" \fBbundle\-show\fR \- Shows all the gems in your bundle, or the path to a gem .SH "SYNOPSIS" diff --git a/lib/bundler/man/bundle-update.1 b/lib/bundler/man/bundle-update.1 index 355b0b40d6d102..5eb9514f03e82c 100644 --- a/lib/bundler/man/bundle-update.1 +++ b/lib/bundler/man/bundle-update.1 @@ -1,6 +1,6 @@ .\" generated with nRonn/v0.11.1 .\" https://github.com/n-ronn/nronn/tree/0.11.1 -.TH "BUNDLE\-UPDATE" "1" "August 2024" "" +.TH "BUNDLE\-UPDATE" "1" "September 2024" "" .SH "NAME" \fBbundle\-update\fR \- Update your gems to the latest available versions .SH "SYNOPSIS" diff --git a/lib/bundler/man/bundle-version.1 b/lib/bundler/man/bundle-version.1 index 565148b8e7b2ed..a29858181a8ba9 100644 --- a/lib/bundler/man/bundle-version.1 +++ b/lib/bundler/man/bundle-version.1 @@ -1,6 +1,6 @@ .\" generated with nRonn/v0.11.1 .\" https://github.com/n-ronn/nronn/tree/0.11.1 -.TH "BUNDLE\-VERSION" "1" "August 2024" "" +.TH "BUNDLE\-VERSION" "1" "September 2024" "" .SH "NAME" \fBbundle\-version\fR \- Prints Bundler version information .SH "SYNOPSIS" diff --git a/lib/bundler/man/bundle-viz.1 b/lib/bundler/man/bundle-viz.1 index 34f5abddde401e..9609e098dd85d5 100644 --- a/lib/bundler/man/bundle-viz.1 +++ b/lib/bundler/man/bundle-viz.1 @@ -1,6 +1,6 @@ .\" generated with nRonn/v0.11.1 .\" https://github.com/n-ronn/nronn/tree/0.11.1 -.TH "BUNDLE\-VIZ" "1" "August 2024" "" +.TH "BUNDLE\-VIZ" "1" "September 2024" "" .SH "NAME" \fBbundle\-viz\fR \- Generates a visual dependency graph for your Gemfile .SH "SYNOPSIS" diff --git a/lib/bundler/man/bundle.1 b/lib/bundler/man/bundle.1 index 19a704ca52c77b..d84d788748a348 100644 --- a/lib/bundler/man/bundle.1 +++ b/lib/bundler/man/bundle.1 @@ -1,6 +1,6 @@ .\" generated with nRonn/v0.11.1 .\" https://github.com/n-ronn/nronn/tree/0.11.1 -.TH "BUNDLE" "1" "August 2024" "" +.TH "BUNDLE" "1" "September 2024" "" .SH "NAME" \fBbundle\fR \- Ruby Dependency Management .SH "SYNOPSIS" diff --git a/lib/bundler/man/gemfile.5 b/lib/bundler/man/gemfile.5 index d503abc9d17fdb..f24a1c540d904e 100644 --- a/lib/bundler/man/gemfile.5 +++ b/lib/bundler/man/gemfile.5 @@ -1,6 +1,6 @@ .\" generated with nRonn/v0.11.1 .\" https://github.com/n-ronn/nronn/tree/0.11.1 -.TH "GEMFILE" "5" "August 2024" "" +.TH "GEMFILE" "5" "September 2024" "" .SH "NAME" \fBGemfile\fR \- A format for describing gem dependencies for Ruby programs .SH "SYNOPSIS" From 294dad22d7ac5f307d567cff897507b9fd9d05e9 Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Wed, 4 Sep 2024 12:52:18 +0200 Subject: [PATCH 095/829] Time#strftime: avoid repeated coderange scanning Followup: a3f589640fd443deea230c27efd6bdfc92f5817f Restarting scanning has a fixed cost. Since we build a string from many small parts, that causes the scan to restart many times. It's much faster to ignore the coderange, if it's needed later it will be faster to scan it in one go. ``` compare-ruby: ruby 3.4.0dev (2024-09-04T11:54:06Z opt-strftime-growth 149480f0ff) +YJIT [arm64-darwin23] built-ruby: ruby 3.4.0dev (2024-09-04T11:55:26Z opt-strftime-coder.. 29a5153cba) +YJIT [arm64-darwin23] warming up... | |compare-ruby|built-ruby| |:---------------------------|-----------:|---------:| |time.strftime("%FT%T") | 1.870M| 2.225M| | | -| 1.19x| |time.strftime("%FT%T.%3N") | 1.731M| 2.068M| | | -| 1.19x| |time.strftime("%FT%T.%6N") | 1.744M| 2.073M| | | -| 1.19x| ``` Cumulative with a3f589640fd443deea230c27efd6bdfc92f5817f: ``` compare-ruby: ruby 3.4.0dev (2024-09-04T11:55:26Z opt-strftime-coder.. 29a5153cba) +YJIT [arm64-darwin23] built-ruby: ruby 3.4.0dev (2024-09-04T12:57:30Z opt-strftime-coder.. 2b938d667a) +YJIT [arm64-darwin23] warming up... | |compare-ruby|built-ruby| |:---------------------------|-----------:|---------:| |time.strftime("%FT%T") | 1.784M| 2.277M| | | -| 1.28x| |time.strftime("%FT%T.%3N") | 1.504M| 2.056M| | | -| 1.37x| |time.strftime("%FT%T.%6N") | 1.489M| 2.094M| | | -| 1.41x| ``` --- sprintf.c | 4 +++- strftime.c | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/sprintf.c b/sprintf.c index 4fa531d53e6659..1d3b3e0d07a36b 100644 --- a/sprintf.c +++ b/sprintf.c @@ -1165,7 +1165,9 @@ ruby_vsprintf0(VALUE result, char *p, const char *fmt, va_list ap) RBASIC_SET_CLASS_RAW(result, klass); p = RSTRING_PTR(result); long blen = (char *)f._p - p; - if (scanned < blen) { + + coderange = ENC_CODERANGE(result); + if (coderange != ENC_CODERANGE_UNKNOWN && scanned < blen) { rb_str_coderange_scan_restartable(p + scanned, p + blen, rb_enc_get(result), &coderange); ENC_CODERANGE_SET(result, coderange); } diff --git a/strftime.c b/strftime.c index 906e8360a98f43..edaa9f02ced73c 100644 --- a/strftime.c +++ b/strftime.c @@ -932,6 +932,7 @@ rb_strftime(const char *format, size_t format_len, rb_encoding *enc, VALUE time, const struct vtm *vtm, VALUE timev, int gmt) { VALUE result = rb_enc_str_new(0, 0, enc); + ENC_CODERANGE_CLEAR(result); return rb_strftime_with_timespec(result, format, format_len, enc, time, vtm, timev, NULL, gmt, strftime_size_limit(format_len)); @@ -942,6 +943,7 @@ rb_strftime_timespec(const char *format, size_t format_len, rb_encoding *enc, VALUE time, const struct vtm *vtm, struct timespec *ts, int gmt) { VALUE result = rb_enc_str_new(0, 0, enc); + ENC_CODERANGE_CLEAR(result); return rb_strftime_with_timespec(result, format, format_len, enc, time, vtm, Qnil, ts, gmt, strftime_size_limit(format_len)); From 32680f543c6fc515870d4f5c6829607dc67d59ef Mon Sep 17 00:00:00 2001 From: ydah Date: Thu, 5 Sep 2024 11:07:13 +0900 Subject: [PATCH 096/829] Implement AND/OR NODE operator locations --- ast.c | 8 ++++++++ node_dump.c | 3 ++- parse.y | 22 ++++++++++++---------- rubyparser.h | 1 + test/ruby/test_ast.rb | 16 ++++++++++++++++ 5 files changed, 39 insertions(+), 11 deletions(-) diff --git a/ast.c b/ast.c index 12366dd432f7b4..67d121e1ce6c1c 100644 --- a/ast.c +++ b/ast.c @@ -779,6 +779,14 @@ node_locations(VALUE ast_value, const NODE *node) return rb_ary_new_from_args(2, location_new(nd_code_loc(node)), location_new(&RNODE_ALIAS(node)->keyword_loc)); + case NODE_AND: + return rb_ary_new_from_args(2, + location_new(nd_code_loc(node)), + location_new(&RNODE_AND(node)->operator_loc)); + case NODE_OR: + return rb_ary_new_from_args(2, + location_new(nd_code_loc(node)), + location_new(&RNODE_OR(node)->operator_loc)); case NODE_UNDEF: return rb_ary_new_from_args(2, location_new(nd_code_loc(node)), diff --git a/node_dump.c b/node_dump.c index 54a4eb0e64441a..ae948eb66eca0d 100644 --- a/node_dump.c +++ b/node_dump.c @@ -431,8 +431,9 @@ dump_node(VALUE buf, VALUE indent, int comment, const NODE * node) break; node = RNODE_AND(node)->nd_2nd; } - LAST_NODE; F_NODE(nd_2nd, RNODE_AND, "right expr"); + LAST_NODE; + F_LOC(operator_loc, RNODE_AND); return; case NODE_MASGN: diff --git a/parse.y b/parse.y index 6ebd60844adc51..42396094be2686 100644 --- a/parse.y +++ b/parse.y @@ -1078,8 +1078,8 @@ static rb_node_begin_t *rb_node_begin_new(struct parser_params *p, NODE *nd_body static rb_node_rescue_t *rb_node_rescue_new(struct parser_params *p, NODE *nd_head, NODE *nd_resq, NODE *nd_else, const YYLTYPE *loc); static rb_node_resbody_t *rb_node_resbody_new(struct parser_params *p, NODE *nd_args, NODE *nd_exc_var, NODE *nd_body, NODE *nd_next, const YYLTYPE *loc); static rb_node_ensure_t *rb_node_ensure_new(struct parser_params *p, NODE *nd_head, NODE *nd_ensr, const YYLTYPE *loc); -static rb_node_and_t *rb_node_and_new(struct parser_params *p, NODE *nd_1st, NODE *nd_2nd, const YYLTYPE *loc); -static rb_node_or_t *rb_node_or_new(struct parser_params *p, NODE *nd_1st, NODE *nd_2nd, const YYLTYPE *loc); +static rb_node_and_t *rb_node_and_new(struct parser_params *p, NODE *nd_1st, NODE *nd_2nd, const YYLTYPE *loc, const YYLTYPE *operator_loc); +static rb_node_or_t *rb_node_or_new(struct parser_params *p, NODE *nd_1st, NODE *nd_2nd, const YYLTYPE *loc, const YYLTYPE *operator_loc); static rb_node_masgn_t *rb_node_masgn_new(struct parser_params *p, NODE *nd_head, NODE *nd_args, const YYLTYPE *loc); static rb_node_lasgn_t *rb_node_lasgn_new(struct parser_params *p, ID nd_vid, NODE *nd_value, const YYLTYPE *loc); static rb_node_dasgn_t *rb_node_dasgn_new(struct parser_params *p, ID nd_vid, NODE *nd_value, const YYLTYPE *loc); @@ -1186,8 +1186,8 @@ static rb_node_error_t *rb_node_error_new(struct parser_params *p, const YYLTYPE #define NEW_RESCUE(b,res,e,loc) (NODE *)rb_node_rescue_new(p,b,res,e,loc) #define NEW_RESBODY(a,v,ex,n,loc) (NODE *)rb_node_resbody_new(p,a,v,ex,n,loc) #define NEW_ENSURE(b,en,loc) (NODE *)rb_node_ensure_new(p,b,en,loc) -#define NEW_AND(f,s,loc) (NODE *)rb_node_and_new(p,f,s,loc) -#define NEW_OR(f,s,loc) (NODE *)rb_node_or_new(p,f,s,loc) +#define NEW_AND(f,s,loc,op_loc) (NODE *)rb_node_and_new(p,f,s,loc,op_loc) +#define NEW_OR(f,s,loc,op_loc) (NODE *)rb_node_or_new(p,f,s,loc,op_loc) #define NEW_MASGN(l,r,loc) rb_node_masgn_new(p,l,r,loc) #define NEW_LASGN(v,val,loc) (NODE *)rb_node_lasgn_new(p,v,val,loc) #define NEW_DASGN(v,val,loc) (NODE *)rb_node_dasgn_new(p,v,val,loc) @@ -5544,7 +5544,7 @@ p_as : p_expr tASSOC p_variable p_alt : p_alt '|' p_expr_basic { - $$ = NEW_OR($1, $3, &@$); + $$ = NEW_OR($1, $3, &@$, &@2); /*% ripper: binary!($:1, ID2VAL(idOr), $:3) %*/ } | p_expr_basic @@ -11489,21 +11489,23 @@ rb_node_ensure_new(struct parser_params *p, NODE *nd_head, NODE *nd_ensr, const } static rb_node_and_t * -rb_node_and_new(struct parser_params *p, NODE *nd_1st, NODE *nd_2nd, const YYLTYPE *loc) +rb_node_and_new(struct parser_params *p, NODE *nd_1st, NODE *nd_2nd, const YYLTYPE *loc, const YYLTYPE *operator_loc) { rb_node_and_t *n = NODE_NEWNODE(NODE_AND, rb_node_and_t, loc); n->nd_1st = nd_1st; n->nd_2nd = nd_2nd; + n->operator_loc = *operator_loc; return n; } static rb_node_or_t * -rb_node_or_new(struct parser_params *p, NODE *nd_1st, NODE *nd_2nd, const YYLTYPE *loc) +rb_node_or_new(struct parser_params *p, NODE *nd_1st, NODE *nd_2nd, const YYLTYPE *loc, const YYLTYPE *operator_loc) { rb_node_or_t *n = NODE_NEWNODE(NODE_OR, rb_node_or_t, loc); n->nd_1st = nd_1st; n->nd_2nd = nd_2nd; + n->operator_loc = *operator_loc; return n; } @@ -14340,7 +14342,7 @@ new_unless(struct parser_params *p, NODE *cc, NODE *left, NODE *right, const YYL return newline_node(NEW_UNLESS(cc, left, right, loc, keyword_loc, then_keyword_loc, end_keyword_loc)); } -#define NEW_AND_OR(type, f, s, loc) (type == NODE_AND ? NEW_AND(f,s,loc) : NEW_OR(f,s,loc)) +#define NEW_AND_OR(type, f, s, loc, op_loc) (type == NODE_AND ? NEW_AND(f,s,loc,op_loc) : NEW_OR(f,s,loc,op_loc)) static NODE* logop(struct parser_params *p, ID id, NODE *left, NODE *right, @@ -14354,12 +14356,12 @@ logop(struct parser_params *p, ID id, NODE *left, NODE *right, while ((second = RNODE_AND(node)->nd_2nd) != 0 && nd_type_p(second, type)) { node = second; } - RNODE_AND(node)->nd_2nd = NEW_AND_OR(type, second, right, loc); + RNODE_AND(node)->nd_2nd = NEW_AND_OR(type, second, right, loc, op_loc); nd_set_line(RNODE_AND(node)->nd_2nd, op_loc->beg_pos.lineno); left->nd_loc.end_pos = loc->end_pos; return left; } - op = NEW_AND_OR(type, left, right, loc); + op = NEW_AND_OR(type, left, right, loc, op_loc); nd_set_line(op, op_loc->beg_pos.lineno); return op; } diff --git a/rubyparser.h b/rubyparser.h index 5383c31f03b330..1a1a1d2b07a9c4 100644 --- a/rubyparser.h +++ b/rubyparser.h @@ -382,6 +382,7 @@ typedef struct { struct RNode *nd_1st; struct RNode *nd_2nd; + rb_code_location_t operator_loc; } rb_node_and_t, rb_node_or_t; typedef struct RNode_MASGN { diff --git a/test/ruby/test_ast.rb b/test/ruby/test_ast.rb index d1422fc2c0d6fc..f03a323ccf24eb 100644 --- a/test/ruby/test_ast.rb +++ b/test/ruby/test_ast.rb @@ -1335,6 +1335,22 @@ def test_alias_locations assert_locations(node.children[-1].locations, [[1, 0, 1, 13], [1, 0, 1, 5]]) end + def test_and_locations + node = RubyVM::AbstractSyntaxTree.parse("1 and 2") + assert_locations(node.children[-1].locations, [[1, 0, 1, 7], [1, 2, 1, 5]]) + + node = RubyVM::AbstractSyntaxTree.parse("1 && 2") + assert_locations(node.children[-1].locations, [[1, 0, 1, 6], [1, 2, 1, 4]]) + end + + def test_or_locations + node = RubyVM::AbstractSyntaxTree.parse("1 or 2") + assert_locations(node.children[-1].locations, [[1, 0, 1, 6], [1, 2, 1, 4]]) + + node = RubyVM::AbstractSyntaxTree.parse("1 || 2") + assert_locations(node.children[-1].locations, [[1, 0, 1, 6], [1, 2, 1, 4]]) + end + def test_unless_locations node = RubyVM::AbstractSyntaxTree.parse("unless cond then 1 else 2 end") assert_locations(node.children[-1].locations, [[1, 0, 1, 29], [1, 0, 1, 6], [1, 12, 1, 16], [1, 26, 1, 29]]) From 630bfd36f9a10c74da1084493ea806d3c706eeba Mon Sep 17 00:00:00 2001 From: git Date: Thu, 5 Sep 2024 07:01:45 +0000 Subject: [PATCH 097/829] Update bundled gems list as of 2024-09-04 --- NEWS.md | 2 +- gems/bundled_gems | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/NEWS.md b/NEWS.md index 235aeb0b72d0ee..9af65809ee7f78 100644 --- a/NEWS.md +++ b/NEWS.md @@ -95,7 +95,7 @@ The following bundled gems are updated. * rexml 3.3.7 * rss 0.3.1 * net-ftp 0.3.7 -* net-imap 0.4.15 +* net-imap 0.4.16 * net-smtp 0.5.0 * rbs 3.5.3 * typeprof 0.21.11 diff --git a/gems/bundled_gems b/gems/bundled_gems index 0e82d9e2fd5a39..18661d260de736 100644 --- a/gems/bundled_gems +++ b/gems/bundled_gems @@ -13,7 +13,7 @@ test-unit 3.6.2 https://github.com/test-unit/test-unit rexml 3.3.7 https://github.com/ruby/rexml rss 0.3.1 https://github.com/ruby/rss net-ftp 0.3.7 https://github.com/ruby/net-ftp -net-imap 0.4.15 https://github.com/ruby/net-imap +net-imap 0.4.16 https://github.com/ruby/net-imap net-pop 0.1.2 https://github.com/ruby/net-pop net-smtp 0.5.0 https://github.com/ruby/net-smtp matrix 0.4.2 https://github.com/ruby/matrix From 08e142b209a4919aac527bb0ce174a0ca0333d5c Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Wed, 4 Sep 2024 11:44:12 +0900 Subject: [PATCH 098/829] Refactor `getlogin` and `getpw*` functions - Extract functions to check not-found conditions - Set the length to the result of `rb_getlogin` - Reentrant versions return an error numeber but not `errno` - Check maybe-undefined macros with `defined` --- process.c | 102 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 59 insertions(+), 43 deletions(-) diff --git a/process.c b/process.c index 09b0cc8d1776f4..acb5b661567095 100644 --- a/process.c +++ b/process.c @@ -5700,6 +5700,12 @@ check_gid_switch(void) #if defined(HAVE_PWD_H) +static inline bool +login_not_found(int err) +{ + return (err == ENOTTY || err == ENXIO || err == ENOENT); +} + /** * Best-effort attempt to obtain the name of the login user, if any, * associated with the process. Processes not descended from login(1) (or @@ -5708,18 +5714,18 @@ check_gid_switch(void) VALUE rb_getlogin(void) { -#if ( !defined(USE_GETLOGIN_R) && !defined(USE_GETLOGIN) ) +# if !defined(USE_GETLOGIN_R) && !defined(USE_GETLOGIN) return Qnil; -#else +# else char MAYBE_UNUSED(*login) = NULL; # ifdef USE_GETLOGIN_R -#if defined(__FreeBSD__) +# if defined(__FreeBSD__) typedef int getlogin_r_size_t; -#else +# else typedef size_t getlogin_r_size_t; -#endif +# endif long loginsize = GETLOGIN_R_SIZE_INIT; /* maybe -1 */ @@ -5733,10 +5739,8 @@ rb_getlogin(void) rb_str_set_len(maybe_result, loginsize); int gle; - errno = 0; while ((gle = getlogin_r(login, (getlogin_r_size_t)loginsize)) != 0) { - - if (gle == ENOTTY || gle == ENXIO || gle == ENOENT) { + if (login_not_found(gle)) { rb_str_resize(maybe_result, 0); return Qnil; } @@ -5756,17 +5760,19 @@ rb_getlogin(void) return Qnil; } + rb_str_set_len(maybe_result, strlen(login)); return maybe_result; -# elif USE_GETLOGIN +# elif defined(USE_GETLOGIN) errno = 0; login = getlogin(); - if (errno) { - if (errno == ENOTTY || errno == ENXIO || errno == ENOENT) { + int err = errno; + if (err) { + if (login_not_found(err)) { return Qnil; } - rb_syserr_fail(errno, "getlogin"); + rb_syserr_fail(err, "getlogin"); } return login ? rb_str_new_cstr(login) : Qnil; @@ -5775,10 +5781,26 @@ rb_getlogin(void) #endif } +/* avoid treating as errors errno values that indicate "not found" */ +static inline bool +pwd_not_found(int err) +{ + switch (err) { + case 0: + case ENOENT: + case ESRCH: + case EBADF: + case EPERM: + return true; + default: + return false; + } +} + VALUE rb_getpwdirnam_for_login(VALUE login_name) { -#if ( !defined(USE_GETPWNAM_R) && !defined(USE_GETPWNAM) ) +#if !defined(USE_GETPWNAM_R) && !defined(USE_GETPWNAM) return Qnil; #else @@ -5787,7 +5809,7 @@ rb_getpwdirnam_for_login(VALUE login_name) return Qnil; } - char *login = RSTRING_PTR(login_name); + const char *login = RSTRING_PTR(login_name); struct passwd *pwptr; @@ -5807,11 +5829,8 @@ rb_getpwdirnam_for_login(VALUE login_name) rb_str_set_len(getpwnm_tmp, bufsizenm); int enm; - errno = 0; while ((enm = getpwnam_r(login, &pwdnm, bufnm, bufsizenm, &pwptr)) != 0) { - - if (enm == ENOENT || enm== ESRCH || enm == EBADF || enm == EPERM) { - /* not found; non-errors */ + if (pwd_not_found(enm)) { rb_str_resize(getpwnm_tmp, 0); return Qnil; } @@ -5837,21 +5856,21 @@ rb_getpwdirnam_for_login(VALUE login_name) rb_str_resize(getpwnm_tmp, 0); return result; -# elif USE_GETPWNAM +# elif defined(USE_GETPWNAM) errno = 0; - pwptr = getpwnam(login); - if (pwptr) { - /* found it */ - return rb_str_new_cstr(pwptr->pw_dir); - } - if (errno - /* avoid treating as errors errno values that indicate "not found" */ - && ( errno != ENOENT && errno != ESRCH && errno != EBADF && errno != EPERM)) { - rb_syserr_fail(errno, "getpwnam"); + if (!(pwptr = getpwnam(login))) { + int err = errno; + + if (pwd_not_found(err)) { + return Qnil; + } + + rb_syserr_fail(err, "getpwnam"); } - return Qnil; /* not found */ + /* found it */ + return rb_str_new_cstr(pwptr->pw_dir); # endif #endif @@ -5887,11 +5906,8 @@ rb_getpwdiruid(void) rb_str_set_len(getpwid_tmp, bufsizeid); int eid; - errno = 0; while ((eid = getpwuid_r(ruid, &pwdid, bufid, bufsizeid, &pwptr)) != 0) { - - if (eid == ENOENT || eid== ESRCH || eid == EBADF || eid == EPERM) { - /* not found; non-errors */ + if (pwd_not_found(eid)) { rb_str_resize(getpwid_tmp, 0); return Qnil; } @@ -5920,18 +5936,18 @@ rb_getpwdiruid(void) # elif defined(USE_GETPWUID) errno = 0; - pwptr = getpwuid(ruid); - if (pwptr) { - /* found it */ - return rb_str_new_cstr(pwptr->pw_dir); - } - if (errno - /* avoid treating as errors errno values that indicate "not found" */ - && ( errno == ENOENT || errno == ESRCH || errno == EBADF || errno == EPERM)) { - rb_syserr_fail(errno, "getpwuid"); + if (!(pwptr = getpwuid(ruid))) { + int err = errno; + + if (pwd_not_found(err)) { + return Qnil; + } + + rb_syserr_fail(err, "getpwuid"); } - return Qnil; /* not found */ + /* found it */ + return rb_str_new_cstr(pwptr->pw_dir); # endif #endif /* !defined(USE_GETPWUID_R) && !defined(USE_GETPWUID) */ From 2e5680d304a9cf9a6a2ba582091af6719e839351 Mon Sep 17 00:00:00 2001 From: Jun Aruga Date: Fri, 26 Jul 2024 16:57:39 +0200 Subject: [PATCH 099/829] [ruby/openssl] Fix test_pkey_rsa.rb in FIPS. * test_sign_verify I created the signature text (`signature_encoded.txt`), that is used as a text to create the `signature0` in the `test_sign_verify` by the following steps with the `openssl` CLI on FIPS module. ``` $ OPENSSL_DIR="${HOME}/.local/openssl-3.4.0-dev-fips-debug-3c6e114959" $ export OPENSSL_CONF="${OPENSSL_DIR}/ssl/openssl_fips.cnf" $ echo -n "Sign me!" > data.txt $ "${OPENSSL_DIR}/bin/openssl" dgst -sha256 -sign test/openssl/fixtures/pkey/rsa2048.pem data.txt > signature.txt $ cat signature.txt | base64 > signature_encoded.txt ``` https://github.com/ruby/openssl/commit/091f3eb421 --- test/openssl/test_pkey_rsa.rb | 247 +++++++++++++++++++++------------- 1 file changed, 152 insertions(+), 95 deletions(-) diff --git a/test/openssl/test_pkey_rsa.rb b/test/openssl/test_pkey_rsa.rb index 61c55c60b255d0..02693c277bd262 100644 --- a/test/openssl/test_pkey_rsa.rb +++ b/test/openssl/test_pkey_rsa.rb @@ -14,9 +14,7 @@ def test_no_private_exp end if !openssl?(3, 0, 0) # Impossible state in OpenSSL 3.0 def test_private - # Generated by key size and public exponent - key = OpenSSL::PKey::RSA.new(512, 3) - assert(key.private?) + key = Fixtures.pkey("rsa2048") # Generated by DER key2 = OpenSSL::PKey::RSA.new(key.to_der) @@ -46,55 +44,66 @@ def test_private end def test_new - key = OpenSSL::PKey::RSA.new(512) - assert_equal 512, key.n.num_bits + key = OpenSSL::PKey::RSA.new(2048) + assert_equal 2048, key.n.num_bits assert_equal 65537, key.e assert_not_nil key.d + assert(key.private?) + end + + def test_new_public_exponent + # At least 2024-bits RSA key are required in FIPS. + omit_on_fips # Specify public exponent - key2 = OpenSSL::PKey::RSA.new(512, 3) - assert_equal 512, key2.n.num_bits - assert_equal 3, key2.e - assert_not_nil key2.d + key = OpenSSL::PKey::RSA.new(512, 3) + assert_equal 512, key.n.num_bits + assert_equal 3, key.e end def test_s_generate - key1 = OpenSSL::PKey::RSA.generate(512) - assert_equal 512, key1.n.num_bits + key1 = OpenSSL::PKey::RSA.generate(2048) + assert_equal 2048, key1.n.num_bits assert_equal 65537, key1.e + end + + def test_s_generate_public_exponent + # At least 2024-bits RSA key are required in FIPS. + omit_on_fips # Specify public exponent - key2 = OpenSSL::PKey::RSA.generate(512, 3) - assert_equal 512, key2.n.num_bits - assert_equal 3, key2.e - assert_not_nil key2.d + key = OpenSSL::PKey::RSA.generate(512, 3) + assert_equal 512, key.n.num_bits + assert_equal 3, key.e end def test_new_break - assert_nil(OpenSSL::PKey::RSA.new(1024) { break }) + assert_nil(OpenSSL::PKey::RSA.new(2048) { break }) assert_raise(RuntimeError) do - OpenSSL::PKey::RSA.new(1024) { raise } + OpenSSL::PKey::RSA.new(2048) { raise } end end def test_sign_verify - rsa1024 = Fixtures.pkey("rsa1024") + rsa = Fixtures.pkey("rsa2048") data = "Sign me!" - signature = rsa1024.sign("SHA256", data) - assert_equal true, rsa1024.verify("SHA256", signature, data) + signature = rsa.sign("SHA256", data) + assert_equal true, rsa.verify("SHA256", signature, data) signature0 = (<<~'end;').unpack1("m") - oLCgbprPvfhM4pjFQiDTFeWI9Sk+Og7Nh9TmIZ/xSxf2CGXQrptlwo7NQ28+ - WA6YQo8jPH4hSuyWIM4Gz4qRYiYRkl5TDMUYob94zm8Si1HxEiS9354tzvqS - zS8MLW2BtNPuTubMxTItHGTnOzo9sUg0LAHVFt8kHG2NfKAw/gQ= + ooy49i8aeFtkDYUU0RPDsEugGiNw4lZxpbQPnIwtdftEkka945IqKZ/MY3YSw7wKsvBZeaTy8GqL + lSWLThsRFDV+UUS9zUBbQ9ygNIT8OjdV+tNL63ZpKGprczSnw4F05MQIpajNRud/8jiI9rf+Wysi + WwXecjMl2FlXlLJHY4PFQZU5TiametB4VCQRMcjLo1uf26u/yRpiGaYyqn5vxs0SqNtUDM1UL6x4 + NHCAdqLjuFRQPjYp1vGLD3eSl4061pS8x1NVap3YGbYfGUyzZO4VfwFwf1jPdhp/OX/uZw4dGB2H + gSK+q1JiDFwEE6yym5tdKovL1g1NhFYHF6gkZg== end; - assert_equal true, rsa1024.verify("SHA256", signature0, data) + assert_equal true, rsa.verify("SHA256", signature0, data) signature1 = signature0.succ - assert_equal false, rsa1024.verify("SHA256", signature1, data) + assert_equal false, rsa.verify("SHA256", signature1, data) end def test_sign_verify_options - key = Fixtures.pkey("rsa1024") + key = Fixtures.pkey("rsa2048") data = "Sign me!" pssopts = { "rsa_padding_mode" => "pss", @@ -102,7 +111,7 @@ def test_sign_verify_options "rsa_mgf1_md" => "SHA1" } sig_pss = key.sign("SHA256", data, pssopts) - assert_equal 128, sig_pss.bytesize + assert_equal 256, sig_pss.bytesize assert_equal true, key.verify("SHA256", sig_pss, data, pssopts) assert_equal true, key.verify_pss("SHA256", sig_pss, data, salt_length: 20, mgf1_hash: "SHA1") @@ -175,12 +184,12 @@ def test_verify_empty_rsa end def test_sign_verify_pss - key = Fixtures.pkey("rsa1024") + key = Fixtures.pkey("rsa2048") data = "Sign me!" invalid_data = "Sign me?" signature = key.sign_pss("SHA256", data, salt_length: 20, mgf1_hash: "SHA1") - assert_equal 128, signature.bytesize + assert_equal 256, signature.bytesize assert_equal true, key.verify_pss("SHA256", signature, data, salt_length: 20, mgf1_hash: "SHA1") assert_equal true, @@ -196,14 +205,26 @@ def test_sign_verify_pss assert_equal false, key.verify_pss("SHA256", signature, data, salt_length: 20, mgf1_hash: "SHA1") - signature = key.sign_pss("SHA256", data, salt_length: :max, mgf1_hash: "SHA1") - assert_equal true, - key.verify_pss("SHA256", signature, data, salt_length: 94, mgf1_hash: "SHA1") - assert_equal true, - key.verify_pss("SHA256", signature, data, salt_length: :auto, mgf1_hash: "SHA1") + # The sign_pss with `salt_length: :max` raises the "invalid salt length" + # error in FIPS. We need to skip the tests in FIPS. + # According to FIPS 186-5 section 5.4, the salt length shall be between zero + # and the output block length of the digest function (inclusive). + # + # FIPS 186-5 section 5.4 PKCS #1 + # https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-5.pdf + unless OpenSSL.fips_mode + signature = key.sign_pss("SHA256", data, salt_length: :max, mgf1_hash: "SHA1") + # Should verify on the following salt_length (sLen). + # sLen <= emLen (octat) - 2 - hLen (octet) = 2048 / 8 - 2 - 256 / 8 = 222 + # https://datatracker.ietf.org/doc/html/rfc8017#section-9.1.1 + assert_equal true, + key.verify_pss("SHA256", signature, data, salt_length: 222, mgf1_hash: "SHA1") + assert_equal true, + key.verify_pss("SHA256", signature, data, salt_length: :auto, mgf1_hash: "SHA1") + end assert_raise(OpenSSL::PKey::RSAError) { - key.sign_pss("SHA256", data, salt_length: 95, mgf1_hash: "SHA1") + key.sign_pss("SHA256", data, salt_length: 223, mgf1_hash: "SHA1") } end @@ -213,8 +234,13 @@ def test_encrypt_decrypt # Defaults to PKCS #1 v1.5 raw = "data" - enc = rsapub.encrypt(raw) - assert_equal raw, rsapriv.decrypt(enc) + # According to the NIST SP 800-131A Rev. 2 section 6, PKCS#1 v1.5 padding is + # not permitted for key agreement and key transport using RSA in FIPS. + # https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-131Ar2.pdf + unless OpenSSL.fips_mode + enc = rsapub.encrypt(raw) + assert_equal raw, rsapriv.decrypt(enc) + end # Invalid options assert_raise(OpenSSL::PKey::PKeyError) { @@ -227,11 +253,13 @@ def test_encrypt_decrypt_legacy rsapub = OpenSSL::PKey.read(rsapriv.public_to_der) # Defaults to PKCS #1 v1.5 - raw = "data" - enc_legacy = rsapub.public_encrypt(raw) - assert_equal raw, rsapriv.decrypt(enc_legacy) - enc_new = rsapub.encrypt(raw) - assert_equal raw, rsapriv.private_decrypt(enc_new) + unless OpenSSL.fips_mode + raw = "data" + enc_legacy = rsapub.public_encrypt(raw) + assert_equal raw, rsapriv.decrypt(enc_legacy) + enc_new = rsapub.encrypt(raw) + assert_equal raw, rsapriv.private_decrypt(enc_new) + end # OAEP with default parameters raw = "data" @@ -292,53 +320,67 @@ def test_to_der end def test_RSAPrivateKey - rsa1024 = Fixtures.pkey("rsa1024") + rsa = Fixtures.pkey("rsa2048") asn1 = OpenSSL::ASN1::Sequence([ OpenSSL::ASN1::Integer(0), - OpenSSL::ASN1::Integer(rsa1024.n), - OpenSSL::ASN1::Integer(rsa1024.e), - OpenSSL::ASN1::Integer(rsa1024.d), - OpenSSL::ASN1::Integer(rsa1024.p), - OpenSSL::ASN1::Integer(rsa1024.q), - OpenSSL::ASN1::Integer(rsa1024.dmp1), - OpenSSL::ASN1::Integer(rsa1024.dmq1), - OpenSSL::ASN1::Integer(rsa1024.iqmp) + OpenSSL::ASN1::Integer(rsa.n), + OpenSSL::ASN1::Integer(rsa.e), + OpenSSL::ASN1::Integer(rsa.d), + OpenSSL::ASN1::Integer(rsa.p), + OpenSSL::ASN1::Integer(rsa.q), + OpenSSL::ASN1::Integer(rsa.dmp1), + OpenSSL::ASN1::Integer(rsa.dmq1), + OpenSSL::ASN1::Integer(rsa.iqmp) ]) key = OpenSSL::PKey::RSA.new(asn1.to_der) assert_predicate key, :private? - assert_same_rsa rsa1024, key + assert_same_rsa rsa, key pem = <<~EOF -----BEGIN RSA PRIVATE KEY----- - MIICXgIBAAKBgQDLwsSw1ECnPtT+PkOgHhcGA71nwC2/nL85VBGnRqDxOqjVh7Cx - aKPERYHsk4BPCkE3brtThPWc9kjHEQQ7uf9Y1rbCz0layNqHyywQEVLFmp1cpIt/ - Q3geLv8ZD9pihowKJDyMDiN6ArYUmZczvW4976MU3+l54E6lF/JfFEU5hwIDAQAB - AoGBAKSl/MQarye1yOysqX6P8fDFQt68VvtXkNmlSiKOGuzyho0M+UVSFcs6k1L0 - maDE25AMZUiGzuWHyaU55d7RXDgeskDMakD1v6ZejYtxJkSXbETOTLDwUWTn618T - gnb17tU1jktUtU67xK/08i/XodlgnQhs6VoHTuCh3Hu77O6RAkEA7+gxqBuZR572 - 74/akiW/SuXm0SXPEviyO1MuSRwtI87B02D0qgV8D1UHRm4AhMnJ8MCs1809kMQE - JiQUCrp9mQJBANlt2ngBO14us6NnhuAseFDTBzCHXwUUu1YKHpMMmxpnGqaldGgX - sOZB3lgJsT9VlGf3YGYdkLTNVbogQKlKpB8CQQDiSwkb4vyQfDe8/NpU5Not0fII - 8jsDUCb+opWUTMmfbxWRR3FBNu8wnym/m19N4fFj8LqYzHX4KY0oVPu6qvJxAkEA - wa5snNekFcqONLIE4G5cosrIrb74sqL8GbGb+KuTAprzj5z1K8Bm0UW9lTjVDjDi - qRYgZfZSL+x1P/54+xTFSwJAY1FxA/N3QPCXCjPh5YqFxAMQs2VVYTfg+t0MEcJD - dPMQD5JX6g5HKnHFg2mZtoXQrWmJSn7p8GJK8yNTopEErA== + MIIEpAIBAAKCAQEAuV9ht9J7k4NBs38jOXvvTKY9gW8nLICSno5EETR1cuF7i4pN + s9I1QJGAFAX0BEO4KbzXmuOvfCpD3CU+Slp1enenfzq/t/e/1IRW0wkJUJUFQign + 4CtrkJL+P07yx18UjyPlBXb81ApEmAB5mrJVSrWmqbjs07JbuS4QQGGXLc+Su96D + kYKmSNVjBiLxVVSpyZfAY3hD37d60uG+X8xdW5v68JkRFIhdGlb6JL8fllf/A/bl + NwdJOhVr9mESHhwGjwfSeTDPfd8ZLE027E5lyAVX9KZYcU00mOX+fdxOSnGqS/8J + DRh0EPHDL15RcJjV2J6vZjPb0rOYGDoMcH+94wIDAQABAoIBAAzsamqfYQAqwXTb + I0CJtGg6msUgU7HVkOM+9d3hM2L791oGHV6xBAdpXW2H8LgvZHJ8eOeSghR8+dgq + PIqAffo4x1Oma+FOg3A0fb0evyiACyrOk+EcBdbBeLo/LcvahBtqnDfiUMQTpy6V + seSoFCwuN91TSCeGIsDpRjbG1vxZgtx+uI+oH5+ytqJOmfCksRDCkMglGkzyfcl0 + Xc5CUhIJ0my53xijEUQl19rtWdMnNnnkdbG8PT3LZlOta5Do86BElzUYka0C6dUc + VsBDQ0Nup0P6rEQgy7tephHoRlUGTYamsajGJaAo1F3IQVIrRSuagi7+YpSpCqsW + wORqorkCgYEA7RdX6MDVrbw7LePnhyuaqTiMK+055/R1TqhB1JvvxJ1CXk2rDL6G + 0TLHQ7oGofd5LYiemg4ZVtWdJe43BPZlVgT6lvL/iGo8JnrncB9Da6L7nrq/+Rvj + XGjf1qODCK+LmreZWEsaLPURIoR/Ewwxb9J2zd0CaMjeTwafJo1CZvcCgYEAyCgb + aqoWvUecX8VvARfuA593Lsi50t4MEArnOXXcd1RnXoZWhbx5rgO8/ATKfXr0BK/n + h2GF9PfKzHFm/4V6e82OL7gu/kLy2u9bXN74vOvWFL5NOrOKPM7Kg+9I131kNYOw + Ivnr/VtHE5s0dY7JChYWE1F3vArrOw3T00a4CXUCgYEA0SqY+dS2LvIzW4cHCe9k + IQqsT0yYm5TFsUEr4sA3xcPfe4cV8sZb9k/QEGYb1+SWWZ+AHPV3UW5fl8kTbSNb + v4ng8i8rVVQ0ANbJO9e5CUrepein2MPL0AkOATR8M7t7dGGpvYV0cFk8ZrFx0oId + U0PgYDotF/iueBWlbsOM430CgYEAqYI95dFyPI5/AiSkY5queeb8+mQH62sdcCCr + vd/w/CZA/K5sbAo4SoTj8dLk4evU6HtIa0DOP63y071eaxvRpTNqLUOgmLh+D6gS + Cc7TfLuFrD+WDBatBd5jZ+SoHccVrLR/4L8jeodo5FPW05A+9gnKXEXsTxY4LOUC + 9bS4e1kCgYAqVXZh63JsMwoaxCYmQ66eJojKa47VNrOeIZDZvd2BPVf30glBOT41 + gBoDG3WMPZoQj9pb7uMcrnvs4APj2FIhMU8U15LcPAj59cD6S6rWnAxO8NFK7HQG + 4Jxg3JNNf8ErQoCHb1B3oVdXJkmbJkARoDpBKmTCgKtP8ADYLmVPQw== -----END RSA PRIVATE KEY----- EOF key = OpenSSL::PKey::RSA.new(pem) - assert_same_rsa rsa1024, key + assert_same_rsa rsa, key - assert_equal asn1.to_der, rsa1024.to_der - assert_equal pem, rsa1024.export + assert_equal asn1.to_der, rsa.to_der + assert_equal pem, rsa.export # Unknown PEM prepended - cert = issue_cert(OpenSSL::X509::Name.new([["CN", "nobody"]]), rsa1024, 1, [], nil, nil) - str = cert.to_text + cert.to_pem + rsa1024.to_pem + cert = issue_cert(OpenSSL::X509::Name.new([["CN", "nobody"]]), rsa, 1, [], nil, nil) + str = cert.to_text + cert.to_pem + rsa.to_pem key = OpenSSL::PKey::RSA.new(str) - assert_same_rsa rsa1024, key + assert_same_rsa rsa, key end def test_RSAPrivateKey_encrypted + omit_on_fips + rsa1024 = Fixtures.pkey("rsa1024") # key = abcdef pem = <<~EOF @@ -438,6 +480,8 @@ def test_PUBKEY end def test_pem_passwd + omit_on_fips + key = Fixtures.pkey("rsa1024") pem3c = key.to_pem("aes-128-cbc", "key") assert_match (/ENCRYPTED/), pem3c @@ -484,41 +528,54 @@ def test_private_encoding end def test_private_encoding_encrypted - rsa1024 = Fixtures.pkey("rsa1024") - encoded = rsa1024.private_to_der("aes-128-cbc", "abcdef") + rsa = Fixtures.pkey("rsa2048") + encoded = rsa.private_to_der("aes-128-cbc", "abcdef") asn1 = OpenSSL::ASN1.decode(encoded) # PKCS #8 EncryptedPrivateKeyInfo assert_kind_of OpenSSL::ASN1::Sequence, asn1 assert_equal 2, asn1.value.size - assert_not_equal rsa1024.private_to_der, encoded - assert_same_rsa rsa1024, OpenSSL::PKey.read(encoded, "abcdef") - assert_same_rsa rsa1024, OpenSSL::PKey.read(encoded) { "abcdef" } + assert_not_equal rsa.private_to_der, encoded + assert_same_rsa rsa, OpenSSL::PKey.read(encoded, "abcdef") + assert_same_rsa rsa, OpenSSL::PKey.read(encoded) { "abcdef" } assert_raise(OpenSSL::PKey::PKeyError) { OpenSSL::PKey.read(encoded, "abcxyz") } - encoded = rsa1024.private_to_pem("aes-128-cbc", "abcdef") + encoded = rsa.private_to_pem("aes-128-cbc", "abcdef") assert_match (/BEGIN ENCRYPTED PRIVATE KEY/), encoded.lines[0] - assert_same_rsa rsa1024, OpenSSL::PKey.read(encoded, "abcdef") + assert_same_rsa rsa, OpenSSL::PKey.read(encoded, "abcdef") - # certtool --load-privkey=test/fixtures/pkey/rsa1024.pem --to-p8 --password=abcdef + # certtool --load-privkey=test/openssl/fixtures/pkey/rsa2048.pem --to-p8 --password=abcdef pem = <<~EOF -----BEGIN ENCRYPTED PRIVATE KEY----- - MIICojAcBgoqhkiG9w0BDAEDMA4ECLqajUdSNfzwAgIEkQSCAoCDWhxr1HUrKLXA - FsFGGQfPT0aKH4gZipaSXXQRl0KwifHwHoDtfo/mAkJVZMnUVOm1AQ4LTFS3EdTy - JUwICGEQHb7QAiokIRoi0K2yHhOxVO8qgbnWuisWpiT6Ru1jCqTs/wcqlqF7z2jM - oXDk/vuekKst1DDXDcHrzhDkwhCQWj6jt1r2Vwaryy0FyeqsWAgBDiK2LsnCgkGD - 21uhNZ/iWMG6tvY9hB8MDdiBJ41YdSG/AKLulAxQ1ibJz0Tasu66TmwFvWhBlME+ - QbqfgmkgWg5buu53SvDfCA47zXihclbtdfW+U3CJ9OJkx0535TVdZbuC1QgKXvG7 - 4iKGFRMWYJqZvZM3GL4xbC75AxjXZsdCfV81VjZxjeU6ung/NRzCuCUcmBOQzo1D - Vv6COwAa6ttQWM0Ti8oIQHdu5Qi+nuOEHDLxCxD962M37H99sEO5cESjmrGVxhEo - 373L4+11geGSCajdp0yiAGnXQfwaKta8cL693bRObN+b1Y+vqtDKH26N9a4R3qgg - 2XwgQ5GH5CODoXZpi0wxncXO+3YuuhGeArtzKSXLNxHzIMlY7wZX+0e9UU03zfV/ - aOe4/q5DpkNxgHePt0oEpamSKY5W3jzVi1dlFWsRjud1p/Grt2zjSWTYClBlJqG1 - A/3IeDZCu+acaePJjFyv5dFffIj2l4bAYB+LFrZlSu3F/EimO/dCDWJ9JGlMK0aF - l9brh7786Mo+YfyklaqMMEHBbbR2Es7PR6Gt7lrcIXmzy9XSsxT6IiD1rG9KKR3i - CQxTup6JAx9w1q+adL+Ypikoy3gGD/ccUY6TtPoCmkQwSCS+JqQnFlCiThDJbu+V - eqqUNkZq + MIIFOTBjBgkqhkiG9w0BBQ0wVjA1BgkqhkiG9w0BBQwwKAQSsTIsinrhNMr4owUz + cwYGgB0lAgMJJ8ACARAwCgYIKoZIhvcNAgkwHQYJYIZIAWUDBAECBBDtDYqmQOLV + Nh0T0DslWgovBIIE0ESbJey2Pjf9brTp9/41CPnI9Ev78CGSv8Ihyuynu6G7oj7N + G7jUB1pVMQ7ivebF5DmM0qHAix6fDqJetB3WCnRQpMLyIdq5VrnKwFNhwGYduWA5 + IyaAc4DHj02e6YLyBTIKpu79OSFxLrnLCRaTbvZIUQaGhyd6pB7iAhqz5YBC0rpa + iMK5TRlNGPYG9n2eGFOhvUsbJ4T8VDzjpVWw0VNRaukXtg4xiR6o1f0qSXqAb5d9 + REq5DfaQfoOKTV9j7KJHDRrBQG81vkU4K+xILrCBfbcYb82aCoinwSep9LC30HaH + LZ0hYQOuD/k/UbgjToS2wyMnkz75MN5ZNhDMZl/mACQdsMMtIxG37Mpo1Ca33uZi + 71TCOEKIblZS11L1YhIni9Af8pOuHJBWwezP2zN2nPwV6OhgL7Jlax7ICQOPC6L/ + yRGgC5eT4lDDAuTy0IdUhr0r5XrFzZR0/5Vgsq9cGfk9QkXOoETRhQVkEfUDdCs6 + 6CK+SwUR9qh5824ShODFG0SQpsqBPIVtkGrypBSUJtICmGMOAsclB7RDN7/opJwp + qv/iRJ5dhWrhRgQ/DfYifvO5On7RgC2hm48gF3Pt6XCA857ryyYxLYeMY42tAUqp + Hmc9HL7bMYF/jl3cJ32+gLvI3PBVvrvyeAhRo6z7MFVe9I04OywV6BHUx1Us6ybF + qkYnSpcJZdu7HyvzXm7XWLFmt7K5BlAgnFsa/8+cI1BGPgQRc1j0SWepXsSwFZX6 + JkNQ0dewq4uRJXbGyQgfh5I5ETpqDhSt2JfBwAoze6cx3DPC711PUamxyWMiejs+ + mYdia4p62NxaUvyXWmCGIEOzajRwywEhf9OLAmfqTN41TIrEL4BUxqtzDyw8Nl8T + KB7nJEC366jFASfumNQkXXyH5yBIF+XwwSKUOObRZVn2rUzFToo51hHu9efxHoXa + jZlpfglWijkmOuwoIGlGHOq8gUn76oq9WbV+YO+fWm/mf4S3ECzmYzxb6a1uCTy/ + Itkm2qOe3yTM1t+oCqZ0/MeTZ84ALQaWv5reQfjronPZ1jeNtxrYz28tJ4KwBn0U + bJReXbOLsHAymipncxlmaevbx4GPTduu/lbpxefoN95w+SpEdyTmVWrfaCTgAbad + EzcRl60my3xOMQ7CaUbRgGiwohqHDvuXzeqoZ96u6CwfAoEfy4jETmKLRH6uTtj7 + 4jdTyoqyizjpvaM8LPspBS+oqFwLxBjpseQuScrZO1BjPxrImLy2/VRqwJ+CF4FB + iijEgDgDc1EMIGe5YmOAV+i22n9RqX+2IvkYp7CWXrB9/lmirLFukd7hT8DLPUGq + AvSZwTPbDPoZKG3DAebC3DbiC7A3x0KZp24doNRLamZ/MyKHo2Rzl0UhkzDU0ly2 + eAnyNYsOAQck+C6L+ieD95Gksm9YJWurwttm5JragbIJwMCrsBQd4bXDkKdRhxS2 + JpS0dT/aoDmgTzoG07x4cZk0rjBkfX1ta0j0b1lz7/PZXl9AbRvFdq5sJpmv4Ryz + S+OERqo4IEfJJq2WJ92WR+HLGV3Gvsdb7znZTEF1tp4pWOLAt83Pry282UJxO7Pe + ySf/868TEmXams06GYvH+7cMiIT2m9Dc+EFgNaPmm0uMmJ+ZjqHKSOLzrL7C -----END ENCRYPTED PRIVATE KEY----- EOF - assert_same_rsa rsa1024, OpenSSL::PKey.read(pem, "abcdef") + assert_same_rsa rsa, OpenSSL::PKey.read(pem, "abcdef") end def test_dup From 63cbe3f6ac9feb44a2e43b1f853e2ca7e049316c Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Wed, 29 May 2024 16:46:04 +0200 Subject: [PATCH 100/829] Proof of Concept: Allow to prevent fork from happening in known fork unsafe API [Feature #20590] For better of for worse, fork(2) remain the primary provider of parallelism in Ruby programs. Even though it's frowned uppon in many circles, and a lot of literature will simply state that only async-signal safe APIs are safe to use after `fork()`, in practice most APIs work well as long as you are careful about not forking while another thread is holding a pthread mutex. One of the APIs that is known cause fork safety issues is `getaddrinfo`. If you fork while another thread is inside `getaddrinfo`, a mutex may be left locked in the child, with no way to unlock it. I think we could reduce the impact of these problem by preventing in for the most notorious and common cases, by locking around `fork(2)` and known unsafe APIs with a read-write lock. --- ext/socket/raddrinfo.c | 16 +++++++++++++-- internal/thread.h | 5 +++++ process.c | 5 +++++ thread_none.c | 6 ++++++ thread_pthread.c | 46 ++++++++++++++++++++++++++++++++++++++++++ thread_win32.c | 6 ++++++ 6 files changed, 82 insertions(+), 2 deletions(-) diff --git a/ext/socket/raddrinfo.c b/ext/socket/raddrinfo.c index 55bfe44a68a919..7ec700075eb227 100644 --- a/ext/socket/raddrinfo.c +++ b/ext/socket/raddrinfo.c @@ -327,6 +327,12 @@ nogvl_getaddrinfo(void *arg) return (void *)(VALUE)ret; } +static void * +fork_safe_getaddrinfo(void *arg) +{ + return rb_thread_prevent_fork(nogvl_getaddrinfo, arg); +} + static int rb_getaddrinfo(const char *hostp, const char *portp, const struct addrinfo *hints, struct addrinfo **ai) { @@ -336,7 +342,7 @@ rb_getaddrinfo(const char *hostp, const char *portp, const struct addrinfo *hint arg.service = portp; arg.hints = hints; arg.res = ai; - return (int)(VALUE)rb_thread_call_without_gvl(nogvl_getaddrinfo, &arg, RUBY_UBF_IO, 0); + return (int)(VALUE)rb_thread_call_without_gvl(fork_safe_getaddrinfo, &arg, RUBY_UBF_IO, 0); } #elif GETADDRINFO_IMPL == 2 @@ -477,6 +483,12 @@ do_pthread_create(pthread_t *th, void *(*start_routine) (void *), void *arg) return ret; } +static void * +fork_safe_do_getaddrinfo(void *ptr) +{ + return rb_thread_prevent_fork(do_getaddrinfo, ptr); +} + static int rb_getaddrinfo(const char *hostp, const char *portp, const struct addrinfo *hints, struct addrinfo **ai) { @@ -493,7 +505,7 @@ rb_getaddrinfo(const char *hostp, const char *portp, const struct addrinfo *hint } pthread_t th; - if (do_pthread_create(&th, do_getaddrinfo, arg) != 0) { + if (do_pthread_create(&th, fork_safe_do_getaddrinfo, arg) != 0) { int err = errno; free_getaddrinfo_arg(arg); errno = err; diff --git a/internal/thread.h b/internal/thread.h index 47273436e3bdbd..a2926febc3c20b 100644 --- a/internal/thread.h +++ b/internal/thread.h @@ -46,6 +46,9 @@ VALUE rb_thread_shield_wait(VALUE self); VALUE rb_thread_shield_release(VALUE self); VALUE rb_thread_shield_destroy(VALUE self); int rb_thread_to_be_killed(VALUE thread); +void rb_thread_acquire_fork_lock(void); +void rb_thread_release_fork_lock(void); +void rb_thread_reset_fork_lock(void); void rb_mutex_allow_trap(VALUE self, int val); VALUE rb_uninterruptible(VALUE (*b_proc)(VALUE), VALUE data); VALUE rb_mutex_owned_p(VALUE self); @@ -64,6 +67,8 @@ void rb_notify_fd_close_wait(struct rb_io_close_wait_list *busy); RUBY_SYMBOL_EXPORT_BEGIN +void *rb_thread_prevent_fork(void *(*func)(void *), void *data); /* for ext/socket/raddrinfo.c */ + /* Temporary. This API will be removed (renamed). */ VALUE rb_thread_io_blocking_region(rb_blocking_function_t *func, void *data1, int fd); VALUE rb_thread_io_blocking_call(rb_blocking_function_t *func, void *data1, int fd, int events); diff --git a/process.c b/process.c index acb5b661567095..88b55ed335cbf6 100644 --- a/process.c +++ b/process.c @@ -4227,12 +4227,17 @@ rb_fork_ruby(int *status) prefork(); before_fork_ruby(); + rb_thread_acquire_fork_lock(); disable_child_handler_before_fork(&old); child.pid = pid = rb_fork(); child.error = err = errno; disable_child_handler_fork_parent(&old); /* yes, bad name */ + rb_thread_release_fork_lock(); + if (pid == 0) { + rb_thread_reset_fork_lock(); + } after_fork_ruby(pid); /* repeat while fork failed but retryable */ diff --git a/thread_none.c b/thread_none.c index 38730df7ba1ff2..158260982123e9 100644 --- a/thread_none.c +++ b/thread_none.c @@ -326,4 +326,10 @@ rb_thread_lock_native_thread(void) return false; } +void * +rb_thread_prevent_fork(void *(*func)(void *), void *data) +{ + return func(data); +} + #endif /* THREAD_SYSTEM_DEPENDENT_IMPLEMENTATION */ diff --git a/thread_pthread.c b/thread_pthread.c index 3ebb67aaa3ac17..3c7fba42d249cf 100644 --- a/thread_pthread.c +++ b/thread_pthread.c @@ -3346,6 +3346,52 @@ native_sleep(rb_thread_t *th, rb_hrtime_t *rel) RUBY_DEBUG_LOG("wakeup"); } +// fork read-write lock (only for pthread) +static pthread_rwlock_t rb_thread_fork_rw_lock = PTHREAD_RWLOCK_INITIALIZER; + +void +rb_thread_release_fork_lock(void) +{ + int r; + if ((r = pthread_rwlock_unlock(&rb_thread_fork_rw_lock))) { + rb_bug_errno("pthread_rwlock_unlock", r); + } +} + +void +rb_thread_reset_fork_lock(void) +{ + int r; + if ((r = pthread_rwlock_destroy(&rb_thread_fork_rw_lock))) { + rb_bug_errno("pthread_rwlock_destroy", r); + } + + if ((r = pthread_rwlock_init(&rb_thread_fork_rw_lock, NULL))) { + rb_bug_errno("pthread_rwlock_init", r); + } +} + +void * +rb_thread_prevent_fork(void *(*func)(void *), void *data) +{ + int r; + if ((r = pthread_rwlock_rdlock(&rb_thread_fork_rw_lock))) { + rb_bug_errno("pthread_rwlock_rdlock", r); + } + void *result = func(data); + rb_thread_release_fork_lock(); + return result; +} + +void +rb_thread_acquire_fork_lock(void) +{ + int r; + if ((r = pthread_rwlock_wrlock(&rb_thread_fork_rw_lock))) { + rb_bug_errno("pthread_rwlock_wrlock", r); + } +} + // thread internal event hooks (only for pthread) struct rb_internal_thread_event_hook { diff --git a/thread_win32.c b/thread_win32.c index 1e2d4bdd1927c1..3bca58cbac0090 100644 --- a/thread_win32.c +++ b/thread_win32.c @@ -1011,4 +1011,10 @@ rb_thread_lock_native_thread(void) return false; } +void * +rb_thread_prevent_fork(void *(*func)(void *), void *data) +{ + return func(data); +} + #endif /* THREAD_SYSTEM_DEPENDENT_IMPLEMENTATION */ From a99707cd9c6a1d53cf8ebc883dc210219bd67a28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20Barri=C3=A9?= Date: Mon, 29 Jul 2024 12:15:02 +0200 Subject: [PATCH 101/829] Optimized instruction for Array#freeze If an Array which is empty or only using literals is frozen, we detect this as a peephole optimization and change the instructions to be `opt_ary_freeze`. [Feature #20684] Co-authored-by: Jean Boussier --- array.c | 4 + compile.c | 53 ++++- insns.def | 15 ++ internal/array.h | 1 + lib/ruby_vm/rjit/insn_compiler.rb | 19 ++ test/ruby/test_optimization.rb | 46 +++++ vm.c | 2 +- vm_insnhelper.c | 11 ++ yjit/src/codegen.rs | 18 ++ yjit/src/cruby_bindings.inc.rs | 314 +++++++++++++++--------------- 10 files changed, 324 insertions(+), 159 deletions(-) diff --git a/array.c b/array.c index 318449abb48292..91f75d915f79fb 100644 --- a/array.c +++ b/array.c @@ -38,6 +38,7 @@ #include "ruby_assert.h" VALUE rb_cArray; +VALUE rb_cArray_empty_frozen; /* Flags of RArray * @@ -8833,6 +8834,9 @@ Init_Array(void) rb_define_method(rb_cArray, "freeze", rb_ary_freeze, 0); rb_define_method(rb_cArray, "deconstruct", rb_ary_deconstruct, 0); + + rb_cArray_empty_frozen = rb_ary_freeze(rb_ary_new()); + rb_vm_register_global_object(rb_cArray_empty_frozen); } #include "array.rbinc" diff --git a/compile.c b/compile.c index cf75dce619d1bf..32bcbf69afd20f 100644 --- a/compile.c +++ b/compile.c @@ -3235,6 +3235,8 @@ ci_argc_set(const rb_iseq_t *iseq, const struct rb_callinfo *ci, int argc) return nci; } +#define vm_ci_simple(ci) (vm_ci_flag(ci) & VM_CALL_ARGS_SIMPLE) + static int iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcallopt) { @@ -3401,6 +3403,55 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal } } + /* + * duparray [...] + * send , nil + * => + * opt_ary_freeze [...], + */ + if (IS_INSN_ID(iobj, duparray)) { + LINK_ELEMENT *next = iobj->link.next; + if (IS_INSN(next) && (IS_INSN_ID(next, send))) { + const struct rb_callinfo *ci = (struct rb_callinfo *)OPERAND_AT(next, 0); + const rb_iseq_t *blockiseq = (rb_iseq_t *)OPERAND_AT(next, 1); + + if (vm_ci_simple(ci) && vm_ci_argc(ci) == 0 && blockiseq == NULL && vm_ci_mid(ci) == idFreeze) { + VALUE ary = iobj->operands[0]; + rb_obj_reveal(ary, rb_cArray); + + iobj->insn_id = BIN(opt_ary_freeze); + iobj->operand_size = 2; + iobj->operands = compile_data_calloc2(iseq, iobj->operand_size, sizeof(VALUE)); + iobj->operands[0] = ary; + iobj->operands[1] = (VALUE)ci; + ELEM_REMOVE(next); + } + } + } + + /* + * newarray 0 + * send , nil + * => + * opt_ary_freeze [], + */ + if (IS_INSN_ID(iobj, newarray) && iobj->operands[0] == INT2FIX(0)) { + LINK_ELEMENT *next = iobj->link.next; + if (IS_INSN(next) && (IS_INSN_ID(next, send))) { + const struct rb_callinfo *ci = (struct rb_callinfo *)OPERAND_AT(next, 0); + const rb_iseq_t *blockiseq = (rb_iseq_t *)OPERAND_AT(next, 1); + + if (vm_ci_simple(ci) && vm_ci_argc(ci) == 0 && blockiseq == NULL && vm_ci_mid(ci) == idFreeze) { + iobj->insn_id = BIN(opt_ary_freeze); + iobj->operand_size = 2; + iobj->operands = compile_data_calloc2(iseq, iobj->operand_size, sizeof(VALUE)); + iobj->operands[0] = rb_cArray_empty_frozen; + iobj->operands[1] = (VALUE)ci; + ELEM_REMOVE(next); + } + } + } + if (IS_INSN_ID(iobj, branchif) || IS_INSN_ID(iobj, branchnil) || IS_INSN_ID(iobj, branchunless)) { @@ -3986,8 +4037,6 @@ insn_set_specialized_instruction(rb_iseq_t *iseq, INSN *iobj, int insn_id) return COMPILE_OK; } -#define vm_ci_simple(ci) (vm_ci_flag(ci) & VM_CALL_ARGS_SIMPLE) - static int iseq_specialized_instruction(rb_iseq_t *iseq, INSN *iobj) { diff --git a/insns.def b/insns.def index c8dcd61bec3f46..8a763d6187988a 100644 --- a/insns.def +++ b/insns.def @@ -919,6 +919,21 @@ objtostring } } +DEFINE_INSN +opt_ary_freeze +(VALUE ary, CALL_DATA cd) +() +(VALUE val) +{ + val = vm_opt_ary_freeze(ary, BOP_FREEZE, idFreeze); + + if (UNDEF_P(val)) { + RUBY_DTRACE_CREATE_HOOK(ARRAY, RARRAY_LEN(ary)); + PUSH(rb_ary_resurrect(ary)); + CALL_SIMPLE_METHOD(); + } +} + DEFINE_INSN opt_str_freeze (VALUE str, CALL_DATA cd) diff --git a/internal/array.h b/internal/array.h index 39f6fcbea64ed1..398676df4aa80d 100644 --- a/internal/array.h +++ b/internal/array.h @@ -37,6 +37,7 @@ size_t rb_ary_size_as_embedded(VALUE ary); void rb_ary_make_embedded(VALUE ary); bool rb_ary_embeddable_p(VALUE ary); VALUE rb_ary_diff(VALUE ary1, VALUE ary2); +RUBY_EXTERN VALUE rb_cArray_empty_frozen; static inline VALUE rb_ary_entry_internal(VALUE ary, long offset); static inline bool ARY_PTR_USING_P(VALUE ary); diff --git a/lib/ruby_vm/rjit/insn_compiler.rb b/lib/ruby_vm/rjit/insn_compiler.rb index 7a9a0f3aa5c48f..c6b886e192c45c 100644 --- a/lib/ruby_vm/rjit/insn_compiler.rb +++ b/lib/ruby_vm/rjit/insn_compiler.rb @@ -90,6 +90,7 @@ def compile(jit, ctx, asm, insn) when :opt_send_without_block then opt_send_without_block(jit, ctx, asm) when :objtostring then objtostring(jit, ctx, asm) when :opt_str_freeze then opt_str_freeze(jit, ctx, asm) + when :opt_ary_freeze then opt_ary_freeze(jit, ctx, asm) when :opt_nil_p then opt_nil_p(jit, ctx, asm) # opt_str_uminus when :opt_newarray_send then opt_newarray_send(jit, ctx, asm) @@ -1490,6 +1491,24 @@ def objtostring(jit, ctx, asm) end end + # @param jit [RubyVM::RJIT::JITState] + # @param ctx [RubyVM::RJIT::Context] + # @param asm [RubyVM::RJIT::Assembler] + def opt_ary_freeze(jit, ctx, asm) + unless Invariants.assume_bop_not_redefined(jit, C::ARRAY_REDEFINED_OP_FLAG, C::BOP_FREEZE) + return CantCompile; + end + + ary = jit.operand(0, ruby: true) + + # Push the return value onto the stack + stack_ret = ctx.stack_push(Type::CArray) + asm.mov(:rax, to_value(ary)) + asm.mov(stack_ret, :rax) + + KeepCompiling + end + # @param jit [RubyVM::RJIT::JITState] # @param ctx [RubyVM::RJIT::Context] # @param asm [RubyVM::RJIT::Assembler] diff --git a/test/ruby/test_optimization.rb b/test/ruby/test_optimization.rb index a7a0582dbb49c5..671f7d7ed5810b 100644 --- a/test/ruby/test_optimization.rb +++ b/test/ruby/test_optimization.rb @@ -749,6 +749,52 @@ def test_peephole_dstr end end + def test_peephole_array_freeze + code = "#{<<~'begin;'}\n#{<<~'end;'}" + begin; + [1].freeze + end; + iseq = RubyVM::InstructionSequence.compile(code) + insn = iseq.disasm + assert_match(/opt_ary_freeze/, insn) + assert_no_match(/duparray/, insn) + assert_no_match(/send/, insn) + assert_predicate([1].freeze, :frozen?) + assert_in_out_err([], <<~RUBY, [":ok"]) + class Array + prepend Module.new { + def freeze + :ok + end + } + end + p [1].freeze + RUBY + end + + def test_peephole_array_freeze_empty + code = "#{<<~'begin;'}\n#{<<~'end;'}" + begin; + [].freeze + end; + iseq = RubyVM::InstructionSequence.compile(code) + insn = iseq.disasm + assert_match(/opt_ary_freeze/, insn) + assert_no_match(/duparray/, insn) + assert_no_match(/send/, insn) + assert_predicate([].freeze, :frozen?) + assert_in_out_err([], <<~RUBY, [":ok"]) + class Array + prepend Module.new { + def freeze + :ok + end + } + end + p [].freeze + RUBY + end + def test_branch_condition_backquote bug = '[ruby-core:80740] [Bug #13444] redefined backquote should be called' class << self diff --git a/vm.c b/vm.c index b1e0780d9e5b5c..0f0c3c91b19ccf 100644 --- a/vm.c +++ b/vm.c @@ -2232,7 +2232,7 @@ vm_init_redefined_flag(void) OP(EmptyP, EMPTY_P), (C(Array), C(String), C(Hash)); OP(Succ, SUCC), (C(Integer), C(String)); OP(EqTilde, MATCH), (C(Regexp), C(String)); - OP(Freeze, FREEZE), (C(String)); + OP(Freeze, FREEZE), (C(String), C(Array)); OP(UMinus, UMINUS), (C(String)); OP(Max, MAX), (C(Array)); OP(Min, MIN), (C(Array)); diff --git a/vm_insnhelper.c b/vm_insnhelper.c index 227bfa20047d48..bc133f4013a9e8 100644 --- a/vm_insnhelper.c +++ b/vm_insnhelper.c @@ -6109,6 +6109,17 @@ vm_objtostring(const rb_iseq_t *iseq, VALUE recv, CALL_DATA cd) return Qundef; } +static VALUE +vm_opt_ary_freeze(VALUE ary, int bop, ID id) +{ + if (BASIC_OP_UNREDEFINED_P(bop, ARRAY_REDEFINED_OP_FLAG)) { + return ary; + } + else { + return Qundef; + } +} + static VALUE vm_opt_str_freeze(VALUE str, int bop, ID id) { diff --git a/yjit/src/codegen.rs b/yjit/src/codegen.rs index 493e61c28b55b4..08aaa60731319e 100644 --- a/yjit/src/codegen.rs +++ b/yjit/src/codegen.rs @@ -4187,6 +4187,23 @@ fn gen_opt_str_freeze( Some(KeepCompiling) } +fn gen_opt_ary_freeze( + jit: &mut JITState, + asm: &mut Assembler, +) -> Option { + if !assume_bop_not_redefined(jit, asm, ARRAY_REDEFINED_OP_FLAG, BOP_FREEZE) { + return None; + } + + let str = jit.get_arg(0); + + // Push the return value onto the stack + let stack_ret = asm.stack_push(Type::CArray); + asm.mov(stack_ret, str.into()); + + Some(KeepCompiling) +} + fn gen_opt_str_uminus( jit: &mut JITState, asm: &mut Assembler, @@ -10228,6 +10245,7 @@ fn get_gen_fn(opcode: VALUE) -> Option { YARVINSN_opt_gt => Some(gen_opt_gt), YARVINSN_opt_ge => Some(gen_opt_ge), YARVINSN_opt_mod => Some(gen_opt_mod), + YARVINSN_opt_ary_freeze => Some(gen_opt_ary_freeze), YARVINSN_opt_str_freeze => Some(gen_opt_str_freeze), YARVINSN_opt_str_uminus => Some(gen_opt_str_uminus), YARVINSN_opt_newarray_send => Some(gen_opt_newarray_send), diff --git a/yjit/src/cruby_bindings.inc.rs b/yjit/src/cruby_bindings.inc.rs index 4720b4f4ea76c2..7492a28f22ed09 100644 --- a/yjit/src/cruby_bindings.inc.rs +++ b/yjit/src/cruby_bindings.inc.rs @@ -783,162 +783,164 @@ pub const YARVINSN_send: ruby_vminsn_type = 55; pub const YARVINSN_sendforward: ruby_vminsn_type = 56; pub const YARVINSN_opt_send_without_block: ruby_vminsn_type = 57; pub const YARVINSN_objtostring: ruby_vminsn_type = 58; -pub const YARVINSN_opt_str_freeze: ruby_vminsn_type = 59; -pub const YARVINSN_opt_nil_p: ruby_vminsn_type = 60; -pub const YARVINSN_opt_str_uminus: ruby_vminsn_type = 61; -pub const YARVINSN_opt_newarray_send: ruby_vminsn_type = 62; -pub const YARVINSN_invokesuper: ruby_vminsn_type = 63; -pub const YARVINSN_invokesuperforward: ruby_vminsn_type = 64; -pub const YARVINSN_invokeblock: ruby_vminsn_type = 65; -pub const YARVINSN_leave: ruby_vminsn_type = 66; -pub const YARVINSN_throw: ruby_vminsn_type = 67; -pub const YARVINSN_jump: ruby_vminsn_type = 68; -pub const YARVINSN_branchif: ruby_vminsn_type = 69; -pub const YARVINSN_branchunless: ruby_vminsn_type = 70; -pub const YARVINSN_branchnil: ruby_vminsn_type = 71; -pub const YARVINSN_once: ruby_vminsn_type = 72; -pub const YARVINSN_opt_case_dispatch: ruby_vminsn_type = 73; -pub const YARVINSN_opt_plus: ruby_vminsn_type = 74; -pub const YARVINSN_opt_minus: ruby_vminsn_type = 75; -pub const YARVINSN_opt_mult: ruby_vminsn_type = 76; -pub const YARVINSN_opt_div: ruby_vminsn_type = 77; -pub const YARVINSN_opt_mod: ruby_vminsn_type = 78; -pub const YARVINSN_opt_eq: ruby_vminsn_type = 79; -pub const YARVINSN_opt_neq: ruby_vminsn_type = 80; -pub const YARVINSN_opt_lt: ruby_vminsn_type = 81; -pub const YARVINSN_opt_le: ruby_vminsn_type = 82; -pub const YARVINSN_opt_gt: ruby_vminsn_type = 83; -pub const YARVINSN_opt_ge: ruby_vminsn_type = 84; -pub const YARVINSN_opt_ltlt: ruby_vminsn_type = 85; -pub const YARVINSN_opt_and: ruby_vminsn_type = 86; -pub const YARVINSN_opt_or: ruby_vminsn_type = 87; -pub const YARVINSN_opt_aref: ruby_vminsn_type = 88; -pub const YARVINSN_opt_aset: ruby_vminsn_type = 89; -pub const YARVINSN_opt_aset_with: ruby_vminsn_type = 90; -pub const YARVINSN_opt_aref_with: ruby_vminsn_type = 91; -pub const YARVINSN_opt_length: ruby_vminsn_type = 92; -pub const YARVINSN_opt_size: ruby_vminsn_type = 93; -pub const YARVINSN_opt_empty_p: ruby_vminsn_type = 94; -pub const YARVINSN_opt_succ: ruby_vminsn_type = 95; -pub const YARVINSN_opt_not: ruby_vminsn_type = 96; -pub const YARVINSN_opt_regexpmatch2: ruby_vminsn_type = 97; -pub const YARVINSN_invokebuiltin: ruby_vminsn_type = 98; -pub const YARVINSN_opt_invokebuiltin_delegate: ruby_vminsn_type = 99; -pub const YARVINSN_opt_invokebuiltin_delegate_leave: ruby_vminsn_type = 100; -pub const YARVINSN_getlocal_WC_0: ruby_vminsn_type = 101; -pub const YARVINSN_getlocal_WC_1: ruby_vminsn_type = 102; -pub const YARVINSN_setlocal_WC_0: ruby_vminsn_type = 103; -pub const YARVINSN_setlocal_WC_1: ruby_vminsn_type = 104; -pub const YARVINSN_putobject_INT2FIX_0_: ruby_vminsn_type = 105; -pub const YARVINSN_putobject_INT2FIX_1_: ruby_vminsn_type = 106; -pub const YARVINSN_trace_nop: ruby_vminsn_type = 107; -pub const YARVINSN_trace_getlocal: ruby_vminsn_type = 108; -pub const YARVINSN_trace_setlocal: ruby_vminsn_type = 109; -pub const YARVINSN_trace_getblockparam: ruby_vminsn_type = 110; -pub const YARVINSN_trace_setblockparam: ruby_vminsn_type = 111; -pub const YARVINSN_trace_getblockparamproxy: ruby_vminsn_type = 112; -pub const YARVINSN_trace_getspecial: ruby_vminsn_type = 113; -pub const YARVINSN_trace_setspecial: ruby_vminsn_type = 114; -pub const YARVINSN_trace_getinstancevariable: ruby_vminsn_type = 115; -pub const YARVINSN_trace_setinstancevariable: ruby_vminsn_type = 116; -pub const YARVINSN_trace_getclassvariable: ruby_vminsn_type = 117; -pub const YARVINSN_trace_setclassvariable: ruby_vminsn_type = 118; -pub const YARVINSN_trace_opt_getconstant_path: ruby_vminsn_type = 119; -pub const YARVINSN_trace_getconstant: ruby_vminsn_type = 120; -pub const YARVINSN_trace_setconstant: ruby_vminsn_type = 121; -pub const YARVINSN_trace_getglobal: ruby_vminsn_type = 122; -pub const YARVINSN_trace_setglobal: ruby_vminsn_type = 123; -pub const YARVINSN_trace_putnil: ruby_vminsn_type = 124; -pub const YARVINSN_trace_putself: ruby_vminsn_type = 125; -pub const YARVINSN_trace_putobject: ruby_vminsn_type = 126; -pub const YARVINSN_trace_putspecialobject: ruby_vminsn_type = 127; -pub const YARVINSN_trace_putstring: ruby_vminsn_type = 128; -pub const YARVINSN_trace_putchilledstring: ruby_vminsn_type = 129; -pub const YARVINSN_trace_concatstrings: ruby_vminsn_type = 130; -pub const YARVINSN_trace_anytostring: ruby_vminsn_type = 131; -pub const YARVINSN_trace_toregexp: ruby_vminsn_type = 132; -pub const YARVINSN_trace_intern: ruby_vminsn_type = 133; -pub const YARVINSN_trace_newarray: ruby_vminsn_type = 134; -pub const YARVINSN_trace_pushtoarraykwsplat: ruby_vminsn_type = 135; -pub const YARVINSN_trace_duparray: ruby_vminsn_type = 136; -pub const YARVINSN_trace_duphash: ruby_vminsn_type = 137; -pub const YARVINSN_trace_expandarray: ruby_vminsn_type = 138; -pub const YARVINSN_trace_concatarray: ruby_vminsn_type = 139; -pub const YARVINSN_trace_concattoarray: ruby_vminsn_type = 140; -pub const YARVINSN_trace_pushtoarray: ruby_vminsn_type = 141; -pub const YARVINSN_trace_splatarray: ruby_vminsn_type = 142; -pub const YARVINSN_trace_splatkw: ruby_vminsn_type = 143; -pub const YARVINSN_trace_newhash: ruby_vminsn_type = 144; -pub const YARVINSN_trace_newrange: ruby_vminsn_type = 145; -pub const YARVINSN_trace_pop: ruby_vminsn_type = 146; -pub const YARVINSN_trace_dup: ruby_vminsn_type = 147; -pub const YARVINSN_trace_dupn: ruby_vminsn_type = 148; -pub const YARVINSN_trace_swap: ruby_vminsn_type = 149; -pub const YARVINSN_trace_opt_reverse: ruby_vminsn_type = 150; -pub const YARVINSN_trace_topn: ruby_vminsn_type = 151; -pub const YARVINSN_trace_setn: ruby_vminsn_type = 152; -pub const YARVINSN_trace_adjuststack: ruby_vminsn_type = 153; -pub const YARVINSN_trace_defined: ruby_vminsn_type = 154; -pub const YARVINSN_trace_definedivar: ruby_vminsn_type = 155; -pub const YARVINSN_trace_checkmatch: ruby_vminsn_type = 156; -pub const YARVINSN_trace_checkkeyword: ruby_vminsn_type = 157; -pub const YARVINSN_trace_checktype: ruby_vminsn_type = 158; -pub const YARVINSN_trace_defineclass: ruby_vminsn_type = 159; -pub const YARVINSN_trace_definemethod: ruby_vminsn_type = 160; -pub const YARVINSN_trace_definesmethod: ruby_vminsn_type = 161; -pub const YARVINSN_trace_send: ruby_vminsn_type = 162; -pub const YARVINSN_trace_sendforward: ruby_vminsn_type = 163; -pub const YARVINSN_trace_opt_send_without_block: ruby_vminsn_type = 164; -pub const YARVINSN_trace_objtostring: ruby_vminsn_type = 165; -pub const YARVINSN_trace_opt_str_freeze: ruby_vminsn_type = 166; -pub const YARVINSN_trace_opt_nil_p: ruby_vminsn_type = 167; -pub const YARVINSN_trace_opt_str_uminus: ruby_vminsn_type = 168; -pub const YARVINSN_trace_opt_newarray_send: ruby_vminsn_type = 169; -pub const YARVINSN_trace_invokesuper: ruby_vminsn_type = 170; -pub const YARVINSN_trace_invokesuperforward: ruby_vminsn_type = 171; -pub const YARVINSN_trace_invokeblock: ruby_vminsn_type = 172; -pub const YARVINSN_trace_leave: ruby_vminsn_type = 173; -pub const YARVINSN_trace_throw: ruby_vminsn_type = 174; -pub const YARVINSN_trace_jump: ruby_vminsn_type = 175; -pub const YARVINSN_trace_branchif: ruby_vminsn_type = 176; -pub const YARVINSN_trace_branchunless: ruby_vminsn_type = 177; -pub const YARVINSN_trace_branchnil: ruby_vminsn_type = 178; -pub const YARVINSN_trace_once: ruby_vminsn_type = 179; -pub const YARVINSN_trace_opt_case_dispatch: ruby_vminsn_type = 180; -pub const YARVINSN_trace_opt_plus: ruby_vminsn_type = 181; -pub const YARVINSN_trace_opt_minus: ruby_vminsn_type = 182; -pub const YARVINSN_trace_opt_mult: ruby_vminsn_type = 183; -pub const YARVINSN_trace_opt_div: ruby_vminsn_type = 184; -pub const YARVINSN_trace_opt_mod: ruby_vminsn_type = 185; -pub const YARVINSN_trace_opt_eq: ruby_vminsn_type = 186; -pub const YARVINSN_trace_opt_neq: ruby_vminsn_type = 187; -pub const YARVINSN_trace_opt_lt: ruby_vminsn_type = 188; -pub const YARVINSN_trace_opt_le: ruby_vminsn_type = 189; -pub const YARVINSN_trace_opt_gt: ruby_vminsn_type = 190; -pub const YARVINSN_trace_opt_ge: ruby_vminsn_type = 191; -pub const YARVINSN_trace_opt_ltlt: ruby_vminsn_type = 192; -pub const YARVINSN_trace_opt_and: ruby_vminsn_type = 193; -pub const YARVINSN_trace_opt_or: ruby_vminsn_type = 194; -pub const YARVINSN_trace_opt_aref: ruby_vminsn_type = 195; -pub const YARVINSN_trace_opt_aset: ruby_vminsn_type = 196; -pub const YARVINSN_trace_opt_aset_with: ruby_vminsn_type = 197; -pub const YARVINSN_trace_opt_aref_with: ruby_vminsn_type = 198; -pub const YARVINSN_trace_opt_length: ruby_vminsn_type = 199; -pub const YARVINSN_trace_opt_size: ruby_vminsn_type = 200; -pub const YARVINSN_trace_opt_empty_p: ruby_vminsn_type = 201; -pub const YARVINSN_trace_opt_succ: ruby_vminsn_type = 202; -pub const YARVINSN_trace_opt_not: ruby_vminsn_type = 203; -pub const YARVINSN_trace_opt_regexpmatch2: ruby_vminsn_type = 204; -pub const YARVINSN_trace_invokebuiltin: ruby_vminsn_type = 205; -pub const YARVINSN_trace_opt_invokebuiltin_delegate: ruby_vminsn_type = 206; -pub const YARVINSN_trace_opt_invokebuiltin_delegate_leave: ruby_vminsn_type = 207; -pub const YARVINSN_trace_getlocal_WC_0: ruby_vminsn_type = 208; -pub const YARVINSN_trace_getlocal_WC_1: ruby_vminsn_type = 209; -pub const YARVINSN_trace_setlocal_WC_0: ruby_vminsn_type = 210; -pub const YARVINSN_trace_setlocal_WC_1: ruby_vminsn_type = 211; -pub const YARVINSN_trace_putobject_INT2FIX_0_: ruby_vminsn_type = 212; -pub const YARVINSN_trace_putobject_INT2FIX_1_: ruby_vminsn_type = 213; -pub const VM_INSTRUCTION_SIZE: ruby_vminsn_type = 214; +pub const YARVINSN_opt_ary_freeze: ruby_vminsn_type = 59; +pub const YARVINSN_opt_str_freeze: ruby_vminsn_type = 60; +pub const YARVINSN_opt_nil_p: ruby_vminsn_type = 61; +pub const YARVINSN_opt_str_uminus: ruby_vminsn_type = 62; +pub const YARVINSN_opt_newarray_send: ruby_vminsn_type = 63; +pub const YARVINSN_invokesuper: ruby_vminsn_type = 64; +pub const YARVINSN_invokesuperforward: ruby_vminsn_type = 65; +pub const YARVINSN_invokeblock: ruby_vminsn_type = 66; +pub const YARVINSN_leave: ruby_vminsn_type = 67; +pub const YARVINSN_throw: ruby_vminsn_type = 68; +pub const YARVINSN_jump: ruby_vminsn_type = 69; +pub const YARVINSN_branchif: ruby_vminsn_type = 70; +pub const YARVINSN_branchunless: ruby_vminsn_type = 71; +pub const YARVINSN_branchnil: ruby_vminsn_type = 72; +pub const YARVINSN_once: ruby_vminsn_type = 73; +pub const YARVINSN_opt_case_dispatch: ruby_vminsn_type = 74; +pub const YARVINSN_opt_plus: ruby_vminsn_type = 75; +pub const YARVINSN_opt_minus: ruby_vminsn_type = 76; +pub const YARVINSN_opt_mult: ruby_vminsn_type = 77; +pub const YARVINSN_opt_div: ruby_vminsn_type = 78; +pub const YARVINSN_opt_mod: ruby_vminsn_type = 79; +pub const YARVINSN_opt_eq: ruby_vminsn_type = 80; +pub const YARVINSN_opt_neq: ruby_vminsn_type = 81; +pub const YARVINSN_opt_lt: ruby_vminsn_type = 82; +pub const YARVINSN_opt_le: ruby_vminsn_type = 83; +pub const YARVINSN_opt_gt: ruby_vminsn_type = 84; +pub const YARVINSN_opt_ge: ruby_vminsn_type = 85; +pub const YARVINSN_opt_ltlt: ruby_vminsn_type = 86; +pub const YARVINSN_opt_and: ruby_vminsn_type = 87; +pub const YARVINSN_opt_or: ruby_vminsn_type = 88; +pub const YARVINSN_opt_aref: ruby_vminsn_type = 89; +pub const YARVINSN_opt_aset: ruby_vminsn_type = 90; +pub const YARVINSN_opt_aset_with: ruby_vminsn_type = 91; +pub const YARVINSN_opt_aref_with: ruby_vminsn_type = 92; +pub const YARVINSN_opt_length: ruby_vminsn_type = 93; +pub const YARVINSN_opt_size: ruby_vminsn_type = 94; +pub const YARVINSN_opt_empty_p: ruby_vminsn_type = 95; +pub const YARVINSN_opt_succ: ruby_vminsn_type = 96; +pub const YARVINSN_opt_not: ruby_vminsn_type = 97; +pub const YARVINSN_opt_regexpmatch2: ruby_vminsn_type = 98; +pub const YARVINSN_invokebuiltin: ruby_vminsn_type = 99; +pub const YARVINSN_opt_invokebuiltin_delegate: ruby_vminsn_type = 100; +pub const YARVINSN_opt_invokebuiltin_delegate_leave: ruby_vminsn_type = 101; +pub const YARVINSN_getlocal_WC_0: ruby_vminsn_type = 102; +pub const YARVINSN_getlocal_WC_1: ruby_vminsn_type = 103; +pub const YARVINSN_setlocal_WC_0: ruby_vminsn_type = 104; +pub const YARVINSN_setlocal_WC_1: ruby_vminsn_type = 105; +pub const YARVINSN_putobject_INT2FIX_0_: ruby_vminsn_type = 106; +pub const YARVINSN_putobject_INT2FIX_1_: ruby_vminsn_type = 107; +pub const YARVINSN_trace_nop: ruby_vminsn_type = 108; +pub const YARVINSN_trace_getlocal: ruby_vminsn_type = 109; +pub const YARVINSN_trace_setlocal: ruby_vminsn_type = 110; +pub const YARVINSN_trace_getblockparam: ruby_vminsn_type = 111; +pub const YARVINSN_trace_setblockparam: ruby_vminsn_type = 112; +pub const YARVINSN_trace_getblockparamproxy: ruby_vminsn_type = 113; +pub const YARVINSN_trace_getspecial: ruby_vminsn_type = 114; +pub const YARVINSN_trace_setspecial: ruby_vminsn_type = 115; +pub const YARVINSN_trace_getinstancevariable: ruby_vminsn_type = 116; +pub const YARVINSN_trace_setinstancevariable: ruby_vminsn_type = 117; +pub const YARVINSN_trace_getclassvariable: ruby_vminsn_type = 118; +pub const YARVINSN_trace_setclassvariable: ruby_vminsn_type = 119; +pub const YARVINSN_trace_opt_getconstant_path: ruby_vminsn_type = 120; +pub const YARVINSN_trace_getconstant: ruby_vminsn_type = 121; +pub const YARVINSN_trace_setconstant: ruby_vminsn_type = 122; +pub const YARVINSN_trace_getglobal: ruby_vminsn_type = 123; +pub const YARVINSN_trace_setglobal: ruby_vminsn_type = 124; +pub const YARVINSN_trace_putnil: ruby_vminsn_type = 125; +pub const YARVINSN_trace_putself: ruby_vminsn_type = 126; +pub const YARVINSN_trace_putobject: ruby_vminsn_type = 127; +pub const YARVINSN_trace_putspecialobject: ruby_vminsn_type = 128; +pub const YARVINSN_trace_putstring: ruby_vminsn_type = 129; +pub const YARVINSN_trace_putchilledstring: ruby_vminsn_type = 130; +pub const YARVINSN_trace_concatstrings: ruby_vminsn_type = 131; +pub const YARVINSN_trace_anytostring: ruby_vminsn_type = 132; +pub const YARVINSN_trace_toregexp: ruby_vminsn_type = 133; +pub const YARVINSN_trace_intern: ruby_vminsn_type = 134; +pub const YARVINSN_trace_newarray: ruby_vminsn_type = 135; +pub const YARVINSN_trace_pushtoarraykwsplat: ruby_vminsn_type = 136; +pub const YARVINSN_trace_duparray: ruby_vminsn_type = 137; +pub const YARVINSN_trace_duphash: ruby_vminsn_type = 138; +pub const YARVINSN_trace_expandarray: ruby_vminsn_type = 139; +pub const YARVINSN_trace_concatarray: ruby_vminsn_type = 140; +pub const YARVINSN_trace_concattoarray: ruby_vminsn_type = 141; +pub const YARVINSN_trace_pushtoarray: ruby_vminsn_type = 142; +pub const YARVINSN_trace_splatarray: ruby_vminsn_type = 143; +pub const YARVINSN_trace_splatkw: ruby_vminsn_type = 144; +pub const YARVINSN_trace_newhash: ruby_vminsn_type = 145; +pub const YARVINSN_trace_newrange: ruby_vminsn_type = 146; +pub const YARVINSN_trace_pop: ruby_vminsn_type = 147; +pub const YARVINSN_trace_dup: ruby_vminsn_type = 148; +pub const YARVINSN_trace_dupn: ruby_vminsn_type = 149; +pub const YARVINSN_trace_swap: ruby_vminsn_type = 150; +pub const YARVINSN_trace_opt_reverse: ruby_vminsn_type = 151; +pub const YARVINSN_trace_topn: ruby_vminsn_type = 152; +pub const YARVINSN_trace_setn: ruby_vminsn_type = 153; +pub const YARVINSN_trace_adjuststack: ruby_vminsn_type = 154; +pub const YARVINSN_trace_defined: ruby_vminsn_type = 155; +pub const YARVINSN_trace_definedivar: ruby_vminsn_type = 156; +pub const YARVINSN_trace_checkmatch: ruby_vminsn_type = 157; +pub const YARVINSN_trace_checkkeyword: ruby_vminsn_type = 158; +pub const YARVINSN_trace_checktype: ruby_vminsn_type = 159; +pub const YARVINSN_trace_defineclass: ruby_vminsn_type = 160; +pub const YARVINSN_trace_definemethod: ruby_vminsn_type = 161; +pub const YARVINSN_trace_definesmethod: ruby_vminsn_type = 162; +pub const YARVINSN_trace_send: ruby_vminsn_type = 163; +pub const YARVINSN_trace_sendforward: ruby_vminsn_type = 164; +pub const YARVINSN_trace_opt_send_without_block: ruby_vminsn_type = 165; +pub const YARVINSN_trace_objtostring: ruby_vminsn_type = 166; +pub const YARVINSN_trace_opt_ary_freeze: ruby_vminsn_type = 167; +pub const YARVINSN_trace_opt_str_freeze: ruby_vminsn_type = 168; +pub const YARVINSN_trace_opt_nil_p: ruby_vminsn_type = 169; +pub const YARVINSN_trace_opt_str_uminus: ruby_vminsn_type = 170; +pub const YARVINSN_trace_opt_newarray_send: ruby_vminsn_type = 171; +pub const YARVINSN_trace_invokesuper: ruby_vminsn_type = 172; +pub const YARVINSN_trace_invokesuperforward: ruby_vminsn_type = 173; +pub const YARVINSN_trace_invokeblock: ruby_vminsn_type = 174; +pub const YARVINSN_trace_leave: ruby_vminsn_type = 175; +pub const YARVINSN_trace_throw: ruby_vminsn_type = 176; +pub const YARVINSN_trace_jump: ruby_vminsn_type = 177; +pub const YARVINSN_trace_branchif: ruby_vminsn_type = 178; +pub const YARVINSN_trace_branchunless: ruby_vminsn_type = 179; +pub const YARVINSN_trace_branchnil: ruby_vminsn_type = 180; +pub const YARVINSN_trace_once: ruby_vminsn_type = 181; +pub const YARVINSN_trace_opt_case_dispatch: ruby_vminsn_type = 182; +pub const YARVINSN_trace_opt_plus: ruby_vminsn_type = 183; +pub const YARVINSN_trace_opt_minus: ruby_vminsn_type = 184; +pub const YARVINSN_trace_opt_mult: ruby_vminsn_type = 185; +pub const YARVINSN_trace_opt_div: ruby_vminsn_type = 186; +pub const YARVINSN_trace_opt_mod: ruby_vminsn_type = 187; +pub const YARVINSN_trace_opt_eq: ruby_vminsn_type = 188; +pub const YARVINSN_trace_opt_neq: ruby_vminsn_type = 189; +pub const YARVINSN_trace_opt_lt: ruby_vminsn_type = 190; +pub const YARVINSN_trace_opt_le: ruby_vminsn_type = 191; +pub const YARVINSN_trace_opt_gt: ruby_vminsn_type = 192; +pub const YARVINSN_trace_opt_ge: ruby_vminsn_type = 193; +pub const YARVINSN_trace_opt_ltlt: ruby_vminsn_type = 194; +pub const YARVINSN_trace_opt_and: ruby_vminsn_type = 195; +pub const YARVINSN_trace_opt_or: ruby_vminsn_type = 196; +pub const YARVINSN_trace_opt_aref: ruby_vminsn_type = 197; +pub const YARVINSN_trace_opt_aset: ruby_vminsn_type = 198; +pub const YARVINSN_trace_opt_aset_with: ruby_vminsn_type = 199; +pub const YARVINSN_trace_opt_aref_with: ruby_vminsn_type = 200; +pub const YARVINSN_trace_opt_length: ruby_vminsn_type = 201; +pub const YARVINSN_trace_opt_size: ruby_vminsn_type = 202; +pub const YARVINSN_trace_opt_empty_p: ruby_vminsn_type = 203; +pub const YARVINSN_trace_opt_succ: ruby_vminsn_type = 204; +pub const YARVINSN_trace_opt_not: ruby_vminsn_type = 205; +pub const YARVINSN_trace_opt_regexpmatch2: ruby_vminsn_type = 206; +pub const YARVINSN_trace_invokebuiltin: ruby_vminsn_type = 207; +pub const YARVINSN_trace_opt_invokebuiltin_delegate: ruby_vminsn_type = 208; +pub const YARVINSN_trace_opt_invokebuiltin_delegate_leave: ruby_vminsn_type = 209; +pub const YARVINSN_trace_getlocal_WC_0: ruby_vminsn_type = 210; +pub const YARVINSN_trace_getlocal_WC_1: ruby_vminsn_type = 211; +pub const YARVINSN_trace_setlocal_WC_0: ruby_vminsn_type = 212; +pub const YARVINSN_trace_setlocal_WC_1: ruby_vminsn_type = 213; +pub const YARVINSN_trace_putobject_INT2FIX_0_: ruby_vminsn_type = 214; +pub const YARVINSN_trace_putobject_INT2FIX_1_: ruby_vminsn_type = 215; +pub const VM_INSTRUCTION_SIZE: ruby_vminsn_type = 216; pub type ruby_vminsn_type = u32; pub type rb_iseq_callback = ::std::option::Option< unsafe extern "C" fn(arg1: *const rb_iseq_t, arg2: *mut ::std::os::raw::c_void), From bf9879791af11a20e50921551220c08d1c7f7f02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20Barri=C3=A9?= Date: Mon, 5 Aug 2024 12:31:24 +0200 Subject: [PATCH 102/829] Optimized instruction for Hash#freeze If a Hash which is empty or only using literals is frozen, we detect this as a peephole optimization and change the instructions to be `opt_hash_freeze`. [Feature #20684] Co-authored-by: Jean Boussier --- compile.c | 49 +++++ hash.c | 6 + insns.def | 15 ++ internal/hash.h | 1 + lib/ruby_vm/rjit/insn_compiler.rb | 19 ++ test/ruby/test_optimization.rb | 46 +++++ vm.c | 2 +- vm_insnhelper.c | 11 ++ yjit/src/codegen.rs | 18 ++ yjit/src/cruby_bindings.inc.rs | 316 +++++++++++++++--------------- 10 files changed, 325 insertions(+), 158 deletions(-) diff --git a/compile.c b/compile.c index 32bcbf69afd20f..3be7808a8d311e 100644 --- a/compile.c +++ b/compile.c @@ -3429,6 +3429,32 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal } } + /* + * duphash {...} + * send , nil + * => + * opt_hash_freeze {...}, + */ + if (IS_INSN_ID(iobj, duphash)) { + LINK_ELEMENT *next = iobj->link.next; + if (IS_INSN(next) && (IS_INSN_ID(next, send))) { + const struct rb_callinfo *ci = (struct rb_callinfo *)OPERAND_AT(next, 0); + const rb_iseq_t *blockiseq = (rb_iseq_t *)OPERAND_AT(next, 1); + + if (vm_ci_simple(ci) && vm_ci_argc(ci) == 0 && blockiseq == NULL && vm_ci_mid(ci) == idFreeze) { + VALUE hash = iobj->operands[0]; + rb_obj_reveal(hash, rb_cHash); + + iobj->insn_id = BIN(opt_hash_freeze); + iobj->operand_size = 2; + iobj->operands = compile_data_calloc2(iseq, iobj->operand_size, sizeof(VALUE)); + iobj->operands[0] = hash; + iobj->operands[1] = (VALUE)ci; + ELEM_REMOVE(next); + } + } + } + /* * newarray 0 * send , nil @@ -3452,6 +3478,29 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal } } + /* + * newhash 0 + * send , nil + * => + * opt_hash_freeze {}, + */ + if (IS_INSN_ID(iobj, newhash) && iobj->operands[0] == INT2FIX(0)) { + LINK_ELEMENT *next = iobj->link.next; + if (IS_INSN(next) && (IS_INSN_ID(next, send))) { + const struct rb_callinfo *ci = (struct rb_callinfo *)OPERAND_AT(next, 0); + const rb_iseq_t *blockiseq = (rb_iseq_t *)OPERAND_AT(next, 1); + + if (vm_ci_simple(ci) && vm_ci_argc(ci) == 0 && blockiseq == NULL && vm_ci_mid(ci) == idFreeze) { + iobj->insn_id = BIN(opt_hash_freeze); + iobj->operand_size = 2; + iobj->operands = compile_data_calloc2(iseq, iobj->operand_size, sizeof(VALUE)); + iobj->operands[0] = rb_cHash_empty_frozen; + iobj->operands[1] = (VALUE)ci; + ELEM_REMOVE(next); + } + } + } + if (IS_INSN_ID(iobj, branchif) || IS_INSN_ID(iobj, branchnil) || IS_INSN_ID(iobj, branchunless)) { diff --git a/hash.c b/hash.c index c6b65c095c29eb..14086bcb6454e8 100644 --- a/hash.c +++ b/hash.c @@ -103,6 +103,7 @@ static VALUE rb_hash_s_try_convert(VALUE, VALUE); * 2. Insert WBs */ +/* :nodoc: */ VALUE rb_hash_freeze(VALUE hash) { @@ -110,6 +111,7 @@ rb_hash_freeze(VALUE hash) } VALUE rb_cHash; +VALUE rb_cHash_empty_frozen; static VALUE envtbl; static ID id_hash, id_flatten_bang; @@ -7118,6 +7120,7 @@ Init_Hash(void) rb_define_singleton_method(rb_cHash, "try_convert", rb_hash_s_try_convert, 1); rb_define_method(rb_cHash, "initialize_copy", rb_hash_replace, 1); rb_define_method(rb_cHash, "rehash", rb_hash_rehash, 0); + rb_define_method(rb_cHash, "freeze", rb_hash_freeze, 0); rb_define_method(rb_cHash, "to_hash", rb_hash_to_hash, 0); rb_define_method(rb_cHash, "to_h", rb_hash_to_h, 0); @@ -7204,6 +7207,9 @@ Init_Hash(void) rb_define_singleton_method(rb_cHash, "ruby2_keywords_hash?", rb_hash_s_ruby2_keywords_hash_p, 1); rb_define_singleton_method(rb_cHash, "ruby2_keywords_hash", rb_hash_s_ruby2_keywords_hash, 1); + rb_cHash_empty_frozen = rb_hash_freeze(rb_hash_new()); + rb_vm_register_global_object(rb_cHash_empty_frozen); + /* Document-class: ENV * * +ENV+ is a hash-like accessor for environment variables. diff --git a/insns.def b/insns.def index 8a763d6187988a..99ea95f5842eb4 100644 --- a/insns.def +++ b/insns.def @@ -934,6 +934,21 @@ opt_ary_freeze } } +DEFINE_INSN +opt_hash_freeze +(VALUE hash, CALL_DATA cd) +() +(VALUE val) +{ + val = vm_opt_hash_freeze(hash, BOP_FREEZE, idFreeze); + + if (UNDEF_P(val)) { + RUBY_DTRACE_CREATE_HOOK(HASH, RHASH_SIZE(hash) << 1); + PUSH(rb_hash_resurrect(hash)); + CALL_SIMPLE_METHOD(); + } +} + DEFINE_INSN opt_str_freeze (VALUE str, CALL_DATA cd) diff --git a/internal/hash.h b/internal/hash.h index fe859cb716b95b..d66b5b2d04401f 100644 --- a/internal/hash.h +++ b/internal/hash.h @@ -88,6 +88,7 @@ int rb_hash_stlike_foreach_with_replace(VALUE hash, st_foreach_check_callback_fu int rb_hash_stlike_update(VALUE hash, st_data_t key, st_update_callback_func *func, st_data_t arg); VALUE rb_ident_hash_new_with_size(st_index_t size); void rb_hash_free(VALUE hash); +RUBY_EXTERN VALUE rb_cHash_empty_frozen; static inline unsigned RHASH_AR_TABLE_SIZE_RAW(VALUE h); static inline VALUE RHASH_IFNONE(VALUE h); diff --git a/lib/ruby_vm/rjit/insn_compiler.rb b/lib/ruby_vm/rjit/insn_compiler.rb index c6b886e192c45c..a33ba9f4687bff 100644 --- a/lib/ruby_vm/rjit/insn_compiler.rb +++ b/lib/ruby_vm/rjit/insn_compiler.rb @@ -91,6 +91,7 @@ def compile(jit, ctx, asm, insn) when :objtostring then objtostring(jit, ctx, asm) when :opt_str_freeze then opt_str_freeze(jit, ctx, asm) when :opt_ary_freeze then opt_ary_freeze(jit, ctx, asm) + when :opt_hash_freeze then opt_hash_freeze(jit, ctx, asm) when :opt_nil_p then opt_nil_p(jit, ctx, asm) # opt_str_uminus when :opt_newarray_send then opt_newarray_send(jit, ctx, asm) @@ -1509,6 +1510,24 @@ def opt_ary_freeze(jit, ctx, asm) KeepCompiling end + # @param jit [RubyVM::RJIT::JITState] + # @param ctx [RubyVM::RJIT::Context] + # @param asm [RubyVM::RJIT::Assembler] + def opt_hash_freeze(jit, ctx, asm) + unless Invariants.assume_bop_not_redefined(jit, C::HASH_REDEFINED_OP_FLAG, C::BOP_FREEZE) + return CantCompile; + end + + hash = jit.operand(0, ruby: true) + + # Push the return value onto the stack + stack_ret = ctx.stack_push(Type::CHash) + asm.mov(:rax, to_value(hash)) + asm.mov(stack_ret, :rax) + + KeepCompiling + end + # @param jit [RubyVM::RJIT::JITState] # @param ctx [RubyVM::RJIT::Context] # @param asm [RubyVM::RJIT::Assembler] diff --git a/test/ruby/test_optimization.rb b/test/ruby/test_optimization.rb index 671f7d7ed5810b..982da661ecd0f9 100644 --- a/test/ruby/test_optimization.rb +++ b/test/ruby/test_optimization.rb @@ -795,6 +795,52 @@ def freeze RUBY end + def test_peephole_hash_freeze + code = "#{<<~'begin;'}\n#{<<~'end;'}" + begin; + {a:1}.freeze + end; + iseq = RubyVM::InstructionSequence.compile(code) + insn = iseq.disasm + assert_match(/opt_hash_freeze/, insn) + assert_no_match(/duphash/, insn) + assert_no_match(/send/, insn) + assert_predicate([1].freeze, :frozen?) + assert_in_out_err([], <<~RUBY, [":ok"]) + class Hash + prepend Module.new { + def freeze + :ok + end + } + end + p({a:1}.freeze) + RUBY + end + + def test_peephole_hash_freeze_empty + code = "#{<<~'begin;'}\n#{<<~'end;'}" + begin; + {}.freeze + end; + iseq = RubyVM::InstructionSequence.compile(code) + insn = iseq.disasm + assert_match(/opt_hash_freeze/, insn) + assert_no_match(/duphash/, insn) + assert_no_match(/send/, insn) + assert_predicate([].freeze, :frozen?) + assert_in_out_err([], <<~RUBY, [":ok"]) + class Hash + prepend Module.new { + def freeze + :ok + end + } + end + p({}.freeze) + RUBY + end + def test_branch_condition_backquote bug = '[ruby-core:80740] [Bug #13444] redefined backquote should be called' class << self diff --git a/vm.c b/vm.c index 0f0c3c91b19ccf..6b75a7ad5a76b2 100644 --- a/vm.c +++ b/vm.c @@ -2232,7 +2232,7 @@ vm_init_redefined_flag(void) OP(EmptyP, EMPTY_P), (C(Array), C(String), C(Hash)); OP(Succ, SUCC), (C(Integer), C(String)); OP(EqTilde, MATCH), (C(Regexp), C(String)); - OP(Freeze, FREEZE), (C(String), C(Array)); + OP(Freeze, FREEZE), (C(String), C(Array), C(Hash)); OP(UMinus, UMINUS), (C(String)); OP(Max, MAX), (C(Array)); OP(Min, MIN), (C(Array)); diff --git a/vm_insnhelper.c b/vm_insnhelper.c index bc133f4013a9e8..543f31a3b1f56e 100644 --- a/vm_insnhelper.c +++ b/vm_insnhelper.c @@ -6120,6 +6120,17 @@ vm_opt_ary_freeze(VALUE ary, int bop, ID id) } } +static VALUE +vm_opt_hash_freeze(VALUE hash, int bop, ID id) +{ + if (BASIC_OP_UNREDEFINED_P(bop, HASH_REDEFINED_OP_FLAG)) { + return hash; + } + else { + return Qundef; + } +} + static VALUE vm_opt_str_freeze(VALUE str, int bop, ID id) { diff --git a/yjit/src/codegen.rs b/yjit/src/codegen.rs index 08aaa60731319e..a105ab97916b97 100644 --- a/yjit/src/codegen.rs +++ b/yjit/src/codegen.rs @@ -4204,6 +4204,23 @@ fn gen_opt_ary_freeze( Some(KeepCompiling) } +fn gen_opt_hash_freeze( + jit: &mut JITState, + asm: &mut Assembler, +) -> Option { + if !assume_bop_not_redefined(jit, asm, HASH_REDEFINED_OP_FLAG, BOP_FREEZE) { + return None; + } + + let str = jit.get_arg(0); + + // Push the return value onto the stack + let stack_ret = asm.stack_push(Type::CHash); + asm.mov(stack_ret, str.into()); + + Some(KeepCompiling) +} + fn gen_opt_str_uminus( jit: &mut JITState, asm: &mut Assembler, @@ -10246,6 +10263,7 @@ fn get_gen_fn(opcode: VALUE) -> Option { YARVINSN_opt_ge => Some(gen_opt_ge), YARVINSN_opt_mod => Some(gen_opt_mod), YARVINSN_opt_ary_freeze => Some(gen_opt_ary_freeze), + YARVINSN_opt_hash_freeze => Some(gen_opt_hash_freeze), YARVINSN_opt_str_freeze => Some(gen_opt_str_freeze), YARVINSN_opt_str_uminus => Some(gen_opt_str_uminus), YARVINSN_opt_newarray_send => Some(gen_opt_newarray_send), diff --git a/yjit/src/cruby_bindings.inc.rs b/yjit/src/cruby_bindings.inc.rs index 7492a28f22ed09..03cb053fd323d9 100644 --- a/yjit/src/cruby_bindings.inc.rs +++ b/yjit/src/cruby_bindings.inc.rs @@ -784,163 +784,165 @@ pub const YARVINSN_sendforward: ruby_vminsn_type = 56; pub const YARVINSN_opt_send_without_block: ruby_vminsn_type = 57; pub const YARVINSN_objtostring: ruby_vminsn_type = 58; pub const YARVINSN_opt_ary_freeze: ruby_vminsn_type = 59; -pub const YARVINSN_opt_str_freeze: ruby_vminsn_type = 60; -pub const YARVINSN_opt_nil_p: ruby_vminsn_type = 61; -pub const YARVINSN_opt_str_uminus: ruby_vminsn_type = 62; -pub const YARVINSN_opt_newarray_send: ruby_vminsn_type = 63; -pub const YARVINSN_invokesuper: ruby_vminsn_type = 64; -pub const YARVINSN_invokesuperforward: ruby_vminsn_type = 65; -pub const YARVINSN_invokeblock: ruby_vminsn_type = 66; -pub const YARVINSN_leave: ruby_vminsn_type = 67; -pub const YARVINSN_throw: ruby_vminsn_type = 68; -pub const YARVINSN_jump: ruby_vminsn_type = 69; -pub const YARVINSN_branchif: ruby_vminsn_type = 70; -pub const YARVINSN_branchunless: ruby_vminsn_type = 71; -pub const YARVINSN_branchnil: ruby_vminsn_type = 72; -pub const YARVINSN_once: ruby_vminsn_type = 73; -pub const YARVINSN_opt_case_dispatch: ruby_vminsn_type = 74; -pub const YARVINSN_opt_plus: ruby_vminsn_type = 75; -pub const YARVINSN_opt_minus: ruby_vminsn_type = 76; -pub const YARVINSN_opt_mult: ruby_vminsn_type = 77; -pub const YARVINSN_opt_div: ruby_vminsn_type = 78; -pub const YARVINSN_opt_mod: ruby_vminsn_type = 79; -pub const YARVINSN_opt_eq: ruby_vminsn_type = 80; -pub const YARVINSN_opt_neq: ruby_vminsn_type = 81; -pub const YARVINSN_opt_lt: ruby_vminsn_type = 82; -pub const YARVINSN_opt_le: ruby_vminsn_type = 83; -pub const YARVINSN_opt_gt: ruby_vminsn_type = 84; -pub const YARVINSN_opt_ge: ruby_vminsn_type = 85; -pub const YARVINSN_opt_ltlt: ruby_vminsn_type = 86; -pub const YARVINSN_opt_and: ruby_vminsn_type = 87; -pub const YARVINSN_opt_or: ruby_vminsn_type = 88; -pub const YARVINSN_opt_aref: ruby_vminsn_type = 89; -pub const YARVINSN_opt_aset: ruby_vminsn_type = 90; -pub const YARVINSN_opt_aset_with: ruby_vminsn_type = 91; -pub const YARVINSN_opt_aref_with: ruby_vminsn_type = 92; -pub const YARVINSN_opt_length: ruby_vminsn_type = 93; -pub const YARVINSN_opt_size: ruby_vminsn_type = 94; -pub const YARVINSN_opt_empty_p: ruby_vminsn_type = 95; -pub const YARVINSN_opt_succ: ruby_vminsn_type = 96; -pub const YARVINSN_opt_not: ruby_vminsn_type = 97; -pub const YARVINSN_opt_regexpmatch2: ruby_vminsn_type = 98; -pub const YARVINSN_invokebuiltin: ruby_vminsn_type = 99; -pub const YARVINSN_opt_invokebuiltin_delegate: ruby_vminsn_type = 100; -pub const YARVINSN_opt_invokebuiltin_delegate_leave: ruby_vminsn_type = 101; -pub const YARVINSN_getlocal_WC_0: ruby_vminsn_type = 102; -pub const YARVINSN_getlocal_WC_1: ruby_vminsn_type = 103; -pub const YARVINSN_setlocal_WC_0: ruby_vminsn_type = 104; -pub const YARVINSN_setlocal_WC_1: ruby_vminsn_type = 105; -pub const YARVINSN_putobject_INT2FIX_0_: ruby_vminsn_type = 106; -pub const YARVINSN_putobject_INT2FIX_1_: ruby_vminsn_type = 107; -pub const YARVINSN_trace_nop: ruby_vminsn_type = 108; -pub const YARVINSN_trace_getlocal: ruby_vminsn_type = 109; -pub const YARVINSN_trace_setlocal: ruby_vminsn_type = 110; -pub const YARVINSN_trace_getblockparam: ruby_vminsn_type = 111; -pub const YARVINSN_trace_setblockparam: ruby_vminsn_type = 112; -pub const YARVINSN_trace_getblockparamproxy: ruby_vminsn_type = 113; -pub const YARVINSN_trace_getspecial: ruby_vminsn_type = 114; -pub const YARVINSN_trace_setspecial: ruby_vminsn_type = 115; -pub const YARVINSN_trace_getinstancevariable: ruby_vminsn_type = 116; -pub const YARVINSN_trace_setinstancevariable: ruby_vminsn_type = 117; -pub const YARVINSN_trace_getclassvariable: ruby_vminsn_type = 118; -pub const YARVINSN_trace_setclassvariable: ruby_vminsn_type = 119; -pub const YARVINSN_trace_opt_getconstant_path: ruby_vminsn_type = 120; -pub const YARVINSN_trace_getconstant: ruby_vminsn_type = 121; -pub const YARVINSN_trace_setconstant: ruby_vminsn_type = 122; -pub const YARVINSN_trace_getglobal: ruby_vminsn_type = 123; -pub const YARVINSN_trace_setglobal: ruby_vminsn_type = 124; -pub const YARVINSN_trace_putnil: ruby_vminsn_type = 125; -pub const YARVINSN_trace_putself: ruby_vminsn_type = 126; -pub const YARVINSN_trace_putobject: ruby_vminsn_type = 127; -pub const YARVINSN_trace_putspecialobject: ruby_vminsn_type = 128; -pub const YARVINSN_trace_putstring: ruby_vminsn_type = 129; -pub const YARVINSN_trace_putchilledstring: ruby_vminsn_type = 130; -pub const YARVINSN_trace_concatstrings: ruby_vminsn_type = 131; -pub const YARVINSN_trace_anytostring: ruby_vminsn_type = 132; -pub const YARVINSN_trace_toregexp: ruby_vminsn_type = 133; -pub const YARVINSN_trace_intern: ruby_vminsn_type = 134; -pub const YARVINSN_trace_newarray: ruby_vminsn_type = 135; -pub const YARVINSN_trace_pushtoarraykwsplat: ruby_vminsn_type = 136; -pub const YARVINSN_trace_duparray: ruby_vminsn_type = 137; -pub const YARVINSN_trace_duphash: ruby_vminsn_type = 138; -pub const YARVINSN_trace_expandarray: ruby_vminsn_type = 139; -pub const YARVINSN_trace_concatarray: ruby_vminsn_type = 140; -pub const YARVINSN_trace_concattoarray: ruby_vminsn_type = 141; -pub const YARVINSN_trace_pushtoarray: ruby_vminsn_type = 142; -pub const YARVINSN_trace_splatarray: ruby_vminsn_type = 143; -pub const YARVINSN_trace_splatkw: ruby_vminsn_type = 144; -pub const YARVINSN_trace_newhash: ruby_vminsn_type = 145; -pub const YARVINSN_trace_newrange: ruby_vminsn_type = 146; -pub const YARVINSN_trace_pop: ruby_vminsn_type = 147; -pub const YARVINSN_trace_dup: ruby_vminsn_type = 148; -pub const YARVINSN_trace_dupn: ruby_vminsn_type = 149; -pub const YARVINSN_trace_swap: ruby_vminsn_type = 150; -pub const YARVINSN_trace_opt_reverse: ruby_vminsn_type = 151; -pub const YARVINSN_trace_topn: ruby_vminsn_type = 152; -pub const YARVINSN_trace_setn: ruby_vminsn_type = 153; -pub const YARVINSN_trace_adjuststack: ruby_vminsn_type = 154; -pub const YARVINSN_trace_defined: ruby_vminsn_type = 155; -pub const YARVINSN_trace_definedivar: ruby_vminsn_type = 156; -pub const YARVINSN_trace_checkmatch: ruby_vminsn_type = 157; -pub const YARVINSN_trace_checkkeyword: ruby_vminsn_type = 158; -pub const YARVINSN_trace_checktype: ruby_vminsn_type = 159; -pub const YARVINSN_trace_defineclass: ruby_vminsn_type = 160; -pub const YARVINSN_trace_definemethod: ruby_vminsn_type = 161; -pub const YARVINSN_trace_definesmethod: ruby_vminsn_type = 162; -pub const YARVINSN_trace_send: ruby_vminsn_type = 163; -pub const YARVINSN_trace_sendforward: ruby_vminsn_type = 164; -pub const YARVINSN_trace_opt_send_without_block: ruby_vminsn_type = 165; -pub const YARVINSN_trace_objtostring: ruby_vminsn_type = 166; -pub const YARVINSN_trace_opt_ary_freeze: ruby_vminsn_type = 167; -pub const YARVINSN_trace_opt_str_freeze: ruby_vminsn_type = 168; -pub const YARVINSN_trace_opt_nil_p: ruby_vminsn_type = 169; -pub const YARVINSN_trace_opt_str_uminus: ruby_vminsn_type = 170; -pub const YARVINSN_trace_opt_newarray_send: ruby_vminsn_type = 171; -pub const YARVINSN_trace_invokesuper: ruby_vminsn_type = 172; -pub const YARVINSN_trace_invokesuperforward: ruby_vminsn_type = 173; -pub const YARVINSN_trace_invokeblock: ruby_vminsn_type = 174; -pub const YARVINSN_trace_leave: ruby_vminsn_type = 175; -pub const YARVINSN_trace_throw: ruby_vminsn_type = 176; -pub const YARVINSN_trace_jump: ruby_vminsn_type = 177; -pub const YARVINSN_trace_branchif: ruby_vminsn_type = 178; -pub const YARVINSN_trace_branchunless: ruby_vminsn_type = 179; -pub const YARVINSN_trace_branchnil: ruby_vminsn_type = 180; -pub const YARVINSN_trace_once: ruby_vminsn_type = 181; -pub const YARVINSN_trace_opt_case_dispatch: ruby_vminsn_type = 182; -pub const YARVINSN_trace_opt_plus: ruby_vminsn_type = 183; -pub const YARVINSN_trace_opt_minus: ruby_vminsn_type = 184; -pub const YARVINSN_trace_opt_mult: ruby_vminsn_type = 185; -pub const YARVINSN_trace_opt_div: ruby_vminsn_type = 186; -pub const YARVINSN_trace_opt_mod: ruby_vminsn_type = 187; -pub const YARVINSN_trace_opt_eq: ruby_vminsn_type = 188; -pub const YARVINSN_trace_opt_neq: ruby_vminsn_type = 189; -pub const YARVINSN_trace_opt_lt: ruby_vminsn_type = 190; -pub const YARVINSN_trace_opt_le: ruby_vminsn_type = 191; -pub const YARVINSN_trace_opt_gt: ruby_vminsn_type = 192; -pub const YARVINSN_trace_opt_ge: ruby_vminsn_type = 193; -pub const YARVINSN_trace_opt_ltlt: ruby_vminsn_type = 194; -pub const YARVINSN_trace_opt_and: ruby_vminsn_type = 195; -pub const YARVINSN_trace_opt_or: ruby_vminsn_type = 196; -pub const YARVINSN_trace_opt_aref: ruby_vminsn_type = 197; -pub const YARVINSN_trace_opt_aset: ruby_vminsn_type = 198; -pub const YARVINSN_trace_opt_aset_with: ruby_vminsn_type = 199; -pub const YARVINSN_trace_opt_aref_with: ruby_vminsn_type = 200; -pub const YARVINSN_trace_opt_length: ruby_vminsn_type = 201; -pub const YARVINSN_trace_opt_size: ruby_vminsn_type = 202; -pub const YARVINSN_trace_opt_empty_p: ruby_vminsn_type = 203; -pub const YARVINSN_trace_opt_succ: ruby_vminsn_type = 204; -pub const YARVINSN_trace_opt_not: ruby_vminsn_type = 205; -pub const YARVINSN_trace_opt_regexpmatch2: ruby_vminsn_type = 206; -pub const YARVINSN_trace_invokebuiltin: ruby_vminsn_type = 207; -pub const YARVINSN_trace_opt_invokebuiltin_delegate: ruby_vminsn_type = 208; -pub const YARVINSN_trace_opt_invokebuiltin_delegate_leave: ruby_vminsn_type = 209; -pub const YARVINSN_trace_getlocal_WC_0: ruby_vminsn_type = 210; -pub const YARVINSN_trace_getlocal_WC_1: ruby_vminsn_type = 211; -pub const YARVINSN_trace_setlocal_WC_0: ruby_vminsn_type = 212; -pub const YARVINSN_trace_setlocal_WC_1: ruby_vminsn_type = 213; -pub const YARVINSN_trace_putobject_INT2FIX_0_: ruby_vminsn_type = 214; -pub const YARVINSN_trace_putobject_INT2FIX_1_: ruby_vminsn_type = 215; -pub const VM_INSTRUCTION_SIZE: ruby_vminsn_type = 216; +pub const YARVINSN_opt_hash_freeze: ruby_vminsn_type = 60; +pub const YARVINSN_opt_str_freeze: ruby_vminsn_type = 61; +pub const YARVINSN_opt_nil_p: ruby_vminsn_type = 62; +pub const YARVINSN_opt_str_uminus: ruby_vminsn_type = 63; +pub const YARVINSN_opt_newarray_send: ruby_vminsn_type = 64; +pub const YARVINSN_invokesuper: ruby_vminsn_type = 65; +pub const YARVINSN_invokesuperforward: ruby_vminsn_type = 66; +pub const YARVINSN_invokeblock: ruby_vminsn_type = 67; +pub const YARVINSN_leave: ruby_vminsn_type = 68; +pub const YARVINSN_throw: ruby_vminsn_type = 69; +pub const YARVINSN_jump: ruby_vminsn_type = 70; +pub const YARVINSN_branchif: ruby_vminsn_type = 71; +pub const YARVINSN_branchunless: ruby_vminsn_type = 72; +pub const YARVINSN_branchnil: ruby_vminsn_type = 73; +pub const YARVINSN_once: ruby_vminsn_type = 74; +pub const YARVINSN_opt_case_dispatch: ruby_vminsn_type = 75; +pub const YARVINSN_opt_plus: ruby_vminsn_type = 76; +pub const YARVINSN_opt_minus: ruby_vminsn_type = 77; +pub const YARVINSN_opt_mult: ruby_vminsn_type = 78; +pub const YARVINSN_opt_div: ruby_vminsn_type = 79; +pub const YARVINSN_opt_mod: ruby_vminsn_type = 80; +pub const YARVINSN_opt_eq: ruby_vminsn_type = 81; +pub const YARVINSN_opt_neq: ruby_vminsn_type = 82; +pub const YARVINSN_opt_lt: ruby_vminsn_type = 83; +pub const YARVINSN_opt_le: ruby_vminsn_type = 84; +pub const YARVINSN_opt_gt: ruby_vminsn_type = 85; +pub const YARVINSN_opt_ge: ruby_vminsn_type = 86; +pub const YARVINSN_opt_ltlt: ruby_vminsn_type = 87; +pub const YARVINSN_opt_and: ruby_vminsn_type = 88; +pub const YARVINSN_opt_or: ruby_vminsn_type = 89; +pub const YARVINSN_opt_aref: ruby_vminsn_type = 90; +pub const YARVINSN_opt_aset: ruby_vminsn_type = 91; +pub const YARVINSN_opt_aset_with: ruby_vminsn_type = 92; +pub const YARVINSN_opt_aref_with: ruby_vminsn_type = 93; +pub const YARVINSN_opt_length: ruby_vminsn_type = 94; +pub const YARVINSN_opt_size: ruby_vminsn_type = 95; +pub const YARVINSN_opt_empty_p: ruby_vminsn_type = 96; +pub const YARVINSN_opt_succ: ruby_vminsn_type = 97; +pub const YARVINSN_opt_not: ruby_vminsn_type = 98; +pub const YARVINSN_opt_regexpmatch2: ruby_vminsn_type = 99; +pub const YARVINSN_invokebuiltin: ruby_vminsn_type = 100; +pub const YARVINSN_opt_invokebuiltin_delegate: ruby_vminsn_type = 101; +pub const YARVINSN_opt_invokebuiltin_delegate_leave: ruby_vminsn_type = 102; +pub const YARVINSN_getlocal_WC_0: ruby_vminsn_type = 103; +pub const YARVINSN_getlocal_WC_1: ruby_vminsn_type = 104; +pub const YARVINSN_setlocal_WC_0: ruby_vminsn_type = 105; +pub const YARVINSN_setlocal_WC_1: ruby_vminsn_type = 106; +pub const YARVINSN_putobject_INT2FIX_0_: ruby_vminsn_type = 107; +pub const YARVINSN_putobject_INT2FIX_1_: ruby_vminsn_type = 108; +pub const YARVINSN_trace_nop: ruby_vminsn_type = 109; +pub const YARVINSN_trace_getlocal: ruby_vminsn_type = 110; +pub const YARVINSN_trace_setlocal: ruby_vminsn_type = 111; +pub const YARVINSN_trace_getblockparam: ruby_vminsn_type = 112; +pub const YARVINSN_trace_setblockparam: ruby_vminsn_type = 113; +pub const YARVINSN_trace_getblockparamproxy: ruby_vminsn_type = 114; +pub const YARVINSN_trace_getspecial: ruby_vminsn_type = 115; +pub const YARVINSN_trace_setspecial: ruby_vminsn_type = 116; +pub const YARVINSN_trace_getinstancevariable: ruby_vminsn_type = 117; +pub const YARVINSN_trace_setinstancevariable: ruby_vminsn_type = 118; +pub const YARVINSN_trace_getclassvariable: ruby_vminsn_type = 119; +pub const YARVINSN_trace_setclassvariable: ruby_vminsn_type = 120; +pub const YARVINSN_trace_opt_getconstant_path: ruby_vminsn_type = 121; +pub const YARVINSN_trace_getconstant: ruby_vminsn_type = 122; +pub const YARVINSN_trace_setconstant: ruby_vminsn_type = 123; +pub const YARVINSN_trace_getglobal: ruby_vminsn_type = 124; +pub const YARVINSN_trace_setglobal: ruby_vminsn_type = 125; +pub const YARVINSN_trace_putnil: ruby_vminsn_type = 126; +pub const YARVINSN_trace_putself: ruby_vminsn_type = 127; +pub const YARVINSN_trace_putobject: ruby_vminsn_type = 128; +pub const YARVINSN_trace_putspecialobject: ruby_vminsn_type = 129; +pub const YARVINSN_trace_putstring: ruby_vminsn_type = 130; +pub const YARVINSN_trace_putchilledstring: ruby_vminsn_type = 131; +pub const YARVINSN_trace_concatstrings: ruby_vminsn_type = 132; +pub const YARVINSN_trace_anytostring: ruby_vminsn_type = 133; +pub const YARVINSN_trace_toregexp: ruby_vminsn_type = 134; +pub const YARVINSN_trace_intern: ruby_vminsn_type = 135; +pub const YARVINSN_trace_newarray: ruby_vminsn_type = 136; +pub const YARVINSN_trace_pushtoarraykwsplat: ruby_vminsn_type = 137; +pub const YARVINSN_trace_duparray: ruby_vminsn_type = 138; +pub const YARVINSN_trace_duphash: ruby_vminsn_type = 139; +pub const YARVINSN_trace_expandarray: ruby_vminsn_type = 140; +pub const YARVINSN_trace_concatarray: ruby_vminsn_type = 141; +pub const YARVINSN_trace_concattoarray: ruby_vminsn_type = 142; +pub const YARVINSN_trace_pushtoarray: ruby_vminsn_type = 143; +pub const YARVINSN_trace_splatarray: ruby_vminsn_type = 144; +pub const YARVINSN_trace_splatkw: ruby_vminsn_type = 145; +pub const YARVINSN_trace_newhash: ruby_vminsn_type = 146; +pub const YARVINSN_trace_newrange: ruby_vminsn_type = 147; +pub const YARVINSN_trace_pop: ruby_vminsn_type = 148; +pub const YARVINSN_trace_dup: ruby_vminsn_type = 149; +pub const YARVINSN_trace_dupn: ruby_vminsn_type = 150; +pub const YARVINSN_trace_swap: ruby_vminsn_type = 151; +pub const YARVINSN_trace_opt_reverse: ruby_vminsn_type = 152; +pub const YARVINSN_trace_topn: ruby_vminsn_type = 153; +pub const YARVINSN_trace_setn: ruby_vminsn_type = 154; +pub const YARVINSN_trace_adjuststack: ruby_vminsn_type = 155; +pub const YARVINSN_trace_defined: ruby_vminsn_type = 156; +pub const YARVINSN_trace_definedivar: ruby_vminsn_type = 157; +pub const YARVINSN_trace_checkmatch: ruby_vminsn_type = 158; +pub const YARVINSN_trace_checkkeyword: ruby_vminsn_type = 159; +pub const YARVINSN_trace_checktype: ruby_vminsn_type = 160; +pub const YARVINSN_trace_defineclass: ruby_vminsn_type = 161; +pub const YARVINSN_trace_definemethod: ruby_vminsn_type = 162; +pub const YARVINSN_trace_definesmethod: ruby_vminsn_type = 163; +pub const YARVINSN_trace_send: ruby_vminsn_type = 164; +pub const YARVINSN_trace_sendforward: ruby_vminsn_type = 165; +pub const YARVINSN_trace_opt_send_without_block: ruby_vminsn_type = 166; +pub const YARVINSN_trace_objtostring: ruby_vminsn_type = 167; +pub const YARVINSN_trace_opt_ary_freeze: ruby_vminsn_type = 168; +pub const YARVINSN_trace_opt_hash_freeze: ruby_vminsn_type = 169; +pub const YARVINSN_trace_opt_str_freeze: ruby_vminsn_type = 170; +pub const YARVINSN_trace_opt_nil_p: ruby_vminsn_type = 171; +pub const YARVINSN_trace_opt_str_uminus: ruby_vminsn_type = 172; +pub const YARVINSN_trace_opt_newarray_send: ruby_vminsn_type = 173; +pub const YARVINSN_trace_invokesuper: ruby_vminsn_type = 174; +pub const YARVINSN_trace_invokesuperforward: ruby_vminsn_type = 175; +pub const YARVINSN_trace_invokeblock: ruby_vminsn_type = 176; +pub const YARVINSN_trace_leave: ruby_vminsn_type = 177; +pub const YARVINSN_trace_throw: ruby_vminsn_type = 178; +pub const YARVINSN_trace_jump: ruby_vminsn_type = 179; +pub const YARVINSN_trace_branchif: ruby_vminsn_type = 180; +pub const YARVINSN_trace_branchunless: ruby_vminsn_type = 181; +pub const YARVINSN_trace_branchnil: ruby_vminsn_type = 182; +pub const YARVINSN_trace_once: ruby_vminsn_type = 183; +pub const YARVINSN_trace_opt_case_dispatch: ruby_vminsn_type = 184; +pub const YARVINSN_trace_opt_plus: ruby_vminsn_type = 185; +pub const YARVINSN_trace_opt_minus: ruby_vminsn_type = 186; +pub const YARVINSN_trace_opt_mult: ruby_vminsn_type = 187; +pub const YARVINSN_trace_opt_div: ruby_vminsn_type = 188; +pub const YARVINSN_trace_opt_mod: ruby_vminsn_type = 189; +pub const YARVINSN_trace_opt_eq: ruby_vminsn_type = 190; +pub const YARVINSN_trace_opt_neq: ruby_vminsn_type = 191; +pub const YARVINSN_trace_opt_lt: ruby_vminsn_type = 192; +pub const YARVINSN_trace_opt_le: ruby_vminsn_type = 193; +pub const YARVINSN_trace_opt_gt: ruby_vminsn_type = 194; +pub const YARVINSN_trace_opt_ge: ruby_vminsn_type = 195; +pub const YARVINSN_trace_opt_ltlt: ruby_vminsn_type = 196; +pub const YARVINSN_trace_opt_and: ruby_vminsn_type = 197; +pub const YARVINSN_trace_opt_or: ruby_vminsn_type = 198; +pub const YARVINSN_trace_opt_aref: ruby_vminsn_type = 199; +pub const YARVINSN_trace_opt_aset: ruby_vminsn_type = 200; +pub const YARVINSN_trace_opt_aset_with: ruby_vminsn_type = 201; +pub const YARVINSN_trace_opt_aref_with: ruby_vminsn_type = 202; +pub const YARVINSN_trace_opt_length: ruby_vminsn_type = 203; +pub const YARVINSN_trace_opt_size: ruby_vminsn_type = 204; +pub const YARVINSN_trace_opt_empty_p: ruby_vminsn_type = 205; +pub const YARVINSN_trace_opt_succ: ruby_vminsn_type = 206; +pub const YARVINSN_trace_opt_not: ruby_vminsn_type = 207; +pub const YARVINSN_trace_opt_regexpmatch2: ruby_vminsn_type = 208; +pub const YARVINSN_trace_invokebuiltin: ruby_vminsn_type = 209; +pub const YARVINSN_trace_opt_invokebuiltin_delegate: ruby_vminsn_type = 210; +pub const YARVINSN_trace_opt_invokebuiltin_delegate_leave: ruby_vminsn_type = 211; +pub const YARVINSN_trace_getlocal_WC_0: ruby_vminsn_type = 212; +pub const YARVINSN_trace_getlocal_WC_1: ruby_vminsn_type = 213; +pub const YARVINSN_trace_setlocal_WC_0: ruby_vminsn_type = 214; +pub const YARVINSN_trace_setlocal_WC_1: ruby_vminsn_type = 215; +pub const YARVINSN_trace_putobject_INT2FIX_0_: ruby_vminsn_type = 216; +pub const YARVINSN_trace_putobject_INT2FIX_1_: ruby_vminsn_type = 217; +pub const VM_INSTRUCTION_SIZE: ruby_vminsn_type = 218; pub type ruby_vminsn_type = u32; pub type rb_iseq_callback = ::std::option::Option< unsafe extern "C" fn(arg1: *const rb_iseq_t, arg2: *mut ::std::os::raw::c_void), From be6d23646f3d187c1c68cfdd9fb8eb85481342ed Mon Sep 17 00:00:00 2001 From: Mari Imaizumi Date: Thu, 5 Sep 2024 21:22:30 +0900 Subject: [PATCH 103/829] [ruby/reline] Prevent a warning for `warning: literal string will be frozen in the future` (https://github.com/ruby/reline/pull/744) https://github.com/ruby/reline/commit/69c95c8b6a --- test/reline/helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/reline/helper.rb b/test/reline/helper.rb index 9a346a17a1c91f..3d7dc7d812cde6 100644 --- a/test/reline/helper.rb +++ b/test/reline/helper.rb @@ -96,7 +96,7 @@ class Reline::TestCase < Test::Unit::TestCase end }.join rescue Encoding::UndefinedConversionError, Encoding::InvalidByteSequenceError - input.unicode_normalize!(:nfc) + input = input.unicode_normalize(:nfc) if normalized options[:undef] = :replace options[:replace] = '?' From 721a2ceecfe3e3f943b7da50efe8f134efb97fea Mon Sep 17 00:00:00 2001 From: Mari Imaizumi Date: Thu, 5 Sep 2024 21:47:59 +0900 Subject: [PATCH 104/829] [ruby/reline] Bump version to 0.5.10 (https://github.com/ruby/reline/pull/745) https://github.com/ruby/reline/commit/0ebd54f675 --- lib/reline/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/reline/version.rb b/lib/reline/version.rb index 37916d11b99e04..b75d874adb7744 100644 --- a/lib/reline/version.rb +++ b/lib/reline/version.rb @@ -1,3 +1,3 @@ module Reline - VERSION = '0.5.9' + VERSION = '0.5.10' end From ffebc1c7c7c4d95a0b271c17d8349674708f2ab5 Mon Sep 17 00:00:00 2001 From: git Date: Thu, 5 Sep 2024 12:49:01 +0000 Subject: [PATCH 105/829] Update default gems list at 721a2ceecfe3e3f943b7da50efe8f1 [ci skip] --- NEWS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index 9af65809ee7f78..b91fceb9754587 100644 --- a/NEWS.md +++ b/NEWS.md @@ -80,7 +80,7 @@ The following default gems are updated. * optparse 0.5.0 * prism 1.0.0 * rdoc 6.7.0 -* reline 0.5.9 +* reline 0.5.10 * resolv 0.4.0 * stringio 3.1.2.dev * strscan 3.1.1.dev From d4de8aef374310d318b27c910f2fb562da170641 Mon Sep 17 00:00:00 2001 From: mterada1228 <49284339+mterada1228@users.noreply.github.com> Date: Fri, 6 Sep 2024 01:53:26 +0900 Subject: [PATCH 106/829] `rake install` command is failed (#1170) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * `rake install` command is failed \### Problems Several file paths were changed by following PR. - https://github.com/ruby/rdoc/commit/4211292ffe80dd4737db2450d72df404a9d55051 - https://github.com/ruby/rdoc/commit/d7bca12c13b8b3f1632d698d497e67d4ea8a88bc Because rdoc.gemspec doesn't take in this changes, the `rake install` command is permanently failed. \### Test \#### before ```console ❯ bundle exec rake install Running RuboCop... Inspecting 4 files .... 4 files inspected, no offenses detected Tip: Based on detected gems, the following RuboCop extension libraries might be helpful: * rubocop-rake (https://rubygems.org/gems/rubocop-rake) You can opt out of this message by adding the following to your config (see https://docs.rubocop.org/rubocop/extensions.html#extension-suggestions for more options): AllCops: SuggestExtensions: false rake aborted! Running `gem build -V /Users/mterada/dev/redDataTools/remove_dependency/rdoc/rdoc.gemspec` failed with the following output: WARNING: See https://guides.rubygems.org/specification-reference/ for help ERROR: While executing gem ... (Gem::InvalidSpecificationException) ["RI.rdoc", "lib/rdoc/alias.rb", "lib/rdoc/anon_class.rb", "lib/rdoc/any_method.rb", "lib/rdoc/attr.rb", "lib/rdoc/class_module.rb", "lib/rdoc/constant.rb", "lib/rdoc/context.rb", "lib/rdoc/context/section.rb", "lib/rdoc/extend.rb", "lib/rdoc/ghost_method.rb", "lib/rdoc/include.rb", "lib/rdoc/meta_method.rb", "lib/rdoc/method_attr.rb", "lib/rdoc/mixin.rb", "lib/rdoc/normal_class.rb", "lib/rdoc/normal_module.rb", "lib/rdoc/require.rb", "lib/rdoc/single_class.rb", "lib/rdoc/top_level.rb"] are not files /Users/mterada/.rbenv/versions/3.1.0/bin/bundle:25:in `load' /Users/mterada/.rbenv/versions/3.1.0/bin/bundle:25:in `
' Tasks: TOP => install => build (See full trace by running task with --trace) ``` \#### after ```console ❯ bundle exec rake install Running RuboCop... Inspecting 4 files .... 4 files inspected, no offenses detected Tip: Based on detected gems, the following RuboCop extension libraries might be helpful: * rubocop-rake (https://rubygems.org/gems/rubocop-rake) You can opt out of this message by adding the following to your config (see https://docs.rubocop.org/rubocop/extensions.html#extension-suggestions for more options): AllCops: SuggestExtensions: false rdoc 6.7.0 built to pkg/rdoc-6.7.0.gem. rdoc (6.7.0) installed. ``` * Add a `bundle exec rake install` step to github workflow * make intentionally CI failed * Revert "make intentionally CI failed" This reverts commit 9fc5dd9423a024594ad26d86a8a6af829e7017f8. --- lib/rdoc/rdoc.gemspec | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/lib/rdoc/rdoc.gemspec b/lib/rdoc/rdoc.gemspec index 93a281c8aea62d..26f9ba1a871986 100644 --- a/lib/rdoc/rdoc.gemspec +++ b/lib/rdoc/rdoc.gemspec @@ -46,27 +46,27 @@ RDoc includes the +rdoc+ and +ri+ tools for generating and displaying documentat "LEGAL.rdoc", "LICENSE.rdoc", "README.rdoc", - "RI.rdoc", + "RI.md", "TODO.rdoc", "exe/rdoc", "exe/ri", "lib/rdoc.rb", - "lib/rdoc/alias.rb", - "lib/rdoc/anon_class.rb", - "lib/rdoc/any_method.rb", - "lib/rdoc/attr.rb", - "lib/rdoc/class_module.rb", + "lib/rdoc/code_object/alias.rb", + "lib/rdoc/code_object/anon_class.rb", + "lib/rdoc/code_object/any_method.rb", + "lib/rdoc/code_object/attr.rb", + "lib/rdoc/code_object/class_module.rb", "lib/rdoc/code_object.rb", "lib/rdoc/code_objects.rb", "lib/rdoc/comment.rb", - "lib/rdoc/constant.rb", - "lib/rdoc/context.rb", - "lib/rdoc/context/section.rb", + "lib/rdoc/code_object/constant.rb", + "lib/rdoc/code_object/context.rb", + "lib/rdoc/code_object/context/section.rb", "lib/rdoc/cross_reference.rb", "lib/rdoc/encoding.rb", "lib/rdoc/erb_partial.rb", "lib/rdoc/erbio.rb", - "lib/rdoc/extend.rb", + "lib/rdoc/code_object/extend.rb", "lib/rdoc/generator.rb", "lib/rdoc/generator/darkfish.rb", "lib/rdoc/generator/json_index.rb", @@ -136,11 +136,11 @@ RDoc includes the +rdoc+ and +ri+ tools for generating and displaying documentat "lib/rdoc/generator/template/json_index/.document", "lib/rdoc/generator/template/json_index/js/navigation.js", "lib/rdoc/generator/template/json_index/js/searcher.js", - "lib/rdoc/ghost_method.rb", + "lib/rdoc/code_object/ghost_method.rb", "lib/rdoc/i18n.rb", "lib/rdoc/i18n/locale.rb", "lib/rdoc/i18n/text.rb", - "lib/rdoc/include.rb", + "lib/rdoc/code_object/include.rb", "lib/rdoc/known_classes.rb", "lib/rdoc/markdown.kpeg", "lib/rdoc/markdown/entities.rb", @@ -180,11 +180,11 @@ RDoc includes the +rdoc+ and +ri+ tools for generating and displaying documentat "lib/rdoc/markup/to_test.rb", "lib/rdoc/markup/to_tt_only.rb", "lib/rdoc/markup/verbatim.rb", - "lib/rdoc/meta_method.rb", - "lib/rdoc/method_attr.rb", - "lib/rdoc/mixin.rb", - "lib/rdoc/normal_class.rb", - "lib/rdoc/normal_module.rb", + "lib/rdoc/code_object/meta_method.rb", + "lib/rdoc/code_object/method_attr.rb", + "lib/rdoc/code_object/mixin.rb", + "lib/rdoc/code_object/normal_class.rb", + "lib/rdoc/code_object/normal_module.rb", "lib/rdoc/options.rb", "lib/rdoc/parser.rb", "lib/rdoc/parser/c.rb", @@ -201,7 +201,7 @@ RDoc includes the +rdoc+ and +ri+ tools for generating and displaying documentat "lib/rdoc/rd/inline.rb", "lib/rdoc/rd/inline_parser.ry", "lib/rdoc/rdoc.rb", - "lib/rdoc/require.rb", + "lib/rdoc/code_object/require.rb", "lib/rdoc/ri.rb", "lib/rdoc/ri/driver.rb", "lib/rdoc/ri/formatter.rb", @@ -210,7 +210,7 @@ RDoc includes the +rdoc+ and +ri+ tools for generating and displaying documentat "lib/rdoc/ri/task.rb", "lib/rdoc/rubygems_hook.rb", "lib/rdoc/servlet.rb", - "lib/rdoc/single_class.rb", + "lib/rdoc/code_object/single_class.rb", "lib/rdoc/stats.rb", "lib/rdoc/stats/normal.rb", "lib/rdoc/stats/quiet.rb", @@ -220,7 +220,7 @@ RDoc includes the +rdoc+ and +ri+ tools for generating and displaying documentat "lib/rdoc/text.rb", "lib/rdoc/token_stream.rb", "lib/rdoc/tom_doc.rb", - "lib/rdoc/top_level.rb", + "lib/rdoc/code_object/top_level.rb", "lib/rdoc/version.rb", "man/ri.1", ] From 57e3fc32ea83e55d40f4cc6c3e437d485c506d34 Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Fri, 30 Aug 2024 13:04:11 +0200 Subject: [PATCH 107/829] Move Time#xmlschema in core and optimize it [Feature #20707] Converting Time into RFC3339 / ISO8601 representation is an significant hotspot for applications that serialize data in JSON, XML or other formats. By moving it into core we can optimize it much further than what `strftime` will allow. ``` compare-ruby: ruby 3.4.0dev (2024-08-29T13:11:40Z master 6b08a50a62) +YJIT [arm64-darwin23] built-ruby: ruby 3.4.0dev (2024-08-30T13:17:32Z native-xmlschema 34041ff71f) +YJIT [arm64-darwin23] warming up...... | |compare-ruby|built-ruby| |:-----------------------|-----------:|---------:| |time.xmlschema | 1.087M| 5.190M| | | -| 4.78x| |utc_time.xmlschema | 1.464M| 6.848M| | | -| 4.68x| |time.xmlschema(6) | 859.960k| 4.646M| | | -| 5.40x| |utc_time.xmlschema(6) | 1.080M| 5.917M| | | -| 5.48x| |time.xmlschema(9) | 893.909k| 4.668M| | | -| 5.22x| |utc_time.xmlschema(9) | 1.056M| 5.707M| | | -| 5.40x| ``` --- benchmark/time_xmlschema.yml | 23 ++++++ spec/ruby/core/time/iso8601_spec.rb | 6 ++ spec/ruby/core/time/shared/xmlschema.rb | 31 ++++++++ spec/ruby/core/time/xmlschema_spec.rb | 6 ++ spec/ruby/library/time/iso8601_spec.rb | 2 +- spec/ruby/library/time/shared/xmlschema.rb | 2 +- spec/ruby/library/time/xmlschema_spec.rb | 2 +- test/ruby/test_time.rb | 56 +++++++++++++++ time.c | 82 ++++++++++++++++++++++ 9 files changed, 207 insertions(+), 3 deletions(-) create mode 100644 benchmark/time_xmlschema.yml create mode 100644 spec/ruby/core/time/iso8601_spec.rb create mode 100644 spec/ruby/core/time/shared/xmlschema.rb create mode 100644 spec/ruby/core/time/xmlschema_spec.rb diff --git a/benchmark/time_xmlschema.yml b/benchmark/time_xmlschema.yml new file mode 100644 index 00000000000000..f746d9c6c8d1da --- /dev/null +++ b/benchmark/time_xmlschema.yml @@ -0,0 +1,23 @@ +prelude: | + # frozen_string_literal + unless Time.method_defined?(:xmlschema) + class Time + def xmlschema(fraction_digits=0) + fraction_digits = fraction_digits.to_i + s = strftime("%FT%T") + if fraction_digits > 0 + s << strftime(".%#{fraction_digits}N") + end + s << (utc? ? 'Z' : strftime("%:z")) + end + end + end + time = Time.now + utc_time = Time.now.utc +benchmark: + - time.xmlschema + - utc_time.xmlschema + - time.xmlschema(6) + - utc_time.xmlschema(6) + - time.xmlschema(9) + - utc_time.xmlschema(9) diff --git a/spec/ruby/core/time/iso8601_spec.rb b/spec/ruby/core/time/iso8601_spec.rb new file mode 100644 index 00000000000000..ad60c3bb322100 --- /dev/null +++ b/spec/ruby/core/time/iso8601_spec.rb @@ -0,0 +1,6 @@ +require_relative '../../spec_helper' +require_relative 'shared/xmlschema' + +describe "Time#iso8601" do + it_behaves_like :time_xmlschema, :iso8601 +end diff --git a/spec/ruby/core/time/shared/xmlschema.rb b/spec/ruby/core/time/shared/xmlschema.rb new file mode 100644 index 00000000000000..d68c18df364b86 --- /dev/null +++ b/spec/ruby/core/time/shared/xmlschema.rb @@ -0,0 +1,31 @@ +describe :time_xmlschema, shared: true do + ruby_version_is "3.4" do + it "generates ISO-8601 strings in Z for UTC times" do + t = Time.utc(1985, 4, 12, 23, 20, 50, 521245) + t.send(@method).should == "1985-04-12T23:20:50Z" + t.send(@method, 2).should == "1985-04-12T23:20:50.52Z" + t.send(@method, 9).should == "1985-04-12T23:20:50.521245000Z" + end + + it "generates ISO-8601 string with timeone offset for non-UTC times" do + t = Time.new(1985, 4, 12, 23, 20, 50, "+02:00") + t.send(@method).should == "1985-04-12T23:20:50+02:00" + t.send(@method, 2).should == "1985-04-12T23:20:50.00+02:00" + end + + it "year is always at least 4 digits" do + t = Time.utc(12, 4, 12) + t.send(@method).should == "0012-04-12T00:00:00Z" + end + + it "year can be more than 4 digits" do + t = Time.utc(40_000, 4, 12) + t.send(@method).should == "40000-04-12T00:00:00Z" + end + + it "year can be negative" do + t = Time.utc(-2000, 4, 12) + t.send(@method).should == "-2000-04-12T00:00:00Z" + end + end +end diff --git a/spec/ruby/core/time/xmlschema_spec.rb b/spec/ruby/core/time/xmlschema_spec.rb new file mode 100644 index 00000000000000..bdf1dc7923eeaf --- /dev/null +++ b/spec/ruby/core/time/xmlschema_spec.rb @@ -0,0 +1,6 @@ +require_relative '../../spec_helper' +require_relative 'shared/xmlschema' + +describe "Time#xmlschema" do + it_behaves_like :time_xmlschema, :xmlschema +end diff --git a/spec/ruby/library/time/iso8601_spec.rb b/spec/ruby/library/time/iso8601_spec.rb index 4a9eb45613867e..9e2607fbd0b814 100644 --- a/spec/ruby/library/time/iso8601_spec.rb +++ b/spec/ruby/library/time/iso8601_spec.rb @@ -3,5 +3,5 @@ require 'time' describe "Time.xmlschema" do - it_behaves_like :time_xmlschema, :iso8601 + it_behaves_like :time_library_xmlschema, :iso8601 end diff --git a/spec/ruby/library/time/shared/xmlschema.rb b/spec/ruby/library/time/shared/xmlschema.rb index 44d33cda7e386a..831d8509a72725 100644 --- a/spec/ruby/library/time/shared/xmlschema.rb +++ b/spec/ruby/library/time/shared/xmlschema.rb @@ -1,4 +1,4 @@ -describe :time_xmlschema, shared: true do +describe :time_library_xmlschema, shared: true do it "parses ISO-8601 strings" do t = Time.utc(1985, 4, 12, 23, 20, 50, 520000) s = "1985-04-12T23:20:50.52Z" diff --git a/spec/ruby/library/time/xmlschema_spec.rb b/spec/ruby/library/time/xmlschema_spec.rb index 427931119971fe..ff3c864a02e85b 100644 --- a/spec/ruby/library/time/xmlschema_spec.rb +++ b/spec/ruby/library/time/xmlschema_spec.rb @@ -3,5 +3,5 @@ require 'time' describe "Time.xmlschema" do - it_behaves_like :time_xmlschema, :xmlschema + it_behaves_like :time_library_xmlschema, :xmlschema end diff --git a/test/ruby/test_time.rb b/test/ruby/test_time.rb index 2a541bbe8c8f47..cab14eb6941766 100644 --- a/test/ruby/test_time.rb +++ b/test/ruby/test_time.rb @@ -1444,4 +1444,60 @@ def test_deconstruct_keys def test_parse_zero_bigint assert_equal 0, Time.new("2020-10-28T16:48:07.000Z").nsec, '[Bug #19390]' end + + def test_xmlschema_encode + [:xmlschema, :iso8601].each do |method| + bug6100 = '[ruby-core:42997]' + + t = Time.utc(2001, 4, 17, 19, 23, 17, 300000) + assert_equal("2001-04-17T19:23:17Z", t.__send__(method)) + assert_equal("2001-04-17T19:23:17.3Z", t.__send__(method, 1)) + assert_equal("2001-04-17T19:23:17.300000Z", t.__send__(method, 6)) + assert_equal("2001-04-17T19:23:17.3000000Z", t.__send__(method, 7)) + assert_equal("2001-04-17T19:23:17.3Z", t.__send__(method, 1.9), bug6100) + + t = Time.utc(2001, 4, 17, 19, 23, 17, 123456) + assert_equal("2001-04-17T19:23:17.1234560Z", t.__send__(method, 7)) + assert_equal("2001-04-17T19:23:17.123456Z", t.__send__(method, 6)) + assert_equal("2001-04-17T19:23:17.12345Z", t.__send__(method, 5)) + assert_equal("2001-04-17T19:23:17.1Z", t.__send__(method, 1)) + assert_equal("2001-04-17T19:23:17.1Z", t.__send__(method, 1.9), bug6100) + + t = Time.at(2.quo(3)).getlocal("+09:00") + assert_equal("1970-01-01T09:00:00.666+09:00", t.__send__(method, 3)) + assert_equal("1970-01-01T09:00:00.6666666666+09:00", t.__send__(method, 10)) + assert_equal("1970-01-01T09:00:00.66666666666666666666+09:00", t.__send__(method, 20)) + assert_equal("1970-01-01T09:00:00.6+09:00", t.__send__(method, 1.1), bug6100) + assert_equal("1970-01-01T09:00:00.666+09:00", t.__send__(method, 3.2), bug6100) + + t = Time.at(123456789.quo(9999999999)).getlocal("+09:00") + assert_equal("1970-01-01T09:00:00.012+09:00", t.__send__(method, 3)) + assert_equal("1970-01-01T09:00:00.012345678+09:00", t.__send__(method, 9)) + assert_equal("1970-01-01T09:00:00.0123456789+09:00", t.__send__(method, 10)) + assert_equal("1970-01-01T09:00:00.0123456789012345678+09:00", t.__send__(method, 19)) + assert_equal("1970-01-01T09:00:00.01234567890123456789+09:00", t.__send__(method, 20)) + assert_equal("1970-01-01T09:00:00.012+09:00", t.__send__(method, 3.8), bug6100) + + t = Time.utc(1) + assert_equal("0001-01-01T00:00:00Z", t.__send__(method)) + + begin + Time.at(-1) + rescue ArgumentError + # ignore + else + t = Time.utc(1960, 12, 31, 23, 0, 0, 123456) + assert_equal("1960-12-31T23:00:00.123456Z", t.__send__(method, 6)) + end + + assert_equal("10000-01-01T00:00:00Z", Time.utc(10000).__send__(method)) + assert_equal("9999-01-01T00:00:00Z", Time.utc(9999).__send__(method)) + assert_equal("0001-01-01T00:00:00Z", Time.utc(1).__send__(method)) # 1 AD + assert_equal("0000-01-01T00:00:00Z", Time.utc(0).__send__(method)) # 1 BC + assert_equal("-0001-01-01T00:00:00Z", Time.utc(-1).__send__(method)) # 2 BC + assert_equal("-0004-01-01T00:00:00Z", Time.utc(-4).__send__(method)) # 5 BC + assert_equal("-9999-01-01T00:00:00Z", Time.utc(-9999).__send__(method)) + assert_equal("-10000-01-01T00:00:00Z", Time.utc(-10000).__send__(method)) + end + end end diff --git a/time.c b/time.c index 035d32dd3140f1..801df3658edc78 100644 --- a/time.c +++ b/time.c @@ -5215,6 +5215,86 @@ time_strftime(VALUE time, VALUE format) } } +static VALUE +time_xmlschema(int argc, VALUE *argv, VALUE time) +{ + long fraction_digits = 0; + rb_check_arity(argc, 0, 1); + if (argc > 0) { + fraction_digits = NUM2LONG(argv[0]); + if (fraction_digits < 0) { + fraction_digits = 0; + } + } + + struct time_object *tobj; + + GetTimeval(time, tobj); + MAKE_TM(time, tobj); + + long year = -1; + if (FIXNUM_P(tobj->vtm.year)) { + year = FIX2LONG(tobj->vtm.year); + } + if (RB_UNLIKELY(year > 9999 || year < 0 || fraction_digits > 9)) { + // Slow path for uncommon dates. + VALUE format = rb_utf8_str_new_cstr("%FT%T"); + if (fraction_digits > 0) { + rb_str_catf(format, ".%%#%ldN", fraction_digits); + } + rb_str_cat_cstr(format, TZMODE_UTC_P(tobj) ? "Z" : "%:z"); + return rb_funcallv(time, rb_intern("strftime"), 1, &format); + } + + long buf_size = sizeof("YYYY-MM-DDTHH:MM:SS+ZH:ZM") + fraction_digits + (fraction_digits > 0 ? 1 : 0); + + VALUE str = rb_str_buf_new(buf_size); + rb_enc_associate_index(str, rb_utf8_encindex()); + + char *ptr = RSTRING_PTR(str); + char *start = ptr; + int written = snprintf( + ptr, + sizeof("YYYY-MM-DDTHH:MM:SS"), + "%04ld-%02d-%02dT%02d:%02d:%02d", + year, + tobj->vtm.mon, + tobj->vtm.mday, + tobj->vtm.hour, + tobj->vtm.min, + tobj->vtm.sec + ); + RUBY_ASSERT(written == sizeof("YYYY-MM-DDTHH:MM:SS") - 1); + ptr += written; + + if (fraction_digits > 0) { + long nsec = NUM2LONG(mulquov(tobj->vtm.subsecx, INT2FIX(1000000000), INT2FIX(TIME_SCALE))); + long subsec = nsec / (long)pow(10, 9 - fraction_digits); + + *ptr = '.'; + ptr++; + + written = snprintf(ptr, fraction_digits + 1, "%0*ld", (int)fraction_digits, subsec); // Always allow to write \0 + RUBY_ASSERT(written > 0); + ptr += written; + } + + if (TZMODE_UTC_P(tobj)) { + *ptr = 'Z'; + ptr++; + } + else { + long offset = NUM2LONG(rb_time_utc_offset(time)); + int offset_hours = (int)(offset / 3600); + int offset_minutes = (int)((offset % 3600 / 60)); + written = snprintf(ptr, sizeof("+ZH:ZM"), "%+03d:%02d", offset_hours, offset_minutes); + RUBY_ASSERT(written == sizeof("+ZH:ZM") - 1); + ptr += written; + } + rb_str_set_len(str, ptr -start); // We could skip coderange scanning as we know it's full ASCII. + return str; +} + int ruby_marshal_write_long(long x, char *buf); enum {base_dump_size = 8}; @@ -5842,6 +5922,8 @@ Init_Time(void) rb_define_method(rb_cTime, "subsec", time_subsec, 0); rb_define_method(rb_cTime, "strftime", time_strftime, 1); + rb_define_method(rb_cTime, "xmlschema", time_xmlschema, -1); + rb_define_alias(rb_cTime, "iso8601", "xmlschema"); /* methods for marshaling */ rb_define_private_method(rb_cTime, "_dump", time_dump, -1); From cf3b62b54579d5cba4ceee707fee01b198de034a Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Thu, 29 Aug 2024 12:18:07 -0400 Subject: [PATCH 108/829] Fix check_tempfile_leak in leakchecker.rb The instance variable @tmpfile was removed in ddcfc9f so check_tempfile_leak did not work. --- tool/lib/leakchecker.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tool/lib/leakchecker.rb b/tool/lib/leakchecker.rb index 7518f49ae3e4e3..69aeb2c254cbfd 100644 --- a/tool/lib/leakchecker.rb +++ b/tool/lib/leakchecker.rb @@ -155,8 +155,8 @@ def find_tempfiles(prev_count=-1) if prev_count == count [prev_count, []] else - tempfiles = ObjectSpace.each_object(Tempfile).find_all {|t| - t.instance_variable_defined?(:@tmpfile) and t.path + tempfiles = ObjectSpace.each_object(Tempfile).reject {|t| + t.instance_variables.empty? || t.closed? } [count, tempfiles] end From f250296efaa7ea3e929eeaecfecd29e5cfe13de3 Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Thu, 5 Sep 2024 12:39:57 -0700 Subject: [PATCH 109/829] YJIT: Speed up block_assumptions_free (#11556) --- yjit/src/invariants.rs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/yjit/src/invariants.rs b/yjit/src/invariants.rs index 98516aa400c811..d468cfebd9b9fa 100644 --- a/yjit/src/invariants.rs +++ b/yjit/src/invariants.rs @@ -30,7 +30,6 @@ pub struct Invariants { /// quick access to all of the blocks that are making this assumption when /// the operator is redefined. basic_operator_blocks: HashMap<(RedefinitionFlag, ruby_basic_operators), HashSet>, - /// A map from a block to a set of classes and their associated basic /// operators that the block is assuming are not redefined. This is used for /// quick access to all of the assumptions that a block is making when it @@ -48,7 +47,6 @@ pub struct Invariants { /// a constant `A::B` is redefined, then all blocks that are assuming that /// `A` and `B` have not be redefined must be invalidated. constant_state_blocks: HashMap>, - /// A map from a block to a set of IDs that it is assuming have not been /// redefined. block_constant_states: HashMap>, @@ -57,6 +55,9 @@ pub struct Invariants { /// will have no singleton class. When the set is empty, it means that /// there has been a singleton class for the class after boot, so you cannot /// assume no singleton class going forward. + /// For now, the key can be only Array, Hash, or String. Consider making + /// an inverted HashMap if we start using this for user-defined classes + /// to maintain the performance of block_assumptions_free(). no_singleton_classes: HashMap>, /// A map from an ISEQ to a set of blocks that assume base pointer is equal @@ -462,11 +463,15 @@ pub fn block_assumptions_free(blockref: BlockRef) { } // Remove tracking for blocks assuming no singleton class + // NOTE: no_singleton_class has up to 3 keys (Array, Hash, or String) for now. + // This is effectively an O(1) access unless we start using it for more classes. for (_, blocks) in invariants.no_singleton_classes.iter_mut() { blocks.remove(&blockref); } + // Remove tracking for blocks assuming EP doesn't escape - for (_, blocks) in invariants.no_ep_escape_iseqs.iter_mut() { + let iseq = unsafe { blockref.as_ref() }.get_blockid().iseq; + if let Some(blocks) = invariants.no_ep_escape_iseqs.get_mut(&iseq) { blocks.remove(&blockref); } } From 72acd1c8b1003467d838728a5c113a127a441f6b Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Thu, 5 Sep 2024 10:06:01 +0200 Subject: [PATCH 110/829] [ruby/time] Do not redefine Time#xmlschema if it already exists [Feature #20707] Ruby 3.4 will define this method natively, so the time gem shouldn't redefine it with a slower version. https://github.com/ruby/time/commit/f05099ce38 --- lib/time.rb | 59 +++++++++++++++++++++++++++-------------------------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/lib/time.rb b/lib/time.rb index b565130b50c90a..860d8e1a5ac64e 100644 --- a/lib/time.rb +++ b/lib/time.rb @@ -695,35 +695,36 @@ def httpdate getutc.strftime('%a, %d %b %Y %T GMT') end - # - # Returns a string which represents the time as a dateTime defined by XML - # Schema: - # - # CCYY-MM-DDThh:mm:ssTZD - # CCYY-MM-DDThh:mm:ss.sssTZD - # - # where TZD is Z or [+-]hh:mm. - # - # If self is a UTC time, Z is used as TZD. [+-]hh:mm is used otherwise. - # - # +fraction_digits+ specifies a number of digits to use for fractional - # seconds. Its default value is 0. - # - # require 'time' - # - # t = Time.now - # t.iso8601 # => "2011-10-05T22:26:12-04:00" - # - # You must require 'time' to use this method. - # - def xmlschema(fraction_digits=0) - fraction_digits = fraction_digits.to_i - s = strftime("%FT%T") - if fraction_digits > 0 - s << strftime(".%#{fraction_digits}N") + unless method_defined?(:xmlschema) + # + # Returns a string which represents the time as a dateTime defined by XML + # Schema: + # + # CCYY-MM-DDThh:mm:ssTZD + # CCYY-MM-DDThh:mm:ss.sssTZD + # + # where TZD is Z or [+-]hh:mm. + # + # If self is a UTC time, Z is used as TZD. [+-]hh:mm is used otherwise. + # + # +fraction_digits+ specifies a number of digits to use for fractional + # seconds. Its default value is 0. + # + # require 'time' + # + # t = Time.now + # t.iso8601 # => "2011-10-05T22:26:12-04:00" + # + # You must require 'time' to use this method. + # + def xmlschema(fraction_digits=0) + fraction_digits = fraction_digits.to_i + s = strftime("%FT%T") + if fraction_digits > 0 + s << strftime(".%#{fraction_digits}N") + end + s << (utc? ? 'Z' : strftime("%:z")) end - s << (utc? ? 'Z' : strftime("%:z")) end - alias iso8601 xmlschema + alias iso8601 xmlschema unless method_defined?(:iso8601) end - From e17d91459cc1f806b31feaff0cdbaaafea4c9b86 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Fri, 6 Sep 2024 09:31:18 +0900 Subject: [PATCH 111/829] [ruby/time] Bump up v0.4.0 https://github.com/ruby/time/commit/a14fa00ef7 --- lib/time.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/time.rb b/lib/time.rb index 860d8e1a5ac64e..10f75b1dda9a0b 100644 --- a/lib/time.rb +++ b/lib/time.rb @@ -26,7 +26,7 @@ class Time - VERSION = "0.3.0" + VERSION = "0.4.0" class << Time From 81b74c9fad3bd9957c868a18d49c3dd5e25ac377 Mon Sep 17 00:00:00 2001 From: git Date: Fri, 6 Sep 2024 00:32:47 +0000 Subject: [PATCH 112/829] Update default gems list at e17d91459cc1f806b31feaff0cdbaa [ci skip] --- NEWS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/NEWS.md b/NEWS.md index b91fceb9754587..07ae01676b09ec 100644 --- a/NEWS.md +++ b/NEWS.md @@ -84,6 +84,7 @@ The following default gems are updated. * resolv 0.4.0 * stringio 3.1.2.dev * strscan 3.1.1.dev +* time 0.4.0 * uri 0.13.1 * zlib 3.1.1 From e43d701f091e78725acc312465174d938fd5d639 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Fri, 6 Sep 2024 12:56:54 +0900 Subject: [PATCH 113/829] Warn irb, reline for Ruby 3.5 --- lib/bundled_gems.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/bundled_gems.rb b/lib/bundled_gems.rb index e3d2617457f2a1..12e805f59e93c3 100644 --- a/lib/bundled_gems.rb +++ b/lib/bundled_gems.rb @@ -32,6 +32,9 @@ module Gem::BUNDLED_GEMS "win32ole" => "3.5.0", "fiddle" => "3.5.0", "logger" => "3.5.0", + "irb" => "3.5.0", + "reline" => "3.5.0", + # "readline" => "3.5.0", # This is wrapper for reline. We don't warn for this. }.freeze SINCE_FAST_PATH = SINCE.transform_keys { |g| g.sub(/\A.*\-/, "") }.freeze From 69d0e690bb632c0f67d8bb55988e91f61aff68f8 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Fri, 6 Sep 2024 13:06:56 +0900 Subject: [PATCH 114/829] Added force_require for binding.irb When we make irb to bundled gems, binding.irb with bundle exec is not working without irb declaration of Gemfile. This force_require makes to load irb without Gemfile. --- prelude.rb | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/prelude.rb b/prelude.rb index ee78b44cc5267f..e64c242db6d693 100644 --- a/prelude.rb +++ b/prelude.rb @@ -1,12 +1,30 @@ class Binding # :nodoc: def irb - require 'irb' + begin + require 'irb' + rescue LoadError + force_require "irb" if defined?(Bundler) + end irb end # suppress redefinition warning alias irb irb # :nodoc: + + private def force_require(gem) + gemspecs = (Gem::Specification.dirs + [Gem.default_specifications_dir]).map{|d| + Dir.glob("#{d}/#{gem}*.gemspec").reverse + }.flatten + if gemspecs.empty? + false + else + gemspec = Gem::Specification.load(gemspecs[0]) + gemspec.dependencies.each{|dep| force_require dep.name } + gemspec.activate + require gem.gsub("-", "/") + end + end end module Kernel From 1b4f394c527652210941d1da768b83203a33715d Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Fri, 6 Sep 2024 13:24:04 +0900 Subject: [PATCH 115/829] Only provide force_activate. Because it's hard to determine require name. --- prelude.rb | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/prelude.rb b/prelude.rb index e64c242db6d693..48d94641bd6de0 100644 --- a/prelude.rb +++ b/prelude.rb @@ -1,18 +1,15 @@ class Binding # :nodoc: def irb - begin - require 'irb' - rescue LoadError - force_require "irb" if defined?(Bundler) - end + force_activate "irb" if defined?(Bundler) && !Gem.loaded_specs["irb"] + require 'irb' irb end # suppress redefinition warning alias irb irb # :nodoc: - private def force_require(gem) + private def force_activate(gem) gemspecs = (Gem::Specification.dirs + [Gem.default_specifications_dir]).map{|d| Dir.glob("#{d}/#{gem}*.gemspec").reverse }.flatten @@ -20,9 +17,8 @@ def irb false else gemspec = Gem::Specification.load(gemspecs[0]) - gemspec.dependencies.each{|dep| force_require dep.name } + gemspec.dependencies.each{|dep| force_activate dep.name } gemspec.activate - require gem.gsub("-", "/") end end end From 74c4e562e2ed3f641e68219db507b5a41ea3b6eb Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Fri, 6 Sep 2024 13:26:50 +0900 Subject: [PATCH 116/829] Warn missing irb cases --- prelude.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/prelude.rb b/prelude.rb index 48d94641bd6de0..02d93efdd95482 100644 --- a/prelude.rb +++ b/prelude.rb @@ -1,7 +1,11 @@ class Binding # :nodoc: def irb - force_activate "irb" if defined?(Bundler) && !Gem.loaded_specs["irb"] + if defined?(Bundler) && !Gem.loaded_specs["irb"] + unless force_activate "irb" + warn "irb is not found. Install irb from RubyGems or add irb to Gemfile." + end + end require 'irb' irb end From 0e7b6e348fa5b85de365ab9ec62abe26d0adb0bc Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Fri, 6 Sep 2024 13:37:48 +0900 Subject: [PATCH 117/829] Merge GH-11492 --- lib/bundled_gems.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/bundled_gems.rb b/lib/bundled_gems.rb index 12e805f59e93c3..7adc0260ab3898 100644 --- a/lib/bundled_gems.rb +++ b/lib/bundled_gems.rb @@ -32,6 +32,7 @@ module Gem::BUNDLED_GEMS "win32ole" => "3.5.0", "fiddle" => "3.5.0", "logger" => "3.5.0", + "benchmark" => "3.5.0", "irb" => "3.5.0", "reline" => "3.5.0", # "readline" => "3.5.0", # This is wrapper for reline. We don't warn for this. From 7387a0979158c50ca37884f14bad2b493d3e2f0a Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Thu, 1 Aug 2024 00:26:20 +0900 Subject: [PATCH 118/829] [ruby/digest] Suppress md5 deprecation warnings by gcc as well as clang https://github.com/ruby/digest/commit/76878e3201 --- ext/digest/md5/md5cc.h | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/ext/digest/md5/md5cc.h b/ext/digest/md5/md5cc.h index e34d7d5c115a0c..0e7a58d2e0a483 100644 --- a/ext/digest/md5/md5cc.h +++ b/ext/digest/md5/md5cc.h @@ -1,8 +1,16 @@ #define COMMON_DIGEST_FOR_OPENSSL 1 #include -#ifdef __clang__ -# pragma clang diagnostic ignored "-Wdeprecated-declarations" +#ifdef __GNUC__ +# define RB_DIGEST_DIAGNOSTIC(compiler, op, flag) _Pragma(STRINGIZE(compiler diagnostic op flag)) +# ifdef RBIMPL_WARNING_IGNORED +# define RB_DIGEST_WARNING_IGNORED(flag) RBIMPL_WARNING_IGNORED(flag) +# elif defined(__clang__) +# define RB_DIGEST_WARNING_IGNORED(flag) RB_DIGEST_DIAGNOSTIC(clang, ignored, #flag) +# else /* __GNUC__ */ +# define RB_DIGEST_WARNING_IGNORED(flag) RB_DIGEST_DIAGNOSTIC(GCC, ignored, #flag) +# endif +RB_DIGEST_WARNING_IGNORED(-Wdeprecated-declarations) /* Suppress deprecation warnings of MD5 from Xcode 11.1 */ /* Although we know MD5 is deprecated too, provide just for backward * compatibility, as well as Apple does. */ From 214668fccbca2db14ce57797017b34acd86d4690 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Fri, 6 Sep 2024 15:53:46 +0900 Subject: [PATCH 119/829] [Feature #20707] Fix negative UTC offset conversion In short, get rid of division and modulo of negative integers. --- test/ruby/test_time.rb | 3 +++ time.c | 10 ++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/test/ruby/test_time.rb b/test/ruby/test_time.rb index cab14eb6941766..99ee84f247e2d0 100644 --- a/test/ruby/test_time.rb +++ b/test/ruby/test_time.rb @@ -1490,6 +1490,9 @@ def test_xmlschema_encode assert_equal("1960-12-31T23:00:00.123456Z", t.__send__(method, 6)) end + t = get_t2000.getlocal("-09:30") # Pacific/Marquesas + assert_equal("1999-12-31T14:30:00-09:30", t.__send__(method)) + assert_equal("10000-01-01T00:00:00Z", Time.utc(10000).__send__(method)) assert_equal("9999-01-01T00:00:00Z", Time.utc(9999).__send__(method)) assert_equal("0001-01-01T00:00:00Z", Time.utc(1).__send__(method)) # 1 AD diff --git a/time.c b/time.c index 801df3658edc78..51d39ff293bd3f 100644 --- a/time.c +++ b/time.c @@ -5285,13 +5285,15 @@ time_xmlschema(int argc, VALUE *argv, VALUE time) } else { long offset = NUM2LONG(rb_time_utc_offset(time)); + *ptr++ = offset < 0 ? '-' : '+'; + if (offset < 0) offset = -offset; int offset_hours = (int)(offset / 3600); - int offset_minutes = (int)((offset % 3600 / 60)); - written = snprintf(ptr, sizeof("+ZH:ZM"), "%+03d:%02d", offset_hours, offset_minutes); - RUBY_ASSERT(written == sizeof("+ZH:ZM") - 1); + int offset_minutes = (int)(offset % 3600 / 60); + written = snprintf(ptr, sizeof("ZH:ZM"), "%02d:%02d", offset_hours, offset_minutes); + RUBY_ASSERT(written == sizeof("ZH:ZM") - 1, "%d[%.*s]", written, written, ptr); ptr += written; } - rb_str_set_len(str, ptr -start); // We could skip coderange scanning as we know it's full ASCII. + rb_str_set_len(str, ptr - start); // We could skip coderange scanning as we know it's full ASCII. return str; } From bc85c8d8529b58c5c649f418ca549569ba348caa Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Thu, 5 Sep 2024 20:00:32 +0200 Subject: [PATCH 120/829] Implement Array#fetch_values [Feature #20702] Works the same way than `Hash#fetch_values` for for array. --- array.rb | 22 +++++++++++ spec/ruby/core/array/fetch_values_spec.rb | 48 +++++++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 spec/ruby/core/array/fetch_values_spec.rb diff --git a/array.rb b/array.rb index 9bfd7e9e9a900f..9a47c0eab2b046 100644 --- a/array.rb +++ b/array.rb @@ -210,4 +210,26 @@ def last n = unspecified = true end end end + + # call-seq: + # array.fetch_values(*indexes) -> new_array + # array.fetch_values(*indexes) {|key| ... } -> new_array + # + # Returns a new Array containing the values associated with the given indexes *indexes: + # a = [:foo, :bar, :baz] + # a.fetch_values(3, 1) # => [:baz, :foo] + # + # Returns a new empty Array if no arguments given. + # + # When a block is given, calls the block with each missing index, + # treating the block's return value as the value for that index: + # a = [:foo, :bar, :baz] + # values = a.fetch_values(1, 0, 42, 777) {|index| index.to_s} + # values # => [:bar, :foo, "42", "777"] + # + # When no block is given, raises an exception if any given key is not found. + def fetch_values(*indexes, &block) + indexes.map! { |i| fetch(i, &block) } + indexes + end end diff --git a/spec/ruby/core/array/fetch_values_spec.rb b/spec/ruby/core/array/fetch_values_spec.rb new file mode 100644 index 00000000000000..559b6c2b2fc948 --- /dev/null +++ b/spec/ruby/core/array/fetch_values_spec.rb @@ -0,0 +1,48 @@ +require_relative '../../spec_helper' +require_relative 'fixtures/classes' + +describe "Array#fetch_values" do + before :each do + @array = [:a, :b, :c] + end + + ruby_version_is "3.4" do + describe "with matched indexes" do + it "returns the values for indexes" do + @array.fetch_values(0).should == [:a] + @array.fetch_values(0, 2).should == [:a, :c] + end + + it "returns the values for indexes ordered in the order of the requested indexes" do + @array.fetch_values(2, 0).should == [:c, :a] + end + end + + describe "with unmatched indexes" do + it "raises a index error if no block is provided" do + -> { @array.fetch_values(0, 1, 44) }.should raise_error(IndexError) + end + + it "returns the default value from block" do + @array.fetch_values(44) { |index| "`#{index}' is not found" }.should == ["`44' is not found"] + @array.fetch_values(0, 44) { |index| "`#{index}' is not found" }.should == [:a, "`44' is not found"] + end + end + + describe "without keys" do + it "returns an empty Array" do + @array.fetch_values.should == [] + end + end + + it "tries to convert the passed argument to an Integer using #to_int" do + obj = mock('to_int') + obj.should_receive(:to_int).and_return(2) + @array.fetch_values(obj).should == [:c] + end + + it "raises a TypeError when the passed argument can't be coerced to Integer" do + -> { [].fetch_values("cat") }.should raise_error(TypeError) + end + end +end From 37712c1ed6cc57a3b5979a6e695ab24b5e64c4e6 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Fri, 6 Sep 2024 21:58:01 +0900 Subject: [PATCH 121/829] Prefer constants for `shutdown` over magic numbers --- ext/socket/basicsocket.c | 4 ++-- ext/socket/sockssocket.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ext/socket/basicsocket.c b/ext/socket/basicsocket.c index 54c369f6fcb4b8..8af8374ecf93f5 100644 --- a/ext/socket/basicsocket.c +++ b/ext/socket/basicsocket.c @@ -124,7 +124,7 @@ bsock_close_read(VALUE sock) rb_io_t *fptr; GetOpenFile(sock, fptr); - shutdown(fptr->fd, 0); + shutdown(fptr->fd, SHUT_RD); if (!(fptr->mode & FMODE_WRITABLE)) { return rb_io_close(sock); } @@ -157,7 +157,7 @@ bsock_close_write(VALUE sock) if (!(fptr->mode & FMODE_READABLE)) { return rb_io_close(sock); } - shutdown(fptr->fd, 1); + shutdown(fptr->fd, SHUT_WR); fptr->mode &= ~FMODE_WRITABLE; return Qnil; diff --git a/ext/socket/sockssocket.c b/ext/socket/sockssocket.c index f263ac3804abc7..1e94186cd0ab62 100644 --- a/ext/socket/sockssocket.c +++ b/ext/socket/sockssocket.c @@ -48,7 +48,7 @@ socks_s_close(VALUE sock) rb_io_t *fptr; GetOpenFile(sock, fptr); - shutdown(fptr->fd, 2); + shutdown(fptr->fd, SHUT_RDWR); return rb_io_close(sock); } #endif From 6bf519ba8128a2dfa7f2f2bec92ca6321b39406a Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Wed, 4 Sep 2024 10:49:43 -0400 Subject: [PATCH 122/829] Remove unneeded rb_darray_append_impl --- darray.h | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/darray.h b/darray.h index d24e3c3eb5f5c3..372115a96ba090 100644 --- a/darray.h +++ b/darray.h @@ -43,10 +43,7 @@ * * void rb_darray_append(rb_darray(T) *ptr_to_ary, T element); */ -#define rb_darray_append(ptr_to_ary, element) \ - rb_darray_append_impl(ptr_to_ary, element) - -#define rb_darray_append_impl(ptr_to_ary, element) do { \ +#define rb_darray_append(ptr_to_ary, element) do { \ rb_darray_ensure_space((ptr_to_ary), \ sizeof(**(ptr_to_ary)), \ sizeof((*(ptr_to_ary))->data[0])); \ From 5afee4d79599e5aad366a788b0c84e68594e6d34 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Tue, 13 Aug 2024 17:19:41 +0900 Subject: [PATCH 123/829] [rubygems/rubygems] Remove the lock file for binstubs https://github.com/rubygems/rubygems/pull/7806#issuecomment-2241662488 https://github.com/rubygems/rubygems/commit/4f06ee234a --- lib/rubygems.rb | 2 +- lib/rubygems/installer.rb | 3 ++- test/rubygems/test_gem_installer.rb | 10 ++++++++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/lib/rubygems.rb b/lib/rubygems.rb index bd9f240e2091d5..7626ccfdf0d65d 100644 --- a/lib/rubygems.rb +++ b/lib/rubygems.rb @@ -794,7 +794,7 @@ def self.open_file(path, flags, &block) File.open(path, flags, &block) end - MODE_TO_FLOCK = IO::RDONLY | IO::APPEND | IO::CREAT # :nodoc: + MODE_TO_FLOCK = IO::RDONLY | IO::APPEND | IO::CREAT | IO::SHARE_DELETE | IO::BINARY # :nodoc: ## # Open a file with given flags, and protect access with flock diff --git a/lib/rubygems/installer.rb b/lib/rubygems/installer.rb index d558c0be2bfaaa..8f95bab733f85f 100644 --- a/lib/rubygems/installer.rb +++ b/lib/rubygems/installer.rb @@ -538,7 +538,7 @@ def generate_plugins # :nodoc: def generate_bin_script(filename, bindir) bin_script_path = File.join bindir, formatted_program_filename(filename) - Gem.open_file_with_flock("#{bin_script_path}.lock") do + Gem.open_file_with_flock("#{bin_script_path}.lock") do |lock| require "fileutils" FileUtils.rm_f bin_script_path # prior install may have been --no-wrappers @@ -546,6 +546,7 @@ def generate_bin_script(filename, bindir) file.write app_script_text(filename) file.chmod(options[:prog_mode] || 0o755) end + File.unlink(lock.path) end verbose bin_script_path diff --git a/test/rubygems/test_gem_installer.rb b/test/rubygems/test_gem_installer.rb index a61d1b6fff28d6..2f4ff7349db469 100644 --- a/test/rubygems/test_gem_installer.rb +++ b/test/rubygems/test_gem_installer.rb @@ -1083,6 +1083,8 @@ def test_install_creates_working_binstub end assert_match(/ran executable/, e.message) + + assert_path_not_exist(File.join(installer.bin_dir, "executable.lock")) end def test_conflicting_binstubs @@ -1131,6 +1133,8 @@ def test_conflicting_binstubs # We expect the bin stub to activate the version that actually contains # the binstub. assert_match("I have an executable", e.message) + + assert_path_not_exist(File.join(installer.bin_dir, "executable.lock")) end def test_install_creates_binstub_that_understand_version @@ -1160,6 +1164,8 @@ def test_install_creates_binstub_that_understand_version end assert_includes(e.message, "can't find gem a (= 3.0)") + + assert_path_not_exist(File.join(installer.bin_dir, "executable.lock")) end def test_install_creates_binstub_that_prefers_user_installed_gem_to_default @@ -1192,6 +1198,8 @@ def test_install_creates_binstub_that_prefers_user_installed_gem_to_default end assert_equal(e.message, "ran executable") + + assert_path_not_exist(File.join(installer.bin_dir, "executable.lock")) end def test_install_creates_binstub_that_dont_trust_encoding @@ -1222,6 +1230,8 @@ def test_install_creates_binstub_that_dont_trust_encoding end assert_match(/ran executable/, e.message) + + assert_path_not_exist(File.join(installer.bin_dir, "executable.lock")) end def test_install_with_no_prior_files From 6dd917bd01f204e76d65137f2218d6305652f179 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Thu, 15 Aug 2024 16:20:46 +0900 Subject: [PATCH 124/829] [rubygems/rubygems] Workaround for TruffleRuby https://github.com/rubygems/rubygems/commit/b82e43fd54 --- lib/rubygems.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/rubygems.rb b/lib/rubygems.rb index 7626ccfdf0d65d..9d40fcc2f77aaf 100644 --- a/lib/rubygems.rb +++ b/lib/rubygems.rb @@ -794,7 +794,9 @@ def self.open_file(path, flags, &block) File.open(path, flags, &block) end - MODE_TO_FLOCK = IO::RDONLY | IO::APPEND | IO::CREAT | IO::SHARE_DELETE | IO::BINARY # :nodoc: + mode = IO::RDONLY | IO::APPEND | IO::CREAT | IO::BINARY + mode |= IO::SHARE_DELETE if IO.const_defined?(:SHARE_DELETE) + MODE_TO_FLOCK = mode # :nodoc: ## # Open a file with given flags, and protect access with flock From 30176e3f238f198ae835bf1c593d2ad2dce2df49 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Fri, 16 Aug 2024 20:19:22 +0900 Subject: [PATCH 125/829] [rubygems/rubygems] Ensure that the lock file will be removed https://github.com/rubygems/rubygems/commit/2706acb271 --- lib/rubygems/installer.rb | 3 ++- test/rubygems/test_gem_installer.rb | 28 ++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/lib/rubygems/installer.rb b/lib/rubygems/installer.rb index 8f95bab733f85f..1085f73fca53ea 100644 --- a/lib/rubygems/installer.rb +++ b/lib/rubygems/installer.rb @@ -546,7 +546,8 @@ def generate_bin_script(filename, bindir) file.write app_script_text(filename) file.chmod(options[:prog_mode] || 0o755) end - File.unlink(lock.path) + ensure + FileUtils.rm_f lock.path end verbose bin_script_path diff --git a/test/rubygems/test_gem_installer.rb b/test/rubygems/test_gem_installer.rb index 2f4ff7349db469..b83a01c73be330 100644 --- a/test/rubygems/test_gem_installer.rb +++ b/test/rubygems/test_gem_installer.rb @@ -1234,6 +1234,34 @@ def test_install_creates_binstub_that_dont_trust_encoding assert_path_not_exist(File.join(installer.bin_dir, "executable.lock")) end + def test_install_does_not_leave_lockfile_for_binstub + installer = util_setup_installer + + installer.wrappers = true + + File.class_eval do + alias_method :original_chmod, :chmod + define_method(:chmod) do |mode| + original_chmod(mode) + raise Gem::Ext::BuildError if path.end_with?("/executable") + end + end + + assert_raise(Gem::Ext::BuildError) do + installer.install + end + + assert_path_not_exist(File.join(installer.bin_dir, "executable.lock")) + # TODO: remove already copied files at failures. + # assert_path_not_exist(File.join(installer.bin_dir, "executable")) + ensure + File.class_eval do + remove_method :chmod + alias_method :chmod, :original_chmod + remove_method :original_chmod + end + end + def test_install_with_no_prior_files installer = util_setup_installer From ad742de79bcce53290005429868f63c51cbeb0f2 Mon Sep 17 00:00:00 2001 From: Jun Aruga Date: Thu, 5 Sep 2024 20:06:37 +0200 Subject: [PATCH 126/829] [ruby/openssl] Fix test_provider.rb in FIPS. https://github.com/ruby/openssl/commit/7bdbc52100 --- test/openssl/test_provider.rb | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/test/openssl/test_provider.rb b/test/openssl/test_provider.rb index b0ffae9ce72b83..6f85c00c988204 100644 --- a/test/openssl/test_provider.rb +++ b/test/openssl/test_provider.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true require_relative 'utils' -if defined?(OpenSSL) && defined?(OpenSSL::Provider) && !OpenSSL.fips_mode +if defined?(OpenSSL) && defined?(OpenSSL::Provider) class OpenSSL::TestProvider < OpenSSL::TestCase def test_openssl_provider_name_inspect @@ -12,14 +12,22 @@ def test_openssl_provider_name_inspect end def test_openssl_provider_names + # We expect the following providers are loaded in the cases: + # * Non-FIPS: default + # * FIPS: fips, base + # Use the null provider to test the added provider. + # See provider(7) - OPENSSL PROVIDERS to see the list of providers, and + # OSSL_PROVIDER-null(7) to check the details of the null provider. with_openssl <<-'end;' - base_provider = OpenSSL::Provider.load("base") - assert_equal(2, OpenSSL::Provider.provider_names.size) - assert_includes(OpenSSL::Provider.provider_names, "base") + num = OpenSSL::Provider.provider_names.size - assert_equal(true, base_provider.unload) - assert_equal(1, OpenSSL::Provider.provider_names.size) - assert_not_includes(OpenSSL::Provider.provider_names, "base") + added_provider = OpenSSL::Provider.load("null") + assert_equal(num + 1, OpenSSL::Provider.provider_names.size) + assert_includes(OpenSSL::Provider.provider_names, "null") + + assert_equal(true, added_provider.unload) + assert_equal(num, OpenSSL::Provider.provider_names.size) + assert_not_includes(OpenSSL::Provider.provider_names, "null") end; end @@ -33,6 +41,9 @@ def test_unloaded_openssl_provider end def test_openssl_legacy_provider + # The legacy provider is not supported on FIPS. + omit_on_fips + with_openssl(<<-'end;') begin OpenSSL::Provider.load("legacy") From 53f784178ac4eb4c854985e7855be2b9d66dfe8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Fri, 6 Sep 2024 12:59:38 +0200 Subject: [PATCH 127/829] [rubygems/rubygems] Remove unreachable code Nothing is actually raising this at the moment. https://github.com/rubygems/rubygems/commit/3b824ca7a6 --- lib/rubygems/commands/install_command.rb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/rubygems/commands/install_command.rb b/lib/rubygems/commands/install_command.rb index 2091634a2912c6..2888b6c55a8372 100644 --- a/lib/rubygems/commands/install_command.rb +++ b/lib/rubygems/commands/install_command.rb @@ -224,10 +224,6 @@ def install_gems # :nodoc: rescue Gem::InstallError => e alert_error "Error installing #{gem_name}:\n\t#{e.message}" exit_code |= 1 - rescue Gem::GemNotFoundException => e - show_lookup_failure e.name, e.version, e.errors, suppress_suggestions - - exit_code |= 2 rescue Gem::UnsatisfiableDependencyError => e show_lookup_failure e.name, e.version, e.errors, suppress_suggestions, "'#{gem_name}' (#{gem_version})" From 4478ca31131a1c5d7eac5ae79bfae5f2d28f4d60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Fri, 6 Sep 2024 13:01:49 +0200 Subject: [PATCH 128/829] [rubygems/rubygems] Remove incorrect documentation This exception has not been raised for a long time. https://github.com/rubygems/rubygems/commit/a6271a0b21 --- lib/rubygems/exceptions.rb | 3 --- 1 file changed, 3 deletions(-) diff --git a/lib/rubygems/exceptions.rb b/lib/rubygems/exceptions.rb index 0308b4687f9f49..10530163cbf8e7 100644 --- a/lib/rubygems/exceptions.rb +++ b/lib/rubygems/exceptions.rb @@ -104,9 +104,6 @@ class Gem::FormatException < Gem::Exception class Gem::GemNotFoundException < Gem::Exception; end -## -# Raised by the DependencyInstaller when a specific gem cannot be found - class Gem::SpecificGemNotFoundException < Gem::GemNotFoundException ## # Creates a new SpecificGemNotFoundException for a gem with the given +name+ From 2a17b4f0222a24e2ae2cd686e611f6951215387e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Fri, 6 Sep 2024 13:02:07 +0200 Subject: [PATCH 129/829] [rubygems/rubygems] Deprecate constant that has been unused for a long time https://github.com/rubygems/rubygems/commit/282dbb3d62 --- lib/rubygems/exceptions.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/rubygems/exceptions.rb b/lib/rubygems/exceptions.rb index 10530163cbf8e7..793324b875c754 100644 --- a/lib/rubygems/exceptions.rb +++ b/lib/rubygems/exceptions.rb @@ -134,6 +134,8 @@ def initialize(name, version, errors=nil) attr_reader :errors end +Gem.deprecate_constant :SpecificGemNotFoundException + ## # Raised by Gem::Resolver when dependencies conflict and create the # inability to find a valid possible spec for a request. From fe1bace43c73d88a5721e9b97066e746a34f135c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Fri, 6 Sep 2024 09:34:00 +0200 Subject: [PATCH 130/829] [rubygems/rubygems] Fix `gem install does-not-exist` being super slow Every time a gem is not found in the Compact Index API, RubyGems will fallback to the full index, which is very slow. This is unnecessary because both indexes should be providing the same gems, so if a gem can't be found in the Compact Index API, it won't be found in the full index. We _do_ want a fallback to the full index, whenever the Compact Index API is not implemented. To detect that, we check that the API responds to the "/versions" endpoint, just like Bundler does. Before: ``` $ time gem install fooasdsfafs ERROR: Could not find a valid gem 'fooasdsfafs' (>= 0) in any repository gem 20,77s user 0,59s system 96% cpu 22,017 total ``` After: ``` $ time gem install fooasdsfafs ERROR: Could not find a valid gem 'fooasdsfafs' (>= 0) in any repository gem 5,02s user 0,09s system 91% cpu 5,568 total ``` https://github.com/rubygems/rubygems/commit/c0d6b9eea7 --- lib/rubygems/resolver/best_set.rb | 30 +------ lib/rubygems/source.rb | 2 +- test/rubygems/test_gem_resolver_best_set.rb | 82 +------------------ test/rubygems/test_gem_source.rb | 2 +- .../test_gem_source_subpath_problem.rb | 2 +- 5 files changed, 8 insertions(+), 110 deletions(-) diff --git a/lib/rubygems/resolver/best_set.rb b/lib/rubygems/resolver/best_set.rb index a983f8c6b69f2f..57d0d0037576d5 100644 --- a/lib/rubygems/resolver/best_set.rb +++ b/lib/rubygems/resolver/best_set.rb @@ -29,10 +29,8 @@ def find_all(req) # :nodoc: pick_sets if @remote && @sets.empty? super - rescue Gem::RemoteFetcher::FetchError => e - replace_failed_api_set e - - retry + rescue Gem::RemoteFetcher::FetchError + [] end def prefetch(reqs) # :nodoc: @@ -50,28 +48,4 @@ def pretty_print(q) # :nodoc: q.pp @sets end end - - ## - # Replaces a failed APISet for the URI in +error+ with an IndexSet. - # - # If no matching APISet can be found the original +error+ is raised. - # - # The calling method must retry the exception to repeat the lookup. - - def replace_failed_api_set(error) # :nodoc: - uri = error.original_uri - uri = Gem::URI uri unless Gem::URI === uri - uri += "." - - raise error unless api_set = @sets.find do |set| - Gem::Resolver::APISet === set && set.dep_uri == uri - end - - index_set = Gem::Resolver::IndexSet.new api_set.source - - @sets.map! do |set| - next set unless set == api_set - index_set - end - end end diff --git a/lib/rubygems/source.rb b/lib/rubygems/source.rb index 4e5545982d6432..59dcc2e1e1e607 100644 --- a/lib/rubygems/source.rb +++ b/lib/rubygems/source.rb @@ -79,7 +79,7 @@ def dependency_resolver_set # :nodoc: uri end - bundler_api_uri = enforce_trailing_slash(fetch_uri) + bundler_api_uri = enforce_trailing_slash(fetch_uri) + "./versions" begin fetcher = Gem::RemoteFetcher.fetcher diff --git a/test/rubygems/test_gem_resolver_best_set.rb b/test/rubygems/test_gem_resolver_best_set.rb index 8a750cdf8fd665..02f542efc07920 100644 --- a/test/rubygems/test_gem_resolver_best_set.rb +++ b/test/rubygems/test_gem_resolver_best_set.rb @@ -9,33 +9,17 @@ def test_initialize assert_empty set.sets end - def test_find_all_index + def test_find_all spec_fetcher do |fetcher| fetcher.spec "a", 1 - fetcher.spec "a", 2 - fetcher.spec "b", 1 end - set = Gem::Resolver::BestSet.new - - dependency = dep "a", "~> 1" - - req = Gem::Resolver::DependencyRequest.new dependency, nil - - found = set.find_all req - - assert_equal %w[a-1], found.map(&:full_name) - end + api_uri = Gem::URI "#{@gem_repo}info/" - def test_find_all_fallback - spec_fetcher do |fetcher| - fetcher.spec "a", 1 - end + @fetcher.data["#{api_uri}a"] = "---\n1 " set = Gem::Resolver::BestSet.new - api_uri = Gem::URI(@gem_repo) - set.sets << Gem::Resolver::APISet.new(api_uri) dependency = dep "a", "~> 1" @@ -90,64 +74,4 @@ def test_prefetch_local assert_empty set.sets end - - def test_replace_failed_api_set - set = Gem::Resolver::BestSet.new - - api_uri = Gem::URI(@gem_repo) + "./info/" - api_set = Gem::Resolver::APISet.new api_uri - - set.sets << api_set - - error_uri = api_uri + "a" - - error = Gem::RemoteFetcher::FetchError.new "bogus", error_uri - - set.replace_failed_api_set error - - assert_equal 1, set.sets.size - - refute_includes set.sets, api_set - - assert_kind_of Gem::Resolver::IndexSet, set.sets.first - end - - def test_replace_failed_api_set_no_api_set - set = Gem::Resolver::BestSet.new - - index_set = Gem::Resolver::IndexSet.new Gem::Source.new @gem_repo - - set.sets << index_set - - error = Gem::RemoteFetcher::FetchError.new "bogus", @gem_repo - - e = assert_raise Gem::RemoteFetcher::FetchError do - set.replace_failed_api_set error - end - - assert_equal error, e - end - - def test_replace_failed_api_set_uri_with_credentials - set = Gem::Resolver::BestSet.new - - api_uri = Gem::URI(@gem_repo) + "./info/" - api_uri.user = "user" - api_uri.password = "pass" - api_set = Gem::Resolver::APISet.new api_uri - - set.sets << api_set - - error_uri = api_uri + "a" - - error = Gem::RemoteFetcher::FetchError.new "bogus", error_uri - - set.replace_failed_api_set error - - assert_equal 1, set.sets.size - - refute_includes set.sets, api_set - - assert_kind_of Gem::Resolver::IndexSet, set.sets.first - end end diff --git a/test/rubygems/test_gem_source.rb b/test/rubygems/test_gem_source.rb index 6baa203dcb1829..423abd6dd20a37 100644 --- a/test/rubygems/test_gem_source.rb +++ b/test/rubygems/test_gem_source.rb @@ -46,7 +46,7 @@ def test_dependency_resolver_set_bundler_api response = Gem::Net::HTTPResponse.new "1.1", 200, "OK" response.uri = Gem::URI("http://example") - @fetcher.data[@gem_repo] = response + @fetcher.data["#{@gem_repo}versions"] = response set = @source.dependency_resolver_set diff --git a/test/rubygems/test_gem_source_subpath_problem.rb b/test/rubygems/test_gem_source_subpath_problem.rb index a451a81a25cb4a..ad11529f670572 100644 --- a/test/rubygems/test_gem_source_subpath_problem.rb +++ b/test/rubygems/test_gem_source_subpath_problem.rb @@ -24,7 +24,7 @@ def test_dependency_resolver_set response = Gem::Net::HTTPResponse.new "1.1", 200, "OK" response.uri = Gem::URI("http://example") - @fetcher.data["#{@gem_repo}/"] = response + @fetcher.data["#{@gem_repo}/versions"] = response set = @source.dependency_resolver_set From b0adae7fb25cd0c2113c3498d384c1f0ffad5e6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Fri, 6 Sep 2024 19:01:46 +0200 Subject: [PATCH 131/829] [rubygems/rubygems] Remove unnecessary "./" when appending string to uri https://github.com/rubygems/rubygems/commit/732679306d --- lib/rubygems/source.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/rubygems/source.rb b/lib/rubygems/source.rb index 59dcc2e1e1e607..bee5681dab293c 100644 --- a/lib/rubygems/source.rb +++ b/lib/rubygems/source.rb @@ -79,7 +79,7 @@ def dependency_resolver_set # :nodoc: uri end - bundler_api_uri = enforce_trailing_slash(fetch_uri) + "./versions" + bundler_api_uri = enforce_trailing_slash(fetch_uri) + "versions" begin fetcher = Gem::RemoteFetcher.fetcher From 2865148a5aeb067ab8e1373a12c2f16de8cca0c9 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Wed, 4 Sep 2024 13:47:03 -0400 Subject: [PATCH 132/829] Revert "Check for both aarch64 and arm64 arch's for pac-ret" This reverts commit 6a746e1bc902d4245aac58db4e9ffc2f72d79629. This patch breaks the C level backtrace on macOS ARM machines. --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 81788e47f87169..884fe9a412cd56 100644 --- a/configure.ac +++ b/configure.ac @@ -839,7 +839,7 @@ AS_IF([test "$GCC" = yes], [ ]) # aarch64 branch protection - AS_CASE(["$target_cpu"], [aarch64|arm64], [ + AS_CASE(["$target_cpu"], [aarch64], [ AS_FOR(option, opt, [-mbranch-protection=pac-ret -msign-return-address=all], [ # Try these flags in the _prepended_ position - i.e. we want to try building a program # with CFLAGS="-mbranch-protection=pac-ret $CFLAGS". If the builder has provided different From 731805ddde4b6a2b72a6648f1b3a61dd0366af76 Mon Sep 17 00:00:00 2001 From: KJ Tsanaktsidis Date: Fri, 6 Sep 2024 16:06:16 +1000 Subject: [PATCH 133/829] Add an explicit check for broken libunwind builds Libunwind as packaged in MacOS cannot actually unwind code which has pointer authentication on, because _LIBUNWIND_IS_NATIVE_ONLY is not defined. Add a check for this, and prefer building with working unwinding over pointer authentication if we must make a choice. --- configure.ac | 46 +++++++++++++++++++++++++++++++++------------- 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/configure.ac b/configure.ac index 884fe9a412cd56..9ccbd53f172f27 100644 --- a/configure.ac +++ b/configure.ac @@ -839,19 +839,39 @@ AS_IF([test "$GCC" = yes], [ ]) # aarch64 branch protection - AS_CASE(["$target_cpu"], [aarch64], [ - AS_FOR(option, opt, [-mbranch-protection=pac-ret -msign-return-address=all], [ - # Try these flags in the _prepended_ position - i.e. we want to try building a program - # with CFLAGS="-mbranch-protection=pac-ret $CFLAGS". If the builder has provided different - # branch protection flags in CFLAGS, we don't want to overwrite those. We just want to - # find some branch protection flags which work if none were provided. - RUBY_TRY_CFLAGS_PREPEND(option, [branch_protection=yes], [branch_protection=no]) - AS_IF([test "x$branch_protection" = xyes], [ - # _prepend_ the options to CFLAGS, so that user-provided flags will overwrite them. - # These CFLAGS are used during the configure script to compile further test programs; - # however, $harden_flags is prepended separately to CFLAGS at the end of the script. - RUBY_PREPEND_OPTION(hardenflags, $opt) - break + AS_CASE(["$target_cpu"], [aarch64|arm64], [ + # LLVM libunwind is not actually capable of unwinding code compiled with pointer + # authentication unless it's built without LIBUNWIND_ENABLE_CROSS_UNWINDING (see + # https://github.com/llvm/llvm-project/blob/8e35c86977ce5529a9387657321ac9fefcdae5b5/libunwind/src/DwarfInstructions.hpp#L294) + # It seems that macOS ships LLVM compiled this way. + # Detect this and disable automatic insertion of pac-ret flags in that case, since we assume + # that reliable backtraces are more important than hardening flags. + AC_MSG_CHECKING([for a broken LLVM libunwind that cannot unwind code with RA signing]) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + @%:@include + int foo = UNW_ECROSSRASIGNING; + ]])], + # If compilation succeeds, that means we a) had libunwind, and b) it was NOT native only + [rb_cv_libunwind_broken_ra_signing=yes], + # if compilation fails, that means we either a) do not have libunwind, or b) have it in + # native only mode (which is good!) + [rb_cv_libunwind_broken_ra_signing=no] + ) + AC_MSG_RESULT(["$rb_cv_libunwind_broken_ra_signing"]) + AS_IF([test "x$rb_cv_libunwind_broken_ra_signing" = "xno"], [ + AS_FOR(option, opt, [-mbranch-protection=pac-ret -msign-return-address=all], [ + # Try these flags in the _prepended_ position - i.e. we want to try building a program + # with CFLAGS="-mbranch-protection=pac-ret $CFLAGS". If the builder has provided different + # branch protection flags in CFLAGS, we don't want to overwrite those. We just want to + # find some branch protection flags which work if none were provided. + RUBY_TRY_CFLAGS_PREPEND(option, [branch_protection=yes], [branch_protection=no]) + AS_IF([test "x$branch_protection" = xyes], [ + # _prepend_ the options to CFLAGS, so that user-provided flags will overwrite them. + # These CFLAGS are used during the configure script to compile further test programs; + # however, $harden_flags is prepended separately to CFLAGS at the end of the script. + RUBY_PREPEND_OPTION(hardenflags, $opt) + break + ]) ]) ]) ]) From 6dc93846943a0fc85e597fd16c653de6fd7f35d7 Mon Sep 17 00:00:00 2001 From: Mads Ohm Larsen Date: Fri, 6 Sep 2024 23:26:13 +0200 Subject: [PATCH 134/829] [ruby/rdoc] Add more space after magnifying glass (https://github.com/ruby/rdoc/pull/1173) https://github.com/ruby/rdoc/commit/6a9cad4c54 --- lib/rdoc/generator/template/darkfish/css/rdoc.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/rdoc/generator/template/darkfish/css/rdoc.css b/lib/rdoc/generator/template/darkfish/css/rdoc.css index 0032ac172a8ab9..7171fd7895a15f 100644 --- a/lib/rdoc/generator/template/darkfish/css/rdoc.css +++ b/lib/rdoc/generator/template/darkfish/css/rdoc.css @@ -307,7 +307,7 @@ main h6 { #search-field { width: 100%; - padding: 0.5em 1em 0.5em 2em; + padding: 0.5em 1em 0.5em 2.5em; border: 1px solid var(--border-color); border-radius: 20px; font-size: 14px; From c1a510a8dffa1c8065e47697cd57edae67126712 Mon Sep 17 00:00:00 2001 From: Jonathan Calvert Date: Fri, 6 Sep 2024 22:19:47 -0500 Subject: [PATCH 135/829] [Bug #20718] Free non-`RTypedData` objects Allow objects that are not of type `RTypedData` to use the default free function, as `RTYPEDDATA_EMBEDDED_P` can return a false positive when casting non-`RTypedData` objects. --- gc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gc.c b/gc.c index 32347847973eae..c6531346952d28 100644 --- a/gc.c +++ b/gc.c @@ -1051,7 +1051,7 @@ rb_data_free(void *objspace, VALUE obj) if (dfree) { if (dfree == RUBY_DEFAULT_FREE) { - if (!RTYPEDDATA_EMBEDDED_P(obj)) { + if (!RTYPEDDATA_P(obj) || !RTYPEDDATA_EMBEDDED_P(obj)) { xfree(data); RB_DEBUG_COUNTER_INC(obj_data_xfree); } From c1862cbb89a6bf42dcd07d92fe4f4bfeebca5775 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sat, 7 Sep 2024 16:06:14 +0900 Subject: [PATCH 136/829] [Bug #20719] `Float` argument must be ASCII compatible --- object.c | 1 + test/ruby/test_float.rb | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/object.c b/object.c index e2e68e07a429dc..bbc607ea98384f 100644 --- a/object.c +++ b/object.c @@ -3530,6 +3530,7 @@ rb_str_to_dbl_raise(VALUE str, int badcheck, int raise, int *error) VALUE v = 0; StringValue(str); + rb_must_asciicompat(str); s = RSTRING_PTR(str); len = RSTRING_LEN(str); if (s) { diff --git a/test/ruby/test_float.rb b/test/ruby/test_float.rb index 415d62467edc48..a0b9b444648a78 100644 --- a/test/ruby/test_float.rb +++ b/test/ruby/test_float.rb @@ -850,6 +850,12 @@ def test_Float o = Object.new def o.to_f; inf = Float::INFINITY; inf/inf; end assert_predicate(Float(o), :nan?) + + assert_raise(Encoding::CompatibilityError) {Float("0".encode("utf-16be"))} + assert_raise(Encoding::CompatibilityError) {Float("0".encode("utf-16le"))} + assert_raise(Encoding::CompatibilityError) {Float("0".encode("utf-32be"))} + assert_raise(Encoding::CompatibilityError) {Float("0".encode("utf-32le"))} + assert_raise(Encoding::CompatibilityError) {Float("0".encode("iso-2022-jp"))} end def test_invalid_str From f97332a3a3647b79a19a7ad81ab8e58bc8608399 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sat, 7 Sep 2024 16:34:28 +0900 Subject: [PATCH 137/829] Preserve encoding in exception message of `Float` --- object.c | 12 ++++++++---- test/ruby/test_float.rb | 2 ++ 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/object.c b/object.c index bbc607ea98384f..ae6ec6ea545086 100644 --- a/object.c +++ b/object.c @@ -3400,7 +3400,7 @@ rb_f_integer(rb_execution_context_t *ec, VALUE obj, VALUE arg, VALUE base, VALUE } static double -rb_cstr_to_dbl_raise(const char *p, int badcheck, int raise, int *error) +rb_cstr_to_dbl_raise(const char *p, rb_encoding *enc, int badcheck, int raise, int *error) { const char *q; char *end; @@ -3411,6 +3411,7 @@ rb_cstr_to_dbl_raise(const char *p, int badcheck, int raise, int *error) #define OutOfRange() ((end - p > max_width) ? \ (w = max_width, ellipsis = "...") : \ (w = (int)(end - p), ellipsis = "")) + /* p...end has been parsed with strtod, should be ASCII-only */ if (!p) return 0.0; q = p; @@ -3506,7 +3507,8 @@ rb_cstr_to_dbl_raise(const char *p, int badcheck, int raise, int *error) bad: if (raise) { - rb_invalid_str(q, "Float()"); + VALUE s = rb_enc_str_new_cstr(q, enc); + rb_raise(rb_eArgError, "invalid value for Float(): %+"PRIsVALUE, s); UNREACHABLE_RETURN(nan("")); } else { @@ -3518,7 +3520,7 @@ rb_cstr_to_dbl_raise(const char *p, int badcheck, int raise, int *error) double rb_cstr_to_dbl(const char *p, int badcheck) { - return rb_cstr_to_dbl_raise(p, badcheck, TRUE, NULL); + return rb_cstr_to_dbl_raise(p, NULL, badcheck, TRUE, NULL); } static double @@ -3549,9 +3551,11 @@ rb_str_to_dbl_raise(VALUE str, int badcheck, int raise, int *error) s = p; } } - ret = rb_cstr_to_dbl_raise(s, badcheck, raise, error); + ret = rb_cstr_to_dbl_raise(s, rb_enc_get(str), badcheck, raise, error); if (v) ALLOCV_END(v); + else + RB_GC_GUARD(str); return ret; } diff --git a/test/ruby/test_float.rb b/test/ruby/test_float.rb index a0b9b444648a78..9f522c32bf6435 100644 --- a/test/ruby/test_float.rb +++ b/test/ruby/test_float.rb @@ -856,6 +856,8 @@ def o.to_f; inf = Float::INFINITY; inf/inf; end assert_raise(Encoding::CompatibilityError) {Float("0".encode("utf-32be"))} assert_raise(Encoding::CompatibilityError) {Float("0".encode("utf-32le"))} assert_raise(Encoding::CompatibilityError) {Float("0".encode("iso-2022-jp"))} + + assert_raise_with_message(ArgumentError, /\u{1f4a1}/) {Float("\u{1f4a1}")} end def test_invalid_str From 47742841246c637053dc8dad447c7e5e28182676 Mon Sep 17 00:00:00 2001 From: Koichi ITO Date: Sat, 7 Sep 2024 23:21:29 +0900 Subject: [PATCH 138/829] [ruby/prism] Fix a token incompatibility for `Prism::Translation::Parser::Lexer` This PR fixes a token incompatibility between Parser gem and `Prism::Translation::Parser` for left parenthesis. ## Parser gem (Expected) Returns `tLPAREN2` token: ```console $ bundle exec ruby -Ilib -rparser/ruby33 \ -ve 'buf = Parser::Source::Buffer.new("example.rb"); buf.source = "foo(:bar)"; p Parser::Ruby33.new.tokenize(buf)[2]' ruby 3.4.0dev (2024-09-01T11:00:13Z master https://github.com/ruby/prism/commit/eb144ef91e) [x86_64-darwin23] [[:tIDENTIFIER, ["foo", #]], [:tLPAREN2, ["(", #]], [:tSYMBOL, ["bar", #]], [:tRPAREN, [")", #]]] ``` ## `Prism::Translation::Parser` (Actual) Previously, the parser returned `tLPAREN` token when parsing the following: ```console $ bundle exec ruby -Ilib -rprism -rprism/translation/parser33 -ve \ 'buf = Parser::Source::Buffer.new("example.rb"); buf.source = "foo(:bar)"; p Prism::Translation::Parser33.new.tokenize(buf)[2]' ruby 3.4.0dev (2024-09-01T11:00:13Z master https://github.com/ruby/prism/commit/eb144ef91e) [x86_64-darwin23] [[:tIDENTIFIER, ["foo", #]], [:tLPAREN, ["(", #]], [:tSYMBOL, ["bar", #]], [:tRPAREN, [")", #]]] ``` After the update, the parser now returns `tLPAREN2` token for the same input: ```console $ bundle exec ruby -Ilib -rprism -rprism/translation/parser33 -ve \ 'buf = Parser::Source::Buffer.new("example.rb"); buf.source = "foo(:bar)"; p Prism::Translation::Parser33.new.tokenize(buf)[2]' ruby 3.4.0dev (2024-09-01T11:00:13Z master https://github.com/ruby/prism/commit/eb144ef91e) [x86_64-darwin23] [[:tIDENTIFIER, ["foo", #]], [:tLPAREN2, ["(", #]], [:tSYMBOL, ["bar", #]], [:tRPAREN, [")", #]]] ``` The `PARENTHESIS_LEFT` token in Prism is classified as either `tLPAREN` or `tLPAREN2` in the Parser gem. The tokens that were previously all classified as `tLPAREN` are now also classified to `tLPAREN2`. With this change, the following code could be removed from `test/prism/ruby/parser_test.rb`: ```diff - when :tLPAREN - actual_token[0] = expected_token[0] if expected_token[0] == :tLPAREN2 ``` https://github.com/ruby/prism/commit/04d6f3478d --- lib/prism/translation/parser/lexer.rb | 13 ++- .../unparser/corpus/literal/unary.txt | 1 + test/prism/ruby/parser_test.rb | 2 - .../unparser/corpus/literal/unary.txt | 84 +++++++++++++++---- 4 files changed, 78 insertions(+), 22 deletions(-) diff --git a/lib/prism/translation/parser/lexer.rb b/lib/prism/translation/parser/lexer.rb index 8191bd19c5b5ce..f6873607894f76 100644 --- a/lib/prism/translation/parser/lexer.rb +++ b/lib/prism/translation/parser/lexer.rb @@ -134,7 +134,7 @@ class Lexer MINUS_GREATER: :tLAMBDA, NEWLINE: :tNL, NUMBERED_REFERENCE: :tNTH_REF, - PARENTHESIS_LEFT: :tLPAREN, + PARENTHESIS_LEFT: :tLPAREN2, PARENTHESIS_LEFT_PARENTHESES: :tLPAREN_ARG, PARENTHESIS_RIGHT: :tRPAREN, PERCENT: :tPERCENT, @@ -187,7 +187,14 @@ class Lexer EXPR_BEG = 0x1 # :nodoc: EXPR_LABEL = 0x400 # :nodoc: - private_constant :TYPES, :EXPR_BEG, :EXPR_LABEL + # The `PARENTHESIS_LEFT` token in Prism is classified as either `tLPAREN` or `tLPAREN2` in the Parser gem. + # The following token types are listed as those classified as `tLPAREN`. + LPAREN_CONVERSION_TOKEN_TYPES = [ + :kBREAK, :kCASE, :tDIVIDE, :kFOR, :kIF, :kNEXT, :kRETURN, :kUNTIL, :kWHILE, :tAMPER, :tANDOP, :tBANG, :tCOMMA, :tDOT2, :tDOT3, + :tEQL, :tLPAREN, :tLPAREN2, :tLSHFT, :tNL, :tOP_ASGN, :tOROP, :tPIPE, :tSEMI, :tSTRING_DBEG, :tUMINUS, :tUPLUS + ] + + private_constant :TYPES, :EXPR_BEG, :EXPR_LABEL, :LPAREN_CONVERSION_TOKEN_TYPES # The Parser::Source::Buffer that the tokens were lexed from. attr_reader :source_buffer @@ -268,6 +275,8 @@ def to_a value.chomp!(":") when :tLCURLY type = :tLBRACE if state == EXPR_BEG | EXPR_LABEL + when :tLPAREN2 + type = :tLPAREN if tokens.empty? || LPAREN_CONVERSION_TOKEN_TYPES.include?(tokens.dig(-1, 0)) when :tNTH_REF value = parse_integer(value.delete_prefix("$")) when :tOP_ASGN diff --git a/test/prism/fixtures/unparser/corpus/literal/unary.txt b/test/prism/fixtures/unparser/corpus/literal/unary.txt index 77685cb71d080a..6992d86bb02dbe 100644 --- a/test/prism/fixtures/unparser/corpus/literal/unary.txt +++ b/test/prism/fixtures/unparser/corpus/literal/unary.txt @@ -6,3 +6,4 @@ -a +a -(-a).foo ++(+a).foo diff --git a/test/prism/ruby/parser_test.rb b/test/prism/ruby/parser_test.rb index b60ccf9320970b..f443342045f29b 100644 --- a/test/prism/ruby/parser_test.rb +++ b/test/prism/ruby/parser_test.rb @@ -271,8 +271,6 @@ def assert_equal_tokens(expected_tokens, actual_tokens) case actual_token[0] when :kDO actual_token[0] = expected_token[0] if %i[kDO_BLOCK kDO_LAMBDA].include?(expected_token[0]) - when :tLPAREN - actual_token[0] = expected_token[0] if expected_token[0] == :tLPAREN2 when :tPOW actual_token[0] = expected_token[0] if expected_token[0] == :tDSTAR end diff --git a/test/prism/snapshots/unparser/corpus/literal/unary.txt b/test/prism/snapshots/unparser/corpus/literal/unary.txt index be19b0457c9df0..ec2115e4119d58 100644 --- a/test/prism/snapshots/unparser/corpus/literal/unary.txt +++ b/test/prism/snapshots/unparser/corpus/literal/unary.txt @@ -1,10 +1,10 @@ -@ ProgramNode (location: (1,0)-(8,9)) +@ ProgramNode (location: (1,0)-(9,9)) ├── flags: ∅ ├── locals: [] └── statements: - @ StatementsNode (location: (1,0)-(8,9)) + @ StatementsNode (location: (1,0)-(9,9)) ├── flags: ∅ - └── body: (length: 8) + └── body: (length: 9) ├── @ CallNode (location: (1,0)-(1,2)) │ ├── flags: newline │ ├── receiver: @@ -211,50 +211,98 @@ │ ├── arguments: ∅ │ ├── closing_loc: ∅ │ └── block: ∅ - └── @ CallNode (location: (8,0)-(8,9)) + ├── @ CallNode (location: (8,0)-(8,9)) + │ ├── flags: newline + │ ├── receiver: + │ │ @ CallNode (location: (8,1)-(8,9)) + │ │ ├── flags: ∅ + │ │ ├── receiver: + │ │ │ @ ParenthesesNode (location: (8,1)-(8,5)) + │ │ │ ├── flags: ∅ + │ │ │ ├── body: + │ │ │ │ @ StatementsNode (location: (8,2)-(8,4)) + │ │ │ │ ├── flags: ∅ + │ │ │ │ └── body: (length: 1) + │ │ │ │ └── @ CallNode (location: (8,2)-(8,4)) + │ │ │ │ ├── flags: newline + │ │ │ │ ├── receiver: + │ │ │ │ │ @ CallNode (location: (8,3)-(8,4)) + │ │ │ │ │ ├── flags: variable_call, ignore_visibility + │ │ │ │ │ ├── receiver: ∅ + │ │ │ │ │ ├── call_operator_loc: ∅ + │ │ │ │ │ ├── name: :a + │ │ │ │ │ ├── message_loc: (8,3)-(8,4) = "a" + │ │ │ │ │ ├── opening_loc: ∅ + │ │ │ │ │ ├── arguments: ∅ + │ │ │ │ │ ├── closing_loc: ∅ + │ │ │ │ │ └── block: ∅ + │ │ │ │ ├── call_operator_loc: ∅ + │ │ │ │ ├── name: :-@ + │ │ │ │ ├── message_loc: (8,2)-(8,3) = "-" + │ │ │ │ ├── opening_loc: ∅ + │ │ │ │ ├── arguments: ∅ + │ │ │ │ ├── closing_loc: ∅ + │ │ │ │ └── block: ∅ + │ │ │ ├── opening_loc: (8,1)-(8,2) = "(" + │ │ │ └── closing_loc: (8,4)-(8,5) = ")" + │ │ ├── call_operator_loc: (8,5)-(8,6) = "." + │ │ ├── name: :foo + │ │ ├── message_loc: (8,6)-(8,9) = "foo" + │ │ ├── opening_loc: ∅ + │ │ ├── arguments: ∅ + │ │ ├── closing_loc: ∅ + │ │ └── block: ∅ + │ ├── call_operator_loc: ∅ + │ ├── name: :-@ + │ ├── message_loc: (8,0)-(8,1) = "-" + │ ├── opening_loc: ∅ + │ ├── arguments: ∅ + │ ├── closing_loc: ∅ + │ └── block: ∅ + └── @ CallNode (location: (9,0)-(9,9)) ├── flags: newline ├── receiver: - │ @ CallNode (location: (8,1)-(8,9)) + │ @ CallNode (location: (9,1)-(9,9)) │ ├── flags: ∅ │ ├── receiver: - │ │ @ ParenthesesNode (location: (8,1)-(8,5)) + │ │ @ ParenthesesNode (location: (9,1)-(9,5)) │ │ ├── flags: ∅ │ │ ├── body: - │ │ │ @ StatementsNode (location: (8,2)-(8,4)) + │ │ │ @ StatementsNode (location: (9,2)-(9,4)) │ │ │ ├── flags: ∅ │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (8,2)-(8,4)) + │ │ │ └── @ CallNode (location: (9,2)-(9,4)) │ │ │ ├── flags: newline │ │ │ ├── receiver: - │ │ │ │ @ CallNode (location: (8,3)-(8,4)) + │ │ │ │ @ CallNode (location: (9,3)-(9,4)) │ │ │ │ ├── flags: variable_call, ignore_visibility │ │ │ │ ├── receiver: ∅ │ │ │ │ ├── call_operator_loc: ∅ │ │ │ │ ├── name: :a - │ │ │ │ ├── message_loc: (8,3)-(8,4) = "a" + │ │ │ │ ├── message_loc: (9,3)-(9,4) = "a" │ │ │ │ ├── opening_loc: ∅ │ │ │ │ ├── arguments: ∅ │ │ │ │ ├── closing_loc: ∅ │ │ │ │ └── block: ∅ │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :-@ - │ │ │ ├── message_loc: (8,2)-(8,3) = "-" + │ │ │ ├── name: :+@ + │ │ │ ├── message_loc: (9,2)-(9,3) = "+" │ │ │ ├── opening_loc: ∅ │ │ │ ├── arguments: ∅ │ │ │ ├── closing_loc: ∅ │ │ │ └── block: ∅ - │ │ ├── opening_loc: (8,1)-(8,2) = "(" - │ │ └── closing_loc: (8,4)-(8,5) = ")" - │ ├── call_operator_loc: (8,5)-(8,6) = "." + │ │ ├── opening_loc: (9,1)-(9,2) = "(" + │ │ └── closing_loc: (9,4)-(9,5) = ")" + │ ├── call_operator_loc: (9,5)-(9,6) = "." │ ├── name: :foo - │ ├── message_loc: (8,6)-(8,9) = "foo" + │ ├── message_loc: (9,6)-(9,9) = "foo" │ ├── opening_loc: ∅ │ ├── arguments: ∅ │ ├── closing_loc: ∅ │ └── block: ∅ ├── call_operator_loc: ∅ - ├── name: :-@ - ├── message_loc: (8,0)-(8,1) = "-" + ├── name: :+@ + ├── message_loc: (9,0)-(9,1) = "+" ├── opening_loc: ∅ ├── arguments: ∅ ├── closing_loc: ∅ From ec5d5422ca7220975a4eded9a39a9f2a30d9e758 Mon Sep 17 00:00:00 2001 From: Mads Ohm Larsen Date: Sun, 8 Sep 2024 14:17:33 +0200 Subject: [PATCH 139/829] [ruby/rdoc] Use pointer cursor for navigation toggle (https://github.com/ruby/rdoc/pull/1175) https://github.com/ruby/rdoc/commit/964a1982c8 --- lib/rdoc/generator/template/darkfish/css/rdoc.css | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/rdoc/generator/template/darkfish/css/rdoc.css b/lib/rdoc/generator/template/darkfish/css/rdoc.css index 7171fd7895a15f..169a6331e9e120 100644 --- a/lib/rdoc/generator/template/darkfish/css/rdoc.css +++ b/lib/rdoc/generator/template/darkfish/css/rdoc.css @@ -223,6 +223,7 @@ nav a:hover { position: fixed; top: 10px; left: 20px; + cursor: pointer; } #navigation-toggle[aria-expanded="true"] { From 6ea2b6f65f92c4b8cfd91a655dcd89a7082bf6e4 Mon Sep 17 00:00:00 2001 From: otegami Date: Tue, 27 Aug 2024 13:45:57 +0900 Subject: [PATCH 140/829] [ruby/open-uri] Add `request_specific_fields` option for customizing headers This commit introduces the `request_specific_fields` option in OpenURI. It provides two methods for customizing headers as follows. 1. Specify headers only for the initial request Use a Hash to apply headers only to the first request. These headers are automatically removed during redirects. 2. Specify headers dynamically for each request Use a Proc to dynamically generate headers for each request, including during redirects, based on the request URL. This feature allows users to control headers flexibly, ensuring that sensitive headers like "Authorization" are not unintentionally transferred during redirects unless explicitly specified. https://github.com/ruby/open-uri/commit/460f858e3c --- lib/open-uri.rb | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/lib/open-uri.rb b/lib/open-uri.rb index 91eb61e54acbda..602dd74432369f 100644 --- a/lib/open-uri.rb +++ b/lib/open-uri.rb @@ -109,6 +109,7 @@ module OpenURI :redirect => true, :encoding => nil, :max_redirects => 64, + :request_specific_fields => nil, } def OpenURI.check_options(options) # :nodoc: @@ -148,7 +149,11 @@ def OpenURI.open_uri(name, *rest) # :nodoc: end encoding = Encoding.find(options[:encoding]) end - + if options.has_key? :request_specific_fields + if !(options[:request_specific_fields].is_a?(Hash) || options[:request_specific_fields].is_a?(Proc)) + raise ArgumentError, "Invalid request_specific_fields' format: #{options[:request_specific_fields]}" + end + end unless mode == nil || mode == 'r' || mode == 'rb' || mode == File::RDONLY @@ -215,9 +220,17 @@ def OpenURI.open_loop(uri, options) # :nodoc: max_redirects = options[:max_redirects] || Options.fetch(:max_redirects) buf = nil while true + request_specific_fields = {} + if options.has_key? :request_specific_fields + request_specific_fields = if options[:request_specific_fields].is_a?(Hash) + options[:request_specific_fields] + else options[:request_specific_fields].is_a?(Proc) + options[:request_specific_fields].call(uri) + end + end redirect = catch(:open_uri_redirect) { buf = Buffer.new - uri.buffer_open(buf, find_proxy.call(uri), options) + uri.buffer_open(buf, find_proxy.call(uri), options.merge(request_specific_fields)) nil } if redirect @@ -237,6 +250,10 @@ def OpenURI.open_loop(uri, options) # :nodoc: options = options.dup options.delete :http_basic_authentication end + if options.include?(:request_specific_fields) && options[:request_specific_fields].is_a?(Hash) + # Send request specific headers only for the initial request. + options.delete :request_specific_fields + end uri = redirect raise "HTTP redirection loop: #{uri}" if uri_set.include? uri.to_s uri_set[uri.to_s] = true From 0ac16215da216556e6aa14b271d7be4885c13c76 Mon Sep 17 00:00:00 2001 From: otegami Date: Tue, 27 Aug 2024 18:16:23 +0900 Subject: [PATCH 141/829] [ruby/open-uri] Add test about `request_specific_fields` option https://github.com/ruby/open-uri/commit/060886f312 --- test/open-uri/test_open-uri.rb | 60 ++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/test/open-uri/test_open-uri.rb b/test/open-uri/test_open-uri.rb index 9db6a8bb3be41e..56090092de82d6 100644 --- a/test/open-uri/test_open-uri.rb +++ b/test/open-uri/test_open-uri.rb @@ -337,6 +337,66 @@ def test_redirect_auth_failure_r1 } end + def test_redirect_without_request_specific_fields_hash + authorization_header = nil + redirected_authorization_header = nil + with_http {|srv, url| + srv.mount_proc("/r1/", lambda {|req, res| res.status = 301; res["location"] = "#{url}/r2"; authorization_header = req["Authorization"]; } ) + srv.mount_proc("/r2/", lambda {|req, res| redirected_authorization_header = req["Authorization"]; } ) + URI.open("#{url}/r1/", "Authorization" => "dummy_token") {|f| + assert_equal("dummy_token", authorization_header) + assert_equal("#{url}/r2", f.base_uri.to_s) + assert_equal("dummy_token", redirected_authorization_header) + } + } + end + + def test_redirect_with_request_specific_fields_hash + authorization_header = nil + redirected_authorization_header = "exposed_dummy_token" + with_http {|srv, url| + srv.mount_proc("/r1/", lambda {|req, res| res.status = 301; res["location"] = "#{url}/r2"; authorization_header = req["Authorization"]; } ) + srv.mount_proc("/r2/", lambda {|req, res| redirected_authorization_header = req["Authorization"]; } ) + URI.open("#{url}/r1/", request_specific_fields: {"Authorization" => "dummy_token"}) {|f| + assert_equal("dummy_token", authorization_header) + assert_equal("#{url}/r2", f.base_uri.to_s) + assert_equal(nil, redirected_authorization_header) + } + } + end + + def test_redirect_with_request_specific_fields_proc + authorization_header = nil + redirected_authorization_header = nil + + modify_authorization_header = Proc.new do |uri| + authorization_token = if uri.to_s.include?("/r1") + "dummy_token" + else + "masked_dummy_token" + end + { "Authorization" => authorization_token } + end + + with_http {|srv, url| + srv.mount_proc("/r1/", lambda {|req, res| res.status = 301; res["location"] = "#{url}/r2"; authorization_header = req["Authorization"] } ) + srv.mount_proc("/r2/", lambda {|req, res| redirected_authorization_header = req["Authorization"]; } ) + URI.open("#{url}/r1/", request_specific_fields: modify_authorization_header) {|f| + assert_equal("dummy_token", authorization_header) + assert_equal("#{url}/r2", f.base_uri.to_s) + assert_equal("masked_dummy_token", redirected_authorization_header) + } + } + end + + def test_redirect_with_invalid_request_specific_fields_format + with_http {|srv, url| + srv.mount_proc("/r1/", lambda {|req, res| res.body = "r1" } ) + exc = assert_raise(ArgumentError) { URI.open("#{url}/r1/", request_specific_fields: "dummy_token") {} } + assert_equal("Invalid request_specific_fields' format: dummy_token", exc.message) + } + end + def test_max_redirects_success with_http {|srv, url| srv.mount_proc("/r1/", lambda {|req, res| res.status = 301; res["location"] = "#{url}/r2"; res.body = "r1" } ) From 76475bf5c090a482af0e656601c38d138205bad1 Mon Sep 17 00:00:00 2001 From: otegami Date: Wed, 28 Aug 2024 17:00:32 +0900 Subject: [PATCH 142/829] [ruby/open-uri] Add documentation for `request_specific_fields` option https://github.com/ruby/open-uri/commit/2e7734c061 --- lib/open-uri.rb | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/lib/open-uri.rb b/lib/open-uri.rb index 602dd74432369f..e1d19413816f45 100644 --- a/lib/open-uri.rb +++ b/lib/open-uri.rb @@ -769,6 +769,38 @@ module OpenRead # # Number of HTTP redirects allowed before OpenURI::TooManyRedirects is raised. # The default is 64. + # + # [:request_specific_fields] + # Synopsis: + # :request_specific_fields => {} + # :request_specific_fields => lambda {|url| ...} + # + # :request_specific_fields option allows specifying custom header fields that + # are sent with the HTTP request. It can be passed as a Hash or a Proc that + # gets evaluated on each request and returns a Hash of header fields. + # + # If a Hash is provided, it specifies the headers only for the initial + # request and these headers will not be sent on redirects. + # + # If a Proc is provided, it will be executed for each request including + # redirects, allowing dynamic header customization based on the request URL. + # It is important that the Proc returns a Hash. And this Hash specifies the + # headers to be sent with the request. + # + # For Example with Hash + # URI.open("http://...", + # request_specific_fields: {"Authorization" => "token dummy"}) {|f| ... } + # + # For Example with Proc: + # URI.open("http://...", + # request_specific_fields: lambda { |uri| + # if uri.host == "example.com" + # {"Authorization" => "token dummy"} + # else + # {} + # end + # }) {|f| ... } + # def open(*rest, &block) OpenURI.open_uri(self, *rest, &block) end From 903f3790ade13054af6a4c2f654d8b75edf0936e Mon Sep 17 00:00:00 2001 From: otegami Date: Fri, 6 Sep 2024 09:32:15 +0900 Subject: [PATCH 143/829] [ruby/open-uri] Update error message for `request_specific_fields` option validation Added `inspect` to the `request_specific_fields` value to provide better visibility for users in the exception message. https://github.com/ruby/open-uri/commit/f89ce5112d --- lib/open-uri.rb | 2 +- test/open-uri/test_open-uri.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/open-uri.rb b/lib/open-uri.rb index e1d19413816f45..f2eddbcd2b9deb 100644 --- a/lib/open-uri.rb +++ b/lib/open-uri.rb @@ -151,7 +151,7 @@ def OpenURI.open_uri(name, *rest) # :nodoc: end if options.has_key? :request_specific_fields if !(options[:request_specific_fields].is_a?(Hash) || options[:request_specific_fields].is_a?(Proc)) - raise ArgumentError, "Invalid request_specific_fields' format: #{options[:request_specific_fields]}" + raise ArgumentError, "Invalid request_specific_fields option: #{options[:request_specific_fields].inspect}" end end unless mode == nil || diff --git a/test/open-uri/test_open-uri.rb b/test/open-uri/test_open-uri.rb index 56090092de82d6..0679180ce9fbfb 100644 --- a/test/open-uri/test_open-uri.rb +++ b/test/open-uri/test_open-uri.rb @@ -393,7 +393,7 @@ def test_redirect_with_invalid_request_specific_fields_format with_http {|srv, url| srv.mount_proc("/r1/", lambda {|req, res| res.body = "r1" } ) exc = assert_raise(ArgumentError) { URI.open("#{url}/r1/", request_specific_fields: "dummy_token") {} } - assert_equal("Invalid request_specific_fields' format: dummy_token", exc.message) + assert_equal('Invalid request_specific_fields option: "dummy_token"', exc.message) } end From d2179eeaacd9a85fa10188d79f74adc8068f29c3 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sat, 7 Sep 2024 21:43:38 +0900 Subject: [PATCH 144/829] Try to run goruby --- .github/workflows/check_dependencies.yml | 2 ++ .github/workflows/macos.yml | 12 ++++++++++++ .github/workflows/ubuntu.yml | 12 ++++++++++++ 3 files changed, 26 insertions(+) diff --git a/.github/workflows/check_dependencies.yml b/.github/workflows/check_dependencies.yml index fe13fdc3d83bd0..fe8a108a46c6dd 100644 --- a/.github/workflows/check_dependencies.yml +++ b/.github/workflows/check_dependencies.yml @@ -65,6 +65,8 @@ jobs: - run: make all golf + - run: ./goruby -veh + - run: ruby tool/update-deps --fix - run: git diff --no-ext-diff --ignore-submodules --exit-code diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 646a3736f4a108..ecd1838123219c 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -96,6 +96,18 @@ jobs: - run: make + - run: | + make golf + case "${{ matrix.configure }}" in + *'--enable-shared'*) + make runnable + ./bin/goruby -veh + ;; + *) + ./goruby -veh + ;; + esac + - name: Set test options for skipped tests run: | set -x diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu.yml index 83ec71b0b38f3d..85d401dcccdc93 100644 --- a/.github/workflows/ubuntu.yml +++ b/.github/workflows/ubuntu.yml @@ -107,6 +107,18 @@ jobs: - run: $SETARCH make + - run: | + $SETARCH make golf + case "${{ matrix.configure }}" in + *'--enable-shared'*) + $SETARCH make runnable + ./bin/goruby -veh + ;; + *) + ./goruby -veh + ;; + esac + - name: Set test options for skipped tests run: | set -x From be84abffbaf315c7534ec4c76edc7b30c3ec8111 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sun, 8 Sep 2024 21:02:30 +0900 Subject: [PATCH 145/829] Gather code for builtin loading to miniinit.c --- builtin.c | 2 +- mini_builtin.c | 46 +--------------------------------------------- miniinit.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 46 deletions(-) diff --git a/builtin.c b/builtin.c index fbc11bf1b47ad4..3bde2408f8bb3e 100644 --- a/builtin.c +++ b/builtin.c @@ -7,7 +7,7 @@ #ifndef BUILTIN_BINARY_SIZE -#define INCLUDED_BY_BUILTIN_C 1 +#define BUILTIN_LOADED(feature_name, iseq) ((void)0) #include "mini_builtin.c" #else diff --git a/mini_builtin.c b/mini_builtin.c index 2024d5d4a6c8e8..e6dfce6e79e8a7 100644 --- a/mini_builtin.c +++ b/mini_builtin.c @@ -6,11 +6,6 @@ #include "miniprelude.c" -// included from miniinit.c - -#ifndef INCLUDED_BY_BUILTIN_C -static struct st_table *loaded_builtin_table; -#endif bool pm_builtin_ast_value(pm_parse_result_t *result, const char *feature_name, VALUE *name_str); VALUE rb_builtin_ast_value(const char *feature_name, VALUE *name_str); @@ -72,10 +67,7 @@ builtin_iseq_load(const char *feature_name, const struct rb_builtin_function *ta rb_io_write(rb_stdout, rb_iseq_disasm((const rb_iseq_t *)iseq)); } -#ifndef INCLUDED_BY_BUILTIN_C - st_insert(loaded_builtin_table, (st_data_t)feature_name, (st_data_t)iseq); - rb_vm_register_global_object((VALUE)iseq); -#endif + BUILTIN_LOADED(feature_name, iseq); return iseq; } @@ -86,39 +78,3 @@ rb_load_with_builtin_functions(const char *feature_name, const struct rb_builtin const rb_iseq_t *iseq = builtin_iseq_load(feature_name, table); rb_iseq_eval(iseq); } - -#ifndef INCLUDED_BY_BUILTIN_C - -static int -each_builtin_i(st_data_t key, st_data_t val, st_data_t dmy) -{ - const char *feature = (const char *)key; - const rb_iseq_t *iseq = (const rb_iseq_t *)val; - - rb_yield_values(2, rb_str_new2(feature), rb_iseqw_new(iseq)); - - return ST_CONTINUE; -} - -/* :nodoc: */ -static VALUE -each_builtin(VALUE self) -{ - st_foreach(loaded_builtin_table, each_builtin_i, 0); - return Qnil; -} - -void -Init_builtin(void) -{ - rb_define_singleton_method(rb_cRubyVM, "each_builtin", each_builtin, 0); - loaded_builtin_table = st_init_strtable(); -} - -void -Init_builtin_features(void) -{ - // register for ruby - builtin_iseq_load("gem_prelude", NULL); -} -#endif diff --git a/miniinit.c b/miniinit.c index 09608c1113ef91..b0adf9da2a73dc 100644 --- a/miniinit.c +++ b/miniinit.c @@ -54,8 +54,53 @@ Init_ext(void) { } +static void builtin_loaded(const char *feature_name, VALUE iseq); +#define BUILTIN_LOADED(feature_name, iseq) builtin_loaded(feature_name, (VALUE)(iseq)) + #include "mini_builtin.c" +static struct st_table *loaded_builtin_table; + +static void +builtin_loaded(const char *feature_name, VALUE iseq) +{ + st_insert(loaded_builtin_table, (st_data_t)feature_name, (st_data_t)iseq); + rb_vm_register_global_object(iseq); +} + +static int +each_builtin_i(st_data_t key, st_data_t val, st_data_t dmy) +{ + const char *feature = (const char *)key; + const rb_iseq_t *iseq = (const rb_iseq_t *)val; + + rb_yield_values(2, rb_str_new2(feature), rb_iseqw_new(iseq)); + + return ST_CONTINUE; +} + +/* :nodoc: */ +static VALUE +each_builtin(VALUE self) +{ + st_foreach(loaded_builtin_table, each_builtin_i, 0); + return Qnil; +} + +void +Init_builtin(void) +{ + rb_define_singleton_method(rb_cRubyVM, "each_builtin", each_builtin, 0); + loaded_builtin_table = st_init_strtable(); +} + +void +Init_builtin_features(void) +{ + // register for ruby + builtin_iseq_load("gem_prelude", NULL); +} + void rb_free_loaded_builtin_table(void) { From 70871fa6e3172d10d615174e9aa909d3e08687f0 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sun, 8 Sep 2024 21:06:54 +0900 Subject: [PATCH 146/829] Extract `rb_builtin_find` Refactor out the same code from `rb_builtin_ast_value` and `pm_builtin_ast_value. --- mini_builtin.c | 51 ++++++++++++++++++++++----------- template/prelude.c.tmpl | 62 ++++++----------------------------------- 2 files changed, 43 insertions(+), 70 deletions(-) diff --git a/mini_builtin.c b/mini_builtin.c index e6dfce6e79e8a7..b9be7c58f88d06 100644 --- a/mini_builtin.c +++ b/mini_builtin.c @@ -6,15 +6,43 @@ #include "miniprelude.c" +static VALUE +prelude_ast_value(VALUE name, VALUE code, int line) +{ + rb_ast_t *ast; + VALUE ast_value = rb_parser_compile_string_path(rb_parser_new(), name, code, line); + ast = rb_ruby_ast_data_get(ast_value); + if (!ast || !ast->body.root) { + if (ast) rb_ast_dispose(ast); + rb_exc_raise(rb_errinfo()); + } + return ast_value; +} + +static void +pm_prelude_load(pm_parse_result_t *result, VALUE name, VALUE code, int line) +{ + pm_options_line_set(&result->options, line); + VALUE error = pm_parse_string(result, code, name, NULL); -bool pm_builtin_ast_value(pm_parse_result_t *result, const char *feature_name, VALUE *name_str); -VALUE rb_builtin_ast_value(const char *feature_name, VALUE *name_str); + if (!NIL_P(error)) { + pm_parse_result_free(result); + rb_exc_raise(error); + } +} static const rb_iseq_t * builtin_iseq_load(const char *feature_name, const struct rb_builtin_function *table) { VALUE name_str = 0; + int start_line; const rb_iseq_t *iseq; + VALUE code = rb_builtin_find(feature_name, &name_str, &start_line); + if (NIL_P(code)) { + rb_fatal("builtin_iseq_load: can not find %s; " + "probably miniprelude.c is out of date", + feature_name); + } rb_vm_t *vm = GET_VM(); static const rb_compile_option_t optimization = { @@ -32,33 +60,22 @@ builtin_iseq_load(const char *feature_name, const struct rb_builtin_function *ta if (*rb_ruby_prism_ptr()) { pm_parse_result_t result = { 0 }; - if (!pm_builtin_ast_value(&result, feature_name, &name_str)) { - rb_fatal("builtin_iseq_load: can not find %s; " - "probably miniprelude.c is out of date", - feature_name); - } + pm_prelude_load(&result, name_str, code, start_line); vm->builtin_function_table = table; iseq = pm_iseq_new_with_opt(&result.node, name_str, name_str, Qnil, 0, NULL, 0, ISEQ_TYPE_TOP, &optimization); - GET_VM()->builtin_function_table = NULL; + vm->builtin_function_table = NULL; pm_parse_result_free(&result); } else { - VALUE ast_value = rb_builtin_ast_value(feature_name, &name_str); - - if (NIL_P(ast_value)) { - rb_fatal("builtin_iseq_load: can not find %s; " - "probably miniprelude.c is out of date", - feature_name); - } - + VALUE ast_value = prelude_ast_value(name_str, code, start_line); rb_ast_t *ast = rb_ruby_ast_data_get(ast_value); vm->builtin_function_table = table; iseq = rb_iseq_new_with_opt(ast_value, name_str, name_str, Qnil, 0, NULL, 0, ISEQ_TYPE_TOP, &optimization, Qnil); - GET_VM()->builtin_function_table = NULL; + vm->builtin_function_table = NULL; rb_ast_dispose(ast); } diff --git a/template/prelude.c.tmpl b/template/prelude.c.tmpl index 125a2934234f21..63659c5a4d667a 100644 --- a/template/prelude.c.tmpl +++ b/template/prelude.c.tmpl @@ -58,7 +58,7 @@ class Prelude if line.size > LINE_LIMIT raise "#{filename}:#{lines.size+1}: too long line" end - line.sub!(/require(_relative)?\s*\(?\s*(["'])(.*?)(?:\.rb)?\2\)?/) do + line.sub!(/require(_relative)?\s*\(?\s*([\"\'])(.*?)(?:\.rb)?\2\)?/) do orig, rel, path = $&, $2, $3 if rel path = File.join(File.dirname(filename), path) @@ -141,73 +141,29 @@ COMPILER_WARNING_POP #define PRELUDE_NAME(n) rb_usascii_str_new_static(prelude_name##n, sizeof(prelude_name##n)-1) #define PRELUDE_CODE(n) rb_utf8_str_new_static(prelude_code##n.L0, sizeof(prelude_code##n)) -static VALUE -prelude_ast_value(VALUE name, VALUE code, int line) -{ - rb_ast_t *ast; - VALUE ast_value = rb_parser_compile_string_path(rb_parser_new(), name, code, line); - ast = rb_ruby_ast_data_get(ast_value); - if (!ast || !ast->body.root) { - if (ast) rb_ast_dispose(ast); - rb_exc_raise(rb_errinfo()); - } - return ast_value; -} - -static void -pm_prelude_load(pm_parse_result_t *result, VALUE name, VALUE code, int line) -{ - pm_options_line_set(&result->options, line); - VALUE error = pm_parse_string(result, code, name, NULL); - - if (!NIL_P(error)) { - pm_parse_result_free(result); - rb_exc_raise(error); - } -} - % end % if @builtin_count > 0 -#define PRELUDE_VAST(n, name_str, start_line) \ +#define PRELUDE_MATCH(n) \ (((sizeof(prelude_name<%='##'%><%=%>n) - prefix_len - 2) == namelen) && \ - (strncmp(prelude_name<%='##'%><%=%>n + prefix_len, feature_name, namelen) == 0) ? \ - prelude_ast_value((name_str) = PRELUDE_NAME(n), PRELUDE_CODE(n), start_line) : Qnil) + (strncmp(prelude_name<%='##'%><%=%>n + prefix_len, feature_name, namelen) == 0)) VALUE -rb_builtin_ast_value(const char *feature_name, VALUE *name_str) +rb_builtin_find(const char *feature_name, VALUE *name_str, int *start_line) { const size_t prefix_len = rb_strlen_lit("<%=%>, *name_str, <%=start_line%>))) return ast_value; -% end -% end - return ast_value; -} - -bool -pm_builtin_ast_value(pm_parse_result_t *result, const char *feature_name, VALUE *name_str) -{ - const size_t prefix_len = rb_strlen_lit(") - prefix_len - 2 == namelen) && - (strncmp(prelude_name<%= i %> + prefix_len, feature_name, namelen) == 0) - ) { - *name_str = PRELUDE_NAME(<%= i %>); - pm_prelude_load(result, *name_str, PRELUDE_CODE(<%= i %>), <%= start_line %>); - return true; - } + if (PRELUDE_MATCH(<%=i%>)) return PRELUDE_FOUND(<%=i%>, <%=start_line%>); % end % end +#undef PRELUDE_FOUND - return false; + return Qnil; } % end From ecb58a8d08bb3b53326319fb5b7ba3ed26fcac2b Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sun, 8 Sep 2024 21:18:20 +0900 Subject: [PATCH 147/829] Fix prelude to use IBF Since universal-parser and prism support, prelude code used functions inaccessible from outside libruby shared library. ``` linking goruby /usr/bin/ld: goruby.o: in function `prelude_eval': /home/runner/work/ruby/ruby/build/golf_prelude.c:221: undefined reference to `rb_ruby_prism_ptr' /usr/bin/ld: goruby.o: in function `pm_prelude_load': /home/runner/work/ruby/ruby/build/golf_prelude.c:192: undefined reference to `pm_options_line_set' /usr/bin/ld: /home/runner/work/ruby/ruby/build/golf_prelude.c:193: undefined reference to `pm_parse_string' /usr/bin/ld: goruby.o: in function `prelude_eval': /home/runner/work/ruby/ruby/build/golf_prelude.c:224: undefined reference to `pm_iseq_new_with_opt' /usr/bin/ld: /home/runner/work/ruby/ruby/build/golf_prelude.c:226: undefined reference to `pm_parse_result_free' /usr/bin/ld: goruby.o: in function `prelude_ast_value': /home/runner/work/ruby/ruby/build/golf_prelude.c:181: undefined reference to `rb_ruby_ast_data_get' /usr/bin/ld: goruby.o: in function `prelude_eval': /home/runner/work/ruby/ruby/build/golf_prelude.c:231: undefined reference to `rb_ruby_ast_data_get' /usr/bin/ld: goruby.o: in function `pm_prelude_load': /home/runner/work/ruby/ruby/build/golf_prelude.c:196: undefined reference to `pm_parse_result_free' collect2: error: ld returned 1 exit status ``` --- common.mk | 16 +++++------ goruby.c | 7 ++--- template/Makefile.in | 1 - template/prelude.c.tmpl | 64 ++--------------------------------------- tool/mk_rbbin.rb | 48 +++++++++++++++++++++++++++++++ win32/Makefile.sub | 5 ---- 6 files changed, 61 insertions(+), 80 deletions(-) create mode 100755 tool/mk_rbbin.rb diff --git a/common.mk b/common.mk index 0d3053705f5ec6..13b48e2ca6de65 100644 --- a/common.mk +++ b/common.mk @@ -6,7 +6,7 @@ bin: $(PROGRAM) $(WPROGRAM) lib: $(LIBRUBY) dll: $(LIBRUBY_SO) -.SUFFIXES: .rbinc .rb .inc .h .c .y .i .$(ASMEXT) .$(DTRACE_EXT) +.SUFFIXES: .rbinc .rbbin .rb .inc .h .c .y .i .$(ASMEXT) .$(DTRACE_EXT) # V=0 quiet, V=1 verbose. other values don't work. V = 0 @@ -291,7 +291,7 @@ DEFAULT_PRELUDES = $(GEM_PRELUDE) PRELUDE_SCRIPTS = $(DEFAULT_PRELUDES) GEM_PRELUDE = PRELUDES = {$(srcdir)}miniprelude.c -GOLFPRELUDES = {$(srcdir)}golf_prelude.c +GOLFPRELUDES = golf_prelude.rbbin SCRIPT_ARGS = --dest-dir="$(DESTDIR)" \ --extout="$(EXTOUT)" \ @@ -1304,10 +1304,7 @@ $(MINIPRELUDE_C): $(COMPILE_PRELUDE) $(BUILTIN_RB_SRCS) $(Q) $(BASERUBY) $(tooldir)/generic_erb.rb -I$(srcdir) -o $@ \ $(srcdir)/template/prelude.c.tmpl $(BUILTIN_RB_SRCS) -$(GOLF_PRELUDE_C): $(COMPILE_PRELUDE) {$(srcdir)}golf_prelude.rb - $(ECHO) generating $@ - $(Q) $(BASERUBY) $(tooldir)/generic_erb.rb -I$(srcdir) -c -o $@ \ - $(srcdir)/template/prelude.c.tmpl golf_prelude.rb +golf_prelude.rbbin: {$(srcdir)}golf_prelude.rb $(tooldir)/mk_rbbin.rb $(PREP) MAINCPPFLAGS = $(ENABLE_DEBUG_ENV:yes=-DRUBY_DEBUG_ENV=1) @@ -1325,7 +1322,10 @@ probes.h: {$(VPATH)}probes.$(DTRACE_EXT) prereq: incs srcs preludes PHONY preludes: {$(VPATH)}miniprelude.c -preludes: {$(srcdir)}golf_prelude.c + +{$(srcdir)}.rb.rbbin: + $(ECHO) making $@ + $(Q) $(MINIRUBY) $(tooldir)/mk_rbbin.rb $< > $@ {$(srcdir)}.rb.rbinc: $(ECHO) making $@ @@ -7565,7 +7565,7 @@ goruby.$(OBJEXT): {$(VPATH)}config.h goruby.$(OBJEXT): {$(VPATH)}constant.h goruby.$(OBJEXT): {$(VPATH)}defines.h goruby.$(OBJEXT): {$(VPATH)}encoding.h -goruby.$(OBJEXT): {$(VPATH)}golf_prelude.c +goruby.$(OBJEXT): {$(VPATH)}golf_prelude.rbbin goruby.$(OBJEXT): {$(VPATH)}goruby.c goruby.$(OBJEXT): {$(VPATH)}id.h goruby.$(OBJEXT): {$(VPATH)}id_table.h diff --git a/goruby.c b/goruby.c index 5d452772075a31..310bac53932b0f 100644 --- a/goruby.c +++ b/goruby.c @@ -1,4 +1,4 @@ -static void Init_golf(void); +static void Init_golf_prelude(void); static void *goruby_options(int argc, char **argv); static int goruby_run_node(void *arg); #define ruby_options goruby_options @@ -17,14 +17,13 @@ static int goruby_run_node(void *arg); RUBY_EXTERN void *ruby_options(int argc, char **argv); RUBY_EXTERN int ruby_run_node(void*); -RUBY_EXTERN void ruby_init_ext(const char *name, void (*init)(void)); -#include "golf_prelude.c" +#include "golf_prelude.rbbin" static VALUE init_golf(VALUE arg) { - Init_golf(); + Init_golf_prelude(); rb_provide("golf.so"); return arg; } diff --git a/template/Makefile.in b/template/Makefile.in index e0de5f74dbd504..b31779be1ea3f9 100644 --- a/template/Makefile.in +++ b/template/Makefile.in @@ -252,7 +252,6 @@ INSTALLED_LIST= .installed.list NEWLINE_C = enc/trans/newline.c MINIPRELUDE_C = miniprelude.c -GOLF_PRELUDE_C= golf_prelude.c RBCONFIG = .rbconfig.time MAINSRC = $(MAINOBJ:.$(OBJEXT)=.c) diff --git a/template/prelude.c.tmpl b/template/prelude.c.tmpl index 63659c5a4d667a..675973b9133330 100644 --- a/template/prelude.c.tmpl +++ b/template/prelude.c.tmpl @@ -21,16 +21,11 @@ class Prelude def initialize(output, preludes, vpath) @output = output @vpath = vpath - @prelude_count = 0 @builtin_count = 0 @preludes = {} @mains = preludes.map do |filename| - if prelude = filename.end_with?("golf_prelude.rb") - @prelude_count += 1 - else - @builtin_count += 1 - end - translate(filename, (filename unless prelude))[0] + @builtin_count += 1 + translate(filename, filename)[0] end @preludes.delete_if {|_, (_, _, lines, sub)| sub && lines.empty?} end @@ -137,7 +132,6 @@ static const struct { COMPILER_WARNING_POP -% unless preludes.empty? #define PRELUDE_NAME(n) rb_usascii_str_new_static(prelude_name##n, sizeof(prelude_name##n)-1) #define PRELUDE_CODE(n) rb_utf8_str_new_static(prelude_code##n.L0, sizeof(prelude_code##n)) @@ -166,64 +160,10 @@ rb_builtin_find(const char *feature_name, VALUE *name_str, int *start_line) return Qnil; } -% end -% if @prelude_count > 0 -COMPILER_WARNING_PUSH -#if GCC_VERSION_SINCE(4, 2, 0) -COMPILER_WARNING_ERROR(-Wmissing-field-initializers) -#endif -static void -prelude_eval(VALUE code, VALUE name, int line) -{ - static const rb_compile_option_t optimization = { - TRUE, /* unsigned int inline_const_cache; */ - TRUE, /* unsigned int peephole_optimization; */ - FALSE,/* unsigned int tailcall_optimization; */ - TRUE, /* unsigned int specialized_instruction; */ - TRUE, /* unsigned int operands_unification; */ - TRUE, /* unsigned int instructions_unification; */ - TRUE, /* unsigned int frozen_string_literal; */ - FALSE, /* unsigned int debug_frozen_string_literal; */ - FALSE, /* unsigned int coverage_enabled; */ - 0, /* int debug_level; */ - }; - - if (*rb_ruby_prism_ptr()) { - pm_parse_result_t result = { 0 }; - pm_prelude_load(&result, name, code, line); - rb_iseq_eval(pm_iseq_new_with_opt(&result.node, name, name, Qnil, line, - NULL, 0, ISEQ_TYPE_TOP, &optimization)); - pm_parse_result_free(&result); - } - else { - rb_ast_t *ast; - VALUE ast_value = prelude_ast_value(name, code, line); - ast = rb_ruby_ast_data_get(ast_value); - rb_iseq_eval(rb_iseq_new_with_opt(ast_value, name, name, Qnil, line, - NULL, 0, ISEQ_TYPE_TOP, &optimization, - Qnil)); - rb_ast_dispose(ast); - } -} -COMPILER_WARNING_POP - -% end %end % init_name = @output && @output[/\w+(?=_prelude.c\b)/] || 'prelude' void Init_<%=init_name%><%=%>(void) { -%unless @prelude_count.zero? -% preludes.each do |i, prelude, lines, sub, start_line| -% next if sub - prelude_eval(PRELUDE_CODE(<%=i%><%=%>), PRELUDE_NAME(<%=i%><%=%>), <%=start_line%><%=%>); -% end - -#if 0 -% preludes.length.times {|i| - printf("%.*s", (int)sizeof(prelude_code<%=i%><%=%>), prelude_code<%=i%><%=%>.L0); -% } -#endif -%end } <%end -%> diff --git a/tool/mk_rbbin.rb b/tool/mk_rbbin.rb new file mode 100755 index 00000000000000..991230f0947be2 --- /dev/null +++ b/tool/mk_rbbin.rb @@ -0,0 +1,48 @@ +#!ruby -s + +OPTIMIZATION = { + inline_const_cache: true, + peephole_optimization: true, + tailcall_optimization: false, + specialized_instruction: true, + operands_unification: true, + instructions_unification: true, + frozen_string_literal: true, + debug_frozen_string_literal: false, + coverage_enabled: false, + debug_level: 0, +} + +file = File.basename(ARGV[0], ".rb") +name = "" +iseq = RubyVM::InstructionSequence.compile(ARGF.read, name, name, **OPTIMIZATION) +puts < Date: Sun, 8 Sep 2024 21:42:42 +0900 Subject: [PATCH 148/829] Initialize goruby only when executing --- goruby.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/goruby.c b/goruby.c index 310bac53932b0f..3ca96bfda0641a 100644 --- a/goruby.c +++ b/goruby.c @@ -60,7 +60,8 @@ int goruby_run_node(void *arg) { int state; - if (NIL_P(rb_protect(init_golf, Qtrue, &state))) { + if (ruby_executable_node(arg, NULL) && + NIL_P(rb_protect(init_golf, Qtrue, &state))) { return state == EXIT_SUCCESS ? EXIT_FAILURE : state; } return ruby_run_node(arg); From ac960b08eee1ef984097847034fb1de5b28b0b78 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Mon, 9 Sep 2024 00:51:41 +0900 Subject: [PATCH 149/829] Clean up dummped IBF files --- common.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common.mk b/common.mk index 13b48e2ca6de65..c625dd304655be 100644 --- a/common.mk +++ b/common.mk @@ -758,7 +758,7 @@ clean-rubyspec: clean-spec distclean: distclean-ext distclean-enc distclean-golf distclean-docs distclean-extout distclean-local distclean-platform distclean-spec distclean-local:: clean-local - $(Q)$(RM) $(MKFILES) yasmdata.rb *.inc $(PRELUDES) *.rbinc + $(Q)$(RM) $(MKFILES) yasmdata.rb *.inc $(PRELUDES) *.rbinc *.rbbin $(Q)$(RM) config.cache config.status config.status.lineno $(Q)$(RM) *~ *.bak *.stackdump core *.core gmon.out $(PREP) -$(Q)$(RMALL) $(srcdir)/autom4te.cache From 19c1f0233eb5202403c52b196f1d573893eacab7 Mon Sep 17 00:00:00 2001 From: Earlopain <14981592+Earlopain@users.noreply.github.com> Date: Fri, 6 Sep 2024 12:09:17 +0200 Subject: [PATCH 150/829] [ruby/benchmark] Set required_ruby_version = ">= 2.1.0" `Process.clock_gettime` only works since 2.1 https://github.com/ruby/benchmark/commit/94cfe56291 --- lib/benchmark.gemspec | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/benchmark.gemspec b/lib/benchmark.gemspec index d6e98db805cffd..35deff8d181278 100644 --- a/lib/benchmark.gemspec +++ b/lib/benchmark.gemspec @@ -16,6 +16,8 @@ Gem::Specification.new do |spec| spec.homepage = "https://github.com/ruby/benchmark" spec.licenses = ["Ruby", "BSD-2-Clause"] + spec.required_ruby_version = ">= 2.1.0" + spec.metadata["homepage_uri"] = spec.homepage spec.metadata["source_code_uri"] = spec.homepage From b5f12910151f93f5f14057c52ffffa2b2ef09caa Mon Sep 17 00:00:00 2001 From: JP Camara Date: Tue, 27 Aug 2024 21:57:49 +0000 Subject: [PATCH 151/829] The Timeout::Error example no longer works consistently * This PR from the timeout gem (https://github.com/ruby/timeout/pull/30) made it so you have to handle_interrupt on Timeout::ExitException instead of Timeout::Error * Efficiency changes to the gem (one shared thread) mean you can't consistently handle timeout errors using handle_timeout: https://github.com/ruby/timeout/issues/41 --- thread.c | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/thread.c b/thread.c index 45aa0565ca897b..104205beb22c79 100644 --- a/thread.c +++ b/thread.c @@ -2215,30 +2215,6 @@ handle_interrupt_arg_check_i(VALUE key, VALUE val, VALUE args) * resource allocation code. Then, the ensure block is where we can safely * deallocate your resources. * - * ==== Guarding from Timeout::Error - * - * In the next example, we will guard from the Timeout::Error exception. This - * will help prevent from leaking resources when Timeout::Error exceptions occur - * during normal ensure clause. For this example we use the help of the - * standard library Timeout, from lib/timeout.rb - * - * require 'timeout' - * Thread.handle_interrupt(Timeout::Error => :never) { - * timeout(10){ - * # Timeout::Error doesn't occur here - * Thread.handle_interrupt(Timeout::Error => :on_blocking) { - * # possible to be killed by Timeout::Error - * # while blocking operation - * } - * # Timeout::Error doesn't occur here - * } - * } - * - * In the first part of the +timeout+ block, we can rely on Timeout::Error being - * ignored. Then in the Timeout::Error => :on_blocking block, any - * operation that will block the calling thread is susceptible to a - * Timeout::Error exception being raised. - * * ==== Stack control settings * * It's possible to stack multiple levels of ::handle_interrupt blocks in order From d52e599538fb67535c95d86aec89fd7e53c61818 Mon Sep 17 00:00:00 2001 From: ydah Date: Thu, 5 Sep 2024 18:41:10 +0900 Subject: [PATCH 152/829] Implement WHEN NODE locations --- ast.c | 5 +++++ node_dump.c | 3 +++ parse.y | 10 ++++++---- rubyparser.h | 2 ++ test/ruby/test_ast.rb | 5 +++++ 5 files changed, 21 insertions(+), 4 deletions(-) diff --git a/ast.c b/ast.c index 67d121e1ce6c1c..031031af956314 100644 --- a/ast.c +++ b/ast.c @@ -801,6 +801,11 @@ node_locations(VALUE ast_value, const NODE *node) return rb_ary_new_from_args(2, location_new(nd_code_loc(node)), location_new(&RNODE_VALIAS(node)->keyword_loc)); + case NODE_WHEN: + return rb_ary_new_from_args(3, + location_new(nd_code_loc(node)), + location_new(&RNODE_WHEN(node)->keyword_loc), + location_new(&RNODE_WHEN(node)->then_keyword_loc)); case NODE_ARGS_AUX: case NODE_LAST: break; diff --git a/node_dump.c b/node_dump.c index ae948eb66eca0d..d97a400a977e0c 100644 --- a/node_dump.c +++ b/node_dump.c @@ -289,6 +289,9 @@ dump_node(VALUE buf, VALUE indent, int comment, const NODE * node) F_NODE(nd_body, RNODE_WHEN, "when body"); LAST_NODE; F_NODE(nd_next, RNODE_WHEN, "next when clause"); + F_LOC(keyword_loc, RNODE_WHEN); + LAST_NODE; + F_LOC(then_keyword_loc, RNODE_WHEN); return; case NODE_IN: diff --git a/parse.y b/parse.y index 42396094be2686..d78d4586f8efb9 100644 --- a/parse.y +++ b/parse.y @@ -1066,7 +1066,7 @@ static rb_node_unless_t *rb_node_unless_new(struct parser_params *p, NODE *nd_co static rb_node_case_t *rb_node_case_new(struct parser_params *p, NODE *nd_head, NODE *nd_body, const YYLTYPE *loc); static rb_node_case2_t *rb_node_case2_new(struct parser_params *p, NODE *nd_body, const YYLTYPE *loc); static rb_node_case3_t *rb_node_case3_new(struct parser_params *p, NODE *nd_head, NODE *nd_body, const YYLTYPE *loc); -static rb_node_when_t *rb_node_when_new(struct parser_params *p, NODE *nd_head, NODE *nd_body, NODE *nd_next, const YYLTYPE *loc); +static rb_node_when_t *rb_node_when_new(struct parser_params *p, NODE *nd_head, NODE *nd_body, NODE *nd_next, const YYLTYPE *loc, const YYLTYPE *keyword_loc, const YYLTYPE *then_keyword_loc); static rb_node_in_t *rb_node_in_new(struct parser_params *p, NODE *nd_head, NODE *nd_body, NODE *nd_next, const YYLTYPE *loc); static rb_node_while_t *rb_node_while_new(struct parser_params *p, NODE *nd_cond, NODE *nd_body, long nd_state, const YYLTYPE *loc); static rb_node_until_t *rb_node_until_new(struct parser_params *p, NODE *nd_cond, NODE *nd_body, long nd_state, const YYLTYPE *loc); @@ -1174,7 +1174,7 @@ static rb_node_error_t *rb_node_error_new(struct parser_params *p, const YYLTYPE #define NEW_CASE(h,b,loc) (NODE *)rb_node_case_new(p,h,b,loc) #define NEW_CASE2(b,loc) (NODE *)rb_node_case2_new(p,b,loc) #define NEW_CASE3(h,b,loc) (NODE *)rb_node_case3_new(p,h,b,loc) -#define NEW_WHEN(c,t,e,loc) (NODE *)rb_node_when_new(p,c,t,e,loc) +#define NEW_WHEN(c,t,e,loc,k_loc,t_loc) (NODE *)rb_node_when_new(p,c,t,e,loc,k_loc,t_loc) #define NEW_IN(c,t,e,loc) (NODE *)rb_node_in_new(p,c,t,e,loc) #define NEW_WHILE(c,b,n,loc) (NODE *)rb_node_while_new(p,c,b,n,loc) #define NEW_UNTIL(c,b,n,loc) (NODE *)rb_node_until_new(p,c,b,n,loc) @@ -5443,7 +5443,7 @@ case_body : k_when case_args then compstmt cases { - $$ = NEW_WHEN($2, $4, $5, &@$); + $$ = NEW_WHEN($2, $4, $5, &@$, &@1, &@3); fixpos($$, $2); /*% ripper: when!($:2, $:4, $:5) %*/ } @@ -11643,12 +11643,14 @@ rb_node_case3_new(struct parser_params *p, NODE *nd_head, NODE *nd_body, const Y } static rb_node_when_t * -rb_node_when_new(struct parser_params *p, NODE *nd_head, NODE *nd_body, NODE *nd_next, const YYLTYPE *loc) +rb_node_when_new(struct parser_params *p, NODE *nd_head, NODE *nd_body, NODE *nd_next, const YYLTYPE *loc, const YYLTYPE *keyword_loc, const YYLTYPE *then_keyword_loc) { rb_node_when_t *n = NODE_NEWNODE(NODE_WHEN, rb_node_when_t, loc); n->nd_head = nd_head; n->nd_body = nd_body; n->nd_next = nd_next; + n->keyword_loc = *keyword_loc; + n->then_keyword_loc = *then_keyword_loc; return n; } diff --git a/rubyparser.h b/rubyparser.h index 1a1a1d2b07a9c4..5728844827d25a 100644 --- a/rubyparser.h +++ b/rubyparser.h @@ -305,6 +305,8 @@ typedef struct RNode_WHEN { struct RNode *nd_head; struct RNode *nd_body; struct RNode *nd_next; + rb_code_location_t keyword_loc; + rb_code_location_t then_keyword_loc; } rb_node_when_t; typedef struct RNode_IN { diff --git a/test/ruby/test_ast.rb b/test/ruby/test_ast.rb index f03a323ccf24eb..8ecd384d583445 100644 --- a/test/ruby/test_ast.rb +++ b/test/ruby/test_ast.rb @@ -1375,6 +1375,11 @@ def test_valias_locations assert_locations(node.children[-1].locations, [[1, 0, 1, 13], [1, 0, 1, 5]]) end + def test_when_locations + node = RubyVM::AbstractSyntaxTree.parse("case a; when 1 then 2; end") + assert_locations(node.children[-1].children[1].locations, [[1, 8, 1, 22], [1, 8, 1, 12], [1, 15, 1, 19]]) + end + private def assert_locations(locations, expected) ary = locations.map {|loc| loc && [loc.first_lineno, loc.first_column, loc.last_lineno, loc.last_column] } From aed8e46118e592a9d7752f6e1cd48a5fad07d941 Mon Sep 17 00:00:00 2001 From: Gareth Jones Date: Sat, 27 Jan 2024 09:59:38 +1300 Subject: [PATCH 153/829] [ruby/psych] docs: specify correct default `fallback` value https://github.com/ruby/psych/commit/ce7946981d --- ext/psych/lib/psych.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ext/psych/lib/psych.rb b/ext/psych/lib/psych.rb index d87bd9040ac47a..e96b7523475f8b 100644 --- a/ext/psych/lib/psych.rb +++ b/ext/psych/lib/psych.rb @@ -340,7 +340,7 @@ def self.safe_load yaml, permitted_classes: [], permitted_symbols: [], aliases: # provided, the object contained in the first document will be returned. # +filename+ will be used in the exception message if any exception # is raised while parsing. If +yaml+ is empty, it returns - # the specified +fallback+ return value, which defaults to +false+. + # the specified +fallback+ return value, which defaults to +nil+. # # Raises a Psych::SyntaxError when a YAML syntax error is detected. # @@ -667,7 +667,7 @@ def self.unsafe_load_file filename, **kwargs ### # Safely loads the document contained in +filename+. Returns the yaml contained in # +filename+ as a Ruby object, or if the file is empty, it returns - # the specified +fallback+ return value, which defaults to +false+. + # the specified +fallback+ return value, which defaults to +nil+. # See safe_load for options. def self.safe_load_file filename, **kwargs File.open(filename, 'r:bom|utf-8') { |f| @@ -678,7 +678,7 @@ def self.safe_load_file filename, **kwargs ### # Loads the document contained in +filename+. Returns the yaml contained in # +filename+ as a Ruby object, or if the file is empty, it returns - # the specified +fallback+ return value, which defaults to +false+. + # the specified +fallback+ return value, which defaults to +nil+. # See load for options. def self.load_file filename, **kwargs File.open(filename, 'r:bom|utf-8') { |f| From dbfabafe9676c5569f2a923fd713b3fdd24ab344 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Mon, 9 Sep 2024 15:27:14 +0900 Subject: [PATCH 154/829] [ruby/psych] Make to load stringio lazily https://github.com/ruby/psych/commit/9f5392d180 --- ext/psych/lib/psych/nodes/node.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/psych/lib/psych/nodes/node.rb b/ext/psych/lib/psych/nodes/node.rb index f44fce5f053a5f..1a4ea5531f7280 100644 --- a/ext/psych/lib/psych/nodes/node.rb +++ b/ext/psych/lib/psych/nodes/node.rb @@ -1,5 +1,4 @@ # frozen_string_literal: true -require 'stringio' require_relative '../class_loader' require_relative '../scalar_scanner' @@ -56,6 +55,7 @@ def to_ruby(symbolize_names: false, freeze: false, strict_integer: false) # # See also Psych::Visitors::Emitter def yaml io = nil, options = {} + require "stringio" real_io = io || StringIO.new(''.encode('utf-8')) Visitors::Emitter.new(real_io, options).accept self From 74872109beb8280eebf7ad1edae23b3c356a1923 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juanjo=20Baz=C3=A1n?= Date: Fri, 12 Jul 2024 12:46:39 +0200 Subject: [PATCH 155/829] [ruby/psych] Unlimited line_width with -1 https://github.com/ruby/psych/commit/3b63a93dfc --- ext/psych/lib/psych.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ext/psych/lib/psych.rb b/ext/psych/lib/psych.rb index e96b7523475f8b..d227b1f2251ebe 100644 --- a/ext/psych/lib/psych.rb +++ b/ext/psych/lib/psych.rb @@ -479,6 +479,7 @@ def self.parse_stream yaml, filename: nil, &block # # Default: 2. # [:line_width] Max character to wrap line at. + # For unlimited line width use -1. # # Default: 0 (meaning "wrap at 81"). # [:canonical] Write "canonical" YAML form (very verbose, yet @@ -559,6 +560,7 @@ def self.dump o, io = nil, options = {} # # Default: 2. # [:line_width] Max character to wrap line at. + # For unlimited line width use -1. # # Default: 0 (meaning "wrap at 81"). # [:canonical] Write "canonical" YAML form (very verbose, yet From 2d4fdafa64cc3153792c870a56971a70db23033b Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Mon, 9 Sep 2024 15:46:29 +0900 Subject: [PATCH 156/829] [ruby/psych] Bump up 5.2.0.beta1 https://github.com/ruby/psych/commit/a8b73bb80e --- ext/psych/lib/psych/versions.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/psych/lib/psych/versions.rb b/ext/psych/lib/psych/versions.rb index b9e8d9ef1103af..3d69bf38a11c91 100644 --- a/ext/psych/lib/psych/versions.rb +++ b/ext/psych/lib/psych/versions.rb @@ -2,7 +2,7 @@ module Psych # The version of Psych you are using - VERSION = '5.1.2' + VERSION = '5.2.0.beta1' if RUBY_ENGINE == 'jruby' DEFAULT_SNAKEYAML_VERSION = '2.7'.freeze From 330b2ffb51dc27f82a1cb820db189b0bd2b33422 Mon Sep 17 00:00:00 2001 From: git Date: Mon, 9 Sep 2024 06:47:55 +0000 Subject: [PATCH 157/829] Update default gems list at 2d4fdafa64cc3153792c870a56971a [ci skip] --- NEWS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/NEWS.md b/NEWS.md index 07ae01676b09ec..0bef0df4a2ae1f 100644 --- a/NEWS.md +++ b/NEWS.md @@ -79,6 +79,7 @@ The following default gems are updated. * net-http 0.4.1 * optparse 0.5.0 * prism 1.0.0 +* psych 5.2.0.beta1 * rdoc 6.7.0 * reline 0.5.10 * resolv 0.4.0 From a2ae7450d75bafbbbbd1cf9c1b5ada09038d7cf6 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Mon, 9 Sep 2024 16:25:43 +0900 Subject: [PATCH 158/829] Suppress discards qualifiers warning with ASN --- gc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gc.c b/gc.c index c6531346952d28..6c8e808fa89c8a 100644 --- a/gc.c +++ b/gc.c @@ -2349,7 +2349,8 @@ rb_gc_mark_machine_context(const rb_execution_context_t *ec) void *data = #ifdef RUBY_ASAN_ENABLED - ec; + /* gc_mark_machine_stack_location_maybe() uses data as const */ + (rb_execution_context_t *)ec; #else NULL; #endif From a304fe00f3db3719f7dbb6942e7e65e49d760c48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Fri, 6 Sep 2024 11:55:02 +0200 Subject: [PATCH 159/829] [rubygems/rubygems] Fix `gem fetch` always exiting with zero status code https://github.com/rubygems/rubygems/commit/5887e6dfa1 --- lib/rubygems/commands/fetch_command.rb | 14 ++++ .../test_gem_commands_fetch_command.rb | 82 +++++++------------ 2 files changed, 45 insertions(+), 51 deletions(-) diff --git a/lib/rubygems/commands/fetch_command.rb b/lib/rubygems/commands/fetch_command.rb index f7f5b62306a50b..c524cf792293bd 100644 --- a/lib/rubygems/commands/fetch_command.rb +++ b/lib/rubygems/commands/fetch_command.rb @@ -63,6 +63,17 @@ def check_version # :nodoc: def execute check_version + + exit_code = fetch_gems + + terminate_interaction exit_code + end + + private + + def fetch_gems + exit_code = 0 + version = options[:version] platform = Gem.platforms.last @@ -86,10 +97,13 @@ def execute if spec.nil? show_lookup_failure gem_name, gem_version, errors, suppress_suggestions, options[:domain] + exit_code |= 2 next end source.download spec say "Downloaded #{spec.full_name}" end + + exit_code end end diff --git a/test/rubygems/test_gem_commands_fetch_command.rb b/test/rubygems/test_gem_commands_fetch_command.rb index e8710d3cd13028..bd8f8aa4f921a1 100644 --- a/test/rubygems/test_gem_commands_fetch_command.rb +++ b/test/rubygems/test_gem_commands_fetch_command.rb @@ -21,11 +21,7 @@ def test_execute @cmd.options[:args] = %w[a] - use_ui @ui do - Dir.chdir @tempdir do - @cmd.execute - end - end + execute_with_exit_code a2 = specs["a-2"] @@ -46,11 +42,7 @@ def test_execute_latest @cmd.options[:args] = %w[a] @cmd.options[:version] = req(">= 0.1") - use_ui @ui do - Dir.chdir @tempdir do - @cmd.execute - end - end + execute_with_exit_code a2 = specs["a-2"] assert_path_exist(File.join(@tempdir, a2.file_name), @@ -68,11 +60,7 @@ def test_execute_prerelease @cmd.options[:args] = %w[a] @cmd.options[:prerelease] = true - use_ui @ui do - Dir.chdir @tempdir do - @cmd.execute - end - end + execute_with_exit_code a2 = specs["a-2"] @@ -105,11 +93,7 @@ def test_execute_platform FileUtils.cp a2_universal_darwin, a2_universal_darwin_spec.cache_file util_set_arch "arm64-darwin20" do - use_ui @ui do - Dir.chdir @tempdir do - @cmd.execute - end - end + execute_with_exit_code end assert_path_exist(File.join(@tempdir, a2_universal_darwin_spec.file_name), @@ -126,11 +110,7 @@ def test_execute_specific_prerelease @cmd.options[:prerelease] = true @cmd.options[:version] = "2.a" - use_ui @ui do - Dir.chdir @tempdir do - @cmd.execute - end - end + execute_with_exit_code a2_pre = specs["a-2.a"] @@ -147,11 +127,7 @@ def test_execute_version @cmd.options[:args] = %w[a] @cmd.options[:version] = Gem::Requirement.new "1" - use_ui @ui do - Dir.chdir @tempdir do - @cmd.execute - end - end + execute_with_exit_code a1 = specs["a-1"] @@ -166,11 +142,7 @@ def test_execute_version_specified_by_colon @cmd.options[:args] = %w[a:1] - use_ui @ui do - Dir.chdir @tempdir do - @cmd.execute - end - end + execute_with_exit_code a1 = specs["a-1"] @@ -182,11 +154,7 @@ def test_execute_two_version @cmd.options[:args] = %w[a b] @cmd.options[:version] = Gem::Requirement.new "1" - use_ui @ui do - assert_raise Gem::MockGemUi::TermError, @ui.error do - @cmd.execute - end - end + execute_with_term_error msg = "ERROR: Can't use --version with multiple gems. You can specify multiple gems with" \ " version requirements using `gem fetch 'my_gem:1.0.0' 'my_other_gem:~>2.0.0'`" @@ -203,11 +171,7 @@ def test_execute_two_version_specified_by_colon @cmd.options[:args] = %w[a:1 b:1] - use_ui @ui do - Dir.chdir @tempdir do - @cmd.execute - end - end + execute_with_exit_code a1 = specs["a-1"] b1 = specs["b-1"] @@ -225,9 +189,7 @@ def test_execute_version_nonexistent @cmd.options[:args] = %w[foo:2] - use_ui @ui do - @cmd.execute - end + execute_with_term_error expected = <<-EXPECTED ERROR: Could not find a valid gem 'foo' (2) in any repository @@ -245,9 +207,7 @@ def test_execute_nonexistent_hint_disabled @cmd.options[:args] = %w[foo:2] @cmd.options[:suggest_alternate] = false - use_ui @ui do - @cmd.execute - end + execute_with_term_error expected = <<-EXPECTED ERROR: Could not find a valid gem 'foo' (2) in any repository @@ -255,4 +215,24 @@ def test_execute_nonexistent_hint_disabled assert_equal expected, @ui.error end + + private + + def execute_with_term_error + use_ui @ui do + assert_raise Gem::MockGemUi::TermError, @ui.error do + @cmd.execute + end + end + end + + def execute_with_exit_code + use_ui @ui do + Dir.chdir @tempdir do + assert_raise Gem::MockGemUi::SystemExitException, @ui.error do + @cmd.execute + end + end + end + end end From 72e80c8f29c7da37039e16f403814aa7fedc7754 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Thu, 29 Aug 2024 18:26:42 +0200 Subject: [PATCH 160/829] [rubygems/rubygems] Make `gem exec` use the standard GEM_HOME https://github.com/rubygems/rubygems/commit/032b3c518a --- lib/rubygems/commands/exec_command.rb | 2 +- test/rubygems/test_gem_commands_exec_command.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/rubygems/commands/exec_command.rb b/lib/rubygems/commands/exec_command.rb index d588804290e9ab..9489f3172c9644 100644 --- a/lib/rubygems/commands/exec_command.rb +++ b/lib/rubygems/commands/exec_command.rb @@ -143,7 +143,7 @@ def install_if_needed end def set_gem_exec_install_paths - home = File.join(Gem.dir, "gem_exec") + home = Gem.dir ENV["GEM_PATH"] = ([home] + Gem.path).join(File::PATH_SEPARATOR) ENV["GEM_HOME"] = home diff --git a/test/rubygems/test_gem_commands_exec_command.rb b/test/rubygems/test_gem_commands_exec_command.rb index 8d9c810d59ceaa..fd48ce73ca3365 100644 --- a/test/rubygems/test_gem_commands_exec_command.rb +++ b/test/rubygems/test_gem_commands_exec_command.rb @@ -749,7 +749,7 @@ def test_gem_exec_gem_uninstall assert_match(/\A\s*\** LOCAL GEMS \**\s*\z/m, @ui.output) invoke "gem", "env", "GEM_HOME" - assert_equal "#{@gem_home}/gem_exec\n", @ui.output + assert_equal "#{@gem_home}\n", @ui.output end end From 155989415b660caba247db74f96b299e0cea66c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Mon, 2 Sep 2024 19:12:06 +0200 Subject: [PATCH 161/829] [rubygems/rubygems] Avoid now unnecessary reset https://github.com/rubygems/rubygems/commit/511c7b211b --- lib/rubygems/commands/exec_command.rb | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lib/rubygems/commands/exec_command.rb b/lib/rubygems/commands/exec_command.rb index 9489f3172c9644..7985b0fda66244 100644 --- a/lib/rubygems/commands/exec_command.rb +++ b/lib/rubygems/commands/exec_command.rb @@ -57,8 +57,6 @@ def usage # :nodoc: end def execute - gem_paths = { "GEM_HOME" => Gem.paths.home, "GEM_PATH" => Gem.paths.path.join(File::PATH_SEPARATOR), "GEM_SPEC_CACHE" => Gem.paths.spec_cache_dir }.compact - check_executable print_command @@ -74,9 +72,6 @@ def execute end load! - ensure - ENV.update(gem_paths) if gem_paths - Gem.clear_paths end private From d7b0f269636749fdae2ba155ba5f9b752aa17341 Mon Sep 17 00:00:00 2001 From: zverok Date: Sun, 8 Sep 2024 19:26:23 +0300 Subject: [PATCH 162/829] Return back legacy Range#step behavior for symbol ranges --- range.c | 39 ++++++++++++++++++++++++------- test/ruby/test_range.rb | 52 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 9 deletions(-) diff --git a/range.c b/range.c index a52418d2cbe96b..e8a35c22cc364d 100644 --- a/range.c +++ b/range.c @@ -309,8 +309,8 @@ range_each_func(VALUE range, int (*func)(VALUE, VALUE), VALUE arg) } } -// NB: Two functions below (step_i_iter and step_i) are used only to maintain the -// backward-compatible behavior for string ranges with integer steps. If that branch +// NB: Two functions below (step_i_iter, sym_step_i and step_i) are used only to maintain the +// backward-compatible behavior for string and symbol ranges with integer steps. If that branch // will be removed from range_step, these two can go, too. static bool step_i_iter(VALUE arg) @@ -328,6 +328,15 @@ step_i_iter(VALUE arg) return true; } +static int +sym_step_i(VALUE i, VALUE arg) +{ + if (step_i_iter(arg)) { + rb_yield(rb_str_intern(i)); + } + return 0; +} + static int step_i(VALUE i, VALUE arg) { @@ -482,15 +491,16 @@ range_step(int argc, VALUE *argv, VALUE range) const VALUE b_num_p = rb_obj_is_kind_of(b, rb_cNumeric); const VALUE e_num_p = rb_obj_is_kind_of(e, rb_cNumeric); - // For backward compatibility reasons (conforming to behavior before 3.4), String supports - // both old behavior ('a'..).step(1) and new behavior ('a'..).step('a') + // For backward compatibility reasons (conforming to behavior before 3.4), String/Symbol + // supports both old behavior ('a'..).step(1) and new behavior ('a'..).step('a') // Hence the additional conversion/addional checks. - const VALUE sb = rb_check_string_type(b); + const VALUE str_b = rb_check_string_type(b); + const VALUE sym_b = SYMBOL_P(b) ? rb_sym2str(b) : Qnil; if (rb_check_arity(argc, 0, 1)) step = argv[0]; else { - if (b_num_p || !NIL_P(sb) || (NIL_P(b) && e_num_p)) + if (b_num_p || !NIL_P(str_b) || !NIL_P(sym_b) || (NIL_P(b) && e_num_p)) step = INT2FIX(1); else rb_raise(rb_eArgError, "step is required for non-numeric ranges"); @@ -561,17 +571,28 @@ range_step(int argc, VALUE *argv, VALUE range) } else if (b_num_p && step_num_p && ruby_float_step(b, e, step, EXCL(range), TRUE)) { /* done */ - } else if (!NIL_P(sb) && FIXNUM_P(step)) { + } else if (!NIL_P(str_b) && FIXNUM_P(step)) { // backwards compatibility behavior for String only, when no step/Integer step is passed // See discussion in https://bugs.ruby-lang.org/issues/18368 VALUE iter[2] = {INT2FIX(1), step}; if (NIL_P(e)) { - rb_str_upto_endless_each(sb, step_i, (VALUE)iter); + rb_str_upto_endless_each(str_b, step_i, (VALUE)iter); + } + else { + rb_str_upto_each(str_b, e, EXCL(range), step_i, (VALUE)iter); + } + } else if (!NIL_P(sym_b) && FIXNUM_P(step)) { + // same as above: backward compatibility for symbols + + VALUE iter[2] = {INT2FIX(1), step}; + + if (NIL_P(e)) { + rb_str_upto_endless_each(sym_b, sym_step_i, (VALUE)iter); } else { - rb_str_upto_each(sb, e, EXCL(range), step_i, (VALUE)iter); + rb_str_upto_each(sym_b, rb_sym2str(e), EXCL(range), sym_step_i, (VALUE)iter); } } else { v = b; diff --git a/test/ruby/test_range.rb b/test/ruby/test_range.rb index 6c591b31550bdd..842be77ab3e228 100644 --- a/test/ruby/test_range.rb +++ b/test/ruby/test_range.rb @@ -519,6 +519,58 @@ def test_step_string_legacy assert_equal(%w[a b c], ('a'...).step.take(3)) end + def test_step_symbol_legacy + # finite + a = [] + (:a..:g).step(2) { a << _1 } + assert_equal(%i[a c e g], a) + + assert_kind_of(Enumerator, (:a..:g).step(2)) + assert_equal(%i[a c e g], (:a..:g).step(2).to_a) + + a = [] + (:a...:g).step(2) { a << _1 } + assert_equal(%i[a c e], a) + + assert_kind_of(Enumerator, (:a...:g).step(2)) + assert_equal(%i[a c e], (:a...:g).step(2).to_a) + + # endless + a = [] + (:a...).step(2) { a << _1; break if a.size == 3 } + assert_equal(%i[a c e], a) + + assert_kind_of(Enumerator, (:a...).step(2)) + assert_equal(%i[a c e], (:a...).step(2).take(3)) + + # beginless + assert_raise(ArgumentError) { (...:g).step(2) {} } + assert_raise(ArgumentError) { (...:g).step(2) } + + # step is not provided + a = [] + (:a..:d).step { a << _1 } + assert_equal(%i[a b c d], a) + + assert_kind_of(Enumerator, (:a..:d).step) + assert_equal(%i[a b c d], (:a..:d).step.to_a) + + a = [] + (:a...:d).step { a << _1 } + assert_equal(%i[a b c], a) + + assert_kind_of(Enumerator, (:a...:d).step) + assert_equal(%i[a b c], (:a...:d).step.to_a) + + # endless + a = [] + (:a...).step { a << _1; break if a.size == 3 } + assert_equal(%i[a b c], a) + + assert_kind_of(Enumerator, (:a...).step) + assert_equal(%i[a b c], (:a...).step.take(3)) + end + def test_step_bug15537 assert_equal([10.0, 9.0, 8.0, 7.0], (10 ..).step(-1.0).take(4)) assert_equal([10.0, 9.0, 8.0, 7.0], (10.0 ..).step(-1).take(4)) From 391bb55a8ebfd93a49c5c4aac5885c4ae4573a14 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Mon, 9 Sep 2024 17:25:22 +0900 Subject: [PATCH 163/829] Run just bignum related tests when gmp enabled --- .github/workflows/compilers.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/compilers.yml b/.github/workflows/compilers.yml index 17361e9b7f277a..eb345cb830abab 100644 --- a/.github/workflows/compilers.yml +++ b/.github/workflows/compilers.yml @@ -137,7 +137,7 @@ jobs: - { name: '-O0', env: { optflags: '-O0 -march=x86-64 -mtune=generic' } } # - { name: '-O3', env: { optflags: '-O3 -march=x86-64 -mtune=generic' }, check: true } - - { name: gmp, env: { append_configure: '--with-gmp' }, check: true } + - { name: gmp, env: { append_configure: '--with-gmp' }, check: 'ruby/test_bignum.rb' } - { name: jemalloc, env: { append_configure: '--with-jemalloc' } } - { name: valgrind, env: { append_configure: '--with-valgrind' } } - { name: 'coroutine=ucontext', env: { append_configure: '--with-coroutine=ucontext' } } @@ -286,8 +286,10 @@ jobs: - run: make test-tool if: ${{ matrix.entry.check }} - - run: make test-all TESTS='-- ruby -ext-' + - run: make test-all TESTS="-- $tests" if: ${{ matrix.entry.check }} + env: + tests: ${{ matrix.entry.check == true && 'ruby -ext-' || matrix.entry.check }} - run: make test-spec env: From 3aae0873f71098946fa06d8428205762a26e1f27 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Mon, 9 Sep 2024 19:22:20 +0900 Subject: [PATCH 164/829] Update clang for LTO --- .github/workflows/compilers.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/compilers.yml b/.github/workflows/compilers.yml index eb345cb830abab..8dee2420c2ef6c 100644 --- a/.github/workflows/compilers.yml +++ b/.github/workflows/compilers.yml @@ -97,10 +97,10 @@ jobs: - { name: clang-8, env: { default_cc: clang-8, append_configure: '--disable-yjit' } } - { name: clang-7, env: { default_cc: clang-7, append_configure: '--disable-yjit' } } - { name: clang-6.0, env: { default_cc: clang-6.0, append_configure: '--disable-yjit' } } - - name: 'clang-16 LTO' - container: clang-16 + - name: 'clang-18 LTO' + container: clang-18 env: - default_cc: 'clang-16 -flto=auto' + default_cc: 'clang-18 -flto=auto' optflags: '-O2' shared: disable # check: true From 966901b39dd7b37eec68dd6e8a76a79827dc522f Mon Sep 17 00:00:00 2001 From: Daniel Colson Date: Fri, 6 Sep 2024 13:10:04 -0400 Subject: [PATCH 165/829] [rubygems/rubygems] Don't include hook templates in cached git source With a default git setup, each cloned repo in the cache will end up with ~60K of sample git hooks. These files all end in `.sample`, and they are disabled by default. Deleting them should be a no-op, and makes the cache a bit smaller. https://github.com/rubygems/rubygems/commit/d2149999cd --- lib/bundler/source/git.rb | 1 + spec/bundler/cache/git_spec.rb | 1 + 2 files changed, 2 insertions(+) diff --git a/lib/bundler/source/git.rb b/lib/bundler/source/git.rb index 4e94645f6b8ad6..2a327e5fb670f7 100644 --- a/lib/bundler/source/git.rb +++ b/lib/bundler/source/git.rb @@ -226,6 +226,7 @@ def cache(spec, custom_path = nil) git_proxy.checkout if requires_checkout? FileUtils.cp_r("#{cache_path}/.", app_cache_path) FileUtils.touch(app_cache_path.join(".bundlecache")) + FileUtils.rm_rf(Dir.glob(app_cache_path.join("hooks/*.sample"))) end def load_spec_files diff --git a/spec/bundler/cache/git_spec.rb b/spec/bundler/cache/git_spec.rb index 8958916fecf3bc..7c577b105e47a9 100644 --- a/spec/bundler/cache/git_spec.rb +++ b/spec/bundler/cache/git_spec.rb @@ -27,6 +27,7 @@ expect(bundled_app("vendor/cache/foo-1.0-#{ref}")).to exist expect(bundled_app("vendor/cache/foo-1.0-#{ref}/.git")).not_to exist expect(bundled_app("vendor/cache/foo-1.0-#{ref}/.bundlecache")).to be_file + expect(Dir.glob(bundled_app("vendor/cache/foo-1.0-#{ref}/hooks/*.sample"))).to be_empty FileUtils.rm_rf lib_path("foo-1.0") expect(the_bundle).to include_gems "foo 1.0" From 16f241f0aa047ed77ccea6b6c361b421a72d0454 Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Thu, 1 Aug 2024 11:14:19 +0200 Subject: [PATCH 166/829] Implement String#append_as_bytes(String | Integer, ...) [Feature #20594] A handy method to construct a string out of multiple chunks. Contrary to `String#concat`, it doesn't do any encoding negociation, and simply append the content as bytes regardless of whether this result in a broken string or not. It's the caller responsibility to check for `String#valid_encoding?` in cases where it's needed. When passed integers, only the lower byte is considered, like in `String#setbyte`. --- spec/ruby/core/string/append_as_bytes_spec.rb | 46 +++++ string.c | 165 ++++++++++++++++++ test/ruby/test_string.rb | 49 ++++++ 3 files changed, 260 insertions(+) create mode 100644 spec/ruby/core/string/append_as_bytes_spec.rb diff --git a/spec/ruby/core/string/append_as_bytes_spec.rb b/spec/ruby/core/string/append_as_bytes_spec.rb new file mode 100644 index 00000000000000..0e1d09558bd1f5 --- /dev/null +++ b/spec/ruby/core/string/append_as_bytes_spec.rb @@ -0,0 +1,46 @@ +require_relative '../../spec_helper' + +describe "String#append_bytes" do + ruby_version_is "3.4" do + it "doesn't allow to mutate frozen strings" do + str = "hello".freeze + -> { str.append_as_bytes("\xE2\x82") }.should raise_error(FrozenError) + end + + it "allows creating broken strings" do + str = +"hello" + str.append_as_bytes("\xE2\x82") + str.valid_encoding?.should == false + + str.append_as_bytes("\xAC") + str.valid_encoding?.should == true + + str = "abc".encode(Encoding::UTF_32LE) + str.append_as_bytes("def") + str.encoding.should == Encoding::UTF_32LE + str.valid_encoding?.should == false + end + + it "never changes the receiver encoding" do + str = "".b + str.append_as_bytes("€") + str.encoding.should == Encoding::BINARY + end + + it "accepts variadic String or Integer arguments" do + str = "hello".b + str.append_as_bytes("\xE2\x82", 12, 43, "\xAC") + str.encoding.should == Encoding::BINARY + str.should == "hello\xE2\x82\f+\xAC".b + end + + it "only accepts strings or integers, and doesn't attempt to cast with #to_str or #to_int" do + to_str = mock("to_str") + to_str.should_not_receive(:to_str) + to_str.should_not_receive(:to_int) + + str = +"hello" + -> { str.append_as_bytes(to_str) }.should raise_error(TypeError, "wrong argument type MockObject (expected String or Integer)") + end + end +end diff --git a/string.c b/string.c index d9569d1515c4e7..de39e84cb131b2 100644 --- a/string.c +++ b/string.c @@ -3308,6 +3308,32 @@ rb_str_resize(VALUE str, long len) return str; } +static void +str_ensure_available_capa(VALUE str, long len) +{ + str_modify_keep_cr(str); + + const int termlen = TERM_LEN(str); + long olen = RSTRING_LEN(str); + + if (RB_UNLIKELY(olen > LONG_MAX - len)) { + rb_raise(rb_eArgError, "string sizes too big"); + } + + long total = olen + len; + long capa = str_capacity(str, termlen); + + if (capa < total) { + if (total >= LONG_MAX / 2) { + capa = total; + } + while (total > capa) { + capa = 2 * capa + termlen; /* == 2*(capa+termlen)-termlen */ + } + RESIZE_CAPA_TERM(str, capa, termlen); + } +} + static VALUE str_buf_cat4(VALUE str, const char *ptr, long len, bool keep_cr) { @@ -3662,6 +3688,144 @@ rb_str_concat_multi(int argc, VALUE *argv, VALUE str) return str; } +/* + * call-seq: + * append_as_bytes(*objects) -> string + * + * Concatenates each object in +objects+ into +self+ without any encoding + * validation or conversion and returns +self+: + * + * s = 'foo' + * s.append_as_bytes(" \xE2\x82") # => "foo \xE2\x82" + * s.valid_encoding? # => false + * s.append_as_bytes("\xAC 12") + * s.valid_encoding? # => true + * + * For each given object +object+ that is an Integer, + * the value is considered a Byte. If the Integer is bigger + * than one byte, only the lower byte is considered, similar to String#setbyte: + * + * s = "" + * s.append_as_bytes(0, 257) # => "\u0000\u0001" + * + * Related: String#<<, String#concat, which do an encoding aware concatenation. + */ + +VALUE +rb_str_append_as_bytes(int argc, VALUE *argv, VALUE str) +{ + long needed_capacity = 0; + volatile VALUE t0; + enum ruby_value_type *types = ALLOCV_N(enum ruby_value_type, t0, argc); + + for (int index = 0; index < argc; index++) { + VALUE obj = argv[index]; + enum ruby_value_type type = types[index] = rb_type(obj); + switch (type) { + case T_FIXNUM: + case T_BIGNUM: + needed_capacity++; + break; + case T_STRING: + needed_capacity += RSTRING_LEN(obj); + break; + default: + rb_raise( + rb_eTypeError, + "wrong argument type %"PRIsVALUE" (expected String or Integer)", + rb_obj_class(obj) + ); + break; + } + } + + str_ensure_available_capa(str, needed_capacity); + char *sptr = RSTRING_END(str); + + for (int index = 0; index < argc; index++) { + VALUE obj = argv[index]; + enum ruby_value_type type = types[index]; + switch (type) { + case T_FIXNUM: + case T_BIGNUM: { + argv[index] = obj = rb_int_and(obj, INT2FIX(0xff)); + char byte = (char)(NUM2INT(obj) & 0xFF); + *sptr = byte; + sptr++; + break; + } + case T_STRING: { + const char *ptr; + long len; + RSTRING_GETMEM(obj, ptr, len); + memcpy(sptr, ptr, len); + sptr += len; + break; + } + default: + UNREACHABLE; + RUBY_ASSERT("append_as_bytes arguments should have been validated"); + break; + } + } + + STR_SET_LEN(str, RSTRING_LEN(str) + needed_capacity); + TERM_FILL(sptr, TERM_LEN(str)); /* sentinel */ + + int cr = ENC_CODERANGE(str); + switch (cr) { + case ENC_CODERANGE_7BIT: { + for (int index = 0; index < argc; index++) { + VALUE obj = argv[index]; + enum ruby_value_type type = types[index]; + switch (type) { + case T_FIXNUM: + case T_BIGNUM: { + if (!ISASCII(NUM2INT(obj))) { + goto clear_cr; + } + break; + } + case T_STRING: { + if (ENC_CODERANGE(obj) != ENC_CODERANGE_7BIT) { + goto clear_cr; + } + } + default: + UNREACHABLE; + RUBY_ASSERT("append_as_bytes arguments should have been validated"); + break; + } + } + break; + } + case ENC_CODERANGE_VALID: + if (ENCODING_GET_INLINED(str) == ENCINDEX_ASCII_8BIT) { + goto keep_cr; + } + else { + goto clear_cr; + } + break; + default: + goto clear_cr; + break; + } + + RB_GC_GUARD(t0); + + clear_cr: + // If no fast path was hit, we clear the coderange. + // append_as_bytes is predominently meant to be used in + // buffering situation, hence it's likely the coderange + // will never be scanned, so it's not worth spending time + // precomputing the coderange except for simple and common + // situations. + ENC_CODERANGE_CLEAR(str); + keep_cr: + return str; +} + /* * call-seq: * string << object -> string @@ -12433,6 +12597,7 @@ Init_String(void) rb_define_method(rb_cString, "reverse", rb_str_reverse, 0); rb_define_method(rb_cString, "reverse!", rb_str_reverse_bang, 0); rb_define_method(rb_cString, "concat", rb_str_concat_multi, -1); + rb_define_method(rb_cString, "append_as_bytes", rb_str_append_as_bytes, -1); rb_define_method(rb_cString, "<<", rb_str_concat, 1); rb_define_method(rb_cString, "prepend", rb_str_prepend_multi, -1); rb_define_method(rb_cString, "crypt", rb_str_crypt, 1); diff --git a/test/ruby/test_string.rb b/test/ruby/test_string.rb index 7b3d63dd1b5c80..8658097ae409ec 100644 --- a/test/ruby/test_string.rb +++ b/test/ruby/test_string.rb @@ -3630,6 +3630,55 @@ def test_bytesplice assert_bytesplice_raise(ArgumentError, S("hello"), 0..-1, "bye", 0, 3) end + def test_append_bytes_into_binary + buf = S("".b) + assert_equal Encoding::BINARY, buf.encoding + + buf.append_as_bytes(S("hello")) + assert_equal "hello".b, buf + assert_equal Encoding::BINARY, buf.encoding + + buf.append_as_bytes(S("こんにちは")) + assert_equal S("helloこんにちは".b), buf + assert_equal Encoding::BINARY, buf.encoding + end + + def test_append_bytes_into_utf8 + buf = S("") + assert_equal Encoding::UTF_8, buf.encoding + + buf.append_as_bytes(S("hello")) + assert_equal S("hello"), buf + assert_equal Encoding::UTF_8, buf.encoding + assert_predicate buf, :ascii_only? + assert_predicate buf, :valid_encoding? + + buf.append_as_bytes(S("こんにちは")) + assert_equal S("helloこんにちは"), buf + assert_equal Encoding::UTF_8, buf.encoding + refute_predicate buf, :ascii_only? + assert_predicate buf, :valid_encoding? + + buf.append_as_bytes(S("\xE2\x82".b)) + assert_equal S("helloこんにちは\xE2\x82"), buf + assert_equal Encoding::UTF_8, buf.encoding + refute_predicate buf, :valid_encoding? + + buf.append_as_bytes(S("\xAC".b)) + assert_equal S("helloこんにちは€"), buf + assert_equal Encoding::UTF_8, buf.encoding + assert_predicate buf, :valid_encoding? + end + + def test_append_bytes_into_utf32 + buf = S("abc".encode(Encoding::UTF_32LE)) + assert_equal Encoding::UTF_32LE, buf.encoding + + buf.append_as_bytes("def") + assert_equal Encoding::UTF_32LE, buf.encoding + refute_predicate buf, :valid_encoding? + end + def test_chilled_string chilled_string = eval('"chilled"') From b66d6e48c8832edebcf7e6d667d10702ddbce42c Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Wed, 4 Sep 2024 11:59:37 -0400 Subject: [PATCH 167/829] Switch sorted list of pages in the GC to a darray --- darray.h | 21 +++++ gc/default.c | 192 +++++++++++++------------------------------ test/ruby/test_gc.rb | 1 - 3 files changed, 77 insertions(+), 137 deletions(-) diff --git a/darray.h b/darray.h index 372115a96ba090..08b53d8cd10761 100644 --- a/darray.h +++ b/darray.h @@ -53,6 +53,19 @@ (*(ptr_to_ary))->meta.size++; \ } while (0) +#define rb_darray_insert(ptr_to_ary, idx, element) do { \ + rb_darray_ensure_space((ptr_to_ary), \ + sizeof(**(ptr_to_ary)), \ + sizeof((*(ptr_to_ary))->data[0])); \ + MEMMOVE( \ + rb_darray_ref(*(ptr_to_ary), idx + 1), \ + rb_darray_ref(*(ptr_to_ary), idx), \ + sizeof((*(ptr_to_ary))->data[0]), \ + rb_darray_size(*(ptr_to_ary)) - idx); \ + rb_darray_set(*(ptr_to_ary), idx, element); \ + (*(ptr_to_ary))->meta.size++; \ +} while (0) + // Iterate over items of the array in a for loop // #define rb_darray_foreach(ary, idx_name, elem_ptr_var) \ @@ -108,6 +121,14 @@ rb_darray_size(const void *ary) return meta ? meta->size : 0; } + +static inline void +rb_darray_pop(void *ary, size_t count) +{ + rb_darray_meta_t *meta = ary; + meta->size -= count; +} + // Get the capacity of the dynamic array. // static inline size_t diff --git a/gc/default.c b/gc/default.c index 918a4ffa629efb..6902e70a858b20 100644 --- a/gc/default.c +++ b/gc/default.c @@ -509,9 +509,9 @@ typedef struct rb_objspace { size_t marked_slots; struct { - struct heap_page **sorted; + rb_darray(struct heap_page *) sorted; + size_t allocated_pages; - size_t sorted_length; uintptr_t range[2]; size_t freeable_pages; @@ -833,9 +833,7 @@ RVALUE_AGE_SET(VALUE obj, int age) #define malloc_limit objspace->malloc_params.limit #define malloc_increase objspace->malloc_params.increase #define malloc_allocated_size objspace->malloc_params.allocated_size -#define heap_pages_sorted objspace->heap_pages.sorted #define heap_allocated_pages objspace->heap_pages.allocated_pages -#define heap_pages_sorted_length objspace->heap_pages.sorted_length #define heap_pages_lomem objspace->heap_pages.range[0] #define heap_pages_himem objspace->heap_pages.range[1] #define heap_pages_freeable_pages objspace->heap_pages.freeable_pages @@ -1721,58 +1719,10 @@ static void free_stack_chunks(mark_stack_t *); static void mark_stack_free_cache(mark_stack_t *); static void heap_page_free(rb_objspace_t *objspace, struct heap_page *page); -static void -heap_pages_expand_sorted_to(rb_objspace_t *objspace, size_t next_length) -{ - struct heap_page **sorted; - size_t size = rb_size_mul_or_raise(next_length, sizeof(struct heap_page *), rb_eRuntimeError); - - gc_report(3, objspace, "heap_pages_expand_sorted: next_length: %"PRIdSIZE", size: %"PRIdSIZE"\n", - next_length, size); - - if (heap_pages_sorted_length > 0) { - sorted = (struct heap_page **)realloc(heap_pages_sorted, size); - if (sorted) heap_pages_sorted = sorted; - } - else { - sorted = heap_pages_sorted = (struct heap_page **)malloc(size); - } - - if (sorted == 0) { - rb_memerror(); - } - - heap_pages_sorted_length = next_length; -} - -static void -heap_pages_expand_sorted(rb_objspace_t *objspace) -{ - /* usually heap_allocatable_pages + heap_eden->total_pages == heap_pages_sorted_length - * because heap_allocatable_pages contains heap_tomb->total_pages (recycle heap_tomb pages). - * however, if there are pages which do not have empty slots, then try to create new pages - * so that the additional allocatable_pages counts (heap_tomb->total_pages) are added. - */ - size_t next_length = heap_allocatable_pages(objspace); - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - rb_size_pool_t *size_pool = &size_pools[i]; - next_length += SIZE_POOL_EDEN_HEAP(size_pool)->total_pages; - next_length += SIZE_POOL_TOMB_HEAP(size_pool)->total_pages; - } - - if (next_length > heap_pages_sorted_length) { - heap_pages_expand_sorted_to(objspace, next_length); - } - - GC_ASSERT(heap_allocatable_pages(objspace) + heap_eden_total_pages(objspace) <= heap_pages_sorted_length); - GC_ASSERT(heap_allocated_pages <= heap_pages_sorted_length); -} - static void size_pool_allocatable_pages_set(rb_objspace_t *objspace, rb_size_pool_t *size_pool, size_t s) { size_pool->allocatable_pages = s; - heap_pages_expand_sorted(objspace); } static inline void @@ -1899,10 +1849,8 @@ heap_page_free(rb_objspace_t *objspace, struct heap_page *page) static void heap_pages_free_unused_pages(rb_objspace_t *objspace) { - size_t i, j; - bool has_pages_in_tomb_heap = FALSE; - for (i = 0; i < SIZE_POOL_COUNT; i++) { + for (size_t i = 0; i < SIZE_POOL_COUNT; i++) { if (!ccan_list_empty(&SIZE_POOL_TOMB_HEAP(&size_pools[i])->pages)) { has_pages_in_tomb_heap = TRUE; break; @@ -1910,8 +1858,9 @@ heap_pages_free_unused_pages(rb_objspace_t *objspace) } if (has_pages_in_tomb_heap) { - for (i = j = 0; j < heap_allocated_pages; i++) { - struct heap_page *page = heap_pages_sorted[i]; + size_t i, j; + for (i = j = 0; i < rb_darray_size(objspace->heap_pages.sorted); i++) { + struct heap_page *page = rb_darray_get(objspace->heap_pages.sorted, i); if (page->flags.in_tomb && page->free_slots == page->total_slots) { heap_unlink_page(objspace, SIZE_POOL_TOMB_HEAP(page->size_pool), page); @@ -1919,18 +1868,21 @@ heap_pages_free_unused_pages(rb_objspace_t *objspace) } else { if (i != j) { - heap_pages_sorted[j] = page; + rb_darray_set(objspace->heap_pages.sorted, j, page); } j++; } } - struct heap_page *hipage = heap_pages_sorted[heap_allocated_pages - 1]; + rb_darray_pop(objspace->heap_pages.sorted, i - j); + GC_ASSERT(rb_darray_size(objspace->heap_pages.sorted) == j); + + struct heap_page *hipage = rb_darray_get(objspace->heap_pages.sorted, rb_darray_size(objspace->heap_pages.sorted) - 1); uintptr_t himem = (uintptr_t)hipage->start + (hipage->total_slots * hipage->slot_size); GC_ASSERT(himem <= heap_pages_himem); heap_pages_himem = himem; - struct heap_page *lopage = heap_pages_sorted[0]; + struct heap_page *lopage = rb_darray_get(objspace->heap_pages.sorted, 0); uintptr_t lomem = (uintptr_t)lopage->start; GC_ASSERT(lomem >= heap_pages_lomem); heap_pages_lomem = lomem; @@ -2026,7 +1978,6 @@ heap_page_allocate(rb_objspace_t *objspace, rb_size_pool_t *size_pool) { uintptr_t start, end, p; struct heap_page *page; - uintptr_t hi, lo, mid; size_t stride = size_pool->slot_size; unsigned int limit = (unsigned int)((HEAP_PAGE_SIZE - sizeof(struct heap_page_header)))/(int)stride; @@ -2065,14 +2016,13 @@ heap_page_allocate(rb_objspace_t *objspace, rb_size_pool_t *size_pool) } end = start + (limit * (int)stride); - /* setup heap_pages_sorted */ - lo = 0; - hi = (uintptr_t)heap_allocated_pages; + size_t lo = 0; + size_t hi = rb_darray_size(objspace->heap_pages.sorted); while (lo < hi) { struct heap_page *mid_page; - mid = (lo + hi) / 2; - mid_page = heap_pages_sorted[mid]; + size_t mid = (lo + hi) / 2; + mid_page = rb_darray_get(objspace->heap_pages.sorted, mid); if ((uintptr_t)mid_page->start < start) { lo = mid + 1; } @@ -2084,25 +2034,12 @@ heap_page_allocate(rb_objspace_t *objspace, rb_size_pool_t *size_pool) } } - if (hi < (uintptr_t)heap_allocated_pages) { - MEMMOVE(&heap_pages_sorted[hi+1], &heap_pages_sorted[hi], struct heap_page_header*, heap_allocated_pages - hi); - } - - heap_pages_sorted[hi] = page; + rb_darray_insert(&objspace->heap_pages.sorted, hi, page); heap_allocated_pages++; - GC_ASSERT(heap_eden_total_pages(objspace) + heap_allocatable_pages(objspace) <= heap_pages_sorted_length); - GC_ASSERT(heap_eden_total_pages(objspace) + heap_tomb_total_pages(objspace) == heap_allocated_pages - 1); - GC_ASSERT(heap_allocated_pages <= heap_pages_sorted_length); - size_pool->total_allocated_pages++; - if (heap_allocated_pages > heap_pages_sorted_length) { - rb_bug("heap_page_allocate: allocated(%"PRIdSIZE") > sorted(%"PRIdSIZE")", - heap_allocated_pages, heap_pages_sorted_length); - } - if (heap_pages_lomem == 0 || heap_pages_lomem > start) heap_pages_lomem = start; if (heap_pages_himem < end) heap_pages_himem = end; @@ -2142,22 +2079,14 @@ heap_page_resurrect(rb_objspace_t *objspace, rb_size_pool_t *size_pool) static struct heap_page * heap_page_create(rb_objspace_t *objspace, rb_size_pool_t *size_pool) { - struct heap_page *page; - const char *method = "recycle"; - size_pool->allocatable_pages--; - page = heap_page_resurrect(objspace, size_pool); + struct heap_page *page = heap_page_resurrect(objspace, size_pool); if (page == NULL) { page = heap_page_allocate(objspace, size_pool); - method = "allocate"; } - if (0) fprintf(stderr, "heap_page_create: %s - %p, " - "heap_allocated_pages: %"PRIdSIZE", " - "heap_allocated_pages: %"PRIdSIZE", " - "tomb->total_pages: %"PRIdSIZE"\n", - method, (void *)page, heap_pages_sorted_length, heap_allocated_pages, SIZE_POOL_TOMB_HEAP(size_pool)->total_pages); + return page; } @@ -2245,12 +2174,9 @@ static int heap_increment(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *heap) { if (size_pool->allocatable_pages > 0) { - gc_report(1, objspace, "heap_increment: heap_pages_sorted_length: %"PRIdSIZE", " + gc_report(1, objspace, "heap_increment: rb_darray_size(objspace->heap_pages.sorted): %"PRIdSIZE", " "heap_pages_inc: %"PRIdSIZE", heap->total_pages: %"PRIdSIZE"\n", - heap_pages_sorted_length, size_pool->allocatable_pages, heap->total_pages); - - GC_ASSERT(heap_allocatable_pages(objspace) + heap_eden_total_pages(objspace) <= heap_pages_sorted_length); - GC_ASSERT(heap_allocated_pages <= heap_pages_sorted_length); + rb_darray_size(objspace->heap_pages.sorted), size_pool->allocatable_pages, heap->total_pages); heap_assign_page(objspace, size_pool, heap); return TRUE; @@ -2288,11 +2214,13 @@ heap_prepare(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *heap /* Continue incremental marking or lazy sweeping, if in any of those steps. */ gc_continue(objspace, size_pool, heap); + if (heap->free_pages == NULL) { + heap_increment(objspace, size_pool, heap); + } + /* If we still don't have a free page and not allowed to create a new page, * we should start a new GC cycle. */ - if (heap->free_pages == NULL && - (will_be_incremental_marking(objspace) || - (heap_increment(objspace, size_pool, heap) == FALSE))) { + if (heap->free_pages == NULL) { if (gc_start(objspace, GPR_FLAG_NEWOBJ) == FALSE) { rb_memerror(); } @@ -2501,6 +2429,12 @@ heap_next_free_page(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_ if (heap->free_pages == NULL) { heap_prepare(objspace, size_pool, heap); + + if (heap->free_pages == NULL) { + GC_ASSERT(size_pool->allocatable_pages > 0); + heap_increment(objspace, size_pool, heap); + GC_ASSERT(!(heap->free_pages == NULL)); + } } page = heap->free_pages; @@ -2755,7 +2689,7 @@ heap_page_for_ptr(rb_objspace_t *objspace, uintptr_t ptr) return NULL; } - res = bsearch((void *)ptr, heap_pages_sorted, + res = bsearch((void *)ptr, rb_darray_ref(objspace->heap_pages.sorted, 0), (size_t)heap_allocated_pages, sizeof(struct heap_page *), ptr_in_page_body_p); @@ -3219,7 +3153,7 @@ rb_gc_impl_shutdown_free_objects(void *objspace_ptr) rb_objspace_t *objspace = objspace_ptr; for (size_t i = 0; i < heap_allocated_pages; i++) { - struct heap_page *page = heap_pages_sorted[i]; + struct heap_page *page = rb_darray_get(objspace->heap_pages.sorted, i); short stride = page->slot_size; uintptr_t p = (uintptr_t)page->start; @@ -3291,7 +3225,7 @@ rb_gc_impl_shutdown_call_finalizer(void *objspace_ptr) /* run data/file object's finalizers */ for (size_t i = 0; i < heap_allocated_pages; i++) { - struct heap_page *page = heap_pages_sorted[i]; + struct heap_page *page = rb_darray_get(objspace->heap_pages.sorted, i); short stride = page->slot_size; uintptr_t p = (uintptr_t)page->start; @@ -3326,7 +3260,7 @@ rb_gc_impl_each_object(void *objspace_ptr, void (*func)(VALUE obj, void *data), rb_objspace_t *objspace = objspace_ptr; for (size_t i = 0; i < heap_allocated_pages; i++) { - struct heap_page *page = heap_pages_sorted[i]; + struct heap_page *page = rb_darray_get(objspace->heap_pages.sorted, i); short stride = page->slot_size; uintptr_t p = (uintptr_t)page->start; @@ -4087,7 +4021,6 @@ gc_sweep_finish(rb_objspace_t *objspace) objspace->rincgc.pooled_slots = 0; } } - heap_pages_expand_sorted(objspace); rb_gc_event_hook(0, RUBY_INTERNAL_EVENT_GC_END_SWEEP); gc_mode_transition(objspace, gc_mode_none); @@ -4193,16 +4126,12 @@ gc_sweep_continue(rb_objspace_t *objspace, rb_size_pool_t *sweep_size_pool, rb_h for (int i = 0; i < SIZE_POOL_COUNT; i++) { rb_size_pool_t *size_pool = &size_pools[i]; if (!gc_sweep_step(objspace, size_pool, SIZE_POOL_EDEN_HEAP(size_pool))) { - /* sweep_size_pool requires a free slot but sweeping did not yield any. */ - if (size_pool == sweep_size_pool) { - if (size_pool->allocatable_pages > 0) { - heap_increment(objspace, size_pool, heap); - } - else { - /* Not allowed to create a new page so finish sweeping. */ - gc_sweep_rest(objspace); - break; - } + /* sweep_size_pool requires a free slot but sweeping did not yield any + * and we cannot allocate a new page. */ + if (size_pool == sweep_size_pool && size_pool->allocatable_pages == 0) { + /* Not allowed to create a new page so finish sweeping. */ + gc_sweep_rest(objspace); + break; } } } @@ -5412,7 +5341,7 @@ gc_verify_internal_consistency_(rb_objspace_t *objspace) /* check relations */ for (size_t i = 0; i < heap_allocated_pages; i++) { - struct heap_page *page = heap_pages_sorted[i]; + struct heap_page *page = rb_darray_get(objspace->heap_pages.sorted, i); short slot_size = page->slot_size; uintptr_t start = (uintptr_t)page->start; @@ -7708,7 +7637,6 @@ enum gc_stat_sym { gc_stat_sym_marking_time, gc_stat_sym_sweeping_time, gc_stat_sym_heap_allocated_pages, - gc_stat_sym_heap_sorted_length, gc_stat_sym_heap_allocatable_pages, gc_stat_sym_heap_available_slots, gc_stat_sym_heap_live_slots, @@ -7760,7 +7688,6 @@ setup_gc_stat_symbols(void) S(marking_time), S(sweeping_time), S(heap_allocated_pages); - S(heap_sorted_length); S(heap_allocatable_pages); S(heap_available_slots); S(heap_live_slots); @@ -7838,7 +7765,6 @@ rb_gc_impl_stat(void *objspace_ptr, VALUE hash_or_sym) /* implementation dependent counters */ SET(heap_allocated_pages, heap_allocated_pages); - SET(heap_sorted_length, heap_pages_sorted_length); SET(heap_allocatable_pages, heap_allocatable_pages(objspace)); SET(heap_available_slots, objspace_available_slots(objspace)); SET(heap_live_slots, objspace_live_slots(objspace)); @@ -8196,7 +8122,6 @@ gc_set_initial_pages(rb_objspace_t *objspace) size_pool->allocatable_pages = 0; } } - heap_pages_expand_sorted(objspace); } /* @@ -9546,24 +9471,20 @@ rb_gc_impl_objspace_free(void *objspace_ptr) free(objspace->profile.records); objspace->profile.records = NULL; - if (heap_pages_sorted) { - size_t i; - size_t total_heap_pages = heap_allocated_pages; - for (i = 0; i < total_heap_pages; ++i) { - heap_page_free(objspace, heap_pages_sorted[i]); - } - free(heap_pages_sorted); - heap_allocated_pages = 0; - heap_pages_sorted_length = 0; - heap_pages_lomem = 0; - heap_pages_himem = 0; + for (size_t i = 0; i < heap_allocated_pages; i++) { + heap_page_free(objspace, rb_darray_get(objspace->heap_pages.sorted, i)); + } + rb_darray_free(objspace->heap_pages.sorted); + heap_allocated_pages = 0; + heap_pages_lomem = 0; + heap_pages_himem = 0; - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - rb_size_pool_t *size_pool = &size_pools[i]; - SIZE_POOL_EDEN_HEAP(size_pool)->total_pages = 0; - SIZE_POOL_EDEN_HEAP(size_pool)->total_slots = 0; - } + for (int i = 0; i < SIZE_POOL_COUNT; i++) { + rb_size_pool_t *size_pool = &size_pools[i]; + SIZE_POOL_EDEN_HEAP(size_pool)->total_pages = 0; + SIZE_POOL_EDEN_HEAP(size_pool)->total_slots = 0; } + st_free_table(objspace->id_to_obj_tbl); st_free_table(objspace->obj_to_id_tbl); @@ -9643,6 +9564,7 @@ rb_gc_impl_objspace_init(void *objspace_ptr) ccan_list_head_init(&SIZE_POOL_TOMB_HEAP(size_pool)->pages); } + rb_darray_make(&objspace->heap_pages.sorted, 0); rb_darray_make(&objspace->weak_references, 0); // TODO: debug why on Windows Ruby crashes on boot when GC is on. @@ -9668,8 +9590,6 @@ rb_gc_impl_objspace_init(void *objspace_ptr) size_pool->allocatable_pages = minimum_pages_for_size_pool(objspace, size_pool); } - heap_pages_expand_sorted(objspace); - init_mark_stack(&objspace->mark_stack); objspace->profile.invoke_time = getrusage_time(); diff --git a/test/ruby/test_gc.rb b/test/ruby/test_gc.rb index 43444fe8e74d38..0cf99a9f9c64d8 100644 --- a/test/ruby/test_gc.rb +++ b/test/ruby/test_gc.rb @@ -208,7 +208,6 @@ def test_stat_constraints # marking_time + sweeping_time could differ from time by 1 because they're stored in nanoseconds assert_in_delta stat[:time], stat[:marking_time] + stat[:sweeping_time], 1 assert_equal stat[:total_allocated_pages], stat[:heap_allocated_pages] + stat[:total_freed_pages] - assert_operator stat[:heap_sorted_length], :>=, stat[:heap_eden_pages] + stat[:heap_allocatable_pages], "stat is: " + stat.inspect assert_equal stat[:heap_available_slots], stat[:heap_live_slots] + stat[:heap_free_slots] + stat[:heap_final_slots] assert_equal stat[:heap_live_slots], stat[:total_allocated_objects] - stat[:total_freed_objects] - stat[:heap_final_slots] assert_equal stat[:heap_allocated_pages], stat[:heap_eden_pages] + stat[:heap_tomb_pages] From de7ac11a09249defd93d1ee34c817fa9d31e7936 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Wed, 4 Sep 2024 15:09:40 -0400 Subject: [PATCH 168/829] Replace heap_allocated_pages with rb_darray_size --- gc/default.c | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/gc/default.c b/gc/default.c index 6902e70a858b20..cd387466de8c71 100644 --- a/gc/default.c +++ b/gc/default.c @@ -833,7 +833,6 @@ RVALUE_AGE_SET(VALUE obj, int age) #define malloc_limit objspace->malloc_params.limit #define malloc_increase objspace->malloc_params.increase #define malloc_allocated_size objspace->malloc_params.allocated_size -#define heap_allocated_pages objspace->heap_pages.allocated_pages #define heap_pages_lomem objspace->heap_pages.range[0] #define heap_pages_himem objspace->heap_pages.range[1] #define heap_pages_freeable_pages objspace->heap_pages.freeable_pages @@ -1840,7 +1839,6 @@ heap_page_body_free(struct heap_page_body *page_body) static void heap_page_free(rb_objspace_t *objspace, struct heap_page *page) { - heap_allocated_pages--; page->size_pool->total_freed_pages++; heap_page_body_free(GET_PAGE_BODY(page->start)); free(page); @@ -1886,8 +1884,6 @@ heap_pages_free_unused_pages(rb_objspace_t *objspace) uintptr_t lomem = (uintptr_t)lopage->start; GC_ASSERT(lomem >= heap_pages_lomem); heap_pages_lomem = lomem; - - GC_ASSERT(j == heap_allocated_pages); } } @@ -2036,8 +2032,6 @@ heap_page_allocate(rb_objspace_t *objspace, rb_size_pool_t *size_pool) rb_darray_insert(&objspace->heap_pages.sorted, hi, page); - heap_allocated_pages++; - size_pool->total_allocated_pages++; if (heap_pages_lomem == 0 || heap_pages_lomem > start) heap_pages_lomem = start; @@ -2690,7 +2684,7 @@ heap_page_for_ptr(rb_objspace_t *objspace, uintptr_t ptr) } res = bsearch((void *)ptr, rb_darray_ref(objspace->heap_pages.sorted, 0), - (size_t)heap_allocated_pages, sizeof(struct heap_page *), + rb_darray_size(objspace->heap_pages.sorted), sizeof(struct heap_page *), ptr_in_page_body_p); if (res) { @@ -3152,7 +3146,7 @@ rb_gc_impl_shutdown_free_objects(void *objspace_ptr) { rb_objspace_t *objspace = objspace_ptr; - for (size_t i = 0; i < heap_allocated_pages; i++) { + for (size_t i = 0; i < rb_darray_size(objspace->heap_pages.sorted); i++) { struct heap_page *page = rb_darray_get(objspace->heap_pages.sorted, i); short stride = page->slot_size; @@ -3224,7 +3218,7 @@ rb_gc_impl_shutdown_call_finalizer(void *objspace_ptr) gc_enter(objspace, gc_enter_event_finalizer, &lock_lev); /* run data/file object's finalizers */ - for (size_t i = 0; i < heap_allocated_pages; i++) { + for (size_t i = 0; i < rb_darray_size(objspace->heap_pages.sorted); i++) { struct heap_page *page = rb_darray_get(objspace->heap_pages.sorted, i); short stride = page->slot_size; @@ -3259,7 +3253,7 @@ rb_gc_impl_each_object(void *objspace_ptr, void (*func)(VALUE obj, void *data), { rb_objspace_t *objspace = objspace_ptr; - for (size_t i = 0; i < heap_allocated_pages; i++) { + for (size_t i = 0; i < rb_darray_size(objspace->heap_pages.sorted); i++) { struct heap_page *page = rb_darray_get(objspace->heap_pages.sorted, i); short stride = page->slot_size; @@ -5340,7 +5334,7 @@ gc_verify_internal_consistency_(rb_objspace_t *objspace) gc_report(5, objspace, "gc_verify_internal_consistency: start\n"); /* check relations */ - for (size_t i = 0; i < heap_allocated_pages; i++) { + for (size_t i = 0; i < rb_darray_size(objspace->heap_pages.sorted); i++) { struct heap_page *page = rb_darray_get(objspace->heap_pages.sorted, i); short slot_size = page->slot_size; @@ -6529,7 +6523,7 @@ gc_start(rb_objspace_t *objspace, unsigned int reason) /* reason may be clobbered, later, so keep set immediate_sweep here */ objspace->flags.immediate_sweep = !!(reason & GPR_FLAG_IMMEDIATE_SWEEP); - if (!heap_allocated_pages) return TRUE; /* heap is not ready */ + if (!rb_darray_size(objspace->heap_pages.sorted)) return TRUE; /* heap is not ready */ if (!(reason & GPR_FLAG_METHOD) && !ready_to_gc(objspace)) return TRUE; /* GC is not allowed */ GC_ASSERT(gc_mode(objspace) == gc_mode_none); @@ -6626,7 +6620,7 @@ gc_start(rb_objspace_t *objspace, unsigned int reason) objspace->profile.count++; objspace->profile.latest_gc_info = reason; objspace->profile.total_allocated_objects_at_gc_start = total_allocated_objects(objspace); - objspace->profile.heap_used_at_gc_start = heap_allocated_pages; + objspace->profile.heap_used_at_gc_start = rb_darray_size(objspace->heap_pages.sorted); objspace->profile.weak_references_count = 0; objspace->profile.retained_weak_references_count = 0; gc_prof_setup_new_record(objspace, reason); @@ -7764,7 +7758,7 @@ rb_gc_impl_stat(void *objspace_ptr, VALUE hash_or_sym) SET(sweeping_time, (size_t)ns_to_ms(objspace->profile.sweeping_time_ns)); /* implementation dependent counters */ - SET(heap_allocated_pages, heap_allocated_pages); + SET(heap_allocated_pages, rb_darray_size(objspace->heap_pages.sorted)); SET(heap_allocatable_pages, heap_allocatable_pages(objspace)); SET(heap_available_slots, objspace_available_slots(objspace)); SET(heap_live_slots, objspace_live_slots(objspace)); @@ -9471,11 +9465,10 @@ rb_gc_impl_objspace_free(void *objspace_ptr) free(objspace->profile.records); objspace->profile.records = NULL; - for (size_t i = 0; i < heap_allocated_pages; i++) { + for (size_t i = 0; i < rb_darray_size(objspace->heap_pages.sorted); i++) { heap_page_free(objspace, rb_darray_get(objspace->heap_pages.sorted, i)); } rb_darray_free(objspace->heap_pages.sorted); - heap_allocated_pages = 0; heap_pages_lomem = 0; heap_pages_himem = 0; From 079ef92b5e59b616d670efe81a33e500f2bf6451 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Thu, 5 Sep 2024 16:07:40 -0400 Subject: [PATCH 169/829] Implement global allocatable slots and empty pages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [Bug #20710] This commit introduces moves allocatable slots and empty pages from per size pool to global. This allows size pools to grow globally and allows empty pages to move between size pools. For the benchmark in [Bug #20710], this signficantly improves performance: Before: new_env 2.563 (± 0.0%) i/s - 26.000 in 10.226703s new_rails_env 0.293 (± 0.0%) i/s - 3.000 in 10.318960s After: new_env 3.781 (±26.4%) i/s - 37.000 in 10.302374s new_rails_env 0.911 (± 0.0%) i/s - 9.000 in 10.049337s In the headline benchmarks on yjit-bench, we see the performance is basically on-par with before, with ruby-lsp being signficantly faster and activerecord and erubi-rails being slightly slower: -------------- ----------- ---------- ----------- ---------- -------------- ------------- bench master (ms) stddev (%) branch (ms) stddev (%) branch 1st itr master/branch activerecord 452.2 0.3 479.4 0.4 0.96 0.94 chunky-png 1157.0 0.4 1172.8 0.1 0.99 0.99 erubi-rails 905.4 0.3 967.2 0.4 0.94 0.94 hexapdf 3566.6 0.6 3553.2 0.3 1.03 1.00 liquid-c 88.9 0.9 89.0 1.3 0.98 1.00 liquid-compile 93.4 0.9 89.9 3.5 1.01 1.04 liquid-render 224.1 0.7 227.1 0.5 1.00 0.99 lobsters 1052.0 3.5 1067.4 2.1 0.99 0.99 mail 197.1 0.4 196.5 0.5 0.98 1.00 psych-load 2960.3 0.1 2988.4 0.8 1.00 0.99 railsbench 2252.6 0.4 2255.9 0.5 0.99 1.00 rubocop 262.7 1.4 270.1 1.8 1.02 0.97 ruby-lsp 275.4 0.5 242.0 0.3 0.97 1.14 sequel 98.4 0.7 98.3 0.6 1.01 1.00 -------------- ----------- ---------- ----------- ---------- -------------- ------------- --- gc/default.c | 722 +++++++++++++++++++++------------------------------ 1 file changed, 294 insertions(+), 428 deletions(-) diff --git a/gc/default.c b/gc/default.c index cd387466de8c71..edee2fdc980bf9 100644 --- a/gc/default.c +++ b/gc/default.c @@ -186,7 +186,7 @@ typedef struct { } ruby_gc_params_t; static ruby_gc_params_t gc_params = { - { 0 }, + { GC_HEAP_INIT_SLOTS }, GC_HEAP_FREE_SLOTS, GC_HEAP_GROWTH_FACTOR, GC_HEAP_GROWTH_MAX_SLOTS, @@ -416,7 +416,6 @@ typedef struct mark_stack { } mark_stack_t; #define SIZE_POOL_EDEN_HEAP(size_pool) (&(size_pool)->eden_heap) -#define SIZE_POOL_TOMB_HEAP(size_pool) (&(size_pool)->tomb_heap) typedef int (*gc_compact_compare_func)(const void *l, const void *r, void *d); @@ -434,11 +433,8 @@ typedef struct rb_heap_struct { typedef struct rb_size_pool_struct { short slot_size; - size_t allocatable_pages; - /* Basic statistics */ size_t total_allocated_pages; - size_t total_freed_pages; size_t force_major_gc_count; size_t force_incremental_marking_finish_count; size_t total_allocated_objects; @@ -450,7 +446,6 @@ typedef struct rb_size_pool_struct { size_t empty_slots; rb_heap_t eden_heap; - rb_heap_t tomb_heap; } rb_size_pool_t; enum { @@ -500,6 +495,8 @@ typedef struct rb_objspace { unsigned long long next_object_id; rb_size_pool_t size_pools[SIZE_POOL_COUNT]; + size_t empty_pages_count; + struct heap_page *empty_pages; struct { rb_atomic_t finalizing; @@ -512,9 +509,12 @@ typedef struct rb_objspace { rb_darray(struct heap_page *) sorted; size_t allocated_pages; + size_t freed_pages; uintptr_t range[2]; size_t freeable_pages; + size_t allocatable_slots; + /* final */ VALUE deferred_final; } heap_pages; @@ -730,21 +730,21 @@ struct free_slot { }; struct heap_page { - short slot_size; - short total_slots; - short free_slots; - short final_slots; - short pinned_slots; + unsigned short slot_size; + unsigned short total_slots; + unsigned short free_slots; + unsigned short final_slots; + unsigned short pinned_slots; struct { unsigned int before_sweep : 1; unsigned int has_remembered_objects : 1; unsigned int has_uncollectible_wb_unprotected_objects : 1; - unsigned int in_tomb : 1; } flags; rb_size_pool_t *size_pool; struct heap_page *free_next; + struct heap_page_body *body; uintptr_t start; struct free_slot *freelist; struct ccan_list_node page_node; @@ -780,6 +780,27 @@ asan_unlock_freelist(struct heap_page *page) asan_unpoison_memory_region(&page->freelist, sizeof(struct free_list *), false); } +static inline bool +heap_page_in_global_empty_pages_pool(rb_objspace_t *objspace, struct heap_page *page) +{ + if (page->total_slots == 0) { + GC_ASSERT(page->start == 0); + GC_ASSERT(page->slot_size == 0); + GC_ASSERT(page->size_pool == NULL); + GC_ASSERT(page->free_slots == 0); + GC_ASSERT(page->freelist == NULL); + + return true; + } + else { + GC_ASSERT(page->start != 0); + GC_ASSERT(page->slot_size != 0); + GC_ASSERT(page->size_pool != NULL); + + return false; + } +} + #define GET_PAGE_BODY(x) ((struct heap_page_body *)((bits_t)(x) & ~(HEAP_PAGE_ALIGN_MASK))) #define GET_PAGE_HEADER(x) (&GET_PAGE_BODY(x)->header) #define GET_HEAP_PAGE(x) (GET_PAGE_HEADER(x)->page) @@ -926,38 +947,6 @@ heap_eden_total_slots(rb_objspace_t *objspace) return count; } -static inline size_t -heap_tomb_total_pages(rb_objspace_t *objspace) -{ - size_t count = 0; - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - count += SIZE_POOL_TOMB_HEAP(&size_pools[i])->total_pages; - } - return count; -} - -static inline size_t -heap_allocatable_pages(rb_objspace_t *objspace) -{ - size_t count = 0; - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - count += size_pools[i].allocatable_pages; - } - return count; -} - -static inline size_t -heap_allocatable_slots(rb_objspace_t *objspace) -{ - size_t count = 0; - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - rb_size_pool_t *size_pool = &size_pools[i]; - int slot_size_multiple = size_pool->slot_size / BASE_SLOT_SIZE; - count += size_pool->allocatable_pages * HEAP_PAGE_OBJ_LIMIT / slot_size_multiple; - } - return count; -} - static inline size_t total_allocated_pages(rb_objspace_t *objspace) { @@ -969,17 +958,6 @@ total_allocated_pages(rb_objspace_t *objspace) return count; } -static inline size_t -total_freed_pages(rb_objspace_t *objspace) -{ - size_t count = 0; - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - rb_size_pool_t *size_pool = &size_pools[i]; - count += size_pool->total_freed_pages; - } - return count; -} - static inline size_t total_allocated_objects(rb_objspace_t *objspace) { @@ -1293,18 +1271,15 @@ check_rvalue_consistency_force(rb_objspace_t *objspace, const VALUE obj, int ter err++; } else if (!is_pointer_to_heap(objspace, (void *)obj)) { - /* check if it is in tomb_pages */ - struct heap_page *page = NULL; - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - rb_size_pool_t *size_pool = &size_pools[i]; - ccan_list_for_each(&size_pool->tomb_heap.pages, page, page_node) { - if (page->start <= (uintptr_t)obj && - (uintptr_t)obj < (page->start + (page->total_slots * size_pool->slot_size))) { - fprintf(stderr, "check_rvalue_consistency: %p is in a tomb_heap (%p).\n", - (void *)obj, (void *)page); - err++; - goto skip; - } + struct heap_page *empty_page = objspace->empty_pages; + while (empty_page) { + if ((uintptr_t)empty_page->body <= (uintptr_t)obj && + (uintptr_t)obj < (uintptr_t)empty_page->body + HEAP_PAGE_SIZE) { + GC_ASSERT(heap_page_in_global_empty_pages_pool(objspace, empty_page)); + fprintf(stderr, "check_rvalue_consistency: %p is in an empty page (%p).\n", + (void *)obj, (void *)empty_page); + err++; + goto skip; } } fprintf(stderr, "check_rvalue_consistency: %p is not a Ruby object.\n", (void *)obj); @@ -1320,7 +1295,7 @@ check_rvalue_consistency_force(rb_objspace_t *objspace, const VALUE obj, int ter const int remembered_bit = MARKED_IN_BITMAP(GET_HEAP_PAGE(obj)->remembered_bits, obj) != 0; const int age = RVALUE_AGE_GET((VALUE)obj); - if (GET_HEAP_PAGE(obj)->flags.in_tomb) { + if (heap_page_in_global_empty_pages_pool(objspace, GET_HEAP_PAGE(obj))) { fprintf(stderr, "check_rvalue_consistency: %s is in tomb page.\n", rb_obj_info(obj)); err++; } @@ -1592,22 +1567,10 @@ rb_gc_impl_get_measure_total_time(void *objspace_ptr) } static size_t -slots_to_pages_for_size_pool(rb_objspace_t *objspace, rb_size_pool_t *size_pool, size_t slots) -{ - size_t multiple = size_pool->slot_size / BASE_SLOT_SIZE; - /* Due to alignment, heap pages may have one less slot. We should - * ensure there is enough pages to guarantee that we will have at - * least the required number of slots after allocating all the pages. */ - size_t slots_per_page = (HEAP_PAGE_OBJ_LIMIT / multiple) - 1; - return CEILDIV(slots, slots_per_page); -} - -static size_t -minimum_pages_for_size_pool(rb_objspace_t *objspace, rb_size_pool_t *size_pool) +minimum_slots_for_size_pool(rb_objspace_t *objspace, rb_size_pool_t *size_pool) { size_t size_pool_idx = size_pool - size_pools; - size_t init_slots = gc_params.size_pool_init_slots[size_pool_idx]; - return slots_to_pages_for_size_pool(objspace, size_pool, init_slots); + return gc_params.size_pool_init_slots[size_pool_idx]; } static VALUE initial_stress = Qfalse; @@ -1718,12 +1681,6 @@ static void free_stack_chunks(mark_stack_t *); static void mark_stack_free_cache(mark_stack_t *); static void heap_page_free(rb_objspace_t *objspace, struct heap_page *page); -static void -size_pool_allocatable_pages_set(rb_objspace_t *objspace, rb_size_pool_t *size_pool, size_t s) -{ - size_pool->allocatable_pages = s; -} - static inline void heap_page_add_freeobj(rb_objspace_t *objspace, struct heap_page *page, VALUE obj) { @@ -1752,19 +1709,52 @@ heap_page_add_freeobj(rb_objspace_t *objspace, struct heap_page *page, VALUE obj } static size_t -heap_extend_pages(rb_objspace_t *objspace, rb_size_pool_t *size_pool, - size_t free_slots, size_t total_slots, size_t used); +objspace_available_slots(rb_objspace_t *objspace); - static void -size_pool_allocatable_pages_expand(rb_objspace_t *objspace, - rb_size_pool_t *size_pool, size_t swept_slots, size_t total_slots, size_t total_pages) +static void +size_pool_allocatable_slots_expand(rb_objspace_t *objspace, + rb_size_pool_t *size_pool, size_t free_slots, size_t total_slots) { - size_t extend_page_count = heap_extend_pages(objspace, size_pool, swept_slots, - total_slots, total_pages); + double goal_ratio = gc_params.heap_free_slots_goal_ratio; + size_t target_total_slots; - if (extend_page_count > size_pool->allocatable_pages) { - size_pool_allocatable_pages_set(objspace, size_pool, extend_page_count); + if (goal_ratio == 0.0) { + target_total_slots = (size_t)(total_slots * gc_params.growth_factor); } + else if (total_slots == 0) { + target_total_slots = minimum_slots_for_size_pool(objspace, size_pool); + } + else { + /* Find `f' where free_slots = f * total_slots * goal_ratio + * => f = (total_slots - free_slots) / ((1 - goal_ratio) * total_slots) + */ + double f = (double)(total_slots - free_slots) / ((1 - goal_ratio) * total_slots); + + if (f > gc_params.growth_factor) f = gc_params.growth_factor; + if (f < 1.0) f = 1.1; + + target_total_slots = (size_t)(f * total_slots); + + if (0) { + fprintf(stderr, + "free_slots(%8"PRIuSIZE")/total_slots(%8"PRIuSIZE")=%1.2f," + " G(%1.2f), f(%1.2f)," + " total_slots(%8"PRIuSIZE") => target_total_slots(%8"PRIuSIZE")\n", + free_slots, total_slots, free_slots/(double)total_slots, + goal_ratio, f, total_slots, target_total_slots); + } + } + + if (gc_params.growth_max_slots > 0) { + size_t max_total_slots = (size_t)(total_slots + gc_params.growth_max_slots); + if (target_total_slots > max_total_slots) target_total_slots = max_total_slots; + } + + size_t extend_slot_count = target_total_slots - total_slots; + /* Extend by at least 1 page. */ + if (extend_slot_count == 0) extend_slot_count = 1; + + objspace->heap_pages.allocatable_slots += extend_slot_count; } static inline void @@ -1839,32 +1829,40 @@ heap_page_body_free(struct heap_page_body *page_body) static void heap_page_free(rb_objspace_t *objspace, struct heap_page *page) { - page->size_pool->total_freed_pages++; - heap_page_body_free(GET_PAGE_BODY(page->start)); + objspace->heap_pages.freed_pages++; + heap_page_body_free(page->body); free(page); } static void heap_pages_free_unused_pages(rb_objspace_t *objspace) { - bool has_pages_in_tomb_heap = FALSE; - for (size_t i = 0; i < SIZE_POOL_COUNT; i++) { - if (!ccan_list_empty(&SIZE_POOL_TOMB_HEAP(&size_pools[i])->pages)) { - has_pages_in_tomb_heap = TRUE; - break; - } - } + size_t pages_to_keep_count = + // Get number of pages estimated for the smallest size pool + CEILDIV(objspace->heap_pages.allocatable_slots, HEAP_PAGE_OBJ_LIMIT) * + // Estimate the average slot size multiple + (1 << (SIZE_POOL_COUNT / 2)); + + if (objspace->empty_pages != NULL && objspace->empty_pages_count > pages_to_keep_count) { + GC_ASSERT(objspace->empty_pages_count > 0); + objspace->empty_pages = NULL; + objspace->empty_pages_count = 0; - if (has_pages_in_tomb_heap) { size_t i, j; for (i = j = 0; i < rb_darray_size(objspace->heap_pages.sorted); i++) { struct heap_page *page = rb_darray_get(objspace->heap_pages.sorted, i); - if (page->flags.in_tomb && page->free_slots == page->total_slots) { - heap_unlink_page(objspace, SIZE_POOL_TOMB_HEAP(page->size_pool), page); + if (heap_page_in_global_empty_pages_pool(objspace, page) && pages_to_keep_count == 0) { heap_page_free(objspace, page); } else { + if (heap_page_in_global_empty_pages_pool(objspace, page) && pages_to_keep_count > 0) { + page->free_next = objspace->empty_pages; + objspace->empty_pages = page; + objspace->empty_pages_count++; + pages_to_keep_count--; + } + if (i != j) { rb_darray_set(objspace->heap_pages.sorted, j, page); } @@ -1876,12 +1874,12 @@ heap_pages_free_unused_pages(rb_objspace_t *objspace) GC_ASSERT(rb_darray_size(objspace->heap_pages.sorted) == j); struct heap_page *hipage = rb_darray_get(objspace->heap_pages.sorted, rb_darray_size(objspace->heap_pages.sorted) - 1); - uintptr_t himem = (uintptr_t)hipage->start + (hipage->total_slots * hipage->slot_size); + uintptr_t himem = (uintptr_t)hipage->body + HEAP_PAGE_SIZE; GC_ASSERT(himem <= heap_pages_himem); heap_pages_himem = himem; struct heap_page *lopage = rb_darray_get(objspace->heap_pages.sorted, 0); - uintptr_t lomem = (uintptr_t)lopage->start; + uintptr_t lomem = (uintptr_t)lopage->body + sizeof(struct heap_page_header); GC_ASSERT(lomem >= heap_pages_lomem); heap_pages_lomem = lomem; } @@ -1970,47 +1968,35 @@ heap_page_body_allocate(void) } static struct heap_page * -heap_page_allocate(rb_objspace_t *objspace, rb_size_pool_t *size_pool) +heap_page_resurrect(rb_objspace_t *objspace) { - uintptr_t start, end, p; - struct heap_page *page; - size_t stride = size_pool->slot_size; - unsigned int limit = (unsigned int)((HEAP_PAGE_SIZE - sizeof(struct heap_page_header)))/(int)stride; + struct heap_page *page = NULL; + if (objspace->empty_pages != NULL) { + GC_ASSERT(objspace->empty_pages_count > 0); + objspace->empty_pages_count--; + page = objspace->empty_pages; + objspace->empty_pages = page->free_next; + } - /* assign heap_page body (contains heap_page_header and RVALUEs) */ + return page; +} + +static struct heap_page * +heap_page_allocate(rb_objspace_t *objspace) +{ struct heap_page_body *page_body = heap_page_body_allocate(); if (page_body == 0) { rb_memerror(); } - /* assign heap_page entry */ - page = calloc1(sizeof(struct heap_page)); + struct heap_page *page = calloc1(sizeof(struct heap_page)); if (page == 0) { heap_page_body_free(page_body); rb_memerror(); } - /* adjust obj_limit (object number available in this page) */ - start = (uintptr_t)((VALUE)page_body + sizeof(struct heap_page_header)); - - if (start % BASE_SLOT_SIZE != 0) { - int delta = BASE_SLOT_SIZE - (start % BASE_SLOT_SIZE); - start = start + delta; - GC_ASSERT(NUM_IN_PAGE(start) == 0 || NUM_IN_PAGE(start) == 1); - - /* Find a num in page that is evenly divisible by `stride`. - * This is to ensure that objects are aligned with bit planes. - * In other words, ensure there are an even number of objects - * per bit plane. */ - if (NUM_IN_PAGE(start) == 1) { - start += stride - BASE_SLOT_SIZE; - } - - GC_ASSERT(NUM_IN_PAGE(start) * BASE_SLOT_SIZE % stride == 0); - - limit = (HEAP_PAGE_SIZE - (int)(start - (uintptr_t)page_body))/(int)stride; - } - end = start + (limit * (int)stride); + uintptr_t start = (uintptr_t)page_body + sizeof(struct heap_page_header); + uintptr_t end = (uintptr_t)page_body + HEAP_PAGE_SIZE; size_t lo = 0; size_t hi = rb_darray_size(objspace->heap_pages.sorted); @@ -2032,150 +2018,101 @@ heap_page_allocate(rb_objspace_t *objspace, rb_size_pool_t *size_pool) rb_darray_insert(&objspace->heap_pages.sorted, hi, page); - size_pool->total_allocated_pages++; - if (heap_pages_lomem == 0 || heap_pages_lomem > start) heap_pages_lomem = start; if (heap_pages_himem < end) heap_pages_himem = end; - page->start = start; - page->total_slots = limit; - page->slot_size = size_pool->slot_size; - page->size_pool = size_pool; + page->body = page_body; page_body->header.page = page; - for (p = start; p != end; p += stride) { - gc_report(3, objspace, "assign_heap_page: %p is added to freelist\n", (void *)p); - heap_page_add_freeobj(objspace, page, (VALUE)p); - } - page->free_slots = limit; + objspace->heap_pages.allocated_pages++; - asan_lock_freelist(page); return page; } -static struct heap_page * -heap_page_resurrect(rb_objspace_t *objspace, rb_size_pool_t *size_pool) +static void +size_pool_add_page(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *heap, struct heap_page *page) { - struct heap_page *page = 0, *next; + /* Adding to eden heap during incremental sweeping is forbidden */ + GC_ASSERT(!heap->sweeping_page); + GC_ASSERT(heap_page_in_global_empty_pages_pool(objspace, page)); - ccan_list_for_each_safe(&SIZE_POOL_TOMB_HEAP(size_pool)->pages, page, next, page_node) { - asan_unlock_freelist(page); - if (page->freelist != NULL) { - heap_unlink_page(objspace, &size_pool->tomb_heap, page); - asan_lock_freelist(page); - return page; + /* adjust obj_limit (object number available in this page) */ + uintptr_t start = (uintptr_t)page->body + sizeof(struct heap_page_header); + if (start % BASE_SLOT_SIZE != 0) { + int delta = BASE_SLOT_SIZE - (start % BASE_SLOT_SIZE); + start = start + delta; + GC_ASSERT(NUM_IN_PAGE(start) == 0 || NUM_IN_PAGE(start) == 1); + + /* Find a num in page that is evenly divisible by `stride`. + * This is to ensure that objects are aligned with bit planes. + * In other words, ensure there are an even number of objects + * per bit plane. */ + if (NUM_IN_PAGE(start) == 1) { + start += size_pool->slot_size - BASE_SLOT_SIZE; } - } - return NULL; -} + GC_ASSERT(NUM_IN_PAGE(start) * BASE_SLOT_SIZE % size_pool->slot_size == 0); + } -static struct heap_page * -heap_page_create(rb_objspace_t *objspace, rb_size_pool_t *size_pool) -{ - size_pool->allocatable_pages--; + int slot_count = (int)((HEAP_PAGE_SIZE - (start - (uintptr_t)page->body))/size_pool->slot_size); - struct heap_page *page = heap_page_resurrect(objspace, size_pool); + page->start = start; + page->total_slots = slot_count; + page->slot_size = size_pool->slot_size; + page->size_pool = size_pool; - if (page == NULL) { - page = heap_page_allocate(objspace, size_pool); + page->freelist = NULL; + for (VALUE p = (VALUE)start; p < start + (slot_count * size_pool->slot_size); p += size_pool->slot_size) { + heap_page_add_freeobj(objspace, page, p); } + page->free_slots = slot_count; - return page; -} + asan_lock_freelist(page); + + size_pool->total_allocated_pages++; -static void -heap_add_page(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *heap, struct heap_page *page) -{ - /* Adding to eden heap during incremental sweeping is forbidden */ - GC_ASSERT(!(heap == SIZE_POOL_EDEN_HEAP(size_pool) && heap->sweeping_page)); - page->flags.in_tomb = (heap == SIZE_POOL_TOMB_HEAP(size_pool)); ccan_list_add_tail(&heap->pages, &page->page_node); heap->total_pages++; heap->total_slots += page->total_slots; } -static void -heap_assign_page(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *heap) -{ - struct heap_page *page = heap_page_create(objspace, size_pool); - heap_add_page(objspace, size_pool, heap, page); - heap_add_freepage(heap, page); -} - -#if GC_CAN_COMPILE_COMPACTION -static void -heap_add_pages(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *heap, size_t add) -{ - size_t i; - - size_pool_allocatable_pages_set(objspace, size_pool, add); - - for (i = 0; i < add; i++) { - heap_assign_page(objspace, size_pool, heap); - } - - GC_ASSERT(size_pool->allocatable_pages == 0); -} -#endif - -static size_t -heap_extend_pages(rb_objspace_t *objspace, rb_size_pool_t *size_pool, size_t free_slots, size_t total_slots, size_t used) +static int +heap_page_allocate_and_initialize(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *heap) { - double goal_ratio = gc_params.heap_free_slots_goal_ratio; - size_t next_used; + if (objspace->heap_pages.allocatable_slots > 0) { + gc_report(1, objspace, "heap_page_allocate_and_initialize: rb_darray_size(objspace->heap_pages.sorted): %"PRIdSIZE", " + "allocatable_slots: %"PRIdSIZE", heap->total_pages: %"PRIdSIZE"\n", + rb_darray_size(objspace->heap_pages.sorted), objspace->heap_pages.allocatable_slots, heap->total_pages); - if (goal_ratio == 0.0) { - next_used = (size_t)(used * gc_params.growth_factor); - } - else if (total_slots == 0) { - next_used = minimum_pages_for_size_pool(objspace, size_pool); - } - else { - /* Find `f' where free_slots = f * total_slots * goal_ratio - * => f = (total_slots - free_slots) / ((1 - goal_ratio) * total_slots) - */ - double f = (double)(total_slots - free_slots) / ((1 - goal_ratio) * total_slots); - - if (f > gc_params.growth_factor) f = gc_params.growth_factor; - if (f < 1.0) f = 1.1; - - next_used = (size_t)(f * used); + struct heap_page *page = heap_page_resurrect(objspace); + if (page == NULL) { + page = heap_page_allocate(objspace); + } + size_pool_add_page(objspace, size_pool, heap, page); + heap_add_freepage(heap, page); - if (0) { - fprintf(stderr, - "free_slots(%8"PRIuSIZE")/total_slots(%8"PRIuSIZE")=%1.2f," - " G(%1.2f), f(%1.2f)," - " used(%8"PRIuSIZE") => next_used(%8"PRIuSIZE")\n", - free_slots, total_slots, free_slots/(double)total_slots, - goal_ratio, f, used, next_used); + if (objspace->heap_pages.allocatable_slots > (size_t)page->total_slots) { + objspace->heap_pages.allocatable_slots -= page->total_slots; + } + else { + objspace->heap_pages.allocatable_slots = 0; } - } - if (gc_params.growth_max_slots > 0) { - size_t max_used = (size_t)(used + gc_params.growth_max_slots/HEAP_PAGE_OBJ_LIMIT); - if (next_used > max_used) next_used = max_used; + return true; } - size_t extend_page_count = next_used - used; - /* Extend by at least 1 page. */ - if (extend_page_count == 0) extend_page_count = 1; - - return extend_page_count; + return false; } -static int -heap_increment(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *heap) +static void +heap_page_allocate_and_initialize_force(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *heap) { - if (size_pool->allocatable_pages > 0) { - gc_report(1, objspace, "heap_increment: rb_darray_size(objspace->heap_pages.sorted): %"PRIdSIZE", " - "heap_pages_inc: %"PRIdSIZE", heap->total_pages: %"PRIdSIZE"\n", - rb_darray_size(objspace->heap_pages.sorted), size_pool->allocatable_pages, heap->total_pages); - - heap_assign_page(objspace, size_pool, heap); - return TRUE; - } - return FALSE; + size_t prev_allocatable_slots = objspace->heap_pages.allocatable_slots; + // Set allocatable slots to 1 to force a page to be created. + objspace->heap_pages.allocatable_slots = 1; + heap_page_allocate_and_initialize(objspace, size_pool, heap); + GC_ASSERT(heap->free_pages != NULL); + objspace->heap_pages.allocatable_slots = prev_allocatable_slots; } static void @@ -2205,11 +2142,18 @@ heap_prepare(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *heap { GC_ASSERT(heap->free_pages == NULL); + if (SIZE_POOL_EDEN_HEAP(size_pool)->total_slots < gc_params.size_pool_init_slots[size_pool - size_pools] && + size_pool->eden_heap.sweeping_page == NULL) { + heap_page_allocate_and_initialize_force(objspace, size_pool, heap); + GC_ASSERT(heap->free_pages != NULL); + return; + } + /* Continue incremental marking or lazy sweeping, if in any of those steps. */ gc_continue(objspace, size_pool, heap); if (heap->free_pages == NULL) { - heap_increment(objspace, size_pool, heap); + heap_page_allocate_and_initialize(objspace, size_pool, heap); } /* If we still don't have a free page and not allowed to create a new page, @@ -2219,12 +2163,11 @@ heap_prepare(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *heap rb_memerror(); } else { - if (size_pool->allocatable_pages == 0 && !gc_config_full_mark_val) { - size_pool_allocatable_pages_expand(objspace, size_pool, + if (objspace->heap_pages.allocatable_slots == 0 && !gc_config_full_mark_val) { + size_pool_allocatable_slots_expand(objspace, size_pool, size_pool->freed_slots + size_pool->empty_slots, - heap->total_slots + SIZE_POOL_TOMB_HEAP(size_pool)->total_slots, - heap->total_pages + SIZE_POOL_TOMB_HEAP(size_pool)->total_pages); - GC_ASSERT(size_pool->allocatable_pages > 0); + heap->total_slots); + GC_ASSERT(objspace->heap_pages.allocatable_slots > 0); } /* Do steps of incremental marking or lazy sweeping if the GC run permits. */ gc_continue(objspace, size_pool, heap); @@ -2232,7 +2175,7 @@ heap_prepare(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *heap /* If we're not incremental marking (e.g. a minor GC) or finished * sweeping and still don't have a free page, then * gc_sweep_finish_size_pool should allow us to create a new page. */ - if (heap->free_pages == NULL && !heap_increment(objspace, size_pool, heap)) { + if (heap->free_pages == NULL && !heap_page_allocate_and_initialize(objspace, size_pool, heap)) { if (gc_needs_major_flags == GPR_FLAG_NONE) { rb_bug("cannot create a new page after GC"); } @@ -2245,7 +2188,7 @@ heap_prepare(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *heap gc_continue(objspace, size_pool, heap); if (heap->free_pages == NULL && - !heap_increment(objspace, size_pool, heap)) { + !heap_page_allocate_and_initialize(objspace, size_pool, heap)) { rb_bug("cannot create a new page after major GC"); } } @@ -2423,12 +2366,6 @@ heap_next_free_page(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_ if (heap->free_pages == NULL) { heap_prepare(objspace, size_pool, heap); - - if (heap->free_pages == NULL) { - GC_ASSERT(size_pool->allocatable_pages > 0); - heap_increment(objspace, size_pool, heap); - GC_ASSERT(!(heap->free_pages == NULL)); - } } page = heap->free_pages; @@ -2445,7 +2382,7 @@ static inline void ractor_cache_set_page(rb_objspace_t *objspace, rb_ractor_newobj_cache_t *cache, size_t size_pool_idx, struct heap_page *page) { - gc_report(3, objspace, "ractor_set_cache: Using page %p\n", (void *)GET_PAGE_BODY(page->start)); + gc_report(3, objspace, "ractor_set_cache: Using page %p\n", (void *)page->body); rb_ractor_newobj_size_pool_cache_t *size_pool_cache = &cache->size_pool_caches[size_pool_idx]; @@ -2567,7 +2504,7 @@ newobj_alloc(rb_objspace_t *objspace, rb_ractor_newobj_cache_t *cache, size_t si rb_size_pool_t *size_pool = &size_pools[size_pool_idx]; size_pool->total_allocated_objects++; GC_ASSERT(rb_gc_multi_ractor_p() || - SIZE_POOL_EDEN_HEAP(size_pool)->total_slots + SIZE_POOL_TOMB_HEAP(size_pool)->total_slots >= + SIZE_POOL_EDEN_HEAP(size_pool)->total_slots >= (size_pool->total_allocated_objects - size_pool->total_freed_objects - size_pool->final_slots_count)); return obj; @@ -2662,7 +2599,7 @@ static int ptr_in_page_body_p(const void *ptr, const void *memb) { struct heap_page *page = *(struct heap_page **)memb; - uintptr_t p_body = (uintptr_t)GET_PAGE_BODY(page->start); + uintptr_t p_body = (uintptr_t)page->body; if ((uintptr_t)ptr >= p_body) { return (uintptr_t)ptr < (p_body + HEAP_PAGE_SIZE) ? 0 : 1; @@ -2713,7 +2650,7 @@ is_pointer_to_heap(rb_objspace_t *objspace, const void *ptr) page = heap_page_for_ptr(objspace, (uintptr_t)ptr); if (page) { RB_DEBUG_COUNTER_INC(gc_isptr_maybe); - if (page->flags.in_tomb) { + if (heap_page_in_global_empty_pages_pool(objspace, page)) { return FALSE; } else { @@ -3287,7 +3224,6 @@ objspace_available_slots(rb_objspace_t *objspace) for (int i = 0; i < SIZE_POOL_COUNT; i++) { rb_size_pool_t *size_pool = &size_pools[i]; total_slots += SIZE_POOL_EDEN_HEAP(size_pool)->total_slots; - total_slots += SIZE_POOL_TOMB_HEAP(size_pool)->total_slots; } return total_slots; } @@ -3402,7 +3338,7 @@ gc_unprotect_pages(rb_objspace_t *objspace, rb_heap_t *heap) struct heap_page *cursor = heap->compact_cursor; while (cursor) { - unlock_page_body(objspace, GET_PAGE_BODY(cursor->start)); + unlock_page_body(objspace, cursor->body); cursor = ccan_list_next(&heap->pages, cursor, page_node); } } @@ -3901,6 +3837,7 @@ gc_sweep_start(rb_objspace_t *objspace) { gc_mode_transition(objspace, gc_mode_sweeping); objspace->rincgc.pooled_slots = 0; + objspace->heap_pages.allocatable_slots = 0; #if GC_CAN_COMPILE_COMPACTION if (objspace->flags.during_compacting) { @@ -3932,52 +3869,40 @@ static void gc_sweep_finish_size_pool(rb_objspace_t *objspace, rb_size_pool_t *size_pool) { rb_heap_t *heap = SIZE_POOL_EDEN_HEAP(size_pool); - size_t total_slots = heap->total_slots + SIZE_POOL_TOMB_HEAP(size_pool)->total_slots; - size_t total_pages = heap->total_pages + SIZE_POOL_TOMB_HEAP(size_pool)->total_pages; + size_t total_slots = heap->total_slots; size_t swept_slots = size_pool->freed_slots + size_pool->empty_slots; size_t init_slots = gc_params.size_pool_init_slots[size_pool - size_pools]; size_t min_free_slots = (size_t)(MAX(total_slots, init_slots) * gc_params.heap_free_slots_min_ratio); - /* If we don't have enough slots and we have pages on the tomb heap, move - * pages from the tomb heap to the eden heap. This may prevent page - * creation thrashing (frequently allocating and deallocting pages) and - * GC thrashing (running GC more frequently than required). */ - struct heap_page *resurrected_page; - while (swept_slots < min_free_slots && - (resurrected_page = heap_page_resurrect(objspace, size_pool))) { - swept_slots += resurrected_page->free_slots; - - heap_add_page(objspace, size_pool, heap, resurrected_page); - heap_add_freepage(heap, resurrected_page); - } - - if (swept_slots < min_free_slots) { - bool grow_heap = is_full_marking(objspace); - - /* Consider growing or starting a major GC if we are not currently in a - * major GC and we can't allocate any more pages. */ - if (!is_full_marking(objspace) && size_pool->allocatable_pages == 0) { + if (swept_slots < min_free_slots && /* The heap is a growth heap if it freed more slots than had empty slots. */ - bool is_growth_heap = size_pool->empty_slots == 0 || size_pool->freed_slots > size_pool->empty_slots; - - /* Grow this heap if we haven't run at least RVALUE_OLD_AGE minor - * GC since the last major GC or if this heap is smaller than the - * the configured initial size. */ - if (objspace->profile.count - objspace->rgengc.last_major_gc < RVALUE_OLD_AGE || - total_slots < init_slots) { - grow_heap = TRUE; + (size_pool->empty_slots == 0 || size_pool->freed_slots > size_pool->empty_slots)) { + /* If we don't have enough slots and we have pages on the tomb heap, move + * pages from the tomb heap to the eden heap. This may prevent page + * creation thrashing (frequently allocating and deallocting pages) and + * GC thrashing (running GC more frequently than required). */ + struct heap_page *resurrected_page; + while (swept_slots < min_free_slots && + (resurrected_page = heap_page_resurrect(objspace))) { + size_pool_add_page(objspace, size_pool, heap, resurrected_page); + heap_add_freepage(heap, resurrected_page); + + swept_slots += resurrected_page->free_slots; + } + + if (swept_slots < min_free_slots) { + /* Grow this heap if we are in a major GC or if we haven't run at least + * RVALUE_OLD_AGE minor GC since the last major GC. */ + if (is_full_marking(objspace) || + objspace->profile.count - objspace->rgengc.last_major_gc < RVALUE_OLD_AGE) { + size_pool_allocatable_slots_expand(objspace, size_pool, swept_slots, heap->total_slots); } - else if (is_growth_heap) { /* Only growth heaps are allowed to start a major GC. */ + else { gc_needs_major_flags |= GPR_FLAG_MAJOR_BY_NOFREE; size_pool->force_major_gc_count++; } } - - if (grow_heap) { - size_pool_allocatable_pages_expand(objspace, size_pool, swept_slots, - total_slots, total_pages); - } } } @@ -3992,12 +3917,6 @@ gc_sweep_finish(rb_objspace_t *objspace) for (int i = 0; i < SIZE_POOL_COUNT; i++) { rb_size_pool_t *size_pool = &size_pools[i]; - /* if heap_pages has unused pages, then assign them to increment */ - size_t tomb_pages = SIZE_POOL_TOMB_HEAP(size_pool)->total_pages; - if (size_pool->allocatable_pages < tomb_pages) { - size_pool->allocatable_pages = tomb_pages; - } - size_pool->freed_slots = 0; size_pool->empty_slots = 0; @@ -4052,14 +3971,24 @@ gc_sweep_step(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *hea heap->sweeping_page = ccan_list_next(&heap->pages, sweep_page, page_node); - if (sweep_page->final_slots + free_slots == sweep_page->total_slots && - heap_pages_freeable_pages > 0 && - unlink_limit > 0) { + if (free_slots == sweep_page->total_slots && + heap_pages_freeable_pages > 0 && + unlink_limit > 0) { heap_pages_freeable_pages--; unlink_limit--; - /* there are no living objects -> move this page to tomb heap */ + /* There are no living objects, so move this page to the global empty pages. */ heap_unlink_page(objspace, heap, sweep_page); - heap_add_page(objspace, size_pool, SIZE_POOL_TOMB_HEAP(size_pool), sweep_page); + + sweep_page->start = 0; + sweep_page->total_slots = 0; + sweep_page->slot_size = 0; + sweep_page->size_pool = NULL; + sweep_page->free_slots = 0; + sweep_page->freelist = NULL; + + objspace->empty_pages_count++; + sweep_page->free_next = objspace->empty_pages; + objspace->empty_pages = sweep_page; } else if (free_slots > 0) { size_pool->freed_slots += ctx.freed_slots; @@ -4122,7 +4051,7 @@ gc_sweep_continue(rb_objspace_t *objspace, rb_size_pool_t *sweep_size_pool, rb_h if (!gc_sweep_step(objspace, size_pool, SIZE_POOL_EDEN_HEAP(size_pool))) { /* sweep_size_pool requires a free slot but sweeping did not yield any * and we cannot allocate a new page. */ - if (size_pool == sweep_size_pool && size_pool->allocatable_pages == 0) { + if (size_pool == sweep_size_pool && objspace->heap_pages.allocatable_slots == 0) { /* Not allowed to create a new page so finish sweeping. */ gc_sweep_rest(objspace); break; @@ -5320,7 +5249,6 @@ gc_verify_heap_pages(rb_objspace_t *objspace) int remembered_old_objects = 0; for (int i = 0; i < SIZE_POOL_COUNT; i++) { remembered_old_objects += gc_verify_heap_pages_(objspace, &(SIZE_POOL_EDEN_HEAP(&size_pools[i])->pages)); - remembered_old_objects += gc_verify_heap_pages_(objspace, &(SIZE_POOL_TOMB_HEAP(&size_pools[i])->pages)); } return remembered_old_objects; } @@ -5582,13 +5510,17 @@ gc_marks_finish(rb_objspace_t *objspace) #endif { - /* decide full GC is needed or not */ - size_t total_slots = heap_allocatable_slots(objspace) + heap_eden_total_slots(objspace); + const unsigned long r_mul = objspace->live_ractor_cache_count > 8 ? 8 : objspace->live_ractor_cache_count; // upto 8 + + size_t total_slots = heap_eden_total_slots(objspace); size_t sweep_slots = total_slots - objspace->marked_slots; /* will be swept slots */ size_t max_free_slots = (size_t)(total_slots * gc_params.heap_free_slots_max_ratio); size_t min_free_slots = (size_t)(total_slots * gc_params.heap_free_slots_min_ratio); + if (min_free_slots < gc_params.heap_free_slots * r_mul) { + min_free_slots = gc_params.heap_free_slots * r_mul; + } + int full_marking = is_full_marking(objspace); - const unsigned long r_mul = objspace->live_ractor_cache_count > 8 ? 8 : objspace->live_ractor_cache_count; // upto 8 GC_ASSERT(heap_eden_total_slots(objspace) >= objspace->marked_slots); @@ -5609,17 +5541,10 @@ gc_marks_finish(rb_objspace_t *objspace) heap_pages_freeable_pages = 0; } - /* check free_min */ - if (min_free_slots < gc_params.heap_free_slots * r_mul) { - min_free_slots = gc_params.heap_free_slots * r_mul; - } - - if (sweep_slots < min_free_slots) { + if (objspace->heap_pages.allocatable_slots == 0 && sweep_slots < min_free_slots) { if (!full_marking) { if (objspace->profile.count - objspace->rgengc.last_major_gc < RVALUE_OLD_AGE) { full_marking = TRUE; - /* do not update last_major_gc, because full marking is not done. */ - /* goto increment; */ } else { gc_report(1, objspace, "gc_marks_finish: next is full GC!!)\n"); @@ -5650,8 +5575,8 @@ gc_marks_finish(rb_objspace_t *objspace) gc_report(1, objspace, "gc_marks_finish (marks %"PRIdSIZE" objects, " "old %"PRIdSIZE" objects, total %"PRIdSIZE" slots, " - "sweep %"PRIdSIZE" slots, increment: %"PRIdSIZE", next GC: %s)\n", - objspace->marked_slots, objspace->rgengc.old_objects, heap_eden_total_slots(objspace), sweep_slots, heap_allocatable_pages(objspace), + "sweep %"PRIdSIZE" slots, allocatable %"PRIdSIZE" slots, next GC: %s)\n", + objspace->marked_slots, objspace->rgengc.old_objects, heap_eden_total_slots(objspace), sweep_slots, objspace->heap_pages.allocatable_slots, gc_needs_major_flags ? "major" : "minor"); } @@ -5845,14 +5770,14 @@ gc_sweep_compact(rb_objspace_t *objspace) struct heap_page *start_page = heap->compact_cursor; if (!gc_compact_page(objspace, size_pool, heap, start_page)) { - lock_page_body(objspace, GET_PAGE_BODY(start_page->start)); + lock_page_body(objspace, start_page->body); continue; } // If we get here, we've finished moving all objects on the compact_cursor page // So we can lock it and move the cursor on to the next one. - lock_page_body(objspace, GET_PAGE_BODY(start_page->start)); + lock_page_body(objspace, start_page->body); heap->compact_cursor = ccan_list_prev(&heap->pages, heap->compact_cursor, page_node); } } @@ -6401,9 +6326,9 @@ static void heap_ready_to_gc(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *heap) { if (!heap->free_pages) { - if (!heap_increment(objspace, size_pool, heap)) { - size_pool_allocatable_pages_set(objspace, size_pool, 1); - heap_increment(objspace, size_pool, heap); + if (!heap_page_allocate_and_initialize(objspace, size_pool, heap)) { + objspace->heap_pages.allocatable_slots = 1; + heap_page_allocate_and_initialize(objspace, size_pool, heap); } } } @@ -6975,56 +6900,32 @@ rb_gc_impl_start(void *objspace_ptr, bool full_mark, bool immediate_mark, bool i gc_config_full_mark_set(full_marking_p); } -static void -free_empty_pages(void *objspace_ptr) +void +rb_gc_impl_prepare_heap(void *objspace_ptr) { rb_objspace_t *objspace = objspace_ptr; - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - /* Move all empty pages to the tomb heap for freeing. */ - rb_size_pool_t *size_pool = &size_pools[i]; - rb_heap_t *heap = SIZE_POOL_EDEN_HEAP(size_pool); - rb_heap_t *tomb_heap = SIZE_POOL_TOMB_HEAP(size_pool); - - size_t freed_pages = 0; + size_t orig_total_slots = heap_eden_total_slots(objspace); + size_t orig_allocatable_slots = objspace->heap_pages.allocatable_slots; - struct heap_page **next_page_ptr = &heap->free_pages; - struct heap_page *page = heap->free_pages; - while (page) { - /* All finalizers should have been ran in gc_start_internal, so there - * should be no objects that require finalization. */ - GC_ASSERT(page->final_slots == 0); - - struct heap_page *next_page = page->free_next; - - if (page->free_slots == page->total_slots) { - heap_unlink_page(objspace, heap, page); - heap_add_page(objspace, size_pool, tomb_heap, page); - freed_pages++; - } - else { - *next_page_ptr = page; - next_page_ptr = &page->free_next; - } + rb_gc_impl_each_objects(objspace, gc_set_candidate_object_i, objspace_ptr); - page = next_page; - } + double orig_max_free_slots = gc_params.heap_free_slots_max_ratio; + /* Ensure that all empty pages are moved onto empty_pages. */ + gc_params.heap_free_slots_max_ratio = 0.0; + rb_gc_impl_start(objspace, true, true, true, true); + gc_params.heap_free_slots_max_ratio = orig_max_free_slots; - *next_page_ptr = NULL; + objspace->heap_pages.allocatable_slots = 0; + heap_pages_free_unused_pages(objspace_ptr); + GC_ASSERT(objspace->empty_pages_count == 0); + objspace->heap_pages.allocatable_slots = orig_allocatable_slots; - size_pool_allocatable_pages_set(objspace, size_pool, size_pool->allocatable_pages + freed_pages); + size_t total_slots = heap_eden_total_slots(objspace); + if (orig_total_slots > total_slots) { + objspace->heap_pages.allocatable_slots += orig_total_slots - total_slots; } - heap_pages_free_unused_pages(objspace); -} - -void -rb_gc_impl_prepare_heap(void *objspace_ptr) -{ - rb_gc_impl_each_objects(objspace_ptr, gc_set_candidate_object_i, objspace_ptr); - rb_gc_impl_start(objspace_ptr, true, true, true, true); - free_empty_pages(objspace_ptr); - #if defined(HAVE_MALLOC_TRIM) && !defined(RUBY_ALTERNATIVE_MALLOC_HEADER) malloc_trim(0); #endif @@ -7631,14 +7532,12 @@ enum gc_stat_sym { gc_stat_sym_marking_time, gc_stat_sym_sweeping_time, gc_stat_sym_heap_allocated_pages, - gc_stat_sym_heap_allocatable_pages, gc_stat_sym_heap_available_slots, gc_stat_sym_heap_live_slots, gc_stat_sym_heap_free_slots, gc_stat_sym_heap_final_slots, gc_stat_sym_heap_marked_slots, gc_stat_sym_heap_eden_pages, - gc_stat_sym_heap_tomb_pages, gc_stat_sym_total_allocated_pages, gc_stat_sym_total_freed_pages, gc_stat_sym_total_allocated_objects, @@ -7682,14 +7581,12 @@ setup_gc_stat_symbols(void) S(marking_time), S(sweeping_time), S(heap_allocated_pages); - S(heap_allocatable_pages); S(heap_available_slots); S(heap_live_slots); S(heap_free_slots); S(heap_final_slots); S(heap_marked_slots); S(heap_eden_pages); - S(heap_tomb_pages); S(total_allocated_pages); S(total_freed_pages); S(total_allocated_objects); @@ -7759,16 +7656,14 @@ rb_gc_impl_stat(void *objspace_ptr, VALUE hash_or_sym) /* implementation dependent counters */ SET(heap_allocated_pages, rb_darray_size(objspace->heap_pages.sorted)); - SET(heap_allocatable_pages, heap_allocatable_pages(objspace)); SET(heap_available_slots, objspace_available_slots(objspace)); SET(heap_live_slots, objspace_live_slots(objspace)); SET(heap_free_slots, objspace_free_slots(objspace)); SET(heap_final_slots, total_final_slots_count(objspace)); SET(heap_marked_slots, objspace->marked_slots); SET(heap_eden_pages, heap_eden_total_pages(objspace)); - SET(heap_tomb_pages, heap_tomb_total_pages(objspace)); - SET(total_allocated_pages, total_allocated_pages(objspace)); - SET(total_freed_pages, total_freed_pages(objspace)); + SET(total_allocated_pages, objspace->heap_pages.allocated_pages); + SET(total_freed_pages, objspace->heap_pages.freed_pages); SET(total_allocated_objects, total_allocated_objects(objspace)); SET(total_freed_objects, total_freed_objects(objspace)); SET(malloc_increase_bytes, malloc_increase); @@ -7817,13 +7712,11 @@ rb_gc_impl_stat(void *objspace_ptr, VALUE hash_or_sym) enum gc_stat_heap_sym { gc_stat_heap_sym_slot_size, - gc_stat_heap_sym_heap_allocatable_pages, gc_stat_heap_sym_heap_eden_pages, gc_stat_heap_sym_heap_eden_slots, gc_stat_heap_sym_heap_tomb_pages, gc_stat_heap_sym_heap_tomb_slots, gc_stat_heap_sym_total_allocated_pages, - gc_stat_heap_sym_total_freed_pages, gc_stat_heap_sym_force_major_gc_count, gc_stat_heap_sym_force_incremental_marking_finish_count, gc_stat_heap_sym_total_allocated_objects, @@ -7839,13 +7732,9 @@ setup_gc_stat_heap_symbols(void) if (gc_stat_heap_symbols[0] == 0) { #define S(s) gc_stat_heap_symbols[gc_stat_heap_sym_##s] = ID2SYM(rb_intern_const(#s)) S(slot_size); - S(heap_allocatable_pages); S(heap_eden_pages); S(heap_eden_slots); - S(heap_tomb_pages); - S(heap_tomb_slots); S(total_allocated_pages); - S(total_freed_pages); S(force_major_gc_count); S(force_incremental_marking_finish_count); S(total_allocated_objects); @@ -7864,13 +7753,9 @@ stat_one_heap(rb_size_pool_t *size_pool, VALUE hash, VALUE key) rb_hash_aset(hash, gc_stat_heap_symbols[gc_stat_heap_sym_##name], SIZET2NUM(attr)); SET(slot_size, size_pool->slot_size); - SET(heap_allocatable_pages, size_pool->allocatable_pages); SET(heap_eden_pages, SIZE_POOL_EDEN_HEAP(size_pool)->total_pages); SET(heap_eden_slots, SIZE_POOL_EDEN_HEAP(size_pool)->total_slots); - SET(heap_tomb_pages, SIZE_POOL_TOMB_HEAP(size_pool)->total_pages); - SET(heap_tomb_slots, SIZE_POOL_TOMB_HEAP(size_pool)->total_slots); SET(total_allocated_pages, size_pool->total_allocated_pages); - SET(total_freed_pages, size_pool->total_freed_pages); SET(force_major_gc_count, size_pool->force_major_gc_count); SET(force_incremental_marking_finish_count, size_pool->force_incremental_marking_finish_count); SET(total_allocated_objects, size_pool->total_allocated_objects); @@ -8091,33 +7976,6 @@ get_envparam_double(const char *name, double *default_value, double lower_bound, return 1; } -static void -gc_set_initial_pages(rb_objspace_t *objspace) -{ - gc_rest(objspace); - - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - rb_size_pool_t *size_pool = &size_pools[i]; - char env_key[sizeof("RUBY_GC_HEAP_" "_INIT_SLOTS") + DECIMAL_SIZE_OF_BITS(sizeof(int) * CHAR_BIT)]; - snprintf(env_key, sizeof(env_key), "RUBY_GC_HEAP_%d_INIT_SLOTS", i); - - size_t size_pool_init_slots = gc_params.size_pool_init_slots[i]; - if (get_envparam_size(env_key, &size_pool_init_slots, 0)) { - gc_params.size_pool_init_slots[i] = size_pool_init_slots; - } - - if (size_pool_init_slots > size_pool->eden_heap.total_slots) { - size_t slots = size_pool_init_slots - size_pool->eden_heap.total_slots; - size_pool->allocatable_pages = slots_to_pages_for_size_pool(objspace, size_pool, slots); - } - else { - /* We already have more slots than size_pool_init_slots allows, so - * prevent creating more pages. */ - size_pool->allocatable_pages = 0; - } - } -} - /* * GC tuning environment variables * @@ -8167,7 +8025,12 @@ rb_gc_impl_set_params(void *objspace_ptr) /* ok */ } - gc_set_initial_pages(objspace); + for (int i = 0; i < SIZE_POOL_COUNT; i++) { + char env_key[sizeof("RUBY_GC_HEAP_" "_INIT_SLOTS") + DECIMAL_SIZE_OF_BITS(sizeof(int) * CHAR_BIT)]; + snprintf(env_key, sizeof(env_key), "RUBY_GC_HEAP_%d_INIT_SLOTS", i); + + get_envparam_size(env_key, &gc_params.size_pool_init_slots[i], 0); + } get_envparam_double("RUBY_GC_HEAP_GROWTH_FACTOR", &gc_params.growth_factor, 1.0, 0.0, FALSE); get_envparam_size ("RUBY_GC_HEAP_GROWTH_MAX_SLOTS", &gc_params.growth_max_slots, 0); @@ -9407,6 +9270,7 @@ gc_verify_compaction_references(int argc, VALUE* argv, VALUE self) rb_heap_t *heap = SIZE_POOL_EDEN_HEAP(size_pool); max_existing_pages = MAX(max_existing_pages, heap->total_pages); } + /* Add pages to each size pool so that compaction is guaranteed to move every object */ for (int i = 0; i < SIZE_POOL_COUNT; i++) { rb_size_pool_t *size_pool = &size_pools[i]; @@ -9424,14 +9288,19 @@ gc_verify_compaction_references(int argc, VALUE* argv, VALUE self) * Step 2: Now add additional free pages to each size pool sufficient to hold all objects * that want to be in that size pool, whether moved into it or moved within it */ - pages_to_add += slots_to_pages_for_size_pool(objspace, size_pool, desired_compaction.required_slots[i]); + objspace->heap_pages.allocatable_slots = desired_compaction.required_slots[i]; + while (objspace->heap_pages.allocatable_slots > 0) { + heap_page_allocate_and_initialize(objspace, size_pool, heap); + } /* * Step 3: Add two more pages so that the compact & sweep cursors will meet _after_ all objects * have been moved, and not on the last iteration of the `gc_sweep_compact` loop */ pages_to_add += 2; - heap_add_pages(objspace, size_pool, heap, pages_to_add); + for (; pages_to_add > 0; pages_to_add--) { + heap_page_allocate_and_initialize_force(objspace, size_pool, heap); + } } } @@ -9554,7 +9423,6 @@ rb_gc_impl_objspace_init(void *objspace_ptr) size_pool->slot_size = (1 << i) * BASE_SLOT_SIZE; ccan_list_head_init(&SIZE_POOL_EDEN_HEAP(size_pool)->pages); - ccan_list_head_init(&SIZE_POOL_TOMB_HEAP(size_pool)->pages); } rb_darray_make(&objspace->heap_pages.sorted, 0); @@ -9577,10 +9445,8 @@ rb_gc_impl_objspace_init(void *objspace_ptr) #endif /* Set size pools allocatable pages. */ for (int i = 0; i < SIZE_POOL_COUNT; i++) { - rb_size_pool_t *size_pool = &size_pools[i]; /* Set the default value of size_pool_init_slots. */ gc_params.size_pool_init_slots[i] = GC_HEAP_INIT_SLOTS; - size_pool->allocatable_pages = minimum_pages_for_size_pool(objspace, size_pool); } init_mark_stack(&objspace->mark_stack); From 5a502c1873165418a866eb817b44944a6a8784cb Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Fri, 6 Sep 2024 15:26:35 -0400 Subject: [PATCH 170/829] Add keys to GC.stat and fix tests This adds keys heap_empty_pages and heap_allocatable_slots to GC.stat. --- gc/default.c | 19 ++---- test/ruby/test_gc.rb | 131 ++++++++------------------------------ test/ruby/test_process.rb | 11 ++-- 3 files changed, 35 insertions(+), 126 deletions(-) diff --git a/gc/default.c b/gc/default.c index edee2fdc980bf9..843e1ece6985fd 100644 --- a/gc/default.c +++ b/gc/default.c @@ -947,17 +947,6 @@ heap_eden_total_slots(rb_objspace_t *objspace) return count; } -static inline size_t -total_allocated_pages(rb_objspace_t *objspace) -{ - size_t count = 0; - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - rb_size_pool_t *size_pool = &size_pools[i]; - count += size_pool->total_allocated_pages; - } - return count; -} - static inline size_t total_allocated_objects(rb_objspace_t *objspace) { @@ -7532,6 +7521,8 @@ enum gc_stat_sym { gc_stat_sym_marking_time, gc_stat_sym_sweeping_time, gc_stat_sym_heap_allocated_pages, + gc_stat_sym_heap_empty_pages, + gc_stat_sym_heap_allocatable_slots, gc_stat_sym_heap_available_slots, gc_stat_sym_heap_live_slots, gc_stat_sym_heap_free_slots, @@ -7581,6 +7572,8 @@ setup_gc_stat_symbols(void) S(marking_time), S(sweeping_time), S(heap_allocated_pages); + S(heap_empty_pages); + S(heap_allocatable_slots); S(heap_available_slots); S(heap_live_slots); S(heap_free_slots); @@ -7656,6 +7649,8 @@ rb_gc_impl_stat(void *objspace_ptr, VALUE hash_or_sym) /* implementation dependent counters */ SET(heap_allocated_pages, rb_darray_size(objspace->heap_pages.sorted)); + SET(heap_empty_pages, objspace->empty_pages_count) + SET(heap_allocatable_slots, objspace->heap_pages.allocatable_slots); SET(heap_available_slots, objspace_available_slots(objspace)); SET(heap_live_slots, objspace_live_slots(objspace)); SET(heap_free_slots, objspace_free_slots(objspace)); @@ -7714,8 +7709,6 @@ enum gc_stat_heap_sym { gc_stat_heap_sym_slot_size, gc_stat_heap_sym_heap_eden_pages, gc_stat_heap_sym_heap_eden_slots, - gc_stat_heap_sym_heap_tomb_pages, - gc_stat_heap_sym_heap_tomb_slots, gc_stat_heap_sym_total_allocated_pages, gc_stat_heap_sym_force_major_gc_count, gc_stat_heap_sym_force_incremental_marking_finish_count, diff --git a/test/ruby/test_gc.rb b/test/ruby/test_gc.rb index 0cf99a9f9c64d8..de64cbd36dcd8c 100644 --- a/test/ruby/test_gc.rb +++ b/test/ruby/test_gc.rb @@ -210,7 +210,7 @@ def test_stat_constraints assert_equal stat[:total_allocated_pages], stat[:heap_allocated_pages] + stat[:total_freed_pages] assert_equal stat[:heap_available_slots], stat[:heap_live_slots] + stat[:heap_free_slots] + stat[:heap_final_slots] assert_equal stat[:heap_live_slots], stat[:total_allocated_objects] - stat[:total_freed_objects] - stat[:heap_final_slots] - assert_equal stat[:heap_allocated_pages], stat[:heap_eden_pages] + stat[:heap_tomb_pages] + assert_equal stat[:heap_allocated_pages], stat[:heap_eden_pages] if use_rgengc? assert_equal stat[:count], stat[:major_gc_count] + stat[:minor_gc_count] @@ -236,13 +236,9 @@ def test_stat_heap end assert_equal (GC::INTERNAL_CONSTANTS[:BASE_SLOT_SIZE] + GC::INTERNAL_CONSTANTS[:RVALUE_OVERHEAD]) * (2**i), stat_heap[:slot_size] - assert_operator stat_heap[:heap_allocatable_pages], :<=, stat[:heap_allocatable_pages] assert_operator stat_heap[:heap_eden_pages], :<=, stat[:heap_eden_pages] assert_operator stat_heap[:heap_eden_slots], :>=, 0 - assert_operator stat_heap[:heap_tomb_pages], :<=, stat[:heap_tomb_pages] - assert_operator stat_heap[:heap_tomb_slots], :>=, 0 assert_operator stat_heap[:total_allocated_pages], :>=, 0 - assert_operator stat_heap[:total_freed_pages], :>=, 0 assert_operator stat_heap[:force_major_gc_count], :>=, 0 assert_operator stat_heap[:force_incremental_marking_finish_count], :>=, 0 assert_operator stat_heap[:total_allocated_objects], :>=, 0 @@ -296,12 +292,8 @@ def test_stat_heap_constraints hash.each { |k, v| stat_heap_sum[k] += v } end - assert_equal stat[:heap_allocatable_pages], stat_heap_sum[:heap_allocatable_pages] assert_equal stat[:heap_eden_pages], stat_heap_sum[:heap_eden_pages] - assert_equal stat[:heap_tomb_pages], stat_heap_sum[:heap_tomb_pages] - assert_equal stat[:heap_available_slots], stat_heap_sum[:heap_eden_slots] + stat_heap_sum[:heap_tomb_slots] - assert_equal stat[:total_allocated_pages], stat_heap_sum[:total_allocated_pages] - assert_equal stat[:total_freed_pages], stat_heap_sum[:total_freed_pages] + assert_equal stat[:heap_available_slots], stat_heap_sum[:heap_eden_slots] assert_equal stat[:total_allocated_objects], stat_heap_sum[:total_allocated_objects] assert_equal stat[:total_freed_objects], stat_heap_sum[:total_freed_objects] end @@ -328,7 +320,7 @@ def test_latest_gc_info assert_separately([], __FILE__, __LINE__, <<-'RUBY') GC.start - count = GC.stat(:heap_free_slots) + GC.stat(:heap_allocatable_pages) * GC::INTERNAL_CONSTANTS[:HEAP_PAGE_OBJ_LIMIT] + count = GC.stat(:heap_free_slots) + GC.stat(:heap_allocatable_slots) count.times{ "a" + "b" } assert_equal :newobj, GC.latest_gc_info[:gc_by] RUBY @@ -388,6 +380,7 @@ def test_latest_gc_info_need_major_by def test_latest_gc_info_weak_references_count assert_separately([], __FILE__, __LINE__, <<~RUBY) + GC.disable count = 10_000 # Some weak references may be created, so allow some margin of error error_tolerance = 100 @@ -542,114 +535,40 @@ def test_gc_parameter end def test_gc_parameter_init_slots - assert_separately([], __FILE__, __LINE__, <<~RUBY) + assert_separately([], __FILE__, __LINE__, <<~RUBY, timeout: 60) # Constant from gc.c. GC_HEAP_INIT_SLOTS = 10_000 - GC.stat_heap.each do |_, s| - multiple = s[:slot_size] / (GC::INTERNAL_CONSTANTS[:BASE_SLOT_SIZE] + GC::INTERNAL_CONSTANTS[:RVALUE_OVERHEAD]) - # Allocatable pages are assumed to have lost 1 slot due to alignment. - slots_per_page = (GC::INTERNAL_CONSTANTS[:HEAP_PAGE_OBJ_LIMIT] / multiple) - 1 - total_slots = s[:heap_eden_slots] + s[:heap_allocatable_pages] * slots_per_page - assert_operator(total_slots, :>=, GC_HEAP_INIT_SLOTS, s) + gc_count = GC.stat(:count) + # Fill up all of the size pools to the init slots + GC::INTERNAL_CONSTANTS[:SIZE_POOL_COUNT].times do |i| + capa = (GC.stat_heap(i, :slot_size) - GC::INTERNAL_CONSTANTS[:RVALUE_OVERHEAD] - (2 * RbConfig::SIZEOF["void*"])) / RbConfig::SIZEOF["void*"] + while GC.stat_heap(i, :heap_eden_slots) < GC_HEAP_INIT_SLOTS + Array.new(capa) + end end + + assert_equal gc_count, GC.stat(:count) RUBY env = {} - # Make the heap big enough to ensure the heap never needs to grow. - sizes = GC.stat_heap.keys.reverse.map { |i| (i + 1) * 100_000 } + sizes = GC.stat_heap.keys.reverse.map { 20_000 } GC.stat_heap.keys.each do |heap| env["RUBY_GC_HEAP_#{heap}_INIT_SLOTS"] = sizes[heap].to_s end - assert_separately([env, "-W0"], __FILE__, __LINE__, <<~RUBY) - SIZES = #{sizes} - GC.stat_heap.each do |i, s| - multiple = s[:slot_size] / (GC::INTERNAL_CONSTANTS[:BASE_SLOT_SIZE] + GC::INTERNAL_CONSTANTS[:RVALUE_OVERHEAD]) - # Allocatable pages are assumed to have lost 1 slot due to alignment. - slots_per_page = (GC::INTERNAL_CONSTANTS[:HEAP_PAGE_OBJ_LIMIT] / multiple) - 1 - - total_slots = s[:heap_eden_slots] + s[:heap_allocatable_pages] * slots_per_page - - # The delta is calculated as follows: - # - For allocated pages, each page can vary by 1 slot due to alignment. - # - For allocatable pages, we can end up with at most 1 extra page of slots. - assert_in_delta(SIZES[i], total_slots, s[:heap_eden_pages] + slots_per_page, s) - end - RUBY - - # Check that the configured sizes are "remembered" across GC invocations. - assert_separately([env, "-W0"], __FILE__, __LINE__, <<~RUBY) - SIZES = #{sizes} - - # Fill size pool 0 with transient objects. - ary = [] - while GC.stat_heap(0, :heap_allocatable_pages) != 0 - ary << Object.new - end - ary.clear - ary = nil - - # Clear all the objects that were allocated. - GC.start - - # Check that we still have the same number of slots as initially configured. - GC.stat_heap.each do |i, s| - multiple = s[:slot_size] / (GC::INTERNAL_CONSTANTS[:BASE_SLOT_SIZE] + GC::INTERNAL_CONSTANTS[:RVALUE_OVERHEAD]) - # Allocatable pages are assumed to have lost 1 slot due to alignment. - slots_per_page = (GC::INTERNAL_CONSTANTS[:HEAP_PAGE_OBJ_LIMIT] / multiple) - 1 - - total_slots = s[:heap_eden_slots] + s[:heap_allocatable_pages] * slots_per_page - - # The delta is calculated as follows: - # - For allocated pages, each page can vary by 1 slot due to alignment. - # - For allocatable pages, we can end up with at most 1 extra page of slots. - assert_in_delta(SIZES[i], total_slots, s[:heap_eden_pages] + slots_per_page, s) - end - RUBY - - # Check that we don't grow the heap in minor GC if we have alloctable pages. - env["RUBY_GC_HEAP_FREE_SLOTS_MIN_RATIO"] = "0.3" - env["RUBY_GC_HEAP_FREE_SLOTS_GOAL_RATIO"] = "0.99" - env["RUBY_GC_HEAP_FREE_SLOTS_MAX_RATIO"] = "1.0" - env["RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR"] = "100" # Large value to disable major GC - assert_separately([env, "-W0"], __FILE__, __LINE__, <<~RUBY) + assert_separately([env, "-W0"], __FILE__, __LINE__, <<~RUBY, timeout: 60) SIZES = #{sizes} - # Run a major GC to clear out dead objects. - GC.start - - # Disable GC so we can control when GC is ran. - GC.disable - - # Run minor GC enough times so that we don't grow the heap because we - # haven't yet ran RVALUE_OLD_AGE minor GC cycles. - GC::INTERNAL_CONSTANTS[:RVALUE_OLD_AGE].times { GC.start(full_mark: false) } - - # Fill size pool 0 to over 50% full so that the number of allocatable - # pages that will be created will be over the number in heap_allocatable_pages - # (calculated using RUBY_GC_HEAP_FREE_SLOTS_MIN_RATIO). - # 70% was chosen here to guarantee that. - ary = [] - while GC.stat_heap(0, :heap_allocatable_pages) > - (GC.stat_heap(0, :heap_allocatable_pages) + GC.stat_heap(0, :heap_eden_pages)) * 0.3 - ary << Object.new + gc_count = GC.stat(:count) + # Fill up all of the size pools to the init slots + GC::INTERNAL_CONSTANTS[:SIZE_POOL_COUNT].times do |i| + capa = (GC.stat_heap(i, :slot_size) - GC::INTERNAL_CONSTANTS[:RVALUE_OVERHEAD] - (2 * RbConfig::SIZEOF["void*"])) / RbConfig::SIZEOF["void*"] + while GC.stat_heap(i, :heap_eden_slots) < SIZES[i] + Array.new(capa) + end end - GC.start(full_mark: false) - - # Check that we still have the same number of slots as initially configured. - GC.stat_heap.each do |i, s| - multiple = s[:slot_size] / (GC::INTERNAL_CONSTANTS[:BASE_SLOT_SIZE] + GC::INTERNAL_CONSTANTS[:RVALUE_OVERHEAD]) - # Allocatable pages are assumed to have lost 1 slot due to alignment. - slots_per_page = (GC::INTERNAL_CONSTANTS[:HEAP_PAGE_OBJ_LIMIT] / multiple) - 1 - - total_slots = s[:heap_eden_slots] + s[:heap_allocatable_pages] * slots_per_page - - # The delta is calculated as follows: - # - For allocated pages, each page can vary by 1 slot due to alignment. - # - For allocatable pages, we can end up with at most 1 extra page of slots. - assert_in_delta(SIZES[i], total_slots, s[:heap_eden_pages] + slots_per_page, s) - end + assert_equal gc_count, GC.stat(:count) RUBY end @@ -749,7 +668,7 @@ def test_thrashing_for_young_objects # Should not be thrashing in page creation assert_equal before_stats[:heap_allocated_pages], after_stats[:heap_allocated_pages], debug_msg - assert_equal 0, after_stats[:heap_tomb_pages], debug_msg + assert_equal 0, after_stats[:heap_empty_pages], debug_msg assert_equal 0, after_stats[:total_freed_pages], debug_msg # Only young objects, so should not trigger major GC assert_equal before_stats[:major_gc_count], after_stats[:major_gc_count], debug_msg diff --git a/test/ruby/test_process.rb b/test/ruby/test_process.rb index edfb8ebe0e2858..4257110950c6ae 100644 --- a/test/ruby/test_process.rb +++ b/test/ruby/test_process.rb @@ -2766,7 +2766,7 @@ def test_warmup_frees_pages begin; GC.start - TIMES = 10_000 + TIMES = 100_000 ary = Array.new(TIMES) TIMES.times do |i| ary[i] = Object.new @@ -2777,15 +2777,12 @@ def test_warmup_frees_pages # Disable GC so we can make sure GC only runs in Process.warmup GC.disable - total_pages_before = GC.stat_heap.map { |_, v| v[:heap_eden_pages] + v[:heap_allocatable_pages] } + total_slots_before = GC.stat(:heap_available_slots) + GC.stat(:heap_allocatable_slots) Process.warmup - # Number of pages freed should cause equal increase in number of allocatable pages. - total_pages_before.each_with_index do |val, i| - assert_equal(val, GC.stat_heap(i, :heap_eden_pages) + GC.stat_heap(i, :heap_allocatable_pages), "size pool: #{i}") - end - assert_equal(0, GC.stat(:heap_tomb_pages)) + assert_equal(total_slots_before, GC.stat(:heap_available_slots) + GC.stat(:heap_allocatable_slots)) + assert_equal(0, GC.stat(:heap_empty_pages)) assert_operator(GC.stat(:total_freed_pages), :>, 0) end; end From f2057277ea604293aadc3c31b09becea0d539a87 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Mon, 9 Sep 2024 10:23:25 -0400 Subject: [PATCH 171/829] ASAN unlock freelist in gc_sweep_step --- gc/default.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gc/default.c b/gc/default.c index 843e1ece6985fd..42ae5c59324d5a 100644 --- a/gc/default.c +++ b/gc/default.c @@ -3973,7 +3973,10 @@ gc_sweep_step(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *hea sweep_page->slot_size = 0; sweep_page->size_pool = NULL; sweep_page->free_slots = 0; + + asan_unlock_freelist(sweep_page); sweep_page->freelist = NULL; + asan_lock_freelist(sweep_page); objspace->empty_pages_count++; sweep_page->free_next = objspace->empty_pages; From 1205f17125e5e07d7649c8c9fedcf4b74079a54d Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Mon, 9 Sep 2024 10:55:18 -0400 Subject: [PATCH 172/829] ASAN unlock freelist in size_pool_add_page --- gc/default.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/gc/default.c b/gc/default.c index 42ae5c59324d5a..f2915d7d8eb5f5 100644 --- a/gc/default.c +++ b/gc/default.c @@ -2050,14 +2050,15 @@ size_pool_add_page(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t page->slot_size = size_pool->slot_size; page->size_pool = size_pool; + asan_unlock_freelist(page); page->freelist = NULL; for (VALUE p = (VALUE)start; p < start + (slot_count * size_pool->slot_size); p += size_pool->slot_size) { heap_page_add_freeobj(objspace, page, p); } - page->free_slots = slot_count; - asan_lock_freelist(page); + page->free_slots = slot_count; + size_pool->total_allocated_pages++; ccan_list_add_tail(&heap->pages, &page->page_node); From 7a6533452807aa432f097db4e637e4c480645d6b Mon Sep 17 00:00:00 2001 From: Koichi ITO Date: Sun, 8 Sep 2024 18:25:47 +0900 Subject: [PATCH 173/829] [ruby/prism] Fix a token incompatibility for `Prism::Translation::Parser::Lexer` This PR fixes a token incompatibility between Parser gem and `Prism::Translation::Parser` for double splat argument. ## Parser gem (Expected) Returns `tDSTAR` token: ```console $ bundle exec ruby -Ilib -rparser/ruby33 -ve \ 'buf = Parser::Source::Buffer.new("example.rb"); buf.source = "def f(**foo) end"; p Parser::Ruby33.new.tokenize(buf)[2]' ruby 3.4.0dev (2024-09-01T11:00:13Z master https://github.com/ruby/prism/commit/eb144ef91e) [x86_64-darwin23] [[:kDEF, ["def", #]], [:tIDENTIFIER, ["f", #]], [:tLPAREN2, ["(", #]], [:tDSTAR, ["**", #]], [:tIDENTIFIER, ["foo", #]], [:tRPAREN, [")", #]], [:kEND, ["end", #]]] ``` ## `Prism::Translation::Parser` (Actual) Previously, the parser returned `tPOW` token when parsing the following: ```console $ bundle exec ruby -Ilib -rprism -rprism/translation/parser33 -ve \ 'buf = Parser::Source::Buffer.new("example.rb"); buf.source = "def f(**foo) end"; p Prism::Translation::Parser33.new.tokenize(buf)[2]' ruby 3.4.0dev (2024-09-01T11:00:13Z master https://github.com/ruby/prism/commit/eb144ef91e) [x86_64-darwin23] [[:kDEF, ["def", #]], [:tIDENTIFIER, ["f", #]], [:tLPAREN2, ["(", #]], [:tPOW, ["**", #]], [:tIDENTIFIER, ["foo", #]], [:tRPAREN, [")", #]], [:kEND, ["end", #]]] ``` After the update, the parser now returns `tDSTAR` token for the same input: ```console $ bundle exec ruby -Ilib -rprism -rprism/translation/parser33 -ve \ 'buf = Parser::Source::Buffer.new("example.rb"); buf.source = "def f(**foo) end"; p Prism::Translation::Parser33.new.tokenize(buf)[2]' ruby 3.4.0dev (2024-09-01T11:00:13Z master https://github.com/ruby/prism/commit/eb144ef91e) [x86_64-darwin23] [[:kDEF, ["def", #]], [:tIDENTIFIER, ["f", #]], [:tLPAREN2, ["(", #]], [:tDSTAR, ["**", #]], [:tIDENTIFIER, ["foo", #]], [:tRPAREN, [")", #]], [:kEND, ["end", #]]] ``` With this change, the following code could be removed from test/prism/ruby/parser_test.rb: ```diff - when :tPOW - actual_token[0] = expected_token[0] if expected_token[0] == :tDSTAR ``` `tPOW` is the token type for the behavior of `a ** b`, and its behavior remains unchanged: ```console $ bundle exec ruby -Ilib -rprism -rprism/translation/parser33 -ve \ 'buf = Parser::Source::Buffer.new("example.rb"); buf.source = "a ** b"; p Prism::Translation::Parser33.new.tokenize(buf)[2]' ruby 3.4.0dev (2024-09-01T11:00:13Z master https://github.com/ruby/prism/commit/eb144ef91e) [x86_64-darwin23] [[:tIDENTIFIER, ["a", #]], [:tPOW, ["**", #]], [:tIDENTIFIER, ["b", #]]] ``` https://github.com/ruby/prism/commit/66bde35a44 --- lib/prism/translation/parser/lexer.rb | 2 +- test/prism/ruby/parser_test.rb | 7 ++----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/lib/prism/translation/parser/lexer.rb b/lib/prism/translation/parser/lexer.rb index f6873607894f76..5ca507f7e7ab73 100644 --- a/lib/prism/translation/parser/lexer.rb +++ b/lib/prism/translation/parser/lexer.rb @@ -173,7 +173,7 @@ class Lexer UMINUS_NUM: :tUNARY_NUM, UPLUS: :tUPLUS, USTAR: :tSTAR, - USTAR_STAR: :tPOW, + USTAR_STAR: :tDSTAR, WORDS_SEP: :tSPACE } diff --git a/test/prism/ruby/parser_test.rb b/test/prism/ruby/parser_test.rb index f443342045f29b..87749efdda71ce 100644 --- a/test/prism/ruby/parser_test.rb +++ b/test/prism/ruby/parser_test.rb @@ -268,11 +268,8 @@ def assert_equal_tokens(expected_tokens, actual_tokens) # There are a lot of tokens that have very specific meaning according # to the context of the parser. We don't expose that information in # prism, so we need to normalize these tokens a bit. - case actual_token[0] - when :kDO - actual_token[0] = expected_token[0] if %i[kDO_BLOCK kDO_LAMBDA].include?(expected_token[0]) - when :tPOW - actual_token[0] = expected_token[0] if expected_token[0] == :tDSTAR + if actual_token[0] == :kDO && %i[kDO_BLOCK kDO_LAMBDA].include?(expected_token[0]) + actual_token[0] = expected_token[0] end # Now we can assert that the tokens are actually equal. From 2b1147f1de8f510fe8c77939c5975107c00d017a Mon Sep 17 00:00:00 2001 From: Burdette Lamar Date: Mon, 9 Sep 2024 14:24:33 -0500 Subject: [PATCH 174/829] [DOC] Rationalize aliases in "What's Here" (#11516) --- array.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/array.c b/array.c index 91f75d915f79fb..e046a619965d64 100644 --- a/array.c +++ b/array.c @@ -8553,7 +8553,7 @@ rb_ary_deconstruct(VALUE ary) * * === Methods for Querying * - * - #length, #size: Returns the count of elements. + * - #length (aliased as #size): Returns the count of elements. * - #include?: Returns whether any element == a given object. * - #empty?: Returns whether there are no elements. * - #all?: Returns whether all elements meet a given criterion. @@ -8561,7 +8561,7 @@ rb_ary_deconstruct(VALUE ary) * - #none?: Returns whether no element == a given object. * - #one?: Returns whether exactly one element == a given object. * - #count: Returns the count of elements that meet a given criterion. - * - #find_index, #index: Returns the index of the first element that meets a given criterion. + * - #find_index (aliased as #index): Returns the index of the first element that meets a given criterion. * - #rindex: Returns the index of the last element that meets a given criterion. * - #hash: Returns the integer hash code. * @@ -8578,7 +8578,7 @@ rb_ary_deconstruct(VALUE ary) * * These methods do not modify +self+. * - * - #[], #slice: Returns consecutive elements as determined by a given argument. + * - #[] (aliased as #slice): Returns consecutive elements as determined by a given argument. * - #fetch: Returns the element at a given offset. * - #first: Returns one or more leading elements. * - #last: Returns one or more trailing elements. @@ -8603,7 +8603,7 @@ rb_ary_deconstruct(VALUE ary) * - #sort: Returns all elements in an order determined by <=> or a given block. * - #reverse: Returns all elements in reverse order. * - #compact: Returns an array containing all non-+nil+ elements. - * - #select, #filter: Returns an array containing elements selected by a given block. + * - #select (aliased as #filter): Returns an array containing elements selected by a given block. * - #uniq: Returns an array containing non-duplicate elements. * - #rotate: Returns all elements with some rotated from one end to the other. * - #bsearch: Returns an element selected via a binary search @@ -8619,12 +8619,12 @@ rb_ary_deconstruct(VALUE ary) * * - #[]=: Assigns specified elements with a given object. * - #<<: Appends an element. - * - #push (and its alias #append): Appends elements. - * - #unshift, #prepend: Prepends leading elements. + * - #push (aliased as #append): Appends elements. + * - #unshift (aliased as #prepend): Prepends leading elements. * - #insert: Inserts given objects at a given offset; does not replace elements. * - #concat: Appends all elements from given arrays. * - #fill: Replaces specified elements with specified objects. - * - #replace: Replaces the content of +self+ with the content of a given array. + * - #initialize_copy (aliased as #replace): Replaces the content of +self+ with the content of a given array. * - #reverse!: Replaces +self+ with its elements reversed. * - #rotate!: Replaces +self+ with its elements rotated. * - #shuffle!: Replaces +self+ with its elements in random order. @@ -8644,7 +8644,7 @@ rb_ary_deconstruct(VALUE ary) * - #delete_if: Removes elements specified by a given block. * - #keep_if: Removes elements not specified by a given block. * - #reject!: Removes elements specified by a given block. - * - #select!, #filter!: Removes elements not specified by a given block. + * - #select! (aliased as #filter!): Removes elements not specified by a given block. * - #slice!: Removes and returns a sequence of elements. * - #uniq!: Removes duplicates. * @@ -8681,11 +8681,11 @@ rb_ary_deconstruct(VALUE ary) * * === Methods for Converting * - * - #map, #collect: Returns an array containing the block return-value for each element. - * - #map!, #collect!: Replaces each element with a block return-value. + * - #collect (aliased as #map): Returns an array containing the block return-value for each element. + * - #collect! (aliased as #map!): Replaces each element with a block return-value. * - #flatten: Returns an array that is a recursive flattening of +self+. * - #flatten!: Replaces each nested array in +self+ with the elements from that array. - * - #inspect, #to_s: Returns a new String containing the elements. + * - #inspect (aliased as #to_s): Returns a new String containing the elements. * - #join: Returns a newsString containing the elements joined by the field separator. * - #to_a: Returns +self+ or a new array containing all elements. * - #to_ary: Returns +self+. From bd7bc9e2bac6165577c409ade6682e67fd944a73 Mon Sep 17 00:00:00 2001 From: Burdette Lamar Date: Mon, 9 Sep 2024 14:26:00 -0500 Subject: [PATCH 175/829] [DOC] Rationalize aliases in "What's Here" (#11517) --- string.rb | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/string.rb b/string.rb index bec4e8cecfbf2c..fc758d803ec910 100644 --- a/string.rb +++ b/string.rb @@ -163,7 +163,7 @@ # # These instance methods make use of slicing: # -# - String#[] (also aliased as String#slice) returns a slice copied from +self+. +# - String#[] (aliased as String#slice): returns a slice copied from +self+. # - String#[]= returns a copy of +self+ with a slice replaced. # - String#slice! returns +self+ with a slice removed. # @@ -323,7 +323,7 @@ # # - #+@: Returns a string that is not frozen: +self+, if not frozen; # +self.dup+ otherwise. -# - #-@: Returns a string that is frozen: +self+, if already frozen; +# - #-@ (aliased as #dedup): Returns a string that is frozen: +self+, if already frozen; # +self.freeze+ otherwise. # - #freeze: Freezes +self+, if not already frozen; returns +self+. # @@ -331,7 +331,7 @@ # # _Counts_ # -# - #length, #size: Returns the count of characters (not bytes). +# - #length (aliased as #size): Returns the count of characters (not bytes). # - #empty?: Returns +true+ if +self.length+ is zero; +false+ otherwise. # - #bytesize: Returns the count of bytes. # - #count: Returns the count of substrings matching given strings. @@ -365,7 +365,7 @@ # # === Methods for Comparing # -# - #==, #===: Returns +true+ if a given other string has the same content as +self+. +# - #== (aliased as #===): Returns +true+ if a given other string has the same content as +self+. # - #eql?: Returns +true+ if the content is the same as the given other string. # - #<=>: Returns -1, 0, or 1 as a given other string is smaller than, # equal to, or larger than +self+. @@ -389,8 +389,8 @@ # returns +self+ if any changes, +nil+ otherwise. # - #gsub!: Replaces each substring that matches a given pattern with a given replacement string; # returns +self+ if any changes, +nil+ otherwise. -# - #succ!, #next!: Returns +self+ modified to become its own successor. -# - #replace: Returns +self+ with its entire content replaced by a given string. +# - #succ! (aliased as #next!): Returns +self+ modified to become its own successor. +# - #initialize_copy (aliased as #replace): Returns +self+ with its entire content replaced by a given string. # - #reverse!: Returns +self+ with its characters in reverse order. # - #setbyte: Sets the byte at a given integer offset to a given value; returns the argument. # - #tr!: Replaces specified characters in +self+ with specified replacement characters; @@ -460,7 +460,7 @@ # replaced with a given replacement string;. # - #gsub: Returns a copy of +self+ with each substring that matches a given pattern # replaced with a given replacement string. -# - #succ, #next: Returns the string that is the successor to +self+. +# - #succ (aliased as #next): Returns the string that is the successor to +self+. # - #reverse: Returns a copy of +self+ with its characters in reverse order. # - #tr: Returns a copy of +self+ with specified characters replaced with specified replacement characters. # - #tr_s: Returns a copy of +self+ with specified characters replaced with @@ -488,13 +488,13 @@ # - #chomp: Returns a copy of +self+ with a trailing record separator removed, if found. # - #chop: Returns a copy of +self+ with trailing newline characters or the last character removed. # - #squeeze: Returns a copy of +self+ with contiguous duplicate characters removed. -# - #[], #slice: Returns a substring determined by a given index, start/length, or range, or string. +# - #[] (aliased as #slice): Returns a substring determined by a given index, start/length, or range, or string. # - #byteslice: Returns a substring determined by a given index, start/length, or range. # - #chr: Returns the first character. # # _Duplication_ # -# - #to_s, $to_str: If +self+ is a subclass of +String+, returns +self+ copied into a +String+; +# - #to_s (aliased as #to_str): If +self+ is a subclass of +String+, returns +self+ copied into a +String+; # otherwise, returns +self+. # # === Methods for Converting to Non-+String+ @@ -537,7 +537,7 @@ # Strings and Symbols # # - #inspect: Returns copy of +self+, enclosed in double-quotes, with special characters escaped. -# - #to_sym, #intern: Returns the symbol corresponding to +self+. +# - #intern (aliased as #to_sym): Returns the symbol corresponding to +self+. # # === Methods for Iterating # From 88723dd5a5a27bb0bc244c7b20223ca99f917fd6 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Mon, 9 Sep 2024 15:28:05 -0400 Subject: [PATCH 176/829] [DOC] Fix missing colons in String --- string.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/string.rb b/string.rb index fc758d803ec910..ccc6e3f0cbcf75 100644 --- a/string.rb +++ b/string.rb @@ -164,8 +164,8 @@ # These instance methods make use of slicing: # # - String#[] (aliased as String#slice): returns a slice copied from +self+. -# - String#[]= returns a copy of +self+ with a slice replaced. -# - String#slice! returns +self+ with a slice removed. +# - String#[]=: returns a copy of +self+ with a slice replaced. +# - String#slice!: returns +self+ with a slice removed. # # Each of the above methods takes arguments that determine the slice # to be copied or replaced. From d6baa6258c394df9ef54282bc738a326396e06ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Fri, 13 May 2022 13:35:13 +0200 Subject: [PATCH 177/829] [rubygems/rubygems] Avoid having to redefine `Definition#lock` in inline mode https://github.com/rubygems/rubygems/commit/0b7be7bb77 Co-authored-by: Jonathan Hefner --- lib/bundler/definition.rb | 2 +- lib/bundler/inline.rb | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/bundler/definition.rb b/lib/bundler/definition.rb index 5471a72fddc5fc..83db5c0d64a4f7 100644 --- a/lib/bundler/definition.rb +++ b/lib/bundler/definition.rb @@ -519,7 +519,7 @@ def file_exists?(file) end def write_lock(file, preserve_unknown_sections) - return if Definition.no_lock + return if Definition.no_lock || file.nil? contents = to_lock diff --git a/lib/bundler/inline.rb b/lib/bundler/inline.rb index ae4ccf21385cb8..edd2987d20cc86 100644 --- a/lib/bundler/inline.rb +++ b/lib/bundler/inline.rb @@ -50,7 +50,6 @@ def gemfile(install = false, options = {}, &gemfile) Bundler.settings.temporary(deployment: false, frozen: false) do definition = builder.to_definition(nil, true) - def definition.lock(*); end definition.validate_runtime! if install || definition.missing_specs? From 07fa9e3a8f4246498ff143407aa5e8f8f49bcc9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Fri, 13 May 2022 14:03:24 +0200 Subject: [PATCH 178/829] [rubygems/rubygems] Remove unnecessary verification `DSL#to_definition` already verifies this. https://github.com/rubygems/rubygems/commit/c596f0af83 --- lib/bundler/inline.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/bundler/inline.rb b/lib/bundler/inline.rb index edd2987d20cc86..49e8e326160c6e 100644 --- a/lib/bundler/inline.rb +++ b/lib/bundler/inline.rb @@ -46,7 +46,6 @@ def gemfile(install = false, options = {}, &gemfile) Bundler::Plugin.gemfile_install(&gemfile) if Bundler.feature_flag.plugins? builder = Bundler::Dsl.new builder.instance_eval(&gemfile) - builder.check_primary_source_safety Bundler.settings.temporary(deployment: false, frozen: false) do definition = builder.to_definition(nil, true) From f8f9cecd7003227ea21422dfd6609cbafaf5e5f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Fri, 13 May 2022 14:50:30 +0200 Subject: [PATCH 179/829] [rubygems/rubygems] Retry resolution with activated gems if inline has conflicts https://github.com/rubygems/rubygems/commit/8d94c14ca0 Co-authored-by: Jonathan Hefner --- lib/bundler/inline.rb | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/lib/bundler/inline.rb b/lib/bundler/inline.rb index 49e8e326160c6e..238e650d656e51 100644 --- a/lib/bundler/inline.rb +++ b/lib/bundler/inline.rb @@ -60,8 +60,24 @@ def gemfile(install = false, options = {}, &gemfile) end end - runtime = Bundler::Runtime.new(nil, definition) - runtime.setup.require + begin + runtime = Bundler::Runtime.new(nil, definition).setup + rescue Gem::LoadError => e + name = e.name + version = e.requirement.requirements.first[1] + activated_version = Gem.loaded_specs[name].version + + Bundler.ui.info \ + "The #{name} gem was resolved to #{version}, but #{activated_version} was activated by Bundler while installing it, causing a conflict. " \ + "Bundler will now retry resolving with #{activated_version} instead." + + builder.instance_eval { gem name, activated_version } + definition = builder.to_definition(nil, true) + + retry + end + + runtime.require end end From 3725c388f8654c789c87c0b9633c99241679bf9a Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Mon, 9 Sep 2024 17:28:21 +0900 Subject: [PATCH 180/829] [rubygems/rubygems] Added example for bundler/inline conflict https://github.com/rubygems/rubygems/commit/6b1e8a14bd --- spec/bundler/runtime/inline_spec.rb | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/spec/bundler/runtime/inline_spec.rb b/spec/bundler/runtime/inline_spec.rb index f85eaf132d6fb6..1215b9072512a6 100644 --- a/spec/bundler/runtime/inline_spec.rb +++ b/spec/bundler/runtime/inline_spec.rb @@ -655,4 +655,27 @@ def confirm(msg, newline = nil) expect(out).to include("before: [\"Test_Variable\"]") expect(out).to include("after: [\"Test_Variable\"]") end + + it "does not load specified version of psych and stringio" do + build_repo4 do + build_gem "psych", "999" + build_gem "stringio", "999" + end + + script <<-RUBY, env: { "BUNDLER_SPEC_GEM_REPO" => gem_repo4.to_s } + require "bundler/inline" + + gemfile(true) do + source "https://gem.repo4" + + gem "psych" + gem "stringio" + end + RUBY + + expect(out).to include("Installing psych 999") + expect(out).to include("Installing stringio 999") + expect(out).to include("The psych gem was resolved to 999") + expect(out).to include("The stringio gem was resolved to 999") + end end From a5d658cb7a6ecedc5eadf6709ea31bf5cf0229be Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Mon, 9 Sep 2024 19:06:33 +0900 Subject: [PATCH 181/829] [rubygems/rubygems] Removed duplicated dependencies that used by bundler inline https://github.com/rubygems/rubygems/commit/d46b6a49af --- lib/bundler/inline.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/bundler/inline.rb b/lib/bundler/inline.rb index 238e650d656e51..1b12de1d7c24a3 100644 --- a/lib/bundler/inline.rb +++ b/lib/bundler/inline.rb @@ -71,6 +71,7 @@ def gemfile(install = false, options = {}, &gemfile) "The #{name} gem was resolved to #{version}, but #{activated_version} was activated by Bundler while installing it, causing a conflict. " \ "Bundler will now retry resolving with #{activated_version} instead." + builder.dependencies.delete_if {|d| d.name == name } builder.instance_eval { gem name, activated_version } definition = builder.to_definition(nil, true) From 3db2782748e0753f0e4b5c10e6837e0609c5ad1b Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Tue, 10 Sep 2024 10:09:34 +0900 Subject: [PATCH 182/829] [rubygems/rubygems] Mark to exclude examples at ruby/ruby repository `make test-bundler` on ruby/ruby don't have installed gemspec. So, `require "psych"` didn't activate psych as default gems on ruby repo. https://github.com/rubygems/rubygems/commit/f8ca514cbb --- spec/bundler/runtime/inline_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/bundler/runtime/inline_spec.rb b/spec/bundler/runtime/inline_spec.rb index 1215b9072512a6..2deda75509e8a4 100644 --- a/spec/bundler/runtime/inline_spec.rb +++ b/spec/bundler/runtime/inline_spec.rb @@ -656,7 +656,7 @@ def confirm(msg, newline = nil) expect(out).to include("after: [\"Test_Variable\"]") end - it "does not load specified version of psych and stringio" do + it "does not load specified version of psych and stringio", :ruby_repo do build_repo4 do build_gem "psych", "999" build_gem "stringio", "999" From a3ba723ef09f0a42bb7ad31167a5457756e53f8d Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Tue, 10 Sep 2024 16:06:23 +0900 Subject: [PATCH 183/829] Suppress constant warning for test-bundled-gems-spec --- spec/default.mspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/default.mspec b/spec/default.mspec index 57142d6deca6d5..ecd3f3afe92579 100644 --- a/spec/default.mspec +++ b/spec/default.mspec @@ -90,7 +90,7 @@ require 'mspec/runner/formatters/dotted' class DottedFormatter prepend Module.new { BASE = __dir__ + "/ruby/" unless defined?(BASE) - COUNT_WIDTH = 6 + COUNT_WIDTH = 6 unless defined?(COUNT_WIDTH) def initialize(out = nil) super From 2d12fbc4db7d1501d8f2a6b464af165ec40f7f3c Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Tue, 10 Sep 2024 15:37:32 +0900 Subject: [PATCH 184/829] Add predicates for platforms --- test/ruby/test_process.rb | 2 +- test/ruby/test_rubyoptions.rb | 4 +-- test/ruby/test_vm_dump.rb | 2 +- tool/lib/core_assertions.rb | 59 +++++++++++++++++++++++++++++++++++ tool/lib/test/unit.rb | 1 + 5 files changed, 64 insertions(+), 4 deletions(-) diff --git a/test/ruby/test_process.rb b/test/ruby/test_process.rb index 4257110950c6ae..90cb3ef027a7d1 100644 --- a/test/ruby/test_process.rb +++ b/test/ruby/test_process.rb @@ -1874,7 +1874,7 @@ def test_daemon_default end def test_daemon_noclose - pend "macOS 15 beta is not working with this test" if /darwin/ =~ RUBY_PLATFORM && /15/ =~ `sw_vers -productVersion` + pend "macOS 15 beta is not working with this test" if macos?(15) data = IO.popen("-", "r+") do |f| break f.read if f diff --git a/test/ruby/test_rubyoptions.rb b/test/ruby/test_rubyoptions.rb index 4d1a096298e170..f82861b8ced83b 100644 --- a/test/ruby/test_rubyoptions.rb +++ b/test/ruby/test_rubyoptions.rb @@ -876,7 +876,7 @@ module SEGVTest end def assert_segv(args, message=nil, list: SEGVTest::ExpectedStderrList, **opt, &block) - pend "macOS 15 beta is not working with this assertion" if /darwin/ =~ RUBY_PLATFORM && /15/ =~ `sw_vers -productVersion` + pend "macOS 15 beta is not working with this assertion" if macos?(15) # We want YJIT to be enabled in the subprocess if it's enabled for us # so that the Ruby description matches. @@ -921,7 +921,7 @@ def test_segv_setproctitle end def assert_crash_report(path, cmd = nil, &block) - pend "macOS 15 beta is not working with this assertion" if /darwin/ =~ RUBY_PLATFORM && /15/ =~ `sw_vers -productVersion` + pend "macOS 15 beta is not working with this assertion" if macos?(15) Dir.mktmpdir("ruby_crash_report") do |dir| list = SEGVTest::ExpectedStderrList diff --git a/test/ruby/test_vm_dump.rb b/test/ruby/test_vm_dump.rb index 86d89adb9699d8..22afee7a247fbd 100644 --- a/test/ruby/test_vm_dump.rb +++ b/test/ruby/test_vm_dump.rb @@ -5,7 +5,7 @@ class TestVMDump < Test::Unit::TestCase def assert_darwin_vm_dump_works(args, timeout=nil) - pend "macOS 15 beta is not working with this assertion" if /darwin/ =~ RUBY_PLATFORM && /15/ =~ `sw_vers -productVersion` + pend "macOS 15 beta is not working with this assertion" if macos?(15) assert_in_out_err(args, "", [], /^\[IMPORTANT\]/, timeout: timeout || 300) end diff --git a/tool/lib/core_assertions.rb b/tool/lib/core_assertions.rb index 361b1a697d4495..55ef93bed00842 100644 --- a/tool/lib/core_assertions.rb +++ b/tool/lib/core_assertions.rb @@ -861,6 +861,65 @@ def new_test_token token = "\e[7;1m#{$$.to_s}:#{Time.now.strftime('%s.%L')}:#{rand(0x10000).to_s(16)}:\e[m" return token.dump, Regexp.quote(token) end + + # Platform predicates + + def self.mswin? + defined?(@mswin) ? @mswin : @mswin = RUBY_PLATFORM.include?('mswin') + end + private def mswin? + CoreAssertions.mswin? + end + + def self.mingw? + defined?(@mingw) ? @mingw : @mingw = RUBY_PLATFORM.include?('mingw') + end + private def mingw? + CoreAssertions.mingw? + end + + module_function def windows? + mswin? or mingw? + end + + def self.compare_version(a, b) + b.empty? ? true && a : a && (a <=> b) >= 0 + end + + def self.linux?(*ver) + unless defined?(@linux) + @linux = RUBY_PLATFORM.include?('linux') && `uname -r`.scan(/\d+/).map(&:to_i) + end + compare_version @linux, ver + end + private def linux?(*ver) + CoreAssertions.linux?(*ver) + end + + def self.glibc?(*ver) + unless defined?(@glibc) + libc = `/usr/bin/ldd /bin/sh`[/^\s*libc.*=> *\K\S*/] + if libc and /version (\d+)\.(\d+)\.$/ =~ IO.popen([libc], &:read)[] + @glibc = [$1.to_i, $2.to_i] + else + @glibc = false + end + end + compare_version @glibc, ver + end + private def glibc?(*ver) + CoreAssertions.glibc?(*ver) + end + + def self.macos?(*ver) + unless defined?(@macos) + @macos = RUBY_PLATFORM.include?('darwin') && `sw_vers -productVersion`.scan(/\d+/).map(&:to_i) + end + compare_version @macos, ver + end + private def macos?(*ver) + CoreAssertions.macos?(*ver) + end end end end diff --git a/tool/lib/test/unit.rb b/tool/lib/test/unit.rb index 30f30df62e32cc..bbb9a267594196 100644 --- a/tool/lib/test/unit.rb +++ b/tool/lib/test/unit.rb @@ -1893,6 +1893,7 @@ def initialize(ex) @backtrace = ex.backtrace end + attr_accessor :message, :backtrace end end From 14c72e96ae902ae5d0621c90b07bd1f5bbb80ed7 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Tue, 10 Sep 2024 17:19:02 +0900 Subject: [PATCH 185/829] Remove an unnecessary blank line added by mistake [ci skip] --- tool/lib/test/unit.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/tool/lib/test/unit.rb b/tool/lib/test/unit.rb index bbb9a267594196..30f30df62e32cc 100644 --- a/tool/lib/test/unit.rb +++ b/tool/lib/test/unit.rb @@ -1893,7 +1893,6 @@ def initialize(ex) @backtrace = ex.backtrace end - attr_accessor :message, :backtrace end end From f622548800e538ec88ddc45148113a1a8b520ac9 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sun, 12 May 2024 23:44:32 +0900 Subject: [PATCH 186/829] [ruby/resolv] Add spec extensions https://github.com/ruby/resolv/commit/3189d16b69 --- ext/win32/resolv/extconf.rb | 3 +++ lib/resolv.gemspec | 1 + 2 files changed, 4 insertions(+) diff --git a/ext/win32/resolv/extconf.rb b/ext/win32/resolv/extconf.rb index 01f3df730afe16..ac865ec5e1ddd0 100644 --- a/ext/win32/resolv/extconf.rb +++ b/ext/win32/resolv/extconf.rb @@ -1,3 +1,6 @@ +require 'mkmf' if have_library('iphlpapi', 'GetNetworkParams') create_makefile('win32/resolv') +else + File.write('Makefile', "all clean install:\n\t@echo Done: $(@)\n") end diff --git a/lib/resolv.gemspec b/lib/resolv.gemspec index 6b83e303d7f51f..bfa2f9ff31f957 100644 --- a/lib/resolv.gemspec +++ b/lib/resolv.gemspec @@ -16,6 +16,7 @@ Gem::Specification.new do |spec| spec.homepage = "https://github.com/ruby/resolv" spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0") spec.licenses = ["Ruby", "BSD-2-Clause"] + spec.extensions << "ext/win32/resolv/extconf.rb" spec.metadata["homepage_uri"] = spec.homepage spec.metadata["source_code_uri"] = spec.homepage From 3231ac6008bdcfe605b97bf09d79b3e58a2e58a3 Mon Sep 17 00:00:00 2001 From: Kasumi Hanazuki Date: Sat, 31 Aug 2024 07:31:42 +0000 Subject: [PATCH 187/829] [ruby/resolv] test_dns: Fix FD leak The listening TCP socket is closed by `with_udp_and_tcp` helper, but the connected socket is leaking. ``` Leaked file descriptor: TestResolvDNS#test_multiple_servers_with_timeout_and_truncated_tcp_fallback: 12 : # COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ruby 3248055 chkbuild 12u IPv4 112546322 0t0 TCP localhost:50888->localhost:40112 (CLOSE_WAIT) ``` For the purpose of the test case to simulate a timeout over TCP transport, we have to delay closing this socket until the end the test case. Fixup: https://github.com/ruby/resolv/pull/50 https://github.com/ruby/resolv/commit/236c38bdb1 --- test/resolv/test_dns.rb | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/test/resolv/test_dns.rb b/test/resolv/test_dns.rb index f9224fbebe9fa4..03d997d5b91f9e 100644 --- a/test/resolv/test_dns.rb +++ b/test/resolv/test_dns.rb @@ -758,7 +758,10 @@ def test_multiple_servers_with_timeout_and_truncated_tcp_fallback u1.send(msg[0...512], 0, client_address, client_port) end - tcp_server1_thread = Thread.new { t1.accept; t1.close } + tcp_server1_thread = Thread.new do + # Keep this socket open so that the client experiences a timeout + t1.accept + end tcp_server2_thread = Thread.new do ct = t2.accept @@ -800,7 +803,7 @@ def test_multiple_servers_with_timeout_and_truncated_tcp_fallback ct.send(msg, 0) ct.close end - result, = assert_join_threads([client_thread, udp_server1_thread, tcp_server1_thread, tcp_server2_thread]) + result, _, tcp_server1_socket, = assert_join_threads([client_thread, udp_server1_thread, tcp_server1_thread, tcp_server2_thread]) assert_instance_of(Array, result) assert_equal(50, result.length) result.each_with_index do |rr, i| @@ -809,6 +812,8 @@ def test_multiple_servers_with_timeout_and_truncated_tcp_fallback assert_equal("192.0.2.#{i}", rr.address.to_s) assert_equal(3600, rr.ttl) end + ensure + tcp_server1_socket&.close end end end From a79907ed5e8014215a658f4731ff33df3aca9eaa Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Tue, 25 Oct 2022 16:44:08 +0900 Subject: [PATCH 188/829] [ruby/tmpdir] Reject empty parent path https://github.com/ruby/tmpdir/commit/628c5bdc59 --- lib/tmpdir.rb | 6 +++++- test/test_tmpdir.rb | 6 ++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/tmpdir.rb b/lib/tmpdir.rb index fe3e0e19d1f00c..66ac7cfb321eb1 100644 --- a/lib/tmpdir.rb +++ b/lib/tmpdir.rb @@ -148,7 +148,11 @@ def next # Generates and yields random names to create a temporary name def create(basename, tmpdir=nil, max_try: nil, **opts) origdir = tmpdir - tmpdir ||= tmpdir() + if tmpdir + raise ArgumentError, "empty parent path" if tmpdir.empty? + else + tmpdir = tmpdir() + end n = nil prefix, suffix = basename prefix = (String.try_convert(prefix) or diff --git a/test/test_tmpdir.rb b/test/test_tmpdir.rb index 054ca15d7a7634..eae0610c874b66 100644 --- a/test/test_tmpdir.rb +++ b/test/test_tmpdir.rb @@ -104,6 +104,12 @@ def test_mktmpdir_traversal_array end end + def test_mktmpdir_not_empty_parent + assert_raise(ArgumentError) do + Dir.mktmpdir("foo", "") + end + end + def assert_mktmpdir_traversal Dir.mktmpdir do |target| target = target.chomp('/') + '/' From 22f12b0a62c512f115cd60d4192e53921b11f0c7 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Mon, 9 Sep 2024 12:11:30 -0400 Subject: [PATCH 189/829] Use rb_id_table_foreach_values for marking CC table We don't use the key, so we can speed it up by not needing to convert the key to ID in the iterator. --- imemo.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/imemo.c b/imemo.c index bf852e88093ba3..ac094eb931d715 100644 --- a/imemo.c +++ b/imemo.c @@ -179,11 +179,17 @@ rb_imemo_memsize(VALUE obj) * ========================================================================= */ static enum rb_id_table_iterator_result -cc_table_mark_i(ID id, VALUE ccs_ptr, void *data) +cc_table_mark_i(VALUE ccs_ptr, void *data) { struct rb_class_cc_entries *ccs = (struct rb_class_cc_entries *)ccs_ptr; VM_ASSERT(vm_ccs_p(ccs)); - VM_ASSERT(id == ccs->cme->called_id); +#if VM_CHECK_MODE > 0 + VALUE klass = (VALUE)data; + + VALUE lookup_val; + VM_ASSERT(rb_id_table_lookup(RCLASS_CC_TBL(klass), ccs->cme->called_id, &lookup_val)); + VM_ASSERT(lookup_val == ccs_ptr); +#endif if (METHOD_ENTRY_INVALIDATED(ccs->cme)) { rb_vm_ccs_free(ccs); @@ -193,7 +199,7 @@ cc_table_mark_i(ID id, VALUE ccs_ptr, void *data) rb_gc_mark_movable((VALUE)ccs->cme); for (int i=0; ilen; i++) { - VM_ASSERT((VALUE)data == ccs->entries[i].cc->klass); + VM_ASSERT(klass == ccs->entries[i].cc->klass); VM_ASSERT(vm_cc_check_cme(ccs->entries[i].cc, ccs->cme)); rb_gc_mark_movable((VALUE)ccs->entries[i].cc); @@ -207,7 +213,7 @@ rb_cc_table_mark(VALUE klass) { struct rb_id_table *cc_tbl = RCLASS_CC_TBL(klass); if (cc_tbl) { - rb_id_table_foreach(cc_tbl, cc_table_mark_i, (void *)klass); + rb_id_table_foreach_values(cc_tbl, cc_table_mark_i, (void *)klass); } } From ccd35eaecf7604a9c2edc4a6d9eab5fa8c527cab Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Sat, 31 Aug 2024 18:11:50 +0100 Subject: [PATCH 190/829] [DOC] Rationalize aliases in What's Here --- struct.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/struct.c b/struct.c index 544228f76b9582..3e2dff161fd198 100644 --- a/struct.c +++ b/struct.c @@ -2131,7 +2131,7 @@ rb_data_inspect(VALUE s) * === Methods for Querying * * - #hash: Returns the integer hash code. - * - #length, #size: Returns the number of members. + * - #size (aliased as #length): Returns the number of members. * * === Methods for Comparing * @@ -2143,13 +2143,13 @@ rb_data_inspect(VALUE s) * === Methods for Fetching * * - #[]: Returns the value associated with a given member name. - * - #to_a, #values, #deconstruct: Returns the member values in +self+ as an array. + * - #to_a (aliased as #values, #deconstruct): Returns the member values in +self+ as an array. * - #deconstruct_keys: Returns a hash of the name/value pairs * for given member names. * - #dig: Returns the object in nested objects that is specified * by a given member name and additional arguments. * - #members: Returns an array of the member names. - * - #select, #filter: Returns an array of member values from +self+, + * - #select (aliased as #filter): Returns an array of member values from +self+, * as selected by the given block. * - #values_at: Returns an array containing values for given member names. * @@ -2164,7 +2164,7 @@ rb_data_inspect(VALUE s) * * === Methods for Converting * - * - #inspect, #to_s: Returns a string representation of +self+. + * - #inspect (aliased as #to_s): Returns a string representation of +self+. * - #to_h: Returns a hash of the member name/value pairs in +self+. * */ From b420b094d97343bdbc24b946c17f9550c779647c Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Sat, 31 Aug 2024 19:48:46 +0100 Subject: [PATCH 191/829] [DOC] Related for Array#push --- array.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/array.c b/array.c index e046a619965d64..deaf733691a842 100644 --- a/array.c +++ b/array.c @@ -1415,7 +1415,7 @@ rb_ary_cat(VALUE ary, const VALUE *argv, long len) * a = [:foo, 'bar', 2] # => [:foo, "bar", 2] a.push([:baz, :bat], [:bam, :bad]) # => [:foo, "bar", 2, [:baz, :bat], [:bam, :bad]] * - * Related: Array#pop, Array#shift, Array#unshift. + * Related: see {Methods for Assigning}[rdoc-ref:Array@Methods+for+Assigning]. */ static VALUE From a552e04d81a8c754382ca5d50455152467f034c4 Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Sat, 31 Aug 2024 19:57:21 +0100 Subject: [PATCH 192/829] [DOC] Related for Array#assoc --- array.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/array.c b/array.c index deaf733691a842..e0f063f4fe739e 100644 --- a/array.c +++ b/array.c @@ -5094,7 +5094,8 @@ rb_ary_times(VALUE ary, VALUE times) * * Returns +nil+ if no such element is found. * - * Related: Array#rassoc. + * Related: Array#rassoc; + * see also {Methods for Fetching}[rdoc-ref:Array@Methods+for+Fetching]. */ VALUE From 3d09242cc411283dc972564961fdff5fc0b8e56d Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Sun, 1 Sep 2024 15:41:08 +0100 Subject: [PATCH 193/829] [DOC] Related for Array#at --- array.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/array.c b/array.c index e0f063f4fe739e..c48ffc62bb0093 100644 --- a/array.c +++ b/array.c @@ -1945,7 +1945,8 @@ rb_ary_aref1(VALUE ary, VALUE arg) * * a.at(-2) # => "bar" * - * Related: Array#[]. + * Related: Array#[]; + * see also {Methods for Fetching}[rdoc-ref:Array@Methods+for+Fetching]. */ VALUE From bd9fa014e39b1d805cedcce43052234136ff8b95 Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Sun, 1 Sep 2024 16:09:30 +0100 Subject: [PATCH 194/829] [DOC] Related for Array bsearch methods --- array.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/array.c b/array.c index c48ffc62bb0093..78963e5e05b823 100644 --- a/array.c +++ b/array.c @@ -3559,6 +3559,8 @@ static VALUE rb_ary_bsearch_index(VALUE ary); * or +nil+ if the search found no suitable element. * * See {Binary Searching}[rdoc-ref:bsearch.rdoc]. + * + * Related: see {Methods for Fetching}[rdoc-ref:Array@Methods+for+Fetching]. */ static VALUE @@ -3581,6 +3583,8 @@ rb_ary_bsearch(VALUE ary) * or +nil+ if the search found no suitable element. * * See {Binary Searching}[rdoc-ref:bsearch.rdoc]. + * + * Related: see {Methods for Fetching}[rdoc-ref:Array@Methods+for+Fetching]. */ static VALUE From ec3851e6b1e3dc652e46426b911530b1173ab153 Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Sun, 1 Sep 2024 16:18:33 +0100 Subject: [PATCH 195/829] [DOC] Related for Array#clear --- array.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/array.c b/array.c index 78963e5e05b823..ff1bfeafd973e4 100644 --- a/array.c +++ b/array.c @@ -4663,6 +4663,7 @@ rb_ary_replace(VALUE copy, VALUE orig) * a = [:foo, 'bar', 2] * a.clear # => [] * + * Related: see {Methods for Deleting}[rdoc-ref:Array@Methods+for+Deleting]. */ VALUE @@ -8648,6 +8649,7 @@ rb_ary_deconstruct(VALUE ary) * - #delete: Removes elements equal to a given object. * - #delete_at: Removes the element at a given offset. * - #delete_if: Removes elements specified by a given block. + * - #clear: Removes all elements. * - #keep_if: Removes elements not specified by a given block. * - #reject!: Removes elements specified by a given block. * - #select! (aliased as #filter!): Removes elements not specified by a given block. From 5df574d26e6c97281678414a3eecf80544d7f494 Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Sun, 1 Sep 2024 17:22:26 +0100 Subject: [PATCH 196/829] [DOC] Fix links --- numeric.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/numeric.c b/numeric.c index 3a19abea795a63..ef7a39dc48802e 100644 --- a/numeric.c +++ b/numeric.c @@ -2744,7 +2744,7 @@ flo_truncate(int argc, VALUE *argv, VALUE num) * Returns the largest float or integer that is less than or equal to +self+, * as specified by the given `ndigits`, * which must be an - * [integer-convertible object](rdoc-ref:implicit_conversion.rdoc@Integer-Convertible+Objects). + * {integer-convertible object}[rdoc-ref:implicit_conversion.rdoc@Integer-Convertible+Objects]. * * Equivalent to self.to_f.floor(ndigits). * @@ -2764,7 +2764,7 @@ num_floor(int argc, VALUE *argv, VALUE num) * Returns the smallest float or integer that is greater than or equal to +self+, * as specified by the given `ndigits`, * which must be an - * [integer-convertible object](rdoc-ref:implicit_conversion.rdoc@Integer-Convertible+Objects). + * {integer-convertible object}[rdoc-ref:implicit_conversion.rdoc@Integer-Convertible+Objects]. * * Equivalent to self.to_f.ceil(ndigits). * From 07a0aa9be67a0a0c2b0f501fb470c91091056188 Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Sun, 1 Sep 2024 17:49:01 +0100 Subject: [PATCH 197/829] [DOC] Fix link --- doc/_regexp.rdoc | 4 ++-- doc/syntax/literals.rdoc | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/_regexp.rdoc b/doc/_regexp.rdoc index 7b71eee984b4b4..da323e913f8ba8 100644 --- a/doc/_regexp.rdoc +++ b/doc/_regexp.rdoc @@ -212,7 +212,7 @@ Method Regexp.escape returns an escaped string: === Source Literals The source literal largely behaves like a double-quoted string; -see {String Literals}[rdoc-ref:syntax/literals.rdoc@String+Literals]. +see {Double-Quoted String Literals}[rdoc-ref:syntax/literals.rdoc@Double-Quoted+String+Literals]. In particular, a source literal may contain interpolated expressions: @@ -1050,7 +1050,7 @@ Example: re.match('TEst') # => # re.match('TEST') # => nil re.match('teST') # => nil - + re = /t(?i:e)st/ re.match('test') # => # re.match('tEst') # => # diff --git a/doc/syntax/literals.rdoc b/doc/syntax/literals.rdoc index 6d681419a2b459..ce398dd75dfba2 100644 --- a/doc/syntax/literals.rdoc +++ b/doc/syntax/literals.rdoc @@ -178,7 +178,7 @@ sequences are as follows: The last one, \, represents an empty string instead of a character. It is used to fold a line in a string. -=== Double-quoted \String Literals +=== Double-Quoted \String Literals The most common way of writing strings is using ": @@ -213,7 +213,7 @@ See also: * {% and %Q: Interpolable String Literals}[#label-25+and+-25Q-3A+Interpolable+String+Literals] -=== Single-quoted \String Literals +=== Single-Quoted \String Literals Interpolation may be disabled by escaping the "#" character or using single-quoted strings: From 316c2001e04d76c9f898074c6a87b4e8f2668536 Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Sat, 7 Sep 2024 15:56:56 -0500 Subject: [PATCH 198/829] Related for Array#collect --- array.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/array.c b/array.c index ff1bfeafd973e4..a71763ed2c3c25 100644 --- a/array.c +++ b/array.c @@ -3695,6 +3695,9 @@ rb_ary_sort_by_bang(VALUE ary) * a1 # => [Symbol, String, Integer] * * With no block given, returns a new Enumerator. + * + * Related: #collect!; + * see also {Methods for Converting}[rdoc-ref:Array@Methods+for+Converting]. */ static VALUE From 175a98d5160e9c3773c1273c07255c6ab9b8a396 Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Sat, 7 Sep 2024 16:05:25 -0500 Subject: [PATCH 199/829] [DOC] Related for Array#collect! --- array.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/array.c b/array.c index a71763ed2c3c25..0f3bdfff4a6ac4 100644 --- a/array.c +++ b/array.c @@ -3730,6 +3730,9 @@ rb_ary_collect(VALUE ary) * a.map! { |element| element.class } # => [Symbol, String, Integer] * * With no block given, returns a new Enumerator. + * + * Related: #collect; + * see also {Methods for Converting}[rdoc-ref:Array@Methods+for+Converting]. */ static VALUE From 648866b6710f815b861be8f43faab9b02d074861 Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Sat, 7 Sep 2024 16:12:22 -0500 Subject: [PATCH 200/829] [DOC] Related for Array#combination --- array.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/array.c b/array.c index 0f3bdfff4a6ac4..df5a87a6a66a23 100644 --- a/array.c +++ b/array.c @@ -7160,7 +7160,8 @@ rb_ary_combination_size(VALUE ary, VALUE args, VALUE eobj) * * With no block given, returns a new Enumerator. * - * Related: Array#permutation. + * Related: Array#permutation; + * see also {Methods for Iterating}[rdoc-ref:Array@Methods+for+Iterating]. */ static VALUE From b27a128d72d7f24f8ef037a18f2b4d2d602ee955 Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Sat, 7 Sep 2024 18:51:36 -0500 Subject: [PATCH 201/829] [DOC] Related for Array#compact --- array.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/array.c b/array.c index df5a87a6a66a23..466ea03c0ca860 100644 --- a/array.c +++ b/array.c @@ -6318,7 +6318,8 @@ rb_ary_uniq(VALUE ary) * a # => [0, false, "", [], {}] * a.compact! # => nil * - * Related: Array#compact. + * Related: Array#compact; + * see also {Methods for Deleting}[rdoc-ref:Array@Methods+for+Deleting]. */ static VALUE From ff43e618e99851592b6b595d640941588911ed4f Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Sat, 7 Sep 2024 19:00:58 -0500 Subject: [PATCH 202/829] [DOC] Related for Array#concat --- array.c | 1 + 1 file changed, 1 insertion(+) diff --git a/array.c b/array.c index 466ea03c0ca860..f5fa6ee9a5f3bc 100644 --- a/array.c +++ b/array.c @@ -5003,6 +5003,7 @@ ary_append(VALUE x, VALUE y) * a.concat(['two', 'three'], [:four, :five], a) * # => [0, 1, "two", "three", :four, :five, 0, 1] * + * Related: see {Methods for Assigning}[rdoc-ref:Array@Methods+for+Assigning]. */ static VALUE From a055a426ed146c55f4916f0c2d198bb9de109725 Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Mon, 9 Sep 2024 09:26:58 -0500 Subject: [PATCH 203/829] [DOC] Related for Array#count --- array.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/array.c b/array.c index f5fa6ee9a5f3bc..0b79f6aede3c4e 100644 --- a/array.c +++ b/array.c @@ -6386,10 +6386,12 @@ rb_ary_compact(VALUE ary) * With no argument and a block given, calls the block with each element; * returns the count of elements for which the block returns a truthy value: * - * [0, 1, 2, 3].count {|element| element > 1} # => 2 + * [0, 1, 2, 3].count {|element| element > 1 } # => 2 * * With argument +object+ and a block given, issues a warning, ignores the block, * and returns the count of elements == to +object+. + * + * Related: see {Methods for Querying}[rdoc-ref:Array@Methods+for+Querying]. */ static VALUE From 7ec51310d510ac8b46a7815e49bf8098a8957300 Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Mon, 9 Sep 2024 09:45:50 -0500 Subject: [PATCH 204/829] [DOC] Related for Array#cycle --- array.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/array.c b/array.c index 0b79f6aede3c4e..982e5741bd02fd 100644 --- a/array.c +++ b/array.c @@ -6815,7 +6815,7 @@ rb_ary_cycle_size(VALUE self, VALUE args, VALUE eobj) * {integer-convertible object}[rdoc-ref:implicit_conversion.rdoc@Integer-Convertible+Objects], * or +nil+. * - * If +count+ is positive, + * When +count+ is positive, * calls the block with each element, then does so repeatedly, * until it has done so +count+ times; returns +nil+: * @@ -6823,18 +6823,20 @@ rb_ary_cycle_size(VALUE self, VALUE args, VALUE eobj) * [0, 1].cycle(2) {|element| output.push(element) } # => nil * output # => [0, 1, 0, 1] * - * If +count+ is zero or negative, does not call the block: + * When +count+ is zero or negative, does not call the block: * * [0, 1].cycle(0) {|element| fail 'Cannot happen' } # => nil * [0, 1].cycle(-1) {|element| fail 'Cannot happen' } # => nil * - * If +count+ is +nil+, cycles forever: + * When +count+ is +nil+, cycles forever: * * # Prints 0 and 1 forever. * [0, 1].cycle {|element| puts element } * [0, 1].cycle(nil) {|element| puts element } * * With no block given, returns a new Enumerator. + * + * Related: see {Methods for Iterating}[rdoc-ref:Array@Methods+for+Iterating]. */ static VALUE rb_ary_cycle(int argc, VALUE *argv, VALUE ary) From a723d480813c4b4ad2fdaca498279b4d2abba250 Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Mon, 9 Sep 2024 10:10:00 -0500 Subject: [PATCH 205/829] [DOC] Tweaks for Array#delete --- array.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/array.c b/array.c index 982e5741bd02fd..35ec990e3d1fe7 100644 --- a/array.c +++ b/array.c @@ -4015,14 +4015,14 @@ ary_resize_smaller(VALUE ary, long len) /* * call-seq: - * delete(object) -> last_deleted_object - * delete(object) {|element| ... } -> last_deleted_object or block_return + * delete(object) -> last_removed_object + * delete(object) {|element| ... } -> last_removed_object or block_return * * Removes zero or more elements from +self+. * * With no block given, * removes from +self+ each element +ele+ such that ele == object; - * returns the last deleted element: + * returns the last removed element: * * a = [0, 1, 2, 2.0] * a.delete(2) # => 2.0 @@ -4036,7 +4036,7 @@ ary_resize_smaller(VALUE ary, long len) * removes from +self+ each element +ele+ such that ele == object. * * If any such elements are found, ignores the block - * and returns the last deleted element: + * and returns the last removed element: * * a = [0, 1, 2, 2.0] * a.delete(2) {|element| fail 'Cannot happen' } # => 2.0 @@ -4048,7 +4048,6 @@ ary_resize_smaller(VALUE ary, long len) * # => "Element 2 not found." * * Related: see {Methods for Deleting}[rdoc-ref:Array@Methods+for+Deleting]. - * */ VALUE From 1adcc41b94d49899b1809fba119f74501fc992b1 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Tue, 10 Sep 2024 13:15:49 -0400 Subject: [PATCH 206/829] [DOC] What's Here for String#append_as_bytes String#append_as_bytes was newly introduced in #11552. --- string.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/string.rb b/string.rb index ccc6e3f0cbcf75..1f0e9ceace2822 100644 --- a/string.rb +++ b/string.rb @@ -382,6 +382,8 @@ # # - #insert: Returns +self+ with a given string inserted at a given offset. # - #<<: Returns +self+ concatenated with a given string or integer. +# - #append_as_bytes: Returns +self+ concatenated with strings without performing any +# encoding validation or conversion. # # _Substitution_ # From 4e6091ce09154d735cca025a4d0130eecebbbc19 Mon Sep 17 00:00:00 2001 From: ydah Date: Tue, 10 Sep 2024 00:13:24 +0900 Subject: [PATCH 207/829] Implement WHILE and UNTIL NODE locations --- ast.c | 10 ++++++++++ node_dump.c | 4 +++- parse.y | 30 +++++++++++++++++------------- rubyparser.h | 2 ++ test/ruby/test_ast.rb | 16 ++++++++++++++++ 5 files changed, 48 insertions(+), 14 deletions(-) diff --git a/ast.c b/ast.c index 031031af956314..9219caf6539a92 100644 --- a/ast.c +++ b/ast.c @@ -806,6 +806,16 @@ node_locations(VALUE ast_value, const NODE *node) location_new(nd_code_loc(node)), location_new(&RNODE_WHEN(node)->keyword_loc), location_new(&RNODE_WHEN(node)->then_keyword_loc)); + case NODE_WHILE: + return rb_ary_new_from_args(3, + location_new(nd_code_loc(node)), + location_new(&RNODE_WHILE(node)->keyword_loc), + location_new(&RNODE_WHILE(node)->closing_loc)); + case NODE_UNTIL: + return rb_ary_new_from_args(3, + location_new(nd_code_loc(node)), + location_new(&RNODE_UNTIL(node)->keyword_loc), + location_new(&RNODE_UNTIL(node)->closing_loc)); case NODE_ARGS_AUX: case NODE_LAST: break; diff --git a/node_dump.c b/node_dump.c index d97a400a977e0c..64b0cb8b7fa136 100644 --- a/node_dump.c +++ b/node_dump.c @@ -319,8 +319,10 @@ dump_node(VALUE buf, VALUE indent, int comment, const NODE * node) A((RNODE_WHILE(node)->nd_state == 1) ? " (while-end)" : " (begin-end-while)"); } F_NODE(nd_cond, RNODE_WHILE, "condition"); - LAST_NODE; F_NODE(nd_body, RNODE_WHILE, "body"); + F_LOC(keyword_loc, RNODE_WHILE); + LAST_NODE; + F_LOC(closing_loc, RNODE_WHILE); return; case NODE_ITER: diff --git a/parse.y b/parse.y index d78d4586f8efb9..69eb37424fbbe7 100644 --- a/parse.y +++ b/parse.y @@ -1068,8 +1068,8 @@ static rb_node_case2_t *rb_node_case2_new(struct parser_params *p, NODE *nd_body static rb_node_case3_t *rb_node_case3_new(struct parser_params *p, NODE *nd_head, NODE *nd_body, const YYLTYPE *loc); static rb_node_when_t *rb_node_when_new(struct parser_params *p, NODE *nd_head, NODE *nd_body, NODE *nd_next, const YYLTYPE *loc, const YYLTYPE *keyword_loc, const YYLTYPE *then_keyword_loc); static rb_node_in_t *rb_node_in_new(struct parser_params *p, NODE *nd_head, NODE *nd_body, NODE *nd_next, const YYLTYPE *loc); -static rb_node_while_t *rb_node_while_new(struct parser_params *p, NODE *nd_cond, NODE *nd_body, long nd_state, const YYLTYPE *loc); -static rb_node_until_t *rb_node_until_new(struct parser_params *p, NODE *nd_cond, NODE *nd_body, long nd_state, const YYLTYPE *loc); +static rb_node_while_t *rb_node_while_new(struct parser_params *p, NODE *nd_cond, NODE *nd_body, long nd_state, const YYLTYPE *loc, const YYLTYPE *keyword_loc, const YYLTYPE *closing_loc); +static rb_node_until_t *rb_node_until_new(struct parser_params *p, NODE *nd_cond, NODE *nd_body, long nd_state, const YYLTYPE *loc, const YYLTYPE *keyword_loc, const YYLTYPE *closing_loc); static rb_node_iter_t *rb_node_iter_new(struct parser_params *p, rb_node_args_t *nd_args, NODE *nd_body, const YYLTYPE *loc); static rb_node_for_t *rb_node_for_new(struct parser_params *p, NODE *nd_iter, NODE *nd_body, const YYLTYPE *loc); static rb_node_for_masgn_t *rb_node_for_masgn_new(struct parser_params *p, NODE *nd_var, const YYLTYPE *loc); @@ -1176,8 +1176,8 @@ static rb_node_error_t *rb_node_error_new(struct parser_params *p, const YYLTYPE #define NEW_CASE3(h,b,loc) (NODE *)rb_node_case3_new(p,h,b,loc) #define NEW_WHEN(c,t,e,loc,k_loc,t_loc) (NODE *)rb_node_when_new(p,c,t,e,loc,k_loc,t_loc) #define NEW_IN(c,t,e,loc) (NODE *)rb_node_in_new(p,c,t,e,loc) -#define NEW_WHILE(c,b,n,loc) (NODE *)rb_node_while_new(p,c,b,n,loc) -#define NEW_UNTIL(c,b,n,loc) (NODE *)rb_node_until_new(p,c,b,n,loc) +#define NEW_WHILE(c,b,n,loc,k_loc,c_loc) (NODE *)rb_node_while_new(p,c,b,n,loc,k_loc,c_loc) +#define NEW_UNTIL(c,b,n,loc,k_loc,c_loc) (NODE *)rb_node_until_new(p,c,b,n,loc,k_loc,c_loc) #define NEW_ITER(a,b,loc) (NODE *)rb_node_iter_new(p,a,b,loc) #define NEW_FOR(i,b,loc) (NODE *)rb_node_for_new(p,i,b,loc) #define NEW_FOR_MASGN(v,loc) (NODE *)rb_node_for_masgn_new(p,v,loc) @@ -3176,10 +3176,10 @@ stmt : keyword_alias fitem {SET_LEX_STATE(EXPR_FNAME|EXPR_FITEM);} fitem { clear_block_exit(p, false); if ($1 && nd_type_p($1, NODE_BEGIN)) { - $$ = NEW_WHILE(cond(p, $3, &@3), RNODE_BEGIN($1)->nd_body, 0, &@$); + $$ = NEW_WHILE(cond(p, $3, &@3), RNODE_BEGIN($1)->nd_body, 0, &@$, &@2, &NULL_LOC); } else { - $$ = NEW_WHILE(cond(p, $3, &@3), $1, 1, &@$); + $$ = NEW_WHILE(cond(p, $3, &@3), $1, 1, &@$, &@2, &NULL_LOC); } /*% ripper: while_mod!($:3, $:1) %*/ } @@ -3187,10 +3187,10 @@ stmt : keyword_alias fitem {SET_LEX_STATE(EXPR_FNAME|EXPR_FITEM);} fitem { clear_block_exit(p, false); if ($1 && nd_type_p($1, NODE_BEGIN)) { - $$ = NEW_UNTIL(cond(p, $3, &@3), RNODE_BEGIN($1)->nd_body, 0, &@$); + $$ = NEW_UNTIL(cond(p, $3, &@3), RNODE_BEGIN($1)->nd_body, 0, &@$, &@2, &NULL_LOC); } else { - $$ = NEW_UNTIL(cond(p, $3, &@3), $1, 1, &@$); + $$ = NEW_UNTIL(cond(p, $3, &@3), $1, 1, &@$, &@2, &NULL_LOC); } /*% ripper: until_mod!($:3, $:1) %*/ } @@ -4527,7 +4527,7 @@ primary : literal k_end { restore_block_exit(p, $1); - $$ = NEW_WHILE(cond(p, $2, &@2), $3, 1, &@$); + $$ = NEW_WHILE(cond(p, $2, &@2), $3, 1, &@$, &@1, &@4); fixpos($$, $2); /*% ripper: while!($:2, $:3) %*/ } @@ -4536,7 +4536,7 @@ primary : literal k_end { restore_block_exit(p, $1); - $$ = NEW_UNTIL(cond(p, $2, &@2), $3, 1, &@$); + $$ = NEW_UNTIL(cond(p, $2, &@2), $3, 1, &@$, &@1, &@4); fixpos($$, $2); /*% ripper: until!($:2, $:3) %*/ } @@ -11667,23 +11667,27 @@ rb_node_in_new(struct parser_params *p, NODE *nd_head, NODE *nd_body, NODE *nd_n } static rb_node_while_t * -rb_node_while_new(struct parser_params *p, NODE *nd_cond, NODE *nd_body, long nd_state, const YYLTYPE *loc) +rb_node_while_new(struct parser_params *p, NODE *nd_cond, NODE *nd_body, long nd_state, const YYLTYPE *loc, const YYLTYPE *keyword_loc, const YYLTYPE *closing_loc) { rb_node_while_t *n = NODE_NEWNODE(NODE_WHILE, rb_node_while_t, loc); n->nd_cond = nd_cond; n->nd_body = nd_body; n->nd_state = nd_state; + n->keyword_loc = *keyword_loc; + n->closing_loc = *closing_loc; return n; } static rb_node_until_t * -rb_node_until_new(struct parser_params *p, NODE *nd_cond, NODE *nd_body, long nd_state, const YYLTYPE *loc) +rb_node_until_new(struct parser_params *p, NODE *nd_cond, NODE *nd_body, long nd_state, const YYLTYPE *loc, const YYLTYPE *keyword_loc, const YYLTYPE *closing_loc) { rb_node_until_t *n = NODE_NEWNODE(NODE_UNTIL, rb_node_until_t, loc); n->nd_cond = nd_cond; n->nd_body = nd_body; n->nd_state = nd_state; + n->keyword_loc = *keyword_loc; + n->closing_loc = *closing_loc; return n; } @@ -15528,7 +15532,7 @@ parser_append_options(struct parser_params *p, NODE *node) irs = list_append(p, irs, NEW_HASH(chomp, LOC)); } - node = NEW_WHILE((NODE *)NEW_FCALL(idGets, irs, LOC), node, 1, LOC); + node = NEW_WHILE((NODE *)NEW_FCALL(idGets, irs, LOC), node, 1, LOC, &NULL_LOC, &NULL_LOC); } return node; diff --git a/rubyparser.h b/rubyparser.h index 5728844827d25a..fe134c0bb7b0cf 100644 --- a/rubyparser.h +++ b/rubyparser.h @@ -323,6 +323,8 @@ typedef struct RNode_LOOP { struct RNode *nd_cond; struct RNode *nd_body; long nd_state; + rb_code_location_t keyword_loc; + rb_code_location_t closing_loc; } rb_node_while_t, rb_node_until_t; typedef struct RNode_ITER { diff --git a/test/ruby/test_ast.rb b/test/ruby/test_ast.rb index 8ecd384d583445..8fcd2415a5fa0c 100644 --- a/test/ruby/test_ast.rb +++ b/test/ruby/test_ast.rb @@ -1380,6 +1380,22 @@ def test_when_locations assert_locations(node.children[-1].children[1].locations, [[1, 8, 1, 22], [1, 8, 1, 12], [1, 15, 1, 19]]) end + def test_while_locations + node = RubyVM::AbstractSyntaxTree.parse("while cond do 1 end") + assert_locations(node.children[-1].locations, [[1, 0, 1, 19], [1, 0, 1, 5], [1, 16, 1, 19]]) + + node = RubyVM::AbstractSyntaxTree.parse("1 while 2") + assert_locations(node.children[-1].locations, [[1, 0, 1, 9], [1, 2, 1, 7], nil]) + end + + def test_until_locations + node = RubyVM::AbstractSyntaxTree.parse("until cond do 1 end") + assert_locations(node.children[-1].locations, [[1, 0, 1, 19], [1, 0, 1, 5], [1, 16, 1, 19]]) + + node = RubyVM::AbstractSyntaxTree.parse("1 until 2") + assert_locations(node.children[-1].locations, [[1, 0, 1, 9], [1, 2, 1, 7], nil]) + end + private def assert_locations(locations, expected) ary = locations.map {|loc| loc && [loc.first_lineno, loc.first_column, loc.last_lineno, loc.last_column] } From c37b667774c0c7fc761d974bdec9e4d593781433 Mon Sep 17 00:00:00 2001 From: Yuji Yaginuma Date: Wed, 11 Sep 2024 11:29:17 +0900 Subject: [PATCH 208/829] [rubygems/rubygems] Make an exe file executable when generating new gems Currently, an exe file isn't executable when generating new gems because it doesn't have the correct permission. This PR sets the correct permission same as files under the `bin`. https://github.com/rubygems/rubygems/commit/6509bf128a --- lib/bundler/cli/gem.rb | 5 ++++- spec/bundler/commands/newgem_spec.rb | 3 +++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/bundler/cli/gem.rb b/lib/bundler/cli/gem.rb index a162c213f1997f..fb0a184e5d8026 100644 --- a/lib/bundler/cli/gem.rb +++ b/lib/bundler/cli/gem.rb @@ -191,7 +191,10 @@ def run templates.merge!("standard.yml.tt" => ".standard.yml") end - templates.merge!("exe/newgem.tt" => "exe/#{name}") if config[:exe] + if config[:exe] + templates.merge!("exe/newgem.tt" => "exe/#{name}") + executables.push("exe/#{name}") + end if extension == "c" templates.merge!( diff --git a/spec/bundler/commands/newgem_spec.rb b/spec/bundler/commands/newgem_spec.rb index aa96c331f8ace1..668bc0f95e9c05 100644 --- a/spec/bundler/commands/newgem_spec.rb +++ b/spec/bundler/commands/newgem_spec.rb @@ -681,6 +681,9 @@ def create_temporary_dir(dir) it "builds exe skeleton" do expect(bundled_app("#{gem_name}/exe/#{gem_name}")).to exist + unless Gem.win_platform? + expect(bundled_app("#{gem_name}/exe/#{gem_name}")).to be_executable + end end it "requires the main file" do From 6c16598a72213b492132e3f26bd7ba15a2f7113e Mon Sep 17 00:00:00 2001 From: Ivan Kuchin Date: Wed, 27 Dec 2023 14:16:14 +0100 Subject: [PATCH 209/829] [ruby/pathname] use delete_prefix instead of sub in find method delete_prefix with a string is easier to read than a regular expression also it should be faster. It is available since ruby 2.5 and the gem requires ruby 2.7. https://github.com/ruby/pathname/commit/0070f43f19 --- ext/pathname/lib/pathname.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/pathname/lib/pathname.rb b/ext/pathname/lib/pathname.rb index dc639174d56d66..338b7a3dc05208 100644 --- a/ext/pathname/lib/pathname.rb +++ b/ext/pathname/lib/pathname.rb @@ -572,7 +572,7 @@ def find(ignore_error: true) # :yield: pathname return to_enum(__method__, ignore_error: ignore_error) unless block_given? require 'find' if @path == '.' - Find.find(@path, ignore_error: ignore_error) {|f| yield self.class.new(f.sub(%r{\A\./}, '')) } + Find.find(@path, ignore_error: ignore_error) {|f| yield self.class.new(f.delete_prefix('./')) } else Find.find(@path, ignore_error: ignore_error) {|f| yield self.class.new(f) } end From cb576c13fb15a80fd77b81071cc3a68a340ecb33 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Wed, 11 Sep 2024 14:09:45 +0900 Subject: [PATCH 210/829] Fix duplicate dependency lines exts.mk should deal with cleanings of extensions, including bundled gems. --- template/Makefile.in | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/template/Makefile.in b/template/Makefile.in index b31779be1ea3f9..7e0a02b9094cb8 100644 --- a/template/Makefile.in +++ b/template/Makefile.in @@ -524,9 +524,9 @@ ext/realclean:: ext/realclean.sub .bundle/distclean:: .bundle/distclean.sub .bundle/realclean:: .bundle/realclean.sub -ext/clean.sub:: ext/clean.mk -ext/distclean.sub:: ext/distclean.mk -ext/realclean.sub:: ext/realclean.mk +.bundle/clean.sub:: ext/clean.mk +.bundle/distclean.sub:: ext/distclean.mk +.bundle/realclean.sub:: ext/realclean.mk ext/clean.sub ext/distclean.sub ext/realclean.sub \ .bundle/clean.sub .bundle/distclean.sub .bundle/realclean.sub:: From f7ffa76377ead1760dcb0a84db282facb461ecd7 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Wed, 11 Sep 2024 14:13:30 +0900 Subject: [PATCH 211/829] Clean up clean only extensions The clean targets should clean up all extensions, including those have nothing to build for any reason, e.g., platform requirements etc. --- template/exts.mk.tmpl | 41 ++++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/template/exts.mk.tmpl b/template/exts.mk.tmpl index ac6b280188e39a..0abbca1f067c7f 100644 --- a/template/exts.mk.tmpl +++ b/template/exts.mk.tmpl @@ -22,14 +22,19 @@ end confexts &&= File.read(confexts).scan(/^(?:ext|gem)s: (.*\.mk)/).flatten rescue nil confexts ||= [] macros["old_extensions"] = [] +distclean = [] contpat = /(?>(?>[^\\\n]|\\.)*\\\n)*(?>[^\\\n]|\\.)*/ Dir.glob("{ext,.bundle/gems}/*/exts.mk") do |e| gem = e.start_with?(".bundle/gems/") + dir = File.dirname(e) s = File.read(e) s.scan(/^(extensions|SUBMAKEOPTS|EXT[A-Z]+|MFLAGS|MESSAGE_(?:BEGIN|END)|NOTE_[A-Z]+)[ \t]*=[ \t]*(#{contpat})$/o) do |n, v| v.gsub!(/\\\n[ \t]*/, ' ') - next if v.empty? + if v.empty? + distclean << dir if n == "extensions" + next + end n = "old_extensions" if n == "extensions" and !confexts.include?(e) v = v.split m = macros[n] ||= [] @@ -69,6 +74,10 @@ Dir.glob("{ext,.bundle/gems}/*/exts.mk") do |e| end end deps.uniq! +macros["cleandirs"] = distclean.map {|d| "#{d}/."} +deps.map! {|d| + /\A(?:dist|real)?clean(?=:)/ =~ d ? d + " $(cleandirs:/.=/#{$&})" : d +} # NOTE: Only if extensions are configured as static and dynamic heterogeneously # (e.g. --with-static-linked-ext=foo or ext/Setup can mix static and dynamic @@ -100,7 +109,6 @@ def self.column @erbout[/^.*\z/].scan(/\t|([^\t]+)/) {|s,| w += (s ? s.size : 8 - w % 8)} w end -targets = %w[all static install install-so install-rb clean distclean realclean] objext = RbConfig::CONFIG["OBJEXT"] if gnumake submake = "$(MAKE) -C $(@D)" @@ -145,23 +153,26 @@ ext/extinit.<%=objext%>: % exts = (macros["extensions"] + macros["old_extensions"]) % exts.map! {|e|e.chomp("/.")}.sort -% targets.each do |tgt| +% %w[all static install install-so install-rb].each do |tgt| % exts.each do |d| -% t = "#{d}/#{tgt}" -% if /^(dist|real)?clean$/ =~ tgt -% deps = exts.select {|e|e.start_with?("#{d}/")}.map {|e|"#{e}/#{tgt}"} -% pd = ' ' + deps.join(' ') unless deps.empty? -% else -% pext = File.dirname(d) -% pd = " #{pext}/#{tgt}" if exts.include?(pext) -% end -<%=t%>:<%=pd%> -% if /^(dist|real)clean$/ =~ tgt +% pext = File.dirname(d) +<%=d%>/<%=tgt%>:<% if exts.include?(pext) %> <%=pext%>/<%=tgt%><% end %> + $(Q)<%= submake %><%=mflags%> V=$(V) $(@F) +% end +% end +% distclean = exts | distclean +% %w[clean distclean realclean].each do |tgt| +% distclean.each do |d| +% deps = exts.select {|e|e.start_with?("#{d}/")}.map {|e|"#{e}/#{tgt}"} +<%=d%>/<%=tgt%>:<% unless deps.empty? %> <%=deps.join(' ')%><% end %> +% unless tgt == "clean" $(ECHO) $(@F)ing $(@D) % end +% if exts.include?(d) $(Q)<%= submake %><%=mflags%> V=$(V) $(@F) -% if /^(dist|real)clean$/ =~ tgt - $(Q)$(RM) <%=t[%r[\A(?:\.[^/]+/)?(?:[^/]+/){2}]]%>exts.mk +% end +% unless tgt == "clean" + $(Q)$(RM) <%=d[%r[\A(?:\.[^/]+/)?(?:[^/]+/)?[^/]+]]%>/exts.mk -$(Q)$(RMDIRS) $(@D) % end % end From d03e0d1c35638fcd3b474bf604c855f132356e6d Mon Sep 17 00:00:00 2001 From: ydah Date: Tue, 10 Sep 2024 16:41:27 +0900 Subject: [PATCH 212/829] Implement BREAK, NEXT and REDO NODE locations --- ast.c | 12 ++++++++++++ node_dump.c | 7 +++++-- parse.y | 31 +++++++++++++++++-------------- rubyparser.h | 1 + test/ruby/test_ast.rb | 15 +++++++++++++++ 5 files changed, 50 insertions(+), 16 deletions(-) diff --git a/ast.c b/ast.c index 9219caf6539a92..47e7cf595ec319 100644 --- a/ast.c +++ b/ast.c @@ -783,10 +783,22 @@ node_locations(VALUE ast_value, const NODE *node) return rb_ary_new_from_args(2, location_new(nd_code_loc(node)), location_new(&RNODE_AND(node)->operator_loc)); + case NODE_BREAK: + return rb_ary_new_from_args(2, + location_new(nd_code_loc(node)), + location_new(&RNODE_BREAK(node)->keyword_loc)); + case NODE_NEXT: + return rb_ary_new_from_args(2, + location_new(nd_code_loc(node)), + location_new(&RNODE_NEXT(node)->keyword_loc)); case NODE_OR: return rb_ary_new_from_args(2, location_new(nd_code_loc(node)), location_new(&RNODE_OR(node)->operator_loc)); + case NODE_REDO: + return rb_ary_new_from_args(2, + location_new(nd_code_loc(node)), + location_new(&RNODE_REDO(node)->keyword_loc)); case NODE_UNDEF: return rb_ary_new_from_args(2, location_new(nd_code_loc(node)), diff --git a/node_dump.c b/node_dump.c index 64b0cb8b7fa136..7c2faf3f42f117 100644 --- a/node_dump.c +++ b/node_dump.c @@ -352,15 +352,17 @@ dump_node(VALUE buf, VALUE indent, int comment, const NODE * node) ANN("break statement"); ANN("format: break [nd_stts]"); ANN("example: break 1"); - LAST_NODE; F_NODE(nd_stts, RNODE_BREAK, "value"); + LAST_NODE; + F_LOC(keyword_loc, RNODE_REDO); return; case NODE_NEXT: ANN("next statement"); ANN("format: next [nd_stts]"); ANN("example: next 1"); - LAST_NODE; F_NODE(nd_stts, RNODE_NEXT, "value"); + LAST_NODE; + F_LOC(keyword_loc, RNODE_REDO); return; case NODE_RETURN: ANN("return statement"); @@ -374,6 +376,7 @@ dump_node(VALUE buf, VALUE indent, int comment, const NODE * node) ANN("redo statement"); ANN("format: redo"); ANN("example: redo"); + F_LOC(keyword_loc, RNODE_REDO); return; case NODE_RETRY: diff --git a/parse.y b/parse.y index 69eb37424fbbe7..17ea8fd9e17291 100644 --- a/parse.y +++ b/parse.y @@ -1313,15 +1313,15 @@ struct RNode_DEF_TEMP { #define RNODE_DEF_TEMP(node) ((struct RNode_DEF_TEMP *)(node)) -static rb_node_break_t *rb_node_break_new(struct parser_params *p, NODE *nd_stts, const YYLTYPE *loc); -static rb_node_next_t *rb_node_next_new(struct parser_params *p, NODE *nd_stts, const YYLTYPE *loc); -static rb_node_redo_t *rb_node_redo_new(struct parser_params *p, const YYLTYPE *loc); +static rb_node_break_t *rb_node_break_new(struct parser_params *p, NODE *nd_stts, const YYLTYPE *loc, const YYLTYPE *keyword_loc); +static rb_node_next_t *rb_node_next_new(struct parser_params *p, NODE *nd_stts, const YYLTYPE *loc, const YYLTYPE *keyword_loc); +static rb_node_redo_t *rb_node_redo_new(struct parser_params *p, const YYLTYPE *loc, const YYLTYPE *keyword_loc); static rb_node_def_temp_t *rb_node_def_temp_new(struct parser_params *p, const YYLTYPE *loc); static rb_node_def_temp_t *def_head_save(struct parser_params *p, rb_node_def_temp_t *n); -#define NEW_BREAK(s,loc) (NODE *)rb_node_break_new(p,s,loc) -#define NEW_NEXT(s,loc) (NODE *)rb_node_next_new(p,s,loc) -#define NEW_REDO(loc) (NODE *)rb_node_redo_new(p,loc) +#define NEW_BREAK(s,loc,k_loc) (NODE *)rb_node_break_new(p,s,loc,k_loc) +#define NEW_NEXT(s,loc,k_loc) (NODE *)rb_node_next_new(p,s,loc,k_loc) +#define NEW_REDO(loc,k_loc) (NODE *)rb_node_redo_new(p,loc,k_loc) #define NEW_DEF_TEMP(loc) rb_node_def_temp_new(p,loc) /* Make a new internal node, which should not be appeared in the @@ -3538,14 +3538,14 @@ command : fcall command_args %prec tLOWEST { NODE *args = 0; args = ret_args(p, $2); - $$ = add_block_exit(p, NEW_BREAK(args, &@$)); + $$ = add_block_exit(p, NEW_BREAK(args, &@$, &@1)); /*% ripper: break!($:2) %*/ } | keyword_next call_args { NODE *args = 0; args = ret_args(p, $2); - $$ = add_block_exit(p, NEW_NEXT(args, &@$)); + $$ = add_block_exit(p, NEW_NEXT(args, &@$, &@1)); /*% ripper: next!($:2) %*/ } ; @@ -4701,17 +4701,17 @@ primary : literal } | keyword_break { - $$ = add_block_exit(p, NEW_BREAK(0, &@$)); + $$ = add_block_exit(p, NEW_BREAK(0, &@$, &@1)); /*% ripper: break!(args_new!) %*/ } | keyword_next { - $$ = add_block_exit(p, NEW_NEXT(0, &@$)); + $$ = add_block_exit(p, NEW_NEXT(0, &@$, &@1)); /*% ripper: next!(args_new!) %*/ } | keyword_redo { - $$ = add_block_exit(p, NEW_REDO(&@$)); + $$ = add_block_exit(p, NEW_REDO(&@$, &@1)); /*% ripper: redo! %*/ } | keyword_retry @@ -12468,30 +12468,33 @@ rb_node_error_new(struct parser_params *p, const YYLTYPE *loc) } static rb_node_break_t * -rb_node_break_new(struct parser_params *p, NODE *nd_stts, const YYLTYPE *loc) +rb_node_break_new(struct parser_params *p, NODE *nd_stts, const YYLTYPE *loc, const YYLTYPE *keyword_loc) { rb_node_break_t *n = NODE_NEWNODE(NODE_BREAK, rb_node_break_t, loc); n->nd_stts = nd_stts; n->nd_chain = 0; + n->keyword_loc = *keyword_loc; return n; } static rb_node_next_t * -rb_node_next_new(struct parser_params *p, NODE *nd_stts, const YYLTYPE *loc) +rb_node_next_new(struct parser_params *p, NODE *nd_stts, const YYLTYPE *loc, const YYLTYPE *keyword_loc) { rb_node_next_t *n = NODE_NEWNODE(NODE_NEXT, rb_node_next_t, loc); n->nd_stts = nd_stts; n->nd_chain = 0; + n->keyword_loc = *keyword_loc; return n; } static rb_node_redo_t * -rb_node_redo_new(struct parser_params *p, const YYLTYPE *loc) +rb_node_redo_new(struct parser_params *p, const YYLTYPE *loc, const YYLTYPE *keyword_loc) { rb_node_redo_t *n = NODE_NEWNODE(NODE_REDO, rb_node_redo_t, loc); n->nd_chain = 0; + n->keyword_loc = *keyword_loc; return n; } diff --git a/rubyparser.h b/rubyparser.h index fe134c0bb7b0cf..8168c356e9619c 100644 --- a/rubyparser.h +++ b/rubyparser.h @@ -345,6 +345,7 @@ typedef struct RNode_EXITS { struct RNode *nd_chain; struct RNode *nd_stts; + rb_code_location_t keyword_loc; } rb_node_exits_t, rb_node_break_t, rb_node_next_t, rb_node_redo_t; typedef struct RNode_RETRY { diff --git a/test/ruby/test_ast.rb b/test/ruby/test_ast.rb index 8fcd2415a5fa0c..66a5f0556d6aa1 100644 --- a/test/ruby/test_ast.rb +++ b/test/ruby/test_ast.rb @@ -1343,6 +1343,16 @@ def test_and_locations assert_locations(node.children[-1].locations, [[1, 0, 1, 6], [1, 2, 1, 4]]) end + def test_break_locations + node = RubyVM::AbstractSyntaxTree.parse("loop { break 1 }") + assert_locations(node.children[-1].children[-1].children[-1].locations, [[1, 7, 1, 14], [1, 7, 1, 12]]) + end + + def test_next_locations + node = RubyVM::AbstractSyntaxTree.parse("loop { next 1 }") + assert_locations(node.children[-1].children[-1].children[-1].locations, [[1, 7, 1, 13], [1, 7, 1, 11]]) + end + def test_or_locations node = RubyVM::AbstractSyntaxTree.parse("1 or 2") assert_locations(node.children[-1].locations, [[1, 0, 1, 6], [1, 2, 1, 4]]) @@ -1351,6 +1361,11 @@ def test_or_locations assert_locations(node.children[-1].locations, [[1, 0, 1, 6], [1, 2, 1, 4]]) end + def test_redo_locations + node = RubyVM::AbstractSyntaxTree.parse("loop { redo }") + assert_locations(node.children[-1].children[-1].children[-1].locations, [[1, 7, 1, 11], [1, 7, 1, 11]]) + end + def test_unless_locations node = RubyVM::AbstractSyntaxTree.parse("unless cond then 1 else 2 end") assert_locations(node.children[-1].locations, [[1, 0, 1, 29], [1, 0, 1, 6], [1, 12, 1, 16], [1, 26, 1, 29]]) From 0b11e039d7a38550bf5d93df96081e0bf3df29a4 Mon Sep 17 00:00:00 2001 From: ydah Date: Wed, 11 Sep 2024 16:09:54 +0900 Subject: [PATCH 213/829] Fix wrong NODE name --- node_dump.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/node_dump.c b/node_dump.c index 7c2faf3f42f117..882bf15486a4d0 100644 --- a/node_dump.c +++ b/node_dump.c @@ -354,7 +354,7 @@ dump_node(VALUE buf, VALUE indent, int comment, const NODE * node) ANN("example: break 1"); F_NODE(nd_stts, RNODE_BREAK, "value"); LAST_NODE; - F_LOC(keyword_loc, RNODE_REDO); + F_LOC(keyword_loc, RNODE_BREAK); return; case NODE_NEXT: ANN("next statement"); @@ -362,7 +362,7 @@ dump_node(VALUE buf, VALUE indent, int comment, const NODE * node) ANN("example: next 1"); F_NODE(nd_stts, RNODE_NEXT, "value"); LAST_NODE; - F_LOC(keyword_loc, RNODE_REDO); + F_LOC(keyword_loc, RNODE_NEXT); return; case NODE_RETURN: ANN("return statement"); From 74c3259ce70ae51ca79dea1e607a0284f8d129cf Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Wed, 11 Sep 2024 16:46:12 +0900 Subject: [PATCH 214/829] macOS 10.13(High Sierra) is already EOL --- test/ruby/test_autoload.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/test/ruby/test_autoload.rb b/test/ruby/test_autoload.rb index 1eb3551e57c351..ca3e3d5f7fe8bf 100644 --- a/test/ruby/test_autoload.rb +++ b/test/ruby/test_autoload.rb @@ -277,7 +277,6 @@ def test_bug_13526 # Skip this on macOS 10.13 because of the following error: # http://rubyci.s3.amazonaws.com/osx1013/ruby-master/log/20231011T014505Z.fail.html.gz require "rbconfig" - omit if RbConfig::CONFIG["target_os"] == "darwin17" script = File.join(__dir__, 'bug-13526.rb') assert_ruby_status([script], '', '[ruby-core:81016] [Bug #13526]') From baac5376da6a836397745056b1e2d4f9f5dbac7b Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Wed, 11 Sep 2024 16:52:26 +0900 Subject: [PATCH 215/829] Use macos? helper --- test/-ext-/bug_reporter/test_bug_reporter.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/-ext-/bug_reporter/test_bug_reporter.rb b/test/-ext-/bug_reporter/test_bug_reporter.rb index 8c810c27417581..c7b2a5b3703afd 100644 --- a/test/-ext-/bug_reporter/test_bug_reporter.rb +++ b/test/-ext-/bug_reporter/test_bug_reporter.rb @@ -6,7 +6,7 @@ class TestBugReporter < Test::Unit::TestCase def test_bug_reporter_add - pend "macOS 15 beta is not working with this test" if /darwin/ =~ RUBY_PLATFORM && /15/ =~ `sw_vers -productVersion` + pend "macOS 15 beta is not working with this test" if macos?(15) omit "flaky with RJIT" if JITSupport.rjit_enabled? description = RUBY_DESCRIPTION From 1d768ebd712293e1a3d87e537a0b0d4dbdd7c54e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Thu, 5 Sep 2024 14:22:16 +0200 Subject: [PATCH 216/829] [rubygems/rubygems] The `dsl_path` parameter in DSLError is documented as a string https://github.com/rubygems/rubygems/commit/ab44fa9ee4 --- lib/bundler.rb | 2 +- lib/bundler/dsl.rb | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/bundler.rb b/lib/bundler.rb index e7efeb8fa6086b..9b00610ff0881a 100644 --- a/lib/bundler.rb +++ b/lib/bundler.rb @@ -670,7 +670,7 @@ def eval_gemspec(path, contents) rescue ScriptError, StandardError => e msg = "There was an error while loading `#{path.basename}`: #{e.message}" - raise GemspecError, Dsl::DSLError.new(msg, path, e.backtrace, contents) + raise GemspecError, Dsl::DSLError.new(msg, path.to_s, e.backtrace, contents) end def configure_gem_path diff --git a/lib/bundler/dsl.rb b/lib/bundler/dsl.rb index 6af80fb31f6ddc..095772e5ecbe61 100644 --- a/lib/bundler/dsl.rb +++ b/lib/bundler/dsl.rb @@ -53,7 +53,7 @@ def eval_gemfile(gemfile, contents = nil) "#{e.is_a?(GemfileEvalError) ? "evaluating" : "parsing"} " \ "`#{File.basename gemfile.to_s}`: #{e.message}" - raise DSLError.new(message, gemfile, e.backtrace, contents) + raise DSLError.new(message, gemfile.to_s, e.backtrace, contents) ensure @gemfile = original_gemfile end @@ -577,7 +577,7 @@ def to_s return m unless backtrace && dsl_path && contents - trace_line = backtrace.find {|l| l.include?(dsl_path.to_s) } || trace_line + trace_line = backtrace.find {|l| l.include?(dsl_path) } || trace_line return m unless trace_line line_numer = trace_line.split(":")[1].to_i - 1 return m unless line_numer @@ -603,7 +603,7 @@ def to_s def parse_line_number_from_description description = self.description - if dsl_path && description =~ /((#{Regexp.quote File.expand_path(dsl_path)}|#{Regexp.quote dsl_path.to_s}):\d+)/ + if dsl_path && description =~ /((#{Regexp.quote File.expand_path(dsl_path)}|#{Regexp.quote dsl_path}):\d+)/ trace_line = Regexp.last_match[1] description = description.sub(/\n.*\n(\.\.\.)? *\^~+$/, "").sub(/#{Regexp.quote trace_line}:\s*/, "").sub("\n", " - ") end From f0b9baa2d6c79d5a9f1c23e54ec8bb2cf33a1c18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Thu, 5 Sep 2024 14:04:30 +0200 Subject: [PATCH 217/829] [rubygems/rubygems] Refactor setting current gemfile in DSL https://github.com/rubygems/rubygems/commit/b4ecb66224 --- lib/bundler/dsl.rb | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/lib/bundler/dsl.rb b/lib/bundler/dsl.rb index 095772e5ecbe61..44b8f378d1e94b 100644 --- a/lib/bundler/dsl.rb +++ b/lib/bundler/dsl.rb @@ -42,20 +42,16 @@ def initialize end def eval_gemfile(gemfile, contents = nil) - expanded_gemfile_path = Pathname.new(gemfile).expand_path(@gemfile&.parent) - original_gemfile = @gemfile - @gemfile = expanded_gemfile_path - @gemfiles << expanded_gemfile_path - contents ||= Bundler.read_file(@gemfile.to_s) - instance_eval(contents, @gemfile.to_s, 1) - rescue Exception => e # rubocop:disable Lint/RescueException - message = "There was an error " \ - "#{e.is_a?(GemfileEvalError) ? "evaluating" : "parsing"} " \ - "`#{File.basename gemfile.to_s}`: #{e.message}" - - raise DSLError.new(message, gemfile.to_s, e.backtrace, contents) - ensure - @gemfile = original_gemfile + with_gemfile(gemfile) do |current_gemfile| + contents ||= Bundler.read_file(current_gemfile) + instance_eval(contents, current_gemfile, 1) + rescue Exception => e # rubocop:disable Lint/RescueException + message = "There was an error " \ + "#{e.is_a?(GemfileEvalError) ? "evaluating" : "parsing"} " \ + "`#{File.basename current_gemfile}`: #{e.message}" + + raise DSLError.new(message, current_gemfile, e.backtrace, contents) + end end def gemspec(opts = nil) @@ -285,6 +281,16 @@ def check_primary_source_safety private + def with_gemfile(gemfile) + expanded_gemfile_path = Pathname.new(gemfile).expand_path(@gemfile&.parent) + original_gemfile = @gemfile + @gemfile = expanded_gemfile_path + @gemfiles << expanded_gemfile_path + yield @gemfile.to_s + ensure + @gemfile = original_gemfile + end + def add_git_sources git_source(:github) do |repo_name| if repo_name =~ GITHUB_PULL_REQUEST_URL From 1d72b3bd1a1ebaaca89b50a8b6f391b7358c0986 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Thu, 5 Sep 2024 16:12:46 +0200 Subject: [PATCH 218/829] [rubygems/rubygems] Don't rescue Exception when evaluating Gemfile Things like OOM, or StackOverflow should be raised immediately. https://github.com/rubygems/rubygems/commit/11691ce492 --- lib/bundler/dsl.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/bundler/dsl.rb b/lib/bundler/dsl.rb index 44b8f378d1e94b..000afebbbc85fc 100644 --- a/lib/bundler/dsl.rb +++ b/lib/bundler/dsl.rb @@ -45,7 +45,7 @@ def eval_gemfile(gemfile, contents = nil) with_gemfile(gemfile) do |current_gemfile| contents ||= Bundler.read_file(current_gemfile) instance_eval(contents, current_gemfile, 1) - rescue Exception => e # rubocop:disable Lint/RescueException + rescue StandardError, ScriptError => e message = "There was an error " \ "#{e.is_a?(GemfileEvalError) ? "evaluating" : "parsing"} " \ "`#{File.basename current_gemfile}`: #{e.message}" From 89eba5074e8ffc28a54646d40f6915d279be367d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Thu, 5 Sep 2024 20:07:51 +0200 Subject: [PATCH 219/829] [rubygems/rubygems] Only raise DSLError during Gemfile parsing when it's actually useful DSLError prints the specific line in a Gemfile where the error was raised. That's helpful when the error was explicitly raised by the Gemfile DSL or, in the case it's implicitly raised, when the offending code lives right in the Gemfile. If it's an internal error, or something buried dowm in user code called from the Gemfile, `DSLError` is not helpful since it hides the actual culprit. This commit tries to only raise `DSLError` in the cases mentioned above and otherwise let the original error be raised. https://github.com/rubygems/rubygems/commit/b30ff5a682 --- lib/bundler/dsl.rb | 16 ++++++++++------ lib/bundler/errors.rb | 2 ++ lib/bundler/ruby_version.rb | 8 +++++++- spec/bundler/bundler/ruby_dsl_spec.rb | 4 ++-- spec/bundler/install/gemfile_spec.rb | 25 +++++++++++++++++++++++++ 5 files changed, 46 insertions(+), 9 deletions(-) diff --git a/lib/bundler/dsl.rb b/lib/bundler/dsl.rb index 000afebbbc85fc..aad87596529757 100644 --- a/lib/bundler/dsl.rb +++ b/lib/bundler/dsl.rb @@ -45,11 +45,15 @@ def eval_gemfile(gemfile, contents = nil) with_gemfile(gemfile) do |current_gemfile| contents ||= Bundler.read_file(current_gemfile) instance_eval(contents, current_gemfile, 1) - rescue StandardError, ScriptError => e - message = "There was an error " \ - "#{e.is_a?(GemfileEvalError) ? "evaluating" : "parsing"} " \ - "`#{File.basename current_gemfile}`: #{e.message}" - + rescue GemfileEvalError => e + message = "There was an error evaluating `#{File.basename current_gemfile}`: #{e.message}" + raise DSLError.new(message, current_gemfile, e.backtrace, contents) + rescue GemfileError, InvalidArgumentError, InvalidOption, DeprecatedError, ScriptError => e + message = "There was an error parsing `#{File.basename current_gemfile}`: #{e.message}" + raise DSLError.new(message, current_gemfile, e.backtrace, contents) + rescue StandardError => e + raise unless e.backtrace_locations.first.path == current_gemfile + message = "There was an error parsing `#{File.basename current_gemfile}`: #{e.message}" raise DSLError.new(message, current_gemfile, e.backtrace, contents) end end @@ -215,7 +219,7 @@ def git(uri, options = {}, &blk) end def github(repo, options = {}) - raise ArgumentError, "GitHub sources require a block" unless block_given? + raise InvalidArgumentError, "GitHub sources require a block" unless block_given? github_uri = @git_sources["github"].call(repo) git_options = normalize_hash(options).merge("uri" => github_uri) git_source = @sources.add_git_source(git_options) diff --git a/lib/bundler/errors.rb b/lib/bundler/errors.rb index 35b5a55038e489..a0ce739ad7c64d 100644 --- a/lib/bundler/errors.rb +++ b/lib/bundler/errors.rb @@ -244,4 +244,6 @@ def message status_code(39) end + + class InvalidArgumentError < BundlerError; status_code(40); end end diff --git a/lib/bundler/ruby_version.rb b/lib/bundler/ruby_version.rb index 7e9e072b83cf10..0ed5cbc6cacfa2 100644 --- a/lib/bundler/ruby_version.rb +++ b/lib/bundler/ruby_version.rb @@ -23,7 +23,13 @@ def initialize(versions, patchlevel, engine, engine_version) # specified must match the version. @versions = Array(versions).map do |v| - op, v = Gem::Requirement.parse(normalize_version(v)) + normalized_v = normalize_version(v) + + unless Gem::Requirement::PATTERN.match?(normalized_v) + raise InvalidArgumentError, "#{v} is not a valid requirement on the Ruby version" + end + + op, v = Gem::Requirement.parse(normalized_v) op == "=" ? v.to_s : "#{op} #{v}" end diff --git a/spec/bundler/bundler/ruby_dsl_spec.rb b/spec/bundler/bundler/ruby_dsl_spec.rb index 384ac4b8b23a2b..c5ebbdf4dba62c 100644 --- a/spec/bundler/bundler/ruby_dsl_spec.rb +++ b/spec/bundler/bundler/ruby_dsl_spec.rb @@ -80,7 +80,7 @@ class MockDSL context "with two requirements in the same string" do let(:ruby_version) { ">= 2.0.0, < 3.0" } it "raises an error" do - expect { subject }.to raise_error(ArgumentError) + expect { subject }.to raise_error(Bundler::InvalidArgumentError) end end @@ -168,7 +168,7 @@ class MockDSL let(:file_content) { "ruby-#{version}@gemset\n" } it "raises an error" do - expect { subject }.to raise_error(Gem::Requirement::BadRequirementError, "Illformed requirement [\"#{version}@gemset\"]") + expect { subject }.to raise_error(Bundler::InvalidArgumentError, "2.0.0@gemset is not a valid requirement on the Ruby version") end end diff --git a/spec/bundler/install/gemfile_spec.rb b/spec/bundler/install/gemfile_spec.rb index 0539733d5dfe5a..96ed174e9bf7f9 100644 --- a/spec/bundler/install/gemfile_spec.rb +++ b/spec/bundler/install/gemfile_spec.rb @@ -66,6 +66,31 @@ end end + context "when an internal error happens" do + let(:bundler_bug) do + create_file("bundler_bug.rb", <<~RUBY) + require "bundler" + + module Bundler + class Dsl + def source(source, *args, &blk) + nil.name + end + end + end + RUBY + + bundled_app("bundler_bug.rb").to_s + end + + it "shows culprit file and line" do + skip "ruby-core test setup has always \"lib\" in $LOAD_PATH so `require \"bundler\"` always activates the local version rather than using RubyGems gem activation stuff, causing conflicts" if ruby_core? + + install_gemfile "source 'https://gem.repo1'", requires: [bundler_bug], artifice: nil, raise_on_error: false + expect(err).to include("bundler_bug.rb:6") + end + end + context "with engine specified in symbol", :jruby_only do it "does not raise any error parsing Gemfile" do install_gemfile <<-G From e52d4d462f9b4d10f6d29a69058c5117399c968e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Thu, 29 Aug 2024 14:24:00 +0200 Subject: [PATCH 220/829] [rubygems/rubygems] Fix `bundle exec rake install` failing when local gem has extensions and `gemspec` DSL is being used In a `bundle exec` context, the local specification will actually be part of the known specifications, so RubyGems will assume it has already been installed, which is not actually true. This will cause `RequestSet` to rebuild extensions for a gem that's not actually installed, causing errors. The fix is to make sure detection of installed activation requests considers not only that there's a known spec with the same full name as the one being installed, but also that this spec is installed in the same gem_home were pretend to install the new gem. https://github.com/rubygems/rubygems/commit/a8ef1286a6 --- lib/bundler/rubygems_ext.rb | 19 +++++++ lib/rubygems/resolver/activation_request.rb | 2 +- spec/bundler/runtime/gem_tasks_spec.rb | 59 ++++++++++++++++++++- 3 files changed, 78 insertions(+), 2 deletions(-) diff --git a/lib/bundler/rubygems_ext.rb b/lib/bundler/rubygems_ext.rb index 79bea01e6e2e84..481587df865dc2 100644 --- a/lib/bundler/rubygems_ext.rb +++ b/lib/bundler/rubygems_ext.rb @@ -407,4 +407,23 @@ def lock_name end end end + + unless Gem.rubygems_version >= Gem::Version.new("3.5.19") + class Resolver::ActivationRequest + remove_method :installed? + + def installed? + case @spec + when Gem::Resolver::VendorSpecification then + true + else + this_spec = full_spec + + Gem::Specification.any? do |s| + s == this_spec && s.base_dir == this_spec.base_dir + end + end + end + end + end end diff --git a/lib/rubygems/resolver/activation_request.rb b/lib/rubygems/resolver/activation_request.rb index fc9ff58f5796f0..5c722001b1ae64 100644 --- a/lib/rubygems/resolver/activation_request.rb +++ b/lib/rubygems/resolver/activation_request.rb @@ -106,7 +106,7 @@ def installed? this_spec = full_spec Gem::Specification.any? do |s| - s == this_spec + s == this_spec && s.base_dir == this_spec.base_dir end end end diff --git a/spec/bundler/runtime/gem_tasks_spec.rb b/spec/bundler/runtime/gem_tasks_spec.rb index 1dffbd5c92354f..046300391b26cc 100644 --- a/spec/bundler/runtime/gem_tasks_spec.rb +++ b/spec/bundler/runtime/gem_tasks_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true RSpec.describe "require 'bundler/gem_tasks'" do - before :each do + let(:define_local_gem_using_gem_tasks) do bundled_app("foo.gemspec").open("w") do |f| f.write <<-GEMSPEC Gem::Specification.new do |s| @@ -26,7 +26,46 @@ G end + let(:define_local_gem_with_extensions_using_gem_tasks_and_gemspec_dsl) do + bundled_app("foo.gemspec").open("w") do |f| + f.write <<-GEMSPEC + Gem::Specification.new do |s| + s.name = "foo" + s.version = "1.0" + s.summary = "dummy" + s.author = "Perry Mason" + s.extensions = "ext/extconf.rb" + end + GEMSPEC + end + + bundled_app("Rakefile").open("w") do |f| + f.write <<-RAKEFILE + require "bundler/gem_tasks" + RAKEFILE + end + + Dir.mkdir bundled_app("ext") + + bundled_app("ext/extconf.rb").open("w") do |f| + f.write <<-EXTCONF + require "mkmf" + File.write("Makefile", dummy_makefile($srcdir).join) + EXTCONF + end + + install_gemfile <<-G + source "https://gem.repo1" + + gemspec + + gem "rake" + G + end + it "includes the relevant tasks" do + define_local_gem_using_gem_tasks + with_gem_path_as(base_system_gem_path.to_s) do sys_exec "#{rake} -T", env: { "GEM_HOME" => system_gem_path.to_s } end @@ -44,6 +83,8 @@ end it "defines a working `rake install` task", :ruby_repo do + define_local_gem_using_gem_tasks + with_gem_path_as(base_system_gem_path.to_s) do sys_exec "#{rake} install", env: { "GEM_HOME" => system_gem_path.to_s } end @@ -55,8 +96,18 @@ expect(err).to be_empty end + it "defines a working `rake install` task for local gems with extensions", :ruby_repo do + define_local_gem_with_extensions_using_gem_tasks_and_gemspec_dsl + + bundle "exec rake install" + + expect(err).to be_empty + end + context "rake build when path has spaces", :ruby_repo do before do + define_local_gem_using_gem_tasks + spaced_bundled_app = tmp("bundled app") FileUtils.cp_r bundled_app, spaced_bundled_app bundle "exec rake build", dir: spaced_bundled_app @@ -69,6 +120,8 @@ context "rake build when path has brackets", :ruby_repo do before do + define_local_gem_using_gem_tasks + bracketed_bundled_app = tmp("bundled[app") FileUtils.cp_r bundled_app, bracketed_bundled_app bundle "exec rake build", dir: bracketed_bundled_app @@ -81,6 +134,8 @@ context "bundle path configured locally" do before do + define_local_gem_using_gem_tasks + bundle "config set path vendor/bundle" end @@ -98,6 +153,8 @@ end it "adds 'pkg' to rake/clean's CLOBBER" do + define_local_gem_using_gem_tasks + with_gem_path_as(base_system_gem_path.to_s) do sys_exec %(#{rake} -e 'load "Rakefile"; puts CLOBBER.inspect'), env: { "GEM_HOME" => system_gem_path.to_s } end From 3aeb9c75bd521e0fd8f7df63a27b70e4c10a952e Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Wed, 11 Sep 2024 07:14:30 -0500 Subject: [PATCH 221/829] [DOC] Related for Array#delete_if --- array.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/array.c b/array.c index 35ec990e3d1fe7..7428fffaffa7c9 100644 --- a/array.c +++ b/array.c @@ -4406,6 +4406,8 @@ rb_ary_reject(VALUE ary) * a.delete_if {|element| element.to_s.start_with?('b') } # => [:foo, 2] * * With no block given, returns a new Enumerator. + * + * Related: see {Methods for Deleting}[rdoc-ref:Array@Methods+for+Deleting]. */ static VALUE From c7e186211665691ca9cdb4ae07cf76fbd3df1af8 Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Wed, 11 Sep 2024 07:07:08 -0500 Subject: [PATCH 222/829] [DOC] Tweaks for Array#delete_at --- array.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/array.c b/array.c index 7428fffaffa7c9..dd49c3b4f8a954 100644 --- a/array.c +++ b/array.c @@ -4128,9 +4128,9 @@ rb_ary_delete_at(VALUE ary, long pos) /* * call-seq: - * delete_at(index) -> deleted_object or nil + * delete_at(index) -> removed_object or nil * - * Deletes the element of +self+ at the given +index+, which must be an + * Removes the element of +self+ at the given +index+, which must be an * {integer-convertible object}[rdoc-ref:implicit_conversion.rdoc@Integer-Convertible+Objects]. * * When +index+ is non-negative, deletes the element at offset +index+: @@ -4151,6 +4151,7 @@ rb_ary_delete_at(VALUE ary, long pos) * a.delete_at(3) # => nil * a.delete_at(-4) # => nil * + * Related: see {Methods for Deleting}[rdoc-ref:Array@Methods+for+Deleting]. */ static VALUE From 309362d6c51f731a9a42157c40bc94dca86f8f77 Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Wed, 11 Sep 2024 07:34:52 -0500 Subject: [PATCH 223/829] [DOC] Tweaks for Array#dig --- array.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/array.c b/array.c index dd49c3b4f8a954..2103e502b6eb2f 100644 --- a/array.c +++ b/array.c @@ -8031,9 +8031,9 @@ rb_ary_one_p(int argc, VALUE *argv, VALUE ary) * call-seq: * array.dig(index, *identifiers) -> object * - * Finds and returns the object in nested objects - * that is specified by +index+ and +identifiers+. - * The nested objects may be instances of various classes. + * Finds and returns the object in nested object + * specified by +index+ and +identifiers+; + * the nested objects may be instances of various classes. * See {Dig Methods}[rdoc-ref:dig_methods.rdoc]. * * Examples: @@ -8044,6 +8044,7 @@ rb_ary_one_p(int argc, VALUE *argv, VALUE ary) * a.dig(1, 2, 0) # => :bat * a.dig(1, 2, 3) # => nil * + * Related: see {Methods for Fetching}[rdoc-ref:Array@Methods+for+Fetching]. */ static VALUE From 0906b1627766efa65e5c4fc2ea15a2337ec0cef0 Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Wed, 11 Sep 2024 07:43:42 -0500 Subject: [PATCH 224/829] [DOC] Tweaks for Array#drop --- array.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/array.c b/array.c index 2103e502b6eb2f..7388c3a771e7b6 100644 --- a/array.c +++ b/array.c @@ -7697,9 +7697,9 @@ rb_ary_take_while(VALUE ary) /* * call-seq: - * array.drop(n) -> new_array + * drop(n) -> new_array * - * Returns a new +Array+ containing all but the first +n+ element of +self+, + * Returns a new array containing all but the first +n+ element of +self+, * where +n+ is a non-negative Integer; * does not modify +self+. * @@ -7709,7 +7709,9 @@ rb_ary_take_while(VALUE ary) * a.drop(0) # => [0, 1, 2, 3, 4, 5] * a.drop(1) # => [1, 2, 3, 4, 5] * a.drop(2) # => [2, 3, 4, 5] + * a.drop(9) # => [] * + * Related: see {Methods for Fetching}[rdoc-ref:Array@Methods+for+Fetching]. */ static VALUE From 7facf2323206e244b53d3771a857a8f677d2ab3e Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Tue, 10 Sep 2024 15:35:29 -0400 Subject: [PATCH 225/829] [DOC] Related for Array#compact --- array.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/array.c b/array.c index 7388c3a771e7b6..920eda4d702c62 100644 --- a/array.c +++ b/array.c @@ -6358,7 +6358,8 @@ rb_ary_compact_bang(VALUE ary) * a = [nil, 0, nil, false, nil, '', nil, [], nil, {}] * a.compact # => [0, false, "", [], {}] * - * Related: Array#compact!. + * Related: Array#compact!; + * see also {Methods for Deleting}[rdoc-ref:Array@Methods+for+Deleting]. */ static VALUE From 886fc69b1cfb20141608eb1f461b93e5a5464cf9 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Wed, 11 Sep 2024 10:42:08 -0400 Subject: [PATCH 226/829] [ruby/prism] Parse tempfile https://github.com/ruby/prism/commit/31154a389a --- prism/util/pm_string.c | 4 ++-- test/prism/api/parse_test.rb | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/prism/util/pm_string.c b/prism/util/pm_string.c index 0a67accd866f7d..4bd3dd8ef2eeaa 100644 --- a/prism/util/pm_string.c +++ b/prism/util/pm_string.c @@ -62,7 +62,7 @@ PRISM_EXPORTED_FUNCTION bool pm_string_mapped_init(pm_string_t *string, const char *filepath) { #ifdef _WIN32 // Open the file for reading. - HANDLE file = CreateFile(filepath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + HANDLE file = CreateFile(filepath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL); if (file == INVALID_HANDLE_VALUE) { return false; @@ -156,7 +156,7 @@ PRISM_EXPORTED_FUNCTION bool pm_string_file_init(pm_string_t *string, const char *filepath) { #ifdef _WIN32 // Open the file for reading. - HANDLE file = CreateFile(filepath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + HANDLE file = CreateFile(filepath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL); if (file == INVALID_HANDLE_VALUE) { return false; diff --git a/test/prism/api/parse_test.rb b/test/prism/api/parse_test.rb index dda0d6959ce51c..2e9722f5dac340 100644 --- a/test/prism/api/parse_test.rb +++ b/test/prism/api/parse_test.rb @@ -61,6 +61,14 @@ def test_parse_file end end + def test_parse_tempfile + Tempfile.create(["test_parse_tempfile", ".rb"]) do |t| + t.puts ["begin\n", " end\n"] + t.flush + Prism.parse_file(t.path) + end + end + private def find_source_file_node(program) From 1be9a99837171fa7ec9b40d216f5a86f39bfaa27 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Wed, 11 Sep 2024 12:29:13 -0400 Subject: [PATCH 227/829] [ruby/prism] Add a flag for arguments that contain forwarding https://github.com/ruby/prism/commit/ebd2889bee --- prism/config.yml | 10 ++++++---- prism/prism.c | 1 + test/prism/snapshots/methods.txt | 8 ++++---- .../seattlerb/defn_arg_forward_args.txt | 2 +- .../seattlerb/defn_args_forward_args.txt | 2 +- .../snapshots/seattlerb/defn_forward_args.txt | 2 +- .../seattlerb/defn_forward_args__no_parens.txt | 2 +- .../endless_method_forwarded_args_legacy.txt | 2 +- test/prism/snapshots/whitequark/forward_arg.txt | 2 +- .../whitequark/forward_arg_with_open_args.txt | 16 ++++++++-------- .../snapshots/whitequark/forward_args_legacy.txt | 4 ++-- .../whitequark/trailing_forward_arg.txt | 2 +- 12 files changed, 28 insertions(+), 25 deletions(-) diff --git a/prism/config.yml b/prism/config.yml index 585d17a4c6c789..1c00ef145b7fbb 100644 --- a/prism/config.yml +++ b/prism/config.yml @@ -647,14 +647,16 @@ tokens: flags: - name: ArgumentsNodeFlags values: + - name: CONTAINS_FORWARDING + comment: "if the arguments contain forwarding" - name: CONTAINS_KEYWORDS - comment: "if arguments contain keywords" + comment: "if the arguments contain keywords" - name: CONTAINS_KEYWORD_SPLAT - comment: "if arguments contain keyword splat" + comment: "if the arguments contain a keyword splat" - name: CONTAINS_SPLAT - comment: "if arguments contain splat" + comment: "if the arguments contain a splat" - name: CONTAINS_MULTIPLE_SPLATS - comment: "if arguments contain multiple splats" + comment: "if the arguments contain multiple splats" comment: Flags for arguments nodes. - name: ArrayNodeFlags values: diff --git a/prism/prism.c b/prism/prism.c index 43ce5df37197c7..0dcc4afe5d623b 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -14180,6 +14180,7 @@ parse_arguments(pm_parser_t *parser, pm_arguments_t *arguments, bool accepts_for argument = (pm_node_t *) pm_forwarding_arguments_node_create(parser, &parser->previous); parse_arguments_append(parser, arguments, argument); + pm_node_flag_set((pm_node_t *) arguments->arguments, PM_ARGUMENTS_NODE_FLAGS_CONTAINS_FORWARDING); arguments->has_forwarding = true; parsed_forwarding_arguments = true; break; diff --git a/test/prism/snapshots/methods.txt b/test/prism/snapshots/methods.txt index af2defcb9744a1..0780999142ffbe 100644 --- a/test/prism/snapshots/methods.txt +++ b/test/prism/snapshots/methods.txt @@ -1086,7 +1086,7 @@ │ │ ├── opening_loc: (112,13)-(112,14) = "(" │ │ ├── arguments: │ │ │ @ ArgumentsNode (location: (112,14)-(112,17)) - │ │ │ ├── flags: ∅ + │ │ │ ├── flags: contains_forwarding │ │ │ └── arguments: (length: 1) │ │ │ └── @ ForwardingArgumentsNode (location: (112,14)-(112,17)) │ │ │ └── flags: ∅ @@ -1129,7 +1129,7 @@ │ │ ├── opening_loc: (114,13)-(114,14) = "(" │ │ ├── arguments: │ │ │ @ ArgumentsNode (location: (114,14)-(114,23)) - │ │ │ ├── flags: ∅ + │ │ │ ├── flags: contains_forwarding │ │ │ └── arguments: (length: 3) │ │ │ ├── @ IntegerNode (location: (114,14)-(114,15)) │ │ │ │ ├── flags: static_literal, decimal @@ -1382,7 +1382,7 @@ │ │ │ │ ├── opening_loc: (136,19)-(136,20) = "(" │ │ │ │ ├── arguments: │ │ │ │ │ @ ArgumentsNode (location: (136,20)-(136,23)) - │ │ │ │ │ ├── flags: ∅ + │ │ │ │ │ ├── flags: contains_forwarding │ │ │ │ │ └── arguments: (length: 1) │ │ │ │ │ └── @ ForwardingArgumentsNode (location: (136,20)-(136,23)) │ │ │ │ │ └── flags: ∅ @@ -2095,7 +2095,7 @@ │ │ ├── opening_loc: (178,5)-(178,6) = "(" │ │ ├── arguments: │ │ │ @ ArgumentsNode (location: (178,6)-(178,9)) - │ │ │ ├── flags: ∅ + │ │ │ ├── flags: contains_forwarding │ │ │ └── arguments: (length: 1) │ │ │ └── @ ForwardingArgumentsNode (location: (178,6)-(178,9)) │ │ │ └── flags: ∅ diff --git a/test/prism/snapshots/seattlerb/defn_arg_forward_args.txt b/test/prism/snapshots/seattlerb/defn_arg_forward_args.txt index 905978bc2f165c..ababd94b111292 100644 --- a/test/prism/snapshots/seattlerb/defn_arg_forward_args.txt +++ b/test/prism/snapshots/seattlerb/defn_arg_forward_args.txt @@ -38,7 +38,7 @@ │ ├── opening_loc: (1,16)-(1,17) = "(" │ ├── arguments: │ │ @ ArgumentsNode (location: (1,17)-(1,23)) - │ │ ├── flags: ∅ + │ │ ├── flags: contains_forwarding │ │ └── arguments: (length: 2) │ │ ├── @ LocalVariableReadNode (location: (1,17)-(1,18)) │ │ │ ├── flags: ∅ diff --git a/test/prism/snapshots/seattlerb/defn_args_forward_args.txt b/test/prism/snapshots/seattlerb/defn_args_forward_args.txt index ca03f79d57d5e9..d689049433afc3 100644 --- a/test/prism/snapshots/seattlerb/defn_args_forward_args.txt +++ b/test/prism/snapshots/seattlerb/defn_args_forward_args.txt @@ -44,7 +44,7 @@ │ ├── opening_loc: (1,22)-(1,23) = "(" │ ├── arguments: │ │ @ ArgumentsNode (location: (1,23)-(1,35)) - │ │ ├── flags: ∅ + │ │ ├── flags: contains_forwarding │ │ └── arguments: (length: 3) │ │ ├── @ SymbolNode (location: (1,23)-(1,27)) │ │ │ ├── flags: static_literal, forced_us_ascii_encoding diff --git a/test/prism/snapshots/seattlerb/defn_forward_args.txt b/test/prism/snapshots/seattlerb/defn_forward_args.txt index 50fc32c0473c43..58a97028c6c5d4 100644 --- a/test/prism/snapshots/seattlerb/defn_forward_args.txt +++ b/test/prism/snapshots/seattlerb/defn_forward_args.txt @@ -35,7 +35,7 @@ │ ├── opening_loc: (1,13)-(1,14) = "(" │ ├── arguments: │ │ @ ArgumentsNode (location: (1,14)-(1,17)) - │ │ ├── flags: ∅ + │ │ ├── flags: contains_forwarding │ │ └── arguments: (length: 1) │ │ └── @ ForwardingArgumentsNode (location: (1,14)-(1,17)) │ │ └── flags: ∅ diff --git a/test/prism/snapshots/seattlerb/defn_forward_args__no_parens.txt b/test/prism/snapshots/seattlerb/defn_forward_args__no_parens.txt index 8926f2cdf18d4b..5d8e09f6c04f6e 100644 --- a/test/prism/snapshots/seattlerb/defn_forward_args__no_parens.txt +++ b/test/prism/snapshots/seattlerb/defn_forward_args__no_parens.txt @@ -35,7 +35,7 @@ │ ├── opening_loc: (2,3)-(2,4) = "(" │ ├── arguments: │ │ @ ArgumentsNode (location: (2,4)-(2,7)) - │ │ ├── flags: ∅ + │ │ ├── flags: contains_forwarding │ │ └── arguments: (length: 1) │ │ └── @ ForwardingArgumentsNode (location: (2,4)-(2,7)) │ │ └── flags: ∅ diff --git a/test/prism/snapshots/whitequark/endless_method_forwarded_args_legacy.txt b/test/prism/snapshots/whitequark/endless_method_forwarded_args_legacy.txt index 5927016b2650fe..eaa10610077355 100644 --- a/test/prism/snapshots/whitequark/endless_method_forwarded_args_legacy.txt +++ b/test/prism/snapshots/whitequark/endless_method_forwarded_args_legacy.txt @@ -35,7 +35,7 @@ │ ├── opening_loc: (1,18)-(1,19) = "(" │ ├── arguments: │ │ @ ArgumentsNode (location: (1,19)-(1,22)) - │ │ ├── flags: ∅ + │ │ ├── flags: contains_forwarding │ │ └── arguments: (length: 1) │ │ └── @ ForwardingArgumentsNode (location: (1,19)-(1,22)) │ │ └── flags: ∅ diff --git a/test/prism/snapshots/whitequark/forward_arg.txt b/test/prism/snapshots/whitequark/forward_arg.txt index b8c22d08f2db34..3879314fa89d88 100644 --- a/test/prism/snapshots/whitequark/forward_arg.txt +++ b/test/prism/snapshots/whitequark/forward_arg.txt @@ -35,7 +35,7 @@ │ ├── opening_loc: (1,17)-(1,18) = "(" │ ├── arguments: │ │ @ ArgumentsNode (location: (1,18)-(1,21)) - │ │ ├── flags: ∅ + │ │ ├── flags: contains_forwarding │ │ └── arguments: (length: 1) │ │ └── @ ForwardingArgumentsNode (location: (1,18)-(1,21)) │ │ └── flags: ∅ diff --git a/test/prism/snapshots/whitequark/forward_arg_with_open_args.txt b/test/prism/snapshots/whitequark/forward_arg_with_open_args.txt index 20c8486276b9d4..ea36abae7eadcf 100644 --- a/test/prism/snapshots/whitequark/forward_arg_with_open_args.txt +++ b/test/prism/snapshots/whitequark/forward_arg_with_open_args.txt @@ -41,7 +41,7 @@ │ │ │ ├── opening_loc: (2,5)-(2,6) = "(" │ │ │ ├── arguments: │ │ │ │ @ ArgumentsNode (location: (2,6)-(2,9)) - │ │ │ │ ├── flags: ∅ + │ │ │ │ ├── flags: contains_forwarding │ │ │ │ └── arguments: (length: 1) │ │ │ │ └── @ ForwardingArgumentsNode (location: (2,6)-(2,9)) │ │ │ │ └── flags: ∅ @@ -92,7 +92,7 @@ │ │ │ ├── opening_loc: (5,17)-(5,18) = "(" │ │ │ ├── arguments: │ │ │ │ @ ArgumentsNode (location: (5,18)-(5,21)) - │ │ │ │ ├── flags: ∅ + │ │ │ │ ├── flags: contains_forwarding │ │ │ │ └── arguments: (length: 1) │ │ │ │ └── @ ForwardingArgumentsNode (location: (5,18)-(5,21)) │ │ │ │ └── flags: ∅ @@ -162,7 +162,7 @@ │ │ ├── opening_loc: (10,16)-(10,17) = "(" │ │ ├── arguments: │ │ │ @ ArgumentsNode (location: (10,17)-(10,20)) - │ │ │ ├── flags: ∅ + │ │ │ ├── flags: contains_forwarding │ │ │ └── arguments: (length: 1) │ │ │ └── @ ForwardingArgumentsNode (location: (10,17)-(10,20)) │ │ │ └── flags: ∅ @@ -208,7 +208,7 @@ │ │ ├── opening_loc: (13,5)-(13,6) = "(" │ │ ├── arguments: │ │ │ @ ArgumentsNode (location: (13,6)-(13,9)) - │ │ │ ├── flags: ∅ + │ │ │ ├── flags: contains_forwarding │ │ │ └── arguments: (length: 1) │ │ │ └── @ ForwardingArgumentsNode (location: (13,6)-(13,9)) │ │ │ └── flags: ∅ @@ -254,7 +254,7 @@ │ │ ├── opening_loc: (16,19)-(16,20) = "(" │ │ ├── arguments: │ │ │ @ ArgumentsNode (location: (16,20)-(16,23)) - │ │ │ ├── flags: ∅ + │ │ │ ├── flags: contains_forwarding │ │ │ └── arguments: (length: 1) │ │ │ └── @ ForwardingArgumentsNode (location: (16,20)-(16,23)) │ │ │ └── flags: ∅ @@ -343,7 +343,7 @@ │ │ ├── opening_loc: (22,5)-(22,6) = "(" │ │ ├── arguments: │ │ │ @ ArgumentsNode (location: (22,6)-(22,9)) - │ │ │ ├── flags: ∅ + │ │ │ ├── flags: contains_forwarding │ │ │ └── arguments: (length: 1) │ │ │ └── @ ForwardingArgumentsNode (location: (22,6)-(22,9)) │ │ │ └── flags: ∅ @@ -395,7 +395,7 @@ │ │ ├── opening_loc: (25,23)-(25,24) = "(" │ │ ├── arguments: │ │ │ @ ArgumentsNode (location: (25,24)-(25,27)) - │ │ │ ├── flags: ∅ + │ │ │ ├── flags: contains_forwarding │ │ │ └── arguments: (length: 1) │ │ │ └── @ ForwardingArgumentsNode (location: (25,24)-(25,27)) │ │ │ └── flags: ∅ @@ -441,7 +441,7 @@ │ ├── opening_loc: (27,19)-(27,20) = "(" │ ├── arguments: │ │ @ ArgumentsNode (location: (27,20)-(27,23)) - │ │ ├── flags: ∅ + │ │ ├── flags: contains_forwarding │ │ └── arguments: (length: 1) │ │ └── @ ForwardingArgumentsNode (location: (27,20)-(27,23)) │ │ └── flags: ∅ diff --git a/test/prism/snapshots/whitequark/forward_args_legacy.txt b/test/prism/snapshots/whitequark/forward_args_legacy.txt index 6fd9c536e35153..2fda9338f3fe6c 100644 --- a/test/prism/snapshots/whitequark/forward_args_legacy.txt +++ b/test/prism/snapshots/whitequark/forward_args_legacy.txt @@ -35,7 +35,7 @@ │ │ ├── opening_loc: (1,17)-(1,18) = "(" │ │ ├── arguments: │ │ │ @ ArgumentsNode (location: (1,18)-(1,21)) - │ │ │ ├── flags: ∅ + │ │ │ ├── flags: contains_forwarding │ │ │ └── arguments: (length: 1) │ │ │ └── @ ForwardingArgumentsNode (location: (1,18)-(1,21)) │ │ │ └── flags: ∅ @@ -100,7 +100,7 @@ │ ├── lparen_loc: (5,19)-(5,20) = "(" │ ├── arguments: │ │ @ ArgumentsNode (location: (5,20)-(5,23)) - │ │ ├── flags: ∅ + │ │ ├── flags: contains_forwarding │ │ └── arguments: (length: 1) │ │ └── @ ForwardingArgumentsNode (location: (5,20)-(5,23)) │ │ └── flags: ∅ diff --git a/test/prism/snapshots/whitequark/trailing_forward_arg.txt b/test/prism/snapshots/whitequark/trailing_forward_arg.txt index 3cb3f8ae087101..75fce37a343609 100644 --- a/test/prism/snapshots/whitequark/trailing_forward_arg.txt +++ b/test/prism/snapshots/whitequark/trailing_forward_arg.txt @@ -41,7 +41,7 @@ │ ├── opening_loc: (1,23)-(1,24) = "(" │ ├── arguments: │ │ @ ArgumentsNode (location: (1,24)-(1,34)) - │ │ ├── flags: ∅ + │ │ ├── flags: contains_forwarding │ │ └── arguments: (length: 3) │ │ ├── @ LocalVariableReadNode (location: (1,24)-(1,25)) │ │ │ ├── flags: ∅ From c7faffd1d6013a840d5286312cd08790c0e0e69a Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Wed, 11 Sep 2024 08:08:06 -0500 Subject: [PATCH 228/829] [DOC] Tweaks for Array#drop_while --- array.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/array.c b/array.c index 920eda4d702c62..64a5f16938a277 100644 --- a/array.c +++ b/array.c @@ -7731,23 +7731,20 @@ rb_ary_drop(VALUE ary, VALUE n) /* * call-seq: - * array.drop_while {|element| ... } -> new_array - * array.drop_while -> new_enumerator - - * Returns a new +Array+ containing zero or more trailing elements of +self+; - * does not modify +self+. + * drop_while {|element| ... } -> new_array + * drop_while -> new_enumerator * * With a block given, calls the block with each successive element of +self+; * stops if the block returns +false+ or +nil+; - * returns a new +Array+ _omitting_ those elements for which the block returned a truthy value: + * returns a new array _omitting_ those elements for which the block returned a truthy value; + * does not modify +self+: * * a = [0, 1, 2, 3, 4, 5] * a.drop_while {|element| element < 3 } # => [3, 4, 5] * - * With no block given, returns a new Enumerator: - * - * [0, 1].drop_while # => # => # + * With no block given, returns a new Enumerator. * + * Related: see {Methods for Fetching}[rdoc-ref:Array@Methods+for+Fetching]. */ static VALUE From 18fb11aaa407feb6677effb0229a9b82806d8b46 Mon Sep 17 00:00:00 2001 From: Burdette Lamar Date: Wed, 11 Sep 2024 12:14:41 -0500 Subject: [PATCH 229/829] [DOC] Tweaks for Array#difference (#11593) --- array.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/array.c b/array.c index 64a5f16938a277..f44af312f215f3 100644 --- a/array.c +++ b/array.c @@ -5521,19 +5521,21 @@ rb_ary_diff(VALUE ary1, VALUE ary2) /* * call-seq: - * array.difference(*other_arrays) -> new_array + * difference(*other_arrays = []) -> new_array * - * Returns a new +Array+ containing only those elements from +self+ - * that are not found in any of the Arrays +other_arrays+; + * Returns a new array containing only those elements from +self+ + * that are not found in any of the given +other_arrays+; * items are compared using eql?; order from +self+ is preserved: * * [0, 1, 1, 2, 1, 1, 3, 1, 1].difference([1]) # => [0, 2, 3] - * [0, 1, 2, 3].difference([3, 0], [1, 3]) # => [2] - * [0, 1, 2].difference([4]) # => [0, 1, 2] + * [0, 1, 2, 3].difference([3, 0], [1, 3]) # => [2] + * [0, 1, 2].difference([4]) # => [0, 1, 2] + * [0, 1, 2].difference # => [0, 1, 2] * - * Returns a copy of +self+ if no arguments given. + * Returns a copy of +self+ if no arguments are given. * - * Related: Array#-. + * Related: Array#-; + * see also {Methods for Combining}[rdoc-ref:Array@Methods+for+Combining]. */ static VALUE From 818e20359f0415413de2888b1e6233f574882471 Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Wed, 11 Sep 2024 10:28:16 -0500 Subject: [PATCH 230/829] [DOC] Tweaks for Array#each --- array.rb | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/array.rb b/array.rb index 9a47c0eab2b046..4b4c2c0ac8ec19 100644 --- a/array.rb +++ b/array.rb @@ -1,11 +1,10 @@ class Array # call-seq: - # array.each {|element| ... } -> self - # array.each -> Enumerator + # each {|element| ... } -> self + # each -> new_enumerator # - # Iterates over array elements. - # - # When a block given, passes each successive array element to the block; + # With a block given, iterates over the elements of +self+, + # passing each element to the block; # returns +self+: # # a = [:foo, 'bar', 2] @@ -27,20 +26,10 @@ class Array # foo # bar # - # When no block given, returns a new Enumerator: - # a = [:foo, 'bar', 2] - # - # e = a.each - # e # => # - # a1 = e.each {|element| puts "#{element.class} #{element}" } - # - # Output: - # - # Symbol foo - # String bar - # Integer 2 + # With no block given, returns a new Enumerator. # - # Related: #each_index, #reverse_each. + # Related: see {Methods for Iterating}[rdoc-ref:Array@Methods+for+Iterating]. + def each Primitive.attr! :inline_block From efc77d535b1a0eab02af98e72f2e40ab295ee2e1 Mon Sep 17 00:00:00 2001 From: John Meade Date: Mon, 9 Sep 2024 15:22:14 +0100 Subject: [PATCH 231/829] [ruby/psych] Ensure strings with only underscores are not processed as Integer A string similar to "0x____" should be treated as a string. Currently it is processed as an Integer. This alters the regex specified by http://yaml.org/type/int.html to ensure at least one numerical symbol is present in the string before converting to Integer. https://github.com/ruby/psych/commit/81479b203e --- ext/psych/lib/psych/scalar_scanner.rb | 16 ++++++++-------- test/psych/test_scalar_scanner.rb | 13 +++++++++++++ 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/ext/psych/lib/psych/scalar_scanner.rb b/ext/psych/lib/psych/scalar_scanner.rb index f124569436b1d2..de21442344e518 100644 --- a/ext/psych/lib/psych/scalar_scanner.rb +++ b/ext/psych/lib/psych/scalar_scanner.rb @@ -13,18 +13,18 @@ class ScalarScanner # Base 60, [-+]inf and NaN are handled separately FLOAT = /^(?:[-+]?([0-9][0-9_,]*)?\.[0-9]*([eE][-+][0-9]+)?(?# base 10))$/x - # Taken from http://yaml.org/type/int.html - INTEGER_STRICT = /^(?:[-+]?0b[0-1_]+ (?# base 2) - |[-+]?0[0-7_]+ (?# base 8) - |[-+]?(0|[1-9][0-9_]*) (?# base 10) - |[-+]?0x[0-9a-fA-F_]+ (?# base 16))$/x + # Taken from http://yaml.org/type/int.html and modified to ensure at least one numerical symbol exists + INTEGER_STRICT = /^(?:[-+]?0b[_]*[0-1][0-1_]* (?# base 2) + |[-+]?0[_]*[0-7][0-7_]* (?# base 8) + |[-+]?(0|[1-9][0-9_]*) (?# base 10) + |[-+]?0x[_]*[0-9a-fA-F][0-9a-fA-F_]* (?# base 16))$/x # Same as above, but allows commas. # Not to YML spec, but kept for backwards compatibility - INTEGER_LEGACY = /^(?:[-+]?0b[0-1_,]+ (?# base 2) - |[-+]?0[0-7_,]+ (?# base 8) + INTEGER_LEGACY = /^(?:[-+]?0b[_,]*[0-1][0-1_,]* (?# base 2) + |[-+]?0[_,]*[0-7][0-7_,]* (?# base 8) |[-+]?(?:0|[1-9](?:[0-9]|,[0-9]|_[0-9])*) (?# base 10) - |[-+]?0x[0-9a-fA-F_,]+ (?# base 16))$/x + |[-+]?0x[_,]*[0-9a-fA-F][0-9a-fA-F_,]* (?# base 16))$/x attr_reader :class_loader diff --git a/test/psych/test_scalar_scanner.rb b/test/psych/test_scalar_scanner.rb index 02b923afe2192f..8907d1255abb1e 100644 --- a/test/psych/test_scalar_scanner.rb +++ b/test/psych/test_scalar_scanner.rb @@ -126,6 +126,19 @@ def test_scan_strings_ending_with_underscores assert_equal '100_', ss.tokenize('100_') end + def test_scan_strings_with_legacy_int_delimiters + assert_equal '0x_,_', ss.tokenize('0x_,_') + assert_equal '+0__,,', ss.tokenize('+0__,,') + assert_equal '-0b,_,', ss.tokenize('-0b,_,') + end + + def test_scan_strings_with_strict_int_delimiters + scanner = Psych::ScalarScanner.new ClassLoader.new, strict_integer: true + assert_equal '0x___', scanner.tokenize('0x___') + assert_equal '+0____', scanner.tokenize('+0____') + assert_equal '-0b___', scanner.tokenize('-0b___') + end + def test_scan_int_commas_and_underscores # NB: This test is to ensure backward compatibility with prior Psych versions, # not to test against any actual YAML specification. From 364cc958978313f7c886a826f428a9b4bd53f635 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Wed, 11 Sep 2024 17:03:19 +0200 Subject: [PATCH 232/829] [rubygems/rubygems] Uncomment and possibly fix spec on JRuby This was commented out almost 10 years ago, but I think it passes now! https://github.com/rubygems/rubygems/commit/4a6b1aba3c --- spec/bundler/commands/platform_spec.rb | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/spec/bundler/commands/platform_spec.rb b/spec/bundler/commands/platform_spec.rb index 370cc601c0d117..6e0a02bcf007be 100644 --- a/spec/bundler/commands/platform_spec.rb +++ b/spec/bundler/commands/platform_spec.rb @@ -915,16 +915,16 @@ def should_be_patchlevel_fixnum should_be_engine_incorrect end - # it "fails when the engine version doesn't match", :jruby_only do - # gemfile <<-G - # gem "myrack", "0.9.1" - # - # #{engine_version_incorrect} - # G - # - # bundle "exec myrackup" - # should_be_engine_version_incorrect - # end + it "fails when the engine version doesn't match", :jruby_only do + gemfile <<-G + gem "myrack", "0.9.1" + + #{engine_version_incorrect} + G + + bundle "exec myrackup", raise_on_error: false + should_be_engine_version_incorrect + end it "fails when patchlevel doesn't match" do gemfile <<-G From 12d7ead04318786bd098e29ff92a3ac18c76a839 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Wed, 11 Sep 2024 17:06:44 +0200 Subject: [PATCH 233/829] [rubygems/rubygems] Small simplification in Definition class https://github.com/rubygems/rubygems/commit/03ddfd7610 Co-authored-by: Jonathan Hefner --- lib/bundler/definition.rb | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/lib/bundler/definition.rb b/lib/bundler/definition.rb index 83db5c0d64a4f7..75eb5ffa1ba624 100644 --- a/lib/bundler/definition.rb +++ b/lib/bundler/definition.rb @@ -511,11 +511,7 @@ def should_add_extra_platforms? end def lockfile_exists? - file_exists?(lockfile) - end - - def file_exists?(file) - file && File.exist?(file) + lockfile && File.exist?(lockfile) end def write_lock(file, preserve_unknown_sections) @@ -536,7 +532,7 @@ def write_lock(file, preserve_unknown_sections) preserve_unknown_sections ||= !updating_major && (Bundler.frozen_bundle? || !(unlocking? || @unlocking_bundler)) - if file_exists?(file) && lockfiles_equal?(@lockfile_contents, contents, preserve_unknown_sections) + if File.exist?(file) && lockfiles_equal?(@lockfile_contents, contents, preserve_unknown_sections) return if Bundler.frozen_bundle? SharedHelpers.filesystem_access(file) { FileUtils.touch(file) } return From d4d6f1de83628b12e4a27d273edace7762f69860 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Wed, 11 Sep 2024 13:51:56 -0400 Subject: [PATCH 234/829] [ruby/prism] UTF-8 characters in file name https://github.com/ruby/prism/commit/487f0ffe78 --- prism/extension.c | 28 ++++++++---- prism/util/pm_string.c | 89 ++++++++++++++++++++++++++---------- test/prism/api/parse_test.rb | 10 ++++ 3 files changed, 93 insertions(+), 34 deletions(-) diff --git a/prism/extension.c b/prism/extension.c index cd5165f41a124a..6a8fedcb054337 100644 --- a/prism/extension.c +++ b/prism/extension.c @@ -254,14 +254,14 @@ string_options(int argc, VALUE *argv, pm_string_t *input, pm_options_t *options) * Read options for methods that look like (filepath, **options). */ static void -file_options(int argc, VALUE *argv, pm_string_t *input, pm_options_t *options) { +file_options(int argc, VALUE *argv, pm_string_t *input, pm_options_t *options, VALUE *encoded_filepath) { VALUE filepath; VALUE keywords; rb_scan_args(argc, argv, "1:", &filepath, &keywords); Check_Type(filepath, T_STRING); - - extract_options(options, filepath, keywords); + *encoded_filepath = rb_str_encode_ospath(filepath); + extract_options(options, *encoded_filepath, keywords); const char * string_source = (const char *) pm_string_source(&options->filepath); @@ -352,7 +352,8 @@ dump_file(int argc, VALUE *argv, VALUE self) { pm_string_t input; pm_options_t options = { 0 }; - file_options(argc, argv, &input, &options); + VALUE encoded_filepath; + file_options(argc, argv, &input, &options, &encoded_filepath); VALUE value = dump_input(&input, &options); pm_string_free(&input); @@ -685,7 +686,8 @@ lex_file(int argc, VALUE *argv, VALUE self) { pm_string_t input; pm_options_t options = { 0 }; - file_options(argc, argv, &input, &options); + VALUE encoded_filepath; + file_options(argc, argv, &input, &options, &encoded_filepath); VALUE value = parse_lex_input(&input, &options, false); pm_string_free(&input); @@ -782,7 +784,8 @@ parse_file(int argc, VALUE *argv, VALUE self) { pm_string_t input; pm_options_t options = { 0 }; - file_options(argc, argv, &input, &options); + VALUE encoded_filepath; + file_options(argc, argv, &input, &options, &encoded_filepath); VALUE value = parse_input(&input, &options); pm_string_free(&input); @@ -838,7 +841,9 @@ profile_file(int argc, VALUE *argv, VALUE self) { pm_string_t input; pm_options_t options = { 0 }; - file_options(argc, argv, &input, &options); + VALUE encoded_filepath; + file_options(argc, argv, &input, &options, &encoded_filepath); + profile_input(&input, &options); pm_string_free(&input); pm_options_free(&options); @@ -952,7 +957,8 @@ parse_file_comments(int argc, VALUE *argv, VALUE self) { pm_string_t input; pm_options_t options = { 0 }; - file_options(argc, argv, &input, &options); + VALUE encoded_filepath; + file_options(argc, argv, &input, &options, &encoded_filepath); VALUE value = parse_input_comments(&input, &options); pm_string_free(&input); @@ -1007,7 +1013,8 @@ parse_lex_file(int argc, VALUE *argv, VALUE self) { pm_string_t input; pm_options_t options = { 0 }; - file_options(argc, argv, &input, &options); + VALUE encoded_filepath; + file_options(argc, argv, &input, &options, &encoded_filepath); VALUE value = parse_lex_input(&input, &options, true); pm_string_free(&input); @@ -1077,7 +1084,8 @@ parse_file_success_p(int argc, VALUE *argv, VALUE self) { pm_string_t input; pm_options_t options = { 0 }; - file_options(argc, argv, &input, &options); + VALUE encoded_filepath; + file_options(argc, argv, &input, &options, &encoded_filepath); VALUE result = parse_input_success_p(&input, &options); pm_string_free(&input); diff --git a/prism/util/pm_string.c b/prism/util/pm_string.c index 4bd3dd8ef2eeaa..3e1e22e34f13fa 100644 --- a/prism/util/pm_string.c +++ b/prism/util/pm_string.c @@ -47,6 +47,53 @@ pm_string_constant_init(pm_string_t *string, const char *source, size_t length) }; } +#ifdef _WIN32 +/** + * Represents a file handle on Windows, where the path will need to be freed + * when the file is closed. + */ +typedef struct { + /** The path to the file, which will become allocated memory. */ + WCHAR *path; + + /** The handle to the file, which will start as uninitialized memory. */ + HANDLE file; +} pm_string_file_handle_t; + +/** + * Open the file indicated by the filepath parameter for reading on Windows. + * Perform any kind of normalization that needs to happen on the filepath. + */ +static bool +pm_string_file_handle_open(pm_string_file_handle_t *handle, const char *filepath) { + int length = MultiByteToWideChar(CP_UTF8, 0, filepath, -1, NULL, 0); + if (length == 0) return false; + + handle->path = xmalloc(sizeof(WCHAR) * ((size_t) length)); + if ((handle->path == NULL) || (MultiByteToWideChar(CP_UTF8, 0, filepath, -1, handle->path, length) == 0)) { + xfree(handle->path); + return false; + } + + handle->file = CreateFileW(handle->path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL); + if (handle->file == INVALID_HANDLE_VALUE) { + xfree(handle->path); + return false; + } + + return true; +} + +/** + * Close the file handle and free the path. + */ +static void +pm_string_file_handle_close(pm_string_file_handle_t *handle) { + xfree(handle->path); + CloseHandle(handle->file); +} +#endif + /** * Read the file indicated by the filepath parameter into source and load its * contents and size into the given `pm_string_t`. The given `pm_string_t` @@ -62,39 +109,36 @@ PRISM_EXPORTED_FUNCTION bool pm_string_mapped_init(pm_string_t *string, const char *filepath) { #ifdef _WIN32 // Open the file for reading. - HANDLE file = CreateFile(filepath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL); - - if (file == INVALID_HANDLE_VALUE) { - return false; - } + pm_string_file_handle_t handle; + if (!pm_string_file_handle_open(&handle, filepath)) return false; // Get the file size. - DWORD file_size = GetFileSize(file, NULL); + DWORD file_size = GetFileSize(handle.file, NULL); if (file_size == INVALID_FILE_SIZE) { - CloseHandle(file); + pm_string_file_handle_close(&handle); return false; } // If the file is empty, then we don't need to do anything else, we'll set // the source to a constant empty string and return. if (file_size == 0) { - CloseHandle(file); + pm_string_file_handle_close(&handle); const uint8_t source[] = ""; *string = (pm_string_t) { .type = PM_STRING_CONSTANT, .source = source, .length = 0 }; return true; } // Create a mapping of the file. - HANDLE mapping = CreateFileMapping(file, NULL, PAGE_READONLY, 0, 0, NULL); + HANDLE mapping = CreateFileMapping(handle.file, NULL, PAGE_READONLY, 0, 0, NULL); if (mapping == NULL) { - CloseHandle(file); + pm_string_file_handle_close(&handle); return false; } // Map the file into memory. uint8_t *source = (uint8_t *) MapViewOfFile(mapping, FILE_MAP_READ, 0, 0, 0); CloseHandle(mapping); - CloseHandle(file); + pm_string_file_handle_close(&handle); if (source == NULL) { return false; @@ -156,23 +200,20 @@ PRISM_EXPORTED_FUNCTION bool pm_string_file_init(pm_string_t *string, const char *filepath) { #ifdef _WIN32 // Open the file for reading. - HANDLE file = CreateFile(filepath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL); - - if (file == INVALID_HANDLE_VALUE) { - return false; - } + pm_string_file_handle_t handle; + if (!pm_string_file_handle_open(&handle, filepath)) return false; // Get the file size. - DWORD file_size = GetFileSize(file, NULL); + DWORD file_size = GetFileSize(handle.file, NULL); if (file_size == INVALID_FILE_SIZE) { - CloseHandle(file); + pm_string_file_handle_close(&handle); return false; } // If the file is empty, then we don't need to do anything else, we'll set // the source to a constant empty string and return. if (file_size == 0) { - CloseHandle(file); + pm_string_file_handle_close(&handle); const uint8_t source[] = ""; *string = (pm_string_t) { .type = PM_STRING_CONSTANT, .source = source, .length = 0 }; return true; @@ -181,25 +222,25 @@ pm_string_file_init(pm_string_t *string, const char *filepath) { // Create a buffer to read the file into. uint8_t *source = xmalloc(file_size); if (source == NULL) { - CloseHandle(file); + pm_string_file_handle_close(&handle); return false; } // Read the contents of the file DWORD bytes_read; - if (!ReadFile(file, source, file_size, &bytes_read, NULL)) { - CloseHandle(file); + if (!ReadFile(handle.file, source, file_size, &bytes_read, NULL)) { + pm_string_file_handle_close(&handle); return false; } // Check the number of bytes read if (bytes_read != file_size) { xfree(source); - CloseHandle(file); + pm_string_file_handle_close(&handle); return false; } - CloseHandle(file); + pm_string_file_handle_close(&handle); *string = (pm_string_t) { .type = PM_STRING_OWNED, .source = source, .length = (size_t) file_size }; return true; #elif defined(PRISM_HAS_FILESYSTEM) diff --git a/test/prism/api/parse_test.rb b/test/prism/api/parse_test.rb index 2e9722f5dac340..6ad3829de0bae6 100644 --- a/test/prism/api/parse_test.rb +++ b/test/prism/api/parse_test.rb @@ -69,6 +69,16 @@ def test_parse_tempfile end end + if RUBY_ENGINE != "truffleruby" + def test_parse_nonascii + Dir.mktmpdir do |dir| + path = File.join(dir, "\u{3042 3044 3046 3048 304a}.rb".encode(Encoding::Windows_31J)) + File.write(path, "ok") + Prism.parse_file(path) + end + end + end + private def find_source_file_node(program) From 5d358b660d41e64de301f428dc0300a52a6f9566 Mon Sep 17 00:00:00 2001 From: Luke Gruber Date: Sat, 7 Sep 2024 12:17:08 -0400 Subject: [PATCH 235/829] Fix issue with super and forwarding arguments in prism_compile.c Fixes [Bug #20720] --- parse.y | 4 ++-- prism_compile.c | 10 ++++++---- test/ruby/test_super.rb | 16 ++++++++++++++++ 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/parse.y b/parse.y index 17ea8fd9e17291..134c80cdd27de6 100644 --- a/parse.y +++ b/parse.y @@ -15132,11 +15132,11 @@ new_args_forward_call(struct parser_params *p, NODE *leading, const YYLTYPE *loc #ifndef FORWARD_ARGS_WITH_RUBY2_KEYWORDS NODE *kwrest = list_append(p, NEW_LIST(0, loc), NEW_LVAR(idFWD_KWREST, loc)); #endif - rb_node_block_pass_t *block = NEW_BLOCK_PASS(NEW_LVAR(idFWD_BLOCK, loc), loc); + rb_node_block_pass_t *block = NEW_BLOCK_PASS(NEW_LVAR(idFWD_BLOCK, loc), argsloc); NODE *args = leading ? rest_arg_append(p, leading, rest, argsloc) : NEW_SPLAT(rest, loc); block->forwarding = TRUE; #ifndef FORWARD_ARGS_WITH_RUBY2_KEYWORDS - args = arg_append(p, args, new_hash(p, kwrest, loc), loc); + args = arg_append(p, args, new_hash(p, kwrest, loc), argsloc); #endif return arg_blk_pass(args, block); } diff --git a/prism_compile.c b/prism_compile.c index d1c9d5431e044c..0be5c920780e6a 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -1708,7 +1708,7 @@ pm_setup_args_core(const pm_arguments_node_t *arguments_node, const pm_node_t *b break; } - case PM_FORWARDING_ARGUMENTS_NODE: { + case PM_FORWARDING_ARGUMENTS_NODE: { // not counted in argc return value if (ISEQ_BODY(ISEQ_BODY(iseq)->local_iseq)->param.flags.forwardable) { *flags |= VM_CALL_FORWARDING; @@ -9628,9 +9628,10 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, } return; } - case PM_SUPER_NODE: { + case PM_SUPER_NODE: { // any super with arguments or `super()` + // super() // super(foo) - // ^^^^^^^^^^ + // super(...) const pm_super_node_t *cast = (const pm_super_node_t *) node; DECL_ANCHOR(args); @@ -9649,6 +9650,7 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, int flags = 0; struct rb_callinfo_kwarg *keywords = NULL; int argc = pm_setup_args(cast->arguments, cast->block, &flags, &keywords, iseq, ret, scope_node, &location); + bool is_forwardable = (cast->arguments != NULL) && PM_NODE_FLAG_P(cast->arguments, PM_ARGUMENTS_NODE_FLAGS_CONTAINS_FORWARDING); flags |= VM_CALL_SUPER | VM_CALL_FCALL; if (cast->block && PM_NODE_TYPE_P(cast->block, PM_BLOCK_NODE)) { @@ -9668,7 +9670,7 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, } PUSH_SEQ(ret, args); - if (ISEQ_BODY(ISEQ_BODY(iseq)->local_iseq)->param.flags.forwardable) { + if (is_forwardable && ISEQ_BODY(ISEQ_BODY(iseq)->local_iseq)->param.flags.forwardable) { flags |= VM_CALL_FORWARDING; PUSH_INSN2(ret, location, invokesuperforward, new_callinfo(iseq, 0, argc, flags, keywords, current_block != NULL), current_block); } diff --git a/test/ruby/test_super.rb b/test/ruby/test_super.rb index ce78e66c52196a..aa09f9e1b9f2a2 100644 --- a/test/ruby/test_super.rb +++ b/test/ruby/test_super.rb @@ -8,6 +8,7 @@ def double(a, b) [a,b] end def array(*a) a end def optional(a = 0) a end def keyword(**a) a end + def forward(*a) a end end class Single1 < Base def single(*) super end @@ -63,6 +64,16 @@ def keyword(foo: "keyword2") [x, y] end end + class Forward < Base + def forward(...) + w = super() + x = super + y = super(...) + a = 1 + z = super(a, ...) + [w, x, y, z] + end + end def test_single1 assert_equal(1, Single1.new.single(1)) @@ -133,6 +144,11 @@ def test_keyword1 def test_keyword2 assert_equal([{foo: "changed1"}, {foo: "changed2"}], Keyword2.new.keyword) end + def test_forwardable(...) + assert_equal([[],[],[],[1]], Forward.new.forward()) + assert_equal([[],[1,2],[1,2],[1,1,2]], Forward.new.forward(1,2)) + assert_equal([[],[:test],[:test],[1,:test]], Forward.new.forward(:test, ...)) + end class A def tt(aa) From 70c66137817d4d4e56e60aaefb841237912e4b43 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Thu, 12 Sep 2024 12:47:06 +0900 Subject: [PATCH 236/829] Use better resolution by Bundler at force_activate --- prelude.rb | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/prelude.rb b/prelude.rb index 02d93efdd95482..999131321e627d 100644 --- a/prelude.rb +++ b/prelude.rb @@ -1,11 +1,7 @@ class Binding # :nodoc: def irb - if defined?(Bundler) && !Gem.loaded_specs["irb"] - unless force_activate "irb" - warn "irb is not found. Install irb from RubyGems or add irb to Gemfile." - end - end + force_activate 'irb' require 'irb' irb end @@ -14,16 +10,22 @@ def irb alias irb irb # :nodoc: private def force_activate(gem) - gemspecs = (Gem::Specification.dirs + [Gem.default_specifications_dir]).map{|d| - Dir.glob("#{d}/#{gem}*.gemspec").reverse - }.flatten - if gemspecs.empty? - false - else - gemspec = Gem::Specification.load(gemspecs[0]) - gemspec.dependencies.each{|dep| force_activate dep.name } - gemspec.activate - end + return if !defined?(Bundler) || Gem.loaded_specs.key?(gem) + + Bundler.reset! + + ui = Bundler::UI::Shell.new + ui.level = "silent" + Bundler.ui = ui + + @builder = Bundler::Dsl.new + Bundler.definition.gemfiles.each{|gemfile| @builder.eval_gemfile(gemfile) } + @builder.gem gem + + definition = @builder.to_definition(nil, true) + definition.validate_runtime! + Bundler::Definition.no_lock = true + Bundler::Runtime.new(nil, definition).setup end end From 754e15f4d0a60c8d9abfa7cdc5e06a2365d97ae7 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Thu, 12 Sep 2024 12:50:24 +0900 Subject: [PATCH 237/829] Support bundler/inline mode --- prelude.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/prelude.rb b/prelude.rb index 999131321e627d..bcc6e968ebab4d 100644 --- a/prelude.rb +++ b/prelude.rb @@ -19,7 +19,11 @@ def irb Bundler.ui = ui @builder = Bundler::Dsl.new - Bundler.definition.gemfiles.each{|gemfile| @builder.eval_gemfile(gemfile) } + if Bundler.definition.gemfiles.empty? # bundler/inline + Bundler.definition.locked_gems.specs.each{|spec| @builder.gem spec.name, spec.version.to_s } + else + Bundler.definition.gemfiles.each{|gemfile| @builder.eval_gemfile(gemfile) } + end @builder.gem gem definition = @builder.to_definition(nil, true) From ee064d1cb2a7a4e2c4e9eecc3f64055c4e6a6801 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Thu, 12 Sep 2024 14:02:30 +0900 Subject: [PATCH 238/829] Back to Bundler.ui and Bundler::Definition.no_lock --- prelude.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/prelude.rb b/prelude.rb index bcc6e968ebab4d..82c78205308fe6 100644 --- a/prelude.rb +++ b/prelude.rb @@ -14,6 +14,7 @@ def irb Bundler.reset! + orig_ui = Bundler.ui ui = Bundler::UI::Shell.new ui.level = "silent" Bundler.ui = ui @@ -28,8 +29,12 @@ def irb definition = @builder.to_definition(nil, true) definition.validate_runtime! + orig_no_lock = Bundler::Definition.no_lock Bundler::Definition.no_lock = true Bundler::Runtime.new(nil, definition).setup + ensure + Bundler.ui = orig_ui + Bundler::Definition.no_lock = orig_no_lock end end From 6c9f0be6475ced23de2df65969f5e27336932e7c Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Thu, 12 Sep 2024 14:14:37 +0900 Subject: [PATCH 239/829] Don't use instance variable --- prelude.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/prelude.rb b/prelude.rb index 82c78205308fe6..159d8af287848f 100644 --- a/prelude.rb +++ b/prelude.rb @@ -19,15 +19,15 @@ def irb ui.level = "silent" Bundler.ui = ui - @builder = Bundler::Dsl.new + builder = Bundler::Dsl.new if Bundler.definition.gemfiles.empty? # bundler/inline - Bundler.definition.locked_gems.specs.each{|spec| @builder.gem spec.name, spec.version.to_s } + Bundler.definition.locked_gems.specs.each{|spec| builder.gem spec.name, spec.version.to_s } else - Bundler.definition.gemfiles.each{|gemfile| @builder.eval_gemfile(gemfile) } + Bundler.definition.gemfiles.each{|gemfile| builder.eval_gemfile(gemfile) } end - @builder.gem gem + builder.gem gem - definition = @builder.to_definition(nil, true) + definition = builder.to_definition(nil, true) definition.validate_runtime! orig_no_lock = Bundler::Definition.no_lock Bundler::Definition.no_lock = true From 86fcfcb3c0c8762aef84ccf2f4f4304887f9c72d Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Thu, 12 Sep 2024 14:30:22 +0900 Subject: [PATCH 240/829] Fixed ensure scope --- prelude.rb | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/prelude.rb b/prelude.rb index 159d8af287848f..2a9940deaaa839 100644 --- a/prelude.rb +++ b/prelude.rb @@ -14,11 +14,6 @@ def irb Bundler.reset! - orig_ui = Bundler.ui - ui = Bundler::UI::Shell.new - ui.level = "silent" - Bundler.ui = ui - builder = Bundler::Dsl.new if Bundler.definition.gemfiles.empty? # bundler/inline Bundler.definition.locked_gems.specs.each{|spec| builder.gem spec.name, spec.version.to_s } @@ -29,12 +24,21 @@ def irb definition = builder.to_definition(nil, true) definition.validate_runtime! - orig_no_lock = Bundler::Definition.no_lock - Bundler::Definition.no_lock = true - Bundler::Runtime.new(nil, definition).setup - ensure - Bundler.ui = orig_ui - Bundler::Definition.no_lock = orig_no_lock + + begin + orig_ui = Bundler.ui + orig_no_lock = Bundler::Definition.no_lock + + ui = Bundler::UI::Shell.new + ui.level = "silent" + Bundler.ui = ui + Bundler::Definition.no_lock = true + + Bundler::Runtime.new(nil, definition).setup + ensure + Bundler.ui = orig_ui + Bundler::Definition.no_lock = orig_no_lock + end end end From 2a1962fc4ad720835fd74ea178d4910d00e51b70 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Thu, 12 Sep 2024 15:46:57 +0900 Subject: [PATCH 241/829] Warn missing irb cases --- prelude.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/prelude.rb b/prelude.rb index 2a9940deaaa839..2f67f528e927bd 100644 --- a/prelude.rb +++ b/prelude.rb @@ -35,6 +35,8 @@ def irb Bundler::Definition.no_lock = true Bundler::Runtime.new(nil, definition).setup + rescue Bundler::GemNotFound + warn "Failed to activate #{gem}, please install it with 'gem install #{gem}'" ensure Bundler.ui = orig_ui Bundler::Definition.no_lock = orig_no_lock From 885cf350de4c80a918a33da109d0462711ac5e49 Mon Sep 17 00:00:00 2001 From: ydah Date: Wed, 11 Sep 2024 18:32:50 +0900 Subject: [PATCH 242/829] Lrama v0.6.10 --- tool/lrama/NEWS.md | 220 +++ tool/lrama/exe/lrama | 1 + tool/lrama/lib/lrama.rb | 39 +- tool/lrama/lib/lrama/bitmap.rb | 2 + tool/lrama/lib/lrama/command.rb | 22 +- tool/lrama/lib/lrama/context.rb | 14 +- tool/lrama/lib/lrama/counterexamples.rb | 32 +- .../lib/lrama/counterexamples/derivation.rb | 2 + .../lib/lrama/counterexamples/example.rb | 2 + tool/lrama/lib/lrama/counterexamples/path.rb | 2 + .../lrama/counterexamples/production_path.rb | 2 + .../lib/lrama/counterexamples/start_path.rb | 2 + .../lib/lrama/counterexamples/state_item.rb | 2 + .../lrama/counterexamples/transition_path.rb | 2 + .../lrama/lib/lrama/counterexamples/triple.rb | 2 + tool/lrama/lib/lrama/diagnostics.rb | 36 + tool/lrama/lib/lrama/digraph.rb | 2 + tool/lrama/lib/lrama/grammar.rb | 81 +- tool/lrama/lib/lrama/grammar/auxiliary.rb | 2 + tool/lrama/lib/lrama/grammar/binding.rb | 13 +- tool/lrama/lib/lrama/grammar/code.rb | 12 +- .../lib/lrama/grammar/code/destructor_code.rb | 2 + .../lrama/grammar/code/initial_action_code.rb | 2 + .../lrama/grammar/code/no_reference_code.rb | 2 + .../lib/lrama/grammar/code/printer_code.rb | 2 + .../lib/lrama/grammar/code/rule_action.rb | 10 +- tool/lrama/lib/lrama/grammar/counter.rb | 2 + tool/lrama/lib/lrama/grammar/destructor.rb | 2 + tool/lrama/lib/lrama/grammar/error_token.rb | 2 + .../lib/lrama/grammar/parameterizing_rule.rb | 2 + .../grammar/parameterizing_rule/resolver.rb | 8 +- .../lrama/grammar/parameterizing_rule/rhs.rb | 7 +- .../lrama/grammar/parameterizing_rule/rule.rb | 6 + tool/lrama/lib/lrama/grammar/percent_code.rb | 2 + tool/lrama/lib/lrama/grammar/precedence.rb | 2 + tool/lrama/lib/lrama/grammar/printer.rb | 2 + tool/lrama/lib/lrama/grammar/reference.rb | 2 + tool/lrama/lib/lrama/grammar/rule.rb | 13 +- tool/lrama/lib/lrama/grammar/rule_builder.rb | 129 +- tool/lrama/lib/lrama/grammar/symbol.rb | 2 + tool/lrama/lib/lrama/grammar/symbols.rb | 2 + .../lib/lrama/grammar/symbols/resolver.rb | 6 +- tool/lrama/lib/lrama/grammar/type.rb | 2 + tool/lrama/lib/lrama/grammar/union.rb | 2 + tool/lrama/lib/lrama/grammar_validator.rb | 37 + tool/lrama/lib/lrama/lexer.rb | 19 +- tool/lrama/lib/lrama/lexer/grammar_file.rb | 2 + tool/lrama/lib/lrama/lexer/location.rb | 2 + tool/lrama/lib/lrama/lexer/token.rb | 12 +- tool/lrama/lib/lrama/lexer/token/char.rb | 2 + tool/lrama/lib/lrama/lexer/token/ident.rb | 2 + .../lib/lrama/lexer/token/instantiate_rule.rb | 2 + tool/lrama/lib/lrama/lexer/token/tag.rb | 2 + tool/lrama/lib/lrama/lexer/token/user_code.rb | 4 +- tool/lrama/lib/lrama/logger.rb | 17 + tool/lrama/lib/lrama/option_parser.rb | 91 +- tool/lrama/lib/lrama/options.rb | 7 +- tool/lrama/lib/lrama/output.rb | 107 +- tool/lrama/lib/lrama/parser.rb | 1429 ++++++++--------- tool/lrama/lib/lrama/report.rb | 6 +- tool/lrama/lib/lrama/report/duration.rb | 2 + tool/lrama/lib/lrama/report/profile.rb | 2 + tool/lrama/lib/lrama/state.rb | 12 +- tool/lrama/lib/lrama/state/reduce.rb | 3 + .../lib/lrama/state/reduce_reduce_conflict.rb | 2 + .../lib/lrama/state/resolved_conflict.rb | 4 +- tool/lrama/lib/lrama/state/shift.rb | 2 + .../lib/lrama/state/shift_reduce_conflict.rb | 2 + tool/lrama/lib/lrama/states.rb | 64 +- tool/lrama/lib/lrama/states/item.rb | 8 +- tool/lrama/lib/lrama/states_reporter.rb | 79 +- tool/lrama/lib/lrama/trace_reporter.rb | 30 + tool/lrama/lib/lrama/version.rb | 4 +- tool/lrama/template/bison/yacc.c | 43 +- 74 files changed, 1545 insertions(+), 1156 deletions(-) create mode 100644 tool/lrama/lib/lrama/diagnostics.rb create mode 100644 tool/lrama/lib/lrama/grammar_validator.rb create mode 100644 tool/lrama/lib/lrama/logger.rb create mode 100644 tool/lrama/lib/lrama/trace_reporter.rb diff --git a/tool/lrama/NEWS.md b/tool/lrama/NEWS.md index 96aaaf94f57d5f..0e682b467603f3 100644 --- a/tool/lrama/NEWS.md +++ b/tool/lrama/NEWS.md @@ -1,5 +1,225 @@ # NEWS for Lrama +## Lrama 0.6.10 (2024-09-11) + +### Aliased Named References for actions of RHS in parameterizing rules + +Allow to use aliased named references for actions of RHS in parameterizing rules. + +``` +%rule sum(X, Y): X[summand] '+' Y[addend] { $$ = $summand + $addend } + ; +``` + +https://github.com/ruby/lrama/pull/410 + + +### Named References for actions of RHS in parameterizing rules caller side + +Allow to use named references for actions of RHS in parameterizing rules caller side. + +``` +opt_nl: '\n'?[nl] { $$ = $nl; } + ; +``` + +https://github.com/ruby/lrama/pull/414 + +### Widen the definable position of parameterizing rules + +Allow to define parameterizing rules in the middle of the grammar. + +``` +%rule defined_option(X): /* empty */ + | X + ; + +%% + +program : defined_option(number) + | defined_list(number) + ; + +%rule defined_list(X): /* empty */ /* <--- here */ + | defined_list(X) number + ; +``` + +https://github.com/ruby/lrama/pull/420 + +### Report unused terminal symbols + +Support to report unused terminal symbols. +Run `exe/lrama --report=terms` to show unused terminal symbols. + +``` +❯ exe/lrama --report=terms sample/calc.y + 11 Unused Terms + 0 YYerror + 1 YYUNDEF + 2 '\\\\' + 3 '\\13' + 4 keyword_class2 + 5 tNUMBER + 6 tPLUS + 7 tMINUS + 8 tEQ + 9 tEQEQ + 10 '>' +``` +https://github.com/ruby/lrama/pull/439 + +### Report unused rules + +Support to report unused rules. +Run `exe/lrama --report=rules` to show unused rules. + +``` +❯ exe/lrama --report=rules sample/calc.y + 3 Unused Rules + 0 unused_option + 1 unused_list + 2 unused_nonempty_list +``` + +https://github.com/ruby/lrama/pull/441 + +### Ensure compatibility with Bison for `%locations` directive + +Support `%locations` directive to ensure compatibility with Bison. +Change to `%locations` directive not set by default. + +https://github.com/ruby/lrama/pull/446 + +### Diagnostics report for parameterizing rules redefine + +Support to warning redefined parameterizing rules. +Run `exe/lrama -W` or `exe/lrama --warnings` to show redefined parameterizing rules. + +``` +❯ exe/lrama -W sample/calc.y +parameterizing rule redefined: redefined_method(X) +parameterizing rule redefined: redefined_method(X) +``` + +https://github.com/ruby/lrama/pull/448 + +### Support `-v` and `--verbose` option + +Support to `-v` and `--verbose` option. +These options align with Bison behavior. So same as '--report=state' option. + +https://github.com/ruby/lrama/pull/457 + +## Lrama 0.6.9 (2024-05-02) + +### Callee side tag specification of parameterizing rules + +Allow to specify tag on callee side of parameterizing rules. + +``` +%union { + int i; +} + +%rule with_tag(X) : X { $$ = $1; } + ; +``` + +### Named References for actions of RHS in parameterizing rules + +Allow to use named references for actions of RHS in parameterizing rules. + +``` +%rule option(number): /* empty */ + | number { $$ = $number; } + ; +``` + +## Lrama 0.6.8 (2024-04-29) + +### Nested parameterizing rules with tag + +Allow to nested parameterizing rules with tag. + +``` +%union { + int i; +} + +%rule nested_nested_option(X): /* empty */ + | X + ; + +%rule nested_option(X): /* empty */ + | nested_nested_option(X) + ; + +%rule option(Y): /* empty */ + | nested_option(Y) + ; +``` + +## Lrama 0.6.7 (2024-04-28) + +### RHS of user defined parameterizing rules contains `'symbol'?`, `'symbol'+` and `'symbol'*`. + +User can use `'symbol'?`, `'symbol'+` and `'symbol'*` in RHS of user defined parameterizing rules. + +``` +%rule with_word_seps(X): /* empty */ + | X ' '+ + ; +``` + +## Lrama 0.6.6 (2024-04-27) + +### Trace actions + +Support trace actions for debugging. +Run `exe/lrama --trace=actions` to show grammar rules with actions. + +``` +❯ exe/lrama --trace=actions sample/calc.y +Grammar rules with actions: +$accept -> list, YYEOF {} +list -> ε {} +list -> list, LF {} +list -> list, expr, LF { printf("=> %d\n", $2); } +expr -> NUM {} +expr -> expr, '+', expr { $$ = $1 + $3; } +expr -> expr, '-', expr { $$ = $1 - $3; } +expr -> expr, '*', expr { $$ = $1 * $3; } +expr -> expr, '/', expr { $$ = $1 / $3; } +expr -> '(', expr, ')' { $$ = $2; } +``` + +### Inlining + +Support inlining for rules. +The `%inline` directive causes all references to symbols to be replaced with its definition. + +``` +%rule %inline op: PLUS { + } + | TIMES { * } + ; + +%% + +expr : number { $$ = $1; } + | expr op expr { $$ = $1 $2 $3; } + ; +``` + +as same as + +``` +expr : number { $$ = $1; } + | expr '+' expr { $$ = $1 + $3; } + | expr '*' expr { $$ = $1 * $3; } + ; +``` + ## Lrama 0.6.5 (2024-03-25) ### Typed Midrule Actions diff --git a/tool/lrama/exe/lrama b/tool/lrama/exe/lrama index ba5fb06c82c7dd..1aece5d1410125 100755 --- a/tool/lrama/exe/lrama +++ b/tool/lrama/exe/lrama @@ -1,4 +1,5 @@ #!/usr/bin/env ruby +# frozen_string_literal: true $LOAD_PATH << File.join(__dir__, "../lib") require "lrama" diff --git a/tool/lrama/lib/lrama.rb b/tool/lrama/lib/lrama.rb index 9e517b0d71ada3..fe2e05807c8994 100644 --- a/tool/lrama/lib/lrama.rb +++ b/tool/lrama/lib/lrama.rb @@ -1,17 +1,22 @@ -require "lrama/bitmap" -require "lrama/command" -require "lrama/context" -require "lrama/counterexamples" -require "lrama/digraph" -require "lrama/grammar" -require "lrama/lexer" -require "lrama/option_parser" -require "lrama/options" -require "lrama/output" -require "lrama/parser" -require "lrama/report" -require "lrama/state" -require "lrama/states" -require "lrama/states_reporter" -require "lrama/version" -require "lrama/warning" +# frozen_string_literal: true + +require_relative "lrama/bitmap" +require_relative "lrama/command" +require_relative "lrama/context" +require_relative "lrama/counterexamples" +require_relative "lrama/diagnostics" +require_relative "lrama/digraph" +require_relative "lrama/grammar" +require_relative "lrama/grammar_validator" +require_relative "lrama/lexer" +require_relative "lrama/logger" +require_relative "lrama/option_parser" +require_relative "lrama/options" +require_relative "lrama/output" +require_relative "lrama/parser" +require_relative "lrama/report" +require_relative "lrama/state" +require_relative "lrama/states" +require_relative "lrama/states_reporter" +require_relative "lrama/trace_reporter" +require_relative "lrama/version" diff --git a/tool/lrama/lib/lrama/bitmap.rb b/tool/lrama/lib/lrama/bitmap.rb index 8349a23c344b1a..23cbd30d4c6823 100644 --- a/tool/lrama/lib/lrama/bitmap.rb +++ b/tool/lrama/lib/lrama/bitmap.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama module Bitmap def self.from_array(ary) diff --git a/tool/lrama/lib/lrama/command.rb b/tool/lrama/lib/lrama/command.rb index 12fc4fc7ec5361..0095c1a1190c00 100644 --- a/tool/lrama/lib/lrama/command.rb +++ b/tool/lrama/lib/lrama/command.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class Command LRAMA_LIB = File.realpath(File.join(File.dirname(__FILE__))) @@ -14,7 +16,6 @@ def run(argv) Report::Duration.enable if options.trace_opts[:time] - warning = Lrama::Warning.new text = options.y.read options.y.close if options.y != STDIN begin @@ -31,7 +32,7 @@ def run(argv) message = message.gsub(/.+/, "\e[1m\\&\e[m") if Exception.to_tty? abort message end - states = Lrama::States.new(grammar, warning, trace_state: (options.trace_opts[:automaton] || options.trace_opts[:closure])) + states = Lrama::States.new(grammar, trace_state: (options.trace_opts[:automaton] || options.trace_opts[:closure])) states.compute context = Lrama::Context.new(states) @@ -42,15 +43,8 @@ def run(argv) end end - if options.trace_opts && options.trace_opts[:rules] - puts "Grammar rules:" - puts grammar.rules - end - - if options.trace_opts && options.trace_opts[:actions] - puts "Grammar rules with actions:" - grammar.rules.each { |rule| puts rule.with_actions } - end + reporter = Lrama::TraceReporter.new(grammar) + reporter.report(**options.trace_opts) File.open(options.outfile, "w+") do |f| Lrama::Output.new( @@ -65,9 +59,9 @@ def run(argv) ).render end - if warning.has_error? - exit false - end + logger = Lrama::Logger.new + exit false unless Lrama::GrammarValidator.new(grammar, states, logger).valid? + Lrama::Diagnostics.new(grammar, states, logger).run(options.diagnostic) end end end diff --git a/tool/lrama/lib/lrama/context.rb b/tool/lrama/lib/lrama/context.rb index 32017e65fc7970..4be21988606eda 100644 --- a/tool/lrama/lib/lrama/context.rb +++ b/tool/lrama/lib/lrama/context.rb @@ -1,4 +1,6 @@ -require "lrama/report/duration" +# frozen_string_literal: true + +require_relative "report/duration" module Lrama # This is passed to a template @@ -253,7 +255,7 @@ def compute_yydefact # If no default_reduction_rule, default behavior is an # error then replace ErrorActionNumber with zero. - if !state.default_reduction_rule + unless state.default_reduction_rule actions.map! do |e| if e == ErrorActionNumber 0 @@ -301,10 +303,7 @@ def compute_yydefgoto end @states.nterms.each do |nterm| - if !(states = nterm_to_next_states[nterm]) - default_goto = 0 - not_default_gotos = [] - else + if (states = nterm_to_next_states[nterm]) default_state = states.map(&:last).group_by {|s| s }.max_by {|_, v| v.count }.first default_goto = default_state.id not_default_gotos = [] @@ -312,6 +311,9 @@ def compute_yydefgoto next if to_state.id == default_goto not_default_gotos << [from_state.id, to_state.id] end + else + default_goto = 0 + not_default_gotos = [] end k = nterm_number_to_sequence_number(nterm.number) diff --git a/tool/lrama/lib/lrama/counterexamples.rb b/tool/lrama/lib/lrama/counterexamples.rb index 046265da59a8a2..aaf2bb201f99c3 100644 --- a/tool/lrama/lib/lrama/counterexamples.rb +++ b/tool/lrama/lib/lrama/counterexamples.rb @@ -1,13 +1,15 @@ +# frozen_string_literal: true + require "set" -require "lrama/counterexamples/derivation" -require "lrama/counterexamples/example" -require "lrama/counterexamples/path" -require "lrama/counterexamples/production_path" -require "lrama/counterexamples/start_path" -require "lrama/counterexamples/state_item" -require "lrama/counterexamples/transition_path" -require "lrama/counterexamples/triple" +require_relative "counterexamples/derivation" +require_relative "counterexamples/example" +require_relative "counterexamples/path" +require_relative "counterexamples/production_path" +require_relative "counterexamples/start_path" +require_relative "counterexamples/state_item" +require_relative "counterexamples/transition_path" +require_relative "counterexamples/triple" module Lrama # See: https://www.cs.cornell.edu/andru/papers/cupex/cupex.pdf @@ -171,7 +173,13 @@ def find_shift_conflict_shortest_state_items(reduce_path, conflict_state, confli break end - if !si.item.beginning_of_rule? + if si.item.beginning_of_rule? + key = [si.state, si.item.lhs] + @reverse_productions[key].each do |item| + state_item = StateItem.new(si.state, item) + queue << (sis + [state_item]) + end + else key = [si, si.item.previous_sym] @reverse_transitions[key].each do |prev_target_state_item| next if prev_target_state_item.state != prev_state_item.state @@ -183,12 +191,6 @@ def find_shift_conflict_shortest_state_items(reduce_path, conflict_state, confli queue.clear break end - else - key = [si.state, si.item.lhs] - @reverse_productions[key].each do |item| - state_item = StateItem.new(si.state, item) - queue << (sis + [state_item]) - end end end else diff --git a/tool/lrama/lib/lrama/counterexamples/derivation.rb b/tool/lrama/lib/lrama/counterexamples/derivation.rb index 691e9353563aa4..423e58b829aaa6 100644 --- a/tool/lrama/lib/lrama/counterexamples/derivation.rb +++ b/tool/lrama/lib/lrama/counterexamples/derivation.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class Counterexamples class Derivation diff --git a/tool/lrama/lib/lrama/counterexamples/example.rb b/tool/lrama/lib/lrama/counterexamples/example.rb index 62244a77e0fa01..8dda0d17d5b9b0 100644 --- a/tool/lrama/lib/lrama/counterexamples/example.rb +++ b/tool/lrama/lib/lrama/counterexamples/example.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class Counterexamples class Example diff --git a/tool/lrama/lib/lrama/counterexamples/path.rb b/tool/lrama/lib/lrama/counterexamples/path.rb index edba67a3b61343..243b6b42484685 100644 --- a/tool/lrama/lib/lrama/counterexamples/path.rb +++ b/tool/lrama/lib/lrama/counterexamples/path.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class Counterexamples class Path diff --git a/tool/lrama/lib/lrama/counterexamples/production_path.rb b/tool/lrama/lib/lrama/counterexamples/production_path.rb index d7db68851841d1..0a230c7fce72fd 100644 --- a/tool/lrama/lib/lrama/counterexamples/production_path.rb +++ b/tool/lrama/lib/lrama/counterexamples/production_path.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class Counterexamples class ProductionPath < Path diff --git a/tool/lrama/lib/lrama/counterexamples/start_path.rb b/tool/lrama/lib/lrama/counterexamples/start_path.rb index 4a6821cd0feec6..c0351c8248972a 100644 --- a/tool/lrama/lib/lrama/counterexamples/start_path.rb +++ b/tool/lrama/lib/lrama/counterexamples/start_path.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class Counterexamples class StartPath < Path diff --git a/tool/lrama/lib/lrama/counterexamples/state_item.rb b/tool/lrama/lib/lrama/counterexamples/state_item.rb index 930ff4a5f86493..c919818324c2f4 100644 --- a/tool/lrama/lib/lrama/counterexamples/state_item.rb +++ b/tool/lrama/lib/lrama/counterexamples/state_item.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class Counterexamples class StateItem < Struct.new(:state, :item) diff --git a/tool/lrama/lib/lrama/counterexamples/transition_path.rb b/tool/lrama/lib/lrama/counterexamples/transition_path.rb index 96e611612aa9c2..47bfbc4f98d15d 100644 --- a/tool/lrama/lib/lrama/counterexamples/transition_path.rb +++ b/tool/lrama/lib/lrama/counterexamples/transition_path.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class Counterexamples class TransitionPath < Path diff --git a/tool/lrama/lib/lrama/counterexamples/triple.rb b/tool/lrama/lib/lrama/counterexamples/triple.rb index e802beccf4cffc..64014ee223521b 100644 --- a/tool/lrama/lib/lrama/counterexamples/triple.rb +++ b/tool/lrama/lib/lrama/counterexamples/triple.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class Counterexamples # s: state diff --git a/tool/lrama/lib/lrama/diagnostics.rb b/tool/lrama/lib/lrama/diagnostics.rb new file mode 100644 index 00000000000000..e9da398c89c9c6 --- /dev/null +++ b/tool/lrama/lib/lrama/diagnostics.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +module Lrama + class Diagnostics + def initialize(grammar, states, logger) + @grammar = grammar + @states = states + @logger = logger + end + + def run(diagnostic) + if diagnostic + diagnose_conflict + diagnose_parameterizing_redefined + end + end + + private + + def diagnose_conflict + if @states.sr_conflicts_count != 0 + @logger.warn("shift/reduce conflicts: #{@states.sr_conflicts_count} found") + end + + if @states.rr_conflicts_count != 0 + @logger.warn("reduce/reduce conflicts: #{@states.rr_conflicts_count} found") + end + end + + def diagnose_parameterizing_redefined + @grammar.parameterizing_rule_resolver.redefined_rules.each do |rule| + @logger.warn("parameterizing rule redefined: #{rule}") + end + end + end +end diff --git a/tool/lrama/lib/lrama/digraph.rb b/tool/lrama/lib/lrama/digraph.rb index bbaa86019f5deb..d2bb88101a7830 100644 --- a/tool/lrama/lib/lrama/digraph.rb +++ b/tool/lrama/lib/lrama/digraph.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama # Algorithm Digraph of https://dl.acm.org/doi/pdf/10.1145/69622.357187 (P. 625) class Digraph diff --git a/tool/lrama/lib/lrama/grammar.rb b/tool/lrama/lib/lrama/grammar.rb index a816b8261b368f..3724f828d7a2d0 100644 --- a/tool/lrama/lib/lrama/grammar.rb +++ b/tool/lrama/lib/lrama/grammar.rb @@ -1,43 +1,40 @@ +# frozen_string_literal: true + require "forwardable" -require "lrama/grammar/auxiliary" -require "lrama/grammar/binding" -require "lrama/grammar/code" -require "lrama/grammar/counter" -require "lrama/grammar/destructor" -require "lrama/grammar/error_token" -require "lrama/grammar/parameterizing_rule" -require "lrama/grammar/percent_code" -require "lrama/grammar/precedence" -require "lrama/grammar/printer" -require "lrama/grammar/reference" -require "lrama/grammar/rule" -require "lrama/grammar/rule_builder" -require "lrama/grammar/symbol" -require "lrama/grammar/symbols" -require "lrama/grammar/type" -require "lrama/grammar/union" -require "lrama/lexer" +require_relative "grammar/auxiliary" +require_relative "grammar/binding" +require_relative "grammar/code" +require_relative "grammar/counter" +require_relative "grammar/destructor" +require_relative "grammar/error_token" +require_relative "grammar/parameterizing_rule" +require_relative "grammar/percent_code" +require_relative "grammar/precedence" +require_relative "grammar/printer" +require_relative "grammar/reference" +require_relative "grammar/rule" +require_relative "grammar/rule_builder" +require_relative "grammar/symbol" +require_relative "grammar/symbols" +require_relative "grammar/type" +require_relative "grammar/union" +require_relative "lexer" module Lrama # Grammar is the result of parsing an input grammar file class Grammar extend Forwardable - attr_reader :percent_codes, :eof_symbol, :error_symbol, :undef_symbol, :accept_symbol, :aux - attr_accessor :union, :expect, - :printers, :error_tokens, - :lex_param, :parse_param, :initial_action, + attr_reader :percent_codes, :eof_symbol, :error_symbol, :undef_symbol, :accept_symbol, :aux, :parameterizing_rule_resolver + attr_accessor :union, :expect, :printers, :error_tokens, :lex_param, :parse_param, :initial_action, :after_shift, :before_reduce, :after_reduce, :after_shift_error_token, :after_pop_stack, - :symbols_resolver, :types, - :rules, :rule_builders, - :sym_to_rules, :no_stdlib + :symbols_resolver, :types, :rules, :rule_builders, :sym_to_rules, :no_stdlib, :locations def_delegators "@symbols_resolver", :symbols, :nterms, :terms, :add_nterm, :add_term, :find_symbol_by_number!, :find_symbol_by_id!, :token_to_symbol, :find_symbol_by_s_value!, :fill_symbol_number, :fill_nterm_type, :fill_printer, :fill_destructor, :fill_error_token, :sort_by_number! - def initialize(rule_counter) @rule_counter = rule_counter @@ -59,10 +56,15 @@ def initialize(rule_counter) @accept_symbol = nil @aux = Auxiliary.new @no_stdlib = false + @locations = false append_special_symbols end + def create_rule_builder(rule_counter, midrule_action_counter) + RuleBuilder.new(rule_counter, midrule_action_counter, @parameterizing_rule_resolver) + end + def add_percent_code(id:, code:) @percent_codes << PercentCode.new(id.s_value, code.s_value) end @@ -141,6 +143,7 @@ def epilogue=(epilogue) end def prepare + resolve_inline_rules normalize_rules collect_symbols set_lhs_and_rhs @@ -149,6 +152,7 @@ def prepare fill_sym_to_rules compute_nullable compute_first_set + set_locations end # TODO: More validation methods @@ -255,7 +259,7 @@ def compute_first_set def setup_rules @rule_builders.each do |builder| - builder.setup_rules(@parameterizing_rule_resolver) + builder.setup_rules end end @@ -289,10 +293,23 @@ def append_special_symbols @accept_symbol = term end + def resolve_inline_rules + while @rule_builders.any? {|r| r.has_inline_rules? } do + @rule_builders = @rule_builders.flat_map do |builder| + if builder.has_inline_rules? + builder.resolve_inline_rules + else + builder + end + end + end + end + def normalize_rules # Add $accept rule to the top of rules - lineno = @rule_builders.first ? @rule_builders.first.line : 0 - @rules << Rule.new(id: @rule_counter.increment, _lhs: @accept_symbol.id, _rhs: [@rule_builders.first.lhs, @eof_symbol.id], token_code: nil, lineno: lineno) + rule_builder = @rule_builders.first # : RuleBuilder + lineno = rule_builder ? rule_builder.line : 0 + @rules << Rule.new(id: @rule_counter.increment, _lhs: @accept_symbol.id, _rhs: [rule_builder.lhs, @eof_symbol.id], token_code: nil, lineno: lineno) setup_rules @@ -370,12 +387,16 @@ def validate_rule_lhs_is_nterm! rules.each do |rule| next if rule.lhs.nterm? - errors << "[BUG] LHS of #{rule} (line: #{rule.lineno}) is term. It should be nterm." + errors << "[BUG] LHS of #{rule.display_name} (line: #{rule.lineno}) is term. It should be nterm." end return if errors.empty? raise errors.join("\n") end + + def set_locations + @locations = @locations || @rules.any? {|rule| rule.contains_at_reference? } + end end end diff --git a/tool/lrama/lib/lrama/grammar/auxiliary.rb b/tool/lrama/lib/lrama/grammar/auxiliary.rb index 933574b0f63733..2bacee6f1a87e7 100644 --- a/tool/lrama/lib/lrama/grammar/auxiliary.rb +++ b/tool/lrama/lib/lrama/grammar/auxiliary.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class Grammar # Grammar file information not used by States but by Output diff --git a/tool/lrama/lib/lrama/grammar/binding.rb b/tool/lrama/lib/lrama/grammar/binding.rb index e5ea3fb037c21b..5e6e7c594b6c7d 100644 --- a/tool/lrama/lib/lrama/grammar/binding.rb +++ b/tool/lrama/lib/lrama/grammar/binding.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class Grammar class Binding @@ -16,8 +18,17 @@ def resolve_symbol(symbol) resolved_args = symbol.args.map { |arg| resolve_symbol(arg) } Lrama::Lexer::Token::InstantiateRule.new(s_value: symbol.s_value, location: symbol.location, args: resolved_args, lhs_tag: symbol.lhs_tag) else - @parameter_to_arg[symbol.s_value] || symbol + parameter_to_arg(symbol) || symbol + end + end + + private + + def parameter_to_arg(symbol) + if (arg = @parameter_to_arg[symbol.s_value].dup) + arg.alias_name = symbol.alias_name end + arg end end end diff --git a/tool/lrama/lib/lrama/grammar/code.rb b/tool/lrama/lib/lrama/grammar/code.rb index 3bad599dae564f..b6c1cc49e74287 100644 --- a/tool/lrama/lib/lrama/grammar/code.rb +++ b/tool/lrama/lib/lrama/grammar/code.rb @@ -1,9 +1,11 @@ +# frozen_string_literal: true + require "forwardable" -require "lrama/grammar/code/destructor_code" -require "lrama/grammar/code/initial_action_code" -require "lrama/grammar/code/no_reference_code" -require "lrama/grammar/code/printer_code" -require "lrama/grammar/code/rule_action" +require_relative "code/destructor_code" +require_relative "code/initial_action_code" +require_relative "code/no_reference_code" +require_relative "code/printer_code" +require_relative "code/rule_action" module Lrama class Grammar diff --git a/tool/lrama/lib/lrama/grammar/code/destructor_code.rb b/tool/lrama/lib/lrama/grammar/code/destructor_code.rb index 70360eb90fab38..794017257c5486 100644 --- a/tool/lrama/lib/lrama/grammar/code/destructor_code.rb +++ b/tool/lrama/lib/lrama/grammar/code/destructor_code.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class Grammar class Code diff --git a/tool/lrama/lib/lrama/grammar/code/initial_action_code.rb b/tool/lrama/lib/lrama/grammar/code/initial_action_code.rb index a694f193cb4edd..02f2badc9e32e8 100644 --- a/tool/lrama/lib/lrama/grammar/code/initial_action_code.rb +++ b/tool/lrama/lib/lrama/grammar/code/initial_action_code.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class Grammar class Code diff --git a/tool/lrama/lib/lrama/grammar/code/no_reference_code.rb b/tool/lrama/lib/lrama/grammar/code/no_reference_code.rb index 6e614cc64ae7d0..ab12f32e297567 100644 --- a/tool/lrama/lib/lrama/grammar/code/no_reference_code.rb +++ b/tool/lrama/lib/lrama/grammar/code/no_reference_code.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class Grammar class Code diff --git a/tool/lrama/lib/lrama/grammar/code/printer_code.rb b/tool/lrama/lib/lrama/grammar/code/printer_code.rb index ffccd893950684..c0b8d24306ff05 100644 --- a/tool/lrama/lib/lrama/grammar/code/printer_code.rb +++ b/tool/lrama/lib/lrama/grammar/code/printer_code.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class Grammar class Code diff --git a/tool/lrama/lib/lrama/grammar/code/rule_action.rb b/tool/lrama/lib/lrama/grammar/code/rule_action.rb index d3c0eab64a9177..363ecdf25dfc19 100644 --- a/tool/lrama/lib/lrama/grammar/code/rule_action.rb +++ b/tool/lrama/lib/lrama/grammar/code/rule_action.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class Grammar class Code @@ -41,6 +43,7 @@ def reference_to_c(ref) when ref.type == :dollar && ref.name == "$" # $$ tag = ref.ex_tag || lhs.tag raise_tag_not_found_error(ref) unless tag + # @type var tag: Lexer::Token::Tag "(yyval.#{tag.member})" when ref.type == :at && ref.name == "$" # @$ "(yyloc)" @@ -50,6 +53,7 @@ def reference_to_c(ref) i = -position_in_rhs + ref.index tag = ref.ex_tag || rhs[ref.index - 1].tag raise_tag_not_found_error(ref) unless tag + # @type var tag: Lexer::Token::Tag "(yyvsp[#{i}].#{tag.member})" when ref.type == :at # @n i = -position_in_rhs + ref.index @@ -69,18 +73,18 @@ def position_in_rhs @rule.position_in_original_rule_rhs || @rule.rhs.count end - # If this is midrule action, RHS is a RHS of the original rule. + # If this is midrule action, RHS is an RHS of the original rule. def rhs (@rule.original_rule || @rule).rhs end - # Unlike `rhs`, LHS is always a LHS of the rule. + # Unlike `rhs`, LHS is always an LHS of the rule. def lhs @rule.lhs end def raise_tag_not_found_error(ref) - raise "Tag is not specified for '$#{ref.value}' in '#{@rule}'" + raise "Tag is not specified for '$#{ref.value}' in '#{@rule.display_name}'" end end end diff --git a/tool/lrama/lib/lrama/grammar/counter.rb b/tool/lrama/lib/lrama/grammar/counter.rb index c13f4ec3e382b0..dc91b87b711f2d 100644 --- a/tool/lrama/lib/lrama/grammar/counter.rb +++ b/tool/lrama/lib/lrama/grammar/counter.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class Grammar class Counter diff --git a/tool/lrama/lib/lrama/grammar/destructor.rb b/tool/lrama/lib/lrama/grammar/destructor.rb index 4b7059e9236ccb..a2b6fde0ed5b3d 100644 --- a/tool/lrama/lib/lrama/grammar/destructor.rb +++ b/tool/lrama/lib/lrama/grammar/destructor.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class Grammar class Destructor < Struct.new(:ident_or_tags, :token_code, :lineno, keyword_init: true) diff --git a/tool/lrama/lib/lrama/grammar/error_token.rb b/tool/lrama/lib/lrama/grammar/error_token.rb index 8efde7df33e018..50eaafeebc66fd 100644 --- a/tool/lrama/lib/lrama/grammar/error_token.rb +++ b/tool/lrama/lib/lrama/grammar/error_token.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class Grammar class ErrorToken < Struct.new(:ident_or_tags, :token_code, :lineno, keyword_init: true) diff --git a/tool/lrama/lib/lrama/grammar/parameterizing_rule.rb b/tool/lrama/lib/lrama/grammar/parameterizing_rule.rb index d371805f4b303f..ddc1a467ce974e 100644 --- a/tool/lrama/lib/lrama/grammar/parameterizing_rule.rb +++ b/tool/lrama/lib/lrama/grammar/parameterizing_rule.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require_relative 'parameterizing_rule/resolver' require_relative 'parameterizing_rule/rhs' require_relative 'parameterizing_rule/rule' diff --git a/tool/lrama/lib/lrama/grammar/parameterizing_rule/resolver.rb b/tool/lrama/lib/lrama/grammar/parameterizing_rule/resolver.rb index d8f3ae7897d28d..06f2f1cef7b9e4 100644 --- a/tool/lrama/lib/lrama/grammar/parameterizing_rule/resolver.rb +++ b/tool/lrama/lib/lrama/grammar/parameterizing_rule/resolver.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class Grammar class ParameterizingRule @@ -18,13 +20,17 @@ def find_rule(token) end def find_inline(token) - @rules.select { |rule| rule.name == token.s_value && rule.is_inline }.last + @rules.reverse.find { |rule| rule.name == token.s_value && rule.is_inline } end def created_lhs(lhs_s_value) @created_lhs_list.reverse.find { |created_lhs| created_lhs.s_value == lhs_s_value } end + def redefined_rules + @rules.select { |rule| @rules.count { |r| r.name == rule.name && r.required_parameters_count == rule.required_parameters_count } > 1 } + end + private def select_rules(rules, token) diff --git a/tool/lrama/lib/lrama/grammar/parameterizing_rule/rhs.rb b/tool/lrama/lib/lrama/grammar/parameterizing_rule/rhs.rb index 3eb92f8ef4e05e..d574841d08eee3 100644 --- a/tool/lrama/lib/lrama/grammar/parameterizing_rule/rhs.rb +++ b/tool/lrama/lib/lrama/grammar/parameterizing_rule/rhs.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class Grammar class ParameterizingRule @@ -13,6 +15,7 @@ def initialize def resolve_user_code(bindings) return unless user_code + resolved = Lexer::Token::UserCode.new(s_value: user_code.s_value, location: user_code.location) var_to_arg = {} symbols.each do |sym| resolved_sym = bindings.resolve_symbol(sym) @@ -22,14 +25,14 @@ def resolve_user_code(bindings) end var_to_arg.each do |var, arg| - user_code.references.each do |ref| + resolved.references.each do |ref| if ref.name == var ref.name = arg end end end - return user_code + return resolved end end end diff --git a/tool/lrama/lib/lrama/grammar/parameterizing_rule/rule.rb b/tool/lrama/lib/lrama/grammar/parameterizing_rule/rule.rb index 38f0fca4ea7ef7..cc200d2fb60da9 100644 --- a/tool/lrama/lib/lrama/grammar/parameterizing_rule/rule.rb +++ b/tool/lrama/lib/lrama/grammar/parameterizing_rule/rule.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class Grammar class ParameterizingRule @@ -12,6 +14,10 @@ def initialize(name, parameters, rhs_list, tag: nil, is_inline: false) @is_inline = is_inline @required_parameters_count = parameters.count end + + def to_s + "#{@name}(#{@parameters.map(&:s_value).join(', ')})" + end end end end diff --git a/tool/lrama/lib/lrama/grammar/percent_code.rb b/tool/lrama/lib/lrama/grammar/percent_code.rb index 8cbc5aef2ccf5b..416a2d27534b97 100644 --- a/tool/lrama/lib/lrama/grammar/percent_code.rb +++ b/tool/lrama/lib/lrama/grammar/percent_code.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class Grammar class PercentCode diff --git a/tool/lrama/lib/lrama/grammar/precedence.rb b/tool/lrama/lib/lrama/grammar/precedence.rb index fed739b3c047a4..13cf960c32a5f4 100644 --- a/tool/lrama/lib/lrama/grammar/precedence.rb +++ b/tool/lrama/lib/lrama/grammar/precedence.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class Grammar class Precedence < Struct.new(:type, :precedence, keyword_init: true) diff --git a/tool/lrama/lib/lrama/grammar/printer.rb b/tool/lrama/lib/lrama/grammar/printer.rb index 8984a96e1a65d7..b78459e819a7bf 100644 --- a/tool/lrama/lib/lrama/grammar/printer.rb +++ b/tool/lrama/lib/lrama/grammar/printer.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class Grammar class Printer < Struct.new(:ident_or_tags, :token_code, :lineno, keyword_init: true) diff --git a/tool/lrama/lib/lrama/grammar/reference.rb b/tool/lrama/lib/lrama/grammar/reference.rb index c56e7673a60d45..b044516bdb9a83 100644 --- a/tool/lrama/lib/lrama/grammar/reference.rb +++ b/tool/lrama/lib/lrama/grammar/reference.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class Grammar # type: :dollar or :at diff --git a/tool/lrama/lib/lrama/grammar/rule.rb b/tool/lrama/lib/lrama/grammar/rule.rb index 0e06edc80d6208..1f55bf8bfbdd49 100644 --- a/tool/lrama/lib/lrama/grammar/rule.rb +++ b/tool/lrama/lib/lrama/grammar/rule.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class Grammar # _rhs holds original RHS element. Use rhs to refer to Symbol. @@ -16,8 +18,7 @@ def ==(other) self.lineno == other.lineno end - # TODO: Change this to display_name - def to_s + def display_name l = lhs.id.s_value r = empty_rule? ? "ε" : rhs.map {|r| r.id.s_value }.join(" ") @@ -33,7 +34,7 @@ def as_comment end def with_actions - "#{to_s} {#{token_code&.s_value}}" + "#{display_name} {#{token_code&.s_value}}" end # opt_nl: ε <-- empty_rule @@ -55,6 +56,12 @@ def translated_code Code::RuleAction.new(type: :rule_action, token_code: token_code, rule: self).translated_code end + + def contains_at_reference? + return false unless token_code + + token_code.references.any? {|r| r.type == :at } + end end end end diff --git a/tool/lrama/lib/lrama/grammar/rule_builder.rb b/tool/lrama/lib/lrama/grammar/rule_builder.rb index ccb41e67f85aad..f6df22b6c7417b 100644 --- a/tool/lrama/lib/lrama/grammar/rule_builder.rb +++ b/tool/lrama/lib/lrama/grammar/rule_builder.rb @@ -1,12 +1,15 @@ +# frozen_string_literal: true + module Lrama class Grammar class RuleBuilder attr_accessor :lhs, :line attr_reader :lhs_tag, :rhs, :user_code, :precedence_sym - def initialize(rule_counter, midrule_action_counter, position_in_original_rule_rhs = nil, lhs_tag: nil, skip_preprocess_references: false) + def initialize(rule_counter, midrule_action_counter, parameterizing_rule_resolver, position_in_original_rule_rhs = nil, lhs_tag: nil, skip_preprocess_references: false) @rule_counter = rule_counter @midrule_action_counter = midrule_action_counter + @parameterizing_rule_resolver = parameterizing_rule_resolver @position_in_original_rule_rhs = position_in_original_rule_rhs @skip_preprocess_references = skip_preprocess_references @@ -19,16 +22,12 @@ def initialize(rule_counter, midrule_action_counter, position_in_original_rule_r @rules = [] @rule_builders_for_parameterizing_rules = [] @rule_builders_for_derived_rules = [] - @rule_builders_for_inline_rules = [] @parameterizing_rules = [] - @inline_rules = [] @midrule_action_rules = [] end def add_rhs(rhs) - if !@line - @line = rhs.line - end + @line ||= rhs.line flush_user_code @@ -36,9 +35,7 @@ def add_rhs(rhs) end def user_code=(user_code) - if !@line - @line = user_code&.line - end + @line ||= user_code&.line flush_user_code @@ -55,18 +52,41 @@ def complete_input freeze_rhs end - def setup_rules(parameterizing_rule_resolver) + def setup_rules preprocess_references unless @skip_preprocess_references - if rhs.any? { |token| parameterizing_rule_resolver.find_inline(token) } - resolve_inline(parameterizing_rule_resolver) - else - process_rhs(parameterizing_rule_resolver) - end + process_rhs build_rules end def rules - @parameterizing_rules + @inline_rules + @midrule_action_rules + @rules + @parameterizing_rules + @midrule_action_rules + @rules + end + + def has_inline_rules? + rhs.any? { |token| @parameterizing_rule_resolver.find_inline(token) } + end + + def resolve_inline_rules + resolved_builders = [] + rhs.each_with_index do |token, i| + if (inline_rule = @parameterizing_rule_resolver.find_inline(token)) + inline_rule.rhs_list.each do |inline_rhs| + rule_builder = RuleBuilder.new(@rule_counter, @midrule_action_counter, @parameterizing_rule_resolver, lhs_tag: lhs_tag) + if token.is_a?(Lexer::Token::InstantiateRule) + resolve_inline_rhs(rule_builder, inline_rhs, i, Binding.new(inline_rule, token.args)) + else + resolve_inline_rhs(rule_builder, inline_rhs, i) + end + rule_builder.lhs = lhs + rule_builder.line = line + rule_builder.precedence_sym = precedence_sym + rule_builder.user_code = replace_inline_user_code(inline_rhs, i) + resolved_builders << rule_builder + end + break + end + end + resolved_builders end private @@ -82,31 +102,25 @@ def preprocess_references def build_rules tokens = @replaced_rhs - if tokens - rule = Rule.new( - id: @rule_counter.increment, _lhs: lhs, _rhs: tokens, lhs_tag: lhs_tag, token_code: user_code, - position_in_original_rule_rhs: @position_in_original_rule_rhs, precedence_sym: precedence_sym, lineno: line - ) - @rules = [rule] - @parameterizing_rules = @rule_builders_for_parameterizing_rules.map do |rule_builder| - rule_builder.rules - end.flatten - @midrule_action_rules = @rule_builders_for_derived_rules.map do |rule_builder| - rule_builder.rules - end.flatten - @midrule_action_rules.each do |r| - r.original_rule = rule - end - else - @inline_rules = @rule_builders_for_inline_rules.map do |rule_builder| - rule_builder.rules - end.flatten + rule = Rule.new( + id: @rule_counter.increment, _lhs: lhs, _rhs: tokens, lhs_tag: lhs_tag, token_code: user_code, + position_in_original_rule_rhs: @position_in_original_rule_rhs, precedence_sym: precedence_sym, lineno: line + ) + @rules = [rule] + @parameterizing_rules = @rule_builders_for_parameterizing_rules.map do |rule_builder| + rule_builder.rules + end.flatten + @midrule_action_rules = @rule_builders_for_derived_rules.map do |rule_builder| + rule_builder.rules + end.flatten + @midrule_action_rules.each do |r| + r.original_rule = rule end end # rhs is a mixture of variety type of tokens like `Ident`, `InstantiateRule`, `UserCode` and so on. # `#process_rhs` replaces some kind of tokens to `Ident` so that all `@replaced_rhs` are `Ident` or `Char`. - def process_rhs(parameterizing_rule_resolver) + def process_rhs return if @replaced_rhs @replaced_rhs = [] @@ -118,26 +132,26 @@ def process_rhs(parameterizing_rule_resolver) when Lrama::Lexer::Token::Ident @replaced_rhs << token when Lrama::Lexer::Token::InstantiateRule - parameterizing_rule = parameterizing_rule_resolver.find_rule(token) + parameterizing_rule = @parameterizing_rule_resolver.find_rule(token) raise "Unexpected token. #{token}" unless parameterizing_rule bindings = Binding.new(parameterizing_rule, token.args) lhs_s_value = lhs_s_value(token, bindings) - if (created_lhs = parameterizing_rule_resolver.created_lhs(lhs_s_value)) + if (created_lhs = @parameterizing_rule_resolver.created_lhs(lhs_s_value)) @replaced_rhs << created_lhs else lhs_token = Lrama::Lexer::Token::Ident.new(s_value: lhs_s_value, location: token.location) @replaced_rhs << lhs_token - parameterizing_rule_resolver.created_lhs_list << lhs_token + @parameterizing_rule_resolver.created_lhs_list << lhs_token parameterizing_rule.rhs_list.each do |r| - rule_builder = RuleBuilder.new(@rule_counter, @midrule_action_counter, lhs_tag: token.lhs_tag || parameterizing_rule.tag) + rule_builder = RuleBuilder.new(@rule_counter, @midrule_action_counter, @parameterizing_rule_resolver, lhs_tag: token.lhs_tag || parameterizing_rule.tag) rule_builder.lhs = lhs_token r.symbols.each { |sym| rule_builder.add_rhs(bindings.resolve_symbol(sym)) } rule_builder.line = line rule_builder.precedence_sym = r.precedence_sym rule_builder.user_code = r.resolve_user_code(bindings) rule_builder.complete_input - rule_builder.setup_rules(parameterizing_rule_resolver) + rule_builder.setup_rules @rule_builders_for_parameterizing_rules << rule_builder end end @@ -147,11 +161,11 @@ def process_rhs(parameterizing_rule_resolver) new_token = Lrama::Lexer::Token::Ident.new(s_value: prefix + @midrule_action_counter.increment.to_s) @replaced_rhs << new_token - rule_builder = RuleBuilder.new(@rule_counter, @midrule_action_counter, i, lhs_tag: tag, skip_preprocess_references: true) + rule_builder = RuleBuilder.new(@rule_counter, @midrule_action_counter, @parameterizing_rule_resolver, i, lhs_tag: tag, skip_preprocess_references: true) rule_builder.lhs = new_token rule_builder.user_code = token rule_builder.complete_input - rule_builder.setup_rules(parameterizing_rule_resolver) + rule_builder.setup_rules @rule_builders_for_derived_rules << rule_builder else @@ -172,27 +186,10 @@ def lhs_s_value(token, bindings) "#{token.rule_name}_#{s_values.join('_')}" end - def resolve_inline(parameterizing_rule_resolver) - rhs.each_with_index do |token, i| - if inline_rule = parameterizing_rule_resolver.find_inline(token) - inline_rule.rhs_list.each_with_index do |inline_rhs| - rule_builder = RuleBuilder.new(@rule_counter, @midrule_action_counter, lhs_tag: lhs_tag, skip_preprocess_references: true) - resolve_inline_rhs(rule_builder, inline_rhs, i) - rule_builder.lhs = lhs - rule_builder.line = line - rule_builder.user_code = replace_inline_user_code(inline_rhs, i) - rule_builder.complete_input - rule_builder.setup_rules(parameterizing_rule_resolver) - @rule_builders_for_inline_rules << rule_builder - end - end - end - end - - def resolve_inline_rhs(rule_builder, inline_rhs, index) + def resolve_inline_rhs(rule_builder, inline_rhs, index, bindings = nil) rhs.each_with_index do |token, i| if index == i - inline_rhs.symbols.each { |sym| rule_builder.add_rhs(sym) } + inline_rhs.symbols.each { |sym| rule_builder.add_rhs(bindings.nil? ? sym : bindings.resolve_symbol(sym)) } else rule_builder.add_rhs(token) end @@ -204,6 +201,11 @@ def replace_inline_user_code(inline_rhs, index) return user_code if user_code.nil? code = user_code.s_value.gsub(/\$#{index + 1}/, inline_rhs.user_code.s_value) + user_code.references.each do |ref| + next if ref.index.nil? || ref.index <= index # nil is a case for `$$` + code = code.gsub(/\$#{ref.index}/, "$#{ref.index + (inline_rhs.symbols.count-1)}") + code = code.gsub(/@#{ref.index}/, "@#{ref.index + (inline_rhs.symbols.count-1)}") + end Lrama::Lexer::Token::UserCode.new(s_value: code, location: user_code.location) end @@ -238,9 +240,6 @@ def numberize_references end if ref.number - # TODO: When Inlining is implemented, for example, if `$1` is expanded to multiple RHS tokens, - # `$2` needs to access `$2 + n` to actually access it. So, after the Inlining implementation, - # it needs resolves from number to index. ref.index = ref.number end diff --git a/tool/lrama/lib/lrama/grammar/symbol.rb b/tool/lrama/lib/lrama/grammar/symbol.rb index deb67ad9a82c32..f9dffcad6c6b96 100644 --- a/tool/lrama/lib/lrama/grammar/symbol.rb +++ b/tool/lrama/lib/lrama/grammar/symbol.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # Symbol is both of nterm and term # `number` is both for nterm and term # `token_id` is tokentype for term, internal sequence number for nterm diff --git a/tool/lrama/lib/lrama/grammar/symbols.rb b/tool/lrama/lib/lrama/grammar/symbols.rb index cc9b4ec5599f80..337241d1b2ad47 100644 --- a/tool/lrama/lib/lrama/grammar/symbols.rb +++ b/tool/lrama/lib/lrama/grammar/symbols.rb @@ -1 +1,3 @@ +# frozen_string_literal: true + require_relative "symbols/resolver" diff --git a/tool/lrama/lib/lrama/grammar/symbols/resolver.rb b/tool/lrama/lib/lrama/grammar/symbols/resolver.rb index 1788ed63fabbc5..f245943ce1fb4d 100644 --- a/tool/lrama/lib/lrama/grammar/symbols/resolver.rb +++ b/tool/lrama/lib/lrama/grammar/symbols/resolver.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class Grammar class Symbols @@ -42,7 +44,9 @@ def add_term(id:, alias_name: nil, tag: nil, token_id: nil, replace: false) end def add_nterm(id:, alias_name: nil, tag: nil) - return if find_symbol_by_id(id) + if (sym = find_symbol_by_id(id)) + return sym + end @symbols = nil nterm = Symbol.new( diff --git a/tool/lrama/lib/lrama/grammar/type.rb b/tool/lrama/lib/lrama/grammar/type.rb index 6b4b0961a14177..65537288b310b4 100644 --- a/tool/lrama/lib/lrama/grammar/type.rb +++ b/tool/lrama/lib/lrama/grammar/type.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class Grammar class Type diff --git a/tool/lrama/lib/lrama/grammar/union.rb b/tool/lrama/lib/lrama/grammar/union.rb index 854bffb5c143a3..5f1bee0069af23 100644 --- a/tool/lrama/lib/lrama/grammar/union.rb +++ b/tool/lrama/lib/lrama/grammar/union.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class Grammar class Union < Struct.new(:code, :lineno, keyword_init: true) diff --git a/tool/lrama/lib/lrama/grammar_validator.rb b/tool/lrama/lib/lrama/grammar_validator.rb new file mode 100644 index 00000000000000..7790499589dfcc --- /dev/null +++ b/tool/lrama/lib/lrama/grammar_validator.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true + +module Lrama + class GrammarValidator + def initialize(grammar, states, logger) + @grammar = grammar + @states = states + @logger = logger + end + + def valid? + conflicts_within_threshold? + end + + private + + def conflicts_within_threshold? + return true unless @grammar.expect + + [sr_conflicts_within_threshold(@grammar.expect), rr_conflicts_within_threshold(0)].all? + end + + def sr_conflicts_within_threshold(expected) + return true if expected == @states.sr_conflicts_count + + @logger.error("shift/reduce conflicts: #{@states.sr_conflicts_count} found, #{expected} expected") + false + end + + def rr_conflicts_within_threshold(expected) + return true if expected == @states.rr_conflicts_count + + @logger.error("reduce/reduce conflicts: #{@states.rr_conflicts_count} found, #{expected} expected") + false + end + end +end diff --git a/tool/lrama/lib/lrama/lexer.rb b/tool/lrama/lib/lrama/lexer.rb index 40622a51b47467..0a8f94334f7f51 100644 --- a/tool/lrama/lib/lrama/lexer.rb +++ b/tool/lrama/lib/lrama/lexer.rb @@ -1,15 +1,17 @@ +# frozen_string_literal: true + require "strscan" -require "lrama/lexer/grammar_file" -require "lrama/lexer/location" -require "lrama/lexer/token" +require_relative "lexer/grammar_file" +require_relative "lexer/location" +require_relative "lexer/token" module Lrama class Lexer attr_reader :head_line, :head_column, :line attr_accessor :status, :end_symbol - SYMBOLS = ['%{', '%}', '%%', '{', '}', '\[', '\]', '\(', '\)', '\,', ':', '\|', ';'] + SYMBOLS = ['%{', '%}', '%%', '{', '}', '\[', '\]', '\(', '\)', '\,', ':', '\|', ';'].freeze PERCENT_TOKENS = %w( %union %token @@ -38,7 +40,8 @@ class Lexer %rule %no-stdlib %inline - ) + %locations + ).freeze def initialize(grammar_file) @grammar_file = grammar_file @@ -71,7 +74,7 @@ def location end def lex_token - while !@scanner.eos? do + until @scanner.eos? do case when @scanner.scan(/\n/) newline @@ -126,7 +129,7 @@ def lex_c_code code = '' reset_first_position - while !@scanner.eos? do + until @scanner.eos? do case when @scanner.scan(/{/) code += @scanner.matched @@ -163,7 +166,7 @@ def lex_c_code private def lex_comment - while !@scanner.eos? do + until @scanner.eos? do case when @scanner.scan(/\n/) newline diff --git a/tool/lrama/lib/lrama/lexer/grammar_file.rb b/tool/lrama/lib/lrama/lexer/grammar_file.rb index 3d3368625da5b6..45c3122975bbc0 100644 --- a/tool/lrama/lib/lrama/lexer/grammar_file.rb +++ b/tool/lrama/lib/lrama/lexer/grammar_file.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class Lexer class GrammarFile diff --git a/tool/lrama/lib/lrama/lexer/location.rb b/tool/lrama/lib/lrama/lexer/location.rb index aefce3e16b91d7..bf8f4f7e3eb11a 100644 --- a/tool/lrama/lib/lrama/lexer/location.rb +++ b/tool/lrama/lib/lrama/lexer/location.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class Lexer class Location diff --git a/tool/lrama/lib/lrama/lexer/token.rb b/tool/lrama/lib/lrama/lexer/token.rb index 59b49d5fba4f72..45a097f682989b 100644 --- a/tool/lrama/lib/lrama/lexer/token.rb +++ b/tool/lrama/lib/lrama/lexer/token.rb @@ -1,8 +1,10 @@ -require 'lrama/lexer/token/char' -require 'lrama/lexer/token/ident' -require 'lrama/lexer/token/instantiate_rule' -require 'lrama/lexer/token/tag' -require 'lrama/lexer/token/user_code' +# frozen_string_literal: true + +require_relative 'token/char' +require_relative 'token/ident' +require_relative 'token/instantiate_rule' +require_relative 'token/tag' +require_relative 'token/user_code' module Lrama class Lexer diff --git a/tool/lrama/lib/lrama/lexer/token/char.rb b/tool/lrama/lib/lrama/lexer/token/char.rb index ec3560ca097230..9e21952c424b0d 100644 --- a/tool/lrama/lib/lrama/lexer/token/char.rb +++ b/tool/lrama/lib/lrama/lexer/token/char.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class Lexer class Token diff --git a/tool/lrama/lib/lrama/lexer/token/ident.rb b/tool/lrama/lib/lrama/lexer/token/ident.rb index e576eaeccd4955..84835c00bc8c8b 100644 --- a/tool/lrama/lib/lrama/lexer/token/ident.rb +++ b/tool/lrama/lib/lrama/lexer/token/ident.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class Lexer class Token diff --git a/tool/lrama/lib/lrama/lexer/token/instantiate_rule.rb b/tool/lrama/lib/lrama/lexer/token/instantiate_rule.rb index 1c4d1095c8f22b..db7e611c5f8a57 100644 --- a/tool/lrama/lib/lrama/lexer/token/instantiate_rule.rb +++ b/tool/lrama/lib/lrama/lexer/token/instantiate_rule.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class Lexer class Token diff --git a/tool/lrama/lib/lrama/lexer/token/tag.rb b/tool/lrama/lib/lrama/lexer/token/tag.rb index e54d77391570f8..52dcb50ce7c249 100644 --- a/tool/lrama/lib/lrama/lexer/token/tag.rb +++ b/tool/lrama/lib/lrama/lexer/token/tag.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class Lexer class Token diff --git a/tool/lrama/lib/lrama/lexer/token/user_code.rb b/tool/lrama/lib/lrama/lexer/token/user_code.rb index 4d487bf01cee4e..971220864270a2 100644 --- a/tool/lrama/lib/lrama/lexer/token/user_code.rb +++ b/tool/lrama/lib/lrama/lexer/token/user_code.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "strscan" module Lrama @@ -16,7 +18,7 @@ def _references scanner = StringScanner.new(s_value) references = [] - while !scanner.eos? do + until scanner.eos? do case when reference = scan_reference(scanner) references << reference diff --git a/tool/lrama/lib/lrama/logger.rb b/tool/lrama/lib/lrama/logger.rb new file mode 100644 index 00000000000000..e98eef0fa533a8 --- /dev/null +++ b/tool/lrama/lib/lrama/logger.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +module Lrama + class Logger + def initialize(out = STDERR) + @out = out + end + + def warn(message) + @out << message << "\n" + end + + def error(message) + @out << message << "\n" + end + end +end diff --git a/tool/lrama/lib/lrama/option_parser.rb b/tool/lrama/lib/lrama/option_parser.rb index 1e4d448fd1f1a1..0727d1b37fe7c5 100644 --- a/tool/lrama/lib/lrama/option_parser.rb +++ b/tool/lrama/lib/lrama/option_parser.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'optparse' module Lrama @@ -16,7 +18,7 @@ def parse(argv) @options.report_opts = validate_report(@report) @options.grammar_file = argv.shift - if !@options.grammar_file + unless @options.grammar_file abort "File should be specified\n" end @@ -63,20 +65,35 @@ def parse_by_option_parser(argv) o.separator 'Output:' o.on('-H', '--header=[FILE]', 'also produce a header file named FILE') {|v| @options.header = true; @options.header_file = v } o.on('-d', 'also produce a header file') { @options.header = true } - o.on('-r', '--report=THINGS', Array, 'also produce details on the automaton') {|v| @report = v } + o.on('-r', '--report=REPORTS', Array, 'also produce details on the automaton') {|v| @report = v } o.on_tail '' - o.on_tail 'Valid Reports:' - o.on_tail " #{VALID_REPORTS.join(' ')}" - + o.on_tail 'REPORTS is a list of comma-separated words that can include:' + o.on_tail ' states describe the states' + o.on_tail ' itemsets complete the core item sets with their closure' + o.on_tail ' lookaheads explicitly associate lookahead tokens to items' + o.on_tail ' solved describe shift/reduce conflicts solving' + o.on_tail ' counterexamples, cex generate conflict counterexamples' + o.on_tail ' rules list unused rules' + o.on_tail ' terms list unused terminals' + o.on_tail ' verbose report detailed internal state and analysis results' + o.on_tail ' all include all the above reports' + o.on_tail ' none disable all reports' o.on('--report-file=FILE', 'also produce details on the automaton output to a file named FILE') {|v| @options.report_file = v } o.on('-o', '--output=FILE', 'leave output to FILE') {|v| @options.outfile = v } - - o.on('--trace=THINGS', Array, 'also output trace logs at runtime') {|v| @trace = v } + o.on('--trace=TRACES', Array, 'also output trace logs at runtime') {|v| @trace = v } o.on_tail '' - o.on_tail 'Valid Traces:' - o.on_tail " #{VALID_TRACES.join(' ')}" - - o.on('-v', 'reserved, do nothing') { } + o.on_tail 'TRACES is a list of comma-separated words that can include:' + o.on_tail ' automaton display states' + o.on_tail ' closure display states' + o.on_tail ' rules display grammar rules' + o.on_tail ' actions display grammar rules with actions' + o.on_tail ' time display generation time' + o.on_tail ' all include all the above traces' + o.on_tail ' none disable all traces' + o.on('-v', '--verbose', "same as '--report=state'") {|_v| @report << 'states' } + o.separator '' + o.separator 'Diagnostics:' + o.on('-W', '--warnings', 'report the warnings') {|v| @options.diagnostic = true } o.separator '' o.separator 'Error Recovery:' o.on('-e', 'enable error recovery') {|v| @options.error_recovery = true } @@ -89,47 +106,55 @@ def parse_by_option_parser(argv) end end - BISON_REPORTS = %w[states itemsets lookaheads solved counterexamples cex all none] - OTHER_REPORTS = %w[verbose] - NOT_SUPPORTED_REPORTS = %w[cex none] - VALID_REPORTS = BISON_REPORTS + OTHER_REPORTS - NOT_SUPPORTED_REPORTS + ALIASED_REPORTS = { cex: :counterexamples }.freeze + VALID_REPORTS = %i[states itemsets lookaheads solved counterexamples rules terms verbose].freeze def validate_report(report) - list = VALID_REPORTS h = { grammar: true } + return h if report.empty? + return {} if report == ['none'] + if report == ['all'] + VALID_REPORTS.each { |r| h[r] = true } + return h + end report.each do |r| - if list.include?(r) - h[r.to_sym] = true + aliased = aliased_report_option(r) + if VALID_REPORTS.include?(aliased) + h[aliased] = true else raise "Invalid report option \"#{r}\"." end end - if h[:all] - (BISON_REPORTS - NOT_SUPPORTED_REPORTS).each do |r| - h[r.to_sym] = true - end - - h.delete(:all) - end - return h end + def aliased_report_option(opt) + (ALIASED_REPORTS[opt.to_sym] || opt).to_sym + end + VALID_TRACES = %w[ - none locations scan parse automaton bitsets - closure grammar rules actions resource - sets muscles tools m4-early m4 skeleton time - ielr cex all - ] + locations scan parse automaton bitsets closure + grammar rules actions resource sets muscles + tools m4-early m4 skeleton time ielr cex + ].freeze + NOT_SUPPORTED_TRACES = %w[ + locations scan parse bitsets grammar resource + sets muscles tools m4-early m4 skeleton ielr cex + ].freeze def validate_trace(trace) - list = VALID_TRACES h = {} + return h if trace.empty? || trace == ['none'] + supported = VALID_TRACES - NOT_SUPPORTED_TRACES + if trace == ['all'] + supported.each { |t| h[t.to_sym] = true } + return h + end trace.each do |t| - if list.include?(t) + if supported.include?(t) h[t.to_sym] = true else raise "Invalid trace option \"#{t}\"." diff --git a/tool/lrama/lib/lrama/options.rb b/tool/lrama/lib/lrama/options.rb index 739ca16f5598f9..ccd7680348bbff 100644 --- a/tool/lrama/lib/lrama/options.rb +++ b/tool/lrama/lib/lrama/options.rb @@ -1,11 +1,13 @@ +# frozen_string_literal: true + module Lrama # Command line options. class Options attr_accessor :skeleton, :header, :header_file, :report_file, :outfile, :error_recovery, :grammar_file, - :trace_opts, :report_opts, :y, - :debug + :trace_opts, :report_opts, + :diagnostic, :y, :debug def initialize @skeleton = "bison/yacc.c" @@ -17,6 +19,7 @@ def initialize @grammar_file = nil @trace_opts = nil @report_opts = nil + @diagnostic = false @y = STDIN @debug = false end diff --git a/tool/lrama/lib/lrama/output.rb b/tool/lrama/lib/lrama/output.rb index 642c8b4708f07c..3c7316ac6d871c 100644 --- a/tool/lrama/lib/lrama/output.rb +++ b/tool/lrama/lib/lrama/output.rb @@ -1,6 +1,8 @@ +# frozen_string_literal: true + require "erb" require "forwardable" -require "lrama/report/duration" +require_relative "report/duration" module Lrama class Output @@ -63,37 +65,29 @@ def render # A part of b4_token_enums def token_enums - str = "" - - @context.yytokentype.each do |s_value, token_id, display_name| + @context.yytokentype.map do |s_value, token_id, display_name| s = sprintf("%s = %d%s", s_value, token_id, token_id == yymaxutok ? "" : ",") if display_name - str << sprintf(" %-30s /* %s */\n", s, display_name) + sprintf(" %-30s /* %s */\n", s, display_name) else - str << sprintf(" %s\n", s) + sprintf(" %s\n", s) end - end - - str + end.join end # b4_symbol_enum def symbol_enum - str = "" - last_sym_number = @context.yysymbol_kind_t.last[1] - @context.yysymbol_kind_t.each do |s_value, sym_number, display_name| + @context.yysymbol_kind_t.map do |s_value, sym_number, display_name| s = sprintf("%s = %d%s", s_value, sym_number, (sym_number == last_sym_number) ? "" : ",") if display_name - str << sprintf(" %-40s /* %s */\n", s, display_name) + sprintf(" %-40s /* %s */\n", s, display_name) else - str << sprintf(" %s\n", s) + sprintf(" %s\n", s) end - end - - str + end.join end def yytranslate @@ -132,12 +126,10 @@ def int_type_for(ary) end def symbol_actions_for_printer - str = "" - - @grammar.symbols.each do |sym| + @grammar.symbols.map do |sym| next unless sym.printer - str << <<-STR + <<-STR case #{sym.enum_name}: /* #{sym.comment} */ #line #{sym.printer.lineno} "#{@grammar_file_path}" {#{sym.printer.translated_code(sym.tag)}} @@ -145,18 +137,14 @@ def symbol_actions_for_printer break; STR - end - - str + end.join end def symbol_actions_for_destructor - str = "" - - @grammar.symbols.each do |sym| + @grammar.symbols.map do |sym| next unless sym.destructor - str << <<-STR + <<-STR case #{sym.enum_name}: /* #{sym.comment} */ #line #{sym.destructor.lineno} "#{@grammar_file_path}" {#{sym.destructor.translated_code(sym.tag)}} @@ -164,9 +152,7 @@ def symbol_actions_for_destructor break; STR - end - - str + end.join end # b4_user_initial_action @@ -236,12 +222,10 @@ def after_pop_stack_function(len, comment = "") end def symbol_actions_for_error_token - str = "" - - @grammar.symbols.each do |sym| + @grammar.symbols.map do |sym| next unless sym.error_token - str << <<-STR + <<-STR case #{sym.enum_name}: /* #{sym.comment} */ #line #{sym.error_token.lineno} "#{@grammar_file_path}" {#{sym.error_token.translated_code(sym.tag)}} @@ -249,22 +233,18 @@ def symbol_actions_for_error_token break; STR - end - - str + end.join end # b4_user_actions def user_actions - str = "" - - @context.states.rules.each do |rule| + action = @context.states.rules.map do |rule| next unless rule.token_code code = rule.token_code spaces = " " * (code.column - 1) - str << <<-STR + <<-STR case #{rule.id + 1}: /* #{rule.as_comment} */ #line #{code.line} "#{@grammar_file_path}" #{spaces}{#{rule.translated_code}} @@ -272,14 +252,12 @@ def user_actions break; STR - end + end.join - str << <<-STR + action + <<-STR #line [@oline@] [@ofile@] STR - - str end def omit_blanks(param) @@ -343,7 +321,7 @@ def lex_param_name # b4_parse_param_use def parse_param_use(val, loc) - str = <<-STR + str = <<-STR.dup YY_USE (#{val}); YY_USE (#{loc}); STR @@ -357,7 +335,8 @@ def parse_param_use(val, loc) # b4_yylex_formals def yylex_formals - ary = ["&yylval", "&yylloc"] + ary = ["&yylval"] + ary << "&yylloc" if @grammar.locations if @grammar.lex_param ary << lex_param_name @@ -397,17 +376,9 @@ def aux def int_array_to_string(ary) last = ary.count - 1 - s = ary.each_with_index.each_slice(10).map do |slice| - str = " " - - slice.each do |e, i| - str << sprintf("%6d%s", e, (i == last) ? "" : ",") - end - - str - end - - s.join("\n") + ary.each_with_index.each_slice(10).map do |slice| + " " + slice.map { |e, i| sprintf("%6d%s", e, (i == last) ? "" : ",") }.join + end.join("\n") end def spec_mapped_header_file @@ -457,26 +428,24 @@ def partial_file(file) end def template_dir - File.expand_path("../../../template", __FILE__) + File.expand_path('../../template', __dir__) end def string_array_to_string(ary) - str = "" + result = "" tmp = " " ary.each do |s| - s = s.gsub('\\', '\\\\\\\\') - s = s.gsub('"', '\\"') - - if (tmp + s + " \"\",").length > 75 - str << tmp << "\n" - tmp = " \"#{s}\"," + replaced = s.gsub('\\', '\\\\\\\\').gsub('"', '\\"') + if (tmp + replaced + " \"\",").length > 75 + result = "#{result}#{tmp}\n" + tmp = " \"#{replaced}\"," else - tmp << " \"#{s}\"," + tmp = "#{tmp} \"#{replaced}\"," end end - str << tmp + result + tmp end def replace_special_variables(str, ofile) diff --git a/tool/lrama/lib/lrama/parser.rb b/tool/lrama/lib/lrama/parser.rb index 04603105b4d96a..6a35dba290e432 100644 --- a/tool/lrama/lib/lrama/parser.rb +++ b/tool/lrama/lib/lrama/parser.rb @@ -1,6 +1,6 @@ # # DO NOT MODIFY!!!! -# This file is automatically generated by Racc 1.7.3 +# This file is automatically generated by Racc 1.8.1 # from Racc grammar file "parser.y". # @@ -23,7 +23,7 @@ $".push "#{__dir__}/racc/info.rb" module Racc - VERSION = '1.7.3' + VERSION = '1.8.1' Version = VERSION Copyright = 'Copyright (c) 1999-2006 Minero Aoki' end @@ -31,10 +31,6 @@ module Racc end -unless defined?(NotImplementedError) - NotImplementedError = NotImplementError # :nodoc: -end - module Racc class ParseError < StandardError; end end @@ -42,7 +38,7 @@ class ParseError < StandardError; end ParseError = Racc::ParseError # :nodoc: end -# Racc is a LALR(1) parser generator. +# Racc is an LALR(1) parser generator. # It is written in Ruby itself, and generates Ruby programs. # # == Command-line Reference @@ -658,7 +654,7 @@ def token_to_str(t) module Lrama class Parser < Racc::Parser -module_eval(<<'...end parser.y/module_eval...', 'parser.y', 536) +module_eval(<<'...end parser.y/module_eval...', 'parser.y', 417) include Lrama::Report::Duration @@ -732,322 +728,297 @@ def raise_parse_error(error_message, location) ##### State transition tables begin ### racc_action_table = [ - 98, 51, 99, 163, 88, 79, 51, 51, 180, 163, - 79, 79, 51, 162, 180, 156, 79, 165, 157, 51, - 3, 50, 181, 165, 70, 51, 8, 50, 181, 79, - 75, 51, 6, 50, 7, 161, 82, 47, 51, 51, - 50, 50, 89, 82, 82, 166, 41, 51, 100, 50, - 182, 166, 82, 51, 48, 50, 182, 23, 25, 26, + 94, 48, 95, 166, 48, 77, 172, 48, 77, 166, + 48, 77, 172, 48, 77, 47, 6, 85, 69, 48, + 48, 47, 47, 77, 74, 81, 48, 48, 47, 47, + 40, 81, 81, 48, 41, 47, 92, 48, 81, 47, + 44, 77, 103, 168, 169, 45, 175, 169, 96, 168, + 169, 52, 175, 169, 86, 20, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 92, 48, 4, 47, 5, 77, 103, 48, 48, + 47, 47, 77, 103, 116, 48, 4, 47, 5, 77, + 20, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 52, 20, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 47, 51, 51, 50, 50, 93, 79, 197, - 51, 51, 50, 50, 79, 197, 51, 51, 50, 50, - 79, 197, 23, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 9, 51, 54, - 50, 14, 15, 16, 17, 18, 19, 54, 54, 20, - 21, 22, 23, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 51, 51, - 50, 50, 79, 197, 51, 51, 50, 50, 79, 197, - 51, 51, 50, 50, 79, 197, 51, 51, 50, 50, - 79, 79, 51, 51, 50, 50, 79, 79, 51, 51, - 50, 50, 79, 79, 51, 51, 50, 207, 79, 79, - 51, 51, 207, 207, 79, 79, 51, 51, 50, 50, - 79, 187, 188, 189, 96, 187, 188, 189, 96, 217, - 221, 229, 218, 218, 218, 51, 51, 50, 50, 187, - 188, 189, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 90, 94, 96, 101, 101, 101, 103, - 109, 113, 114, 117, 117, 117, 117, 120, 47, 124, - 125, 127, 129, 130, 131, 132, 133, 136, 140, 141, - 142, 143, 146, 147, 148, 150, 160, 168, 170, 171, - 172, 173, 174, 176, 177, 178, 146, 184, 192, 193, - 200, 160, 204, 176, 211, 160, 215, 216, 178, 176, - 226, 176, 228, 96, 96, 176 ] + 37, 38, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 43, 20, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 48, 48, + 47, 47, 77, 103, 48, 48, 47, 47, 77, 77, + 48, 48, 47, 47, 77, 77, 48, 48, 196, 196, + 77, 77, 48, 48, 47, 196, 77, 77, 148, 170, + 52, 149, 149, 180, 181, 182, 131, 180, 181, 182, + 131, 203, 208, 215, 204, 204, 204, 48, 48, 47, + 47, 48, 48, 47, 47, 48, 48, 47, 47, 180, + 181, 182, 119, 120, 55, 52, 52, 52, 52, 52, + 61, 62, 63, 64, 65, 87, 52, 52, 106, 109, + 111, 118, 125, 126, 128, 131, 132, 77, 140, 141, + 142, 143, 145, 146, 153, 140, 155, 153, 159, 160, + 161, 163, 164, 171, 176, 153, 183, 131, 187, 153, + 189, 131, 153, 198, 153, 131, 161, 164, 205, 164, + 161, 161, 213, 131, 161 ] racc_action_check = [ - 49, 145, 49, 145, 39, 145, 159, 183, 159, 183, - 159, 183, 201, 144, 201, 139, 201, 145, 139, 33, - 1, 33, 159, 183, 33, 34, 3, 34, 201, 34, - 34, 35, 2, 35, 2, 144, 35, 9, 36, 37, - 36, 37, 39, 36, 37, 145, 7, 38, 49, 38, - 159, 183, 38, 15, 14, 15, 201, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 42, 69, 172, 69, 172, 42, 172, 172, - 173, 70, 173, 70, 173, 173, 174, 81, 174, 81, - 174, 174, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 4, 82, 16, - 82, 4, 4, 4, 4, 4, 4, 17, 18, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 194, 109, - 194, 109, 194, 194, 198, 111, 198, 111, 198, 198, - 199, 117, 199, 117, 199, 199, 74, 75, 74, 75, - 74, 75, 114, 116, 114, 116, 114, 116, 137, 166, - 137, 166, 137, 166, 182, 184, 182, 184, 182, 184, - 204, 216, 204, 216, 204, 216, 218, 119, 218, 119, - 218, 164, 164, 164, 164, 179, 179, 179, 179, 208, - 214, 223, 208, 214, 223, 134, 138, 134, 138, 209, - 209, 209, 19, 20, 23, 25, 26, 27, 28, 29, - 30, 31, 32, 40, 45, 46, 53, 55, 56, 57, - 68, 72, 73, 80, 85, 86, 87, 88, 89, 95, - 96, 102, 104, 105, 106, 107, 108, 112, 120, 121, - 122, 123, 124, 125, 126, 128, 141, 149, 151, 152, - 153, 154, 155, 156, 157, 158, 161, 163, 167, 169, - 175, 178, 180, 186, 190, 200, 205, 207, 213, 217, - 220, 221, 222, 226, 228, 230 ] + 46, 151, 46, 151, 157, 151, 157, 177, 157, 177, + 188, 177, 188, 32, 188, 32, 1, 38, 32, 33, + 34, 33, 34, 33, 33, 34, 35, 36, 35, 36, + 5, 35, 36, 37, 6, 37, 44, 58, 37, 58, + 9, 58, 58, 151, 151, 11, 157, 157, 46, 177, + 177, 13, 188, 188, 38, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 88, 59, 0, 59, 0, 59, 59, 60, 79, + 60, 79, 60, 60, 79, 72, 2, 72, 2, 72, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 14, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 100, 12, + 100, 12, 100, 100, 74, 111, 74, 111, 74, 111, + 168, 175, 168, 175, 168, 175, 183, 189, 183, 189, + 183, 189, 204, 205, 204, 205, 204, 205, 139, 154, + 15, 139, 154, 165, 165, 165, 165, 173, 173, 173, + 173, 195, 200, 212, 195, 200, 212, 67, 69, 67, + 69, 81, 106, 81, 106, 114, 116, 114, 116, 197, + 197, 197, 86, 86, 16, 17, 20, 24, 25, 26, + 27, 28, 29, 30, 31, 39, 50, 55, 66, 70, + 71, 85, 89, 90, 91, 92, 98, 110, 118, 119, + 120, 121, 130, 131, 141, 142, 144, 145, 146, 147, + 148, 149, 150, 156, 162, 164, 166, 167, 170, 171, + 172, 174, 176, 186, 187, 191, 192, 194, 196, 199, + 201, 203, 207, 208, 214 ] racc_action_pointer = [ - nil, 20, 22, 26, 98, nil, nil, 39, nil, 33, - nil, nil, nil, nil, 48, 50, 90, 98, 99, 207, - 194, nil, nil, 195, nil, 196, 197, 198, 213, 214, - 215, 216, 217, 16, 22, 28, 35, 36, 44, -1, - 221, nil, 68, nil, nil, 201, 174, nil, nil, -5, - nil, nil, nil, 207, nil, 208, 209, 210, nil, nil, - nil, nil, nil, nil, nil, nil, nil, nil, 222, 70, - 78, nil, 225, 224, 153, 154, nil, nil, nil, nil, - 225, 84, 105, nil, nil, 226, 227, 228, 197, 234, - nil, nil, nil, nil, nil, 197, 235, nil, nil, nil, - nil, nil, 239, nil, 240, 241, 242, 243, 244, 136, - nil, 142, 240, nil, 159, nil, 160, 148, nil, 184, - 243, 207, 239, 249, 206, 201, 252, nil, 253, nil, - nil, nil, nil, nil, 202, nil, nil, 165, 203, -26, - nil, 210, nil, nil, -10, -2, nil, nil, nil, 237, - nil, 238, 239, 240, 241, 242, 255, 259, 220, 3, - nil, 220, nil, 227, 143, nil, 166, 248, nil, 249, - nil, nil, 71, 77, 83, 228, nil, nil, 225, 147, - 232, nil, 171, 4, 172, nil, 265, nil, nil, nil, - 272, nil, nil, nil, 135, nil, nil, nil, 141, 147, - 229, 9, nil, nil, 177, 274, nil, 237, 158, 161, - nil, nil, nil, 233, 159, nil, 178, 271, 183, nil, - 260, 273, 262, 160, nil, nil, 232, nil, 233, nil, - 277, nil, nil ] + 63, 16, 76, 93, nil, 23, 34, nil, 119, 31, + nil, 39, 156, 5, 69, 144, 219, 179, nil, nil, + 180, nil, nil, nil, 181, 182, 183, 225, 226, 227, + 228, 229, 10, 16, 17, 23, 24, 30, 12, 233, + nil, nil, nil, nil, 32, nil, -5, nil, nil, nil, + 190, nil, nil, nil, nil, 191, nil, nil, 34, 69, + 75, nil, nil, nil, nil, nil, 230, 204, nil, 205, + 233, 232, 82, nil, 161, nil, nil, nil, nil, 76, + nil, 208, nil, nil, nil, 202, 218, nil, 67, 233, + 221, 222, 194, nil, nil, nil, nil, nil, 244, nil, + 155, nil, nil, nil, nil, nil, 209, nil, nil, nil, + 240, 162, nil, nil, 212, nil, 213, nil, 243, 208, + 211, 240, nil, nil, nil, nil, nil, nil, nil, nil, + 211, 248, nil, nil, nil, nil, nil, nil, nil, 148, + nil, 200, 250, nil, 254, 203, 206, 212, 252, 256, + 218, -2, nil, nil, 149, nil, 219, 1, nil, nil, + nil, nil, 223, nil, 211, 145, 227, 216, 167, nil, + 227, 215, 231, 149, 220, 168, 218, 4, nil, nil, + nil, nil, nil, 173, nil, nil, 271, 220, 7, 174, + nil, 224, 268, nil, 233, 161, 239, 171, nil, 235, + 162, 272, nil, 273, 179, 180, nil, 235, 232, nil, + nil, nil, 163, nil, 276, nil, nil ] racc_action_default = [ - -2, -138, -8, -138, -138, -3, -4, -138, 233, -138, - -9, -10, -11, -12, -138, -138, -138, -138, -138, -138, - -138, -24, -25, -138, -29, -138, -138, -138, -138, -138, - -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, - -138, -7, -123, -96, -98, -138, -120, -122, -13, -127, - -94, -95, -126, -15, -85, -16, -17, -138, -21, -26, - -30, -33, -36, -39, -40, -41, -42, -43, -44, -50, - -138, -53, -71, -45, -75, -138, -78, -80, -81, -135, - -46, -88, -138, -91, -93, -47, -48, -49, -138, -138, - -5, -1, -97, -124, -99, -138, -138, -14, -128, -129, - -130, -82, -138, -18, -138, -138, -138, -138, -138, -138, - -54, -51, -73, -72, -138, -79, -76, -138, -92, -89, - -138, -138, -138, -138, -104, -138, -138, -86, -138, -22, - -27, -31, -34, -37, -52, -55, -74, -77, -90, -138, - -58, -62, -6, -125, -100, -101, -105, -121, -83, -138, - -19, -138, -138, -138, -138, -138, -136, -138, -57, -60, - -63, -104, -103, -94, -120, -109, -138, -138, -87, -138, - -23, -28, -138, -138, -138, -138, -137, -59, -62, -120, - -94, -67, -138, -102, -138, -106, -136, -113, -114, -115, - -138, -112, -84, -20, -32, -131, -133, -134, -35, -38, - -62, -61, -64, -65, -138, -138, -70, -94, -138, -116, - -107, -110, -132, -56, -138, -68, -138, -136, -138, -118, - -138, -136, -138, -138, -108, -117, -120, -66, -120, -119, - -136, -69, -111 ] + -1, -127, -1, -3, -10, -127, -127, -2, -3, -127, + -16, -127, -127, -127, -127, -127, -127, -127, -24, -25, + -127, -30, -31, -32, -127, -127, -127, -127, -127, -127, + -127, -127, -127, -127, -127, -127, -127, -127, -127, -127, + -13, 217, -4, -26, -127, -17, -118, -89, -90, -117, + -14, -19, -81, -20, -21, -127, -23, -29, -127, -127, + -127, -36, -37, -38, -39, -40, -41, -47, -49, -127, + -52, -42, -74, -76, -127, -79, -80, -126, -43, -84, + -86, -127, -44, -45, -46, -127, -127, -11, -5, -7, + -91, -127, -64, -18, -119, -120, -121, -15, -127, -22, + -27, -33, -122, -123, -34, -35, -127, -48, -50, -53, + -72, -127, -75, -77, -84, -85, -127, -87, -127, -127, + -127, -127, -6, -8, -9, -115, -92, -93, -94, -65, + -127, -127, -82, -28, -51, -54, -73, -78, -88, -127, + -60, -124, -127, -12, -127, -124, -127, -127, -55, -127, + -58, -62, -66, -125, -127, -116, -95, -96, -98, -114, + -83, -56, -127, -61, -124, -64, -89, -64, -127, -111, + -127, -124, -89, -64, -64, -127, -124, -63, -67, -68, + -104, -105, -106, -127, -70, -71, -127, -124, -97, -127, + -99, -64, -55, -103, -57, -127, -89, -107, -112, -59, + -127, -55, -102, -55, -127, -127, -109, -127, -64, -100, + -69, -108, -127, -113, -55, -110, -101 ] racc_goto_table = [ - 76, 95, 69, 52, 74, 158, 110, 175, 118, 119, - 145, 208, 1, 212, 186, 2, 43, 212, 212, 4, - 42, 72, 91, 84, 84, 84, 84, 5, 40, 203, - 122, 214, 80, 85, 86, 87, 10, 210, 11, 111, - 115, 76, 12, 223, 138, 116, 118, 183, 110, 92, - 53, 55, 56, 194, 198, 199, 13, 72, 72, 219, - 49, 97, 128, 169, 213, 118, 104, 151, 224, 84, - 84, 110, 227, 105, 152, 106, 153, 107, 134, 154, - 76, 232, 115, 108, 137, 155, 68, 73, 112, 135, - 139, 121, 201, 205, 222, 126, 167, 72, 102, 72, - 149, 144, 190, 115, 220, 84, 123, 84, nil, nil, - nil, 164, nil, nil, nil, nil, nil, nil, nil, 185, - nil, nil, 72, nil, nil, 179, 84, nil, nil, nil, - nil, nil, 191, nil, 202, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, nil, nil, nil, 206, 164, - 209, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, nil, nil, 179, nil, nil, - 209, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, 230, 209, 231, 225 ] + 102, 102, 102, 49, 130, 73, 68, 89, 162, 91, + 150, 139, 101, 104, 105, 1, 9, 174, 51, 53, + 54, 42, 115, 70, 117, 79, 79, 79, 79, 56, + 123, 3, 57, 7, 124, 154, 58, 59, 60, 179, + 158, 107, 102, 108, 112, 194, 113, 191, 174, 157, + 39, 122, 202, 91, 133, 97, 199, 115, 70, 138, + 70, 209, 195, 210, 121, 46, 158, 99, 200, 93, + 114, 206, 114, 66, 216, 188, 71, 178, 135, 184, + 134, 110, 177, 137, 212, 190, 192, 78, 82, 83, + 84, 136, 98, 165, 147, 127, 156, 70, 186, 173, + 207, 144, nil, 201, nil, 114, nil, 114, nil, nil, + 185, nil, nil, nil, nil, nil, nil, 193, nil, 165, + 214, nil, nil, nil, nil, 197, nil, nil, nil, nil, + 173, 197, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 211, 197 ] racc_goto_check = [ - 43, 44, 33, 35, 49, 40, 34, 39, 56, 55, - 60, 46, 1, 64, 45, 2, 57, 64, 64, 3, - 4, 35, 5, 35, 35, 35, 35, 6, 7, 45, - 8, 46, 32, 32, 32, 32, 9, 39, 10, 33, - 43, 43, 11, 46, 55, 49, 56, 60, 34, 57, - 15, 15, 15, 21, 21, 21, 12, 35, 35, 45, - 13, 14, 16, 17, 40, 56, 18, 19, 39, 35, - 35, 34, 39, 22, 23, 24, 25, 26, 33, 27, - 43, 39, 43, 28, 49, 29, 30, 31, 36, 37, - 38, 41, 42, 47, 48, 51, 52, 35, 53, 35, - 54, 59, 61, 43, 62, 35, 63, 35, nil, nil, - nil, 43, nil, nil, nil, nil, nil, nil, nil, 44, - nil, nil, 35, nil, nil, 43, 35, nil, nil, nil, - nil, nil, 43, nil, 44, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, nil, nil, nil, 43, 43, - 43, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, nil, nil, 43, nil, nil, - 43, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, 44, 43, 44, 43 ] + 35, 35, 35, 27, 40, 42, 26, 8, 32, 12, + 31, 30, 21, 21, 21, 1, 7, 39, 16, 16, + 16, 7, 45, 27, 45, 27, 27, 27, 27, 15, + 5, 6, 15, 6, 9, 30, 15, 15, 15, 37, + 34, 26, 35, 26, 42, 31, 42, 37, 39, 49, + 10, 8, 32, 12, 21, 16, 31, 45, 27, 45, + 27, 32, 38, 32, 11, 13, 34, 15, 38, 14, + 27, 37, 27, 22, 32, 49, 23, 40, 28, 40, + 26, 29, 33, 42, 38, 40, 40, 24, 24, 24, + 24, 41, 43, 35, 44, 47, 48, 27, 50, 35, + 51, 52, nil, 40, nil, 27, nil, 27, nil, nil, + 35, nil, nil, nil, nil, nil, nil, 35, nil, 35, + 40, nil, nil, nil, nil, 35, nil, nil, nil, nil, + 35, 35, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 35, 35 ] racc_goto_pointer = [ - nil, 12, 15, 17, 11, -20, 25, 22, -60, 32, - 34, 38, 52, 45, 12, 34, -41, -87, 8, -62, - nil, -119, 14, -56, 15, -55, 16, -53, 21, -48, - 53, 53, -3, -31, -63, -12, 16, -23, -30, -149, - -136, 2, -86, -34, -45, -150, -173, -88, -121, -30, - nil, -6, -52, 44, -27, -73, -73, 7, nil, -23, - -114, -63, -107, 13, -181 ] + nil, 15, nil, nil, nil, -59, 31, 13, -37, -55, + 46, -23, -35, 53, 23, 12, 5, nil, nil, nil, + nil, -46, 41, 43, 53, nil, -26, -9, -32, 11, + -107, -131, -140, -82, -105, -58, nil, -126, -121, -140, + -88, -19, -28, 40, -38, -57, nil, 5, -49, -96, + -71, -98, -24 ] racc_goto_default = [ - nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - 45, nil, nil, nil, nil, nil, nil, nil, nil, nil, - 24, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, 71, 77, nil, nil, nil, nil, - nil, 46, 159, 196, nil, nil, nil, nil, nil, nil, - 78, nil, nil, nil, nil, 81, 83, nil, 44, nil, - nil, nil, nil, nil, 195 ] + nil, nil, 2, 8, 88, nil, nil, nil, nil, nil, + nil, nil, 10, nil, nil, 50, nil, 21, 22, 23, + 100, nil, nil, nil, nil, 67, nil, 75, nil, nil, + nil, nil, nil, 151, 152, 72, 129, nil, nil, 167, + nil, 76, nil, nil, nil, 80, 90, nil, nil, nil, + nil, nil, nil ] racc_reduce_table = [ 0, 0, :racc_error, - 5, 55, :_reduce_none, - 0, 56, :_reduce_none, - 2, 56, :_reduce_none, - 0, 61, :_reduce_4, - 0, 62, :_reduce_5, - 5, 60, :_reduce_6, - 2, 60, :_reduce_none, - 0, 57, :_reduce_8, - 2, 57, :_reduce_none, - 1, 63, :_reduce_none, - 1, 63, :_reduce_none, - 1, 63, :_reduce_none, - 2, 63, :_reduce_13, - 3, 63, :_reduce_none, - 2, 63, :_reduce_none, - 2, 63, :_reduce_16, - 2, 63, :_reduce_17, - 0, 70, :_reduce_18, - 0, 71, :_reduce_19, - 7, 63, :_reduce_20, - 0, 72, :_reduce_21, - 0, 73, :_reduce_22, - 6, 63, :_reduce_23, - 1, 63, :_reduce_24, - 1, 63, :_reduce_none, - 0, 76, :_reduce_26, - 0, 77, :_reduce_27, - 6, 64, :_reduce_28, + 0, 61, :_reduce_1, + 2, 61, :_reduce_2, + 0, 62, :_reduce_3, + 2, 62, :_reduce_4, + 1, 63, :_reduce_5, + 2, 63, :_reduce_6, + 0, 64, :_reduce_none, 1, 64, :_reduce_none, - 0, 78, :_reduce_30, - 0, 79, :_reduce_31, - 7, 64, :_reduce_32, - 0, 80, :_reduce_33, - 0, 81, :_reduce_34, - 7, 64, :_reduce_35, - 0, 82, :_reduce_36, - 0, 83, :_reduce_37, - 7, 64, :_reduce_38, - 2, 64, :_reduce_39, - 2, 64, :_reduce_40, - 2, 64, :_reduce_41, - 2, 64, :_reduce_42, - 2, 64, :_reduce_43, - 2, 74, :_reduce_none, - 2, 74, :_reduce_45, - 2, 74, :_reduce_46, - 2, 74, :_reduce_47, - 2, 74, :_reduce_48, - 2, 74, :_reduce_49, - 1, 84, :_reduce_50, - 2, 84, :_reduce_51, - 3, 84, :_reduce_52, - 1, 87, :_reduce_53, - 2, 87, :_reduce_54, - 3, 88, :_reduce_55, - 8, 65, :_reduce_56, - 5, 66, :_reduce_57, - 1, 92, :_reduce_58, - 3, 92, :_reduce_59, - 1, 94, :_reduce_60, - 3, 94, :_reduce_61, - 0, 96, :_reduce_62, - 1, 96, :_reduce_63, - 3, 96, :_reduce_64, - 3, 96, :_reduce_65, - 6, 96, :_reduce_66, - 0, 101, :_reduce_67, - 0, 102, :_reduce_68, - 7, 96, :_reduce_69, - 3, 96, :_reduce_70, - 0, 90, :_reduce_none, - 1, 90, :_reduce_none, - 0, 91, :_reduce_none, - 1, 91, :_reduce_none, - 1, 85, :_reduce_75, - 2, 85, :_reduce_76, - 3, 85, :_reduce_77, - 1, 103, :_reduce_78, - 2, 103, :_reduce_79, - 1, 97, :_reduce_none, - 1, 97, :_reduce_none, - 0, 105, :_reduce_82, - 0, 106, :_reduce_83, - 6, 69, :_reduce_84, - 0, 107, :_reduce_85, - 0, 108, :_reduce_86, - 5, 69, :_reduce_87, - 1, 86, :_reduce_88, - 2, 86, :_reduce_89, - 3, 86, :_reduce_90, - 1, 109, :_reduce_91, - 2, 109, :_reduce_92, - 1, 110, :_reduce_none, - 1, 89, :_reduce_94, - 1, 89, :_reduce_95, + 5, 56, :_reduce_none, + 0, 65, :_reduce_10, + 0, 66, :_reduce_11, + 5, 57, :_reduce_12, + 2, 57, :_reduce_none, + 1, 71, :_reduce_14, + 2, 71, :_reduce_15, 1, 58, :_reduce_none, + 2, 58, :_reduce_17, + 3, 58, :_reduce_none, 2, 58, :_reduce_none, - 1, 111, :_reduce_none, - 2, 111, :_reduce_none, - 4, 112, :_reduce_100, - 1, 113, :_reduce_101, - 3, 113, :_reduce_102, - 2, 113, :_reduce_none, - 0, 114, :_reduce_104, - 1, 114, :_reduce_105, - 3, 114, :_reduce_106, - 4, 114, :_reduce_107, - 6, 114, :_reduce_108, - 0, 115, :_reduce_109, - 0, 116, :_reduce_110, - 8, 114, :_reduce_111, - 3, 114, :_reduce_112, - 1, 99, :_reduce_113, - 1, 99, :_reduce_114, - 1, 99, :_reduce_115, - 1, 100, :_reduce_116, - 3, 100, :_reduce_117, - 2, 100, :_reduce_118, - 4, 100, :_reduce_119, - 0, 98, :_reduce_none, - 3, 98, :_reduce_121, - 1, 95, :_reduce_none, - 0, 59, :_reduce_none, - 0, 117, :_reduce_124, - 3, 59, :_reduce_125, + 2, 58, :_reduce_20, + 2, 58, :_reduce_21, + 3, 58, :_reduce_22, + 2, 58, :_reduce_23, + 1, 58, :_reduce_24, + 1, 58, :_reduce_25, + 2, 58, :_reduce_none, + 1, 76, :_reduce_27, + 2, 76, :_reduce_28, + 2, 67, :_reduce_29, 1, 67, :_reduce_none, - 0, 68, :_reduce_none, - 1, 68, :_reduce_none, - 1, 68, :_reduce_none, + 1, 67, :_reduce_none, + 1, 67, :_reduce_none, + 3, 67, :_reduce_33, + 3, 67, :_reduce_34, + 3, 67, :_reduce_35, + 2, 67, :_reduce_36, + 2, 67, :_reduce_37, + 2, 67, :_reduce_38, + 2, 67, :_reduce_39, + 2, 67, :_reduce_40, + 2, 72, :_reduce_none, + 2, 72, :_reduce_42, + 2, 72, :_reduce_43, + 2, 72, :_reduce_44, + 2, 72, :_reduce_45, + 2, 72, :_reduce_46, + 1, 81, :_reduce_47, + 2, 81, :_reduce_48, + 1, 77, :_reduce_49, + 2, 77, :_reduce_50, + 3, 77, :_reduce_51, + 0, 84, :_reduce_none, + 1, 84, :_reduce_none, + 3, 80, :_reduce_54, + 0, 87, :_reduce_none, + 1, 87, :_reduce_none, + 8, 73, :_reduce_57, + 5, 74, :_reduce_58, + 8, 74, :_reduce_59, + 1, 85, :_reduce_60, + 3, 85, :_reduce_61, + 1, 86, :_reduce_62, + 3, 86, :_reduce_63, + 0, 95, :_reduce_none, + 1, 95, :_reduce_none, + 1, 88, :_reduce_66, + 3, 88, :_reduce_67, + 3, 88, :_reduce_68, + 6, 88, :_reduce_69, + 3, 88, :_reduce_70, + 3, 88, :_reduce_71, + 0, 83, :_reduce_none, + 1, 83, :_reduce_73, + 1, 97, :_reduce_74, + 2, 97, :_reduce_75, + 1, 78, :_reduce_76, + 2, 78, :_reduce_77, + 3, 78, :_reduce_78, + 1, 90, :_reduce_none, + 1, 90, :_reduce_none, + 0, 98, :_reduce_81, + 0, 99, :_reduce_82, + 5, 70, :_reduce_83, + 1, 100, :_reduce_84, + 2, 100, :_reduce_85, + 1, 79, :_reduce_86, + 2, 79, :_reduce_87, + 3, 79, :_reduce_88, + 1, 82, :_reduce_89, + 1, 82, :_reduce_90, + 0, 102, :_reduce_none, + 1, 102, :_reduce_none, + 2, 59, :_reduce_none, + 2, 59, :_reduce_none, + 4, 101, :_reduce_95, + 1, 103, :_reduce_96, + 3, 103, :_reduce_97, + 1, 104, :_reduce_98, + 3, 104, :_reduce_99, + 5, 104, :_reduce_100, + 7, 104, :_reduce_101, + 4, 104, :_reduce_102, + 3, 104, :_reduce_103, + 1, 92, :_reduce_104, + 1, 92, :_reduce_105, + 1, 92, :_reduce_106, + 1, 93, :_reduce_107, + 3, 93, :_reduce_108, + 2, 93, :_reduce_109, + 4, 93, :_reduce_110, + 0, 105, :_reduce_111, + 0, 106, :_reduce_112, + 5, 94, :_reduce_113, + 3, 91, :_reduce_114, + 0, 107, :_reduce_115, + 3, 60, :_reduce_116, 1, 68, :_reduce_none, - 1, 75, :_reduce_131, - 2, 75, :_reduce_132, - 1, 118, :_reduce_none, - 1, 118, :_reduce_none, - 1, 104, :_reduce_135, - 0, 93, :_reduce_none, - 1, 93, :_reduce_none ] + 0, 69, :_reduce_none, + 1, 69, :_reduce_none, + 1, 69, :_reduce_none, + 1, 69, :_reduce_none, + 1, 75, :_reduce_none, + 1, 75, :_reduce_none, + 0, 89, :_reduce_none, + 1, 89, :_reduce_none, + 1, 96, :_reduce_126 ] -racc_reduce_n = 138 +racc_reduce_n = 127 -racc_shift_n = 233 +racc_shift_n = 217 racc_token_table = { false => 0, @@ -1069,43 +1040,44 @@ def raise_parse_error(error_message, location) "%lex-param" => 16, "%parse-param" => 17, "%code" => 18, - "{" => 19, - "}" => 20, - "%initial-action" => 21, - "%no-stdlib" => 22, - ";" => 23, - "%union" => 24, - "%destructor" => 25, - "%printer" => 26, - "%error-token" => 27, - "%after-shift" => 28, - "%before-reduce" => 29, - "%after-reduce" => 30, - "%after-shift-error-token" => 31, - "%after-pop-stack" => 32, - "%token" => 33, - "%type" => 34, - "%left" => 35, - "%right" => 36, - "%precedence" => 37, - "%nonassoc" => 38, - "%rule" => 39, - "(" => 40, - ")" => 41, - ":" => 42, - "%inline" => 43, - "," => 44, - "|" => 45, - "%empty" => 46, - "%prec" => 47, + "%initial-action" => 19, + "%no-stdlib" => 20, + "%locations" => 21, + ";" => 22, + "%union" => 23, + "%destructor" => 24, + "%printer" => 25, + "%error-token" => 26, + "%after-shift" => 27, + "%before-reduce" => 28, + "%after-reduce" => 29, + "%after-shift-error-token" => 30, + "%after-pop-stack" => 31, + "%token" => 32, + "%type" => 33, + "%left" => 34, + "%right" => 35, + "%precedence" => 36, + "%nonassoc" => 37, + "%rule" => 38, + "(" => 39, + ")" => 40, + ":" => 41, + "%inline" => 42, + "," => 43, + "|" => 44, + "%prec" => 45, + "{" => 46, + "}" => 47, "?" => 48, "+" => 49, "*" => 50, "[" => 51, "]" => 52, - "{...}" => 53 } + "{...}" => 53, + "%empty" => 54 } -racc_nt_base = 54 +racc_nt_base = 55 racc_use_result_var = true @@ -1146,10 +1118,9 @@ def raise_parse_error(error_message, location) "\"%lex-param\"", "\"%parse-param\"", "\"%code\"", - "\"{\"", - "\"}\"", "\"%initial-action\"", "\"%no-stdlib\"", + "\"%locations\"", "\";\"", "\"%union\"", "\"%destructor\"", @@ -1173,79 +1144,69 @@ def raise_parse_error(error_message, location) "\"%inline\"", "\",\"", "\"|\"", - "\"%empty\"", "\"%prec\"", + "\"{\"", + "\"}\"", "\"?\"", "\"+\"", "\"*\"", "\"[\"", "\"]\"", "\"{...}\"", + "\"%empty\"", "$start", "input", - "prologue_declarations", - "bison_declarations", - "grammar", - "epilogue_opt", "prologue_declaration", + "bison_declaration", + "rules_or_grammar_declaration", + "epilogue_declaration", + "\"-many@prologue_declaration\"", + "\"-many@bison_declaration\"", + "\"-many1@rules_or_grammar_declaration\"", + "\"-option@epilogue_declaration\"", "@1", "@2", - "bison_declaration", "grammar_declaration", - "rule_declaration", - "inline_declaration", "variable", "value", - "params", - "@3", - "@4", - "@5", - "@6", + "param", + "\"-many1@param\"", "symbol_declaration", - "generic_symlist", - "@7", - "@8", - "@9", - "@10", - "@11", - "@12", - "@13", - "@14", + "rule_declaration", + "inline_declaration", + "generic_symbol", + "\"-many1@generic_symbol\"", "token_declarations", "symbol_declarations", "token_declarations_for_precedence", - "token_declaration_list", "token_declaration", + "\"-many1@token_declaration\"", "id", - "int_opt", "alias", + "\"-option@INTEGER\"", "rule_args", - "tag_opt", "rule_rhs_list", - "id_colon", + "\"-option@TAG\"", "rule_rhs", + "empty", "symbol", - "named_ref_opt", + "named_ref", "parameterizing_suffix", "parameterizing_args", - "@15", - "@16", - "symbol_declaration_list", + "midrule_action", + "\"-option@named_ref\"", "string_as_id", - "@17", - "@18", - "@19", - "@20", - "token_declaration_list_for_precedence", - "token_declaration_for_precedence", - "rules_or_grammar_declaration", + "\"-many1@symbol\"", + "@3", + "@4", + "\"-many1@id\"", "rules", + "\"-option@;\"", "rhs_list", "rhs", - "@21", - "@22", - "@23", - "generic_symlist_item" ] + "@5", + "@6", + "@7" ] Ractor.make_shareable(Racc_token_to_s_table) if defined?(Ractor) Racc_debug_parser = true @@ -1254,299 +1215,271 @@ def raise_parse_error(error_message, location) # reduce 0 omitted -# reduce 1 omitted +module_eval(<<'.,.,', 'parser.y', 11) + def _reduce_1(val, _values, result) + result = val[1] ? val[1].unshift(val[0]) : val + result + end +.,., -# reduce 2 omitted +module_eval(<<'.,.,', 'parser.y', 11) + def _reduce_2(val, _values, result) + result = val[1] ? val[1].unshift(val[0]) : val + result + end +.,., -# reduce 3 omitted +module_eval(<<'.,.,', 'parser.y', 11) + def _reduce_3(val, _values, result) + result = val[1] ? val[1].unshift(val[0]) : val + result + end +.,., -module_eval(<<'.,.,', 'parser.y', 14) +module_eval(<<'.,.,', 'parser.y', 11) def _reduce_4(val, _values, result) - begin_c_declaration("%}") - @grammar.prologue_first_lineno = @lexer.line - + result = val[1] ? val[1].unshift(val[0]) : val result end .,., -module_eval(<<'.,.,', 'parser.y', 19) +module_eval(<<'.,.,', 'parser.y', 11) def _reduce_5(val, _values, result) - end_c_declaration - + result = val[1] ? val[1].unshift(val[0]) : val result end .,., -module_eval(<<'.,.,', 'parser.y', 23) +module_eval(<<'.,.,', 'parser.y', 11) def _reduce_6(val, _values, result) - @grammar.prologue = val[2].s_value - + result = val[1] ? val[1].unshift(val[0]) : val result end .,., # reduce 7 omitted -module_eval(<<'.,.,', 'parser.y', 27) - def _reduce_8(val, _values, result) - result = "" - result - end -.,., +# reduce 8 omitted # reduce 9 omitted -# reduce 10 omitted - -# reduce 11 omitted - -# reduce 12 omitted +module_eval(<<'.,.,', 'parser.y', 12) + def _reduce_10(val, _values, result) + begin_c_declaration("%}") + @grammar.prologue_first_lineno = @lexer.line -module_eval(<<'.,.,', 'parser.y', 33) - def _reduce_13(val, _values, result) - @grammar.expect = val[1] result end .,., -# reduce 14 omitted - -# reduce 15 omitted - -module_eval(<<'.,.,', 'parser.y', 38) - def _reduce_16(val, _values, result) - val[1].each {|token| - @grammar.lex_param = Grammar::Code::NoReferenceCode.new(type: :lex_param, token_code: token).token_code.s_value - } +module_eval(<<'.,.,', 'parser.y', 17) + def _reduce_11(val, _values, result) + end_c_declaration result end .,., -module_eval(<<'.,.,', 'parser.y', 44) - def _reduce_17(val, _values, result) - val[1].each {|token| - @grammar.parse_param = Grammar::Code::NoReferenceCode.new(type: :parse_param, token_code: token).token_code.s_value - } +module_eval(<<'.,.,', 'parser.y', 21) + def _reduce_12(val, _values, result) + @grammar.prologue = val[2].s_value result end .,., -module_eval(<<'.,.,', 'parser.y', 50) - def _reduce_18(val, _values, result) - begin_c_declaration("}") +# reduce 13 omitted +module_eval(<<'.,.,', 'parser.y', 54) + def _reduce_14(val, _values, result) + result = val[1] ? val[1].unshift(val[0]) : val result end .,., module_eval(<<'.,.,', 'parser.y', 54) - def _reduce_19(val, _values, result) - end_c_declaration + def _reduce_15(val, _values, result) + result = val[1] ? val[1].unshift(val[0]) : val + result + end +.,., + +# reduce 16 omitted +module_eval(<<'.,.,', 'parser.y', 26) + def _reduce_17(val, _values, result) + @grammar.expect = val[1] result end .,., -module_eval(<<'.,.,', 'parser.y', 58) +# reduce 18 omitted + +# reduce 19 omitted + +module_eval(<<'.,.,', 'parser.y', 31) def _reduce_20(val, _values, result) - @grammar.add_percent_code(id: val[1], code: val[4]) + val[1].each {|token| + @grammar.lex_param = Grammar::Code::NoReferenceCode.new(type: :lex_param, token_code: token).token_code.s_value + } result end .,., -module_eval(<<'.,.,', 'parser.y', 62) +module_eval(<<'.,.,', 'parser.y', 37) def _reduce_21(val, _values, result) - begin_c_declaration("}") + val[1].each {|token| + @grammar.parse_param = Grammar::Code::NoReferenceCode.new(type: :parse_param, token_code: token).token_code.s_value + } result end .,., -module_eval(<<'.,.,', 'parser.y', 66) +module_eval(<<'.,.,', 'parser.y', 43) def _reduce_22(val, _values, result) - end_c_declaration + @grammar.add_percent_code(id: val[1], code: val[2]) result end .,., -module_eval(<<'.,.,', 'parser.y', 70) +module_eval(<<'.,.,', 'parser.y', 47) def _reduce_23(val, _values, result) - @grammar.initial_action = Grammar::Code::InitialActionCode.new(type: :initial_action, token_code: val[3]) + @grammar.initial_action = Grammar::Code::InitialActionCode.new(type: :initial_action, token_code: val[1]) result end .,., -module_eval(<<'.,.,', 'parser.y', 72) +module_eval(<<'.,.,', 'parser.y', 49) def _reduce_24(val, _values, result) @grammar.no_stdlib = true result end .,., -# reduce 25 omitted - -module_eval(<<'.,.,', 'parser.y', 77) - def _reduce_26(val, _values, result) - begin_c_declaration("}") - +module_eval(<<'.,.,', 'parser.y', 50) + def _reduce_25(val, _values, result) + @grammar.locations = true result end .,., -module_eval(<<'.,.,', 'parser.y', 81) - def _reduce_27(val, _values, result) - end_c_declaration +# reduce 26 omitted +module_eval(<<'.,.,', 'parser.y', 109) + def _reduce_27(val, _values, result) + result = val[1] ? val[1].unshift(val[0]) : val result end .,., -module_eval(<<'.,.,', 'parser.y', 85) +module_eval(<<'.,.,', 'parser.y', 109) def _reduce_28(val, _values, result) - @grammar.set_union( - Grammar::Code::NoReferenceCode.new(type: :union, token_code: val[3]), - val[3].line - ) - + result = val[1] ? val[1].unshift(val[0]) : val result end .,., -# reduce 29 omitted - -module_eval(<<'.,.,', 'parser.y', 93) - def _reduce_30(val, _values, result) - begin_c_declaration("}") +module_eval(<<'.,.,', 'parser.y', 55) + def _reduce_29(val, _values, result) + @grammar.set_union( + Grammar::Code::NoReferenceCode.new(type: :union, token_code: val[1]), + val[1].line + ) result end .,., -module_eval(<<'.,.,', 'parser.y', 97) - def _reduce_31(val, _values, result) - end_c_declaration - - result - end -.,., +# reduce 30 omitted -module_eval(<<'.,.,', 'parser.y', 101) - def _reduce_32(val, _values, result) - @grammar.add_destructor( - ident_or_tags: val[6], - token_code: val[3], - lineno: val[3].line - ) +# reduce 31 omitted - result - end -.,., +# reduce 32 omitted -module_eval(<<'.,.,', 'parser.y', 109) +module_eval(<<'.,.,', 'parser.y', 65) def _reduce_33(val, _values, result) - begin_c_declaration("}") + @grammar.add_destructor( + ident_or_tags: val[2], + token_code: val[1], + lineno: val[1].line + ) result end .,., -module_eval(<<'.,.,', 'parser.y', 113) +module_eval(<<'.,.,', 'parser.y', 73) def _reduce_34(val, _values, result) - end_c_declaration - - result - end -.,., - -module_eval(<<'.,.,', 'parser.y', 117) - def _reduce_35(val, _values, result) @grammar.add_printer( - ident_or_tags: val[6], - token_code: val[3], - lineno: val[3].line + ident_or_tags: val[2], + token_code: val[1], + lineno: val[1].line ) result end .,., -module_eval(<<'.,.,', 'parser.y', 125) - def _reduce_36(val, _values, result) - begin_c_declaration("}") - - result - end -.,., - -module_eval(<<'.,.,', 'parser.y', 129) - def _reduce_37(val, _values, result) - end_c_declaration - - result - end -.,., - -module_eval(<<'.,.,', 'parser.y', 133) - def _reduce_38(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 81) + def _reduce_35(val, _values, result) @grammar.add_error_token( - ident_or_tags: val[6], - token_code: val[3], - lineno: val[3].line + ident_or_tags: val[2], + token_code: val[1], + lineno: val[1].line ) result end .,., -module_eval(<<'.,.,', 'parser.y', 141) - def _reduce_39(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 89) + def _reduce_36(val, _values, result) @grammar.after_shift = val[1] result end .,., -module_eval(<<'.,.,', 'parser.y', 145) - def _reduce_40(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 93) + def _reduce_37(val, _values, result) @grammar.before_reduce = val[1] result end .,., -module_eval(<<'.,.,', 'parser.y', 149) - def _reduce_41(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 97) + def _reduce_38(val, _values, result) @grammar.after_reduce = val[1] result end .,., -module_eval(<<'.,.,', 'parser.y', 153) - def _reduce_42(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 101) + def _reduce_39(val, _values, result) @grammar.after_shift_error_token = val[1] result end .,., -module_eval(<<'.,.,', 'parser.y', 157) - def _reduce_43(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 105) + def _reduce_40(val, _values, result) @grammar.after_pop_stack = val[1] result end .,., -# reduce 44 omitted +# reduce 41 omitted -module_eval(<<'.,.,', 'parser.y', 163) - def _reduce_45(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 111) + def _reduce_42(val, _values, result) val[1].each {|hash| hash[:tokens].each {|id| @grammar.add_type(id: id, tag: hash[:tag]) @@ -1557,8 +1490,8 @@ def _reduce_45(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 171) - def _reduce_46(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 119) + def _reduce_43(val, _values, result) val[1].each {|hash| hash[:tokens].each {|id| sym = @grammar.add_term(id: id) @@ -1571,8 +1504,8 @@ def _reduce_46(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 181) - def _reduce_47(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 129) + def _reduce_44(val, _values, result) val[1].each {|hash| hash[:tokens].each {|id| sym = @grammar.add_term(id: id) @@ -1585,8 +1518,8 @@ def _reduce_47(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 191) - def _reduce_48(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 139) + def _reduce_45(val, _values, result) val[1].each {|hash| hash[:tokens].each {|id| sym = @grammar.add_term(id: id) @@ -1599,8 +1532,8 @@ def _reduce_48(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 201) - def _reduce_49(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 149) + def _reduce_46(val, _values, result) val[1].each {|hash| hash[:tokens].each {|id| sym = @grammar.add_term(id: id) @@ -1613,8 +1546,22 @@ def _reduce_49(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 212) - def _reduce_50(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 178) + def _reduce_47(val, _values, result) + result = val[1] ? val[1].unshift(val[0]) : val + result + end +.,., + +module_eval(<<'.,.,', 'parser.y', 178) + def _reduce_48(val, _values, result) + result = val[1] ? val[1].unshift(val[0]) : val + result + end +.,., + +module_eval(<<'.,.,', 'parser.y', 160) + def _reduce_49(val, _values, result) val[0].each {|token_declaration| @grammar.add_term(id: token_declaration[0], alias_name: token_declaration[2], token_id: token_declaration[1], tag: nil, replace: true) } @@ -1623,8 +1570,8 @@ def _reduce_50(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 218) - def _reduce_51(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 166) + def _reduce_50(val, _values, result) val[1].each {|token_declaration| @grammar.add_term(id: token_declaration[0], alias_name: token_declaration[2], token_id: token_declaration[1], tag: val[0], replace: true) } @@ -1633,8 +1580,8 @@ def _reduce_51(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 224) - def _reduce_52(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 172) + def _reduce_51(val, _values, result) val[2].each {|token_declaration| @grammar.add_term(id: token_declaration[0], alias_name: token_declaration[2], token_id: token_declaration[1], tag: val[1], replace: true) } @@ -1643,61 +1590,64 @@ def _reduce_52(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 229) - def _reduce_53(val, _values, result) - result = [val[0]] - result - end -.,., +# reduce 52 omitted + +# reduce 53 omitted -module_eval(<<'.,.,', 'parser.y', 230) +module_eval(<<'.,.,', 'parser.y', 177) def _reduce_54(val, _values, result) - result = val[0].append(val[1]) + result = val result end .,., -module_eval(<<'.,.,', 'parser.y', 232) - def _reduce_55(val, _values, result) - result = val +# reduce 55 omitted + +# reduce 56 omitted + +module_eval(<<'.,.,', 'parser.y', 181) + def _reduce_57(val, _values, result) + rule = Grammar::ParameterizingRule::Rule.new(val[1].s_value, val[3], val[7], tag: val[5]) + @grammar.add_parameterizing_rule(rule) + result end .,., -module_eval(<<'.,.,', 'parser.y', 236) - def _reduce_56(val, _values, result) - rule = Grammar::ParameterizingRule::Rule.new(val[1].s_value, val[3], val[7], tag: val[5]) +module_eval(<<'.,.,', 'parser.y', 187) + def _reduce_58(val, _values, result) + rule = Grammar::ParameterizingRule::Rule.new(val[2].s_value, [], val[4], is_inline: true) @grammar.add_parameterizing_rule(rule) result end .,., -module_eval(<<'.,.,', 'parser.y', 242) - def _reduce_57(val, _values, result) - rule = Grammar::ParameterizingRule::Rule.new(val[2].s_value, [], val[4], is_inline: true) +module_eval(<<'.,.,', 'parser.y', 192) + def _reduce_59(val, _values, result) + rule = Grammar::ParameterizingRule::Rule.new(val[2].s_value, val[4], val[7], is_inline: true) @grammar.add_parameterizing_rule(rule) result end .,., -module_eval(<<'.,.,', 'parser.y', 246) - def _reduce_58(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 196) + def _reduce_60(val, _values, result) result = [val[0]] result end .,., -module_eval(<<'.,.,', 'parser.y', 247) - def _reduce_59(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 197) + def _reduce_61(val, _values, result) result = val[0].append(val[2]) result end .,., -module_eval(<<'.,.,', 'parser.y', 251) - def _reduce_60(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 201) + def _reduce_62(val, _values, result) builder = val[0] result = [builder] @@ -1705,8 +1655,8 @@ def _reduce_60(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 256) - def _reduce_61(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 206) + def _reduce_63(val, _values, result) builder = val[2] result = val[0].append(builder) @@ -1714,17 +1664,12 @@ def _reduce_61(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 262) - def _reduce_62(val, _values, result) - reset_precs - result = Grammar::ParameterizingRule::Rhs.new +# reduce 64 omitted - result - end -.,., +# reduce 65 omitted -module_eval(<<'.,.,', 'parser.y', 267) - def _reduce_63(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 212) + def _reduce_66(val, _values, result) reset_precs result = Grammar::ParameterizingRule::Rhs.new @@ -1732,8 +1677,8 @@ def _reduce_63(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 272) - def _reduce_64(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 217) + def _reduce_67(val, _values, result) token = val[1] token.alias_name = val[2] builder = val[0] @@ -1744,8 +1689,8 @@ def _reduce_64(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 280) - def _reduce_65(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 225) + def _reduce_68(val, _values, result) builder = val[0] builder.symbols << Lrama::Lexer::Token::InstantiateRule.new(s_value: val[2], location: @lexer.location, args: [val[1]]) result = builder @@ -1754,8 +1699,8 @@ def _reduce_65(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 286) - def _reduce_66(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 231) + def _reduce_69(val, _values, result) builder = val[0] builder.symbols << Lrama::Lexer::Token::InstantiateRule.new(s_value: val[1].s_value, location: @lexer.location, args: val[3], lhs_tag: val[5]) result = builder @@ -1764,30 +1709,10 @@ def _reduce_66(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 292) - def _reduce_67(val, _values, result) - if @prec_seen - on_action_error("multiple User_code after %prec", val[0]) if @code_after_prec - @code_after_prec = true - end - begin_c_declaration("}") - - result - end -.,., - -module_eval(<<'.,.,', 'parser.y', 300) - def _reduce_68(val, _values, result) - end_c_declaration - - result - end -.,., - -module_eval(<<'.,.,', 'parser.y', 304) - def _reduce_69(val, _values, result) - user_code = val[3] - user_code.alias_name = val[6] +module_eval(<<'.,.,', 'parser.y', 237) + def _reduce_70(val, _values, result) + user_code = val[1] + user_code.alias_name = val[2] builder = val[0] builder.user_code = user_code result = builder @@ -1796,8 +1721,8 @@ def _reduce_69(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 312) - def _reduce_70(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 245) + def _reduce_71(val, _values, result) sym = @grammar.find_symbol_by_id!(val[2]) @prec_seen = true builder = val[0] @@ -1808,168 +1733,137 @@ def _reduce_70(val, _values, result) end .,., -# reduce 71 omitted - # reduce 72 omitted -# reduce 73 omitted +module_eval(<<'.,.,', 'parser.y', 253) + def _reduce_73(val, _values, result) + result = val[0].s_value + result + end +.,., -# reduce 74 omitted +module_eval(<<'.,.,', 'parser.y', 260) + def _reduce_74(val, _values, result) + result = val[1] ? val[1].unshift(val[0]) : val + result + end +.,., -module_eval(<<'.,.,', 'parser.y', 327) +module_eval(<<'.,.,', 'parser.y', 260) def _reduce_75(val, _values, result) - result = [{tag: nil, tokens: val[0]}] - + result = val[1] ? val[1].unshift(val[0]) : val result end .,., -module_eval(<<'.,.,', 'parser.y', 331) +module_eval(<<'.,.,', 'parser.y', 255) def _reduce_76(val, _values, result) - result = [{tag: val[0], tokens: val[1]}] - + result = [{tag: nil, tokens: val[0]}] result end .,., -module_eval(<<'.,.,', 'parser.y', 335) +module_eval(<<'.,.,', 'parser.y', 256) def _reduce_77(val, _values, result) - result = val[0].append({tag: val[1], tokens: val[2]}) - + result = [{tag: val[0], tokens: val[1]}] result end .,., -module_eval(<<'.,.,', 'parser.y', 338) +module_eval(<<'.,.,', 'parser.y', 257) def _reduce_78(val, _values, result) - result = [val[0]] + result = val[0].append({tag: val[1], tokens: val[2]}) result end .,., -module_eval(<<'.,.,', 'parser.y', 339) - def _reduce_79(val, _values, result) - result = val[0].append(val[1]) - result - end -.,., +# reduce 79 omitted # reduce 80 omitted -# reduce 81 omitted +module_eval(<<'.,.,', 'parser.y', 263) + def _reduce_81(val, _values, result) + begin_c_declaration("}") + + result + end +.,., -module_eval(<<'.,.,', 'parser.y', 346) +module_eval(<<'.,.,', 'parser.y', 267) def _reduce_82(val, _values, result) - begin_c_declaration("}") + end_c_declaration result end .,., -module_eval(<<'.,.,', 'parser.y', 350) +module_eval(<<'.,.,', 'parser.y', 271) def _reduce_83(val, _values, result) - end_c_declaration + result = val[2] result end .,., -module_eval(<<'.,.,', 'parser.y', 354) +module_eval(<<'.,.,', 'parser.y', 279) def _reduce_84(val, _values, result) - result = val[0].append(val[3]) - + result = val[1] ? val[1].unshift(val[0]) : val result end .,., -module_eval(<<'.,.,', 'parser.y', 358) +module_eval(<<'.,.,', 'parser.y', 279) def _reduce_85(val, _values, result) - begin_c_declaration("}") - + result = val[1] ? val[1].unshift(val[0]) : val result end .,., -module_eval(<<'.,.,', 'parser.y', 362) +module_eval(<<'.,.,', 'parser.y', 274) def _reduce_86(val, _values, result) - end_c_declaration - + result = [{tag: nil, tokens: val[0]}] result end .,., -module_eval(<<'.,.,', 'parser.y', 366) +module_eval(<<'.,.,', 'parser.y', 275) def _reduce_87(val, _values, result) - result = [val[2]] - + result = [{tag: val[0], tokens: val[1]}] result end .,., -module_eval(<<'.,.,', 'parser.y', 371) +module_eval(<<'.,.,', 'parser.y', 276) def _reduce_88(val, _values, result) - result = [{tag: nil, tokens: val[0]}] - + result = val[0].append({tag: val[1], tokens: val[2]}) result end .,., -module_eval(<<'.,.,', 'parser.y', 375) +module_eval(<<'.,.,', 'parser.y', 278) def _reduce_89(val, _values, result) - result = [{tag: val[0], tokens: val[1]}] - + on_action_error("ident after %prec", val[0]) if @prec_seen result end .,., -module_eval(<<'.,.,', 'parser.y', 379) +module_eval(<<'.,.,', 'parser.y', 279) def _reduce_90(val, _values, result) - result = val[0].append({tag: val[1], tokens: val[2]}) - + on_action_error("char after %prec", val[0]) if @prec_seen result end .,., -module_eval(<<'.,.,', 'parser.y', 382) - def _reduce_91(val, _values, result) - result = [val[0]] - result - end -.,., +# reduce 91 omitted -module_eval(<<'.,.,', 'parser.y', 383) - def _reduce_92(val, _values, result) - result = val[0].append(val[1]) - result - end -.,., +# reduce 92 omitted # reduce 93 omitted -module_eval(<<'.,.,', 'parser.y', 387) - def _reduce_94(val, _values, result) - on_action_error("ident after %prec", val[0]) if @prec_seen - result - end -.,., +# reduce 94 omitted -module_eval(<<'.,.,', 'parser.y', 388) +module_eval(<<'.,.,', 'parser.y', 287) def _reduce_95(val, _values, result) - on_action_error("char after %prec", val[0]) if @prec_seen - result - end -.,., - -# reduce 96 omitted - -# reduce 97 omitted - -# reduce 98 omitted - -# reduce 99 omitted - -module_eval(<<'.,.,', 'parser.y', 398) - def _reduce_100(val, _values, result) lhs = val[0] lhs.alias_name = val[1] val[3].each do |builder| @@ -1982,8 +1876,8 @@ def _reduce_100(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 409) - def _reduce_101(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 298) + def _reduce_96(val, _values, result) builder = val[0] if !builder.line builder.line = @lexer.line - 1 @@ -1994,8 +1888,8 @@ def _reduce_101(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 417) - def _reduce_102(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 306) + def _reduce_97(val, _values, result) builder = val[2] if !builder.line builder.line = @lexer.line - 1 @@ -2006,28 +1900,17 @@ def _reduce_102(val, _values, result) end .,., -# reduce 103 omitted - -module_eval(<<'.,.,', 'parser.y', 427) - def _reduce_104(val, _values, result) - reset_precs - result = Grammar::RuleBuilder.new(@rule_counter, @midrule_action_counter) - - result - end -.,., - -module_eval(<<'.,.,', 'parser.y', 432) - def _reduce_105(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 315) + def _reduce_98(val, _values, result) reset_precs - result = Grammar::RuleBuilder.new(@rule_counter, @midrule_action_counter) + result = @grammar.create_rule_builder(@rule_counter, @midrule_action_counter) result end .,., -module_eval(<<'.,.,', 'parser.y', 437) - def _reduce_106(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 320) + def _reduce_99(val, _values, result) token = val[1] token.alias_name = val[2] builder = val[0] @@ -2038,9 +1921,9 @@ def _reduce_106(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 445) - def _reduce_107(val, _values, result) - token = Lrama::Lexer::Token::InstantiateRule.new(s_value: val[2], location: @lexer.location, args: [val[1]], lhs_tag: val[3]) +module_eval(<<'.,.,', 'parser.y', 328) + def _reduce_100(val, _values, result) + token = Lrama::Lexer::Token::InstantiateRule.new(s_value: val[2], alias_name: val[3], location: @lexer.location, args: [val[1]], lhs_tag: val[4]) builder = val[0] builder.add_rhs(token) builder.line = val[1].first_line @@ -2050,9 +1933,9 @@ def _reduce_107(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 453) - def _reduce_108(val, _values, result) - token = Lrama::Lexer::Token::InstantiateRule.new(s_value: val[1].s_value, location: @lexer.location, args: val[3], lhs_tag: val[5]) +module_eval(<<'.,.,', 'parser.y', 336) + def _reduce_101(val, _values, result) + token = Lrama::Lexer::Token::InstantiateRule.new(s_value: val[1].s_value, alias_name: val[5], location: @lexer.location, args: val[3], lhs_tag: val[6]) builder = val[0] builder.add_rhs(token) builder.line = val[1].first_line @@ -2062,31 +1945,11 @@ def _reduce_108(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 461) - def _reduce_109(val, _values, result) - if @prec_seen - on_action_error("multiple User_code after %prec", val[0]) if @code_after_prec - @code_after_prec = true - end - begin_c_declaration("}") - - result - end -.,., - -module_eval(<<'.,.,', 'parser.y', 469) - def _reduce_110(val, _values, result) - end_c_declaration - - result - end -.,., - -module_eval(<<'.,.,', 'parser.y', 473) - def _reduce_111(val, _values, result) - user_code = val[3] - user_code.alias_name = val[6] - user_code.tag = val[7] +module_eval(<<'.,.,', 'parser.y', 344) + def _reduce_102(val, _values, result) + user_code = val[1] + user_code.alias_name = val[2] + user_code.tag = val[3] builder = val[0] builder.user_code = user_code result = builder @@ -2095,8 +1958,8 @@ def _reduce_111(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 482) - def _reduce_112(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 353) + def _reduce_103(val, _values, result) sym = @grammar.find_symbol_by_id!(val[2]) @prec_seen = true builder = val[0] @@ -2107,125 +1970,133 @@ def _reduce_112(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 489) - def _reduce_113(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 360) + def _reduce_104(val, _values, result) result = "option" result end .,., -module_eval(<<'.,.,', 'parser.y', 490) - def _reduce_114(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 361) + def _reduce_105(val, _values, result) result = "nonempty_list" result end .,., -module_eval(<<'.,.,', 'parser.y', 491) - def _reduce_115(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 362) + def _reduce_106(val, _values, result) result = "list" result end .,., -module_eval(<<'.,.,', 'parser.y', 493) - def _reduce_116(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 364) + def _reduce_107(val, _values, result) result = [val[0]] result end .,., -module_eval(<<'.,.,', 'parser.y', 494) - def _reduce_117(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 365) + def _reduce_108(val, _values, result) result = val[0].append(val[2]) result end .,., -module_eval(<<'.,.,', 'parser.y', 495) - def _reduce_118(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 366) + def _reduce_109(val, _values, result) result = [Lrama::Lexer::Token::InstantiateRule.new(s_value: val[1].s_value, location: @lexer.location, args: val[0])] result end .,., -module_eval(<<'.,.,', 'parser.y', 496) - def _reduce_119(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 367) + def _reduce_110(val, _values, result) result = [Lrama::Lexer::Token::InstantiateRule.new(s_value: val[0].s_value, location: @lexer.location, args: val[2])] result end .,., -# reduce 120 omitted +module_eval(<<'.,.,', 'parser.y', 371) + def _reduce_111(val, _values, result) + if @prec_seen + on_action_error("multiple User_code after %prec", val[0]) if @code_after_prec + @code_after_prec = true + end + begin_c_declaration("}") -module_eval(<<'.,.,', 'parser.y', 499) - def _reduce_121(val, _values, result) - result = val[1].s_value result end .,., -# reduce 122 omitted - -# reduce 123 omitted - -module_eval(<<'.,.,', 'parser.y', 506) - def _reduce_124(val, _values, result) - begin_c_declaration('\Z') - @grammar.epilogue_first_lineno = @lexer.line + 1 +module_eval(<<'.,.,', 'parser.y', 379) + def _reduce_112(val, _values, result) + end_c_declaration result end .,., -module_eval(<<'.,.,', 'parser.y', 511) - def _reduce_125(val, _values, result) - end_c_declaration - @grammar.epilogue = val[2].s_value +module_eval(<<'.,.,', 'parser.y', 383) + def _reduce_113(val, _values, result) + result = val[2] result end .,., -# reduce 126 omitted - -# reduce 127 omitted - -# reduce 128 omitted - -# reduce 129 omitted +module_eval(<<'.,.,', 'parser.y', 386) + def _reduce_114(val, _values, result) + result = val[1].s_value + result + end +.,., -# reduce 130 omitted +module_eval(<<'.,.,', 'parser.y', 390) + def _reduce_115(val, _values, result) + begin_c_declaration('\Z') + @grammar.epilogue_first_lineno = @lexer.line + 1 -module_eval(<<'.,.,', 'parser.y', 522) - def _reduce_131(val, _values, result) - result = [val[0]] result end .,., -module_eval(<<'.,.,', 'parser.y', 523) - def _reduce_132(val, _values, result) - result = val[0].append(val[1]) +module_eval(<<'.,.,', 'parser.y', 395) + def _reduce_116(val, _values, result) + end_c_declaration + @grammar.epilogue = val[2].s_value + result end .,., -# reduce 133 omitted +# reduce 117 omitted + +# reduce 118 omitted -# reduce 134 omitted +# reduce 119 omitted -module_eval(<<'.,.,', 'parser.y', 528) - def _reduce_135(val, _values, result) +# reduce 120 omitted + +# reduce 121 omitted + +# reduce 122 omitted + +# reduce 123 omitted + +# reduce 124 omitted + +# reduce 125 omitted + +module_eval(<<'.,.,', 'parser.y', 412) + def _reduce_126(val, _values, result) result = Lrama::Lexer::Token::Ident.new(s_value: val[0]) result end .,., -# reduce 136 omitted - -# reduce 137 omitted - def _reduce_none(val, _values, result) val[0] end diff --git a/tool/lrama/lib/lrama/report.rb b/tool/lrama/lib/lrama/report.rb index 650ac09d52e4a2..890e5f1e8c5cc4 100644 --- a/tool/lrama/lib/lrama/report.rb +++ b/tool/lrama/lib/lrama/report.rb @@ -1,2 +1,4 @@ -require 'lrama/report/duration' -require 'lrama/report/profile' +# frozen_string_literal: true + +require_relative 'report/duration' +require_relative 'report/profile' diff --git a/tool/lrama/lib/lrama/report/duration.rb b/tool/lrama/lib/lrama/report/duration.rb index 7afe284f1a1aaa..fe09a0d028f501 100644 --- a/tool/lrama/lib/lrama/report/duration.rb +++ b/tool/lrama/lib/lrama/report/duration.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class Report module Duration diff --git a/tool/lrama/lib/lrama/report/profile.rb b/tool/lrama/lib/lrama/report/profile.rb index 36156800a4ec8c..10488cf9130bd1 100644 --- a/tool/lrama/lib/lrama/report/profile.rb +++ b/tool/lrama/lib/lrama/report/profile.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class Report module Profile diff --git a/tool/lrama/lib/lrama/state.rb b/tool/lrama/lib/lrama/state.rb index ceb74d856af187..c2623746aabb16 100644 --- a/tool/lrama/lib/lrama/state.rb +++ b/tool/lrama/lib/lrama/state.rb @@ -1,8 +1,10 @@ -require "lrama/state/reduce" -require "lrama/state/reduce_reduce_conflict" -require "lrama/state/resolved_conflict" -require "lrama/state/shift" -require "lrama/state/shift_reduce_conflict" +# frozen_string_literal: true + +require_relative "state/reduce" +require_relative "state/reduce_reduce_conflict" +require_relative "state/resolved_conflict" +require_relative "state/shift" +require_relative "state/shift_reduce_conflict" module Lrama class State diff --git a/tool/lrama/lib/lrama/state/reduce.rb b/tool/lrama/lib/lrama/state/reduce.rb index 8ba51f45f2f41d..a2b7c26cfee570 100644 --- a/tool/lrama/lib/lrama/state/reduce.rb +++ b/tool/lrama/lib/lrama/state/reduce.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class State class Reduce @@ -25,6 +27,7 @@ def add_not_selected_symbol(sym) def selected_look_ahead if @look_ahead + # @type ivar @look_ahead: Array @look_ahead - @not_selected_symbols else [] diff --git a/tool/lrama/lib/lrama/state/reduce_reduce_conflict.rb b/tool/lrama/lib/lrama/state/reduce_reduce_conflict.rb index 0a0e4dc20ae7f3..736d08376a73c7 100644 --- a/tool/lrama/lib/lrama/state/reduce_reduce_conflict.rb +++ b/tool/lrama/lib/lrama/state/reduce_reduce_conflict.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class State class ReduceReduceConflict < Struct.new(:symbols, :reduce1, :reduce2, keyword_init: true) diff --git a/tool/lrama/lib/lrama/state/resolved_conflict.rb b/tool/lrama/lib/lrama/state/resolved_conflict.rb index 02ea8921475fd4..3bb3d1446e7214 100644 --- a/tool/lrama/lib/lrama/state/resolved_conflict.rb +++ b/tool/lrama/lib/lrama/state/resolved_conflict.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class State # * symbol: A symbol under discussion @@ -6,7 +8,7 @@ class State class ResolvedConflict < Struct.new(:symbol, :reduce, :which, :same_prec, keyword_init: true) def report_message s = symbol.display_name - r = reduce.rule.precedence_sym.display_name + r = reduce.rule.precedence_sym&.display_name case when which == :shift && same_prec msg = "resolved as #{which} (%right #{s})" diff --git a/tool/lrama/lib/lrama/state/shift.rb b/tool/lrama/lib/lrama/state/shift.rb index 2021eb61f61041..81ef013a17c009 100644 --- a/tool/lrama/lib/lrama/state/shift.rb +++ b/tool/lrama/lib/lrama/state/shift.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class State class Shift diff --git a/tool/lrama/lib/lrama/state/shift_reduce_conflict.rb b/tool/lrama/lib/lrama/state/shift_reduce_conflict.rb index f80bd5f352453f..fd66834539e924 100644 --- a/tool/lrama/lib/lrama/state/shift_reduce_conflict.rb +++ b/tool/lrama/lib/lrama/state/shift_reduce_conflict.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class State class ShiftReduceConflict < Struct.new(:symbols, :shift, :reduce, keyword_init: true) diff --git a/tool/lrama/lib/lrama/states.rb b/tool/lrama/lib/lrama/states.rb index 290e996b822b08..0ed4bff9c1ee61 100644 --- a/tool/lrama/lib/lrama/states.rb +++ b/tool/lrama/lib/lrama/states.rb @@ -1,6 +1,8 @@ +# frozen_string_literal: true + require "forwardable" -require "lrama/report/duration" -require "lrama/states/item" +require_relative "report/duration" +require_relative "states/item" module Lrama # States is passed to a template file @@ -16,9 +18,8 @@ class States attr_reader :states, :reads_relation, :includes_relation, :lookback_relation - def initialize(grammar, warning, trace_state: false) + def initialize(grammar, trace_state: false) @grammar = grammar - @warning = warning @trace_state = trace_state @states = [] @@ -89,8 +90,6 @@ def compute report_duration(:compute_conflicts) { compute_conflicts } report_duration(:compute_default_reduction) { compute_default_reduction } - - check_conflicts end def reporter @@ -125,16 +124,16 @@ def la end end - private - - def sr_conflicts - @states.flat_map(&:sr_conflicts) + def sr_conflicts_count + @sr_conflicts_count ||= @states.flat_map(&:sr_conflicts).count end - def rr_conflicts - @states.flat_map(&:rr_conflicts) + def rr_conflicts_count + @rr_conflicts_count ||= @states.flat_map(&:rr_conflicts).count end + private + def trace_state if @trace_state yield STDERR @@ -350,7 +349,7 @@ def compute_includes_relation # TODO: need to omit if state == state2 ? @includes_relation[key] ||= [] @includes_relation[key] << [state.id, nterm.token_id] - break if !sym.nullable + break unless sym.nullable i -= 1 end end @@ -385,7 +384,7 @@ def compute_look_ahead_sets @states.each do |state| rules.each do |rule| ary = @lookback_relation[[state.id, rule.id]] - next if !ary + next unless ary ary.each do |state2_id, nterm_token_id| # q = state, A -> ω = rule, p = state2, A = nterm @@ -428,7 +427,7 @@ def compute_shift_reduce_conflicts sym = shift.next_sym next unless reduce.look_ahead - next if !reduce.look_ahead.include?(sym) + next unless reduce.look_ahead.include?(sym) # Shift/Reduce conflict shift_prec = sym.precedence @@ -492,17 +491,17 @@ def compute_reduce_reduce_conflicts states.each do |state| count = state.reduces.count - for i in 0...count do + (0...count).each do |i| reduce1 = state.reduces[i] next if reduce1.look_ahead.nil? - for j in (i+1)...count do + ((i+1)...count).each do |j| reduce2 = state.reduces[j] next if reduce2.look_ahead.nil? intersection = reduce1.look_ahead & reduce2.look_ahead - if !intersection.empty? + unless intersection.empty? state.conflicts << State::ReduceReduceConflict.new(symbols: intersection, reduce1: reduce1, reduce2: reduce2) end end @@ -514,7 +513,7 @@ def compute_default_reduction states.each do |state| next if state.reduces.empty? # Do not set, if conflict exist - next if !state.conflicts.empty? + next unless state.conflicts.empty? # Do not set, if shift with `error` exists. next if state.shifts.map(&:next_sym).include?(@grammar.error_symbol) @@ -525,32 +524,5 @@ def compute_default_reduction end.first end end - - def check_conflicts - sr_count = sr_conflicts.count - rr_count = rr_conflicts.count - - if @grammar.expect - - expected_sr_conflicts = @grammar.expect - expected_rr_conflicts = 0 - - if expected_sr_conflicts != sr_count - @warning.error("shift/reduce conflicts: #{sr_count} found, #{expected_sr_conflicts} expected") - end - - if expected_rr_conflicts != rr_count - @warning.error("reduce/reduce conflicts: #{rr_count} found, #{expected_rr_conflicts} expected") - end - else - if sr_count != 0 - @warning.warn("shift/reduce conflicts: #{sr_count} found") - end - - if rr_count != 0 - @warning.warn("reduce/reduce conflicts: #{rr_count} found") - end - end - end end end diff --git a/tool/lrama/lib/lrama/states/item.rb b/tool/lrama/lib/lrama/states/item.rb index 31b74b9d34e9a5..5074e943b749c9 100644 --- a/tool/lrama/lib/lrama/states/item.rb +++ b/tool/lrama/lib/lrama/states/item.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # TODO: Validate position is not over rule rhs require "forwardable" @@ -54,11 +56,11 @@ def new_by_next_position Item.new(rule: rule, position: position + 1) end - def symbols_before_dot + def symbols_before_dot # steep:ignore rhs[0...position] end - def symbols_after_dot + def symbols_after_dot # steep:ignore rhs[position..-1] end @@ -73,7 +75,7 @@ def display_name # Right after position def display_rest - r = rhs[position..-1].map(&:display_name).join(" ") + r = symbols_after_dot.map(&:display_name).join(" ") ". #{r} (rule #{rule_id})" end end diff --git a/tool/lrama/lib/lrama/states_reporter.rb b/tool/lrama/lib/lrama/states_reporter.rb index 6f96cc6f65bdc0..64ff4de1006c58 100644 --- a/tool/lrama/lib/lrama/states_reporter.rb +++ b/tool/lrama/lib/lrama/states_reporter.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama class StatesReporter include Lrama::Report::Duration @@ -14,15 +16,54 @@ def report(io, **options) private - def _report(io, grammar: false, states: false, itemsets: false, lookaheads: false, solved: false, counterexamples: false, verbose: false) - # TODO: Unused terms - # TODO: Unused rules - + def _report(io, grammar: false, rules: false, terms: false, states: false, itemsets: false, lookaheads: false, solved: false, counterexamples: false, verbose: false) + report_unused_rules(io) if rules + report_unused_terms(io) if terms report_conflicts(io) report_grammar(io) if grammar report_states(io, itemsets, lookaheads, solved, counterexamples, verbose) end + def report_unused_terms(io) + look_aheads = @states.states.each do |state| + state.reduces.flat_map do |reduce| + reduce.look_ahead unless reduce.look_ahead.nil? + end + end + + next_terms = @states.states.flat_map do |state| + state.shifts.map(&:next_sym).select(&:term?) + end + + unused_symbols = @states.terms.select do |term| + !(look_aheads + next_terms).include?(term) + end + + unless unused_symbols.empty? + io << "#{unused_symbols.count} Unused Terms\n\n" + unused_symbols.each_with_index do |term, index| + io << sprintf("%5d %s\n", index, term.id.s_value) + end + io << "\n\n" + end + end + + def report_unused_rules(io) + used_rules = @states.rules.flat_map(&:rhs) + + unused_rules = @states.rules.map(&:lhs).select do |rule| + !used_rules.include?(rule) && rule.token_id != 0 + end + + unless unused_rules.empty? + io << "#{unused_rules.count} Unused Rules\n\n" + unused_rules.each_with_index do |rule, index| + io << sprintf("%5d %s\n", index, rule.display_name) + end + io << "\n\n" + end + end + def report_conflicts(io) has_conflict = false @@ -37,7 +78,7 @@ def report_conflicts(io) messages << "#{cs[:reduce_reduce].count} reduce/reduce" end - if !messages.empty? + unless messages.empty? has_conflict = true io << "State #{state.id} conflicts: #{messages.join(', ')}\n" end @@ -98,7 +139,7 @@ def report_states(io, itemsets, lookaheads, solved, counterexamples, verbose) if lookaheads && item.end_of_rule? reduce = state.find_reduce_by_item!(item) look_ahead = reduce.selected_look_ahead - if !look_ahead.empty? + unless look_ahead.empty? la = " [#{look_ahead.map(&:display_name).join(", ")}]" end end @@ -118,7 +159,7 @@ def report_states(io, itemsets, lookaheads, solved, counterexamples, verbose) tmp.each do |term, state_id| io << " #{term.display_name.ljust(max_len)} shift, and go to state #{state_id}\n" end - io << "\n" if !tmp.empty? + io << "\n" unless tmp.empty? # Report error caused by %nonassoc nl = false @@ -132,7 +173,7 @@ def report_states(io, itemsets, lookaheads, solved, counterexamples, verbose) nl = true io << " #{name.ljust(max_len)} error (nonassociative)\n" end - io << "\n" if !tmp.empty? + io << "\n" unless tmp.empty? # Report reduces nl = false @@ -181,14 +222,14 @@ def report_states(io, itemsets, lookaheads, solved, counterexamples, verbose) tmp.each do |nterm, state_id| io << " #{nterm.id.s_value.ljust(max_len)} go to state #{state_id}\n" end - io << "\n" if !tmp.empty? + io << "\n" unless tmp.empty? if solved # Report conflict resolutions state.resolved_conflicts.each do |resolved| io << " #{resolved.report_message}\n" end - io << "\n" if !state.resolved_conflicts.empty? + io << "\n" unless state.resolved_conflicts.empty? end if counterexamples && state.has_conflicts? @@ -219,7 +260,7 @@ def report_states(io, itemsets, lookaheads, solved, counterexamples, verbose) direct_read_sets = @states.direct_read_sets @states.nterms.each do |nterm| terms = direct_read_sets[[state.id, nterm.token_id]] - next if !terms + next unless terms next if terms.empty? str = terms.map {|sym| sym.id.s_value }.join(", ") @@ -231,7 +272,7 @@ def report_states(io, itemsets, lookaheads, solved, counterexamples, verbose) io << " [Reads Relation]\n" @states.nterms.each do |nterm| a = @states.reads_relation[[state.id, nterm.token_id]] - next if !a + next unless a a.each do |state_id2, nterm_id2| n = @states.nterms.find {|n| n.token_id == nterm_id2 } @@ -245,7 +286,7 @@ def report_states(io, itemsets, lookaheads, solved, counterexamples, verbose) read_sets = @states.read_sets @states.nterms.each do |nterm| terms = read_sets[[state.id, nterm.token_id]] - next if !terms + next unless terms next if terms.empty? terms.each do |sym| @@ -258,7 +299,7 @@ def report_states(io, itemsets, lookaheads, solved, counterexamples, verbose) io << " [Includes Relation]\n" @states.nterms.each do |nterm| a = @states.includes_relation[[state.id, nterm.token_id]] - next if !a + next unless a a.each do |state_id2, nterm_id2| n = @states.nterms.find {|n| n.token_id == nterm_id2 } @@ -271,11 +312,11 @@ def report_states(io, itemsets, lookaheads, solved, counterexamples, verbose) io << " [Lookback Relation]\n" @states.rules.each do |rule| a = @states.lookback_relation[[state.id, rule.id]] - next if !a + next unless a a.each do |state_id2, nterm_id2| n = @states.nterms.find {|n| n.token_id == nterm_id2 } - io << " (Rule: #{rule}) -> (State #{state_id2}, #{n.id.s_value})\n" + io << " (Rule: #{rule.display_name}) -> (State #{state_id2}, #{n.id.s_value})\n" end end io << "\n" @@ -286,7 +327,7 @@ def report_states(io, itemsets, lookaheads, solved, counterexamples, verbose) @states.nterms.each do |nterm| terms = follow_sets[[state.id, nterm.token_id]] - next if !terms + next unless terms terms.each do |sym| io << " #{nterm.id.s_value} -> #{sym.id.s_value}\n" @@ -300,7 +341,7 @@ def report_states(io, itemsets, lookaheads, solved, counterexamples, verbose) max_len = 0 @states.rules.each do |rule| syms = @states.la[[state.id, rule.id]] - next if !syms + next unless syms tmp << [rule, syms] max_len = ([max_len] + syms.map {|s| s.id.s_value.length }).max @@ -310,7 +351,7 @@ def report_states(io, itemsets, lookaheads, solved, counterexamples, verbose) io << " #{sym.id.s_value.ljust(max_len)} reduce using rule #{rule.id} (#{rule.lhs.id.s_value})\n" end end - io << "\n" if !tmp.empty? + io << "\n" unless tmp.empty? end # End of Report State diff --git a/tool/lrama/lib/lrama/trace_reporter.rb b/tool/lrama/lib/lrama/trace_reporter.rb new file mode 100644 index 00000000000000..87c01a4c8aef5e --- /dev/null +++ b/tool/lrama/lib/lrama/trace_reporter.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +module Lrama + class TraceReporter + def initialize(grammar) + @grammar = grammar + end + + def report(**options) + _report(**options) + end + + private + + def _report(rules: false, actions: false, **_) + report_rules if rules + report_actions if actions + end + + def report_rules + puts "Grammar rules:" + @grammar.rules.each { |rule| puts rule.display_name } + end + + def report_actions + puts "Grammar rules with actions:" + @grammar.rules.each { |rule| puts rule.with_actions } + end + end +end diff --git a/tool/lrama/lib/lrama/version.rb b/tool/lrama/lib/lrama/version.rb index ef840ce4353070..d452430b3e09a4 100644 --- a/tool/lrama/lib/lrama/version.rb +++ b/tool/lrama/lib/lrama/version.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Lrama - VERSION = "0.6.9".freeze + VERSION = "0.6.10".freeze end diff --git a/tool/lrama/template/bison/yacc.c b/tool/lrama/template/bison/yacc.c index 2d6753c2829090..6edd59a0d562cb 100644 --- a/tool/lrama/template/bison/yacc.c +++ b/tool/lrama/template/bison/yacc.c @@ -1166,9 +1166,9 @@ yydestruct (const char *yymsg, #endif enum yy_repair_type { - insert, - delete, - shift, + inserting, + deleting, + shifting, }; struct yy_repair { @@ -1401,27 +1401,27 @@ yyrecover(yy_state_t *yyss, yy_state_t *yyssp, int yychar<%= output.user_formals if (current->repair_length + 1 > YYMAXREPAIR(<%= output.parse_param_name %>)) continue; - yy_repairs *new = (yy_repairs *) YYMALLOC (sizeof (yy_repairs)); - new->id = count; - new->next = 0; - new->stack_length = stack_length; - new->states = (yy_state_t *) YYMALLOC (sizeof (yy_state_t) * (stack_length)); - new->state = new->states + (current->state - current->states); - YYCOPY (new->states, current->states, current->state - current->states + 1); - new->repair_length = current->repair_length + 1; - new->prev_repair = current; - new->repair.type = insert; - new->repair.term = (yysymbol_kind_t) yyx; + yy_repairs *reps = (yy_repairs *) YYMALLOC (sizeof (yy_repairs)); + reps->id = count; + reps->next = 0; + reps->stack_length = stack_length; + reps->states = (yy_state_t *) YYMALLOC (sizeof (yy_state_t) * (stack_length)); + reps->state = reps->states + (current->state - current->states); + YYCOPY (reps->states, current->states, current->state - current->states + 1); + reps->repair_length = current->repair_length + 1; + reps->prev_repair = current; + reps->repair.type = inserting; + reps->repair.term = (yysymbol_kind_t) yyx; /* Process PDA assuming next token is yyx */ - if (! yy_process_repairs (new, yyx)) + if (! yy_process_repairs (reps, (yysymbol_kind_t)yyx)) { - YYFREE (new); + YYFREE (reps); continue; } - tail->next = new; - tail = new; + tail->next = reps; + tail = reps; count++; if (yyx == yytoken) @@ -1437,7 +1437,7 @@ yyrecover(yy_state_t *yyss, yy_state_t *yyssp, int yychar<%= output.user_formals YYDPRINTF ((stderr, "New repairs is enqueued. count: %d, yystate: %d, yyx: %d\n", count, yystate, yyx)); - yy_print_repairs (new<%= output.user_args %>); + yy_print_repairs (reps<%= output.user_args %>); } } } @@ -1475,7 +1475,12 @@ int yychar; /* The semantic value of the lookahead symbol. */ /* Default value used for initialization, for pacifying older GCCs or non-GCC compilers. */ +#ifdef __cplusplus +static const YYSTYPE yyval_default = {}; +(void) yyval_default; +#else YY_INITIAL_VALUE (static const YYSTYPE yyval_default;) +#endif YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); /* Location data for the lookahead symbol. */ From f47c057c327467a8dcdb8482b13d2ea281a6ad6f Mon Sep 17 00:00:00 2001 From: ydah Date: Thu, 12 Sep 2024 10:42:50 +0900 Subject: [PATCH 243/829] Remove unnecessary file --- tool/lrama/lib/lrama/warning.rb | 25 ------------------------- 1 file changed, 25 deletions(-) delete mode 100644 tool/lrama/lib/lrama/warning.rb diff --git a/tool/lrama/lib/lrama/warning.rb b/tool/lrama/lib/lrama/warning.rb deleted file mode 100644 index 3c99791ebf81dc..00000000000000 --- a/tool/lrama/lib/lrama/warning.rb +++ /dev/null @@ -1,25 +0,0 @@ -module Lrama - class Warning - attr_reader :errors, :warns - - def initialize(out = STDERR) - @out = out - @errors = [] - @warns = [] - end - - def error(message) - @out << message << "\n" - @errors << message - end - - def warn(message) - @out << message << "\n" - @warns << message - end - - def has_error? - !@errors.empty? - end - end -end From b10500b72b2a696608015c2a2e60422a296d8614 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Tue, 10 Sep 2024 11:25:47 -0400 Subject: [PATCH 244/829] Assume VM is locked in rb_vm_ci_free The GC always locks the VM, so we don't need to lock it in rb_vm_ci_free. --- vm_method.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/vm_method.c b/vm_method.c index 4f82efbf005f73..bda3837f747354 100644 --- a/vm_method.c +++ b/vm_method.c @@ -434,14 +434,12 @@ rb_vm_ci_lookup(ID mid, unsigned int flag, unsigned int argc, const struct rb_ca void rb_vm_ci_free(const struct rb_callinfo *ci) { + ASSERT_vm_locking(); + rb_vm_t *vm = GET_VM(); - RB_VM_LOCK_ENTER(); - { - st_data_t key = (st_data_t)ci; - st_delete(vm->ci_table, &key, NULL); - } - RB_VM_LOCK_LEAVE(); + st_data_t key = (st_data_t)ci; + st_delete(vm->ci_table, &key, NULL); } void From ad761ad2d0a63270fbd243a477dc962446a5116e Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Thu, 18 Jul 2024 12:08:06 -0700 Subject: [PATCH 245/829] Release GVL for get{pwnam,pwuid,grgid,grnam}_r calls in process.c Do not release GVL around get{pwuid,pwnam,grgid,grnam} calls, as doing so is not thread-safe. Another C extension could have a concurrent call, and derefencing the returned pointer from these calls could result in a segfault. Have rb_home_dir_of call rb_getpwdirnam_for_login if available, so it can use getpwnam_r and release GVL in a thread-safe manner. This is related to GVL releasing work in [Bug #20587]. --- file.c | 23 +++------- process.c | 125 ++++++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 99 insertions(+), 49 deletions(-) diff --git a/file.c b/file.c index 5e3b303c9636af..9b89f36fbef2f8 100644 --- a/file.c +++ b/file.c @@ -3690,25 +3690,20 @@ copy_home_path(VALUE result, const char *dir) return result; } -#ifdef HAVE_PWD_H -static void * -nogvl_getpwnam(void *login) -{ - return (void *)getpwnam((const char *)login); -} -#endif - VALUE rb_home_dir_of(VALUE user, VALUE result) { #ifdef HAVE_PWD_H - struct passwd *pwPtr; + VALUE dirname = rb_getpwdirnam_for_login(user); + if (dirname == Qnil) { + rb_raise(rb_eArgError, "user %"PRIsVALUE" doesn't exist", user); + } + const char *dir = RSTRING_PTR(dirname); #else extern char *getlogin(void); const char *pwPtr = 0; const char *login; # define endpwent() ((void)0) -#endif const char *dir, *username = RSTRING_PTR(user); rb_encoding *enc = rb_enc_get(user); #if defined _WIN32 @@ -3720,21 +3715,13 @@ rb_home_dir_of(VALUE user, VALUE result) dir = username = RSTRING_PTR(rb_str_conv_enc(user, enc, fsenc)); } -#ifdef HAVE_PWD_H - pwPtr = (struct passwd *)IO_WITHOUT_GVL(nogvl_getpwnam, (void *)username); -#else if ((login = getlogin()) && strcasecmp(username, login) == 0) dir = pwPtr = getenv("HOME"); -#endif if (!pwPtr) { - endpwent(); rb_raise(rb_eArgError, "user %"PRIsVALUE" doesn't exist", user); } -#ifdef HAVE_PWD_H - dir = pwPtr->pw_dir; #endif copy_home_path(result, dir); - endpwent(); return result; } diff --git a/process.c b/process.c index 88b55ed335cbf6..1326f59dd6fb77 100644 --- a/process.c +++ b/process.c @@ -5802,6 +5802,26 @@ pwd_not_found(int err) } } +# if defined(USE_GETPWNAM_R) +struct getpwnam_r_args { + char *login; + char *buf; + size_t bufsize; + struct passwd *result; + struct passwd pwstore; +}; + +# define GETPWNAM_R_ARGS(login_, buf_, bufsize_) (struct getpwnam_r_args) \ + {.login = login_, .buf = buf_, .bufsize = bufsize_, .result = NULL} + +static void * +nogvl_getpwnam_r(void *args) +{ + struct getpwnam_r_args *arg = args; + return (void *)(VALUE)getpwnam_r(arg->login, &arg->pwstore, arg->buf, arg->bufsize, &arg->result); +} +# endif + VALUE rb_getpwdirnam_for_login(VALUE login_name) { @@ -5816,11 +5836,9 @@ rb_getpwdirnam_for_login(VALUE login_name) const char *login = RSTRING_PTR(login_name); - struct passwd *pwptr; # ifdef USE_GETPWNAM_R - struct passwd pwdnm; char *bufnm; long bufsizenm = GETPW_R_SIZE_INIT; /* maybe -1 */ @@ -5832,37 +5850,39 @@ rb_getpwdirnam_for_login(VALUE login_name) bufnm = RSTRING_PTR(getpwnm_tmp); bufsizenm = rb_str_capacity(getpwnm_tmp); rb_str_set_len(getpwnm_tmp, bufsizenm); + struct getpwnam_r_args args = GETPWNAM_R_ARGS((char*)login, bufnm, (size_t)bufsizenm); int enm; - while ((enm = getpwnam_r(login, &pwdnm, bufnm, bufsizenm, &pwptr)) != 0) { + while ((enm = IO_WITHOUT_GVL_INT(nogvl_getpwnam_r, &args)) != 0) { if (pwd_not_found(enm)) { rb_str_resize(getpwnm_tmp, 0); return Qnil; } - if (enm != ERANGE || bufsizenm >= GETPW_R_SIZE_LIMIT) { + if (enm != ERANGE || args.bufsize >= GETPW_R_SIZE_LIMIT) { rb_str_resize(getpwnm_tmp, 0); rb_syserr_fail(enm, "getpwnam_r"); } - rb_str_modify_expand(getpwnm_tmp, bufsizenm); - bufnm = RSTRING_PTR(getpwnm_tmp); - bufsizenm = rb_str_capacity(getpwnm_tmp); + rb_str_modify_expand(getpwnm_tmp, (long)args.bufsize); + args.buf = RSTRING_PTR(getpwnm_tmp); + args.bufsize = (size_t)rb_str_capacity(getpwnm_tmp); } - if (pwptr == NULL) { + if (args.result == NULL) { /* no record in the password database for the login name */ rb_str_resize(getpwnm_tmp, 0); return Qnil; } /* found it */ - VALUE result = rb_str_new_cstr(pwptr->pw_dir); + VALUE result = rb_str_new_cstr(args.result->pw_dir); rb_str_resize(getpwnm_tmp, 0); return result; # elif defined(USE_GETPWNAM) + struct passwd *pwptr; errno = 0; if (!(pwptr = getpwnam(login))) { int err = errno; @@ -5881,6 +5901,26 @@ rb_getpwdirnam_for_login(VALUE login_name) #endif } +# if defined(USE_GETPWUID_R) +struct getpwuid_r_args { + uid_t uid; + char *buf; + size_t bufsize; + struct passwd *result; + struct passwd pwstore; +}; + +# define GETPWUID_R_ARGS(uid_, buf_, bufsize_) (struct getpwuid_r_args) \ + {.uid = uid_, .buf = buf_, .bufsize = bufsize_, .result = NULL} + +static void * +nogvl_getpwuid_r(void *args) +{ + struct getpwuid_r_args *arg = args; + return (void *)(VALUE)getpwuid_r(arg->uid, &arg->pwstore, arg->buf, arg->bufsize, &arg->result); +} +# endif + /** * Look up the user's dflt home dir in the password db, by uid. */ @@ -5893,11 +5933,8 @@ rb_getpwdiruid(void) # else uid_t ruid = getuid(); - struct passwd *pwptr; - # ifdef USE_GETPWUID_R - struct passwd pwdid; char *bufid; long bufsizeid = GETPW_R_SIZE_INIT; /* maybe -1 */ @@ -5909,37 +5946,39 @@ rb_getpwdiruid(void) bufid = RSTRING_PTR(getpwid_tmp); bufsizeid = rb_str_capacity(getpwid_tmp); rb_str_set_len(getpwid_tmp, bufsizeid); + struct getpwuid_r_args args = GETPWUID_R_ARGS(ruid, bufid, (size_t)bufsizeid); int eid; - while ((eid = getpwuid_r(ruid, &pwdid, bufid, bufsizeid, &pwptr)) != 0) { + while ((eid = IO_WITHOUT_GVL_INT(nogvl_getpwuid_r, &args)) != 0) { if (pwd_not_found(eid)) { rb_str_resize(getpwid_tmp, 0); return Qnil; } - if (eid != ERANGE || bufsizeid >= GETPW_R_SIZE_LIMIT) { + if (eid != ERANGE || args.bufsize >= GETPW_R_SIZE_LIMIT) { rb_str_resize(getpwid_tmp, 0); rb_syserr_fail(eid, "getpwuid_r"); } - rb_str_modify_expand(getpwid_tmp, bufsizeid); - bufid = RSTRING_PTR(getpwid_tmp); - bufsizeid = rb_str_capacity(getpwid_tmp); + rb_str_modify_expand(getpwid_tmp, (long)args.bufsize); + args.buf = RSTRING_PTR(getpwid_tmp); + args.bufsize = (size_t)rb_str_capacity(getpwid_tmp); } - if (pwptr == NULL) { + if (args.result == NULL) { /* no record in the password database for the uid */ rb_str_resize(getpwid_tmp, 0); return Qnil; } /* found it */ - VALUE result = rb_str_new_cstr(pwptr->pw_dir); + VALUE result = rb_str_new_cstr(args.result->pw_dir); rb_str_resize(getpwid_tmp, 0); return result; # elif defined(USE_GETPWUID) + struct passwd *pwptr; errno = 0; if (!(pwptr = getpwuid(ruid))) { int err = errno; @@ -5988,7 +6027,6 @@ obj2uid(VALUE id const char *usrname = StringValueCStr(id); struct passwd *pwptr; #ifdef USE_GETPWNAM_R - struct passwd pwbuf; char *getpw_buf; long getpw_buf_len; int e; @@ -6001,15 +6039,18 @@ obj2uid(VALUE id getpw_buf_len = rb_str_capacity(*getpw_tmp); rb_str_set_len(*getpw_tmp, getpw_buf_len); errno = 0; - while ((e = getpwnam_r(usrname, &pwbuf, getpw_buf, getpw_buf_len, &pwptr)) != 0) { - if (e != ERANGE || getpw_buf_len >= GETPW_R_SIZE_LIMIT) { + struct getpwnam_r_args args = GETPWNAM_R_ARGS((char *)usrname, getpw_buf, (size_t)getpw_buf_len); + + while ((e = IO_WITHOUT_GVL_INT(nogvl_getpwnam_r, &args)) != 0) { + if (e != ERANGE || args.bufsize >= GETPW_R_SIZE_LIMIT) { rb_str_resize(*getpw_tmp, 0); rb_syserr_fail(e, "getpwnam_r"); } - rb_str_modify_expand(*getpw_tmp, getpw_buf_len); - getpw_buf = RSTRING_PTR(*getpw_tmp); - getpw_buf_len = rb_str_capacity(*getpw_tmp); + rb_str_modify_expand(*getpw_tmp, (long)args.bufsize); + args.buf = RSTRING_PTR(*getpw_tmp); + args.bufsize = (size_t)rb_str_capacity(*getpw_tmp); } + pwptr = args.result; #else pwptr = getpwnam(usrname); #endif @@ -6048,6 +6089,26 @@ p_uid_from_name(VALUE self, VALUE id) #endif #if defined(HAVE_GRP_H) +# if defined(USE_GETGRNAM_R) +struct getgrnam_r_args { + const char *name; + char *buf; + size_t bufsize; + struct group *result; + struct group grp; +}; + +# define GETGRNAM_R_ARGS(name_, buf_, bufsize_) (struct getgrnam_r_args) \ + {.name = name_, .buf = buf_, .bufsize = bufsize_, .result = NULL} + +static void * +nogvl_getgrnam_r(void *args) +{ + struct getgrnam_r_args *arg = args; + return (void *)(VALUE)getgrnam_r(arg->name, &arg->grp, arg->buf, arg->bufsize, &arg->result); +} +# endif + static rb_gid_t obj2gid(VALUE id # ifdef USE_GETGRNAM_R @@ -6065,7 +6126,6 @@ obj2gid(VALUE id const char *grpname = StringValueCStr(id); struct group *grptr; #ifdef USE_GETGRNAM_R - struct group grbuf; char *getgr_buf; long getgr_buf_len; int e; @@ -6078,15 +6138,18 @@ obj2gid(VALUE id getgr_buf_len = rb_str_capacity(*getgr_tmp); rb_str_set_len(*getgr_tmp, getgr_buf_len); errno = 0; - while ((e = getgrnam_r(grpname, &grbuf, getgr_buf, getgr_buf_len, &grptr)) != 0) { - if (e != ERANGE || getgr_buf_len >= GETGR_R_SIZE_LIMIT) { + struct getgrnam_r_args args = GETGRNAM_R_ARGS(grpname, getgr_buf, (size_t)getgr_buf_len); + + while ((e = IO_WITHOUT_GVL_INT(nogvl_getgrnam_r, &args)) != 0) { + if (e != ERANGE || args.bufsize >= GETGR_R_SIZE_LIMIT) { rb_str_resize(*getgr_tmp, 0); rb_syserr_fail(e, "getgrnam_r"); } - rb_str_modify_expand(*getgr_tmp, getgr_buf_len); - getgr_buf = RSTRING_PTR(*getgr_tmp); - getgr_buf_len = rb_str_capacity(*getgr_tmp); + rb_str_modify_expand(*getgr_tmp, (long)args.bufsize); + args.buf = RSTRING_PTR(*getgr_tmp); + args.bufsize = (size_t)rb_str_capacity(*getgr_tmp); } + grptr = args.result; #elif defined(HAVE_GETGRNAM) grptr = getgrnam(grpname); #else From 471d3950e6982719402df2abdd3a489deb7696bb Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Wed, 11 Sep 2024 18:43:36 -0500 Subject: [PATCH 246/829] [DOC] Tweaks for Array#each_index --- array.c | 24 ++++++------------------ 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/array.c b/array.c index f44af312f215f3..3f9ff90eafb608 100644 --- a/array.c +++ b/array.c @@ -2613,12 +2613,11 @@ rb_ary_each(VALUE ary) /* * call-seq: - * array.each_index {|index| ... } -> self - * array.each_index -> Enumerator + * each_index {|index| ... } -> self + * each_index -> new_enumerator * - * Iterates over array indexes. - * - * When a block given, passes each successive array index to the block; + * With a block given, iterates over the elements of +self+, + * passing each array index to the block; * returns +self+: * * a = [:foo, 'bar', 2] @@ -2640,20 +2639,9 @@ rb_ary_each(VALUE ary) * 0 * 1 * - * When no block given, returns a new Enumerator: - * - * a = [:foo, 'bar', 2] - * e = a.each_index - * e # => # - * a1 = e.each {|index| puts "#{index} #{a[index]}"} - * - * Output: - * - * 0 foo - * 1 bar - * 2 2 + * With no block given, returns a new Enumerator. * - * Related: #each, #reverse_each. + * Related: see {Methods for Iterating}[rdoc-ref:Array@Methods+for+Iterating]. */ static VALUE From c147e43b4f18bf3c5838e6a8f770acbeb01f7eff Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Wed, 11 Sep 2024 18:49:32 -0500 Subject: [PATCH 247/829] [DOC] Related for Array#empty? --- array.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/array.c b/array.c index 3f9ff90eafb608..f780c91ca02da5 100644 --- a/array.c +++ b/array.c @@ -2739,6 +2739,8 @@ rb_ary_length(VALUE ary) * * Returns +true+ if the count of elements in +self+ is zero, * +false+ otherwise. + * + * Related: see {Methods for Querying}[rdoc-ref:Array@Methods+for+Querying]. */ static VALUE From d8aa8f4184cd18eac0b87d2d4306fb3c245a5479 Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Wed, 11 Sep 2024 18:56:20 -0500 Subject: [PATCH 248/829] Related for Array#eql? --- array.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/array.c b/array.c index f780c91ca02da5..5851b19050147c 100644 --- a/array.c +++ b/array.c @@ -5237,7 +5237,7 @@ recursive_eql(VALUE ary1, VALUE ary2, int recur) /* * call-seq: - * array.eql?(other_array) -> true or false + * eql?(other_array) -> true or false * * Returns +true+ if +self+ and +other_array+ are the same size, * and if, for each index +i+ in +self+, self[i].eql?(other_array[i]): @@ -5250,6 +5250,8 @@ recursive_eql(VALUE ary1, VALUE ary2, int recur) * * This method is different from method Array#==, * which compares using method Object#==. + * + * Related: see {Methods for Querying}[rdoc-ref:Array@Methods+for+Querying]. */ static VALUE From fcb058309b1e2ffcc372ca17b0bcf9812b492653 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Thu, 12 Sep 2024 10:19:14 +0900 Subject: [PATCH 249/829] Accept version range Single `Integer` argument means an exact match to the major version. --- tool/lib/core_assertions.rb | 27 +++++-- tool/test/testunit/test_assertion.rb | 105 +++++++++++++++++++++++++++ 2 files changed, 127 insertions(+), 5 deletions(-) diff --git a/tool/lib/core_assertions.rb b/tool/lib/core_assertions.rb index 55ef93bed00842..62ada2bdca0628 100644 --- a/tool/lib/core_assertions.rb +++ b/tool/lib/core_assertions.rb @@ -882,15 +882,32 @@ def self.mingw? mswin? or mingw? end - def self.compare_version(a, b) - b.empty? ? true && a : a && (a <=> b) >= 0 + def self.version_compare(expected, actual) + expected.zip(actual).each {|e, a| z = (e <=> a); return z if z.nonzero?} + 0 + end + + def self.version_match?(expected, actual) + if !actual + false + elsif expected.empty? + true + elsif expected.size == 1 and Range === (range = expected.first) + b, e = range.begin, range.end + return false if b and (c = version_compare(Array(b), actual)) > 0 + return false if e and (c = version_compare(Array(e), actual)) < 0 + return false if e and range.exclude_end? and c == 0 + true + else + version_compare(expected, actual).zero? + end end def self.linux?(*ver) unless defined?(@linux) @linux = RUBY_PLATFORM.include?('linux') && `uname -r`.scan(/\d+/).map(&:to_i) end - compare_version @linux, ver + version_match? ver, @linux end private def linux?(*ver) CoreAssertions.linux?(*ver) @@ -905,7 +922,7 @@ def self.glibc?(*ver) @glibc = false end end - compare_version @glibc, ver + version_match? ver, @glibc end private def glibc?(*ver) CoreAssertions.glibc?(*ver) @@ -915,7 +932,7 @@ def self.macos?(*ver) unless defined?(@macos) @macos = RUBY_PLATFORM.include?('darwin') && `sw_vers -productVersion`.scan(/\d+/).map(&:to_i) end - compare_version @macos, ver + version_match? ver, @macos end private def macos?(*ver) CoreAssertions.macos?(*ver) diff --git a/tool/test/testunit/test_assertion.rb b/tool/test/testunit/test_assertion.rb index 1e19c102b8ef90..65c11fda420714 100644 --- a/tool/test/testunit/test_assertion.rb +++ b/tool/test/testunit/test_assertion.rb @@ -63,4 +63,109 @@ def test_caller_bactrace_location def assert_fail_for_backtrace_location assert false end + + VersionClass = Struct.new(:version) do + def version?(*ver) + Test::Unit::CoreAssertions.version_match?(ver, self.version) + end + end + + V14_6_0 = VersionClass.new([14, 6, 0]) + V15_0_0 = VersionClass.new([15, 0, 0]) + + def test_version_match_integer + assert_not_operator(V14_6_0, :version?, 13) + assert_operator(V14_6_0, :version?, 14) + assert_not_operator(V14_6_0, :version?, 15) + assert_not_operator(V15_0_0, :version?, 14) + assert_operator(V15_0_0, :version?, 15) + end + + def test_version_match_integer_range + assert_operator(V14_6_0, :version?, 13..14) + assert_not_operator(V15_0_0, :version?, 13..14) + assert_not_operator(V14_6_0, :version?, 13...14) + assert_not_operator(V15_0_0, :version?, 13...14) + end + + def test_version_match_array_range + assert_operator(V14_6_0, :version?, [14, 0]..[14, 6]) + assert_not_operator(V15_0_0, :version?, [14, 0]..[14, 6]) + assert_not_operator(V14_6_0, :version?, [14, 0]...[14, 6]) + assert_not_operator(V15_0_0, :version?, [14, 0]...[14, 6]) + assert_operator(V14_6_0, :version?, [14, 0]..[15]) + assert_operator(V15_0_0, :version?, [14, 0]..[15]) + assert_operator(V14_6_0, :version?, [14, 0]...[15]) + assert_not_operator(V15_0_0, :version?, [14, 0]...[15]) + end + + def test_version_match_integer_endless_range + assert_operator(V14_6_0, :version?, 14..) + assert_operator(V15_0_0, :version?, 14..) + assert_not_operator(V14_6_0, :version?, 15..) + assert_operator(V15_0_0, :version?, 15..) + end + + def test_version_match_integer_endless_range_exclusive + assert_operator(V14_6_0, :version?, 14...) + assert_operator(V15_0_0, :version?, 14...) + assert_not_operator(V14_6_0, :version?, 15...) + assert_operator(V15_0_0, :version?, 15...) + end + + def test_version_match_array_endless_range + assert_operator(V14_6_0, :version?, [14, 5]..) + assert_operator(V15_0_0, :version?, [14, 5]..) + assert_not_operator(V14_6_0, :version?, [14, 7]..) + assert_operator(V15_0_0, :version?, [14, 7]..) + assert_not_operator(V14_6_0, :version?, [15]..) + assert_operator(V15_0_0, :version?, [15]..) + assert_not_operator(V14_6_0, :version?, [15, 0]..) + assert_operator(V15_0_0, :version?, [15, 0]..) + end + + def test_version_match_array_endless_range_exclude_end + assert_operator(V14_6_0, :version?, [14, 5]...) + assert_operator(V15_0_0, :version?, [14, 5]...) + assert_not_operator(V14_6_0, :version?, [14, 7]...) + assert_operator(V15_0_0, :version?, [14, 7]...) + assert_not_operator(V14_6_0, :version?, [15]...) + assert_operator(V15_0_0, :version?, [15]...) + assert_not_operator(V14_6_0, :version?, [15, 0]...) + assert_operator(V15_0_0, :version?, [15, 0]...) + end + + def test_version_match_integer_beginless_range + assert_operator(V14_6_0, :version?, ..14) + assert_not_operator(V15_0_0, :version?, ..14) + assert_operator(V14_6_0, :version?, ..15) + assert_operator(V15_0_0, :version?, ..15) + + assert_not_operator(V14_6_0, :version?, ...14) + assert_not_operator(V15_0_0, :version?, ...14) + assert_operator(V14_6_0, :version?, ...15) + assert_not_operator(V15_0_0, :version?, ...15) + end + + def test_version_match_array_beginless_range + assert_not_operator(V14_6_0, :version?, ..[14, 5]) + assert_not_operator(V15_0_0, :version?, ..[14, 5]) + assert_operator(V14_6_0, :version?, ..[14, 6]) + assert_not_operator(V15_0_0, :version?, ..[14, 6]) + assert_operator(V14_6_0, :version?, ..[15]) + assert_operator(V15_0_0, :version?, ..[15]) + assert_operator(V14_6_0, :version?, ..[15, 0]) + assert_operator(V15_0_0, :version?, ..[15, 0]) + end + + def test_version_match_array_beginless_range_exclude_end + assert_not_operator(V14_6_0, :version?, ...[14, 5]) + assert_not_operator(V15_0_0, :version?, ...[14, 5]) + assert_not_operator(V14_6_0, :version?, ...[14, 6]) + assert_not_operator(V15_0_0, :version?, ...[14, 6]) + assert_operator(V14_6_0, :version?, ...[15]) + assert_not_operator(V15_0_0, :version?, ...[15]) + assert_operator(V14_6_0, :version?, ...[15, 0]) + assert_not_operator(V15_0_0, :version?, ...[15, 0]) + end end From a542479a750ff65c036df913a4b8d9dd350c4522 Mon Sep 17 00:00:00 2001 From: tomoya ishida Date: Fri, 13 Sep 2024 00:04:33 +0900 Subject: [PATCH 250/829] [ruby/irb] Remove KEYWORD_ALIASES which handled special alias name of irb_break irb_catch and irb_next command (https://github.com/ruby/irb/pull/1004) * Remove KEYWORD_ALIASES which handled special alias name of irb_break irb_catch and irb_next command * Remove unused instance variable user_aliases Co-authored-by: Stan Lo --------- https://github.com/ruby/irb/commit/f256d7899f Co-authored-by: Stan Lo --- lib/irb/command/help.rb | 2 +- lib/irb/context.rb | 14 +------------- lib/irb/default_commands.rb | 12 +++++++++--- 3 files changed, 11 insertions(+), 17 deletions(-) diff --git a/lib/irb/command/help.rb b/lib/irb/command/help.rb index c2018f9b30bdff..12b468fefcbb28 100644 --- a/lib/irb/command/help.rb +++ b/lib/irb/command/help.rb @@ -39,7 +39,7 @@ def help_message help_cmds = commands_grouped_by_categories.delete("Help") no_category_cmds = commands_grouped_by_categories.delete("No category") - aliases = irb_context.instance_variable_get(:@user_aliases).map do |alias_name, target| + aliases = irb_context.instance_variable_get(:@command_aliases).map do |alias_name, target| { display_name: alias_name, description: "Alias for `#{target}`" } end diff --git a/lib/irb/context.rb b/lib/irb/context.rb index aa0c60b0e35927..fafe99d57be4e3 100644 --- a/lib/irb/context.rb +++ b/lib/irb/context.rb @@ -149,8 +149,7 @@ def initialize(irb, workspace = nil, input_method = nil) @newline_before_multiline_output = true end - @user_aliases = IRB.conf[:COMMAND_ALIASES].dup - @command_aliases = @user_aliases.merge(KEYWORD_ALIASES) + @command_aliases = IRB.conf[:COMMAND_ALIASES].dup end private def term_interactive? @@ -158,17 +157,6 @@ def initialize(irb, workspace = nil, input_method = nil) STDIN.tty? && ENV['TERM'] != 'dumb' end - # because all input will eventually be evaluated as Ruby code, - # command names that conflict with Ruby keywords need special workaround - # we can remove them once we implemented a better command system for IRB - KEYWORD_ALIASES = { - :break => :irb_break, - :catch => :irb_catch, - :next => :irb_next, - }.freeze - - private_constant :KEYWORD_ALIASES - def use_tracer=(val) require_relative "ext/tracer" if val IRB.conf[:USE_TRACER] = val diff --git a/lib/irb/default_commands.rb b/lib/irb/default_commands.rb index fec41df4e2eff2..768fbee9d74604 100644 --- a/lib/irb/default_commands.rb +++ b/lib/irb/default_commands.rb @@ -181,9 +181,15 @@ def load_command(command) [:edit, NO_OVERRIDE] ) - _register_with_aliases(:irb_break, Command::Break) - _register_with_aliases(:irb_catch, Command::Catch) - _register_with_aliases(:irb_next, Command::Next) + _register_with_aliases(:irb_break, Command::Break, + [:break, OVERRIDE_ALL] + ) + _register_with_aliases(:irb_catch, Command::Catch, + [:catch, OVERRIDE_PRIVATE_ONLY] + ) + _register_with_aliases(:irb_next, Command::Next, + [:next, OVERRIDE_ALL] + ) _register_with_aliases(:irb_delete, Command::Delete, [:delete, NO_OVERRIDE] ) From 15135030e5808d527325feaaaf04caeb1b44f8b5 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Wed, 11 Sep 2024 16:47:14 -0400 Subject: [PATCH 251/829] [ruby/prism] Do not warn \r in shebang on windows https://github.com/ruby/prism/commit/e8c862ca1f --- prism/prism.c | 13 ++--- test/prism/result/warnings_test.rb | 78 ++++++++++++++++-------------- 2 files changed, 49 insertions(+), 42 deletions(-) diff --git a/prism/prism.c b/prism/prism.c index 0dcc4afe5d623b..b3d843e6724b92 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -21772,6 +21772,9 @@ pm_strnstr(const char *big, const char *little, size_t big_length) { return NULL; } +#ifdef _WIN32 +#define pm_parser_warn_shebang_carriage_return(parser, start, length) ((void) 0) +#else /** * Potentially warn the user if the shebang that has been found to include * "ruby" has a carriage return at the end, as that can cause problems on some @@ -21783,6 +21786,7 @@ pm_parser_warn_shebang_carriage_return(pm_parser_t *parser, const uint8_t *start pm_parser_warn(parser, start, start + length, PM_WARN_SHEBANG_CARRIAGE_RETURN); } } +#endif /** * Process the shebang when initializing the parser. This function assumes that @@ -21973,9 +21977,7 @@ pm_parser_init(pm_parser_t *parser, const uint8_t *source, size_t size, const pm const char *engine; if ((engine = pm_strnstr((const char *) parser->start, "ruby", length)) != NULL) { if (newline != NULL) { - size_t length_including_newline = length + 1; - pm_parser_warn_shebang_carriage_return(parser, parser->start, length_including_newline); - + pm_parser_warn_shebang_carriage_return(parser, parser->start, length + 1); parser->encoding_comment_start = newline + 1; } @@ -22015,10 +22017,9 @@ pm_parser_init(pm_parser_t *parser, const uint8_t *source, size_t size, const pm const char *engine; if ((engine = pm_strnstr((const char *) cursor, "ruby", length)) != NULL) { found_shebang = true; - if (newline != NULL) { - size_t length_including_newline = length + 1; - pm_parser_warn_shebang_carriage_return(parser, cursor, length_including_newline); + if (newline != NULL) { + pm_parser_warn_shebang_carriage_return(parser, cursor, length + 1); parser->encoding_comment_start = newline + 1; } diff --git a/test/prism/result/warnings_test.rb b/test/prism/result/warnings_test.rb index aeac7f80e64704..861f6d99994ae6 100644 --- a/test/prism/result/warnings_test.rb +++ b/test/prism/result/warnings_test.rb @@ -321,42 +321,48 @@ def test_unreachable_statement assert_warning("tap { redo; foo }", "statement not reached") end - def test_shebang_ending_with_carriage_return - msg = "shebang line ending with \\r may cause problems" - - assert_warning(<<~RUBY, msg, compare: false) - #!ruby\r - p(123) - RUBY - - assert_warning(<<~RUBY, msg, compare: false) - #!ruby \r - p(123) - RUBY - - assert_warning(<<~RUBY, msg, compare: false) - #!ruby -Eutf-8\r - p(123) - RUBY - - # Used with the `-x` object, to ignore the script up until the first shebang that mentioned "ruby". - assert_warning(<<~SCRIPT, msg, compare: false) - #!/usr/bin/env bash - # Some initial shell script or other content - # that Ruby should ignore - echo "This is shell script part" - exit 0 - - #! /usr/bin/env ruby -Eutf-8\r - # Ruby script starts here - puts "Hello from Ruby!" - SCRIPT - - refute_warning("#ruby not_a_shebang\r\n", compare: false) - - # CRuby doesn't emit the warning if a malformed file only has `\r` and not `\n`. - # https://bugs.ruby-lang.org/issues/20700 - refute_warning("#!ruby\r", compare: false) + if RbConfig::CONFIG["host_os"].match?(/bccwin|cygwin|djgpp|mingw|mswin|wince/i) + def test_shebang_ending_with_carriage_return + refute_warning("#!ruby\r\np(123)\n", compare: false) + end + else + def test_shebang_ending_with_carriage_return + msg = "shebang line ending with \\r may cause problems" + + assert_warning(<<~RUBY, msg, compare: false) + #!ruby\r + p(123) + RUBY + + assert_warning(<<~RUBY, msg, compare: false) + #!ruby \r + p(123) + RUBY + + assert_warning(<<~RUBY, msg, compare: false) + #!ruby -Eutf-8\r + p(123) + RUBY + + # Used with the `-x` object, to ignore the script up until the first shebang that mentioned "ruby". + assert_warning(<<~SCRIPT, msg, compare: false) + #!/usr/bin/env bash + # Some initial shell script or other content + # that Ruby should ignore + echo "This is shell script part" + exit 0 + + #! /usr/bin/env ruby -Eutf-8\r + # Ruby script starts here + puts "Hello from Ruby!" + SCRIPT + + refute_warning("#ruby not_a_shebang\r\n", compare: false) + + # CRuby doesn't emit the warning if a malformed file only has `\r` and not `\n`. + # https://bugs.ruby-lang.org/issues/20700 + refute_warning("#!ruby\r", compare: false) + end end def test_warnings_verbosity From f2919bd11c570fc5f5440d1f101be38f61e3d16b Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Thu, 12 Sep 2024 10:04:10 -0700 Subject: [PATCH 252/829] Add error checking to readdir, telldir, and closedir calls in dir.c Raise SystemCallError exception when these functions return an error. This changes behavior for the following case (found by the tests): ```ruby dir1 = Dir.new('..') dir2 = Dir.for_fd(dir1.fileno) dir1.close dir2.close ``` The above code is basically broken, as `dir1.close` closed the file descriptor. The subsequent `dir2.close` call is undefined behavior. When run in isolation, it raises Errno::EBADF after the change, but if another thread opens a file descriptor between the `dir1.close` and `dir2.close` calls, the `dir2.close` call could close the file descriptor opened by the other thread. Raising an exception is much better in this case as it makes it obvious there is a bug in the code. For the readdir check, since the GVL has already been released, reacquire it rb_thread_call_with_gvl if an exception needs to be raised. Due to the number of closedir calls, this adds static close_dir_data and check_closedir functions. The close_dir_data takes a struct dir_data * and handles setting the dir entry to NULL regardless of failure. Fixes [Bug #20586] Co-authored-by: Nobuyoshi Nakada --- dir.c | 54 +++++++++++++++++++++++++++++++++---------- test/ruby/test_dir.rb | 4 +++- win32/dir.h | 2 +- win32/win32.c | 3 ++- 4 files changed, 48 insertions(+), 15 deletions(-) diff --git a/dir.c b/dir.c index 84687227a2d624..24eec8dc15dfaf 100644 --- a/dir.c +++ b/dir.c @@ -571,6 +571,25 @@ opendir_without_gvl(const char *path) return opendir(path); } +static void +close_dir_data(struct dir_data *dp) +{ + if (dp->dir) { + if (closedir(dp->dir) < 0) { + dp->dir = NULL; + rb_sys_fail("closedir"); + } + dp->dir = NULL; + } +} + +static void +check_closedir(DIR *dirp) +{ + if (closedir(dirp) < 0) + rb_sys_fail("closedir"); +} + static VALUE dir_initialize(rb_execution_context_t *ec, VALUE dir, VALUE dirname, VALUE enc) { @@ -585,8 +604,7 @@ dir_initialize(rb_execution_context_t *ec, VALUE dir, VALUE dirname, VALUE enc) dirname = rb_str_dup_frozen(dirname); TypedData_Get_Struct(dir, struct dir_data, &dir_data_type, dp); - if (dp->dir) closedir(dp->dir); - dp->dir = NULL; + close_dir_data(dp); RB_OBJ_WRITE(dir, &dp->path, Qnil); dp->enc = fsenc; path = RSTRING_PTR(dirname); @@ -810,10 +828,22 @@ fundamental_encoding_p(rb_encoding *enc) # define READDIR(dir, enc) rb_w32_readdir((dir), (enc)) # define READDIR_NOGVL READDIR #else +NORETURN(static void *sys_failure(void *function)); +static void * +sys_failure(void *function) +{ + rb_sys_fail(function); +} + static void * nogvl_readdir(void *dir) { - return readdir(dir); + rb_errno_set(0); + if ((dir = readdir(dir)) == NULL) { + if (rb_errno()) + rb_thread_call_with_gvl(sys_failure, (void *)"readdir"); + } + return dir; } # define READDIR(dir, enc) IO_WITHOUT_GVL(nogvl_readdir, (void *)(dir)) @@ -962,7 +992,8 @@ dir_tell(VALUE dir) long pos; GetDIR(dir, dirp); - pos = telldir(dirp->dir); + if((pos = telldir(dirp->dir)) < 0) + rb_sys_fail("telldir"); return rb_int2inum(pos); } #else @@ -1081,8 +1112,7 @@ dir_close(VALUE dir) dirp = dir_get(dir); if (!dirp->dir) return Qnil; - closedir(dirp->dir); - dirp->dir = NULL; + close_dir_data(dirp); return Qnil; } @@ -2585,7 +2615,7 @@ static void glob_dir_finish(ruby_glob_entries_t *ent, int flags) { if (flags & FNM_GLOB_NOSORT) { - closedir(ent->nosort.dirp); + check_closedir(ent->nosort.dirp); ent->nosort.dirp = NULL; } else if (ent->sort.entries) { @@ -2616,7 +2646,7 @@ glob_opendir(ruby_glob_entries_t *ent, DIR *dirp, int flags, rb_encoding *enc) #ifdef _WIN32 if ((capacity = dirp->nfiles) > 0) { if (!(newp = GLOB_ALLOC_N(rb_dirent_t, capacity))) { - closedir(dirp); + check_closedir(dirp); return NULL; } ent->sort.entries = newp; @@ -2636,7 +2666,7 @@ glob_opendir(ruby_glob_entries_t *ent, DIR *dirp, int flags, rb_encoding *enc) ent->sort.entries[count++] = rdp; ent->sort.count = count; } - closedir(dirp); + check_closedir(dirp); if (count < capacity) { if (!(newp = GLOB_REALLOC_N(ent->sort.entries, count))) { glob_dir_finish(ent, 0); @@ -2651,7 +2681,7 @@ glob_opendir(ruby_glob_entries_t *ent, DIR *dirp, int flags, rb_encoding *enc) nomem: glob_dir_finish(ent, 0); - closedir(dirp); + check_closedir(dirp); return NULL; } @@ -2814,7 +2844,7 @@ glob_helper( # if NORMALIZE_UTF8PATH if (!(norm_p || magical || recursive)) { - closedir(dirp); + check_closedir(dirp); goto literally; } # endif @@ -3712,7 +3742,7 @@ nogvl_dir_empty_p(void *ptr) break; } } - closedir(dir); + check_closedir(dir); return (void *)result; } diff --git a/test/ruby/test_dir.rb b/test/ruby/test_dir.rb index b86cf330bc63f3..78371a096b4b88 100644 --- a/test/ruby/test_dir.rb +++ b/test/ruby/test_dir.rb @@ -710,7 +710,9 @@ def test_for_fd assert_equal(new_dir.chdir{Dir.pwd}, for_fd_dir.chdir{Dir.pwd}) ensure new_dir&.close - for_fd_dir&.close + if for_fd_dir + assert_raise(Errno::EBADF) { for_fd_dir.close } + end end else assert_raise(NotImplementedError) { Dir.for_fd(0) } diff --git a/win32/dir.h b/win32/dir.h index 0292c27c9c6c2b..da1c4b76afae14 100644 --- a/win32/dir.h +++ b/win32/dir.h @@ -36,7 +36,7 @@ struct direct* rb_w32_ureaddir(DIR *); long rb_w32_telldir(DIR *); void rb_w32_seekdir(DIR *, long); void rb_w32_rewinddir(DIR *); -void rb_w32_closedir(DIR *); +int rb_w32_closedir(DIR *); char *rb_w32_ugetcwd(char *, int); #define opendir(s) rb_w32_uopendir((s)) diff --git a/win32/win32.c b/win32/win32.c index 23ab773eec23e8..4c51b381f2899f 100644 --- a/win32/win32.c +++ b/win32/win32.c @@ -2461,7 +2461,7 @@ rb_w32_rewinddir(DIR *dirp) // /* License: Artistic or GPL */ -void +int rb_w32_closedir(DIR *dirp) { if (dirp) { @@ -2471,6 +2471,7 @@ rb_w32_closedir(DIR *dirp) free(dirp->bits); free(dirp); } + return 0; } #if RUBY_MSVCRT_VERSION >= 140 From ea2af5782df63266577ba08a4ef4c30b6d63e564 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Wed, 28 Aug 2024 16:35:03 -0400 Subject: [PATCH 253/829] Switch the default parser from parse.y to Prism This commit switches the default parser to Prism. There are a couple of additional changes related to this that are a part of this as well to make this happen. * Switch the default parser in parse.h * Remove the Prism-specific workflow and add a parse.y-specific workflow to CI so that it continues to be tested * Update a few test exclusions since Prism has the correct behavior but parse.y doesn't per https://bugs.ruby-lang.org/issues/20504. * Skips a couple of tests on RBS which are failing because they are using RubyVM::AbstractSyntaxTree.of. Fixes [Feature #20564] --- .github/workflows/bundled_gems.yml | 2 +- .github/workflows/macos.yml | 2 +- .github/workflows/{prism.yml => parsey.yml} | 21 ++++++----- .github/workflows/ubuntu.yml | 2 +- .github/workflows/yjit-macos.yml | 2 +- .github/workflows/yjit-ubuntu.yml | 2 +- internal/parse.h | 2 +- prism_compile.c | 37 +++++++++++++++---- .../TestM17N.rb | 0 .../TestMixedUnicodeEscape.rb | 0 .../TestRubyLiteral.rb | 0 test/ruby/test_literal.rb | 5 ++- test/ruby/test_m17n.rb | 8 ++-- test/ruby/test_mixed_unicode_escapes.rb | 2 +- tool/rbs_skip_tests | 14 +++++++ 15 files changed, 68 insertions(+), 31 deletions(-) rename .github/workflows/{prism.yml => parsey.yml} (87%) rename test/{.excludes-prism => .excludes-parsey}/TestM17N.rb (100%) rename test/{.excludes-prism => .excludes-parsey}/TestMixedUnicodeEscape.rb (100%) rename test/{.excludes-prism => .excludes-parsey}/TestRubyLiteral.rb (100%) diff --git a/.github/workflows/bundled_gems.yml b/.github/workflows/bundled_gems.yml index feafb9bca8d0c2..3a1f6b70f468e9 100644 --- a/.github/workflows/bundled_gems.yml +++ b/.github/workflows/bundled_gems.yml @@ -103,7 +103,7 @@ jobs: timeout-minutes: 30 env: RUBY_TESTOPTS: '-q --tty=no' - TEST_BUNDLED_GEMS_ALLOW_FAILURES: '' + TEST_BUNDLED_GEMS_ALLOW_FAILURES: 'typeprof' if: ${{ steps.diff.outputs.gems }} - name: Commit diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index ecd1838123219c..fee998c70e7fcc 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -138,7 +138,7 @@ jobs: timeout-minutes: 60 env: RUBY_TESTOPTS: '-q --tty=no' - TEST_BUNDLED_GEMS_ALLOW_FAILURES: '' + TEST_BUNDLED_GEMS_ALLOW_FAILURES: 'typeprof' PRECHECK_BUNDLED_GEMS: 'no' - name: make skipped tests diff --git a/.github/workflows/prism.yml b/.github/workflows/parsey.yml similarity index 87% rename from .github/workflows/prism.yml rename to .github/workflows/parsey.yml index de0243cd8f081f..73e0f4847c5e0b 100644 --- a/.github/workflows/prism.yml +++ b/.github/workflows/parsey.yml @@ -1,4 +1,4 @@ -name: Prism +name: parse.y on: push: paths-ignore: @@ -33,31 +33,31 @@ jobs: matrix: include: - test_task: test - run_opts: '--parser=prism' + run_opts: '--parser=parse.y' testopts: '-v --tty=no' timeout: 30 - test_task: test-all - run_opts: '--parser=prism' - testopts: '-q --tty=no --excludes-dir="../src/test/.excludes-prism" --exclude="error_highlight/test_error_highlight.rb"' + run_opts: '--parser=parse.y' + testopts: '-q --tty=no --excludes-dir="../src/test/.excludes-parsey"' timeout: 40 - test_task: test-spec - run_opts: '--parser=prism' - specopts: '-T --parser=prism' + run_opts: '--parser=parse.y' + specopts: '-T --parser=parse.y' timeout: 10 - test_task: test-tool - run_opts: '--parser=prism' + run_opts: '--parser=parse.y' testopts: '-v --tty=no' timeout: 30 - test_task: test-bundler-parallel - run_opts: '--parser=prism' + run_opts: '--parser=parse.y' testopts: '-v --tty=no' timeout: 50 - test_task: test-bundled-gems - run_opts: '--parser=prism' + run_opts: '--parser=parse.y' testopts: '-v --tty=no' timeout: 30 - test_task: test-syntax-suggest - run_opts: '--parser=prism' + run_opts: '--parser=parse.y' testopts: '-v --tty=no' timeout: 30 fail-fast: false @@ -105,6 +105,7 @@ jobs: RUBY_TESTOPTS: ${{ matrix.testopts }} RUN_OPTS: ${{ matrix.run_opts }} SPECOPTS: ${{ matrix.specopts }} + TEST_BUNDLED_GEMS_ALLOW_FAILURES: 'typeprof' - uses: ./.github/actions/slack with: diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu.yml index 85d401dcccdc93..6b58d071107e17 100644 --- a/.github/workflows/ubuntu.yml +++ b/.github/workflows/ubuntu.yml @@ -144,7 +144,7 @@ jobs: timeout-minutes: ${{ matrix.timeout || 40 }} env: RUBY_TESTOPTS: '-q --tty=no' - TEST_BUNDLED_GEMS_ALLOW_FAILURES: '' + TEST_BUNDLED_GEMS_ALLOW_FAILURES: 'typeprof' PRECHECK_BUNDLED_GEMS: 'no' - name: make skipped tests diff --git a/.github/workflows/yjit-macos.yml b/.github/workflows/yjit-macos.yml index 304f3c3513a2de..601e25e9d08a82 100644 --- a/.github/workflows/yjit-macos.yml +++ b/.github/workflows/yjit-macos.yml @@ -134,7 +134,7 @@ jobs: timeout-minutes: 60 env: RUBY_TESTOPTS: '-q --tty=no' - TEST_BUNDLED_GEMS_ALLOW_FAILURES: '' + TEST_BUNDLED_GEMS_ALLOW_FAILURES: 'typeprof' SYNTAX_SUGGEST_TIMEOUT: '5' PRECHECK_BUNDLED_GEMS: 'no' continue-on-error: ${{ matrix.continue-on-test_task || false }} diff --git a/.github/workflows/yjit-ubuntu.yml b/.github/workflows/yjit-ubuntu.yml index e585c90ae8f6fe..b1f8bcc77a50a9 100644 --- a/.github/workflows/yjit-ubuntu.yml +++ b/.github/workflows/yjit-ubuntu.yml @@ -187,7 +187,7 @@ jobs: timeout-minutes: 90 env: RUBY_TESTOPTS: '-q --tty=no' - TEST_BUNDLED_GEMS_ALLOW_FAILURES: '' + TEST_BUNDLED_GEMS_ALLOW_FAILURES: 'typeprof' PRECHECK_BUNDLED_GEMS: 'no' SYNTAX_SUGGEST_TIMEOUT: '5' YJIT_BINDGEN_DIFF_OPTS: '--exit-code' diff --git a/internal/parse.h b/internal/parse.h index fdf2a10183e115..88230fd177df98 100644 --- a/internal/parse.h +++ b/internal/parse.h @@ -16,7 +16,7 @@ // 0: parse.y // 1: Prism #ifndef RB_DEFAULT_PARSER -#define RB_DEFAULT_PARSER 0 +#define RB_DEFAULT_PARSER 1 #endif #ifdef UNIVERSAL_PARSER diff --git a/prism_compile.c b/prism_compile.c index 0be5c920780e6a..29511e7d396401 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -1399,10 +1399,12 @@ pm_compile_hash_elements(rb_iseq_t *iseq, const pm_node_t *node, const pm_node_l switch (PM_NODE_TYPE(element)) { case PM_ASSOC_NODE: { // Pre-allocation check (this branch can be omitted). - if (PM_NODE_FLAG_P(element, PM_NODE_FLAG_STATIC_LITERAL) && ( - (!static_literal && ((index + min_tmp_hash_length) < elements->size)) || - (first_chunk && stack_length == 0) - )) { + if ( + PM_NODE_FLAG_P(element, PM_NODE_FLAG_STATIC_LITERAL) && ( + (!static_literal && ((index + min_tmp_hash_length) < elements->size)) || + (first_chunk && stack_length == 0) + ) + ) { // Count the elements that are statically-known. size_t count = 1; while (index + count < elements->size && PM_NODE_FLAG_P(elements->nodes[index + count], PM_NODE_FLAG_STATIC_LITERAL)) count++; @@ -5640,6 +5642,14 @@ pm_compile_constant_path_operator_write_node(rb_iseq_t *iseq, const pm_constant_ PUSH_INSN1(ret, location, setconstant, name); } +/** + * Many nodes in Prism can be marked as a static literal, which means slightly + * different things depending on which node it is. Occasionally we need to omit + * container nodes from static literal checks, which is where this macro comes + * in. + */ +#define PM_CONTAINER_P(node) (PM_NODE_TYPE_P(node, PM_ARRAY_NODE) || PM_NODE_TYPE_P(node, PM_HASH_NODE) || PM_NODE_TYPE_P(node, PM_RANGE_NODE)) + /** * Compiles a prism node into instruction sequences. * @@ -5867,12 +5877,21 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, new_array_size++; } } - else if (PM_NODE_FLAG_P(element, PM_NODE_FLAG_STATIC_LITERAL) && !static_literal && ((index + min_tmp_array_size) < elements->size)) { + else if ( + PM_NODE_FLAG_P(element, PM_NODE_FLAG_STATIC_LITERAL) && + !PM_CONTAINER_P(element) && + !static_literal && + ((index + min_tmp_array_size) < elements->size) + ) { // If we have a static literal, then there's the potential // to group a bunch of them together with a literal array // and then concat them together. size_t right_index = index + 1; - while (right_index < elements->size && PM_NODE_FLAG_P(elements->nodes[right_index], PM_NODE_FLAG_STATIC_LITERAL)) right_index++; + while ( + right_index < elements->size && + PM_NODE_FLAG_P(elements->nodes[right_index], PM_NODE_FLAG_STATIC_LITERAL) && + !PM_CONTAINER_P(elements->nodes[right_index]) + ) right_index++; size_t tmp_array_size = right_index - index; if (tmp_array_size >= min_tmp_array_size) { @@ -8975,7 +8994,7 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, pm_node_t *value = cast->value; name = cast->name; - if (PM_NODE_FLAG_P(value, PM_NODE_FLAG_STATIC_LITERAL) && !(PM_NODE_TYPE_P(value, PM_ARRAY_NODE) || PM_NODE_TYPE_P(value, PM_HASH_NODE) || PM_NODE_TYPE_P(value, PM_RANGE_NODE))) { + if (PM_NODE_FLAG_P(value, PM_NODE_FLAG_STATIC_LITERAL) && !PM_CONTAINER_P(value)) { rb_ary_push(default_values, pm_static_literal_value(iseq, value, scope_node)); } else { @@ -9285,7 +9304,7 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, pm_node_t *value = cast->value; name = cast->name; - if (!PM_NODE_FLAG_P(value, PM_NODE_FLAG_STATIC_LITERAL) || PM_NODE_TYPE_P(value, PM_ARRAY_NODE) || PM_NODE_TYPE_P(value, PM_HASH_NODE) || PM_NODE_TYPE_P(value, PM_RANGE_NODE)) { + if (!PM_NODE_FLAG_P(value, PM_NODE_FLAG_STATIC_LITERAL) || PM_CONTAINER_P(value)) { LABEL *end_label = NEW_LABEL(location.line); pm_local_index_t index = pm_lookup_local_index(iseq, scope_node, name, 0); @@ -9815,6 +9834,8 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, } } +#undef PM_CONTAINER_P + /** True if the given iseq can have pre execution blocks. */ static inline bool pm_iseq_pre_execution_p(rb_iseq_t *iseq) diff --git a/test/.excludes-prism/TestM17N.rb b/test/.excludes-parsey/TestM17N.rb similarity index 100% rename from test/.excludes-prism/TestM17N.rb rename to test/.excludes-parsey/TestM17N.rb diff --git a/test/.excludes-prism/TestMixedUnicodeEscape.rb b/test/.excludes-parsey/TestMixedUnicodeEscape.rb similarity index 100% rename from test/.excludes-prism/TestMixedUnicodeEscape.rb rename to test/.excludes-parsey/TestMixedUnicodeEscape.rb diff --git a/test/.excludes-prism/TestRubyLiteral.rb b/test/.excludes-parsey/TestRubyLiteral.rb similarity index 100% rename from test/.excludes-prism/TestRubyLiteral.rb rename to test/.excludes-parsey/TestRubyLiteral.rb diff --git a/test/ruby/test_literal.rb b/test/ruby/test_literal.rb index 8732d8f0d0f19a..9b294bc8eab7b5 100644 --- a/test/ruby/test_literal.rb +++ b/test/ruby/test_literal.rb @@ -241,8 +241,9 @@ def test_regexp def test_dregexp assert_instance_of Regexp, /re#{'ge'}xp/ assert_equal(/regexp/, /re#{'ge'}xp/) - bug3903 = '[ruby-core:32682]' - assert_raise(SyntaxError, bug3903) {eval('/[#{"\x80"}]/')} + + # [ruby-core:32682] + eval('/[#{"\x80"}]/') end def test_array diff --git a/test/ruby/test_m17n.rb b/test/ruby/test_m17n.rb index 630ba269c0286f..93366ed02aa5ae 100644 --- a/test/ruby/test_m17n.rb +++ b/test/ruby/test_m17n.rb @@ -1439,20 +1439,20 @@ def test_regexp_usascii assert_regexp_usascii_literal('//', Encoding::US_ASCII) assert_regexp_usascii_literal('/#{ }/', Encoding::US_ASCII) assert_regexp_usascii_literal('/#{"a"}/', Encoding::US_ASCII) - assert_regexp_usascii_literal('/#{%q"\x80"}/', Encoding::ASCII_8BIT) - assert_regexp_usascii_literal('/#{"\x80"}/', nil, SyntaxError) + assert_regexp_usascii_literal('/#{%q"\x80"}/', Encoding::US_ASCII) + assert_regexp_usascii_literal('/#{"\x80"}/', Encoding::ASCII_8BIT) assert_regexp_usascii_literal('/a/', Encoding::US_ASCII) assert_regexp_usascii_literal('/a#{ }/', Encoding::US_ASCII) assert_regexp_usascii_literal('/a#{"a"}/', Encoding::US_ASCII) assert_regexp_usascii_literal('/a#{%q"\x80"}/', Encoding::ASCII_8BIT) - assert_regexp_usascii_literal('/a#{"\x80"}/', nil, SyntaxError) + assert_regexp_usascii_literal('/a#{"\x80"}/', Encoding::ASCII_8BIT) assert_regexp_usascii_literal('/\x80/', Encoding::ASCII_8BIT) assert_regexp_usascii_literal('/\x80#{ }/', Encoding::ASCII_8BIT) assert_regexp_usascii_literal('/\x80#{"a"}/', Encoding::ASCII_8BIT) assert_regexp_usascii_literal('/\x80#{%q"\x80"}/', Encoding::ASCII_8BIT) - assert_regexp_usascii_literal('/\x80#{"\x80"}/', nil, SyntaxError) + assert_regexp_usascii_literal('/\x80#{"\x80"}/', Encoding::ASCII_8BIT) assert_regexp_usascii_literal('/\u1234/', Encoding::UTF_8) assert_regexp_usascii_literal('/\u1234#{ }/', Encoding::UTF_8) diff --git a/test/ruby/test_mixed_unicode_escapes.rb b/test/ruby/test_mixed_unicode_escapes.rb index f0b4cc691f02c8..a30b5c19f54cb4 100644 --- a/test/ruby/test_mixed_unicode_escapes.rb +++ b/test/ruby/test_mixed_unicode_escapes.rb @@ -18,12 +18,12 @@ def test_basic assert_raise(SyntaxError) { eval %q("\u{1234}")} # also should not work for Regexp - assert_raise(SyntaxError) { eval %q(/#{"\u1234"}#{""}/)} assert_raise(RegexpError) { eval %q(/\u{1234}#{nil}/)} assert_raise(RegexpError) { eval %q(/#{nil}\u1234/)} # String interpolation turns into an expression and we get # a different kind of error, but we still can't mix these + assert_raise(Encoding::CompatibilityError) { eval %q(/#{"\u1234"}#{""}/)} assert_raise(Encoding::CompatibilityError) { eval %q("\u{1234}#{nil}")} assert_raise(Encoding::CompatibilityError) { eval %q("#{nil}\u1234")} end diff --git a/tool/rbs_skip_tests b/tool/rbs_skip_tests index 786e049136b39f..650d1828d5b983 100644 --- a/tool/rbs_skip_tests +++ b/tool/rbs_skip_tests @@ -63,3 +63,17 @@ TestInstanceNetHTTPResponse depending on external resources test_initialize(TempfileRemoverSingletonTest) Remover class is removed at https://github.com/ruby/tempfile/commit/753ab16642fdc3cf92e1cf3dd1d80e8f75128735 test_call(TempfileRemoverTest) Remover class is removed at https://github.com/ruby/tempfile/commit/753ab16642fdc3cf92e1cf3dd1d80e8f75128735 + +# Switching to prism resulted in an unexpected error, `RuntimeError: cannot get AST for ISEQ compiled by prism`, raised by `RubyVM::AbstractSyntax.of(method)` +test_1(RBS::RuntimePrototypeTest) +test_decls_for_anonymous_class_or_module(RBS::RuntimePrototypeTest) +test_decls_structure(RBS::RuntimePrototypeTest) +test_define_method_alias(RBS::RuntimePrototypeTest) +test_for_initialize_type(RBS::RuntimePrototypeTest) +test_for_overwritten_module_name(RBS::RuntimePrototypeTest) +test_for_yield(RBS::RuntimePrototypeTest) +test_include_owner(RBS::RuntimePrototypeTest) +test_merge_types(RBS::RuntimePrototypeTest) +test_reflection(RBS::RuntimePrototypeTest) +test_todo(RBS::RuntimePrototypeTest) +test_of(RubyVM::AbstractSyntaxTreeSingletonTest) From c4b43692dbca56ef5ff983213faa07d06a4ea8ab Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Wed, 11 Sep 2024 08:54:30 -0400 Subject: [PATCH 254/829] [PRISM] Move case node compilation into its own function --- prism_compile.c | 642 ++++++++++++++++++++++++------------------------ 1 file changed, 325 insertions(+), 317 deletions(-) diff --git a/prism_compile.c b/prism_compile.c index 29511e7d396401..1c5de0799413a8 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -5096,63 +5096,6 @@ pm_compile_constant_path(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *co } } -/** - * When we're compiling a case node, it's possible that we can speed it up using - * a dispatch hash, which will allow us to jump directly to the correct when - * clause body based on a hash lookup of the value. This can only happen when - * the conditions are literals that can be compiled into a hash key. - * - * This function accepts a dispatch hash and the condition of a when clause. It - * is responsible for compiling the condition into a hash key and then adding it - * to the dispatch hash. - * - * If the value can be successfully compiled into the hash, then this function - * returns the dispatch hash with the new key added. If the value cannot be - * compiled into the hash, then this function returns Qundef. In the case of - * Qundef, this function is signaling that the caller should abandon the - * optimization entirely. - */ -static VALUE -pm_compile_case_node_dispatch(rb_iseq_t *iseq, VALUE dispatch, const pm_node_t *node, LABEL *label, const pm_scope_node_t *scope_node) -{ - VALUE key = Qundef; - - switch (PM_NODE_TYPE(node)) { - case PM_FLOAT_NODE: { - key = pm_static_literal_value(iseq, node, scope_node); - double intptr; - - if (modf(RFLOAT_VALUE(key), &intptr) == 0.0) { - key = (FIXABLE(intptr) ? LONG2FIX((long) intptr) : rb_dbl2big(intptr)); - } - - break; - } - case PM_FALSE_NODE: - case PM_INTEGER_NODE: - case PM_NIL_NODE: - case PM_SOURCE_FILE_NODE: - case PM_SOURCE_LINE_NODE: - case PM_SYMBOL_NODE: - case PM_TRUE_NODE: - key = pm_static_literal_value(iseq, node, scope_node); - break; - case PM_STRING_NODE: { - const pm_string_node_t *cast = (const pm_string_node_t *) node; - key = parse_static_literal_string(iseq, scope_node, node, &cast->unescaped); - break; - } - default: - return Qundef; - } - - if (NIL_P(rb_hash_lookup(dispatch, key))) { - rb_hash_aset(dispatch, key, ((VALUE) label) | 1); - } - - return dispatch; -} - /** * Return the object that will be pushed onto the stack for the given node. */ @@ -5642,6 +5585,329 @@ pm_compile_constant_path_operator_write_node(rb_iseq_t *iseq, const pm_constant_ PUSH_INSN1(ret, location, setconstant, name); } +/** + * When we're compiling a case node, it's possible that we can speed it up using + * a dispatch hash, which will allow us to jump directly to the correct when + * clause body based on a hash lookup of the value. This can only happen when + * the conditions are literals that can be compiled into a hash key. + * + * This function accepts a dispatch hash and the condition of a when clause. It + * is responsible for compiling the condition into a hash key and then adding it + * to the dispatch hash. + * + * If the value can be successfully compiled into the hash, then this function + * returns the dispatch hash with the new key added. If the value cannot be + * compiled into the hash, then this function returns Qundef. In the case of + * Qundef, this function is signaling that the caller should abandon the + * optimization entirely. + */ +static VALUE +pm_compile_case_node_dispatch(rb_iseq_t *iseq, VALUE dispatch, const pm_node_t *node, LABEL *label, const pm_scope_node_t *scope_node) +{ + VALUE key = Qundef; + + switch (PM_NODE_TYPE(node)) { + case PM_FLOAT_NODE: { + key = pm_static_literal_value(iseq, node, scope_node); + double intptr; + + if (modf(RFLOAT_VALUE(key), &intptr) == 0.0) { + key = (FIXABLE(intptr) ? LONG2FIX((long) intptr) : rb_dbl2big(intptr)); + } + + break; + } + case PM_FALSE_NODE: + case PM_INTEGER_NODE: + case PM_NIL_NODE: + case PM_SOURCE_FILE_NODE: + case PM_SOURCE_LINE_NODE: + case PM_SYMBOL_NODE: + case PM_TRUE_NODE: + key = pm_static_literal_value(iseq, node, scope_node); + break; + case PM_STRING_NODE: { + const pm_string_node_t *cast = (const pm_string_node_t *) node; + key = parse_static_literal_string(iseq, scope_node, node, &cast->unescaped); + break; + } + default: + return Qundef; + } + + if (NIL_P(rb_hash_lookup(dispatch, key))) { + rb_hash_aset(dispatch, key, ((VALUE) label) | 1); + } + + return dispatch; +} + +/** + * Compile a case node, representing a case statement with when clauses. + */ +static inline void +pm_compile_case_node(rb_iseq_t *iseq, const pm_case_node_t *cast, const pm_node_location_t *node_location, LINK_ANCHOR *const ret, bool popped, pm_scope_node_t *scope_node) +{ + const pm_parser_t *parser = scope_node->parser; + const pm_node_location_t location = *node_location; + const pm_node_list_t *conditions = &cast->conditions; + + // This is the anchor that we will compile the conditions of the various + // `when` nodes into. If a match is found, they will need to jump into + // the body_seq anchor to the correct spot. + DECL_ANCHOR(cond_seq); + INIT_ANCHOR(cond_seq); + + // This is the anchor that we will compile the bodies of the various + // `when` nodes into. We'll make sure that the clauses that are compiled + // jump into the correct spots within this anchor. + DECL_ANCHOR(body_seq); + INIT_ANCHOR(body_seq); + + // This is the label where all of the when clauses will jump to if they + // have matched and are done executing their bodies. + LABEL *end_label = NEW_LABEL(location.line); + + // If we have a predicate on this case statement, then it's going to + // compare all of the various when clauses to the predicate. If we + // don't, then it's basically an if-elsif-else chain. + if (cast->predicate == NULL) { + // Establish branch coverage for the case node. + VALUE branches = Qfalse; + rb_code_location_t case_location = { 0 }; + int branch_id = 0; + + if (PM_BRANCH_COVERAGE_P(iseq)) { + case_location = pm_code_location(scope_node, (const pm_node_t *) cast); + branches = decl_branch_base(iseq, PTR2NUM(cast), &case_location, "case"); + } + + // Loop through each clauses in the case node and compile each of + // the conditions within them into cond_seq. If they match, they + // should jump into their respective bodies in body_seq. + for (size_t clause_index = 0; clause_index < conditions->size; clause_index++) { + const pm_when_node_t *clause = (const pm_when_node_t *) conditions->nodes[clause_index]; + const pm_node_list_t *conditions = &clause->conditions; + + int clause_lineno = pm_node_line_number(parser, (const pm_node_t *) clause); + LABEL *label = NEW_LABEL(clause_lineno); + PUSH_LABEL(body_seq, label); + + // Establish branch coverage for the when clause. + if (PM_BRANCH_COVERAGE_P(iseq)) { + rb_code_location_t branch_location = pm_code_location(scope_node, clause->statements != NULL ? ((const pm_node_t *) clause->statements) : ((const pm_node_t *) clause)); + add_trace_branch_coverage(iseq, body_seq, &branch_location, branch_location.beg_pos.column, branch_id++, "when", branches); + } + + if (clause->statements != NULL) { + pm_compile_node(iseq, (const pm_node_t *) clause->statements, body_seq, popped, scope_node); + } + else if (!popped) { + PUSH_SYNTHETIC_PUTNIL(body_seq, iseq); + } + + PUSH_INSNL(body_seq, location, jump, end_label); + + // Compile each of the conditions for the when clause into the + // cond_seq. Each one should have a unique condition and should + // jump to the subsequent one if it doesn't match. + for (size_t condition_index = 0; condition_index < conditions->size; condition_index++) { + const pm_node_t *condition = conditions->nodes[condition_index]; + + if (PM_NODE_TYPE_P(condition, PM_SPLAT_NODE)) { + pm_node_location_t cond_location = PM_NODE_START_LOCATION(parser, condition); + PUSH_INSN(cond_seq, cond_location, putnil); + pm_compile_node(iseq, condition, cond_seq, false, scope_node); + PUSH_INSN1(cond_seq, cond_location, checkmatch, INT2FIX(VM_CHECKMATCH_TYPE_WHEN | VM_CHECKMATCH_ARRAY)); + PUSH_INSNL(cond_seq, cond_location, branchif, label); + } + else { + LABEL *next_label = NEW_LABEL(pm_node_line_number(parser, condition)); + pm_compile_branch_condition(iseq, cond_seq, condition, label, next_label, false, scope_node); + PUSH_LABEL(cond_seq, next_label); + } + } + } + + // Establish branch coverage for the else clause (implicit or + // explicit). + if (PM_BRANCH_COVERAGE_P(iseq)) { + rb_code_location_t branch_location; + + if (cast->else_clause == NULL) { + branch_location = case_location; + } else if (cast->else_clause->statements == NULL) { + branch_location = pm_code_location(scope_node, (const pm_node_t *) cast->else_clause); + } else { + branch_location = pm_code_location(scope_node, (const pm_node_t *) cast->else_clause->statements); + } + + add_trace_branch_coverage(iseq, cond_seq, &branch_location, branch_location.beg_pos.column, branch_id, "else", branches); + } + + // Compile the else clause if there is one. + if (cast->else_clause != NULL) { + pm_compile_node(iseq, (const pm_node_t *) cast->else_clause, cond_seq, popped, scope_node); + } + else if (!popped) { + PUSH_SYNTHETIC_PUTNIL(cond_seq, iseq); + } + + // Finally, jump to the end label if none of the other conditions + // have matched. + PUSH_INSNL(cond_seq, location, jump, end_label); + PUSH_SEQ(ret, cond_seq); + } + else { + // Establish branch coverage for the case node. + VALUE branches = Qfalse; + rb_code_location_t case_location = { 0 }; + int branch_id = 0; + + if (PM_BRANCH_COVERAGE_P(iseq)) { + case_location = pm_code_location(scope_node, (const pm_node_t *) cast); + branches = decl_branch_base(iseq, PTR2NUM(cast), &case_location, "case"); + } + + // This is the label where everything will fall into if none of the + // conditions matched. + LABEL *else_label = NEW_LABEL(location.line); + + // It's possible for us to speed up the case node by using a + // dispatch hash. This is a hash that maps the conditions of the + // various when clauses to the labels of their bodies. If we can + // compile the conditions into a hash key, then we can use a hash + // lookup to jump directly to the correct when clause body. + VALUE dispatch = Qundef; + if (ISEQ_COMPILE_DATA(iseq)->option->specialized_instruction) { + dispatch = rb_hash_new(); + RHASH_TBL_RAW(dispatch)->type = &cdhash_type; + } + + // We're going to loop through each of the conditions in the case + // node and compile each of their contents into both the cond_seq + // and the body_seq. Each condition will use its own label to jump + // from its conditions into its body. + // + // Note that none of the code in the loop below should be adding + // anything to ret, as we're going to be laying out the entire case + // node instructions later. + for (size_t clause_index = 0; clause_index < conditions->size; clause_index++) { + const pm_when_node_t *clause = (const pm_when_node_t *) conditions->nodes[clause_index]; + pm_node_location_t clause_location = PM_NODE_START_LOCATION(parser, (const pm_node_t *) clause); + + const pm_node_list_t *conditions = &clause->conditions; + LABEL *label = NEW_LABEL(clause_location.line); + + // Compile each of the conditions for the when clause into the + // cond_seq. Each one should have a unique comparison that then + // jumps into the body if it matches. + for (size_t condition_index = 0; condition_index < conditions->size; condition_index++) { + const pm_node_t *condition = conditions->nodes[condition_index]; + const pm_node_location_t condition_location = PM_NODE_START_LOCATION(parser, condition); + + // If we haven't already abandoned the optimization, then + // we're going to try to compile the condition into the + // dispatch hash. + if (dispatch != Qundef) { + dispatch = pm_compile_case_node_dispatch(iseq, dispatch, condition, label, scope_node); + } + + if (PM_NODE_TYPE_P(condition, PM_SPLAT_NODE)) { + PUSH_INSN(cond_seq, condition_location, dup); + pm_compile_node(iseq, condition, cond_seq, false, scope_node); + PUSH_INSN1(cond_seq, condition_location, checkmatch, INT2FIX(VM_CHECKMATCH_TYPE_CASE | VM_CHECKMATCH_ARRAY)); + } + else { + if (PM_NODE_TYPE_P(condition, PM_STRING_NODE)) { + const pm_string_node_t *string = (const pm_string_node_t *) condition; + VALUE value = parse_static_literal_string(iseq, scope_node, condition, &string->unescaped); + PUSH_INSN1(cond_seq, condition_location, putobject, value); + } + else { + pm_compile_node(iseq, condition, cond_seq, false, scope_node); + } + + PUSH_INSN1(cond_seq, condition_location, topn, INT2FIX(1)); + PUSH_SEND_WITH_FLAG(cond_seq, condition_location, idEqq, INT2NUM(1), INT2FIX(VM_CALL_FCALL | VM_CALL_ARGS_SIMPLE)); + } + + PUSH_INSNL(cond_seq, condition_location, branchif, label); + } + + // Now, add the label to the body and compile the body of the + // when clause. This involves popping the predicate, compiling + // the statements to be executed, and then compiling a jump to + // the end of the case node. + PUSH_LABEL(body_seq, label); + PUSH_INSN(body_seq, clause_location, pop); + + // Establish branch coverage for the when clause. + if (PM_BRANCH_COVERAGE_P(iseq)) { + rb_code_location_t branch_location = pm_code_location(scope_node, clause->statements != NULL ? ((const pm_node_t *) clause->statements) : ((const pm_node_t *) clause)); + add_trace_branch_coverage(iseq, body_seq, &branch_location, branch_location.beg_pos.column, branch_id++, "when", branches); + } + + if (clause->statements != NULL) { + pm_compile_node(iseq, (const pm_node_t *) clause->statements, body_seq, popped, scope_node); + } + else if (!popped) { + PUSH_SYNTHETIC_PUTNIL(body_seq, iseq); + } + + PUSH_INSNL(body_seq, clause_location, jump, end_label); + } + + // Now that we have compiled the conditions and the bodies of the + // various when clauses, we can compile the predicate, lay out the + // conditions, compile the fallback subsequent if there is one, and + // finally put in the bodies of the when clauses. + PM_COMPILE_NOT_POPPED(cast->predicate); + + // If we have a dispatch hash, then we'll use it here to create the + // optimization. + if (dispatch != Qundef) { + PUSH_INSN(ret, location, dup); + PUSH_INSN2(ret, location, opt_case_dispatch, dispatch, else_label); + LABEL_REF(else_label); + } + + PUSH_SEQ(ret, cond_seq); + + // Compile either the explicit else clause or an implicit else + // clause. + PUSH_LABEL(ret, else_label); + + if (cast->else_clause != NULL) { + pm_node_location_t else_location = PM_NODE_START_LOCATION(parser, cast->else_clause->statements != NULL ? ((const pm_node_t *) cast->else_clause->statements) : ((const pm_node_t *) cast->else_clause)); + PUSH_INSN(ret, else_location, pop); + + // Establish branch coverage for the else clause. + if (PM_BRANCH_COVERAGE_P(iseq)) { + rb_code_location_t branch_location = pm_code_location(scope_node, cast->else_clause->statements != NULL ? ((const pm_node_t *) cast->else_clause->statements) : ((const pm_node_t *) cast->else_clause)); + add_trace_branch_coverage(iseq, ret, &branch_location, branch_location.beg_pos.column, branch_id, "else", branches); + } + + PM_COMPILE((const pm_node_t *) cast->else_clause); + PUSH_INSNL(ret, else_location, jump, end_label); + } + else { + PUSH_INSN(ret, location, pop); + + // Establish branch coverage for the implicit else clause. + if (PM_BRANCH_COVERAGE_P(iseq)) { + add_trace_branch_coverage(iseq, ret, &case_location, case_location.beg_pos.column, branch_id, "else", branches); + } + + if (!popped) PUSH_INSN(ret, location, putnil); + PUSH_INSNL(ret, location, jump, end_label); + } + } + + PUSH_SEQ(ret, body_seq); + PUSH_LABEL(ret, end_label); +} + /** * Many nodes in Prism can be marked as a static literal, which means slightly * different things depending on which node it is. Occasionally we need to omit @@ -6256,269 +6522,11 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, return; } - case PM_CASE_NODE: { + case PM_CASE_NODE: // case foo; when bar; end // ^^^^^^^^^^^^^^^^^^^^^^^ - const pm_case_node_t *cast = (const pm_case_node_t *) node; - const pm_node_list_t *conditions = &cast->conditions; - - // This is the anchor that we will compile the conditions of the various - // `when` nodes into. If a match is found, they will need to jump into - // the body_seq anchor to the correct spot. - DECL_ANCHOR(cond_seq); - INIT_ANCHOR(cond_seq); - - // This is the anchor that we will compile the bodies of the various - // `when` nodes into. We'll make sure that the clauses that are compiled - // jump into the correct spots within this anchor. - DECL_ANCHOR(body_seq); - INIT_ANCHOR(body_seq); - - // This is the label where all of the when clauses will jump to if they - // have matched and are done executing their bodies. - LABEL *end_label = NEW_LABEL(location.line); - - // If we have a predicate on this case statement, then it's going to - // compare all of the various when clauses to the predicate. If we - // don't, then it's basically an if-elsif-else chain. - if (cast->predicate == NULL) { - // Establish branch coverage for the case node. - VALUE branches = Qfalse; - rb_code_location_t case_location = { 0 }; - int branch_id = 0; - - if (PM_BRANCH_COVERAGE_P(iseq)) { - case_location = pm_code_location(scope_node, (const pm_node_t *) cast); - branches = decl_branch_base(iseq, PTR2NUM(cast), &case_location, "case"); - } - - // Loop through each clauses in the case node and compile each of - // the conditions within them into cond_seq. If they match, they - // should jump into their respective bodies in body_seq. - for (size_t clause_index = 0; clause_index < conditions->size; clause_index++) { - const pm_when_node_t *clause = (const pm_when_node_t *) conditions->nodes[clause_index]; - const pm_node_list_t *conditions = &clause->conditions; - - int clause_lineno = pm_node_line_number(parser, (const pm_node_t *) clause); - LABEL *label = NEW_LABEL(clause_lineno); - PUSH_LABEL(body_seq, label); - - // Establish branch coverage for the when clause. - if (PM_BRANCH_COVERAGE_P(iseq)) { - rb_code_location_t branch_location = pm_code_location(scope_node, clause->statements != NULL ? ((const pm_node_t *) clause->statements) : ((const pm_node_t *) clause)); - add_trace_branch_coverage(iseq, body_seq, &branch_location, branch_location.beg_pos.column, branch_id++, "when", branches); - } - - if (clause->statements != NULL) { - pm_compile_node(iseq, (const pm_node_t *) clause->statements, body_seq, popped, scope_node); - } - else if (!popped) { - PUSH_SYNTHETIC_PUTNIL(body_seq, iseq); - } - - PUSH_INSNL(body_seq, location, jump, end_label); - - // Compile each of the conditions for the when clause into the - // cond_seq. Each one should have a unique condition and should - // jump to the subsequent one if it doesn't match. - for (size_t condition_index = 0; condition_index < conditions->size; condition_index++) { - const pm_node_t *condition = conditions->nodes[condition_index]; - - if (PM_NODE_TYPE_P(condition, PM_SPLAT_NODE)) { - pm_node_location_t cond_location = PM_NODE_START_LOCATION(parser, condition); - PUSH_INSN(cond_seq, cond_location, putnil); - pm_compile_node(iseq, condition, cond_seq, false, scope_node); - PUSH_INSN1(cond_seq, cond_location, checkmatch, INT2FIX(VM_CHECKMATCH_TYPE_WHEN | VM_CHECKMATCH_ARRAY)); - PUSH_INSNL(cond_seq, cond_location, branchif, label); - } - else { - LABEL *next_label = NEW_LABEL(pm_node_line_number(parser, condition)); - pm_compile_branch_condition(iseq, cond_seq, condition, label, next_label, false, scope_node); - PUSH_LABEL(cond_seq, next_label); - } - } - } - - // Establish branch coverage for the else clause (implicit or - // explicit). - if (PM_BRANCH_COVERAGE_P(iseq)) { - rb_code_location_t branch_location; - - if (cast->else_clause == NULL) { - branch_location = case_location; - } else if (cast->else_clause->statements == NULL) { - branch_location = pm_code_location(scope_node, (const pm_node_t *) cast->else_clause); - } else { - branch_location = pm_code_location(scope_node, (const pm_node_t *) cast->else_clause->statements); - } - - add_trace_branch_coverage(iseq, cond_seq, &branch_location, branch_location.beg_pos.column, branch_id, "else", branches); - } - - // Compile the else clause if there is one. - if (cast->else_clause != NULL) { - pm_compile_node(iseq, (const pm_node_t *) cast->else_clause, cond_seq, popped, scope_node); - } - else if (!popped) { - PUSH_SYNTHETIC_PUTNIL(cond_seq, iseq); - } - - // Finally, jump to the end label if none of the other conditions - // have matched. - PUSH_INSNL(cond_seq, location, jump, end_label); - PUSH_SEQ(ret, cond_seq); - } - else { - // Establish branch coverage for the case node. - VALUE branches = Qfalse; - rb_code_location_t case_location = { 0 }; - int branch_id = 0; - - if (PM_BRANCH_COVERAGE_P(iseq)) { - case_location = pm_code_location(scope_node, (const pm_node_t *) cast); - branches = decl_branch_base(iseq, PTR2NUM(cast), &case_location, "case"); - } - - // This is the label where everything will fall into if none of the - // conditions matched. - LABEL *else_label = NEW_LABEL(location.line); - - // It's possible for us to speed up the case node by using a - // dispatch hash. This is a hash that maps the conditions of the - // various when clauses to the labels of their bodies. If we can - // compile the conditions into a hash key, then we can use a hash - // lookup to jump directly to the correct when clause body. - VALUE dispatch = Qundef; - if (ISEQ_COMPILE_DATA(iseq)->option->specialized_instruction) { - dispatch = rb_hash_new(); - RHASH_TBL_RAW(dispatch)->type = &cdhash_type; - } - - // We're going to loop through each of the conditions in the case - // node and compile each of their contents into both the cond_seq - // and the body_seq. Each condition will use its own label to jump - // from its conditions into its body. - // - // Note that none of the code in the loop below should be adding - // anything to ret, as we're going to be laying out the entire case - // node instructions later. - for (size_t clause_index = 0; clause_index < conditions->size; clause_index++) { - const pm_when_node_t *clause = (const pm_when_node_t *) conditions->nodes[clause_index]; - pm_node_location_t clause_location = PM_NODE_START_LOCATION(parser, (const pm_node_t *) clause); - - const pm_node_list_t *conditions = &clause->conditions; - LABEL *label = NEW_LABEL(clause_location.line); - - // Compile each of the conditions for the when clause into the - // cond_seq. Each one should have a unique comparison that then - // jumps into the body if it matches. - for (size_t condition_index = 0; condition_index < conditions->size; condition_index++) { - const pm_node_t *condition = conditions->nodes[condition_index]; - const pm_node_location_t condition_location = PM_NODE_START_LOCATION(parser, condition); - - // If we haven't already abandoned the optimization, then - // we're going to try to compile the condition into the - // dispatch hash. - if (dispatch != Qundef) { - dispatch = pm_compile_case_node_dispatch(iseq, dispatch, condition, label, scope_node); - } - - if (PM_NODE_TYPE_P(condition, PM_SPLAT_NODE)) { - PUSH_INSN(cond_seq, condition_location, dup); - pm_compile_node(iseq, condition, cond_seq, false, scope_node); - PUSH_INSN1(cond_seq, condition_location, checkmatch, INT2FIX(VM_CHECKMATCH_TYPE_CASE | VM_CHECKMATCH_ARRAY)); - } - else { - if (PM_NODE_TYPE_P(condition, PM_STRING_NODE)) { - const pm_string_node_t *string = (const pm_string_node_t *) condition; - VALUE value = parse_static_literal_string(iseq, scope_node, condition, &string->unescaped); - PUSH_INSN1(cond_seq, condition_location, putobject, value); - } - else { - pm_compile_node(iseq, condition, cond_seq, false, scope_node); - } - - PUSH_INSN1(cond_seq, condition_location, topn, INT2FIX(1)); - PUSH_SEND_WITH_FLAG(cond_seq, condition_location, idEqq, INT2NUM(1), INT2FIX(VM_CALL_FCALL | VM_CALL_ARGS_SIMPLE)); - } - - PUSH_INSNL(cond_seq, condition_location, branchif, label); - } - - // Now, add the label to the body and compile the body of the - // when clause. This involves popping the predicate, compiling - // the statements to be executed, and then compiling a jump to - // the end of the case node. - PUSH_LABEL(body_seq, label); - PUSH_INSN(body_seq, clause_location, pop); - - // Establish branch coverage for the when clause. - if (PM_BRANCH_COVERAGE_P(iseq)) { - rb_code_location_t branch_location = pm_code_location(scope_node, clause->statements != NULL ? ((const pm_node_t *) clause->statements) : ((const pm_node_t *) clause)); - add_trace_branch_coverage(iseq, body_seq, &branch_location, branch_location.beg_pos.column, branch_id++, "when", branches); - } - - if (clause->statements != NULL) { - pm_compile_node(iseq, (const pm_node_t *) clause->statements, body_seq, popped, scope_node); - } - else if (!popped) { - PUSH_SYNTHETIC_PUTNIL(body_seq, iseq); - } - - PUSH_INSNL(body_seq, clause_location, jump, end_label); - } - - // Now that we have compiled the conditions and the bodies of the - // various when clauses, we can compile the predicate, lay out the - // conditions, compile the fallback subsequent if there is one, and - // finally put in the bodies of the when clauses. - PM_COMPILE_NOT_POPPED(cast->predicate); - - // If we have a dispatch hash, then we'll use it here to create the - // optimization. - if (dispatch != Qundef) { - PUSH_INSN(ret, location, dup); - PUSH_INSN2(ret, location, opt_case_dispatch, dispatch, else_label); - LABEL_REF(else_label); - } - - PUSH_SEQ(ret, cond_seq); - - // Compile either the explicit else clause or an implicit else - // clause. - PUSH_LABEL(ret, else_label); - - if (cast->else_clause != NULL) { - pm_node_location_t else_location = PM_NODE_START_LOCATION(parser, cast->else_clause->statements != NULL ? ((const pm_node_t *) cast->else_clause->statements) : ((const pm_node_t *) cast->else_clause)); - PUSH_INSN(ret, else_location, pop); - - // Establish branch coverage for the else clause. - if (PM_BRANCH_COVERAGE_P(iseq)) { - rb_code_location_t branch_location = pm_code_location(scope_node, cast->else_clause->statements != NULL ? ((const pm_node_t *) cast->else_clause->statements) : ((const pm_node_t *) cast->else_clause)); - add_trace_branch_coverage(iseq, ret, &branch_location, branch_location.beg_pos.column, branch_id, "else", branches); - } - - PM_COMPILE((const pm_node_t *) cast->else_clause); - PUSH_INSNL(ret, else_location, jump, end_label); - } - else { - PUSH_INSN(ret, location, pop); - - // Establish branch coverage for the implicit else clause. - if (PM_BRANCH_COVERAGE_P(iseq)) { - add_trace_branch_coverage(iseq, ret, &case_location, case_location.beg_pos.column, branch_id, "else", branches); - } - - if (!popped) PUSH_INSN(ret, location, putnil); - PUSH_INSNL(ret, location, jump, end_label); - } - } - - PUSH_SEQ(ret, body_seq); - PUSH_LABEL(ret, end_label); - + pm_compile_case_node(iseq, (const pm_case_node_t *) node, &location, ret, popped, scope_node); return; - } case PM_CASE_MATCH_NODE: { // case foo; in bar; end // ^^^^^^^^^^^^^^^^^^^^^ From d4ab1e448245f1bc13c9262102fd4db3a2284b88 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Wed, 11 Sep 2024 09:26:48 -0400 Subject: [PATCH 255/829] [PRISM] Move compile scope node to its own function --- prism_compile.c | 5730 ++++++++++++++++++++++++----------------------- 1 file changed, 2866 insertions(+), 2864 deletions(-) diff --git a/prism_compile.c b/prism_compile.c index 1c5de0799413a8..1d0bd7933f8de4 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -5917,1524 +5917,1732 @@ pm_compile_case_node(rb_iseq_t *iseq, const pm_case_node_t *cast, const pm_node_ #define PM_CONTAINER_P(node) (PM_NODE_TYPE_P(node, PM_ARRAY_NODE) || PM_NODE_TYPE_P(node, PM_HASH_NODE) || PM_NODE_TYPE_P(node, PM_RANGE_NODE)) /** - * Compiles a prism node into instruction sequences. - * - * iseq - The current instruction sequence object (used for locals) - * node - The prism node to compile - * ret - The linked list of instructions to append instructions onto - * popped - True if compiling something with no side effects, so instructions don't - * need to be added - * scope_node - Stores parser and local information + * Compile a scope node, which is a special kind of node that represents a new + * lexical scope, attached to a node in the AST. */ -static void -pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, bool popped, pm_scope_node_t *scope_node) +static inline void +pm_compile_scope_node(rb_iseq_t *iseq, pm_scope_node_t *scope_node, const pm_node_location_t *node_location, LINK_ANCHOR *const ret, bool popped) { - const pm_parser_t *parser = scope_node->parser; - const pm_node_location_t location = PM_NODE_START_LOCATION(parser, node); - int lineno = (int) location.line; + const pm_node_location_t location = *node_location; + struct rb_iseq_constant_body *body = ISEQ_BODY(iseq); - if (PM_NODE_TYPE_P(node, PM_BEGIN_NODE) && (((const pm_begin_node_t *) node)->statements == NULL) && (((const pm_begin_node_t *) node)->rescue_clause != NULL)) { - // If this node is a begin node and it has empty statements and also - // has a rescue clause, then the other parser considers it as - // starting on the same line as the rescue, as opposed to the - // location of the begin keyword. We replicate that behavior here. - lineno = (int) PM_NODE_START_LINE_COLUMN(parser, ((const pm_begin_node_t *) node)->rescue_clause).line; + pm_constant_id_list_t *locals = &scope_node->locals; + pm_parameters_node_t *parameters_node = NULL; + pm_node_list_t *keywords_list = NULL; + pm_node_list_t *optionals_list = NULL; + pm_node_list_t *posts_list = NULL; + pm_node_list_t *requireds_list = NULL; + pm_node_list_t *block_locals = NULL; + bool trailing_comma = false; + + if (PM_NODE_TYPE_P(scope_node->ast_node, PM_CLASS_NODE) || PM_NODE_TYPE_P(scope_node->ast_node, PM_MODULE_NODE)) { + ADD_TRACE(ret, RUBY_EVENT_CLASS); + } + + if (scope_node->parameters != NULL) { + switch (PM_NODE_TYPE(scope_node->parameters)) { + case PM_BLOCK_PARAMETERS_NODE: { + pm_block_parameters_node_t *cast = (pm_block_parameters_node_t *) scope_node->parameters; + parameters_node = cast->parameters; + block_locals = &cast->locals; + + if (parameters_node) { + if (parameters_node->rest && PM_NODE_TYPE_P(parameters_node->rest, PM_IMPLICIT_REST_NODE)) { + trailing_comma = true; + } + } + break; + } + case PM_PARAMETERS_NODE: { + parameters_node = (pm_parameters_node_t *) scope_node->parameters; + break; + } + case PM_NUMBERED_PARAMETERS_NODE: { + uint32_t maximum = ((const pm_numbered_parameters_node_t *) scope_node->parameters)->maximum; + body->param.lead_num = maximum; + body->param.flags.ambiguous_param0 = maximum == 1; + break; + } + case PM_IT_PARAMETERS_NODE: + body->param.lead_num = 1; + body->param.flags.ambiguous_param0 = true; + break; + default: + rb_bug("Unexpected node type for parameters: %s", pm_node_type_to_str(PM_NODE_TYPE(scope_node->parameters))); + } } - if (PM_NODE_FLAG_P(node, PM_NODE_FLAG_NEWLINE) && ISEQ_COMPILE_DATA(iseq)->last_line != lineno) { - // If this node has the newline flag set and it is on a new line - // from the previous nodes that have been compiled for this ISEQ, - // then we need to emit a newline event. - int event = RUBY_EVENT_LINE; + struct rb_iseq_param_keyword *keyword = NULL; - ISEQ_COMPILE_DATA(iseq)->last_line = lineno; - if (ISEQ_COVERAGE(iseq) && ISEQ_LINE_COVERAGE(iseq)) { - event |= RUBY_EVENT_COVERAGE_LINE; - } - PUSH_TRACE(ret, event); + if (parameters_node) { + optionals_list = ¶meters_node->optionals; + requireds_list = ¶meters_node->requireds; + keywords_list = ¶meters_node->keywords; + posts_list = ¶meters_node->posts; + } + else if (scope_node->parameters && (PM_NODE_TYPE_P(scope_node->parameters, PM_NUMBERED_PARAMETERS_NODE) || PM_NODE_TYPE_P(scope_node->parameters, PM_IT_PARAMETERS_NODE))) { + body->param.opt_num = 0; + } + else { + body->param.lead_num = 0; + body->param.opt_num = 0; } - switch (PM_NODE_TYPE(node)) { - case PM_ALIAS_GLOBAL_VARIABLE_NODE: { - // alias $foo $bar - // ^^^^^^^^^^^^^^^ - const pm_alias_global_variable_node_t *cast = (const pm_alias_global_variable_node_t *) node; - PUSH_INSN1(ret, location, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); + //********STEP 1********** + // Goal: calculate the table size for the locals, accounting for + // hidden variables and multi target nodes + size_t locals_size = locals->size; - const pm_location_t *new_name_loc = &cast->new_name->location; - PUSH_INSN1(ret, location, putobject, ID2SYM(rb_intern3((const char *) new_name_loc->start, new_name_loc->end - new_name_loc->start, scope_node->encoding))); + // Index lookup table buffer size is only the number of the locals + st_table *index_lookup_table = st_init_numtable(); - const pm_location_t *old_name_loc = &cast->old_name->location; - PUSH_INSN1(ret, location, putobject, ID2SYM(rb_intern3((const char *) old_name_loc->start, old_name_loc->end - old_name_loc->start, scope_node->encoding))); + int table_size = (int) locals_size; - PUSH_SEND(ret, location, id_core_set_variable_alias, INT2FIX(2)); - if (popped) PUSH_INSN(ret, location, pop); + // For nodes have a hidden iteration variable. We add that to the local + // table size here. + if (PM_NODE_TYPE_P(scope_node->ast_node, PM_FOR_NODE)) table_size++; - return; - } - case PM_ALIAS_METHOD_NODE: { - // alias foo bar - // ^^^^^^^^^^^^^ - const pm_alias_method_node_t *cast = (const pm_alias_method_node_t *) node; + if (keywords_list && keywords_list->size) { + table_size++; + } - PUSH_INSN1(ret, location, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); - PUSH_INSN1(ret, location, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_CBASE)); - PM_COMPILE_NOT_POPPED(cast->new_name); - PM_COMPILE_NOT_POPPED(cast->old_name); + if (requireds_list) { + for (size_t i = 0; i < requireds_list->size; i++) { + // For each MultiTargetNode, we're going to have one + // additional anonymous local not represented in the locals table + // We want to account for this in our table size + pm_node_t *required = requireds_list->nodes[i]; + if (PM_NODE_TYPE_P(required, PM_MULTI_TARGET_NODE)) { + table_size++; + } + else if (PM_NODE_TYPE_P(required, PM_REQUIRED_PARAMETER_NODE)) { + if (PM_NODE_FLAG_P(required, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { + table_size++; + } + } + } + } - PUSH_SEND(ret, location, id_core_set_method_alias, INT2FIX(3)); - if (popped) PUSH_INSN(ret, location, pop); + // If we have the `it` implicit local variable, we need to account for + // it in the local table size. + if (scope_node->parameters != NULL && PM_NODE_TYPE_P(scope_node->parameters, PM_IT_PARAMETERS_NODE)) { + table_size++; + } - return; - } - case PM_AND_NODE: { - // a and b - // ^^^^^^^ - const pm_and_node_t *cast = (const pm_and_node_t *) node; - LABEL *end_label = NEW_LABEL(lineno); + // Ensure there is enough room in the local table for any + // parameters that have been repeated + // ex: def underscore_parameters(_, _ = 1, _ = 2); _; end + // ^^^^^^^^^^^^ + if (optionals_list && optionals_list->size) { + for (size_t i = 0; i < optionals_list->size; i++) { + pm_node_t * node = optionals_list->nodes[i]; + if (PM_NODE_FLAG_P(node, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { + table_size++; + } + } + } - PM_COMPILE_NOT_POPPED(cast->left); - if (!popped) PUSH_INSN(ret, location, dup); - PUSH_INSNL(ret, location, branchunless, end_label); + // If we have an anonymous "rest" node, we'll need to increase the local + // table size to take it in to account. + // def m(foo, *, bar) + // ^ + if (parameters_node) { + if (parameters_node->rest) { + if (!(PM_NODE_TYPE_P(parameters_node->rest, PM_IMPLICIT_REST_NODE))) { + if (!((const pm_rest_parameter_node_t *) parameters_node->rest)->name || PM_NODE_FLAG_P(parameters_node->rest, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { + table_size++; + } + } + } - if (!popped) PUSH_INSN(ret, location, pop); - PM_COMPILE(cast->right); - PUSH_LABEL(ret, end_label); + // def foo(_, **_); _; end + // ^^^ + if (parameters_node->keyword_rest) { + // def foo(...); end + // ^^^ + // When we have a `...` as the keyword_rest, it's a forwarding_parameter_node and + // we need to leave space for 4 locals: *, **, &, ... + if (PM_NODE_TYPE_P(parameters_node->keyword_rest, PM_FORWARDING_PARAMETER_NODE)) { + // Only optimize specifically methods like this: `foo(...)` + if (requireds_list->size == 0 && optionals_list->size == 0 && keywords_list->size == 0) { + ISEQ_BODY(iseq)->param.flags.use_block = TRUE; + ISEQ_BODY(iseq)->param.flags.forwardable = TRUE; + table_size += 1; + } + else { + table_size += 4; + } + } + else { + const pm_keyword_rest_parameter_node_t *kw_rest = (const pm_keyword_rest_parameter_node_t *) parameters_node->keyword_rest; - return; - } - case PM_ARGUMENTS_NODE: - // These are ArgumentsNodes that are not compiled directly by their - // parent call nodes, used in the cases of NextNodes, ReturnNodes, and - // BreakNodes. They can create an array like ArrayNode. - case PM_ARRAY_NODE: { - const pm_node_list_t *elements; + // If it's anonymous or repeated, then we need to allocate stack space + if (!kw_rest->name || PM_NODE_FLAG_P(kw_rest, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { + table_size++; + } + } + } + } - if (PM_NODE_TYPE(node) == PM_ARGUMENTS_NODE) { - // break foo - // ^^^ - const pm_arguments_node_t *cast = (const pm_arguments_node_t *) node; - elements = &cast->arguments; + if (posts_list) { + for (size_t i = 0; i < posts_list->size; i++) { + // For each MultiTargetNode, we're going to have one + // additional anonymous local not represented in the locals table + // We want to account for this in our table size + pm_node_t *required = posts_list->nodes[i]; + if (PM_NODE_TYPE_P(required, PM_MULTI_TARGET_NODE) || PM_NODE_FLAG_P(required, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { + table_size++; + } + } + } - // If we are only returning a single element through one of the jump - // nodes, then we will only compile that node directly. - if (elements->size == 1) { - PM_COMPILE(elements->nodes[0]); - return; + if (keywords_list && keywords_list->size) { + for (size_t i = 0; i < keywords_list->size; i++) { + pm_node_t *keyword_parameter_node = keywords_list->nodes[i]; + if (PM_NODE_FLAG_P(keyword_parameter_node, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { + table_size++; } } - else { - // [foo, bar, baz] - // ^^^^^^^^^^^^^^^ - const pm_array_node_t *cast = (const pm_array_node_t *) node; - elements = &cast->elements; + } + + if (parameters_node && parameters_node->block) { + const pm_block_parameter_node_t *block_node = (const pm_block_parameter_node_t *) parameters_node->block; + + if (PM_NODE_FLAG_P(block_node, PM_PARAMETER_FLAGS_REPEATED_PARAMETER) || !block_node->name) { + table_size++; } + } - // If every node in the array is static, then we can compile the entire - // array now instead of later. - if (PM_NODE_FLAG_P(node, PM_NODE_FLAG_STATIC_LITERAL)) { - // We're only going to compile this node if it's not popped. If it - // is popped, then we know we don't need to do anything since it's - // statically known. - if (!popped) { - if (elements->size) { - VALUE value = pm_static_literal_value(iseq, node, scope_node); - PUSH_INSN1(ret, location, duparray, value); + // We can create local_table_for_iseq with the correct size + VALUE idtmp = 0; + rb_ast_id_table_t *local_table_for_iseq = ALLOCV(idtmp, sizeof(rb_ast_id_table_t) + table_size * sizeof(ID)); + local_table_for_iseq->size = table_size; + + //********END OF STEP 1********** + + //********STEP 2********** + // Goal: populate iv index table as well as local table, keeping the + // layout of the local table consistent with the layout of the + // stack when calling the method + // + // Do a first pass on all of the parameters, setting their values in + // the local_table_for_iseq, _except_ for Multis who get a hidden + // variable in this step, and will get their names inserted in step 3 + + // local_index is a cursor that keeps track of the current + // index into local_table_for_iseq. The local table is actually a list, + // and the order of that list must match the order of the items pushed + // on the stack. We need to take in to account things pushed on the + // stack that _might not have a name_ (for example array destructuring). + // This index helps us know which item we're dealing with and also give + // those anonymous items temporary names (as below) + int local_index = 0; + + // Here we figure out local table indices and insert them in to the + // index lookup table and local tables. + // + // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) + // ^^^^^^^^^^^^^ + if (requireds_list && requireds_list->size) { + for (size_t i = 0; i < requireds_list->size; i++, local_index++) { + ID local; + + // For each MultiTargetNode, we're going to have one additional + // anonymous local not represented in the locals table. We want + // to account for this in our table size. + pm_node_t *required = requireds_list->nodes[i]; + + switch (PM_NODE_TYPE(required)) { + case PM_MULTI_TARGET_NODE: { + // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) + // ^^^^^^^^^^ + local = rb_make_temporary_id(local_index); + local_table_for_iseq->ids[local_index] = local; + break; + } + case PM_REQUIRED_PARAMETER_NODE: { + // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) + // ^ + const pm_required_parameter_node_t *param = (const pm_required_parameter_node_t *) required; + + if (PM_NODE_FLAG_P(required, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { + ID local = pm_constant_id_lookup(scope_node, param->name); + local_table_for_iseq->ids[local_index] = local; } else { - PUSH_INSN1(ret, location, newarray, INT2FIX(0)); + pm_insert_local_index(param->name, local_index, index_lookup_table, local_table_for_iseq, scope_node); } + + break; + } + default: + rb_bug("Unsupported node in requireds in parameters %s", pm_node_type_to_str(PM_NODE_TYPE(required))); } } - else { - // Here since we know there are possible side-effects inside the - // array contents, we're going to build it entirely at runtime. - // We'll do this by pushing all of the elements onto the stack and - // then combining them with newarray. - // - // If this array is popped, then this serves only to ensure we enact - // all side-effects (like method calls) that are contained within - // the array contents. - // - // We treat all sequences of non-splat elements as their - // own arrays, followed by a newarray, and then continually - // concat the arrays with the SplatNode nodes. - const int max_new_array_size = 0x100; - const unsigned int min_tmp_array_size = 0x40; - int new_array_size = 0; - bool first_chunk = true; + body->param.lead_num = (int) requireds_list->size; + body->param.flags.has_lead = true; + } - // This is an optimization wherein we keep track of whether or not - // the previous element was a static literal. If it was, then we do - // not attempt to check if we have a subarray that can be optimized. - // If it was not, then we do check. - bool static_literal = false; + if (scope_node->parameters != NULL && PM_NODE_TYPE_P(scope_node->parameters, PM_IT_PARAMETERS_NODE)) { + ID local = rb_make_temporary_id(local_index); + local_table_for_iseq->ids[local_index++] = local; + } - // Either create a new array, or push to the existing array. -#define FLUSH_CHUNK \ - if (new_array_size) { \ - if (first_chunk) PUSH_INSN1(ret, location, newarray, INT2FIX(new_array_size)); \ - else PUSH_INSN1(ret, location, pushtoarray, INT2FIX(new_array_size)); \ - first_chunk = false; \ - new_array_size = 0; \ - } + // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) + // ^^^^^ + if (optionals_list && optionals_list->size) { + body->param.opt_num = (int) optionals_list->size; + body->param.flags.has_opt = true; - for (size_t index = 0; index < elements->size; index++) { - const pm_node_t *element = elements->nodes[index]; + for (size_t i = 0; i < optionals_list->size; i++, local_index++) { + pm_node_t * node = optionals_list->nodes[i]; + pm_constant_id_t name = ((const pm_optional_parameter_node_t *) node)->name; - if (PM_NODE_TYPE_P(element, PM_SPLAT_NODE)) { - FLUSH_CHUNK; + if (PM_NODE_FLAG_P(node, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { + ID local = pm_constant_id_lookup(scope_node, name); + local_table_for_iseq->ids[local_index] = local; + } + else { + pm_insert_local_index(name, local_index, index_lookup_table, local_table_for_iseq, scope_node); + } + } + } - const pm_splat_node_t *splat_element = (const pm_splat_node_t *) element; - if (splat_element->expression) { - PM_COMPILE_NOT_POPPED(splat_element->expression); - } - else { - pm_local_index_t index = pm_lookup_local_index(iseq, scope_node, PM_CONSTANT_MULT, 0); - PUSH_GETLOCAL(ret, location, index.index, index.level); - } + // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) + // ^^ + if (parameters_node && parameters_node->rest) { + body->param.rest_start = local_index; - if (first_chunk) { - // If this is the first element of the array then we - // need to splatarray the elements into the list. - PUSH_INSN1(ret, location, splatarray, Qtrue); - first_chunk = false; - } - else { - PUSH_INSN(ret, location, concattoarray); - } + // If there's a trailing comma, we'll have an implicit rest node, + // and we don't want it to impact the rest variables on param + if (!(PM_NODE_TYPE_P(parameters_node->rest, PM_IMPLICIT_REST_NODE))) { + body->param.flags.has_rest = true; + RUBY_ASSERT(body->param.rest_start != -1); - static_literal = false; + pm_constant_id_t name = ((const pm_rest_parameter_node_t *) parameters_node->rest)->name; + + if (name) { + // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) + // ^^ + if (PM_NODE_FLAG_P(parameters_node->rest, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { + ID local = pm_constant_id_lookup(scope_node, name); + local_table_for_iseq->ids[local_index] = local; } - else if (PM_NODE_TYPE_P(element, PM_KEYWORD_HASH_NODE)) { - if (new_array_size == 0 && first_chunk) { - PUSH_INSN1(ret, location, newarray, INT2FIX(0)); - first_chunk = false; - } - else { - FLUSH_CHUNK; - } + else { + pm_insert_local_index(name, local_index, index_lookup_table, local_table_for_iseq, scope_node); + } + } + else { + // def foo(a, (b, *c, d), e = 1, *, g, (h, *i, j), k:, l: 1, **m, &n) + // ^ + body->param.flags.anon_rest = true; + pm_insert_local_special(idMULT, local_index, index_lookup_table, local_table_for_iseq); + } - // If we get here, then this is the last element of the - // array/arguments, because it cannot be followed by - // anything else without a syntax error. This looks like: - // - // [foo, bar, baz: qux] - // ^^^^^^^^ - // - // [foo, bar, **baz] - // ^^^^^ - // - const pm_keyword_hash_node_t *keyword_hash = (const pm_keyword_hash_node_t *) element; - pm_compile_hash_elements(iseq, element, &keyword_hash->elements, false, ret, scope_node); + local_index++; + } + } - // This boolean controls the manner in which we push the - // hash onto the array. If it's all keyword splats, then we - // can use the very specialized pushtoarraykwsplat - // instruction to check if it's empty before we push it. - size_t splats = 0; - while (splats < keyword_hash->elements.size && PM_NODE_TYPE_P(keyword_hash->elements.nodes[splats], PM_ASSOC_SPLAT_NODE)) splats++; + // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) + // ^^^^^^^^^^^^^ + if (posts_list && posts_list->size) { + body->param.post_num = (int) posts_list->size; + body->param.post_start = local_index; + body->param.flags.has_post = true; - if (keyword_hash->elements.size == splats) { - PUSH_INSN(ret, location, pushtoarraykwsplat); - } - else { - new_array_size++; - } - } - else if ( - PM_NODE_FLAG_P(element, PM_NODE_FLAG_STATIC_LITERAL) && - !PM_CONTAINER_P(element) && - !static_literal && - ((index + min_tmp_array_size) < elements->size) - ) { - // If we have a static literal, then there's the potential - // to group a bunch of them together with a literal array - // and then concat them together. - size_t right_index = index + 1; - while ( - right_index < elements->size && - PM_NODE_FLAG_P(elements->nodes[right_index], PM_NODE_FLAG_STATIC_LITERAL) && - !PM_CONTAINER_P(elements->nodes[right_index]) - ) right_index++; + for (size_t i = 0; i < posts_list->size; i++, local_index++) { + ID local; - size_t tmp_array_size = right_index - index; - if (tmp_array_size >= min_tmp_array_size) { - VALUE tmp_array = rb_ary_hidden_new(tmp_array_size); + // For each MultiTargetNode, we're going to have one additional + // anonymous local not represented in the locals table. We want + // to account for this in our table size. + const pm_node_t *post_node = posts_list->nodes[i]; - // Create the temporary array. - for (; tmp_array_size; tmp_array_size--) - rb_ary_push(tmp_array, pm_static_literal_value(iseq, elements->nodes[index++], scope_node)); - OBJ_FREEZE(tmp_array); + switch (PM_NODE_TYPE(post_node)) { + case PM_MULTI_TARGET_NODE: { + // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) + // ^^^^^^^^^^ + local = rb_make_temporary_id(local_index); + local_table_for_iseq->ids[local_index] = local; + break; + } + case PM_REQUIRED_PARAMETER_NODE: { + // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) + // ^ + const pm_required_parameter_node_t *param = (const pm_required_parameter_node_t *) post_node; - // Emit the optimized code. - FLUSH_CHUNK; - if (first_chunk) { - PUSH_INSN1(ret, location, duparray, tmp_array); - first_chunk = false; - } - else { - PUSH_INSN1(ret, location, putobject, tmp_array); - PUSH_INSN(ret, location, concattoarray); - } - } - else { - PM_COMPILE_NOT_POPPED(element); - if (++new_array_size >= max_new_array_size) FLUSH_CHUNK; - static_literal = true; - } - } else { - PM_COMPILE_NOT_POPPED(element); - if (++new_array_size >= max_new_array_size) FLUSH_CHUNK; - static_literal = false; + if (PM_NODE_FLAG_P(param, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { + ID local = pm_constant_id_lookup(scope_node, param->name); + local_table_for_iseq->ids[local_index] = local; + } + else { + pm_insert_local_index(param->name, local_index, index_lookup_table, local_table_for_iseq, scope_node); } + break; + } + default: + rb_bug("Unsupported node in posts in parameters %s", pm_node_type_to_str(PM_NODE_TYPE(post_node))); } - - FLUSH_CHUNK; - if (popped) PUSH_INSN(ret, location, pop); } + } -#undef FLUSH_CHUNK - return; - } - case PM_ASSOC_NODE: { - // { foo: 1 } - // ^^^^^^ - // - // foo(bar: 1) - // ^^^^^^ - const pm_assoc_node_t *cast = (const pm_assoc_node_t *) node; + // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) + // ^^^^^^^^ + // Keywords create an internal variable on the parse tree + if (keywords_list && keywords_list->size) { + body->param.keyword = keyword = ZALLOC_N(struct rb_iseq_param_keyword, 1); + keyword->num = (int) keywords_list->size; - PM_COMPILE(cast->key); - PM_COMPILE(cast->value); + body->param.flags.has_kw = true; + const VALUE default_values = rb_ary_hidden_new(1); + const VALUE complex_mark = rb_str_tmp_new(0); - return; - } - case PM_ASSOC_SPLAT_NODE: { - // { **foo } - // ^^^^^ - // - // def foo(**); bar(**); end - // ^^ - const pm_assoc_splat_node_t *cast = (const pm_assoc_splat_node_t *) node; + ID *ids = xcalloc(keywords_list->size, sizeof(ID)); - if (cast->value != NULL) { - PM_COMPILE(cast->value); - } - else if (!popped) { - pm_local_index_t index = pm_lookup_local_index(iseq, scope_node, PM_CONSTANT_POW, 0); - PUSH_GETLOCAL(ret, location, index.index, index.level); - } + size_t kw_index = 0; - return; - } - case PM_BACK_REFERENCE_READ_NODE: { - // $+ - // ^^ - if (!popped) { - // Since a back reference is `$`, ruby represents the ID as the - // an rb_intern on the value after the `$`. - char *char_ptr = (char *)(node->location.start) + 1; - ID backref_val = INT2FIX(rb_intern2(char_ptr, 1)) << 1 | 1; - PUSH_INSN2(ret, location, getspecial, INT2FIX(1), backref_val); - } - return; - } - case PM_BEGIN_NODE: { - // begin end - // ^^^^^^^^^ - const pm_begin_node_t *cast = (const pm_begin_node_t *) node; + for (size_t i = 0; i < keywords_list->size; i++) { + pm_node_t *keyword_parameter_node = keywords_list->nodes[i]; + pm_constant_id_t name; - if (cast->ensure_clause) { - // Compiling the ensure clause will compile the rescue clause (if - // there is one), which will compile the begin statements. - pm_compile_ensure(iseq, cast, &location, ret, popped, scope_node); - } - else if (cast->rescue_clause) { - // Compiling rescue will compile begin statements (if applicable). - pm_compile_rescue(iseq, cast, &location, ret, popped, scope_node); - } - else { - // If there is neither ensure or rescue, the just compile the - // statements. - if (cast->statements != NULL) { - PM_COMPILE((const pm_node_t *) cast->statements); - } - else if (!popped) { - PUSH_SYNTHETIC_PUTNIL(ret, iseq); - } - } - return; - } - case PM_BLOCK_ARGUMENT_NODE: { - // foo(&bar) - // ^^^^ - const pm_block_argument_node_t *cast = (const pm_block_argument_node_t *) node; + // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) + // ^^ + if (PM_NODE_TYPE_P(keyword_parameter_node, PM_REQUIRED_KEYWORD_PARAMETER_NODE)) { + name = ((const pm_required_keyword_parameter_node_t *) keyword_parameter_node)->name; + keyword->required_num++; + ID local = pm_constant_id_lookup(scope_node, name); - if (cast->expression != NULL) { - PM_COMPILE(cast->expression); - } - else { - // If there's no expression, this must be block forwarding. - pm_local_index_t local_index = pm_lookup_local_index(iseq, scope_node, PM_CONSTANT_AND, 0); - PUSH_INSN2(ret, location, getblockparamproxy, INT2FIX(local_index.index + VM_ENV_DATA_SIZE - 1), INT2FIX(local_index.level)); + if (PM_NODE_FLAG_P(keyword_parameter_node, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { + local_table_for_iseq->ids[local_index] = local; + } + else { + pm_insert_local_index(name, local_index, index_lookup_table, local_table_for_iseq, scope_node); + } + local_index++; + ids[kw_index++] = local; + } } - return; - } - case PM_BREAK_NODE: { - // break - // ^^^^^ - // - // break foo - // ^^^^^^^^^ - const pm_break_node_t *cast = (const pm_break_node_t *) node; - unsigned long throw_flag = 0; - - if (ISEQ_COMPILE_DATA(iseq)->redo_label != 0 && can_add_ensure_iseq(iseq)) { - /* while/until */ - LABEL *splabel = NEW_LABEL(0); - PUSH_LABEL(ret, splabel); - PUSH_ADJUST(ret, location, ISEQ_COMPILE_DATA(iseq)->redo_label); - if (cast->arguments != NULL) { - PM_COMPILE_NOT_POPPED((const pm_node_t *) cast->arguments); - } - else { - PUSH_INSN(ret, location, putnil); - } + for (size_t i = 0; i < keywords_list->size; i++) { + pm_node_t *keyword_parameter_node = keywords_list->nodes[i]; + pm_constant_id_t name; - pm_add_ensure_iseq(ret, iseq, 0, scope_node); - PUSH_INSNL(ret, location, jump, ISEQ_COMPILE_DATA(iseq)->end_label); - PUSH_ADJUST_RESTORE(ret, splabel); - if (!popped) PUSH_INSN(ret, location, putnil); - } - else { - const rb_iseq_t *ip = iseq; + // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) + // ^^^^ + if (PM_NODE_TYPE_P(keyword_parameter_node, PM_OPTIONAL_KEYWORD_PARAMETER_NODE)) { + const pm_optional_keyword_parameter_node_t *cast = ((const pm_optional_keyword_parameter_node_t *) keyword_parameter_node); - while (ip) { - if (!ISEQ_COMPILE_DATA(ip)) { - ip = 0; - break; - } + pm_node_t *value = cast->value; + name = cast->name; - if (ISEQ_COMPILE_DATA(ip)->redo_label != 0) { - throw_flag = VM_THROW_NO_ESCAPE_FLAG; - } - else if (ISEQ_BODY(ip)->type == ISEQ_TYPE_BLOCK) { - throw_flag = 0; - } - else if (ISEQ_BODY(ip)->type == ISEQ_TYPE_EVAL) { - COMPILE_ERROR(iseq, location.line, "Can't escape from eval with break"); - return; + if (PM_NODE_FLAG_P(value, PM_NODE_FLAG_STATIC_LITERAL) && !PM_CONTAINER_P(value)) { + rb_ary_push(default_values, pm_static_literal_value(iseq, value, scope_node)); } else { - ip = ISEQ_BODY(ip)->parent_iseq; - continue; + rb_ary_push(default_values, complex_mark); } - /* escape from block */ - if (cast->arguments != NULL) { - PM_COMPILE_NOT_POPPED((const pm_node_t *) cast->arguments); + ID local = pm_constant_id_lookup(scope_node, name); + if (PM_NODE_FLAG_P(keyword_parameter_node, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { + local_table_for_iseq->ids[local_index] = local; } else { - PUSH_INSN(ret, location, putnil); + pm_insert_local_index(name, local_index, index_lookup_table, local_table_for_iseq, scope_node); } + ids[kw_index++] = local; + local_index++; + } - PUSH_INSN1(ret, location, throw, INT2FIX(throw_flag | TAG_BREAK)); - if (popped) PUSH_INSN(ret, location, pop); + } - return; + keyword->bits_start = local_index; + keyword->table = ids; + + if (RARRAY_LEN(default_values)) { + VALUE *dvs = ALLOC_N(VALUE, RARRAY_LEN(default_values)); + + for (int i = 0; i < RARRAY_LEN(default_values); i++) { + VALUE dv = RARRAY_AREF(default_values, i); + if (dv == complex_mark) dv = Qundef; + if (!SPECIAL_CONST_P(dv)) { + RB_OBJ_WRITTEN(iseq, Qundef, dv); + } + dvs[i] = dv; } - COMPILE_ERROR(iseq, location.line, "Invalid break"); + keyword->default_values = dvs; } - return; - } - case PM_CALL_NODE: { - // foo - // ^^^ - // - // foo.bar - // ^^^^^^^ - // - // foo.bar() {} - // ^^^^^^^^^^^^ - const pm_call_node_t *cast = (const pm_call_node_t *) node; - ID method_id = pm_constant_id_lookup(scope_node, cast->name); - const pm_location_t *message_loc = &cast->message_loc; - if (message_loc->start == NULL) message_loc = &cast->base.location; + // Hidden local for keyword arguments + ID local = rb_make_temporary_id(local_index); + local_table_for_iseq->ids[local_index] = local; + local_index++; + } - const pm_node_location_t location = PM_LOCATION_START_LOCATION(scope_node->parser, message_loc, cast->base.node_id); - const char *builtin_func; + if (body->type == ISEQ_TYPE_BLOCK && local_index == 1 && requireds_list && requireds_list->size == 1 && !trailing_comma) { + body->param.flags.ambiguous_param0 = true; + } - if (UNLIKELY(iseq_has_builtin_function_table(iseq)) && (builtin_func = pm_iseq_builtin_function_name(scope_node, cast->receiver, method_id)) != NULL) { - pm_compile_builtin_function_call(iseq, ret, scope_node, cast, &location, popped, ISEQ_COMPILE_DATA(iseq)->current_block, builtin_func); - return; - } + if (parameters_node) { + // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) + // ^^^ + if (parameters_node->keyword_rest) { + switch (PM_NODE_TYPE(parameters_node->keyword_rest)) { + case PM_NO_KEYWORDS_PARAMETER_NODE: { + // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **nil, &n) + // ^^^^^ + body->param.flags.accepts_no_kwarg = true; + break; + } + case PM_KEYWORD_REST_PARAMETER_NODE: { + // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) + // ^^^ + const pm_keyword_rest_parameter_node_t *kw_rest_node = (const pm_keyword_rest_parameter_node_t *) parameters_node->keyword_rest; + if (!body->param.flags.has_kw) { + body->param.keyword = keyword = ZALLOC_N(struct rb_iseq_param_keyword, 1); + } - LABEL *start = NEW_LABEL(location.line); - if (cast->block) PUSH_LABEL(ret, start); + keyword->rest_start = local_index; + body->param.flags.has_kwrest = true; - switch (method_id) { - case idUMinus: { - if (pm_opt_str_freeze_p(iseq, cast)) { - VALUE value = parse_static_literal_string(iseq, scope_node, cast->receiver, &((const pm_string_node_t * ) cast->receiver)->unescaped); - PUSH_INSN2(ret, location, opt_str_uminus, value, new_callinfo(iseq, idUMinus, 0, 0, NULL, FALSE)); - return; - } - break; - } - case idFreeze: { - if (pm_opt_str_freeze_p(iseq, cast)) { - VALUE value = parse_static_literal_string(iseq, scope_node, cast->receiver, &((const pm_string_node_t * ) cast->receiver)->unescaped); - PUSH_INSN2(ret, location, opt_str_freeze, value, new_callinfo(iseq, idFreeze, 0, 0, NULL, FALSE)); - return; - } - break; - } - case idAREF: { - if (pm_opt_aref_with_p(iseq, cast)) { - const pm_string_node_t *string = (const pm_string_node_t *) ((const pm_arguments_node_t *) cast->arguments)->arguments.nodes[0]; - VALUE value = parse_static_literal_string(iseq, scope_node, (const pm_node_t *) string, &string->unescaped); + pm_constant_id_t constant_id = kw_rest_node->name; + if (constant_id) { + if (PM_NODE_FLAG_P(kw_rest_node, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { + ID local = pm_constant_id_lookup(scope_node, constant_id); + local_table_for_iseq->ids[local_index] = local; + } + else { + pm_insert_local_index(constant_id, local_index, index_lookup_table, local_table_for_iseq, scope_node); + } + } + else { + body->param.flags.anon_kwrest = true; + pm_insert_local_special(idPow, local_index, index_lookup_table, local_table_for_iseq); + } - PM_COMPILE_NOT_POPPED(cast->receiver); - PUSH_INSN2(ret, location, opt_aref_with, value, new_callinfo(iseq, idAREF, 1, 0, NULL, FALSE)); + local_index++; + break; + } + case PM_FORWARDING_PARAMETER_NODE: { + // def foo(...) + // ^^^ + if (!ISEQ_BODY(iseq)->param.flags.forwardable) { + // Add the anonymous * + body->param.rest_start = local_index; + body->param.flags.has_rest = true; + body->param.flags.anon_rest = true; + pm_insert_local_special(idMULT, local_index++, index_lookup_table, local_table_for_iseq); - if (popped) { - PUSH_INSN(ret, location, pop); + // Add the anonymous ** + RUBY_ASSERT(!body->param.flags.has_kw); + body->param.flags.has_kw = false; + body->param.flags.has_kwrest = true; + body->param.flags.anon_kwrest = true; + body->param.keyword = keyword = ZALLOC_N(struct rb_iseq_param_keyword, 1); + keyword->rest_start = local_index; + pm_insert_local_special(idPow, local_index++, index_lookup_table, local_table_for_iseq); + + // Add the anonymous & + body->param.block_start = local_index; + body->param.flags.has_block = true; + pm_insert_local_special(idAnd, local_index++, index_lookup_table, local_table_for_iseq); } - return; + // Add the ... + pm_insert_local_special(idDot3, local_index++, index_lookup_table, local_table_for_iseq); + break; + } + default: + rb_bug("node type %s not expected as keyword_rest", pm_node_type_to_str(PM_NODE_TYPE(parameters_node->keyword_rest))); } - break; - } - case idASET: { - if (pm_opt_aset_with_p(iseq, cast)) { - const pm_string_node_t *string = (const pm_string_node_t *) ((const pm_arguments_node_t *) cast->arguments)->arguments.nodes[0]; - VALUE value = parse_static_literal_string(iseq, scope_node, (const pm_node_t *) string, &string->unescaped); + } - PM_COMPILE_NOT_POPPED(cast->receiver); - PM_COMPILE_NOT_POPPED(((const pm_arguments_node_t *) cast->arguments)->arguments.nodes[1]); + // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) + // ^^ + if (parameters_node->block) { + body->param.block_start = local_index; + body->param.flags.has_block = true; + iseq_set_use_block(iseq); - if (!popped) { - PUSH_INSN(ret, location, swap); - PUSH_INSN1(ret, location, topn, INT2FIX(1)); + pm_constant_id_t name = ((const pm_block_parameter_node_t *) parameters_node->block)->name; + + if (name) { + if (PM_NODE_FLAG_P(parameters_node->block, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { + ID local = pm_constant_id_lookup(scope_node, name); + local_table_for_iseq->ids[local_index] = local; } + else { + pm_insert_local_index(name, local_index, index_lookup_table, local_table_for_iseq, scope_node); + } + } + else { + pm_insert_local_special(idAnd, local_index, index_lookup_table, local_table_for_iseq); + } - PUSH_INSN2(ret, location, opt_aset_with, value, new_callinfo(iseq, idASET, 2, 0, NULL, FALSE)); - PUSH_INSN(ret, location, pop); - return; + local_index++; + } + } + + //********END OF STEP 2********** + // The local table is now consistent with expected + // stack layout + + // If there's only one required element in the parameters + // CRuby needs to recognize it as an ambiguous parameter + + //********STEP 3********** + // Goal: fill in the names of the parameters in MultiTargetNodes + // + // Go through requireds again to set the multis + + if (requireds_list && requireds_list->size) { + for (size_t i = 0; i < requireds_list->size; i++) { + // For each MultiTargetNode, we're going to have one + // additional anonymous local not represented in the locals table + // We want to account for this in our table size + const pm_node_t *required = requireds_list->nodes[i]; + + if (PM_NODE_TYPE_P(required, PM_MULTI_TARGET_NODE)) { + local_index = pm_compile_destructured_param_locals((const pm_multi_target_node_t *) required, index_lookup_table, local_table_for_iseq, scope_node, local_index); } - break; - } } + } - if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_ATTRIBUTE_WRITE) && !popped) { - PUSH_INSN(ret, location, putnil); + // Go through posts again to set the multis + if (posts_list && posts_list->size) { + for (size_t i = 0; i < posts_list->size; i++) { + // For each MultiTargetNode, we're going to have one + // additional anonymous local not represented in the locals table + // We want to account for this in our table size + const pm_node_t *post = posts_list->nodes[i]; + + if (PM_NODE_TYPE_P(post, PM_MULTI_TARGET_NODE)) { + local_index = pm_compile_destructured_param_locals((const pm_multi_target_node_t *) post, index_lookup_table, local_table_for_iseq, scope_node, local_index); + } } + } - if (cast->receiver == NULL) { - PUSH_INSN(ret, location, putself); + // Set any anonymous locals for the for node + if (PM_NODE_TYPE_P(scope_node->ast_node, PM_FOR_NODE)) { + if (PM_NODE_TYPE_P(((const pm_for_node_t *) scope_node->ast_node)->index, PM_LOCAL_VARIABLE_TARGET_NODE)) { + body->param.lead_num++; } else { - if (method_id == idCall && PM_NODE_TYPE_P(cast->receiver, PM_LOCAL_VARIABLE_READ_NODE)) { - const pm_local_variable_read_node_t *read_node_cast = (const pm_local_variable_read_node_t *) cast->receiver; - uint32_t node_id = cast->receiver->node_id; - int idx, level; + body->param.rest_start = local_index; + body->param.flags.has_rest = true; + } - if (iseq_block_param_id_p(iseq, pm_constant_id_lookup(scope_node, read_node_cast->name), &idx, &level)) { - ADD_ELEM(ret, (LINK_ELEMENT *) new_insn_body(iseq, location.line, node_id, BIN(getblockparamproxy), 2, INT2FIX((idx) + VM_ENV_DATA_SIZE - 1), INT2FIX(level))); - } - else { - PM_COMPILE_NOT_POPPED(cast->receiver); - } - } - else { - PM_COMPILE_NOT_POPPED(cast->receiver); - } + ID local = rb_make_temporary_id(local_index); + local_table_for_iseq->ids[local_index] = local; + local_index++; + } + + // Fill in any NumberedParameters, if they exist + if (scope_node->parameters && PM_NODE_TYPE_P(scope_node->parameters, PM_NUMBERED_PARAMETERS_NODE)) { + int maximum = ((const pm_numbered_parameters_node_t *) scope_node->parameters)->maximum; + RUBY_ASSERT(0 < maximum && maximum <= 9); + for (int i = 0; i < maximum; i++, local_index++) { + const uint8_t param_name[] = { '_', '1' + i }; + pm_constant_id_t constant_id = pm_constant_pool_find(&scope_node->parser->constant_pool, param_name, 2); + RUBY_ASSERT(constant_id && "parser should fill in any gaps in numbered parameters"); + pm_insert_local_index(constant_id, local_index, index_lookup_table, local_table_for_iseq, scope_node); } + body->param.lead_num = maximum; + body->param.flags.has_lead = true; + } - pm_compile_call(iseq, cast, ret, popped, scope_node, method_id, start); - return; - } - case PM_CALL_AND_WRITE_NODE: { - // foo.bar &&= baz - // ^^^^^^^^^^^^^^^ - const pm_call_and_write_node_t *cast = (const pm_call_and_write_node_t *) node; - pm_compile_call_and_or_write_node(iseq, true, cast->receiver, cast->value, cast->write_name, cast->read_name, PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_SAFE_NAVIGATION), &location, ret, popped, scope_node); - return; - } - case PM_CALL_OR_WRITE_NODE: { - // foo.bar ||= baz - // ^^^^^^^^^^^^^^^ - const pm_call_or_write_node_t *cast = (const pm_call_or_write_node_t *) node; - pm_compile_call_and_or_write_node(iseq, false, cast->receiver, cast->value, cast->write_name, cast->read_name, PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_SAFE_NAVIGATION), &location, ret, popped, scope_node); - return; - } - case PM_CALL_OPERATOR_WRITE_NODE: { - // foo.bar += baz - // ^^^^^^^^^^^^^^^ - // - // Call operator writes occur when you have a call node on the left-hand - // side of a write operator that is not `=`. As an example, - // `foo.bar *= 1`. This breaks down to caching the receiver on the - // stack and then performing three method calls, one to read the value, - // one to compute the result, and one to write the result back to the - // receiver. - const pm_call_operator_write_node_t *cast = (const pm_call_operator_write_node_t *) node; - int flag = 0; + //********END OF STEP 3********** - if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_IGNORE_VISIBILITY)) { - flag = VM_CALL_FCALL; + //********STEP 4********** + // Goal: fill in the method body locals + // To be explicit, these are the non-parameter locals + // We fill in the block_locals, if they exist + // lambda { |x; y| y } + // ^ + if (block_locals && block_locals->size) { + for (size_t i = 0; i < block_locals->size; i++, local_index++) { + pm_constant_id_t constant_id = ((const pm_block_local_variable_node_t *) block_locals->nodes[i])->name; + pm_insert_local_index(constant_id, local_index, index_lookup_table, local_table_for_iseq, scope_node); } + } - PM_COMPILE_NOT_POPPED(cast->receiver); + // Fill in any locals we missed + if (scope_node->locals.size) { + for (size_t i = 0; i < scope_node->locals.size; i++) { + pm_constant_id_t constant_id = locals->ids[i]; + if (constant_id) { + struct pm_local_table_insert_ctx ctx; + ctx.scope_node = scope_node; + ctx.local_table_for_iseq = local_table_for_iseq; + ctx.local_index = local_index; - LABEL *safe_label = NULL; - if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_SAFE_NAVIGATION)) { - safe_label = NEW_LABEL(location.line); - PUSH_INSN(ret, location, dup); - PUSH_INSNL(ret, location, branchnil, safe_label); + st_update(index_lookup_table, (st_data_t)constant_id, pm_local_table_insert_func, (st_data_t)&ctx); + + local_index = ctx.local_index; + } } + } - PUSH_INSN(ret, location, dup); + //********END OF STEP 4********** - ID id_read_name = pm_constant_id_lookup(scope_node, cast->read_name); - PUSH_SEND_WITH_FLAG(ret, location, id_read_name, INT2FIX(0), INT2FIX(flag)); + // We set the index_lookup_table on the scope node so we can + // refer to the parameters correctly + if (scope_node->index_lookup_table) { + st_free_table(scope_node->index_lookup_table); + } + scope_node->index_lookup_table = index_lookup_table; + iseq_calc_param_size(iseq); - PM_COMPILE_NOT_POPPED(cast->value); - ID id_operator = pm_constant_id_lookup(scope_node, cast->binary_operator); - PUSH_SEND(ret, location, id_operator, INT2FIX(1)); + if (ISEQ_BODY(iseq)->param.flags.forwardable) { + // We're treating `...` as a parameter so that frame + // pushing won't clobber it. + ISEQ_BODY(iseq)->param.size += 1; + } - if (!popped) { - PUSH_INSN(ret, location, swap); - PUSH_INSN1(ret, location, topn, INT2FIX(1)); - } + // FIXME: args? + iseq_set_local_table(iseq, local_table_for_iseq, 0); + scope_node->local_table_for_iseq_size = local_table_for_iseq->size; - ID id_write_name = pm_constant_id_lookup(scope_node, cast->write_name); - PUSH_SEND_WITH_FLAG(ret, location, id_write_name, INT2FIX(1), INT2FIX(flag)); + //********STEP 5************ + // Goal: compile anything that needed to be compiled + if (optionals_list && optionals_list->size) { + LABEL **opt_table = (LABEL **) ALLOC_N(VALUE, optionals_list->size + 1); + LABEL *label; - if (safe_label != NULL && popped) PUSH_LABEL(ret, safe_label); - PUSH_INSN(ret, location, pop); - if (safe_label != NULL && !popped) PUSH_LABEL(ret, safe_label); + // TODO: Should we make an api for NEW_LABEL where you can pass + // a pointer to the label it should fill out? We already + // have a list of labels allocated above so it seems wasteful + // to do the copies. + for (size_t i = 0; i < optionals_list->size; i++) { + label = NEW_LABEL(location.line); + opt_table[i] = label; + PUSH_LABEL(ret, label); + pm_node_t *optional_node = optionals_list->nodes[i]; + PM_COMPILE_NOT_POPPED(optional_node); + } - return; - } - case PM_CASE_NODE: - // case foo; when bar; end - // ^^^^^^^^^^^^^^^^^^^^^^^ - pm_compile_case_node(iseq, (const pm_case_node_t *) node, &location, ret, popped, scope_node); - return; - case PM_CASE_MATCH_NODE: { - // case foo; in bar; end - // ^^^^^^^^^^^^^^^^^^^^^ - // - // If you use the `case` keyword to create a case match node, it will - // match against all of the `in` clauses until it finds one that - // matches. If it doesn't find one, it can optionally fall back to an - // `else` clause. If none is present and a match wasn't found, it will - // raise an appropriate error. - const pm_case_match_node_t *cast = (const pm_case_match_node_t *) node; + // Set the last label + label = NEW_LABEL(location.line); + opt_table[optionals_list->size] = label; + PUSH_LABEL(ret, label); - // This is the anchor that we will compile the bodies of the various - // `in` nodes into. We'll make sure that the patterns that are compiled - // jump into the correct spots within this anchor. - DECL_ANCHOR(body_seq); - INIT_ANCHOR(body_seq); + body->param.opt_table = (const VALUE *) opt_table; + } - // This is the anchor that we will compile the patterns of the various - // `in` nodes into. If a match is found, they will need to jump into the - // body_seq anchor to the correct spot. - DECL_ANCHOR(cond_seq); - INIT_ANCHOR(cond_seq); + if (keywords_list && keywords_list->size) { + size_t optional_index = 0; + for (size_t i = 0; i < keywords_list->size; i++) { + pm_node_t *keyword_parameter_node = keywords_list->nodes[i]; + pm_constant_id_t name; - // This label is used to indicate the end of the entire node. It is - // jumped to after the entire stack is cleaned up. - LABEL *end_label = NEW_LABEL(location.line); + switch (PM_NODE_TYPE(keyword_parameter_node)) { + case PM_OPTIONAL_KEYWORD_PARAMETER_NODE: { + // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) + // ^^^^ + const pm_optional_keyword_parameter_node_t *cast = ((const pm_optional_keyword_parameter_node_t *) keyword_parameter_node); - // This label is used as the fallback for the case match. If no match is - // found, then we jump to this label. This is either an `else` clause or - // an error handler. - LABEL *else_label = NEW_LABEL(location.line); + pm_node_t *value = cast->value; + name = cast->name; - // We're going to use this to uniquely identify each branch so that we - // can track coverage information. - rb_code_location_t case_location = { 0 }; - VALUE branches = Qfalse; - int branch_id = 0; + if (!PM_NODE_FLAG_P(value, PM_NODE_FLAG_STATIC_LITERAL) || PM_CONTAINER_P(value)) { + LABEL *end_label = NEW_LABEL(location.line); - if (PM_BRANCH_COVERAGE_P(iseq)) { - case_location = pm_code_location(scope_node, (const pm_node_t *) cast); - branches = decl_branch_base(iseq, PTR2NUM(cast), &case_location, "case"); + pm_local_index_t index = pm_lookup_local_index(iseq, scope_node, name, 0); + int kw_bits_idx = table_size - body->param.keyword->bits_start; + PUSH_INSN2(ret, location, checkkeyword, INT2FIX(kw_bits_idx + VM_ENV_DATA_SIZE - 1), INT2FIX(optional_index)); + PUSH_INSNL(ret, location, branchif, end_label); + PM_COMPILE(value); + PUSH_SETLOCAL(ret, location, index.index, index.level); + PUSH_LABEL(ret, end_label); + } + optional_index++; + break; + } + case PM_REQUIRED_KEYWORD_PARAMETER_NODE: + // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) + // ^^ + break; + default: + rb_bug("Unexpected keyword parameter node type %s", pm_node_type_to_str(PM_NODE_TYPE(keyword_parameter_node))); + } } + } - // If there is only one pattern, then the behavior changes a bit. It - // effectively gets treated as a match required node (this is how it is - // represented in the other parser). - bool in_single_pattern = cast->else_clause == NULL && cast->conditions.size == 1; + if (requireds_list && requireds_list->size) { + for (size_t i = 0; i < requireds_list->size; i++) { + // For each MultiTargetNode, we're going to have one additional + // anonymous local not represented in the locals table. We want + // to account for this in our table size. + const pm_node_t *required = requireds_list->nodes[i]; - // First, we're going to push a bunch of stuff onto the stack that is - // going to serve as our scratch space. - if (in_single_pattern) { - PUSH_INSN(ret, location, putnil); // key error key - PUSH_INSN(ret, location, putnil); // key error matchee - PUSH_INSN1(ret, location, putobject, Qfalse); // key error? - PUSH_INSN(ret, location, putnil); // error string + if (PM_NODE_TYPE_P(required, PM_MULTI_TARGET_NODE)) { + PUSH_GETLOCAL(ret, location, table_size - (int)i, 0); + pm_compile_destructured_param_writes(iseq, (const pm_multi_target_node_t *) required, ret, scope_node); + } } + } - // Now we're going to compile the value to match against. - PUSH_INSN(ret, location, putnil); // deconstruct cache - PM_COMPILE_NOT_POPPED(cast->predicate); + if (posts_list && posts_list->size) { + for (size_t i = 0; i < posts_list->size; i++) { + // For each MultiTargetNode, we're going to have one additional + // anonymous local not represented in the locals table. We want + // to account for this in our table size. + const pm_node_t *post = posts_list->nodes[i]; - // Next, we'll loop through every in clause and compile its body into - // the body_seq anchor and its pattern into the cond_seq anchor. We'll - // make sure the pattern knows how to jump correctly into the body if it - // finds a match. - for (size_t index = 0; index < cast->conditions.size; index++) { - const pm_node_t *condition = cast->conditions.nodes[index]; - RUBY_ASSERT(PM_NODE_TYPE_P(condition, PM_IN_NODE)); + if (PM_NODE_TYPE_P(post, PM_MULTI_TARGET_NODE)) { + PUSH_GETLOCAL(ret, location, table_size - body->param.post_start - (int) i, 0); + pm_compile_destructured_param_writes(iseq, (const pm_multi_target_node_t *) post, ret, scope_node); + } + } + } - const pm_in_node_t *in_node = (const pm_in_node_t *) condition; - const pm_node_location_t in_location = PM_NODE_START_LOCATION(parser, in_node); - const pm_node_location_t pattern_location = PM_NODE_START_LOCATION(parser, in_node->pattern); + switch (body->type) { + case ISEQ_TYPE_BLOCK: { + LABEL *start = ISEQ_COMPILE_DATA(iseq)->start_label = NEW_LABEL(0); + LABEL *end = ISEQ_COMPILE_DATA(iseq)->end_label = NEW_LABEL(0); + const pm_node_location_t block_location = { .line = body->location.first_lineno, .node_id = -1 }; - if (branch_id) { - PUSH_INSN(body_seq, in_location, putnil); - } + start->rescued = LABEL_RESCUE_BEG; + end->rescued = LABEL_RESCUE_END; - LABEL *body_label = NEW_LABEL(in_location.line); - PUSH_LABEL(body_seq, body_label); - PUSH_INSN1(body_seq, in_location, adjuststack, INT2FIX(in_single_pattern ? 6 : 2)); - - // Establish branch coverage for the in clause. - if (PM_BRANCH_COVERAGE_P(iseq)) { - rb_code_location_t branch_location = pm_code_location(scope_node, in_node->statements != NULL ? ((const pm_node_t *) in_node->statements) : ((const pm_node_t *) in_node)); - add_trace_branch_coverage(iseq, body_seq, &branch_location, branch_location.beg_pos.column, branch_id++, "in", branches); - } - - if (in_node->statements != NULL) { - PM_COMPILE_INTO_ANCHOR(body_seq, (const pm_node_t *) in_node->statements); - } - else if (!popped) { - PUSH_SYNTHETIC_PUTNIL(body_seq, iseq); - } + // For nodes automatically assign the iteration variable to whatever + // index variable. We need to handle that write here because it has + // to happen in the context of the block. Note that this happens + // before the B_CALL tracepoint event. + if (PM_NODE_TYPE_P(scope_node->ast_node, PM_FOR_NODE)) { + pm_compile_for_node_index(iseq, ((const pm_for_node_t *) scope_node->ast_node)->index, ret, scope_node); + } - PUSH_INSNL(body_seq, in_location, jump, end_label); - LABEL *next_pattern_label = NEW_LABEL(pattern_location.line); + PUSH_TRACE(ret, RUBY_EVENT_B_CALL); + PUSH_INSN(ret, block_location, nop); + PUSH_LABEL(ret, start); - PUSH_INSN(cond_seq, pattern_location, dup); - pm_compile_pattern(iseq, scope_node, in_node->pattern, cond_seq, body_label, next_pattern_label, in_single_pattern, false, true, 2); - PUSH_LABEL(cond_seq, next_pattern_label); - LABEL_UNREMOVABLE(next_pattern_label); - } + if (scope_node->body != NULL) { + switch (PM_NODE_TYPE(scope_node->ast_node)) { + case PM_POST_EXECUTION_NODE: { + const pm_post_execution_node_t *cast = (const pm_post_execution_node_t *) scope_node->ast_node; + PUSH_INSN1(ret, block_location, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); - if (cast->else_clause != NULL) { - // If we have an `else` clause, then this becomes our fallback (and - // there is no need to compile in code to potentially raise an - // error). - const pm_else_node_t *else_node = cast->else_clause; + // We create another ScopeNode from the statements within the PostExecutionNode + pm_scope_node_t next_scope_node; + pm_scope_node_init((const pm_node_t *) cast->statements, &next_scope_node, scope_node); - PUSH_LABEL(cond_seq, else_label); - PUSH_INSN(cond_seq, location, pop); - PUSH_INSN(cond_seq, location, pop); + const rb_iseq_t *block = NEW_CHILD_ISEQ(&next_scope_node, make_name_for_block(body->parent_iseq), ISEQ_TYPE_BLOCK, location.line); + pm_scope_node_destroy(&next_scope_node); - // Establish branch coverage for the else clause. - if (PM_BRANCH_COVERAGE_P(iseq)) { - rb_code_location_t branch_location = pm_code_location(scope_node, else_node->statements != NULL ? ((const pm_node_t *) else_node->statements) : ((const pm_node_t *) else_node)); - add_trace_branch_coverage(iseq, cond_seq, &branch_location, branch_location.beg_pos.column, branch_id, "else", branches); + PUSH_CALL_WITH_BLOCK(ret, block_location, id_core_set_postexe, INT2FIX(0), block); + break; + } + case PM_INTERPOLATED_REGULAR_EXPRESSION_NODE: { + const pm_interpolated_regular_expression_node_t *cast = (const pm_interpolated_regular_expression_node_t *) scope_node->ast_node; + pm_compile_regexp_dynamic(iseq, (const pm_node_t *) cast, &cast->parts, &location, ret, popped, scope_node); + break; + } + default: + pm_compile_node(iseq, scope_node->body, ret, popped, scope_node); + break; } - - PM_COMPILE_INTO_ANCHOR(cond_seq, (const pm_node_t *) else_node); - PUSH_INSNL(cond_seq, location, jump, end_label); - PUSH_INSN(cond_seq, location, putnil); - if (popped) PUSH_INSN(cond_seq, location, putnil); } else { - // Otherwise, if we do not have an `else` clause, we will compile in - // the code to handle raising an appropriate error. - PUSH_LABEL(cond_seq, else_label); + PUSH_INSN(ret, block_location, putnil); + } - // Establish branch coverage for the implicit else clause. - add_trace_branch_coverage(iseq, cond_seq, &case_location, case_location.beg_pos.column, branch_id, "else", branches); + PUSH_LABEL(ret, end); + PUSH_TRACE(ret, RUBY_EVENT_B_RETURN); + ISEQ_COMPILE_DATA(iseq)->last_line = body->location.code_location.end_pos.lineno; - if (in_single_pattern) { - pm_compile_pattern_error_handler(iseq, scope_node, node, cond_seq, end_label, popped); - } - else { - PUSH_INSN1(cond_seq, location, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); - PUSH_INSN1(cond_seq, location, putobject, rb_eNoMatchingPatternError); - PUSH_INSN1(cond_seq, location, topn, INT2FIX(2)); - PUSH_SEND(cond_seq, location, id_core_raise, INT2FIX(2)); + /* wide range catch handler must put at last */ + PUSH_CATCH_ENTRY(CATCH_TYPE_REDO, start, end, NULL, start); + PUSH_CATCH_ENTRY(CATCH_TYPE_NEXT, start, end, NULL, end); + break; + } + case ISEQ_TYPE_ENSURE: { + const pm_node_location_t statements_location = (scope_node->body != NULL ? PM_NODE_START_LOCATION(scope_node->parser, scope_node->body) : location); + iseq_set_exception_local_table(iseq); - PUSH_INSN1(cond_seq, location, adjuststack, INT2FIX(3)); - if (!popped) PUSH_INSN(cond_seq, location, putnil); - PUSH_INSNL(cond_seq, location, jump, end_label); - PUSH_INSN1(cond_seq, location, dupn, INT2FIX(1)); - if (popped) PUSH_INSN(cond_seq, location, putnil); - } + if (scope_node->body != NULL) { + PM_COMPILE_POPPED((const pm_node_t *) scope_node->body); } - // At the end of all of this compilation, we will add the code for the - // conditions first, then the various bodies, then mark the end of the - // entire sequence with the end label. - PUSH_SEQ(ret, cond_seq); - PUSH_SEQ(ret, body_seq); - PUSH_LABEL(ret, end_label); - + PUSH_GETLOCAL(ret, statements_location, 1, 0); + PUSH_INSN1(ret, statements_location, throw, INT2FIX(0)); return; } - case PM_CLASS_NODE: { - // class Foo; end - // ^^^^^^^^^^^^^^ - const pm_class_node_t *cast = (const pm_class_node_t *) node; - - ID class_id = pm_constant_id_lookup(scope_node, cast->name); - VALUE class_name = rb_str_freeze(rb_sprintf("", rb_id2str(class_id))); - - pm_scope_node_t next_scope_node; - pm_scope_node_init((const pm_node_t *) cast, &next_scope_node, scope_node); - - const rb_iseq_t *class_iseq = NEW_CHILD_ISEQ(&next_scope_node, class_name, ISEQ_TYPE_CLASS, location.line); - pm_scope_node_destroy(&next_scope_node); - - // TODO: Once we merge constant path nodes correctly, fix this flag - const int flags = VM_DEFINECLASS_TYPE_CLASS | - (cast->superclass ? VM_DEFINECLASS_FLAG_HAS_SUPERCLASS : 0) | - pm_compile_class_path(iseq, cast->constant_path, &location, ret, false, scope_node); + case ISEQ_TYPE_METHOD: { + ISEQ_COMPILE_DATA(iseq)->root_node = (const void *) scope_node->body; + PUSH_TRACE(ret, RUBY_EVENT_CALL); - if (cast->superclass) { - PM_COMPILE_NOT_POPPED(cast->superclass); + if (scope_node->body) { + PM_COMPILE((const pm_node_t *) scope_node->body); } else { PUSH_INSN(ret, location, putnil); } - PUSH_INSN3(ret, location, defineclass, ID2SYM(class_id), class_iseq, INT2FIX(flags)); - RB_OBJ_WRITTEN(iseq, Qundef, (VALUE)class_iseq); + ISEQ_COMPILE_DATA(iseq)->root_node = (const void *) scope_node->body; + PUSH_TRACE(ret, RUBY_EVENT_RETURN); + + ISEQ_COMPILE_DATA(iseq)->last_line = body->location.code_location.end_pos.lineno; + break; + } + case ISEQ_TYPE_RESCUE: { + iseq_set_exception_local_table(iseq); + if (PM_NODE_TYPE_P(scope_node->ast_node, PM_RESCUE_MODIFIER_NODE)) { + LABEL *lab = NEW_LABEL(location.line); + LABEL *rescue_end = NEW_LABEL(location.line); + PUSH_GETLOCAL(ret, location, LVAR_ERRINFO, 0); + PUSH_INSN1(ret, location, putobject, rb_eStandardError); + PUSH_INSN1(ret, location, checkmatch, INT2FIX(VM_CHECKMATCH_TYPE_RESCUE)); + PUSH_INSNL(ret, location, branchif, lab); + PUSH_INSNL(ret, location, jump, rescue_end); + PUSH_LABEL(ret, lab); + PUSH_TRACE(ret, RUBY_EVENT_RESCUE); + PM_COMPILE((const pm_node_t *) scope_node->body); + PUSH_INSN(ret, location, leave); + PUSH_LABEL(ret, rescue_end); + PUSH_GETLOCAL(ret, location, LVAR_ERRINFO, 0); + } + else { + PM_COMPILE((const pm_node_t *) scope_node->ast_node); + } + PUSH_INSN1(ret, location, throw, INT2FIX(0)); - if (popped) PUSH_INSN(ret, location, pop); return; } - case PM_CLASS_VARIABLE_AND_WRITE_NODE: { - // @@foo &&= bar - // ^^^^^^^^^^^^^ - const pm_class_variable_and_write_node_t *cast = (const pm_class_variable_and_write_node_t *) node; - LABEL *end_label = NEW_LABEL(location.line); + default: + if (scope_node->body) { + PM_COMPILE((const pm_node_t *) scope_node->body); + } + else { + PUSH_INSN(ret, location, putnil); + } + break; + } - ID name_id = pm_constant_id_lookup(scope_node, cast->name); - VALUE name = ID2SYM(name_id); + if (PM_NODE_TYPE_P(scope_node->ast_node, PM_CLASS_NODE) || PM_NODE_TYPE_P(scope_node->ast_node, PM_MODULE_NODE)) { + const pm_node_location_t end_location = PM_NODE_END_LOCATION(scope_node->parser, scope_node->ast_node); + ADD_TRACE(ret, RUBY_EVENT_END); + ISEQ_COMPILE_DATA(iseq)->last_line = end_location.line; + } - PUSH_INSN2(ret, location, getclassvariable, name, get_cvar_ic_value(iseq, name_id)); - if (!popped) PUSH_INSN(ret, location, dup); + if (!PM_NODE_TYPE_P(scope_node->ast_node, PM_ENSURE_NODE)) { + const pm_node_location_t location = { .line = ISEQ_COMPILE_DATA(iseq)->last_line, .node_id = -1 }; + PUSH_INSN(ret, location, leave); + } +} - PUSH_INSNL(ret, location, branchunless, end_label); - if (!popped) PUSH_INSN(ret, location, pop); +/** + * Compiles a prism node into instruction sequences. + * + * iseq - The current instruction sequence object (used for locals) + * node - The prism node to compile + * ret - The linked list of instructions to append instructions onto + * popped - True if compiling something with no side effects, so instructions don't + * need to be added + * scope_node - Stores parser and local information + */ +static void +pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, bool popped, pm_scope_node_t *scope_node) +{ + const pm_parser_t *parser = scope_node->parser; + const pm_node_location_t location = PM_NODE_START_LOCATION(parser, node); + int lineno = (int) location.line; - PM_COMPILE_NOT_POPPED(cast->value); - if (!popped) PUSH_INSN(ret, location, dup); + if (PM_NODE_TYPE_P(node, PM_BEGIN_NODE) && (((const pm_begin_node_t *) node)->statements == NULL) && (((const pm_begin_node_t *) node)->rescue_clause != NULL)) { + // If this node is a begin node and it has empty statements and also + // has a rescue clause, then the other parser considers it as + // starting on the same line as the rescue, as opposed to the + // location of the begin keyword. We replicate that behavior here. + lineno = (int) PM_NODE_START_LINE_COLUMN(parser, ((const pm_begin_node_t *) node)->rescue_clause).line; + } - PUSH_INSN2(ret, location, setclassvariable, name, get_cvar_ic_value(iseq, name_id)); - PUSH_LABEL(ret, end_label); + if (PM_NODE_FLAG_P(node, PM_NODE_FLAG_NEWLINE) && ISEQ_COMPILE_DATA(iseq)->last_line != lineno) { + // If this node has the newline flag set and it is on a new line + // from the previous nodes that have been compiled for this ISEQ, + // then we need to emit a newline event. + int event = RUBY_EVENT_LINE; - return; - } - case PM_CLASS_VARIABLE_OPERATOR_WRITE_NODE: { - // @@foo += bar - // ^^^^^^^^^^^^ - const pm_class_variable_operator_write_node_t *cast = (const pm_class_variable_operator_write_node_t *) node; + ISEQ_COMPILE_DATA(iseq)->last_line = lineno; + if (ISEQ_COVERAGE(iseq) && ISEQ_LINE_COVERAGE(iseq)) { + event |= RUBY_EVENT_COVERAGE_LINE; + } + PUSH_TRACE(ret, event); + } - ID name_id = pm_constant_id_lookup(scope_node, cast->name); - VALUE name = ID2SYM(name_id); + switch (PM_NODE_TYPE(node)) { + case PM_ALIAS_GLOBAL_VARIABLE_NODE: { + // alias $foo $bar + // ^^^^^^^^^^^^^^^ + const pm_alias_global_variable_node_t *cast = (const pm_alias_global_variable_node_t *) node; + PUSH_INSN1(ret, location, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); - PUSH_INSN2(ret, location, getclassvariable, name, get_cvar_ic_value(iseq, name_id)); - PM_COMPILE_NOT_POPPED(cast->value); + const pm_location_t *new_name_loc = &cast->new_name->location; + PUSH_INSN1(ret, location, putobject, ID2SYM(rb_intern3((const char *) new_name_loc->start, new_name_loc->end - new_name_loc->start, scope_node->encoding))); - ID method_id = pm_constant_id_lookup(scope_node, cast->binary_operator); - int flags = VM_CALL_ARGS_SIMPLE; - PUSH_SEND_WITH_FLAG(ret, location, method_id, INT2NUM(1), INT2FIX(flags)); + const pm_location_t *old_name_loc = &cast->old_name->location; + PUSH_INSN1(ret, location, putobject, ID2SYM(rb_intern3((const char *) old_name_loc->start, old_name_loc->end - old_name_loc->start, scope_node->encoding))); - if (!popped) PUSH_INSN(ret, location, dup); - PUSH_INSN2(ret, location, setclassvariable, name, get_cvar_ic_value(iseq, name_id)); + PUSH_SEND(ret, location, id_core_set_variable_alias, INT2FIX(2)); + if (popped) PUSH_INSN(ret, location, pop); return; } - case PM_CLASS_VARIABLE_OR_WRITE_NODE: { - // @@foo ||= bar + case PM_ALIAS_METHOD_NODE: { + // alias foo bar // ^^^^^^^^^^^^^ - const pm_class_variable_or_write_node_t *cast = (const pm_class_variable_or_write_node_t *) node; - LABEL *end_label = NEW_LABEL(location.line); - LABEL *start_label = NEW_LABEL(location.line); - - ID name_id = pm_constant_id_lookup(scope_node, cast->name); - VALUE name = ID2SYM(name_id); + const pm_alias_method_node_t *cast = (const pm_alias_method_node_t *) node; - PUSH_INSN(ret, location, putnil); - PUSH_INSN3(ret, location, defined, INT2FIX(DEFINED_CVAR), name, Qtrue); - PUSH_INSNL(ret, location, branchunless, start_label); + PUSH_INSN1(ret, location, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); + PUSH_INSN1(ret, location, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_CBASE)); + PM_COMPILE_NOT_POPPED(cast->new_name); + PM_COMPILE_NOT_POPPED(cast->old_name); - PUSH_INSN2(ret, location, getclassvariable, name, get_cvar_ic_value(iseq, name_id)); - if (!popped) PUSH_INSN(ret, location, dup); + PUSH_SEND(ret, location, id_core_set_method_alias, INT2FIX(3)); + if (popped) PUSH_INSN(ret, location, pop); - PUSH_INSNL(ret, location, branchif, end_label); - if (!popped) PUSH_INSN(ret, location, pop); + return; + } + case PM_AND_NODE: { + // a and b + // ^^^^^^^ + const pm_and_node_t *cast = (const pm_and_node_t *) node; + LABEL *end_label = NEW_LABEL(lineno); - PUSH_LABEL(ret, start_label); - PM_COMPILE_NOT_POPPED(cast->value); + PM_COMPILE_NOT_POPPED(cast->left); if (!popped) PUSH_INSN(ret, location, dup); + PUSH_INSNL(ret, location, branchunless, end_label); - PUSH_INSN2(ret, location, setclassvariable, name, get_cvar_ic_value(iseq, name_id)); + if (!popped) PUSH_INSN(ret, location, pop); + PM_COMPILE(cast->right); PUSH_LABEL(ret, end_label); return; } - case PM_CLASS_VARIABLE_READ_NODE: { - // @@foo - // ^^^^^ - if (!popped) { - const pm_class_variable_read_node_t *cast = (const pm_class_variable_read_node_t *) node; - ID name = pm_constant_id_lookup(scope_node, cast->name); - PUSH_INSN2(ret, location, getclassvariable, ID2SYM(name), get_cvar_ic_value(iseq, name)); - } - return; - } - case PM_CLASS_VARIABLE_WRITE_NODE: { - // @@foo = 1 - // ^^^^^^^^^ - const pm_class_variable_write_node_t *cast = (const pm_class_variable_write_node_t *) node; - PM_COMPILE_NOT_POPPED(cast->value); - if (!popped) PUSH_INSN(ret, location, dup); - - ID name = pm_constant_id_lookup(scope_node, cast->name); - PUSH_INSN2(ret, location, setclassvariable, ID2SYM(name), get_cvar_ic_value(iseq, name)); + case PM_ARGUMENTS_NODE: + // These are ArgumentsNodes that are not compiled directly by their + // parent call nodes, used in the cases of NextNodes, ReturnNodes, and + // BreakNodes. They can create an array like ArrayNode. + case PM_ARRAY_NODE: { + const pm_node_list_t *elements; - return; - } - case PM_CONSTANT_PATH_NODE: { - // Foo::Bar - // ^^^^^^^^ - VALUE parts; + if (PM_NODE_TYPE(node) == PM_ARGUMENTS_NODE) { + // break foo + // ^^^ + const pm_arguments_node_t *cast = (const pm_arguments_node_t *) node; + elements = &cast->arguments; - if (ISEQ_COMPILE_DATA(iseq)->option->inline_const_cache && ((parts = pm_constant_path_parts(node, scope_node)) != Qnil)) { - ISEQ_BODY(iseq)->ic_size++; - PUSH_INSN1(ret, location, opt_getconstant_path, parts); + // If we are only returning a single element through one of the jump + // nodes, then we will only compile that node directly. + if (elements->size == 1) { + PM_COMPILE(elements->nodes[0]); + return; + } } else { - DECL_ANCHOR(prefix); - INIT_ANCHOR(prefix); - - DECL_ANCHOR(body); - INIT_ANCHOR(body); + // [foo, bar, baz] + // ^^^^^^^^^^^^^^^ + const pm_array_node_t *cast = (const pm_array_node_t *) node; + elements = &cast->elements; + } - pm_compile_constant_path(iseq, node, prefix, body, popped, scope_node); - if (LIST_INSN_SIZE_ZERO(prefix)) { - PUSH_INSN(ret, location, putnil); + // If every node in the array is static, then we can compile the entire + // array now instead of later. + if (PM_NODE_FLAG_P(node, PM_NODE_FLAG_STATIC_LITERAL)) { + // We're only going to compile this node if it's not popped. If it + // is popped, then we know we don't need to do anything since it's + // statically known. + if (!popped) { + if (elements->size) { + VALUE value = pm_static_literal_value(iseq, node, scope_node); + PUSH_INSN1(ret, location, duparray, value); + } + else { + PUSH_INSN1(ret, location, newarray, INT2FIX(0)); + } } - else { - PUSH_SEQ(ret, prefix); + } + else { + // Here since we know there are possible side-effects inside the + // array contents, we're going to build it entirely at runtime. + // We'll do this by pushing all of the elements onto the stack and + // then combining them with newarray. + // + // If this array is popped, then this serves only to ensure we enact + // all side-effects (like method calls) that are contained within + // the array contents. + // + // We treat all sequences of non-splat elements as their + // own arrays, followed by a newarray, and then continually + // concat the arrays with the SplatNode nodes. + const int max_new_array_size = 0x100; + const unsigned int min_tmp_array_size = 0x40; + + int new_array_size = 0; + bool first_chunk = true; + + // This is an optimization wherein we keep track of whether or not + // the previous element was a static literal. If it was, then we do + // not attempt to check if we have a subarray that can be optimized. + // If it was not, then we do check. + bool static_literal = false; + + // Either create a new array, or push to the existing array. +#define FLUSH_CHUNK \ + if (new_array_size) { \ + if (first_chunk) PUSH_INSN1(ret, location, newarray, INT2FIX(new_array_size)); \ + else PUSH_INSN1(ret, location, pushtoarray, INT2FIX(new_array_size)); \ + first_chunk = false; \ + new_array_size = 0; \ } - PUSH_SEQ(ret, body); - } + for (size_t index = 0; index < elements->size; index++) { + const pm_node_t *element = elements->nodes[index]; - if (popped) PUSH_INSN(ret, location, pop); - return; - } - case PM_CONSTANT_PATH_AND_WRITE_NODE: { - // Foo::Bar &&= baz - // ^^^^^^^^^^^^^^^^ - const pm_constant_path_and_write_node_t *cast = (const pm_constant_path_and_write_node_t *) node; - pm_compile_constant_path_and_write_node(iseq, cast, 0, &location, ret, popped, scope_node); - return; - } - case PM_CONSTANT_PATH_OR_WRITE_NODE: { - // Foo::Bar ||= baz - // ^^^^^^^^^^^^^^^^ - const pm_constant_path_or_write_node_t *cast = (const pm_constant_path_or_write_node_t *) node; - pm_compile_constant_path_or_write_node(iseq, cast, 0, &location, ret, popped, scope_node); - return; - } - case PM_CONSTANT_PATH_OPERATOR_WRITE_NODE: { - // Foo::Bar += baz - // ^^^^^^^^^^^^^^^ - const pm_constant_path_operator_write_node_t *cast = (const pm_constant_path_operator_write_node_t *) node; - pm_compile_constant_path_operator_write_node(iseq, cast, 0, &location, ret, popped, scope_node); - return; - } - case PM_CONSTANT_PATH_WRITE_NODE: { - // Foo::Bar = 1 - // ^^^^^^^^^^^^ - const pm_constant_path_write_node_t *cast = (const pm_constant_path_write_node_t *) node; - pm_compile_constant_path_write_node(iseq, cast, 0, &location, ret, popped, scope_node); - return; - } - case PM_CONSTANT_READ_NODE: { - // Foo - // ^^^ - const pm_constant_read_node_t *cast = (const pm_constant_read_node_t *) node; - VALUE name = ID2SYM(pm_constant_id_lookup(scope_node, cast->name)); + if (PM_NODE_TYPE_P(element, PM_SPLAT_NODE)) { + FLUSH_CHUNK; - pm_compile_constant_read(iseq, name, &cast->base.location, location.node_id, ret, scope_node); - if (popped) PUSH_INSN(ret, location, pop); + const pm_splat_node_t *splat_element = (const pm_splat_node_t *) element; + if (splat_element->expression) { + PM_COMPILE_NOT_POPPED(splat_element->expression); + } + else { + pm_local_index_t index = pm_lookup_local_index(iseq, scope_node, PM_CONSTANT_MULT, 0); + PUSH_GETLOCAL(ret, location, index.index, index.level); + } - return; - } - case PM_CONSTANT_AND_WRITE_NODE: { - // Foo &&= bar - // ^^^^^^^^^^^ - const pm_constant_and_write_node_t *cast = (const pm_constant_and_write_node_t *) node; - pm_compile_constant_and_write_node(iseq, cast, 0, &location, ret, popped, scope_node); - return; - } - case PM_CONSTANT_OR_WRITE_NODE: { - // Foo ||= bar - // ^^^^^^^^^^^ - const pm_constant_or_write_node_t *cast = (const pm_constant_or_write_node_t *) node; - pm_compile_constant_or_write_node(iseq, cast, 0, &location, ret, popped, scope_node); - return; - } - case PM_CONSTANT_OPERATOR_WRITE_NODE: { - // Foo += bar - // ^^^^^^^^^^ - const pm_constant_operator_write_node_t *cast = (const pm_constant_operator_write_node_t *) node; - pm_compile_constant_operator_write_node(iseq, cast, 0, &location, ret, popped, scope_node); - return; - } - case PM_CONSTANT_WRITE_NODE: { - // Foo = 1 - // ^^^^^^^ - const pm_constant_write_node_t *cast = (const pm_constant_write_node_t *) node; - pm_compile_constant_write_node(iseq, cast, 0, &location, ret, popped, scope_node); - return; - } - case PM_DEF_NODE: { - // def foo; end - // ^^^^^^^^^^^^ - // - // def self.foo; end - // ^^^^^^^^^^^^^^^^^ - const pm_def_node_t *cast = (const pm_def_node_t *) node; - ID method_name = pm_constant_id_lookup(scope_node, cast->name); + if (first_chunk) { + // If this is the first element of the array then we + // need to splatarray the elements into the list. + PUSH_INSN1(ret, location, splatarray, Qtrue); + first_chunk = false; + } + else { + PUSH_INSN(ret, location, concattoarray); + } - pm_scope_node_t next_scope_node; - pm_scope_node_init((const pm_node_t *) cast, &next_scope_node, scope_node); + static_literal = false; + } + else if (PM_NODE_TYPE_P(element, PM_KEYWORD_HASH_NODE)) { + if (new_array_size == 0 && first_chunk) { + PUSH_INSN1(ret, location, newarray, INT2FIX(0)); + first_chunk = false; + } + else { + FLUSH_CHUNK; + } - rb_iseq_t *method_iseq = NEW_ISEQ(&next_scope_node, rb_id2str(method_name), ISEQ_TYPE_METHOD, location.line); - pm_scope_node_destroy(&next_scope_node); + // If we get here, then this is the last element of the + // array/arguments, because it cannot be followed by + // anything else without a syntax error. This looks like: + // + // [foo, bar, baz: qux] + // ^^^^^^^^ + // + // [foo, bar, **baz] + // ^^^^^ + // + const pm_keyword_hash_node_t *keyword_hash = (const pm_keyword_hash_node_t *) element; + pm_compile_hash_elements(iseq, element, &keyword_hash->elements, false, ret, scope_node); - if (cast->receiver) { - PM_COMPILE_NOT_POPPED(cast->receiver); - PUSH_INSN2(ret, location, definesmethod, ID2SYM(method_name), method_iseq); - } - else { - PUSH_INSN2(ret, location, definemethod, ID2SYM(method_name), method_iseq); - } - RB_OBJ_WRITTEN(iseq, Qundef, (VALUE) method_iseq); + // This boolean controls the manner in which we push the + // hash onto the array. If it's all keyword splats, then we + // can use the very specialized pushtoarraykwsplat + // instruction to check if it's empty before we push it. + size_t splats = 0; + while (splats < keyword_hash->elements.size && PM_NODE_TYPE_P(keyword_hash->elements.nodes[splats], PM_ASSOC_SPLAT_NODE)) splats++; - if (!popped) { - PUSH_INSN1(ret, location, putobject, ID2SYM(method_name)); + if (keyword_hash->elements.size == splats) { + PUSH_INSN(ret, location, pushtoarraykwsplat); + } + else { + new_array_size++; + } + } + else if ( + PM_NODE_FLAG_P(element, PM_NODE_FLAG_STATIC_LITERAL) && + !PM_CONTAINER_P(element) && + !static_literal && + ((index + min_tmp_array_size) < elements->size) + ) { + // If we have a static literal, then there's the potential + // to group a bunch of them together with a literal array + // and then concat them together. + size_t right_index = index + 1; + while ( + right_index < elements->size && + PM_NODE_FLAG_P(elements->nodes[right_index], PM_NODE_FLAG_STATIC_LITERAL) && + !PM_CONTAINER_P(elements->nodes[right_index]) + ) right_index++; + + size_t tmp_array_size = right_index - index; + if (tmp_array_size >= min_tmp_array_size) { + VALUE tmp_array = rb_ary_hidden_new(tmp_array_size); + + // Create the temporary array. + for (; tmp_array_size; tmp_array_size--) + rb_ary_push(tmp_array, pm_static_literal_value(iseq, elements->nodes[index++], scope_node)); + OBJ_FREEZE(tmp_array); + + // Emit the optimized code. + FLUSH_CHUNK; + if (first_chunk) { + PUSH_INSN1(ret, location, duparray, tmp_array); + first_chunk = false; + } + else { + PUSH_INSN1(ret, location, putobject, tmp_array); + PUSH_INSN(ret, location, concattoarray); + } + } + else { + PM_COMPILE_NOT_POPPED(element); + if (++new_array_size >= max_new_array_size) FLUSH_CHUNK; + static_literal = true; + } + } else { + PM_COMPILE_NOT_POPPED(element); + if (++new_array_size >= max_new_array_size) FLUSH_CHUNK; + static_literal = false; + } + } + + FLUSH_CHUNK; + if (popped) PUSH_INSN(ret, location, pop); } +#undef FLUSH_CHUNK return; } - case PM_DEFINED_NODE: { - // defined?(a) - // ^^^^^^^^^^^ - const pm_defined_node_t *cast = (const pm_defined_node_t *) node; - pm_compile_defined_expr(iseq, cast->value, &location, ret, popped, scope_node, false); + case PM_ASSOC_NODE: { + // { foo: 1 } + // ^^^^^^ + // + // foo(bar: 1) + // ^^^^^^ + const pm_assoc_node_t *cast = (const pm_assoc_node_t *) node; + + PM_COMPILE(cast->key); + PM_COMPILE(cast->value); + return; } - case PM_EMBEDDED_STATEMENTS_NODE: { - // "foo #{bar}" - // ^^^^^^ - const pm_embedded_statements_node_t *cast = (const pm_embedded_statements_node_t *) node; + case PM_ASSOC_SPLAT_NODE: { + // { **foo } + // ^^^^^ + // + // def foo(**); bar(**); end + // ^^ + const pm_assoc_splat_node_t *cast = (const pm_assoc_splat_node_t *) node; - if (cast->statements != NULL) { - PM_COMPILE((const pm_node_t *) (cast->statements)); + if (cast->value != NULL) { + PM_COMPILE(cast->value); } - else { - PUSH_SYNTHETIC_PUTNIL(ret, iseq); + else if (!popped) { + pm_local_index_t index = pm_lookup_local_index(iseq, scope_node, PM_CONSTANT_POW, 0); + PUSH_GETLOCAL(ret, location, index.index, index.level); } - if (popped) PUSH_INSN(ret, location, pop); - return; - } - case PM_EMBEDDED_VARIABLE_NODE: { - // "foo #@bar" - // ^^^^^ - const pm_embedded_variable_node_t *cast = (const pm_embedded_variable_node_t *) node; - PM_COMPILE(cast->variable); return; } - case PM_FALSE_NODE: { - // false - // ^^^^^ + case PM_BACK_REFERENCE_READ_NODE: { + // $+ + // ^^ if (!popped) { - PUSH_INSN1(ret, location, putobject, Qfalse); + // Since a back reference is `$`, ruby represents the ID as the + // an rb_intern on the value after the `$`. + char *char_ptr = (char *)(node->location.start) + 1; + ID backref_val = INT2FIX(rb_intern2(char_ptr, 1)) << 1 | 1; + PUSH_INSN2(ret, location, getspecial, INT2FIX(1), backref_val); } return; } - case PM_ENSURE_NODE: { - const pm_ensure_node_t *cast = (const pm_ensure_node_t *) node; - - if (cast->statements != NULL) { - LABEL *start = NEW_LABEL(location.line); - LABEL *end = NEW_LABEL(location.line); - PUSH_LABEL(ret, start); - - LABEL *prev_end_label = ISEQ_COMPILE_DATA(iseq)->end_label; - ISEQ_COMPILE_DATA(iseq)->end_label = end; + case PM_BEGIN_NODE: { + // begin end + // ^^^^^^^^^ + const pm_begin_node_t *cast = (const pm_begin_node_t *) node; - PM_COMPILE((const pm_node_t *) cast->statements); - ISEQ_COMPILE_DATA(iseq)->end_label = prev_end_label; - PUSH_LABEL(ret, end); + if (cast->ensure_clause) { + // Compiling the ensure clause will compile the rescue clause (if + // there is one), which will compile the begin statements. + pm_compile_ensure(iseq, cast, &location, ret, popped, scope_node); + } + else if (cast->rescue_clause) { + // Compiling rescue will compile begin statements (if applicable). + pm_compile_rescue(iseq, cast, &location, ret, popped, scope_node); + } + else { + // If there is neither ensure or rescue, the just compile the + // statements. + if (cast->statements != NULL) { + PM_COMPILE((const pm_node_t *) cast->statements); + } + else if (!popped) { + PUSH_SYNTHETIC_PUTNIL(ret, iseq); + } } - return; } - case PM_ELSE_NODE: { - // if foo then bar else baz end - // ^^^^^^^^^^^^ - const pm_else_node_t *cast = (const pm_else_node_t *) node; + case PM_BLOCK_ARGUMENT_NODE: { + // foo(&bar) + // ^^^^ + const pm_block_argument_node_t *cast = (const pm_block_argument_node_t *) node; - if (cast->statements != NULL) { - PM_COMPILE((const pm_node_t *) cast->statements); + if (cast->expression != NULL) { + PM_COMPILE(cast->expression); } - else if (!popped) { - PUSH_SYNTHETIC_PUTNIL(ret, iseq); + else { + // If there's no expression, this must be block forwarding. + pm_local_index_t local_index = pm_lookup_local_index(iseq, scope_node, PM_CONSTANT_AND, 0); + PUSH_INSN2(ret, location, getblockparamproxy, INT2FIX(local_index.index + VM_ENV_DATA_SIZE - 1), INT2FIX(local_index.level)); } - return; } - case PM_FLIP_FLOP_NODE: { - // if foo .. bar; end - // ^^^^^^^^^^ - const pm_flip_flop_node_t *cast = (const pm_flip_flop_node_t *) node; - - LABEL *final_label = NEW_LABEL(location.line); - LABEL *then_label = NEW_LABEL(location.line); - LABEL *else_label = NEW_LABEL(location.line); + case PM_BREAK_NODE: { + // break + // ^^^^^ + // + // break foo + // ^^^^^^^^^ + const pm_break_node_t *cast = (const pm_break_node_t *) node; + unsigned long throw_flag = 0; - pm_compile_flip_flop(cast, else_label, then_label, iseq, location.line, ret, popped, scope_node); + if (ISEQ_COMPILE_DATA(iseq)->redo_label != 0 && can_add_ensure_iseq(iseq)) { + /* while/until */ + LABEL *splabel = NEW_LABEL(0); + PUSH_LABEL(ret, splabel); + PUSH_ADJUST(ret, location, ISEQ_COMPILE_DATA(iseq)->redo_label); - PUSH_LABEL(ret, then_label); - PUSH_INSN1(ret, location, putobject, Qtrue); - PUSH_INSNL(ret, location, jump, final_label); - PUSH_LABEL(ret, else_label); - PUSH_INSN1(ret, location, putobject, Qfalse); - PUSH_LABEL(ret, final_label); + if (cast->arguments != NULL) { + PM_COMPILE_NOT_POPPED((const pm_node_t *) cast->arguments); + } + else { + PUSH_INSN(ret, location, putnil); + } - return; - } - case PM_FLOAT_NODE: { - // 1.0 - // ^^^ - if (!popped) { - PUSH_INSN1(ret, location, putobject, parse_float((const pm_float_node_t *) node)); + pm_add_ensure_iseq(ret, iseq, 0, scope_node); + PUSH_INSNL(ret, location, jump, ISEQ_COMPILE_DATA(iseq)->end_label); + PUSH_ADJUST_RESTORE(ret, splabel); + if (!popped) PUSH_INSN(ret, location, putnil); } - return; - } - case PM_FOR_NODE: { - // for foo in bar do end - // ^^^^^^^^^^^^^^^^^^^^^ - const pm_for_node_t *cast = (const pm_for_node_t *) node; - - LABEL *retry_label = NEW_LABEL(location.line); - LABEL *retry_end_l = NEW_LABEL(location.line); + else { + const rb_iseq_t *ip = iseq; - // First, compile the collection that we're going to be iterating over. - PUSH_LABEL(ret, retry_label); - PM_COMPILE_NOT_POPPED(cast->collection); + while (ip) { + if (!ISEQ_COMPILE_DATA(ip)) { + ip = 0; + break; + } - // Next, create the new scope that is going to contain the block that - // will be passed to the each method. - pm_scope_node_t next_scope_node; - pm_scope_node_init((const pm_node_t *) cast, &next_scope_node, scope_node); + if (ISEQ_COMPILE_DATA(ip)->redo_label != 0) { + throw_flag = VM_THROW_NO_ESCAPE_FLAG; + } + else if (ISEQ_BODY(ip)->type == ISEQ_TYPE_BLOCK) { + throw_flag = 0; + } + else if (ISEQ_BODY(ip)->type == ISEQ_TYPE_EVAL) { + COMPILE_ERROR(iseq, location.line, "Can't escape from eval with break"); + return; + } + else { + ip = ISEQ_BODY(ip)->parent_iseq; + continue; + } - const rb_iseq_t *child_iseq = NEW_CHILD_ISEQ(&next_scope_node, make_name_for_block(iseq), ISEQ_TYPE_BLOCK, location.line); - pm_scope_node_destroy(&next_scope_node); + /* escape from block */ + if (cast->arguments != NULL) { + PM_COMPILE_NOT_POPPED((const pm_node_t *) cast->arguments); + } + else { + PUSH_INSN(ret, location, putnil); + } - const rb_iseq_t *prev_block = ISEQ_COMPILE_DATA(iseq)->current_block; - ISEQ_COMPILE_DATA(iseq)->current_block = child_iseq; + PUSH_INSN1(ret, location, throw, INT2FIX(throw_flag | TAG_BREAK)); + if (popped) PUSH_INSN(ret, location, pop); - // Now, create the method call to each that will be used to iterate over - // the collection, and pass the newly created iseq as the block. - PUSH_SEND_WITH_BLOCK(ret, location, idEach, INT2FIX(0), child_iseq); - pm_compile_retry_end_label(iseq, ret, retry_end_l); + return; + } - if (popped) PUSH_INSN(ret, location, pop); - ISEQ_COMPILE_DATA(iseq)->current_block = prev_block; - PUSH_CATCH_ENTRY(CATCH_TYPE_BREAK, retry_label, retry_end_l, child_iseq, retry_end_l); - return; - } - case PM_FORWARDING_ARGUMENTS_NODE: { - rb_bug("Cannot compile a ForwardingArgumentsNode directly\n"); + COMPILE_ERROR(iseq, location.line, "Invalid break"); + } return; } - case PM_FORWARDING_SUPER_NODE: { - // super - // ^^^^^ + case PM_CALL_NODE: { + // foo + // ^^^ // - // super {} - // ^^^^^^^^ - const pm_forwarding_super_node_t *cast = (const pm_forwarding_super_node_t *) node; - const rb_iseq_t *block = NULL; - - const rb_iseq_t *previous_block = NULL; - LABEL *retry_label = NULL; - LABEL *retry_end_l = NULL; - - if (cast->block != NULL) { - previous_block = ISEQ_COMPILE_DATA(iseq)->current_block; - ISEQ_COMPILE_DATA(iseq)->current_block = NULL; + // foo.bar + // ^^^^^^^ + // + // foo.bar() {} + // ^^^^^^^^^^^^ + const pm_call_node_t *cast = (const pm_call_node_t *) node; + ID method_id = pm_constant_id_lookup(scope_node, cast->name); - retry_label = NEW_LABEL(location.line); - retry_end_l = NEW_LABEL(location.line); + const pm_location_t *message_loc = &cast->message_loc; + if (message_loc->start == NULL) message_loc = &cast->base.location; - PUSH_LABEL(ret, retry_label); - } - else { - iseq_set_use_block(ISEQ_BODY(iseq)->local_iseq); + const pm_node_location_t location = PM_LOCATION_START_LOCATION(scope_node->parser, message_loc, cast->base.node_id); + const char *builtin_func; + + if (UNLIKELY(iseq_has_builtin_function_table(iseq)) && (builtin_func = pm_iseq_builtin_function_name(scope_node, cast->receiver, method_id)) != NULL) { + pm_compile_builtin_function_call(iseq, ret, scope_node, cast, &location, popped, ISEQ_COMPILE_DATA(iseq)->current_block, builtin_func); + return; } - PUSH_INSN(ret, location, putself); - int flag = VM_CALL_ZSUPER | VM_CALL_SUPER | VM_CALL_FCALL; + LABEL *start = NEW_LABEL(location.line); + if (cast->block) PUSH_LABEL(ret, start); - if (cast->block != NULL) { - pm_scope_node_t next_scope_node; - pm_scope_node_init((const pm_node_t *) cast->block, &next_scope_node, scope_node); + switch (method_id) { + case idUMinus: { + if (pm_opt_str_freeze_p(iseq, cast)) { + VALUE value = parse_static_literal_string(iseq, scope_node, cast->receiver, &((const pm_string_node_t * ) cast->receiver)->unescaped); + PUSH_INSN2(ret, location, opt_str_uminus, value, new_callinfo(iseq, idUMinus, 0, 0, NULL, FALSE)); + return; + } + break; + } + case idFreeze: { + if (pm_opt_str_freeze_p(iseq, cast)) { + VALUE value = parse_static_literal_string(iseq, scope_node, cast->receiver, &((const pm_string_node_t * ) cast->receiver)->unescaped); + PUSH_INSN2(ret, location, opt_str_freeze, value, new_callinfo(iseq, idFreeze, 0, 0, NULL, FALSE)); + return; + } + break; + } + case idAREF: { + if (pm_opt_aref_with_p(iseq, cast)) { + const pm_string_node_t *string = (const pm_string_node_t *) ((const pm_arguments_node_t *) cast->arguments)->arguments.nodes[0]; + VALUE value = parse_static_literal_string(iseq, scope_node, (const pm_node_t *) string, &string->unescaped); - ISEQ_COMPILE_DATA(iseq)->current_block = block = NEW_CHILD_ISEQ(&next_scope_node, make_name_for_block(iseq), ISEQ_TYPE_BLOCK, location.line); - pm_scope_node_destroy(&next_scope_node); - RB_OBJ_WRITTEN(iseq, Qundef, (VALUE) block); - } + PM_COMPILE_NOT_POPPED(cast->receiver); + PUSH_INSN2(ret, location, opt_aref_with, value, new_callinfo(iseq, idAREF, 1, 0, NULL, FALSE)); - DECL_ANCHOR(args); - INIT_ANCHOR(args); + if (popped) { + PUSH_INSN(ret, location, pop); + } - struct rb_iseq_constant_body *const body = ISEQ_BODY(iseq); - const rb_iseq_t *local_iseq = body->local_iseq; - const struct rb_iseq_constant_body *const local_body = ISEQ_BODY(local_iseq); + return; + } + break; + } + case idASET: { + if (pm_opt_aset_with_p(iseq, cast)) { + const pm_string_node_t *string = (const pm_string_node_t *) ((const pm_arguments_node_t *) cast->arguments)->arguments.nodes[0]; + VALUE value = parse_static_literal_string(iseq, scope_node, (const pm_node_t *) string, &string->unescaped); - int argc = 0; - int depth = get_lvar_level(iseq); + PM_COMPILE_NOT_POPPED(cast->receiver); + PM_COMPILE_NOT_POPPED(((const pm_arguments_node_t *) cast->arguments)->arguments.nodes[1]); - if (ISEQ_BODY(ISEQ_BODY(iseq)->local_iseq)->param.flags.forwardable) { - flag |= VM_CALL_FORWARDING; - pm_local_index_t mult_local = pm_lookup_local_index(iseq, scope_node, PM_CONSTANT_DOT3, 0); - PUSH_GETLOCAL(ret, location, mult_local.index, mult_local.level); - PUSH_INSN2(ret, location, invokesuperforward, new_callinfo(iseq, 0, 0, flag, NULL, block != NULL), block); - if (popped) PUSH_INSN(ret, location, pop); - return; - } + if (!popped) { + PUSH_INSN(ret, location, swap); + PUSH_INSN1(ret, location, topn, INT2FIX(1)); + } - if (local_body->param.flags.has_lead) { - /* required arguments */ - for (int i = 0; i < local_body->param.lead_num; i++) { - int idx = local_body->local_table_size - i; - PUSH_GETLOCAL(args, location, idx, depth); + PUSH_INSN2(ret, location, opt_aset_with, value, new_callinfo(iseq, idASET, 2, 0, NULL, FALSE)); + PUSH_INSN(ret, location, pop); + return; } - argc += local_body->param.lead_num; + break; + } } - if (local_body->param.flags.has_opt) { - /* optional arguments */ - for (int j = 0; j < local_body->param.opt_num; j++) { - int idx = local_body->local_table_size - (argc + j); - PUSH_GETLOCAL(args, location, idx, depth); - } - argc += local_body->param.opt_num; + if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_ATTRIBUTE_WRITE) && !popped) { + PUSH_INSN(ret, location, putnil); } - if (local_body->param.flags.has_rest) { - /* rest argument */ - int idx = local_body->local_table_size - local_body->param.rest_start; - PUSH_GETLOCAL(args, location, idx, depth); - PUSH_INSN1(args, location, splatarray, Qfalse); + if (cast->receiver == NULL) { + PUSH_INSN(ret, location, putself); + } + else { + if (method_id == idCall && PM_NODE_TYPE_P(cast->receiver, PM_LOCAL_VARIABLE_READ_NODE)) { + const pm_local_variable_read_node_t *read_node_cast = (const pm_local_variable_read_node_t *) cast->receiver; + uint32_t node_id = cast->receiver->node_id; + int idx, level; - argc = local_body->param.rest_start + 1; - flag |= VM_CALL_ARGS_SPLAT; + if (iseq_block_param_id_p(iseq, pm_constant_id_lookup(scope_node, read_node_cast->name), &idx, &level)) { + ADD_ELEM(ret, (LINK_ELEMENT *) new_insn_body(iseq, location.line, node_id, BIN(getblockparamproxy), 2, INT2FIX((idx) + VM_ENV_DATA_SIZE - 1), INT2FIX(level))); + } + else { + PM_COMPILE_NOT_POPPED(cast->receiver); + } + } + else { + PM_COMPILE_NOT_POPPED(cast->receiver); + } } - if (local_body->param.flags.has_post) { - /* post arguments */ - int post_len = local_body->param.post_num; - int post_start = local_body->param.post_start; + pm_compile_call(iseq, cast, ret, popped, scope_node, method_id, start); + return; + } + case PM_CALL_AND_WRITE_NODE: { + // foo.bar &&= baz + // ^^^^^^^^^^^^^^^ + const pm_call_and_write_node_t *cast = (const pm_call_and_write_node_t *) node; + pm_compile_call_and_or_write_node(iseq, true, cast->receiver, cast->value, cast->write_name, cast->read_name, PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_SAFE_NAVIGATION), &location, ret, popped, scope_node); + return; + } + case PM_CALL_OR_WRITE_NODE: { + // foo.bar ||= baz + // ^^^^^^^^^^^^^^^ + const pm_call_or_write_node_t *cast = (const pm_call_or_write_node_t *) node; + pm_compile_call_and_or_write_node(iseq, false, cast->receiver, cast->value, cast->write_name, cast->read_name, PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_SAFE_NAVIGATION), &location, ret, popped, scope_node); + return; + } + case PM_CALL_OPERATOR_WRITE_NODE: { + // foo.bar += baz + // ^^^^^^^^^^^^^^^ + // + // Call operator writes occur when you have a call node on the left-hand + // side of a write operator that is not `=`. As an example, + // `foo.bar *= 1`. This breaks down to caching the receiver on the + // stack and then performing three method calls, one to read the value, + // one to compute the result, and one to write the result back to the + // receiver. + const pm_call_operator_write_node_t *cast = (const pm_call_operator_write_node_t *) node; + int flag = 0; - int j = 0; - for (; j < post_len; j++) { - int idx = local_body->local_table_size - (post_start + j); - PUSH_GETLOCAL(args, location, idx, depth); - } + if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_IGNORE_VISIBILITY)) { + flag = VM_CALL_FCALL; + } - if (local_body->param.flags.has_rest) { - // argc remains unchanged from rest branch - PUSH_INSN1(args, location, newarray, INT2FIX(j)); - PUSH_INSN(args, location, concatarray); - } - else { - argc = post_len + post_start; - } + PM_COMPILE_NOT_POPPED(cast->receiver); + + LABEL *safe_label = NULL; + if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_SAFE_NAVIGATION)) { + safe_label = NEW_LABEL(location.line); + PUSH_INSN(ret, location, dup); + PUSH_INSNL(ret, location, branchnil, safe_label); } - const struct rb_iseq_param_keyword *const local_keyword = local_body->param.keyword; - if (local_body->param.flags.has_kw) { - int local_size = local_body->local_table_size; - argc++; + PUSH_INSN(ret, location, dup); - PUSH_INSN1(args, location, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); + ID id_read_name = pm_constant_id_lookup(scope_node, cast->read_name); + PUSH_SEND_WITH_FLAG(ret, location, id_read_name, INT2FIX(0), INT2FIX(flag)); - if (local_body->param.flags.has_kwrest) { - int idx = local_body->local_table_size - local_keyword->rest_start; - PUSH_GETLOCAL(args, location, idx, depth); - RUBY_ASSERT(local_keyword->num > 0); - PUSH_SEND(args, location, rb_intern("dup"), INT2FIX(0)); - } - else { - PUSH_INSN1(args, location, newhash, INT2FIX(0)); - } - int i = 0; - for (; i < local_keyword->num; ++i) { - ID id = local_keyword->table[i]; - int idx = local_size - get_local_var_idx(local_iseq, id); - PUSH_INSN1(args, location, putobject, ID2SYM(id)); - PUSH_GETLOCAL(args, location, idx, depth); - } + PM_COMPILE_NOT_POPPED(cast->value); + ID id_operator = pm_constant_id_lookup(scope_node, cast->binary_operator); + PUSH_SEND(ret, location, id_operator, INT2FIX(1)); - PUSH_SEND(args, location, id_core_hash_merge_ptr, INT2FIX(i * 2 + 1)); - flag |= VM_CALL_KW_SPLAT| VM_CALL_KW_SPLAT_MUT; - } - else if (local_body->param.flags.has_kwrest) { - int idx = local_body->local_table_size - local_keyword->rest_start; - PUSH_GETLOCAL(args, location, idx, depth); - argc++; - flag |= VM_CALL_KW_SPLAT; + if (!popped) { + PUSH_INSN(ret, location, swap); + PUSH_INSN1(ret, location, topn, INT2FIX(1)); } - PUSH_SEQ(ret, args); - PUSH_INSN2(ret, location, invokesuper, new_callinfo(iseq, 0, argc, flag, NULL, block != NULL), block); + ID id_write_name = pm_constant_id_lookup(scope_node, cast->write_name); + PUSH_SEND_WITH_FLAG(ret, location, id_write_name, INT2FIX(1), INT2FIX(flag)); - if (cast->block != NULL) { - pm_compile_retry_end_label(iseq, ret, retry_end_l); - PUSH_CATCH_ENTRY(CATCH_TYPE_BREAK, retry_label, retry_end_l, block, retry_end_l); - ISEQ_COMPILE_DATA(iseq)->current_block = previous_block; - } + if (safe_label != NULL && popped) PUSH_LABEL(ret, safe_label); + PUSH_INSN(ret, location, pop); + if (safe_label != NULL && !popped) PUSH_LABEL(ret, safe_label); - if (popped) PUSH_INSN(ret, location, pop); return; } - case PM_GLOBAL_VARIABLE_AND_WRITE_NODE: { - // $foo &&= bar - // ^^^^^^^^^^^^ - const pm_global_variable_and_write_node_t *cast = (const pm_global_variable_and_write_node_t *) node; - LABEL *end_label = NEW_LABEL(location.line); - - VALUE name = ID2SYM(pm_constant_id_lookup(scope_node, cast->name)); - PUSH_INSN1(ret, location, getglobal, name); - if (!popped) PUSH_INSN(ret, location, dup); + case PM_CASE_NODE: + // case foo; when bar; end + // ^^^^^^^^^^^^^^^^^^^^^^^ + pm_compile_case_node(iseq, (const pm_case_node_t *) node, &location, ret, popped, scope_node); + return; + case PM_CASE_MATCH_NODE: { + // case foo; in bar; end + // ^^^^^^^^^^^^^^^^^^^^^ + // + // If you use the `case` keyword to create a case match node, it will + // match against all of the `in` clauses until it finds one that + // matches. If it doesn't find one, it can optionally fall back to an + // `else` clause. If none is present and a match wasn't found, it will + // raise an appropriate error. + const pm_case_match_node_t *cast = (const pm_case_match_node_t *) node; - PUSH_INSNL(ret, location, branchunless, end_label); - if (!popped) PUSH_INSN(ret, location, pop); + // This is the anchor that we will compile the bodies of the various + // `in` nodes into. We'll make sure that the patterns that are compiled + // jump into the correct spots within this anchor. + DECL_ANCHOR(body_seq); + INIT_ANCHOR(body_seq); - PM_COMPILE_NOT_POPPED(cast->value); - if (!popped) PUSH_INSN(ret, location, dup); + // This is the anchor that we will compile the patterns of the various + // `in` nodes into. If a match is found, they will need to jump into the + // body_seq anchor to the correct spot. + DECL_ANCHOR(cond_seq); + INIT_ANCHOR(cond_seq); - PUSH_INSN1(ret, location, setglobal, name); - PUSH_LABEL(ret, end_label); + // This label is used to indicate the end of the entire node. It is + // jumped to after the entire stack is cleaned up. + LABEL *end_label = NEW_LABEL(location.line); - return; - } - case PM_GLOBAL_VARIABLE_OPERATOR_WRITE_NODE: { - // $foo += bar - // ^^^^^^^^^^^ - const pm_global_variable_operator_write_node_t *cast = (const pm_global_variable_operator_write_node_t *) node; + // This label is used as the fallback for the case match. If no match is + // found, then we jump to this label. This is either an `else` clause or + // an error handler. + LABEL *else_label = NEW_LABEL(location.line); - VALUE name = ID2SYM(pm_constant_id_lookup(scope_node, cast->name)); - PUSH_INSN1(ret, location, getglobal, name); - PM_COMPILE_NOT_POPPED(cast->value); + // We're going to use this to uniquely identify each branch so that we + // can track coverage information. + rb_code_location_t case_location = { 0 }; + VALUE branches = Qfalse; + int branch_id = 0; - ID method_id = pm_constant_id_lookup(scope_node, cast->binary_operator); - int flags = VM_CALL_ARGS_SIMPLE; - PUSH_SEND_WITH_FLAG(ret, location, method_id, INT2NUM(1), INT2FIX(flags)); + if (PM_BRANCH_COVERAGE_P(iseq)) { + case_location = pm_code_location(scope_node, (const pm_node_t *) cast); + branches = decl_branch_base(iseq, PTR2NUM(cast), &case_location, "case"); + } - if (!popped) PUSH_INSN(ret, location, dup); - PUSH_INSN1(ret, location, setglobal, name); + // If there is only one pattern, then the behavior changes a bit. It + // effectively gets treated as a match required node (this is how it is + // represented in the other parser). + bool in_single_pattern = cast->else_clause == NULL && cast->conditions.size == 1; - return; - } - case PM_GLOBAL_VARIABLE_OR_WRITE_NODE: { - // $foo ||= bar - // ^^^^^^^^^^^^ - const pm_global_variable_or_write_node_t *cast = (const pm_global_variable_or_write_node_t *) node; - LABEL *set_label = NEW_LABEL(location.line); - LABEL *end_label = NEW_LABEL(location.line); + // First, we're going to push a bunch of stuff onto the stack that is + // going to serve as our scratch space. + if (in_single_pattern) { + PUSH_INSN(ret, location, putnil); // key error key + PUSH_INSN(ret, location, putnil); // key error matchee + PUSH_INSN1(ret, location, putobject, Qfalse); // key error? + PUSH_INSN(ret, location, putnil); // error string + } - PUSH_INSN(ret, location, putnil); - VALUE name = ID2SYM(pm_constant_id_lookup(scope_node, cast->name)); + // Now we're going to compile the value to match against. + PUSH_INSN(ret, location, putnil); // deconstruct cache + PM_COMPILE_NOT_POPPED(cast->predicate); - PUSH_INSN3(ret, location, defined, INT2FIX(DEFINED_GVAR), name, Qtrue); - PUSH_INSNL(ret, location, branchunless, set_label); + // Next, we'll loop through every in clause and compile its body into + // the body_seq anchor and its pattern into the cond_seq anchor. We'll + // make sure the pattern knows how to jump correctly into the body if it + // finds a match. + for (size_t index = 0; index < cast->conditions.size; index++) { + const pm_node_t *condition = cast->conditions.nodes[index]; + RUBY_ASSERT(PM_NODE_TYPE_P(condition, PM_IN_NODE)); - PUSH_INSN1(ret, location, getglobal, name); - if (!popped) PUSH_INSN(ret, location, dup); + const pm_in_node_t *in_node = (const pm_in_node_t *) condition; + const pm_node_location_t in_location = PM_NODE_START_LOCATION(parser, in_node); + const pm_node_location_t pattern_location = PM_NODE_START_LOCATION(parser, in_node->pattern); - PUSH_INSNL(ret, location, branchif, end_label); - if (!popped) PUSH_INSN(ret, location, pop); + if (branch_id) { + PUSH_INSN(body_seq, in_location, putnil); + } - PUSH_LABEL(ret, set_label); - PM_COMPILE_NOT_POPPED(cast->value); - if (!popped) PUSH_INSN(ret, location, dup); + LABEL *body_label = NEW_LABEL(in_location.line); + PUSH_LABEL(body_seq, body_label); + PUSH_INSN1(body_seq, in_location, adjuststack, INT2FIX(in_single_pattern ? 6 : 2)); - PUSH_INSN1(ret, location, setglobal, name); - PUSH_LABEL(ret, end_label); + // Establish branch coverage for the in clause. + if (PM_BRANCH_COVERAGE_P(iseq)) { + rb_code_location_t branch_location = pm_code_location(scope_node, in_node->statements != NULL ? ((const pm_node_t *) in_node->statements) : ((const pm_node_t *) in_node)); + add_trace_branch_coverage(iseq, body_seq, &branch_location, branch_location.beg_pos.column, branch_id++, "in", branches); + } - return; - } - case PM_GLOBAL_VARIABLE_READ_NODE: { - // $foo - // ^^^^ - const pm_global_variable_read_node_t *cast = (const pm_global_variable_read_node_t *) node; - VALUE name = ID2SYM(pm_constant_id_lookup(scope_node, cast->name)); + if (in_node->statements != NULL) { + PM_COMPILE_INTO_ANCHOR(body_seq, (const pm_node_t *) in_node->statements); + } + else if (!popped) { + PUSH_SYNTHETIC_PUTNIL(body_seq, iseq); + } - PUSH_INSN1(ret, location, getglobal, name); - if (popped) PUSH_INSN(ret, location, pop); + PUSH_INSNL(body_seq, in_location, jump, end_label); + LABEL *next_pattern_label = NEW_LABEL(pattern_location.line); - return; - } - case PM_GLOBAL_VARIABLE_WRITE_NODE: { - // $foo = 1 - // ^^^^^^^^ - const pm_global_variable_write_node_t *cast = (const pm_global_variable_write_node_t *) node; - PM_COMPILE_NOT_POPPED(cast->value); - if (!popped) PUSH_INSN(ret, location, dup); + PUSH_INSN(cond_seq, pattern_location, dup); + pm_compile_pattern(iseq, scope_node, in_node->pattern, cond_seq, body_label, next_pattern_label, in_single_pattern, false, true, 2); + PUSH_LABEL(cond_seq, next_pattern_label); + LABEL_UNREMOVABLE(next_pattern_label); + } - ID name = pm_constant_id_lookup(scope_node, cast->name); - PUSH_INSN1(ret, location, setglobal, ID2SYM(name)); + if (cast->else_clause != NULL) { + // If we have an `else` clause, then this becomes our fallback (and + // there is no need to compile in code to potentially raise an + // error). + const pm_else_node_t *else_node = cast->else_clause; - return; - } - case PM_HASH_NODE: { - // {} - // ^^ - // - // If every node in the hash is static, then we can compile the entire - // hash now instead of later. - if (PM_NODE_FLAG_P(node, PM_NODE_FLAG_STATIC_LITERAL)) { - // We're only going to compile this node if it's not popped. If it - // is popped, then we know we don't need to do anything since it's - // statically known. - if (!popped) { - const pm_hash_node_t *cast = (const pm_hash_node_t *) node; + PUSH_LABEL(cond_seq, else_label); + PUSH_INSN(cond_seq, location, pop); + PUSH_INSN(cond_seq, location, pop); - if (cast->elements.size == 0) { - PUSH_INSN1(ret, location, newhash, INT2FIX(0)); - } - else { - VALUE value = pm_static_literal_value(iseq, node, scope_node); - PUSH_INSN1(ret, location, duphash, value); - RB_OBJ_WRITTEN(iseq, Qundef, value); - } + // Establish branch coverage for the else clause. + if (PM_BRANCH_COVERAGE_P(iseq)) { + rb_code_location_t branch_location = pm_code_location(scope_node, else_node->statements != NULL ? ((const pm_node_t *) else_node->statements) : ((const pm_node_t *) else_node)); + add_trace_branch_coverage(iseq, cond_seq, &branch_location, branch_location.beg_pos.column, branch_id, "else", branches); } + + PM_COMPILE_INTO_ANCHOR(cond_seq, (const pm_node_t *) else_node); + PUSH_INSNL(cond_seq, location, jump, end_label); + PUSH_INSN(cond_seq, location, putnil); + if (popped) PUSH_INSN(cond_seq, location, putnil); } else { - // Here since we know there are possible side-effects inside the - // hash contents, we're going to build it entirely at runtime. We'll - // do this by pushing all of the key-value pairs onto the stack and - // then combining them with newhash. - // - // If this hash is popped, then this serves only to ensure we enact - // all side-effects (like method calls) that are contained within - // the hash contents. - const pm_hash_node_t *cast = (const pm_hash_node_t *) node; - const pm_node_list_t *elements = &cast->elements; + // Otherwise, if we do not have an `else` clause, we will compile in + // the code to handle raising an appropriate error. + PUSH_LABEL(cond_seq, else_label); - if (popped) { - // If this hash is popped, then we can iterate through each - // element and compile it. The result of each compilation will - // only include the side effects of the element itself. - for (size_t index = 0; index < elements->size; index++) { - PM_COMPILE_POPPED(elements->nodes[index]); - } + // Establish branch coverage for the implicit else clause. + add_trace_branch_coverage(iseq, cond_seq, &case_location, case_location.beg_pos.column, branch_id, "else", branches); + + if (in_single_pattern) { + pm_compile_pattern_error_handler(iseq, scope_node, node, cond_seq, end_label, popped); } else { - pm_compile_hash_elements(iseq, node, elements, false, ret, scope_node); - } - } + PUSH_INSN1(cond_seq, location, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); + PUSH_INSN1(cond_seq, location, putobject, rb_eNoMatchingPatternError); + PUSH_INSN1(cond_seq, location, topn, INT2FIX(2)); + PUSH_SEND(cond_seq, location, id_core_raise, INT2FIX(2)); + + PUSH_INSN1(cond_seq, location, adjuststack, INT2FIX(3)); + if (!popped) PUSH_INSN(cond_seq, location, putnil); + PUSH_INSNL(cond_seq, location, jump, end_label); + PUSH_INSN1(cond_seq, location, dupn, INT2FIX(1)); + if (popped) PUSH_INSN(cond_seq, location, putnil); + } + } + + // At the end of all of this compilation, we will add the code for the + // conditions first, then the various bodies, then mark the end of the + // entire sequence with the end label. + PUSH_SEQ(ret, cond_seq); + PUSH_SEQ(ret, body_seq); + PUSH_LABEL(ret, end_label); return; } - case PM_IF_NODE: { - // if foo then bar end - // ^^^^^^^^^^^^^^^^^^^ - // - // bar if foo - // ^^^^^^^^^^ - // - // foo ? bar : baz - // ^^^^^^^^^^^^^^^ - const pm_if_node_t *cast = (const pm_if_node_t *) node; - pm_compile_conditional(iseq, &location, PM_IF_NODE, (const pm_node_t *) cast, cast->statements, cast->subsequent, cast->predicate, ret, popped, scope_node); - return; - } - case PM_IMAGINARY_NODE: { - // 1i - // ^^ - if (!popped) { - PUSH_INSN1(ret, location, putobject, parse_imaginary((const pm_imaginary_node_t *) node)); - } - return; - } - case PM_IMPLICIT_NODE: { - // Implicit nodes mark places in the syntax tree where explicit syntax - // was omitted, but implied. For example, - // - // { foo: } - // - // In this case a method call/local variable read is implied by virtue - // of the missing value. To compile these nodes, we simply compile the - // value that is implied, which is helpfully supplied by the parser. - const pm_implicit_node_t *cast = (const pm_implicit_node_t *) node; - PM_COMPILE(cast->value); - return; - } - case PM_IN_NODE: { - // In nodes are handled by the case match node directly, so we should - // never end up hitting them through this path. - rb_bug("Should not ever enter an in node directly"); - return; - } - case PM_INDEX_OPERATOR_WRITE_NODE: { - // foo[bar] += baz - // ^^^^^^^^^^^^^^^ - const pm_index_operator_write_node_t *cast = (const pm_index_operator_write_node_t *) node; - pm_compile_index_operator_write_node(iseq, cast, &location, ret, popped, scope_node); - return; - } - case PM_INDEX_AND_WRITE_NODE: { - // foo[bar] &&= baz - // ^^^^^^^^^^^^^^^^ - const pm_index_and_write_node_t *cast = (const pm_index_and_write_node_t *) node; - pm_compile_index_control_flow_write_node(iseq, node, cast->receiver, cast->arguments, cast->block, cast->value, &location, ret, popped, scope_node); - return; - } - case PM_INDEX_OR_WRITE_NODE: { - // foo[bar] ||= baz - // ^^^^^^^^^^^^^^^^ - const pm_index_or_write_node_t *cast = (const pm_index_or_write_node_t *) node; - pm_compile_index_control_flow_write_node(iseq, node, cast->receiver, cast->arguments, cast->block, cast->value, &location, ret, popped, scope_node); + case PM_CLASS_NODE: { + // class Foo; end + // ^^^^^^^^^^^^^^ + const pm_class_node_t *cast = (const pm_class_node_t *) node; + + ID class_id = pm_constant_id_lookup(scope_node, cast->name); + VALUE class_name = rb_str_freeze(rb_sprintf("", rb_id2str(class_id))); + + pm_scope_node_t next_scope_node; + pm_scope_node_init((const pm_node_t *) cast, &next_scope_node, scope_node); + + const rb_iseq_t *class_iseq = NEW_CHILD_ISEQ(&next_scope_node, class_name, ISEQ_TYPE_CLASS, location.line); + pm_scope_node_destroy(&next_scope_node); + + // TODO: Once we merge constant path nodes correctly, fix this flag + const int flags = VM_DEFINECLASS_TYPE_CLASS | + (cast->superclass ? VM_DEFINECLASS_FLAG_HAS_SUPERCLASS : 0) | + pm_compile_class_path(iseq, cast->constant_path, &location, ret, false, scope_node); + + if (cast->superclass) { + PM_COMPILE_NOT_POPPED(cast->superclass); + } + else { + PUSH_INSN(ret, location, putnil); + } + + PUSH_INSN3(ret, location, defineclass, ID2SYM(class_id), class_iseq, INT2FIX(flags)); + RB_OBJ_WRITTEN(iseq, Qundef, (VALUE)class_iseq); + + if (popped) PUSH_INSN(ret, location, pop); return; } - case PM_INSTANCE_VARIABLE_AND_WRITE_NODE: { - // @foo &&= bar - // ^^^^^^^^^^^^ - const pm_instance_variable_and_write_node_t *cast = (const pm_instance_variable_and_write_node_t *) node; + case PM_CLASS_VARIABLE_AND_WRITE_NODE: { + // @@foo &&= bar + // ^^^^^^^^^^^^^ + const pm_class_variable_and_write_node_t *cast = (const pm_class_variable_and_write_node_t *) node; LABEL *end_label = NEW_LABEL(location.line); ID name_id = pm_constant_id_lookup(scope_node, cast->name); VALUE name = ID2SYM(name_id); - PUSH_INSN2(ret, location, getinstancevariable, name, get_ivar_ic_value(iseq, name_id)); + PUSH_INSN2(ret, location, getclassvariable, name, get_cvar_ic_value(iseq, name_id)); if (!popped) PUSH_INSN(ret, location, dup); PUSH_INSNL(ret, location, branchunless, end_label); @@ -7443,20 +7651,20 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, PM_COMPILE_NOT_POPPED(cast->value); if (!popped) PUSH_INSN(ret, location, dup); - PUSH_INSN2(ret, location, setinstancevariable, name, get_ivar_ic_value(iseq, name_id)); + PUSH_INSN2(ret, location, setclassvariable, name, get_cvar_ic_value(iseq, name_id)); PUSH_LABEL(ret, end_label); return; } - case PM_INSTANCE_VARIABLE_OPERATOR_WRITE_NODE: { - // @foo += bar - // ^^^^^^^^^^^ - const pm_instance_variable_operator_write_node_t *cast = (const pm_instance_variable_operator_write_node_t *) node; + case PM_CLASS_VARIABLE_OPERATOR_WRITE_NODE: { + // @@foo += bar + // ^^^^^^^^^^^^ + const pm_class_variable_operator_write_node_t *cast = (const pm_class_variable_operator_write_node_t *) node; ID name_id = pm_constant_id_lookup(scope_node, cast->name); VALUE name = ID2SYM(name_id); - PUSH_INSN2(ret, location, getinstancevariable, name, get_ivar_ic_value(iseq, name_id)); + PUSH_INSN2(ret, location, getclassvariable, name, get_cvar_ic_value(iseq, name_id)); PM_COMPILE_NOT_POPPED(cast->value); ID method_id = pm_constant_id_lookup(scope_node, cast->binary_operator); @@ -7464,2044 +7672,1838 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, PUSH_SEND_WITH_FLAG(ret, location, method_id, INT2NUM(1), INT2FIX(flags)); if (!popped) PUSH_INSN(ret, location, dup); - PUSH_INSN2(ret, location, setinstancevariable, name, get_ivar_ic_value(iseq, name_id)); + PUSH_INSN2(ret, location, setclassvariable, name, get_cvar_ic_value(iseq, name_id)); return; } - case PM_INSTANCE_VARIABLE_OR_WRITE_NODE: { - // @foo ||= bar - // ^^^^^^^^^^^^ - const pm_instance_variable_or_write_node_t *cast = (const pm_instance_variable_or_write_node_t *) node; + case PM_CLASS_VARIABLE_OR_WRITE_NODE: { + // @@foo ||= bar + // ^^^^^^^^^^^^^ + const pm_class_variable_or_write_node_t *cast = (const pm_class_variable_or_write_node_t *) node; LABEL *end_label = NEW_LABEL(location.line); + LABEL *start_label = NEW_LABEL(location.line); ID name_id = pm_constant_id_lookup(scope_node, cast->name); VALUE name = ID2SYM(name_id); - PUSH_INSN2(ret, location, getinstancevariable, name, get_ivar_ic_value(iseq, name_id)); + PUSH_INSN(ret, location, putnil); + PUSH_INSN3(ret, location, defined, INT2FIX(DEFINED_CVAR), name, Qtrue); + PUSH_INSNL(ret, location, branchunless, start_label); + + PUSH_INSN2(ret, location, getclassvariable, name, get_cvar_ic_value(iseq, name_id)); if (!popped) PUSH_INSN(ret, location, dup); PUSH_INSNL(ret, location, branchif, end_label); if (!popped) PUSH_INSN(ret, location, pop); + PUSH_LABEL(ret, start_label); PM_COMPILE_NOT_POPPED(cast->value); if (!popped) PUSH_INSN(ret, location, dup); - PUSH_INSN2(ret, location, setinstancevariable, name, get_ivar_ic_value(iseq, name_id)); + PUSH_INSN2(ret, location, setclassvariable, name, get_cvar_ic_value(iseq, name_id)); PUSH_LABEL(ret, end_label); return; } - case PM_INSTANCE_VARIABLE_READ_NODE: { - // @foo - // ^^^^ + case PM_CLASS_VARIABLE_READ_NODE: { + // @@foo + // ^^^^^ if (!popped) { - const pm_instance_variable_read_node_t *cast = (const pm_instance_variable_read_node_t *) node; + const pm_class_variable_read_node_t *cast = (const pm_class_variable_read_node_t *) node; ID name = pm_constant_id_lookup(scope_node, cast->name); - PUSH_INSN2(ret, location, getinstancevariable, ID2SYM(name), get_ivar_ic_value(iseq, name)); + PUSH_INSN2(ret, location, getclassvariable, ID2SYM(name), get_cvar_ic_value(iseq, name)); } return; } - case PM_INSTANCE_VARIABLE_WRITE_NODE: { - // @foo = 1 - // ^^^^^^^^ - const pm_instance_variable_write_node_t *cast = (const pm_instance_variable_write_node_t *) node; + case PM_CLASS_VARIABLE_WRITE_NODE: { + // @@foo = 1 + // ^^^^^^^^^ + const pm_class_variable_write_node_t *cast = (const pm_class_variable_write_node_t *) node; PM_COMPILE_NOT_POPPED(cast->value); if (!popped) PUSH_INSN(ret, location, dup); ID name = pm_constant_id_lookup(scope_node, cast->name); - PUSH_INSN2(ret, location, setinstancevariable, ID2SYM(name), get_ivar_ic_value(iseq, name)); + PUSH_INSN2(ret, location, setclassvariable, ID2SYM(name), get_cvar_ic_value(iseq, name)); return; } - case PM_INTEGER_NODE: { - // 1 - // ^ - if (!popped) { - PUSH_INSN1(ret, location, putobject, parse_integer((const pm_integer_node_t *) node)); - } - return; - } - case PM_INTERPOLATED_MATCH_LAST_LINE_NODE: { - // if /foo #{bar}/ then end - // ^^^^^^^^^^^^ - if (PM_NODE_FLAG_P(node, PM_NODE_FLAG_STATIC_LITERAL)) { - if (!popped) { - VALUE regexp = pm_static_literal_value(iseq, node, scope_node); - PUSH_INSN1(ret, location, putobject, regexp); - } + case PM_CONSTANT_PATH_NODE: { + // Foo::Bar + // ^^^^^^^^ + VALUE parts; + + if (ISEQ_COMPILE_DATA(iseq)->option->inline_const_cache && ((parts = pm_constant_path_parts(node, scope_node)) != Qnil)) { + ISEQ_BODY(iseq)->ic_size++; + PUSH_INSN1(ret, location, opt_getconstant_path, parts); } else { - pm_compile_regexp_dynamic(iseq, node, &((const pm_interpolated_match_last_line_node_t *) node)->parts, &location, ret, popped, scope_node); + DECL_ANCHOR(prefix); + INIT_ANCHOR(prefix); + + DECL_ANCHOR(body); + INIT_ANCHOR(body); + + pm_compile_constant_path(iseq, node, prefix, body, popped, scope_node); + if (LIST_INSN_SIZE_ZERO(prefix)) { + PUSH_INSN(ret, location, putnil); + } + else { + PUSH_SEQ(ret, prefix); + } + + PUSH_SEQ(ret, body); } - PUSH_INSN1(ret, location, getglobal, rb_id2sym(idLASTLINE)); - PUSH_SEND(ret, location, idEqTilde, INT2NUM(1)); if (popped) PUSH_INSN(ret, location, pop); - return; } - case PM_INTERPOLATED_REGULAR_EXPRESSION_NODE: { - // /foo #{bar}/ + case PM_CONSTANT_PATH_AND_WRITE_NODE: { + // Foo::Bar &&= baz + // ^^^^^^^^^^^^^^^^ + const pm_constant_path_and_write_node_t *cast = (const pm_constant_path_and_write_node_t *) node; + pm_compile_constant_path_and_write_node(iseq, cast, 0, &location, ret, popped, scope_node); + return; + } + case PM_CONSTANT_PATH_OR_WRITE_NODE: { + // Foo::Bar ||= baz + // ^^^^^^^^^^^^^^^^ + const pm_constant_path_or_write_node_t *cast = (const pm_constant_path_or_write_node_t *) node; + pm_compile_constant_path_or_write_node(iseq, cast, 0, &location, ret, popped, scope_node); + return; + } + case PM_CONSTANT_PATH_OPERATOR_WRITE_NODE: { + // Foo::Bar += baz + // ^^^^^^^^^^^^^^^ + const pm_constant_path_operator_write_node_t *cast = (const pm_constant_path_operator_write_node_t *) node; + pm_compile_constant_path_operator_write_node(iseq, cast, 0, &location, ret, popped, scope_node); + return; + } + case PM_CONSTANT_PATH_WRITE_NODE: { + // Foo::Bar = 1 // ^^^^^^^^^^^^ - if (PM_NODE_FLAG_P(node, PM_REGULAR_EXPRESSION_FLAGS_ONCE)) { - const rb_iseq_t *prevblock = ISEQ_COMPILE_DATA(iseq)->current_block; - const rb_iseq_t *block_iseq = NULL; - int ise_index = ISEQ_BODY(iseq)->ise_size++; + const pm_constant_path_write_node_t *cast = (const pm_constant_path_write_node_t *) node; + pm_compile_constant_path_write_node(iseq, cast, 0, &location, ret, popped, scope_node); + return; + } + case PM_CONSTANT_READ_NODE: { + // Foo + // ^^^ + const pm_constant_read_node_t *cast = (const pm_constant_read_node_t *) node; + VALUE name = ID2SYM(pm_constant_id_lookup(scope_node, cast->name)); - pm_scope_node_t next_scope_node; - pm_scope_node_init(node, &next_scope_node, scope_node); + pm_compile_constant_read(iseq, name, &cast->base.location, location.node_id, ret, scope_node); + if (popped) PUSH_INSN(ret, location, pop); - block_iseq = NEW_CHILD_ISEQ(&next_scope_node, make_name_for_block(iseq), ISEQ_TYPE_BLOCK, location.line); - pm_scope_node_destroy(&next_scope_node); + return; + } + case PM_CONSTANT_AND_WRITE_NODE: { + // Foo &&= bar + // ^^^^^^^^^^^ + const pm_constant_and_write_node_t *cast = (const pm_constant_and_write_node_t *) node; + pm_compile_constant_and_write_node(iseq, cast, 0, &location, ret, popped, scope_node); + return; + } + case PM_CONSTANT_OR_WRITE_NODE: { + // Foo ||= bar + // ^^^^^^^^^^^ + const pm_constant_or_write_node_t *cast = (const pm_constant_or_write_node_t *) node; + pm_compile_constant_or_write_node(iseq, cast, 0, &location, ret, popped, scope_node); + return; + } + case PM_CONSTANT_OPERATOR_WRITE_NODE: { + // Foo += bar + // ^^^^^^^^^^ + const pm_constant_operator_write_node_t *cast = (const pm_constant_operator_write_node_t *) node; + pm_compile_constant_operator_write_node(iseq, cast, 0, &location, ret, popped, scope_node); + return; + } + case PM_CONSTANT_WRITE_NODE: { + // Foo = 1 + // ^^^^^^^ + const pm_constant_write_node_t *cast = (const pm_constant_write_node_t *) node; + pm_compile_constant_write_node(iseq, cast, 0, &location, ret, popped, scope_node); + return; + } + case PM_DEF_NODE: { + // def foo; end + // ^^^^^^^^^^^^ + // + // def self.foo; end + // ^^^^^^^^^^^^^^^^^ + const pm_def_node_t *cast = (const pm_def_node_t *) node; + ID method_name = pm_constant_id_lookup(scope_node, cast->name); - ISEQ_COMPILE_DATA(iseq)->current_block = block_iseq; - PUSH_INSN2(ret, location, once, block_iseq, INT2FIX(ise_index)); - ISEQ_COMPILE_DATA(iseq)->current_block = prevblock; + pm_scope_node_t next_scope_node; + pm_scope_node_init((const pm_node_t *) cast, &next_scope_node, scope_node); - if (popped) PUSH_INSN(ret, location, pop); - return; - } + rb_iseq_t *method_iseq = NEW_ISEQ(&next_scope_node, rb_id2str(method_name), ISEQ_TYPE_METHOD, location.line); + pm_scope_node_destroy(&next_scope_node); - if (PM_NODE_FLAG_P(node, PM_NODE_FLAG_STATIC_LITERAL)) { - if (!popped) { - VALUE regexp = pm_static_literal_value(iseq, node, scope_node); - PUSH_INSN1(ret, location, putobject, regexp); - } + if (cast->receiver) { + PM_COMPILE_NOT_POPPED(cast->receiver); + PUSH_INSN2(ret, location, definesmethod, ID2SYM(method_name), method_iseq); } else { - pm_compile_regexp_dynamic(iseq, node, &((const pm_interpolated_regular_expression_node_t *) node)->parts, &location, ret, popped, scope_node); - if (popped) PUSH_INSN(ret, location, pop); + PUSH_INSN2(ret, location, definemethod, ID2SYM(method_name), method_iseq); + } + RB_OBJ_WRITTEN(iseq, Qundef, (VALUE) method_iseq); + + if (!popped) { + PUSH_INSN1(ret, location, putobject, ID2SYM(method_name)); } return; } - case PM_INTERPOLATED_STRING_NODE: { + case PM_DEFINED_NODE: { + // defined?(a) + // ^^^^^^^^^^^ + const pm_defined_node_t *cast = (const pm_defined_node_t *) node; + pm_compile_defined_expr(iseq, cast->value, &location, ret, popped, scope_node, false); + return; + } + case PM_EMBEDDED_STATEMENTS_NODE: { // "foo #{bar}" - // ^^^^^^^^^^^^ - if (PM_NODE_FLAG_P(node, PM_NODE_FLAG_STATIC_LITERAL)) { - if (!popped) { - VALUE string = pm_static_literal_value(iseq, node, scope_node); + // ^^^^^^ + const pm_embedded_statements_node_t *cast = (const pm_embedded_statements_node_t *) node; - if (PM_NODE_FLAG_P(node, PM_INTERPOLATED_STRING_NODE_FLAGS_FROZEN)) { - PUSH_INSN1(ret, location, putobject, string); - } - else if (PM_NODE_FLAG_P(node, PM_INTERPOLATED_STRING_NODE_FLAGS_MUTABLE)) { - PUSH_INSN1(ret, location, putstring, string); - } - else { - PUSH_INSN1(ret, location, putchilledstring, string); - } - } + if (cast->statements != NULL) { + PM_COMPILE((const pm_node_t *) (cast->statements)); } else { - const pm_interpolated_string_node_t *cast = (const pm_interpolated_string_node_t *) node; - int length = pm_interpolated_node_compile(iseq, &cast->parts, &location, ret, popped, scope_node, NULL, NULL); - if (length > 1) PUSH_INSN1(ret, location, concatstrings, INT2FIX(length)); - if (popped) PUSH_INSN(ret, location, pop); + PUSH_SYNTHETIC_PUTNIL(ret, iseq); } + if (popped) PUSH_INSN(ret, location, pop); return; } - case PM_INTERPOLATED_SYMBOL_NODE: { - // :"foo #{bar}" - // ^^^^^^^^^^^^^ - const pm_interpolated_symbol_node_t *cast = (const pm_interpolated_symbol_node_t *) node; - int length = pm_interpolated_node_compile(iseq, &cast->parts, &location, ret, popped, scope_node, NULL, NULL); - - if (length > 1) { - PUSH_INSN1(ret, location, concatstrings, INT2FIX(length)); - } - + case PM_EMBEDDED_VARIABLE_NODE: { + // "foo #@bar" + // ^^^^^ + const pm_embedded_variable_node_t *cast = (const pm_embedded_variable_node_t *) node; + PM_COMPILE(cast->variable); + return; + } + case PM_FALSE_NODE: { + // false + // ^^^^^ if (!popped) { - PUSH_INSN(ret, location, intern); - } - else { - PUSH_INSN(ret, location, pop); + PUSH_INSN1(ret, location, putobject, Qfalse); } - return; } - case PM_INTERPOLATED_X_STRING_NODE: { - // `foo #{bar}` - // ^^^^^^^^^^^^ - const pm_interpolated_x_string_node_t *cast = (const pm_interpolated_x_string_node_t *) node; - - PUSH_INSN(ret, location, putself); + case PM_ENSURE_NODE: { + const pm_ensure_node_t *cast = (const pm_ensure_node_t *) node; - int length = pm_interpolated_node_compile(iseq, &cast->parts, &location, ret, false, scope_node, NULL, NULL); - if (length > 1) PUSH_INSN1(ret, location, concatstrings, INT2FIX(length)); + if (cast->statements != NULL) { + LABEL *start = NEW_LABEL(location.line); + LABEL *end = NEW_LABEL(location.line); + PUSH_LABEL(ret, start); - PUSH_SEND_WITH_FLAG(ret, location, idBackquote, INT2NUM(1), INT2FIX(VM_CALL_FCALL | VM_CALL_ARGS_SIMPLE)); - if (popped) PUSH_INSN(ret, location, pop); + LABEL *prev_end_label = ISEQ_COMPILE_DATA(iseq)->end_label; + ISEQ_COMPILE_DATA(iseq)->end_label = end; - return; - } - case PM_IT_LOCAL_VARIABLE_READ_NODE: { - // -> { it } - // ^^ - if (!popped) { - PUSH_GETLOCAL(ret, location, scope_node->local_table_for_iseq_size, 0); + PM_COMPILE((const pm_node_t *) cast->statements); + ISEQ_COMPILE_DATA(iseq)->end_label = prev_end_label; + PUSH_LABEL(ret, end); } return; } - case PM_KEYWORD_HASH_NODE: { - // foo(bar: baz) - // ^^^^^^^^ - const pm_keyword_hash_node_t *cast = (const pm_keyword_hash_node_t *) node; - const pm_node_list_t *elements = &cast->elements; + case PM_ELSE_NODE: { + // if foo then bar else baz end + // ^^^^^^^^^^^^ + const pm_else_node_t *cast = (const pm_else_node_t *) node; - const pm_node_t *element; - PM_NODE_LIST_FOREACH(elements, index, element) { - PM_COMPILE(element); + if (cast->statements != NULL) { + PM_COMPILE((const pm_node_t *) cast->statements); + } + else if (!popped) { + PUSH_SYNTHETIC_PUTNIL(ret, iseq); } - if (!popped) PUSH_INSN1(ret, location, newhash, INT2FIX(elements->size * 2)); return; } - case PM_LAMBDA_NODE: { - // -> {} - // ^^^^^ - const pm_lambda_node_t *cast = (const pm_lambda_node_t *) node; + case PM_FLIP_FLOP_NODE: { + // if foo .. bar; end + // ^^^^^^^^^^ + const pm_flip_flop_node_t *cast = (const pm_flip_flop_node_t *) node; - pm_scope_node_t next_scope_node; - pm_scope_node_init(node, &next_scope_node, scope_node); + LABEL *final_label = NEW_LABEL(location.line); + LABEL *then_label = NEW_LABEL(location.line); + LABEL *else_label = NEW_LABEL(location.line); - int opening_lineno = pm_location_line_number(parser, &cast->opening_loc); - const rb_iseq_t *block = NEW_CHILD_ISEQ(&next_scope_node, make_name_for_block(iseq), ISEQ_TYPE_BLOCK, opening_lineno); - pm_scope_node_destroy(&next_scope_node); + pm_compile_flip_flop(cast, else_label, then_label, iseq, location.line, ret, popped, scope_node); - VALUE argc = INT2FIX(0); - PUSH_INSN1(ret, location, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); - PUSH_CALL_WITH_BLOCK(ret, location, idLambda, argc, block); - RB_OBJ_WRITTEN(iseq, Qundef, (VALUE) block); + PUSH_LABEL(ret, then_label); + PUSH_INSN1(ret, location, putobject, Qtrue); + PUSH_INSNL(ret, location, jump, final_label); + PUSH_LABEL(ret, else_label); + PUSH_INSN1(ret, location, putobject, Qfalse); + PUSH_LABEL(ret, final_label); - if (popped) PUSH_INSN(ret, location, pop); return; } - case PM_LOCAL_VARIABLE_AND_WRITE_NODE: { - // foo &&= bar - // ^^^^^^^^^^^ - const pm_local_variable_and_write_node_t *cast = (const pm_local_variable_and_write_node_t *) node; - LABEL *end_label = NEW_LABEL(location.line); - - pm_local_index_t local_index = pm_lookup_local_index(iseq, scope_node, cast->name, cast->depth); - PUSH_GETLOCAL(ret, location, local_index.index, local_index.level); - if (!popped) PUSH_INSN(ret, location, dup); - - PUSH_INSNL(ret, location, branchunless, end_label); - if (!popped) PUSH_INSN(ret, location, pop); - - PM_COMPILE_NOT_POPPED(cast->value); - if (!popped) PUSH_INSN(ret, location, dup); - - PUSH_SETLOCAL(ret, location, local_index.index, local_index.level); - PUSH_LABEL(ret, end_label); - + case PM_FLOAT_NODE: { + // 1.0 + // ^^^ + if (!popped) { + PUSH_INSN1(ret, location, putobject, parse_float((const pm_float_node_t *) node)); + } return; } - case PM_LOCAL_VARIABLE_OPERATOR_WRITE_NODE: { - // foo += bar - // ^^^^^^^^^^ - const pm_local_variable_operator_write_node_t *cast = (const pm_local_variable_operator_write_node_t *) node; + case PM_FOR_NODE: { + // for foo in bar do end + // ^^^^^^^^^^^^^^^^^^^^^ + const pm_for_node_t *cast = (const pm_for_node_t *) node; - pm_local_index_t local_index = pm_lookup_local_index(iseq, scope_node, cast->name, cast->depth); - PUSH_GETLOCAL(ret, location, local_index.index, local_index.level); + LABEL *retry_label = NEW_LABEL(location.line); + LABEL *retry_end_l = NEW_LABEL(location.line); - PM_COMPILE_NOT_POPPED(cast->value); + // First, compile the collection that we're going to be iterating over. + PUSH_LABEL(ret, retry_label); + PM_COMPILE_NOT_POPPED(cast->collection); - ID method_id = pm_constant_id_lookup(scope_node, cast->binary_operator); - PUSH_SEND_WITH_FLAG(ret, location, method_id, INT2NUM(1), INT2FIX(VM_CALL_ARGS_SIMPLE)); + // Next, create the new scope that is going to contain the block that + // will be passed to the each method. + pm_scope_node_t next_scope_node; + pm_scope_node_init((const pm_node_t *) cast, &next_scope_node, scope_node); - if (!popped) PUSH_INSN(ret, location, dup); - PUSH_SETLOCAL(ret, location, local_index.index, local_index.level); + const rb_iseq_t *child_iseq = NEW_CHILD_ISEQ(&next_scope_node, make_name_for_block(iseq), ISEQ_TYPE_BLOCK, location.line); + pm_scope_node_destroy(&next_scope_node); + + const rb_iseq_t *prev_block = ISEQ_COMPILE_DATA(iseq)->current_block; + ISEQ_COMPILE_DATA(iseq)->current_block = child_iseq; + + // Now, create the method call to each that will be used to iterate over + // the collection, and pass the newly created iseq as the block. + PUSH_SEND_WITH_BLOCK(ret, location, idEach, INT2FIX(0), child_iseq); + pm_compile_retry_end_label(iseq, ret, retry_end_l); + if (popped) PUSH_INSN(ret, location, pop); + ISEQ_COMPILE_DATA(iseq)->current_block = prev_block; + PUSH_CATCH_ENTRY(CATCH_TYPE_BREAK, retry_label, retry_end_l, child_iseq, retry_end_l); return; } - case PM_LOCAL_VARIABLE_OR_WRITE_NODE: { - // foo ||= bar - // ^^^^^^^^^^^ - const pm_local_variable_or_write_node_t *cast = (const pm_local_variable_or_write_node_t *) node; - - LABEL *set_label = NEW_LABEL(location.line); - LABEL *end_label = NEW_LABEL(location.line); + case PM_FORWARDING_ARGUMENTS_NODE: { + rb_bug("Cannot compile a ForwardingArgumentsNode directly\n"); + return; + } + case PM_FORWARDING_SUPER_NODE: { + // super + // ^^^^^ + // + // super {} + // ^^^^^^^^ + const pm_forwarding_super_node_t *cast = (const pm_forwarding_super_node_t *) node; + const rb_iseq_t *block = NULL; - PUSH_INSN1(ret, location, putobject, Qtrue); - PUSH_INSNL(ret, location, branchunless, set_label); + const rb_iseq_t *previous_block = NULL; + LABEL *retry_label = NULL; + LABEL *retry_end_l = NULL; - pm_local_index_t local_index = pm_lookup_local_index(iseq, scope_node, cast->name, cast->depth); - PUSH_GETLOCAL(ret, location, local_index.index, local_index.level); - if (!popped) PUSH_INSN(ret, location, dup); + if (cast->block != NULL) { + previous_block = ISEQ_COMPILE_DATA(iseq)->current_block; + ISEQ_COMPILE_DATA(iseq)->current_block = NULL; - PUSH_INSNL(ret, location, branchif, end_label); - if (!popped) PUSH_INSN(ret, location, pop); + retry_label = NEW_LABEL(location.line); + retry_end_l = NEW_LABEL(location.line); - PUSH_LABEL(ret, set_label); - PM_COMPILE_NOT_POPPED(cast->value); - if (!popped) PUSH_INSN(ret, location, dup); + PUSH_LABEL(ret, retry_label); + } + else { + iseq_set_use_block(ISEQ_BODY(iseq)->local_iseq); + } - PUSH_SETLOCAL(ret, location, local_index.index, local_index.level); - PUSH_LABEL(ret, end_label); + PUSH_INSN(ret, location, putself); + int flag = VM_CALL_ZSUPER | VM_CALL_SUPER | VM_CALL_FCALL; - return; - } - case PM_LOCAL_VARIABLE_READ_NODE: { - // foo - // ^^^ - if (!popped) { - const pm_local_variable_read_node_t *cast = (const pm_local_variable_read_node_t *) node; - pm_local_index_t index = pm_lookup_local_index(iseq, scope_node, cast->name, cast->depth); - PUSH_GETLOCAL(ret, location, index.index, index.level); - } + if (cast->block != NULL) { + pm_scope_node_t next_scope_node; + pm_scope_node_init((const pm_node_t *) cast->block, &next_scope_node, scope_node); - return; - } - case PM_LOCAL_VARIABLE_WRITE_NODE: { - // foo = 1 - // ^^^^^^^ - const pm_local_variable_write_node_t *cast = (const pm_local_variable_write_node_t *) node; - PM_COMPILE_NOT_POPPED(cast->value); - if (!popped) PUSH_INSN(ret, location, dup); + ISEQ_COMPILE_DATA(iseq)->current_block = block = NEW_CHILD_ISEQ(&next_scope_node, make_name_for_block(iseq), ISEQ_TYPE_BLOCK, location.line); + pm_scope_node_destroy(&next_scope_node); + RB_OBJ_WRITTEN(iseq, Qundef, (VALUE) block); + } - pm_local_index_t index = pm_lookup_local_index(iseq, scope_node, cast->name, cast->depth); - PUSH_SETLOCAL(ret, location, index.index, index.level); - return; - } - case PM_MATCH_LAST_LINE_NODE: { - // if /foo/ then end - // ^^^^^ - VALUE regexp = pm_static_literal_value(iseq, node, scope_node); + DECL_ANCHOR(args); + INIT_ANCHOR(args); - PUSH_INSN1(ret, location, putobject, regexp); - PUSH_INSN2(ret, location, getspecial, INT2FIX(0), INT2FIX(0)); - PUSH_SEND(ret, location, idEqTilde, INT2NUM(1)); - if (popped) PUSH_INSN(ret, location, pop); + struct rb_iseq_constant_body *const body = ISEQ_BODY(iseq); + const rb_iseq_t *local_iseq = body->local_iseq; + const struct rb_iseq_constant_body *const local_body = ISEQ_BODY(local_iseq); - return; - } - case PM_MATCH_PREDICATE_NODE: { - // foo in bar - // ^^^^^^^^^^ - const pm_match_predicate_node_t *cast = (const pm_match_predicate_node_t *) node; + int argc = 0; + int depth = get_lvar_level(iseq); - // First, allocate some stack space for the cached return value of any - // calls to #deconstruct. - PUSH_INSN(ret, location, putnil); + if (ISEQ_BODY(ISEQ_BODY(iseq)->local_iseq)->param.flags.forwardable) { + flag |= VM_CALL_FORWARDING; + pm_local_index_t mult_local = pm_lookup_local_index(iseq, scope_node, PM_CONSTANT_DOT3, 0); + PUSH_GETLOCAL(ret, location, mult_local.index, mult_local.level); + PUSH_INSN2(ret, location, invokesuperforward, new_callinfo(iseq, 0, 0, flag, NULL, block != NULL), block); + if (popped) PUSH_INSN(ret, location, pop); + return; + } - // Next, compile the expression that we're going to match against. - PM_COMPILE_NOT_POPPED(cast->value); - PUSH_INSN(ret, location, dup); + if (local_body->param.flags.has_lead) { + /* required arguments */ + for (int i = 0; i < local_body->param.lead_num; i++) { + int idx = local_body->local_table_size - i; + PUSH_GETLOCAL(args, location, idx, depth); + } + argc += local_body->param.lead_num; + } - // Now compile the pattern that is going to be used to match against the - // expression. - LABEL *matched_label = NEW_LABEL(location.line); - LABEL *unmatched_label = NEW_LABEL(location.line); - LABEL *done_label = NEW_LABEL(location.line); - pm_compile_pattern(iseq, scope_node, cast->pattern, ret, matched_label, unmatched_label, false, false, true, 2); + if (local_body->param.flags.has_opt) { + /* optional arguments */ + for (int j = 0; j < local_body->param.opt_num; j++) { + int idx = local_body->local_table_size - (argc + j); + PUSH_GETLOCAL(args, location, idx, depth); + } + argc += local_body->param.opt_num; + } - // If the pattern did not match, then compile the necessary instructions - // to handle pushing false onto the stack, then jump to the end. - PUSH_LABEL(ret, unmatched_label); - PUSH_INSN(ret, location, pop); - PUSH_INSN(ret, location, pop); + if (local_body->param.flags.has_rest) { + /* rest argument */ + int idx = local_body->local_table_size - local_body->param.rest_start; + PUSH_GETLOCAL(args, location, idx, depth); + PUSH_INSN1(args, location, splatarray, Qfalse); - if (!popped) PUSH_INSN1(ret, location, putobject, Qfalse); - PUSH_INSNL(ret, location, jump, done_label); - PUSH_INSN(ret, location, putnil); + argc = local_body->param.rest_start + 1; + flag |= VM_CALL_ARGS_SPLAT; + } - // If the pattern did match, then compile the necessary instructions to - // handle pushing true onto the stack, then jump to the end. - PUSH_LABEL(ret, matched_label); - PUSH_INSN1(ret, location, adjuststack, INT2FIX(2)); - if (!popped) PUSH_INSN1(ret, location, putobject, Qtrue); - PUSH_INSNL(ret, location, jump, done_label); + if (local_body->param.flags.has_post) { + /* post arguments */ + int post_len = local_body->param.post_num; + int post_start = local_body->param.post_start; - PUSH_LABEL(ret, done_label); - return; - } - case PM_MATCH_REQUIRED_NODE: { - // foo => bar - // ^^^^^^^^^^ - // - // A match required node represents pattern matching against a single - // pattern using the => operator. For example, - // - // foo => bar - // - // This is somewhat analogous to compiling a case match statement with a - // single pattern. In both cases, if the pattern fails it should - // immediately raise an error. - const pm_match_required_node_t *cast = (const pm_match_required_node_t *) node; + int j = 0; + for (; j < post_len; j++) { + int idx = local_body->local_table_size - (post_start + j); + PUSH_GETLOCAL(args, location, idx, depth); + } - LABEL *matched_label = NEW_LABEL(location.line); - LABEL *unmatched_label = NEW_LABEL(location.line); - LABEL *done_label = NEW_LABEL(location.line); + if (local_body->param.flags.has_rest) { + // argc remains unchanged from rest branch + PUSH_INSN1(args, location, newarray, INT2FIX(j)); + PUSH_INSN(args, location, concatarray); + } + else { + argc = post_len + post_start; + } + } - // First, we're going to push a bunch of stuff onto the stack that is - // going to serve as our scratch space. - PUSH_INSN(ret, location, putnil); // key error key - PUSH_INSN(ret, location, putnil); // key error matchee - PUSH_INSN1(ret, location, putobject, Qfalse); // key error? - PUSH_INSN(ret, location, putnil); // error string - PUSH_INSN(ret, location, putnil); // deconstruct cache + const struct rb_iseq_param_keyword *const local_keyword = local_body->param.keyword; + if (local_body->param.flags.has_kw) { + int local_size = local_body->local_table_size; + argc++; - // Next we're going to compile the value expression such that it's on - // the stack. - PM_COMPILE_NOT_POPPED(cast->value); + PUSH_INSN1(args, location, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); - // Here we'll dup it so that it can be used for comparison, but also be - // used for error handling. - PUSH_INSN(ret, location, dup); + if (local_body->param.flags.has_kwrest) { + int idx = local_body->local_table_size - local_keyword->rest_start; + PUSH_GETLOCAL(args, location, idx, depth); + RUBY_ASSERT(local_keyword->num > 0); + PUSH_SEND(args, location, rb_intern("dup"), INT2FIX(0)); + } + else { + PUSH_INSN1(args, location, newhash, INT2FIX(0)); + } + int i = 0; + for (; i < local_keyword->num; ++i) { + ID id = local_keyword->table[i]; + int idx = local_size - get_local_var_idx(local_iseq, id); + PUSH_INSN1(args, location, putobject, ID2SYM(id)); + PUSH_GETLOCAL(args, location, idx, depth); + } - // Next we'll compile the pattern. We indicate to the pm_compile_pattern - // function that this is the only pattern that will be matched against - // through the in_single_pattern parameter. We also indicate that the - // value to compare against is 2 slots from the top of the stack (the - // base_index parameter). - pm_compile_pattern(iseq, scope_node, cast->pattern, ret, matched_label, unmatched_label, true, false, true, 2); + PUSH_SEND(args, location, id_core_hash_merge_ptr, INT2FIX(i * 2 + 1)); + flag |= VM_CALL_KW_SPLAT| VM_CALL_KW_SPLAT_MUT; + } + else if (local_body->param.flags.has_kwrest) { + int idx = local_body->local_table_size - local_keyword->rest_start; + PUSH_GETLOCAL(args, location, idx, depth); + argc++; + flag |= VM_CALL_KW_SPLAT; + } - // If the pattern did not match the value, then we're going to compile - // in our error handler code. This will determine which error to raise - // and raise it. - PUSH_LABEL(ret, unmatched_label); - pm_compile_pattern_error_handler(iseq, scope_node, node, ret, done_label, popped); + PUSH_SEQ(ret, args); + PUSH_INSN2(ret, location, invokesuper, new_callinfo(iseq, 0, argc, flag, NULL, block != NULL), block); - // If the pattern did match, we'll clean up the values we've pushed onto - // the stack and then push nil onto the stack if it's not popped. - PUSH_LABEL(ret, matched_label); - PUSH_INSN1(ret, location, adjuststack, INT2FIX(6)); - if (!popped) PUSH_INSN(ret, location, putnil); - PUSH_INSNL(ret, location, jump, done_label); + if (cast->block != NULL) { + pm_compile_retry_end_label(iseq, ret, retry_end_l); + PUSH_CATCH_ENTRY(CATCH_TYPE_BREAK, retry_label, retry_end_l, block, retry_end_l); + ISEQ_COMPILE_DATA(iseq)->current_block = previous_block; + } - PUSH_LABEL(ret, done_label); + if (popped) PUSH_INSN(ret, location, pop); return; } - case PM_MATCH_WRITE_NODE: { - // /(?foo)/ =~ bar - // ^^^^^^^^^^^^^^^^^^^^ - // - // Match write nodes are specialized call nodes that have a regular - // expression with valid named capture groups on the left, the =~ - // operator, and some value on the right. The nodes themselves simply - // wrap the call with the local variable targets that will be written - // when the call is executed. - const pm_match_write_node_t *cast = (const pm_match_write_node_t *) node; - LABEL *fail_label = NEW_LABEL(location.line); + case PM_GLOBAL_VARIABLE_AND_WRITE_NODE: { + // $foo &&= bar + // ^^^^^^^^^^^^ + const pm_global_variable_and_write_node_t *cast = (const pm_global_variable_and_write_node_t *) node; LABEL *end_label = NEW_LABEL(location.line); - // First, we'll compile the call so that all of its instructions are - // present. Then we'll compile all of the local variable targets. - PM_COMPILE_NOT_POPPED((const pm_node_t *) cast->call); + VALUE name = ID2SYM(pm_constant_id_lookup(scope_node, cast->name)); + PUSH_INSN1(ret, location, getglobal, name); + if (!popped) PUSH_INSN(ret, location, dup); - // Now, check if the match was successful. If it was, then we'll - // continue on and assign local variables. Otherwise we'll skip over the - // assignment code. - PUSH_INSN1(ret, location, getglobal, rb_id2sym(idBACKREF)); - PUSH_INSN(ret, location, dup); - PUSH_INSNL(ret, location, branchunless, fail_label); + PUSH_INSNL(ret, location, branchunless, end_label); + if (!popped) PUSH_INSN(ret, location, pop); - // If there's only a single local variable target, we can skip some of - // the bookkeeping, so we'll put a special branch here. - size_t targets_count = cast->targets.size; + PM_COMPILE_NOT_POPPED(cast->value); + if (!popped) PUSH_INSN(ret, location, dup); - if (targets_count == 1) { - const pm_node_t *target = cast->targets.nodes[0]; - RUBY_ASSERT(PM_NODE_TYPE_P(target, PM_LOCAL_VARIABLE_TARGET_NODE)); + PUSH_INSN1(ret, location, setglobal, name); + PUSH_LABEL(ret, end_label); - const pm_local_variable_target_node_t *local_target = (const pm_local_variable_target_node_t *) target; - pm_local_index_t index = pm_lookup_local_index(iseq, scope_node, local_target->name, local_target->depth); + return; + } + case PM_GLOBAL_VARIABLE_OPERATOR_WRITE_NODE: { + // $foo += bar + // ^^^^^^^^^^^ + const pm_global_variable_operator_write_node_t *cast = (const pm_global_variable_operator_write_node_t *) node; - PUSH_INSN1(ret, location, putobject, rb_id2sym(pm_constant_id_lookup(scope_node, local_target->name))); - PUSH_SEND(ret, location, idAREF, INT2FIX(1)); - PUSH_LABEL(ret, fail_label); - PUSH_SETLOCAL(ret, location, index.index, index.level); - if (popped) PUSH_INSN(ret, location, pop); - return; - } + VALUE name = ID2SYM(pm_constant_id_lookup(scope_node, cast->name)); + PUSH_INSN1(ret, location, getglobal, name); + PM_COMPILE_NOT_POPPED(cast->value); - DECL_ANCHOR(fail_anchor); - INIT_ANCHOR(fail_anchor); + ID method_id = pm_constant_id_lookup(scope_node, cast->binary_operator); + int flags = VM_CALL_ARGS_SIMPLE; + PUSH_SEND_WITH_FLAG(ret, location, method_id, INT2NUM(1), INT2FIX(flags)); - // Otherwise there is more than one local variable target, so we'll need - // to do some bookkeeping. - for (size_t targets_index = 0; targets_index < targets_count; targets_index++) { - const pm_node_t *target = cast->targets.nodes[targets_index]; - RUBY_ASSERT(PM_NODE_TYPE_P(target, PM_LOCAL_VARIABLE_TARGET_NODE)); + if (!popped) PUSH_INSN(ret, location, dup); + PUSH_INSN1(ret, location, setglobal, name); - const pm_local_variable_target_node_t *local_target = (const pm_local_variable_target_node_t *) target; - pm_local_index_t index = pm_lookup_local_index(iseq, scope_node, local_target->name, local_target->depth); + return; + } + case PM_GLOBAL_VARIABLE_OR_WRITE_NODE: { + // $foo ||= bar + // ^^^^^^^^^^^^ + const pm_global_variable_or_write_node_t *cast = (const pm_global_variable_or_write_node_t *) node; + LABEL *set_label = NEW_LABEL(location.line); + LABEL *end_label = NEW_LABEL(location.line); - if (((size_t) targets_index) < (targets_count - 1)) { - PUSH_INSN(ret, location, dup); - } - PUSH_INSN1(ret, location, putobject, rb_id2sym(pm_constant_id_lookup(scope_node, local_target->name))); - PUSH_SEND(ret, location, idAREF, INT2FIX(1)); - PUSH_SETLOCAL(ret, location, index.index, index.level); + PUSH_INSN(ret, location, putnil); + VALUE name = ID2SYM(pm_constant_id_lookup(scope_node, cast->name)); - PUSH_INSN(fail_anchor, location, putnil); - PUSH_SETLOCAL(fail_anchor, location, index.index, index.level); - } + PUSH_INSN3(ret, location, defined, INT2FIX(DEFINED_GVAR), name, Qtrue); + PUSH_INSNL(ret, location, branchunless, set_label); - // Since we matched successfully, now we'll jump to the end. - PUSH_INSNL(ret, location, jump, end_label); + PUSH_INSN1(ret, location, getglobal, name); + if (!popped) PUSH_INSN(ret, location, dup); - // In the case that the match failed, we'll loop through each local - // variable target and set all of them to `nil`. - PUSH_LABEL(ret, fail_label); - PUSH_INSN(ret, location, pop); - PUSH_SEQ(ret, fail_anchor); + PUSH_INSNL(ret, location, branchif, end_label); + if (!popped) PUSH_INSN(ret, location, pop); - // Finally, we can push the end label for either case. + PUSH_LABEL(ret, set_label); + PM_COMPILE_NOT_POPPED(cast->value); + if (!popped) PUSH_INSN(ret, location, dup); + + PUSH_INSN1(ret, location, setglobal, name); PUSH_LABEL(ret, end_label); - if (popped) PUSH_INSN(ret, location, pop); + return; } - case PM_MISSING_NODE: { - rb_bug("A pm_missing_node_t should not exist in prism's AST."); + case PM_GLOBAL_VARIABLE_READ_NODE: { + // $foo + // ^^^^ + const pm_global_variable_read_node_t *cast = (const pm_global_variable_read_node_t *) node; + VALUE name = ID2SYM(pm_constant_id_lookup(scope_node, cast->name)); + + PUSH_INSN1(ret, location, getglobal, name); + if (popped) PUSH_INSN(ret, location, pop); + return; } - case PM_MODULE_NODE: { - // module Foo; end - // ^^^^^^^^^^^^^^^ - const pm_module_node_t *cast = (const pm_module_node_t *) node; + case PM_GLOBAL_VARIABLE_WRITE_NODE: { + // $foo = 1 + // ^^^^^^^^ + const pm_global_variable_write_node_t *cast = (const pm_global_variable_write_node_t *) node; + PM_COMPILE_NOT_POPPED(cast->value); + if (!popped) PUSH_INSN(ret, location, dup); - ID module_id = pm_constant_id_lookup(scope_node, cast->name); - VALUE module_name = rb_str_freeze(rb_sprintf("", rb_id2str(module_id))); + ID name = pm_constant_id_lookup(scope_node, cast->name); + PUSH_INSN1(ret, location, setglobal, ID2SYM(name)); - pm_scope_node_t next_scope_node; - pm_scope_node_init((const pm_node_t *) cast, &next_scope_node, scope_node); + return; + } + case PM_HASH_NODE: { + // {} + // ^^ + // + // If every node in the hash is static, then we can compile the entire + // hash now instead of later. + if (PM_NODE_FLAG_P(node, PM_NODE_FLAG_STATIC_LITERAL)) { + // We're only going to compile this node if it's not popped. If it + // is popped, then we know we don't need to do anything since it's + // statically known. + if (!popped) { + const pm_hash_node_t *cast = (const pm_hash_node_t *) node; - const rb_iseq_t *module_iseq = NEW_CHILD_ISEQ(&next_scope_node, module_name, ISEQ_TYPE_CLASS, location.line); - pm_scope_node_destroy(&next_scope_node); + if (cast->elements.size == 0) { + PUSH_INSN1(ret, location, newhash, INT2FIX(0)); + } + else { + VALUE value = pm_static_literal_value(iseq, node, scope_node); + PUSH_INSN1(ret, location, duphash, value); + RB_OBJ_WRITTEN(iseq, Qundef, value); + } + } + } + else { + // Here since we know there are possible side-effects inside the + // hash contents, we're going to build it entirely at runtime. We'll + // do this by pushing all of the key-value pairs onto the stack and + // then combining them with newhash. + // + // If this hash is popped, then this serves only to ensure we enact + // all side-effects (like method calls) that are contained within + // the hash contents. + const pm_hash_node_t *cast = (const pm_hash_node_t *) node; + const pm_node_list_t *elements = &cast->elements; - const int flags = VM_DEFINECLASS_TYPE_MODULE | pm_compile_class_path(iseq, cast->constant_path, &location, ret, false, scope_node); - PUSH_INSN(ret, location, putnil); - PUSH_INSN3(ret, location, defineclass, ID2SYM(module_id), module_iseq, INT2FIX(flags)); - RB_OBJ_WRITTEN(iseq, Qundef, (VALUE) module_iseq); + if (popped) { + // If this hash is popped, then we can iterate through each + // element and compile it. The result of each compilation will + // only include the side effects of the element itself. + for (size_t index = 0; index < elements->size; index++) { + PM_COMPILE_POPPED(elements->nodes[index]); + } + } + else { + pm_compile_hash_elements(iseq, node, elements, false, ret, scope_node); + } + } - if (popped) PUSH_INSN(ret, location, pop); return; } - case PM_REQUIRED_PARAMETER_NODE: { - // def foo(bar); end - // ^^^ - const pm_required_parameter_node_t *cast = (const pm_required_parameter_node_t *) node; - pm_local_index_t index = pm_lookup_local_index(iseq, scope_node, cast->name, 0); - - PUSH_SETLOCAL(ret, location, index.index, index.level); + case PM_IF_NODE: { + // if foo then bar end + // ^^^^^^^^^^^^^^^^^^^ + // + // bar if foo + // ^^^^^^^^^^ + // + // foo ? bar : baz + // ^^^^^^^^^^^^^^^ + const pm_if_node_t *cast = (const pm_if_node_t *) node; + pm_compile_conditional(iseq, &location, PM_IF_NODE, (const pm_node_t *) cast, cast->statements, cast->subsequent, cast->predicate, ret, popped, scope_node); return; } - case PM_MULTI_WRITE_NODE: { - // foo, bar = baz - // ^^^^^^^^^^^^^^ + case PM_IMAGINARY_NODE: { + // 1i + // ^^ + if (!popped) { + PUSH_INSN1(ret, location, putobject, parse_imaginary((const pm_imaginary_node_t *) node)); + } + return; + } + case PM_IMPLICIT_NODE: { + // Implicit nodes mark places in the syntax tree where explicit syntax + // was omitted, but implied. For example, // - // A multi write node represents writing to multiple values using an = - // operator. Importantly these nodes are only parsed when the left-hand - // side of the operator has multiple targets. The right-hand side of the - // operator having multiple targets represents an implicit array - // instead. - const pm_multi_write_node_t *cast = (const pm_multi_write_node_t *) node; + // { foo: } + // + // In this case a method call/local variable read is implied by virtue + // of the missing value. To compile these nodes, we simply compile the + // value that is implied, which is helpfully supplied by the parser. + const pm_implicit_node_t *cast = (const pm_implicit_node_t *) node; + PM_COMPILE(cast->value); + return; + } + case PM_IN_NODE: { + // In nodes are handled by the case match node directly, so we should + // never end up hitting them through this path. + rb_bug("Should not ever enter an in node directly"); + return; + } + case PM_INDEX_OPERATOR_WRITE_NODE: { + // foo[bar] += baz + // ^^^^^^^^^^^^^^^ + const pm_index_operator_write_node_t *cast = (const pm_index_operator_write_node_t *) node; + pm_compile_index_operator_write_node(iseq, cast, &location, ret, popped, scope_node); + return; + } + case PM_INDEX_AND_WRITE_NODE: { + // foo[bar] &&= baz + // ^^^^^^^^^^^^^^^^ + const pm_index_and_write_node_t *cast = (const pm_index_and_write_node_t *) node; + pm_compile_index_control_flow_write_node(iseq, node, cast->receiver, cast->arguments, cast->block, cast->value, &location, ret, popped, scope_node); + return; + } + case PM_INDEX_OR_WRITE_NODE: { + // foo[bar] ||= baz + // ^^^^^^^^^^^^^^^^ + const pm_index_or_write_node_t *cast = (const pm_index_or_write_node_t *) node; + pm_compile_index_control_flow_write_node(iseq, node, cast->receiver, cast->arguments, cast->block, cast->value, &location, ret, popped, scope_node); + return; + } + case PM_INSTANCE_VARIABLE_AND_WRITE_NODE: { + // @foo &&= bar + // ^^^^^^^^^^^^ + const pm_instance_variable_and_write_node_t *cast = (const pm_instance_variable_and_write_node_t *) node; + LABEL *end_label = NEW_LABEL(location.line); - DECL_ANCHOR(writes); - INIT_ANCHOR(writes); + ID name_id = pm_constant_id_lookup(scope_node, cast->name); + VALUE name = ID2SYM(name_id); - DECL_ANCHOR(cleanup); - INIT_ANCHOR(cleanup); + PUSH_INSN2(ret, location, getinstancevariable, name, get_ivar_ic_value(iseq, name_id)); + if (!popped) PUSH_INSN(ret, location, dup); - pm_multi_target_state_t state = { 0 }; - state.position = popped ? 0 : 1; - pm_compile_multi_target_node(iseq, node, ret, writes, cleanup, scope_node, &state); + PUSH_INSNL(ret, location, branchunless, end_label); + if (!popped) PUSH_INSN(ret, location, pop); PM_COMPILE_NOT_POPPED(cast->value); if (!popped) PUSH_INSN(ret, location, dup); - PUSH_SEQ(ret, writes); - if (!popped && state.stack_size >= 1) { - // Make sure the value on the right-hand side of the = operator is - // being returned before we pop the parent expressions. - PUSH_INSN1(ret, location, setn, INT2FIX(state.stack_size)); - } - - // Now, we need to go back and modify the topn instructions in order to - // ensure they can correctly retrieve the parent expressions. - pm_multi_target_state_update(&state); - - PUSH_SEQ(ret, cleanup); - return; - } - case PM_NEXT_NODE: { - // next - // ^^^^ - // - // next foo - // ^^^^^^^^ - const pm_next_node_t *cast = (const pm_next_node_t *) node; - - if (ISEQ_COMPILE_DATA(iseq)->redo_label != 0 && can_add_ensure_iseq(iseq)) { - LABEL *splabel = NEW_LABEL(0); - PUSH_LABEL(ret, splabel); + PUSH_INSN2(ret, location, setinstancevariable, name, get_ivar_ic_value(iseq, name_id)); + PUSH_LABEL(ret, end_label); - if (cast->arguments) { - PM_COMPILE_NOT_POPPED((const pm_node_t *) cast->arguments); - } - else { - PUSH_INSN(ret, location, putnil); - } - pm_add_ensure_iseq(ret, iseq, 0, scope_node); + return; + } + case PM_INSTANCE_VARIABLE_OPERATOR_WRITE_NODE: { + // @foo += bar + // ^^^^^^^^^^^ + const pm_instance_variable_operator_write_node_t *cast = (const pm_instance_variable_operator_write_node_t *) node; - PUSH_ADJUST(ret, location, ISEQ_COMPILE_DATA(iseq)->redo_label); - PUSH_INSNL(ret, location, jump, ISEQ_COMPILE_DATA(iseq)->start_label); + ID name_id = pm_constant_id_lookup(scope_node, cast->name); + VALUE name = ID2SYM(name_id); - PUSH_ADJUST_RESTORE(ret, splabel); - if (!popped) PUSH_INSN(ret, location, putnil); - } - else if (ISEQ_COMPILE_DATA(iseq)->end_label && can_add_ensure_iseq(iseq)) { - LABEL *splabel = NEW_LABEL(0); + PUSH_INSN2(ret, location, getinstancevariable, name, get_ivar_ic_value(iseq, name_id)); + PM_COMPILE_NOT_POPPED(cast->value); - PUSH_LABEL(ret, splabel); - PUSH_ADJUST(ret, location, ISEQ_COMPILE_DATA(iseq)->start_label); + ID method_id = pm_constant_id_lookup(scope_node, cast->binary_operator); + int flags = VM_CALL_ARGS_SIMPLE; + PUSH_SEND_WITH_FLAG(ret, location, method_id, INT2NUM(1), INT2FIX(flags)); - if (cast->arguments != NULL) { - PM_COMPILE_NOT_POPPED((const pm_node_t *) cast->arguments); - } - else { - PUSH_INSN(ret, location, putnil); - } + if (!popped) PUSH_INSN(ret, location, dup); + PUSH_INSN2(ret, location, setinstancevariable, name, get_ivar_ic_value(iseq, name_id)); - pm_add_ensure_iseq(ret, iseq, 0, scope_node); - PUSH_INSNL(ret, location, jump, ISEQ_COMPILE_DATA(iseq)->end_label); - PUSH_ADJUST_RESTORE(ret, splabel); - splabel->unremovable = FALSE; + return; + } + case PM_INSTANCE_VARIABLE_OR_WRITE_NODE: { + // @foo ||= bar + // ^^^^^^^^^^^^ + const pm_instance_variable_or_write_node_t *cast = (const pm_instance_variable_or_write_node_t *) node; + LABEL *end_label = NEW_LABEL(location.line); - if (!popped) PUSH_INSN(ret, location, putnil); - } - else { - const rb_iseq_t *ip = iseq; - unsigned long throw_flag = 0; + ID name_id = pm_constant_id_lookup(scope_node, cast->name); + VALUE name = ID2SYM(name_id); - while (ip) { - if (!ISEQ_COMPILE_DATA(ip)) { - ip = 0; - break; - } + PUSH_INSN2(ret, location, getinstancevariable, name, get_ivar_ic_value(iseq, name_id)); + if (!popped) PUSH_INSN(ret, location, dup); - throw_flag = VM_THROW_NO_ESCAPE_FLAG; - if (ISEQ_COMPILE_DATA(ip)->redo_label != 0) { - /* while loop */ - break; - } - else if (ISEQ_BODY(ip)->type == ISEQ_TYPE_BLOCK) { - break; - } - else if (ISEQ_BODY(ip)->type == ISEQ_TYPE_EVAL) { - COMPILE_ERROR(iseq, location.line, "Can't escape from eval with next"); - return; - } + PUSH_INSNL(ret, location, branchif, end_label); + if (!popped) PUSH_INSN(ret, location, pop); - ip = ISEQ_BODY(ip)->parent_iseq; - } - if (ip != 0) { - if (cast->arguments) { - PM_COMPILE_NOT_POPPED((const pm_node_t *) cast->arguments); - } - else { - PUSH_INSN(ret, location, putnil); - } + PM_COMPILE_NOT_POPPED(cast->value); + if (!popped) PUSH_INSN(ret, location, dup); - PUSH_INSN1(ret, location, throw, INT2FIX(throw_flag | TAG_NEXT)); - if (popped) PUSH_INSN(ret, location, pop); - } - else { - COMPILE_ERROR(iseq, location.line, "Invalid next"); - return; - } - } + PUSH_INSN2(ret, location, setinstancevariable, name, get_ivar_ic_value(iseq, name_id)); + PUSH_LABEL(ret, end_label); return; } - case PM_NIL_NODE: { - // nil - // ^^^ + case PM_INSTANCE_VARIABLE_READ_NODE: { + // @foo + // ^^^^ if (!popped) { - PUSH_INSN(ret, location, putnil); + const pm_instance_variable_read_node_t *cast = (const pm_instance_variable_read_node_t *) node; + ID name = pm_constant_id_lookup(scope_node, cast->name); + PUSH_INSN2(ret, location, getinstancevariable, ID2SYM(name), get_ivar_ic_value(iseq, name)); } - return; } - case PM_NO_KEYWORDS_PARAMETER_NODE: { - // def foo(**nil); end - // ^^^^^ - ISEQ_BODY(iseq)->param.flags.accepts_no_kwarg = TRUE; + case PM_INSTANCE_VARIABLE_WRITE_NODE: { + // @foo = 1 + // ^^^^^^^^ + const pm_instance_variable_write_node_t *cast = (const pm_instance_variable_write_node_t *) node; + PM_COMPILE_NOT_POPPED(cast->value); + if (!popped) PUSH_INSN(ret, location, dup); + + ID name = pm_constant_id_lookup(scope_node, cast->name); + PUSH_INSN2(ret, location, setinstancevariable, ID2SYM(name), get_ivar_ic_value(iseq, name)); + return; } - case PM_NUMBERED_REFERENCE_READ_NODE: { - // $1 - // ^^ + case PM_INTEGER_NODE: { + // 1 + // ^ if (!popped) { - uint32_t reference_number = ((const pm_numbered_reference_read_node_t *) node)->number; - - if (reference_number > 0) { - PUSH_INSN2(ret, location, getspecial, INT2FIX(1), INT2FIX(reference_number << 1)); - } - else { - PUSH_INSN(ret, location, putnil); + PUSH_INSN1(ret, location, putobject, parse_integer((const pm_integer_node_t *) node)); + } + return; + } + case PM_INTERPOLATED_MATCH_LAST_LINE_NODE: { + // if /foo #{bar}/ then end + // ^^^^^^^^^^^^ + if (PM_NODE_FLAG_P(node, PM_NODE_FLAG_STATIC_LITERAL)) { + if (!popped) { + VALUE regexp = pm_static_literal_value(iseq, node, scope_node); + PUSH_INSN1(ret, location, putobject, regexp); } } + else { + pm_compile_regexp_dynamic(iseq, node, &((const pm_interpolated_match_last_line_node_t *) node)->parts, &location, ret, popped, scope_node); + } + + PUSH_INSN1(ret, location, getglobal, rb_id2sym(idLASTLINE)); + PUSH_SEND(ret, location, idEqTilde, INT2NUM(1)); + if (popped) PUSH_INSN(ret, location, pop); return; } - case PM_OR_NODE: { - // a or b - // ^^^^^^ - const pm_or_node_t *cast = (const pm_or_node_t *) node; + case PM_INTERPOLATED_REGULAR_EXPRESSION_NODE: { + // /foo #{bar}/ + // ^^^^^^^^^^^^ + if (PM_NODE_FLAG_P(node, PM_REGULAR_EXPRESSION_FLAGS_ONCE)) { + const rb_iseq_t *prevblock = ISEQ_COMPILE_DATA(iseq)->current_block; + const rb_iseq_t *block_iseq = NULL; + int ise_index = ISEQ_BODY(iseq)->ise_size++; - LABEL *end_label = NEW_LABEL(location.line); - PM_COMPILE_NOT_POPPED(cast->left); + pm_scope_node_t next_scope_node; + pm_scope_node_init(node, &next_scope_node, scope_node); - if (!popped) PUSH_INSN(ret, location, dup); - PUSH_INSNL(ret, location, branchif, end_label); + block_iseq = NEW_CHILD_ISEQ(&next_scope_node, make_name_for_block(iseq), ISEQ_TYPE_BLOCK, location.line); + pm_scope_node_destroy(&next_scope_node); - if (!popped) PUSH_INSN(ret, location, pop); - PM_COMPILE(cast->right); - PUSH_LABEL(ret, end_label); + ISEQ_COMPILE_DATA(iseq)->current_block = block_iseq; + PUSH_INSN2(ret, location, once, block_iseq, INT2FIX(ise_index)); + ISEQ_COMPILE_DATA(iseq)->current_block = prevblock; - return; - } - case PM_OPTIONAL_PARAMETER_NODE: { - // def foo(bar = 1); end - // ^^^^^^^ - const pm_optional_parameter_node_t *cast = (const pm_optional_parameter_node_t *) node; - PM_COMPILE_NOT_POPPED(cast->value); + if (popped) PUSH_INSN(ret, location, pop); + return; + } - pm_local_index_t index = pm_lookup_local_index(iseq, scope_node, cast->name, 0); - PUSH_SETLOCAL(ret, location, index.index, index.level); + if (PM_NODE_FLAG_P(node, PM_NODE_FLAG_STATIC_LITERAL)) { + if (!popped) { + VALUE regexp = pm_static_literal_value(iseq, node, scope_node); + PUSH_INSN1(ret, location, putobject, regexp); + } + } + else { + pm_compile_regexp_dynamic(iseq, node, &((const pm_interpolated_regular_expression_node_t *) node)->parts, &location, ret, popped, scope_node); + if (popped) PUSH_INSN(ret, location, pop); + } return; } - case PM_PARENTHESES_NODE: { - // () - // ^^ - // - // (1) - // ^^^ - const pm_parentheses_node_t *cast = (const pm_parentheses_node_t *) node; + case PM_INTERPOLATED_STRING_NODE: { + // "foo #{bar}" + // ^^^^^^^^^^^^ + if (PM_NODE_FLAG_P(node, PM_NODE_FLAG_STATIC_LITERAL)) { + if (!popped) { + VALUE string = pm_static_literal_value(iseq, node, scope_node); - if (cast->body != NULL) { - PM_COMPILE(cast->body); + if (PM_NODE_FLAG_P(node, PM_INTERPOLATED_STRING_NODE_FLAGS_FROZEN)) { + PUSH_INSN1(ret, location, putobject, string); + } + else if (PM_NODE_FLAG_P(node, PM_INTERPOLATED_STRING_NODE_FLAGS_MUTABLE)) { + PUSH_INSN1(ret, location, putstring, string); + } + else { + PUSH_INSN1(ret, location, putchilledstring, string); + } + } } - else if (!popped) { - PUSH_INSN(ret, location, putnil); + else { + const pm_interpolated_string_node_t *cast = (const pm_interpolated_string_node_t *) node; + int length = pm_interpolated_node_compile(iseq, &cast->parts, &location, ret, popped, scope_node, NULL, NULL); + if (length > 1) PUSH_INSN1(ret, location, concatstrings, INT2FIX(length)); + if (popped) PUSH_INSN(ret, location, pop); } return; } - case PM_PRE_EXECUTION_NODE: { - // BEGIN {} - // ^^^^^^^^ - const pm_pre_execution_node_t *cast = (const pm_pre_execution_node_t *) node; - - LINK_ANCHOR *outer_pre = scope_node->pre_execution_anchor; - RUBY_ASSERT(outer_pre != NULL); - - // BEGIN{} nodes can be nested, so here we're going to do the same thing - // that we did for the top-level compilation where we create two - // anchors and then join them in the correct order into the resulting - // anchor. - DECL_ANCHOR(inner_pre); - INIT_ANCHOR(inner_pre); - scope_node->pre_execution_anchor = inner_pre; - - DECL_ANCHOR(inner_body); - INIT_ANCHOR(inner_body); - - if (cast->statements != NULL) { - const pm_node_list_t *body = &cast->statements->body; + case PM_INTERPOLATED_SYMBOL_NODE: { + // :"foo #{bar}" + // ^^^^^^^^^^^^^ + const pm_interpolated_symbol_node_t *cast = (const pm_interpolated_symbol_node_t *) node; + int length = pm_interpolated_node_compile(iseq, &cast->parts, &location, ret, popped, scope_node, NULL, NULL); - for (size_t index = 0; index < body->size; index++) { - pm_compile_node(iseq, body->nodes[index], inner_body, true, scope_node); - } + if (length > 1) { + PUSH_INSN1(ret, location, concatstrings, INT2FIX(length)); } if (!popped) { - PUSH_INSN(inner_body, location, putnil); + PUSH_INSN(ret, location, intern); + } + else { + PUSH_INSN(ret, location, pop); } - - // Now that everything has been compiled, join both anchors together - // into the correct outer pre execution anchor, and reset the value so - // that subsequent BEGIN{} nodes can be compiled correctly. - PUSH_SEQ(outer_pre, inner_pre); - PUSH_SEQ(outer_pre, inner_body); - scope_node->pre_execution_anchor = outer_pre; return; } - case PM_POST_EXECUTION_NODE: { - // END {} - // ^^^^^^ - const rb_iseq_t *child_iseq; - const rb_iseq_t *prevblock = ISEQ_COMPILE_DATA(iseq)->current_block; + case PM_INTERPOLATED_X_STRING_NODE: { + // `foo #{bar}` + // ^^^^^^^^^^^^ + const pm_interpolated_x_string_node_t *cast = (const pm_interpolated_x_string_node_t *) node; - pm_scope_node_t next_scope_node; - pm_scope_node_init(node, &next_scope_node, scope_node); - child_iseq = NEW_CHILD_ISEQ(&next_scope_node, make_name_for_block(iseq), ISEQ_TYPE_BLOCK, lineno); - pm_scope_node_destroy(&next_scope_node); + PUSH_INSN(ret, location, putself); - ISEQ_COMPILE_DATA(iseq)->current_block = child_iseq; + int length = pm_interpolated_node_compile(iseq, &cast->parts, &location, ret, false, scope_node, NULL, NULL); + if (length > 1) PUSH_INSN1(ret, location, concatstrings, INT2FIX(length)); - int is_index = ISEQ_BODY(iseq)->ise_size++; - PUSH_INSN2(ret, location, once, child_iseq, INT2FIX(is_index)); - RB_OBJ_WRITTEN(iseq, Qundef, (VALUE) child_iseq); + PUSH_SEND_WITH_FLAG(ret, location, idBackquote, INT2NUM(1), INT2FIX(VM_CALL_FCALL | VM_CALL_ARGS_SIMPLE)); if (popped) PUSH_INSN(ret, location, pop); - ISEQ_COMPILE_DATA(iseq)->current_block = prevblock; - return; } - case PM_RANGE_NODE: { - // 0..5 - // ^^^^ - const pm_range_node_t *cast = (const pm_range_node_t *) node; - bool exclude_end = PM_NODE_FLAG_P(cast, PM_RANGE_FLAGS_EXCLUDE_END); - - if (pm_optimizable_range_item_p(cast->left) && pm_optimizable_range_item_p(cast->right)) { - if (!popped) { - const pm_node_t *left = cast->left; - const pm_node_t *right = cast->right; - - VALUE val = rb_range_new( - (left && PM_NODE_TYPE_P(left, PM_INTEGER_NODE)) ? parse_integer((const pm_integer_node_t *) left) : Qnil, - (right && PM_NODE_TYPE_P(right, PM_INTEGER_NODE)) ? parse_integer((const pm_integer_node_t *) right) : Qnil, - exclude_end - ); - - PUSH_INSN1(ret, location, putobject, val); - } + case PM_IT_LOCAL_VARIABLE_READ_NODE: { + // -> { it } + // ^^ + if (!popped) { + PUSH_GETLOCAL(ret, location, scope_node->local_table_for_iseq_size, 0); } - else { - if (cast->left == NULL) { - PUSH_INSN(ret, location, putnil); - } - else { - PM_COMPILE(cast->left); - } - - if (cast->right == NULL) { - PUSH_INSN(ret, location, putnil); - } - else { - PM_COMPILE(cast->right); - } - if (!popped) { - PUSH_INSN1(ret, location, newrange, INT2FIX(exclude_end ? 1 : 0)); - } - } return; } - case PM_RATIONAL_NODE: { - // 1r - // ^^ - if (!popped) { - PUSH_INSN1(ret, location, putobject, parse_rational((const pm_rational_node_t *) node)); + case PM_KEYWORD_HASH_NODE: { + // foo(bar: baz) + // ^^^^^^^^ + const pm_keyword_hash_node_t *cast = (const pm_keyword_hash_node_t *) node; + const pm_node_list_t *elements = &cast->elements; + + const pm_node_t *element; + PM_NODE_LIST_FOREACH(elements, index, element) { + PM_COMPILE(element); } + + if (!popped) PUSH_INSN1(ret, location, newhash, INT2FIX(elements->size * 2)); return; } - case PM_REDO_NODE: { - // redo - // ^^^^ - if (ISEQ_COMPILE_DATA(iseq)->redo_label && can_add_ensure_iseq(iseq)) { - LABEL *splabel = NEW_LABEL(0); + case PM_LAMBDA_NODE: { + // -> {} + // ^^^^^ + const pm_lambda_node_t *cast = (const pm_lambda_node_t *) node; - PUSH_LABEL(ret, splabel); - PUSH_ADJUST(ret, location, ISEQ_COMPILE_DATA(iseq)->redo_label); - pm_add_ensure_iseq(ret, iseq, 0, scope_node); + pm_scope_node_t next_scope_node; + pm_scope_node_init(node, &next_scope_node, scope_node); - PUSH_INSNL(ret, location, jump, ISEQ_COMPILE_DATA(iseq)->redo_label); - PUSH_ADJUST_RESTORE(ret, splabel); - if (!popped) PUSH_INSN(ret, location, putnil); - } - else if (ISEQ_BODY(iseq)->type != ISEQ_TYPE_EVAL && ISEQ_COMPILE_DATA(iseq)->start_label && can_add_ensure_iseq(iseq)) { - LABEL *splabel = NEW_LABEL(0); + int opening_lineno = pm_location_line_number(parser, &cast->opening_loc); + const rb_iseq_t *block = NEW_CHILD_ISEQ(&next_scope_node, make_name_for_block(iseq), ISEQ_TYPE_BLOCK, opening_lineno); + pm_scope_node_destroy(&next_scope_node); - PUSH_LABEL(ret, splabel); - pm_add_ensure_iseq(ret, iseq, 0, scope_node); - PUSH_ADJUST(ret, location, ISEQ_COMPILE_DATA(iseq)->start_label); + VALUE argc = INT2FIX(0); + PUSH_INSN1(ret, location, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); + PUSH_CALL_WITH_BLOCK(ret, location, idLambda, argc, block); + RB_OBJ_WRITTEN(iseq, Qundef, (VALUE) block); - PUSH_INSNL(ret, location, jump, ISEQ_COMPILE_DATA(iseq)->start_label); - PUSH_ADJUST_RESTORE(ret, splabel); - if (!popped) PUSH_INSN(ret, location, putnil); - } - else { - const rb_iseq_t *ip = iseq; + if (popped) PUSH_INSN(ret, location, pop); + return; + } + case PM_LOCAL_VARIABLE_AND_WRITE_NODE: { + // foo &&= bar + // ^^^^^^^^^^^ + const pm_local_variable_and_write_node_t *cast = (const pm_local_variable_and_write_node_t *) node; + LABEL *end_label = NEW_LABEL(location.line); - while (ip) { - if (!ISEQ_COMPILE_DATA(ip)) { - ip = 0; - break; - } + pm_local_index_t local_index = pm_lookup_local_index(iseq, scope_node, cast->name, cast->depth); + PUSH_GETLOCAL(ret, location, local_index.index, local_index.level); + if (!popped) PUSH_INSN(ret, location, dup); - if (ISEQ_COMPILE_DATA(ip)->redo_label != 0) { - break; - } - else if (ISEQ_BODY(ip)->type == ISEQ_TYPE_BLOCK) { - break; - } - else if (ISEQ_BODY(ip)->type == ISEQ_TYPE_EVAL) { - COMPILE_ERROR(iseq, location.line, "Can't escape from eval with redo"); - return; - } + PUSH_INSNL(ret, location, branchunless, end_label); + if (!popped) PUSH_INSN(ret, location, pop); - ip = ISEQ_BODY(ip)->parent_iseq; - } + PM_COMPILE_NOT_POPPED(cast->value); + if (!popped) PUSH_INSN(ret, location, dup); + + PUSH_SETLOCAL(ret, location, local_index.index, local_index.level); + PUSH_LABEL(ret, end_label); - if (ip != 0) { - PUSH_INSN(ret, location, putnil); - PUSH_INSN1(ret, location, throw, INT2FIX(VM_THROW_NO_ESCAPE_FLAG | TAG_REDO)); - if (popped) PUSH_INSN(ret, location, pop); - } - else { - COMPILE_ERROR(iseq, location.line, "Invalid redo"); - return; - } - } return; } - case PM_REGULAR_EXPRESSION_NODE: { - // /foo/ - // ^^^^^ - if (!popped) { - VALUE regexp = pm_static_literal_value(iseq, node, scope_node); - PUSH_INSN1(ret, location, putobject, regexp); - } + case PM_LOCAL_VARIABLE_OPERATOR_WRITE_NODE: { + // foo += bar + // ^^^^^^^^^^ + const pm_local_variable_operator_write_node_t *cast = (const pm_local_variable_operator_write_node_t *) node; + + pm_local_index_t local_index = pm_lookup_local_index(iseq, scope_node, cast->name, cast->depth); + PUSH_GETLOCAL(ret, location, local_index.index, local_index.level); + + PM_COMPILE_NOT_POPPED(cast->value); + + ID method_id = pm_constant_id_lookup(scope_node, cast->binary_operator); + PUSH_SEND_WITH_FLAG(ret, location, method_id, INT2NUM(1), INT2FIX(VM_CALL_ARGS_SIMPLE)); + + if (!popped) PUSH_INSN(ret, location, dup); + PUSH_SETLOCAL(ret, location, local_index.index, local_index.level); + return; } - case PM_RESCUE_NODE: { - // begin; rescue; end - // ^^^^^^^ - const pm_rescue_node_t *cast = (const pm_rescue_node_t *) node; - iseq_set_exception_local_table(iseq); + case PM_LOCAL_VARIABLE_OR_WRITE_NODE: { + // foo ||= bar + // ^^^^^^^^^^^ + const pm_local_variable_or_write_node_t *cast = (const pm_local_variable_or_write_node_t *) node; - // First, establish the labels that we need to be able to jump to within - // this compilation block. - LABEL *exception_match_label = NEW_LABEL(location.line); - LABEL *rescue_end_label = NEW_LABEL(location.line); + LABEL *set_label = NEW_LABEL(location.line); + LABEL *end_label = NEW_LABEL(location.line); - // Next, compile each of the exceptions that we're going to be - // handling. For each one, we'll add instructions to check if the - // exception matches the raised one, and if it does then jump to the - // exception_match_label label. Otherwise it will fall through to the - // subsequent check. If there are no exceptions, we'll only check - // StandardError. - const pm_node_list_t *exceptions = &cast->exceptions; + PUSH_INSN1(ret, location, putobject, Qtrue); + PUSH_INSNL(ret, location, branchunless, set_label); - if (exceptions->size > 0) { - for (size_t index = 0; index < exceptions->size; index++) { - PUSH_GETLOCAL(ret, location, LVAR_ERRINFO, 0); - PM_COMPILE(exceptions->nodes[index]); - int checkmatch_flags = VM_CHECKMATCH_TYPE_RESCUE; - if (PM_NODE_TYPE_P(exceptions->nodes[index], PM_SPLAT_NODE)) { - checkmatch_flags |= VM_CHECKMATCH_ARRAY; - } - PUSH_INSN1(ret, location, checkmatch, INT2FIX(checkmatch_flags)); - PUSH_INSNL(ret, location, branchif, exception_match_label); - } - } - else { - PUSH_GETLOCAL(ret, location, LVAR_ERRINFO, 0); - PUSH_INSN1(ret, location, putobject, rb_eStandardError); - PUSH_INSN1(ret, location, checkmatch, INT2FIX(VM_CHECKMATCH_TYPE_RESCUE)); - PUSH_INSNL(ret, location, branchif, exception_match_label); - } + pm_local_index_t local_index = pm_lookup_local_index(iseq, scope_node, cast->name, cast->depth); + PUSH_GETLOCAL(ret, location, local_index.index, local_index.level); + if (!popped) PUSH_INSN(ret, location, dup); + + PUSH_INSNL(ret, location, branchif, end_label); + if (!popped) PUSH_INSN(ret, location, pop); + + PUSH_LABEL(ret, set_label); + PM_COMPILE_NOT_POPPED(cast->value); + if (!popped) PUSH_INSN(ret, location, dup); - // If none of the exceptions that we are matching against matched, then - // we'll jump straight to the rescue_end_label label. - PUSH_INSNL(ret, location, jump, rescue_end_label); + PUSH_SETLOCAL(ret, location, local_index.index, local_index.level); + PUSH_LABEL(ret, end_label); - // Here we have the exception_match_label, which is where the - // control-flow goes in the case that one of the exceptions matched. - // Here we will compile the instructions to handle the exception. - PUSH_LABEL(ret, exception_match_label); - PUSH_TRACE(ret, RUBY_EVENT_RESCUE); + return; + } + case PM_LOCAL_VARIABLE_READ_NODE: { + // foo + // ^^^ + if (!popped) { + const pm_local_variable_read_node_t *cast = (const pm_local_variable_read_node_t *) node; + pm_local_index_t index = pm_lookup_local_index(iseq, scope_node, cast->name, cast->depth); + PUSH_GETLOCAL(ret, location, index.index, index.level); + } - // If we have a reference to the exception, then we'll compile the write - // into the instruction sequence. This can look quite different - // depending on the kind of write being performed. - if (cast->reference) { - DECL_ANCHOR(writes); - INIT_ANCHOR(writes); + return; + } + case PM_LOCAL_VARIABLE_WRITE_NODE: { + // foo = 1 + // ^^^^^^^ + const pm_local_variable_write_node_t *cast = (const pm_local_variable_write_node_t *) node; + PM_COMPILE_NOT_POPPED(cast->value); + if (!popped) PUSH_INSN(ret, location, dup); - DECL_ANCHOR(cleanup); - INIT_ANCHOR(cleanup); + pm_local_index_t index = pm_lookup_local_index(iseq, scope_node, cast->name, cast->depth); + PUSH_SETLOCAL(ret, location, index.index, index.level); + return; + } + case PM_MATCH_LAST_LINE_NODE: { + // if /foo/ then end + // ^^^^^ + VALUE regexp = pm_static_literal_value(iseq, node, scope_node); - pm_compile_target_node(iseq, cast->reference, ret, writes, cleanup, scope_node, NULL); - PUSH_GETLOCAL(ret, location, LVAR_ERRINFO, 0); + PUSH_INSN1(ret, location, putobject, regexp); + PUSH_INSN2(ret, location, getspecial, INT2FIX(0), INT2FIX(0)); + PUSH_SEND(ret, location, idEqTilde, INT2NUM(1)); + if (popped) PUSH_INSN(ret, location, pop); - PUSH_SEQ(ret, writes); - PUSH_SEQ(ret, cleanup); - } + return; + } + case PM_MATCH_PREDICATE_NODE: { + // foo in bar + // ^^^^^^^^^^ + const pm_match_predicate_node_t *cast = (const pm_match_predicate_node_t *) node; - // If we have statements to execute, we'll compile them here. Otherwise - // we'll push nil onto the stack. - if (cast->statements) { - // We'll temporarily remove the end_label location from the iseq - // when compiling the statements so that next/redo statements - // inside the body will throw to the correct place instead of - // jumping straight to the end of this iseq - LABEL *prev_end = ISEQ_COMPILE_DATA(iseq)->end_label; - ISEQ_COMPILE_DATA(iseq)->end_label = NULL; + // First, allocate some stack space for the cached return value of any + // calls to #deconstruct. + PUSH_INSN(ret, location, putnil); - PM_COMPILE((const pm_node_t *) cast->statements); + // Next, compile the expression that we're going to match against. + PM_COMPILE_NOT_POPPED(cast->value); + PUSH_INSN(ret, location, dup); - // Now restore the end_label - ISEQ_COMPILE_DATA(iseq)->end_label = prev_end; - } - else { - PUSH_INSN(ret, location, putnil); - } + // Now compile the pattern that is going to be used to match against the + // expression. + LABEL *matched_label = NEW_LABEL(location.line); + LABEL *unmatched_label = NEW_LABEL(location.line); + LABEL *done_label = NEW_LABEL(location.line); + pm_compile_pattern(iseq, scope_node, cast->pattern, ret, matched_label, unmatched_label, false, false, true, 2); - PUSH_INSN(ret, location, leave); + // If the pattern did not match, then compile the necessary instructions + // to handle pushing false onto the stack, then jump to the end. + PUSH_LABEL(ret, unmatched_label); + PUSH_INSN(ret, location, pop); + PUSH_INSN(ret, location, pop); - // Here we'll insert the rescue_end_label label, which is jumped to if - // none of the exceptions matched. It will cause the control-flow to - // either jump to the next rescue clause or it will fall through to the - // subsequent instruction returning the raised error. - PUSH_LABEL(ret, rescue_end_label); - if (cast->subsequent) { - PM_COMPILE((const pm_node_t *) cast->subsequent); - } - else { - PUSH_GETLOCAL(ret, location, 1, 0); - } + if (!popped) PUSH_INSN1(ret, location, putobject, Qfalse); + PUSH_INSNL(ret, location, jump, done_label); + PUSH_INSN(ret, location, putnil); + + // If the pattern did match, then compile the necessary instructions to + // handle pushing true onto the stack, then jump to the end. + PUSH_LABEL(ret, matched_label); + PUSH_INSN1(ret, location, adjuststack, INT2FIX(2)); + if (!popped) PUSH_INSN1(ret, location, putobject, Qtrue); + PUSH_INSNL(ret, location, jump, done_label); + PUSH_LABEL(ret, done_label); return; } - case PM_RESCUE_MODIFIER_NODE: { - // foo rescue bar - // ^^^^^^^^^^^^^^ - const pm_rescue_modifier_node_t *cast = (const pm_rescue_modifier_node_t *) node; + case PM_MATCH_REQUIRED_NODE: { + // foo => bar + // ^^^^^^^^^^ + // + // A match required node represents pattern matching against a single + // pattern using the => operator. For example, + // + // foo => bar + // + // This is somewhat analogous to compiling a case match statement with a + // single pattern. In both cases, if the pattern fails it should + // immediately raise an error. + const pm_match_required_node_t *cast = (const pm_match_required_node_t *) node; - pm_scope_node_t rescue_scope_node; - pm_scope_node_init((const pm_node_t *) cast, &rescue_scope_node, scope_node); + LABEL *matched_label = NEW_LABEL(location.line); + LABEL *unmatched_label = NEW_LABEL(location.line); + LABEL *done_label = NEW_LABEL(location.line); - rb_iseq_t *rescue_iseq = NEW_CHILD_ISEQ( - &rescue_scope_node, - rb_str_concat(rb_str_new2("rescue in "), ISEQ_BODY(iseq)->location.label), - ISEQ_TYPE_RESCUE, - pm_node_line_number(parser, cast->rescue_expression) - ); + // First, we're going to push a bunch of stuff onto the stack that is + // going to serve as our scratch space. + PUSH_INSN(ret, location, putnil); // key error key + PUSH_INSN(ret, location, putnil); // key error matchee + PUSH_INSN1(ret, location, putobject, Qfalse); // key error? + PUSH_INSN(ret, location, putnil); // error string + PUSH_INSN(ret, location, putnil); // deconstruct cache - pm_scope_node_destroy(&rescue_scope_node); + // Next we're going to compile the value expression such that it's on + // the stack. + PM_COMPILE_NOT_POPPED(cast->value); - LABEL *lstart = NEW_LABEL(location.line); - LABEL *lend = NEW_LABEL(location.line); - LABEL *lcont = NEW_LABEL(location.line); + // Here we'll dup it so that it can be used for comparison, but also be + // used for error handling. + PUSH_INSN(ret, location, dup); - lstart->rescued = LABEL_RESCUE_BEG; - lend->rescued = LABEL_RESCUE_END; + // Next we'll compile the pattern. We indicate to the pm_compile_pattern + // function that this is the only pattern that will be matched against + // through the in_single_pattern parameter. We also indicate that the + // value to compare against is 2 slots from the top of the stack (the + // base_index parameter). + pm_compile_pattern(iseq, scope_node, cast->pattern, ret, matched_label, unmatched_label, true, false, true, 2); - PUSH_LABEL(ret, lstart); - PM_COMPILE_NOT_POPPED(cast->expression); - PUSH_LABEL(ret, lend); + // If the pattern did not match the value, then we're going to compile + // in our error handler code. This will determine which error to raise + // and raise it. + PUSH_LABEL(ret, unmatched_label); + pm_compile_pattern_error_handler(iseq, scope_node, node, ret, done_label, popped); - PUSH_INSN(ret, location, nop); - PUSH_LABEL(ret, lcont); - if (popped) PUSH_INSN(ret, location, pop); + // If the pattern did match, we'll clean up the values we've pushed onto + // the stack and then push nil onto the stack if it's not popped. + PUSH_LABEL(ret, matched_label); + PUSH_INSN1(ret, location, adjuststack, INT2FIX(6)); + if (!popped) PUSH_INSN(ret, location, putnil); + PUSH_INSNL(ret, location, jump, done_label); - PUSH_CATCH_ENTRY(CATCH_TYPE_RESCUE, lstart, lend, rescue_iseq, lcont); - PUSH_CATCH_ENTRY(CATCH_TYPE_RETRY, lend, lcont, NULL, lstart); + PUSH_LABEL(ret, done_label); return; } - case PM_RETURN_NODE: { - // return - // ^^^^^^ + case PM_MATCH_WRITE_NODE: { + // /(?foo)/ =~ bar + // ^^^^^^^^^^^^^^^^^^^^ // - // return 1 - // ^^^^^^^^ - const pm_return_node_t *cast = (const pm_return_node_t *) node; - const pm_arguments_node_t *arguments = cast->arguments; + // Match write nodes are specialized call nodes that have a regular + // expression with valid named capture groups on the left, the =~ + // operator, and some value on the right. The nodes themselves simply + // wrap the call with the local variable targets that will be written + // when the call is executed. + const pm_match_write_node_t *cast = (const pm_match_write_node_t *) node; + LABEL *fail_label = NEW_LABEL(location.line); + LABEL *end_label = NEW_LABEL(location.line); - enum rb_iseq_type type = ISEQ_BODY(iseq)->type; - LABEL *splabel = 0; + // First, we'll compile the call so that all of its instructions are + // present. Then we'll compile all of the local variable targets. + PM_COMPILE_NOT_POPPED((const pm_node_t *) cast->call); - const rb_iseq_t *parent_iseq = iseq; - enum rb_iseq_type parent_type = ISEQ_BODY(parent_iseq)->type; - while (parent_type == ISEQ_TYPE_RESCUE || parent_type == ISEQ_TYPE_ENSURE) { - if (!(parent_iseq = ISEQ_BODY(parent_iseq)->parent_iseq)) break; - parent_type = ISEQ_BODY(parent_iseq)->type; + // Now, check if the match was successful. If it was, then we'll + // continue on and assign local variables. Otherwise we'll skip over the + // assignment code. + PUSH_INSN1(ret, location, getglobal, rb_id2sym(idBACKREF)); + PUSH_INSN(ret, location, dup); + PUSH_INSNL(ret, location, branchunless, fail_label); + + // If there's only a single local variable target, we can skip some of + // the bookkeeping, so we'll put a special branch here. + size_t targets_count = cast->targets.size; + + if (targets_count == 1) { + const pm_node_t *target = cast->targets.nodes[0]; + RUBY_ASSERT(PM_NODE_TYPE_P(target, PM_LOCAL_VARIABLE_TARGET_NODE)); + + const pm_local_variable_target_node_t *local_target = (const pm_local_variable_target_node_t *) target; + pm_local_index_t index = pm_lookup_local_index(iseq, scope_node, local_target->name, local_target->depth); + + PUSH_INSN1(ret, location, putobject, rb_id2sym(pm_constant_id_lookup(scope_node, local_target->name))); + PUSH_SEND(ret, location, idAREF, INT2FIX(1)); + PUSH_LABEL(ret, fail_label); + PUSH_SETLOCAL(ret, location, index.index, index.level); + if (popped) PUSH_INSN(ret, location, pop); + return; } - switch (parent_type) { - case ISEQ_TYPE_TOP: - case ISEQ_TYPE_MAIN: - if (arguments) { - rb_warn("argument of top-level return is ignored"); - } - if (parent_iseq == iseq) { - type = ISEQ_TYPE_METHOD; + DECL_ANCHOR(fail_anchor); + INIT_ANCHOR(fail_anchor); + + // Otherwise there is more than one local variable target, so we'll need + // to do some bookkeeping. + for (size_t targets_index = 0; targets_index < targets_count; targets_index++) { + const pm_node_t *target = cast->targets.nodes[targets_index]; + RUBY_ASSERT(PM_NODE_TYPE_P(target, PM_LOCAL_VARIABLE_TARGET_NODE)); + + const pm_local_variable_target_node_t *local_target = (const pm_local_variable_target_node_t *) target; + pm_local_index_t index = pm_lookup_local_index(iseq, scope_node, local_target->name, local_target->depth); + + if (((size_t) targets_index) < (targets_count - 1)) { + PUSH_INSN(ret, location, dup); } - break; - default: - break; - } + PUSH_INSN1(ret, location, putobject, rb_id2sym(pm_constant_id_lookup(scope_node, local_target->name))); + PUSH_SEND(ret, location, idAREF, INT2FIX(1)); + PUSH_SETLOCAL(ret, location, index.index, index.level); - if (type == ISEQ_TYPE_METHOD) { - splabel = NEW_LABEL(0); - PUSH_LABEL(ret, splabel); - PUSH_ADJUST(ret, location, 0); + PUSH_INSN(fail_anchor, location, putnil); + PUSH_SETLOCAL(fail_anchor, location, index.index, index.level); } - if (arguments) { - PM_COMPILE_NOT_POPPED((const pm_node_t *) arguments); - } - else { - PUSH_INSN(ret, location, putnil); - } + // Since we matched successfully, now we'll jump to the end. + PUSH_INSNL(ret, location, jump, end_label); - if (type == ISEQ_TYPE_METHOD && can_add_ensure_iseq(iseq)) { - pm_add_ensure_iseq(ret, iseq, 1, scope_node); - PUSH_TRACE(ret, RUBY_EVENT_RETURN); - PUSH_INSN(ret, location, leave); - PUSH_ADJUST_RESTORE(ret, splabel); - if (!popped) PUSH_INSN(ret, location, putnil); - } - else { - PUSH_INSN1(ret, location, throw, INT2FIX(TAG_RETURN)); - if (popped) PUSH_INSN(ret, location, pop); - } + // In the case that the match failed, we'll loop through each local + // variable target and set all of them to `nil`. + PUSH_LABEL(ret, fail_label); + PUSH_INSN(ret, location, pop); + PUSH_SEQ(ret, fail_anchor); + // Finally, we can push the end label for either case. + PUSH_LABEL(ret, end_label); + if (popped) PUSH_INSN(ret, location, pop); return; } - case PM_RETRY_NODE: { - // retry - // ^^^^^ - if (ISEQ_BODY(iseq)->type == ISEQ_TYPE_RESCUE) { - PUSH_INSN(ret, location, putnil); - PUSH_INSN1(ret, location, throw, INT2FIX(TAG_RETRY)); - if (popped) PUSH_INSN(ret, location, pop); - } - else { - COMPILE_ERROR(iseq, location.line, "Invalid retry"); - return; - } + case PM_MISSING_NODE: { + rb_bug("A pm_missing_node_t should not exist in prism's AST."); return; } - case PM_SCOPE_NODE: { - pm_scope_node_t *scope_node = (pm_scope_node_t *) node; - pm_constant_id_list_t *locals = &scope_node->locals; - - pm_parameters_node_t *parameters_node = NULL; - pm_node_list_t *keywords_list = NULL; - pm_node_list_t *optionals_list = NULL; - pm_node_list_t *posts_list = NULL; - pm_node_list_t *requireds_list = NULL; - pm_node_list_t *block_locals = NULL; - bool trailing_comma = false; + case PM_MODULE_NODE: { + // module Foo; end + // ^^^^^^^^^^^^^^^ + const pm_module_node_t *cast = (const pm_module_node_t *) node; - struct rb_iseq_constant_body *body = ISEQ_BODY(iseq); + ID module_id = pm_constant_id_lookup(scope_node, cast->name); + VALUE module_name = rb_str_freeze(rb_sprintf("", rb_id2str(module_id))); - if (PM_NODE_TYPE_P(scope_node->ast_node, PM_CLASS_NODE) || PM_NODE_TYPE_P(scope_node->ast_node, PM_MODULE_NODE)) { - ADD_TRACE(ret, RUBY_EVENT_CLASS); - } + pm_scope_node_t next_scope_node; + pm_scope_node_init((const pm_node_t *) cast, &next_scope_node, scope_node); - if (scope_node->parameters) { - switch (PM_NODE_TYPE(scope_node->parameters)) { - case PM_BLOCK_PARAMETERS_NODE: { - pm_block_parameters_node_t *cast = (pm_block_parameters_node_t *) scope_node->parameters; - parameters_node = cast->parameters; - block_locals = &cast->locals; + const rb_iseq_t *module_iseq = NEW_CHILD_ISEQ(&next_scope_node, module_name, ISEQ_TYPE_CLASS, location.line); + pm_scope_node_destroy(&next_scope_node); - if (parameters_node) { - if (parameters_node->rest && PM_NODE_TYPE_P(parameters_node->rest, PM_IMPLICIT_REST_NODE)) { - trailing_comma = true; - } - } - break; - } - case PM_PARAMETERS_NODE: { - parameters_node = (pm_parameters_node_t *) scope_node->parameters; - break; - } - case PM_NUMBERED_PARAMETERS_NODE: { - uint32_t maximum = ((const pm_numbered_parameters_node_t *) scope_node->parameters)->maximum; - body->param.lead_num = maximum; - body->param.flags.ambiguous_param0 = maximum == 1; - break; - } - case PM_IT_PARAMETERS_NODE: - body->param.lead_num = 1; - body->param.flags.ambiguous_param0 = true; - break; - default: - rb_bug("Unexpected node type for parameters: %s", pm_node_type_to_str(PM_NODE_TYPE(node))); - } - } + const int flags = VM_DEFINECLASS_TYPE_MODULE | pm_compile_class_path(iseq, cast->constant_path, &location, ret, false, scope_node); + PUSH_INSN(ret, location, putnil); + PUSH_INSN3(ret, location, defineclass, ID2SYM(module_id), module_iseq, INT2FIX(flags)); + RB_OBJ_WRITTEN(iseq, Qundef, (VALUE) module_iseq); - struct rb_iseq_param_keyword *keyword = NULL; + if (popped) PUSH_INSN(ret, location, pop); + return; + } + case PM_REQUIRED_PARAMETER_NODE: { + // def foo(bar); end + // ^^^ + const pm_required_parameter_node_t *cast = (const pm_required_parameter_node_t *) node; + pm_local_index_t index = pm_lookup_local_index(iseq, scope_node, cast->name, 0); - if (parameters_node) { - optionals_list = ¶meters_node->optionals; - requireds_list = ¶meters_node->requireds; - keywords_list = ¶meters_node->keywords; - posts_list = ¶meters_node->posts; - } - else if (scope_node->parameters && (PM_NODE_TYPE_P(scope_node->parameters, PM_NUMBERED_PARAMETERS_NODE) || PM_NODE_TYPE_P(scope_node->parameters, PM_IT_PARAMETERS_NODE))) { - body->param.opt_num = 0; - } - else { - body->param.lead_num = 0; - body->param.opt_num = 0; - } + PUSH_SETLOCAL(ret, location, index.index, index.level); + return; + } + case PM_MULTI_WRITE_NODE: { + // foo, bar = baz + // ^^^^^^^^^^^^^^ + // + // A multi write node represents writing to multiple values using an = + // operator. Importantly these nodes are only parsed when the left-hand + // side of the operator has multiple targets. The right-hand side of the + // operator having multiple targets represents an implicit array + // instead. + const pm_multi_write_node_t *cast = (const pm_multi_write_node_t *) node; - //********STEP 1********** - // Goal: calculate the table size for the locals, accounting for - // hidden variables and multi target nodes - size_t locals_size = locals->size; + DECL_ANCHOR(writes); + INIT_ANCHOR(writes); - // Index lookup table buffer size is only the number of the locals - st_table *index_lookup_table = st_init_numtable(); + DECL_ANCHOR(cleanup); + INIT_ANCHOR(cleanup); - int table_size = (int) locals_size; + pm_multi_target_state_t state = { 0 }; + state.position = popped ? 0 : 1; + pm_compile_multi_target_node(iseq, node, ret, writes, cleanup, scope_node, &state); - // For nodes have a hidden iteration variable. We add that to the local - // table size here. - if (PM_NODE_TYPE_P(scope_node->ast_node, PM_FOR_NODE)) table_size++; + PM_COMPILE_NOT_POPPED(cast->value); + if (!popped) PUSH_INSN(ret, location, dup); - if (keywords_list && keywords_list->size) { - table_size++; + PUSH_SEQ(ret, writes); + if (!popped && state.stack_size >= 1) { + // Make sure the value on the right-hand side of the = operator is + // being returned before we pop the parent expressions. + PUSH_INSN1(ret, location, setn, INT2FIX(state.stack_size)); } - if (requireds_list) { - for (size_t i = 0; i < requireds_list->size; i++) { - // For each MultiTargetNode, we're going to have one - // additional anonymous local not represented in the locals table - // We want to account for this in our table size - pm_node_t *required = requireds_list->nodes[i]; - if (PM_NODE_TYPE_P(required, PM_MULTI_TARGET_NODE)) { - table_size++; - } - else if (PM_NODE_TYPE_P(required, PM_REQUIRED_PARAMETER_NODE)) { - if (PM_NODE_FLAG_P(required, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { - table_size++; - } - } - } - } + // Now, we need to go back and modify the topn instructions in order to + // ensure they can correctly retrieve the parent expressions. + pm_multi_target_state_update(&state); - // If we have the `it` implicit local variable, we need to account for - // it in the local table size. - if (scope_node->parameters != NULL && PM_NODE_TYPE_P(scope_node->parameters, PM_IT_PARAMETERS_NODE)) { - table_size++; - } + PUSH_SEQ(ret, cleanup); + return; + } + case PM_NEXT_NODE: { + // next + // ^^^^ + // + // next foo + // ^^^^^^^^ + const pm_next_node_t *cast = (const pm_next_node_t *) node; - // Ensure there is enough room in the local table for any - // parameters that have been repeated - // ex: def underscore_parameters(_, _ = 1, _ = 2); _; end - // ^^^^^^^^^^^^ - if (optionals_list && optionals_list->size) { - for (size_t i = 0; i < optionals_list->size; i++) { - pm_node_t * node = optionals_list->nodes[i]; - if (PM_NODE_FLAG_P(node, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { - table_size++; - } - } - } + if (ISEQ_COMPILE_DATA(iseq)->redo_label != 0 && can_add_ensure_iseq(iseq)) { + LABEL *splabel = NEW_LABEL(0); + PUSH_LABEL(ret, splabel); - // If we have an anonymous "rest" node, we'll need to increase the local - // table size to take it in to account. - // def m(foo, *, bar) - // ^ - if (parameters_node) { - if (parameters_node->rest) { - if (!(PM_NODE_TYPE_P(parameters_node->rest, PM_IMPLICIT_REST_NODE))) { - if (!((const pm_rest_parameter_node_t *) parameters_node->rest)->name || PM_NODE_FLAG_P(parameters_node->rest, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { - table_size++; - } - } + if (cast->arguments) { + PM_COMPILE_NOT_POPPED((const pm_node_t *) cast->arguments); } - - // def foo(_, **_); _; end - // ^^^ - if (parameters_node->keyword_rest) { - // def foo(...); end - // ^^^ - // When we have a `...` as the keyword_rest, it's a forwarding_parameter_node and - // we need to leave space for 4 locals: *, **, &, ... - if (PM_NODE_TYPE_P(parameters_node->keyword_rest, PM_FORWARDING_PARAMETER_NODE)) { - // Only optimize specifically methods like this: `foo(...)` - if (requireds_list->size == 0 && optionals_list->size == 0 && keywords_list->size == 0) { - ISEQ_BODY(iseq)->param.flags.use_block = TRUE; - ISEQ_BODY(iseq)->param.flags.forwardable = TRUE; - table_size += 1; - } - else { - table_size += 4; - } - } - else { - const pm_keyword_rest_parameter_node_t *kw_rest = (const pm_keyword_rest_parameter_node_t *) parameters_node->keyword_rest; - - // If it's anonymous or repeated, then we need to allocate stack space - if (!kw_rest->name || PM_NODE_FLAG_P(kw_rest, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { - table_size++; - } - } + else { + PUSH_INSN(ret, location, putnil); } - } + pm_add_ensure_iseq(ret, iseq, 0, scope_node); - if (posts_list) { - for (size_t i = 0; i < posts_list->size; i++) { - // For each MultiTargetNode, we're going to have one - // additional anonymous local not represented in the locals table - // We want to account for this in our table size - pm_node_t *required = posts_list->nodes[i]; - if (PM_NODE_TYPE_P(required, PM_MULTI_TARGET_NODE) || PM_NODE_FLAG_P(required, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { - table_size++; - } - } - } + PUSH_ADJUST(ret, location, ISEQ_COMPILE_DATA(iseq)->redo_label); + PUSH_INSNL(ret, location, jump, ISEQ_COMPILE_DATA(iseq)->start_label); - if (keywords_list && keywords_list->size) { - for (size_t i = 0; i < keywords_list->size; i++) { - pm_node_t *keyword_parameter_node = keywords_list->nodes[i]; - if (PM_NODE_FLAG_P(keyword_parameter_node, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { - table_size++; - } - } + PUSH_ADJUST_RESTORE(ret, splabel); + if (!popped) PUSH_INSN(ret, location, putnil); } + else if (ISEQ_COMPILE_DATA(iseq)->end_label && can_add_ensure_iseq(iseq)) { + LABEL *splabel = NEW_LABEL(0); - if (parameters_node && parameters_node->block) { - const pm_block_parameter_node_t *block_node = (const pm_block_parameter_node_t *) parameters_node->block; + PUSH_LABEL(ret, splabel); + PUSH_ADJUST(ret, location, ISEQ_COMPILE_DATA(iseq)->start_label); - if (PM_NODE_FLAG_P(block_node, PM_PARAMETER_FLAGS_REPEATED_PARAMETER) || !block_node->name) { - table_size++; + if (cast->arguments != NULL) { + PM_COMPILE_NOT_POPPED((const pm_node_t *) cast->arguments); + } + else { + PUSH_INSN(ret, location, putnil); } - } - // We can create local_table_for_iseq with the correct size - VALUE idtmp = 0; - rb_ast_id_table_t *local_table_for_iseq = ALLOCV(idtmp, sizeof(rb_ast_id_table_t) + table_size * sizeof(ID)); - local_table_for_iseq->size = table_size; + pm_add_ensure_iseq(ret, iseq, 0, scope_node); + PUSH_INSNL(ret, location, jump, ISEQ_COMPILE_DATA(iseq)->end_label); + PUSH_ADJUST_RESTORE(ret, splabel); + splabel->unremovable = FALSE; - //********END OF STEP 1********** + if (!popped) PUSH_INSN(ret, location, putnil); + } + else { + const rb_iseq_t *ip = iseq; + unsigned long throw_flag = 0; - //********STEP 2********** - // Goal: populate iv index table as well as local table, keeping the - // layout of the local table consistent with the layout of the - // stack when calling the method - // - // Do a first pass on all of the parameters, setting their values in - // the local_table_for_iseq, _except_ for Multis who get a hidden - // variable in this step, and will get their names inserted in step 3 - - // local_index is a cursor that keeps track of the current - // index into local_table_for_iseq. The local table is actually a list, - // and the order of that list must match the order of the items pushed - // on the stack. We need to take in to account things pushed on the - // stack that _might not have a name_ (for example array destructuring). - // This index helps us know which item we're dealing with and also give - // those anonymous items temporary names (as below) - int local_index = 0; - - // Here we figure out local table indices and insert them in to the - // index lookup table and local tables. - // - // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) - // ^^^^^^^^^^^^^ - if (requireds_list && requireds_list->size) { - for (size_t i = 0; i < requireds_list->size; i++, local_index++) { - ID local; - - // For each MultiTargetNode, we're going to have one additional - // anonymous local not represented in the locals table. We want - // to account for this in our table size. - pm_node_t *required = requireds_list->nodes[i]; - - switch (PM_NODE_TYPE(required)) { - // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) - // ^^^^^^^^^^ - case PM_MULTI_TARGET_NODE: { - local = rb_make_temporary_id(local_index); - local_table_for_iseq->ids[local_index] = local; + while (ip) { + if (!ISEQ_COMPILE_DATA(ip)) { + ip = 0; break; - } - // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) - // ^ - case PM_REQUIRED_PARAMETER_NODE: { - const pm_required_parameter_node_t *param = (const pm_required_parameter_node_t *) required; - - if (PM_NODE_FLAG_P(required, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { - ID local = pm_constant_id_lookup(scope_node, param->name); - local_table_for_iseq->ids[local_index] = local; - } - else { - pm_insert_local_index(param->name, local_index, index_lookup_table, local_table_for_iseq, scope_node); - } + } + throw_flag = VM_THROW_NO_ESCAPE_FLAG; + if (ISEQ_COMPILE_DATA(ip)->redo_label != 0) { + /* while loop */ break; - } - default: { - rb_bug("Unsupported node in requireds in parameters %s", pm_node_type_to_str(PM_NODE_TYPE(node))); - } } - } - - body->param.lead_num = (int) requireds_list->size; - body->param.flags.has_lead = true; - } - - if (scope_node->parameters != NULL && PM_NODE_TYPE_P(scope_node->parameters, PM_IT_PARAMETERS_NODE)) { - ID local = rb_make_temporary_id(local_index); - local_table_for_iseq->ids[local_index++] = local; - } - - // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) - // ^^^^^ - if (optionals_list && optionals_list->size) { - body->param.opt_num = (int) optionals_list->size; - body->param.flags.has_opt = true; - - for (size_t i = 0; i < optionals_list->size; i++, local_index++) { - pm_node_t * node = optionals_list->nodes[i]; - pm_constant_id_t name = ((const pm_optional_parameter_node_t *) node)->name; - - if (PM_NODE_FLAG_P(node, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { - ID local = pm_constant_id_lookup(scope_node, name); - local_table_for_iseq->ids[local_index] = local; + else if (ISEQ_BODY(ip)->type == ISEQ_TYPE_BLOCK) { + break; } - else { - pm_insert_local_index(name, local_index, index_lookup_table, local_table_for_iseq, scope_node); + else if (ISEQ_BODY(ip)->type == ISEQ_TYPE_EVAL) { + COMPILE_ERROR(iseq, location.line, "Can't escape from eval with next"); + return; } - } - } - - // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) - // ^^ - if (parameters_node && parameters_node->rest) { - body->param.rest_start = local_index; - // If there's a trailing comma, we'll have an implicit rest node, - // and we don't want it to impact the rest variables on param - if (!(PM_NODE_TYPE_P(parameters_node->rest, PM_IMPLICIT_REST_NODE))) { - body->param.flags.has_rest = true; - RUBY_ASSERT(body->param.rest_start != -1); - - pm_constant_id_t name = ((const pm_rest_parameter_node_t *) parameters_node->rest)->name; - - if (name) { - // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) - // ^^ - if (PM_NODE_FLAG_P(parameters_node->rest, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { - ID local = pm_constant_id_lookup(scope_node, name); - local_table_for_iseq->ids[local_index] = local; - } - else { - pm_insert_local_index(name, local_index, index_lookup_table, local_table_for_iseq, scope_node); - } + ip = ISEQ_BODY(ip)->parent_iseq; + } + if (ip != 0) { + if (cast->arguments) { + PM_COMPILE_NOT_POPPED((const pm_node_t *) cast->arguments); } else { - // def foo(a, (b, *c, d), e = 1, *, g, (h, *i, j), k:, l: 1, **m, &n) - // ^ - body->param.flags.anon_rest = true; - pm_insert_local_special(idMULT, local_index, index_lookup_table, local_table_for_iseq); + PUSH_INSN(ret, location, putnil); } - local_index++; + PUSH_INSN1(ret, location, throw, INT2FIX(throw_flag | TAG_NEXT)); + if (popped) PUSH_INSN(ret, location, pop); } - } - - // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) - // ^^^^^^^^^^^^^ - if (posts_list && posts_list->size) { - body->param.post_num = (int) posts_list->size; - body->param.post_start = local_index; - body->param.flags.has_post = true; - - for (size_t i = 0; i < posts_list->size; i++, local_index++) { - ID local; - - // For each MultiTargetNode, we're going to have one additional - // anonymous local not represented in the locals table. We want - // to account for this in our table size. - const pm_node_t *post_node = posts_list->nodes[i]; - - switch (PM_NODE_TYPE(post_node)) { - // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) - // ^^^^^^^^^^ - case PM_MULTI_TARGET_NODE: { - local = rb_make_temporary_id(local_index); - local_table_for_iseq->ids[local_index] = local; - break; - } - // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) - // ^ - case PM_REQUIRED_PARAMETER_NODE: { - const pm_required_parameter_node_t *param = (const pm_required_parameter_node_t *) post_node; - - if (PM_NODE_FLAG_P(param, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { - ID local = pm_constant_id_lookup(scope_node, param->name); - local_table_for_iseq->ids[local_index] = local; - } - else { - pm_insert_local_index(param->name, local_index, index_lookup_table, local_table_for_iseq, scope_node); - } - break; - } - default: { - rb_bug("Unsupported node in posts in parameters %s", pm_node_type_to_str(PM_NODE_TYPE(node))); - } - } + else { + COMPILE_ERROR(iseq, location.line, "Invalid next"); + return; } } - // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) - // ^^^^^^^^ - // Keywords create an internal variable on the parse tree - if (keywords_list && keywords_list->size) { - body->param.keyword = keyword = ZALLOC_N(struct rb_iseq_param_keyword, 1); - keyword->num = (int) keywords_list->size; + return; + } + case PM_NIL_NODE: { + // nil + // ^^^ + if (!popped) { + PUSH_INSN(ret, location, putnil); + } - body->param.flags.has_kw = true; - const VALUE default_values = rb_ary_hidden_new(1); - const VALUE complex_mark = rb_str_tmp_new(0); + return; + } + case PM_NO_KEYWORDS_PARAMETER_NODE: { + // def foo(**nil); end + // ^^^^^ + ISEQ_BODY(iseq)->param.flags.accepts_no_kwarg = TRUE; + return; + } + case PM_NUMBERED_REFERENCE_READ_NODE: { + // $1 + // ^^ + if (!popped) { + uint32_t reference_number = ((const pm_numbered_reference_read_node_t *) node)->number; - ID *ids = xcalloc(keywords_list->size, sizeof(ID)); + if (reference_number > 0) { + PUSH_INSN2(ret, location, getspecial, INT2FIX(1), INT2FIX(reference_number << 1)); + } + else { + PUSH_INSN(ret, location, putnil); + } + } - size_t kw_index = 0; + return; + } + case PM_OR_NODE: { + // a or b + // ^^^^^^ + const pm_or_node_t *cast = (const pm_or_node_t *) node; - for (size_t i = 0; i < keywords_list->size; i++) { - pm_node_t *keyword_parameter_node = keywords_list->nodes[i]; - pm_constant_id_t name; + LABEL *end_label = NEW_LABEL(location.line); + PM_COMPILE_NOT_POPPED(cast->left); - // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) - // ^^ - if (PM_NODE_TYPE_P(keyword_parameter_node, PM_REQUIRED_KEYWORD_PARAMETER_NODE)) { - name = ((const pm_required_keyword_parameter_node_t *) keyword_parameter_node)->name; - keyword->required_num++; - ID local = pm_constant_id_lookup(scope_node, name); + if (!popped) PUSH_INSN(ret, location, dup); + PUSH_INSNL(ret, location, branchif, end_label); - if (PM_NODE_FLAG_P(keyword_parameter_node, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { - local_table_for_iseq->ids[local_index] = local; - } - else { - pm_insert_local_index(name, local_index, index_lookup_table, local_table_for_iseq, scope_node); - } - local_index++; - ids[kw_index++] = local; - } - } + if (!popped) PUSH_INSN(ret, location, pop); + PM_COMPILE(cast->right); + PUSH_LABEL(ret, end_label); - for (size_t i = 0; i < keywords_list->size; i++) { - pm_node_t *keyword_parameter_node = keywords_list->nodes[i]; - pm_constant_id_t name; + return; + } + case PM_OPTIONAL_PARAMETER_NODE: { + // def foo(bar = 1); end + // ^^^^^^^ + const pm_optional_parameter_node_t *cast = (const pm_optional_parameter_node_t *) node; + PM_COMPILE_NOT_POPPED(cast->value); - // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) - // ^^^^ - if (PM_NODE_TYPE_P(keyword_parameter_node, PM_OPTIONAL_KEYWORD_PARAMETER_NODE)) { - const pm_optional_keyword_parameter_node_t *cast = ((const pm_optional_keyword_parameter_node_t *) keyword_parameter_node); + pm_local_index_t index = pm_lookup_local_index(iseq, scope_node, cast->name, 0); + PUSH_SETLOCAL(ret, location, index.index, index.level); - pm_node_t *value = cast->value; - name = cast->name; + return; + } + case PM_PARENTHESES_NODE: { + // () + // ^^ + // + // (1) + // ^^^ + const pm_parentheses_node_t *cast = (const pm_parentheses_node_t *) node; - if (PM_NODE_FLAG_P(value, PM_NODE_FLAG_STATIC_LITERAL) && !PM_CONTAINER_P(value)) { - rb_ary_push(default_values, pm_static_literal_value(iseq, value, scope_node)); - } - else { - rb_ary_push(default_values, complex_mark); - } + if (cast->body != NULL) { + PM_COMPILE(cast->body); + } + else if (!popped) { + PUSH_INSN(ret, location, putnil); + } - ID local = pm_constant_id_lookup(scope_node, name); - if (PM_NODE_FLAG_P(keyword_parameter_node, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { - local_table_for_iseq->ids[local_index] = local; - } - else { - pm_insert_local_index(name, local_index, index_lookup_table, local_table_for_iseq, scope_node); - } - ids[kw_index++] = local; - local_index++; - } + return; + } + case PM_PRE_EXECUTION_NODE: { + // BEGIN {} + // ^^^^^^^^ + const pm_pre_execution_node_t *cast = (const pm_pre_execution_node_t *) node; - } + LINK_ANCHOR *outer_pre = scope_node->pre_execution_anchor; + RUBY_ASSERT(outer_pre != NULL); - keyword->bits_start = local_index; - keyword->table = ids; + // BEGIN{} nodes can be nested, so here we're going to do the same thing + // that we did for the top-level compilation where we create two + // anchors and then join them in the correct order into the resulting + // anchor. + DECL_ANCHOR(inner_pre); + INIT_ANCHOR(inner_pre); + scope_node->pre_execution_anchor = inner_pre; - if (RARRAY_LEN(default_values)) { - VALUE *dvs = ALLOC_N(VALUE, RARRAY_LEN(default_values)); + DECL_ANCHOR(inner_body); + INIT_ANCHOR(inner_body); - for (int i = 0; i < RARRAY_LEN(default_values); i++) { - VALUE dv = RARRAY_AREF(default_values, i); - if (dv == complex_mark) dv = Qundef; - if (!SPECIAL_CONST_P(dv)) { - RB_OBJ_WRITTEN(iseq, Qundef, dv); - } - dvs[i] = dv; - } + if (cast->statements != NULL) { + const pm_node_list_t *body = &cast->statements->body; - keyword->default_values = dvs; + for (size_t index = 0; index < body->size; index++) { + pm_compile_node(iseq, body->nodes[index], inner_body, true, scope_node); } - - // Hidden local for keyword arguments - ID local = rb_make_temporary_id(local_index); - local_table_for_iseq->ids[local_index] = local; - local_index++; } - if (body->type == ISEQ_TYPE_BLOCK && local_index == 1 && requireds_list && requireds_list->size == 1 && !trailing_comma) { - body->param.flags.ambiguous_param0 = true; + if (!popped) { + PUSH_INSN(inner_body, location, putnil); } - if (parameters_node) { - // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) - // ^^^ - if (parameters_node->keyword_rest) { - switch (PM_NODE_TYPE(parameters_node->keyword_rest)) { - // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **nil, &n) - // ^^^^^ - case PM_NO_KEYWORDS_PARAMETER_NODE: { - body->param.flags.accepts_no_kwarg = true; - break; - } - // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) - // ^^^ - case PM_KEYWORD_REST_PARAMETER_NODE: { - const pm_keyword_rest_parameter_node_t *kw_rest_node = (const pm_keyword_rest_parameter_node_t *) parameters_node->keyword_rest; - if (!body->param.flags.has_kw) { - body->param.keyword = keyword = ZALLOC_N(struct rb_iseq_param_keyword, 1); - } + // Now that everything has been compiled, join both anchors together + // into the correct outer pre execution anchor, and reset the value so + // that subsequent BEGIN{} nodes can be compiled correctly. + PUSH_SEQ(outer_pre, inner_pre); + PUSH_SEQ(outer_pre, inner_body); + scope_node->pre_execution_anchor = outer_pre; - keyword->rest_start = local_index; - body->param.flags.has_kwrest = true; + return; + } + case PM_POST_EXECUTION_NODE: { + // END {} + // ^^^^^^ + const rb_iseq_t *child_iseq; + const rb_iseq_t *prevblock = ISEQ_COMPILE_DATA(iseq)->current_block; - pm_constant_id_t constant_id = kw_rest_node->name; - if (constant_id) { - if (PM_NODE_FLAG_P(kw_rest_node, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { - ID local = pm_constant_id_lookup(scope_node, constant_id); - local_table_for_iseq->ids[local_index] = local; - } - else { - pm_insert_local_index(constant_id, local_index, index_lookup_table, local_table_for_iseq, scope_node); - } - } - else { - body->param.flags.anon_kwrest = true; - pm_insert_local_special(idPow, local_index, index_lookup_table, local_table_for_iseq); - } + pm_scope_node_t next_scope_node; + pm_scope_node_init(node, &next_scope_node, scope_node); + child_iseq = NEW_CHILD_ISEQ(&next_scope_node, make_name_for_block(iseq), ISEQ_TYPE_BLOCK, lineno); + pm_scope_node_destroy(&next_scope_node); - local_index++; - break; - } - // def foo(...) - // ^^^ - case PM_FORWARDING_PARAMETER_NODE: { - if (!ISEQ_BODY(iseq)->param.flags.forwardable) { - // Add the anonymous * - body->param.rest_start = local_index; - body->param.flags.has_rest = true; - body->param.flags.anon_rest = true; - pm_insert_local_special(idMULT, local_index++, index_lookup_table, local_table_for_iseq); - - // Add the anonymous ** - RUBY_ASSERT(!body->param.flags.has_kw); - body->param.flags.has_kw = false; - body->param.flags.has_kwrest = true; - body->param.flags.anon_kwrest = true; - body->param.keyword = keyword = ZALLOC_N(struct rb_iseq_param_keyword, 1); - keyword->rest_start = local_index; - pm_insert_local_special(idPow, local_index++, index_lookup_table, local_table_for_iseq); - - // Add the anonymous & - body->param.block_start = local_index; - body->param.flags.has_block = true; - pm_insert_local_special(idAnd, local_index++, index_lookup_table, local_table_for_iseq); - } + ISEQ_COMPILE_DATA(iseq)->current_block = child_iseq; - // Add the ... - pm_insert_local_special(idDot3, local_index++, index_lookup_table, local_table_for_iseq); - break; - } - default: { - rb_bug("node type %s not expected as keyword_rest", pm_node_type_to_str(PM_NODE_TYPE(parameters_node->keyword_rest))); - } - } - } + int is_index = ISEQ_BODY(iseq)->ise_size++; + PUSH_INSN2(ret, location, once, child_iseq, INT2FIX(is_index)); + RB_OBJ_WRITTEN(iseq, Qundef, (VALUE) child_iseq); + if (popped) PUSH_INSN(ret, location, pop); - // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) - // ^^ - if (parameters_node->block) { - body->param.block_start = local_index; - body->param.flags.has_block = true; - iseq_set_use_block(iseq); + ISEQ_COMPILE_DATA(iseq)->current_block = prevblock; - pm_constant_id_t name = ((const pm_block_parameter_node_t *) parameters_node->block)->name; + return; + } + case PM_RANGE_NODE: { + // 0..5 + // ^^^^ + const pm_range_node_t *cast = (const pm_range_node_t *) node; + bool exclude_end = PM_NODE_FLAG_P(cast, PM_RANGE_FLAGS_EXCLUDE_END); - if (name) { - if (PM_NODE_FLAG_P(parameters_node->block, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { - ID local = pm_constant_id_lookup(scope_node, name); - local_table_for_iseq->ids[local_index] = local; - } - else { - pm_insert_local_index(name, local_index, index_lookup_table, local_table_for_iseq, scope_node); - } - } - else { - pm_insert_local_special(idAnd, local_index, index_lookup_table, local_table_for_iseq); - } + if (pm_optimizable_range_item_p(cast->left) && pm_optimizable_range_item_p(cast->right)) { + if (!popped) { + const pm_node_t *left = cast->left; + const pm_node_t *right = cast->right; - local_index++; + VALUE val = rb_range_new( + (left && PM_NODE_TYPE_P(left, PM_INTEGER_NODE)) ? parse_integer((const pm_integer_node_t *) left) : Qnil, + (right && PM_NODE_TYPE_P(right, PM_INTEGER_NODE)) ? parse_integer((const pm_integer_node_t *) right) : Qnil, + exclude_end + ); + + PUSH_INSN1(ret, location, putobject, val); } } + else { + if (cast->left == NULL) { + PUSH_INSN(ret, location, putnil); + } + else { + PM_COMPILE(cast->left); + } + + if (cast->right == NULL) { + PUSH_INSN(ret, location, putnil); + } + else { + PM_COMPILE(cast->right); + } - //********END OF STEP 2********** - // The local table is now consistent with expected - // stack layout + if (!popped) { + PUSH_INSN1(ret, location, newrange, INT2FIX(exclude_end ? 1 : 0)); + } + } + return; + } + case PM_RATIONAL_NODE: { + // 1r + // ^^ + if (!popped) { + PUSH_INSN1(ret, location, putobject, parse_rational((const pm_rational_node_t *) node)); + } + return; + } + case PM_REDO_NODE: { + // redo + // ^^^^ + if (ISEQ_COMPILE_DATA(iseq)->redo_label && can_add_ensure_iseq(iseq)) { + LABEL *splabel = NEW_LABEL(0); - // If there's only one required element in the parameters - // CRuby needs to recognize it as an ambiguous parameter + PUSH_LABEL(ret, splabel); + PUSH_ADJUST(ret, location, ISEQ_COMPILE_DATA(iseq)->redo_label); + pm_add_ensure_iseq(ret, iseq, 0, scope_node); - //********STEP 3********** - // Goal: fill in the names of the parameters in MultiTargetNodes - // - // Go through requireds again to set the multis + PUSH_INSNL(ret, location, jump, ISEQ_COMPILE_DATA(iseq)->redo_label); + PUSH_ADJUST_RESTORE(ret, splabel); + if (!popped) PUSH_INSN(ret, location, putnil); + } + else if (ISEQ_BODY(iseq)->type != ISEQ_TYPE_EVAL && ISEQ_COMPILE_DATA(iseq)->start_label && can_add_ensure_iseq(iseq)) { + LABEL *splabel = NEW_LABEL(0); - if (requireds_list && requireds_list->size) { - for (size_t i = 0; i < requireds_list->size; i++) { - // For each MultiTargetNode, we're going to have one - // additional anonymous local not represented in the locals table - // We want to account for this in our table size - const pm_node_t *required = requireds_list->nodes[i]; + PUSH_LABEL(ret, splabel); + pm_add_ensure_iseq(ret, iseq, 0, scope_node); + PUSH_ADJUST(ret, location, ISEQ_COMPILE_DATA(iseq)->start_label); - if (PM_NODE_TYPE_P(required, PM_MULTI_TARGET_NODE)) { - local_index = pm_compile_destructured_param_locals((const pm_multi_target_node_t *) required, index_lookup_table, local_table_for_iseq, scope_node, local_index); - } - } + PUSH_INSNL(ret, location, jump, ISEQ_COMPILE_DATA(iseq)->start_label); + PUSH_ADJUST_RESTORE(ret, splabel); + if (!popped) PUSH_INSN(ret, location, putnil); } + else { + const rb_iseq_t *ip = iseq; - // Go through posts again to set the multis - if (posts_list && posts_list->size) { - for (size_t i = 0; i < posts_list->size; i++) { - // For each MultiTargetNode, we're going to have one - // additional anonymous local not represented in the locals table - // We want to account for this in our table size - const pm_node_t *post = posts_list->nodes[i]; + while (ip) { + if (!ISEQ_COMPILE_DATA(ip)) { + ip = 0; + break; + } - if (PM_NODE_TYPE_P(post, PM_MULTI_TARGET_NODE)) { - local_index = pm_compile_destructured_param_locals((const pm_multi_target_node_t *) post, index_lookup_table, local_table_for_iseq, scope_node, local_index); + if (ISEQ_COMPILE_DATA(ip)->redo_label != 0) { + break; + } + else if (ISEQ_BODY(ip)->type == ISEQ_TYPE_BLOCK) { + break; + } + else if (ISEQ_BODY(ip)->type == ISEQ_TYPE_EVAL) { + COMPILE_ERROR(iseq, location.line, "Can't escape from eval with redo"); + return; } + + ip = ISEQ_BODY(ip)->parent_iseq; } - } - // Set any anonymous locals for the for node - if (PM_NODE_TYPE_P(scope_node->ast_node, PM_FOR_NODE)) { - if (PM_NODE_TYPE_P(((const pm_for_node_t *) scope_node->ast_node)->index, PM_LOCAL_VARIABLE_TARGET_NODE)) { - body->param.lead_num++; + if (ip != 0) { + PUSH_INSN(ret, location, putnil); + PUSH_INSN1(ret, location, throw, INT2FIX(VM_THROW_NO_ESCAPE_FLAG | TAG_REDO)); + if (popped) PUSH_INSN(ret, location, pop); } else { - body->param.rest_start = local_index; - body->param.flags.has_rest = true; - } - - ID local = rb_make_temporary_id(local_index); - local_table_for_iseq->ids[local_index] = local; - local_index++; - } - - // Fill in any NumberedParameters, if they exist - if (scope_node->parameters && PM_NODE_TYPE_P(scope_node->parameters, PM_NUMBERED_PARAMETERS_NODE)) { - int maximum = ((const pm_numbered_parameters_node_t *) scope_node->parameters)->maximum; - RUBY_ASSERT(0 < maximum && maximum <= 9); - for (int i = 0; i < maximum; i++, local_index++) { - const uint8_t param_name[] = { '_', '1' + i }; - pm_constant_id_t constant_id = pm_constant_pool_find(&parser->constant_pool, param_name, 2); - RUBY_ASSERT(constant_id && "parser should fill in any gaps in numbered parameters"); - pm_insert_local_index(constant_id, local_index, index_lookup_table, local_table_for_iseq, scope_node); + COMPILE_ERROR(iseq, location.line, "Invalid redo"); + return; } - body->param.lead_num = maximum; - body->param.flags.has_lead = true; } - - //********END OF STEP 3********** - - //********STEP 4********** - // Goal: fill in the method body locals - // To be explicit, these are the non-parameter locals - // We fill in the block_locals, if they exist - // lambda { |x; y| y } - // ^ - if (block_locals && block_locals->size) { - for (size_t i = 0; i < block_locals->size; i++, local_index++) { - pm_constant_id_t constant_id = ((const pm_block_local_variable_node_t *) block_locals->nodes[i])->name; - pm_insert_local_index(constant_id, local_index, index_lookup_table, local_table_for_iseq, scope_node); - } + return; + } + case PM_REGULAR_EXPRESSION_NODE: { + // /foo/ + // ^^^^^ + if (!popped) { + VALUE regexp = pm_static_literal_value(iseq, node, scope_node); + PUSH_INSN1(ret, location, putobject, regexp); } + return; + } + case PM_RESCUE_NODE: { + // begin; rescue; end + // ^^^^^^^ + const pm_rescue_node_t *cast = (const pm_rescue_node_t *) node; + iseq_set_exception_local_table(iseq); - // Fill in any locals we missed - if (scope_node->locals.size) { - for (size_t i = 0; i < scope_node->locals.size; i++) { - pm_constant_id_t constant_id = locals->ids[i]; - if (constant_id) { - struct pm_local_table_insert_ctx ctx; - ctx.scope_node = scope_node; - ctx.local_table_for_iseq = local_table_for_iseq; - ctx.local_index = local_index; + // First, establish the labels that we need to be able to jump to within + // this compilation block. + LABEL *exception_match_label = NEW_LABEL(location.line); + LABEL *rescue_end_label = NEW_LABEL(location.line); - st_update(index_lookup_table, (st_data_t)constant_id, pm_local_table_insert_func, (st_data_t)&ctx); + // Next, compile each of the exceptions that we're going to be + // handling. For each one, we'll add instructions to check if the + // exception matches the raised one, and if it does then jump to the + // exception_match_label label. Otherwise it will fall through to the + // subsequent check. If there are no exceptions, we'll only check + // StandardError. + const pm_node_list_t *exceptions = &cast->exceptions; - local_index = ctx.local_index; + if (exceptions->size > 0) { + for (size_t index = 0; index < exceptions->size; index++) { + PUSH_GETLOCAL(ret, location, LVAR_ERRINFO, 0); + PM_COMPILE(exceptions->nodes[index]); + int checkmatch_flags = VM_CHECKMATCH_TYPE_RESCUE; + if (PM_NODE_TYPE_P(exceptions->nodes[index], PM_SPLAT_NODE)) { + checkmatch_flags |= VM_CHECKMATCH_ARRAY; } + PUSH_INSN1(ret, location, checkmatch, INT2FIX(checkmatch_flags)); + PUSH_INSNL(ret, location, branchif, exception_match_label); } } - - //********END OF STEP 4********** - - // We set the index_lookup_table on the scope node so we can - // refer to the parameters correctly - if (scope_node->index_lookup_table) { - st_free_table(scope_node->index_lookup_table); + else { + PUSH_GETLOCAL(ret, location, LVAR_ERRINFO, 0); + PUSH_INSN1(ret, location, putobject, rb_eStandardError); + PUSH_INSN1(ret, location, checkmatch, INT2FIX(VM_CHECKMATCH_TYPE_RESCUE)); + PUSH_INSNL(ret, location, branchif, exception_match_label); } - scope_node->index_lookup_table = index_lookup_table; - iseq_calc_param_size(iseq); - if (ISEQ_BODY(iseq)->param.flags.forwardable) { - // We're treating `...` as a parameter so that frame - // pushing won't clobber it. - ISEQ_BODY(iseq)->param.size += 1; - } + // If none of the exceptions that we are matching against matched, then + // we'll jump straight to the rescue_end_label label. + PUSH_INSNL(ret, location, jump, rescue_end_label); - // FIXME: args? - iseq_set_local_table(iseq, local_table_for_iseq, 0); - scope_node->local_table_for_iseq_size = local_table_for_iseq->size; + // Here we have the exception_match_label, which is where the + // control-flow goes in the case that one of the exceptions matched. + // Here we will compile the instructions to handle the exception. + PUSH_LABEL(ret, exception_match_label); + PUSH_TRACE(ret, RUBY_EVENT_RESCUE); - //********STEP 5************ - // Goal: compile anything that needed to be compiled - if (optionals_list && optionals_list->size) { - LABEL **opt_table = (LABEL **) ALLOC_N(VALUE, optionals_list->size + 1); - LABEL *label; + // If we have a reference to the exception, then we'll compile the write + // into the instruction sequence. This can look quite different + // depending on the kind of write being performed. + if (cast->reference) { + DECL_ANCHOR(writes); + INIT_ANCHOR(writes); - // TODO: Should we make an api for NEW_LABEL where you can pass - // a pointer to the label it should fill out? We already - // have a list of labels allocated above so it seems wasteful - // to do the copies. - for (size_t i = 0; i < optionals_list->size; i++) { - label = NEW_LABEL(lineno); - opt_table[i] = label; - PUSH_LABEL(ret, label); - pm_node_t *optional_node = optionals_list->nodes[i]; - PM_COMPILE_NOT_POPPED(optional_node); - } + DECL_ANCHOR(cleanup); + INIT_ANCHOR(cleanup); - // Set the last label - label = NEW_LABEL(lineno); - opt_table[optionals_list->size] = label; - PUSH_LABEL(ret, label); + pm_compile_target_node(iseq, cast->reference, ret, writes, cleanup, scope_node, NULL); + PUSH_GETLOCAL(ret, location, LVAR_ERRINFO, 0); - body->param.opt_table = (const VALUE *) opt_table; + PUSH_SEQ(ret, writes); + PUSH_SEQ(ret, cleanup); } - if (keywords_list && keywords_list->size) { - size_t optional_index = 0; - for (size_t i = 0; i < keywords_list->size; i++) { - pm_node_t *keyword_parameter_node = keywords_list->nodes[i]; - pm_constant_id_t name; - - switch (PM_NODE_TYPE(keyword_parameter_node)) { - // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) - // ^^^^ - case PM_OPTIONAL_KEYWORD_PARAMETER_NODE: { - const pm_optional_keyword_parameter_node_t *cast = ((const pm_optional_keyword_parameter_node_t *) keyword_parameter_node); - - pm_node_t *value = cast->value; - name = cast->name; + // If we have statements to execute, we'll compile them here. Otherwise + // we'll push nil onto the stack. + if (cast->statements) { + // We'll temporarily remove the end_label location from the iseq + // when compiling the statements so that next/redo statements + // inside the body will throw to the correct place instead of + // jumping straight to the end of this iseq + LABEL *prev_end = ISEQ_COMPILE_DATA(iseq)->end_label; + ISEQ_COMPILE_DATA(iseq)->end_label = NULL; - if (!PM_NODE_FLAG_P(value, PM_NODE_FLAG_STATIC_LITERAL) || PM_CONTAINER_P(value)) { - LABEL *end_label = NEW_LABEL(location.line); + PM_COMPILE((const pm_node_t *) cast->statements); - pm_local_index_t index = pm_lookup_local_index(iseq, scope_node, name, 0); - int kw_bits_idx = table_size - body->param.keyword->bits_start; - PUSH_INSN2(ret, location, checkkeyword, INT2FIX(kw_bits_idx + VM_ENV_DATA_SIZE - 1), INT2FIX(optional_index)); - PUSH_INSNL(ret, location, branchif, end_label); - PM_COMPILE(value); - PUSH_SETLOCAL(ret, location, index.index, index.level); - PUSH_LABEL(ret, end_label); - } - optional_index++; - break; - } - // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) - // ^^ - case PM_REQUIRED_KEYWORD_PARAMETER_NODE: { - break; - } - default: { - rb_bug("Unexpected keyword parameter node type %s", pm_node_type_to_str(PM_NODE_TYPE(keyword_parameter_node))); - } - } - } + // Now restore the end_label + ISEQ_COMPILE_DATA(iseq)->end_label = prev_end; } - - if (requireds_list && requireds_list->size) { - for (size_t i = 0; i < requireds_list->size; i++) { - // For each MultiTargetNode, we're going to have one additional - // anonymous local not represented in the locals table. We want - // to account for this in our table size. - const pm_node_t *required = requireds_list->nodes[i]; - - if (PM_NODE_TYPE_P(required, PM_MULTI_TARGET_NODE)) { - PUSH_GETLOCAL(ret, location, table_size - (int)i, 0); - pm_compile_destructured_param_writes(iseq, (const pm_multi_target_node_t *) required, ret, scope_node); - } - } + else { + PUSH_INSN(ret, location, putnil); } - if (posts_list && posts_list->size) { - for (size_t i = 0; i < posts_list->size; i++) { - // For each MultiTargetNode, we're going to have one additional - // anonymous local not represented in the locals table. We want - // to account for this in our table size. - const pm_node_t *post = posts_list->nodes[i]; + PUSH_INSN(ret, location, leave); - if (PM_NODE_TYPE_P(post, PM_MULTI_TARGET_NODE)) { - PUSH_GETLOCAL(ret, location, table_size - body->param.post_start - (int) i, 0); - pm_compile_destructured_param_writes(iseq, (const pm_multi_target_node_t *) post, ret, scope_node); - } - } + // Here we'll insert the rescue_end_label label, which is jumped to if + // none of the exceptions matched. It will cause the control-flow to + // either jump to the next rescue clause or it will fall through to the + // subsequent instruction returning the raised error. + PUSH_LABEL(ret, rescue_end_label); + if (cast->subsequent) { + PM_COMPILE((const pm_node_t *) cast->subsequent); + } + else { + PUSH_GETLOCAL(ret, location, 1, 0); } - switch (body->type) { - case ISEQ_TYPE_BLOCK: { - LABEL *start = ISEQ_COMPILE_DATA(iseq)->start_label = NEW_LABEL(0); - LABEL *end = ISEQ_COMPILE_DATA(iseq)->end_label = NEW_LABEL(0); - const pm_node_location_t block_location = { .line = body->location.first_lineno, .node_id = -1 }; - - start->rescued = LABEL_RESCUE_BEG; - end->rescued = LABEL_RESCUE_END; + return; + } + case PM_RESCUE_MODIFIER_NODE: { + // foo rescue bar + // ^^^^^^^^^^^^^^ + const pm_rescue_modifier_node_t *cast = (const pm_rescue_modifier_node_t *) node; - // For nodes automatically assign the iteration variable to whatever - // index variable. We need to handle that write here because it has - // to happen in the context of the block. Note that this happens - // before the B_CALL tracepoint event. - if (PM_NODE_TYPE_P(scope_node->ast_node, PM_FOR_NODE)) { - pm_compile_for_node_index(iseq, ((const pm_for_node_t *) scope_node->ast_node)->index, ret, scope_node); - } + pm_scope_node_t rescue_scope_node; + pm_scope_node_init((const pm_node_t *) cast, &rescue_scope_node, scope_node); - PUSH_TRACE(ret, RUBY_EVENT_B_CALL); - PUSH_INSN(ret, block_location, nop); - PUSH_LABEL(ret, start); + rb_iseq_t *rescue_iseq = NEW_CHILD_ISEQ( + &rescue_scope_node, + rb_str_concat(rb_str_new2("rescue in "), ISEQ_BODY(iseq)->location.label), + ISEQ_TYPE_RESCUE, + pm_node_line_number(parser, cast->rescue_expression) + ); - if (scope_node->body != NULL) { - switch (PM_NODE_TYPE(scope_node->ast_node)) { - case PM_POST_EXECUTION_NODE: { - const pm_post_execution_node_t *cast = (const pm_post_execution_node_t *) scope_node->ast_node; - PUSH_INSN1(ret, block_location, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); + pm_scope_node_destroy(&rescue_scope_node); - // We create another ScopeNode from the statements within the PostExecutionNode - pm_scope_node_t next_scope_node; - pm_scope_node_init((const pm_node_t *) cast->statements, &next_scope_node, scope_node); + LABEL *lstart = NEW_LABEL(location.line); + LABEL *lend = NEW_LABEL(location.line); + LABEL *lcont = NEW_LABEL(location.line); - const rb_iseq_t *block = NEW_CHILD_ISEQ(&next_scope_node, make_name_for_block(body->parent_iseq), ISEQ_TYPE_BLOCK, location.line); - pm_scope_node_destroy(&next_scope_node); + lstart->rescued = LABEL_RESCUE_BEG; + lend->rescued = LABEL_RESCUE_END; - PUSH_CALL_WITH_BLOCK(ret, block_location, id_core_set_postexe, INT2FIX(0), block); - break; - } - case PM_INTERPOLATED_REGULAR_EXPRESSION_NODE: { - const pm_interpolated_regular_expression_node_t *cast = (const pm_interpolated_regular_expression_node_t *) scope_node->ast_node; - pm_compile_regexp_dynamic(iseq, (const pm_node_t *) cast, &cast->parts, &location, ret, popped, scope_node); - break; - } - default: - pm_compile_node(iseq, scope_node->body, ret, popped, scope_node); - break; - } - } - else { - PUSH_INSN(ret, block_location, putnil); - } + PUSH_LABEL(ret, lstart); + PM_COMPILE_NOT_POPPED(cast->expression); + PUSH_LABEL(ret, lend); - PUSH_LABEL(ret, end); - PUSH_TRACE(ret, RUBY_EVENT_B_RETURN); - ISEQ_COMPILE_DATA(iseq)->last_line = body->location.code_location.end_pos.lineno; + PUSH_INSN(ret, location, nop); + PUSH_LABEL(ret, lcont); + if (popped) PUSH_INSN(ret, location, pop); - /* wide range catch handler must put at last */ - PUSH_CATCH_ENTRY(CATCH_TYPE_REDO, start, end, NULL, start); - PUSH_CATCH_ENTRY(CATCH_TYPE_NEXT, start, end, NULL, end); - break; - } - case ISEQ_TYPE_ENSURE: { - const pm_node_location_t statements_location = (scope_node->body != NULL ? PM_NODE_START_LOCATION(scope_node->parser, scope_node->body) : location); - iseq_set_exception_local_table(iseq); + PUSH_CATCH_ENTRY(CATCH_TYPE_RESCUE, lstart, lend, rescue_iseq, lcont); + PUSH_CATCH_ENTRY(CATCH_TYPE_RETRY, lend, lcont, NULL, lstart); + return; + } + case PM_RETURN_NODE: { + // return + // ^^^^^^ + // + // return 1 + // ^^^^^^^^ + const pm_return_node_t *cast = (const pm_return_node_t *) node; + const pm_arguments_node_t *arguments = cast->arguments; - if (scope_node->body != NULL) { - PM_COMPILE_POPPED((const pm_node_t *) scope_node->body); - } + enum rb_iseq_type type = ISEQ_BODY(iseq)->type; + LABEL *splabel = 0; - PUSH_GETLOCAL(ret, statements_location, 1, 0); - PUSH_INSN1(ret, statements_location, throw, INT2FIX(0)); - return; - } - case ISEQ_TYPE_METHOD: { - ISEQ_COMPILE_DATA(iseq)->root_node = (const void *) scope_node->body; - PUSH_TRACE(ret, RUBY_EVENT_CALL); + const rb_iseq_t *parent_iseq = iseq; + enum rb_iseq_type parent_type = ISEQ_BODY(parent_iseq)->type; + while (parent_type == ISEQ_TYPE_RESCUE || parent_type == ISEQ_TYPE_ENSURE) { + if (!(parent_iseq = ISEQ_BODY(parent_iseq)->parent_iseq)) break; + parent_type = ISEQ_BODY(parent_iseq)->type; + } - if (scope_node->body) { - PM_COMPILE((const pm_node_t *) scope_node->body); + switch (parent_type) { + case ISEQ_TYPE_TOP: + case ISEQ_TYPE_MAIN: + if (arguments) { + rb_warn("argument of top-level return is ignored"); } - else { - PUSH_INSN(ret, location, putnil); + if (parent_iseq == iseq) { + type = ISEQ_TYPE_METHOD; } - - ISEQ_COMPILE_DATA(iseq)->root_node = (const void *) scope_node->body; - PUSH_TRACE(ret, RUBY_EVENT_RETURN); - - ISEQ_COMPILE_DATA(iseq)->last_line = body->location.code_location.end_pos.lineno; break; - } - case ISEQ_TYPE_RESCUE: { - iseq_set_exception_local_table(iseq); - if (PM_NODE_TYPE_P(scope_node->ast_node, PM_RESCUE_MODIFIER_NODE)) { - LABEL *lab = NEW_LABEL(lineno); - LABEL *rescue_end = NEW_LABEL(lineno); - PUSH_GETLOCAL(ret, location, LVAR_ERRINFO, 0); - PUSH_INSN1(ret, location, putobject, rb_eStandardError); - PUSH_INSN1(ret, location, checkmatch, INT2FIX(VM_CHECKMATCH_TYPE_RESCUE)); - PUSH_INSNL(ret, location, branchif, lab); - PUSH_INSNL(ret, location, jump, rescue_end); - PUSH_LABEL(ret, lab); - PUSH_TRACE(ret, RUBY_EVENT_RESCUE); - PM_COMPILE((const pm_node_t *) scope_node->body); - PUSH_INSN(ret, location, leave); - PUSH_LABEL(ret, rescue_end); - PUSH_GETLOCAL(ret, location, LVAR_ERRINFO, 0); - } - else { - PM_COMPILE((const pm_node_t *) scope_node->ast_node); - } - PUSH_INSN1(ret, location, throw, INT2FIX(0)); - - return; - } default: - if (scope_node->body) { - PM_COMPILE((const pm_node_t *) scope_node->body); - } - else { - PUSH_INSN(ret, location, putnil); - } break; } - if (PM_NODE_TYPE_P(scope_node->ast_node, PM_CLASS_NODE) || PM_NODE_TYPE_P(scope_node->ast_node, PM_MODULE_NODE)) { - const pm_node_location_t end_location = PM_NODE_END_LOCATION(scope_node->parser, scope_node->ast_node); - ADD_TRACE(ret, RUBY_EVENT_END); - ISEQ_COMPILE_DATA(iseq)->last_line = end_location.line; + if (type == ISEQ_TYPE_METHOD) { + splabel = NEW_LABEL(0); + PUSH_LABEL(ret, splabel); + PUSH_ADJUST(ret, location, 0); + } + + if (arguments) { + PM_COMPILE_NOT_POPPED((const pm_node_t *) arguments); + } + else { + PUSH_INSN(ret, location, putnil); } - if (!PM_NODE_TYPE_P(scope_node->ast_node, PM_ENSURE_NODE)) { - const pm_node_location_t location = { .line = ISEQ_COMPILE_DATA(iseq)->last_line, .node_id = -1 }; + if (type == ISEQ_TYPE_METHOD && can_add_ensure_iseq(iseq)) { + pm_add_ensure_iseq(ret, iseq, 1, scope_node); + PUSH_TRACE(ret, RUBY_EVENT_RETURN); PUSH_INSN(ret, location, leave); + PUSH_ADJUST_RESTORE(ret, splabel); + if (!popped) PUSH_INSN(ret, location, putnil); + } + else { + PUSH_INSN1(ret, location, throw, INT2FIX(TAG_RETURN)); + if (popped) PUSH_INSN(ret, location, pop); } return; } + case PM_RETRY_NODE: { + // retry + // ^^^^^ + if (ISEQ_BODY(iseq)->type == ISEQ_TYPE_RESCUE) { + PUSH_INSN(ret, location, putnil); + PUSH_INSN1(ret, location, throw, INT2FIX(TAG_RETRY)); + if (popped) PUSH_INSN(ret, location, pop); + } + else { + COMPILE_ERROR(iseq, location.line, "Invalid retry"); + return; + } + return; + } + case PM_SCOPE_NODE: + pm_compile_scope_node(iseq, (pm_scope_node_t *) node, &location, ret, popped); + return; case PM_SELF_NODE: { // self // ^^^^ From f59b908e477797b069bd5628440df6977e972916 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Wed, 11 Sep 2024 11:57:52 -0400 Subject: [PATCH 256/829] [PRISM] Omit some TestAST tests when Prism is enabled --- test/ruby/test_ast.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/ruby/test_ast.rb b/test/ruby/test_ast.rb index 66a5f0556d6aa1..7a6d1b0f172297 100644 --- a/test/ruby/test_ast.rb +++ b/test/ruby/test_ast.rb @@ -359,7 +359,7 @@ def test_node_id_for_backtrace_location_raises_argument_error end def test_of_proc_and_method - omit if ParserSupport.prism_enabled? + omit if ParserSupport.prism_enabled? || ParserSupport.prism_enabled_in_subprocess? proc = Proc.new { 1 + 2 } method = self.method(__method__) @@ -793,7 +793,7 @@ def test_keep_script_lines_for_of end def test_keep_script_lines_for_of_with_existing_SCRIPT_LINES__that_has__FILE__as_a_key - omit if ParserSupport.prism_enabled? + omit if ParserSupport.prism_enabled? || ParserSupport.prism_enabled_in_subprocess? # This test confirms that the bug that previously occurred because of # `AbstractSyntaxTree.of`s unnecessary dependence on SCRIPT_LINES__ does not reproduce. @@ -862,7 +862,7 @@ def test_encoding_with_keep_script_lines end def test_e_option - omit if ParserSupport.prism_enabled? + omit if ParserSupport.prism_enabled? || ParserSupport.prism_enabled_in_subprocess? assert_in_out_err(["-e", "def foo; end; pp RubyVM::AbstractSyntaxTree.of(method(:foo)).type"], "", [":SCOPE"], []) From d5232fd7aee45d1dba3d07cdbf29389207e5ef6c Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Wed, 11 Sep 2024 11:59:24 -0400 Subject: [PATCH 257/829] Temporarily exclude some TestRubyOptions test for parse.y The description has been updated when running with Prism to have +PRISM, which means that tests asserting against the description when running with --parser=parse.y will be incorrect if the subprocess ends up using Prism. We need to fix these tests, but we are currently disabling them in order to get this over the line. --- test/.excludes-parsey/TestBugReporter.rb | 1 + test/.excludes-parsey/TestRubyOptions.rb | 10 ++++++++++ 2 files changed, 11 insertions(+) create mode 100644 test/.excludes-parsey/TestBugReporter.rb create mode 100644 test/.excludes-parsey/TestRubyOptions.rb diff --git a/test/.excludes-parsey/TestBugReporter.rb b/test/.excludes-parsey/TestBugReporter.rb new file mode 100644 index 00000000000000..72357760a67b8c --- /dev/null +++ b/test/.excludes-parsey/TestBugReporter.rb @@ -0,0 +1 @@ +exclude(:test_bug_reporter_add, "unexpected +PRISM in the Ruby description") diff --git a/test/.excludes-parsey/TestRubyOptions.rb b/test/.excludes-parsey/TestRubyOptions.rb new file mode 100644 index 00000000000000..f6ac8c744a1361 --- /dev/null +++ b/test/.excludes-parsey/TestRubyOptions.rb @@ -0,0 +1,10 @@ +exclude(:test_crash_report_executable_path, "unexpected +PRISM in the Ruby description") +exclude(:test_crash_report_script_path, "unexpected +PRISM in the Ruby description") +exclude(:test_crash_report_script, "unexpected +PRISM in the Ruby description") +exclude(:test_crash_report, "unexpected +PRISM in the Ruby description") +exclude(:test_rjit_disabled_version, "unexpected +PRISM in the Ruby description") +exclude(:test_segv_loaded_features, "unexpected +PRISM in the Ruby description") +exclude(:test_segv_setproctitle, "unexpected +PRISM in the Ruby description") +exclude(:test_segv_test, "unexpected +PRISM in the Ruby description") +exclude(:test_verbose, "unexpected +PRISM in the Ruby description") +exclude(:test_version, "unexpected +PRISM in the Ruby description") From d4af38ec9d808da3e2f3ba97477332bc96b258b9 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Wed, 11 Sep 2024 12:42:31 -0400 Subject: [PATCH 258/829] Fix FILE_SHARE_* permissions for Windows in read_entire_file --- prism_compile.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prism_compile.c b/prism_compile.c index 1d0bd7933f8de4..4c115b7766e8d1 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -10558,7 +10558,7 @@ read_entire_file(pm_string_t *string, const char *filepath) { #ifdef _WIN32 // Open the file for reading. - HANDLE file = CreateFile(filepath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + HANDLE file = CreateFile(filepath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL); if (file == INVALID_HANDLE_VALUE) { return false; From ca61729fa7713f650c7e4144daa08932f8b66454 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Wed, 11 Sep 2024 15:09:30 -0400 Subject: [PATCH 259/829] Fix opening multibyte character filepath on Windows --- prism_compile.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/prism_compile.c b/prism_compile.c index 4c115b7766e8d1..16a64b7b49a029 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -10558,9 +10558,18 @@ read_entire_file(pm_string_t *string, const char *filepath) { #ifdef _WIN32 // Open the file for reading. - HANDLE file = CreateFile(filepath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL); + int length = MultiByteToWideChar(CP_UTF8, 0, filepath, -1, NULL, 0); + if (length == 0) return false; + WCHAR *wfilepath = xmalloc(sizeof(WCHAR) * ((size_t) length)); + if ((wfilepath == NULL) || (MultiByteToWideChar(CP_UTF8, 0, filepath, -1, wfilepath, length) == 0)) { + xfree(wfilepath); + return false; + } + + HANDLE file = CreateFileW(wfilepath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL); if (file == INVALID_HANDLE_VALUE) { + xfree(wfilepath); return false; } @@ -10568,6 +10577,7 @@ read_entire_file(pm_string_t *string, const char *filepath) DWORD file_size = GetFileSize(file, NULL); if (file_size == INVALID_FILE_SIZE) { CloseHandle(file); + xfree(wfilepath); return false; } @@ -10575,6 +10585,7 @@ read_entire_file(pm_string_t *string, const char *filepath) // the source to a constant empty string and return. if (file_size == 0) { CloseHandle(file); + xfree(wfilepath); const uint8_t source[] = ""; *string = (pm_string_t) { .type = PM_STRING_CONSTANT, .source = source, .length = 0 }; return true; @@ -10584,6 +10595,7 @@ read_entire_file(pm_string_t *string, const char *filepath) HANDLE mapping = CreateFileMapping(file, NULL, PAGE_READONLY, 0, 0, NULL); if (mapping == NULL) { CloseHandle(file); + xfree(wfilepath); return false; } @@ -10591,6 +10603,7 @@ read_entire_file(pm_string_t *string, const char *filepath) uint8_t *source = (uint8_t *) MapViewOfFile(mapping, FILE_MAP_READ, 0, 0, 0); CloseHandle(mapping); CloseHandle(file); + xfree(wfilepath); if (source == NULL) { return false; From 38ba15beed5eb9f3a4923f9a215473965f31a7bc Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Wed, 11 Sep 2024 16:49:08 -0400 Subject: [PATCH 260/829] [ruby/prism] Check errno for parsing directory https://github.com/ruby/prism/commit/d68ea29d04 --- lib/prism/ffi.rb | 18 ++++++++- prism/extension.c | 26 +++++++++--- prism/util/pm_string.c | 78 ++++++++++++++++++++---------------- prism/util/pm_string.h | 28 +++++++++++-- test/prism/api/parse_test.rb | 14 +++++++ 5 files changed, 118 insertions(+), 46 deletions(-) diff --git a/lib/prism/ffi.rb b/lib/prism/ffi.rb index 46c4a1a755743f..b972520be10823 100644 --- a/lib/prism/ffi.rb +++ b/lib/prism/ffi.rb @@ -72,6 +72,7 @@ def self.load_exported_functions_from(header, *functions, callbacks) end callback :pm_parse_stream_fgets_t, [:pointer, :int, :pointer], :pointer + enum :pm_string_init_result_t, %i[PM_STRING_INIT_SUCCESS PM_STRING_INIT_ERROR_GENERIC PM_STRING_INIT_ERROR_DIRECTORY] load_exported_functions_from( "prism.h", @@ -176,13 +177,26 @@ def self.with_string(string) def self.with_file(filepath) raise TypeError unless filepath.is_a?(String) + # On Windows and Mac, it's expected that filepaths will be encoded in + # UTF-8. If they are not, we need to convert them to UTF-8 before + # passing them into pm_string_mapped_init. + if RbConfig::CONFIG["host_os"].match?(/bccwin|cygwin|djgpp|mingw|mswin|wince|darwin/i) && + (encoding = filepath.encoding) != Encoding::ASCII_8BIT && encoding != Encoding::UTF_8 + filepath = filepath.encode(Encoding::UTF_8) + end + FFI::MemoryPointer.new(SIZEOF) do |pm_string| - if LibRubyParser.pm_string_mapped_init(pm_string, filepath) + case (result = LibRubyParser.pm_string_mapped_init(pm_string, filepath)) + when :PM_STRING_INIT_SUCCESS pointer = LibRubyParser.pm_string_source(pm_string) length = LibRubyParser.pm_string_length(pm_string) return yield new(pointer, length, false) - else + when :PM_STRING_INIT_ERROR_GENERIC raise SystemCallError.new(filepath, FFI.errno) + when :PM_STRING_INIT_ERROR_DIRECTORY + raise Errno::EISDIR.new(filepath) + else + raise "Unknown error initializing pm_string_t: #{result.inspect}" end ensure LibRubyParser.pm_string_free(pm_string) diff --git a/prism/extension.c b/prism/extension.c index 6a8fedcb054337..79761770f64831 100644 --- a/prism/extension.c +++ b/prism/extension.c @@ -263,18 +263,32 @@ file_options(int argc, VALUE *argv, pm_string_t *input, pm_options_t *options, V *encoded_filepath = rb_str_encode_ospath(filepath); extract_options(options, *encoded_filepath, keywords); - const char * string_source = (const char *) pm_string_source(&options->filepath); + const char *source = (const char *) pm_string_source(&options->filepath); + pm_string_init_result_t result; - if (!pm_string_file_init(input, string_source)) { - pm_options_free(options); + switch (result = pm_string_file_init(input, source)) { + case PM_STRING_INIT_SUCCESS: + break; + case PM_STRING_INIT_ERROR_GENERIC: { + pm_options_free(options); #ifdef _WIN32 - int e = rb_w32_map_errno(GetLastError()); + int e = rb_w32_map_errno(GetLastError()); #else - int e = errno; + int e = errno; #endif - rb_syserr_fail(e, string_source); + rb_syserr_fail(e, source); + break; + } + case PM_STRING_INIT_ERROR_DIRECTORY: + pm_options_free(options); + rb_syserr_fail(EISDIR, source); + break; + default: + pm_options_free(options); + rb_raise(rb_eRuntimeError, "Unknown error (%d) initializing file: %s", result, source); + break; } } diff --git a/prism/util/pm_string.c b/prism/util/pm_string.c index 3e1e22e34f13fa..99a27ede4df0f9 100644 --- a/prism/util/pm_string.c +++ b/prism/util/pm_string.c @@ -64,24 +64,33 @@ typedef struct { * Open the file indicated by the filepath parameter for reading on Windows. * Perform any kind of normalization that needs to happen on the filepath. */ -static bool +static pm_string_init_result_t pm_string_file_handle_open(pm_string_file_handle_t *handle, const char *filepath) { int length = MultiByteToWideChar(CP_UTF8, 0, filepath, -1, NULL, 0); - if (length == 0) return false; + if (length == 0) return PM_STRING_INIT_ERROR_GENERIC; handle->path = xmalloc(sizeof(WCHAR) * ((size_t) length)); if ((handle->path == NULL) || (MultiByteToWideChar(CP_UTF8, 0, filepath, -1, handle->path, length) == 0)) { xfree(handle->path); - return false; + return PM_STRING_INIT_ERROR_GENERIC; } handle->file = CreateFileW(handle->path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL); if (handle->file == INVALID_HANDLE_VALUE) { + pm_string_init_result_t result = PM_STRING_INIT_ERROR_GENERIC; + + if (GetLastError() == ERROR_ACCESS_DENIED) { + DWORD attributes = GetFileAttributesW(handle->path); + if ((attributes != INVALID_FILE_ATTRIBUTES) && (attributes & FILE_ATTRIBUTE_DIRECTORY)) { + result = PM_STRING_INIT_ERROR_DIRECTORY; + } + } + xfree(handle->path); - return false; + return result; } - return true; + return PM_STRING_INIT_SUCCESS; } /** @@ -105,18 +114,19 @@ pm_string_file_handle_close(pm_string_file_handle_t *handle) { * `MapViewOfFile`, on POSIX systems that have access to `mmap` we'll use * `mmap`, and on other POSIX systems we'll use `read`. */ -PRISM_EXPORTED_FUNCTION bool +PRISM_EXPORTED_FUNCTION pm_string_init_result_t pm_string_mapped_init(pm_string_t *string, const char *filepath) { #ifdef _WIN32 // Open the file for reading. pm_string_file_handle_t handle; - if (!pm_string_file_handle_open(&handle, filepath)) return false; + pm_string_init_result_t result = pm_string_file_handle_open(&handle, filepath); + if (result != PM_STRING_INIT_SUCCESS) return result; // Get the file size. DWORD file_size = GetFileSize(handle.file, NULL); if (file_size == INVALID_FILE_SIZE) { pm_string_file_handle_close(&handle); - return false; + return PM_STRING_INIT_ERROR_GENERIC; } // If the file is empty, then we don't need to do anything else, we'll set @@ -125,14 +135,14 @@ pm_string_mapped_init(pm_string_t *string, const char *filepath) { pm_string_file_handle_close(&handle); const uint8_t source[] = ""; *string = (pm_string_t) { .type = PM_STRING_CONSTANT, .source = source, .length = 0 }; - return true; + return PM_STRING_INIT_SUCCESS; } // Create a mapping of the file. HANDLE mapping = CreateFileMapping(handle.file, NULL, PAGE_READONLY, 0, 0, NULL); if (mapping == NULL) { pm_string_file_handle_close(&handle); - return false; + return PM_STRING_INIT_ERROR_GENERIC; } // Map the file into memory. @@ -141,30 +151,29 @@ pm_string_mapped_init(pm_string_t *string, const char *filepath) { pm_string_file_handle_close(&handle); if (source == NULL) { - return false; + return PM_STRING_INIT_ERROR_GENERIC; } *string = (pm_string_t) { .type = PM_STRING_MAPPED, .source = source, .length = (size_t) file_size }; - return true; + return PM_STRING_INIT_SUCCESS; #elif defined(_POSIX_MAPPED_FILES) // Open the file for reading int fd = open(filepath, O_RDONLY); if (fd == -1) { - return false; + return PM_STRING_INIT_ERROR_GENERIC; } // Stat the file to get the file size struct stat sb; if (fstat(fd, &sb) == -1) { close(fd); - return false; + return PM_STRING_INIT_ERROR_GENERIC; } // Ensure it is a file and not a directory if (S_ISDIR(sb.st_mode)) { - errno = EISDIR; close(fd); - return false; + return PM_STRING_INIT_ERROR_DIRECTORY; } // mmap the file descriptor to virtually get the contents @@ -175,17 +184,17 @@ pm_string_mapped_init(pm_string_t *string, const char *filepath) { close(fd); const uint8_t source[] = ""; *string = (pm_string_t) { .type = PM_STRING_CONSTANT, .source = source, .length = 0 }; - return true; + return PM_STRING_INIT_SUCCESS; } source = mmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, 0); if (source == MAP_FAILED) { - return false; + return PM_STRING_INIT_ERROR_GENERIC; } close(fd); *string = (pm_string_t) { .type = PM_STRING_MAPPED, .source = source, .length = size }; - return true; + return PM_STRING_INIT_SUCCESS; #else return pm_string_file_init(string, filepath); #endif @@ -196,18 +205,19 @@ pm_string_mapped_init(pm_string_t *string, const char *filepath) { * contents and size into the given `pm_string_t`. The given `pm_string_t` * should be freed using `pm_string_free` when it is no longer used. */ -PRISM_EXPORTED_FUNCTION bool +PRISM_EXPORTED_FUNCTION pm_string_init_result_t pm_string_file_init(pm_string_t *string, const char *filepath) { #ifdef _WIN32 // Open the file for reading. pm_string_file_handle_t handle; - if (!pm_string_file_handle_open(&handle, filepath)) return false; + pm_string_init_result_t result = pm_string_file_handle_open(&handle, filepath); + if (result != PM_STRING_INIT_SUCCESS) return result; // Get the file size. DWORD file_size = GetFileSize(handle.file, NULL); if (file_size == INVALID_FILE_SIZE) { pm_string_file_handle_close(&handle); - return false; + return PM_STRING_INIT_ERROR_GENERIC; } // If the file is empty, then we don't need to do anything else, we'll set @@ -216,37 +226,37 @@ pm_string_file_init(pm_string_t *string, const char *filepath) { pm_string_file_handle_close(&handle); const uint8_t source[] = ""; *string = (pm_string_t) { .type = PM_STRING_CONSTANT, .source = source, .length = 0 }; - return true; + return PM_STRING_INIT_SUCCESS; } // Create a buffer to read the file into. uint8_t *source = xmalloc(file_size); if (source == NULL) { pm_string_file_handle_close(&handle); - return false; + return PM_STRING_INIT_ERROR_GENERIC; } // Read the contents of the file DWORD bytes_read; if (!ReadFile(handle.file, source, file_size, &bytes_read, NULL)) { pm_string_file_handle_close(&handle); - return false; + return PM_STRING_INIT_ERROR_GENERIC; } // Check the number of bytes read if (bytes_read != file_size) { xfree(source); pm_string_file_handle_close(&handle); - return false; + return PM_STRING_INIT_ERROR_GENERIC; } pm_string_file_handle_close(&handle); *string = (pm_string_t) { .type = PM_STRING_OWNED, .source = source, .length = (size_t) file_size }; - return true; + return PM_STRING_INIT_SUCCESS; #elif defined(PRISM_HAS_FILESYSTEM) FILE *file = fopen(filepath, "rb"); if (file == NULL) { - return false; + return PM_STRING_INIT_ERROR_GENERIC; } fseek(file, 0, SEEK_END); @@ -254,21 +264,21 @@ pm_string_file_init(pm_string_t *string, const char *filepath) { if (file_size == -1) { fclose(file); - return false; + return PM_STRING_INIT_ERROR_GENERIC; } if (file_size == 0) { fclose(file); const uint8_t source[] = ""; *string = (pm_string_t) { .type = PM_STRING_CONSTANT, .source = source, .length = 0 }; - return true; + return PM_STRING_INIT_SUCCESS; } size_t length = (size_t) file_size; uint8_t *source = xmalloc(length); if (source == NULL) { fclose(file); - return false; + return PM_STRING_INIT_ERROR_GENERIC; } fseek(file, 0, SEEK_SET); @@ -277,16 +287,16 @@ pm_string_file_init(pm_string_t *string, const char *filepath) { if (bytes_read != 1) { xfree(source); - return false; + return PM_STRING_INIT_ERROR_GENERIC; } *string = (pm_string_t) { .type = PM_STRING_OWNED, .source = source, .length = length }; - return true; + return PM_STRING_INIT_SUCCESS; #else (void) string; (void) filepath; perror("pm_string_file_init is not implemented for this platform"); - return false; + return PM_STRING_INIT_ERROR_GENERIC; #endif } diff --git a/prism/util/pm_string.h b/prism/util/pm_string.h index e4a20558d36e4f..6ba327b2473773 100644 --- a/prism/util/pm_string.h +++ b/prism/util/pm_string.h @@ -93,6 +93,26 @@ void pm_string_owned_init(pm_string_t *string, uint8_t *source, size_t length); */ void pm_string_constant_init(pm_string_t *string, const char *source, size_t length); +/** + * Represents the result of calling pm_string_mapped_init or + * pm_string_file_init. We need this additional information because there is + * not a platform-agnostic way to indicate that the file that was attempted to + * be opened was a directory. + */ +typedef enum { + /** Indicates that the string was successfully initialized. */ + PM_STRING_INIT_SUCCESS = 0, + /** + * Indicates a generic error from a string_*_init function, where the type + * of error should be read from `errno` or `GetLastError()`. + */ + PM_STRING_INIT_ERROR_GENERIC = 1, + /** + * Indicates that the file that was attempted to be opened was a directory. + */ + PM_STRING_INIT_ERROR_DIRECTORY = 2 +} pm_string_init_result_t; + /** * Read the file indicated by the filepath parameter into source and load its * contents and size into the given `pm_string_t`. The given `pm_string_t` @@ -106,9 +126,9 @@ void pm_string_constant_init(pm_string_t *string, const char *source, size_t len * * @param string The string to initialize. * @param filepath The filepath to read. - * @return Whether or not the file was successfully mapped. + * @return The success of the read, indicated by the value of the enum. */ -PRISM_EXPORTED_FUNCTION bool pm_string_mapped_init(pm_string_t *string, const char *filepath); +PRISM_EXPORTED_FUNCTION pm_string_init_result_t pm_string_mapped_init(pm_string_t *string, const char *filepath); /** * Read the file indicated by the filepath parameter into source and load its @@ -117,9 +137,9 @@ PRISM_EXPORTED_FUNCTION bool pm_string_mapped_init(pm_string_t *string, const ch * * @param string The string to initialize. * @param filepath The filepath to read. - * @return Whether or not the file was successfully read. + * @return The success of the read, indicated by the value of the enum. */ -PRISM_EXPORTED_FUNCTION bool pm_string_file_init(pm_string_t *string, const char *filepath); +PRISM_EXPORTED_FUNCTION pm_string_init_result_t pm_string_file_init(pm_string_t *string, const char *filepath); /** * Ensure the string is owned. If it is not, then reinitialize it as owned and diff --git a/test/prism/api/parse_test.rb b/test/prism/api/parse_test.rb index 6ad3829de0bae6..58962aab6a08f5 100644 --- a/test/prism/api/parse_test.rb +++ b/test/prism/api/parse_test.rb @@ -79,6 +79,20 @@ def test_parse_nonascii end end + def test_parse_directory + error = nil + + begin + Prism.parse_file(__dir__) + rescue SystemCallError => error + end + + refute_nil error + return if error.is_a?(Errno::ENOMEM) + + assert_kind_of Errno::EISDIR, error + end + private def find_source_file_node(program) From 9c461cd1252b9a56ca54818e90042745ad08be29 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Thu, 12 Sep 2024 12:03:49 -0400 Subject: [PATCH 261/829] [PRISM] Check error type for parsing directory --- prism_compile.c | 94 ++++++++++++++++++++++++++++--------------------- 1 file changed, 54 insertions(+), 40 deletions(-) diff --git a/prism_compile.c b/prism_compile.c index 16a64b7b49a029..b34583275f4b2b 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -10553,24 +10553,33 @@ pm_parse_file_script_lines(const pm_scope_node_t *scope_node, const pm_parser_t // This is essentially pm_string_mapped_init(), preferring to memory map the // file, with additional handling for files that require blocking to properly // read (e.g. pipes). -static bool -read_entire_file(pm_string_t *string, const char *filepath) +static pm_string_init_result_t +pm_read_file(pm_string_t *string, const char *filepath) { #ifdef _WIN32 // Open the file for reading. int length = MultiByteToWideChar(CP_UTF8, 0, filepath, -1, NULL, 0); - if (length == 0) return false; + if (length == 0) return PM_STRING_INIT_ERROR_GENERIC; WCHAR *wfilepath = xmalloc(sizeof(WCHAR) * ((size_t) length)); if ((wfilepath == NULL) || (MultiByteToWideChar(CP_UTF8, 0, filepath, -1, wfilepath, length) == 0)) { xfree(wfilepath); - return false; + return PM_STRING_INIT_ERROR_GENERIC; } HANDLE file = CreateFileW(wfilepath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL); if (file == INVALID_HANDLE_VALUE) { + pm_string_init_result_t result = PM_STRING_INIT_ERROR_GENERIC; + + if (GetLastError() == ERROR_ACCESS_DENIED) { + DWORD attributes = GetFileAttributesW(wfilepath); + if ((attributes != INVALID_FILE_ATTRIBUTES) && (attributes & FILE_ATTRIBUTE_DIRECTORY)) { + result = PM_STRING_INIT_ERROR_DIRECTORY; + } + } + xfree(wfilepath); - return false; + return result; } // Get the file size. @@ -10578,7 +10587,7 @@ read_entire_file(pm_string_t *string, const char *filepath) if (file_size == INVALID_FILE_SIZE) { CloseHandle(file); xfree(wfilepath); - return false; + return PM_STRING_INIT_ERROR_GENERIC; } // If the file is empty, then we don't need to do anything else, we'll set @@ -10588,7 +10597,7 @@ read_entire_file(pm_string_t *string, const char *filepath) xfree(wfilepath); const uint8_t source[] = ""; *string = (pm_string_t) { .type = PM_STRING_CONSTANT, .source = source, .length = 0 }; - return true; + return PM_STRING_INIT_SUCCESS; } // Create a mapping of the file. @@ -10596,7 +10605,7 @@ read_entire_file(pm_string_t *string, const char *filepath) if (mapping == NULL) { CloseHandle(file); xfree(wfilepath); - return false; + return PM_STRING_INIT_ERROR_GENERIC; } // Map the file into memory. @@ -10606,31 +10615,30 @@ read_entire_file(pm_string_t *string, const char *filepath) xfree(wfilepath); if (source == NULL) { - return false; + return PM_STRING_INIT_ERROR_GENERIC; } *string = (pm_string_t) { .type = PM_STRING_MAPPED, .source = source, .length = (size_t) file_size }; - return true; + return PM_STRING_INIT_SUCCESS; #elif defined(_POSIX_MAPPED_FILES) // Open the file for reading const int open_mode = O_RDONLY | O_NONBLOCK; int fd = open(filepath, open_mode); if (fd == -1) { - return false; + return PM_STRING_INIT_ERROR_GENERIC; } // Stat the file to get the file size struct stat sb; if (fstat(fd, &sb) == -1) { close(fd); - return false; + return PM_STRING_INIT_ERROR_GENERIC; } // Ensure it is a file and not a directory if (S_ISDIR(sb.st_mode)) { close(fd); - errno = EISDIR; - return false; + return PM_STRING_INIT_ERROR_DIRECTORY; } // We need to wait for data first before reading from pipes and character @@ -10642,20 +10650,20 @@ read_entire_file(pm_string_t *string, const char *filepath) VALUE contents = rb_funcall(io, rb_intern("read"), 0); if (!RB_TYPE_P(contents, T_STRING)) { - return false; + return PM_STRING_INIT_ERROR_GENERIC; } long len = RSTRING_LEN(contents); if (len < 0) { - return false; + return PM_STRING_INIT_ERROR_GENERIC; } - size_t length = (size_t) len; + size_t length = (size_t) len; uint8_t *source = xmalloc(length); memcpy(source, RSTRING_PTR(contents), length); *string = (pm_string_t) { .type = PM_STRING_OWNED, .source = source, .length = length }; - return true; + return PM_STRING_INIT_SUCCESS; } // mmap the file descriptor to virtually get the contents @@ -10666,17 +10674,17 @@ read_entire_file(pm_string_t *string, const char *filepath) close(fd); const uint8_t source[] = ""; *string = (pm_string_t) { .type = PM_STRING_CONSTANT, .source = source, .length = 0 }; - return true; + return PM_STRING_INIT_SUCCESS; } source = mmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, 0); if (source == MAP_FAILED) { - return false; + return PM_STRING_INIT_ERROR_GENERIC; } close(fd); *string = (pm_string_t) { .type = PM_STRING_MAPPED, .source = source, .length = size }; - return true; + return PM_STRING_INIT_SUCCESS; #else return pm_string_file_init(string, filepath); #endif @@ -10689,32 +10697,38 @@ read_entire_file(pm_string_t *string, const char *filepath) VALUE pm_load_file(pm_parse_result_t *result, VALUE filepath, bool load_error) { - if (!read_entire_file(&result->input, RSTRING_PTR(filepath))) { + pm_string_init_result_t init_result = pm_read_file(&result->input, RSTRING_PTR(filepath)); + + if (init_result == PM_STRING_INIT_SUCCESS) { + pm_options_frozen_string_literal_init(&result->options); + return Qnil; + } + + int err; + if (init_result == PM_STRING_INIT_ERROR_DIRECTORY) { + err = EISDIR; + } else { #ifdef _WIN32 - int e = rb_w32_map_errno(GetLastError()); + err = rb_w32_map_errno(GetLastError()); #else - int e = errno; + err = errno; #endif + } - VALUE error; - - if (load_error) { - VALUE message = rb_str_buf_new_cstr(strerror(e)); - rb_str_cat2(message, " -- "); - rb_str_append(message, filepath); + VALUE error; + if (load_error) { + VALUE message = rb_str_buf_new_cstr(strerror(err)); + rb_str_cat2(message, " -- "); + rb_str_append(message, filepath); - error = rb_exc_new3(rb_eLoadError, message); - rb_ivar_set(error, rb_intern_const("@path"), filepath); - } else { - error = rb_syserr_new(e, RSTRING_PTR(filepath)); - RB_GC_GUARD(filepath); - } - - return error; + error = rb_exc_new3(rb_eLoadError, message); + rb_ivar_set(error, rb_intern_const("@path"), filepath); + } else { + error = rb_syserr_new(err, RSTRING_PTR(filepath)); + RB_GC_GUARD(filepath); } - pm_options_frozen_string_literal_init(&result->options); - return Qnil; + return error; } /** From 05e02783a5ee489064159630252a8ed9cc2c7779 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Thu, 12 Sep 2024 15:07:04 -0400 Subject: [PATCH 262/829] [PRISM] Ignore test_parse_directory if error is nil --- test/prism/api/parse_test.rb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/test/prism/api/parse_test.rb b/test/prism/api/parse_test.rb index 58962aab6a08f5..49a2b2bfb9a42f 100644 --- a/test/prism/api/parse_test.rb +++ b/test/prism/api/parse_test.rb @@ -87,9 +87,7 @@ def test_parse_directory rescue SystemCallError => error end - refute_nil error - return if error.is_a?(Errno::ENOMEM) - + return if error.nil? || error.is_a?(Errno::ENOMEM) assert_kind_of Errno::EISDIR, error end From ce5fd35b356b122ba945706d3682e128cb3cd625 Mon Sep 17 00:00:00 2001 From: Burdette Lamar Date: Thu, 12 Sep 2024 14:18:56 -0500 Subject: [PATCH 263/829] [DOC] Tweaks for Array#fetch (#11602) --- array.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/array.c b/array.c index 5851b19050147c..059d6911ee7cd3 100644 --- a/array.c +++ b/array.c @@ -1995,17 +1995,19 @@ rb_ary_last(int argc, const VALUE *argv, VALUE ary) // used by parse.y /* * call-seq: - * array.fetch(index) -> element - * array.fetch(index, default_value) -> element - * array.fetch(index) {|index| ... } -> element + * fetch(index) -> element + * fetch(index, default_value) -> element or default_value + * fetch(index) {|index| ... } -> element or block_return_value * - * Returns the element at offset +index+. + * Returns the element of +self+ at offset +index+ if +index+ is in range; +index+ must be an + * {integer-convertible object}[rdoc-ref:implicit_conversion.rdoc@Integer-Convertible+Objects]. * - * With the single Integer argument +index+, + * With the single argument +index+ and no block, * returns the element at offset +index+: * * a = [:foo, 'bar', 2] - * a.fetch(1) # => "bar" + * a.fetch(1) # => "bar" + * a.fetch(1.1) # => "bar" * * If +index+ is negative, counts from the end of the array: * @@ -2013,12 +2015,12 @@ rb_ary_last(int argc, const VALUE *argv, VALUE ary) // used by parse.y * a.fetch(-1) # => 2 * a.fetch(-2) # => "bar" * - * With arguments +index+ and +default_value+, - * returns the element at offset +index+ if index is in range, - * otherwise returns +default_value+: + * With arguments +index+ and +default_value+ (which may be any object) and no block, + * returns +default_value+ if +index+ is out-of-range: * * a = [:foo, 'bar', 2] - * a.fetch(1, nil) # => "bar" + * a.fetch(1, nil) # => "bar" + * a.fetch(3, :foo) # => :foo * * With argument +index+ and a block, * returns the element at offset +index+ if index is in range @@ -2028,6 +2030,7 @@ rb_ary_last(int argc, const VALUE *argv, VALUE ary) // used by parse.y * a.fetch(1) {|index| raise 'Cannot happen' } # => "bar" * a.fetch(50) {|index| "Value for #{index}" } # => "Value for 50" * + * Related: see {Methods for Fetching}[rdoc-ref:Array@Methods+for+Fetching]. */ static VALUE From 0960c8aacd30c28347de6b7d906df0c5d2d86b41 Mon Sep 17 00:00:00 2001 From: Burdette Lamar Date: Thu, 12 Sep 2024 14:19:20 -0500 Subject: [PATCH 264/829] [DOC] Tweaks for Array#fetch_values (#11603) --- array.c | 1 + array.rb | 35 +++++++++++++++++++++++++---------- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/array.c b/array.c index 059d6911ee7cd3..fcfe01ab87ff84 100644 --- a/array.c +++ b/array.c @@ -8600,6 +8600,7 @@ rb_ary_deconstruct(VALUE ary) * * - #[] (aliased as #slice): Returns consecutive elements as determined by a given argument. * - #fetch: Returns the element at a given offset. + * - #fetch_values: Returns elements at given offsets. * - #first: Returns one or more leading elements. * - #last: Returns one or more trailing elements. * - #max: Returns one or more maximum-valued elements, diff --git a/array.rb b/array.rb index 4b4c2c0ac8ec19..745032233623c3 100644 --- a/array.rb +++ b/array.rb @@ -201,22 +201,37 @@ def last n = unspecified = true end # call-seq: - # array.fetch_values(*indexes) -> new_array - # array.fetch_values(*indexes) {|key| ... } -> new_array + # fetch_values(*indexes) -> new_array + # fetch_values(*indexes) {|index| ... } -> new_array + # + # With no block given, returns a new array containing the elements of +self+ + # at the offsets given by +indexes+; + # each of the +indexes+ must be an + # {integer-convertible object}[rdoc-ref:implicit_conversion.rdoc@Integer-Convertible+Objects]: # - # Returns a new Array containing the values associated with the given indexes *indexes: # a = [:foo, :bar, :baz] - # a.fetch_values(3, 1) # => [:baz, :foo] + # a.fetch_values(3, 1) # => [:baz, :foo] + # a.fetch_values(3.1, 1) # => [:baz, :foo] + # a.fetch_values # => [] + # + # For a negative index, counts backwards from the end of the array: + # + # a.fetch_values([-2, -1]) # [:bar, :baz] + # + # When no block is given, raises an exception if any index is out of range. + # + # With a block given, for each index: + # + # - If the index in in range, uses an element of +self+ (as above). + # - Otherwise calls, the block with the index, and uses the block's return value. # - # Returns a new empty Array if no arguments given. + # Example: # - # When a block is given, calls the block with each missing index, - # treating the block's return value as the value for that index: # a = [:foo, :bar, :baz] - # values = a.fetch_values(1, 0, 42, 777) {|index| index.to_s} - # values # => [:bar, :foo, "42", "777"] + # a.fetch_values(1, 0, 42, 777) {|index| index.to_s} + # # => [:bar, :foo, "42", "777"] # - # When no block is given, raises an exception if any given key is not found. + # Related: see {Methods for Fetching}[rdoc-ref:Array@Methods+for+Fetching]. def fetch_values(*indexes, &block) indexes.map! { |i| fetch(i, &block) } indexes From 2d495300e2559c4633376086672a1c695d567a1f Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Thu, 12 Sep 2024 15:49:44 -0400 Subject: [PATCH 265/829] [PRISM] Fix up pm_compile_branch_condition issue with single insn iseqs --- prism_compile.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/prism_compile.c b/prism_compile.c index b34583275f4b2b..b1f9b00bf624db 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -994,15 +994,16 @@ pm_compile_branch_condition(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const pm_no pm_compile_node(iseq, cond, cond_seq, false, scope_node); if (LIST_INSN_SIZE_ONE(cond_seq)) { - INSN *insn = (INSN *)ELEM_FIRST_INSN(FIRST_ELEMENT(cond_seq)); + INSN *insn = (INSN *) ELEM_FIRST_INSN(FIRST_ELEMENT(cond_seq)); + if (insn->insn_id == BIN(putobject)) { if (RTEST(insn->operands[0])) { - ADD_INSNL(ret, cond, jump, then_label); + PUSH_INSNL(ret, location, jump, then_label); // maybe unreachable return; } else { - ADD_INSNL(ret, cond, jump, else_label); + PUSH_INSNL(ret, location, jump, else_label); return; } } @@ -5936,7 +5937,7 @@ pm_compile_scope_node(rb_iseq_t *iseq, pm_scope_node_t *scope_node, const pm_nod bool trailing_comma = false; if (PM_NODE_TYPE_P(scope_node->ast_node, PM_CLASS_NODE) || PM_NODE_TYPE_P(scope_node->ast_node, PM_MODULE_NODE)) { - ADD_TRACE(ret, RUBY_EVENT_CLASS); + PUSH_TRACE(ret, RUBY_EVENT_CLASS); } if (scope_node->parameters != NULL) { @@ -6822,7 +6823,7 @@ pm_compile_scope_node(rb_iseq_t *iseq, pm_scope_node_t *scope_node, const pm_nod if (PM_NODE_TYPE_P(scope_node->ast_node, PM_CLASS_NODE) || PM_NODE_TYPE_P(scope_node->ast_node, PM_MODULE_NODE)) { const pm_node_location_t end_location = PM_NODE_END_LOCATION(scope_node->parser, scope_node->ast_node); - ADD_TRACE(ret, RUBY_EVENT_END); + PUSH_TRACE(ret, RUBY_EVENT_END); ISEQ_COMPILE_DATA(iseq)->last_line = end_location.line; } From 606db2c423aa2951c3f404fb5b58e15ee635f0ca Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Thu, 12 Sep 2024 10:21:08 -0400 Subject: [PATCH 266/829] Move special const checks to rb_gc_mark_weak --- gc.c | 2 ++ gc/default.c | 5 ++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/gc.c b/gc.c index 6c8e808fa89c8a..ecfba4b58bf398 100644 --- a/gc.c +++ b/gc.c @@ -2100,6 +2100,8 @@ rb_gc_mark_maybe(VALUE obj) void rb_gc_mark_weak(VALUE *ptr) { + if (RB_SPECIAL_CONST_P(*ptr)) return; + rb_gc_impl_mark_weak(rb_gc_get_objspace(), ptr); } diff --git a/gc/default.c b/gc/default.c index f2915d7d8eb5f5..b5fa1a6b4bd26c 100644 --- a/gc/default.c +++ b/gc/default.c @@ -4609,11 +4609,10 @@ rb_gc_impl_mark_weak(void *objspace_ptr, VALUE *ptr) if (RB_UNLIKELY(!during_gc)) return; - VALUE obj = *ptr; - if (RB_SPECIAL_CONST_P(obj)) return; - GC_ASSERT(objspace->rgengc.parent_object == 0 || FL_TEST(objspace->rgengc.parent_object, FL_WB_PROTECTED)); + VALUE obj = *ptr; + if (RB_UNLIKELY(RB_TYPE_P(obj, T_NONE))) { rb_obj_info_dump(obj); rb_bug("try to mark T_NONE object"); From 661f64e87643f7a7f5042b0454b751215df8b40f Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Thu, 12 Sep 2024 10:23:16 -0400 Subject: [PATCH 267/829] Add variable objspace in RB_GC_MARK_OR_TRAVERSE --- gc.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/gc.c b/gc.c index ecfba4b58bf398..43ace78f21a919 100644 --- a/gc.c +++ b/gc.c @@ -2039,14 +2039,15 @@ ruby_stack_check(void) #define RB_GC_MARK_OR_TRAVERSE(func, obj_or_ptr, obj, check_obj) do { \ if (!RB_SPECIAL_CONST_P(obj)) { \ rb_vm_t *vm = GET_VM(); \ + void *objspace = vm->gc.objspace; \ if (LIKELY(vm->gc.mark_func_data == NULL)) { \ - (func)(vm->gc.objspace, (obj_or_ptr)); \ + (func)(objspace, (obj_or_ptr)); \ } \ else if (check_obj ? \ - rb_gc_impl_pointer_to_heap_p(vm->gc.objspace, (const void *)obj) && \ - !rb_gc_impl_garbage_object_p(vm->gc.objspace, obj) : \ + rb_gc_impl_pointer_to_heap_p(objspace, (const void *)obj) && \ + !rb_gc_impl_garbage_object_p(objspace, obj) : \ true) { \ - GC_ASSERT(!rb_gc_impl_during_gc_p(vm->gc.objspace)); \ + GC_ASSERT(!rb_gc_impl_during_gc_p(objspace)); \ struct gc_mark_func_data_struct *mark_func_data = vm->gc.mark_func_data; \ vm->gc.mark_func_data = NULL; \ mark_func_data->mark_func((obj), mark_func_data->data); \ From 92b7b78e06fe8df4d8e008719f6d9717004b6c51 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Thu, 12 Sep 2024 10:24:04 -0400 Subject: [PATCH 268/829] Assert that we are during GC when marking --- gc.c | 1 + 1 file changed, 1 insertion(+) diff --git a/gc.c b/gc.c index 43ace78f21a919..aed788d39b6aa7 100644 --- a/gc.c +++ b/gc.c @@ -2041,6 +2041,7 @@ ruby_stack_check(void) rb_vm_t *vm = GET_VM(); \ void *objspace = vm->gc.objspace; \ if (LIKELY(vm->gc.mark_func_data == NULL)) { \ + GC_ASSERT(rb_gc_impl_during_gc_p(objspace)); \ (func)(objspace, (obj_or_ptr)); \ } \ else if (check_obj ? \ From 0fc8422a05e21a3d1247794e8ec34a43010d51c9 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Thu, 12 Sep 2024 10:27:55 -0400 Subject: [PATCH 269/829] Move checks for heap traversal to rb_gc_mark_weak If we are during heap traversal, we don't want to call rb_gc_impl_mark_weak. This commit moves that check from rb_gc_impl_mark_weak to rb_gc_mark_weak. --- gc.c | 11 ++++++++++- gc/default.c | 2 -- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/gc.c b/gc.c index aed788d39b6aa7..ee8b7bc3764c89 100644 --- a/gc.c +++ b/gc.c @@ -2104,7 +2104,16 @@ rb_gc_mark_weak(VALUE *ptr) { if (RB_SPECIAL_CONST_P(*ptr)) return; - rb_gc_impl_mark_weak(rb_gc_get_objspace(), ptr); + rb_vm_t *vm = GET_VM(); + void *objspace = vm->gc.objspace; + if (LIKELY(vm->gc.mark_func_data == NULL)) { + GC_ASSERT(rb_gc_impl_during_gc_p(objspace)); + + rb_gc_impl_mark_weak(objspace, ptr); + } + else { + GC_ASSERT(!rb_gc_impl_during_gc_p(objspace)); + } } void diff --git a/gc/default.c b/gc/default.c index b5fa1a6b4bd26c..94e5acf3d76375 100644 --- a/gc/default.c +++ b/gc/default.c @@ -4607,8 +4607,6 @@ rb_gc_impl_mark_weak(void *objspace_ptr, VALUE *ptr) { rb_objspace_t *objspace = objspace_ptr; - if (RB_UNLIKELY(!during_gc)) return; - GC_ASSERT(objspace->rgengc.parent_object == 0 || FL_TEST(objspace->rgengc.parent_object, FL_WB_PROTECTED)); VALUE obj = *ptr; From d80a81c1526cc01a4cbd2e2bb3e0feae5bd9c800 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Fri, 13 Sep 2024 09:28:51 +0900 Subject: [PATCH 270/829] Constify `struct getpwnam_r_args::login` --- process.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/process.c b/process.c index 1326f59dd6fb77..8570f577b30d5b 100644 --- a/process.c +++ b/process.c @@ -5804,7 +5804,7 @@ pwd_not_found(int err) # if defined(USE_GETPWNAM_R) struct getpwnam_r_args { - char *login; + const char *login; char *buf; size_t bufsize; struct passwd *result; @@ -5850,7 +5850,7 @@ rb_getpwdirnam_for_login(VALUE login_name) bufnm = RSTRING_PTR(getpwnm_tmp); bufsizenm = rb_str_capacity(getpwnm_tmp); rb_str_set_len(getpwnm_tmp, bufsizenm); - struct getpwnam_r_args args = GETPWNAM_R_ARGS((char*)login, bufnm, (size_t)bufsizenm); + struct getpwnam_r_args args = GETPWNAM_R_ARGS(login, bufnm, (size_t)bufsizenm); int enm; while ((enm = IO_WITHOUT_GVL_INT(nogvl_getpwnam_r, &args)) != 0) { From d1d0c50c9d557d57cd0c209e5e2759a05eed3f05 Mon Sep 17 00:00:00 2001 From: Yusuke Endoh Date: Fri, 13 Sep 2024 11:32:21 +0900 Subject: [PATCH 271/829] Prevent a warning: assigned but unused variable - t0 --- test/ruby/test_file.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/ruby/test_file.rb b/test/ruby/test_file.rb index e3aabb42874f93..eae9a8e7b03833 100644 --- a/test/ruby/test_file.rb +++ b/test/ruby/test_file.rb @@ -378,7 +378,7 @@ def test_stat file.close path = file.path - t0 = measure_time do + measure_time do File.write(path, "foo") end From 5e3f1b6a6d64598982219644edfa9c3da09bafed Mon Sep 17 00:00:00 2001 From: Yusuke Endoh Date: Fri, 13 Sep 2024 11:34:20 +0900 Subject: [PATCH 272/829] Prevent a warning: assigned but unused variable - exp_events --- test/ruby/test_settracefunc.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/test/ruby/test_settracefunc.rb b/test/ruby/test_settracefunc.rb index 1ad86744ef322e..868015947e53dd 100644 --- a/test/ruby/test_settracefunc.rb +++ b/test/ruby/test_settracefunc.rb @@ -2338,7 +2338,6 @@ def check_with_events(trace_point_events, expected_events = trace_point_events) method_for_enable_target1 end - exp_events = all_events assert_equal all_events.keep_if { |(ev)| expected_events.include? ev }, events end From 6ae05584bdceb8e8fc5db248d8f4fa7e2c8022c7 Mon Sep 17 00:00:00 2001 From: Yusuke Endoh Date: Fri, 13 Sep 2024 11:30:24 +0900 Subject: [PATCH 273/829] [ruby/net-http] Prevent warnings ``` /home/chkbuild/chkbuild/tmp/build/20240913T003003Z/ruby/test/net/http/utils.rb:32: warning: assigned but unused variable - e /home/chkbuild/chkbuild/tmp/build/20240913T003003Z/ruby/test/net/http/utils.rb:61: warning: assigned but unused variable - version /home/chkbuild/chkbuild/tmp/build/20240913T003003Z/ruby/test/net/http/utils.rb:124: warning: method redefined; discarding old query ``` https://github.com/ruby/net-http/commit/6f818346ce --- test/net/http/utils.rb | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/test/net/http/utils.rb b/test/net/http/utils.rb index cb621da998fc96..1d43497af0da08 100644 --- a/test/net/http/utils.rb +++ b/test/net/http/utils.rb @@ -29,7 +29,7 @@ def start loop do socket = @ssl_server ? @ssl_server.accept : @server.accept run(socket) - rescue => e + rescue ensure socket.close if socket end @@ -58,7 +58,7 @@ def handle_request(socket) request_line = socket.gets return if request_line.nil? || request_line.strip.empty? - method, path, version = request_line.split + method, path, _version = request_line.split headers = {} while (line = socket.gets) break if line.strip.empty? @@ -121,10 +121,6 @@ def continue @socket.write "HTTP\/1.1 100 continue\r\n\r\n" end - def query - @query - end - def remote_ip @socket.peeraddr[3] end From 3146cbbbc423c6995936b53b639f65a4b91881db Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Fri, 13 Sep 2024 13:19:31 +0900 Subject: [PATCH 274/829] Dont't warn reline called from irb, reline is already declared at irb gemspec --- lib/bundled_gems.rb | 5 +++++ tool/test_for_warn_bundled_gems/test.sh | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/lib/bundled_gems.rb b/lib/bundled_gems.rb index 7adc0260ab3898..a0e2c4ef8cbf15 100644 --- a/lib/bundled_gems.rb +++ b/lib/bundled_gems.rb @@ -133,6 +133,11 @@ def self.warning?(name, specs: nil) # name can be a feature name or a file path with String or Pathname feature = File.path(name) + # irb already has reline as a dependency on gemspec, so we don't want to warn about it. + # We should update this with a more general solution when we have another case. + # ex: Gem.loaded_specs[called_gem].dependencies.any? {|d| d.name == feature } + return false if feature.start_with?("reline") && caller_locations(2, 1)[0].to_s.include?("irb") + # The actual checks needed to properly identify the gem being required # are costly (see [Bug #20641]), so we first do a much cheaper check # to exclude the vast majority of candidates. diff --git a/tool/test_for_warn_bundled_gems/test.sh b/tool/test_for_warn_bundled_gems/test.sh index 7f92217b4280c2..a21f2f14b6e607 100755 --- a/tool/test_for_warn_bundled_gems/test.sh +++ b/tool/test_for_warn_bundled_gems/test.sh @@ -59,3 +59,7 @@ echo echo "* Show warning with bootsnap and some gem in Gemfile" ruby test_warn_bootsnap_and_gem.rb echo + +echo "* Don't show warning for reline when using irb from standard library" +bundle exec ruby -rirb -e '' +echo From 5894202365a80f027880129bcf51840534559237 Mon Sep 17 00:00:00 2001 From: aoki1980taichi Date: Thu, 23 Jun 2022 21:40:40 +0900 Subject: [PATCH 275/829] typo otherBasis -> orthoBasis The original function name in ao.c was orthoBasis. I guess the function is generating orthonormal basis (https://en.wikipedia.org/wiki/Orthonormal_basis). --- benchmark/app_aobench.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/benchmark/app_aobench.rb b/benchmark/app_aobench.rb index 16296af12b2a50..c1546e08ab3cf6 100644 --- a/benchmark/app_aobench.rb +++ b/benchmark/app_aobench.rb @@ -151,7 +151,7 @@ def clamp(f) i.to_i end -def otherBasis(basis, n) +def orthoBasis(basis, n) basis[2] = Vec.new(n.x, n.y, n.z) basis[1] = Vec.new(0.0, 0.0, 0.0) @@ -183,7 +183,7 @@ def initialize def ambient_occlusion(isect) basis = Array.new - otherBasis(basis, isect.n) + orthoBasis(basis, isect.n) ntheta = NAO_SAMPLES nphi = NAO_SAMPLES From cf5b965897141b84365fbf84231745e18d36c755 Mon Sep 17 00:00:00 2001 From: Yusuke Endoh Date: Fri, 13 Sep 2024 14:28:23 +0900 Subject: [PATCH 276/829] Use the development version of typeprof in test-bundled-gems --- gems/bundled_gems | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gems/bundled_gems b/gems/bundled_gems index 18661d260de736..7ccbbf50d18c1b 100644 --- a/gems/bundled_gems +++ b/gems/bundled_gems @@ -19,7 +19,7 @@ net-smtp 0.5.0 https://github.com/ruby/net-smtp matrix 0.4.2 https://github.com/ruby/matrix prime 0.1.2 https://github.com/ruby/prime rbs 3.5.3 https://github.com/ruby/rbs -typeprof 0.21.11 https://github.com/ruby/typeprof b19a6416da3a05d57fadd6ffdadb382b6d236ca5 +typeprof 0.21.11 https://github.com/ruby/typeprof 1f008a3334d45fb099d9e6bcc9ceffd67d672f73 debug 1.9.2 https://github.com/ruby/debug racc 1.8.1 https://github.com/ruby/racc mutex_m 0.2.0 https://github.com/ruby/mutex_m From f090d1fa598ec13b30a40101d8de85c02a77cce3 Mon Sep 17 00:00:00 2001 From: Yusuke Endoh Date: Fri, 13 Sep 2024 14:50:35 +0900 Subject: [PATCH 277/829] Try to find bundled gem version from lib/*/version.rb --- tool/lib/bundled_gem.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tool/lib/bundled_gem.rb b/tool/lib/bundled_gem.rb index 8730f0fb3ac535..d870925d05f981 100644 --- a/tool/lib/bundled_gem.rb +++ b/tool/lib/bundled_gem.rb @@ -91,7 +91,10 @@ def dummy_gemspec(gemspec) Dir.chdir(gemdir) do spec = Gem::Specification.new do |s| s.name = gemfile.chomp(".gemspec") - s.version = File.read("lib/#{s.name}.rb")[/VERSION = "(.+?)"/, 1] + s.version = + File.read("lib/#{s.name}.rb")[/VERSION = "(.+?)"/, 1] || + begin File.read("lib/#{s.name}/version.rb")[/VERSION = "(.+?)"/, 1]; rescue; nil; end || + raise("cannot find the version of #{ s.name } gem") s.authors = ["DUMMY"] s.email = ["dummy@ruby-lang.org"] s.files = Dir.glob("{lib,ext}/**/*").select {|f| File.file?(f)} From b6c7226facc140bf8976d48fbd6c06f729534379 Mon Sep 17 00:00:00 2001 From: Yusuke Endoh Date: Fri, 13 Sep 2024 15:18:01 +0900 Subject: [PATCH 278/829] Put typeprof.gemspec --- gems/bundled_gems | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gems/bundled_gems b/gems/bundled_gems index 7ccbbf50d18c1b..853e6bd2dbc342 100644 --- a/gems/bundled_gems +++ b/gems/bundled_gems @@ -19,7 +19,7 @@ net-smtp 0.5.0 https://github.com/ruby/net-smtp matrix 0.4.2 https://github.com/ruby/matrix prime 0.1.2 https://github.com/ruby/prime rbs 3.5.3 https://github.com/ruby/rbs -typeprof 0.21.11 https://github.com/ruby/typeprof 1f008a3334d45fb099d9e6bcc9ceffd67d672f73 +typeprof 0.21.11 https://github.com/ruby/typeprof 167263ca3a634b61df0445f1a6b3e259a5d47f94 debug 1.9.2 https://github.com/ruby/debug racc 1.8.1 https://github.com/ruby/racc mutex_m 0.2.0 https://github.com/ruby/mutex_m From 0f3dc2f958bd1447cc459bc4a4f39071a6a07a9c Mon Sep 17 00:00:00 2001 From: Yusuke Endoh Date: Fri, 13 Sep 2024 13:48:51 +0900 Subject: [PATCH 279/829] Prevent warnings "the block passed to ... may be ignored" --- ext/socket/lib/socket.rb | 8 ++++---- test/ruby/test_call.rb | 19 ++++++++++++++++++- test/ruby/test_iterator.rb | 16 +++++++++++++++- test/ruby/test_proc.rb | 3 +++ test/ruby/test_syntax.rb | 4 ++-- 5 files changed, 42 insertions(+), 8 deletions(-) diff --git a/ext/socket/lib/socket.rb b/ext/socket/lib/socket.rb index 86f2a523ebbdab..d61de1e8e93f41 100644 --- a/ext/socket/lib/socket.rb +++ b/ext/socket/lib/socket.rb @@ -648,11 +648,11 @@ class << self # sock.close_write # puts sock.read # } - def self.tcp(host, port, local_host = nil, local_port = nil, connect_timeout: nil, resolv_timeout: nil, fast_fallback: tcp_fast_fallback, &block) # :yield: socket + def self.tcp(host, port, local_host = nil, local_port = nil, connect_timeout: nil, resolv_timeout: nil, fast_fallback: tcp_fast_fallback, &) # :yield: socket sock = if fast_fallback && !(host && ip_address?(host)) - tcp_with_fast_fallback(host, port, local_host, local_port, connect_timeout:, resolv_timeout:, &block) + tcp_with_fast_fallback(host, port, local_host, local_port, connect_timeout:, resolv_timeout:) else - tcp_without_fast_fallback(host, port, local_host, local_port, connect_timeout:, resolv_timeout:, &block) + tcp_without_fast_fallback(host, port, local_host, local_port, connect_timeout:, resolv_timeout:) end if block_given? @@ -897,7 +897,7 @@ def self.tcp_with_fast_fallback(host, port, local_host = nil, local_port = nil, end end - def self.tcp_without_fast_fallback(host, port, local_host, local_port, connect_timeout:, resolv_timeout:, &block) + def self.tcp_without_fast_fallback(host, port, local_host, local_port, connect_timeout:, resolv_timeout:) last_error = nil ret = nil diff --git a/test/ruby/test_call.rb b/test/ruby/test_call.rb index 14847bf6295bf7..b7d62ae1113ef1 100644 --- a/test/ruby/test_call.rb +++ b/test/ruby/test_call.rb @@ -3,7 +3,24 @@ require '-test-/iter' class TestCall < Test::Unit::TestCase - def aaa(a, b=100, *rest) + # These dummy method definitions prevent warnings "the block passed to 'a'..." + def a(&) = nil + def b(&) = nil + def c(&) = nil + def d(&) = nil + def e(&) = nil + def f(&) = nil + def g(&) = nil + def h(&) = nil + def i(&) = nil + def j(&) = nil + def k(&) = nil + def l(&) = nil + def m(&) = nil + def n(&) = nil + def o(&) = nil + + def aaa(a, b=100, *rest, &) res = [a, b] res += rest if rest return res diff --git a/test/ruby/test_iterator.rb b/test/ruby/test_iterator.rb index 820d5591c1d192..1bb655d52e3d86 100644 --- a/test/ruby/test_iterator.rb +++ b/test/ruby/test_iterator.rb @@ -175,10 +175,13 @@ def m2 end def test_block_given + verbose_bak, $VERBOSE = $VERBOSE, nil assert(m1{p 'test'}) assert(m2{p 'test'}) assert(!m1()) assert(!m2()) + ensure + $VERBOSE = verbose_bak end def m3(var, &block) @@ -308,7 +311,18 @@ def test_proc_return2 def test_ljump assert_raise(LocalJumpError) {get_block{break}.call} - assert_raise(LocalJumpError) {proc_call2(get_block{break}){}} + begin + verbose_bak, $VERBOSE = $VERBOSE, nil + # See the commit https://github.com/ruby/ruby/commit/7d8a415bc2d08a1b5e9d1ea802493b6eeb99c219 + # This block is not used but this is intentional. + # | + # +-----------------------------------------------------+ + # | + # vv + assert_raise(LocalJumpError) {proc_call2(get_block{break}){}} + ensure + $VERBOSE = verbose_bak + end # cannot use assert_nothing_raised due to passing block. begin diff --git a/test/ruby/test_proc.rb b/test/ruby/test_proc.rb index 2f91da8aa8f341..192955c60ab781 100644 --- a/test/ruby/test_proc.rb +++ b/test/ruby/test_proc.rb @@ -207,10 +207,13 @@ def test_method_to_proc end def test_block_given_method + verbose_bak, $VERBOSE = $VERBOSE, nil m = method(:m_block_given?) assert(!m.call, "without block") assert(m.call {}, "with block") assert(!m.call, "without block second") + ensure + $VERBOSE = verbose_bak end def test_block_given_method_to_proc diff --git a/test/ruby/test_syntax.rb b/test/ruby/test_syntax.rb index bd15d7c9f3f34b..fe6fa30e0272c5 100644 --- a/test/ruby/test_syntax.rb +++ b/test/ruby/test_syntax.rb @@ -1387,7 +1387,7 @@ def test_cmdarg_in_paren def test_block_after_cmdarg_in_paren bug11873 = '[ruby-core:72482] [Bug #11873]' - def bug11873.p(*);end; + def bug11873.p(*, &);end; assert_raise(LocalJumpError, bug11873) do bug11873.instance_eval do @@ -2256,7 +2256,7 @@ def with_script_lines end end - def caller_lineno(*) + def caller_lineno(*, &) caller_locations(1, 1)[0].lineno end end From 24493779b79bb57fd2e71bf6e0ababe95448a9d6 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Fri, 13 Sep 2024 10:50:38 +0900 Subject: [PATCH 280/829] [Bug #20725] Should not call compare on `nil`-endpoint It means unbounded, always inclusive of other ranges. --- range.c | 2 +- test/ruby/test_range.rb | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/range.c b/range.c index e8a35c22cc364d..e4e73bd85de1a7 100644 --- a/range.c +++ b/range.c @@ -2477,7 +2477,7 @@ range_overlap(VALUE range, VALUE other) /* if both begin values are equal, no more comparisons needed */ if (rb_cmpint(cmp, self_beg, other_beg) == 0) return Qtrue; } - else if (NIL_P(self_beg) && NIL_P(other_beg)) { + else if (NIL_P(self_beg) && !NIL_P(self_end) && NIL_P(other_beg)) { VALUE cmp = rb_funcall(self_end, id_cmp, 1, other_end); return RBOOL(!NIL_P(cmp)); } diff --git a/test/ruby/test_range.rb b/test/ruby/test_range.rb index 842be77ab3e228..e0c1d20bd24e82 100644 --- a/test/ruby/test_range.rb +++ b/test/ruby/test_range.rb @@ -1471,6 +1471,7 @@ def test_overlap? assert_operator((..3), :overlap?, (3..)) assert_operator((nil..nil), :overlap?, (3..)) assert_operator((nil...nil), :overlap?, (nil..)) + assert_operator((nil..nil), :overlap?, (..3)) assert_raise(TypeError) { (1..3).overlap?(1) } From 642528511e514cc92655e1800ef5e2830e7fd305 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Fri, 13 Sep 2024 11:10:53 +0200 Subject: [PATCH 281/829] [rubygems/rubygems] Make sure test does not load system version of Bundler https://github.com/rubygems/rubygems/commit/d850ea1d95 --- spec/bundler/commands/update_spec.rb | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/spec/bundler/commands/update_spec.rb b/spec/bundler/commands/update_spec.rb index 3760d49d7f0cb4..2ad8d20a3bf23c 100644 --- a/spec/bundler/commands/update_spec.rb +++ b/spec/bundler/commands/update_spec.rb @@ -1583,17 +1583,16 @@ end it "errors if the explicit target version does not exist" do - pristine_system_gems "bundler-2.3.9" + pristine_system_gems "bundler-9.9.9" build_repo4 do build_gem "myrack", "1.0" end - install_gemfile <<-G, env: { "BUNDLER_IGNORE_DEFAULT_GEM" => "true" } + install_gemfile <<-G source "https://gem.repo4" gem "myrack" G - lockfile lockfile.sub(/(^\s*)#{Bundler::VERSION}($)/, "2.3.9") bundle :update, bundler: "999.999.999", artifice: "compact_index", raise_on_error: false @@ -1601,7 +1600,7 @@ if Gem.rubygems_version >= Gem::Version.new("3.3.0.dev") expect(last_command).to be_failure - expect(err).to include("The `bundle update --bundler` target version (999.999.999) does not exist") + expect(err).to eq("The `bundle update --bundler` target version (999.999.999) does not exist") end end From 36b2fea69121d62213b0ccd3cb09c6a6effeb543 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Fri, 13 Sep 2024 12:16:39 +0200 Subject: [PATCH 282/829] [rubygems/rubygems] Remove `BUNDLER_IGNORE_DEFAULT_GEM` As long as we use a high enough test version, the default version of Bundler should never get in the middle. https://github.com/rubygems/rubygems/commit/d63f0818aa --- spec/bundler/commands/update_spec.rb | 21 ++++++++++++--------- spec/bundler/support/hax.rb | 14 -------------- spec/bundler/support/helpers.rb | 6 +----- 3 files changed, 13 insertions(+), 28 deletions(-) diff --git a/spec/bundler/commands/update_spec.rb b/spec/bundler/commands/update_spec.rb index 2ad8d20a3bf23c..cc1e01ba0ba10d 100644 --- a/spec/bundler/commands/update_spec.rb +++ b/spec/bundler/commands/update_spec.rb @@ -1541,26 +1541,29 @@ end it "does not update the bundler version in the lockfile if the latest version is not compatible with current ruby", :ruby_repo do - pristine_system_gems "bundler-2.3.9" + pristine_system_gems "bundler-9.9.9" build_repo4 do build_gem "myrack", "1.0" - build_bundler "2.3.9" + build_bundler "9.9.9" build_bundler "999.0.0" do |s| s.required_ruby_version = "> #{Gem.ruby_version}" end end - install_gemfile <<-G, env: { "BUNDLER_IGNORE_DEFAULT_GEM" => "true" } + checksums = checksums_section do |c| + c.checksum(gem_repo4, "myrack", "1.0") + end + + install_gemfile <<-G source "https://gem.repo4" gem "myrack" G - lockfile lockfile.sub(/(^\s*)#{Bundler::VERSION}($)/, "2.3.9") - bundle :update, bundler: true, artifice: "compact_index", verbose: true, env: { "BUNDLER_SPEC_GEM_REPO" => gem_repo4.to_s, "BUNDLER_IGNORE_DEFAULT_GEM" => "true" } + bundle :update, bundler: true, artifice: "compact_index", verbose: true, env: { "BUNDLER_SPEC_GEM_REPO" => gem_repo4.to_s } - expect(out).to include("Using bundler 2.3.9") + expect(out).to include("Using bundler 9.9.9") expect(lockfile).to eq <<~L GEM @@ -1573,12 +1576,12 @@ DEPENDENCIES myrack - + #{checksums} BUNDLED WITH - 2.3.9 + 9.9.9 L - expect(the_bundle).to include_gems "bundler 2.3.9" + expect(the_bundle).to include_gems "bundler 9.9.9" expect(the_bundle).to include_gems "myrack 1.0" end diff --git a/spec/bundler/support/hax.rb b/spec/bundler/support/hax.rb index c7fe3637cc5ecb..492c6ca8ed5e6e 100644 --- a/spec/bundler/support/hax.rb +++ b/spec/bundler/support/hax.rb @@ -36,18 +36,4 @@ class Platform if ENV["BUNDLER_SPEC_GEM_SOURCES"] self.sources = [ENV["BUNDLER_SPEC_GEM_SOURCES"]] end - - if ENV["BUNDLER_IGNORE_DEFAULT_GEM"] - module RemoveDefaultBundlerStub - def default_stubs(pattern = "*") - super.delete_if {|stub| stub.name == "bundler" } - end - end - - class Specification - class << self - prepend RemoveDefaultBundlerStub - end - end - end end diff --git a/spec/bundler/support/helpers.rb b/spec/bundler/support/helpers.rb index df3ce0b2bb4674..ef52e88eed6565 100644 --- a/spec/bundler/support/helpers.rb +++ b/spec/bundler/support/helpers.rb @@ -170,12 +170,8 @@ def build_ruby_cmd(options = {}) requires << "#{Path.spec_dir}/support/artifice/#{artifice}.rb" end - hax_path = "#{Path.spec_dir}/support/hax.rb" + requires << "#{Path.spec_dir}/support/hax.rb" - # For specs that need to ignore the default Bundler gem, load hax before - # anything else since other stuff may actually load bundler and not skip - # the default version - env.include?("BUNDLER_IGNORE_DEFAULT_GEM") ? requires.prepend(hax_path) : requires.append(hax_path) require_option = requires.map {|r| "-r#{r}" } [env, [Gem.ruby, *lib_option, *require_option].compact.join(" ")] From 8e2d971b9ac7b6f0642b0ab83e4a363f8a0c7183 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Fri, 13 Sep 2024 12:42:11 +0200 Subject: [PATCH 283/829] [rubygems/rubygems] Remove redundant arguments passed to `bundle` helper They are used by default. https://github.com/rubygems/rubygems/commit/0b7f7d879f --- spec/bundler/commands/update_spec.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spec/bundler/commands/update_spec.rb b/spec/bundler/commands/update_spec.rb index cc1e01ba0ba10d..e87fecaa6d8004 100644 --- a/spec/bundler/commands/update_spec.rb +++ b/spec/bundler/commands/update_spec.rb @@ -1535,7 +1535,7 @@ bundle :cache, verbose: true - bundle :update, bundler: true, artifice: "compact_index", verbose: true, env: { "BUNDLER_SPEC_GEM_REPO" => gem_repo4.to_s } + bundle :update, bundler: true, verbose: true expect(out).not_to include("Updating bundler to") end @@ -1561,7 +1561,7 @@ gem "myrack" G - bundle :update, bundler: true, artifice: "compact_index", verbose: true, env: { "BUNDLER_SPEC_GEM_REPO" => gem_repo4.to_s } + bundle :update, bundler: true, verbose: true expect(out).to include("Using bundler 9.9.9") @@ -1597,7 +1597,7 @@ gem "myrack" G - bundle :update, bundler: "999.999.999", artifice: "compact_index", raise_on_error: false + bundle :update, bundler: "999.999.999", raise_on_error: false # Only gives a meaningful error message on modern RubyGems. From f0dcbbe9b9de45669dad67bd99d4539ccd4bbc83 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Thu, 12 Sep 2024 12:32:17 -0400 Subject: [PATCH 284/829] [ruby/prism] Reverse-sync numbered reference range handling https://github.com/ruby/prism/commit/a2f57ef6e3 --- test/prism/result/warnings_test.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/prism/result/warnings_test.rb b/test/prism/result/warnings_test.rb index 861f6d99994ae6..b3817b631ff080 100644 --- a/test/prism/result/warnings_test.rb +++ b/test/prism/result/warnings_test.rb @@ -174,6 +174,10 @@ def test_keyword_eol assert_warning("if true\nelsif\nfalse; end", "end of line") end + def test_numbered_reference + assert_warning("_ = _ = $999999999999999999999", "too big for a number variable, always nil") + end + def test_shareable_constant_value assert_warning("foo # shareable_constant_value: none", "ignored") assert_warning("\v # shareable_constant_value: none", "ignored") From c996f4091fb7af3ff28842ff4b6facdb7f0c35a2 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Thu, 12 Sep 2024 15:04:18 -0400 Subject: [PATCH 285/829] Ignore -Wdangling-pointer in rb_gc_set_stack_end MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes this compiler warning: thread.c:4530:18: warning: storing the address of local variable ‘stack_end’ in ‘*stack_end_p’ [-Wdangling-pointer=] 4530 | *stack_end_p = &stack_end; | ~~~~~~~~~~~~~^~~~~~~~~~~~ --- thread.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/thread.c b/thread.c index 104205beb22c79..5a792007859096 100644 --- a/thread.c +++ b/thread.c @@ -4527,7 +4527,12 @@ void rb_gc_set_stack_end(VALUE **stack_end_p) { VALUE stack_end; +COMPILER_WARNING_PUSH +#if __has_warning("-Wdangling-pointer") +COMPILER_WARNING_IGNORED(-Wdangling-pointer); +#endif *stack_end_p = &stack_end; +COMPILER_WARNING_POP } #endif From 38f8f42e4fcad111a13b154631e3026be1826538 Mon Sep 17 00:00:00 2001 From: Andrew Konchin Date: Thu, 12 Sep 2024 17:31:54 +0300 Subject: [PATCH 286/829] [ruby/prism] Unify code style of flags generation in the nodes templates https://github.com/ruby/prism/commit/dbb7e0a44e --- prism/templates/lib/prism/node.rb.erb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/prism/templates/lib/prism/node.rb.erb b/prism/templates/lib/prism/node.rb.erb index 06a7212f61acc2..63a7cbbab6420d 100644 --- a/prism/templates/lib/prism/node.rb.erb +++ b/prism/templates/lib/prism/node.rb.erb @@ -389,13 +389,13 @@ module Prism end end <%- end -%> - <%- flags.each_with_index do |flag, flag_index| -%> + <%- flags.each do |flag| -%> # <%= flag.comment %> module <%= flag.name %> <%- flag.values.each_with_index do |value, index| -%> # <%= value.comment %> - <%= value.name %> = 1 << <%= (index + 2) %> + <%= value.name %> = 1 << <%= index + 2 %> <%= "\n" if value != flag.values.last -%> <%- end -%> end From 353997dd3ee8d437113a3e9b5e85ef850adbf31d Mon Sep 17 00:00:00 2001 From: Andrew Konchin Date: Fri, 13 Sep 2024 14:25:30 +0300 Subject: [PATCH 287/829] [ruby/prism] Refactor and move common node flags count into a constant to reuse in templates https://github.com/ruby/prism/commit/c20bf05ecc --- prism/templates/include/prism/ast.h.erb | 2 +- prism/templates/lib/prism/node.rb.erb | 2 +- prism/templates/template.rb | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/prism/templates/include/prism/ast.h.erb b/prism/templates/include/prism/ast.h.erb index 088a99323f8ebd..1e0568f8150883 100644 --- a/prism/templates/include/prism/ast.h.erb +++ b/prism/templates/include/prism/ast.h.erb @@ -207,7 +207,7 @@ typedef enum pm_<%= flag.human %> { <%- flag.values.each_with_index do |value, index| -%> <%= "\n" if index > 0 -%> /** <%= value.comment %> */ - PM_<%= flag.human.upcase %>_<%= value.name %> = <%= 1 << (index + 2) %>, + PM_<%= flag.human.upcase %>_<%= value.name %> = <%= 1 << (index + Prism::Template::COMMON_FLAGS_COUNT) %>, <%- end -%> } pm_<%= flag.human %>_t; <%- end -%> diff --git a/prism/templates/lib/prism/node.rb.erb b/prism/templates/lib/prism/node.rb.erb index 63a7cbbab6420d..a7ea747de50246 100644 --- a/prism/templates/lib/prism/node.rb.erb +++ b/prism/templates/lib/prism/node.rb.erb @@ -395,7 +395,7 @@ module Prism module <%= flag.name %> <%- flag.values.each_with_index do |value, index| -%> # <%= value.comment %> - <%= value.name %> = 1 << <%= index + 2 %> + <%= value.name %> = 1 << <%= index + Prism::Template::COMMON_FLAGS_COUNT %> <%= "\n" if value != flag.values.last -%> <%- end -%> end diff --git a/prism/templates/template.rb b/prism/templates/template.rb index 130e15d075b2a7..7d1d4c0d16b4da 100755 --- a/prism/templates/template.rb +++ b/prism/templates/template.rb @@ -13,6 +13,8 @@ module Template JAVA_BACKEND = ENV["PRISM_JAVA_BACKEND"] || "truffleruby" JAVA_STRING_TYPE = JAVA_BACKEND == "jruby" ? "org.jruby.RubySymbol" : "String" + COMMON_FLAGS_COUNT = 2 + class Error attr_reader :name From 74f315c3f5908512dfdeeab2dd76d93e98149769 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Fri, 13 Sep 2024 11:25:57 -0400 Subject: [PATCH 288/829] [PRISM] Turn off mismatched indentation warnings in eval Fixes [Bug #20732] --- prism/prism.c | 1 + 1 file changed, 1 insertion(+) diff --git a/prism/prism.c b/prism/prism.c index b3d843e6724b92..3409af47e71727 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -21926,6 +21926,7 @@ pm_parser_init(pm_parser_t *parser, const uint8_t *source, size_t size, const pm // scopes option parser->parsing_eval = options->scopes_count > 0; + if (parser->parsing_eval) parser->warn_mismatched_indentation = false; for (size_t scope_index = 0; scope_index < options->scopes_count; scope_index++) { const pm_options_scope_t *scope = pm_options_scope_get(options, scope_index); From d42d19059d75bf1c05c1bc916775b47629b59eb7 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Fri, 13 Sep 2024 12:06:51 -0400 Subject: [PATCH 289/829] [PRISM] Allow case/when to be indented with no warning Fixes [Bug #20731] --- prism/prism.c | 48 ++++++++++++++++-------------- test/prism/result/warnings_test.rb | 3 ++ 2 files changed, 29 insertions(+), 22 deletions(-) diff --git a/prism/prism.c b/prism/prism.c index 3409af47e71727..72261f2494dc87 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -14836,7 +14836,7 @@ token_column(const pm_parser_t *parser, size_t newline_index, const pm_token_t * * function warns if the indentation of the two tokens does not match. */ static void -parser_warn_indentation_mismatch(pm_parser_t *parser, size_t opening_newline_index, const pm_token_t *opening_token, bool if_after_else) { +parser_warn_indentation_mismatch(pm_parser_t *parser, size_t opening_newline_index, const pm_token_t *opening_token, bool if_after_else, bool allow_indent) { // If these warnings are disabled (unlikely), then we can just return. if (!parser->warn_mismatched_indentation) return; @@ -14858,6 +14858,10 @@ parser_warn_indentation_mismatch(pm_parser_t *parser, size_t opening_newline_ind int64_t closing_column = token_column(parser, closing_newline_index, closing_token, true); if ((closing_column == -1) || (opening_column == closing_column)) return; + // If the closing column is greater than the opening column and we are + // allowing indentation, then we do not warn. + if (allow_indent && (closing_column > opening_column)) return; + // Otherwise, add a warning. PM_PARSER_WARN_FORMAT( parser, @@ -14891,7 +14895,7 @@ parse_rescues(pm_parser_t *parser, size_t opening_newline_index, const pm_token_ pm_rescue_node_t *current = NULL; while (match1(parser, PM_TOKEN_KEYWORD_RESCUE)) { - if (opening != NULL) parser_warn_indentation_mismatch(parser, opening_newline_index, opening, false); + if (opening != NULL) parser_warn_indentation_mismatch(parser, opening_newline_index, opening, false, false); parser_lex(parser); pm_rescue_node_t *rescue = pm_rescue_node_create(parser, &parser->previous); @@ -14997,7 +15001,7 @@ parse_rescues(pm_parser_t *parser, size_t opening_newline_index, const pm_token_ pm_token_t else_keyword; if (match1(parser, PM_TOKEN_KEYWORD_ELSE)) { - if (opening != NULL) parser_warn_indentation_mismatch(parser, opening_newline_index, opening, false); + if (opening != NULL) parser_warn_indentation_mismatch(parser, opening_newline_index, opening, false, false); opening_newline_index = token_newline_index(parser); else_keyword = parser->current; @@ -15037,7 +15041,7 @@ parse_rescues(pm_parser_t *parser, size_t opening_newline_index, const pm_token_ } if (match1(parser, PM_TOKEN_KEYWORD_ENSURE)) { - if (opening != NULL) parser_warn_indentation_mismatch(parser, opening_newline_index, opening, false); + if (opening != NULL) parser_warn_indentation_mismatch(parser, opening_newline_index, opening, false, false); pm_token_t ensure_keyword = parser->current; parser_lex(parser); @@ -15070,7 +15074,7 @@ parse_rescues(pm_parser_t *parser, size_t opening_newline_index, const pm_token_ } if (match1(parser, PM_TOKEN_KEYWORD_END)) { - if (opening != NULL) parser_warn_indentation_mismatch(parser, opening_newline_index, opening, false); + if (opening != NULL) parser_warn_indentation_mismatch(parser, opening_newline_index, opening, false, false); pm_begin_node_end_keyword_set(parent_node, &parser->current); } else { pm_token_t end_keyword = (pm_token_t) { .type = PM_TOKEN_MISSING, .start = parser->previous.end, .end = parser->previous.end }; @@ -15703,7 +15707,7 @@ parse_conditional(pm_parser_t *parser, pm_context_t context, size_t opening_newl PM_PARSER_WARN_TOKEN_FORMAT_CONTENT(parser, parser->current, PM_WARN_KEYWORD_EOL); } - parser_warn_indentation_mismatch(parser, opening_newline_index, &keyword, false); + parser_warn_indentation_mismatch(parser, opening_newline_index, &keyword, false, false); pm_token_t elsif_keyword = parser->current; parser_lex(parser); @@ -15721,7 +15725,7 @@ parse_conditional(pm_parser_t *parser, pm_context_t context, size_t opening_newl } if (match1(parser, PM_TOKEN_KEYWORD_ELSE)) { - parser_warn_indentation_mismatch(parser, opening_newline_index, &keyword, false); + parser_warn_indentation_mismatch(parser, opening_newline_index, &keyword, false, false); opening_newline_index = token_newline_index(parser); parser_lex(parser); @@ -15732,7 +15736,7 @@ parse_conditional(pm_parser_t *parser, pm_context_t context, size_t opening_newl pm_accepts_block_stack_pop(parser); accept2(parser, PM_TOKEN_NEWLINE, PM_TOKEN_SEMICOLON); - parser_warn_indentation_mismatch(parser, opening_newline_index, &else_keyword, false); + parser_warn_indentation_mismatch(parser, opening_newline_index, &else_keyword, false, false); expect1(parser, PM_TOKEN_KEYWORD_END, PM_ERR_CONDITIONAL_TERM_ELSE); pm_else_node_t *else_node = pm_else_node_create(parser, &else_keyword, else_statements, &parser->previous); @@ -15749,7 +15753,7 @@ parse_conditional(pm_parser_t *parser, pm_context_t context, size_t opening_newl break; } } else { - parser_warn_indentation_mismatch(parser, opening_newline_index, &keyword, if_after_else); + parser_warn_indentation_mismatch(parser, opening_newline_index, &keyword, if_after_else, false); expect1(parser, PM_TOKEN_KEYWORD_END, PM_ERR_CONDITIONAL_TERM); } @@ -18537,7 +18541,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b } if (match1(parser, PM_TOKEN_KEYWORD_END)) { - parser_warn_indentation_mismatch(parser, opening_newline_index, &case_keyword, false); + parser_warn_indentation_mismatch(parser, opening_newline_index, &case_keyword, false, false); parser_lex(parser); pop_block_exits(parser, previous_block_exits); @@ -18560,7 +18564,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b // case-when node. We will continue to parse the when nodes // until we hit the end of the list. while (match1(parser, PM_TOKEN_KEYWORD_WHEN)) { - parser_warn_indentation_mismatch(parser, opening_newline_index, &case_keyword, false); + parser_warn_indentation_mismatch(parser, opening_newline_index, &case_keyword, false, true); parser_lex(parser); pm_token_t when_keyword = parser->previous; @@ -18635,7 +18639,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b // will continue to parse the in nodes until we hit the end of // the list. while (match1(parser, PM_TOKEN_KEYWORD_IN)) { - parser_warn_indentation_mismatch(parser, opening_newline_index, &case_keyword, false); + parser_warn_indentation_mismatch(parser, opening_newline_index, &case_keyword, false, true); bool previous_pattern_matching_newlines = parser->pattern_matching_newlines; parser->pattern_matching_newlines = true; @@ -18722,7 +18726,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b } } - parser_warn_indentation_mismatch(parser, opening_newline_index, &case_keyword, false); + parser_warn_indentation_mismatch(parser, opening_newline_index, &case_keyword, false, false); expect1(parser, PM_TOKEN_KEYWORD_END, PM_ERR_CASE_TERM); if (PM_NODE_TYPE_P(node, PM_CASE_NODE)) { @@ -18899,7 +18903,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b assert(statements == NULL || PM_NODE_TYPE_P(statements, PM_STATEMENTS_NODE)); statements = (pm_node_t *) parse_rescues_implicit_begin(parser, opening_newline_index, &class_keyword, class_keyword.start, (pm_statements_node_t *) statements, PM_RESCUES_SCLASS); } else { - parser_warn_indentation_mismatch(parser, opening_newline_index, &class_keyword, false); + parser_warn_indentation_mismatch(parser, opening_newline_index, &class_keyword, false, false); } expect1(parser, PM_TOKEN_KEYWORD_END, PM_ERR_CLASS_TERM); @@ -18957,7 +18961,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b assert(statements == NULL || PM_NODE_TYPE_P(statements, PM_STATEMENTS_NODE)); statements = (pm_node_t *) parse_rescues_implicit_begin(parser, opening_newline_index, &class_keyword, class_keyword.start, (pm_statements_node_t *) statements, PM_RESCUES_CLASS); } else { - parser_warn_indentation_mismatch(parser, opening_newline_index, &class_keyword, false); + parser_warn_indentation_mismatch(parser, opening_newline_index, &class_keyword, false, false); } expect1(parser, PM_TOKEN_KEYWORD_END, PM_ERR_CLASS_TERM); @@ -19228,7 +19232,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b assert(statements == NULL || PM_NODE_TYPE_P(statements, PM_STATEMENTS_NODE)); statements = (pm_node_t *) parse_rescues_implicit_begin(parser, opening_newline_index, &def_keyword, def_keyword.start, (pm_statements_node_t *) statements, PM_RESCUES_DEF); } else { - parser_warn_indentation_mismatch(parser, opening_newline_index, &def_keyword, false); + parser_warn_indentation_mismatch(parser, opening_newline_index, &def_keyword, false, false); } pm_accepts_block_stack_pop(parser); @@ -19381,7 +19385,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b statements = parse_statements(parser, PM_CONTEXT_FOR); } - parser_warn_indentation_mismatch(parser, opening_newline_index, &for_keyword, false); + parser_warn_indentation_mismatch(parser, opening_newline_index, &for_keyword, false, false); expect1(parser, PM_TOKEN_KEYWORD_END, PM_ERR_FOR_TERM); return (pm_node_t *) pm_for_node_create(parser, index, collection, statements, &for_keyword, &in_keyword, &do_keyword, &parser->previous); @@ -19511,7 +19515,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b assert(statements == NULL || PM_NODE_TYPE_P(statements, PM_STATEMENTS_NODE)); statements = (pm_node_t *) parse_rescues_implicit_begin(parser, opening_newline_index, &module_keyword, module_keyword.start, (pm_statements_node_t *) statements, PM_RESCUES_MODULE); } else { - parser_warn_indentation_mismatch(parser, opening_newline_index, &module_keyword, false); + parser_warn_indentation_mismatch(parser, opening_newline_index, &module_keyword, false, false); } pm_constant_id_list_t locals; @@ -19577,7 +19581,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b accept2(parser, PM_TOKEN_NEWLINE, PM_TOKEN_SEMICOLON); } - parser_warn_indentation_mismatch(parser, opening_newline_index, &keyword, false); + parser_warn_indentation_mismatch(parser, opening_newline_index, &keyword, false, false); expect1(parser, PM_TOKEN_KEYWORD_END, PM_ERR_UNTIL_TERM); return (pm_node_t *) pm_until_node_create(parser, &keyword, &parser->previous, predicate, statements, 0); @@ -19605,7 +19609,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b accept2(parser, PM_TOKEN_NEWLINE, PM_TOKEN_SEMICOLON); } - parser_warn_indentation_mismatch(parser, opening_newline_index, &keyword, false); + parser_warn_indentation_mismatch(parser, opening_newline_index, &keyword, false, false); expect1(parser, PM_TOKEN_KEYWORD_END, PM_ERR_WHILE_TERM); return (pm_node_t *) pm_while_node_create(parser, &keyword, &parser->previous, predicate, statements, 0); @@ -20298,7 +20302,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b body = (pm_node_t *) parse_statements(parser, PM_CONTEXT_LAMBDA_BRACES); } - parser_warn_indentation_mismatch(parser, opening_newline_index, &operator, false); + parser_warn_indentation_mismatch(parser, opening_newline_index, &operator, false, false); expect1(parser, PM_TOKEN_BRACE_RIGHT, PM_ERR_LAMBDA_TERM_BRACE); } else { expect1(parser, PM_TOKEN_KEYWORD_DO, PM_ERR_LAMBDA_OPEN); @@ -20314,7 +20318,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b assert(body == NULL || PM_NODE_TYPE_P(body, PM_STATEMENTS_NODE)); body = (pm_node_t *) parse_rescues_implicit_begin(parser, opening_newline_index, &operator, opening.start, (pm_statements_node_t *) body, PM_RESCUES_LAMBDA); } else { - parser_warn_indentation_mismatch(parser, opening_newline_index, &operator, false); + parser_warn_indentation_mismatch(parser, opening_newline_index, &operator, false, false); } expect1(parser, PM_TOKEN_KEYWORD_END, PM_ERR_LAMBDA_TERM_END); diff --git a/test/prism/result/warnings_test.rb b/test/prism/result/warnings_test.rb index b3817b631ff080..504458e17873e4 100644 --- a/test/prism/result/warnings_test.rb +++ b/test/prism/result/warnings_test.rb @@ -115,6 +115,9 @@ def test_indentation_mismatch assert_warning("case 1; when 2\n end", "mismatched indentations at 'end' with 'case'") assert_warning("case 1; in 2\n end", "mismatched indentations at 'end' with 'case'") + assert_warning(" case 1\nwhen 2\n end", "mismatched indentations at 'when' with 'case'") + refute_warning("case 1\n when 2\n when 3\nend") # case/when allows more indentation + assert_warning("-> {\n }", "mismatched indentations at '}' with '->'") assert_warning("-> do\n end", "mismatched indentations at 'end' with '->'") assert_warning("-> do\n rescue\nend", "mismatched indentations at 'rescue' with '->'") From 9afc6a981deae6e23d938cf5c2c4baadfeaafdb1 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Fri, 13 Sep 2024 11:21:28 -0400 Subject: [PATCH 290/829] [PRISM] Only parse shebang on main script Fixes [Bug #20730] --- prism/extension.c | 4 ++++ prism/options.c | 8 ++++++++ prism/options.h | 15 +++++++++++++++ prism/prism.c | 27 ++++++++++++++++++++++----- ruby.c | 2 ++ test/prism/api/command_line_test.rb | 4 ++-- test/prism/result/warnings_test.rb | 23 ++++++++++++----------- 7 files changed, 65 insertions(+), 18 deletions(-) diff --git a/prism/extension.c b/prism/extension.c index 79761770f64831..94fc5a104bb962 100644 --- a/prism/extension.c +++ b/prism/extension.c @@ -31,6 +31,7 @@ ID rb_id_option_encoding; ID rb_id_option_filepath; ID rb_id_option_frozen_string_literal; ID rb_id_option_line; +ID rb_id_option_main_script; ID rb_id_option_scopes; ID rb_id_option_version; ID rb_id_source_for; @@ -179,6 +180,8 @@ build_options_i(VALUE key, VALUE value, VALUE argument) { pm_options_command_line_set(options, command_line); } + } else if (key_id == rb_id_option_main_script) { + if (!NIL_P(value)) pm_options_main_script_set(options, RTEST(value)); } else { rb_raise(rb_eArgError, "unknown keyword: %" PRIsVALUE, key); } @@ -1165,6 +1168,7 @@ Init_prism(void) { rb_id_option_filepath = rb_intern_const("filepath"); rb_id_option_frozen_string_literal = rb_intern_const("frozen_string_literal"); rb_id_option_line = rb_intern_const("line"); + rb_id_option_main_script = rb_intern_const("main_script"); rb_id_option_scopes = rb_intern_const("scopes"); rb_id_option_version = rb_intern_const("version"); rb_id_source_for = rb_intern("for"); diff --git a/prism/options.c b/prism/options.c index 643de9d95a3791..e0b4735e4ae9a7 100644 --- a/prism/options.c +++ b/prism/options.c @@ -100,6 +100,14 @@ pm_options_version_set(pm_options_t *options, const char *version, size_t length } } +/** + * Set the main script option on the given options struct. + */ +PRISM_EXPORTED_FUNCTION void +pm_options_main_script_set(pm_options_t *options, bool main_script) { + options->main_script = main_script; +} + // For some reason, GCC analyzer thinks we're leaking allocated scopes and // locals here, even though we definitely aren't. This is a false positive. // Ideally we wouldn't need to suppress this. diff --git a/prism/options.h b/prism/options.h index 52b5380965a2ac..3cb73049516f07 100644 --- a/prism/options.h +++ b/prism/options.h @@ -139,6 +139,13 @@ typedef struct pm_options { * but ignore any encoding magic comments at the top of the file. */ bool encoding_locked; + + /** + * When the file being parsed is the main script, the shebang will be + * considered for command-line flags (or for implicit -x). The caller needs + * to pass this information to the parser so that it can behave correctly. + */ + bool main_script; } pm_options_t; /** @@ -248,6 +255,14 @@ PRISM_EXPORTED_FUNCTION void pm_options_command_line_set(pm_options_t *options, */ PRISM_EXPORTED_FUNCTION bool pm_options_version_set(pm_options_t *options, const char *version, size_t length); +/** + * Set the main script option on the given options struct. + * + * @param options The options struct to set the main script value on. + * @param main_script The main script value to set. + */ +PRISM_EXPORTED_FUNCTION void pm_options_main_script_set(pm_options_t *options, bool main_script); + /** * Allocate and zero out the scopes array on the given options struct. * diff --git a/prism/prism.c b/prism/prism.c index 72261f2494dc87..c1ef8ed3d4e5c8 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -21973,25 +21973,42 @@ pm_parser_init(pm_parser_t *parser, const uint8_t *source, size_t size, const pm // "ruby" and start parsing from there. bool search_shebang = PM_PARSER_COMMAND_LINE_OPTION_X(parser); - // If the first two bytes of the source are a shebang, then we'll indicate - // that the encoding comment is at the end of the shebang. + // If the first two bytes of the source are a shebang, then we will do a bit + // of extra processing. + // + // First, we'll indicate that the encoding comment is at the end of the + // shebang. This means that when a shebang is present the encoding comment + // can begin on the second line. + // + // Second, we will check if the shebang includes "ruby". If it does, then we + // we will start parsing from there. We will also potentially warning the + // user if there is a carriage return at the end of the shebang. We will + // also potentially call the shebang callback if this is the main script to + // allow the caller to parse the shebang and find any command-line options. + // If the shebang does not include "ruby" and this is the main script being + // parsed, then we will start searching the file for a shebang that does + // contain "ruby" as if -x were passed on the command line. const uint8_t *newline = next_newline(parser->start, parser->end - parser->start); size_t length = (size_t) ((newline != NULL ? newline : parser->end) - parser->start); if (length > 2 && parser->current.end[0] == '#' && parser->current.end[1] == '!') { const char *engine; + if ((engine = pm_strnstr((const char *) parser->start, "ruby", length)) != NULL) { if (newline != NULL) { - pm_parser_warn_shebang_carriage_return(parser, parser->start, length + 1); parser->encoding_comment_start = newline + 1; + + if (options == NULL || options->main_script) { + pm_parser_warn_shebang_carriage_return(parser, parser->start, length + 1); + } } - if (options != NULL && options->shebang_callback != NULL) { + if (options != NULL && options->main_script && options->shebang_callback != NULL) { pm_parser_init_shebang(parser, options, engine, length - ((size_t) (engine - (const char *) parser->start))); } search_shebang = false; - } else if (!parser->parsing_eval) { + } else if (options->main_script && !parser->parsing_eval) { search_shebang = true; } } diff --git a/ruby.c b/ruby.c index 7bd894a1b69455..093df77ba2211a 100644 --- a/ruby.c +++ b/ruby.c @@ -2155,6 +2155,8 @@ prism_script(ruby_cmdline_options_t *opt, pm_parse_result_t *result) pm_options_t *options = &result->options; pm_options_line_set(options, 1); + pm_options_main_script_set(options, true); + const bool read_stdin = (strcmp(opt->script, "-") == 0); if (read_stdin) { diff --git a/test/prism/api/command_line_test.rb b/test/prism/api/command_line_test.rb index a313845ead7777..a8c43551522c07 100644 --- a/test/prism/api/command_line_test.rb +++ b/test/prism/api/command_line_test.rb @@ -67,7 +67,7 @@ def test_command_line_e end def test_command_line_x_implicit - result = Prism.parse_statement(<<~RUBY) + result = Prism.parse_statement(<<~RUBY, main_script: true) #!/bin/bash exit 1 @@ -90,7 +90,7 @@ def test_command_line_x_explicit end def test_command_line_x_implicit_fail - result = Prism.parse(<<~RUBY) + result = Prism.parse(<<~RUBY, main_script: true) #!/bin/bash exit 1 RUBY diff --git a/test/prism/result/warnings_test.rb b/test/prism/result/warnings_test.rb index 504458e17873e4..fa87295898bfbd 100644 --- a/test/prism/result/warnings_test.rb +++ b/test/prism/result/warnings_test.rb @@ -336,23 +336,24 @@ def test_shebang_ending_with_carriage_return def test_shebang_ending_with_carriage_return msg = "shebang line ending with \\r may cause problems" - assert_warning(<<~RUBY, msg, compare: false) + assert_warning(<<~RUBY, msg, compare: false, main_script: true) #!ruby\r p(123) RUBY - assert_warning(<<~RUBY, msg, compare: false) + assert_warning(<<~RUBY, msg, compare: false, main_script: true) #!ruby \r p(123) RUBY - assert_warning(<<~RUBY, msg, compare: false) + assert_warning(<<~RUBY, msg, compare: false, main_script: true) #!ruby -Eutf-8\r p(123) RUBY - # Used with the `-x` object, to ignore the script up until the first shebang that mentioned "ruby". - assert_warning(<<~SCRIPT, msg, compare: false) + # Used with the `-x` object, to ignore the script up until the first + # shebang that mentioned "ruby". + assert_warning(<<~SCRIPT, msg, compare: false, main_script: true) #!/usr/bin/env bash # Some initial shell script or other content # that Ruby should ignore @@ -364,11 +365,11 @@ def test_shebang_ending_with_carriage_return puts "Hello from Ruby!" SCRIPT - refute_warning("#ruby not_a_shebang\r\n", compare: false) + refute_warning("#ruby not_a_shebang\r\n", compare: false, main_script: true) - # CRuby doesn't emit the warning if a malformed file only has `\r` and not `\n`. - # https://bugs.ruby-lang.org/issues/20700 - refute_warning("#!ruby\r", compare: false) + # CRuby doesn't emit the warning if a malformed file only has `\r` and + # not `\n`. https://bugs.ruby-lang.org/issues/20700. + refute_warning("#!ruby\r", compare: false, main_script: true) end end @@ -384,8 +385,8 @@ def test_warnings_verbosity private - def assert_warning(source, *messages, compare: true) - warnings = Prism.parse(source).warnings + def assert_warning(source, *messages, compare: true, **options) + warnings = Prism.parse(source, **options).warnings assert_equal messages.length, warnings.length, "Expected #{messages.length} warning(s) in #{source.inspect}, got #{warnings.map(&:message).inspect}" warnings.zip(messages).each do |warning, message| From 77521afac1687602fde4046ab20f016c61089003 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Fri, 13 Sep 2024 12:47:33 -0400 Subject: [PATCH 291/829] [PRISM] Do not warn ambiguous ampersand when symbol literal Fixes [Bug #20735] --- prism/prism.c | 11 ++++++++++- test/prism/result/warnings_test.rb | 9 +++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/prism/prism.c b/prism/prism.c index c1ef8ed3d4e5c8..6d4d2f819906ee 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -11277,7 +11277,16 @@ parser_lex(pm_parser_t *parser) { pm_token_type_t type = PM_TOKEN_AMPERSAND; if (lex_state_spcarg_p(parser, space_seen)) { - pm_parser_warn_token(parser, &parser->current, PM_WARN_AMBIGUOUS_PREFIX_AMPERSAND); + if ((peek(parser) != ':') || (peek_offset(parser, 1) == '\0')) { + pm_parser_warn_token(parser, &parser->current, PM_WARN_AMBIGUOUS_PREFIX_AMPERSAND); + } else { + const uint8_t delim = peek_offset(parser, 1); + + if ((delim != '\'') && (delim != '"') && !char_is_identifier(parser, parser->current.end + 1)) { + pm_parser_warn_token(parser, &parser->current, PM_WARN_AMBIGUOUS_PREFIX_AMPERSAND); + } + } + type = PM_TOKEN_UAMPERSAND; } else if (lex_state_beg_p(parser)) { type = PM_TOKEN_UAMPERSAND; diff --git a/test/prism/result/warnings_test.rb b/test/prism/result/warnings_test.rb index fa87295898bfbd..5cff2d2d2b8f9e 100644 --- a/test/prism/result/warnings_test.rb +++ b/test/prism/result/warnings_test.rb @@ -22,6 +22,15 @@ def test_ambiguous_regexp assert_warning("a /b/", "wrap regexp in parentheses") end + def test_ambiguous_ampersand + assert_warning("a &b", "argument prefix") + assert_warning("a &:+", "argument prefix") + + refute_warning("a &:b") + refute_warning("a &:'b'") + refute_warning("a &:\"b\"") + end + def test_binary_operator [ [:**, "argument prefix"], From f85efc9748b193bceaefd2e94293927404ac951f Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Fri, 13 Sep 2024 15:00:03 -0400 Subject: [PATCH 292/829] [ruby/prism] Expose main_script in serialization API https://github.com/ruby/prism/commit/0b527ca93f --- lib/prism/ffi.rb | 3 +++ prism/extension.c | 5 +++++ prism/options.c | 1 + 3 files changed, 9 insertions(+) diff --git a/lib/prism/ffi.rb b/lib/prism/ffi.rb index b972520be10823..40a4b32621d22a 100644 --- a/lib/prism/ffi.rb +++ b/lib/prism/ffi.rb @@ -448,6 +448,9 @@ def dump_options(options) template << "C" values << (options[:encoding] == false ? 1 : 0) + template << "C" + values << (options.fetch(:main_script, false) ? 1 : 0) + template << "L" if (scopes = options[:scopes]) values << scopes.length diff --git a/prism/extension.c b/prism/extension.c index 94fc5a104bb962..f08682e0f3e95b 100644 --- a/prism/extension.c +++ b/prism/extension.c @@ -756,6 +756,11 @@ parse_input(pm_string_t *input, const pm_options_t *options) { * has been set. This should be a boolean or nil. * * `line` - the line number that the parse starts on. This should be an * integer or nil. Note that this is 1-indexed. + * * `main_script` - a boolean indicating whether or not the source being parsed + * is the main script being run by the interpreter. This controls whether + * or not shebangs are parsed for additional flags and whether or not the + * parser will attempt to find a matching shebang if the first one does + * not contain the word "ruby". * * `scopes` - the locals that are in scope surrounding the code that is being * parsed. This should be an array of arrays of symbols or nil. Scopes are * ordered from the outermost scope to the innermost one. diff --git a/prism/options.c b/prism/options.c index e0b4735e4ae9a7..67b257138cbce3 100644 --- a/prism/options.c +++ b/prism/options.c @@ -241,6 +241,7 @@ pm_options_read(pm_options_t *options, const char *data) { options->command_line = (uint8_t) *data++; options->version = (pm_options_version_t) *data++; options->encoding_locked = ((uint8_t) *data++) > 0; + options->main_script = ((uint8_t) *data++) > 0; uint32_t scopes_count = pm_options_read_u32(data); data += 4; From ddbd64400199fd408d23c85f9fb0d7f742ecf9e1 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Fri, 13 Sep 2024 15:18:14 -0400 Subject: [PATCH 293/829] [ruby/prism] Stat file first to check directory https://github.com/ruby/prism/commit/4ed7de537b --- prism/util/pm_string.c | 37 +++++++++++++++++++++--------------- prism/util/pm_string.h | 3 +++ test/prism/api/parse_test.rb | 1 - 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/prism/util/pm_string.c b/prism/util/pm_string.c index 99a27ede4df0f9..7e56dec9f7e9c2 100644 --- a/prism/util/pm_string.c +++ b/prism/util/pm_string.c @@ -254,38 +254,45 @@ pm_string_file_init(pm_string_t *string, const char *filepath) { *string = (pm_string_t) { .type = PM_STRING_OWNED, .source = source, .length = (size_t) file_size }; return PM_STRING_INIT_SUCCESS; #elif defined(PRISM_HAS_FILESYSTEM) - FILE *file = fopen(filepath, "rb"); - if (file == NULL) { + // Open the file for reading + int fd = open(filepath, O_RDONLY); + if (fd == -1) { return PM_STRING_INIT_ERROR_GENERIC; } - fseek(file, 0, SEEK_END); - long file_size = ftell(file); - - if (file_size == -1) { - fclose(file); + // Stat the file to get the file size + struct stat sb; + if (fstat(fd, &sb) == -1) { + close(fd); return PM_STRING_INIT_ERROR_GENERIC; } - if (file_size == 0) { - fclose(file); + // Ensure it is a file and not a directory + if (S_ISDIR(sb.st_mode)) { + close(fd); + return PM_STRING_INIT_ERROR_DIRECTORY; + } + + // Check the size to see if it's empty + size_t size = (size_t) sb.st_size; + if (size == 0) { + close(fd); const uint8_t source[] = ""; *string = (pm_string_t) { .type = PM_STRING_CONSTANT, .source = source, .length = 0 }; return PM_STRING_INIT_SUCCESS; } - size_t length = (size_t) file_size; + size_t length = (size_t) size; uint8_t *source = xmalloc(length); if (source == NULL) { - fclose(file); + close(fd); return PM_STRING_INIT_ERROR_GENERIC; } - fseek(file, 0, SEEK_SET); - size_t bytes_read = fread(source, length, 1, file); - fclose(file); + long bytes_read = (long) read(fd, source, length); + close(fd); - if (bytes_read != 1) { + if (bytes_read == -1) { xfree(source); return PM_STRING_INIT_ERROR_GENERIC; } diff --git a/prism/util/pm_string.h b/prism/util/pm_string.h index 6ba327b2473773..f99f1abdf38c9b 100644 --- a/prism/util/pm_string.h +++ b/prism/util/pm_string.h @@ -22,6 +22,9 @@ #include #include #include +#elif defined(PRISM_HAS_FILESYSTEM) +#include +#include #endif /** diff --git a/test/prism/api/parse_test.rb b/test/prism/api/parse_test.rb index 49a2b2bfb9a42f..19c1feabb13ff1 100644 --- a/test/prism/api/parse_test.rb +++ b/test/prism/api/parse_test.rb @@ -87,7 +87,6 @@ def test_parse_directory rescue SystemCallError => error end - return if error.nil? || error.is_a?(Errno::ENOMEM) assert_kind_of Errno::EISDIR, error end From bc13ec735b33771c279e67e4143fa8e98a8252fd Mon Sep 17 00:00:00 2001 From: Yusuke Endoh Date: Sun, 15 Sep 2024 10:05:57 +0900 Subject: [PATCH 294/829] Prevent warnings: assigned but unused variable --- test/ruby/test_iseq.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/ruby/test_iseq.rb b/test/ruby/test_iseq.rb index b2bccb40f82c80..49aa4c5abd582e 100644 --- a/test/ruby/test_iseq.rb +++ b/test/ruby/test_iseq.rb @@ -591,7 +591,7 @@ def assert_iseq_to_binary(code, mesg = nil) end def test_to_binary_with_hidden_local_variables - assert_iseq_to_binary("for foo in bar; end") + assert_iseq_to_binary("for _foo in bar; end") bin = RubyVM::InstructionSequence.compile(<<-RUBY).to_binary Object.new.instance_eval do @@ -868,7 +868,7 @@ def test_ibf_bignum def test_compile_prism_with_file Tempfile.create(%w"test_iseq .rb") do |f| - f.puts "name = 'Prism'; puts 'hello'" + f.puts "_name = 'Prism'; puts 'hello'" f.close assert_nothing_raised(TypeError) do From 532af89e3b5b78dd3a6fe29c6cc64ad1b073afe2 Mon Sep 17 00:00:00 2001 From: Yusuke Endoh Date: Sun, 15 Sep 2024 10:06:11 +0900 Subject: [PATCH 295/829] Prevent warnings: the block passed to ... may be ignored --- test/ruby/test_keyword.rb | 2 +- test/ruby/test_proc.rb | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/test/ruby/test_keyword.rb b/test/ruby/test_keyword.rb index 4c6c35e6c332de..a214acc2327ee0 100644 --- a/test/ruby/test_keyword.rb +++ b/test/ruby/test_keyword.rb @@ -193,7 +193,7 @@ def test_keyword_splat_nil # cfunc call assert_equal(nil, p(**nil)) - def self.a0; end + def self.a0(&); end assert_equal(nil, a0(**nil)) assert_equal(nil, :a0.to_proc.call(self, **nil)) assert_equal(nil, a0(**nil, &:block)) diff --git a/test/ruby/test_proc.rb b/test/ruby/test_proc.rb index 192955c60ab781..dd05d09a49ba03 100644 --- a/test/ruby/test_proc.rb +++ b/test/ruby/test_proc.rb @@ -217,11 +217,14 @@ def test_block_given_method end def test_block_given_method_to_proc + verbose_bak, $VERBOSE = $VERBOSE, nil bug8341 = '[Bug #8341]' m = method(:m_block_given?).to_proc assert(!m.call, "#{bug8341} without block") assert(m.call {}, "#{bug8341} with block") assert(!m.call, "#{bug8341} without block second") + ensure + $VERBOSE = verbose_bak end def test_block_persist_between_calls From 7411caa103ccba8b9c16b9bd7aff96fc2b42f1fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Wed, 11 Sep 2024 15:46:56 +0200 Subject: [PATCH 296/829] [rubygems/rubygems] Make sure implementations of `Gem.open_file_with_flock` match https://github.com/rubygems/rubygems/commit/174a8e5284 --- lib/bundler/rubygems_ext.rb | 13 +++++-------- lib/rubygems.rb | 9 ++++----- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/lib/bundler/rubygems_ext.rb b/lib/bundler/rubygems_ext.rb index 481587df865dc2..650395c53eaf6a 100644 --- a/lib/bundler/rubygems_ext.rb +++ b/lib/bundler/rubygems_ext.rb @@ -33,20 +33,17 @@ def self.freebsd_platform? # Can be removed once RubyGems 3.5.14 support is dropped unless Gem.respond_to?(:open_file_with_flock) def self.open_file_with_flock(path, &block) - flags = File.exist?(path) ? "r+" : "a+" + mode = IO::RDONLY | IO::APPEND | IO::CREAT | IO::BINARY + mode |= IO::SHARE_DELETE if IO.const_defined?(:SHARE_DELETE) - File.open(path, flags) do |io| + File.open(path, mode) do |io| begin io.flock(File::LOCK_EX) rescue Errno::ENOSYS, Errno::ENOTSUP + rescue Errno::ENOLCK # NFS + raise unless Thread.main == Thread.current end yield io - rescue Errno::ENOLCK # NFS - if Thread.main != Thread.current - raise - else - File.open(path, flags, &block) - end end end end diff --git a/lib/rubygems.rb b/lib/rubygems.rb index 9d40fcc2f77aaf..ded0aa3b43eba5 100644 --- a/lib/rubygems.rb +++ b/lib/rubygems.rb @@ -794,15 +794,14 @@ def self.open_file(path, flags, &block) File.open(path, flags, &block) end - mode = IO::RDONLY | IO::APPEND | IO::CREAT | IO::BINARY - mode |= IO::SHARE_DELETE if IO.const_defined?(:SHARE_DELETE) - MODE_TO_FLOCK = mode # :nodoc: - ## # Open a file with given flags, and protect access with flock def self.open_file_with_flock(path, &block) - File.open(path, MODE_TO_FLOCK) do |io| + mode = IO::RDONLY | IO::APPEND | IO::CREAT | IO::BINARY + mode |= IO::SHARE_DELETE if IO.const_defined?(:SHARE_DELETE) + + File.open(path, mode) do |io| begin io.flock(File::LOCK_EX) rescue Errno::ENOSYS, Errno::ENOTSUP From fab01b15e999e9f9e18389dabfce3919e080ed56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Wed, 11 Sep 2024 16:42:24 +0200 Subject: [PATCH 297/829] [rubygems/rubygems] Remove temporary `.lock` files left around by gem installer https://github.com/rubygems/rubygems/commit/edbb2e3475 --- lib/bundler/rubygems_ext.rb | 37 +++++++++++++++++---------- lib/bundler/rubygems_gem_installer.rb | 4 +-- lib/rubygems.rb | 10 ++++++++ lib/rubygems/installer.rb | 4 +-- spec/bundler/commands/install_spec.rb | 13 ++++++++++ 5 files changed, 50 insertions(+), 18 deletions(-) diff --git a/lib/bundler/rubygems_ext.rb b/lib/bundler/rubygems_ext.rb index 650395c53eaf6a..d4cc4f62167116 100644 --- a/lib/bundler/rubygems_ext.rb +++ b/lib/bundler/rubygems_ext.rb @@ -30,20 +30,31 @@ def self.freebsd_platform? end end - # Can be removed once RubyGems 3.5.14 support is dropped - unless Gem.respond_to?(:open_file_with_flock) - def self.open_file_with_flock(path, &block) - mode = IO::RDONLY | IO::APPEND | IO::CREAT | IO::BINARY - mode |= IO::SHARE_DELETE if IO.const_defined?(:SHARE_DELETE) - - File.open(path, mode) do |io| - begin - io.flock(File::LOCK_EX) - rescue Errno::ENOSYS, Errno::ENOTSUP - rescue Errno::ENOLCK # NFS - raise unless Thread.main == Thread.current + # Can be removed once RubyGems 3.5.18 support is dropped + unless Gem.respond_to?(:open_file_with_lock) + class << self + remove_method :open_file_with_flock if Gem.respond_to?(:open_file_with_flock) + + def open_file_with_flock(path, &block) + mode = IO::RDONLY | IO::APPEND | IO::CREAT | IO::BINARY + mode |= IO::SHARE_DELETE if IO.const_defined?(:SHARE_DELETE) + + File.open(path, mode) do |io| + begin + io.flock(File::LOCK_EX) + rescue Errno::ENOSYS, Errno::ENOTSUP + rescue Errno::ENOLCK # NFS + raise unless Thread.main == Thread.current + end + yield io end - yield io + end + + def open_file_with_lock(path, &block) + file_lock = "#{path}.lock" + open_file_with_flock(file_lock, &block) + ensure + FileUtils.rm_f file_lock end end end diff --git a/lib/bundler/rubygems_gem_installer.rb b/lib/bundler/rubygems_gem_installer.rb index 858ebf32cf4a8e..62756680e7c44c 100644 --- a/lib/bundler/rubygems_gem_installer.rb +++ b/lib/bundler/rubygems_gem_installer.rb @@ -81,11 +81,11 @@ def generate_plugins end end - if Bundler.rubygems.provides?("< 3.5.15") + if Bundler.rubygems.provides?("< 3.5.19") def generate_bin_script(filename, bindir) bin_script_path = File.join bindir, formatted_program_filename(filename) - Gem.open_file_with_flock("#{bin_script_path}.lock") do + Gem.open_file_with_lock(bin_script_path) do require "fileutils" FileUtils.rm_f bin_script_path # prior install may have been --no-wrappers diff --git a/lib/rubygems.rb b/lib/rubygems.rb index ded0aa3b43eba5..43c0d8f13c6b4d 100644 --- a/lib/rubygems.rb +++ b/lib/rubygems.rb @@ -794,6 +794,16 @@ def self.open_file(path, flags, &block) File.open(path, flags, &block) end + ## + # Open a file with given flags, and protect access with a file lock + + def self.open_file_with_lock(path, &block) + file_lock = "#{path}.lock" + open_file_with_flock(file_lock, &block) + ensure + FileUtils.rm_f file_lock + end + ## # Open a file with given flags, and protect access with flock diff --git a/lib/rubygems/installer.rb b/lib/rubygems/installer.rb index 1085f73fca53ea..735d30ab9ed667 100644 --- a/lib/rubygems/installer.rb +++ b/lib/rubygems/installer.rb @@ -538,7 +538,7 @@ def generate_plugins # :nodoc: def generate_bin_script(filename, bindir) bin_script_path = File.join bindir, formatted_program_filename(filename) - Gem.open_file_with_flock("#{bin_script_path}.lock") do |lock| + Gem.open_file_with_lock(bin_script_path) do require "fileutils" FileUtils.rm_f bin_script_path # prior install may have been --no-wrappers @@ -546,8 +546,6 @@ def generate_bin_script(filename, bindir) file.write app_script_text(filename) file.chmod(options[:prog_mode] || 0o755) end - ensure - FileUtils.rm_f lock.path end verbose bin_script_path diff --git a/spec/bundler/commands/install_spec.rb b/spec/bundler/commands/install_spec.rb index 9353d24d95225d..19711045c20fd4 100644 --- a/spec/bundler/commands/install_spec.rb +++ b/spec/bundler/commands/install_spec.rb @@ -1591,4 +1591,17 @@ def run expect(err).to include("The running version of Bundler (9.99.9) does not match the version of the specification installed for it (9.99.8)") end end + + it "only installs executable files in bin" do + bundle "config set --local path vendor/bundle" + + install_gemfile <<~G + source "https://gem.repo1" + gem "myrack" + G + + expected_executables = [vendored_gems("bin/myrackup").to_s] + expected_executables << vendored_gems("bin/myrackup.bat").to_s if Gem.win_platform? + expect(Dir.glob(vendored_gems("bin/*"))).to eq(expected_executables) + end end From d57bc870ac8021f2c23e4da346d037820ad45d64 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Fri, 13 Sep 2024 15:33:14 -0400 Subject: [PATCH 298/829] [PRISM] Remove snapshot testing from Prism sync --- test/prism/snapshots/alias.txt | 215 - test/prism/snapshots/arithmetic.txt | 257 - test/prism/snapshots/arrays.txt | 1886 ------ test/prism/snapshots/begin_ensure.txt | 286 - test/prism/snapshots/begin_rescue.txt | 786 --- test/prism/snapshots/blocks.txt | 829 --- test/prism/snapshots/boolean_operators.txt | 59 - test/prism/snapshots/booleans.txt | 11 - test/prism/snapshots/break.txt | 499 -- test/prism/snapshots/case.txt | 554 -- test/prism/snapshots/classes.txt | 418 -- test/prism/snapshots/command_method_call.txt | 773 --- test/prism/snapshots/comments.txt | 147 - test/prism/snapshots/constants.txt | 1336 ---- test/prism/snapshots/dash_heredocs.txt | 273 - test/prism/snapshots/defined.txt | 99 - test/prism/snapshots/dos_endings.txt | 114 - test/prism/snapshots/dstring.txt | 89 - test/prism/snapshots/dsym_str.txt | 13 - .../snapshots/embdoc_no_newline_at_end.txt | 7 - test/prism/snapshots/emoji_method_calls.txt | 33 - test/prism/snapshots/endless_methods.txt | 115 - .../endless_range_in_conditional.txt | 58 - test/prism/snapshots/for.txt | 219 - test/prism/snapshots/global_variables.txt | 217 - test/prism/snapshots/hashes.txt | 422 -- test/prism/snapshots/heredoc.txt | 13 - .../heredoc_with_carriage_returns.txt | 13 - test/prism/snapshots/heredoc_with_comment.txt | 23 - .../heredoc_with_escaped_newline_at_start.txt | 69 - .../heredoc_with_trailing_newline.txt | 13 - .../snapshots/heredocs_leading_whitespace.txt | 65 - test/prism/snapshots/heredocs_nested.txt | 104 - .../heredocs_with_ignored_newlines.txt | 72 - ...cs_with_ignored_newlines_and_non_empty.txt | 13 - test/prism/snapshots/if.txt | 611 -- test/prism/snapshots/indented_file_end.txt | 21 - test/prism/snapshots/integer_operations.txt | 643 -- test/prism/snapshots/keyword_method_names.txt | 191 - test/prism/snapshots/keywords.txt | 59 - test/prism/snapshots/lambda.txt | 221 - test/prism/snapshots/method_calls.txt | 2592 -------- test/prism/snapshots/methods.txt | 2245 ------- test/prism/snapshots/modules.txt | 204 - test/prism/snapshots/multi_write.txt | 111 - test/prism/snapshots/newline_terminated.txt | 109 - test/prism/snapshots/next.txt | 372 -- test/prism/snapshots/nils.txt | 43 - .../snapshots/non_alphanumeric_methods.txt | 545 -- test/prism/snapshots/not.txt | 360 -- test/prism/snapshots/numbers.txt | 147 - test/prism/snapshots/patterns.txt | 5570 ----------------- test/prism/snapshots/procs.txt | 451 -- .../snapshots/range_begin_open_exclusive.txt | 15 - .../snapshots/range_begin_open_inclusive.txt | 15 - .../snapshots/range_end_open_exclusive.txt | 15 - .../snapshots/range_end_open_inclusive.txt | 15 - test/prism/snapshots/ranges.txt | 548 -- test/prism/snapshots/regex.txt | 545 -- test/prism/snapshots/regex_char_width.txt | 57 - test/prism/snapshots/repeat_parameters.txt | 509 -- test/prism/snapshots/rescue.txt | 584 -- test/prism/snapshots/return.txt | 179 - test/prism/snapshots/seattlerb/BEGIN.txt | 19 - .../seattlerb/TestRubyParserShared.txt | 398 -- .../snapshots/seattlerb/__ENCODING__.txt | 9 - .../seattlerb/alias_gvar_backref.txt | 18 - .../snapshots/seattlerb/alias_resword.txt | 24 - test/prism/snapshots/seattlerb/and_multi.txt | 33 - .../snapshots/seattlerb/aref_args_assocs.txt | 26 - .../seattlerb/aref_args_lit_assocs.txt | 29 - .../snapshots/seattlerb/args_kw_block.txt | 43 - .../snapshots/seattlerb/array_line_breaks.txt | 27 - .../seattlerb/array_lits_trailing_calls.txt | 37 - .../prism/snapshots/seattlerb/assoc__bare.txt | 36 - .../prism/snapshots/seattlerb/assoc_label.txt | 37 - .../seattlerb/attr_asgn_colon_id.txt | 26 - .../seattlerb/attrasgn_array_arg.txt | 44 - .../seattlerb/attrasgn_array_lhs.txt | 85 - .../attrasgn_primary_dot_constant.txt | 33 - .../backticks_interpolation_line.txt | 43 - test/prism/snapshots/seattlerb/bang_eq.txt | 26 - test/prism/snapshots/seattlerb/bdot2.txt | 40 - test/prism/snapshots/seattlerb/bdot3.txt | 40 - .../seattlerb/begin_ensure_no_bodies.txt | 20 - .../begin_rescue_else_ensure_bodies.txt | 57 - .../begin_rescue_else_ensure_no_bodies.txt | 33 - .../begin_rescue_ensure_no_bodies.txt | 28 - .../snapshots/seattlerb/block_arg__bare.txt | 35 - .../snapshots/seattlerb/block_arg_kwsplat.txt | 44 - .../seattlerb/block_arg_opt_arg_block.txt | 59 - .../seattlerb/block_arg_opt_splat.txt | 56 - .../block_arg_opt_splat_arg_block_omfg.txt | 64 - .../seattlerb/block_arg_optional.txt | 48 - .../snapshots/seattlerb/block_arg_scope.txt | 45 - .../snapshots/seattlerb/block_arg_scope2.txt | 48 - .../seattlerb/block_arg_splat_arg.txt | 50 - .../snapshots/seattlerb/block_args_kwargs.txt | 51 - .../seattlerb/block_args_no_kwargs.txt | 43 - .../snapshots/seattlerb/block_args_opt1.txt | 67 - .../snapshots/seattlerb/block_args_opt2.txt | 57 - .../snapshots/seattlerb/block_args_opt2_2.txt | 80 - .../snapshots/seattlerb/block_args_opt3.txt | 89 - .../block_call_defn_call_block_call.txt | 86 - .../block_call_dot_op2_brace_block.txt | 108 - .../block_call_dot_op2_cmd_args_do_block.txt | 121 - .../seattlerb/block_call_operation_colon.txt | 57 - .../seattlerb/block_call_operation_dot.txt | 57 - .../block_call_paren_call_block_call.txt | 65 - .../block_command_operation_colon.txt | 52 - .../seattlerb/block_command_operation_dot.txt | 52 - .../seattlerb/block_decomp_anon_splat_arg.txt | 53 - .../seattlerb/block_decomp_arg_splat.txt | 53 - .../seattlerb/block_decomp_arg_splat_arg.txt | 59 - .../seattlerb/block_decomp_splat.txt | 53 - test/prism/snapshots/seattlerb/block_kw.txt | 47 - .../seattlerb/block_kw__required.txt | 43 - .../snapshots/seattlerb/block_kwarg_lvar.txt | 57 - .../seattlerb/block_kwarg_lvar_multiple.txt | 68 - .../snapshots/seattlerb/block_opt_arg.txt | 51 - .../snapshots/seattlerb/block_opt_splat.txt | 53 - .../block_opt_splat_arg_block_omfg.txt | 61 - .../snapshots/seattlerb/block_optarg.txt | 51 - .../snapshots/seattlerb/block_paren_splat.txt | 56 - .../snapshots/seattlerb/block_reg_optarg.txt | 54 - .../snapshots/seattlerb/block_return.txt | 62 - .../prism/snapshots/seattlerb/block_scope.txt | 33 - .../snapshots/seattlerb/block_splat_reg.txt | 47 - test/prism/snapshots/seattlerb/bug169.txt | 32 - test/prism/snapshots/seattlerb/bug179.txt | 32 - test/prism/snapshots/seattlerb/bug190.txt | 13 - test/prism/snapshots/seattlerb/bug191.txt | 97 - test/prism/snapshots/seattlerb/bug202.txt | 26 - test/prism/snapshots/seattlerb/bug236.txt | 79 - test/prism/snapshots/seattlerb/bug290.txt | 28 - test/prism/snapshots/seattlerb/bug_187.txt | 64 - test/prism/snapshots/seattlerb/bug_215.txt | 17 - test/prism/snapshots/seattlerb/bug_249.txt | 95 - test/prism/snapshots/seattlerb/bug_and.txt | 28 - .../snapshots/seattlerb/bug_args__19.txt | 65 - .../snapshots/seattlerb/bug_args_masgn.txt | 55 - .../snapshots/seattlerb/bug_args_masgn2.txt | 65 - .../bug_args_masgn_outer_parens__19.txt | 62 - .../seattlerb/bug_call_arglist_parens.txt | 122 - .../seattlerb/bug_case_when_regexp.txt | 32 - test/prism/snapshots/seattlerb/bug_comma.txt | 44 - .../snapshots/seattlerb/bug_cond_pct.txt | 26 - .../snapshots/seattlerb/bug_hash_args.txt | 42 - .../bug_hash_args_trailing_comma.txt | 42 - .../seattlerb/bug_hash_interp_array.txt | 32 - .../snapshots/seattlerb/bug_masgn_right.txt | 55 - .../snapshots/seattlerb/bug_not_parens.txt | 27 - .../seattlerb/bug_op_asgn_rescue.txt | 31 - test/prism/snapshots/seattlerb/call_and.txt | 26 - .../snapshots/seattlerb/call_arg_assoc.txt | 37 - .../seattlerb/call_arg_assoc_kwsplat.txt | 47 - .../snapshots/seattlerb/call_arg_kwsplat.txt | 40 - .../seattlerb/call_args_assoc_quoted.txt | 114 - .../call_args_assoc_trailing_comma.txt | 37 - .../snapshots/seattlerb/call_args_command.txt | 56 - .../snapshots/seattlerb/call_array_arg.txt | 40 - .../seattlerb/call_array_block_call.txt | 44 - .../call_array_lambda_block_call.txt | 46 - .../seattlerb/call_array_lit_inline_hash.txt | 48 - test/prism/snapshots/seattlerb/call_assoc.txt | 34 - .../snapshots/seattlerb/call_assoc_new.txt | 37 - .../seattlerb/call_assoc_new_if_multiline.txt | 65 - .../seattlerb/call_assoc_trailing_comma.txt | 34 - .../seattlerb/call_bang_command_call.txt | 43 - .../seattlerb/call_bang_squiggle.txt | 26 - .../seattlerb/call_begin_call_block_call.txt | 58 - .../seattlerb/call_block_arg_named.txt | 31 - test/prism/snapshots/seattlerb/call_carat.txt | 26 - .../prism/snapshots/seattlerb/call_colon2.txt | 20 - .../snapshots/seattlerb/call_colon_parens.txt | 20 - test/prism/snapshots/seattlerb/call_div.txt | 26 - .../snapshots/seattlerb/call_dot_parens.txt | 20 - test/prism/snapshots/seattlerb/call_env.txt | 27 - test/prism/snapshots/seattlerb/call_eq3.txt | 26 - test/prism/snapshots/seattlerb/call_gt.txt | 26 - .../snapshots/seattlerb/call_kwsplat.txt | 30 - .../snapshots/seattlerb/call_leading_dots.txt | 37 - .../seattlerb/call_leading_dots_comment.txt | 37 - test/prism/snapshots/seattlerb/call_lt.txt | 26 - test/prism/snapshots/seattlerb/call_lte.txt | 26 - test/prism/snapshots/seattlerb/call_not.txt | 20 - test/prism/snapshots/seattlerb/call_pipe.txt | 26 - .../prism/snapshots/seattlerb/call_rshift.txt | 26 - .../seattlerb/call_self_brackets.txt | 25 - .../snapshots/seattlerb/call_spaceship.txt | 26 - .../call_stabby_do_end_with_block.txt | 47 - .../call_stabby_with_braces_block.txt | 47 - test/prism/snapshots/seattlerb/call_star.txt | 26 - test/prism/snapshots/seattlerb/call_star2.txt | 26 - .../seattlerb/call_trailing_comma.txt | 23 - .../seattlerb/call_trailing_dots.txt | 37 - .../snapshots/seattlerb/call_unary_bang.txt | 20 - test/prism/snapshots/seattlerb/case_in.txt | 1109 ---- test/prism/snapshots/seattlerb/case_in_31.txt | 57 - test/prism/snapshots/seattlerb/case_in_37.txt | 68 - test/prism/snapshots/seattlerb/case_in_42.txt | 53 - .../snapshots/seattlerb/case_in_42_2.txt | 50 - test/prism/snapshots/seattlerb/case_in_47.txt | 59 - test/prism/snapshots/seattlerb/case_in_67.txt | 39 - test/prism/snapshots/seattlerb/case_in_86.txt | 60 - .../snapshots/seattlerb/case_in_86_2.txt | 60 - .../seattlerb/case_in_array_pat_const.txt | 50 - .../seattlerb/case_in_array_pat_const2.txt | 56 - .../case_in_array_pat_paren_assign.txt | 58 - .../snapshots/seattlerb/case_in_const.txt | 35 - .../snapshots/seattlerb/case_in_else.txt | 49 - .../snapshots/seattlerb/case_in_find.txt | 56 - .../seattlerb/case_in_find_array.txt | 52 - .../snapshots/seattlerb/case_in_hash_pat.txt | 76 - .../seattlerb/case_in_hash_pat_assign.txt | 100 - .../case_in_hash_pat_paren_assign.txt | 59 - .../seattlerb/case_in_hash_pat_paren_true.txt | 55 - .../seattlerb/case_in_hash_pat_rest.txt | 65 - .../seattlerb/case_in_hash_pat_rest_solo.txt | 50 - .../seattlerb/case_in_if_unless_post_mod.txt | 82 - .../snapshots/seattlerb/case_in_multiple.txt | 68 - test/prism/snapshots/seattlerb/case_in_or.txt | 46 - .../snapshots/seattlerb/class_comments.txt | 37 - .../snapshots/seattlerb/cond_unary_minus.txt | 18 - .../seattlerb/const_2_op_asgn_or2.txt | 27 - .../seattlerb/const_3_op_asgn_or.txt | 21 - .../seattlerb/const_op_asgn_and1.txt | 22 - .../seattlerb/const_op_asgn_and2.txt | 21 - .../snapshots/seattlerb/const_op_asgn_or.txt | 24 - .../snapshots/seattlerb/defined_eh_parens.txt | 16 - .../seattlerb/defn_arg_asplat_arg.txt | 41 - .../seattlerb/defn_arg_forward_args.txt | 57 - .../seattlerb/defn_args_forward_args.txt | 69 - .../snapshots/seattlerb/defn_comments.txt | 21 - .../seattlerb/defn_endless_command.txt | 40 - .../seattlerb/defn_endless_command_rescue.txt | 48 - .../snapshots/seattlerb/defn_forward_args.txt | 50 - .../defn_forward_args__no_parens.txt | 50 - .../snapshots/seattlerb/defn_kwarg_env.txt | 62 - .../snapshots/seattlerb/defn_kwarg_kwarg.txt | 49 - .../seattlerb/defn_kwarg_kwsplat.txt | 43 - .../seattlerb/defn_kwarg_kwsplat_anon.txt | 43 - .../snapshots/seattlerb/defn_kwarg_lvar.txt | 48 - .../seattlerb/defn_kwarg_no_parens.txt | 38 - .../snapshots/seattlerb/defn_kwarg_val.txt | 41 - .../snapshots/seattlerb/defn_no_kwargs.txt | 34 - .../snapshots/seattlerb/defn_oneliner.txt | 53 - .../snapshots/seattlerb/defn_oneliner_eq2.txt | 55 - .../seattlerb/defn_oneliner_noargs.txt | 34 - .../defn_oneliner_noargs_parentheses.txt | 34 - .../seattlerb/defn_oneliner_rescue.txt | 180 - .../snapshots/seattlerb/defn_opt_last_arg.txt | 38 - .../snapshots/seattlerb/defn_opt_reg.txt | 41 - .../seattlerb/defn_opt_splat_arg.txt | 47 - .../prism/snapshots/seattlerb/defn_powarg.txt | 35 - .../snapshots/seattlerb/defn_reg_opt_reg.txt | 48 - .../snapshots/seattlerb/defn_splat_arg.txt | 38 - .../snapshots/seattlerb/defn_unary_not.txt | 26 - .../snapshots/seattlerb/defns_reserved.txt | 23 - .../defs_as_arg_with_do_block_inside.txt | 66 - .../snapshots/seattlerb/defs_comments.txt | 23 - .../seattlerb/defs_endless_command.txt | 50 - .../seattlerb/defs_endless_command_rescue.txt | 58 - test/prism/snapshots/seattlerb/defs_kwarg.txt | 40 - .../snapshots/seattlerb/defs_oneliner.txt | 55 - .../snapshots/seattlerb/defs_oneliner_eq2.txt | 57 - .../seattlerb/defs_oneliner_rescue.txt | 186 - .../prism/snapshots/seattlerb/difficult0_.txt | 75 - .../seattlerb/difficult1_line_numbers.txt | 272 - .../seattlerb/difficult1_line_numbers2.txt | 86 - .../prism/snapshots/seattlerb/difficult2_.txt | 81 - .../prism/snapshots/seattlerb/difficult3_.txt | 59 - .../snapshots/seattlerb/difficult3_2.txt | 47 - .../snapshots/seattlerb/difficult3_3.txt | 52 - .../snapshots/seattlerb/difficult3_4.txt | 47 - .../snapshots/seattlerb/difficult3_5.txt | 54 - .../snapshots/seattlerb/difficult3__10.txt | 59 - .../snapshots/seattlerb/difficult3__11.txt | 53 - .../snapshots/seattlerb/difficult3__12.txt | 56 - .../snapshots/seattlerb/difficult3__6.txt | 62 - .../snapshots/seattlerb/difficult3__7.txt | 56 - .../snapshots/seattlerb/difficult3__8.txt | 59 - .../snapshots/seattlerb/difficult3__9.txt | 56 - .../seattlerb/difficult4__leading_dots.txt | 27 - .../seattlerb/difficult4__leading_dots2.txt | 18 - .../prism/snapshots/seattlerb/difficult6_.txt | 70 - .../snapshots/seattlerb/difficult6__7.txt | 61 - .../snapshots/seattlerb/difficult6__8.txt | 61 - .../prism/snapshots/seattlerb/difficult7_.txt | 105 - test/prism/snapshots/seattlerb/do_bug.txt | 68 - test/prism/snapshots/seattlerb/do_lambda.txt | 21 - .../snapshots/seattlerb/dot2_nil__26.txt | 22 - .../snapshots/seattlerb/dot3_nil__26.txt | 22 - test/prism/snapshots/seattlerb/dstr_evstr.txt | 44 - .../seattlerb/dstr_evstr_empty_end.txt | 30 - .../snapshots/seattlerb/dstr_lex_state.txt | 39 - test/prism/snapshots/seattlerb/dstr_str.txt | 32 - .../snapshots/seattlerb/dsym_esc_to_sym.txt | 13 - .../prism/snapshots/seattlerb/dsym_to_sym.txt | 41 - .../seattlerb/eq_begin_line_numbers.txt | 13 - ...gin_why_wont_people_use_their_spacebar.txt | 54 - .../prism/snapshots/seattlerb/evstr_evstr.txt | 48 - test/prism/snapshots/seattlerb/evstr_str.txt | 36 - .../snapshots/seattlerb/expr_not_bang.txt | 40 - test/prism/snapshots/seattlerb/f_kw.txt | 38 - .../snapshots/seattlerb/f_kw__required.txt | 34 - .../snapshots/seattlerb/flip2_env_lvar.txt | 40 - .../seattlerb/float_with_if_modifier.txt | 23 - .../heredoc__backslash_dos_format.txt | 20 - .../seattlerb/heredoc_backslash_nl.txt | 19 - .../seattlerb/heredoc_bad_hex_escape.txt | 20 - .../seattlerb/heredoc_bad_oct_escape.txt | 20 - .../snapshots/seattlerb/heredoc_comma_arg.txt | 29 - .../snapshots/seattlerb/heredoc_lineno.txt | 30 - .../snapshots/seattlerb/heredoc_nested.txt | 46 - .../snapshots/seattlerb/heredoc_squiggly.txt | 37 - ...squiggly_blank_line_plus_interpolation.txt | 72 - .../heredoc_squiggly_blank_lines.txt | 37 - .../seattlerb/heredoc_squiggly_empty.txt | 13 - .../seattlerb/heredoc_squiggly_interp.txt | 54 - .../seattlerb/heredoc_squiggly_no_indent.txt | 13 - .../seattlerb/heredoc_squiggly_tabs.txt | 31 - .../seattlerb/heredoc_squiggly_tabs_extra.txt | 31 - .../heredoc_squiggly_visually_blank_lines.txt | 37 - .../heredoc_trailing_slash_continued_call.txt | 23 - .../snapshots/seattlerb/heredoc_unicode.txt | 13 - .../heredoc_with_carriage_return_escapes.txt | 13 - ...c_with_carriage_return_escapes_windows.txt | 13 - ...redoc_with_extra_carriage_horrible_mix.txt | 13 - .../heredoc_with_extra_carriage_returns.txt | 13 - ...oc_with_extra_carriage_returns_windows.txt | 13 - ...erpolation_and_carriage_return_escapes.txt | 31 - ...on_and_carriage_return_escapes_windows.txt | 31 - .../heredoc_with_not_global_interpolation.txt | 13 - .../heredoc_with_only_carriage_returns.txt | 13 - ...doc_with_only_carriage_returns_windows.txt | 13 - test/prism/snapshots/seattlerb/if_elsif.txt | 29 - test/prism/snapshots/seattlerb/if_symbol.txt | 34 - .../snapshots/seattlerb/in_expr_no_case.txt | 21 - test/prism/snapshots/seattlerb/index_0.txt | 40 - .../snapshots/seattlerb/index_0_opasgn.txt | 38 - .../seattlerb/integer_with_if_modifier.txt | 23 - .../interpolated_symbol_array_line_breaks.txt | 27 - .../interpolated_word_array_line_breaks.txt | 27 - .../prism/snapshots/seattlerb/iter_args_1.txt | 45 - .../snapshots/seattlerb/iter_args_10_1.txt | 56 - .../snapshots/seattlerb/iter_args_10_2.txt | 61 - .../snapshots/seattlerb/iter_args_11_1.txt | 59 - .../snapshots/seattlerb/iter_args_11_2.txt | 64 - .../snapshots/seattlerb/iter_args_2__19.txt | 52 - .../prism/snapshots/seattlerb/iter_args_3.txt | 58 - .../prism/snapshots/seattlerb/iter_args_4.txt | 50 - .../prism/snapshots/seattlerb/iter_args_5.txt | 47 - .../prism/snapshots/seattlerb/iter_args_6.txt | 54 - .../snapshots/seattlerb/iter_args_7_1.txt | 53 - .../snapshots/seattlerb/iter_args_7_2.txt | 58 - .../snapshots/seattlerb/iter_args_8_1.txt | 56 - .../snapshots/seattlerb/iter_args_8_2.txt | 61 - .../snapshots/seattlerb/iter_args_9_1.txt | 51 - .../snapshots/seattlerb/iter_args_9_2.txt | 56 - test/prism/snapshots/seattlerb/iter_kwarg.txt | 47 - .../seattlerb/iter_kwarg_kwsplat.txt | 52 - .../snapshots/seattlerb/label_vs_string.txt | 36 - .../seattlerb/lambda_do_vs_brace.txt | 103 - .../seattlerb/lasgn_arg_rescue_arg.txt | 25 - .../lasgn_call_bracket_rescue_arg.txt | 38 - .../lasgn_call_nobracket_rescue_arg.txt | 38 - .../snapshots/seattlerb/lasgn_command.txt | 40 - test/prism/snapshots/seattlerb/lasgn_env.txt | 17 - .../snapshots/seattlerb/lasgn_ivar_env.txt | 16 - .../seattlerb/lasgn_lasgn_command_call.txt | 37 - .../seattlerb/lasgn_middle_splat.txt | 53 - .../seattlerb/magic_encoding_comment.txt | 55 - .../seattlerb/masgn_anon_splat_arg.txt | 34 - .../seattlerb/masgn_arg_colon_arg.txt | 46 - .../snapshots/seattlerb/masgn_arg_ident.txt | 46 - .../seattlerb/masgn_arg_splat_arg.txt | 42 - .../snapshots/seattlerb/masgn_colon2.txt | 47 - .../snapshots/seattlerb/masgn_colon3.txt | 39 - .../seattlerb/masgn_command_call.txt | 48 - .../seattlerb/masgn_double_paren.txt | 41 - .../snapshots/seattlerb/masgn_lhs_splat.txt | 38 - .../prism/snapshots/seattlerb/masgn_paren.txt | 44 - .../snapshots/seattlerb/masgn_splat_arg.txt | 38 - .../seattlerb/masgn_splat_arg_arg.txt | 42 - test/prism/snapshots/seattlerb/masgn_star.txt | 23 - .../seattlerb/masgn_var_star_var.txt | 38 - .../seattlerb/messy_op_asgn_lineno.txt | 66 - .../method_call_assoc_trailing_comma.txt | 44 - .../seattlerb/method_call_trailing_comma.txt | 33 - .../seattlerb/mlhs_back_anonsplat.txt | 42 - .../snapshots/seattlerb/mlhs_back_splat.txt | 46 - .../seattlerb/mlhs_front_anonsplat.txt | 42 - .../snapshots/seattlerb/mlhs_front_splat.txt | 46 - .../snapshots/seattlerb/mlhs_keyword.txt | 34 - .../seattlerb/mlhs_mid_anonsplat.txt | 54 - .../snapshots/seattlerb/mlhs_mid_splat.txt | 58 - .../prism/snapshots/seattlerb/mlhs_rescue.txt | 42 - .../snapshots/seattlerb/module_comments.txt | 35 - .../seattlerb/multiline_hash_declaration.txt | 103 - ..._interpolated_symbol_array_line_breaks.txt | 27 - ...on_interpolated_word_array_line_breaks.txt | 27 - .../seattlerb/op_asgn_command_call.txt | 40 - .../op_asgn_dot_ident_command_call.txt | 35 - .../seattlerb/op_asgn_index_command_call.txt | 55 - ..._asgn_primary_colon_const_command_call.txt | 45 - .../op_asgn_primary_colon_identifier1.txt | 23 - ..._primary_colon_identifier_command_call.txt | 43 - .../op_asgn_val_dot_ident_command_call.txt | 42 - .../seattlerb/parse_def_special_name.txt | 21 - .../seattlerb/parse_if_not_canonical.txt | 68 - .../seattlerb/parse_if_not_noncanonical.txt | 68 - .../snapshots/seattlerb/parse_line_block.txt | 34 - .../parse_line_block_inline_comment.txt | 37 - ..._block_inline_comment_leading_newlines.txt | 37 - ...se_line_block_inline_multiline_comment.txt | 37 - ...ine_call_ivar_arg_no_parens_line_break.txt | 23 - .../parse_line_call_ivar_line_break_paren.txt | 23 - .../seattlerb/parse_line_call_no_args.txt | 69 - .../seattlerb/parse_line_defn_complex.txt | 75 - .../seattlerb/parse_line_defn_no_parens.txt | 35 - .../parse_line_defn_no_parens_args.txt | 33 - .../snapshots/seattlerb/parse_line_dot2.txt | 53 - .../seattlerb/parse_line_dot2_open.txt | 40 - .../snapshots/seattlerb/parse_line_dot3.txt | 53 - .../seattlerb/parse_line_dot3_open.txt | 40 - .../parse_line_dstr_escaped_newline.txt | 25 - .../parse_line_dstr_soft_newline.txt | 25 - .../parse_line_evstr_after_break.txt | 41 - .../seattlerb/parse_line_hash_lit.txt | 26 - .../seattlerb/parse_line_heredoc.txt | 47 - .../seattlerb/parse_line_heredoc_evstr.txt | 42 - .../parse_line_heredoc_hardnewline.txt | 26 - .../parse_line_heredoc_regexp_chars.txt | 37 - .../parse_line_iter_call_no_parens.txt | 82 - .../seattlerb/parse_line_iter_call_parens.txt | 82 - .../seattlerb/parse_line_multiline_str.txt | 16 - .../parse_line_multiline_str_literal_n.txt | 16 - .../seattlerb/parse_line_newlines.txt | 9 - .../seattlerb/parse_line_op_asgn.txt | 35 - .../seattlerb/parse_line_postexe.txt | 26 - .../snapshots/seattlerb/parse_line_preexe.txt | 26 - .../snapshots/seattlerb/parse_line_rescue.txt | 70 - .../snapshots/seattlerb/parse_line_return.txt | 47 - .../parse_line_str_with_newline_escape.txt | 28 - .../snapshots/seattlerb/parse_line_to_ary.txt | 44 - .../parse_line_trailing_newlines.txt | 27 - .../parse_opt_call_args_assocs_comma.txt | 37 - .../parse_opt_call_args_lit_comma.txt | 26 - .../snapshots/seattlerb/parse_pattern_019.txt | 39 - .../snapshots/seattlerb/parse_pattern_044.txt | 46 - .../snapshots/seattlerb/parse_pattern_051.txt | 55 - .../snapshots/seattlerb/parse_pattern_058.txt | 88 - .../seattlerb/parse_pattern_058_2.txt | 80 - .../snapshots/seattlerb/parse_pattern_069.txt | 56 - .../snapshots/seattlerb/parse_pattern_076.txt | 69 - .../seattlerb/parse_until_not_canonical.txt | 52 - .../parse_until_not_noncanonical.txt | 52 - .../seattlerb/parse_while_not_canonical.txt | 52 - .../parse_while_not_noncanonical.txt | 52 - .../prism/snapshots/seattlerb/pctW_lineno.txt | 54 - .../seattlerb/pct_Q_backslash_nl.txt | 13 - test/prism/snapshots/seattlerb/pct_nl.txt | 20 - .../seattlerb/pct_w_heredoc_interp_nested.txt | 55 - .../snapshots/seattlerb/pipe_semicolon.txt | 43 - test/prism/snapshots/seattlerb/pipe_space.txt | 40 - .../snapshots/seattlerb/qWords_space.txt | 12 - test/prism/snapshots/seattlerb/qsymbols.txt | 30 - .../snapshots/seattlerb/qsymbols_empty.txt | 12 - .../seattlerb/qsymbols_empty_space.txt | 12 - .../snapshots/seattlerb/qsymbols_interp.txt | 62 - .../seattlerb/quoted_symbol_hash_arg.txt | 39 - .../seattlerb/quoted_symbol_keys.txt | 29 - test/prism/snapshots/seattlerb/qw_escape.txt | 13 - .../snapshots/seattlerb/qw_escape_term.txt | 13 - .../snapshots/seattlerb/qwords_empty.txt | 12 - .../seattlerb/read_escape_unicode_curlies.txt | 13 - .../seattlerb/read_escape_unicode_h4.txt | 13 - test/prism/snapshots/seattlerb/regexp.txt | 37 - .../seattlerb/regexp_esc_C_slash.txt | 13 - .../snapshots/seattlerb/regexp_esc_u.txt | 13 - .../seattlerb/regexp_escape_extended.txt | 13 - .../seattlerb/regexp_unicode_curlies.txt | 19 - .../seattlerb/required_kwarg_no_value.txt | 38 - .../seattlerb/rescue_do_end_ensure_result.txt | 65 - .../seattlerb/rescue_do_end_no_raise.txt | 86 - .../seattlerb/rescue_do_end_raised.txt | 59 - .../seattlerb/rescue_do_end_rescued.txt | 90 - .../snapshots/seattlerb/rescue_in_block.txt | 53 - .../snapshots/seattlerb/rescue_parens.txt | 53 - .../seattlerb/return_call_assocs.txt | 227 - test/prism/snapshots/seattlerb/rhs_asgn.txt | 19 - .../snapshots/seattlerb/ruby21_numbers.txt | 29 - .../snapshots/seattlerb/safe_attrasgn.txt | 33 - .../seattlerb/safe_attrasgn_constant.txt | 33 - test/prism/snapshots/seattlerb/safe_call.txt | 27 - .../seattlerb/safe_call_after_newline.txt | 27 - .../seattlerb/safe_call_dot_parens.txt | 27 - .../snapshots/seattlerb/safe_call_newline.txt | 27 - .../seattlerb/safe_call_operator.txt | 33 - .../seattlerb/safe_call_rhs_newline.txt | 34 - test/prism/snapshots/seattlerb/safe_calls.txt | 43 - .../snapshots/seattlerb/safe_op_asgn.txt | 43 - .../snapshots/seattlerb/safe_op_asgn2.txt | 36 - .../slashy_newlines_within_string.txt | 59 - .../seattlerb/stabby_arg_no_paren.txt | 33 - .../stabby_arg_opt_splat_arg_block_omfg.txt | 55 - .../seattlerb/stabby_block_iter_call.txt | 64 - ...bby_block_iter_call_no_target_with_arg.txt | 60 - .../snapshots/seattlerb/stabby_block_kw.txt | 38 - .../seattlerb/stabby_block_kw__required.txt | 34 - .../snapshots/seattlerb/stabby_proc_scope.txt | 36 - .../snapshots/seattlerb/str_backslashes.txt | 26 - .../str_double_double_escaped_newline.txt | 36 - .../seattlerb/str_double_escaped_newline.txt | 36 - .../seattlerb/str_double_newline.txt | 36 - test/prism/snapshots/seattlerb/str_evstr.txt | 36 - .../snapshots/seattlerb/str_evstr_escape.txt | 42 - .../seattlerb/str_heredoc_interp.txt | 36 - .../seattlerb/str_interp_ternary_or_label.txt | 113 - .../str_lit_concat_bad_encodings.txt | 24 - .../str_newline_hash_line_number.txt | 16 - .../snapshots/seattlerb/str_pct_Q_nested.txt | 42 - .../seattlerb/str_pct_nested_nested.txt | 48 - test/prism/snapshots/seattlerb/str_pct_q.txt | 13 - .../str_single_double_escaped_newline.txt | 36 - .../seattlerb/str_single_escaped_newline.txt | 36 - .../seattlerb/str_single_newline.txt | 36 - test/prism/snapshots/seattlerb/str_str.txt | 32 - .../prism/snapshots/seattlerb/str_str_str.txt | 38 - test/prism/snapshots/seattlerb/super_arg.txt | 20 - .../snapshots/seattlerb/symbol_empty.txt | 13 - .../prism/snapshots/seattlerb/symbol_list.txt | 58 - test/prism/snapshots/seattlerb/symbols.txt | 30 - .../snapshots/seattlerb/symbols_empty.txt | 12 - .../seattlerb/symbols_empty_space.txt | 12 - .../snapshots/seattlerb/symbols_interp.txt | 30 - test/prism/snapshots/seattlerb/thingy.txt | 59 - .../snapshots/seattlerb/uminus_float.txt | 10 - .../prism/snapshots/seattlerb/unary_minus.txt | 27 - test/prism/snapshots/seattlerb/unary_plus.txt | 27 - .../seattlerb/unary_plus_on_literal.txt | 23 - .../prism/snapshots/seattlerb/unary_tilde.txt | 27 - test/prism/snapshots/seattlerb/utf8_bom.txt | 23 - test/prism/snapshots/seattlerb/when_splat.txt | 44 - .../snapshots/seattlerb/words_interp.txt | 34 - .../single_method_call_with_bang.txt | 17 - .../prism/snapshots/single_quote_heredocs.txt | 13 - test/prism/snapshots/spanning_heredoc.txt | 420 -- .../snapshots/spanning_heredoc_newlines.txt | 157 - test/prism/snapshots/strings.txt | 548 -- test/prism/snapshots/super.txt | 148 - test/prism/snapshots/symbols.txt | 482 -- test/prism/snapshots/ternary_operator.txt | 340 - test/prism/snapshots/tilde_heredocs.txt | 421 -- test/prism/snapshots/undef.txt | 131 - test/prism/snapshots/unescaping.txt | 36 - test/prism/snapshots/unless.txt | 203 - .../unparser/corpus/literal/alias.txt | 35 - .../unparser/corpus/literal/assignment.txt | 1181 ---- .../unparser/corpus/literal/block.txt | 1541 ----- .../unparser/corpus/literal/case.txt | 480 -- .../unparser/corpus/literal/class.txt | 260 - .../snapshots/unparser/corpus/literal/def.txt | 1325 ---- .../unparser/corpus/literal/defined.txt | 67 - .../unparser/corpus/literal/defs.txt | 395 -- .../unparser/corpus/literal/dstr.txt | 389 -- .../unparser/corpus/literal/empty.txt | 7 - .../unparser/corpus/literal/empty_begin.txt | 12 - .../unparser/corpus/literal/flipflop.txt | 257 - .../snapshots/unparser/corpus/literal/for.txt | 190 - .../unparser/corpus/literal/hookexe.txt | 55 - .../snapshots/unparser/corpus/literal/if.txt | 330 - .../unparser/corpus/literal/kwbegin.txt | 570 -- .../unparser/corpus/literal/lambda.txt | 170 - .../unparser/corpus/literal/literal.txt | 1309 ---- .../unparser/corpus/literal/module.txt | 121 - .../unparser/corpus/literal/opasgn.txt | 539 -- .../unparser/corpus/literal/pattern.txt | 542 -- .../unparser/corpus/literal/pragma.txt | 24 - .../unparser/corpus/literal/range.txt | 61 - .../unparser/corpus/literal/rescue.txt | 111 - .../unparser/corpus/literal/send.txt | 2274 ------- .../unparser/corpus/literal/since/27.txt | 58 - .../unparser/corpus/literal/since/30.txt | 106 - .../unparser/corpus/literal/since/31.txt | 100 - .../unparser/corpus/literal/since/32.txt | 174 - .../unparser/corpus/literal/singletons.txt | 15 - .../unparser/corpus/literal/super.txt | 302 - .../unparser/corpus/literal/unary.txt | 309 - .../unparser/corpus/literal/undef.txt | 33 - .../unparser/corpus/literal/variables.txt | 62 - .../unparser/corpus/literal/while.txt | 786 --- .../unparser/corpus/semantic/and.txt | 243 - .../unparser/corpus/semantic/block.txt | 213 - .../unparser/corpus/semantic/def.txt | 100 - .../unparser/corpus/semantic/dstr.txt | 639 -- .../unparser/corpus/semantic/kwbegin.txt | 294 - .../unparser/corpus/semantic/literal.txt | 112 - .../unparser/corpus/semantic/opasgn.txt | 75 - .../unparser/corpus/semantic/send.txt | 165 - .../unparser/corpus/semantic/undef.txt | 33 - .../unparser/corpus/semantic/while.txt | 303 - test/prism/snapshots/until.txt | 202 - test/prism/snapshots/variables.txt | 459 -- test/prism/snapshots/while.txt | 529 -- .../snapshots/whitequark/__ENCODING__.txt | 9 - .../whitequark/__ENCODING___legacy_.txt | 9 - test/prism/snapshots/whitequark/alias.txt | 24 - .../prism/snapshots/whitequark/alias_gvar.txt | 29 - ...iuous_quoted_label_in_ternary_operator.txt | 67 - test/prism/snapshots/whitequark/and.txt | 57 - test/prism/snapshots/whitequark/and_asgn.txt | 61 - .../snapshots/whitequark/and_or_masgn.txt | 107 - .../whitequark/anonymous_blockarg.txt | 52 - test/prism/snapshots/whitequark/arg.txt | 62 - .../whitequark/arg_duplicate_ignored.txt | 65 - test/prism/snapshots/whitequark/arg_label.txt | 124 - test/prism/snapshots/whitequark/arg_scope.txt | 40 - test/prism/snapshots/whitequark/args.txt | 1157 ---- .../snapshots/whitequark/args_args_assocs.txt | 101 - .../whitequark/args_args_assocs_comma.txt | 57 - .../snapshots/whitequark/args_args_comma.txt | 40 - .../snapshots/whitequark/args_args_star.txt | 95 - .../whitequark/args_assocs_comma.txt | 47 - .../snapshots/whitequark/args_block_pass.txt | 31 - test/prism/snapshots/whitequark/args_cmd.txt | 43 - test/prism/snapshots/whitequark/args_star.txt | 75 - .../snapshots/whitequark/array_assocs.txt | 48 - .../snapshots/whitequark/array_plain.txt | 18 - .../snapshots/whitequark/array_splat.txt | 73 - .../snapshots/whitequark/array_symbols.txt | 24 - .../whitequark/array_symbols_empty.txt | 17 - .../whitequark/array_symbols_interp.txt | 75 - .../snapshots/whitequark/array_words.txt | 24 - .../whitequark/array_words_empty.txt | 17 - .../whitequark/array_words_interp.txt | 88 - test/prism/snapshots/whitequark/asgn_cmd.txt | 62 - test/prism/snapshots/whitequark/asgn_mrhs.txt | 94 - test/prism/snapshots/whitequark/back_ref.txt | 10 - test/prism/snapshots/whitequark/bang.txt | 27 - test/prism/snapshots/whitequark/bang_cmd.txt | 40 - .../snapshots/whitequark/begin_cmdarg.txt | 57 - .../beginless_erange_after_newline.txt | 25 - .../beginless_irange_after_newline.txt | 25 - .../snapshots/whitequark/beginless_range.txt | 23 - test/prism/snapshots/whitequark/blockarg.txt | 35 - test/prism/snapshots/whitequark/blockargs.txt | 1442 ----- test/prism/snapshots/whitequark/bug_435.txt | 46 - test/prism/snapshots/whitequark/bug_447.txt | 60 - test/prism/snapshots/whitequark/bug_452.txt | 68 - test/prism/snapshots/whitequark/bug_466.txt | 77 - test/prism/snapshots/whitequark/bug_473.txt | 38 - test/prism/snapshots/whitequark/bug_480.txt | 43 - test/prism/snapshots/whitequark/bug_481.txt | 54 - .../whitequark/bug_ascii_8bit_in_literal.txt | 13 - .../whitequark/bug_cmd_string_lookahead.txt | 33 - .../prism/snapshots/whitequark/bug_cmdarg.txt | 114 - .../whitequark/bug_def_no_paren_eql_begin.txt | 21 - .../whitequark/bug_do_block_in_call_args.txt | 56 - .../whitequark/bug_do_block_in_cmdarg.txt | 45 - .../whitequark/bug_do_block_in_hash_brace.txt | 411 -- .../snapshots/whitequark/bug_heredoc_do.txt | 33 - .../whitequark/bug_interp_single.txt | 44 - .../whitequark/bug_lambda_leakage.txt | 43 - .../whitequark/bug_regex_verification.txt | 13 - .../whitequark/bug_rescue_empty_else.txt | 31 - .../whitequark/bug_while_not_parens_do.txt | 33 - test/prism/snapshots/whitequark/case_cond.txt | 39 - .../snapshots/whitequark/case_cond_else.txt | 53 - test/prism/snapshots/whitequark/case_expr.txt | 49 - .../snapshots/whitequark/case_expr_else.txt | 67 - .../snapshots/whitequark/casgn_scoped.txt | 24 - .../snapshots/whitequark/casgn_toplevel.txt | 21 - .../snapshots/whitequark/casgn_unscoped.txt | 16 - test/prism/snapshots/whitequark/character.txt | 13 - test/prism/snapshots/whitequark/class.txt | 33 - .../snapshots/whitequark/class_super.txt | 23 - .../whitequark/class_super_label.txt | 39 - .../comments_before_leading_dot__27.txt | 87 - test/prism/snapshots/whitequark/complex.txt | 33 - .../prism/snapshots/whitequark/cond_begin.txt | 46 - .../snapshots/whitequark/cond_begin_masgn.txt | 60 - .../snapshots/whitequark/cond_eflipflop.txt | 83 - .../cond_eflipflop_with_beginless_range.txt | 30 - .../cond_eflipflop_with_endless_range.txt | 30 - .../snapshots/whitequark/cond_iflipflop.txt | 83 - .../cond_iflipflop_with_beginless_range.txt | 30 - .../cond_iflipflop_with_endless_range.txt | 30 - .../whitequark/cond_match_current_line.txt | 37 - .../snapshots/whitequark/const_op_asgn.txt | 114 - .../snapshots/whitequark/const_scoped.txt | 16 - .../snapshots/whitequark/const_toplevel.txt | 13 - .../snapshots/whitequark/const_unscoped.txt | 10 - test/prism/snapshots/whitequark/cpath.txt | 38 - test/prism/snapshots/whitequark/cvar.txt | 10 - test/prism/snapshots/whitequark/cvasgn.txt | 16 - .../whitequark/dedenting_heredoc.txt | 505 -- ...olating_heredoc_fake_line_continuation.txt | 24 - ...nterpolating_heredoc_line_continuation.txt | 24 - test/prism/snapshots/whitequark/def.txt | 91 - test/prism/snapshots/whitequark/defined.txt | 48 - test/prism/snapshots/whitequark/defs.txt | 102 - .../prism/snapshots/whitequark/empty_stmt.txt | 7 - .../whitequark/endless_comparison_method.txt | 241 - .../snapshots/whitequark/endless_method.txt | 165 - .../endless_method_command_syntax.txt | 427 -- .../endless_method_forwarded_args_legacy.txt | 50 - .../endless_method_with_rescue_mod.txt | 65 - .../endless_method_without_args.txt | 105 - test/prism/snapshots/whitequark/ensure.txt | 46 - .../snapshots/whitequark/ensure_empty.txt | 20 - test/prism/snapshots/whitequark/false.txt | 9 - test/prism/snapshots/whitequark/float.txt | 13 - test/prism/snapshots/whitequark/for.txt | 93 - test/prism/snapshots/whitequark/for_mlhs.txt | 65 - .../snapshots/whitequark/forward_arg.txt | 50 - .../whitequark/forward_arg_with_open_args.txt | 456 -- .../whitequark/forward_args_legacy.txt | 115 - .../forwarded_argument_with_kwrestarg.txt | 65 - .../forwarded_argument_with_restarg.txt | 62 - .../whitequark/forwarded_kwrestarg.txt | 58 - ...warded_kwrestarg_with_additional_kwarg.txt | 71 - .../whitequark/forwarded_restarg.txt | 55 - test/prism/snapshots/whitequark/gvar.txt | 10 - test/prism/snapshots/whitequark/gvasgn.txt | 16 - .../prism/snapshots/whitequark/hash_empty.txt | 12 - .../snapshots/whitequark/hash_hashrocket.txt | 56 - .../snapshots/whitequark/hash_kwsplat.txt | 40 - .../prism/snapshots/whitequark/hash_label.txt | 26 - .../snapshots/whitequark/hash_label_end.txt | 112 - .../whitequark/hash_pair_value_omission.txt | 111 - test/prism/snapshots/whitequark/heredoc.txt | 25 - test/prism/snapshots/whitequark/if.txt | 69 - test/prism/snapshots/whitequark/if_else.txt | 105 - test/prism/snapshots/whitequark/if_elsif.txt | 73 - .../snapshots/whitequark/if_masgn__24.txt | 50 - test/prism/snapshots/whitequark/if_mod.txt | 38 - .../prism/snapshots/whitequark/if_nl_then.txt | 38 - test/prism/snapshots/whitequark/int.txt | 16 - .../snapshots/whitequark/int___LINE__.txt | 9 - .../snapshots/whitequark/interp_digit_var.txt | 275 - test/prism/snapshots/whitequark/ivar.txt | 10 - test/prism/snapshots/whitequark/ivasgn.txt | 16 - .../whitequark/keyword_argument_omission.txt | 71 - test/prism/snapshots/whitequark/kwarg.txt | 34 - .../snapshots/whitequark/kwbegin_compstmt.txt | 38 - test/prism/snapshots/whitequark/kwnilarg.txt | 97 - test/prism/snapshots/whitequark/kwoptarg.txt | 38 - ...targ_with_kwrestarg_and_forwarded_args.txt | 65 - .../snapshots/whitequark/kwrestarg_named.txt | 35 - .../whitequark/kwrestarg_unnamed.txt | 35 - .../lbrace_arg_after_command_args.txt | 61 - .../lparenarg_after_lvar__since_25.txt | 75 - test/prism/snapshots/whitequark/lvar.txt | 17 - .../whitequark/lvar_injecting_match.txt | 44 - test/prism/snapshots/whitequark/lvasgn.txt | 21 - test/prism/snapshots/whitequark/masgn.txt | 95 - .../prism/snapshots/whitequark/masgn_attr.txt | 96 - test/prism/snapshots/whitequark/masgn_cmd.txt | 41 - .../snapshots/whitequark/masgn_const.txt | 55 - .../snapshots/whitequark/masgn_nested.txt | 77 - .../snapshots/whitequark/masgn_splat.txt | 323 - .../method_definition_in_while_cond.txt | 223 - test/prism/snapshots/whitequark/module.txt | 18 - .../whitequark/multiple_pattern_matches.txt | 203 - .../whitequark/newline_in_hash_argument.txt | 182 - test/prism/snapshots/whitequark/nil.txt | 9 - .../snapshots/whitequark/nil_expression.txt | 20 - .../whitequark/non_lvar_injecting_match.txt | 48 - test/prism/snapshots/whitequark/not.txt | 57 - test/prism/snapshots/whitequark/not_cmd.txt | 40 - .../snapshots/whitequark/not_masgn__24.txt | 52 - test/prism/snapshots/whitequark/nth_ref.txt | 10 - .../whitequark/numbered_args_after_27.txt | 165 - .../whitequark/numparam_outside_block.txt | 127 - .../whitequark/numparam_ruby_bug_19025.txt | 55 - test/prism/snapshots/whitequark/op_asgn.txt | 76 - .../snapshots/whitequark/op_asgn_cmd.txt | 181 - .../snapshots/whitequark/op_asgn_index.txt | 40 - .../whitequark/op_asgn_index_cmd.txt | 60 - test/prism/snapshots/whitequark/optarg.txt | 80 - test/prism/snapshots/whitequark/or.txt | 57 - test/prism/snapshots/whitequark/or_asgn.txt | 61 - .../snapshots/whitequark/parser_bug_272.txt | 48 - .../snapshots/whitequark/parser_bug_490.txt | 129 - .../snapshots/whitequark/parser_bug_507.txt | 42 - .../snapshots/whitequark/parser_bug_518.txt | 23 - .../snapshots/whitequark/parser_bug_525.txt | 71 - .../snapshots/whitequark/parser_bug_604.txt | 60 - .../snapshots/whitequark/parser_bug_640.txt | 24 - .../snapshots/whitequark/parser_bug_645.txt | 41 - .../snapshots/whitequark/parser_bug_830.txt | 13 - .../snapshots/whitequark/parser_bug_989.txt | 13 - ...ps_truncated_parts_of_squiggly_heredoc.txt | 23 - ...ser_slash_slash_n_escaping_in_literals.txt | 141 - .../pattern_matching__FILE__LINE_literals.txt | 63 - .../pattern_matching_blank_else.txt | 37 - .../whitequark/pattern_matching_else.txt | 43 - .../pattern_matching_single_line.txt | 55 - ...e_line_allowed_omission_of_parentheses.txt | 291 - test/prism/snapshots/whitequark/postexe.txt | 19 - test/prism/snapshots/whitequark/preexe.txt | 19 - test/prism/snapshots/whitequark/procarg0.txt | 87 - .../snapshots/whitequark/range_exclusive.txt | 18 - .../snapshots/whitequark/range_inclusive.txt | 18 - test/prism/snapshots/whitequark/rational.txt | 15 - .../snapshots/whitequark/regex_interp.txt | 42 - .../snapshots/whitequark/regex_plain.txt | 13 - .../snapshots/whitequark/resbody_list.txt | 52 - .../whitequark/resbody_list_mrhs.txt | 62 - .../snapshots/whitequark/resbody_list_var.txt | 63 - .../snapshots/whitequark/resbody_var.txt | 98 - test/prism/snapshots/whitequark/rescue.txt | 49 - .../snapshots/whitequark/rescue_else.txt | 67 - .../whitequark/rescue_else_ensure.txt | 85 - .../snapshots/whitequark/rescue_ensure.txt | 67 - .../whitequark/rescue_in_lambda_block.txt | 31 - .../prism/snapshots/whitequark/rescue_mod.txt | 32 - .../snapshots/whitequark/rescue_mod_asgn.txt | 39 - .../snapshots/whitequark/rescue_mod_masgn.txt | 50 - .../whitequark/rescue_mod_op_assign.txt | 40 - .../whitequark/rescue_without_begin_end.txt | 66 - .../snapshots/whitequark/restarg_named.txt | 35 - .../snapshots/whitequark/restarg_unnamed.txt | 35 - test/prism/snapshots/whitequark/return.txt | 65 - .../snapshots/whitequark/return_block.txt | 44 - .../snapshots/whitequark/ruby_bug_10279.txt | 39 - .../snapshots/whitequark/ruby_bug_10653.txt | 199 - .../snapshots/whitequark/ruby_bug_11107.txt | 54 - .../snapshots/whitequark/ruby_bug_11380.txt | 61 - .../snapshots/whitequark/ruby_bug_11873.txt | 793 --- .../snapshots/whitequark/ruby_bug_11873_a.txt | 1285 ---- .../snapshots/whitequark/ruby_bug_11873_b.txt | 103 - .../snapshots/whitequark/ruby_bug_11989.txt | 26 - .../snapshots/whitequark/ruby_bug_11990.txt | 37 - .../snapshots/whitequark/ruby_bug_12073.txt | 104 - .../snapshots/whitequark/ruby_bug_12402.txt | 613 -- .../snapshots/whitequark/ruby_bug_12669.txt | 143 - .../snapshots/whitequark/ruby_bug_12686.txt | 45 - .../snapshots/whitequark/ruby_bug_13547.txt | 34 - .../snapshots/whitequark/ruby_bug_14690.txt | 65 - .../snapshots/whitequark/ruby_bug_15789.txt | 140 - .../snapshots/whitequark/ruby_bug_9669.txt | 67 - test/prism/snapshots/whitequark/sclass.txt | 30 - test/prism/snapshots/whitequark/self.txt | 9 - .../snapshots/whitequark/send_attr_asgn.txt | 109 - .../whitequark/send_attr_asgn_conditional.txt | 33 - .../snapshots/whitequark/send_binary_op.txt | 553 -- .../whitequark/send_block_chain_cmd.txt | 337 - .../whitequark/send_block_conditional.txt | 34 - test/prism/snapshots/whitequark/send_call.txt | 59 - .../snapshots/whitequark/send_conditional.txt | 27 - .../prism/snapshots/whitequark/send_index.txt | 36 - .../snapshots/whitequark/send_index_asgn.txt | 39 - .../whitequark/send_index_asgn_legacy.txt | 39 - .../snapshots/whitequark/send_index_cmd.txt | 53 - .../whitequark/send_index_legacy.txt | 36 - .../snapshots/whitequark/send_lambda.txt | 51 - .../snapshots/whitequark/send_lambda_args.txt | 59 - .../whitequark/send_lambda_args_noparen.txt | 65 - .../whitequark/send_lambda_args_shadow.txt | 39 - .../whitequark/send_lambda_legacy.txt | 15 - .../whitequark/send_op_asgn_conditional.txt | 29 - .../prism/snapshots/whitequark/send_plain.txt | 67 - .../snapshots/whitequark/send_plain_cmd.txt | 106 - test/prism/snapshots/whitequark/send_self.txt | 43 - .../snapshots/whitequark/send_self_block.txt | 81 - .../snapshots/whitequark/send_unary_op.txt | 67 - .../whitequark/slash_newline_in_heredocs.txt | 36 - .../snapshots/whitequark/space_args_arg.txt | 31 - .../whitequark/space_args_arg_block.txt | 120 - .../whitequark/space_args_arg_call.txt | 41 - .../whitequark/space_args_arg_newline.txt | 31 - .../snapshots/whitequark/space_args_block.txt | 32 - .../snapshots/whitequark/space_args_cmd.txt | 51 - .../snapshots/whitequark/string___FILE__.txt | 10 - .../snapshots/whitequark/string_concat.txt | 36 - .../snapshots/whitequark/string_dvar.txt | 45 - .../snapshots/whitequark/string_interp.txt | 42 - .../snapshots/whitequark/string_plain.txt | 19 - test/prism/snapshots/whitequark/super.txt | 54 - .../snapshots/whitequark/super_block.txt | 54 - .../snapshots/whitequark/symbol_interp.txt | 42 - .../snapshots/whitequark/symbol_plain.txt | 19 - test/prism/snapshots/whitequark/ternary.txt | 42 - .../whitequark/ternary_ambiguous_symbol.txt | 61 - .../whitequark/trailing_forward_arg.txt | 63 - test/prism/snapshots/whitequark/true.txt | 9 - .../whitequark/unary_num_pow_precedence.txt | 84 - test/prism/snapshots/whitequark/undef.txt | 45 - test/prism/snapshots/whitequark/unless.txt | 69 - .../snapshots/whitequark/unless_else.txt | 105 - .../prism/snapshots/whitequark/unless_mod.txt | 38 - test/prism/snapshots/whitequark/until.txt | 65 - test/prism/snapshots/whitequark/until_mod.txt | 36 - .../prism/snapshots/whitequark/until_post.txt | 47 - .../snapshots/whitequark/var_and_asgn.txt | 17 - .../snapshots/whitequark/var_op_asgn.txt | 65 - .../snapshots/whitequark/var_op_asgn_cmd.txt | 32 - .../snapshots/whitequark/var_or_asgn.txt | 17 - .../prism/snapshots/whitequark/when_multi.txt | 55 - .../prism/snapshots/whitequark/when_splat.txt | 80 - test/prism/snapshots/whitequark/when_then.txt | 49 - test/prism/snapshots/whitequark/while.txt | 65 - test/prism/snapshots/whitequark/while_mod.txt | 36 - .../prism/snapshots/whitequark/while_post.txt | 47 - .../snapshots/whitequark/xstring_interp.txt | 42 - .../snapshots/whitequark/xstring_plain.txt | 13 - test/prism/snapshots/whitequark/zsuper.txt | 10 - test/prism/snapshots/xstring.txt | 72 - .../snapshots/xstring_with_backslash.txt | 13 - test/prism/snapshots/yield.txt | 117 - test/prism/snapshots_test.rb | 73 - tool/sync_default_gems.rb | 3 + 915 files changed, 3 insertions(+), 94492 deletions(-) delete mode 100644 test/prism/snapshots/alias.txt delete mode 100644 test/prism/snapshots/arithmetic.txt delete mode 100644 test/prism/snapshots/arrays.txt delete mode 100644 test/prism/snapshots/begin_ensure.txt delete mode 100644 test/prism/snapshots/begin_rescue.txt delete mode 100644 test/prism/snapshots/blocks.txt delete mode 100644 test/prism/snapshots/boolean_operators.txt delete mode 100644 test/prism/snapshots/booleans.txt delete mode 100644 test/prism/snapshots/break.txt delete mode 100644 test/prism/snapshots/case.txt delete mode 100644 test/prism/snapshots/classes.txt delete mode 100644 test/prism/snapshots/command_method_call.txt delete mode 100644 test/prism/snapshots/comments.txt delete mode 100644 test/prism/snapshots/constants.txt delete mode 100644 test/prism/snapshots/dash_heredocs.txt delete mode 100644 test/prism/snapshots/defined.txt delete mode 100644 test/prism/snapshots/dos_endings.txt delete mode 100644 test/prism/snapshots/dstring.txt delete mode 100644 test/prism/snapshots/dsym_str.txt delete mode 100644 test/prism/snapshots/embdoc_no_newline_at_end.txt delete mode 100644 test/prism/snapshots/emoji_method_calls.txt delete mode 100644 test/prism/snapshots/endless_methods.txt delete mode 100644 test/prism/snapshots/endless_range_in_conditional.txt delete mode 100644 test/prism/snapshots/for.txt delete mode 100644 test/prism/snapshots/global_variables.txt delete mode 100644 test/prism/snapshots/hashes.txt delete mode 100644 test/prism/snapshots/heredoc.txt delete mode 100644 test/prism/snapshots/heredoc_with_carriage_returns.txt delete mode 100644 test/prism/snapshots/heredoc_with_comment.txt delete mode 100644 test/prism/snapshots/heredoc_with_escaped_newline_at_start.txt delete mode 100644 test/prism/snapshots/heredoc_with_trailing_newline.txt delete mode 100644 test/prism/snapshots/heredocs_leading_whitespace.txt delete mode 100644 test/prism/snapshots/heredocs_nested.txt delete mode 100644 test/prism/snapshots/heredocs_with_ignored_newlines.txt delete mode 100644 test/prism/snapshots/heredocs_with_ignored_newlines_and_non_empty.txt delete mode 100644 test/prism/snapshots/if.txt delete mode 100644 test/prism/snapshots/indented_file_end.txt delete mode 100644 test/prism/snapshots/integer_operations.txt delete mode 100644 test/prism/snapshots/keyword_method_names.txt delete mode 100644 test/prism/snapshots/keywords.txt delete mode 100644 test/prism/snapshots/lambda.txt delete mode 100644 test/prism/snapshots/method_calls.txt delete mode 100644 test/prism/snapshots/methods.txt delete mode 100644 test/prism/snapshots/modules.txt delete mode 100644 test/prism/snapshots/multi_write.txt delete mode 100644 test/prism/snapshots/newline_terminated.txt delete mode 100644 test/prism/snapshots/next.txt delete mode 100644 test/prism/snapshots/nils.txt delete mode 100644 test/prism/snapshots/non_alphanumeric_methods.txt delete mode 100644 test/prism/snapshots/not.txt delete mode 100644 test/prism/snapshots/numbers.txt delete mode 100644 test/prism/snapshots/patterns.txt delete mode 100644 test/prism/snapshots/procs.txt delete mode 100644 test/prism/snapshots/range_begin_open_exclusive.txt delete mode 100644 test/prism/snapshots/range_begin_open_inclusive.txt delete mode 100644 test/prism/snapshots/range_end_open_exclusive.txt delete mode 100644 test/prism/snapshots/range_end_open_inclusive.txt delete mode 100644 test/prism/snapshots/ranges.txt delete mode 100644 test/prism/snapshots/regex.txt delete mode 100644 test/prism/snapshots/regex_char_width.txt delete mode 100644 test/prism/snapshots/repeat_parameters.txt delete mode 100644 test/prism/snapshots/rescue.txt delete mode 100644 test/prism/snapshots/return.txt delete mode 100644 test/prism/snapshots/seattlerb/BEGIN.txt delete mode 100644 test/prism/snapshots/seattlerb/TestRubyParserShared.txt delete mode 100644 test/prism/snapshots/seattlerb/__ENCODING__.txt delete mode 100644 test/prism/snapshots/seattlerb/alias_gvar_backref.txt delete mode 100644 test/prism/snapshots/seattlerb/alias_resword.txt delete mode 100644 test/prism/snapshots/seattlerb/and_multi.txt delete mode 100644 test/prism/snapshots/seattlerb/aref_args_assocs.txt delete mode 100644 test/prism/snapshots/seattlerb/aref_args_lit_assocs.txt delete mode 100644 test/prism/snapshots/seattlerb/args_kw_block.txt delete mode 100644 test/prism/snapshots/seattlerb/array_line_breaks.txt delete mode 100644 test/prism/snapshots/seattlerb/array_lits_trailing_calls.txt delete mode 100644 test/prism/snapshots/seattlerb/assoc__bare.txt delete mode 100644 test/prism/snapshots/seattlerb/assoc_label.txt delete mode 100644 test/prism/snapshots/seattlerb/attr_asgn_colon_id.txt delete mode 100644 test/prism/snapshots/seattlerb/attrasgn_array_arg.txt delete mode 100644 test/prism/snapshots/seattlerb/attrasgn_array_lhs.txt delete mode 100644 test/prism/snapshots/seattlerb/attrasgn_primary_dot_constant.txt delete mode 100644 test/prism/snapshots/seattlerb/backticks_interpolation_line.txt delete mode 100644 test/prism/snapshots/seattlerb/bang_eq.txt delete mode 100644 test/prism/snapshots/seattlerb/bdot2.txt delete mode 100644 test/prism/snapshots/seattlerb/bdot3.txt delete mode 100644 test/prism/snapshots/seattlerb/begin_ensure_no_bodies.txt delete mode 100644 test/prism/snapshots/seattlerb/begin_rescue_else_ensure_bodies.txt delete mode 100644 test/prism/snapshots/seattlerb/begin_rescue_else_ensure_no_bodies.txt delete mode 100644 test/prism/snapshots/seattlerb/begin_rescue_ensure_no_bodies.txt delete mode 100644 test/prism/snapshots/seattlerb/block_arg__bare.txt delete mode 100644 test/prism/snapshots/seattlerb/block_arg_kwsplat.txt delete mode 100644 test/prism/snapshots/seattlerb/block_arg_opt_arg_block.txt delete mode 100644 test/prism/snapshots/seattlerb/block_arg_opt_splat.txt delete mode 100644 test/prism/snapshots/seattlerb/block_arg_opt_splat_arg_block_omfg.txt delete mode 100644 test/prism/snapshots/seattlerb/block_arg_optional.txt delete mode 100644 test/prism/snapshots/seattlerb/block_arg_scope.txt delete mode 100644 test/prism/snapshots/seattlerb/block_arg_scope2.txt delete mode 100644 test/prism/snapshots/seattlerb/block_arg_splat_arg.txt delete mode 100644 test/prism/snapshots/seattlerb/block_args_kwargs.txt delete mode 100644 test/prism/snapshots/seattlerb/block_args_no_kwargs.txt delete mode 100644 test/prism/snapshots/seattlerb/block_args_opt1.txt delete mode 100644 test/prism/snapshots/seattlerb/block_args_opt2.txt delete mode 100644 test/prism/snapshots/seattlerb/block_args_opt2_2.txt delete mode 100644 test/prism/snapshots/seattlerb/block_args_opt3.txt delete mode 100644 test/prism/snapshots/seattlerb/block_call_defn_call_block_call.txt delete mode 100644 test/prism/snapshots/seattlerb/block_call_dot_op2_brace_block.txt delete mode 100644 test/prism/snapshots/seattlerb/block_call_dot_op2_cmd_args_do_block.txt delete mode 100644 test/prism/snapshots/seattlerb/block_call_operation_colon.txt delete mode 100644 test/prism/snapshots/seattlerb/block_call_operation_dot.txt delete mode 100644 test/prism/snapshots/seattlerb/block_call_paren_call_block_call.txt delete mode 100644 test/prism/snapshots/seattlerb/block_command_operation_colon.txt delete mode 100644 test/prism/snapshots/seattlerb/block_command_operation_dot.txt delete mode 100644 test/prism/snapshots/seattlerb/block_decomp_anon_splat_arg.txt delete mode 100644 test/prism/snapshots/seattlerb/block_decomp_arg_splat.txt delete mode 100644 test/prism/snapshots/seattlerb/block_decomp_arg_splat_arg.txt delete mode 100644 test/prism/snapshots/seattlerb/block_decomp_splat.txt delete mode 100644 test/prism/snapshots/seattlerb/block_kw.txt delete mode 100644 test/prism/snapshots/seattlerb/block_kw__required.txt delete mode 100644 test/prism/snapshots/seattlerb/block_kwarg_lvar.txt delete mode 100644 test/prism/snapshots/seattlerb/block_kwarg_lvar_multiple.txt delete mode 100644 test/prism/snapshots/seattlerb/block_opt_arg.txt delete mode 100644 test/prism/snapshots/seattlerb/block_opt_splat.txt delete mode 100644 test/prism/snapshots/seattlerb/block_opt_splat_arg_block_omfg.txt delete mode 100644 test/prism/snapshots/seattlerb/block_optarg.txt delete mode 100644 test/prism/snapshots/seattlerb/block_paren_splat.txt delete mode 100644 test/prism/snapshots/seattlerb/block_reg_optarg.txt delete mode 100644 test/prism/snapshots/seattlerb/block_return.txt delete mode 100644 test/prism/snapshots/seattlerb/block_scope.txt delete mode 100644 test/prism/snapshots/seattlerb/block_splat_reg.txt delete mode 100644 test/prism/snapshots/seattlerb/bug169.txt delete mode 100644 test/prism/snapshots/seattlerb/bug179.txt delete mode 100644 test/prism/snapshots/seattlerb/bug190.txt delete mode 100644 test/prism/snapshots/seattlerb/bug191.txt delete mode 100644 test/prism/snapshots/seattlerb/bug202.txt delete mode 100644 test/prism/snapshots/seattlerb/bug236.txt delete mode 100644 test/prism/snapshots/seattlerb/bug290.txt delete mode 100644 test/prism/snapshots/seattlerb/bug_187.txt delete mode 100644 test/prism/snapshots/seattlerb/bug_215.txt delete mode 100644 test/prism/snapshots/seattlerb/bug_249.txt delete mode 100644 test/prism/snapshots/seattlerb/bug_and.txt delete mode 100644 test/prism/snapshots/seattlerb/bug_args__19.txt delete mode 100644 test/prism/snapshots/seattlerb/bug_args_masgn.txt delete mode 100644 test/prism/snapshots/seattlerb/bug_args_masgn2.txt delete mode 100644 test/prism/snapshots/seattlerb/bug_args_masgn_outer_parens__19.txt delete mode 100644 test/prism/snapshots/seattlerb/bug_call_arglist_parens.txt delete mode 100644 test/prism/snapshots/seattlerb/bug_case_when_regexp.txt delete mode 100644 test/prism/snapshots/seattlerb/bug_comma.txt delete mode 100644 test/prism/snapshots/seattlerb/bug_cond_pct.txt delete mode 100644 test/prism/snapshots/seattlerb/bug_hash_args.txt delete mode 100644 test/prism/snapshots/seattlerb/bug_hash_args_trailing_comma.txt delete mode 100644 test/prism/snapshots/seattlerb/bug_hash_interp_array.txt delete mode 100644 test/prism/snapshots/seattlerb/bug_masgn_right.txt delete mode 100644 test/prism/snapshots/seattlerb/bug_not_parens.txt delete mode 100644 test/prism/snapshots/seattlerb/bug_op_asgn_rescue.txt delete mode 100644 test/prism/snapshots/seattlerb/call_and.txt delete mode 100644 test/prism/snapshots/seattlerb/call_arg_assoc.txt delete mode 100644 test/prism/snapshots/seattlerb/call_arg_assoc_kwsplat.txt delete mode 100644 test/prism/snapshots/seattlerb/call_arg_kwsplat.txt delete mode 100644 test/prism/snapshots/seattlerb/call_args_assoc_quoted.txt delete mode 100644 test/prism/snapshots/seattlerb/call_args_assoc_trailing_comma.txt delete mode 100644 test/prism/snapshots/seattlerb/call_args_command.txt delete mode 100644 test/prism/snapshots/seattlerb/call_array_arg.txt delete mode 100644 test/prism/snapshots/seattlerb/call_array_block_call.txt delete mode 100644 test/prism/snapshots/seattlerb/call_array_lambda_block_call.txt delete mode 100644 test/prism/snapshots/seattlerb/call_array_lit_inline_hash.txt delete mode 100644 test/prism/snapshots/seattlerb/call_assoc.txt delete mode 100644 test/prism/snapshots/seattlerb/call_assoc_new.txt delete mode 100644 test/prism/snapshots/seattlerb/call_assoc_new_if_multiline.txt delete mode 100644 test/prism/snapshots/seattlerb/call_assoc_trailing_comma.txt delete mode 100644 test/prism/snapshots/seattlerb/call_bang_command_call.txt delete mode 100644 test/prism/snapshots/seattlerb/call_bang_squiggle.txt delete mode 100644 test/prism/snapshots/seattlerb/call_begin_call_block_call.txt delete mode 100644 test/prism/snapshots/seattlerb/call_block_arg_named.txt delete mode 100644 test/prism/snapshots/seattlerb/call_carat.txt delete mode 100644 test/prism/snapshots/seattlerb/call_colon2.txt delete mode 100644 test/prism/snapshots/seattlerb/call_colon_parens.txt delete mode 100644 test/prism/snapshots/seattlerb/call_div.txt delete mode 100644 test/prism/snapshots/seattlerb/call_dot_parens.txt delete mode 100644 test/prism/snapshots/seattlerb/call_env.txt delete mode 100644 test/prism/snapshots/seattlerb/call_eq3.txt delete mode 100644 test/prism/snapshots/seattlerb/call_gt.txt delete mode 100644 test/prism/snapshots/seattlerb/call_kwsplat.txt delete mode 100644 test/prism/snapshots/seattlerb/call_leading_dots.txt delete mode 100644 test/prism/snapshots/seattlerb/call_leading_dots_comment.txt delete mode 100644 test/prism/snapshots/seattlerb/call_lt.txt delete mode 100644 test/prism/snapshots/seattlerb/call_lte.txt delete mode 100644 test/prism/snapshots/seattlerb/call_not.txt delete mode 100644 test/prism/snapshots/seattlerb/call_pipe.txt delete mode 100644 test/prism/snapshots/seattlerb/call_rshift.txt delete mode 100644 test/prism/snapshots/seattlerb/call_self_brackets.txt delete mode 100644 test/prism/snapshots/seattlerb/call_spaceship.txt delete mode 100644 test/prism/snapshots/seattlerb/call_stabby_do_end_with_block.txt delete mode 100644 test/prism/snapshots/seattlerb/call_stabby_with_braces_block.txt delete mode 100644 test/prism/snapshots/seattlerb/call_star.txt delete mode 100644 test/prism/snapshots/seattlerb/call_star2.txt delete mode 100644 test/prism/snapshots/seattlerb/call_trailing_comma.txt delete mode 100644 test/prism/snapshots/seattlerb/call_trailing_dots.txt delete mode 100644 test/prism/snapshots/seattlerb/call_unary_bang.txt delete mode 100644 test/prism/snapshots/seattlerb/case_in.txt delete mode 100644 test/prism/snapshots/seattlerb/case_in_31.txt delete mode 100644 test/prism/snapshots/seattlerb/case_in_37.txt delete mode 100644 test/prism/snapshots/seattlerb/case_in_42.txt delete mode 100644 test/prism/snapshots/seattlerb/case_in_42_2.txt delete mode 100644 test/prism/snapshots/seattlerb/case_in_47.txt delete mode 100644 test/prism/snapshots/seattlerb/case_in_67.txt delete mode 100644 test/prism/snapshots/seattlerb/case_in_86.txt delete mode 100644 test/prism/snapshots/seattlerb/case_in_86_2.txt delete mode 100644 test/prism/snapshots/seattlerb/case_in_array_pat_const.txt delete mode 100644 test/prism/snapshots/seattlerb/case_in_array_pat_const2.txt delete mode 100644 test/prism/snapshots/seattlerb/case_in_array_pat_paren_assign.txt delete mode 100644 test/prism/snapshots/seattlerb/case_in_const.txt delete mode 100644 test/prism/snapshots/seattlerb/case_in_else.txt delete mode 100644 test/prism/snapshots/seattlerb/case_in_find.txt delete mode 100644 test/prism/snapshots/seattlerb/case_in_find_array.txt delete mode 100644 test/prism/snapshots/seattlerb/case_in_hash_pat.txt delete mode 100644 test/prism/snapshots/seattlerb/case_in_hash_pat_assign.txt delete mode 100644 test/prism/snapshots/seattlerb/case_in_hash_pat_paren_assign.txt delete mode 100644 test/prism/snapshots/seattlerb/case_in_hash_pat_paren_true.txt delete mode 100644 test/prism/snapshots/seattlerb/case_in_hash_pat_rest.txt delete mode 100644 test/prism/snapshots/seattlerb/case_in_hash_pat_rest_solo.txt delete mode 100644 test/prism/snapshots/seattlerb/case_in_if_unless_post_mod.txt delete mode 100644 test/prism/snapshots/seattlerb/case_in_multiple.txt delete mode 100644 test/prism/snapshots/seattlerb/case_in_or.txt delete mode 100644 test/prism/snapshots/seattlerb/class_comments.txt delete mode 100644 test/prism/snapshots/seattlerb/cond_unary_minus.txt delete mode 100644 test/prism/snapshots/seattlerb/const_2_op_asgn_or2.txt delete mode 100644 test/prism/snapshots/seattlerb/const_3_op_asgn_or.txt delete mode 100644 test/prism/snapshots/seattlerb/const_op_asgn_and1.txt delete mode 100644 test/prism/snapshots/seattlerb/const_op_asgn_and2.txt delete mode 100644 test/prism/snapshots/seattlerb/const_op_asgn_or.txt delete mode 100644 test/prism/snapshots/seattlerb/defined_eh_parens.txt delete mode 100644 test/prism/snapshots/seattlerb/defn_arg_asplat_arg.txt delete mode 100644 test/prism/snapshots/seattlerb/defn_arg_forward_args.txt delete mode 100644 test/prism/snapshots/seattlerb/defn_args_forward_args.txt delete mode 100644 test/prism/snapshots/seattlerb/defn_comments.txt delete mode 100644 test/prism/snapshots/seattlerb/defn_endless_command.txt delete mode 100644 test/prism/snapshots/seattlerb/defn_endless_command_rescue.txt delete mode 100644 test/prism/snapshots/seattlerb/defn_forward_args.txt delete mode 100644 test/prism/snapshots/seattlerb/defn_forward_args__no_parens.txt delete mode 100644 test/prism/snapshots/seattlerb/defn_kwarg_env.txt delete mode 100644 test/prism/snapshots/seattlerb/defn_kwarg_kwarg.txt delete mode 100644 test/prism/snapshots/seattlerb/defn_kwarg_kwsplat.txt delete mode 100644 test/prism/snapshots/seattlerb/defn_kwarg_kwsplat_anon.txt delete mode 100644 test/prism/snapshots/seattlerb/defn_kwarg_lvar.txt delete mode 100644 test/prism/snapshots/seattlerb/defn_kwarg_no_parens.txt delete mode 100644 test/prism/snapshots/seattlerb/defn_kwarg_val.txt delete mode 100644 test/prism/snapshots/seattlerb/defn_no_kwargs.txt delete mode 100644 test/prism/snapshots/seattlerb/defn_oneliner.txt delete mode 100644 test/prism/snapshots/seattlerb/defn_oneliner_eq2.txt delete mode 100644 test/prism/snapshots/seattlerb/defn_oneliner_noargs.txt delete mode 100644 test/prism/snapshots/seattlerb/defn_oneliner_noargs_parentheses.txt delete mode 100644 test/prism/snapshots/seattlerb/defn_oneliner_rescue.txt delete mode 100644 test/prism/snapshots/seattlerb/defn_opt_last_arg.txt delete mode 100644 test/prism/snapshots/seattlerb/defn_opt_reg.txt delete mode 100644 test/prism/snapshots/seattlerb/defn_opt_splat_arg.txt delete mode 100644 test/prism/snapshots/seattlerb/defn_powarg.txt delete mode 100644 test/prism/snapshots/seattlerb/defn_reg_opt_reg.txt delete mode 100644 test/prism/snapshots/seattlerb/defn_splat_arg.txt delete mode 100644 test/prism/snapshots/seattlerb/defn_unary_not.txt delete mode 100644 test/prism/snapshots/seattlerb/defns_reserved.txt delete mode 100644 test/prism/snapshots/seattlerb/defs_as_arg_with_do_block_inside.txt delete mode 100644 test/prism/snapshots/seattlerb/defs_comments.txt delete mode 100644 test/prism/snapshots/seattlerb/defs_endless_command.txt delete mode 100644 test/prism/snapshots/seattlerb/defs_endless_command_rescue.txt delete mode 100644 test/prism/snapshots/seattlerb/defs_kwarg.txt delete mode 100644 test/prism/snapshots/seattlerb/defs_oneliner.txt delete mode 100644 test/prism/snapshots/seattlerb/defs_oneliner_eq2.txt delete mode 100644 test/prism/snapshots/seattlerb/defs_oneliner_rescue.txt delete mode 100644 test/prism/snapshots/seattlerb/difficult0_.txt delete mode 100644 test/prism/snapshots/seattlerb/difficult1_line_numbers.txt delete mode 100644 test/prism/snapshots/seattlerb/difficult1_line_numbers2.txt delete mode 100644 test/prism/snapshots/seattlerb/difficult2_.txt delete mode 100644 test/prism/snapshots/seattlerb/difficult3_.txt delete mode 100644 test/prism/snapshots/seattlerb/difficult3_2.txt delete mode 100644 test/prism/snapshots/seattlerb/difficult3_3.txt delete mode 100644 test/prism/snapshots/seattlerb/difficult3_4.txt delete mode 100644 test/prism/snapshots/seattlerb/difficult3_5.txt delete mode 100644 test/prism/snapshots/seattlerb/difficult3__10.txt delete mode 100644 test/prism/snapshots/seattlerb/difficult3__11.txt delete mode 100644 test/prism/snapshots/seattlerb/difficult3__12.txt delete mode 100644 test/prism/snapshots/seattlerb/difficult3__6.txt delete mode 100644 test/prism/snapshots/seattlerb/difficult3__7.txt delete mode 100644 test/prism/snapshots/seattlerb/difficult3__8.txt delete mode 100644 test/prism/snapshots/seattlerb/difficult3__9.txt delete mode 100644 test/prism/snapshots/seattlerb/difficult4__leading_dots.txt delete mode 100644 test/prism/snapshots/seattlerb/difficult4__leading_dots2.txt delete mode 100644 test/prism/snapshots/seattlerb/difficult6_.txt delete mode 100644 test/prism/snapshots/seattlerb/difficult6__7.txt delete mode 100644 test/prism/snapshots/seattlerb/difficult6__8.txt delete mode 100644 test/prism/snapshots/seattlerb/difficult7_.txt delete mode 100644 test/prism/snapshots/seattlerb/do_bug.txt delete mode 100644 test/prism/snapshots/seattlerb/do_lambda.txt delete mode 100644 test/prism/snapshots/seattlerb/dot2_nil__26.txt delete mode 100644 test/prism/snapshots/seattlerb/dot3_nil__26.txt delete mode 100644 test/prism/snapshots/seattlerb/dstr_evstr.txt delete mode 100644 test/prism/snapshots/seattlerb/dstr_evstr_empty_end.txt delete mode 100644 test/prism/snapshots/seattlerb/dstr_lex_state.txt delete mode 100644 test/prism/snapshots/seattlerb/dstr_str.txt delete mode 100644 test/prism/snapshots/seattlerb/dsym_esc_to_sym.txt delete mode 100644 test/prism/snapshots/seattlerb/dsym_to_sym.txt delete mode 100644 test/prism/snapshots/seattlerb/eq_begin_line_numbers.txt delete mode 100644 test/prism/snapshots/seattlerb/eq_begin_why_wont_people_use_their_spacebar.txt delete mode 100644 test/prism/snapshots/seattlerb/evstr_evstr.txt delete mode 100644 test/prism/snapshots/seattlerb/evstr_str.txt delete mode 100644 test/prism/snapshots/seattlerb/expr_not_bang.txt delete mode 100644 test/prism/snapshots/seattlerb/f_kw.txt delete mode 100644 test/prism/snapshots/seattlerb/f_kw__required.txt delete mode 100644 test/prism/snapshots/seattlerb/flip2_env_lvar.txt delete mode 100644 test/prism/snapshots/seattlerb/float_with_if_modifier.txt delete mode 100644 test/prism/snapshots/seattlerb/heredoc__backslash_dos_format.txt delete mode 100644 test/prism/snapshots/seattlerb/heredoc_backslash_nl.txt delete mode 100644 test/prism/snapshots/seattlerb/heredoc_bad_hex_escape.txt delete mode 100644 test/prism/snapshots/seattlerb/heredoc_bad_oct_escape.txt delete mode 100644 test/prism/snapshots/seattlerb/heredoc_comma_arg.txt delete mode 100644 test/prism/snapshots/seattlerb/heredoc_lineno.txt delete mode 100644 test/prism/snapshots/seattlerb/heredoc_nested.txt delete mode 100644 test/prism/snapshots/seattlerb/heredoc_squiggly.txt delete mode 100644 test/prism/snapshots/seattlerb/heredoc_squiggly_blank_line_plus_interpolation.txt delete mode 100644 test/prism/snapshots/seattlerb/heredoc_squiggly_blank_lines.txt delete mode 100644 test/prism/snapshots/seattlerb/heredoc_squiggly_empty.txt delete mode 100644 test/prism/snapshots/seattlerb/heredoc_squiggly_interp.txt delete mode 100644 test/prism/snapshots/seattlerb/heredoc_squiggly_no_indent.txt delete mode 100644 test/prism/snapshots/seattlerb/heredoc_squiggly_tabs.txt delete mode 100644 test/prism/snapshots/seattlerb/heredoc_squiggly_tabs_extra.txt delete mode 100644 test/prism/snapshots/seattlerb/heredoc_squiggly_visually_blank_lines.txt delete mode 100644 test/prism/snapshots/seattlerb/heredoc_trailing_slash_continued_call.txt delete mode 100644 test/prism/snapshots/seattlerb/heredoc_unicode.txt delete mode 100644 test/prism/snapshots/seattlerb/heredoc_with_carriage_return_escapes.txt delete mode 100644 test/prism/snapshots/seattlerb/heredoc_with_carriage_return_escapes_windows.txt delete mode 100644 test/prism/snapshots/seattlerb/heredoc_with_extra_carriage_horrible_mix.txt delete mode 100644 test/prism/snapshots/seattlerb/heredoc_with_extra_carriage_returns.txt delete mode 100644 test/prism/snapshots/seattlerb/heredoc_with_extra_carriage_returns_windows.txt delete mode 100644 test/prism/snapshots/seattlerb/heredoc_with_interpolation_and_carriage_return_escapes.txt delete mode 100644 test/prism/snapshots/seattlerb/heredoc_with_interpolation_and_carriage_return_escapes_windows.txt delete mode 100644 test/prism/snapshots/seattlerb/heredoc_with_not_global_interpolation.txt delete mode 100644 test/prism/snapshots/seattlerb/heredoc_with_only_carriage_returns.txt delete mode 100644 test/prism/snapshots/seattlerb/heredoc_with_only_carriage_returns_windows.txt delete mode 100644 test/prism/snapshots/seattlerb/if_elsif.txt delete mode 100644 test/prism/snapshots/seattlerb/if_symbol.txt delete mode 100644 test/prism/snapshots/seattlerb/in_expr_no_case.txt delete mode 100644 test/prism/snapshots/seattlerb/index_0.txt delete mode 100644 test/prism/snapshots/seattlerb/index_0_opasgn.txt delete mode 100644 test/prism/snapshots/seattlerb/integer_with_if_modifier.txt delete mode 100644 test/prism/snapshots/seattlerb/interpolated_symbol_array_line_breaks.txt delete mode 100644 test/prism/snapshots/seattlerb/interpolated_word_array_line_breaks.txt delete mode 100644 test/prism/snapshots/seattlerb/iter_args_1.txt delete mode 100644 test/prism/snapshots/seattlerb/iter_args_10_1.txt delete mode 100644 test/prism/snapshots/seattlerb/iter_args_10_2.txt delete mode 100644 test/prism/snapshots/seattlerb/iter_args_11_1.txt delete mode 100644 test/prism/snapshots/seattlerb/iter_args_11_2.txt delete mode 100644 test/prism/snapshots/seattlerb/iter_args_2__19.txt delete mode 100644 test/prism/snapshots/seattlerb/iter_args_3.txt delete mode 100644 test/prism/snapshots/seattlerb/iter_args_4.txt delete mode 100644 test/prism/snapshots/seattlerb/iter_args_5.txt delete mode 100644 test/prism/snapshots/seattlerb/iter_args_6.txt delete mode 100644 test/prism/snapshots/seattlerb/iter_args_7_1.txt delete mode 100644 test/prism/snapshots/seattlerb/iter_args_7_2.txt delete mode 100644 test/prism/snapshots/seattlerb/iter_args_8_1.txt delete mode 100644 test/prism/snapshots/seattlerb/iter_args_8_2.txt delete mode 100644 test/prism/snapshots/seattlerb/iter_args_9_1.txt delete mode 100644 test/prism/snapshots/seattlerb/iter_args_9_2.txt delete mode 100644 test/prism/snapshots/seattlerb/iter_kwarg.txt delete mode 100644 test/prism/snapshots/seattlerb/iter_kwarg_kwsplat.txt delete mode 100644 test/prism/snapshots/seattlerb/label_vs_string.txt delete mode 100644 test/prism/snapshots/seattlerb/lambda_do_vs_brace.txt delete mode 100644 test/prism/snapshots/seattlerb/lasgn_arg_rescue_arg.txt delete mode 100644 test/prism/snapshots/seattlerb/lasgn_call_bracket_rescue_arg.txt delete mode 100644 test/prism/snapshots/seattlerb/lasgn_call_nobracket_rescue_arg.txt delete mode 100644 test/prism/snapshots/seattlerb/lasgn_command.txt delete mode 100644 test/prism/snapshots/seattlerb/lasgn_env.txt delete mode 100644 test/prism/snapshots/seattlerb/lasgn_ivar_env.txt delete mode 100644 test/prism/snapshots/seattlerb/lasgn_lasgn_command_call.txt delete mode 100644 test/prism/snapshots/seattlerb/lasgn_middle_splat.txt delete mode 100644 test/prism/snapshots/seattlerb/magic_encoding_comment.txt delete mode 100644 test/prism/snapshots/seattlerb/masgn_anon_splat_arg.txt delete mode 100644 test/prism/snapshots/seattlerb/masgn_arg_colon_arg.txt delete mode 100644 test/prism/snapshots/seattlerb/masgn_arg_ident.txt delete mode 100644 test/prism/snapshots/seattlerb/masgn_arg_splat_arg.txt delete mode 100644 test/prism/snapshots/seattlerb/masgn_colon2.txt delete mode 100644 test/prism/snapshots/seattlerb/masgn_colon3.txt delete mode 100644 test/prism/snapshots/seattlerb/masgn_command_call.txt delete mode 100644 test/prism/snapshots/seattlerb/masgn_double_paren.txt delete mode 100644 test/prism/snapshots/seattlerb/masgn_lhs_splat.txt delete mode 100644 test/prism/snapshots/seattlerb/masgn_paren.txt delete mode 100644 test/prism/snapshots/seattlerb/masgn_splat_arg.txt delete mode 100644 test/prism/snapshots/seattlerb/masgn_splat_arg_arg.txt delete mode 100644 test/prism/snapshots/seattlerb/masgn_star.txt delete mode 100644 test/prism/snapshots/seattlerb/masgn_var_star_var.txt delete mode 100644 test/prism/snapshots/seattlerb/messy_op_asgn_lineno.txt delete mode 100644 test/prism/snapshots/seattlerb/method_call_assoc_trailing_comma.txt delete mode 100644 test/prism/snapshots/seattlerb/method_call_trailing_comma.txt delete mode 100644 test/prism/snapshots/seattlerb/mlhs_back_anonsplat.txt delete mode 100644 test/prism/snapshots/seattlerb/mlhs_back_splat.txt delete mode 100644 test/prism/snapshots/seattlerb/mlhs_front_anonsplat.txt delete mode 100644 test/prism/snapshots/seattlerb/mlhs_front_splat.txt delete mode 100644 test/prism/snapshots/seattlerb/mlhs_keyword.txt delete mode 100644 test/prism/snapshots/seattlerb/mlhs_mid_anonsplat.txt delete mode 100644 test/prism/snapshots/seattlerb/mlhs_mid_splat.txt delete mode 100644 test/prism/snapshots/seattlerb/mlhs_rescue.txt delete mode 100644 test/prism/snapshots/seattlerb/module_comments.txt delete mode 100644 test/prism/snapshots/seattlerb/multiline_hash_declaration.txt delete mode 100644 test/prism/snapshots/seattlerb/non_interpolated_symbol_array_line_breaks.txt delete mode 100644 test/prism/snapshots/seattlerb/non_interpolated_word_array_line_breaks.txt delete mode 100644 test/prism/snapshots/seattlerb/op_asgn_command_call.txt delete mode 100644 test/prism/snapshots/seattlerb/op_asgn_dot_ident_command_call.txt delete mode 100644 test/prism/snapshots/seattlerb/op_asgn_index_command_call.txt delete mode 100644 test/prism/snapshots/seattlerb/op_asgn_primary_colon_const_command_call.txt delete mode 100644 test/prism/snapshots/seattlerb/op_asgn_primary_colon_identifier1.txt delete mode 100644 test/prism/snapshots/seattlerb/op_asgn_primary_colon_identifier_command_call.txt delete mode 100644 test/prism/snapshots/seattlerb/op_asgn_val_dot_ident_command_call.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_def_special_name.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_if_not_canonical.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_if_not_noncanonical.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_line_block.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_line_block_inline_comment.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_line_block_inline_comment_leading_newlines.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_line_block_inline_multiline_comment.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_line_call_ivar_arg_no_parens_line_break.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_line_call_ivar_line_break_paren.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_line_call_no_args.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_line_defn_complex.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_line_defn_no_parens.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_line_defn_no_parens_args.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_line_dot2.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_line_dot2_open.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_line_dot3.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_line_dot3_open.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_line_dstr_escaped_newline.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_line_dstr_soft_newline.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_line_evstr_after_break.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_line_hash_lit.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_line_heredoc.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_line_heredoc_evstr.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_line_heredoc_hardnewline.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_line_heredoc_regexp_chars.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_line_iter_call_no_parens.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_line_iter_call_parens.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_line_multiline_str.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_line_multiline_str_literal_n.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_line_newlines.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_line_op_asgn.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_line_postexe.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_line_preexe.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_line_rescue.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_line_return.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_line_str_with_newline_escape.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_line_to_ary.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_line_trailing_newlines.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_opt_call_args_assocs_comma.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_opt_call_args_lit_comma.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_pattern_019.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_pattern_044.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_pattern_051.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_pattern_058.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_pattern_058_2.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_pattern_069.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_pattern_076.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_until_not_canonical.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_until_not_noncanonical.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_while_not_canonical.txt delete mode 100644 test/prism/snapshots/seattlerb/parse_while_not_noncanonical.txt delete mode 100644 test/prism/snapshots/seattlerb/pctW_lineno.txt delete mode 100644 test/prism/snapshots/seattlerb/pct_Q_backslash_nl.txt delete mode 100644 test/prism/snapshots/seattlerb/pct_nl.txt delete mode 100644 test/prism/snapshots/seattlerb/pct_w_heredoc_interp_nested.txt delete mode 100644 test/prism/snapshots/seattlerb/pipe_semicolon.txt delete mode 100644 test/prism/snapshots/seattlerb/pipe_space.txt delete mode 100644 test/prism/snapshots/seattlerb/qWords_space.txt delete mode 100644 test/prism/snapshots/seattlerb/qsymbols.txt delete mode 100644 test/prism/snapshots/seattlerb/qsymbols_empty.txt delete mode 100644 test/prism/snapshots/seattlerb/qsymbols_empty_space.txt delete mode 100644 test/prism/snapshots/seattlerb/qsymbols_interp.txt delete mode 100644 test/prism/snapshots/seattlerb/quoted_symbol_hash_arg.txt delete mode 100644 test/prism/snapshots/seattlerb/quoted_symbol_keys.txt delete mode 100644 test/prism/snapshots/seattlerb/qw_escape.txt delete mode 100644 test/prism/snapshots/seattlerb/qw_escape_term.txt delete mode 100644 test/prism/snapshots/seattlerb/qwords_empty.txt delete mode 100644 test/prism/snapshots/seattlerb/read_escape_unicode_curlies.txt delete mode 100644 test/prism/snapshots/seattlerb/read_escape_unicode_h4.txt delete mode 100644 test/prism/snapshots/seattlerb/regexp.txt delete mode 100644 test/prism/snapshots/seattlerb/regexp_esc_C_slash.txt delete mode 100644 test/prism/snapshots/seattlerb/regexp_esc_u.txt delete mode 100644 test/prism/snapshots/seattlerb/regexp_escape_extended.txt delete mode 100644 test/prism/snapshots/seattlerb/regexp_unicode_curlies.txt delete mode 100644 test/prism/snapshots/seattlerb/required_kwarg_no_value.txt delete mode 100644 test/prism/snapshots/seattlerb/rescue_do_end_ensure_result.txt delete mode 100644 test/prism/snapshots/seattlerb/rescue_do_end_no_raise.txt delete mode 100644 test/prism/snapshots/seattlerb/rescue_do_end_raised.txt delete mode 100644 test/prism/snapshots/seattlerb/rescue_do_end_rescued.txt delete mode 100644 test/prism/snapshots/seattlerb/rescue_in_block.txt delete mode 100644 test/prism/snapshots/seattlerb/rescue_parens.txt delete mode 100644 test/prism/snapshots/seattlerb/return_call_assocs.txt delete mode 100644 test/prism/snapshots/seattlerb/rhs_asgn.txt delete mode 100644 test/prism/snapshots/seattlerb/ruby21_numbers.txt delete mode 100644 test/prism/snapshots/seattlerb/safe_attrasgn.txt delete mode 100644 test/prism/snapshots/seattlerb/safe_attrasgn_constant.txt delete mode 100644 test/prism/snapshots/seattlerb/safe_call.txt delete mode 100644 test/prism/snapshots/seattlerb/safe_call_after_newline.txt delete mode 100644 test/prism/snapshots/seattlerb/safe_call_dot_parens.txt delete mode 100644 test/prism/snapshots/seattlerb/safe_call_newline.txt delete mode 100644 test/prism/snapshots/seattlerb/safe_call_operator.txt delete mode 100644 test/prism/snapshots/seattlerb/safe_call_rhs_newline.txt delete mode 100644 test/prism/snapshots/seattlerb/safe_calls.txt delete mode 100644 test/prism/snapshots/seattlerb/safe_op_asgn.txt delete mode 100644 test/prism/snapshots/seattlerb/safe_op_asgn2.txt delete mode 100644 test/prism/snapshots/seattlerb/slashy_newlines_within_string.txt delete mode 100644 test/prism/snapshots/seattlerb/stabby_arg_no_paren.txt delete mode 100644 test/prism/snapshots/seattlerb/stabby_arg_opt_splat_arg_block_omfg.txt delete mode 100644 test/prism/snapshots/seattlerb/stabby_block_iter_call.txt delete mode 100644 test/prism/snapshots/seattlerb/stabby_block_iter_call_no_target_with_arg.txt delete mode 100644 test/prism/snapshots/seattlerb/stabby_block_kw.txt delete mode 100644 test/prism/snapshots/seattlerb/stabby_block_kw__required.txt delete mode 100644 test/prism/snapshots/seattlerb/stabby_proc_scope.txt delete mode 100644 test/prism/snapshots/seattlerb/str_backslashes.txt delete mode 100644 test/prism/snapshots/seattlerb/str_double_double_escaped_newline.txt delete mode 100644 test/prism/snapshots/seattlerb/str_double_escaped_newline.txt delete mode 100644 test/prism/snapshots/seattlerb/str_double_newline.txt delete mode 100644 test/prism/snapshots/seattlerb/str_evstr.txt delete mode 100644 test/prism/snapshots/seattlerb/str_evstr_escape.txt delete mode 100644 test/prism/snapshots/seattlerb/str_heredoc_interp.txt delete mode 100644 test/prism/snapshots/seattlerb/str_interp_ternary_or_label.txt delete mode 100644 test/prism/snapshots/seattlerb/str_lit_concat_bad_encodings.txt delete mode 100644 test/prism/snapshots/seattlerb/str_newline_hash_line_number.txt delete mode 100644 test/prism/snapshots/seattlerb/str_pct_Q_nested.txt delete mode 100644 test/prism/snapshots/seattlerb/str_pct_nested_nested.txt delete mode 100644 test/prism/snapshots/seattlerb/str_pct_q.txt delete mode 100644 test/prism/snapshots/seattlerb/str_single_double_escaped_newline.txt delete mode 100644 test/prism/snapshots/seattlerb/str_single_escaped_newline.txt delete mode 100644 test/prism/snapshots/seattlerb/str_single_newline.txt delete mode 100644 test/prism/snapshots/seattlerb/str_str.txt delete mode 100644 test/prism/snapshots/seattlerb/str_str_str.txt delete mode 100644 test/prism/snapshots/seattlerb/super_arg.txt delete mode 100644 test/prism/snapshots/seattlerb/symbol_empty.txt delete mode 100644 test/prism/snapshots/seattlerb/symbol_list.txt delete mode 100644 test/prism/snapshots/seattlerb/symbols.txt delete mode 100644 test/prism/snapshots/seattlerb/symbols_empty.txt delete mode 100644 test/prism/snapshots/seattlerb/symbols_empty_space.txt delete mode 100644 test/prism/snapshots/seattlerb/symbols_interp.txt delete mode 100644 test/prism/snapshots/seattlerb/thingy.txt delete mode 100644 test/prism/snapshots/seattlerb/uminus_float.txt delete mode 100644 test/prism/snapshots/seattlerb/unary_minus.txt delete mode 100644 test/prism/snapshots/seattlerb/unary_plus.txt delete mode 100644 test/prism/snapshots/seattlerb/unary_plus_on_literal.txt delete mode 100644 test/prism/snapshots/seattlerb/unary_tilde.txt delete mode 100644 test/prism/snapshots/seattlerb/utf8_bom.txt delete mode 100644 test/prism/snapshots/seattlerb/when_splat.txt delete mode 100644 test/prism/snapshots/seattlerb/words_interp.txt delete mode 100644 test/prism/snapshots/single_method_call_with_bang.txt delete mode 100644 test/prism/snapshots/single_quote_heredocs.txt delete mode 100644 test/prism/snapshots/spanning_heredoc.txt delete mode 100644 test/prism/snapshots/spanning_heredoc_newlines.txt delete mode 100644 test/prism/snapshots/strings.txt delete mode 100644 test/prism/snapshots/super.txt delete mode 100644 test/prism/snapshots/symbols.txt delete mode 100644 test/prism/snapshots/ternary_operator.txt delete mode 100644 test/prism/snapshots/tilde_heredocs.txt delete mode 100644 test/prism/snapshots/undef.txt delete mode 100644 test/prism/snapshots/unescaping.txt delete mode 100644 test/prism/snapshots/unless.txt delete mode 100644 test/prism/snapshots/unparser/corpus/literal/alias.txt delete mode 100644 test/prism/snapshots/unparser/corpus/literal/assignment.txt delete mode 100644 test/prism/snapshots/unparser/corpus/literal/block.txt delete mode 100644 test/prism/snapshots/unparser/corpus/literal/case.txt delete mode 100644 test/prism/snapshots/unparser/corpus/literal/class.txt delete mode 100644 test/prism/snapshots/unparser/corpus/literal/def.txt delete mode 100644 test/prism/snapshots/unparser/corpus/literal/defined.txt delete mode 100644 test/prism/snapshots/unparser/corpus/literal/defs.txt delete mode 100644 test/prism/snapshots/unparser/corpus/literal/dstr.txt delete mode 100644 test/prism/snapshots/unparser/corpus/literal/empty.txt delete mode 100644 test/prism/snapshots/unparser/corpus/literal/empty_begin.txt delete mode 100644 test/prism/snapshots/unparser/corpus/literal/flipflop.txt delete mode 100644 test/prism/snapshots/unparser/corpus/literal/for.txt delete mode 100644 test/prism/snapshots/unparser/corpus/literal/hookexe.txt delete mode 100644 test/prism/snapshots/unparser/corpus/literal/if.txt delete mode 100644 test/prism/snapshots/unparser/corpus/literal/kwbegin.txt delete mode 100644 test/prism/snapshots/unparser/corpus/literal/lambda.txt delete mode 100644 test/prism/snapshots/unparser/corpus/literal/literal.txt delete mode 100644 test/prism/snapshots/unparser/corpus/literal/module.txt delete mode 100644 test/prism/snapshots/unparser/corpus/literal/opasgn.txt delete mode 100644 test/prism/snapshots/unparser/corpus/literal/pattern.txt delete mode 100644 test/prism/snapshots/unparser/corpus/literal/pragma.txt delete mode 100644 test/prism/snapshots/unparser/corpus/literal/range.txt delete mode 100644 test/prism/snapshots/unparser/corpus/literal/rescue.txt delete mode 100644 test/prism/snapshots/unparser/corpus/literal/send.txt delete mode 100644 test/prism/snapshots/unparser/corpus/literal/since/27.txt delete mode 100644 test/prism/snapshots/unparser/corpus/literal/since/30.txt delete mode 100644 test/prism/snapshots/unparser/corpus/literal/since/31.txt delete mode 100644 test/prism/snapshots/unparser/corpus/literal/since/32.txt delete mode 100644 test/prism/snapshots/unparser/corpus/literal/singletons.txt delete mode 100644 test/prism/snapshots/unparser/corpus/literal/super.txt delete mode 100644 test/prism/snapshots/unparser/corpus/literal/unary.txt delete mode 100644 test/prism/snapshots/unparser/corpus/literal/undef.txt delete mode 100644 test/prism/snapshots/unparser/corpus/literal/variables.txt delete mode 100644 test/prism/snapshots/unparser/corpus/literal/while.txt delete mode 100644 test/prism/snapshots/unparser/corpus/semantic/and.txt delete mode 100644 test/prism/snapshots/unparser/corpus/semantic/block.txt delete mode 100644 test/prism/snapshots/unparser/corpus/semantic/def.txt delete mode 100644 test/prism/snapshots/unparser/corpus/semantic/dstr.txt delete mode 100644 test/prism/snapshots/unparser/corpus/semantic/kwbegin.txt delete mode 100644 test/prism/snapshots/unparser/corpus/semantic/literal.txt delete mode 100644 test/prism/snapshots/unparser/corpus/semantic/opasgn.txt delete mode 100644 test/prism/snapshots/unparser/corpus/semantic/send.txt delete mode 100644 test/prism/snapshots/unparser/corpus/semantic/undef.txt delete mode 100644 test/prism/snapshots/unparser/corpus/semantic/while.txt delete mode 100644 test/prism/snapshots/until.txt delete mode 100644 test/prism/snapshots/variables.txt delete mode 100644 test/prism/snapshots/while.txt delete mode 100644 test/prism/snapshots/whitequark/__ENCODING__.txt delete mode 100644 test/prism/snapshots/whitequark/__ENCODING___legacy_.txt delete mode 100644 test/prism/snapshots/whitequark/alias.txt delete mode 100644 test/prism/snapshots/whitequark/alias_gvar.txt delete mode 100644 test/prism/snapshots/whitequark/ambiuous_quoted_label_in_ternary_operator.txt delete mode 100644 test/prism/snapshots/whitequark/and.txt delete mode 100644 test/prism/snapshots/whitequark/and_asgn.txt delete mode 100644 test/prism/snapshots/whitequark/and_or_masgn.txt delete mode 100644 test/prism/snapshots/whitequark/anonymous_blockarg.txt delete mode 100644 test/prism/snapshots/whitequark/arg.txt delete mode 100644 test/prism/snapshots/whitequark/arg_duplicate_ignored.txt delete mode 100644 test/prism/snapshots/whitequark/arg_label.txt delete mode 100644 test/prism/snapshots/whitequark/arg_scope.txt delete mode 100644 test/prism/snapshots/whitequark/args.txt delete mode 100644 test/prism/snapshots/whitequark/args_args_assocs.txt delete mode 100644 test/prism/snapshots/whitequark/args_args_assocs_comma.txt delete mode 100644 test/prism/snapshots/whitequark/args_args_comma.txt delete mode 100644 test/prism/snapshots/whitequark/args_args_star.txt delete mode 100644 test/prism/snapshots/whitequark/args_assocs_comma.txt delete mode 100644 test/prism/snapshots/whitequark/args_block_pass.txt delete mode 100644 test/prism/snapshots/whitequark/args_cmd.txt delete mode 100644 test/prism/snapshots/whitequark/args_star.txt delete mode 100644 test/prism/snapshots/whitequark/array_assocs.txt delete mode 100644 test/prism/snapshots/whitequark/array_plain.txt delete mode 100644 test/prism/snapshots/whitequark/array_splat.txt delete mode 100644 test/prism/snapshots/whitequark/array_symbols.txt delete mode 100644 test/prism/snapshots/whitequark/array_symbols_empty.txt delete mode 100644 test/prism/snapshots/whitequark/array_symbols_interp.txt delete mode 100644 test/prism/snapshots/whitequark/array_words.txt delete mode 100644 test/prism/snapshots/whitequark/array_words_empty.txt delete mode 100644 test/prism/snapshots/whitequark/array_words_interp.txt delete mode 100644 test/prism/snapshots/whitequark/asgn_cmd.txt delete mode 100644 test/prism/snapshots/whitequark/asgn_mrhs.txt delete mode 100644 test/prism/snapshots/whitequark/back_ref.txt delete mode 100644 test/prism/snapshots/whitequark/bang.txt delete mode 100644 test/prism/snapshots/whitequark/bang_cmd.txt delete mode 100644 test/prism/snapshots/whitequark/begin_cmdarg.txt delete mode 100644 test/prism/snapshots/whitequark/beginless_erange_after_newline.txt delete mode 100644 test/prism/snapshots/whitequark/beginless_irange_after_newline.txt delete mode 100644 test/prism/snapshots/whitequark/beginless_range.txt delete mode 100644 test/prism/snapshots/whitequark/blockarg.txt delete mode 100644 test/prism/snapshots/whitequark/blockargs.txt delete mode 100644 test/prism/snapshots/whitequark/bug_435.txt delete mode 100644 test/prism/snapshots/whitequark/bug_447.txt delete mode 100644 test/prism/snapshots/whitequark/bug_452.txt delete mode 100644 test/prism/snapshots/whitequark/bug_466.txt delete mode 100644 test/prism/snapshots/whitequark/bug_473.txt delete mode 100644 test/prism/snapshots/whitequark/bug_480.txt delete mode 100644 test/prism/snapshots/whitequark/bug_481.txt delete mode 100644 test/prism/snapshots/whitequark/bug_ascii_8bit_in_literal.txt delete mode 100644 test/prism/snapshots/whitequark/bug_cmd_string_lookahead.txt delete mode 100644 test/prism/snapshots/whitequark/bug_cmdarg.txt delete mode 100644 test/prism/snapshots/whitequark/bug_def_no_paren_eql_begin.txt delete mode 100644 test/prism/snapshots/whitequark/bug_do_block_in_call_args.txt delete mode 100644 test/prism/snapshots/whitequark/bug_do_block_in_cmdarg.txt delete mode 100644 test/prism/snapshots/whitequark/bug_do_block_in_hash_brace.txt delete mode 100644 test/prism/snapshots/whitequark/bug_heredoc_do.txt delete mode 100644 test/prism/snapshots/whitequark/bug_interp_single.txt delete mode 100644 test/prism/snapshots/whitequark/bug_lambda_leakage.txt delete mode 100644 test/prism/snapshots/whitequark/bug_regex_verification.txt delete mode 100644 test/prism/snapshots/whitequark/bug_rescue_empty_else.txt delete mode 100644 test/prism/snapshots/whitequark/bug_while_not_parens_do.txt delete mode 100644 test/prism/snapshots/whitequark/case_cond.txt delete mode 100644 test/prism/snapshots/whitequark/case_cond_else.txt delete mode 100644 test/prism/snapshots/whitequark/case_expr.txt delete mode 100644 test/prism/snapshots/whitequark/case_expr_else.txt delete mode 100644 test/prism/snapshots/whitequark/casgn_scoped.txt delete mode 100644 test/prism/snapshots/whitequark/casgn_toplevel.txt delete mode 100644 test/prism/snapshots/whitequark/casgn_unscoped.txt delete mode 100644 test/prism/snapshots/whitequark/character.txt delete mode 100644 test/prism/snapshots/whitequark/class.txt delete mode 100644 test/prism/snapshots/whitequark/class_super.txt delete mode 100644 test/prism/snapshots/whitequark/class_super_label.txt delete mode 100644 test/prism/snapshots/whitequark/comments_before_leading_dot__27.txt delete mode 100644 test/prism/snapshots/whitequark/complex.txt delete mode 100644 test/prism/snapshots/whitequark/cond_begin.txt delete mode 100644 test/prism/snapshots/whitequark/cond_begin_masgn.txt delete mode 100644 test/prism/snapshots/whitequark/cond_eflipflop.txt delete mode 100644 test/prism/snapshots/whitequark/cond_eflipflop_with_beginless_range.txt delete mode 100644 test/prism/snapshots/whitequark/cond_eflipflop_with_endless_range.txt delete mode 100644 test/prism/snapshots/whitequark/cond_iflipflop.txt delete mode 100644 test/prism/snapshots/whitequark/cond_iflipflop_with_beginless_range.txt delete mode 100644 test/prism/snapshots/whitequark/cond_iflipflop_with_endless_range.txt delete mode 100644 test/prism/snapshots/whitequark/cond_match_current_line.txt delete mode 100644 test/prism/snapshots/whitequark/const_op_asgn.txt delete mode 100644 test/prism/snapshots/whitequark/const_scoped.txt delete mode 100644 test/prism/snapshots/whitequark/const_toplevel.txt delete mode 100644 test/prism/snapshots/whitequark/const_unscoped.txt delete mode 100644 test/prism/snapshots/whitequark/cpath.txt delete mode 100644 test/prism/snapshots/whitequark/cvar.txt delete mode 100644 test/prism/snapshots/whitequark/cvasgn.txt delete mode 100644 test/prism/snapshots/whitequark/dedenting_heredoc.txt delete mode 100644 test/prism/snapshots/whitequark/dedenting_interpolating_heredoc_fake_line_continuation.txt delete mode 100644 test/prism/snapshots/whitequark/dedenting_non_interpolating_heredoc_line_continuation.txt delete mode 100644 test/prism/snapshots/whitequark/def.txt delete mode 100644 test/prism/snapshots/whitequark/defined.txt delete mode 100644 test/prism/snapshots/whitequark/defs.txt delete mode 100644 test/prism/snapshots/whitequark/empty_stmt.txt delete mode 100644 test/prism/snapshots/whitequark/endless_comparison_method.txt delete mode 100644 test/prism/snapshots/whitequark/endless_method.txt delete mode 100644 test/prism/snapshots/whitequark/endless_method_command_syntax.txt delete mode 100644 test/prism/snapshots/whitequark/endless_method_forwarded_args_legacy.txt delete mode 100644 test/prism/snapshots/whitequark/endless_method_with_rescue_mod.txt delete mode 100644 test/prism/snapshots/whitequark/endless_method_without_args.txt delete mode 100644 test/prism/snapshots/whitequark/ensure.txt delete mode 100644 test/prism/snapshots/whitequark/ensure_empty.txt delete mode 100644 test/prism/snapshots/whitequark/false.txt delete mode 100644 test/prism/snapshots/whitequark/float.txt delete mode 100644 test/prism/snapshots/whitequark/for.txt delete mode 100644 test/prism/snapshots/whitequark/for_mlhs.txt delete mode 100644 test/prism/snapshots/whitequark/forward_arg.txt delete mode 100644 test/prism/snapshots/whitequark/forward_arg_with_open_args.txt delete mode 100644 test/prism/snapshots/whitequark/forward_args_legacy.txt delete mode 100644 test/prism/snapshots/whitequark/forwarded_argument_with_kwrestarg.txt delete mode 100644 test/prism/snapshots/whitequark/forwarded_argument_with_restarg.txt delete mode 100644 test/prism/snapshots/whitequark/forwarded_kwrestarg.txt delete mode 100644 test/prism/snapshots/whitequark/forwarded_kwrestarg_with_additional_kwarg.txt delete mode 100644 test/prism/snapshots/whitequark/forwarded_restarg.txt delete mode 100644 test/prism/snapshots/whitequark/gvar.txt delete mode 100644 test/prism/snapshots/whitequark/gvasgn.txt delete mode 100644 test/prism/snapshots/whitequark/hash_empty.txt delete mode 100644 test/prism/snapshots/whitequark/hash_hashrocket.txt delete mode 100644 test/prism/snapshots/whitequark/hash_kwsplat.txt delete mode 100644 test/prism/snapshots/whitequark/hash_label.txt delete mode 100644 test/prism/snapshots/whitequark/hash_label_end.txt delete mode 100644 test/prism/snapshots/whitequark/hash_pair_value_omission.txt delete mode 100644 test/prism/snapshots/whitequark/heredoc.txt delete mode 100644 test/prism/snapshots/whitequark/if.txt delete mode 100644 test/prism/snapshots/whitequark/if_else.txt delete mode 100644 test/prism/snapshots/whitequark/if_elsif.txt delete mode 100644 test/prism/snapshots/whitequark/if_masgn__24.txt delete mode 100644 test/prism/snapshots/whitequark/if_mod.txt delete mode 100644 test/prism/snapshots/whitequark/if_nl_then.txt delete mode 100644 test/prism/snapshots/whitequark/int.txt delete mode 100644 test/prism/snapshots/whitequark/int___LINE__.txt delete mode 100644 test/prism/snapshots/whitequark/interp_digit_var.txt delete mode 100644 test/prism/snapshots/whitequark/ivar.txt delete mode 100644 test/prism/snapshots/whitequark/ivasgn.txt delete mode 100644 test/prism/snapshots/whitequark/keyword_argument_omission.txt delete mode 100644 test/prism/snapshots/whitequark/kwarg.txt delete mode 100644 test/prism/snapshots/whitequark/kwbegin_compstmt.txt delete mode 100644 test/prism/snapshots/whitequark/kwnilarg.txt delete mode 100644 test/prism/snapshots/whitequark/kwoptarg.txt delete mode 100644 test/prism/snapshots/whitequark/kwoptarg_with_kwrestarg_and_forwarded_args.txt delete mode 100644 test/prism/snapshots/whitequark/kwrestarg_named.txt delete mode 100644 test/prism/snapshots/whitequark/kwrestarg_unnamed.txt delete mode 100644 test/prism/snapshots/whitequark/lbrace_arg_after_command_args.txt delete mode 100644 test/prism/snapshots/whitequark/lparenarg_after_lvar__since_25.txt delete mode 100644 test/prism/snapshots/whitequark/lvar.txt delete mode 100644 test/prism/snapshots/whitequark/lvar_injecting_match.txt delete mode 100644 test/prism/snapshots/whitequark/lvasgn.txt delete mode 100644 test/prism/snapshots/whitequark/masgn.txt delete mode 100644 test/prism/snapshots/whitequark/masgn_attr.txt delete mode 100644 test/prism/snapshots/whitequark/masgn_cmd.txt delete mode 100644 test/prism/snapshots/whitequark/masgn_const.txt delete mode 100644 test/prism/snapshots/whitequark/masgn_nested.txt delete mode 100644 test/prism/snapshots/whitequark/masgn_splat.txt delete mode 100644 test/prism/snapshots/whitequark/method_definition_in_while_cond.txt delete mode 100644 test/prism/snapshots/whitequark/module.txt delete mode 100644 test/prism/snapshots/whitequark/multiple_pattern_matches.txt delete mode 100644 test/prism/snapshots/whitequark/newline_in_hash_argument.txt delete mode 100644 test/prism/snapshots/whitequark/nil.txt delete mode 100644 test/prism/snapshots/whitequark/nil_expression.txt delete mode 100644 test/prism/snapshots/whitequark/non_lvar_injecting_match.txt delete mode 100644 test/prism/snapshots/whitequark/not.txt delete mode 100644 test/prism/snapshots/whitequark/not_cmd.txt delete mode 100644 test/prism/snapshots/whitequark/not_masgn__24.txt delete mode 100644 test/prism/snapshots/whitequark/nth_ref.txt delete mode 100644 test/prism/snapshots/whitequark/numbered_args_after_27.txt delete mode 100644 test/prism/snapshots/whitequark/numparam_outside_block.txt delete mode 100644 test/prism/snapshots/whitequark/numparam_ruby_bug_19025.txt delete mode 100644 test/prism/snapshots/whitequark/op_asgn.txt delete mode 100644 test/prism/snapshots/whitequark/op_asgn_cmd.txt delete mode 100644 test/prism/snapshots/whitequark/op_asgn_index.txt delete mode 100644 test/prism/snapshots/whitequark/op_asgn_index_cmd.txt delete mode 100644 test/prism/snapshots/whitequark/optarg.txt delete mode 100644 test/prism/snapshots/whitequark/or.txt delete mode 100644 test/prism/snapshots/whitequark/or_asgn.txt delete mode 100644 test/prism/snapshots/whitequark/parser_bug_272.txt delete mode 100644 test/prism/snapshots/whitequark/parser_bug_490.txt delete mode 100644 test/prism/snapshots/whitequark/parser_bug_507.txt delete mode 100644 test/prism/snapshots/whitequark/parser_bug_518.txt delete mode 100644 test/prism/snapshots/whitequark/parser_bug_525.txt delete mode 100644 test/prism/snapshots/whitequark/parser_bug_604.txt delete mode 100644 test/prism/snapshots/whitequark/parser_bug_640.txt delete mode 100644 test/prism/snapshots/whitequark/parser_bug_645.txt delete mode 100644 test/prism/snapshots/whitequark/parser_bug_830.txt delete mode 100644 test/prism/snapshots/whitequark/parser_bug_989.txt delete mode 100644 test/prism/snapshots/whitequark/parser_drops_truncated_parts_of_squiggly_heredoc.txt delete mode 100644 test/prism/snapshots/whitequark/parser_slash_slash_n_escaping_in_literals.txt delete mode 100644 test/prism/snapshots/whitequark/pattern_matching__FILE__LINE_literals.txt delete mode 100644 test/prism/snapshots/whitequark/pattern_matching_blank_else.txt delete mode 100644 test/prism/snapshots/whitequark/pattern_matching_else.txt delete mode 100644 test/prism/snapshots/whitequark/pattern_matching_single_line.txt delete mode 100644 test/prism/snapshots/whitequark/pattern_matching_single_line_allowed_omission_of_parentheses.txt delete mode 100644 test/prism/snapshots/whitequark/postexe.txt delete mode 100644 test/prism/snapshots/whitequark/preexe.txt delete mode 100644 test/prism/snapshots/whitequark/procarg0.txt delete mode 100644 test/prism/snapshots/whitequark/range_exclusive.txt delete mode 100644 test/prism/snapshots/whitequark/range_inclusive.txt delete mode 100644 test/prism/snapshots/whitequark/rational.txt delete mode 100644 test/prism/snapshots/whitequark/regex_interp.txt delete mode 100644 test/prism/snapshots/whitequark/regex_plain.txt delete mode 100644 test/prism/snapshots/whitequark/resbody_list.txt delete mode 100644 test/prism/snapshots/whitequark/resbody_list_mrhs.txt delete mode 100644 test/prism/snapshots/whitequark/resbody_list_var.txt delete mode 100644 test/prism/snapshots/whitequark/resbody_var.txt delete mode 100644 test/prism/snapshots/whitequark/rescue.txt delete mode 100644 test/prism/snapshots/whitequark/rescue_else.txt delete mode 100644 test/prism/snapshots/whitequark/rescue_else_ensure.txt delete mode 100644 test/prism/snapshots/whitequark/rescue_ensure.txt delete mode 100644 test/prism/snapshots/whitequark/rescue_in_lambda_block.txt delete mode 100644 test/prism/snapshots/whitequark/rescue_mod.txt delete mode 100644 test/prism/snapshots/whitequark/rescue_mod_asgn.txt delete mode 100644 test/prism/snapshots/whitequark/rescue_mod_masgn.txt delete mode 100644 test/prism/snapshots/whitequark/rescue_mod_op_assign.txt delete mode 100644 test/prism/snapshots/whitequark/rescue_without_begin_end.txt delete mode 100644 test/prism/snapshots/whitequark/restarg_named.txt delete mode 100644 test/prism/snapshots/whitequark/restarg_unnamed.txt delete mode 100644 test/prism/snapshots/whitequark/return.txt delete mode 100644 test/prism/snapshots/whitequark/return_block.txt delete mode 100644 test/prism/snapshots/whitequark/ruby_bug_10279.txt delete mode 100644 test/prism/snapshots/whitequark/ruby_bug_10653.txt delete mode 100644 test/prism/snapshots/whitequark/ruby_bug_11107.txt delete mode 100644 test/prism/snapshots/whitequark/ruby_bug_11380.txt delete mode 100644 test/prism/snapshots/whitequark/ruby_bug_11873.txt delete mode 100644 test/prism/snapshots/whitequark/ruby_bug_11873_a.txt delete mode 100644 test/prism/snapshots/whitequark/ruby_bug_11873_b.txt delete mode 100644 test/prism/snapshots/whitequark/ruby_bug_11989.txt delete mode 100644 test/prism/snapshots/whitequark/ruby_bug_11990.txt delete mode 100644 test/prism/snapshots/whitequark/ruby_bug_12073.txt delete mode 100644 test/prism/snapshots/whitequark/ruby_bug_12402.txt delete mode 100644 test/prism/snapshots/whitequark/ruby_bug_12669.txt delete mode 100644 test/prism/snapshots/whitequark/ruby_bug_12686.txt delete mode 100644 test/prism/snapshots/whitequark/ruby_bug_13547.txt delete mode 100644 test/prism/snapshots/whitequark/ruby_bug_14690.txt delete mode 100644 test/prism/snapshots/whitequark/ruby_bug_15789.txt delete mode 100644 test/prism/snapshots/whitequark/ruby_bug_9669.txt delete mode 100644 test/prism/snapshots/whitequark/sclass.txt delete mode 100644 test/prism/snapshots/whitequark/self.txt delete mode 100644 test/prism/snapshots/whitequark/send_attr_asgn.txt delete mode 100644 test/prism/snapshots/whitequark/send_attr_asgn_conditional.txt delete mode 100644 test/prism/snapshots/whitequark/send_binary_op.txt delete mode 100644 test/prism/snapshots/whitequark/send_block_chain_cmd.txt delete mode 100644 test/prism/snapshots/whitequark/send_block_conditional.txt delete mode 100644 test/prism/snapshots/whitequark/send_call.txt delete mode 100644 test/prism/snapshots/whitequark/send_conditional.txt delete mode 100644 test/prism/snapshots/whitequark/send_index.txt delete mode 100644 test/prism/snapshots/whitequark/send_index_asgn.txt delete mode 100644 test/prism/snapshots/whitequark/send_index_asgn_legacy.txt delete mode 100644 test/prism/snapshots/whitequark/send_index_cmd.txt delete mode 100644 test/prism/snapshots/whitequark/send_index_legacy.txt delete mode 100644 test/prism/snapshots/whitequark/send_lambda.txt delete mode 100644 test/prism/snapshots/whitequark/send_lambda_args.txt delete mode 100644 test/prism/snapshots/whitequark/send_lambda_args_noparen.txt delete mode 100644 test/prism/snapshots/whitequark/send_lambda_args_shadow.txt delete mode 100644 test/prism/snapshots/whitequark/send_lambda_legacy.txt delete mode 100644 test/prism/snapshots/whitequark/send_op_asgn_conditional.txt delete mode 100644 test/prism/snapshots/whitequark/send_plain.txt delete mode 100644 test/prism/snapshots/whitequark/send_plain_cmd.txt delete mode 100644 test/prism/snapshots/whitequark/send_self.txt delete mode 100644 test/prism/snapshots/whitequark/send_self_block.txt delete mode 100644 test/prism/snapshots/whitequark/send_unary_op.txt delete mode 100644 test/prism/snapshots/whitequark/slash_newline_in_heredocs.txt delete mode 100644 test/prism/snapshots/whitequark/space_args_arg.txt delete mode 100644 test/prism/snapshots/whitequark/space_args_arg_block.txt delete mode 100644 test/prism/snapshots/whitequark/space_args_arg_call.txt delete mode 100644 test/prism/snapshots/whitequark/space_args_arg_newline.txt delete mode 100644 test/prism/snapshots/whitequark/space_args_block.txt delete mode 100644 test/prism/snapshots/whitequark/space_args_cmd.txt delete mode 100644 test/prism/snapshots/whitequark/string___FILE__.txt delete mode 100644 test/prism/snapshots/whitequark/string_concat.txt delete mode 100644 test/prism/snapshots/whitequark/string_dvar.txt delete mode 100644 test/prism/snapshots/whitequark/string_interp.txt delete mode 100644 test/prism/snapshots/whitequark/string_plain.txt delete mode 100644 test/prism/snapshots/whitequark/super.txt delete mode 100644 test/prism/snapshots/whitequark/super_block.txt delete mode 100644 test/prism/snapshots/whitequark/symbol_interp.txt delete mode 100644 test/prism/snapshots/whitequark/symbol_plain.txt delete mode 100644 test/prism/snapshots/whitequark/ternary.txt delete mode 100644 test/prism/snapshots/whitequark/ternary_ambiguous_symbol.txt delete mode 100644 test/prism/snapshots/whitequark/trailing_forward_arg.txt delete mode 100644 test/prism/snapshots/whitequark/true.txt delete mode 100644 test/prism/snapshots/whitequark/unary_num_pow_precedence.txt delete mode 100644 test/prism/snapshots/whitequark/undef.txt delete mode 100644 test/prism/snapshots/whitequark/unless.txt delete mode 100644 test/prism/snapshots/whitequark/unless_else.txt delete mode 100644 test/prism/snapshots/whitequark/unless_mod.txt delete mode 100644 test/prism/snapshots/whitequark/until.txt delete mode 100644 test/prism/snapshots/whitequark/until_mod.txt delete mode 100644 test/prism/snapshots/whitequark/until_post.txt delete mode 100644 test/prism/snapshots/whitequark/var_and_asgn.txt delete mode 100644 test/prism/snapshots/whitequark/var_op_asgn.txt delete mode 100644 test/prism/snapshots/whitequark/var_op_asgn_cmd.txt delete mode 100644 test/prism/snapshots/whitequark/var_or_asgn.txt delete mode 100644 test/prism/snapshots/whitequark/when_multi.txt delete mode 100644 test/prism/snapshots/whitequark/when_splat.txt delete mode 100644 test/prism/snapshots/whitequark/when_then.txt delete mode 100644 test/prism/snapshots/whitequark/while.txt delete mode 100644 test/prism/snapshots/whitequark/while_mod.txt delete mode 100644 test/prism/snapshots/whitequark/while_post.txt delete mode 100644 test/prism/snapshots/whitequark/xstring_interp.txt delete mode 100644 test/prism/snapshots/whitequark/xstring_plain.txt delete mode 100644 test/prism/snapshots/whitequark/zsuper.txt delete mode 100644 test/prism/snapshots/xstring.txt delete mode 100644 test/prism/snapshots/xstring_with_backslash.txt delete mode 100644 test/prism/snapshots/yield.txt delete mode 100644 test/prism/snapshots_test.rb diff --git a/test/prism/snapshots/alias.txt b/test/prism/snapshots/alias.txt deleted file mode 100644 index 0d52c14f1a851f..00000000000000 --- a/test/prism/snapshots/alias.txt +++ /dev/null @@ -1,215 +0,0 @@ -@ ProgramNode (location: (1,0)-(23,11)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(23,11)) - ├── flags: ∅ - └── body: (length: 12) - ├── @ AliasMethodNode (location: (1,0)-(1,15)) - │ ├── flags: newline - │ ├── new_name: - │ │ @ SymbolNode (location: (1,6)-(1,10)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (1,6)-(1,7) = ":" - │ │ ├── value_loc: (1,7)-(1,10) = "foo" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "foo" - │ ├── old_name: - │ │ @ SymbolNode (location: (1,11)-(1,15)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (1,11)-(1,12) = ":" - │ │ ├── value_loc: (1,12)-(1,15) = "bar" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "bar" - │ └── keyword_loc: (1,0)-(1,5) = "alias" - ├── @ AliasMethodNode (location: (3,0)-(3,21)) - │ ├── flags: newline - │ ├── new_name: - │ │ @ SymbolNode (location: (3,6)-(3,13)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (3,6)-(3,9) = "%s[" - │ │ ├── value_loc: (3,9)-(3,12) = "abc" - │ │ ├── closing_loc: (3,12)-(3,13) = "]" - │ │ └── unescaped: "abc" - │ ├── old_name: - │ │ @ SymbolNode (location: (3,14)-(3,21)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (3,14)-(3,17) = "%s[" - │ │ ├── value_loc: (3,17)-(3,20) = "def" - │ │ ├── closing_loc: (3,20)-(3,21) = "]" - │ │ └── unescaped: "def" - │ └── keyword_loc: (3,0)-(3,5) = "alias" - ├── @ AliasMethodNode (location: (5,0)-(5,19)) - │ ├── flags: newline - │ ├── new_name: - │ │ @ SymbolNode (location: (5,6)-(5,12)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (5,6)-(5,8) = ":'" - │ │ ├── value_loc: (5,8)-(5,11) = "abc" - │ │ ├── closing_loc: (5,11)-(5,12) = "'" - │ │ └── unescaped: "abc" - │ ├── old_name: - │ │ @ SymbolNode (location: (5,13)-(5,19)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (5,13)-(5,15) = ":'" - │ │ ├── value_loc: (5,15)-(5,18) = "def" - │ │ ├── closing_loc: (5,18)-(5,19) = "'" - │ │ └── unescaped: "def" - │ └── keyword_loc: (5,0)-(5,5) = "alias" - ├── @ AliasMethodNode (location: (7,0)-(7,23)) - │ ├── flags: newline - │ ├── new_name: - │ │ @ InterpolatedSymbolNode (location: (7,6)-(7,16)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (7,6)-(7,8) = ":\"" - │ │ ├── parts: (length: 2) - │ │ │ ├── @ StringNode (location: (7,8)-(7,11)) - │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── content_loc: (7,8)-(7,11) = "abc" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "abc" - │ │ │ └── @ EmbeddedStatementsNode (location: (7,11)-(7,15)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (7,11)-(7,13) = "\#{" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (7,13)-(7,14)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ IntegerNode (location: (7,13)-(7,14)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ └── closing_loc: (7,14)-(7,15) = "}" - │ │ └── closing_loc: (7,15)-(7,16) = "\"" - │ ├── old_name: - │ │ @ SymbolNode (location: (7,17)-(7,23)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (7,17)-(7,19) = ":'" - │ │ ├── value_loc: (7,19)-(7,22) = "def" - │ │ ├── closing_loc: (7,22)-(7,23) = "'" - │ │ └── unescaped: "def" - │ └── keyword_loc: (7,0)-(7,5) = "alias" - ├── @ AliasGlobalVariableNode (location: (9,0)-(9,11)) - │ ├── flags: newline - │ ├── new_name: - │ │ @ GlobalVariableReadNode (location: (9,6)-(9,8)) - │ │ ├── flags: ∅ - │ │ └── name: :$a - │ ├── old_name: - │ │ @ BackReferenceReadNode (location: (9,9)-(9,11)) - │ │ ├── flags: ∅ - │ │ └── name: :$' - │ └── keyword_loc: (9,0)-(9,5) = "alias" - ├── @ AliasMethodNode (location: (11,0)-(11,13)) - │ ├── flags: newline - │ ├── new_name: - │ │ @ SymbolNode (location: (11,6)-(11,9)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: ∅ - │ │ ├── value_loc: (11,6)-(11,9) = "foo" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "foo" - │ ├── old_name: - │ │ @ SymbolNode (location: (11,10)-(11,13)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: ∅ - │ │ ├── value_loc: (11,10)-(11,13) = "bar" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "bar" - │ └── keyword_loc: (11,0)-(11,5) = "alias" - ├── @ AliasGlobalVariableNode (location: (13,0)-(13,15)) - │ ├── flags: newline - │ ├── new_name: - │ │ @ GlobalVariableReadNode (location: (13,6)-(13,10)) - │ │ ├── flags: ∅ - │ │ └── name: :$foo - │ ├── old_name: - │ │ @ GlobalVariableReadNode (location: (13,11)-(13,15)) - │ │ ├── flags: ∅ - │ │ └── name: :$bar - │ └── keyword_loc: (13,0)-(13,5) = "alias" - ├── @ AliasMethodNode (location: (15,0)-(15,12)) - │ ├── flags: newline - │ ├── new_name: - │ │ @ SymbolNode (location: (15,6)-(15,9)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: ∅ - │ │ ├── value_loc: (15,6)-(15,9) = "foo" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "foo" - │ ├── old_name: - │ │ @ SymbolNode (location: (15,10)-(15,12)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: ∅ - │ │ ├── value_loc: (15,10)-(15,12) = "if" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "if" - │ └── keyword_loc: (15,0)-(15,5) = "alias" - ├── @ AliasMethodNode (location: (17,0)-(17,13)) - │ ├── flags: newline - │ ├── new_name: - │ │ @ SymbolNode (location: (17,6)-(17,9)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: ∅ - │ │ ├── value_loc: (17,6)-(17,9) = "foo" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "foo" - │ ├── old_name: - │ │ @ SymbolNode (location: (17,10)-(17,13)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: ∅ - │ │ ├── value_loc: (17,10)-(17,13) = "<=>" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "<=>" - │ └── keyword_loc: (17,0)-(17,5) = "alias" - ├── @ AliasMethodNode (location: (19,0)-(19,15)) - │ ├── flags: newline - │ ├── new_name: - │ │ @ SymbolNode (location: (19,6)-(19,9)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (19,6)-(19,7) = ":" - │ │ ├── value_loc: (19,7)-(19,9) = "==" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "==" - │ ├── old_name: - │ │ @ SymbolNode (location: (19,10)-(19,15)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (19,10)-(19,11) = ":" - │ │ ├── value_loc: (19,11)-(19,15) = "eql?" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "eql?" - │ └── keyword_loc: (19,0)-(19,5) = "alias" - ├── @ AliasMethodNode (location: (21,0)-(21,9)) - │ ├── flags: newline - │ ├── new_name: - │ │ @ SymbolNode (location: (21,6)-(21,7)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: ∅ - │ │ ├── value_loc: (21,6)-(21,7) = "A" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "A" - │ ├── old_name: - │ │ @ SymbolNode (location: (21,8)-(21,9)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: ∅ - │ │ ├── value_loc: (21,8)-(21,9) = "B" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "B" - │ └── keyword_loc: (21,0)-(21,5) = "alias" - └── @ AliasMethodNode (location: (23,0)-(23,11)) - ├── flags: newline - ├── new_name: - │ @ SymbolNode (location: (23,6)-(23,8)) - │ ├── flags: static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (23,6)-(23,7) = ":" - │ ├── value_loc: (23,7)-(23,8) = "A" - │ ├── closing_loc: ∅ - │ └── unescaped: "A" - ├── old_name: - │ @ SymbolNode (location: (23,9)-(23,11)) - │ ├── flags: static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (23,9)-(23,10) = ":" - │ ├── value_loc: (23,10)-(23,11) = "B" - │ ├── closing_loc: ∅ - │ └── unescaped: "B" - └── keyword_loc: (23,0)-(23,5) = "alias" diff --git a/test/prism/snapshots/arithmetic.txt b/test/prism/snapshots/arithmetic.txt deleted file mode 100644 index 963080e0d96b14..00000000000000 --- a/test/prism/snapshots/arithmetic.txt +++ /dev/null @@ -1,257 +0,0 @@ -@ ProgramNode (location: (1,0)-(13,8)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(13,8)) - ├── flags: ∅ - └── body: (length: 7) - ├── @ CallNode (location: (1,0)-(1,8)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (1,0)-(1,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,4)-(1,8)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (1,4)-(1,8)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ CallNode (location: (1,5)-(1,8)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (1,5)-(1,8) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :! - │ │ ├── message_loc: (1,4)-(1,5) = "!" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (3,0)-(3,8)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (3,0)-(3,4)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ CallNode (location: (3,1)-(3,4)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (3,1)-(3,4) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :-@ - │ │ ├── message_loc: (3,0)-(3,1) = "-" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :* - │ ├── message_loc: (3,4)-(3,5) = "*" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (3,5)-(3,8)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (3,5)-(3,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (3,5)-(3,8) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (5,0)-(5,9)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (5,0)-(5,4)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ CallNode (location: (5,1)-(5,4)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (5,1)-(5,4) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :+@ - │ │ ├── message_loc: (5,0)-(5,1) = "+" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :** - │ ├── message_loc: (5,4)-(5,6) = "**" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (5,6)-(5,9)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (5,6)-(5,9)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (5,6)-(5,9) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (7,0)-(7,8)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (7,0)-(7,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (7,4)-(7,8)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (7,4)-(7,8)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ CallNode (location: (7,5)-(7,8)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (7,5)-(7,8) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :~ - │ │ ├── message_loc: (7,4)-(7,5) = "~" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (9,0)-(9,17)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (9,0)-(9,10)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ CallNode (location: (9,0)-(9,3)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (9,0)-(9,3) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :<< - │ │ ├── message_loc: (9,4)-(9,6) = "<<" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (9,7)-(9,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ CallNode (location: (9,7)-(9,10)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (9,7)-(9,10) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :<< - │ ├── message_loc: (9,11)-(9,13) = "<<" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (9,14)-(9,17)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (9,14)-(9,17)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :baz - │ │ ├── message_loc: (9,14)-(9,17) = "baz" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (11,0)-(11,5)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (11,1)-(11,5)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ IntegerNode (location: (11,1)-(11,2)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :** - │ │ ├── message_loc: (11,2)-(11,4) = "**" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (11,4)-(11,5)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (11,4)-(11,5)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :-@ - │ ├── message_loc: (11,0)-(11,1) = "-" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── @ CallNode (location: (13,0)-(13,8)) - ├── flags: newline - ├── receiver: - │ @ IntegerNode (location: (13,0)-(13,2)) - │ ├── flags: static_literal, decimal - │ └── value: -1 - ├── call_operator_loc: (13,2)-(13,3) = "." - ├── name: :zero? - ├── message_loc: (13,3)-(13,8) = "zero?" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/arrays.txt b/test/prism/snapshots/arrays.txt deleted file mode 100644 index f34ee1395c42be..00000000000000 --- a/test/prism/snapshots/arrays.txt +++ /dev/null @@ -1,1886 +0,0 @@ -@ ProgramNode (location: (1,0)-(122,32)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(122,32)) - ├── flags: ∅ - └── body: (length: 50) - ├── @ ArrayNode (location: (1,0)-(1,4)) - │ ├── flags: newline, contains_splat - │ ├── elements: (length: 1) - │ │ └── @ SplatNode (location: (1,1)-(1,3)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (1,1)-(1,2) = "*" - │ │ └── expression: - │ │ @ CallNode (location: (1,2)-(1,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (1,2)-(1,3) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── opening_loc: (1,0)-(1,1) = "[" - │ └── closing_loc: (1,3)-(1,4) = "]" - ├── @ CallNode (location: (3,0)-(3,23)) - │ ├── flags: newline, attribute_write - │ ├── receiver: - │ │ @ CallNode (location: (3,0)-(3,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (3,0)-(3,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :[]= - │ ├── message_loc: (3,3)-(3,13) = "[bar, baz]" - │ ├── opening_loc: (3,3)-(3,4) = "[" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (3,4)-(3,23)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 3) - │ │ ├── @ CallNode (location: (3,4)-(3,7)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (3,4)-(3,7) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── @ CallNode (location: (3,9)-(3,12)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :baz - │ │ │ ├── message_loc: (3,9)-(3,12) = "baz" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── @ ArrayNode (location: (3,16)-(3,23)) - │ │ ├── flags: static_literal - │ │ ├── elements: (length: 3) - │ │ │ ├── @ IntegerNode (location: (3,16)-(3,17)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ ├── @ IntegerNode (location: (3,19)-(3,20)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 2 - │ │ │ └── @ IntegerNode (location: (3,22)-(3,23)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 3 - │ │ ├── opening_loc: ∅ - │ │ └── closing_loc: ∅ - │ ├── closing_loc: (3,12)-(3,13) = "]" - │ └── block: ∅ - ├── @ ArrayNode (location: (5,0)-(5,13)) - │ ├── flags: newline - │ ├── elements: (length: 1) - │ │ └── @ KeywordHashNode (location: (5,1)-(5,12)) - │ │ ├── flags: symbol_keys - │ │ └── elements: (length: 1) - │ │ └── @ AssocNode (location: (5,1)-(5,12)) - │ │ ├── flags: ∅ - │ │ ├── key: - │ │ │ @ SymbolNode (location: (5,1)-(5,3)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (5,1)-(5,2) = "a" - │ │ │ ├── closing_loc: (5,2)-(5,3) = ":" - │ │ │ └── unescaped: "a" - │ │ ├── value: - │ │ │ @ ArrayNode (location: (5,4)-(5,12)) - │ │ │ ├── flags: static_literal - │ │ │ ├── elements: (length: 2) - │ │ │ │ ├── @ SymbolNode (location: (5,5)-(5,7)) - │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ │ ├── opening_loc: (5,5)-(5,6) = ":" - │ │ │ │ │ ├── value_loc: (5,6)-(5,7) = "b" - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── unescaped: "b" - │ │ │ │ └── @ SymbolNode (location: (5,9)-(5,11)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: (5,9)-(5,10) = ":" - │ │ │ │ ├── value_loc: (5,10)-(5,11) = "c" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "c" - │ │ │ ├── opening_loc: (5,4)-(5,5) = "[" - │ │ │ └── closing_loc: (5,11)-(5,12) = "]" - │ │ └── operator_loc: ∅ - │ ├── opening_loc: (5,0)-(5,1) = "[" - │ └── closing_loc: (5,12)-(5,13) = "]" - ├── @ ArrayNode (location: (9,0)-(15,1)) - │ ├── flags: newline, static_literal - │ ├── elements: (length: 5) - │ │ ├── @ SymbolNode (location: (9,1)-(9,3)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (9,1)-(9,2) = ":" - │ │ │ ├── value_loc: (9,2)-(9,3) = "a" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "a" - │ │ ├── @ SymbolNode (location: (9,5)-(9,7)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (9,5)-(9,6) = ":" - │ │ │ ├── value_loc: (9,6)-(9,7) = "b" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "b" - │ │ ├── @ SymbolNode (location: (10,0)-(10,2)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (10,0)-(10,1) = ":" - │ │ │ ├── value_loc: (10,1)-(10,2) = "c" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "c" - │ │ ├── @ IntegerNode (location: (10,3)-(10,4)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── @ SymbolNode (location: (14,0)-(14,2)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (14,0)-(14,1) = ":" - │ │ ├── value_loc: (14,1)-(14,2) = "d" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "d" - │ ├── opening_loc: (9,0)-(9,1) = "[" - │ └── closing_loc: (15,0)-(15,1) = "]" - ├── @ ArrayNode (location: (18,0)-(26,1)) - │ ├── flags: newline, static_literal - │ ├── elements: (length: 5) - │ │ ├── @ SymbolNode (location: (18,1)-(18,3)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (18,1)-(18,2) = ":" - │ │ │ ├── value_loc: (18,2)-(18,3) = "a" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "a" - │ │ ├── @ SymbolNode (location: (18,5)-(18,7)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (18,5)-(18,6) = ":" - │ │ │ ├── value_loc: (18,6)-(18,7) = "b" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "b" - │ │ ├── @ SymbolNode (location: (19,0)-(19,2)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (19,0)-(19,1) = ":" - │ │ │ ├── value_loc: (19,1)-(19,2) = "c" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "c" - │ │ ├── @ IntegerNode (location: (19,3)-(19,4)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── @ SymbolNode (location: (23,0)-(23,2)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (23,0)-(23,1) = ":" - │ │ ├── value_loc: (23,1)-(23,2) = "d" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "d" - │ ├── opening_loc: (18,0)-(18,1) = "[" - │ └── closing_loc: (26,0)-(26,1) = "]" - ├── @ ArrayNode (location: (28,0)-(28,12)) - │ ├── flags: newline - │ ├── elements: (length: 1) - │ │ └── @ KeywordHashNode (location: (28,1)-(28,11)) - │ │ ├── flags: ∅ - │ │ └── elements: (length: 1) - │ │ └── @ AssocNode (location: (28,1)-(28,11)) - │ │ ├── flags: ∅ - │ │ ├── key: - │ │ │ @ CallNode (location: (28,1)-(28,4)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (28,1)-(28,4) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── value: - │ │ │ @ CallNode (location: (28,8)-(28,11)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (28,8)-(28,11) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: (28,5)-(28,7) = "=>" - │ ├── opening_loc: (28,0)-(28,1) = "[" - │ └── closing_loc: (28,11)-(28,12) = "]" - ├── @ CallNode (location: (30,0)-(30,19)) - │ ├── flags: newline, attribute_write - │ ├── receiver: - │ │ @ CallNode (location: (30,0)-(30,8)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ CallNode (location: (30,0)-(30,3)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (30,0)-(30,3) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :[] - │ │ ├── message_loc: (30,3)-(30,8) = "[bar]" - │ │ ├── opening_loc: (30,3)-(30,4) = "[" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (30,4)-(30,7)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ CallNode (location: (30,4)-(30,7)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (30,4)-(30,7) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── closing_loc: (30,7)-(30,8) = "]" - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :[]= - │ ├── message_loc: (30,8)-(30,13) = "[baz]" - │ ├── opening_loc: (30,8)-(30,9) = "[" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (30,9)-(30,19)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (30,9)-(30,12)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :baz - │ │ │ ├── message_loc: (30,9)-(30,12) = "baz" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── @ CallNode (location: (30,16)-(30,19)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :qux - │ │ ├── message_loc: (30,16)-(30,19) = "qux" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (30,12)-(30,13) = "]" - │ └── block: ∅ - ├── @ CallNode (location: (32,0)-(32,13)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (32,0)-(32,8)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ CallNode (location: (32,0)-(32,3)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (32,0)-(32,3) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :[] - │ │ ├── message_loc: (32,3)-(32,8) = "[bar]" - │ │ ├── opening_loc: (32,3)-(32,4) = "[" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (32,4)-(32,7)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ CallNode (location: (32,4)-(32,7)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (32,4)-(32,7) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── closing_loc: (32,7)-(32,8) = "]" - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :[] - │ ├── message_loc: (32,8)-(32,13) = "[baz]" - │ ├── opening_loc: (32,8)-(32,9) = "[" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (32,9)-(32,12)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (32,9)-(32,12)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :baz - │ │ ├── message_loc: (32,9)-(32,12) = "baz" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (32,12)-(32,13) = "]" - │ └── block: ∅ - ├── @ ArrayNode (location: (34,0)-(35,1)) - │ ├── flags: newline, static_literal - │ ├── elements: (length: 0) - │ ├── opening_loc: (34,0)-(34,1) = "[" - │ └── closing_loc: (35,0)-(35,1) = "]" - ├── @ CallNode (location: (37,0)-(37,13)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (37,0)-(37,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (37,0)-(37,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :[] - │ ├── message_loc: (37,3)-(37,13) = "[bar, baz]" - │ ├── opening_loc: (37,3)-(37,4) = "[" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (37,4)-(37,12)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (37,4)-(37,7)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (37,4)-(37,7) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── @ CallNode (location: (37,9)-(37,12)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :baz - │ │ ├── message_loc: (37,9)-(37,12) = "baz" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (37,12)-(37,13) = "]" - │ └── block: ∅ - ├── @ CallNode (location: (39,0)-(39,19)) - │ ├── flags: newline, attribute_write - │ ├── receiver: - │ │ @ CallNode (location: (39,0)-(39,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (39,0)-(39,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :[]= - │ ├── message_loc: (39,3)-(39,13) = "[bar, baz]" - │ ├── opening_loc: (39,3)-(39,4) = "[" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (39,4)-(39,19)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 3) - │ │ ├── @ CallNode (location: (39,4)-(39,7)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (39,4)-(39,7) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── @ CallNode (location: (39,9)-(39,12)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :baz - │ │ │ ├── message_loc: (39,9)-(39,12) = "baz" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── @ CallNode (location: (39,16)-(39,19)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :qux - │ │ ├── message_loc: (39,16)-(39,19) = "qux" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (39,12)-(39,13) = "]" - │ └── block: ∅ - ├── @ MultiWriteNode (location: (41,0)-(41,21)) - │ ├── flags: newline - │ ├── lefts: (length: 2) - │ │ ├── @ IndexTargetNode (location: (41,0)-(41,6)) - │ │ │ ├── flags: attribute_write - │ │ │ ├── receiver: - │ │ │ │ @ CallNode (location: (41,0)-(41,3)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :foo - │ │ │ │ ├── message_loc: (41,0)-(41,3) = "foo" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── opening_loc: (41,3)-(41,4) = "[" - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (41,4)-(41,5)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ IntegerNode (location: (41,4)-(41,5)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 0 - │ │ │ ├── closing_loc: (41,5)-(41,6) = "]" - │ │ │ └── block: ∅ - │ │ └── @ IndexTargetNode (location: (41,8)-(41,14)) - │ │ ├── flags: attribute_write - │ │ ├── receiver: - │ │ │ @ CallNode (location: (41,8)-(41,11)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (41,8)-(41,11) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── opening_loc: (41,11)-(41,12) = "[" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (41,12)-(41,13)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (41,12)-(41,13)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 0 - │ │ ├── closing_loc: (41,13)-(41,14) = "]" - │ │ └── block: ∅ - │ ├── rest: ∅ - │ ├── rights: (length: 0) - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── operator_loc: (41,15)-(41,16) = "=" - │ └── value: - │ @ ArrayNode (location: (41,17)-(41,21)) - │ ├── flags: static_literal - │ ├── elements: (length: 2) - │ │ ├── @ IntegerNode (location: (41,17)-(41,18)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── @ IntegerNode (location: (41,20)-(41,21)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── opening_loc: ∅ - │ └── closing_loc: ∅ - ├── @ CallNode (location: (43,0)-(43,19)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (43,0)-(43,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (43,0)-(43,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :[] - │ ├── message_loc: (43,3)-(43,19) = "[bar[baz] = qux]" - │ ├── opening_loc: (43,3)-(43,4) = "[" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (43,4)-(43,18)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (43,4)-(43,18)) - │ │ ├── flags: attribute_write - │ │ ├── receiver: - │ │ │ @ CallNode (location: (43,4)-(43,7)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (43,4)-(43,7) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :[]= - │ │ ├── message_loc: (43,7)-(43,12) = "[baz]" - │ │ ├── opening_loc: (43,7)-(43,8) = "[" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (43,8)-(43,18)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 2) - │ │ │ ├── @ CallNode (location: (43,8)-(43,11)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ ├── message_loc: (43,8)-(43,11) = "baz" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── @ CallNode (location: (43,15)-(43,18)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :qux - │ │ │ ├── message_loc: (43,15)-(43,18) = "qux" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── closing_loc: (43,11)-(43,12) = "]" - │ │ └── block: ∅ - │ ├── closing_loc: (43,18)-(43,19) = "]" - │ └── block: ∅ - ├── @ CallNode (location: (45,0)-(45,8)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (45,0)-(45,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (45,0)-(45,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :[] - │ ├── message_loc: (45,3)-(45,8) = "[bar]" - │ ├── opening_loc: (45,3)-(45,4) = "[" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (45,4)-(45,7)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (45,4)-(45,7)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (45,4)-(45,7) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (45,7)-(45,8) = "]" - │ └── block: ∅ - ├── @ CallNode (location: (47,0)-(47,14)) - │ ├── flags: newline, attribute_write - │ ├── receiver: - │ │ @ CallNode (location: (47,0)-(47,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (47,0)-(47,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :[]= - │ ├── message_loc: (47,3)-(47,8) = "[bar]" - │ ├── opening_loc: (47,3)-(47,4) = "[" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (47,4)-(47,14)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (47,4)-(47,7)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (47,4)-(47,7) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── @ CallNode (location: (47,11)-(47,14)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :baz - │ │ ├── message_loc: (47,11)-(47,14) = "baz" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (47,7)-(47,8) = "]" - │ └── block: ∅ - ├── @ ArrayNode (location: (49,0)-(49,6)) - │ ├── flags: newline - │ ├── elements: (length: 1) - │ │ └── @ KeywordHashNode (location: (49,1)-(49,5)) - │ │ ├── flags: ∅ - │ │ └── elements: (length: 1) - │ │ └── @ AssocSplatNode (location: (49,1)-(49,5)) - │ │ ├── flags: ∅ - │ │ ├── value: - │ │ │ @ HashNode (location: (49,3)-(49,5)) - │ │ │ ├── flags: static_literal - │ │ │ ├── opening_loc: (49,3)-(49,4) = "{" - │ │ │ ├── elements: (length: 0) - │ │ │ └── closing_loc: (49,4)-(49,5) = "}" - │ │ └── operator_loc: (49,1)-(49,3) = "**" - │ ├── opening_loc: (49,0)-(49,1) = "[" - │ └── closing_loc: (49,5)-(49,6) = "]" - ├── @ ArrayNode (location: (51,0)-(51,6)) - │ ├── flags: newline - │ ├── elements: (length: 1) - │ │ └── @ KeywordHashNode (location: (51,1)-(51,5)) - │ │ ├── flags: ∅ - │ │ └── elements: (length: 1) - │ │ └── @ AssocSplatNode (location: (51,1)-(51,5)) - │ │ ├── flags: ∅ - │ │ ├── value: - │ │ │ @ CallNode (location: (51,3)-(51,5)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :kw - │ │ │ ├── message_loc: (51,3)-(51,5) = "kw" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: (51,1)-(51,3) = "**" - │ ├── opening_loc: (51,0)-(51,1) = "[" - │ └── closing_loc: (51,5)-(51,6) = "]" - ├── @ ArrayNode (location: (53,0)-(53,9)) - │ ├── flags: newline - │ ├── elements: (length: 2) - │ │ ├── @ IntegerNode (location: (53,1)-(53,2)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── @ KeywordHashNode (location: (53,4)-(53,8)) - │ │ ├── flags: ∅ - │ │ └── elements: (length: 1) - │ │ └── @ AssocSplatNode (location: (53,4)-(53,8)) - │ │ ├── flags: ∅ - │ │ ├── value: - │ │ │ @ CallNode (location: (53,6)-(53,8)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :kw - │ │ │ ├── message_loc: (53,6)-(53,8) = "kw" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: (53,4)-(53,6) = "**" - │ ├── opening_loc: (53,0)-(53,1) = "[" - │ └── closing_loc: (53,8)-(53,9) = "]" - ├── @ ArrayNode (location: (55,0)-(55,21)) - │ ├── flags: newline - │ ├── elements: (length: 2) - │ │ ├── @ IntegerNode (location: (55,1)-(55,2)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── @ KeywordHashNode (location: (55,4)-(55,20)) - │ │ ├── flags: ∅ - │ │ └── elements: (length: 3) - │ │ ├── @ AssocSplatNode (location: (55,4)-(55,8)) - │ │ │ ├── flags: ∅ - │ │ │ ├── value: - │ │ │ │ @ CallNode (location: (55,6)-(55,8)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :kw - │ │ │ │ ├── message_loc: (55,6)-(55,8) = "kw" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── operator_loc: (55,4)-(55,6) = "**" - │ │ ├── @ AssocSplatNode (location: (55,10)-(55,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── value: - │ │ │ │ @ HashNode (location: (55,12)-(55,14)) - │ │ │ │ ├── flags: static_literal - │ │ │ │ ├── opening_loc: (55,12)-(55,13) = "{" - │ │ │ │ ├── elements: (length: 0) - │ │ │ │ └── closing_loc: (55,13)-(55,14) = "}" - │ │ │ └── operator_loc: (55,10)-(55,12) = "**" - │ │ └── @ AssocSplatNode (location: (55,16)-(55,20)) - │ │ ├── flags: ∅ - │ │ ├── value: - │ │ │ @ CallNode (location: (55,18)-(55,20)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :kw - │ │ │ ├── message_loc: (55,18)-(55,20) = "kw" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: (55,16)-(55,18) = "**" - │ ├── opening_loc: (55,0)-(55,1) = "[" - │ └── closing_loc: (55,20)-(55,21) = "]" - ├── @ ArrayNode (location: (57,0)-(59,1)) - │ ├── flags: newline - │ ├── elements: (length: 1) - │ │ └── @ KeywordHashNode (location: (58,2)-(58,12)) - │ │ ├── flags: ∅ - │ │ └── elements: (length: 1) - │ │ └── @ AssocNode (location: (58,2)-(58,12)) - │ │ ├── flags: ∅ - │ │ ├── key: - │ │ │ @ CallNode (location: (58,2)-(58,5)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (58,2)-(58,5) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── value: - │ │ │ @ CallNode (location: (58,9)-(58,12)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (58,9)-(58,12) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: (58,6)-(58,8) = "=>" - │ ├── opening_loc: (57,0)-(57,1) = "[" - │ └── closing_loc: (59,0)-(59,1) = "]" - ├── @ ArrayNode (location: (62,0)-(62,17)) - │ ├── flags: newline, static_literal - │ ├── elements: (length: 3) - │ │ ├── @ SymbolNode (location: (62,3)-(62,6)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (62,3)-(62,6) = "one" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "one" - │ │ ├── @ SymbolNode (location: (62,7)-(62,10)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (62,7)-(62,10) = "two" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "two" - │ │ └── @ SymbolNode (location: (62,11)-(62,16)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: ∅ - │ │ ├── value_loc: (62,11)-(62,16) = "three" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "three" - │ ├── opening_loc: (62,0)-(62,3) = "%i#" - │ └── closing_loc: (62,16)-(62,17) = "#" - ├── @ ArrayNode (location: (64,0)-(64,17)) - │ ├── flags: newline - │ ├── elements: (length: 3) - │ │ ├── @ StringNode (location: (64,3)-(64,6)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (64,3)-(64,6) = "one" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "one" - │ │ ├── @ StringNode (location: (64,7)-(64,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (64,7)-(64,10) = "two" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "two" - │ │ └── @ StringNode (location: (64,11)-(64,16)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (64,11)-(64,16) = "three" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "three" - │ ├── opening_loc: (64,0)-(64,3) = "%w#" - │ └── closing_loc: (64,16)-(64,17) = "#" - ├── @ XStringNode (location: (66,0)-(66,17)) - │ ├── flags: newline - │ ├── opening_loc: (66,0)-(66,3) = "%x#" - │ ├── content_loc: (66,3)-(66,16) = "one two three" - │ ├── closing_loc: (66,16)-(66,17) = "#" - │ └── unescaped: "one two three" - ├── @ ArrayNode (location: (69,0)-(69,17)) - │ ├── flags: newline, static_literal - │ ├── elements: (length: 3) - │ │ ├── @ SymbolNode (location: (69,3)-(69,6)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (69,3)-(69,6) = "one" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "one" - │ │ ├── @ SymbolNode (location: (69,7)-(69,10)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (69,7)-(69,10) = "two" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "two" - │ │ └── @ SymbolNode (location: (69,11)-(69,16)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: ∅ - │ │ ├── value_loc: (69,11)-(69,16) = "three" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "three" - │ ├── opening_loc: (69,0)-(69,3) = "%i@" - │ └── closing_loc: (69,16)-(69,17) = "@" - ├── @ ArrayNode (location: (71,0)-(71,17)) - │ ├── flags: newline - │ ├── elements: (length: 3) - │ │ ├── @ StringNode (location: (71,3)-(71,6)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (71,3)-(71,6) = "one" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "one" - │ │ ├── @ StringNode (location: (71,7)-(71,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (71,7)-(71,10) = "two" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "two" - │ │ └── @ StringNode (location: (71,11)-(71,16)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (71,11)-(71,16) = "three" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "three" - │ ├── opening_loc: (71,0)-(71,3) = "%w@" - │ └── closing_loc: (71,16)-(71,17) = "@" - ├── @ XStringNode (location: (73,0)-(73,17)) - │ ├── flags: newline - │ ├── opening_loc: (73,0)-(73,3) = "%x@" - │ ├── content_loc: (73,3)-(73,16) = "one two three" - │ ├── closing_loc: (73,16)-(73,17) = "@" - │ └── unescaped: "one two three" - ├── @ ArrayNode (location: (76,0)-(76,17)) - │ ├── flags: newline, static_literal - │ ├── elements: (length: 3) - │ │ ├── @ SymbolNode (location: (76,3)-(76,6)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (76,3)-(76,6) = "one" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "one" - │ │ ├── @ SymbolNode (location: (76,7)-(76,10)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (76,7)-(76,10) = "two" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "two" - │ │ └── @ SymbolNode (location: (76,11)-(76,16)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: ∅ - │ │ ├── value_loc: (76,11)-(76,16) = "three" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "three" - │ ├── opening_loc: (76,0)-(76,3) = "%i{" - │ └── closing_loc: (76,16)-(76,17) = "}" - ├── @ ArrayNode (location: (78,0)-(78,17)) - │ ├── flags: newline - │ ├── elements: (length: 3) - │ │ ├── @ StringNode (location: (78,3)-(78,6)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (78,3)-(78,6) = "one" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "one" - │ │ ├── @ StringNode (location: (78,7)-(78,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (78,7)-(78,10) = "two" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "two" - │ │ └── @ StringNode (location: (78,11)-(78,16)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (78,11)-(78,16) = "three" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "three" - │ ├── opening_loc: (78,0)-(78,3) = "%w{" - │ └── closing_loc: (78,16)-(78,17) = "}" - ├── @ XStringNode (location: (80,0)-(80,17)) - │ ├── flags: newline - │ ├── opening_loc: (80,0)-(80,3) = "%x{" - │ ├── content_loc: (80,3)-(80,16) = "one two three" - │ ├── closing_loc: (80,16)-(80,17) = "}" - │ └── unescaped: "one two three" - ├── @ ArrayNode (location: (82,0)-(82,7)) - │ ├── flags: newline - │ ├── elements: (length: 1) - │ │ └── @ StringNode (location: (82,3)-(82,6)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (82,3)-(82,6) = "\\C:" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "\\C:" - │ ├── opening_loc: (82,0)-(82,3) = "%w[" - │ └── closing_loc: (82,6)-(82,7) = "]" - ├── @ IndexOperatorWriteNode (location: (84,0)-(84,10)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (84,0)-(84,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (84,0)-(84,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── opening_loc: (84,3)-(84,4) = "[" - │ ├── arguments: ∅ - │ ├── closing_loc: (84,4)-(84,5) = "]" - │ ├── block: ∅ - │ ├── binary_operator: :+ - │ ├── binary_operator_loc: (84,6)-(84,8) = "+=" - │ └── value: - │ @ IntegerNode (location: (84,9)-(84,10)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── @ IndexOrWriteNode (location: (86,0)-(86,11)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (86,0)-(86,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (86,0)-(86,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── opening_loc: (86,3)-(86,4) = "[" - │ ├── arguments: ∅ - │ ├── closing_loc: (86,4)-(86,5) = "]" - │ ├── block: ∅ - │ ├── operator_loc: (86,6)-(86,9) = "||=" - │ └── value: - │ @ IntegerNode (location: (86,10)-(86,11)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── @ IndexAndWriteNode (location: (88,0)-(88,11)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (88,0)-(88,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (88,0)-(88,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── opening_loc: (88,3)-(88,4) = "[" - │ ├── arguments: ∅ - │ ├── closing_loc: (88,4)-(88,5) = "]" - │ ├── block: ∅ - │ ├── operator_loc: (88,6)-(88,9) = "&&=" - │ └── value: - │ @ IntegerNode (location: (88,10)-(88,11)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── @ IndexOperatorWriteNode (location: (90,0)-(90,14)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (90,0)-(90,7)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ CallNode (location: (90,0)-(90,3)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (90,0)-(90,3) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: (90,3)-(90,4) = "." - │ │ ├── name: :foo - │ │ ├── message_loc: (90,4)-(90,7) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── opening_loc: (90,7)-(90,8) = "[" - │ ├── arguments: ∅ - │ ├── closing_loc: (90,8)-(90,9) = "]" - │ ├── block: ∅ - │ ├── binary_operator: :+ - │ ├── binary_operator_loc: (90,10)-(90,12) = "+=" - │ └── value: - │ @ IntegerNode (location: (90,13)-(90,14)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── @ IndexOrWriteNode (location: (92,0)-(92,15)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (92,0)-(92,7)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ CallNode (location: (92,0)-(92,3)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (92,0)-(92,3) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: (92,3)-(92,4) = "." - │ │ ├── name: :foo - │ │ ├── message_loc: (92,4)-(92,7) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── opening_loc: (92,7)-(92,8) = "[" - │ ├── arguments: ∅ - │ ├── closing_loc: (92,8)-(92,9) = "]" - │ ├── block: ∅ - │ ├── operator_loc: (92,10)-(92,13) = "||=" - │ └── value: - │ @ IntegerNode (location: (92,14)-(92,15)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── @ IndexAndWriteNode (location: (94,0)-(94,15)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (94,0)-(94,7)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ CallNode (location: (94,0)-(94,3)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (94,0)-(94,3) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: (94,3)-(94,4) = "." - │ │ ├── name: :foo - │ │ ├── message_loc: (94,4)-(94,7) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── opening_loc: (94,7)-(94,8) = "[" - │ ├── arguments: ∅ - │ ├── closing_loc: (94,8)-(94,9) = "]" - │ ├── block: ∅ - │ ├── operator_loc: (94,10)-(94,13) = "&&=" - │ └── value: - │ @ IntegerNode (location: (94,14)-(94,15)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── @ IndexOperatorWriteNode (location: (96,0)-(96,13)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (96,0)-(96,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (96,0)-(96,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── opening_loc: (96,3)-(96,4) = "[" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (96,4)-(96,7)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (96,4)-(96,7)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (96,4)-(96,7) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (96,7)-(96,8) = "]" - │ ├── block: ∅ - │ ├── binary_operator: :+ - │ ├── binary_operator_loc: (96,9)-(96,11) = "+=" - │ └── value: - │ @ IntegerNode (location: (96,12)-(96,13)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── @ IndexOrWriteNode (location: (98,0)-(98,14)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (98,0)-(98,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (98,0)-(98,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── opening_loc: (98,3)-(98,4) = "[" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (98,4)-(98,7)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (98,4)-(98,7)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (98,4)-(98,7) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (98,7)-(98,8) = "]" - │ ├── block: ∅ - │ ├── operator_loc: (98,9)-(98,12) = "||=" - │ └── value: - │ @ IntegerNode (location: (98,13)-(98,14)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── @ IndexAndWriteNode (location: (100,0)-(100,14)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (100,0)-(100,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (100,0)-(100,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── opening_loc: (100,3)-(100,4) = "[" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (100,4)-(100,7)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (100,4)-(100,7)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (100,4)-(100,7) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (100,7)-(100,8) = "]" - │ ├── block: ∅ - │ ├── operator_loc: (100,9)-(100,12) = "&&=" - │ └── value: - │ @ IntegerNode (location: (100,13)-(100,14)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── @ IndexOperatorWriteNode (location: (102,0)-(102,17)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (102,0)-(102,7)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ CallNode (location: (102,0)-(102,3)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (102,0)-(102,3) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: (102,3)-(102,4) = "." - │ │ ├── name: :foo - │ │ ├── message_loc: (102,4)-(102,7) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── opening_loc: (102,7)-(102,8) = "[" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (102,8)-(102,11)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (102,8)-(102,11)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (102,8)-(102,11) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (102,11)-(102,12) = "]" - │ ├── block: ∅ - │ ├── binary_operator: :+ - │ ├── binary_operator_loc: (102,13)-(102,15) = "+=" - │ └── value: - │ @ IntegerNode (location: (102,16)-(102,17)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── @ IndexOrWriteNode (location: (104,0)-(104,18)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (104,0)-(104,7)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ CallNode (location: (104,0)-(104,3)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (104,0)-(104,3) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: (104,3)-(104,4) = "." - │ │ ├── name: :foo - │ │ ├── message_loc: (104,4)-(104,7) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── opening_loc: (104,7)-(104,8) = "[" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (104,8)-(104,11)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (104,8)-(104,11)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (104,8)-(104,11) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (104,11)-(104,12) = "]" - │ ├── block: ∅ - │ ├── operator_loc: (104,13)-(104,16) = "||=" - │ └── value: - │ @ IntegerNode (location: (104,17)-(104,18)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── @ IndexAndWriteNode (location: (106,0)-(106,18)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (106,0)-(106,7)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ CallNode (location: (106,0)-(106,3)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (106,0)-(106,3) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: (106,3)-(106,4) = "." - │ │ ├── name: :foo - │ │ ├── message_loc: (106,4)-(106,7) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── opening_loc: (106,7)-(106,8) = "[" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (106,8)-(106,11)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (106,8)-(106,11)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (106,8)-(106,11) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (106,11)-(106,12) = "]" - │ ├── block: ∅ - │ ├── operator_loc: (106,13)-(106,16) = "&&=" - │ └── value: - │ @ IntegerNode (location: (106,17)-(106,18)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── @ DefNode (location: (108,0)-(108,19)) - │ ├── flags: newline - │ ├── name: :f - │ ├── name_loc: (108,4)-(108,5) = "f" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (108,6)-(108,7)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: - │ │ │ @ RestParameterNode (location: (108,6)-(108,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: ∅ - │ │ │ ├── name_loc: ∅ - │ │ │ └── operator_loc: (108,6)-(108,7) = "*" - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (108,10)-(108,14)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (108,10)-(108,14)) - │ │ ├── flags: newline - │ │ ├── receiver: - │ │ │ @ CallNode (location: (108,10)-(108,11)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :a - │ │ │ ├── message_loc: (108,10)-(108,11) = "a" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :[] - │ │ ├── message_loc: (108,11)-(108,14) = "[*]" - │ │ ├── opening_loc: (108,11)-(108,12) = "[" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (108,12)-(108,13)) - │ │ │ ├── flags: contains_splat - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ SplatNode (location: (108,12)-(108,13)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (108,12)-(108,13) = "*" - │ │ │ └── expression: ∅ - │ │ ├── closing_loc: (108,13)-(108,14) = "]" - │ │ └── block: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (108,0)-(108,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (108,5)-(108,6) = "(" - │ ├── rparen_loc: (108,7)-(108,8) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (108,16)-(108,19) = "end" - ├── @ DefNode (location: (110,0)-(110,22)) - │ ├── flags: newline - │ ├── name: :f - │ ├── name_loc: (110,4)-(110,5) = "f" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (110,6)-(110,7)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: - │ │ │ @ RestParameterNode (location: (110,6)-(110,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: ∅ - │ │ │ ├── name_loc: ∅ - │ │ │ └── operator_loc: (110,6)-(110,7) = "*" - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (110,10)-(110,17)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (110,10)-(110,17)) - │ │ ├── flags: newline - │ │ ├── receiver: - │ │ │ @ CallNode (location: (110,10)-(110,11)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :a - │ │ │ ├── message_loc: (110,10)-(110,11) = "a" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :[] - │ │ ├── message_loc: (110,11)-(110,17) = "[1, *]" - │ │ ├── opening_loc: (110,11)-(110,12) = "[" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (110,12)-(110,16)) - │ │ │ ├── flags: contains_splat - │ │ │ └── arguments: (length: 2) - │ │ │ ├── @ IntegerNode (location: (110,12)-(110,13)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ └── @ SplatNode (location: (110,15)-(110,16)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (110,15)-(110,16) = "*" - │ │ │ └── expression: ∅ - │ │ ├── closing_loc: (110,16)-(110,17) = "]" - │ │ └── block: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (110,0)-(110,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (110,5)-(110,6) = "(" - │ ├── rparen_loc: (110,7)-(110,8) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (110,19)-(110,22) = "end" - ├── @ DefNode (location: (112,0)-(112,23)) - │ ├── flags: newline - │ ├── name: :f - │ ├── name_loc: (112,4)-(112,5) = "f" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (112,6)-(112,7)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: - │ │ │ @ RestParameterNode (location: (112,6)-(112,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: ∅ - │ │ │ ├── name_loc: ∅ - │ │ │ └── operator_loc: (112,6)-(112,7) = "*" - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (112,10)-(112,18)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (112,10)-(112,18)) - │ │ ├── flags: newline, attribute_write - │ │ ├── receiver: - │ │ │ @ CallNode (location: (112,10)-(112,11)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :a - │ │ │ ├── message_loc: (112,10)-(112,11) = "a" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :[]= - │ │ ├── message_loc: (112,11)-(112,14) = "[*]" - │ │ ├── opening_loc: (112,11)-(112,12) = "[" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (112,12)-(112,18)) - │ │ │ ├── flags: contains_splat - │ │ │ └── arguments: (length: 2) - │ │ │ ├── @ SplatNode (location: (112,12)-(112,13)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── operator_loc: (112,12)-(112,13) = "*" - │ │ │ │ └── expression: ∅ - │ │ │ └── @ IntegerNode (location: (112,17)-(112,18)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── closing_loc: (112,13)-(112,14) = "]" - │ │ └── block: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (112,0)-(112,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (112,5)-(112,6) = "(" - │ ├── rparen_loc: (112,7)-(112,8) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (112,20)-(112,23) = "end" - ├── @ DefNode (location: (114,0)-(114,26)) - │ ├── flags: newline - │ ├── name: :f - │ ├── name_loc: (114,4)-(114,5) = "f" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (114,6)-(114,7)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: - │ │ │ @ RestParameterNode (location: (114,6)-(114,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: ∅ - │ │ │ ├── name_loc: ∅ - │ │ │ └── operator_loc: (114,6)-(114,7) = "*" - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (114,10)-(114,21)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (114,10)-(114,21)) - │ │ ├── flags: newline, attribute_write - │ │ ├── receiver: - │ │ │ @ CallNode (location: (114,10)-(114,11)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :a - │ │ │ ├── message_loc: (114,10)-(114,11) = "a" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :[]= - │ │ ├── message_loc: (114,11)-(114,17) = "[1, *]" - │ │ ├── opening_loc: (114,11)-(114,12) = "[" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (114,12)-(114,21)) - │ │ │ ├── flags: contains_splat - │ │ │ └── arguments: (length: 3) - │ │ │ ├── @ IntegerNode (location: (114,12)-(114,13)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ ├── @ SplatNode (location: (114,15)-(114,16)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── operator_loc: (114,15)-(114,16) = "*" - │ │ │ │ └── expression: ∅ - │ │ │ └── @ IntegerNode (location: (114,20)-(114,21)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── closing_loc: (114,16)-(114,17) = "]" - │ │ └── block: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (114,0)-(114,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (114,5)-(114,6) = "(" - │ ├── rparen_loc: (114,7)-(114,8) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (114,23)-(114,26) = "end" - ├── @ DefNode (location: (116,0)-(116,24)) - │ ├── flags: newline - │ ├── name: :f - │ ├── name_loc: (116,4)-(116,5) = "f" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (116,6)-(116,7)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: - │ │ │ @ RestParameterNode (location: (116,6)-(116,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: ∅ - │ │ │ ├── name_loc: ∅ - │ │ │ └── operator_loc: (116,6)-(116,7) = "*" - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (116,10)-(116,19)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ IndexOperatorWriteNode (location: (116,10)-(116,19)) - │ │ ├── flags: newline - │ │ ├── receiver: - │ │ │ @ CallNode (location: (116,10)-(116,11)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :a - │ │ │ ├── message_loc: (116,10)-(116,11) = "a" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── opening_loc: (116,11)-(116,12) = "[" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (116,12)-(116,13)) - │ │ │ ├── flags: contains_splat - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ SplatNode (location: (116,12)-(116,13)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (116,12)-(116,13) = "*" - │ │ │ └── expression: ∅ - │ │ ├── closing_loc: (116,13)-(116,14) = "]" - │ │ ├── block: ∅ - │ │ ├── binary_operator: :+ - │ │ ├── binary_operator_loc: (116,15)-(116,17) = "+=" - │ │ └── value: - │ │ @ IntegerNode (location: (116,18)-(116,19)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── locals: [] - │ ├── def_keyword_loc: (116,0)-(116,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (116,5)-(116,6) = "(" - │ ├── rparen_loc: (116,7)-(116,8) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (116,21)-(116,24) = "end" - ├── @ DefNode (location: (118,0)-(118,28)) - │ ├── flags: newline - │ ├── name: :f - │ ├── name_loc: (118,4)-(118,5) = "f" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (118,6)-(118,7)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: - │ │ │ @ RestParameterNode (location: (118,6)-(118,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: ∅ - │ │ │ ├── name_loc: ∅ - │ │ │ └── operator_loc: (118,6)-(118,7) = "*" - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (118,10)-(118,23)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ IndexAndWriteNode (location: (118,10)-(118,23)) - │ │ ├── flags: newline - │ │ ├── receiver: - │ │ │ @ CallNode (location: (118,10)-(118,11)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :a - │ │ │ ├── message_loc: (118,10)-(118,11) = "a" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── opening_loc: (118,11)-(118,12) = "[" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (118,12)-(118,16)) - │ │ │ ├── flags: contains_splat - │ │ │ └── arguments: (length: 2) - │ │ │ ├── @ IntegerNode (location: (118,12)-(118,13)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ └── @ SplatNode (location: (118,15)-(118,16)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (118,15)-(118,16) = "*" - │ │ │ └── expression: ∅ - │ │ ├── closing_loc: (118,16)-(118,17) = "]" - │ │ ├── block: ∅ - │ │ ├── operator_loc: (118,18)-(118,21) = "&&=" - │ │ └── value: - │ │ @ IntegerNode (location: (118,22)-(118,23)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── locals: [] - │ ├── def_keyword_loc: (118,0)-(118,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (118,5)-(118,6) = "(" - │ ├── rparen_loc: (118,7)-(118,8) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (118,25)-(118,28) = "end" - ├── @ DefNode (location: (120,0)-(120,29)) - │ ├── flags: newline - │ ├── name: :f - │ ├── name_loc: (120,4)-(120,5) = "f" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (120,6)-(120,7)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: - │ │ │ @ RestParameterNode (location: (120,6)-(120,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: ∅ - │ │ │ ├── name_loc: ∅ - │ │ │ └── operator_loc: (120,6)-(120,7) = "*" - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ BeginNode (location: (120,0)-(120,29)) - │ │ ├── flags: ∅ - │ │ ├── begin_keyword_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── rescue_clause: - │ │ │ @ RescueNode (location: (120,10)-(120,24)) - │ │ │ ├── flags: ∅ - │ │ │ ├── keyword_loc: (120,10)-(120,16) = "rescue" - │ │ │ ├── exceptions: (length: 0) - │ │ │ ├── operator_loc: (120,17)-(120,19) = "=>" - │ │ │ ├── reference: - │ │ │ │ @ IndexTargetNode (location: (120,20)-(120,24)) - │ │ │ │ ├── flags: attribute_write - │ │ │ │ ├── receiver: - │ │ │ │ │ @ CallNode (location: (120,20)-(120,21)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :a - │ │ │ │ │ ├── message_loc: (120,20)-(120,21) = "a" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── opening_loc: (120,21)-(120,22) = "[" - │ │ │ │ ├── arguments: - │ │ │ │ │ @ ArgumentsNode (location: (120,22)-(120,23)) - │ │ │ │ │ ├── flags: contains_splat - │ │ │ │ │ └── arguments: (length: 1) - │ │ │ │ │ └── @ SplatNode (location: (120,22)-(120,23)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── operator_loc: (120,22)-(120,23) = "*" - │ │ │ │ │ └── expression: ∅ - │ │ │ │ ├── closing_loc: (120,23)-(120,24) = "]" - │ │ │ │ └── block: ∅ - │ │ │ ├── statements: ∅ - │ │ │ └── subsequent: ∅ - │ │ ├── else_clause: ∅ - │ │ ├── ensure_clause: ∅ - │ │ └── end_keyword_loc: (120,26)-(120,29) = "end" - │ ├── locals: [] - │ ├── def_keyword_loc: (120,0)-(120,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (120,5)-(120,6) = "(" - │ ├── rparen_loc: (120,7)-(120,8) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (120,26)-(120,29) = "end" - └── @ DefNode (location: (122,0)-(122,32)) - ├── flags: newline - ├── name: :f - ├── name_loc: (122,4)-(122,5) = "f" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (122,6)-(122,7)) - │ ├── flags: ∅ - │ ├── requireds: (length: 0) - │ ├── optionals: (length: 0) - │ ├── rest: - │ │ @ RestParameterNode (location: (122,6)-(122,7)) - │ │ ├── flags: ∅ - │ │ ├── name: ∅ - │ │ ├── name_loc: ∅ - │ │ └── operator_loc: (122,6)-(122,7) = "*" - │ ├── posts: (length: 0) - │ ├── keywords: (length: 0) - │ ├── keyword_rest: ∅ - │ └── block: ∅ - ├── body: - │ @ BeginNode (location: (122,0)-(122,32)) - │ ├── flags: ∅ - │ ├── begin_keyword_loc: ∅ - │ ├── statements: ∅ - │ ├── rescue_clause: - │ │ @ RescueNode (location: (122,10)-(122,27)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (122,10)-(122,16) = "rescue" - │ │ ├── exceptions: (length: 0) - │ │ ├── operator_loc: (122,17)-(122,19) = "=>" - │ │ ├── reference: - │ │ │ @ IndexTargetNode (location: (122,20)-(122,27)) - │ │ │ ├── flags: attribute_write - │ │ │ ├── receiver: - │ │ │ │ @ CallNode (location: (122,20)-(122,21)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :a - │ │ │ │ ├── message_loc: (122,20)-(122,21) = "a" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── opening_loc: (122,21)-(122,22) = "[" - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (122,22)-(122,26)) - │ │ │ │ ├── flags: contains_splat - │ │ │ │ └── arguments: (length: 2) - │ │ │ │ ├── @ IntegerNode (location: (122,22)-(122,23)) - │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ └── value: 1 - │ │ │ │ └── @ SplatNode (location: (122,25)-(122,26)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── operator_loc: (122,25)-(122,26) = "*" - │ │ │ │ └── expression: ∅ - │ │ │ ├── closing_loc: (122,26)-(122,27) = "]" - │ │ │ └── block: ∅ - │ │ ├── statements: ∅ - │ │ └── subsequent: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: ∅ - │ └── end_keyword_loc: (122,29)-(122,32) = "end" - ├── locals: [] - ├── def_keyword_loc: (122,0)-(122,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: (122,5)-(122,6) = "(" - ├── rparen_loc: (122,7)-(122,8) = ")" - ├── equal_loc: ∅ - └── end_keyword_loc: (122,29)-(122,32) = "end" diff --git a/test/prism/snapshots/begin_ensure.txt b/test/prism/snapshots/begin_ensure.txt deleted file mode 100644 index 2f127cd11f8e75..00000000000000 --- a/test/prism/snapshots/begin_ensure.txt +++ /dev/null @@ -1,286 +0,0 @@ -@ ProgramNode (location: (1,0)-(21,15)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(21,15)) - ├── flags: ∅ - └── body: (length: 5) - ├── @ BeginNode (location: (1,0)-(5,3)) - │ ├── flags: newline - │ ├── begin_keyword_loc: (1,0)-(1,5) = "begin" - │ ├── statements: - │ │ @ StatementsNode (location: (2,0)-(2,1)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (2,0)-(2,1)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (2,0)-(2,1) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── rescue_clause: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: - │ │ @ EnsureNode (location: (3,0)-(5,3)) - │ │ ├── flags: ∅ - │ │ ├── ensure_keyword_loc: (3,0)-(3,6) = "ensure" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (4,0)-(4,1)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (4,0)-(4,1)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (4,0)-(4,1) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── end_keyword_loc: (5,0)-(5,3) = "end" - │ └── end_keyword_loc: (5,0)-(5,3) = "end" - ├── @ BeginNode (location: (7,0)-(7,24)) - │ ├── flags: newline - │ ├── begin_keyword_loc: (7,0)-(7,5) = "begin" - │ ├── statements: - │ │ @ StatementsNode (location: (7,7)-(7,8)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (7,7)-(7,8)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (7,7)-(7,8) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── rescue_clause: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: - │ │ @ EnsureNode (location: (7,10)-(7,24)) - │ │ ├── flags: ∅ - │ │ ├── ensure_keyword_loc: (7,10)-(7,16) = "ensure" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (7,18)-(7,19)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (7,18)-(7,19)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (7,18)-(7,19) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── end_keyword_loc: (7,21)-(7,24) = "end" - │ └── end_keyword_loc: (7,21)-(7,24) = "end" - ├── @ BeginNode (location: (9,0)-(11,4)) - │ ├── flags: newline - │ ├── begin_keyword_loc: (9,0)-(9,5) = "begin" - │ ├── statements: - │ │ @ StatementsNode (location: (9,6)-(9,7)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (9,6)-(9,7)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (9,6)-(9,7) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── rescue_clause: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: - │ │ @ EnsureNode (location: (10,1)-(11,4)) - │ │ ├── flags: ∅ - │ │ ├── ensure_keyword_loc: (10,1)-(10,7) = "ensure" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (10,8)-(10,9)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (10,8)-(10,9)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (10,8)-(10,9) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── end_keyword_loc: (11,1)-(11,4) = "end" - │ └── end_keyword_loc: (11,1)-(11,4) = "end" - ├── @ BeginNode (location: (13,0)-(13,22)) - │ ├── flags: newline - │ ├── begin_keyword_loc: (13,0)-(13,5) = "begin" - │ ├── statements: - │ │ @ StatementsNode (location: (13,6)-(13,7)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (13,6)-(13,7)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (13,6)-(13,7) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── rescue_clause: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: - │ │ @ EnsureNode (location: (13,9)-(13,22)) - │ │ ├── flags: ∅ - │ │ ├── ensure_keyword_loc: (13,9)-(13,15) = "ensure" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (13,16)-(13,17)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (13,16)-(13,17)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (13,16)-(13,17) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── end_keyword_loc: (13,19)-(13,22) = "end" - │ └── end_keyword_loc: (13,19)-(13,22) = "end" - └── @ BeginNode (location: (15,0)-(21,15)) - ├── flags: newline - ├── begin_keyword_loc: (15,0)-(15,5) = "begin" - ├── statements: - │ @ StatementsNode (location: (15,6)-(21,11)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ BeginNode (location: (15,6)-(21,11)) - │ ├── flags: newline - │ ├── begin_keyword_loc: (15,6)-(15,11) = "begin" - │ ├── statements: - │ │ @ StatementsNode (location: (15,11)-(21,7)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (15,11)-(21,7)) - │ │ ├── flags: newline - │ │ ├── receiver: - │ │ │ @ SymbolNode (location: (15,11)-(15,13)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (15,11)-(15,12) = ":" - │ │ │ ├── value_loc: (15,12)-(15,13) = "s" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "s" - │ │ ├── call_operator_loc: (15,13)-(15,14) = "." - │ │ ├── name: :l - │ │ ├── message_loc: (15,14)-(15,15) = "l" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (15,16)-(21,7)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ BeginNode (location: (15,16)-(21,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── begin_keyword_loc: (15,16)-(15,21) = "begin" - │ │ │ ├── statements: ∅ - │ │ │ ├── rescue_clause: ∅ - │ │ │ ├── else_clause: ∅ - │ │ │ ├── ensure_clause: - │ │ │ │ @ EnsureNode (location: (15,22)-(21,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── ensure_keyword_loc: (15,22)-(15,28) = "ensure" - │ │ │ │ ├── statements: - │ │ │ │ │ @ StatementsNode (location: (15,29)-(21,3)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── body: (length: 1) - │ │ │ │ │ └── @ CallNode (location: (15,29)-(21,3)) - │ │ │ │ │ ├── flags: newline - │ │ │ │ │ ├── receiver: - │ │ │ │ │ │ @ ConstantReadNode (location: (15,29)-(15,35)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ └── name: :Module - │ │ │ │ │ ├── call_operator_loc: (15,35)-(15,36) = "." - │ │ │ │ │ ├── name: :new - │ │ │ │ │ ├── message_loc: (15,36)-(15,39) = "new" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: - │ │ │ │ │ @ BlockNode (location: (15,40)-(21,3)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── locals: [] - │ │ │ │ │ ├── parameters: ∅ - │ │ │ │ │ ├── body: - │ │ │ │ │ │ @ StatementsNode (location: (16,2)-(20,5)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ └── body: (length: 1) - │ │ │ │ │ │ └── @ BeginNode (location: (16,2)-(20,5)) - │ │ │ │ │ │ ├── flags: newline - │ │ │ │ │ │ ├── begin_keyword_loc: (16,2)-(16,7) = "begin" - │ │ │ │ │ │ ├── statements: - │ │ │ │ │ │ │ @ StatementsNode (location: (17,4)-(17,9)) - │ │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ │ └── body: (length: 1) - │ │ │ │ │ │ │ └── @ BreakNode (location: (17,4)-(17,9)) - │ │ │ │ │ │ │ ├── flags: newline - │ │ │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ │ │ └── keyword_loc: (17,4)-(17,9) = "break" - │ │ │ │ │ │ ├── rescue_clause: ∅ - │ │ │ │ │ │ ├── else_clause: ∅ - │ │ │ │ │ │ ├── ensure_clause: - │ │ │ │ │ │ │ @ EnsureNode (location: (18,4)-(20,5)) - │ │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ │ ├── ensure_keyword_loc: (18,4)-(18,10) = "ensure" - │ │ │ │ │ │ │ ├── statements: - │ │ │ │ │ │ │ │ @ StatementsNode (location: (18,11)-(19,7)) - │ │ │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ │ │ └── body: (length: 1) - │ │ │ │ │ │ │ │ └── @ CallNode (location: (18,11)-(19,7)) - │ │ │ │ │ │ │ │ ├── flags: newline - │ │ │ │ │ │ │ │ ├── receiver: - │ │ │ │ │ │ │ │ │ @ ConstantReadNode (location: (18,11)-(18,17)) - │ │ │ │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ │ │ │ └── name: :Module - │ │ │ │ │ │ │ │ ├── call_operator_loc: (18,17)-(18,18) = "." - │ │ │ │ │ │ │ │ ├── name: :new - │ │ │ │ │ │ │ │ ├── message_loc: (18,18)-(18,21) = "new" - │ │ │ │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ │ │ │ └── block: - │ │ │ │ │ │ │ │ @ BlockNode (location: (18,22)-(19,7)) - │ │ │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ │ │ ├── locals: [] - │ │ │ │ │ │ │ │ ├── parameters: ∅ - │ │ │ │ │ │ │ │ ├── body: ∅ - │ │ │ │ │ │ │ │ ├── opening_loc: (18,22)-(18,24) = "do" - │ │ │ │ │ │ │ │ └── closing_loc: (19,4)-(19,7) = "end" - │ │ │ │ │ │ │ └── end_keyword_loc: (20,2)-(20,5) = "end" - │ │ │ │ │ │ └── end_keyword_loc: (20,2)-(20,5) = "end" - │ │ │ │ │ ├── opening_loc: (15,40)-(15,42) = "do" - │ │ │ │ │ └── closing_loc: (21,0)-(21,3) = "end" - │ │ │ │ └── end_keyword_loc: (21,4)-(21,7) = "end" - │ │ │ └── end_keyword_loc: (21,4)-(21,7) = "end" - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── rescue_clause: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: ∅ - │ └── end_keyword_loc: (21,8)-(21,11) = "end" - ├── rescue_clause: ∅ - ├── else_clause: ∅ - ├── ensure_clause: ∅ - └── end_keyword_loc: (21,12)-(21,15) = "end" diff --git a/test/prism/snapshots/begin_rescue.txt b/test/prism/snapshots/begin_rescue.txt deleted file mode 100644 index a3f78ec5f74454..00000000000000 --- a/test/prism/snapshots/begin_rescue.txt +++ /dev/null @@ -1,786 +0,0 @@ -@ ProgramNode (location: (1,0)-(78,3)) -├── flags: ∅ -├── locals: [:ex] -└── statements: - @ StatementsNode (location: (1,0)-(78,3)) - ├── flags: ∅ - └── body: (length: 17) - ├── @ BeginNode (location: (1,0)-(1,33)) - │ ├── flags: newline - │ ├── begin_keyword_loc: (1,0)-(1,5) = "begin" - │ ├── statements: - │ │ @ StatementsNode (location: (1,7)-(1,8)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (1,7)-(1,8)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (1,7)-(1,8) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── rescue_clause: - │ │ @ RescueNode (location: (1,10)-(1,19)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (1,10)-(1,16) = "rescue" - │ │ ├── exceptions: (length: 0) - │ │ ├── operator_loc: ∅ - │ │ ├── reference: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (1,18)-(1,19)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (1,18)-(1,19)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (1,18)-(1,19) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── subsequent: ∅ - │ ├── else_clause: - │ │ @ ElseNode (location: (1,21)-(1,33)) - │ │ ├── flags: ∅ - │ │ ├── else_keyword_loc: (1,21)-(1,25) = "else" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (1,27)-(1,28)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (1,27)-(1,28)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :c - │ │ │ ├── message_loc: (1,27)-(1,28) = "c" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── end_keyword_loc: (1,30)-(1,33) = "end" - │ ├── ensure_clause: ∅ - │ └── end_keyword_loc: (1,30)-(1,33) = "end" - ├── @ BeginNode (location: (3,0)-(3,44)) - │ ├── flags: newline - │ ├── begin_keyword_loc: (3,0)-(3,5) = "begin" - │ ├── statements: - │ │ @ StatementsNode (location: (3,7)-(3,8)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (3,7)-(3,8)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (3,7)-(3,8) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── rescue_clause: - │ │ @ RescueNode (location: (3,10)-(3,19)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (3,10)-(3,16) = "rescue" - │ │ ├── exceptions: (length: 0) - │ │ ├── operator_loc: ∅ - │ │ ├── reference: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (3,18)-(3,19)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (3,18)-(3,19)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (3,18)-(3,19) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── subsequent: ∅ - │ ├── else_clause: - │ │ @ ElseNode (location: (3,21)-(3,36)) - │ │ ├── flags: ∅ - │ │ ├── else_keyword_loc: (3,21)-(3,25) = "else" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (3,27)-(3,28)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (3,27)-(3,28)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :c - │ │ │ ├── message_loc: (3,27)-(3,28) = "c" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── end_keyword_loc: (3,30)-(3,36) = "ensure" - │ ├── ensure_clause: - │ │ @ EnsureNode (location: (3,30)-(3,44)) - │ │ ├── flags: ∅ - │ │ ├── ensure_keyword_loc: (3,30)-(3,36) = "ensure" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (3,38)-(3,39)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (3,38)-(3,39)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :d - │ │ │ ├── message_loc: (3,38)-(3,39) = "d" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── end_keyword_loc: (3,41)-(3,44) = "end" - │ └── end_keyword_loc: (3,41)-(3,44) = "end" - ├── @ BeginNode (location: (5,0)-(7,3)) - │ ├── flags: newline - │ ├── begin_keyword_loc: (5,0)-(5,5) = "begin" - │ ├── statements: - │ │ @ StatementsNode (location: (6,0)-(6,1)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (6,0)-(6,1)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (6,0)-(6,1) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── rescue_clause: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: ∅ - │ └── end_keyword_loc: (7,0)-(7,3) = "end" - ├── @ BeginNode (location: (9,0)-(9,13)) - │ ├── flags: newline - │ ├── begin_keyword_loc: (9,0)-(9,5) = "begin" - │ ├── statements: - │ │ @ StatementsNode (location: (9,7)-(9,8)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (9,7)-(9,8)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (9,7)-(9,8) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── rescue_clause: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: ∅ - │ └── end_keyword_loc: (9,10)-(9,13) = "end" - ├── @ BeginNode (location: (11,0)-(12,4)) - │ ├── flags: newline - │ ├── begin_keyword_loc: (11,0)-(11,5) = "begin" - │ ├── statements: - │ │ @ StatementsNode (location: (11,6)-(11,7)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (11,6)-(11,7)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (11,6)-(11,7) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── rescue_clause: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: ∅ - │ └── end_keyword_loc: (12,1)-(12,4) = "end" - ├── @ BeginNode (location: (14,0)-(14,12)) - │ ├── flags: newline - │ ├── begin_keyword_loc: (14,0)-(14,5) = "begin" - │ ├── statements: - │ │ @ StatementsNode (location: (14,6)-(14,7)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (14,6)-(14,7)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (14,6)-(14,7) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── rescue_clause: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: ∅ - │ └── end_keyword_loc: (14,9)-(14,12) = "end" - ├── @ BeginNode (location: (16,0)-(24,3)) - │ ├── flags: newline - │ ├── begin_keyword_loc: (16,0)-(16,5) = "begin" - │ ├── statements: - │ │ @ StatementsNode (location: (17,0)-(17,1)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (17,0)-(17,1)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (17,0)-(17,1) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── rescue_clause: - │ │ @ RescueNode (location: (18,0)-(23,1)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (18,0)-(18,6) = "rescue" - │ │ ├── exceptions: (length: 0) - │ │ ├── operator_loc: ∅ - │ │ ├── reference: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (19,0)-(19,1)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (19,0)-(19,1)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (19,0)-(19,1) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── subsequent: - │ │ @ RescueNode (location: (20,0)-(23,1)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (20,0)-(20,6) = "rescue" - │ │ ├── exceptions: (length: 0) - │ │ ├── operator_loc: ∅ - │ │ ├── reference: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (21,0)-(21,1)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (21,0)-(21,1)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :c - │ │ │ ├── message_loc: (21,0)-(21,1) = "c" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── subsequent: - │ │ @ RescueNode (location: (22,0)-(23,1)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (22,0)-(22,6) = "rescue" - │ │ ├── exceptions: (length: 0) - │ │ ├── operator_loc: ∅ - │ │ ├── reference: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (23,0)-(23,1)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (23,0)-(23,1)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :d - │ │ │ ├── message_loc: (23,0)-(23,1) = "d" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── subsequent: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: ∅ - │ └── end_keyword_loc: (24,0)-(24,3) = "end" - ├── @ BeginNode (location: (26,0)-(32,3)) - │ ├── flags: newline - │ ├── begin_keyword_loc: (26,0)-(26,5) = "begin" - │ ├── statements: - │ │ @ StatementsNode (location: (27,2)-(27,3)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (27,2)-(27,3)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (27,2)-(27,3) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── rescue_clause: - │ │ @ RescueNode (location: (28,0)-(31,3)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (28,0)-(28,6) = "rescue" - │ │ ├── exceptions: (length: 1) - │ │ │ └── @ ConstantReadNode (location: (28,7)-(28,16)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :Exception - │ │ ├── operator_loc: (28,17)-(28,19) = "=>" - │ │ ├── reference: - │ │ │ @ LocalVariableTargetNode (location: (28,20)-(28,22)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :ex - │ │ │ └── depth: 0 - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (29,2)-(29,3)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (29,2)-(29,3)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (29,2)-(29,3) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── subsequent: - │ │ @ RescueNode (location: (30,0)-(31,3)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (30,0)-(30,6) = "rescue" - │ │ ├── exceptions: (length: 2) - │ │ │ ├── @ ConstantReadNode (location: (30,7)-(30,23)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :AnotherException - │ │ │ └── @ ConstantReadNode (location: (30,25)-(30,41)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :OneMoreException - │ │ ├── operator_loc: (30,42)-(30,44) = "=>" - │ │ ├── reference: - │ │ │ @ LocalVariableTargetNode (location: (30,45)-(30,47)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :ex - │ │ │ └── depth: 0 - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (31,2)-(31,3)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (31,2)-(31,3)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :c - │ │ │ ├── message_loc: (31,2)-(31,3) = "c" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── subsequent: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: ∅ - │ └── end_keyword_loc: (32,0)-(32,3) = "end" - ├── @ BeginNode (location: (34,0)-(40,3)) - │ ├── flags: newline - │ ├── begin_keyword_loc: (34,0)-(34,5) = "begin" - │ ├── statements: - │ │ @ StatementsNode (location: (35,2)-(35,3)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (35,2)-(35,3)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (35,2)-(35,3) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── rescue_clause: - │ │ @ RescueNode (location: (36,0)-(37,3)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (36,0)-(36,6) = "rescue" - │ │ ├── exceptions: (length: 1) - │ │ │ └── @ ConstantReadNode (location: (36,7)-(36,16)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :Exception - │ │ ├── operator_loc: (36,17)-(36,19) = "=>" - │ │ ├── reference: - │ │ │ @ LocalVariableTargetNode (location: (36,20)-(36,22)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :ex - │ │ │ └── depth: 0 - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (37,2)-(37,3)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (37,2)-(37,3)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (37,2)-(37,3) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── subsequent: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: - │ │ @ EnsureNode (location: (38,0)-(40,3)) - │ │ ├── flags: ∅ - │ │ ├── ensure_keyword_loc: (38,0)-(38,6) = "ensure" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (39,2)-(39,3)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (39,2)-(39,3)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (39,2)-(39,3) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── end_keyword_loc: (40,0)-(40,3) = "end" - │ └── end_keyword_loc: (40,0)-(40,3) = "end" - ├── @ StringNode (location: (42,0)-(42,6)) - │ ├── flags: newline - │ ├── opening_loc: (42,0)-(42,2) = "%!" - │ ├── content_loc: (42,2)-(42,5) = "abc" - │ ├── closing_loc: (42,5)-(42,6) = "!" - │ └── unescaped: "abc" - ├── @ BeginNode (location: (44,0)-(48,3)) - │ ├── flags: newline - │ ├── begin_keyword_loc: (44,0)-(44,5) = "begin" - │ ├── statements: - │ │ @ StatementsNode (location: (45,0)-(45,1)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (45,0)-(45,1)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (45,0)-(45,1) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── rescue_clause: - │ │ @ RescueNode (location: (46,0)-(47,1)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (46,0)-(46,6) = "rescue" - │ │ ├── exceptions: (length: 0) - │ │ ├── operator_loc: ∅ - │ │ ├── reference: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (47,0)-(47,1)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (47,0)-(47,1)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (47,0)-(47,1) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── subsequent: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: ∅ - │ └── end_keyword_loc: (48,0)-(48,3) = "end" - ├── @ BeginNode (location: (50,0)-(50,20)) - │ ├── flags: newline - │ ├── begin_keyword_loc: (50,0)-(50,5) = "begin" - │ ├── statements: - │ │ @ StatementsNode (location: (50,6)-(50,7)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (50,6)-(50,7)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (50,6)-(50,7) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── rescue_clause: - │ │ @ RescueNode (location: (50,8)-(50,16)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (50,8)-(50,14) = "rescue" - │ │ ├── exceptions: (length: 0) - │ │ ├── operator_loc: ∅ - │ │ ├── reference: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (50,15)-(50,16)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (50,15)-(50,16)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (50,15)-(50,16) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── subsequent: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: ∅ - │ └── end_keyword_loc: (50,17)-(50,20) = "end" - ├── @ BeginNode (location: (52,0)-(54,5)) - │ ├── flags: newline - │ ├── begin_keyword_loc: (52,0)-(52,5) = "begin" - │ ├── statements: - │ │ @ StatementsNode (location: (53,0)-(53,1)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (53,0)-(53,1)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (53,0)-(53,1) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── rescue_clause: - │ │ @ RescueNode (location: (53,2)-(54,1)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (53,2)-(53,8) = "rescue" - │ │ ├── exceptions: (length: 0) - │ │ ├── operator_loc: ∅ - │ │ ├── reference: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (54,0)-(54,1)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (54,0)-(54,1)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (54,0)-(54,1) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── subsequent: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: ∅ - │ └── end_keyword_loc: (54,2)-(54,5) = "end" - ├── @ BeginNode (location: (56,0)-(60,3)) - │ ├── flags: newline - │ ├── begin_keyword_loc: (56,0)-(56,5) = "begin" - │ ├── statements: - │ │ @ StatementsNode (location: (57,0)-(57,1)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (57,0)-(57,1)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (57,0)-(57,1) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── rescue_clause: - │ │ @ RescueNode (location: (58,0)-(59,1)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (58,0)-(58,6) = "rescue" - │ │ ├── exceptions: (length: 1) - │ │ │ └── @ ConstantReadNode (location: (58,7)-(58,16)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :Exception - │ │ ├── operator_loc: ∅ - │ │ ├── reference: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (59,0)-(59,1)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (59,0)-(59,1)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (59,0)-(59,1) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── subsequent: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: ∅ - │ └── end_keyword_loc: (60,0)-(60,3) = "end" - ├── @ BeginNode (location: (62,0)-(66,3)) - │ ├── flags: newline - │ ├── begin_keyword_loc: (62,0)-(62,5) = "begin" - │ ├── statements: - │ │ @ StatementsNode (location: (63,0)-(63,1)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (63,0)-(63,1)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (63,0)-(63,1) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── rescue_clause: - │ │ @ RescueNode (location: (64,0)-(65,1)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (64,0)-(64,6) = "rescue" - │ │ ├── exceptions: (length: 2) - │ │ │ ├── @ ConstantReadNode (location: (64,7)-(64,16)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :Exception - │ │ │ └── @ ConstantReadNode (location: (64,18)-(64,33)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :CustomException - │ │ ├── operator_loc: ∅ - │ │ ├── reference: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (65,0)-(65,1)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (65,0)-(65,1)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (65,0)-(65,1) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── subsequent: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: ∅ - │ └── end_keyword_loc: (66,0)-(66,3) = "end" - ├── @ BeginNode (location: (68,0)-(72,3)) - │ ├── flags: newline - │ ├── begin_keyword_loc: (68,0)-(68,5) = "begin" - │ ├── statements: - │ │ @ StatementsNode (location: (69,2)-(69,3)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (69,2)-(69,3)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (69,2)-(69,3) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── rescue_clause: - │ │ @ RescueNode (location: (70,0)-(71,3)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (70,0)-(70,6) = "rescue" - │ │ ├── exceptions: (length: 2) - │ │ │ ├── @ ConstantReadNode (location: (70,7)-(70,16)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :Exception - │ │ │ └── @ ConstantReadNode (location: (70,18)-(70,33)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :CustomException - │ │ ├── operator_loc: (70,34)-(70,36) = "=>" - │ │ ├── reference: - │ │ │ @ LocalVariableTargetNode (location: (70,37)-(70,39)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :ex - │ │ │ └── depth: 0 - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (71,2)-(71,3)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (71,2)-(71,3)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (71,2)-(71,3) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── subsequent: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: ∅ - │ └── end_keyword_loc: (72,0)-(72,3) = "end" - └── @ BeginNode (location: (74,0)-(78,3)) - ├── flags: newline - ├── begin_keyword_loc: (74,0)-(74,5) = "begin" - ├── statements: - │ @ StatementsNode (location: (75,2)-(75,3)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (75,2)-(75,3)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (75,2)-(75,3) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── rescue_clause: - │ @ RescueNode (location: (76,0)-(77,3)) - │ ├── flags: ∅ - │ ├── keyword_loc: (76,0)-(76,6) = "rescue" - │ ├── exceptions: (length: 1) - │ │ └── @ ConstantReadNode (location: (76,7)-(76,16)) - │ │ ├── flags: ∅ - │ │ └── name: :Exception - │ ├── operator_loc: (76,17)-(76,19) = "=>" - │ ├── reference: - │ │ @ LocalVariableTargetNode (location: (76,20)-(76,22)) - │ │ ├── flags: ∅ - │ │ ├── name: :ex - │ │ └── depth: 0 - │ ├── statements: - │ │ @ StatementsNode (location: (77,2)-(77,3)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (77,2)-(77,3)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :b - │ │ ├── message_loc: (77,2)-(77,3) = "b" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── subsequent: ∅ - ├── else_clause: ∅ - ├── ensure_clause: ∅ - └── end_keyword_loc: (78,0)-(78,3) = "end" diff --git a/test/prism/snapshots/blocks.txt b/test/prism/snapshots/blocks.txt deleted file mode 100644 index 761e3bb0515444..00000000000000 --- a/test/prism/snapshots/blocks.txt +++ /dev/null @@ -1,829 +0,0 @@ -@ ProgramNode (location: (1,0)-(54,17)) -├── flags: ∅ -├── locals: [:fork] -└── statements: - @ StatementsNode (location: (1,0)-(54,17)) - ├── flags: ∅ - └── body: (length: 20) - ├── @ CallNode (location: (1,0)-(1,16)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (1,0)-(1,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (1,0)-(1,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :[] - │ ├── message_loc: (1,3)-(1,8) = "[bar]" - │ ├── opening_loc: (1,3)-(1,4) = "[" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,4)-(1,7)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (1,4)-(1,7)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (1,4)-(1,7) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (1,7)-(1,8) = "]" - │ └── block: - │ @ BlockNode (location: (1,9)-(1,16)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (1,11)-(1,14)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (1,11)-(1,14)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :baz - │ │ ├── message_loc: (1,11)-(1,14) = "baz" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── opening_loc: (1,9)-(1,10) = "{" - │ └── closing_loc: (1,15)-(1,16) = "}" - ├── @ CallNode (location: (3,0)-(5,3)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (3,0)-(3,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (3,0)-(3,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :[] - │ ├── message_loc: (3,3)-(3,8) = "[bar]" - │ ├── opening_loc: (3,3)-(3,4) = "[" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (3,4)-(3,7)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (3,4)-(3,7)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (3,4)-(3,7) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (3,7)-(3,8) = "]" - │ └── block: - │ @ BlockNode (location: (3,9)-(5,3)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (4,0)-(4,3)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (4,0)-(4,3)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :baz - │ │ ├── message_loc: (4,0)-(4,3) = "baz" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── opening_loc: (3,9)-(3,11) = "do" - │ └── closing_loc: (5,0)-(5,3) = "end" - ├── @ CallNode (location: (7,0)-(7,35)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (7,0)-(7,1)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :x - │ │ ├── message_loc: (7,0)-(7,1) = "x" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (7,1)-(7,2) = "." - │ ├── name: :reduce - │ ├── message_loc: (7,2)-(7,8) = "reduce" - │ ├── opening_loc: (7,8)-(7,9) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (7,9)-(7,10)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (7,9)-(7,10)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 0 - │ ├── closing_loc: (7,10)-(7,11) = ")" - │ └── block: - │ @ BlockNode (location: (7,12)-(7,35)) - │ ├── flags: ∅ - │ ├── locals: [:x, :memo] - │ ├── parameters: - │ │ @ BlockParametersNode (location: (7,14)-(7,23)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (7,15)-(7,22)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 2) - │ │ │ │ ├── @ RequiredParameterNode (location: (7,15)-(7,16)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── name: :x - │ │ │ │ └── @ RequiredParameterNode (location: (7,18)-(7,22)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :memo - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: (7,14)-(7,15) = "|" - │ │ └── closing_loc: (7,22)-(7,23) = "|" - │ ├── body: - │ │ @ StatementsNode (location: (7,24)-(7,33)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ LocalVariableOperatorWriteNode (location: (7,24)-(7,33)) - │ │ ├── flags: newline - │ │ ├── name_loc: (7,24)-(7,28) = "memo" - │ │ ├── binary_operator_loc: (7,29)-(7,31) = "+=" - │ │ ├── value: - │ │ │ @ LocalVariableReadNode (location: (7,32)-(7,33)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :x - │ │ │ └── depth: 0 - │ │ ├── name: :memo - │ │ ├── binary_operator: :+ - │ │ └── depth: 0 - │ ├── opening_loc: (7,12)-(7,13) = "{" - │ └── closing_loc: (7,34)-(7,35) = "}" - ├── @ CallNode (location: (9,0)-(9,10)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (9,0)-(9,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (9,4)-(9,10)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (9,4)-(9,6) = "do" - │ └── closing_loc: (9,7)-(9,10) = "end" - ├── @ CallNode (location: (11,0)-(11,21)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (11,0)-(11,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (11,4)-(11,21)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (11,4)-(11,7)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (11,4)-(11,7) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── @ ParenthesesNode (location: (11,9)-(11,21)) - │ │ ├── flags: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (11,10)-(11,20)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (11,10)-(11,20)) - │ │ │ ├── flags: newline, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :baz - │ │ │ ├── message_loc: (11,10)-(11,13) = "baz" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: - │ │ │ @ BlockNode (location: (11,14)-(11,20)) - │ │ │ ├── flags: ∅ - │ │ │ ├── locals: [] - │ │ │ ├── parameters: ∅ - │ │ │ ├── body: ∅ - │ │ │ ├── opening_loc: (11,14)-(11,16) = "do" - │ │ │ └── closing_loc: (11,17)-(11,20) = "end" - │ │ ├── opening_loc: (11,9)-(11,10) = "(" - │ │ └── closing_loc: (11,20)-(11,21) = ")" - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (13,0)-(13,14)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (13,0)-(13,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (13,4)-(13,7)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (13,4)-(13,7)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (13,4)-(13,7) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (13,8)-(13,14)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (13,8)-(13,10) = "do" - │ └── closing_loc: (13,11)-(13,14) = "end" - ├── @ CallNode (location: (15,0)-(15,18)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (15,0)-(15,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (15,4)-(15,11)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (15,4)-(15,11)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (15,4)-(15,7) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (15,8)-(15,11)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ CallNode (location: (15,8)-(15,11)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :baz - │ │ │ ├── message_loc: (15,8)-(15,11) = "baz" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (15,12)-(15,18)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (15,12)-(15,14) = "do" - │ └── closing_loc: (15,15)-(15,18) = "end" - ├── @ CallNode (location: (17,0)-(18,3)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (17,0)-(17,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (17,4)-(18,3)) - │ ├── flags: ∅ - │ ├── locals: [:a] - │ ├── parameters: - │ │ @ BlockParametersNode (location: (17,7)-(17,17)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (17,8)-(17,16)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 0) - │ │ │ ├── optionals: (length: 1) - │ │ │ │ └── @ OptionalParameterNode (location: (17,8)-(17,16)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :a - │ │ │ │ ├── name_loc: (17,8)-(17,9) = "a" - │ │ │ │ ├── operator_loc: (17,10)-(17,11) = "=" - │ │ │ │ └── value: - │ │ │ │ @ CallNode (location: (17,12)-(17,16)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── receiver: - │ │ │ │ │ @ CallNode (location: (17,12)-(17,13)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :b - │ │ │ │ │ ├── message_loc: (17,12)-(17,13) = "b" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :[] - │ │ │ │ ├── message_loc: (17,13)-(17,16) = "[1]" - │ │ │ │ ├── opening_loc: (17,13)-(17,14) = "[" - │ │ │ │ ├── arguments: - │ │ │ │ │ @ ArgumentsNode (location: (17,14)-(17,15)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── arguments: (length: 1) - │ │ │ │ │ └── @ IntegerNode (location: (17,14)-(17,15)) - │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ └── value: 1 - │ │ │ │ ├── closing_loc: (17,15)-(17,16) = "]" - │ │ │ │ └── block: ∅ - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: (17,7)-(17,8) = "|" - │ │ └── closing_loc: (17,16)-(17,17) = "|" - │ ├── body: ∅ - │ ├── opening_loc: (17,4)-(17,6) = "do" - │ └── closing_loc: (18,0)-(18,3) = "end" - ├── @ CallNode (location: (20,0)-(22,3)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (20,0)-(20,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (20,4)-(22,3)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ BeginNode (location: (20,4)-(22,3)) - │ │ ├── flags: ∅ - │ │ ├── begin_keyword_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── rescue_clause: - │ │ │ @ RescueNode (location: (21,0)-(21,6)) - │ │ │ ├── flags: ∅ - │ │ │ ├── keyword_loc: (21,0)-(21,6) = "rescue" - │ │ │ ├── exceptions: (length: 0) - │ │ │ ├── operator_loc: ∅ - │ │ │ ├── reference: ∅ - │ │ │ ├── statements: ∅ - │ │ │ └── subsequent: ∅ - │ │ ├── else_clause: ∅ - │ │ ├── ensure_clause: ∅ - │ │ └── end_keyword_loc: (22,0)-(22,3) = "end" - │ ├── opening_loc: (20,4)-(20,6) = "do" - │ └── closing_loc: (22,0)-(22,3) = "end" - ├── @ CallNode (location: (24,0)-(29,3)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (24,0)-(24,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (24,4)-(29,3)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (25,2)-(28,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (25,2)-(28,5)) - │ │ ├── flags: newline, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (25,2)-(25,5) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: - │ │ @ BlockNode (location: (25,6)-(28,5)) - │ │ ├── flags: ∅ - │ │ ├── locals: [] - │ │ ├── parameters: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (26,4)-(27,7)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (26,4)-(27,7)) - │ │ │ ├── flags: newline, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :baz - │ │ │ ├── message_loc: (26,4)-(26,7) = "baz" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: - │ │ │ @ BlockNode (location: (26,8)-(27,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── locals: [] - │ │ │ ├── parameters: ∅ - │ │ │ ├── body: ∅ - │ │ │ ├── opening_loc: (26,8)-(26,10) = "do" - │ │ │ └── closing_loc: (27,4)-(27,7) = "end" - │ │ ├── opening_loc: (25,6)-(25,8) = "do" - │ │ └── closing_loc: (28,2)-(28,5) = "end" - │ ├── opening_loc: (24,4)-(24,6) = "do" - │ └── closing_loc: (29,0)-(29,3) = "end" - ├── @ CallNode (location: (31,0)-(31,16)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (31,0)-(31,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (31,0)-(31,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :[] - │ ├── message_loc: (31,3)-(31,8) = "[bar]" - │ ├── opening_loc: (31,3)-(31,4) = "[" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (31,4)-(31,7)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (31,4)-(31,7)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (31,4)-(31,7) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (31,7)-(31,8) = "]" - │ └── block: - │ @ BlockNode (location: (31,9)-(31,16)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (31,11)-(31,14)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (31,11)-(31,14)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :baz - │ │ ├── message_loc: (31,11)-(31,14) = "baz" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── opening_loc: (31,9)-(31,10) = "{" - │ └── closing_loc: (31,15)-(31,16) = "}" - ├── @ CallNode (location: (33,0)-(33,24)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (33,0)-(33,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (33,4)-(33,24)) - │ ├── flags: ∅ - │ ├── locals: [:x, :y, :z] - │ ├── parameters: - │ │ @ BlockParametersNode (location: (33,6)-(33,20)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (33,7)-(33,19)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (33,7)-(33,8)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :x - │ │ │ ├── optionals: (length: 1) - │ │ │ │ └── @ OptionalParameterNode (location: (33,10)-(33,15)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :y - │ │ │ │ ├── name_loc: (33,10)-(33,11) = "y" - │ │ │ │ ├── operator_loc: (33,12)-(33,13) = "=" - │ │ │ │ └── value: - │ │ │ │ @ IntegerNode (location: (33,14)-(33,15)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 2 - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 1) - │ │ │ │ └── @ RequiredKeywordParameterNode (location: (33,17)-(33,19)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :z - │ │ │ │ └── name_loc: (33,17)-(33,19) = "z:" - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: (33,6)-(33,7) = "|" - │ │ └── closing_loc: (33,19)-(33,20) = "|" - │ ├── body: - │ │ @ StatementsNode (location: (33,21)-(33,22)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ LocalVariableReadNode (location: (33,21)-(33,22)) - │ │ ├── flags: newline - │ │ ├── name: :x - │ │ └── depth: 0 - │ ├── opening_loc: (33,4)-(33,5) = "{" - │ └── closing_loc: (33,23)-(33,24) = "}" - ├── @ CallNode (location: (35,0)-(35,11)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (35,0)-(35,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (35,4)-(35,11)) - │ ├── flags: ∅ - │ ├── locals: [:x] - │ ├── parameters: - │ │ @ BlockParametersNode (location: (35,6)-(35,9)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (35,7)-(35,8)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (35,7)-(35,8)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :x - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: (35,6)-(35,7) = "|" - │ │ └── closing_loc: (35,8)-(35,9) = "|" - │ ├── body: ∅ - │ ├── opening_loc: (35,4)-(35,5) = "{" - │ └── closing_loc: (35,10)-(35,11) = "}" - ├── @ LocalVariableWriteNode (location: (37,0)-(37,8)) - │ ├── flags: newline - │ ├── name: :fork - │ ├── depth: 0 - │ ├── name_loc: (37,0)-(37,4) = "fork" - │ ├── value: - │ │ @ IntegerNode (location: (37,7)-(37,8)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ └── operator_loc: (37,5)-(37,6) = "=" - ├── @ CallNode (location: (38,0)-(39,3)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :fork - │ ├── message_loc: (38,0)-(38,4) = "fork" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (38,5)-(39,3)) - │ ├── flags: ∅ - │ ├── locals: [:a] - │ ├── parameters: - │ │ @ BlockParametersNode (location: (38,8)-(38,11)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (38,9)-(38,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (38,9)-(38,10)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :a - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: (38,8)-(38,9) = "|" - │ │ └── closing_loc: (38,10)-(38,11) = "|" - │ ├── body: ∅ - │ ├── opening_loc: (38,5)-(38,7) = "do" - │ └── closing_loc: (39,0)-(39,3) = "end" - ├── @ CallNode (location: (41,0)-(41,12)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :fork - │ ├── message_loc: (41,0)-(41,4) = "fork" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (41,5)-(41,12)) - │ ├── flags: ∅ - │ ├── locals: [:a] - │ ├── parameters: - │ │ @ BlockParametersNode (location: (41,7)-(41,10)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (41,8)-(41,9)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (41,8)-(41,9)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :a - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: (41,7)-(41,8) = "|" - │ │ └── closing_loc: (41,9)-(41,10) = "|" - │ ├── body: ∅ - │ ├── opening_loc: (41,5)-(41,6) = "{" - │ └── closing_loc: (41,11)-(41,12) = "}" - ├── @ CallNode (location: (43,0)-(44,3)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :C - │ ├── message_loc: (43,0)-(43,1) = "C" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (43,2)-(44,3)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (43,2)-(43,4) = "do" - │ └── closing_loc: (44,0)-(44,3) = "end" - ├── @ CallNode (location: (46,0)-(46,4)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :C - │ ├── message_loc: (46,0)-(46,1) = "C" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (46,2)-(46,4)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (46,2)-(46,3) = "{" - │ └── closing_loc: (46,3)-(46,4) = "}" - ├── @ CallNode (location: (48,0)-(52,1)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (48,0)-(48,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (48,4)-(52,1)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (48,4)-(52,1)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :lambda - │ │ ├── message_loc: (48,4)-(48,10) = "lambda" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: - │ │ @ BlockNode (location: (48,11)-(52,1)) - │ │ ├── flags: ∅ - │ │ ├── locals: [:a, :b] - │ │ ├── parameters: - │ │ │ @ BlockParametersNode (location: (48,13)-(51,3)) - │ │ │ ├── flags: ∅ - │ │ │ ├── parameters: - │ │ │ │ @ ParametersNode (location: (49,2)-(50,6)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── requireds: (length: 0) - │ │ │ │ ├── optionals: (length: 0) - │ │ │ │ ├── rest: ∅ - │ │ │ │ ├── posts: (length: 0) - │ │ │ │ ├── keywords: (length: 2) - │ │ │ │ │ ├── @ OptionalKeywordParameterNode (location: (49,2)-(49,6)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ ├── name: :a - │ │ │ │ │ │ ├── name_loc: (49,2)-(49,4) = "a:" - │ │ │ │ │ │ └── value: - │ │ │ │ │ │ @ IntegerNode (location: (49,5)-(49,6)) - │ │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ │ └── value: 1 - │ │ │ │ │ └── @ OptionalKeywordParameterNode (location: (50,2)-(50,6)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── name: :b - │ │ │ │ │ ├── name_loc: (50,2)-(50,4) = "b:" - │ │ │ │ │ └── value: - │ │ │ │ │ @ IntegerNode (location: (50,5)-(50,6)) - │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ └── value: 2 - │ │ │ │ ├── keyword_rest: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── locals: (length: 0) - │ │ │ ├── opening_loc: (48,13)-(48,14) = "|" - │ │ │ └── closing_loc: (51,2)-(51,3) = "|" - │ │ ├── body: ∅ - │ │ ├── opening_loc: (48,11)-(48,12) = "{" - │ │ └── closing_loc: (52,0)-(52,1) = "}" - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── @ CallNode (location: (54,0)-(54,17)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :foo - ├── message_loc: (54,0)-(54,3) = "foo" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (54,4)-(54,17)) - ├── flags: ∅ - ├── locals: [:bar] - ├── parameters: - │ @ BlockParametersNode (location: (54,7)-(54,13)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (54,8)-(54,12)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (54,8)-(54,11)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :bar - │ │ ├── optionals: (length: 0) - │ │ ├── rest: - │ │ │ @ ImplicitRestNode (location: (54,11)-(54,12)) - │ │ │ └── flags: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (54,7)-(54,8) = "|" - │ └── closing_loc: (54,12)-(54,13) = "|" - ├── body: ∅ - ├── opening_loc: (54,4)-(54,6) = "do" - └── closing_loc: (54,14)-(54,17) = "end" diff --git a/test/prism/snapshots/boolean_operators.txt b/test/prism/snapshots/boolean_operators.txt deleted file mode 100644 index bde70d650901f1..00000000000000 --- a/test/prism/snapshots/boolean_operators.txt +++ /dev/null @@ -1,59 +0,0 @@ -@ ProgramNode (location: (1,0)-(5,7)) -├── flags: ∅ -├── locals: [:a] -└── statements: - @ StatementsNode (location: (1,0)-(5,7)) - ├── flags: ∅ - └── body: (length: 3) - ├── @ LocalVariableAndWriteNode (location: (1,0)-(1,7)) - │ ├── flags: newline - │ ├── name_loc: (1,0)-(1,1) = "a" - │ ├── operator_loc: (1,2)-(1,5) = "&&=" - │ ├── value: - │ │ @ CallNode (location: (1,6)-(1,7)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :b - │ │ ├── message_loc: (1,6)-(1,7) = "b" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── name: :a - │ └── depth: 0 - ├── @ LocalVariableOperatorWriteNode (location: (3,0)-(3,6)) - │ ├── flags: newline - │ ├── name_loc: (3,0)-(3,1) = "a" - │ ├── binary_operator_loc: (3,2)-(3,4) = "+=" - │ ├── value: - │ │ @ CallNode (location: (3,5)-(3,6)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :b - │ │ ├── message_loc: (3,5)-(3,6) = "b" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── name: :a - │ ├── binary_operator: :+ - │ └── depth: 0 - └── @ LocalVariableOrWriteNode (location: (5,0)-(5,7)) - ├── flags: newline - ├── name_loc: (5,0)-(5,1) = "a" - ├── operator_loc: (5,2)-(5,5) = "||=" - ├── value: - │ @ CallNode (location: (5,6)-(5,7)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :b - │ ├── message_loc: (5,6)-(5,7) = "b" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── name: :a - └── depth: 0 diff --git a/test/prism/snapshots/booleans.txt b/test/prism/snapshots/booleans.txt deleted file mode 100644 index 47ce80217a06cc..00000000000000 --- a/test/prism/snapshots/booleans.txt +++ /dev/null @@ -1,11 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,4)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,4)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ FalseNode (location: (1,0)-(1,5)) - │ └── flags: newline, static_literal - └── @ TrueNode (location: (3,0)-(3,4)) - └── flags: newline, static_literal diff --git a/test/prism/snapshots/break.txt b/test/prism/snapshots/break.txt deleted file mode 100644 index 469b603f849f21..00000000000000 --- a/test/prism/snapshots/break.txt +++ /dev/null @@ -1,499 +0,0 @@ -@ ProgramNode (location: (1,0)-(29,21)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(29,21)) - ├── flags: ∅ - └── body: (length: 13) - ├── @ CallNode (location: (1,0)-(1,13)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :tap - │ ├── message_loc: (1,0)-(1,3) = "tap" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (1,4)-(1,13)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (1,6)-(1,11)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ BreakNode (location: (1,6)-(1,11)) - │ │ ├── flags: newline - │ │ ├── arguments: ∅ - │ │ └── keyword_loc: (1,6)-(1,11) = "break" - │ ├── opening_loc: (1,4)-(1,5) = "{" - │ └── closing_loc: (1,12)-(1,13) = "}" - ├── @ CallNode (location: (3,0)-(3,27)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :tap - │ ├── message_loc: (3,0)-(3,3) = "tap" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (3,4)-(3,27)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (3,6)-(3,25)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ BreakNode (location: (3,6)-(3,25)) - │ │ ├── flags: newline - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (3,12)-(3,25)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 3) - │ │ │ ├── @ ParenthesesNode (location: (3,12)-(3,15)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── body: - │ │ │ │ │ @ StatementsNode (location: (3,13)-(3,14)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── body: (length: 1) - │ │ │ │ │ └── @ IntegerNode (location: (3,13)-(3,14)) - │ │ │ │ │ ├── flags: newline, static_literal, decimal - │ │ │ │ │ └── value: 1 - │ │ │ │ ├── opening_loc: (3,12)-(3,13) = "(" - │ │ │ │ └── closing_loc: (3,14)-(3,15) = ")" - │ │ │ ├── @ ParenthesesNode (location: (3,17)-(3,20)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── body: - │ │ │ │ │ @ StatementsNode (location: (3,18)-(3,19)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── body: (length: 1) - │ │ │ │ │ └── @ IntegerNode (location: (3,18)-(3,19)) - │ │ │ │ │ ├── flags: newline, static_literal, decimal - │ │ │ │ │ └── value: 2 - │ │ │ │ ├── opening_loc: (3,17)-(3,18) = "(" - │ │ │ │ └── closing_loc: (3,19)-(3,20) = ")" - │ │ │ └── @ ParenthesesNode (location: (3,22)-(3,25)) - │ │ │ ├── flags: ∅ - │ │ │ ├── body: - │ │ │ │ @ StatementsNode (location: (3,23)-(3,24)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ IntegerNode (location: (3,23)-(3,24)) - │ │ │ │ ├── flags: newline, static_literal, decimal - │ │ │ │ └── value: 3 - │ │ │ ├── opening_loc: (3,22)-(3,23) = "(" - │ │ │ └── closing_loc: (3,24)-(3,25) = ")" - │ │ └── keyword_loc: (3,6)-(3,11) = "break" - │ ├── opening_loc: (3,4)-(3,5) = "{" - │ └── closing_loc: (3,26)-(3,27) = "}" - ├── @ CallNode (location: (5,0)-(5,15)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :tap - │ ├── message_loc: (5,0)-(5,3) = "tap" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (5,4)-(5,15)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (5,6)-(5,13)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ BreakNode (location: (5,6)-(5,13)) - │ │ ├── flags: newline - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (5,12)-(5,13)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (5,12)-(5,13)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── keyword_loc: (5,6)-(5,11) = "break" - │ ├── opening_loc: (5,4)-(5,5) = "{" - │ └── closing_loc: (5,14)-(5,15) = "}" - ├── @ CallNode (location: (7,0)-(8,3)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :tap - │ ├── message_loc: (7,0)-(7,3) = "tap" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (7,4)-(8,3)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (7,6)-(8,1)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ BreakNode (location: (7,6)-(8,1)) - │ │ ├── flags: newline - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (7,12)-(8,1)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 3) - │ │ │ ├── @ IntegerNode (location: (7,12)-(7,13)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ ├── @ IntegerNode (location: (7,15)-(7,16)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 2 - │ │ │ └── @ IntegerNode (location: (8,0)-(8,1)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 3 - │ │ └── keyword_loc: (7,6)-(7,11) = "break" - │ ├── opening_loc: (7,4)-(7,5) = "{" - │ └── closing_loc: (8,2)-(8,3) = "}" - ├── @ CallNode (location: (10,0)-(10,21)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :tap - │ ├── message_loc: (10,0)-(10,3) = "tap" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (10,4)-(10,21)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (10,6)-(10,19)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ BreakNode (location: (10,6)-(10,19)) - │ │ ├── flags: newline - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (10,12)-(10,19)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 3) - │ │ │ ├── @ IntegerNode (location: (10,12)-(10,13)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ ├── @ IntegerNode (location: (10,15)-(10,16)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 2 - │ │ │ └── @ IntegerNode (location: (10,18)-(10,19)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 3 - │ │ └── keyword_loc: (10,6)-(10,11) = "break" - │ ├── opening_loc: (10,4)-(10,5) = "{" - │ └── closing_loc: (10,20)-(10,21) = "}" - ├── @ CallNode (location: (12,0)-(12,23)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :tap - │ ├── message_loc: (12,0)-(12,3) = "tap" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (12,4)-(12,23)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (12,6)-(12,21)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ BreakNode (location: (12,6)-(12,21)) - │ │ ├── flags: newline - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (12,12)-(12,21)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ ArrayNode (location: (12,12)-(12,21)) - │ │ │ ├── flags: static_literal - │ │ │ ├── elements: (length: 3) - │ │ │ │ ├── @ IntegerNode (location: (12,13)-(12,14)) - │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ └── value: 1 - │ │ │ │ ├── @ IntegerNode (location: (12,16)-(12,17)) - │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ └── value: 2 - │ │ │ │ └── @ IntegerNode (location: (12,19)-(12,20)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 3 - │ │ │ ├── opening_loc: (12,12)-(12,13) = "[" - │ │ │ └── closing_loc: (12,20)-(12,21) = "]" - │ │ └── keyword_loc: (12,6)-(12,11) = "break" - │ ├── opening_loc: (12,4)-(12,5) = "{" - │ └── closing_loc: (12,22)-(12,23) = "}" - ├── @ CallNode (location: (14,0)-(17,3)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :tap - │ ├── message_loc: (14,0)-(14,3) = "tap" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (14,4)-(17,3)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (14,6)-(17,1)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ BreakNode (location: (14,6)-(17,1)) - │ │ ├── flags: newline - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (14,11)-(17,1)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ ParenthesesNode (location: (14,11)-(17,1)) - │ │ │ ├── flags: ∅ - │ │ │ ├── body: - │ │ │ │ @ StatementsNode (location: (15,2)-(16,3)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 2) - │ │ │ │ ├── @ IntegerNode (location: (15,2)-(15,3)) - │ │ │ │ │ ├── flags: newline, static_literal, decimal - │ │ │ │ │ └── value: 1 - │ │ │ │ └── @ IntegerNode (location: (16,2)-(16,3)) - │ │ │ │ ├── flags: newline, static_literal, decimal - │ │ │ │ └── value: 2 - │ │ │ ├── opening_loc: (14,11)-(14,12) = "(" - │ │ │ └── closing_loc: (17,0)-(17,1) = ")" - │ │ └── keyword_loc: (14,6)-(14,11) = "break" - │ ├── opening_loc: (14,4)-(14,5) = "{" - │ └── closing_loc: (17,2)-(17,3) = "}" - ├── @ CallNode (location: (19,0)-(19,15)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :tap - │ ├── message_loc: (19,0)-(19,3) = "tap" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (19,4)-(19,15)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (19,6)-(19,13)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ BreakNode (location: (19,6)-(19,13)) - │ │ ├── flags: newline - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (19,11)-(19,13)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ ParenthesesNode (location: (19,11)-(19,13)) - │ │ │ ├── flags: ∅ - │ │ │ ├── body: ∅ - │ │ │ ├── opening_loc: (19,11)-(19,12) = "(" - │ │ │ └── closing_loc: (19,12)-(19,13) = ")" - │ │ └── keyword_loc: (19,6)-(19,11) = "break" - │ ├── opening_loc: (19,4)-(19,5) = "{" - │ └── closing_loc: (19,14)-(19,15) = "}" - ├── @ CallNode (location: (21,0)-(21,16)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :tap - │ ├── message_loc: (21,0)-(21,3) = "tap" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (21,4)-(21,16)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (21,6)-(21,14)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ BreakNode (location: (21,6)-(21,14)) - │ │ ├── flags: newline - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (21,11)-(21,14)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ ParenthesesNode (location: (21,11)-(21,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── body: - │ │ │ │ @ StatementsNode (location: (21,12)-(21,13)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ IntegerNode (location: (21,12)-(21,13)) - │ │ │ │ ├── flags: newline, static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ ├── opening_loc: (21,11)-(21,12) = "(" - │ │ │ └── closing_loc: (21,13)-(21,14) = ")" - │ │ └── keyword_loc: (21,6)-(21,11) = "break" - │ ├── opening_loc: (21,4)-(21,5) = "{" - │ └── closing_loc: (21,15)-(21,16) = "}" - ├── @ CallNode (location: (23,0)-(23,22)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (23,0)-(23,16)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (23,0)-(23,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: - │ │ @ BlockNode (location: (23,4)-(23,16)) - │ │ ├── flags: ∅ - │ │ ├── locals: [] - │ │ ├── parameters: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (23,6)-(23,14)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ BreakNode (location: (23,6)-(23,14)) - │ │ │ ├── flags: newline - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (23,12)-(23,14)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ IntegerNode (location: (23,12)-(23,14)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 42 - │ │ │ └── keyword_loc: (23,6)-(23,11) = "break" - │ │ ├── opening_loc: (23,4)-(23,5) = "{" - │ │ └── closing_loc: (23,15)-(23,16) = "}" - │ ├── call_operator_loc: ∅ - │ ├── name: :== - │ ├── message_loc: (23,17)-(23,19) = "==" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (23,20)-(23,22)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (23,20)-(23,22)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 42 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (25,0)-(25,23)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (25,0)-(25,17)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (25,0)-(25,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: - │ │ @ BlockNode (location: (25,4)-(25,17)) - │ │ ├── flags: ∅ - │ │ ├── locals: [:a] - │ │ ├── parameters: - │ │ │ @ BlockParametersNode (location: (25,6)-(25,9)) - │ │ │ ├── flags: ∅ - │ │ │ ├── parameters: - │ │ │ │ @ ParametersNode (location: (25,7)-(25,8)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── requireds: (length: 1) - │ │ │ │ │ └── @ RequiredParameterNode (location: (25,7)-(25,8)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── name: :a - │ │ │ │ ├── optionals: (length: 0) - │ │ │ │ ├── rest: ∅ - │ │ │ │ ├── posts: (length: 0) - │ │ │ │ ├── keywords: (length: 0) - │ │ │ │ ├── keyword_rest: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── locals: (length: 0) - │ │ │ ├── opening_loc: (25,6)-(25,7) = "|" - │ │ │ └── closing_loc: (25,8)-(25,9) = "|" - │ │ ├── body: - │ │ │ @ StatementsNode (location: (25,10)-(25,15)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ BreakNode (location: (25,10)-(25,15)) - │ │ │ ├── flags: newline - │ │ │ ├── arguments: ∅ - │ │ │ └── keyword_loc: (25,10)-(25,15) = "break" - │ │ ├── opening_loc: (25,4)-(25,5) = "{" - │ │ └── closing_loc: (25,16)-(25,17) = "}" - │ ├── call_operator_loc: ∅ - │ ├── name: :== - │ ├── message_loc: (25,18)-(25,20) = "==" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (25,21)-(25,23)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (25,21)-(25,23)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 42 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ WhileNode (location: (27,0)-(27,21)) - │ ├── flags: newline - │ ├── keyword_loc: (27,0)-(27,5) = "while" - │ ├── closing_loc: (27,18)-(27,21) = "end" - │ ├── predicate: - │ │ @ AndNode (location: (27,6)-(27,16)) - │ │ ├── flags: ∅ - │ │ ├── left: - │ │ │ @ CallNode (location: (27,6)-(27,7)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :_ - │ │ │ ├── message_loc: (27,6)-(27,7) = "_" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── right: - │ │ │ @ BreakNode (location: (27,11)-(27,16)) - │ │ │ ├── flags: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ └── keyword_loc: (27,11)-(27,16) = "break" - │ │ └── operator_loc: (27,8)-(27,10) = "&&" - │ └── statements: ∅ - └── @ UntilNode (location: (29,0)-(29,21)) - ├── flags: newline - ├── keyword_loc: (29,0)-(29,5) = "until" - ├── closing_loc: (29,18)-(29,21) = "end" - ├── predicate: - │ @ AndNode (location: (29,6)-(29,16)) - │ ├── flags: ∅ - │ ├── left: - │ │ @ CallNode (location: (29,6)-(29,7)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :_ - │ │ ├── message_loc: (29,6)-(29,7) = "_" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── right: - │ │ @ BreakNode (location: (29,11)-(29,16)) - │ │ ├── flags: ∅ - │ │ ├── arguments: ∅ - │ │ └── keyword_loc: (29,11)-(29,16) = "break" - │ └── operator_loc: (29,8)-(29,10) = "&&" - └── statements: ∅ diff --git a/test/prism/snapshots/case.txt b/test/prism/snapshots/case.txt deleted file mode 100644 index 3afc25826c8d78..00000000000000 --- a/test/prism/snapshots/case.txt +++ /dev/null @@ -1,554 +0,0 @@ -@ ProgramNode (location: (1,0)-(55,3)) -├── flags: ∅ -├── locals: [:b] -└── statements: - @ StatementsNode (location: (1,0)-(55,3)) - ├── flags: ∅ - └── body: (length: 15) - ├── @ CaseNode (location: (1,0)-(3,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ SymbolNode (location: (1,5)-(1,8)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (1,5)-(1,6) = ":" - │ │ ├── value_loc: (1,6)-(1,8) = "hi" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "hi" - │ ├── conditions: (length: 1) - │ │ └── @ WhenNode (location: (2,0)-(2,8)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (2,0)-(2,4) = "when" - │ │ ├── conditions: (length: 1) - │ │ │ └── @ SymbolNode (location: (2,5)-(2,8)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (2,5)-(2,6) = ":" - │ │ │ ├── value_loc: (2,6)-(2,8) = "hi" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "hi" - │ │ ├── then_keyword_loc: ∅ - │ │ └── statements: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (1,0)-(1,4) = "case" - │ └── end_keyword_loc: (3,0)-(3,3) = "end" - ├── @ CaseNode (location: (5,0)-(5,58)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ TrueNode (location: (5,5)-(5,9)) - │ │ └── flags: static_literal - │ ├── conditions: (length: 2) - │ │ ├── @ WhenNode (location: (5,11)-(5,30)) - │ │ │ ├── flags: ∅ - │ │ │ ├── keyword_loc: (5,11)-(5,15) = "when" - │ │ │ ├── conditions: (length: 1) - │ │ │ │ └── @ TrueNode (location: (5,16)-(5,20)) - │ │ │ │ └── flags: static_literal - │ │ │ ├── then_keyword_loc: ∅ - │ │ │ └── statements: - │ │ │ @ StatementsNode (location: (5,22)-(5,30)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (5,22)-(5,30)) - │ │ │ ├── flags: newline, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :puts - │ │ │ ├── message_loc: (5,22)-(5,26) = "puts" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (5,27)-(5,30)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ SymbolNode (location: (5,27)-(5,30)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: (5,27)-(5,28) = ":" - │ │ │ │ ├── value_loc: (5,28)-(5,30) = "hi" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "hi" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── @ WhenNode (location: (5,32)-(5,53)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (5,32)-(5,36) = "when" - │ │ ├── conditions: (length: 1) - │ │ │ └── @ FalseNode (location: (5,37)-(5,42)) - │ │ │ └── flags: static_literal - │ │ ├── then_keyword_loc: ∅ - │ │ └── statements: - │ │ @ StatementsNode (location: (5,44)-(5,53)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (5,44)-(5,53)) - │ │ ├── flags: newline, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :puts - │ │ ├── message_loc: (5,44)-(5,48) = "puts" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (5,49)-(5,53)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ SymbolNode (location: (5,49)-(5,53)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (5,49)-(5,50) = ":" - │ │ │ ├── value_loc: (5,50)-(5,53) = "bye" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "bye" - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (5,0)-(5,4) = "case" - │ └── end_keyword_loc: (5,55)-(5,58) = "end" - ├── @ CaseNode (location: (7,0)-(7,20)) - │ ├── flags: newline - │ ├── predicate: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ WhenNode (location: (7,6)-(7,15)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (7,6)-(7,10) = "when" - │ │ ├── conditions: (length: 1) - │ │ │ └── @ SplatNode (location: (7,11)-(7,15)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (7,11)-(7,12) = "*" - │ │ │ └── expression: - │ │ │ @ CallNode (location: (7,12)-(7,15)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (7,12)-(7,15) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── then_keyword_loc: ∅ - │ │ └── statements: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (7,0)-(7,4) = "case" - │ └── end_keyword_loc: (7,17)-(7,20) = "end" - ├── @ CaseNode (location: (9,0)-(13,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ SymbolNode (location: (9,5)-(9,8)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (9,5)-(9,6) = ":" - │ │ ├── value_loc: (9,6)-(9,8) = "hi" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "hi" - │ ├── conditions: (length: 1) - │ │ └── @ WhenNode (location: (10,0)-(10,8)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (10,0)-(10,4) = "when" - │ │ ├── conditions: (length: 1) - │ │ │ └── @ SymbolNode (location: (10,5)-(10,8)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (10,5)-(10,6) = ":" - │ │ │ ├── value_loc: (10,6)-(10,8) = "hi" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "hi" - │ │ ├── then_keyword_loc: ∅ - │ │ └── statements: ∅ - │ ├── else_clause: - │ │ @ ElseNode (location: (11,0)-(13,3)) - │ │ ├── flags: ∅ - │ │ ├── else_keyword_loc: (11,0)-(11,4) = "else" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (12,0)-(12,2)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ SymbolNode (location: (12,0)-(12,2)) - │ │ │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (12,0)-(12,1) = ":" - │ │ │ ├── value_loc: (12,1)-(12,2) = "b" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "b" - │ │ └── end_keyword_loc: (13,0)-(13,3) = "end" - │ ├── case_keyword_loc: (9,0)-(9,4) = "case" - │ └── end_keyword_loc: (13,0)-(13,3) = "end" - ├── @ CaseNode (location: (15,0)-(15,36)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (15,5)-(15,9)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :this - │ │ ├── message_loc: (15,5)-(15,9) = "this" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ WhenNode (location: (15,11)-(15,31)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (15,11)-(15,15) = "when" - │ │ ├── conditions: (length: 2) - │ │ │ ├── @ ConstantReadNode (location: (15,16)-(15,22)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :FooBar - │ │ │ └── @ ConstantReadNode (location: (15,24)-(15,31)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :BazBonk - │ │ ├── then_keyword_loc: ∅ - │ │ └── statements: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (15,0)-(15,4) = "case" - │ └── end_keyword_loc: (15,33)-(15,36) = "end" - ├── @ CaseNode (location: (17,0)-(19,3)) - │ ├── flags: newline - │ ├── predicate: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ WhenNode (location: (18,0)-(18,15)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (18,0)-(18,4) = "when" - │ │ ├── conditions: (length: 1) - │ │ │ └── @ CallNode (location: (18,5)-(18,15)) - │ │ │ ├── flags: ∅ - │ │ │ ├── receiver: - │ │ │ │ @ CallNode (location: (18,5)-(18,8)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :foo - │ │ │ │ ├── message_loc: (18,5)-(18,8) = "foo" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :== - │ │ │ ├── message_loc: (18,9)-(18,11) = "==" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (18,12)-(18,15)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ CallNode (location: (18,12)-(18,15)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :bar - │ │ │ │ ├── message_loc: (18,12)-(18,15) = "bar" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── then_keyword_loc: ∅ - │ │ └── statements: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (17,0)-(17,4) = "case" - │ └── end_keyword_loc: (19,0)-(19,3) = "end" - ├── @ CaseNode (location: (21,0)-(25,3)) - │ ├── flags: newline - │ ├── predicate: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ WhenNode (location: (22,0)-(22,6)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (22,0)-(22,4) = "when" - │ │ ├── conditions: (length: 1) - │ │ │ └── @ CallNode (location: (22,5)-(22,6)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :a - │ │ │ ├── message_loc: (22,5)-(22,6) = "a" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── then_keyword_loc: ∅ - │ │ └── statements: ∅ - │ ├── else_clause: - │ │ @ ElseNode (location: (23,0)-(25,3)) - │ │ ├── flags: ∅ - │ │ ├── else_keyword_loc: (23,0)-(23,4) = "else" - │ │ ├── statements: ∅ - │ │ └── end_keyword_loc: (25,0)-(25,3) = "end" - │ ├── case_keyword_loc: (21,0)-(21,4) = "case" - │ └── end_keyword_loc: (25,0)-(25,3) = "end" - ├── @ CaseNode (location: (27,0)-(30,6)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (27,5)-(27,9)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :type - │ │ ├── message_loc: (27,5)-(27,9) = "type" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ WhenNode (location: (28,3)-(28,10)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (28,3)-(28,7) = "when" - │ │ ├── conditions: (length: 1) - │ │ │ └── @ SymbolNode (location: (28,8)-(28,10)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (28,8)-(28,9) = ":" - │ │ │ ├── value_loc: (28,9)-(28,10) = "b" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "b" - │ │ ├── then_keyword_loc: ∅ - │ │ └── statements: ∅ - │ ├── else_clause: - │ │ @ ElseNode (location: (29,5)-(30,6)) - │ │ ├── flags: ∅ - │ │ ├── else_keyword_loc: (29,5)-(29,9) = "else" - │ │ ├── statements: ∅ - │ │ └── end_keyword_loc: (30,3)-(30,6) = "end" - │ ├── case_keyword_loc: (27,0)-(27,4) = "case" - │ └── end_keyword_loc: (30,3)-(30,6) = "end" - ├── @ CaseNode (location: (32,0)-(32,25)) - │ ├── flags: newline - │ ├── predicate: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ WhenNode (location: (32,14)-(32,20)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (32,14)-(32,18) = "when" - │ │ ├── conditions: (length: 1) - │ │ │ └── @ IntegerNode (location: (32,19)-(32,20)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── then_keyword_loc: ∅ - │ │ └── statements: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (32,0)-(32,4) = "case" - │ └── end_keyword_loc: (32,22)-(32,25) = "end" - ├── @ CaseNode (location: (34,0)-(36,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ MatchPredicateNode (location: (34,5)-(34,11)) - │ │ ├── flags: ∅ - │ │ ├── value: - │ │ │ @ IntegerNode (location: (34,5)-(34,6)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── pattern: - │ │ │ @ IntegerNode (location: (34,10)-(34,11)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ └── operator_loc: (34,7)-(34,9) = "in" - │ ├── conditions: (length: 1) - │ │ └── @ WhenNode (location: (35,0)-(35,6)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (35,0)-(35,4) = "when" - │ │ ├── conditions: (length: 1) - │ │ │ └── @ IntegerNode (location: (35,5)-(35,6)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 3 - │ │ ├── then_keyword_loc: ∅ - │ │ └── statements: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (34,0)-(34,4) = "case" - │ └── end_keyword_loc: (36,0)-(36,3) = "end" - ├── @ CaseNode (location: (38,0)-(38,24)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ MatchPredicateNode (location: (38,5)-(38,11)) - │ │ ├── flags: ∅ - │ │ ├── value: - │ │ │ @ IntegerNode (location: (38,5)-(38,6)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── pattern: - │ │ │ @ IntegerNode (location: (38,10)-(38,11)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ └── operator_loc: (38,7)-(38,9) = "in" - │ ├── conditions: (length: 1) - │ │ └── @ WhenNode (location: (38,13)-(38,19)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (38,13)-(38,17) = "when" - │ │ ├── conditions: (length: 1) - │ │ │ └── @ IntegerNode (location: (38,18)-(38,19)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 3 - │ │ ├── then_keyword_loc: ∅ - │ │ └── statements: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (38,0)-(38,4) = "case" - │ └── end_keyword_loc: (38,21)-(38,24) = "end" - ├── @ CaseMatchNode (location: (40,0)-(42,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ MatchPredicateNode (location: (40,5)-(40,11)) - │ │ ├── flags: ∅ - │ │ ├── value: - │ │ │ @ IntegerNode (location: (40,5)-(40,6)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── pattern: - │ │ │ @ IntegerNode (location: (40,10)-(40,11)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ └── operator_loc: (40,7)-(40,9) = "in" - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (41,0)-(41,4)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ IntegerNode (location: (41,3)-(41,4)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 3 - │ │ ├── statements: ∅ - │ │ ├── in_loc: (41,0)-(41,2) = "in" - │ │ └── then_loc: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (40,0)-(40,4) = "case" - │ └── end_keyword_loc: (42,0)-(42,3) = "end" - ├── @ CaseMatchNode (location: (44,0)-(44,22)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ MatchPredicateNode (location: (44,5)-(44,11)) - │ │ ├── flags: ∅ - │ │ ├── value: - │ │ │ @ IntegerNode (location: (44,5)-(44,6)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── pattern: - │ │ │ @ IntegerNode (location: (44,10)-(44,11)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ └── operator_loc: (44,7)-(44,9) = "in" - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (44,13)-(44,17)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ IntegerNode (location: (44,16)-(44,17)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 3 - │ │ ├── statements: ∅ - │ │ ├── in_loc: (44,13)-(44,15) = "in" - │ │ └── then_loc: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (44,0)-(44,4) = "case" - │ └── end_keyword_loc: (44,19)-(44,22) = "end" - ├── @ CaseMatchNode (location: (46,0)-(49,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (46,5)-(46,6)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (46,5)-(46,6) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (47,0)-(48,3)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ IfNode (location: (47,3)-(47,15)) - │ │ │ ├── flags: newline - │ │ │ ├── if_keyword_loc: (47,5)-(47,7) = "if" - │ │ │ ├── predicate: - │ │ │ │ @ AndNode (location: (47,8)-(47,15)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── left: - │ │ │ │ │ @ CallNode (location: (47,8)-(47,9)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :c - │ │ │ │ │ ├── message_loc: (47,8)-(47,9) = "c" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── right: - │ │ │ │ │ @ CallNode (location: (47,14)-(47,15)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :d - │ │ │ │ │ ├── message_loc: (47,14)-(47,15) = "d" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ └── operator_loc: (47,10)-(47,13) = "and" - │ │ │ ├── then_keyword_loc: ∅ - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (47,3)-(47,4)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ LocalVariableTargetNode (location: (47,3)-(47,4)) - │ │ │ │ ├── flags: newline - │ │ │ │ ├── name: :b - │ │ │ │ └── depth: 0 - │ │ │ ├── subsequent: ∅ - │ │ │ └── end_keyword_loc: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (48,2)-(48,3)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (48,2)-(48,3)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :e - │ │ │ ├── message_loc: (48,2)-(48,3) = "e" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── in_loc: (47,0)-(47,2) = "in" - │ │ └── then_loc: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (46,0)-(46,4) = "case" - │ └── end_keyword_loc: (49,0)-(49,3) = "end" - └── @ CallNode (location: (51,0)-(55,3)) - ├── flags: newline - ├── receiver: - │ @ IntegerNode (location: (51,0)-(51,1)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── call_operator_loc: (51,1)-(51,2) = "." - ├── name: :then - ├── message_loc: (51,2)-(51,6) = "then" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (51,7)-(55,3)) - ├── flags: ∅ - ├── locals: [:_1] - ├── parameters: - │ @ NumberedParametersNode (location: (51,7)-(55,3)) - │ ├── flags: ∅ - │ └── maximum: 1 - ├── body: - │ @ StatementsNode (location: (52,2)-(54,5)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CaseMatchNode (location: (52,2)-(54,5)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ IntegerNode (location: (52,7)-(52,8)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (53,2)-(53,8)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ PinnedVariableNode (location: (53,5)-(53,8)) - │ │ │ ├── flags: ∅ - │ │ │ ├── variable: - │ │ │ │ @ LocalVariableReadNode (location: (53,6)-(53,8)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :_1 - │ │ │ │ └── depth: 0 - │ │ │ └── operator_loc: (53,5)-(53,6) = "^" - │ │ ├── statements: ∅ - │ │ ├── in_loc: (53,2)-(53,4) = "in" - │ │ └── then_loc: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (52,2)-(52,6) = "case" - │ └── end_keyword_loc: (54,2)-(54,5) = "end" - ├── opening_loc: (51,7)-(51,9) = "do" - └── closing_loc: (55,0)-(55,3) = "end" diff --git a/test/prism/snapshots/classes.txt b/test/prism/snapshots/classes.txt deleted file mode 100644 index 11ba921df5e83e..00000000000000 --- a/test/prism/snapshots/classes.txt +++ /dev/null @@ -1,418 +0,0 @@ -@ ProgramNode (location: (1,0)-(35,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(35,3)) - ├── flags: ∅ - └── body: (length: 14) - ├── @ ClassNode (location: (1,0)-(1,17)) - │ ├── flags: newline - │ ├── locals: [:a] - │ ├── class_keyword_loc: (1,0)-(1,5) = "class" - │ ├── constant_path: - │ │ @ ConstantReadNode (location: (1,6)-(1,7)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── inheritance_operator_loc: ∅ - │ ├── superclass: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (1,8)-(1,13)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ LocalVariableWriteNode (location: (1,8)-(1,13)) - │ │ ├── flags: newline - │ │ ├── name: :a - │ │ ├── depth: 0 - │ │ ├── name_loc: (1,8)-(1,9) = "a" - │ │ ├── value: - │ │ │ @ IntegerNode (location: (1,12)-(1,13)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── operator_loc: (1,10)-(1,11) = "=" - │ ├── end_keyword_loc: (1,14)-(1,17) = "end" - │ └── name: :A - ├── @ ClassNode (location: (3,0)-(3,20)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── class_keyword_loc: (3,0)-(3,5) = "class" - │ ├── constant_path: - │ │ @ ConstantReadNode (location: (3,6)-(3,7)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── inheritance_operator_loc: ∅ - │ ├── superclass: ∅ - │ ├── body: - │ │ @ BeginNode (location: (3,0)-(3,20)) - │ │ ├── flags: ∅ - │ │ ├── begin_keyword_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── rescue_clause: ∅ - │ │ ├── else_clause: ∅ - │ │ ├── ensure_clause: - │ │ │ @ EnsureNode (location: (3,9)-(3,20)) - │ │ │ ├── flags: ∅ - │ │ │ ├── ensure_keyword_loc: (3,9)-(3,15) = "ensure" - │ │ │ ├── statements: ∅ - │ │ │ └── end_keyword_loc: (3,17)-(3,20) = "end" - │ │ └── end_keyword_loc: (3,17)-(3,20) = "end" - │ ├── end_keyword_loc: (3,17)-(3,20) = "end" - │ └── name: :A - ├── @ ClassNode (location: (5,0)-(5,34)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── class_keyword_loc: (5,0)-(5,5) = "class" - │ ├── constant_path: - │ │ @ ConstantReadNode (location: (5,6)-(5,7)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── inheritance_operator_loc: ∅ - │ ├── superclass: ∅ - │ ├── body: - │ │ @ BeginNode (location: (5,0)-(5,34)) - │ │ ├── flags: ∅ - │ │ ├── begin_keyword_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── rescue_clause: - │ │ │ @ RescueNode (location: (5,9)-(5,15)) - │ │ │ ├── flags: ∅ - │ │ │ ├── keyword_loc: (5,9)-(5,15) = "rescue" - │ │ │ ├── exceptions: (length: 0) - │ │ │ ├── operator_loc: ∅ - │ │ │ ├── reference: ∅ - │ │ │ ├── statements: ∅ - │ │ │ └── subsequent: ∅ - │ │ ├── else_clause: - │ │ │ @ ElseNode (location: (5,17)-(5,29)) - │ │ │ ├── flags: ∅ - │ │ │ ├── else_keyword_loc: (5,17)-(5,21) = "else" - │ │ │ ├── statements: ∅ - │ │ │ └── end_keyword_loc: (5,23)-(5,29) = "ensure" - │ │ ├── ensure_clause: - │ │ │ @ EnsureNode (location: (5,23)-(5,34)) - │ │ │ ├── flags: ∅ - │ │ │ ├── ensure_keyword_loc: (5,23)-(5,29) = "ensure" - │ │ │ ├── statements: ∅ - │ │ │ └── end_keyword_loc: (5,31)-(5,34) = "end" - │ │ └── end_keyword_loc: (5,31)-(5,34) = "end" - │ ├── end_keyword_loc: (5,31)-(5,34) = "end" - │ └── name: :A - ├── @ ClassNode (location: (7,0)-(9,3)) - │ ├── flags: newline - │ ├── locals: [:a] - │ ├── class_keyword_loc: (7,0)-(7,5) = "class" - │ ├── constant_path: - │ │ @ ConstantReadNode (location: (7,6)-(7,7)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── inheritance_operator_loc: (7,8)-(7,9) = "<" - │ ├── superclass: - │ │ @ ConstantReadNode (location: (7,10)-(7,11)) - │ │ ├── flags: ∅ - │ │ └── name: :B - │ ├── body: - │ │ @ StatementsNode (location: (8,0)-(8,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ LocalVariableWriteNode (location: (8,0)-(8,5)) - │ │ ├── flags: newline - │ │ ├── name: :a - │ │ ├── depth: 0 - │ │ ├── name_loc: (8,0)-(8,1) = "a" - │ │ ├── value: - │ │ │ @ IntegerNode (location: (8,4)-(8,5)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── operator_loc: (8,2)-(8,3) = "=" - │ ├── end_keyword_loc: (9,0)-(9,3) = "end" - │ └── name: :A - ├── @ SingletonClassNode (location: (11,0)-(12,3)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── class_keyword_loc: (11,0)-(11,5) = "class" - │ ├── operator_loc: (11,6)-(11,8) = "<<" - │ ├── expression: - │ │ @ CallNode (location: (11,9)-(11,16)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ CallNode (location: (11,13)-(11,16)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (11,13)-(11,16) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :! - │ │ ├── message_loc: (11,9)-(11,12) = "not" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ └── end_keyword_loc: (12,0)-(12,3) = "end" - ├── @ ClassNode (location: (14,0)-(14,40)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── class_keyword_loc: (14,0)-(14,5) = "class" - │ ├── constant_path: - │ │ @ ConstantReadNode (location: (14,6)-(14,7)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── inheritance_operator_loc: ∅ - │ ├── superclass: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (14,9)-(14,35)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ SingletonClassNode (location: (14,9)-(14,35)) - │ │ ├── flags: newline - │ │ ├── locals: [] - │ │ ├── class_keyword_loc: (14,9)-(14,14) = "class" - │ │ ├── operator_loc: (14,15)-(14,17) = "<<" - │ │ ├── expression: - │ │ │ @ SelfNode (location: (14,18)-(14,22)) - │ │ │ └── flags: ∅ - │ │ ├── body: - │ │ │ @ BeginNode (location: (14,9)-(14,35)) - │ │ │ ├── flags: ∅ - │ │ │ ├── begin_keyword_loc: ∅ - │ │ │ ├── statements: ∅ - │ │ │ ├── rescue_clause: ∅ - │ │ │ ├── else_clause: ∅ - │ │ │ ├── ensure_clause: - │ │ │ │ @ EnsureNode (location: (14,24)-(14,35)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── ensure_keyword_loc: (14,24)-(14,30) = "ensure" - │ │ │ │ ├── statements: ∅ - │ │ │ │ └── end_keyword_loc: (14,32)-(14,35) = "end" - │ │ │ └── end_keyword_loc: (14,32)-(14,35) = "end" - │ │ └── end_keyword_loc: (14,32)-(14,35) = "end" - │ ├── end_keyword_loc: (14,37)-(14,40) = "end" - │ └── name: :A - ├── @ ClassNode (location: (16,0)-(16,54)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── class_keyword_loc: (16,0)-(16,5) = "class" - │ ├── constant_path: - │ │ @ ConstantReadNode (location: (16,6)-(16,7)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── inheritance_operator_loc: ∅ - │ ├── superclass: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (16,9)-(16,49)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ SingletonClassNode (location: (16,9)-(16,49)) - │ │ ├── flags: newline - │ │ ├── locals: [] - │ │ ├── class_keyword_loc: (16,9)-(16,14) = "class" - │ │ ├── operator_loc: (16,15)-(16,17) = "<<" - │ │ ├── expression: - │ │ │ @ SelfNode (location: (16,18)-(16,22)) - │ │ │ └── flags: ∅ - │ │ ├── body: - │ │ │ @ BeginNode (location: (16,9)-(16,49)) - │ │ │ ├── flags: ∅ - │ │ │ ├── begin_keyword_loc: ∅ - │ │ │ ├── statements: ∅ - │ │ │ ├── rescue_clause: - │ │ │ │ @ RescueNode (location: (16,24)-(16,30)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── keyword_loc: (16,24)-(16,30) = "rescue" - │ │ │ │ ├── exceptions: (length: 0) - │ │ │ │ ├── operator_loc: ∅ - │ │ │ │ ├── reference: ∅ - │ │ │ │ ├── statements: ∅ - │ │ │ │ └── subsequent: ∅ - │ │ │ ├── else_clause: - │ │ │ │ @ ElseNode (location: (16,32)-(16,44)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── else_keyword_loc: (16,32)-(16,36) = "else" - │ │ │ │ ├── statements: ∅ - │ │ │ │ └── end_keyword_loc: (16,38)-(16,44) = "ensure" - │ │ │ ├── ensure_clause: - │ │ │ │ @ EnsureNode (location: (16,38)-(16,49)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── ensure_keyword_loc: (16,38)-(16,44) = "ensure" - │ │ │ │ ├── statements: ∅ - │ │ │ │ └── end_keyword_loc: (16,46)-(16,49) = "end" - │ │ │ └── end_keyword_loc: (16,46)-(16,49) = "end" - │ │ └── end_keyword_loc: (16,46)-(16,49) = "end" - │ ├── end_keyword_loc: (16,51)-(16,54) = "end" - │ └── name: :A - ├── @ SingletonClassNode (location: (18,0)-(19,3)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── class_keyword_loc: (18,0)-(18,5) = "class" - │ ├── operator_loc: (18,6)-(18,8) = "<<" - │ ├── expression: - │ │ @ CallNode (location: (18,9)-(18,16)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ CallNode (location: (18,9)-(18,12)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (18,9)-(18,12) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: (18,12)-(18,13) = "." - │ │ ├── name: :bar - │ │ ├── message_loc: (18,13)-(18,16) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ └── end_keyword_loc: (19,0)-(19,3) = "end" - ├── @ SingletonClassNode (location: (21,0)-(21,20)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── class_keyword_loc: (21,0)-(21,5) = "class" - │ ├── operator_loc: (21,6)-(21,8) = "<<" - │ ├── expression: - │ │ @ CallNode (location: (21,9)-(21,16)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ CallNode (location: (21,9)-(21,12)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (21,9)-(21,12) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: (21,12)-(21,13) = "." - │ │ ├── name: :bar - │ │ ├── message_loc: (21,13)-(21,16) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ └── end_keyword_loc: (21,17)-(21,20) = "end" - ├── @ SingletonClassNode (location: (23,0)-(24,3)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── class_keyword_loc: (23,0)-(23,5) = "class" - │ ├── operator_loc: (23,6)-(23,8) = "<<" - │ ├── expression: - │ │ @ SelfNode (location: (23,9)-(23,13)) - │ │ └── flags: ∅ - │ ├── body: ∅ - │ └── end_keyword_loc: (24,0)-(24,3) = "end" - ├── @ SingletonClassNode (location: (26,0)-(26,17)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── class_keyword_loc: (26,0)-(26,5) = "class" - │ ├── operator_loc: (26,6)-(26,8) = "<<" - │ ├── expression: - │ │ @ SelfNode (location: (26,9)-(26,13)) - │ │ └── flags: ∅ - │ ├── body: ∅ - │ └── end_keyword_loc: (26,14)-(26,17) = "end" - ├── @ SingletonClassNode (location: (28,0)-(30,3)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── class_keyword_loc: (28,0)-(28,5) = "class" - │ ├── operator_loc: (28,6)-(28,8) = "<<" - │ ├── expression: - │ │ @ SelfNode (location: (28,9)-(28,13)) - │ │ └── flags: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (29,0)-(29,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (29,0)-(29,5)) - │ │ ├── flags: newline - │ │ ├── receiver: - │ │ │ @ IntegerNode (location: (29,0)-(29,1)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :+ - │ │ ├── message_loc: (29,2)-(29,3) = "+" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (29,4)-(29,5)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (29,4)-(29,5)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── end_keyword_loc: (30,0)-(30,3) = "end" - ├── @ SingletonClassNode (location: (32,0)-(32,23)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── class_keyword_loc: (32,0)-(32,5) = "class" - │ ├── operator_loc: (32,6)-(32,8) = "<<" - │ ├── expression: - │ │ @ SelfNode (location: (32,9)-(32,13)) - │ │ └── flags: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (32,14)-(32,19)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (32,14)-(32,19)) - │ │ ├── flags: newline - │ │ ├── receiver: - │ │ │ @ IntegerNode (location: (32,14)-(32,15)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :+ - │ │ ├── message_loc: (32,16)-(32,17) = "+" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (32,18)-(32,19)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (32,18)-(32,19)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── end_keyword_loc: (32,20)-(32,23) = "end" - └── @ ClassNode (location: (34,0)-(35,3)) - ├── flags: newline - ├── locals: [] - ├── class_keyword_loc: (34,0)-(34,5) = "class" - ├── constant_path: - │ @ ConstantReadNode (location: (34,6)-(34,7)) - │ ├── flags: ∅ - │ └── name: :A - ├── inheritance_operator_loc: (34,8)-(34,9) = "<" - ├── superclass: - │ @ CallNode (location: (34,10)-(34,14)) - │ ├── flags: ∅ - │ ├── receiver: - │ │ @ ConstantReadNode (location: (34,10)-(34,11)) - │ │ ├── flags: ∅ - │ │ └── name: :B - │ ├── call_operator_loc: ∅ - │ ├── name: :[] - │ ├── message_loc: (34,11)-(34,14) = "[1]" - │ ├── opening_loc: (34,11)-(34,12) = "[" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (34,12)-(34,13)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (34,12)-(34,13)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: (34,13)-(34,14) = "]" - │ └── block: ∅ - ├── body: ∅ - ├── end_keyword_loc: (35,0)-(35,3) = "end" - └── name: :A diff --git a/test/prism/snapshots/command_method_call.txt b/test/prism/snapshots/command_method_call.txt deleted file mode 100644 index ab48ee480e2d21..00000000000000 --- a/test/prism/snapshots/command_method_call.txt +++ /dev/null @@ -1,773 +0,0 @@ -@ ProgramNode (location: (1,0)-(41,10)) -├── flags: ∅ -├── locals: [:foo, :bar] -└── statements: - @ StatementsNode (location: (1,0)-(41,10)) - ├── flags: ∅ - └── body: (length: 21) - ├── @ CallNode (location: (1,0)-(1,5)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (1,0)-(1,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,4)-(1,5)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (1,4)-(1,5)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (3,0)-(3,9)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (3,0)-(3,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (3,4)-(3,9)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (3,4)-(3,9)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (3,4)-(3,7) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (3,8)-(3,9)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (3,8)-(3,9)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ IfNode (location: (5,0)-(5,14)) - │ ├── flags: newline - │ ├── if_keyword_loc: (5,6)-(5,8) = "if" - │ ├── predicate: - │ │ @ CallNode (location: (5,9)-(5,14)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (5,9)-(5,12) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (5,13)-(5,14)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (5,13)-(5,14)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── then_keyword_loc: ∅ - │ ├── statements: - │ │ @ StatementsNode (location: (5,0)-(5,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (5,0)-(5,5)) - │ │ ├── flags: newline, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (5,0)-(5,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (5,4)-(5,5)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (5,4)-(5,5)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── subsequent: ∅ - │ └── end_keyword_loc: ∅ - ├── @ UnlessNode (location: (7,0)-(7,18)) - │ ├── flags: newline - │ ├── keyword_loc: (7,6)-(7,12) = "unless" - │ ├── predicate: - │ │ @ CallNode (location: (7,13)-(7,18)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (7,13)-(7,16) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (7,17)-(7,18)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (7,17)-(7,18)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── then_keyword_loc: ∅ - │ ├── statements: - │ │ @ StatementsNode (location: (7,0)-(7,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (7,0)-(7,5)) - │ │ ├── flags: newline, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (7,0)-(7,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (7,4)-(7,5)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (7,4)-(7,5)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── else_clause: ∅ - │ └── end_keyword_loc: ∅ - ├── @ WhileNode (location: (9,0)-(9,17)) - │ ├── flags: newline - │ ├── keyword_loc: (9,6)-(9,11) = "while" - │ ├── closing_loc: ∅ - │ ├── predicate: - │ │ @ CallNode (location: (9,12)-(9,17)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (9,12)-(9,15) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (9,16)-(9,17)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (9,16)-(9,17)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── statements: - │ @ StatementsNode (location: (9,0)-(9,5)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (9,0)-(9,5)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (9,0)-(9,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (9,4)-(9,5)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (9,4)-(9,5)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ UntilNode (location: (11,0)-(11,17)) - │ ├── flags: newline - │ ├── keyword_loc: (11,6)-(11,11) = "until" - │ ├── closing_loc: ∅ - │ ├── predicate: - │ │ @ CallNode (location: (11,12)-(11,17)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (11,12)-(11,15) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (11,16)-(11,17)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (11,16)-(11,17)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── statements: - │ @ StatementsNode (location: (11,0)-(11,5)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (11,0)-(11,5)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (11,0)-(11,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (11,4)-(11,5)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (11,4)-(11,5)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ RescueModifierNode (location: (13,0)-(13,18)) - │ ├── flags: newline - │ ├── expression: - │ │ @ CallNode (location: (13,0)-(13,5)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (13,0)-(13,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (13,4)-(13,5)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (13,4)-(13,5)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── keyword_loc: (13,6)-(13,12) = "rescue" - │ └── rescue_expression: - │ @ CallNode (location: (13,13)-(13,18)) - │ ├── flags: ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :bar - │ ├── message_loc: (13,13)-(13,16) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (13,17)-(13,18)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (13,17)-(13,18)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (15,0)-(15,10)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (15,0)-(15,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (15,0)-(15,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :[] - │ ├── message_loc: (15,3)-(15,10) = "[bar 1]" - │ ├── opening_loc: (15,3)-(15,4) = "[" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (15,4)-(15,9)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (15,4)-(15,9)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (15,4)-(15,7) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (15,8)-(15,9)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (15,8)-(15,9)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (15,9)-(15,10) = "]" - │ └── block: ∅ - ├── @ AndNode (location: (17,0)-(17,15)) - │ ├── flags: newline - │ ├── left: - │ │ @ CallNode (location: (17,0)-(17,5)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (17,0)-(17,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (17,4)-(17,5)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (17,4)-(17,5)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── right: - │ │ @ CallNode (location: (17,10)-(17,15)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (17,10)-(17,13) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (17,14)-(17,15)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (17,14)-(17,15)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── operator_loc: (17,6)-(17,9) = "and" - ├── @ OrNode (location: (19,0)-(19,14)) - │ ├── flags: newline - │ ├── left: - │ │ @ CallNode (location: (19,0)-(19,5)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (19,0)-(19,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (19,4)-(19,5)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (19,4)-(19,5)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── right: - │ │ @ CallNode (location: (19,9)-(19,14)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (19,9)-(19,12) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (19,13)-(19,14)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (19,13)-(19,14)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── operator_loc: (19,6)-(19,8) = "or" - ├── @ CallNode (location: (21,0)-(21,9)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (21,4)-(21,9)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (21,4)-(21,7) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (21,8)-(21,9)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (21,8)-(21,9)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :! - │ ├── message_loc: (21,0)-(21,3) = "not" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ LocalVariableWriteNode (location: (23,0)-(23,17)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── depth: 0 - │ ├── name_loc: (23,0)-(23,3) = "foo" - │ ├── value: - │ │ @ LocalVariableWriteNode (location: (23,6)-(23,17)) - │ │ ├── flags: ∅ - │ │ ├── name: :bar - │ │ ├── depth: 0 - │ │ ├── name_loc: (23,6)-(23,9) = "bar" - │ │ ├── value: - │ │ │ @ CallNode (location: (23,12)-(23,17)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :baz - │ │ │ ├── message_loc: (23,12)-(23,15) = "baz" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (23,16)-(23,17)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ IntegerNode (location: (23,16)-(23,17)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: (23,10)-(23,11) = "=" - │ └── operator_loc: (23,4)-(23,5) = "=" - ├── @ DefNode (location: (25,0)-(25,15)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (25,4)-(25,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (25,10)-(25,15)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (25,10)-(25,15)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (25,10)-(25,13) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (25,14)-(25,15)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (25,14)-(25,15)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (25,0)-(25,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: (25,8)-(25,9) = "=" - │ └── end_keyword_loc: ∅ - ├── @ CallNode (location: (27,0)-(27,7)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ IntegerNode (location: (27,0)-(27,1)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── call_operator_loc: (27,1)-(27,2) = "." - │ ├── name: :foo - │ ├── message_loc: (27,2)-(27,5) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (27,6)-(27,7)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (27,6)-(27,7)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (29,0)-(29,11)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (29,0)-(29,5)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ IntegerNode (location: (29,0)-(29,1)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── call_operator_loc: (29,1)-(29,2) = "." - │ │ ├── name: :foo - │ │ ├── message_loc: (29,2)-(29,5) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (29,5)-(29,6) = "." - │ ├── name: :bar - │ ├── message_loc: (29,6)-(29,9) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (29,10)-(29,11)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (29,10)-(29,11)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (31,0)-(31,14)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (31,0)-(31,8)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ CallNode (location: (31,0)-(31,5)) - │ │ │ ├── flags: ∅ - │ │ │ ├── receiver: - │ │ │ │ @ IntegerNode (location: (31,0)-(31,1)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ ├── call_operator_loc: (31,1)-(31,2) = "." - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (31,2)-(31,5) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :[] - │ │ ├── message_loc: (31,5)-(31,8) = "[2]" - │ │ ├── opening_loc: (31,5)-(31,6) = "[" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (31,6)-(31,7)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (31,6)-(31,7)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ ├── closing_loc: (31,7)-(31,8) = "]" - │ │ └── block: ∅ - │ ├── call_operator_loc: (31,8)-(31,9) = "." - │ ├── name: :bar - │ ├── message_loc: (31,9)-(31,12) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (31,13)-(31,14)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (31,13)-(31,14)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 3 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (33,0)-(33,14)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (33,0)-(33,8)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ IntegerNode (location: (33,0)-(33,1)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── call_operator_loc: (33,1)-(33,2) = "." - │ │ ├── name: :foo - │ │ ├── message_loc: (33,2)-(33,5) = "foo" - │ │ ├── opening_loc: (33,5)-(33,6) = "(" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (33,6)-(33,7)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (33,6)-(33,7)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ ├── closing_loc: (33,7)-(33,8) = ")" - │ │ └── block: ∅ - │ ├── call_operator_loc: (33,8)-(33,9) = "." - │ ├── name: :bar - │ ├── message_loc: (33,9)-(33,12) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (33,13)-(33,14)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (33,13)-(33,14)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 3 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (35,0)-(35,15)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (35,0)-(35,9)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ IntegerNode (location: (35,0)-(35,1)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── call_operator_loc: (35,1)-(35,2) = "." - │ │ ├── name: :foo - │ │ ├── message_loc: (35,2)-(35,5) = "foo" - │ │ ├── opening_loc: (35,5)-(35,6) = "(" - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: (35,8)-(35,9) = ")" - │ │ └── block: - │ │ @ BlockArgumentNode (location: (35,6)-(35,8)) - │ │ ├── flags: ∅ - │ │ ├── expression: - │ │ │ @ IntegerNode (location: (35,7)-(35,8)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ └── operator_loc: (35,6)-(35,7) = "&" - │ ├── call_operator_loc: (35,9)-(35,10) = "." - │ ├── name: :bar - │ ├── message_loc: (35,10)-(35,13) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (35,14)-(35,15)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (35,14)-(35,15)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 3 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ AndNode (location: (37,0)-(37,17)) - │ ├── flags: newline - │ ├── left: - │ │ @ CallNode (location: (37,0)-(37,6)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ CallNode (location: (37,1)-(37,6)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (37,1)-(37,4) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (37,5)-(37,6)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ IntegerNode (location: (37,5)-(37,6)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :! - │ │ ├── message_loc: (37,0)-(37,1) = "!" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── right: - │ │ @ CallNode (location: (37,11)-(37,17)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ CallNode (location: (37,12)-(37,17)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (37,12)-(37,15) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (37,16)-(37,17)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ IntegerNode (location: (37,16)-(37,17)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 2 - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :! - │ │ ├── message_loc: (37,11)-(37,12) = "!" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── operator_loc: (37,7)-(37,10) = "and" - ├── @ OrNode (location: (39,0)-(39,16)) - │ ├── flags: newline - │ ├── left: - │ │ @ CallNode (location: (39,0)-(39,6)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ CallNode (location: (39,1)-(39,6)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (39,1)-(39,4) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (39,5)-(39,6)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ IntegerNode (location: (39,5)-(39,6)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :! - │ │ ├── message_loc: (39,0)-(39,1) = "!" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── right: - │ │ @ CallNode (location: (39,10)-(39,16)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ CallNode (location: (39,11)-(39,16)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (39,11)-(39,14) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (39,15)-(39,16)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ IntegerNode (location: (39,15)-(39,16)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 2 - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :! - │ │ ├── message_loc: (39,10)-(39,11) = "!" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── operator_loc: (39,7)-(39,9) = "or" - └── @ CallNode (location: (41,0)-(41,10)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (41,4)-(41,10)) - │ ├── flags: ∅ - │ ├── receiver: - │ │ @ CallNode (location: (41,5)-(41,10)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (41,5)-(41,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (41,9)-(41,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (41,9)-(41,10)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :! - │ ├── message_loc: (41,4)-(41,5) = "!" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: ∅ - ├── name: :! - ├── message_loc: (41,0)-(41,3) = "not" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/comments.txt b/test/prism/snapshots/comments.txt deleted file mode 100644 index 66869bc2a99a54..00000000000000 --- a/test/prism/snapshots/comments.txt +++ /dev/null @@ -1,147 +0,0 @@ -@ ProgramNode (location: (1,0)-(24,5)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(24,5)) - ├── flags: ∅ - └── body: (length: 9) - ├── @ CallNode (location: (1,0)-(1,1)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (1,0)-(1,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (3,0)-(3,1)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :b - │ ├── message_loc: (3,0)-(3,1) = "b" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (5,0)-(5,1)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :c - │ ├── message_loc: (5,0)-(5,1) = "c" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (6,0)-(6,1)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :d - │ ├── message_loc: (6,0)-(6,1) = "d" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (8,0)-(10,4)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (8,0)-(8,1)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :e - │ │ ├── message_loc: (8,0)-(8,1) = "e" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (10,2)-(10,3) = "." - │ ├── name: :f - │ ├── message_loc: (10,3)-(10,4) = "f" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (12,0)-(14,2)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (12,0)-(12,1)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :g - │ │ ├── message_loc: (12,0)-(12,1) = "g" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (14,0)-(14,1) = "." - │ ├── name: :h - │ ├── message_loc: (14,1)-(14,2) = "h" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (16,0)-(17,2)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (16,0)-(16,1)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :i - │ │ ├── message_loc: (16,0)-(16,1) = "i" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (17,0)-(17,1) = "." - │ ├── name: :j - │ ├── message_loc: (17,1)-(17,2) = "j" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (19,0)-(20,4)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (19,0)-(19,1)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :k - │ │ ├── message_loc: (19,0)-(19,1) = "k" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (20,2)-(20,3) = "." - │ ├── name: :l - │ ├── message_loc: (20,3)-(20,4) = "l" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── @ CallNode (location: (22,0)-(24,5)) - ├── flags: newline, safe_navigation - ├── receiver: - │ @ CallNode (location: (22,0)-(22,1)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :m - │ ├── message_loc: (22,0)-(22,1) = "m" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: (24,2)-(24,4) = "&." - ├── name: :n - ├── message_loc: (24,4)-(24,5) = "n" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/constants.txt b/test/prism/snapshots/constants.txt deleted file mode 100644 index e1aada8e96fd5a..00000000000000 --- a/test/prism/snapshots/constants.txt +++ /dev/null @@ -1,1336 +0,0 @@ -@ ProgramNode (location: (1,0)-(184,10)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(184,10)) - ├── flags: ∅ - └── body: (length: 90) - ├── @ ConstantPathNode (location: (1,0)-(1,4)) - │ ├── flags: newline - │ ├── parent: - │ │ @ ConstantReadNode (location: (1,0)-(1,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── name: :B - │ ├── delimiter_loc: (1,1)-(1,3) = "::" - │ └── name_loc: (1,3)-(1,4) = "B" - ├── @ ConstantPathNode (location: (3,0)-(3,7)) - │ ├── flags: newline - │ ├── parent: - │ │ @ ConstantPathNode (location: (3,0)-(3,4)) - │ │ ├── flags: ∅ - │ │ ├── parent: - │ │ │ @ ConstantReadNode (location: (3,0)-(3,1)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :A - │ │ ├── name: :B - │ │ ├── delimiter_loc: (3,1)-(3,3) = "::" - │ │ └── name_loc: (3,3)-(3,4) = "B" - │ ├── name: :C - │ ├── delimiter_loc: (3,4)-(3,6) = "::" - │ └── name_loc: (3,6)-(3,7) = "C" - ├── @ ConstantPathNode (location: (5,0)-(5,4)) - │ ├── flags: newline - │ ├── parent: - │ │ @ CallNode (location: (5,0)-(5,1)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (5,0)-(5,1) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── name: :B - │ ├── delimiter_loc: (5,1)-(5,3) = "::" - │ └── name_loc: (5,3)-(5,4) = "B" - ├── @ ConstantPathWriteNode (location: (7,0)-(7,8)) - │ ├── flags: newline - │ ├── target: - │ │ @ ConstantPathNode (location: (7,0)-(7,4)) - │ │ ├── flags: ∅ - │ │ ├── parent: - │ │ │ @ ConstantReadNode (location: (7,0)-(7,1)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :A - │ │ ├── name: :B - │ │ ├── delimiter_loc: (7,1)-(7,3) = "::" - │ │ └── name_loc: (7,3)-(7,4) = "B" - │ ├── operator_loc: (7,5)-(7,6) = "=" - │ └── value: - │ @ IntegerNode (location: (7,7)-(7,8)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── @ ConstantWriteNode (location: (9,0)-(9,5)) - │ ├── flags: newline - │ ├── name: :A - │ ├── name_loc: (9,0)-(9,1) = "A" - │ ├── value: - │ │ @ IntegerNode (location: (9,4)-(9,5)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ └── operator_loc: (9,2)-(9,3) = "=" - ├── @ ConstantReadNode (location: (11,0)-(11,3)) - │ ├── flags: newline - │ └── name: :ABC - ├── @ CallNode (location: (13,0)-(13,5)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :Foo - │ ├── message_loc: (13,0)-(13,3) = "Foo" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (13,4)-(13,5)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (13,4)-(13,5)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (15,0)-(15,8)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :Foo - │ ├── message_loc: (15,0)-(15,3) = "Foo" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (15,4)-(15,8)) - │ │ ├── flags: contains_splat - │ │ └── arguments: (length: 1) - │ │ └── @ SplatNode (location: (15,4)-(15,8)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (15,4)-(15,5) = "*" - │ │ └── expression: - │ │ @ CallNode (location: (15,5)-(15,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (15,5)-(15,8) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (17,0)-(17,9)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :Foo - │ ├── message_loc: (17,0)-(17,3) = "Foo" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (17,4)-(17,9)) - │ │ ├── flags: contains_keywords, contains_keyword_splat - │ │ └── arguments: (length: 1) - │ │ └── @ KeywordHashNode (location: (17,4)-(17,9)) - │ │ ├── flags: ∅ - │ │ └── elements: (length: 1) - │ │ └── @ AssocSplatNode (location: (17,4)-(17,9)) - │ │ ├── flags: ∅ - │ │ ├── value: - │ │ │ @ CallNode (location: (17,6)-(17,9)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (17,6)-(17,9) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: (17,4)-(17,6) = "**" - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (19,0)-(19,8)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :Foo - │ ├── message_loc: (19,0)-(19,3) = "Foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockArgumentNode (location: (19,4)-(19,8)) - │ ├── flags: ∅ - │ ├── expression: - │ │ @ CallNode (location: (19,5)-(19,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (19,5)-(19,8) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── operator_loc: (19,4)-(19,5) = "&" - ├── @ CallNode (location: (21,0)-(21,13)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (21,0)-(21,3)) - │ │ ├── flags: ∅ - │ │ └── name: :Foo - │ ├── call_operator_loc: (21,3)-(21,5) = "::" - │ ├── name: :Bar - │ ├── message_loc: (21,5)-(21,8) = "Bar" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (21,9)-(21,13)) - │ │ ├── flags: contains_splat - │ │ └── arguments: (length: 1) - │ │ └── @ SplatNode (location: (21,9)-(21,13)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (21,9)-(21,10) = "*" - │ │ └── expression: - │ │ @ CallNode (location: (21,10)-(21,13)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :baz - │ │ ├── message_loc: (21,10)-(21,13) = "baz" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (23,0)-(23,14)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (23,0)-(23,3)) - │ │ ├── flags: ∅ - │ │ └── name: :Foo - │ ├── call_operator_loc: (23,3)-(23,5) = "::" - │ ├── name: :Bar - │ ├── message_loc: (23,5)-(23,8) = "Bar" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (23,9)-(23,14)) - │ │ ├── flags: contains_keywords, contains_keyword_splat - │ │ └── arguments: (length: 1) - │ │ └── @ KeywordHashNode (location: (23,9)-(23,14)) - │ │ ├── flags: ∅ - │ │ └── elements: (length: 1) - │ │ └── @ AssocSplatNode (location: (23,9)-(23,14)) - │ │ ├── flags: ∅ - │ │ ├── value: - │ │ │ @ CallNode (location: (23,11)-(23,14)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :baz - │ │ │ ├── message_loc: (23,11)-(23,14) = "baz" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: (23,9)-(23,11) = "**" - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (25,0)-(25,13)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (25,0)-(25,3)) - │ │ ├── flags: ∅ - │ │ └── name: :Foo - │ ├── call_operator_loc: (25,3)-(25,5) = "::" - │ ├── name: :Bar - │ ├── message_loc: (25,5)-(25,8) = "Bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockArgumentNode (location: (25,9)-(25,13)) - │ ├── flags: ∅ - │ ├── expression: - │ │ @ CallNode (location: (25,10)-(25,13)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :baz - │ │ ├── message_loc: (25,10)-(25,13) = "baz" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── operator_loc: (25,9)-(25,10) = "&" - ├── @ CallNode (location: (27,0)-(27,8)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantPathNode (location: (27,0)-(27,3)) - │ │ ├── flags: ∅ - │ │ ├── parent: ∅ - │ │ ├── name: :A - │ │ ├── delimiter_loc: (27,0)-(27,2) = "::" - │ │ └── name_loc: (27,2)-(27,3) = "A" - │ ├── call_operator_loc: (27,3)-(27,5) = "::" - │ ├── name: :foo - │ ├── message_loc: (27,5)-(27,8) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ ConstantPathWriteNode (location: (29,0)-(29,7)) - │ ├── flags: newline - │ ├── target: - │ │ @ ConstantPathNode (location: (29,0)-(29,3)) - │ │ ├── flags: ∅ - │ │ ├── parent: ∅ - │ │ ├── name: :A - │ │ ├── delimiter_loc: (29,0)-(29,2) = "::" - │ │ └── name_loc: (29,2)-(29,3) = "A" - │ ├── operator_loc: (29,4)-(29,5) = "=" - │ └── value: - │ @ IntegerNode (location: (29,6)-(29,7)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── @ ConstantPathWriteNode (location: (31,0)-(31,10)) - │ ├── flags: newline - │ ├── target: - │ │ @ ConstantPathNode (location: (31,0)-(31,6)) - │ │ ├── flags: ∅ - │ │ ├── parent: - │ │ │ @ ConstantPathNode (location: (31,0)-(31,3)) - │ │ │ ├── flags: ∅ - │ │ │ ├── parent: ∅ - │ │ │ ├── name: :A - │ │ │ ├── delimiter_loc: (31,0)-(31,2) = "::" - │ │ │ └── name_loc: (31,2)-(31,3) = "A" - │ │ ├── name: :B - │ │ ├── delimiter_loc: (31,3)-(31,5) = "::" - │ │ └── name_loc: (31,5)-(31,6) = "B" - │ ├── operator_loc: (31,7)-(31,8) = "=" - │ └── value: - │ @ IntegerNode (location: (31,9)-(31,10)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── @ ConstantPathNode (location: (33,0)-(33,6)) - │ ├── flags: newline - │ ├── parent: - │ │ @ ConstantPathNode (location: (33,0)-(33,3)) - │ │ ├── flags: ∅ - │ │ ├── parent: ∅ - │ │ ├── name: :A - │ │ ├── delimiter_loc: (33,0)-(33,2) = "::" - │ │ └── name_loc: (33,2)-(33,3) = "A" - │ ├── name: :B - │ ├── delimiter_loc: (33,3)-(33,5) = "::" - │ └── name_loc: (33,5)-(33,6) = "B" - ├── @ ConstantPathNode (location: (35,0)-(35,3)) - │ ├── flags: newline - │ ├── parent: ∅ - │ ├── name: :A - │ ├── delimiter_loc: (35,0)-(35,2) = "::" - │ └── name_loc: (35,2)-(35,3) = "A" - ├── @ CallNode (location: (37,0)-(37,8)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (37,0)-(37,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (37,1)-(37,3) = "::" - │ ├── name: :false - │ ├── message_loc: (37,3)-(37,8) = "false" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (39,0)-(39,10)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantPathNode (location: (39,0)-(39,4)) - │ │ ├── flags: ∅ - │ │ ├── parent: - │ │ │ @ ConstantReadNode (location: (39,0)-(39,1)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :A - │ │ ├── name: :B - │ │ ├── delimiter_loc: (39,1)-(39,3) = "::" - │ │ └── name_loc: (39,3)-(39,4) = "B" - │ ├── call_operator_loc: (39,4)-(39,6) = "::" - │ ├── name: :true - │ ├── message_loc: (39,6)-(39,10) = "true" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (41,0)-(41,4)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (41,0)-(41,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (41,1)-(41,3) = "::" - │ ├── name: :& - │ ├── message_loc: (41,3)-(41,4) = "&" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (43,0)-(43,4)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (43,0)-(43,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (43,1)-(43,3) = "::" - │ ├── name: :` - │ ├── message_loc: (43,3)-(43,4) = "`" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (45,0)-(45,4)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (45,0)-(45,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (45,1)-(45,3) = "::" - │ ├── name: :! - │ ├── message_loc: (45,3)-(45,4) = "!" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (47,0)-(47,5)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (47,0)-(47,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (47,1)-(47,3) = "::" - │ ├── name: :!= - │ ├── message_loc: (47,3)-(47,5) = "!=" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (49,0)-(49,4)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (49,0)-(49,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (49,1)-(49,3) = "::" - │ ├── name: :^ - │ ├── message_loc: (49,3)-(49,4) = "^" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (51,0)-(51,5)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (51,0)-(51,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (51,1)-(51,3) = "::" - │ ├── name: :== - │ ├── message_loc: (51,3)-(51,5) = "==" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (53,0)-(53,6)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (53,0)-(53,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (53,1)-(53,3) = "::" - │ ├── name: :=== - │ ├── message_loc: (53,3)-(53,6) = "===" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (55,0)-(55,5)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (55,0)-(55,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (55,1)-(55,3) = "::" - │ ├── name: :=~ - │ ├── message_loc: (55,3)-(55,5) = "=~" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (57,0)-(57,4)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (57,0)-(57,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (57,1)-(57,3) = "::" - │ ├── name: :> - │ ├── message_loc: (57,3)-(57,4) = ">" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (59,0)-(59,5)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (59,0)-(59,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (59,1)-(59,3) = "::" - │ ├── name: :>= - │ ├── message_loc: (59,3)-(59,5) = ">=" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (61,0)-(61,5)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (61,0)-(61,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (61,1)-(61,3) = "::" - │ ├── name: :>> - │ ├── message_loc: (61,3)-(61,5) = ">>" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (63,0)-(63,5)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (63,0)-(63,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (63,1)-(63,3) = "::" - │ ├── name: :<< - │ ├── message_loc: (63,3)-(63,5) = "<<" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ ConstantPathNode (location: (65,0)-(67,1)) - │ ├── flags: newline - │ ├── parent: - │ │ @ ConstantReadNode (location: (65,0)-(65,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── name: :C - │ ├── delimiter_loc: (65,1)-(65,3) = "::" - │ └── name_loc: (67,0)-(67,1) = "C" - ├── @ CallNode (location: (69,0)-(69,8)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (69,0)-(69,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (69,1)-(69,3) = "::" - │ ├── name: :alias - │ ├── message_loc: (69,3)-(69,8) = "alias" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (71,0)-(71,6)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (71,0)-(71,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (71,1)-(71,3) = "::" - │ ├── name: :and - │ ├── message_loc: (71,3)-(71,6) = "and" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (73,0)-(73,8)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (73,0)-(73,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (73,1)-(73,3) = "::" - │ ├── name: :begin - │ ├── message_loc: (73,3)-(73,8) = "begin" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ ConstantPathNode (location: (75,0)-(75,8)) - │ ├── flags: newline - │ ├── parent: - │ │ @ ConstantReadNode (location: (75,0)-(75,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── name: :BEGIN - │ ├── delimiter_loc: (75,1)-(75,3) = "::" - │ └── name_loc: (75,3)-(75,8) = "BEGIN" - ├── @ CallNode (location: (77,0)-(77,8)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (77,0)-(77,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (77,1)-(77,3) = "::" - │ ├── name: :break - │ ├── message_loc: (77,3)-(77,8) = "break" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (79,0)-(79,8)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (79,0)-(79,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (79,1)-(79,3) = "::" - │ ├── name: :class - │ ├── message_loc: (79,3)-(79,8) = "class" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (81,0)-(81,6)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (81,0)-(81,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (81,1)-(81,3) = "::" - │ ├── name: :def - │ ├── message_loc: (81,3)-(81,6) = "def" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (83,0)-(83,10)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (83,0)-(83,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (83,1)-(83,3) = "::" - │ ├── name: :defined - │ ├── message_loc: (83,3)-(83,10) = "defined" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (85,0)-(85,5)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (85,0)-(85,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (85,1)-(85,3) = "::" - │ ├── name: :do - │ ├── message_loc: (85,3)-(85,5) = "do" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (87,0)-(87,7)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (87,0)-(87,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (87,1)-(87,3) = "::" - │ ├── name: :else - │ ├── message_loc: (87,3)-(87,7) = "else" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (89,0)-(89,8)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (89,0)-(89,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (89,1)-(89,3) = "::" - │ ├── name: :elsif - │ ├── message_loc: (89,3)-(89,8) = "elsif" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (91,0)-(91,6)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (91,0)-(91,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (91,1)-(91,3) = "::" - │ ├── name: :end - │ ├── message_loc: (91,3)-(91,6) = "end" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ ConstantPathNode (location: (93,0)-(93,6)) - │ ├── flags: newline - │ ├── parent: - │ │ @ ConstantReadNode (location: (93,0)-(93,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── name: :END - │ ├── delimiter_loc: (93,1)-(93,3) = "::" - │ └── name_loc: (93,3)-(93,6) = "END" - ├── @ CallNode (location: (95,0)-(95,9)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (95,0)-(95,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (95,1)-(95,3) = "::" - │ ├── name: :ensure - │ ├── message_loc: (95,3)-(95,9) = "ensure" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (97,0)-(97,8)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (97,0)-(97,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (97,1)-(97,3) = "::" - │ ├── name: :false - │ ├── message_loc: (97,3)-(97,8) = "false" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (99,0)-(99,6)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (99,0)-(99,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (99,1)-(99,3) = "::" - │ ├── name: :for - │ ├── message_loc: (99,3)-(99,6) = "for" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (101,0)-(101,5)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (101,0)-(101,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (101,1)-(101,3) = "::" - │ ├── name: :if - │ ├── message_loc: (101,3)-(101,5) = "if" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (103,0)-(103,5)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (103,0)-(103,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (103,1)-(103,3) = "::" - │ ├── name: :in - │ ├── message_loc: (103,3)-(103,5) = "in" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (105,0)-(105,7)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (105,0)-(105,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (105,1)-(105,3) = "::" - │ ├── name: :next - │ ├── message_loc: (105,3)-(105,7) = "next" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (107,0)-(107,6)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (107,0)-(107,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (107,1)-(107,3) = "::" - │ ├── name: :nil - │ ├── message_loc: (107,3)-(107,6) = "nil" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (109,0)-(109,6)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (109,0)-(109,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (109,1)-(109,3) = "::" - │ ├── name: :not - │ ├── message_loc: (109,3)-(109,6) = "not" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (111,0)-(111,5)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (111,0)-(111,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (111,1)-(111,3) = "::" - │ ├── name: :or - │ ├── message_loc: (111,3)-(111,5) = "or" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (113,0)-(113,7)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (113,0)-(113,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (113,1)-(113,3) = "::" - │ ├── name: :redo - │ ├── message_loc: (113,3)-(113,7) = "redo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (115,0)-(115,9)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (115,0)-(115,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (115,1)-(115,3) = "::" - │ ├── name: :rescue - │ ├── message_loc: (115,3)-(115,9) = "rescue" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (117,0)-(117,8)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (117,0)-(117,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (117,1)-(117,3) = "::" - │ ├── name: :retry - │ ├── message_loc: (117,3)-(117,8) = "retry" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (119,0)-(119,9)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (119,0)-(119,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (119,1)-(119,3) = "::" - │ ├── name: :return - │ ├── message_loc: (119,3)-(119,9) = "return" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (121,0)-(121,7)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (121,0)-(121,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (121,1)-(121,3) = "::" - │ ├── name: :self - │ ├── message_loc: (121,3)-(121,7) = "self" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (123,0)-(123,8)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (123,0)-(123,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (123,1)-(123,3) = "::" - │ ├── name: :super - │ ├── message_loc: (123,3)-(123,8) = "super" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (125,0)-(125,7)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (125,0)-(125,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (125,1)-(125,3) = "::" - │ ├── name: :then - │ ├── message_loc: (125,3)-(125,7) = "then" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (127,0)-(127,7)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (127,0)-(127,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (127,1)-(127,3) = "::" - │ ├── name: :true - │ ├── message_loc: (127,3)-(127,7) = "true" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (129,0)-(129,8)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (129,0)-(129,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (129,1)-(129,3) = "::" - │ ├── name: :undef - │ ├── message_loc: (129,3)-(129,8) = "undef" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (131,0)-(131,9)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (131,0)-(131,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (131,1)-(131,3) = "::" - │ ├── name: :unless - │ ├── message_loc: (131,3)-(131,9) = "unless" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (133,0)-(133,8)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (133,0)-(133,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (133,1)-(133,3) = "::" - │ ├── name: :until - │ ├── message_loc: (133,3)-(133,8) = "until" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (135,0)-(135,7)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (135,0)-(135,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (135,1)-(135,3) = "::" - │ ├── name: :when - │ ├── message_loc: (135,3)-(135,7) = "when" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (137,0)-(137,8)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (137,0)-(137,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (137,1)-(137,3) = "::" - │ ├── name: :while - │ ├── message_loc: (137,3)-(137,8) = "while" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (139,0)-(139,8)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (139,0)-(139,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (139,1)-(139,3) = "::" - │ ├── name: :yield - │ ├── message_loc: (139,3)-(139,8) = "yield" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (141,0)-(141,15)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (141,0)-(141,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (141,1)-(141,3) = "::" - │ ├── name: :__ENCODING__ - │ ├── message_loc: (141,3)-(141,15) = "__ENCODING__" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (143,0)-(143,11)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (143,0)-(143,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (143,1)-(143,3) = "::" - │ ├── name: :__FILE__ - │ ├── message_loc: (143,3)-(143,11) = "__FILE__" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (145,0)-(145,11)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (145,0)-(145,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (145,1)-(145,3) = "::" - │ ├── name: :__LINE__ - │ ├── message_loc: (145,3)-(145,11) = "__LINE__" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (147,0)-(147,4)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (147,0)-(147,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (147,1)-(147,3) = "::" - │ ├── name: :< - │ ├── message_loc: (147,3)-(147,4) = "<" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (149,0)-(149,6)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (149,0)-(149,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (149,1)-(149,3) = "::" - │ ├── name: :<=> - │ ├── message_loc: (149,3)-(149,6) = "<=>" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (151,0)-(151,5)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (151,0)-(151,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (151,1)-(151,3) = "::" - │ ├── name: :<< - │ ├── message_loc: (151,3)-(151,5) = "<<" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (153,0)-(153,4)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (153,0)-(153,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (153,1)-(153,3) = "::" - │ ├── name: :- - │ ├── message_loc: (153,3)-(153,4) = "-" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (155,0)-(155,4)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (155,0)-(155,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (155,1)-(155,3) = "::" - │ ├── name: :% - │ ├── message_loc: (155,3)-(155,4) = "%" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (157,0)-(157,5)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (157,0)-(157,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (157,1)-(157,3) = "::" - │ ├── name: :% - │ ├── message_loc: (157,3)-(157,4) = "%" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (157,4)-(157,5)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (157,4)-(157,5)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :i - │ │ ├── message_loc: (157,4)-(157,5) = "i" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (159,0)-(159,5)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (159,0)-(159,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (159,1)-(159,3) = "::" - │ ├── name: :% - │ ├── message_loc: (159,3)-(159,4) = "%" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (159,4)-(159,5)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (159,4)-(159,5)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :w - │ │ ├── message_loc: (159,4)-(159,5) = "w" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (161,0)-(161,5)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (161,0)-(161,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (161,1)-(161,3) = "::" - │ ├── name: :% - │ ├── message_loc: (161,3)-(161,4) = "%" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (161,4)-(161,5)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (161,4)-(161,5)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :x - │ │ ├── message_loc: (161,4)-(161,5) = "x" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (163,0)-(163,5)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (163,0)-(163,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (163,1)-(163,3) = "::" - │ ├── name: :% - │ ├── message_loc: (163,3)-(163,4) = "%" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (163,4)-(163,5)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ ConstantReadNode (location: (163,4)-(163,5)) - │ │ ├── flags: ∅ - │ │ └── name: :I - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (165,0)-(165,5)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (165,0)-(165,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (165,1)-(165,3) = "::" - │ ├── name: :% - │ ├── message_loc: (165,3)-(165,4) = "%" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (165,4)-(165,5)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ ConstantReadNode (location: (165,4)-(165,5)) - │ │ ├── flags: ∅ - │ │ └── name: :W - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (167,0)-(167,4)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (167,0)-(167,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (167,1)-(167,3) = "::" - │ ├── name: :| - │ ├── message_loc: (167,3)-(167,4) = "|" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (169,0)-(169,4)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (169,0)-(169,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (169,1)-(169,3) = "::" - │ ├── name: :+ - │ ├── message_loc: (169,3)-(169,4) = "+" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (171,0)-(171,4)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (171,0)-(171,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (171,1)-(171,3) = "::" - │ ├── name: :/ - │ ├── message_loc: (171,3)-(171,4) = "/" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (173,0)-(173,4)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (173,0)-(173,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (173,1)-(173,3) = "::" - │ ├── name: :* - │ ├── message_loc: (173,3)-(173,4) = "*" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (175,0)-(175,5)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (175,0)-(175,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (175,1)-(175,3) = "::" - │ ├── name: :** - │ ├── message_loc: (175,3)-(175,5) = "**" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (177,0)-(177,4)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (177,0)-(177,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (177,1)-(177,3) = "::" - │ ├── name: :~ - │ ├── message_loc: (177,3)-(177,4) = "~" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ ConstantPathNode (location: (179,0)-(180,1)) - │ ├── flags: newline - │ ├── parent: - │ │ @ CallNode (location: (179,0)-(179,4)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ ConstantReadNode (location: (179,0)-(179,1)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :A - │ │ ├── call_operator_loc: (179,1)-(179,3) = "::" - │ │ ├── name: :_ - │ │ ├── message_loc: (179,3)-(179,4) = "_" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── name: :C - │ ├── delimiter_loc: (179,4)-(179,6) = "::" - │ └── name_loc: (180,0)-(180,1) = "C" - └── @ RangeNode (location: (182,0)-(184,10)) - ├── flags: newline - ├── left: - │ @ CallNode (location: (182,0)-(182,4)) - │ ├── flags: ∅ - │ ├── receiver: - │ │ @ ConstantReadNode (location: (182,0)-(182,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (182,1)-(182,3) = "::" - │ ├── name: :_ - │ ├── message_loc: (182,3)-(182,4) = "_" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── right: - │ @ CallNode (location: (184,0)-(184,10)) - │ ├── flags: ∅ - │ ├── receiver: - │ │ @ ConstantReadNode (location: (184,0)-(184,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (184,1)-(184,3) = "::" - │ ├── name: :__END__ - │ ├── message_loc: (184,3)-(184,10) = "__END__" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── operator_loc: (182,4)-(182,6) = ".." diff --git a/test/prism/snapshots/dash_heredocs.txt b/test/prism/snapshots/dash_heredocs.txt deleted file mode 100644 index 1ca8b4f73dcdbb..00000000000000 --- a/test/prism/snapshots/dash_heredocs.txt +++ /dev/null @@ -1,273 +0,0 @@ -@ ProgramNode (location: (1,0)-(57,11)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(57,11)) - ├── flags: ∅ - └── body: (length: 13) - ├── @ StringNode (location: (1,0)-(1,6)) - │ ├── flags: newline - │ ├── opening_loc: (1,0)-(1,6) = "<<-EOF" - │ ├── content_loc: (2,0)-(3,0) = " a\n" - │ ├── closing_loc: (3,0)-(4,0) = "EOF\n" - │ └── unescaped: " a\n" - ├── @ CallNode (location: (5,0)-(5,20)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ StringNode (location: (5,0)-(5,8)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (5,0)-(5,8) = "<<-FIRST" - │ │ ├── content_loc: (6,0)-(7,0) = " a\n" - │ │ ├── closing_loc: (7,0)-(8,0) = "FIRST\n" - │ │ └── unescaped: " a\n" - │ ├── call_operator_loc: ∅ - │ ├── name: :+ - │ ├── message_loc: (5,9)-(5,10) = "+" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (5,11)-(5,20)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ StringNode (location: (5,11)-(5,20)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (5,11)-(5,20) = "<<-SECOND" - │ │ ├── content_loc: (8,0)-(9,0) = " b\n" - │ │ ├── closing_loc: (9,0)-(10,0) = "SECOND\n" - │ │ └── unescaped: " b\n" - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ InterpolatedXStringNode (location: (11,0)-(11,8)) - │ ├── flags: newline - │ ├── opening_loc: (11,0)-(11,8) = "<<-`EOF`" - │ ├── parts: (length: 3) - │ │ ├── @ StringNode (location: (12,0)-(13,0)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (12,0)-(13,0) = " a\n" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: " a\n" - │ │ ├── @ EmbeddedStatementsNode (location: (13,0)-(13,4)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (13,0)-(13,2) = "\#{" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (13,2)-(13,3)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (13,2)-(13,3)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :b - │ │ │ │ ├── message_loc: (13,2)-(13,3) = "b" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── closing_loc: (13,3)-(13,4) = "}" - │ │ └── @ StringNode (location: (13,4)-(14,0)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (13,4)-(14,0) = "\n" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "\n" - │ └── closing_loc: (14,0)-(15,0) = "EOF\n" - ├── @ StringNode (location: (16,0)-(16,6)) - │ ├── flags: newline - │ ├── opening_loc: (16,0)-(16,6) = "<<-EOF" - │ ├── content_loc: (17,0)-(18,0) = " a\n" - │ ├── closing_loc: (18,0)-(19,0) = "EOF\n" - │ └── unescaped: " a\n" - ├── @ StringNode (location: (20,0)-(20,6)) - │ ├── flags: newline - │ ├── opening_loc: (20,0)-(20,6) = "<<-EOF" - │ ├── content_loc: (21,0)-(23,0) = " a\n b\n" - │ ├── closing_loc: (23,0)-(24,0) = " EOF\n" - │ └── unescaped: " a\n b\n" - ├── @ InterpolatedStringNode (location: (25,0)-(25,8)) - │ ├── flags: newline - │ ├── opening_loc: (25,0)-(25,8) = "<<-\"EOF\"" - │ ├── parts: (length: 3) - │ │ ├── @ StringNode (location: (26,0)-(27,0)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (26,0)-(27,0) = " a\n" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: " a\n" - │ │ ├── @ EmbeddedStatementsNode (location: (27,0)-(27,4)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (27,0)-(27,2) = "\#{" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (27,2)-(27,3)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (27,2)-(27,3)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :b - │ │ │ │ ├── message_loc: (27,2)-(27,3) = "b" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── closing_loc: (27,3)-(27,4) = "}" - │ │ └── @ StringNode (location: (27,4)-(28,0)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (27,4)-(28,0) = "\n" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "\n" - │ └── closing_loc: (28,0)-(29,0) = "EOF\n" - ├── @ InterpolatedStringNode (location: (30,0)-(30,6)) - │ ├── flags: newline - │ ├── opening_loc: (30,0)-(30,6) = "<<-EOF" - │ ├── parts: (length: 3) - │ │ ├── @ StringNode (location: (31,0)-(32,0)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (31,0)-(32,0) = " a\n" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: " a\n" - │ │ ├── @ EmbeddedStatementsNode (location: (32,0)-(32,4)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (32,0)-(32,2) = "\#{" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (32,2)-(32,3)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (32,2)-(32,3)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :b - │ │ │ │ ├── message_loc: (32,2)-(32,3) = "b" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── closing_loc: (32,3)-(32,4) = "}" - │ │ └── @ StringNode (location: (32,4)-(33,0)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (32,4)-(33,0) = "\n" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "\n" - │ └── closing_loc: (33,0)-(34,0) = "EOF\n" - ├── @ StringNode (location: (35,0)-(35,6)) - │ ├── flags: newline - │ ├── opening_loc: (35,0)-(35,2) = "%#" - │ ├── content_loc: (35,2)-(35,5) = "abc" - │ ├── closing_loc: (35,5)-(35,6) = "#" - │ └── unescaped: "abc" - ├── @ StringNode (location: (37,0)-(37,6)) - │ ├── flags: newline - │ ├── opening_loc: (37,0)-(37,6) = "<<-EOF" - │ ├── content_loc: (38,0)-(40,0) = " a\n b\n" - │ ├── closing_loc: (40,0)-(41,0) = "EOF\n" - │ └── unescaped: " a\n b\n" - ├── @ StringNode (location: (42,0)-(42,5)) - │ ├── flags: newline - │ ├── opening_loc: (42,0)-(42,5) = "<<-''" - │ ├── content_loc: (43,0)-(43,0) = "" - │ ├── closing_loc: (43,0)-(44,0) = "\n" - │ └── unescaped: "" - ├── @ StringNode (location: (45,0)-(45,8)) - │ ├── flags: newline - │ ├── opening_loc: (45,0)-(45,8) = "<<-'EOF'" - │ ├── content_loc: (46,0)-(47,0) = " a \#{1}\n" - │ ├── closing_loc: (47,0)-(48,0) = "EOF\n" - │ └── unescaped: " a \#{1}\n" - ├── @ CallNode (location: (49,0)-(49,11)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ StringNode (location: (49,0)-(49,4)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (49,0)-(49,4) = "<<-A" - │ │ ├── content_loc: (50,0)-(51,0) = " a\n" - │ │ ├── closing_loc: (51,0)-(52,0) = "A\n" - │ │ └── unescaped: " a\n" - │ ├── call_operator_loc: ∅ - │ ├── name: :+ - │ ├── message_loc: (49,5)-(49,6) = "+" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (49,7)-(49,11)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ InterpolatedStringNode (location: (49,7)-(49,11)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (49,7)-(49,11) = "<<-B" - │ │ ├── parts: (length: 3) - │ │ │ ├── @ StringNode (location: (52,0)-(53,2)) - │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── content_loc: (52,0)-(53,2) = " b\n " - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: " b\n " - │ │ │ ├── @ EmbeddedStatementsNode (location: (53,2)-(54,3)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── opening_loc: (53,2)-(53,4) = "\#{" - │ │ │ │ ├── statements: - │ │ │ │ │ @ StatementsNode (location: (53,4)-(53,5)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── body: (length: 1) - │ │ │ │ │ └── @ IntegerNode (location: (53,4)-(53,5)) - │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ └── value: 2 - │ │ │ │ └── closing_loc: (54,2)-(54,3) = "}" - │ │ │ └── @ StringNode (location: (54,3)-(55,0)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (54,3)-(55,0) = "\n" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "\n" - │ │ └── closing_loc: (55,0)-(56,0) = "B\n" - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── @ CallNode (location: (57,0)-(57,11)) - ├── flags: newline - ├── receiver: - │ @ StringNode (location: (57,0)-(57,4)) - │ ├── flags: ∅ - │ ├── opening_loc: (57,0)-(57,4) = "<<-A" - │ ├── content_loc: (58,0)-(59,0) = " a\n" - │ ├── closing_loc: (59,0)-(60,0) = "A\n" - │ └── unescaped: " a\n" - ├── call_operator_loc: ∅ - ├── name: :+ - ├── message_loc: (57,5)-(57,6) = "+" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (57,7)-(57,11)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ InterpolatedStringNode (location: (57,7)-(57,11)) - │ ├── flags: ∅ - │ ├── opening_loc: (57,7)-(57,11) = "<<-B" - │ ├── parts: (length: 3) - │ │ ├── @ StringNode (location: (60,0)-(61,2)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (60,0)-(61,2) = " b\n " - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: " b\n " - │ │ ├── @ EmbeddedStatementsNode (location: (61,2)-(62,4)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (61,2)-(61,4) = "\#{" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (62,2)-(62,3)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ IntegerNode (location: (62,2)-(62,3)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 2 - │ │ │ └── closing_loc: (62,3)-(62,4) = "}" - │ │ └── @ StringNode (location: (62,4)-(63,0)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (62,4)-(63,0) = "\n" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "\n" - │ └── closing_loc: (63,0)-(64,0) = "B\n" - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/defined.txt b/test/prism/snapshots/defined.txt deleted file mode 100644 index 761c7b2ce79a99..00000000000000 --- a/test/prism/snapshots/defined.txt +++ /dev/null @@ -1,99 +0,0 @@ -@ ProgramNode (location: (1,0)-(10,1)) -├── flags: ∅ -├── locals: [:x] -└── statements: - @ StatementsNode (location: (1,0)-(10,1)) - ├── flags: ∅ - └── body: (length: 5) - ├── @ AndNode (location: (1,0)-(1,25)) - │ ├── flags: newline - │ ├── left: - │ │ @ DefinedNode (location: (1,0)-(1,10)) - │ │ ├── flags: ∅ - │ │ ├── lparen_loc: ∅ - │ │ ├── value: - │ │ │ @ IntegerNode (location: (1,9)-(1,10)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── rparen_loc: ∅ - │ │ └── keyword_loc: (1,0)-(1,8) = "defined?" - │ ├── right: - │ │ @ DefinedNode (location: (1,15)-(1,25)) - │ │ ├── flags: ∅ - │ │ ├── lparen_loc: ∅ - │ │ ├── value: - │ │ │ @ IntegerNode (location: (1,24)-(1,25)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ ├── rparen_loc: ∅ - │ │ └── keyword_loc: (1,15)-(1,23) = "defined?" - │ └── operator_loc: (1,11)-(1,14) = "and" - ├── @ DefinedNode (location: (3,0)-(3,16)) - │ ├── flags: newline - │ ├── lparen_loc: (3,8)-(3,9) = "(" - │ ├── value: - │ │ @ LocalVariableOperatorWriteNode (location: (3,9)-(3,15)) - │ │ ├── flags: ∅ - │ │ ├── name_loc: (3,9)-(3,10) = "x" - │ │ ├── binary_operator_loc: (3,11)-(3,13) = "%=" - │ │ ├── value: - │ │ │ @ IntegerNode (location: (3,14)-(3,15)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ ├── name: :x - │ │ ├── binary_operator: :% - │ │ └── depth: 0 - │ ├── rparen_loc: (3,15)-(3,16) = ")" - │ └── keyword_loc: (3,0)-(3,8) = "defined?" - ├── @ DefinedNode (location: (5,0)-(5,21)) - │ ├── flags: newline - │ ├── lparen_loc: (5,8)-(5,9) = "(" - │ ├── value: - │ │ @ AndNode (location: (5,9)-(5,20)) - │ │ ├── flags: ∅ - │ │ ├── left: - │ │ │ @ CallNode (location: (5,9)-(5,12)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (5,9)-(5,12) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── right: - │ │ │ @ CallNode (location: (5,17)-(5,20)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (5,17)-(5,20) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: (5,13)-(5,16) = "and" - │ ├── rparen_loc: (5,20)-(5,21) = ")" - │ └── keyword_loc: (5,0)-(5,8) = "defined?" - ├── @ DefinedNode (location: (7,0)-(7,10)) - │ ├── flags: newline - │ ├── lparen_loc: ∅ - │ ├── value: - │ │ @ IntegerNode (location: (7,9)-(7,10)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── rparen_loc: ∅ - │ └── keyword_loc: (7,0)-(7,8) = "defined?" - └── @ DefinedNode (location: (9,0)-(10,1)) - ├── flags: newline - ├── lparen_loc: (9,8)-(9,9) = "(" - ├── value: - │ @ StringNode (location: (9,9)-(9,14)) - │ ├── flags: ∅ - │ ├── opening_loc: (9,9)-(9,10) = "\"" - │ ├── content_loc: (9,10)-(9,13) = "foo" - │ ├── closing_loc: (9,13)-(9,14) = "\"" - │ └── unescaped: "foo" - ├── rparen_loc: (10,0)-(10,1) = ")" - └── keyword_loc: (9,0)-(9,8) = "defined?" diff --git a/test/prism/snapshots/dos_endings.txt b/test/prism/snapshots/dos_endings.txt deleted file mode 100644 index 69d6b7cd7e5f2b..00000000000000 --- a/test/prism/snapshots/dos_endings.txt +++ /dev/null @@ -1,114 +0,0 @@ -@ ProgramNode (location: (1,0)-(17,20)) -├── flags: ∅ -├── locals: [:x, :a] -└── statements: - @ StatementsNode (location: (1,0)-(17,20)) - ├── flags: ∅ - └── body: (length: 5) - ├── @ CallNode (location: (1,0)-(2,12)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :puts - │ ├── message_loc: (1,0)-(1,4) = "puts" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,5)-(2,12)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ InterpolatedStringNode (location: (1,5)-(2,12)) - │ │ ├── flags: static_literal - │ │ ├── opening_loc: ∅ - │ │ ├── parts: (length: 2) - │ │ │ ├── @ StringNode (location: (1,5)-(1,9)) - │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ ├── opening_loc: (1,5)-(1,6) = "\"" - │ │ │ │ ├── content_loc: (1,6)-(1,8) = "hi" - │ │ │ │ ├── closing_loc: (1,8)-(1,9) = "\"" - │ │ │ │ └── unescaped: "hi" - │ │ │ └── @ StringNode (location: (2,5)-(2,12)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: (2,5)-(2,6) = "\"" - │ │ │ ├── content_loc: (2,6)-(2,11) = "there" - │ │ │ ├── closing_loc: (2,11)-(2,12) = "\"" - │ │ │ └── unescaped: "there" - │ │ └── closing_loc: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ ArrayNode (location: (4,0)-(5,2)) - │ ├── flags: newline, static_literal - │ ├── elements: (length: 1) - │ │ └── @ SymbolNode (location: (4,3)-(5,1)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: ∅ - │ │ ├── value_loc: (4,3)-(5,1) = "a\\\r\nb" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "a\nb" - │ ├── opening_loc: (4,0)-(4,3) = "%I{" - │ └── closing_loc: (5,1)-(5,2) = "}" - ├── @ StringNode (location: (7,0)-(7,4)) - │ ├── flags: newline - │ ├── opening_loc: (7,0)-(7,4) = "<<-E" - │ ├── content_loc: (8,0)-(11,0) = " 1 \\\r\n 2\r\n 3\r\n" - │ ├── closing_loc: (11,0)-(12,0) = "E\r\n" - │ └── unescaped: " 1 2\n 3\n" - ├── @ LocalVariableWriteNode (location: (13,0)-(15,0)) - │ ├── flags: newline - │ ├── name: :x - │ ├── depth: 0 - │ ├── name_loc: (13,0)-(13,1) = "x" - │ ├── value: - │ │ @ StringNode (location: (13,4)-(15,0)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (13,4)-(14,0) = "%\r\n" - │ │ ├── content_loc: (14,0)-(14,0) = "" - │ │ ├── closing_loc: (14,0)-(15,0) = "\r\n" - │ │ └── unescaped: "" - │ └── operator_loc: (13,2)-(13,3) = "=" - └── @ LocalVariableWriteNode (location: (17,0)-(17,20)) - ├── flags: newline - ├── name: :a - ├── depth: 0 - ├── name_loc: (17,0)-(17,1) = "a" - ├── value: - │ @ CallNode (location: (17,4)-(17,20)) - │ ├── flags: ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (17,4)-(17,7) = "foo" - │ ├── opening_loc: (17,7)-(17,8) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (17,8)-(17,19)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (17,8)-(17,19)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ InterpolatedStringNode (location: (17,8)-(17,14)) - │ │ │ ├── flags: static_literal - │ │ │ ├── opening_loc: (17,8)-(17,14) = "<<~EOF" - │ │ │ ├── parts: (length: 2) - │ │ │ │ ├── @ StringNode (location: (18,0)-(19,0)) - │ │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── content_loc: (18,0)-(19,0) = "\r\n" - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── unescaped: "\n" - │ │ │ │ └── @ StringNode (location: (19,0)-(20,0)) - │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── content_loc: (19,0)-(20,0) = " baz\r\n" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "baz\n" - │ │ │ └── closing_loc: (20,0)-(21,0) = " EOF\r\n" - │ │ ├── call_operator_loc: (17,14)-(17,15) = "." - │ │ ├── name: :chop - │ │ ├── message_loc: (17,15)-(17,19) = "chop" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (17,19)-(17,20) = ")" - │ └── block: ∅ - └── operator_loc: (17,2)-(17,3) = "=" diff --git a/test/prism/snapshots/dstring.txt b/test/prism/snapshots/dstring.txt deleted file mode 100644 index b3ece4051372b4..00000000000000 --- a/test/prism/snapshots/dstring.txt +++ /dev/null @@ -1,89 +0,0 @@ -@ ProgramNode (location: (1,0)-(29,1)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(29,1)) - ├── flags: ∅ - └── body: (length: 8) - ├── @ StringNode (location: (1,0)-(2,6)) - │ ├── flags: newline - │ ├── opening_loc: (1,0)-(1,1) = "\"" - │ ├── content_loc: (1,1)-(2,5) = "foo\n bar" - │ ├── closing_loc: (2,5)-(2,6) = "\"" - │ └── unescaped: "foo\n bar" - ├── @ InterpolatedStringNode (location: (4,0)-(5,9)) - │ ├── flags: newline - │ ├── opening_loc: (4,0)-(4,1) = "\"" - │ ├── parts: (length: 2) - │ │ ├── @ StringNode (location: (4,1)-(5,2)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (4,1)-(5,2) = "foo\n " - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "foo\n " - │ │ └── @ EmbeddedStatementsNode (location: (5,2)-(5,8)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (5,2)-(5,4) = "\#{" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (5,4)-(5,7)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (5,4)-(5,7)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (5,4)-(5,7) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── closing_loc: (5,7)-(5,8) = "}" - │ └── closing_loc: (5,8)-(5,9) = "\"" - ├── @ InterpolatedStringNode (location: (7,0)-(9,2)) - │ ├── flags: newline, static_literal - │ ├── opening_loc: ∅ - │ ├── parts: (length: 2) - │ │ ├── @ StringNode (location: (7,0)-(8,2)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: (7,0)-(7,1) = "\"" - │ │ │ ├── content_loc: (7,1)-(8,1) = "fo\no" - │ │ │ ├── closing_loc: (8,1)-(8,2) = "\"" - │ │ │ └── unescaped: "fo\no" - │ │ └── @ StringNode (location: (8,3)-(9,2)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: (8,3)-(8,4) = "\"" - │ │ ├── content_loc: (8,4)-(9,1) = "ba\nr" - │ │ ├── closing_loc: (9,1)-(9,2) = "\"" - │ │ └── unescaped: "ba\nr" - │ └── closing_loc: ∅ - ├── @ StringNode (location: (11,0)-(13,1)) - │ ├── flags: newline - │ ├── opening_loc: (11,0)-(11,1) = "\"" - │ ├── content_loc: (11,1)-(13,0) = "\nfoo\\\n" - │ ├── closing_loc: (13,0)-(13,1) = "\"" - │ └── unescaped: "\nfoo" - ├── @ StringNode (location: (15,0)-(17,1)) - │ ├── flags: newline - │ ├── opening_loc: (15,0)-(15,1) = "\"" - │ ├── content_loc: (15,1)-(17,0) = "\nfoo\\\\\n" - │ ├── closing_loc: (17,0)-(17,1) = "\"" - │ └── unescaped: "\nfoo\\\n" - ├── @ StringNode (location: (19,0)-(21,1)) - │ ├── flags: newline - │ ├── opening_loc: (19,0)-(19,1) = "\"" - │ ├── content_loc: (19,1)-(21,0) = "\nfoo\\\\\\\n" - │ ├── closing_loc: (21,0)-(21,1) = "\"" - │ └── unescaped: "\nfoo\\" - ├── @ StringNode (location: (23,0)-(25,1)) - │ ├── flags: newline - │ ├── opening_loc: (23,0)-(23,1) = "\"" - │ ├── content_loc: (23,1)-(25,0) = "\nfoo\\\\\\\\\n" - │ ├── closing_loc: (25,0)-(25,1) = "\"" - │ └── unescaped: "\nfoo\\\\\n" - └── @ StringNode (location: (27,0)-(29,1)) - ├── flags: newline - ├── opening_loc: (27,0)-(27,1) = "\"" - ├── content_loc: (27,1)-(29,0) = "\nfoo\\\\\\\\\\\n" - ├── closing_loc: (29,0)-(29,1) = "\"" - └── unescaped: "\nfoo\\\\" diff --git a/test/prism/snapshots/dsym_str.txt b/test/prism/snapshots/dsym_str.txt deleted file mode 100644 index 835cbbdc8a753e..00000000000000 --- a/test/prism/snapshots/dsym_str.txt +++ /dev/null @@ -1,13 +0,0 @@ -@ ProgramNode (location: (1,0)-(2,6)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(2,6)) - ├── flags: ∅ - └── body: (length: 1) - └── @ SymbolNode (location: (1,0)-(2,6)) - ├── flags: newline, static_literal, forced_us_ascii_encoding - ├── opening_loc: (1,0)-(1,2) = ":\"" - ├── value_loc: (1,2)-(2,5) = "foo\n bar" - ├── closing_loc: (2,5)-(2,6) = "\"" - └── unescaped: "foo\n bar" diff --git a/test/prism/snapshots/embdoc_no_newline_at_end.txt b/test/prism/snapshots/embdoc_no_newline_at_end.txt deleted file mode 100644 index 5756285aaf2bd2..00000000000000 --- a/test/prism/snapshots/embdoc_no_newline_at_end.txt +++ /dev/null @@ -1,7 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,0)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,0)) - ├── flags: ∅ - └── body: (length: 0) diff --git a/test/prism/snapshots/emoji_method_calls.txt b/test/prism/snapshots/emoji_method_calls.txt deleted file mode 100644 index f6f1bc4162aca6..00000000000000 --- a/test/prism/snapshots/emoji_method_calls.txt +++ /dev/null @@ -1,33 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,12)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,12)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,12)) - ├── flags: newline, attribute_write - ├── receiver: - │ @ CallNode (location: (1,0)-(1,3)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (1,0)-(1,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: (1,3)-(1,4) = "." - ├── name: :🌊= - ├── message_loc: (1,4)-(1,8) = "🌊" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,11)-(1,12)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ IntegerNode (location: (1,11)-(1,12)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/endless_methods.txt b/test/prism/snapshots/endless_methods.txt deleted file mode 100644 index 29f701ed173c8f..00000000000000 --- a/test/prism/snapshots/endless_methods.txt +++ /dev/null @@ -1,115 +0,0 @@ -@ ProgramNode (location: (1,0)-(5,22)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(5,22)) - ├── flags: ∅ - └── body: (length: 3) - ├── @ DefNode (location: (1,0)-(1,11)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (1,4)-(1,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (1,10)-(1,11)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ IntegerNode (location: (1,10)-(1,11)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── locals: [] - │ ├── def_keyword_loc: (1,0)-(1,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: (1,8)-(1,9) = "=" - │ └── end_keyword_loc: ∅ - ├── @ DefNode (location: (3,0)-(3,14)) - │ ├── flags: newline - │ ├── name: :bar - │ ├── name_loc: (3,4)-(3,7) = "bar" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (3,10)-(3,14)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (3,10)-(3,14)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :A - │ │ ├── message_loc: (3,10)-(3,11) = "A" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (3,12)-(3,14)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ StringNode (location: (3,12)-(3,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (3,12)-(3,13) = "\"" - │ │ │ ├── content_loc: (3,13)-(3,13) = "" - │ │ │ ├── closing_loc: (3,13)-(3,14) = "\"" - │ │ │ └── unescaped: "" - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (3,0)-(3,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: (3,8)-(3,9) = "=" - │ └── end_keyword_loc: ∅ - └── @ DefNode (location: (5,0)-(5,22)) - ├── flags: newline - ├── name: :method - ├── name_loc: (5,4)-(5,10) = "method" - ├── receiver: ∅ - ├── parameters: ∅ - ├── body: - │ @ StatementsNode (location: (5,13)-(5,22)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (5,13)-(5,22)) - │ ├── flags: ∅ - │ ├── receiver: - │ │ @ CallNode (location: (5,13)-(5,18)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ IntegerNode (location: (5,13)-(5,14)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :+ - │ │ ├── message_loc: (5,15)-(5,16) = "+" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (5,17)-(5,18)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (5,17)-(5,18)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :+ - │ ├── message_loc: (5,19)-(5,20) = "+" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (5,21)-(5,22)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (5,21)-(5,22)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 3 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── locals: [] - ├── def_keyword_loc: (5,0)-(5,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: ∅ - ├── rparen_loc: ∅ - ├── equal_loc: (5,11)-(5,12) = "=" - └── end_keyword_loc: ∅ diff --git a/test/prism/snapshots/endless_range_in_conditional.txt b/test/prism/snapshots/endless_range_in_conditional.txt deleted file mode 100644 index e3b0df740803da..00000000000000 --- a/test/prism/snapshots/endless_range_in_conditional.txt +++ /dev/null @@ -1,58 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,12)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,12)) - ├── flags: ∅ - └── body: (length: 3) - ├── @ IfNode (location: (1,0)-(1,13)) - │ ├── flags: newline - │ ├── if_keyword_loc: (1,0)-(1,2) = "if" - │ ├── predicate: - │ │ @ FlipFlopNode (location: (1,3)-(1,7)) - │ │ ├── flags: static_literal - │ │ ├── left: - │ │ │ @ IntegerNode (location: (1,3)-(1,4)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── right: - │ │ │ @ IntegerNode (location: (1,6)-(1,7)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ └── operator_loc: (1,4)-(1,6) = ".." - │ ├── then_keyword_loc: ∅ - │ ├── statements: ∅ - │ ├── subsequent: ∅ - │ └── end_keyword_loc: (1,10)-(1,13) = "end" - ├── @ IfNode (location: (2,0)-(2,12)) - │ ├── flags: newline - │ ├── if_keyword_loc: (2,0)-(2,2) = "if" - │ ├── predicate: - │ │ @ FlipFlopNode (location: (2,3)-(2,6)) - │ │ ├── flags: static_literal - │ │ ├── left: ∅ - │ │ ├── right: - │ │ │ @ IntegerNode (location: (2,5)-(2,6)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── operator_loc: (2,3)-(2,5) = ".." - │ ├── then_keyword_loc: ∅ - │ ├── statements: ∅ - │ ├── subsequent: ∅ - │ └── end_keyword_loc: (2,9)-(2,12) = "end" - └── @ IfNode (location: (3,0)-(3,12)) - ├── flags: newline - ├── if_keyword_loc: (3,0)-(3,2) = "if" - ├── predicate: - │ @ FlipFlopNode (location: (3,3)-(3,6)) - │ ├── flags: static_literal - │ ├── left: - │ │ @ IntegerNode (location: (3,3)-(3,4)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── right: ∅ - │ └── operator_loc: (3,4)-(3,6) = ".." - ├── then_keyword_loc: ∅ - ├── statements: ∅ - ├── subsequent: ∅ - └── end_keyword_loc: (3,9)-(3,12) = "end" diff --git a/test/prism/snapshots/for.txt b/test/prism/snapshots/for.txt deleted file mode 100644 index 5558209826f117..00000000000000 --- a/test/prism/snapshots/for.txt +++ /dev/null @@ -1,219 +0,0 @@ -@ ProgramNode (location: (1,0)-(19,22)) -├── flags: ∅ -├── locals: [:i, :j, :k] -└── statements: - @ StatementsNode (location: (1,0)-(19,22)) - ├── flags: ∅ - └── body: (length: 6) - ├── @ ForNode (location: (1,0)-(3,3)) - │ ├── flags: newline - │ ├── index: - │ │ @ LocalVariableTargetNode (location: (1,4)-(1,5)) - │ │ ├── flags: ∅ - │ │ ├── name: :i - │ │ └── depth: 0 - │ ├── collection: - │ │ @ RangeNode (location: (1,9)-(1,14)) - │ │ ├── flags: static_literal - │ │ ├── left: - │ │ │ @ IntegerNode (location: (1,9)-(1,10)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── right: - │ │ │ @ IntegerNode (location: (1,12)-(1,14)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 10 - │ │ └── operator_loc: (1,10)-(1,12) = ".." - │ ├── statements: - │ │ @ StatementsNode (location: (2,0)-(2,1)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ LocalVariableReadNode (location: (2,0)-(2,1)) - │ │ ├── flags: newline - │ │ ├── name: :i - │ │ └── depth: 0 - │ ├── for_keyword_loc: (1,0)-(1,3) = "for" - │ ├── in_keyword_loc: (1,6)-(1,8) = "in" - │ ├── do_keyword_loc: ∅ - │ └── end_keyword_loc: (3,0)-(3,3) = "end" - ├── @ ForNode (location: (5,0)-(5,22)) - │ ├── flags: newline - │ ├── index: - │ │ @ LocalVariableTargetNode (location: (5,4)-(5,5)) - │ │ ├── flags: ∅ - │ │ ├── name: :i - │ │ └── depth: 0 - │ ├── collection: - │ │ @ RangeNode (location: (5,9)-(5,14)) - │ │ ├── flags: static_literal - │ │ ├── left: - │ │ │ @ IntegerNode (location: (5,9)-(5,10)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── right: - │ │ │ @ IntegerNode (location: (5,12)-(5,14)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 10 - │ │ └── operator_loc: (5,10)-(5,12) = ".." - │ ├── statements: - │ │ @ StatementsNode (location: (5,16)-(5,17)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ LocalVariableReadNode (location: (5,16)-(5,17)) - │ │ ├── flags: newline - │ │ ├── name: :i - │ │ └── depth: 0 - │ ├── for_keyword_loc: (5,0)-(5,3) = "for" - │ ├── in_keyword_loc: (5,6)-(5,8) = "in" - │ ├── do_keyword_loc: ∅ - │ └── end_keyword_loc: (5,19)-(5,22) = "end" - ├── @ ForNode (location: (7,0)-(9,3)) - │ ├── flags: newline - │ ├── index: - │ │ @ MultiTargetNode (location: (7,4)-(7,7)) - │ │ ├── flags: ∅ - │ │ ├── lefts: (length: 2) - │ │ │ ├── @ LocalVariableTargetNode (location: (7,4)-(7,5)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :i - │ │ │ │ └── depth: 0 - │ │ │ └── @ LocalVariableTargetNode (location: (7,6)-(7,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :j - │ │ │ └── depth: 0 - │ │ ├── rest: ∅ - │ │ ├── rights: (length: 0) - │ │ ├── lparen_loc: ∅ - │ │ └── rparen_loc: ∅ - │ ├── collection: - │ │ @ RangeNode (location: (7,11)-(7,16)) - │ │ ├── flags: static_literal - │ │ ├── left: - │ │ │ @ IntegerNode (location: (7,11)-(7,12)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── right: - │ │ │ @ IntegerNode (location: (7,14)-(7,16)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 10 - │ │ └── operator_loc: (7,12)-(7,14) = ".." - │ ├── statements: - │ │ @ StatementsNode (location: (8,0)-(8,1)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ LocalVariableReadNode (location: (8,0)-(8,1)) - │ │ ├── flags: newline - │ │ ├── name: :i - │ │ └── depth: 0 - │ ├── for_keyword_loc: (7,0)-(7,3) = "for" - │ ├── in_keyword_loc: (7,8)-(7,10) = "in" - │ ├── do_keyword_loc: ∅ - │ └── end_keyword_loc: (9,0)-(9,3) = "end" - ├── @ ForNode (location: (11,0)-(13,3)) - │ ├── flags: newline - │ ├── index: - │ │ @ MultiTargetNode (location: (11,4)-(11,9)) - │ │ ├── flags: ∅ - │ │ ├── lefts: (length: 3) - │ │ │ ├── @ LocalVariableTargetNode (location: (11,4)-(11,5)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :i - │ │ │ │ └── depth: 0 - │ │ │ ├── @ LocalVariableTargetNode (location: (11,6)-(11,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :j - │ │ │ │ └── depth: 0 - │ │ │ └── @ LocalVariableTargetNode (location: (11,8)-(11,9)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :k - │ │ │ └── depth: 0 - │ │ ├── rest: ∅ - │ │ ├── rights: (length: 0) - │ │ ├── lparen_loc: ∅ - │ │ └── rparen_loc: ∅ - │ ├── collection: - │ │ @ RangeNode (location: (11,13)-(11,18)) - │ │ ├── flags: static_literal - │ │ ├── left: - │ │ │ @ IntegerNode (location: (11,13)-(11,14)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── right: - │ │ │ @ IntegerNode (location: (11,16)-(11,18)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 10 - │ │ └── operator_loc: (11,14)-(11,16) = ".." - │ ├── statements: - │ │ @ StatementsNode (location: (12,0)-(12,1)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ LocalVariableReadNode (location: (12,0)-(12,1)) - │ │ ├── flags: newline - │ │ ├── name: :i - │ │ └── depth: 0 - │ ├── for_keyword_loc: (11,0)-(11,3) = "for" - │ ├── in_keyword_loc: (11,10)-(11,12) = "in" - │ ├── do_keyword_loc: ∅ - │ └── end_keyword_loc: (13,0)-(13,3) = "end" - ├── @ ForNode (location: (15,0)-(17,3)) - │ ├── flags: newline - │ ├── index: - │ │ @ LocalVariableTargetNode (location: (15,4)-(15,5)) - │ │ ├── flags: ∅ - │ │ ├── name: :i - │ │ └── depth: 0 - │ ├── collection: - │ │ @ RangeNode (location: (15,9)-(15,14)) - │ │ ├── flags: static_literal - │ │ ├── left: - │ │ │ @ IntegerNode (location: (15,9)-(15,10)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── right: - │ │ │ @ IntegerNode (location: (15,12)-(15,14)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 10 - │ │ └── operator_loc: (15,10)-(15,12) = ".." - │ ├── statements: - │ │ @ StatementsNode (location: (16,0)-(16,1)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ LocalVariableReadNode (location: (16,0)-(16,1)) - │ │ ├── flags: newline - │ │ ├── name: :i - │ │ └── depth: 0 - │ ├── for_keyword_loc: (15,0)-(15,3) = "for" - │ ├── in_keyword_loc: (15,6)-(15,8) = "in" - │ ├── do_keyword_loc: (15,15)-(15,17) = "do" - │ └── end_keyword_loc: (17,0)-(17,3) = "end" - └── @ ForNode (location: (19,0)-(19,22)) - ├── flags: newline - ├── index: - │ @ LocalVariableTargetNode (location: (19,4)-(19,5)) - │ ├── flags: ∅ - │ ├── name: :i - │ └── depth: 0 - ├── collection: - │ @ RangeNode (location: (19,9)-(19,14)) - │ ├── flags: static_literal - │ ├── left: - │ │ @ IntegerNode (location: (19,9)-(19,10)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── right: - │ │ @ IntegerNode (location: (19,12)-(19,14)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 10 - │ └── operator_loc: (19,10)-(19,12) = ".." - ├── statements: - │ @ StatementsNode (location: (19,16)-(19,17)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ LocalVariableReadNode (location: (19,16)-(19,17)) - │ ├── flags: newline - │ ├── name: :i - │ └── depth: 0 - ├── for_keyword_loc: (19,0)-(19,3) = "for" - ├── in_keyword_loc: (19,6)-(19,8) = "in" - ├── do_keyword_loc: ∅ - └── end_keyword_loc: (19,19)-(19,22) = "end" diff --git a/test/prism/snapshots/global_variables.txt b/test/prism/snapshots/global_variables.txt deleted file mode 100644 index 17b7728a32d3c2..00000000000000 --- a/test/prism/snapshots/global_variables.txt +++ /dev/null @@ -1,217 +0,0 @@ -@ ProgramNode (location: (1,0)-(93,4)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(93,4)) - ├── flags: ∅ - └── body: (length: 47) - ├── @ GlobalVariableReadNode (location: (1,0)-(1,16)) - │ ├── flags: newline - │ └── name: :$global_variable - ├── @ GlobalVariableReadNode (location: (3,0)-(3,2)) - │ ├── flags: newline - │ └── name: :$_ - ├── @ GlobalVariableReadNode (location: (5,0)-(5,3)) - │ ├── flags: newline - │ └── name: :$-w - ├── @ GlobalVariableReadNode (location: (7,0)-(7,10)) - │ ├── flags: newline - │ └── name: :$LOAD_PATH - ├── @ GlobalVariableReadNode (location: (9,0)-(9,6)) - │ ├── flags: newline - │ └── name: :$stdin - ├── @ GlobalVariableReadNode (location: (11,0)-(11,7)) - │ ├── flags: newline - │ └── name: :$stdout - ├── @ GlobalVariableReadNode (location: (13,0)-(13,7)) - │ ├── flags: newline - │ └── name: :$stderr - ├── @ GlobalVariableReadNode (location: (15,0)-(15,2)) - │ ├── flags: newline - │ └── name: :$! - ├── @ GlobalVariableReadNode (location: (17,0)-(17,2)) - │ ├── flags: newline - │ └── name: :$? - ├── @ GlobalVariableReadNode (location: (19,0)-(19,2)) - │ ├── flags: newline - │ └── name: :$~ - ├── @ BackReferenceReadNode (location: (21,0)-(21,2)) - │ ├── flags: newline - │ └── name: :$& - ├── @ BackReferenceReadNode (location: (23,0)-(23,2)) - │ ├── flags: newline - │ └── name: :$` - ├── @ BackReferenceReadNode (location: (25,0)-(25,2)) - │ ├── flags: newline - │ └── name: :$' - ├── @ BackReferenceReadNode (location: (27,0)-(27,2)) - │ ├── flags: newline - │ └── name: :$+ - ├── @ GlobalVariableReadNode (location: (29,0)-(29,2)) - │ ├── flags: newline - │ └── name: :$: - ├── @ GlobalVariableReadNode (location: (31,0)-(31,2)) - │ ├── flags: newline - │ └── name: :$; - ├── @ GlobalVariableReadNode (location: (33,0)-(33,2)) - │ ├── flags: newline - │ └── name: :$, - ├── @ GlobalVariableReadNode (location: (35,0)-(35,6)) - │ ├── flags: newline - │ └── name: :$DEBUG - ├── @ GlobalVariableReadNode (location: (37,0)-(37,9)) - │ ├── flags: newline - │ └── name: :$FILENAME - ├── @ GlobalVariableReadNode (location: (39,0)-(39,2)) - │ ├── flags: newline - │ └── name: :$0 - ├── @ GlobalVariableReadNode (location: (41,0)-(41,3)) - │ ├── flags: newline - │ └── name: :$-0 - ├── @ GlobalVariableReadNode (location: (43,0)-(43,16)) - │ ├── flags: newline - │ └── name: :$LOADED_FEATURES - ├── @ GlobalVariableReadNode (location: (45,0)-(45,8)) - │ ├── flags: newline - │ └── name: :$VERBOSE - ├── @ GlobalVariableReadNode (location: (47,0)-(47,3)) - │ ├── flags: newline - │ └── name: :$-K - ├── @ SymbolNode (location: (49,0)-(49,17)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (49,0)-(49,1) = ":" - │ ├── value_loc: (49,1)-(49,17) = "$global_variable" - │ ├── closing_loc: ∅ - │ └── unescaped: "$global_variable" - ├── @ SymbolNode (location: (51,0)-(51,3)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (51,0)-(51,1) = ":" - │ ├── value_loc: (51,1)-(51,3) = "$_" - │ ├── closing_loc: ∅ - │ └── unescaped: "$_" - ├── @ SymbolNode (location: (53,0)-(53,4)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (53,0)-(53,1) = ":" - │ ├── value_loc: (53,1)-(53,4) = "$-w" - │ ├── closing_loc: ∅ - │ └── unescaped: "$-w" - ├── @ SymbolNode (location: (55,0)-(55,11)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (55,0)-(55,1) = ":" - │ ├── value_loc: (55,1)-(55,11) = "$LOAD_PATH" - │ ├── closing_loc: ∅ - │ └── unescaped: "$LOAD_PATH" - ├── @ SymbolNode (location: (57,0)-(57,7)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (57,0)-(57,1) = ":" - │ ├── value_loc: (57,1)-(57,7) = "$stdin" - │ ├── closing_loc: ∅ - │ └── unescaped: "$stdin" - ├── @ SymbolNode (location: (59,0)-(59,8)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (59,0)-(59,1) = ":" - │ ├── value_loc: (59,1)-(59,8) = "$stdout" - │ ├── closing_loc: ∅ - │ └── unescaped: "$stdout" - ├── @ SymbolNode (location: (61,0)-(61,8)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (61,0)-(61,1) = ":" - │ ├── value_loc: (61,1)-(61,8) = "$stderr" - │ ├── closing_loc: ∅ - │ └── unescaped: "$stderr" - ├── @ SymbolNode (location: (63,0)-(63,3)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (63,0)-(63,1) = ":" - │ ├── value_loc: (63,1)-(63,3) = "$!" - │ ├── closing_loc: ∅ - │ └── unescaped: "$!" - ├── @ SymbolNode (location: (65,0)-(65,3)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (65,0)-(65,1) = ":" - │ ├── value_loc: (65,1)-(65,3) = "$?" - │ ├── closing_loc: ∅ - │ └── unescaped: "$?" - ├── @ SymbolNode (location: (67,0)-(67,3)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (67,0)-(67,1) = ":" - │ ├── value_loc: (67,1)-(67,3) = "$~" - │ ├── closing_loc: ∅ - │ └── unescaped: "$~" - ├── @ SymbolNode (location: (69,0)-(69,3)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (69,0)-(69,1) = ":" - │ ├── value_loc: (69,1)-(69,3) = "$&" - │ ├── closing_loc: ∅ - │ └── unescaped: "$&" - ├── @ SymbolNode (location: (71,0)-(71,3)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (71,0)-(71,1) = ":" - │ ├── value_loc: (71,1)-(71,3) = "$`" - │ ├── closing_loc: ∅ - │ └── unescaped: "$`" - ├── @ SymbolNode (location: (73,0)-(73,3)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (73,0)-(73,1) = ":" - │ ├── value_loc: (73,1)-(73,3) = "$'" - │ ├── closing_loc: ∅ - │ └── unescaped: "$'" - ├── @ SymbolNode (location: (75,0)-(75,3)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (75,0)-(75,1) = ":" - │ ├── value_loc: (75,1)-(75,3) = "$+" - │ ├── closing_loc: ∅ - │ └── unescaped: "$+" - ├── @ SymbolNode (location: (77,0)-(77,3)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (77,0)-(77,1) = ":" - │ ├── value_loc: (77,1)-(77,3) = "$:" - │ ├── closing_loc: ∅ - │ └── unescaped: "$:" - ├── @ SymbolNode (location: (79,0)-(79,3)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (79,0)-(79,1) = ":" - │ ├── value_loc: (79,1)-(79,3) = "$;" - │ ├── closing_loc: ∅ - │ └── unescaped: "$;" - ├── @ SymbolNode (location: (81,0)-(81,7)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (81,0)-(81,1) = ":" - │ ├── value_loc: (81,1)-(81,7) = "$DEBUG" - │ ├── closing_loc: ∅ - │ └── unescaped: "$DEBUG" - ├── @ SymbolNode (location: (83,0)-(83,10)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (83,0)-(83,1) = ":" - │ ├── value_loc: (83,1)-(83,10) = "$FILENAME" - │ ├── closing_loc: ∅ - │ └── unescaped: "$FILENAME" - ├── @ SymbolNode (location: (85,0)-(85,3)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (85,0)-(85,1) = ":" - │ ├── value_loc: (85,1)-(85,3) = "$0" - │ ├── closing_loc: ∅ - │ └── unescaped: "$0" - ├── @ SymbolNode (location: (87,0)-(87,4)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (87,0)-(87,1) = ":" - │ ├── value_loc: (87,1)-(87,4) = "$-0" - │ ├── closing_loc: ∅ - │ └── unescaped: "$-0" - ├── @ SymbolNode (location: (89,0)-(89,17)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (89,0)-(89,1) = ":" - │ ├── value_loc: (89,1)-(89,17) = "$LOADED_FEATURES" - │ ├── closing_loc: ∅ - │ └── unescaped: "$LOADED_FEATURES" - ├── @ SymbolNode (location: (91,0)-(91,9)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (91,0)-(91,1) = ":" - │ ├── value_loc: (91,1)-(91,9) = "$VERBOSE" - │ ├── closing_loc: ∅ - │ └── unescaped: "$VERBOSE" - └── @ SymbolNode (location: (93,0)-(93,4)) - ├── flags: newline, static_literal, forced_us_ascii_encoding - ├── opening_loc: (93,0)-(93,1) = ":" - ├── value_loc: (93,1)-(93,4) = "$-K" - ├── closing_loc: ∅ - └── unescaped: "$-K" diff --git a/test/prism/snapshots/hashes.txt b/test/prism/snapshots/hashes.txt deleted file mode 100644 index 8462c28994ee46..00000000000000 --- a/test/prism/snapshots/hashes.txt +++ /dev/null @@ -1,422 +0,0 @@ -@ ProgramNode (location: (1,0)-(28,9)) -├── flags: ∅ -├── locals: [:a] -└── statements: - @ StatementsNode (location: (1,0)-(28,9)) - ├── flags: ∅ - └── body: (length: 10) - ├── @ HashNode (location: (1,0)-(1,2)) - │ ├── flags: newline, static_literal - │ ├── opening_loc: (1,0)-(1,1) = "{" - │ ├── elements: (length: 0) - │ └── closing_loc: (1,1)-(1,2) = "}" - ├── @ HashNode (location: (3,0)-(4,1)) - │ ├── flags: newline, static_literal - │ ├── opening_loc: (3,0)-(3,1) = "{" - │ ├── elements: (length: 0) - │ └── closing_loc: (4,0)-(4,1) = "}" - ├── @ HashNode (location: (6,0)-(6,18)) - │ ├── flags: newline - │ ├── opening_loc: (6,0)-(6,1) = "{" - │ ├── elements: (length: 2) - │ │ ├── @ AssocNode (location: (6,2)-(6,8)) - │ │ │ ├── flags: ∅ - │ │ │ ├── key: - │ │ │ │ @ CallNode (location: (6,2)-(6,3)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :a - │ │ │ │ ├── message_loc: (6,2)-(6,3) = "a" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── value: - │ │ │ │ @ CallNode (location: (6,7)-(6,8)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :b - │ │ │ │ ├── message_loc: (6,7)-(6,8) = "b" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── operator_loc: (6,4)-(6,6) = "=>" - │ │ └── @ AssocNode (location: (6,10)-(6,16)) - │ │ ├── flags: ∅ - │ │ ├── key: - │ │ │ @ CallNode (location: (6,10)-(6,11)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :c - │ │ │ ├── message_loc: (6,10)-(6,11) = "c" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── value: - │ │ │ @ CallNode (location: (6,15)-(6,16)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :d - │ │ │ ├── message_loc: (6,15)-(6,16) = "d" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: (6,12)-(6,14) = "=>" - │ └── closing_loc: (6,17)-(6,18) = "}" - ├── @ HashNode (location: (8,0)-(8,15)) - │ ├── flags: newline - │ ├── opening_loc: (8,0)-(8,1) = "{" - │ ├── elements: (length: 2) - │ │ ├── @ AssocNode (location: (8,2)-(8,8)) - │ │ │ ├── flags: ∅ - │ │ │ ├── key: - │ │ │ │ @ CallNode (location: (8,2)-(8,3)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :a - │ │ │ │ ├── message_loc: (8,2)-(8,3) = "a" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── value: - │ │ │ │ @ CallNode (location: (8,7)-(8,8)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :b - │ │ │ │ ├── message_loc: (8,7)-(8,8) = "b" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── operator_loc: (8,4)-(8,6) = "=>" - │ │ └── @ AssocSplatNode (location: (8,10)-(8,13)) - │ │ ├── flags: ∅ - │ │ ├── value: - │ │ │ @ CallNode (location: (8,12)-(8,13)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :c - │ │ │ ├── message_loc: (8,12)-(8,13) = "c" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: (8,10)-(8,12) = "**" - │ └── closing_loc: (8,14)-(8,15) = "}" - ├── @ HashNode (location: (10,0)-(16,5)) - │ ├── flags: newline - │ ├── opening_loc: (10,0)-(10,1) = "{" - │ ├── elements: (length: 2) - │ │ ├── @ AssocNode (location: (11,6)-(11,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── key: - │ │ │ │ @ SymbolNode (location: (11,6)-(11,8)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── value_loc: (11,6)-(11,7) = "a" - │ │ │ │ ├── closing_loc: (11,7)-(11,8) = ":" - │ │ │ │ └── unescaped: "a" - │ │ │ ├── value: - │ │ │ │ @ CallNode (location: (11,9)-(11,10)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :b - │ │ │ │ ├── message_loc: (11,9)-(11,10) = "b" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── operator_loc: ∅ - │ │ └── @ AssocNode (location: (12,6)-(12,10)) - │ │ ├── flags: ∅ - │ │ ├── key: - │ │ │ @ SymbolNode (location: (12,6)-(12,8)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (12,6)-(12,7) = "c" - │ │ │ ├── closing_loc: (12,7)-(12,8) = ":" - │ │ │ └── unescaped: "c" - │ │ ├── value: - │ │ │ @ CallNode (location: (12,9)-(12,10)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :d - │ │ │ ├── message_loc: (12,9)-(12,10) = "d" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: ∅ - │ └── closing_loc: (16,4)-(16,5) = "}" - ├── @ HashNode (location: (18,0)-(18,25)) - │ ├── flags: newline - │ ├── opening_loc: (18,0)-(18,1) = "{" - │ ├── elements: (length: 4) - │ │ ├── @ AssocNode (location: (18,2)-(18,6)) - │ │ │ ├── flags: ∅ - │ │ │ ├── key: - │ │ │ │ @ SymbolNode (location: (18,2)-(18,4)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── value_loc: (18,2)-(18,3) = "a" - │ │ │ │ ├── closing_loc: (18,3)-(18,4) = ":" - │ │ │ │ └── unescaped: "a" - │ │ │ ├── value: - │ │ │ │ @ CallNode (location: (18,5)-(18,6)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :b - │ │ │ │ ├── message_loc: (18,5)-(18,6) = "b" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── operator_loc: ∅ - │ │ ├── @ AssocNode (location: (18,8)-(18,12)) - │ │ │ ├── flags: ∅ - │ │ │ ├── key: - │ │ │ │ @ SymbolNode (location: (18,8)-(18,10)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── value_loc: (18,8)-(18,9) = "c" - │ │ │ │ ├── closing_loc: (18,9)-(18,10) = ":" - │ │ │ │ └── unescaped: "c" - │ │ │ ├── value: - │ │ │ │ @ CallNode (location: (18,11)-(18,12)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :d - │ │ │ │ ├── message_loc: (18,11)-(18,12) = "d" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── operator_loc: ∅ - │ │ ├── @ AssocSplatNode (location: (18,14)-(18,17)) - │ │ │ ├── flags: ∅ - │ │ │ ├── value: - │ │ │ │ @ CallNode (location: (18,16)-(18,17)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :e - │ │ │ │ ├── message_loc: (18,16)-(18,17) = "e" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── operator_loc: (18,14)-(18,16) = "**" - │ │ └── @ AssocNode (location: (18,19)-(18,23)) - │ │ ├── flags: ∅ - │ │ ├── key: - │ │ │ @ SymbolNode (location: (18,19)-(18,21)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (18,19)-(18,20) = "f" - │ │ │ ├── closing_loc: (18,20)-(18,21) = ":" - │ │ │ └── unescaped: "f" - │ │ ├── value: - │ │ │ @ CallNode (location: (18,22)-(18,23)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :g - │ │ │ ├── message_loc: (18,22)-(18,23) = "g" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: ∅ - │ └── closing_loc: (18,24)-(18,25) = "}" - ├── @ HashNode (location: (20,0)-(20,12)) - │ ├── flags: newline - │ ├── opening_loc: (20,0)-(20,1) = "{" - │ ├── elements: (length: 1) - │ │ └── @ AssocNode (location: (20,2)-(20,10)) - │ │ ├── flags: ∅ - │ │ ├── key: - │ │ │ @ SymbolNode (location: (20,2)-(20,6)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (20,2)-(20,3) = "\"" - │ │ │ ├── value_loc: (20,3)-(20,4) = "a" - │ │ │ ├── closing_loc: (20,4)-(20,6) = "\":" - │ │ │ └── unescaped: "a" - │ │ ├── value: - │ │ │ @ CallNode (location: (20,7)-(20,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── receiver: - │ │ │ │ @ CallNode (location: (20,8)-(20,10)) - │ │ │ │ ├── flags: ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :b? - │ │ │ │ ├── message_loc: (20,8)-(20,10) = "b?" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :! - │ │ │ ├── message_loc: (20,7)-(20,8) = "!" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: ∅ - │ └── closing_loc: (20,11)-(20,12) = "}" - ├── @ LocalVariableWriteNode (location: (22,0)-(22,5)) - │ ├── flags: newline - │ ├── name: :a - │ ├── depth: 0 - │ ├── name_loc: (22,0)-(22,1) = "a" - │ ├── value: - │ │ @ IntegerNode (location: (22,4)-(22,5)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ └── operator_loc: (22,2)-(22,3) = "=" - ├── @ CallNode (location: (23,0)-(26,3)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :tap - │ ├── message_loc: (23,0)-(23,3) = "tap" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (23,4)-(26,3)) - │ ├── flags: ∅ - │ ├── locals: [:b] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (24,2)-(25,20)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 2) - │ │ ├── @ LocalVariableWriteNode (location: (24,2)-(24,7)) - │ │ │ ├── flags: newline - │ │ │ ├── name: :b - │ │ │ ├── depth: 0 - │ │ │ ├── name_loc: (24,2)-(24,3) = "b" - │ │ │ ├── value: - │ │ │ │ @ IntegerNode (location: (24,6)-(24,7)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ └── operator_loc: (24,4)-(24,5) = "=" - │ │ └── @ HashNode (location: (25,2)-(25,20)) - │ │ ├── flags: newline - │ │ ├── opening_loc: (25,2)-(25,3) = "{" - │ │ ├── elements: (length: 4) - │ │ │ ├── @ AssocNode (location: (25,4)-(25,6)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── key: - │ │ │ │ │ @ SymbolNode (location: (25,4)-(25,6)) - │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── value_loc: (25,4)-(25,5) = "a" - │ │ │ │ │ ├── closing_loc: (25,5)-(25,6) = ":" - │ │ │ │ │ └── unescaped: "a" - │ │ │ │ ├── value: - │ │ │ │ │ @ ImplicitNode (location: (25,4)-(25,6)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── value: - │ │ │ │ │ @ LocalVariableReadNode (location: (25,4)-(25,6)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── name: :a - │ │ │ │ │ └── depth: 1 - │ │ │ │ └── operator_loc: ∅ - │ │ │ ├── @ AssocNode (location: (25,8)-(25,10)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── key: - │ │ │ │ │ @ SymbolNode (location: (25,8)-(25,10)) - │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── value_loc: (25,8)-(25,9) = "b" - │ │ │ │ │ ├── closing_loc: (25,9)-(25,10) = ":" - │ │ │ │ │ └── unescaped: "b" - │ │ │ │ ├── value: - │ │ │ │ │ @ ImplicitNode (location: (25,8)-(25,10)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── value: - │ │ │ │ │ @ LocalVariableReadNode (location: (25,8)-(25,10)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── name: :b - │ │ │ │ │ └── depth: 0 - │ │ │ │ └── operator_loc: ∅ - │ │ │ ├── @ AssocNode (location: (25,12)-(25,14)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── key: - │ │ │ │ │ @ SymbolNode (location: (25,12)-(25,14)) - │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── value_loc: (25,12)-(25,13) = "c" - │ │ │ │ │ ├── closing_loc: (25,13)-(25,14) = ":" - │ │ │ │ │ └── unescaped: "c" - │ │ │ │ ├── value: - │ │ │ │ │ @ ImplicitNode (location: (25,12)-(25,14)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── value: - │ │ │ │ │ @ CallNode (location: (25,12)-(25,14)) - │ │ │ │ │ ├── flags: ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :c - │ │ │ │ │ ├── message_loc: (25,12)-(25,13) = "c" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ └── operator_loc: ∅ - │ │ │ └── @ AssocNode (location: (25,16)-(25,18)) - │ │ │ ├── flags: ∅ - │ │ │ ├── key: - │ │ │ │ @ SymbolNode (location: (25,16)-(25,18)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── value_loc: (25,16)-(25,17) = "D" - │ │ │ │ ├── closing_loc: (25,17)-(25,18) = ":" - │ │ │ │ └── unescaped: "D" - │ │ │ ├── value: - │ │ │ │ @ ImplicitNode (location: (25,16)-(25,18)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── value: - │ │ │ │ @ ConstantReadNode (location: (25,16)-(25,18)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :D - │ │ │ └── operator_loc: ∅ - │ │ └── closing_loc: (25,19)-(25,20) = "}" - │ ├── opening_loc: (23,4)-(23,6) = "do" - │ └── closing_loc: (26,0)-(26,3) = "end" - └── @ HashNode (location: (28,0)-(28,9)) - ├── flags: newline, static_literal - ├── opening_loc: (28,0)-(28,1) = "{" - ├── elements: (length: 1) - │ └── @ AssocNode (location: (28,2)-(28,7)) - │ ├── flags: static_literal - │ ├── key: - │ │ @ SymbolNode (location: (28,2)-(28,4)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: ∅ - │ │ ├── value_loc: (28,2)-(28,3) = "a" - │ │ ├── closing_loc: (28,3)-(28,4) = ":" - │ │ └── unescaped: "a" - │ ├── value: - │ │ @ IntegerNode (location: (28,5)-(28,7)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: -1 - │ └── operator_loc: ∅ - └── closing_loc: (28,8)-(28,9) = "}" diff --git a/test/prism/snapshots/heredoc.txt b/test/prism/snapshots/heredoc.txt deleted file mode 100644 index 7145f0f7527c27..00000000000000 --- a/test/prism/snapshots/heredoc.txt +++ /dev/null @@ -1,13 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,6)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,6)) - ├── flags: ∅ - └── body: (length: 1) - └── @ StringNode (location: (1,0)-(1,6)) - ├── flags: newline - ├── opening_loc: (1,0)-(1,6) = "< - │ ├── message_loc: (31,2)-(31,5) = "<=>" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (31,6)-(31,7)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (31,6)-(31,7)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (33,0)-(33,6)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ IntegerNode (location: (33,0)-(33,1)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── call_operator_loc: ∅ - │ ├── name: :== - │ ├── message_loc: (33,2)-(33,4) = "==" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (33,5)-(33,6)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (33,5)-(33,6)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (35,0)-(35,7)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ IntegerNode (location: (35,0)-(35,1)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── call_operator_loc: ∅ - │ ├── name: :=== - │ ├── message_loc: (35,2)-(35,5) = "===" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (35,6)-(35,7)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (35,6)-(35,7)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (37,0)-(37,6)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ IntegerNode (location: (37,0)-(37,1)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── call_operator_loc: ∅ - │ ├── name: :=~ - │ ├── message_loc: (37,2)-(37,4) = "=~" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (37,5)-(37,6)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (37,5)-(37,6)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (39,0)-(39,5)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ IntegerNode (location: (39,0)-(39,1)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── call_operator_loc: ∅ - │ ├── name: :> - │ ├── message_loc: (39,2)-(39,3) = ">" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (39,4)-(39,5)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (39,4)-(39,5)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (41,0)-(41,6)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ IntegerNode (location: (41,0)-(41,1)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── call_operator_loc: ∅ - │ ├── name: :>= - │ ├── message_loc: (41,2)-(41,4) = ">=" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (41,5)-(41,6)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (41,5)-(41,6)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (43,0)-(43,6)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ IntegerNode (location: (43,0)-(43,1)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── call_operator_loc: ∅ - │ ├── name: :>> - │ ├── message_loc: (43,2)-(43,4) = ">>" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (43,5)-(43,6)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (43,5)-(43,6)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (45,0)-(45,5)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ IntegerNode (location: (45,0)-(45,1)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── call_operator_loc: ∅ - │ ├── name: :^ - │ ├── message_loc: (45,2)-(45,3) = "^" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (45,4)-(45,5)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (45,4)-(45,5)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (47,0)-(47,5)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ IntegerNode (location: (47,0)-(47,1)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── call_operator_loc: ∅ - │ ├── name: :| - │ ├── message_loc: (47,2)-(47,3) = "|" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (47,4)-(47,5)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (47,4)-(47,5)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ AndNode (location: (49,0)-(49,6)) - │ ├── flags: newline - │ ├── left: - │ │ @ IntegerNode (location: (49,0)-(49,1)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── right: - │ │ @ IntegerNode (location: (49,5)-(49,6)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ └── operator_loc: (49,2)-(49,4) = "&&" - ├── @ AndNode (location: (51,0)-(51,7)) - │ ├── flags: newline - │ ├── left: - │ │ @ IntegerNode (location: (51,0)-(51,1)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── right: - │ │ @ IntegerNode (location: (51,6)-(51,7)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ └── operator_loc: (51,2)-(51,5) = "and" - ├── @ CallNode (location: (53,0)-(53,10)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ IntegerNode (location: (53,0)-(53,1)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── call_operator_loc: ∅ - │ ├── name: :* - │ ├── message_loc: (53,2)-(53,3) = "*" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (53,4)-(53,10)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (53,4)-(53,10)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ IntegerNode (location: (53,4)-(53,5)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :** - │ │ ├── message_loc: (53,6)-(53,8) = "**" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (53,9)-(53,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (53,9)-(53,10)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 3 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (55,0)-(55,9)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (55,0)-(55,5)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ IntegerNode (location: (55,0)-(55,1)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :* - │ │ ├── message_loc: (55,2)-(55,3) = "*" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (55,4)-(55,5)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (55,4)-(55,5)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :+ - │ ├── message_loc: (55,6)-(55,7) = "+" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (55,8)-(55,9)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (55,8)-(55,9)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 3 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ OrNode (location: (57,0)-(57,6)) - │ ├── flags: newline - │ ├── left: - │ │ @ IntegerNode (location: (57,0)-(57,1)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── right: - │ │ @ IntegerNode (location: (57,5)-(57,6)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ └── operator_loc: (57,2)-(57,4) = "or" - ├── @ OrNode (location: (59,0)-(59,6)) - │ ├── flags: newline - │ ├── left: - │ │ @ IntegerNode (location: (59,0)-(59,1)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── right: - │ │ @ IntegerNode (location: (59,5)-(59,6)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ └── operator_loc: (59,2)-(59,4) = "||" - ├── @ CallNode (location: (61,0)-(61,9)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ IntegerNode (location: (61,0)-(61,1)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── call_operator_loc: ∅ - │ ├── name: :+ - │ ├── message_loc: (61,2)-(61,3) = "+" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (61,4)-(61,9)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (61,4)-(61,9)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ IntegerNode (location: (61,4)-(61,5)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :* - │ │ ├── message_loc: (61,6)-(61,7) = "*" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (61,8)-(61,9)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (61,8)-(61,9)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 3 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── @ ParenthesesNode (location: (63,0)-(63,7)) - ├── flags: newline - ├── body: - │ @ StatementsNode (location: (63,1)-(63,6)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (63,1)-(63,6)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ IntegerNode (location: (63,1)-(63,2)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── call_operator_loc: ∅ - │ ├── name: :+ - │ ├── message_loc: (63,3)-(63,4) = "+" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (63,5)-(63,6)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (63,5)-(63,6)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── opening_loc: (63,0)-(63,1) = "(" - └── closing_loc: (63,6)-(63,7) = ")" diff --git a/test/prism/snapshots/keyword_method_names.txt b/test/prism/snapshots/keyword_method_names.txt deleted file mode 100644 index 6bb4d970845292..00000000000000 --- a/test/prism/snapshots/keyword_method_names.txt +++ /dev/null @@ -1,191 +0,0 @@ -@ ProgramNode (location: (1,0)-(29,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(29,3)) - ├── flags: ∅ - └── body: (length: 10) - ├── @ DefNode (location: (1,0)-(2,3)) - │ ├── flags: newline - │ ├── name: :def - │ ├── name_loc: (1,4)-(1,7) = "def" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (1,0)-(1,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (2,0)-(2,3) = "end" - ├── @ DefNode (location: (4,0)-(5,3)) - │ ├── flags: newline - │ ├── name: :ensure - │ ├── name_loc: (4,9)-(4,15) = "ensure" - │ ├── receiver: - │ │ @ SelfNode (location: (4,4)-(4,8)) - │ │ └── flags: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (4,0)-(4,3) = "def" - │ ├── operator_loc: (4,8)-(4,9) = "." - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (5,0)-(5,3) = "end" - ├── @ CallNode (location: (7,0)-(10,3)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :private - │ ├── message_loc: (7,0)-(7,7) = "private" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (7,8)-(10,3)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ DefNode (location: (7,8)-(10,3)) - │ │ ├── flags: ∅ - │ │ ├── name: :foo - │ │ ├── name_loc: (7,12)-(7,15) = "foo" - │ │ ├── receiver: ∅ - │ │ ├── parameters: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (8,2)-(9,5)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (8,2)-(9,5)) - │ │ │ ├── flags: newline, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (8,2)-(8,5) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: - │ │ │ @ BlockNode (location: (8,6)-(9,5)) - │ │ │ ├── flags: ∅ - │ │ │ ├── locals: [] - │ │ │ ├── parameters: ∅ - │ │ │ ├── body: ∅ - │ │ │ ├── opening_loc: (8,6)-(8,8) = "do" - │ │ │ └── closing_loc: (9,2)-(9,5) = "end" - │ │ ├── locals: [] - │ │ ├── def_keyword_loc: (7,8)-(7,11) = "def" - │ │ ├── operator_loc: ∅ - │ │ ├── lparen_loc: ∅ - │ │ ├── rparen_loc: ∅ - │ │ ├── equal_loc: ∅ - │ │ └── end_keyword_loc: (10,0)-(10,3) = "end" - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ DefNode (location: (12,0)-(13,3)) - │ ├── flags: newline - │ ├── name: :m - │ ├── name_loc: (12,4)-(12,5) = "m" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (12,6)-(12,14)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (12,6)-(12,7)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :a - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: - │ │ │ @ NoKeywordsParameterNode (location: (12,9)-(12,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (12,9)-(12,11) = "**" - │ │ │ └── keyword_loc: (12,11)-(12,14) = "nil" - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:a] - │ ├── def_keyword_loc: (12,0)-(12,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (12,5)-(12,6) = "(" - │ ├── rparen_loc: (12,14)-(12,15) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (13,0)-(13,3) = "end" - ├── @ DefNode (location: (15,0)-(16,3)) - │ ├── flags: newline - │ ├── name: :a - │ ├── name_loc: (15,17)-(15,18) = "a" - │ ├── receiver: - │ │ @ SourceEncodingNode (location: (15,4)-(15,16)) - │ │ └── flags: static_literal - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (15,0)-(15,3) = "def" - │ ├── operator_loc: (15,16)-(15,17) = "." - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (16,0)-(16,3) = "end" - ├── @ StringNode (location: (18,0)-(18,6)) - │ ├── flags: newline - │ ├── opening_loc: (18,0)-(18,2) = "%{" - │ ├── content_loc: (18,2)-(18,5) = "abc" - │ ├── closing_loc: (18,5)-(18,6) = "}" - │ └── unescaped: "abc" - ├── @ StringNode (location: (20,0)-(20,6)) - │ ├── flags: newline - │ ├── opening_loc: (20,0)-(20,2) = "%\"" - │ ├── content_loc: (20,2)-(20,5) = "abc" - │ ├── closing_loc: (20,5)-(20,6) = "\"" - │ └── unescaped: "abc" - ├── @ DefNode (location: (22,0)-(23,3)) - │ ├── flags: newline - │ ├── name: :a - │ ├── name_loc: (22,13)-(22,14) = "a" - │ ├── receiver: - │ │ @ SourceFileNode (location: (22,4)-(22,12)) - │ │ ├── flags: ∅ - │ │ └── filepath: "keyword_method_names.txt" - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (22,0)-(22,3) = "def" - │ ├── operator_loc: (22,12)-(22,13) = "." - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (23,0)-(23,3) = "end" - ├── @ DefNode (location: (25,0)-(26,3)) - │ ├── flags: newline - │ ├── name: :a - │ ├── name_loc: (25,13)-(25,14) = "a" - │ ├── receiver: - │ │ @ SourceLineNode (location: (25,4)-(25,12)) - │ │ └── flags: static_literal - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (25,0)-(25,3) = "def" - │ ├── operator_loc: (25,12)-(25,13) = "." - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (26,0)-(26,3) = "end" - └── @ DefNode (location: (28,0)-(29,3)) - ├── flags: newline - ├── name: :a - ├── name_loc: (28,9)-(28,10) = "a" - ├── receiver: - │ @ NilNode (location: (28,4)-(28,7)) - │ └── flags: static_literal - ├── parameters: ∅ - ├── body: ∅ - ├── locals: [] - ├── def_keyword_loc: (28,0)-(28,3) = "def" - ├── operator_loc: (28,7)-(28,9) = "::" - ├── lparen_loc: ∅ - ├── rparen_loc: ∅ - ├── equal_loc: ∅ - └── end_keyword_loc: (29,0)-(29,3) = "end" diff --git a/test/prism/snapshots/keywords.txt b/test/prism/snapshots/keywords.txt deleted file mode 100644 index f7f0b8df09b4aa..00000000000000 --- a/test/prism/snapshots/keywords.txt +++ /dev/null @@ -1,59 +0,0 @@ -@ ProgramNode (location: (1,0)-(11,8)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(11,8)) - ├── flags: ∅ - └── body: (length: 6) - ├── @ CallNode (location: (1,0)-(1,12)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :tap - │ ├── message_loc: (1,0)-(1,3) = "tap" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (1,4)-(1,12)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (1,6)-(1,10)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ RedoNode (location: (1,6)-(1,10)) - │ │ └── flags: newline - │ ├── opening_loc: (1,4)-(1,5) = "{" - │ └── closing_loc: (1,11)-(1,12) = "}" - ├── @ BeginNode (location: (3,0)-(3,25)) - │ ├── flags: newline - │ ├── begin_keyword_loc: (3,0)-(3,5) = "begin" - │ ├── statements: ∅ - │ ├── rescue_clause: - │ │ @ RescueNode (location: (3,7)-(3,20)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (3,7)-(3,13) = "rescue" - │ │ ├── exceptions: (length: 0) - │ │ ├── operator_loc: ∅ - │ │ ├── reference: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (3,15)-(3,20)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ RetryNode (location: (3,15)-(3,20)) - │ │ │ └── flags: newline - │ │ └── subsequent: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: ∅ - │ └── end_keyword_loc: (3,22)-(3,25) = "end" - ├── @ SelfNode (location: (5,0)-(5,4)) - │ └── flags: newline - ├── @ SourceEncodingNode (location: (7,0)-(7,12)) - │ └── flags: newline, static_literal - ├── @ SourceFileNode (location: (9,0)-(9,8)) - │ ├── flags: newline - │ └── filepath: "keywords.txt" - └── @ SourceLineNode (location: (11,0)-(11,8)) - └── flags: newline, static_literal diff --git a/test/prism/snapshots/lambda.txt b/test/prism/snapshots/lambda.txt deleted file mode 100644 index 90b0b523aa9e83..00000000000000 --- a/test/prism/snapshots/lambda.txt +++ /dev/null @@ -1,221 +0,0 @@ -@ ProgramNode (location: (1,0)-(11,18)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(11,18)) - ├── flags: ∅ - └── body: (length: 5) - ├── @ LambdaNode (location: (1,0)-(3,4)) - │ ├── flags: newline - │ ├── locals: [:foo] - │ ├── operator_loc: (1,0)-(1,2) = "->" - │ ├── opening_loc: (3,2)-(3,3) = "{" - │ ├── closing_loc: (3,3)-(3,4) = "}" - │ ├── parameters: - │ │ @ BlockParametersNode (location: (1,2)-(3,1)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (2,2)-(2,5)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (2,2)-(2,5)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :foo - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: (1,2)-(1,3) = "(" - │ │ └── closing_loc: (3,0)-(3,1) = ")" - │ └── body: ∅ - ├── @ LambdaNode (location: (5,0)-(5,18)) - │ ├── flags: newline - │ ├── locals: [:x] - │ ├── operator_loc: (5,0)-(5,2) = "->" - │ ├── opening_loc: (5,15)-(5,16) = "{" - │ ├── closing_loc: (5,17)-(5,18) = "}" - │ ├── parameters: - │ │ @ BlockParametersNode (location: (5,2)-(5,14)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (5,3)-(5,13)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 0) - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 1) - │ │ │ │ └── @ OptionalKeywordParameterNode (location: (5,3)-(5,13)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :x - │ │ │ │ ├── name_loc: (5,3)-(5,5) = "x:" - │ │ │ │ └── value: - │ │ │ │ @ InterpolatedStringNode (location: (5,6)-(5,13)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── opening_loc: (5,6)-(5,7) = "\"" - │ │ │ │ ├── parts: (length: 2) - │ │ │ │ │ ├── @ StringNode (location: (5,7)-(5,8)) - │ │ │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ │ ├── content_loc: (5,7)-(5,8) = "b" - │ │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ │ └── unescaped: "b" - │ │ │ │ │ └── @ EmbeddedStatementsNode (location: (5,8)-(5,12)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── opening_loc: (5,8)-(5,10) = "\#{" - │ │ │ │ │ ├── statements: - │ │ │ │ │ │ @ StatementsNode (location: (5,10)-(5,11)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ └── body: (length: 1) - │ │ │ │ │ │ └── @ CallNode (location: (5,10)-(5,11)) - │ │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ │ ├── name: :a - │ │ │ │ │ │ ├── message_loc: (5,10)-(5,11) = "a" - │ │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ │ └── block: ∅ - │ │ │ │ │ └── closing_loc: (5,11)-(5,12) = "}" - │ │ │ │ └── closing_loc: (5,12)-(5,13) = "\"" - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: (5,2)-(5,3) = "(" - │ │ └── closing_loc: (5,13)-(5,14) = ")" - │ └── body: ∅ - ├── @ LambdaNode (location: (7,0)-(7,15)) - │ ├── flags: newline - │ ├── locals: [:a] - │ ├── operator_loc: (7,0)-(7,2) = "->" - │ ├── opening_loc: (7,13)-(7,14) = "{" - │ ├── closing_loc: (7,14)-(7,15) = "}" - │ ├── parameters: - │ │ @ BlockParametersNode (location: (7,2)-(7,12)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (7,3)-(7,11)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 0) - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 1) - │ │ │ │ └── @ OptionalKeywordParameterNode (location: (7,3)-(7,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :a - │ │ │ │ ├── name_loc: (7,3)-(7,5) = "a:" - │ │ │ │ └── value: - │ │ │ │ @ CallNode (location: (7,6)-(7,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── receiver: - │ │ │ │ │ @ CallNode (location: (7,6)-(7,7)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :b - │ │ │ │ │ ├── message_loc: (7,6)-(7,7) = "b" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :* - │ │ │ │ ├── message_loc: (7,8)-(7,9) = "*" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: - │ │ │ │ │ @ ArgumentsNode (location: (7,10)-(7,11)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── arguments: (length: 1) - │ │ │ │ │ └── @ IntegerNode (location: (7,10)-(7,11)) - │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ └── value: 3 - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: (7,2)-(7,3) = "(" - │ │ └── closing_loc: (7,11)-(7,12) = ")" - │ └── body: ∅ - ├── @ LambdaNode (location: (9,0)-(9,19)) - │ ├── flags: newline - │ ├── locals: [:foo] - │ ├── operator_loc: (9,0)-(9,2) = "->" - │ ├── opening_loc: (9,13)-(9,15) = "do" - │ ├── closing_loc: (9,16)-(9,19) = "end" - │ ├── parameters: - │ │ @ BlockParametersNode (location: (9,3)-(9,12)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (9,3)-(9,12)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 0) - │ │ │ ├── optionals: (length: 1) - │ │ │ │ └── @ OptionalParameterNode (location: (9,3)-(9,12)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :foo - │ │ │ │ ├── name_loc: (9,3)-(9,6) = "foo" - │ │ │ │ ├── operator_loc: (9,7)-(9,8) = "=" - │ │ │ │ └── value: - │ │ │ │ @ CallNode (location: (9,9)-(9,12)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :bar - │ │ │ │ ├── message_loc: (9,9)-(9,12) = "bar" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: ∅ - │ │ └── closing_loc: ∅ - │ └── body: ∅ - └── @ LambdaNode (location: (11,0)-(11,18)) - ├── flags: newline - ├── locals: [:foo] - ├── operator_loc: (11,0)-(11,2) = "->" - ├── opening_loc: (11,12)-(11,14) = "do" - ├── closing_loc: (11,15)-(11,18) = "end" - ├── parameters: - │ @ BlockParametersNode (location: (11,3)-(11,11)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (11,3)-(11,11)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 1) - │ │ │ └── @ OptionalKeywordParameterNode (location: (11,3)-(11,11)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── name_loc: (11,3)-(11,7) = "foo:" - │ │ │ └── value: - │ │ │ @ CallNode (location: (11,8)-(11,11)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (11,8)-(11,11) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: ∅ - │ └── closing_loc: ∅ - └── body: ∅ diff --git a/test/prism/snapshots/method_calls.txt b/test/prism/snapshots/method_calls.txt deleted file mode 100644 index dbd8c3172fdb39..00000000000000 --- a/test/prism/snapshots/method_calls.txt +++ /dev/null @@ -1,2592 +0,0 @@ -@ ProgramNode (location: (1,0)-(156,19)) -├── flags: ∅ -├── locals: [:foo] -└── statements: - @ StatementsNode (location: (1,0)-(156,19)) - ├── flags: ∅ - └── body: (length: 67) - ├── @ CallNode (location: (1,0)-(1,14)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (1,0)-(1,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (1,0)-(1,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (1,3)-(1,4) = "." - │ ├── name: :bar - │ ├── message_loc: (1,4)-(1,7) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,8)-(1,14)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ StringNode (location: (1,8)-(1,14)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (1,8)-(1,10) = "%{" - │ │ ├── content_loc: (1,10)-(1,13) = "baz" - │ │ ├── closing_loc: (1,13)-(1,14) = "}" - │ │ └── unescaped: "baz" - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (3,0)-(3,9)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (3,0)-(3,1)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (3,0)-(3,1) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (3,1)-(3,2) = "." - │ ├── name: :b - │ ├── message_loc: (3,2)-(3,3) = "b" - │ ├── opening_loc: (3,3)-(3,4) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (3,4)-(3,8)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (3,4)-(3,5)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :c - │ │ │ ├── message_loc: (3,4)-(3,5) = "c" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── @ CallNode (location: (3,7)-(3,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :d - │ │ ├── message_loc: (3,7)-(3,8) = "d" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (3,8)-(3,9) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (5,0)-(5,5)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (5,0)-(5,1)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (5,0)-(5,1) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (5,1)-(5,2) = "." - │ ├── name: :b - │ ├── message_loc: (5,2)-(5,3) = "b" - │ ├── opening_loc: (5,3)-(5,4) = "(" - │ ├── arguments: ∅ - │ ├── closing_loc: (5,4)-(5,5) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (7,0)-(9,7)) - │ ├── flags: newline, safe_navigation - │ ├── receiver: - │ │ @ CallNode (location: (7,0)-(8,6)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ CallNode (location: (7,0)-(7,3)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (7,0)-(7,3) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: (8,2)-(8,3) = "." - │ │ ├── name: :bar - │ │ ├── message_loc: (8,3)-(8,6) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (9,2)-(9,4) = "&." - │ ├── name: :baz - │ ├── message_loc: (9,4)-(9,7) = "baz" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (11,0)-(11,2)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a! - │ ├── message_loc: (11,0)-(11,2) = "a!" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (13,0)-(13,4)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (13,0)-(13,1)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (13,0)-(13,1) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (13,1)-(13,2) = "." - │ ├── name: :call - │ ├── message_loc: ∅ - │ ├── opening_loc: (13,2)-(13,3) = "(" - │ ├── arguments: ∅ - │ ├── closing_loc: (13,3)-(13,4) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (15,0)-(15,11)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (15,0)-(15,1)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (15,0)-(15,1) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (15,1)-(15,2) = "." - │ ├── name: :call - │ ├── message_loc: ∅ - │ ├── opening_loc: (15,2)-(15,3) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (15,3)-(15,10)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 3) - │ │ ├── @ IntegerNode (location: (15,3)-(15,4)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── @ IntegerNode (location: (15,6)-(15,7)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ └── @ IntegerNode (location: (15,9)-(15,10)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 3 - │ ├── closing_loc: (15,10)-(15,11) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (17,0)-(17,4)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (17,0)-(17,1)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (17,0)-(17,1) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (17,1)-(17,3) = "::" - │ ├── name: :b - │ ├── message_loc: (17,3)-(17,4) = "b" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (19,0)-(19,6)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (19,0)-(19,1)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (19,0)-(19,1) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (19,1)-(19,3) = "::" - │ ├── name: :b - │ ├── message_loc: (19,3)-(19,4) = "b" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (19,5)-(19,6)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (19,5)-(19,6)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :c - │ │ ├── message_loc: (19,5)-(19,6) = "c" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (21,0)-(21,11)) - │ ├── flags: newline, attribute_write - │ ├── receiver: - │ │ @ CallNode (location: (21,0)-(21,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (21,0)-(21,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (21,3)-(21,4) = "." - │ ├── name: :bar= - │ ├── message_loc: (21,4)-(21,7) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (21,10)-(21,11)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (21,10)-(21,11)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (23,0)-(23,2)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a? - │ ├── message_loc: (23,0)-(23,2) = "a?" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (25,0)-(25,8)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (25,0)-(25,1) = "a" - │ ├── opening_loc: (25,1)-(25,2) = "(" - │ ├── arguments: ∅ - │ ├── closing_loc: (25,8)-(25,9) = ")" - │ └── block: - │ @ BlockArgumentNode (location: (25,2)-(25,8)) - │ ├── flags: ∅ - │ ├── expression: - │ │ @ CallNode (location: (25,3)-(25,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :block - │ │ ├── message_loc: (25,3)-(25,8) = "block" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── operator_loc: (25,2)-(25,3) = "&" - ├── @ CallNode (location: (27,0)-(27,11)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (27,0)-(27,1) = "a" - │ ├── opening_loc: (27,1)-(27,2) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (27,2)-(27,10)) - │ │ ├── flags: contains_keywords, contains_keyword_splat - │ │ └── arguments: (length: 1) - │ │ └── @ KeywordHashNode (location: (27,2)-(27,10)) - │ │ ├── flags: ∅ - │ │ └── elements: (length: 1) - │ │ └── @ AssocSplatNode (location: (27,2)-(27,10)) - │ │ ├── flags: ∅ - │ │ ├── value: - │ │ │ @ CallNode (location: (27,4)-(27,10)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :kwargs - │ │ │ ├── message_loc: (27,4)-(27,10) = "kwargs" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: (27,2)-(27,4) = "**" - │ ├── closing_loc: (27,10)-(27,11) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (29,0)-(29,5)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (29,0)-(29,3)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ CallNode (location: (29,0)-(29,1)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :a - │ │ │ ├── message_loc: (29,0)-(29,1) = "a" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: (29,1)-(29,2) = "." - │ │ ├── name: :b - │ │ ├── message_loc: (29,2)-(29,3) = "b" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (29,3)-(29,4) = "." - │ ├── name: :c - │ ├── message_loc: (29,4)-(29,5) = "c" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (31,0)-(31,7)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (31,0)-(31,1) = "a" - │ ├── opening_loc: (31,1)-(31,2) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (31,2)-(31,6)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (31,2)-(31,3)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (31,2)-(31,3) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── @ CallNode (location: (31,5)-(31,6)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :c - │ │ ├── message_loc: (31,5)-(31,6) = "c" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (31,6)-(31,7) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (33,0)-(33,3)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (33,0)-(33,1) = "a" - │ ├── opening_loc: (33,1)-(33,2) = "(" - │ ├── arguments: ∅ - │ ├── closing_loc: (33,2)-(33,3) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (35,0)-(35,8)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (35,0)-(35,1) = "a" - │ ├── opening_loc: (35,1)-(35,2) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (35,2)-(35,7)) - │ │ ├── flags: contains_splat - │ │ └── arguments: (length: 1) - │ │ └── @ SplatNode (location: (35,2)-(35,7)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (35,2)-(35,3) = "*" - │ │ └── expression: - │ │ @ CallNode (location: (35,3)-(35,7)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :args - │ │ ├── message_loc: (35,3)-(35,7) = "args" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (35,7)-(35,8) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (37,0)-(37,6)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (37,0)-(37,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (37,2)-(37,6)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (37,2)-(37,3)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (37,2)-(37,3) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── @ CallNode (location: (37,5)-(37,6)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :c - │ │ ├── message_loc: (37,5)-(37,6) = "c" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (39,0)-(39,8)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (39,0)-(39,1)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (39,0)-(39,1) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (39,1)-(39,2) = "." - │ ├── name: :b - │ ├── message_loc: (39,2)-(39,3) = "b" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (39,4)-(39,8)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (39,4)-(39,5)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :c - │ │ │ ├── message_loc: (39,4)-(39,5) = "c" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── @ CallNode (location: (39,7)-(39,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :d - │ │ ├── message_loc: (39,7)-(39,8) = "d" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ MultiWriteNode (location: (41,0)-(41,23)) - │ ├── flags: newline - │ ├── lefts: (length: 2) - │ │ ├── @ CallTargetNode (location: (41,0)-(41,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── receiver: - │ │ │ │ @ CallNode (location: (41,0)-(41,3)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :foo - │ │ │ │ ├── message_loc: (41,0)-(41,3) = "foo" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── call_operator_loc: (41,3)-(41,4) = "." - │ │ │ ├── name: :foo= - │ │ │ └── message_loc: (41,4)-(41,7) = "foo" - │ │ └── @ CallTargetNode (location: (41,9)-(41,16)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ CallNode (location: (41,9)-(41,12)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (41,9)-(41,12) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: (41,12)-(41,13) = "." - │ │ ├── name: :bar= - │ │ └── message_loc: (41,13)-(41,16) = "bar" - │ ├── rest: ∅ - │ ├── rights: (length: 0) - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── operator_loc: (41,17)-(41,18) = "=" - │ └── value: - │ @ ArrayNode (location: (41,19)-(41,23)) - │ ├── flags: static_literal - │ ├── elements: (length: 2) - │ │ ├── @ IntegerNode (location: (41,19)-(41,20)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── @ IntegerNode (location: (41,22)-(41,23)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── opening_loc: ∅ - │ └── closing_loc: ∅ - ├── @ CallNode (location: (43,0)-(43,4)) - │ ├── flags: newline, safe_navigation - │ ├── receiver: - │ │ @ CallNode (location: (43,0)-(43,1)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (43,0)-(43,1) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (43,1)-(43,3) = "&." - │ ├── name: :b - │ ├── message_loc: (43,3)-(43,4) = "b" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (45,0)-(45,5)) - │ ├── flags: newline, safe_navigation - │ ├── receiver: - │ │ @ CallNode (location: (45,0)-(45,1)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (45,0)-(45,1) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (45,1)-(45,3) = "&." - │ ├── name: :call - │ ├── message_loc: ∅ - │ ├── opening_loc: (45,3)-(45,4) = "(" - │ ├── arguments: ∅ - │ ├── closing_loc: (45,4)-(45,5) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (47,0)-(47,7)) - │ ├── flags: newline, safe_navigation - │ ├── receiver: - │ │ @ CallNode (location: (47,0)-(47,1)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (47,0)-(47,1) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (47,1)-(47,3) = "&." - │ ├── name: :b - │ ├── message_loc: (47,3)-(47,4) = "b" - │ ├── opening_loc: (47,4)-(47,5) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (47,5)-(47,6)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (47,5)-(47,6)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :c - │ │ ├── message_loc: (47,5)-(47,6) = "c" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (47,6)-(47,7) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (49,0)-(49,6)) - │ ├── flags: newline, safe_navigation - │ ├── receiver: - │ │ @ CallNode (location: (49,0)-(49,1)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (49,0)-(49,1) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (49,1)-(49,3) = "&." - │ ├── name: :b - │ ├── message_loc: (49,3)-(49,4) = "b" - │ ├── opening_loc: (49,4)-(49,5) = "(" - │ ├── arguments: ∅ - │ ├── closing_loc: (49,5)-(49,6) = ")" - │ └── block: ∅ - ├── @ IfNode (location: (51,0)-(51,33)) - │ ├── flags: newline - │ ├── if_keyword_loc: (51,11)-(51,13) = "if" - │ ├── predicate: - │ │ @ AndNode (location: (51,14)-(51,33)) - │ │ ├── flags: ∅ - │ │ ├── left: - │ │ │ @ OrNode (location: (51,14)-(51,25)) - │ │ │ ├── flags: ∅ - │ │ │ ├── left: - │ │ │ │ @ CallNode (location: (51,14)-(51,18)) - │ │ │ │ ├── flags: ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :bar? - │ │ │ │ ├── message_loc: (51,14)-(51,18) = "bar?" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── right: - │ │ │ │ @ CallNode (location: (51,22)-(51,25)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ ├── message_loc: (51,22)-(51,25) = "baz" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── operator_loc: (51,19)-(51,21) = "or" - │ │ ├── right: - │ │ │ @ CallNode (location: (51,30)-(51,33)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :qux - │ │ │ ├── message_loc: (51,30)-(51,33) = "qux" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: (51,26)-(51,29) = "and" - │ ├── then_keyword_loc: ∅ - │ ├── statements: - │ │ @ StatementsNode (location: (51,0)-(51,10)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (51,0)-(51,10)) - │ │ ├── flags: newline, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (51,0)-(51,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (51,4)-(51,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 2) - │ │ │ ├── @ SymbolNode (location: (51,4)-(51,6)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: (51,4)-(51,5) = ":" - │ │ │ │ ├── value_loc: (51,5)-(51,6) = "a" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "a" - │ │ │ └── @ SymbolNode (location: (51,8)-(51,10)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (51,8)-(51,9) = ":" - │ │ │ ├── value_loc: (51,9)-(51,10) = "b" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "b" - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── subsequent: ∅ - │ └── end_keyword_loc: ∅ - ├── @ CallNode (location: (53,0)-(56,1)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (53,0)-(53,3) = "foo" - │ ├── opening_loc: (53,3)-(53,4) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (53,4)-(55,4)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ SymbolNode (location: (53,4)-(53,6)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (53,4)-(53,5) = ":" - │ │ │ ├── value_loc: (53,5)-(53,6) = "a" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "a" - │ │ └── @ SymbolNode (location: (55,2)-(55,4)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (55,2)-(55,3) = ":" - │ │ ├── value_loc: (55,3)-(55,4) = "b" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "b" - │ ├── closing_loc: (56,0)-(56,1) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (58,0)-(58,10)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (58,0)-(58,3) = "foo" - │ ├── opening_loc: (58,3)-(58,4) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (58,4)-(58,9)) - │ │ ├── flags: contains_splat - │ │ └── arguments: (length: 1) - │ │ └── @ SplatNode (location: (58,4)-(58,9)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (58,4)-(58,5) = "*" - │ │ └── expression: - │ │ @ CallNode (location: (58,5)-(58,9)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :rest - │ │ ├── message_loc: (58,5)-(58,9) = "rest" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (58,9)-(58,10) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (60,0)-(60,39)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (60,0)-(60,3) = "foo" - │ ├── opening_loc: (60,3)-(60,4) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (60,4)-(60,32)) - │ │ ├── flags: contains_keywords - │ │ └── arguments: (length: 2) - │ │ ├── @ SymbolNode (location: (60,4)-(60,6)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (60,4)-(60,5) = ":" - │ │ │ ├── value_loc: (60,5)-(60,6) = "a" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "a" - │ │ └── @ KeywordHashNode (location: (60,8)-(60,32)) - │ │ ├── flags: symbol_keys - │ │ └── elements: (length: 2) - │ │ ├── @ AssocNode (location: (60,8)-(60,22)) - │ │ │ ├── flags: ∅ - │ │ │ ├── key: - │ │ │ │ @ SymbolNode (location: (60,8)-(60,10)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: (60,8)-(60,9) = ":" - │ │ │ │ ├── value_loc: (60,9)-(60,10) = "h" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "h" - │ │ │ ├── value: - │ │ │ │ @ ArrayNode (location: (60,14)-(60,22)) - │ │ │ │ ├── flags: static_literal - │ │ │ │ ├── elements: (length: 2) - │ │ │ │ │ ├── @ SymbolNode (location: (60,15)-(60,17)) - │ │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ │ │ ├── opening_loc: (60,15)-(60,16) = ":" - │ │ │ │ │ │ ├── value_loc: (60,16)-(60,17) = "x" - │ │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ │ └── unescaped: "x" - │ │ │ │ │ └── @ SymbolNode (location: (60,19)-(60,21)) - │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ │ ├── opening_loc: (60,19)-(60,20) = ":" - │ │ │ │ │ ├── value_loc: (60,20)-(60,21) = "y" - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── unescaped: "y" - │ │ │ │ ├── opening_loc: (60,14)-(60,15) = "[" - │ │ │ │ └── closing_loc: (60,21)-(60,22) = "]" - │ │ │ └── operator_loc: (60,11)-(60,13) = "=>" - │ │ └── @ AssocNode (location: (60,24)-(60,32)) - │ │ ├── flags: static_literal - │ │ ├── key: - │ │ │ @ SymbolNode (location: (60,24)-(60,26)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (60,24)-(60,25) = ":" - │ │ │ ├── value_loc: (60,25)-(60,26) = "a" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "a" - │ │ ├── value: - │ │ │ @ SymbolNode (location: (60,30)-(60,32)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (60,30)-(60,31) = ":" - │ │ │ ├── value_loc: (60,31)-(60,32) = "b" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "b" - │ │ └── operator_loc: (60,27)-(60,29) = "=>" - │ ├── closing_loc: (60,39)-(60,40) = ")" - │ └── block: - │ @ BlockArgumentNode (location: (60,34)-(60,39)) - │ ├── flags: ∅ - │ ├── expression: - │ │ @ SymbolNode (location: (60,35)-(60,39)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (60,35)-(60,36) = ":" - │ │ ├── value_loc: (60,36)-(60,39) = "bar" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "bar" - │ └── operator_loc: (60,34)-(60,35) = "&" - ├── @ CallNode (location: (62,0)-(62,49)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :hi - │ ├── message_loc: (62,0)-(62,2) = "hi" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (62,3)-(62,49)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ IntegerNode (location: (62,3)-(62,6)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 123 - │ │ └── @ HashNode (location: (62,8)-(62,49)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (62,8)-(62,9) = "{" - │ │ ├── elements: (length: 3) - │ │ │ ├── @ AssocNode (location: (62,10)-(62,27)) - │ │ │ │ ├── flags: static_literal - │ │ │ │ ├── key: - │ │ │ │ │ @ SymbolNode (location: (62,10)-(62,16)) - │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ │ ├── opening_loc: (62,10)-(62,11) = ":" - │ │ │ │ │ ├── value_loc: (62,11)-(62,16) = "there" - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── unescaped: "there" - │ │ │ │ ├── value: - │ │ │ │ │ @ SymbolNode (location: (62,20)-(62,27)) - │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ │ ├── opening_loc: (62,20)-(62,21) = ":" - │ │ │ │ │ ├── value_loc: (62,21)-(62,27) = "friend" - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── unescaped: "friend" - │ │ │ │ └── operator_loc: (62,17)-(62,19) = "=>" - │ │ │ ├── @ AssocSplatNode (location: (62,29)-(62,33)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── value: - │ │ │ │ │ @ HashNode (location: (62,31)-(62,33)) - │ │ │ │ │ ├── flags: static_literal - │ │ │ │ │ ├── opening_loc: (62,31)-(62,32) = "{" - │ │ │ │ │ ├── elements: (length: 0) - │ │ │ │ │ └── closing_loc: (62,32)-(62,33) = "}" - │ │ │ │ └── operator_loc: (62,29)-(62,31) = "**" - │ │ │ └── @ AssocNode (location: (62,35)-(62,47)) - │ │ │ ├── flags: static_literal - │ │ │ ├── key: - │ │ │ │ @ SymbolNode (location: (62,35)-(62,42)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── value_loc: (62,35)-(62,41) = "whatup" - │ │ │ │ ├── closing_loc: (62,41)-(62,42) = ":" - │ │ │ │ └── unescaped: "whatup" - │ │ │ ├── value: - │ │ │ │ @ SymbolNode (location: (62,43)-(62,47)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: (62,43)-(62,44) = ":" - │ │ │ │ ├── value_loc: (62,44)-(62,47) = "dog" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "dog" - │ │ │ └── operator_loc: ∅ - │ │ └── closing_loc: (62,48)-(62,49) = "}" - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (64,0)-(64,36)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (64,0)-(64,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (64,4)-(64,15)) - │ │ ├── flags: contains_keywords - │ │ └── arguments: (length: 2) - │ │ ├── @ SymbolNode (location: (64,4)-(64,6)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (64,4)-(64,5) = ":" - │ │ │ ├── value_loc: (64,5)-(64,6) = "a" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "a" - │ │ └── @ KeywordHashNode (location: (64,8)-(64,15)) - │ │ ├── flags: symbol_keys - │ │ └── elements: (length: 1) - │ │ └── @ AssocNode (location: (64,8)-(64,15)) - │ │ ├── flags: static_literal - │ │ ├── key: - │ │ │ @ SymbolNode (location: (64,8)-(64,10)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (64,8)-(64,9) = "b" - │ │ │ ├── closing_loc: (64,9)-(64,10) = ":" - │ │ │ └── unescaped: "b" - │ │ ├── value: - │ │ │ @ TrueNode (location: (64,11)-(64,15)) - │ │ │ └── flags: static_literal - │ │ └── operator_loc: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (64,16)-(64,36)) - │ ├── flags: ∅ - │ ├── locals: [:a, :b] - │ ├── parameters: - │ │ @ BlockParametersNode (location: (64,19)-(64,25)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (64,20)-(64,24)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 2) - │ │ │ │ ├── @ RequiredParameterNode (location: (64,20)-(64,21)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── name: :a - │ │ │ │ └── @ RequiredParameterNode (location: (64,23)-(64,24)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :b - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: (64,19)-(64,20) = "|" - │ │ └── closing_loc: (64,24)-(64,25) = "|" - │ ├── body: - │ │ @ StatementsNode (location: (64,26)-(64,32)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (64,26)-(64,32)) - │ │ ├── flags: newline, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :puts - │ │ ├── message_loc: (64,26)-(64,30) = "puts" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (64,31)-(64,32)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ LocalVariableReadNode (location: (64,31)-(64,32)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :a - │ │ │ └── depth: 0 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── opening_loc: (64,16)-(64,18) = "do" - │ └── closing_loc: (64,33)-(64,36) = "end" - ├── @ CallNode (location: (66,0)-(66,17)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :hi - │ ├── message_loc: (66,0)-(66,2) = "hi" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (66,3)-(66,17)) - │ │ ├── flags: contains_keywords - │ │ └── arguments: (length: 1) - │ │ └── @ KeywordHashNode (location: (66,3)-(66,17)) - │ │ ├── flags: symbol_keys - │ │ └── elements: (length: 1) - │ │ └── @ AssocNode (location: (66,3)-(66,17)) - │ │ ├── flags: static_literal - │ │ ├── key: - │ │ │ @ SymbolNode (location: (66,3)-(66,9)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (66,3)-(66,8) = "there" - │ │ │ ├── closing_loc: (66,8)-(66,9) = ":" - │ │ │ └── unescaped: "there" - │ │ ├── value: - │ │ │ @ SymbolNode (location: (66,10)-(66,17)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (66,10)-(66,11) = ":" - │ │ │ ├── value_loc: (66,11)-(66,17) = "friend" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "friend" - │ │ └── operator_loc: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (68,0)-(68,40)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :hi - │ ├── message_loc: (68,0)-(68,2) = "hi" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (68,3)-(68,40)) - │ │ ├── flags: contains_keywords, contains_keyword_splat - │ │ └── arguments: (length: 1) - │ │ └── @ KeywordHashNode (location: (68,3)-(68,40)) - │ │ ├── flags: ∅ - │ │ └── elements: (length: 3) - │ │ ├── @ AssocNode (location: (68,3)-(68,20)) - │ │ │ ├── flags: static_literal - │ │ │ ├── key: - │ │ │ │ @ SymbolNode (location: (68,3)-(68,9)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: (68,3)-(68,4) = ":" - │ │ │ │ ├── value_loc: (68,4)-(68,9) = "there" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "there" - │ │ │ ├── value: - │ │ │ │ @ SymbolNode (location: (68,13)-(68,20)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: (68,13)-(68,14) = ":" - │ │ │ │ ├── value_loc: (68,14)-(68,20) = "friend" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "friend" - │ │ │ └── operator_loc: (68,10)-(68,12) = "=>" - │ │ ├── @ AssocSplatNode (location: (68,22)-(68,26)) - │ │ │ ├── flags: ∅ - │ │ │ ├── value: - │ │ │ │ @ HashNode (location: (68,24)-(68,26)) - │ │ │ │ ├── flags: static_literal - │ │ │ │ ├── opening_loc: (68,24)-(68,25) = "{" - │ │ │ │ ├── elements: (length: 0) - │ │ │ │ └── closing_loc: (68,25)-(68,26) = "}" - │ │ │ └── operator_loc: (68,22)-(68,24) = "**" - │ │ └── @ AssocNode (location: (68,28)-(68,40)) - │ │ ├── flags: static_literal - │ │ ├── key: - │ │ │ @ SymbolNode (location: (68,28)-(68,35)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (68,28)-(68,34) = "whatup" - │ │ │ ├── closing_loc: (68,34)-(68,35) = ":" - │ │ │ └── unescaped: "whatup" - │ │ ├── value: - │ │ │ @ SymbolNode (location: (68,36)-(68,40)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (68,36)-(68,37) = ":" - │ │ │ ├── value_loc: (68,37)-(68,40) = "dog" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "dog" - │ │ └── operator_loc: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (70,0)-(70,41)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :hi - │ ├── message_loc: (70,0)-(70,2) = "hi" - │ ├── opening_loc: (70,2)-(70,3) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (70,3)-(70,40)) - │ │ ├── flags: contains_keywords, contains_keyword_splat - │ │ └── arguments: (length: 1) - │ │ └── @ KeywordHashNode (location: (70,3)-(70,40)) - │ │ ├── flags: ∅ - │ │ └── elements: (length: 3) - │ │ ├── @ AssocNode (location: (70,3)-(70,20)) - │ │ │ ├── flags: static_literal - │ │ │ ├── key: - │ │ │ │ @ SymbolNode (location: (70,3)-(70,9)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: (70,3)-(70,4) = ":" - │ │ │ │ ├── value_loc: (70,4)-(70,9) = "there" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "there" - │ │ │ ├── value: - │ │ │ │ @ SymbolNode (location: (70,13)-(70,20)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: (70,13)-(70,14) = ":" - │ │ │ │ ├── value_loc: (70,14)-(70,20) = "friend" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "friend" - │ │ │ └── operator_loc: (70,10)-(70,12) = "=>" - │ │ ├── @ AssocSplatNode (location: (70,22)-(70,26)) - │ │ │ ├── flags: ∅ - │ │ │ ├── value: - │ │ │ │ @ HashNode (location: (70,24)-(70,26)) - │ │ │ │ ├── flags: static_literal - │ │ │ │ ├── opening_loc: (70,24)-(70,25) = "{" - │ │ │ │ ├── elements: (length: 0) - │ │ │ │ └── closing_loc: (70,25)-(70,26) = "}" - │ │ │ └── operator_loc: (70,22)-(70,24) = "**" - │ │ └── @ AssocNode (location: (70,28)-(70,40)) - │ │ ├── flags: static_literal - │ │ ├── key: - │ │ │ @ SymbolNode (location: (70,28)-(70,35)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (70,28)-(70,34) = "whatup" - │ │ │ ├── closing_loc: (70,34)-(70,35) = ":" - │ │ │ └── unescaped: "whatup" - │ │ ├── value: - │ │ │ @ SymbolNode (location: (70,36)-(70,40)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (70,36)-(70,37) = ":" - │ │ │ ├── value_loc: (70,37)-(70,40) = "dog" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "dog" - │ │ └── operator_loc: ∅ - │ ├── closing_loc: (70,40)-(70,41) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (72,0)-(72,35)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (72,0)-(72,3) = "foo" - │ ├── opening_loc: (72,3)-(72,4) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (72,4)-(72,26)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ HashNode (location: (72,4)-(72,26)) - │ │ ├── flags: static_literal - │ │ ├── opening_loc: (72,4)-(72,5) = "{" - │ │ ├── elements: (length: 2) - │ │ │ ├── @ AssocNode (location: (72,6)-(72,13)) - │ │ │ │ ├── flags: static_literal - │ │ │ │ ├── key: - │ │ │ │ │ @ SymbolNode (location: (72,6)-(72,8)) - │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── value_loc: (72,6)-(72,7) = "a" - │ │ │ │ │ ├── closing_loc: (72,7)-(72,8) = ":" - │ │ │ │ │ └── unescaped: "a" - │ │ │ │ ├── value: - │ │ │ │ │ @ TrueNode (location: (72,9)-(72,13)) - │ │ │ │ │ └── flags: static_literal - │ │ │ │ └── operator_loc: ∅ - │ │ │ └── @ AssocNode (location: (72,15)-(72,23)) - │ │ │ ├── flags: static_literal - │ │ │ ├── key: - │ │ │ │ @ SymbolNode (location: (72,15)-(72,17)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── value_loc: (72,15)-(72,16) = "b" - │ │ │ │ ├── closing_loc: (72,16)-(72,17) = ":" - │ │ │ │ └── unescaped: "b" - │ │ │ ├── value: - │ │ │ │ @ FalseNode (location: (72,18)-(72,23)) - │ │ │ │ └── flags: static_literal - │ │ │ └── operator_loc: ∅ - │ │ └── closing_loc: (72,25)-(72,26) = "}" - │ ├── closing_loc: (72,35)-(72,36) = ")" - │ └── block: - │ @ BlockArgumentNode (location: (72,28)-(72,35)) - │ ├── flags: ∅ - │ ├── expression: - │ │ @ SymbolNode (location: (72,29)-(72,35)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (72,29)-(72,30) = ":" - │ │ ├── value_loc: (72,30)-(72,35) = "block" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "block" - │ └── operator_loc: (72,28)-(72,29) = "&" - ├── @ CallNode (location: (74,0)-(74,20)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :hi - │ ├── message_loc: (74,0)-(74,2) = "hi" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (74,3)-(74,20)) - │ │ ├── flags: contains_keywords - │ │ └── arguments: (length: 1) - │ │ └── @ KeywordHashNode (location: (74,3)-(74,20)) - │ │ ├── flags: symbol_keys - │ │ └── elements: (length: 1) - │ │ └── @ AssocNode (location: (74,3)-(74,20)) - │ │ ├── flags: static_literal - │ │ ├── key: - │ │ │ @ SymbolNode (location: (74,3)-(74,9)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (74,3)-(74,4) = ":" - │ │ │ ├── value_loc: (74,4)-(74,9) = "there" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "there" - │ │ ├── value: - │ │ │ @ SymbolNode (location: (74,13)-(74,20)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (74,13)-(74,14) = ":" - │ │ │ ├── value_loc: (74,14)-(74,20) = "friend" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "friend" - │ │ └── operator_loc: (74,10)-(74,12) = "=>" - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (76,0)-(78,1)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (76,0)-(76,3) = "foo" - │ ├── opening_loc: (76,3)-(76,4) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (76,4)-(77,2)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ SymbolNode (location: (76,4)-(76,6)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (76,4)-(76,5) = ":" - │ │ │ ├── value_loc: (76,5)-(76,6) = "a" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "a" - │ │ └── @ SymbolNode (location: (77,0)-(77,2)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (77,0)-(77,1) = ":" - │ │ ├── value_loc: (77,1)-(77,2) = "b" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "b" - │ ├── closing_loc: (78,0)-(78,1) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (80,0)-(83,1)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (80,0)-(80,3) = "foo" - │ ├── opening_loc: (80,3)-(80,4) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (81,0)-(82,5)) - │ │ ├── flags: contains_keywords - │ │ └── arguments: (length: 2) - │ │ ├── @ SymbolNode (location: (81,0)-(81,2)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (81,0)-(81,1) = ":" - │ │ │ ├── value_loc: (81,1)-(81,2) = "a" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "a" - │ │ └── @ KeywordHashNode (location: (82,0)-(82,5)) - │ │ ├── flags: symbol_keys - │ │ └── elements: (length: 1) - │ │ └── @ AssocNode (location: (82,0)-(82,5)) - │ │ ├── flags: static_literal - │ │ ├── key: - │ │ │ @ SymbolNode (location: (82,0)-(82,2)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (82,0)-(82,1) = "b" - │ │ │ ├── closing_loc: (82,1)-(82,2) = ":" - │ │ │ └── unescaped: "b" - │ │ ├── value: - │ │ │ @ SymbolNode (location: (82,3)-(82,5)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (82,3)-(82,4) = ":" - │ │ │ ├── value_loc: (82,4)-(82,5) = "c" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "c" - │ │ └── operator_loc: ∅ - │ ├── closing_loc: (83,0)-(83,1) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (85,0)-(85,11)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (85,0)-(85,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockArgumentNode (location: (85,4)-(85,11)) - │ ├── flags: ∅ - │ ├── expression: - │ │ @ SymbolNode (location: (85,5)-(85,11)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (85,5)-(85,6) = ":" - │ │ ├── value_loc: (85,6)-(85,11) = "block" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "block" - │ └── operator_loc: (85,4)-(85,5) = "&" - ├── @ CallNode (location: (87,0)-(87,30)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (87,0)-(87,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (87,4)-(87,21)) - │ │ ├── flags: contains_keywords - │ │ └── arguments: (length: 1) - │ │ └── @ KeywordHashNode (location: (87,4)-(87,21)) - │ │ ├── flags: symbol_keys - │ │ └── elements: (length: 2) - │ │ ├── @ AssocNode (location: (87,4)-(87,11)) - │ │ │ ├── flags: static_literal - │ │ │ ├── key: - │ │ │ │ @ SymbolNode (location: (87,4)-(87,6)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── value_loc: (87,4)-(87,5) = "a" - │ │ │ │ ├── closing_loc: (87,5)-(87,6) = ":" - │ │ │ │ └── unescaped: "a" - │ │ │ ├── value: - │ │ │ │ @ TrueNode (location: (87,7)-(87,11)) - │ │ │ │ └── flags: static_literal - │ │ │ └── operator_loc: ∅ - │ │ └── @ AssocNode (location: (87,13)-(87,21)) - │ │ ├── flags: static_literal - │ │ ├── key: - │ │ │ @ SymbolNode (location: (87,13)-(87,15)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (87,13)-(87,14) = "b" - │ │ │ ├── closing_loc: (87,14)-(87,15) = ":" - │ │ │ └── unescaped: "b" - │ │ ├── value: - │ │ │ @ FalseNode (location: (87,16)-(87,21)) - │ │ │ └── flags: static_literal - │ │ └── operator_loc: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockArgumentNode (location: (87,23)-(87,30)) - │ ├── flags: ∅ - │ ├── expression: - │ │ @ SymbolNode (location: (87,24)-(87,30)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (87,24)-(87,25) = ":" - │ │ ├── value_loc: (87,25)-(87,30) = "block" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "block" - │ └── operator_loc: (87,23)-(87,24) = "&" - ├── @ CallNode (location: (89,0)-(89,21)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :some_func - │ ├── message_loc: (89,0)-(89,9) = "some_func" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (89,10)-(89,21)) - │ │ ├── flags: contains_keywords - │ │ └── arguments: (length: 2) - │ │ ├── @ IntegerNode (location: (89,10)-(89,11)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── @ KeywordHashNode (location: (89,13)-(89,21)) - │ │ ├── flags: symbol_keys - │ │ └── elements: (length: 1) - │ │ └── @ AssocNode (location: (89,13)-(89,21)) - │ │ ├── flags: static_literal - │ │ ├── key: - │ │ │ @ SymbolNode (location: (89,13)-(89,19)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (89,13)-(89,18) = "kwarg" - │ │ │ ├── closing_loc: (89,18)-(89,19) = ":" - │ │ │ └── unescaped: "kwarg" - │ │ ├── value: - │ │ │ @ IntegerNode (location: (89,20)-(89,21)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ └── operator_loc: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (91,0)-(91,18)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (91,0)-(91,6)) - │ │ ├── flags: ∅ - │ │ └── name: :Kernel - │ ├── call_operator_loc: (91,6)-(91,7) = "." - │ ├── name: :Integer - │ ├── message_loc: (91,7)-(91,14) = "Integer" - │ ├── opening_loc: (91,14)-(91,15) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (91,15)-(91,17)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (91,15)-(91,17)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 10 - │ ├── closing_loc: (91,17)-(91,18) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (93,0)-(93,10)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (93,0)-(93,1)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :x - │ │ ├── message_loc: (93,0)-(93,1) = "x" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (93,1)-(93,2) = "." - │ ├── name: :each - │ ├── message_loc: (93,2)-(93,6) = "each" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (93,7)-(93,10)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (93,7)-(93,8) = "{" - │ └── closing_loc: (93,9)-(93,10) = "}" - ├── @ CallNode (location: (95,0)-(95,14)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (95,0)-(95,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (95,0)-(95,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (95,3)-(95,4) = "." - │ ├── name: :map - │ ├── message_loc: (95,4)-(95,7) = "map" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (95,8)-(95,14)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (95,10)-(95,12)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ BackReferenceReadNode (location: (95,10)-(95,12)) - │ │ ├── flags: newline - │ │ └── name: :$& - │ ├── opening_loc: (95,8)-(95,9) = "{" - │ └── closing_loc: (95,13)-(95,14) = "}" - ├── @ CallNode (location: (97,0)-(97,12)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantPathNode (location: (97,0)-(97,4)) - │ │ ├── flags: ∅ - │ │ ├── parent: - │ │ │ @ ConstantReadNode (location: (97,0)-(97,1)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :A - │ │ ├── name: :B - │ │ ├── delimiter_loc: (97,1)-(97,3) = "::" - │ │ └── name_loc: (97,3)-(97,4) = "B" - │ ├── call_operator_loc: (97,4)-(97,6) = "::" - │ ├── name: :C - │ ├── message_loc: (97,6)-(97,7) = "C" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (97,8)-(97,12)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ SymbolNode (location: (97,8)-(97,12)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (97,8)-(97,9) = ":" - │ │ ├── value_loc: (97,9)-(97,12) = "foo" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "foo" - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (99,0)-(99,13)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantPathNode (location: (99,0)-(99,4)) - │ │ ├── flags: ∅ - │ │ ├── parent: - │ │ │ @ ConstantReadNode (location: (99,0)-(99,1)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :A - │ │ ├── name: :B - │ │ ├── delimiter_loc: (99,1)-(99,3) = "::" - │ │ └── name_loc: (99,3)-(99,4) = "B" - │ ├── call_operator_loc: (99,4)-(99,6) = "::" - │ ├── name: :C - │ ├── message_loc: (99,6)-(99,7) = "C" - │ ├── opening_loc: (99,7)-(99,8) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (99,8)-(99,12)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ SymbolNode (location: (99,8)-(99,12)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (99,8)-(99,9) = ":" - │ │ ├── value_loc: (99,9)-(99,12) = "foo" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "foo" - │ ├── closing_loc: (99,12)-(99,13) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (101,0)-(101,17)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantPathNode (location: (101,0)-(101,4)) - │ │ ├── flags: ∅ - │ │ ├── parent: - │ │ │ @ ConstantReadNode (location: (101,0)-(101,1)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :A - │ │ ├── name: :B - │ │ ├── delimiter_loc: (101,1)-(101,3) = "::" - │ │ └── name_loc: (101,3)-(101,4) = "B" - │ ├── call_operator_loc: (101,4)-(101,6) = "::" - │ ├── name: :C - │ ├── message_loc: (101,6)-(101,7) = "C" - │ ├── opening_loc: (101,7)-(101,8) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (101,8)-(101,12)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ SymbolNode (location: (101,8)-(101,12)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (101,8)-(101,9) = ":" - │ │ ├── value_loc: (101,9)-(101,12) = "foo" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "foo" - │ ├── closing_loc: (101,12)-(101,13) = ")" - │ └── block: - │ @ BlockNode (location: (101,14)-(101,17)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (101,14)-(101,15) = "{" - │ └── closing_loc: (101,16)-(101,17) = "}" - ├── @ CallNode (location: (103,0)-(103,12)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (103,0)-(103,3) = "foo" - │ ├── opening_loc: (103,3)-(103,4) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (103,4)-(103,11)) - │ │ ├── flags: contains_keywords - │ │ └── arguments: (length: 1) - │ │ └── @ KeywordHashNode (location: (103,4)-(103,11)) - │ │ ├── flags: symbol_keys - │ │ └── elements: (length: 1) - │ │ └── @ AssocNode (location: (103,4)-(103,11)) - │ │ ├── flags: static_literal - │ │ ├── key: - │ │ │ @ SymbolNode (location: (103,4)-(103,8)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (103,4)-(103,5) = "\"" - │ │ │ ├── value_loc: (103,5)-(103,6) = "a" - │ │ │ ├── closing_loc: (103,6)-(103,8) = "\":" - │ │ │ └── unescaped: "a" - │ │ ├── value: - │ │ │ @ IntegerNode (location: (103,9)-(103,11)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: -1 - │ │ └── operator_loc: ∅ - │ ├── closing_loc: (103,11)-(103,12) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (105,0)-(105,28)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (105,0)-(105,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (105,4)-(105,28)) - │ │ ├── flags: contains_keywords - │ │ └── arguments: (length: 1) - │ │ └── @ KeywordHashNode (location: (105,4)-(105,28)) - │ │ ├── flags: symbol_keys - │ │ └── elements: (length: 1) - │ │ └── @ AssocNode (location: (105,4)-(105,28)) - │ │ ├── flags: ∅ - │ │ ├── key: - │ │ │ @ SymbolNode (location: (105,4)-(105,8)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (105,4)-(105,7) = "bar" - │ │ │ ├── closing_loc: (105,7)-(105,8) = ":" - │ │ │ └── unescaped: "bar" - │ │ ├── value: - │ │ │ @ HashNode (location: (105,9)-(105,28)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (105,9)-(105,10) = "{" - │ │ │ ├── elements: (length: 1) - │ │ │ │ └── @ AssocNode (location: (105,11)-(105,26)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── key: - │ │ │ │ │ @ SymbolNode (location: (105,11)-(105,15)) - │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── value_loc: (105,11)-(105,14) = "baz" - │ │ │ │ │ ├── closing_loc: (105,14)-(105,15) = ":" - │ │ │ │ │ └── unescaped: "baz" - │ │ │ │ ├── value: - │ │ │ │ │ @ CallNode (location: (105,16)-(105,26)) - │ │ │ │ │ ├── flags: ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :qux - │ │ │ │ │ ├── message_loc: (105,16)-(105,19) = "qux" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: - │ │ │ │ │ @ BlockNode (location: (105,20)-(105,26)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── locals: [] - │ │ │ │ │ ├── parameters: ∅ - │ │ │ │ │ ├── body: ∅ - │ │ │ │ │ ├── opening_loc: (105,20)-(105,22) = "do" - │ │ │ │ │ └── closing_loc: (105,23)-(105,26) = "end" - │ │ │ │ └── operator_loc: ∅ - │ │ │ └── closing_loc: (105,27)-(105,28) = "}" - │ │ └── operator_loc: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (107,0)-(107,24)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (107,0)-(107,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (107,4)-(107,24)) - │ │ ├── flags: contains_keywords - │ │ └── arguments: (length: 1) - │ │ └── @ KeywordHashNode (location: (107,4)-(107,24)) - │ │ ├── flags: symbol_keys - │ │ └── elements: (length: 1) - │ │ └── @ AssocNode (location: (107,4)-(107,24)) - │ │ ├── flags: ∅ - │ │ ├── key: - │ │ │ @ SymbolNode (location: (107,4)-(107,8)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (107,4)-(107,7) = "bar" - │ │ │ ├── closing_loc: (107,7)-(107,8) = ":" - │ │ │ └── unescaped: "bar" - │ │ ├── value: - │ │ │ @ HashNode (location: (107,9)-(107,24)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (107,9)-(107,10) = "{" - │ │ │ ├── elements: (length: 1) - │ │ │ │ └── @ AssocSplatNode (location: (107,11)-(107,22)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── value: - │ │ │ │ │ @ CallNode (location: (107,13)-(107,22)) - │ │ │ │ │ ├── flags: ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :kw - │ │ │ │ │ ├── message_loc: (107,13)-(107,15) = "kw" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: - │ │ │ │ │ @ BlockNode (location: (107,16)-(107,22)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── locals: [] - │ │ │ │ │ ├── parameters: ∅ - │ │ │ │ │ ├── body: ∅ - │ │ │ │ │ ├── opening_loc: (107,16)-(107,18) = "do" - │ │ │ │ │ └── closing_loc: (107,19)-(107,22) = "end" - │ │ │ │ └── operator_loc: (107,11)-(107,13) = "**" - │ │ │ └── closing_loc: (107,23)-(107,24) = "}" - │ │ └── operator_loc: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (109,0)-(109,36)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (109,0)-(109,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (109,4)-(109,29)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ InterpolatedStringNode (location: (109,4)-(109,29)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (109,4)-(109,5) = "\"" - │ │ ├── parts: (length: 1) - │ │ │ └── @ EmbeddedStatementsNode (location: (109,5)-(109,28)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (109,5)-(109,7) = "\#{" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (109,7)-(109,27)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (109,7)-(109,27)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── receiver: - │ │ │ │ │ @ CallNode (location: (109,7)-(109,10)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :bar - │ │ │ │ │ ├── message_loc: (109,7)-(109,10) = "bar" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── call_operator_loc: (109,10)-(109,11) = "." - │ │ │ │ ├── name: :map - │ │ │ │ ├── message_loc: (109,11)-(109,14) = "map" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: - │ │ │ │ @ BlockNode (location: (109,15)-(109,27)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── locals: [] - │ │ │ │ ├── parameters: ∅ - │ │ │ │ ├── body: - │ │ │ │ │ @ StatementsNode (location: (109,18)-(109,23)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── body: (length: 1) - │ │ │ │ │ └── @ StringNode (location: (109,18)-(109,23)) - │ │ │ │ │ ├── flags: newline - │ │ │ │ │ ├── opening_loc: (109,18)-(109,19) = "\"" - │ │ │ │ │ ├── content_loc: (109,19)-(109,22) = "baz" - │ │ │ │ │ ├── closing_loc: (109,22)-(109,23) = "\"" - │ │ │ │ │ └── unescaped: "baz" - │ │ │ │ ├── opening_loc: (109,15)-(109,17) = "do" - │ │ │ │ └── closing_loc: (109,24)-(109,27) = "end" - │ │ │ └── closing_loc: (109,27)-(109,28) = "}" - │ │ └── closing_loc: (109,28)-(109,29) = "\"" - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (109,30)-(109,36)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (109,30)-(109,32) = "do" - │ └── closing_loc: (109,33)-(109,36) = "end" - ├── @ CallNode (location: (111,0)-(111,28)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (111,0)-(111,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (111,4)-(111,28)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ ClassNode (location: (111,4)-(111,28)) - │ │ ├── flags: ∅ - │ │ ├── locals: [] - │ │ ├── class_keyword_loc: (111,4)-(111,9) = "class" - │ │ ├── constant_path: - │ │ │ @ ConstantReadNode (location: (111,10)-(111,13)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :Bar - │ │ ├── inheritance_operator_loc: ∅ - │ │ ├── superclass: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (111,14)-(111,24)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (111,14)-(111,24)) - │ │ │ ├── flags: newline, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :baz - │ │ │ ├── message_loc: (111,14)-(111,17) = "baz" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: - │ │ │ @ BlockNode (location: (111,18)-(111,24)) - │ │ │ ├── flags: ∅ - │ │ │ ├── locals: [] - │ │ │ ├── parameters: ∅ - │ │ │ ├── body: ∅ - │ │ │ ├── opening_loc: (111,18)-(111,20) = "do" - │ │ │ └── closing_loc: (111,21)-(111,24) = "end" - │ │ ├── end_keyword_loc: (111,25)-(111,28) = "end" - │ │ └── name: :Bar - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (113,0)-(113,29)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (113,0)-(113,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (113,4)-(113,29)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ ModuleNode (location: (113,4)-(113,29)) - │ │ ├── flags: ∅ - │ │ ├── locals: [] - │ │ ├── module_keyword_loc: (113,4)-(113,10) = "module" - │ │ ├── constant_path: - │ │ │ @ ConstantReadNode (location: (113,11)-(113,14)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :Bar - │ │ ├── body: - │ │ │ @ StatementsNode (location: (113,15)-(113,25)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (113,15)-(113,25)) - │ │ │ ├── flags: newline, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :baz - │ │ │ ├── message_loc: (113,15)-(113,18) = "baz" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: - │ │ │ @ BlockNode (location: (113,19)-(113,25)) - │ │ │ ├── flags: ∅ - │ │ │ ├── locals: [] - │ │ │ ├── parameters: ∅ - │ │ │ ├── body: ∅ - │ │ │ ├── opening_loc: (113,19)-(113,21) = "do" - │ │ │ └── closing_loc: (113,22)-(113,25) = "end" - │ │ ├── end_keyword_loc: (113,26)-(113,29) = "end" - │ │ └── name: :Bar - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (115,0)-(115,16)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (115,0)-(115,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (115,4)-(115,16)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ ArrayNode (location: (115,4)-(115,16)) - │ │ ├── flags: ∅ - │ │ ├── elements: (length: 1) - │ │ │ └── @ CallNode (location: (115,5)-(115,15)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :baz - │ │ │ ├── message_loc: (115,5)-(115,8) = "baz" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: - │ │ │ @ BlockNode (location: (115,9)-(115,15)) - │ │ │ ├── flags: ∅ - │ │ │ ├── locals: [] - │ │ │ ├── parameters: ∅ - │ │ │ ├── body: ∅ - │ │ │ ├── opening_loc: (115,9)-(115,11) = "do" - │ │ │ └── closing_loc: (115,12)-(115,15) = "end" - │ │ ├── opening_loc: (115,4)-(115,5) = "[" - │ │ └── closing_loc: (115,15)-(115,16) = "]" - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (117,0)-(117,28)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :p - │ ├── message_loc: (117,0)-(117,1) = "p" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (117,2)-(117,28)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ BeginNode (location: (117,2)-(117,28)) - │ │ ├── flags: ∅ - │ │ ├── begin_keyword_loc: (117,2)-(117,7) = "begin" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (117,8)-(117,24)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (117,8)-(117,24)) - │ │ │ ├── flags: newline - │ │ │ ├── receiver: - │ │ │ │ @ IntegerNode (location: (117,8)-(117,9)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ ├── call_operator_loc: (117,9)-(117,10) = "." - │ │ │ ├── name: :times - │ │ │ ├── message_loc: (117,10)-(117,15) = "times" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: - │ │ │ @ BlockNode (location: (117,16)-(117,24)) - │ │ │ ├── flags: ∅ - │ │ │ ├── locals: [] - │ │ │ ├── parameters: ∅ - │ │ │ ├── body: - │ │ │ │ @ StatementsNode (location: (117,19)-(117,20)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ IntegerNode (location: (117,19)-(117,20)) - │ │ │ │ ├── flags: newline, static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ ├── opening_loc: (117,16)-(117,18) = "do" - │ │ │ └── closing_loc: (117,21)-(117,24) = "end" - │ │ ├── rescue_clause: ∅ - │ │ ├── else_clause: ∅ - │ │ ├── ensure_clause: ∅ - │ │ └── end_keyword_loc: (117,25)-(117,28) = "end" - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (119,0)-(124,5)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (119,0)-(119,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (119,4)-(124,5)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ SymbolNode (location: (119,4)-(119,6)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (119,4)-(119,5) = ":" - │ │ │ ├── value_loc: (119,5)-(119,6) = "a" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "a" - │ │ └── @ IfNode (location: (120,2)-(124,5)) - │ │ ├── flags: newline - │ │ ├── if_keyword_loc: (120,2)-(120,4) = "if" - │ │ ├── predicate: - │ │ │ @ CallNode (location: (120,5)-(120,6)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :x - │ │ │ ├── message_loc: (120,5)-(120,6) = "x" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── then_keyword_loc: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (121,4)-(123,7)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (121,4)-(123,7)) - │ │ │ ├── flags: newline, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (121,4)-(121,7) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: - │ │ │ @ BlockNode (location: (121,8)-(123,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── locals: [:a] - │ │ │ ├── parameters: - │ │ │ │ @ BlockParametersNode (location: (121,11)-(121,14)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── parameters: - │ │ │ │ │ @ ParametersNode (location: (121,12)-(121,13)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── requireds: (length: 1) - │ │ │ │ │ │ └── @ RequiredParameterNode (location: (121,12)-(121,13)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ └── name: :a - │ │ │ │ │ ├── optionals: (length: 0) - │ │ │ │ │ ├── rest: ∅ - │ │ │ │ │ ├── posts: (length: 0) - │ │ │ │ │ ├── keywords: (length: 0) - │ │ │ │ │ ├── keyword_rest: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── locals: (length: 0) - │ │ │ │ ├── opening_loc: (121,11)-(121,12) = "|" - │ │ │ │ └── closing_loc: (121,13)-(121,14) = "|" - │ │ │ ├── body: - │ │ │ │ @ StatementsNode (location: (122,6)-(122,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ LocalVariableReadNode (location: (122,6)-(122,7)) - │ │ │ │ ├── flags: newline - │ │ │ │ ├── name: :a - │ │ │ │ └── depth: 0 - │ │ │ ├── opening_loc: (121,8)-(121,10) = "do" - │ │ │ └── closing_loc: (123,4)-(123,7) = "end" - │ │ ├── subsequent: ∅ - │ │ └── end_keyword_loc: (124,2)-(124,5) = "end" - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (126,0)-(135,5)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (126,0)-(126,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (126,4)-(135,5)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 3) - │ │ ├── @ SymbolNode (location: (126,4)-(126,6)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (126,4)-(126,5) = ":" - │ │ │ ├── value_loc: (126,5)-(126,6) = "a" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "a" - │ │ ├── @ WhileNode (location: (127,2)-(131,5)) - │ │ │ ├── flags: ∅ - │ │ │ ├── keyword_loc: (127,2)-(127,7) = "while" - │ │ │ ├── closing_loc: (131,2)-(131,5) = "end" - │ │ │ ├── predicate: - │ │ │ │ @ CallNode (location: (127,8)-(127,9)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :x - │ │ │ │ ├── message_loc: (127,8)-(127,9) = "x" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── statements: - │ │ │ @ StatementsNode (location: (128,4)-(130,7)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (128,4)-(130,7)) - │ │ │ ├── flags: newline, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (128,4)-(128,7) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: - │ │ │ @ BlockNode (location: (128,8)-(130,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── locals: [:a] - │ │ │ ├── parameters: - │ │ │ │ @ BlockParametersNode (location: (128,11)-(128,14)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── parameters: - │ │ │ │ │ @ ParametersNode (location: (128,12)-(128,13)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── requireds: (length: 1) - │ │ │ │ │ │ └── @ RequiredParameterNode (location: (128,12)-(128,13)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ └── name: :a - │ │ │ │ │ ├── optionals: (length: 0) - │ │ │ │ │ ├── rest: ∅ - │ │ │ │ │ ├── posts: (length: 0) - │ │ │ │ │ ├── keywords: (length: 0) - │ │ │ │ │ ├── keyword_rest: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── locals: (length: 0) - │ │ │ │ ├── opening_loc: (128,11)-(128,12) = "|" - │ │ │ │ └── closing_loc: (128,13)-(128,14) = "|" - │ │ │ ├── body: - │ │ │ │ @ StatementsNode (location: (129,6)-(129,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ LocalVariableReadNode (location: (129,6)-(129,7)) - │ │ │ │ ├── flags: newline - │ │ │ │ ├── name: :a - │ │ │ │ └── depth: 0 - │ │ │ ├── opening_loc: (128,8)-(128,10) = "do" - │ │ │ └── closing_loc: (130,4)-(130,7) = "end" - │ │ └── @ UntilNode (location: (132,2)-(135,5)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (132,2)-(132,7) = "until" - │ │ ├── closing_loc: (135,2)-(135,5) = "end" - │ │ ├── predicate: - │ │ │ @ CallNode (location: (132,8)-(132,9)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :x - │ │ │ ├── message_loc: (132,8)-(132,9) = "x" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── statements: - │ │ @ StatementsNode (location: (133,4)-(134,7)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (133,4)-(134,7)) - │ │ ├── flags: newline, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :baz - │ │ ├── message_loc: (133,4)-(133,7) = "baz" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: - │ │ @ BlockNode (location: (133,8)-(134,7)) - │ │ ├── flags: ∅ - │ │ ├── locals: [] - │ │ ├── parameters: ∅ - │ │ ├── body: ∅ - │ │ ├── opening_loc: (133,8)-(133,10) = "do" - │ │ └── closing_loc: (134,4)-(134,7) = "end" - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (137,0)-(137,9)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ HashNode (location: (137,0)-(137,2)) - │ │ ├── flags: static_literal - │ │ ├── opening_loc: (137,0)-(137,1) = "{" - │ │ ├── elements: (length: 0) - │ │ └── closing_loc: (137,1)-(137,2) = "}" - │ ├── call_operator_loc: ∅ - │ ├── name: :+ - │ ├── message_loc: (137,3)-(137,4) = "+" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (137,5)-(137,9)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (137,5)-(137,9)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :A - │ │ ├── message_loc: (137,5)-(137,6) = "A" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: - │ │ @ BlockNode (location: (137,7)-(137,9)) - │ │ ├── flags: ∅ - │ │ ├── locals: [] - │ │ ├── parameters: ∅ - │ │ ├── body: ∅ - │ │ ├── opening_loc: (137,7)-(137,8) = "{" - │ │ └── closing_loc: (137,8)-(137,9) = "}" - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (139,0)-(139,16)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ HashNode (location: (139,0)-(139,2)) - │ │ ├── flags: static_literal - │ │ ├── opening_loc: (139,0)-(139,1) = "{" - │ │ ├── elements: (length: 0) - │ │ └── closing_loc: (139,1)-(139,2) = "}" - │ ├── call_operator_loc: ∅ - │ ├── name: :+ - │ ├── message_loc: (139,3)-(139,4) = "+" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (139,5)-(139,16)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (139,5)-(139,16)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :A - │ │ ├── message_loc: (139,5)-(139,6) = "A" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: - │ │ @ BlockNode (location: (139,7)-(139,16)) - │ │ ├── flags: ∅ - │ │ ├── locals: [:a] - │ │ ├── parameters: - │ │ │ @ BlockParametersNode (location: (139,9)-(139,12)) - │ │ │ ├── flags: ∅ - │ │ │ ├── parameters: - │ │ │ │ @ ParametersNode (location: (139,10)-(139,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── requireds: (length: 1) - │ │ │ │ │ └── @ RequiredParameterNode (location: (139,10)-(139,11)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── name: :a - │ │ │ │ ├── optionals: (length: 0) - │ │ │ │ ├── rest: ∅ - │ │ │ │ ├── posts: (length: 0) - │ │ │ │ ├── keywords: (length: 0) - │ │ │ │ ├── keyword_rest: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── locals: (length: 0) - │ │ │ ├── opening_loc: (139,9)-(139,10) = "|" - │ │ │ └── closing_loc: (139,11)-(139,12) = "|" - │ │ ├── body: - │ │ │ @ StatementsNode (location: (139,13)-(139,14)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ LocalVariableReadNode (location: (139,13)-(139,14)) - │ │ │ ├── flags: newline - │ │ │ ├── name: :a - │ │ │ └── depth: 0 - │ │ ├── opening_loc: (139,7)-(139,8) = "{" - │ │ └── closing_loc: (139,15)-(139,16) = "}" - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (141,0)-(141,11)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (141,0)-(141,4)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :A - │ │ ├── message_loc: (141,0)-(141,1) = "A" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: - │ │ @ BlockNode (location: (141,2)-(141,4)) - │ │ ├── flags: ∅ - │ │ ├── locals: [] - │ │ ├── parameters: ∅ - │ │ ├── body: ∅ - │ │ ├── opening_loc: (141,2)-(141,3) = "{" - │ │ └── closing_loc: (141,3)-(141,4) = "}" - │ ├── call_operator_loc: ∅ - │ ├── name: :+ - │ ├── message_loc: (141,5)-(141,6) = "+" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (141,7)-(141,11)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (141,7)-(141,11)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :A - │ │ ├── message_loc: (141,7)-(141,8) = "A" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: - │ │ @ BlockNode (location: (141,9)-(141,11)) - │ │ ├── flags: ∅ - │ │ ├── locals: [] - │ │ ├── parameters: ∅ - │ │ ├── body: ∅ - │ │ ├── opening_loc: (141,9)-(141,10) = "{" - │ │ └── closing_loc: (141,10)-(141,11) = "}" - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (143,0)-(143,11)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (143,0)-(143,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :lst - │ │ ├── message_loc: (143,0)-(143,3) = "lst" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :<< - │ ├── message_loc: (143,4)-(143,6) = "<<" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (143,7)-(143,11)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (143,7)-(143,11)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :A - │ │ ├── message_loc: (143,7)-(143,8) = "A" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: - │ │ @ BlockNode (location: (143,9)-(143,11)) - │ │ ├── flags: ∅ - │ │ ├── locals: [] - │ │ ├── parameters: ∅ - │ │ ├── body: ∅ - │ │ ├── opening_loc: (143,9)-(143,10) = "{" - │ │ └── closing_loc: (143,10)-(143,11) = "}" - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ InterpolatedStringNode (location: (145,0)-(145,17)) - │ ├── flags: newline - │ ├── opening_loc: (145,0)-(145,1) = "\"" - │ ├── parts: (length: 1) - │ │ └── @ EmbeddedStatementsNode (location: (145,1)-(145,16)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (145,1)-(145,3) = "\#{" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (145,4)-(145,14)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (145,4)-(145,14)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :join - │ │ │ ├── message_loc: (145,4)-(145,8) = "join" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (145,9)-(145,14)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ ParenthesesNode (location: (145,9)-(145,14)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── body: - │ │ │ │ │ @ StatementsNode (location: (145,10)-(145,13)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── body: (length: 1) - │ │ │ │ │ └── @ StringNode (location: (145,10)-(145,13)) - │ │ │ │ │ ├── flags: newline - │ │ │ │ │ ├── opening_loc: (145,10)-(145,11) = "\"" - │ │ │ │ │ ├── content_loc: (145,11)-(145,12) = " " - │ │ │ │ │ ├── closing_loc: (145,12)-(145,13) = "\"" - │ │ │ │ │ └── unescaped: " " - │ │ │ │ ├── opening_loc: (145,9)-(145,10) = "(" - │ │ │ │ └── closing_loc: (145,13)-(145,14) = ")" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── closing_loc: (145,15)-(145,16) = "}" - │ └── closing_loc: (145,16)-(145,17) = "\"" - ├── @ InterpolatedStringNode (location: (147,0)-(147,8)) - │ ├── flags: newline - │ ├── opening_loc: (147,0)-(147,1) = "\"" - │ ├── parts: (length: 1) - │ │ └── @ EmbeddedStatementsNode (location: (147,1)-(147,7)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (147,1)-(147,3) = "\#{" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (147,3)-(147,6)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ ParenthesesNode (location: (147,3)-(147,6)) - │ │ │ ├── flags: ∅ - │ │ │ ├── body: - │ │ │ │ @ StatementsNode (location: (147,4)-(147,5)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (147,4)-(147,5)) - │ │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :v - │ │ │ │ ├── message_loc: (147,4)-(147,5) = "v" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── opening_loc: (147,3)-(147,4) = "(" - │ │ │ └── closing_loc: (147,5)-(147,6) = ")" - │ │ └── closing_loc: (147,6)-(147,7) = "}" - │ └── closing_loc: (147,7)-(147,8) = "\"" - ├── @ DefNode (location: (149,0)-(149,18)) - │ ├── flags: newline - │ ├── name: :f - │ ├── name_loc: (149,4)-(149,5) = "f" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (149,6)-(149,7)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: - │ │ │ @ RestParameterNode (location: (149,6)-(149,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: ∅ - │ │ │ ├── name_loc: ∅ - │ │ │ └── operator_loc: (149,6)-(149,7) = "*" - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (149,10)-(149,13)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (149,10)-(149,13)) - │ │ ├── flags: newline, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :p - │ │ ├── message_loc: (149,10)-(149,11) = "p" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (149,12)-(149,13)) - │ │ │ ├── flags: contains_splat - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ SplatNode (location: (149,12)-(149,13)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (149,12)-(149,13) = "*" - │ │ │ └── expression: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (149,0)-(149,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (149,5)-(149,6) = "(" - │ ├── rparen_loc: (149,7)-(149,8) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (149,15)-(149,18) = "end" - ├── @ CallNode (location: (151,0)-(151,16)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (151,0)-(151,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (151,4)-(151,16)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ IntegerNode (location: (151,4)-(151,5)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── @ CallNode (location: (151,7)-(151,16)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :Bar - │ │ ├── message_loc: (151,7)-(151,10) = "Bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: - │ │ @ BlockNode (location: (151,11)-(151,16)) - │ │ ├── flags: ∅ - │ │ ├── locals: [] - │ │ ├── parameters: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (151,13)-(151,14)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ IntegerNode (location: (151,13)-(151,14)) - │ │ │ ├── flags: newline, static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── opening_loc: (151,11)-(151,12) = "{" - │ │ └── closing_loc: (151,15)-(151,16) = "}" - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ LocalVariableWriteNode (location: (153,0)-(153,7)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── depth: 0 - │ ├── name_loc: (153,0)-(153,3) = "foo" - │ ├── value: - │ │ @ IntegerNode (location: (153,6)-(153,7)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ └── operator_loc: (153,4)-(153,5) = "=" - ├── @ CallNode (location: (154,0)-(154,6)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (154,0)-(154,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (154,4)-(154,6)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (154,4)-(154,5) = "{" - │ └── closing_loc: (154,5)-(154,6) = "}" - └── @ CallNode (location: (156,0)-(156,19)) - ├── flags: newline - ├── receiver: - │ @ InstanceVariableReadNode (location: (156,0)-(156,2)) - │ ├── flags: ∅ - │ └── name: :@a - ├── call_operator_loc: (156,2)-(156,3) = "." - ├── name: :b - ├── message_loc: (156,3)-(156,4) = "b" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (156,5)-(156,19)) - │ ├── flags: contains_keywords - │ └── arguments: (length: 1) - │ └── @ KeywordHashNode (location: (156,5)-(156,19)) - │ ├── flags: ∅ - │ └── elements: (length: 1) - │ └── @ AssocNode (location: (156,5)-(156,19)) - │ ├── flags: ∅ - │ ├── key: - │ │ @ InterpolatedSymbolNode (location: (156,5)-(156,16)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (156,5)-(156,6) = "\"" - │ │ ├── parts: (length: 2) - │ │ │ ├── @ StringNode (location: (156,6)-(156,7)) - │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── content_loc: (156,6)-(156,7) = "c" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "c" - │ │ │ └── @ EmbeddedStatementsNode (location: (156,7)-(156,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (156,7)-(156,9) = "\#{" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (156,9)-(156,13)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (156,9)-(156,13)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :name - │ │ │ │ ├── message_loc: (156,9)-(156,13) = "name" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── closing_loc: (156,13)-(156,14) = "}" - │ │ └── closing_loc: (156,14)-(156,16) = "\":" - │ ├── value: - │ │ @ IntegerNode (location: (156,17)-(156,19)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 42 - │ └── operator_loc: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/methods.txt b/test/prism/snapshots/methods.txt deleted file mode 100644 index 0780999142ffbe..00000000000000 --- a/test/prism/snapshots/methods.txt +++ /dev/null @@ -1,2245 +0,0 @@ -@ ProgramNode (location: (1,0)-(183,37)) -├── flags: ∅ -├── locals: [:a, :c, :foo] -└── statements: - @ StatementsNode (location: (1,0)-(183,37)) - ├── flags: ∅ - └── body: (length: 69) - ├── @ DefNode (location: (1,0)-(2,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (1,4)-(1,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,8)-(1,18)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ MultiTargetNode (location: (1,8)-(1,18)) - │ │ │ ├── flags: ∅ - │ │ │ ├── lefts: (length: 2) - │ │ │ │ ├── @ RequiredParameterNode (location: (1,9)-(1,12)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── name: :bar - │ │ │ │ └── @ RequiredParameterNode (location: (1,14)-(1,17)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :baz - │ │ │ ├── rest: ∅ - │ │ │ ├── rights: (length: 0) - │ │ │ ├── lparen_loc: (1,8)-(1,9) = "(" - │ │ │ └── rparen_loc: (1,17)-(1,18) = ")" - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:bar, :baz] - │ ├── def_keyword_loc: (1,0)-(1,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (1,7)-(1,8) = "(" - │ ├── rparen_loc: (1,18)-(1,19) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (2,0)-(2,3) = "end" - ├── @ DefNode (location: (4,0)-(5,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (4,4)-(4,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (4,8)-(4,44)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ MultiTargetNode (location: (4,8)-(4,18)) - │ │ │ ├── flags: ∅ - │ │ │ ├── lefts: (length: 2) - │ │ │ │ ├── @ RequiredParameterNode (location: (4,9)-(4,12)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── name: :bar - │ │ │ │ └── @ RequiredParameterNode (location: (4,14)-(4,17)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :baz - │ │ │ ├── rest: ∅ - │ │ │ ├── rights: (length: 0) - │ │ │ ├── lparen_loc: (4,8)-(4,9) = "(" - │ │ │ └── rparen_loc: (4,17)-(4,18) = ")" - │ │ ├── optionals: (length: 1) - │ │ │ └── @ OptionalParameterNode (location: (4,20)-(4,32)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :optional - │ │ │ ├── name_loc: (4,20)-(4,28) = "optional" - │ │ │ ├── operator_loc: (4,29)-(4,30) = "=" - │ │ │ └── value: - │ │ │ @ IntegerNode (location: (4,31)-(4,32)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 1) - │ │ │ └── @ MultiTargetNode (location: (4,34)-(4,44)) - │ │ │ ├── flags: ∅ - │ │ │ ├── lefts: (length: 2) - │ │ │ │ ├── @ RequiredParameterNode (location: (4,35)-(4,38)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── name: :bin - │ │ │ │ └── @ RequiredParameterNode (location: (4,40)-(4,43)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :bag - │ │ │ ├── rest: ∅ - │ │ │ ├── rights: (length: 0) - │ │ │ ├── lparen_loc: (4,34)-(4,35) = "(" - │ │ │ └── rparen_loc: (4,43)-(4,44) = ")" - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:bar, :baz, :optional, :bin, :bag] - │ ├── def_keyword_loc: (4,0)-(4,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (4,7)-(4,8) = "(" - │ ├── rparen_loc: (4,44)-(4,45) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (5,0)-(5,3) = "end" - ├── @ DefNode (location: (8,0)-(8,18)) - │ ├── flags: newline - │ ├── name: :a - │ ├── name_loc: (8,4)-(8,5) = "a" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ BeginNode (location: (8,0)-(8,18)) - │ │ ├── flags: ∅ - │ │ ├── begin_keyword_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── rescue_clause: ∅ - │ │ ├── else_clause: ∅ - │ │ ├── ensure_clause: - │ │ │ @ EnsureNode (location: (8,7)-(8,18)) - │ │ │ ├── flags: ∅ - │ │ │ ├── ensure_keyword_loc: (8,7)-(8,13) = "ensure" - │ │ │ ├── statements: ∅ - │ │ │ └── end_keyword_loc: (8,15)-(8,18) = "end" - │ │ └── end_keyword_loc: (8,15)-(8,18) = "end" - │ ├── locals: [] - │ ├── def_keyword_loc: (8,0)-(8,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (8,15)-(8,18) = "end" - ├── @ DefNode (location: (10,0)-(11,3)) - │ ├── flags: newline - │ ├── name: :a - │ ├── name_loc: (10,8)-(10,9) = "a" - │ ├── receiver: - │ │ @ ParenthesesNode (location: (10,4)-(10,7)) - │ │ ├── flags: ∅ - │ │ ├── body: - │ │ │ @ CallNode (location: (10,5)-(10,6)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (10,5)-(10,6) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── opening_loc: (10,4)-(10,5) = "(" - │ │ └── closing_loc: (10,6)-(10,7) = ")" - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (10,0)-(10,3) = "def" - │ ├── operator_loc: (10,7)-(10,8) = "." - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (11,0)-(11,3) = "end" - ├── @ DefNode (location: (13,0)-(14,3)) - │ ├── flags: newline - │ ├── name: :b - │ ├── name_loc: (13,9)-(13,10) = "b" - │ ├── receiver: - │ │ @ ParenthesesNode (location: (13,4)-(13,7)) - │ │ ├── flags: ∅ - │ │ ├── body: - │ │ │ @ CallNode (location: (13,5)-(13,6)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :a - │ │ │ ├── message_loc: (13,5)-(13,6) = "a" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── opening_loc: (13,4)-(13,5) = "(" - │ │ └── closing_loc: (13,6)-(13,7) = ")" - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (13,0)-(13,3) = "def" - │ ├── operator_loc: (13,7)-(13,9) = "::" - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (14,0)-(14,3) = "end" - ├── @ DefNode (location: (16,0)-(17,3)) - │ ├── flags: newline - │ ├── name: :a - │ ├── name_loc: (16,10)-(16,11) = "a" - │ ├── receiver: - │ │ @ FalseNode (location: (16,4)-(16,9)) - │ │ └── flags: static_literal - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (16,0)-(16,3) = "def" - │ ├── operator_loc: (16,9)-(16,10) = "." - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (17,0)-(17,3) = "end" - ├── @ DefNode (location: (19,0)-(20,3)) - │ ├── flags: newline - │ ├── name: :a - │ ├── name_loc: (19,4)-(19,5) = "a" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (19,6)-(19,9)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: - │ │ │ @ ForwardingParameterNode (location: (19,6)-(19,9)) - │ │ │ └── flags: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (19,0)-(19,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (19,5)-(19,6) = "(" - │ ├── rparen_loc: (19,9)-(19,10) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (20,0)-(20,3) = "end" - ├── @ DefNode (location: (22,0)-(23,3)) - │ ├── flags: newline - │ ├── name: :a - │ ├── name_loc: (22,9)-(22,10) = "a" - │ ├── receiver: - │ │ @ GlobalVariableReadNode (location: (22,4)-(22,8)) - │ │ ├── flags: ∅ - │ │ └── name: :$var - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (22,0)-(22,3) = "def" - │ ├── operator_loc: (22,8)-(22,9) = "." - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (23,0)-(23,3) = "end" - ├── @ DefNode (location: (25,0)-(26,3)) - │ ├── flags: newline - │ ├── name: :b - │ ├── name_loc: (25,6)-(25,7) = "b" - │ ├── receiver: - │ │ @ CallNode (location: (25,4)-(25,5)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (25,4)-(25,5) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (25,0)-(25,3) = "def" - │ ├── operator_loc: (25,5)-(25,6) = "." - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (26,0)-(26,3) = "end" - ├── @ DefNode (location: (28,0)-(29,3)) - │ ├── flags: newline - │ ├── name: :a - │ ├── name_loc: (28,9)-(28,10) = "a" - │ ├── receiver: - │ │ @ InstanceVariableReadNode (location: (28,4)-(28,8)) - │ │ ├── flags: ∅ - │ │ └── name: :@var - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (28,0)-(28,3) = "def" - │ ├── operator_loc: (28,8)-(28,9) = "." - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (29,0)-(29,3) = "end" - ├── @ DefNode (location: (31,0)-(31,13)) - │ ├── flags: newline - │ ├── name: :a - │ ├── name_loc: (31,4)-(31,5) = "a" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (31,6)-(31,8)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 1) - │ │ │ └── @ RequiredKeywordParameterNode (location: (31,6)-(31,8)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :b - │ │ │ └── name_loc: (31,6)-(31,8) = "b:" - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:b] - │ ├── def_keyword_loc: (31,0)-(31,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (31,10)-(31,13) = "end" - ├── @ StringNode (location: (33,0)-(33,6)) - │ ├── flags: newline - │ ├── opening_loc: (33,0)-(33,2) = "%," - │ ├── content_loc: (33,2)-(33,5) = "abc" - │ ├── closing_loc: (33,5)-(33,6) = "," - │ └── unescaped: "abc" - ├── @ DefNode (location: (35,0)-(36,3)) - │ ├── flags: newline - │ ├── name: :a - │ ├── name_loc: (35,4)-(35,5) = "a" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (35,6)-(35,8)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 1) - │ │ │ └── @ RequiredKeywordParameterNode (location: (35,6)-(35,8)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :b - │ │ │ └── name_loc: (35,6)-(35,8) = "b:" - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:b] - │ ├── def_keyword_loc: (35,0)-(35,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (35,5)-(35,6) = "(" - │ ├── rparen_loc: (35,8)-(35,9) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (36,0)-(36,3) = "end" - ├── @ DefNode (location: (38,0)-(39,3)) - │ ├── flags: newline - │ ├── name: :a - │ ├── name_loc: (38,4)-(38,5) = "a" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (38,6)-(38,9)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: - │ │ │ @ KeywordRestParameterNode (location: (38,6)-(38,9)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :b - │ │ │ ├── name_loc: (38,8)-(38,9) = "b" - │ │ │ └── operator_loc: (38,6)-(38,8) = "**" - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:b] - │ ├── def_keyword_loc: (38,0)-(38,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (38,5)-(38,6) = "(" - │ ├── rparen_loc: (38,9)-(38,10) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (39,0)-(39,3) = "end" - ├── @ DefNode (location: (41,0)-(42,3)) - │ ├── flags: newline - │ ├── name: :a - │ ├── name_loc: (41,4)-(41,5) = "a" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (41,6)-(41,8)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: - │ │ │ @ KeywordRestParameterNode (location: (41,6)-(41,8)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: ∅ - │ │ │ ├── name_loc: ∅ - │ │ │ └── operator_loc: (41,6)-(41,8) = "**" - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (41,0)-(41,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (41,5)-(41,6) = "(" - │ ├── rparen_loc: (41,8)-(41,9) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (42,0)-(42,3) = "end" - ├── @ LocalVariableWriteNode (location: (44,0)-(44,5)) - │ ├── flags: newline - │ ├── name: :a - │ ├── depth: 0 - │ ├── name_loc: (44,0)-(44,1) = "a" - │ ├── value: - │ │ @ IntegerNode (location: (44,4)-(44,5)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ └── operator_loc: (44,2)-(44,3) = "=" - ├── @ DefNode (location: (44,7)-(45,3)) - │ ├── flags: newline - │ ├── name: :a - │ ├── name_loc: (44,11)-(44,12) = "a" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (44,7)-(44,10) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (45,0)-(45,3) = "end" - ├── @ DefNode (location: (47,0)-(48,3)) - │ ├── flags: newline - │ ├── name: :a - │ ├── name_loc: (47,4)-(47,5) = "a" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (47,6)-(47,13)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 3) - │ │ │ ├── @ RequiredParameterNode (location: (47,6)-(47,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :b - │ │ │ ├── @ RequiredParameterNode (location: (47,9)-(47,10)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :c - │ │ │ └── @ RequiredParameterNode (location: (47,12)-(47,13)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :d - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:b, :c, :d] - │ ├── def_keyword_loc: (47,0)-(47,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (48,0)-(48,3) = "end" - ├── @ DefNode (location: (50,0)-(51,3)) - │ ├── flags: newline - │ ├── name: :a - │ ├── name_loc: (50,8)-(50,9) = "a" - │ ├── receiver: - │ │ @ NilNode (location: (50,4)-(50,7)) - │ │ └── flags: static_literal - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (50,0)-(50,3) = "def" - │ ├── operator_loc: (50,7)-(50,8) = "." - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (51,0)-(51,3) = "end" - ├── @ DefNode (location: (53,0)-(54,3)) - │ ├── flags: newline - │ ├── name: :a - │ ├── name_loc: (53,4)-(53,5) = "a" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (53,6)-(53,14)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 2) - │ │ │ ├── @ RequiredKeywordParameterNode (location: (53,6)-(53,8)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :b - │ │ │ │ └── name_loc: (53,6)-(53,8) = "b:" - │ │ │ └── @ OptionalKeywordParameterNode (location: (53,10)-(53,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :c - │ │ │ ├── name_loc: (53,10)-(53,12) = "c:" - │ │ │ └── value: - │ │ │ @ IntegerNode (location: (53,13)-(53,14)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:b, :c] - │ ├── def_keyword_loc: (53,0)-(53,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (54,0)-(54,3) = "end" - ├── @ DefNode (location: (56,0)-(57,3)) - │ ├── flags: newline - │ ├── name: :a - │ ├── name_loc: (56,4)-(56,5) = "a" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (56,6)-(56,14)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 2) - │ │ │ ├── @ RequiredKeywordParameterNode (location: (56,6)-(56,8)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :b - │ │ │ │ └── name_loc: (56,6)-(56,8) = "b:" - │ │ │ └── @ OptionalKeywordParameterNode (location: (56,10)-(56,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :c - │ │ │ ├── name_loc: (56,10)-(56,12) = "c:" - │ │ │ └── value: - │ │ │ @ IntegerNode (location: (56,13)-(56,14)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:b, :c] - │ ├── def_keyword_loc: (56,0)-(56,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (56,5)-(56,6) = "(" - │ ├── rparen_loc: (56,14)-(56,15) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (57,0)-(57,3) = "end" - ├── @ DefNode (location: (59,0)-(61,3)) - │ ├── flags: newline - │ ├── name: :a - │ ├── name_loc: (59,4)-(59,5) = "a" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (59,6)-(60,7)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 2) - │ │ │ ├── @ OptionalKeywordParameterNode (location: (59,6)-(60,3)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :b - │ │ │ │ ├── name_loc: (59,6)-(59,8) = "b:" - │ │ │ │ └── value: - │ │ │ │ @ IntegerNode (location: (60,2)-(60,3)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ └── @ RequiredKeywordParameterNode (location: (60,5)-(60,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :c - │ │ │ └── name_loc: (60,5)-(60,7) = "c:" - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:b, :c] - │ ├── def_keyword_loc: (59,0)-(59,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (59,5)-(59,6) = "(" - │ ├── rparen_loc: (60,7)-(60,8) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (61,0)-(61,3) = "end" - ├── @ StringNode (location: (63,0)-(63,6)) - │ ├── flags: newline - │ ├── opening_loc: (63,0)-(63,2) = "%." - │ ├── content_loc: (63,2)-(63,5) = "abc" - │ ├── closing_loc: (63,5)-(63,6) = "." - │ └── unescaped: "abc" - ├── @ DefNode (location: (65,0)-(66,3)) - │ ├── flags: newline - │ ├── name: :a - │ ├── name_loc: (65,4)-(65,5) = "a" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (65,6)-(65,18)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 2) - │ │ │ ├── @ OptionalParameterNode (location: (65,6)-(65,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :b - │ │ │ │ ├── name_loc: (65,6)-(65,7) = "b" - │ │ │ │ ├── operator_loc: (65,8)-(65,9) = "=" - │ │ │ │ └── value: - │ │ │ │ @ IntegerNode (location: (65,10)-(65,11)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ └── @ OptionalParameterNode (location: (65,13)-(65,18)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :c - │ │ │ ├── name_loc: (65,13)-(65,14) = "c" - │ │ │ ├── operator_loc: (65,15)-(65,16) = "=" - │ │ │ └── value: - │ │ │ @ IntegerNode (location: (65,17)-(65,18)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:b, :c] - │ ├── def_keyword_loc: (65,0)-(65,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (66,0)-(66,3) = "end" - ├── @ DefNode (location: (68,0)-(69,3)) - │ ├── flags: newline - │ ├── name: :a - │ ├── name_loc: (68,4)-(68,5) = "a" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (68,0)-(68,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (68,5)-(68,6) = "(" - │ ├── rparen_loc: (68,6)-(68,7) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (69,0)-(69,3) = "end" - ├── @ DefNode (location: (71,0)-(72,3)) - │ ├── flags: newline - │ ├── name: :a - │ ├── name_loc: (71,4)-(71,5) = "a" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (71,6)-(71,14)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (71,6)-(71,7)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :b - │ │ ├── optionals: (length: 1) - │ │ │ └── @ OptionalParameterNode (location: (71,9)-(71,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :c - │ │ │ ├── name_loc: (71,9)-(71,10) = "c" - │ │ │ ├── operator_loc: (71,11)-(71,12) = "=" - │ │ │ └── value: - │ │ │ @ IntegerNode (location: (71,13)-(71,14)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:b, :c] - │ ├── def_keyword_loc: (71,0)-(71,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (72,0)-(72,3) = "end" - ├── @ DefNode (location: (74,0)-(75,3)) - │ ├── flags: newline - │ ├── name: :a - │ ├── name_loc: (74,4)-(74,5) = "a" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (74,6)-(74,7)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (74,6)-(74,7)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :b - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:b] - │ ├── def_keyword_loc: (74,0)-(74,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (75,0)-(75,3) = "end" - ├── @ DefNode (location: (77,0)-(77,32)) - │ ├── flags: newline - │ ├── name: :a - │ ├── name_loc: (77,4)-(77,5) = "a" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ BeginNode (location: (77,0)-(77,32)) - │ │ ├── flags: ∅ - │ │ ├── begin_keyword_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── rescue_clause: - │ │ │ @ RescueNode (location: (77,7)-(77,13)) - │ │ │ ├── flags: ∅ - │ │ │ ├── keyword_loc: (77,7)-(77,13) = "rescue" - │ │ │ ├── exceptions: (length: 0) - │ │ │ ├── operator_loc: ∅ - │ │ │ ├── reference: ∅ - │ │ │ ├── statements: ∅ - │ │ │ └── subsequent: ∅ - │ │ ├── else_clause: - │ │ │ @ ElseNode (location: (77,15)-(77,27)) - │ │ │ ├── flags: ∅ - │ │ │ ├── else_keyword_loc: (77,15)-(77,19) = "else" - │ │ │ ├── statements: ∅ - │ │ │ └── end_keyword_loc: (77,21)-(77,27) = "ensure" - │ │ ├── ensure_clause: - │ │ │ @ EnsureNode (location: (77,21)-(77,32)) - │ │ │ ├── flags: ∅ - │ │ │ ├── ensure_keyword_loc: (77,21)-(77,27) = "ensure" - │ │ │ ├── statements: ∅ - │ │ │ └── end_keyword_loc: (77,29)-(77,32) = "end" - │ │ └── end_keyword_loc: (77,29)-(77,32) = "end" - │ ├── locals: [] - │ ├── def_keyword_loc: (77,0)-(77,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (77,29)-(77,32) = "end" - ├── @ DefNode (location: (79,0)-(80,3)) - │ ├── flags: newline - │ ├── name: :a - │ ├── name_loc: (79,4)-(79,5) = "a" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (79,6)-(79,8)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: - │ │ │ @ RestParameterNode (location: (79,6)-(79,8)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :b - │ │ │ ├── name_loc: (79,7)-(79,8) = "b" - │ │ │ └── operator_loc: (79,6)-(79,7) = "*" - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:b] - │ ├── def_keyword_loc: (79,0)-(79,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (80,0)-(80,3) = "end" - ├── @ DefNode (location: (82,0)-(83,3)) - │ ├── flags: newline - │ ├── name: :a - │ ├── name_loc: (82,4)-(82,5) = "a" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (82,6)-(82,7)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: - │ │ │ @ RestParameterNode (location: (82,6)-(82,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: ∅ - │ │ │ ├── name_loc: ∅ - │ │ │ └── operator_loc: (82,6)-(82,7) = "*" - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (82,0)-(82,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (82,5)-(82,6) = "(" - │ ├── rparen_loc: (82,7)-(82,8) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (83,0)-(83,3) = "end" - ├── @ DefNode (location: (85,0)-(87,3)) - │ ├── flags: newline - │ ├── name: :a - │ ├── name_loc: (85,4)-(85,5) = "a" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (86,0)-(86,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ LocalVariableWriteNode (location: (86,0)-(86,5)) - │ │ ├── flags: newline - │ │ ├── name: :b - │ │ ├── depth: 0 - │ │ ├── name_loc: (86,0)-(86,1) = "b" - │ │ ├── value: - │ │ │ @ IntegerNode (location: (86,4)-(86,5)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── operator_loc: (86,2)-(86,3) = "=" - │ ├── locals: [:b] - │ ├── def_keyword_loc: (85,0)-(85,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (87,0)-(87,3) = "end" - ├── @ DefNode (location: (89,0)-(90,3)) - │ ├── flags: newline - │ ├── name: :a - │ ├── name_loc: (89,9)-(89,10) = "a" - │ ├── receiver: - │ │ @ SelfNode (location: (89,4)-(89,8)) - │ │ └── flags: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (89,0)-(89,3) = "def" - │ ├── operator_loc: (89,8)-(89,9) = "." - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (90,0)-(90,3) = "end" - ├── @ DefNode (location: (92,0)-(93,3)) - │ ├── flags: newline - │ ├── name: :a - │ ├── name_loc: (92,9)-(92,10) = "a" - │ ├── receiver: - │ │ @ TrueNode (location: (92,4)-(92,8)) - │ │ └── flags: static_literal - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (92,0)-(92,3) = "def" - │ ├── operator_loc: (92,8)-(92,9) = "." - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (93,0)-(93,3) = "end" - ├── @ DefNode (location: (95,0)-(96,3)) - │ ├── flags: newline - │ ├── name: :a - │ ├── name_loc: (95,4)-(95,5) = "a" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (95,0)-(95,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (96,0)-(96,3) = "end" - ├── @ DefNode (location: (98,0)-(101,3)) - │ ├── flags: newline - │ ├── name: :hi - │ ├── name_loc: (98,4)-(98,6) = "hi" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (99,0)-(100,4)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 2) - │ │ ├── @ IfNode (location: (99,0)-(99,18)) - │ │ │ ├── flags: newline - │ │ │ ├── if_keyword_loc: (99,11)-(99,13) = "if" - │ │ │ ├── predicate: - │ │ │ │ @ TrueNode (location: (99,14)-(99,18)) - │ │ │ │ └── flags: static_literal - │ │ │ ├── then_keyword_loc: ∅ - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (99,0)-(99,10)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ ReturnNode (location: (99,0)-(99,10)) - │ │ │ │ ├── flags: newline - │ │ │ │ ├── keyword_loc: (99,0)-(99,6) = "return" - │ │ │ │ └── arguments: - │ │ │ │ @ ArgumentsNode (location: (99,7)-(99,10)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ SymbolNode (location: (99,7)-(99,10)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: (99,7)-(99,8) = ":" - │ │ │ │ ├── value_loc: (99,8)-(99,10) = "hi" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "hi" - │ │ │ ├── subsequent: ∅ - │ │ │ └── end_keyword_loc: ∅ - │ │ └── @ SymbolNode (location: (100,0)-(100,4)) - │ │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (100,0)-(100,1) = ":" - │ │ ├── value_loc: (100,1)-(100,4) = "bye" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "bye" - │ ├── locals: [] - │ ├── def_keyword_loc: (98,0)-(98,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (101,0)-(101,3) = "end" - ├── @ DefNode (location: (103,0)-(103,11)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (103,4)-(103,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (103,10)-(103,11)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ IntegerNode (location: (103,10)-(103,11)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── locals: [] - │ ├── def_keyword_loc: (103,0)-(103,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: (103,8)-(103,9) = "=" - │ └── end_keyword_loc: ∅ - ├── @ DefNode (location: (104,0)-(104,11)) - │ ├── flags: newline - │ ├── name: :bar - │ ├── name_loc: (104,4)-(104,7) = "bar" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (104,10)-(104,11)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ IntegerNode (location: (104,10)-(104,11)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── locals: [] - │ ├── def_keyword_loc: (104,0)-(104,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: (104,8)-(104,9) = "=" - │ └── end_keyword_loc: ∅ - ├── @ DefNode (location: (106,0)-(106,18)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (106,4)-(106,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (106,8)-(106,11)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (106,8)-(106,11)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :bar - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (106,15)-(106,18)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ IntegerNode (location: (106,15)-(106,18)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 123 - │ ├── locals: [:bar] - │ ├── def_keyword_loc: (106,0)-(106,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (106,7)-(106,8) = "(" - │ ├── rparen_loc: (106,11)-(106,12) = ")" - │ ├── equal_loc: (106,13)-(106,14) = "=" - │ └── end_keyword_loc: ∅ - ├── @ DefNode (location: (108,0)-(108,13)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (108,4)-(108,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (108,10)-(108,13)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ IntegerNode (location: (108,10)-(108,13)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 123 - │ ├── locals: [] - │ ├── def_keyword_loc: (108,0)-(108,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: (108,8)-(108,9) = "=" - │ └── end_keyword_loc: ∅ - ├── @ DefNode (location: (110,0)-(110,19)) - │ ├── flags: newline - │ ├── name: :a - │ ├── name_loc: (110,4)-(110,5) = "a" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (110,6)-(110,7)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: - │ │ │ @ RestParameterNode (location: (110,6)-(110,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: ∅ - │ │ │ ├── name_loc: ∅ - │ │ │ └── operator_loc: (110,6)-(110,7) = "*" - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (110,10)-(110,14)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (110,10)-(110,14)) - │ │ ├── flags: newline, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :b - │ │ ├── message_loc: (110,10)-(110,11) = "b" - │ │ ├── opening_loc: (110,11)-(110,12) = "(" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (110,12)-(110,13)) - │ │ │ ├── flags: contains_splat - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ SplatNode (location: (110,12)-(110,13)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (110,12)-(110,13) = "*" - │ │ │ └── expression: ∅ - │ │ ├── closing_loc: (110,13)-(110,14) = ")" - │ │ └── block: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (110,0)-(110,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (110,5)-(110,6) = "(" - │ ├── rparen_loc: (110,7)-(110,8) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (110,16)-(110,19) = "end" - ├── @ DefNode (location: (112,0)-(112,23)) - │ ├── flags: newline - │ ├── name: :a - │ ├── name_loc: (112,4)-(112,5) = "a" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (112,6)-(112,9)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: - │ │ │ @ ForwardingParameterNode (location: (112,6)-(112,9)) - │ │ │ └── flags: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (112,12)-(112,18)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (112,12)-(112,18)) - │ │ ├── flags: newline, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :b - │ │ ├── message_loc: (112,12)-(112,13) = "b" - │ │ ├── opening_loc: (112,13)-(112,14) = "(" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (112,14)-(112,17)) - │ │ │ ├── flags: contains_forwarding - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ ForwardingArgumentsNode (location: (112,14)-(112,17)) - │ │ │ └── flags: ∅ - │ │ ├── closing_loc: (112,17)-(112,18) = ")" - │ │ └── block: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (112,0)-(112,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (112,5)-(112,6) = "(" - │ ├── rparen_loc: (112,9)-(112,10) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (112,20)-(112,23) = "end" - ├── @ DefNode (location: (114,0)-(114,29)) - │ ├── flags: newline - │ ├── name: :a - │ ├── name_loc: (114,4)-(114,5) = "a" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (114,6)-(114,9)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: - │ │ │ @ ForwardingParameterNode (location: (114,6)-(114,9)) - │ │ │ └── flags: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (114,12)-(114,24)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (114,12)-(114,24)) - │ │ ├── flags: newline, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :b - │ │ ├── message_loc: (114,12)-(114,13) = "b" - │ │ ├── opening_loc: (114,13)-(114,14) = "(" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (114,14)-(114,23)) - │ │ │ ├── flags: contains_forwarding - │ │ │ └── arguments: (length: 3) - │ │ │ ├── @ IntegerNode (location: (114,14)-(114,15)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ ├── @ IntegerNode (location: (114,17)-(114,18)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 2 - │ │ │ └── @ ForwardingArgumentsNode (location: (114,20)-(114,23)) - │ │ │ └── flags: ∅ - │ │ ├── closing_loc: (114,23)-(114,24) = ")" - │ │ └── block: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (114,0)-(114,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (114,5)-(114,6) = "(" - │ ├── rparen_loc: (114,9)-(114,10) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (114,26)-(114,29) = "end" - ├── @ DefNode (location: (116,0)-(117,3)) - │ ├── flags: newline - │ ├── name: :a - │ ├── name_loc: (116,12)-(116,13) = "a" - │ ├── receiver: - │ │ @ ParenthesesNode (location: (116,4)-(116,11)) - │ │ ├── flags: ∅ - │ │ ├── body: - │ │ │ @ LocalVariableWriteNode (location: (116,5)-(116,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :c - │ │ │ ├── depth: 0 - │ │ │ ├── name_loc: (116,5)-(116,6) = "c" - │ │ │ ├── value: - │ │ │ │ @ CallNode (location: (116,9)-(116,10)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :b - │ │ │ │ ├── message_loc: (116,9)-(116,10) = "b" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── operator_loc: (116,7)-(116,8) = "=" - │ │ ├── opening_loc: (116,4)-(116,5) = "(" - │ │ └── closing_loc: (116,10)-(116,11) = ")" - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (116,0)-(116,3) = "def" - │ ├── operator_loc: (116,11)-(116,12) = "." - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (117,0)-(117,3) = "end" - ├── @ DefNode (location: (119,0)-(120,3)) - │ ├── flags: newline - │ ├── name: :a - │ ├── name_loc: (119,4)-(119,5) = "a" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (119,6)-(119,8)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: - │ │ @ BlockParameterNode (location: (119,6)-(119,8)) - │ │ ├── flags: ∅ - │ │ ├── name: :b - │ │ ├── name_loc: (119,7)-(119,8) = "b" - │ │ └── operator_loc: (119,6)-(119,7) = "&" - │ ├── body: ∅ - │ ├── locals: [:b] - │ ├── def_keyword_loc: (119,0)-(119,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (120,0)-(120,3) = "end" - ├── @ DefNode (location: (122,0)-(123,3)) - │ ├── flags: newline - │ ├── name: :a - │ ├── name_loc: (122,4)-(122,5) = "a" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (122,6)-(122,7)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: - │ │ @ BlockParameterNode (location: (122,6)-(122,7)) - │ │ ├── flags: ∅ - │ │ ├── name: ∅ - │ │ ├── name_loc: ∅ - │ │ └── operator_loc: (122,6)-(122,7) = "&" - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (122,0)-(122,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (122,5)-(122,6) = "(" - │ ├── rparen_loc: (122,7)-(122,8) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (123,0)-(123,3) = "end" - ├── @ DefNode (location: (125,0)-(126,3)) - │ ├── flags: newline - │ ├── name: :a - │ ├── name_loc: (125,10)-(125,11) = "a" - │ ├── receiver: - │ │ @ ClassVariableReadNode (location: (125,4)-(125,9)) - │ │ ├── flags: ∅ - │ │ └── name: :@@var - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (125,0)-(125,3) = "def" - │ ├── operator_loc: (125,9)-(125,10) = "." - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (126,0)-(126,3) = "end" - ├── @ DefNode (location: (128,0)-(129,3)) - │ ├── flags: newline - │ ├── name: :C - │ ├── name_loc: (128,12)-(128,13) = "C" - │ ├── receiver: - │ │ @ ParenthesesNode (location: (128,4)-(128,11)) - │ │ ├── flags: ∅ - │ │ ├── body: - │ │ │ @ LocalVariableWriteNode (location: (128,5)-(128,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :a - │ │ │ ├── depth: 0 - │ │ │ ├── name_loc: (128,5)-(128,6) = "a" - │ │ │ ├── value: - │ │ │ │ @ CallNode (location: (128,9)-(128,10)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :b - │ │ │ │ ├── message_loc: (128,9)-(128,10) = "b" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── operator_loc: (128,7)-(128,8) = "=" - │ │ ├── opening_loc: (128,4)-(128,5) = "(" - │ │ └── closing_loc: (128,10)-(128,11) = ")" - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (128,0)-(128,3) = "def" - │ ├── operator_loc: (128,11)-(128,12) = "." - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (129,0)-(129,3) = "end" - ├── @ DefNode (location: (131,0)-(131,28)) - │ ├── flags: newline - │ ├── name: :Array_function - │ ├── name_loc: (131,9)-(131,23) = "Array_function" - │ ├── receiver: - │ │ @ SelfNode (location: (131,4)-(131,8)) - │ │ └── flags: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (131,0)-(131,3) = "def" - │ ├── operator_loc: (131,8)-(131,9) = "." - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (131,25)-(131,28) = "end" - ├── @ ConstantWriteNode (location: (133,0)-(133,9)) - │ ├── flags: newline - │ ├── name: :Const - │ ├── name_loc: (133,0)-(133,5) = "Const" - │ ├── value: - │ │ @ IntegerNode (location: (133,8)-(133,9)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ └── operator_loc: (133,6)-(133,7) = "=" - ├── @ DefNode (location: (133,11)-(134,3)) - │ ├── flags: newline - │ ├── name: :a - │ ├── name_loc: (133,21)-(133,22) = "a" - │ ├── receiver: - │ │ @ ConstantReadNode (location: (133,15)-(133,20)) - │ │ ├── flags: ∅ - │ │ └── name: :Const - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (133,11)-(133,14) = "def" - │ ├── operator_loc: (133,20)-(133,21) = "." - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (134,0)-(134,3) = "end" - ├── @ DefNode (location: (136,0)-(136,31)) - │ ├── flags: newline - │ ├── name: :a - │ ├── name_loc: (136,4)-(136,5) = "a" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (136,6)-(136,9)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: - │ │ │ @ ForwardingParameterNode (location: (136,6)-(136,9)) - │ │ │ └── flags: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (136,12)-(136,26)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ InterpolatedStringNode (location: (136,12)-(136,26)) - │ │ ├── flags: newline - │ │ ├── opening_loc: (136,12)-(136,13) = "\"" - │ │ ├── parts: (length: 2) - │ │ │ ├── @ StringNode (location: (136,13)-(136,16)) - │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── content_loc: (136,13)-(136,16) = "foo" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "foo" - │ │ │ └── @ EmbeddedStatementsNode (location: (136,16)-(136,25)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (136,16)-(136,18) = "\#{" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (136,18)-(136,24)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (136,18)-(136,24)) - │ │ │ │ ├── flags: ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :b - │ │ │ │ ├── message_loc: (136,18)-(136,19) = "b" - │ │ │ │ ├── opening_loc: (136,19)-(136,20) = "(" - │ │ │ │ ├── arguments: - │ │ │ │ │ @ ArgumentsNode (location: (136,20)-(136,23)) - │ │ │ │ │ ├── flags: contains_forwarding - │ │ │ │ │ └── arguments: (length: 1) - │ │ │ │ │ └── @ ForwardingArgumentsNode (location: (136,20)-(136,23)) - │ │ │ │ │ └── flags: ∅ - │ │ │ │ ├── closing_loc: (136,23)-(136,24) = ")" - │ │ │ │ └── block: ∅ - │ │ │ └── closing_loc: (136,24)-(136,25) = "}" - │ │ └── closing_loc: (136,25)-(136,26) = "\"" - │ ├── locals: [] - │ ├── def_keyword_loc: (136,0)-(136,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (136,5)-(136,6) = "(" - │ ├── rparen_loc: (136,9)-(136,10) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (136,28)-(136,31) = "end" - ├── @ DefNode (location: (138,0)-(140,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (138,4)-(138,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (139,2)-(139,30)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (139,2)-(139,30)) - │ │ ├── flags: newline - │ │ ├── receiver: - │ │ │ @ HashNode (location: (139,2)-(139,4)) - │ │ │ ├── flags: static_literal - │ │ │ ├── opening_loc: (139,2)-(139,3) = "{" - │ │ │ ├── elements: (length: 0) - │ │ │ └── closing_loc: (139,3)-(139,4) = "}" - │ │ ├── call_operator_loc: (139,4)-(139,5) = "." - │ │ ├── name: :merge - │ │ ├── message_loc: (139,5)-(139,10) = "merge" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (139,11)-(139,30)) - │ │ │ ├── flags: contains_keywords, contains_keyword_splat - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ KeywordHashNode (location: (139,11)-(139,30)) - │ │ │ ├── flags: ∅ - │ │ │ └── elements: (length: 3) - │ │ │ ├── @ AssocSplatNode (location: (139,11)-(139,16)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── value: - │ │ │ │ │ @ CallNode (location: (139,13)-(139,16)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :bar - │ │ │ │ │ ├── message_loc: (139,13)-(139,16) = "bar" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ └── operator_loc: (139,11)-(139,13) = "**" - │ │ │ ├── @ AssocSplatNode (location: (139,18)-(139,23)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── value: - │ │ │ │ │ @ CallNode (location: (139,20)-(139,23)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :baz - │ │ │ │ │ ├── message_loc: (139,20)-(139,23) = "baz" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ └── operator_loc: (139,18)-(139,20) = "**" - │ │ │ └── @ AssocSplatNode (location: (139,25)-(139,30)) - │ │ │ ├── flags: ∅ - │ │ │ ├── value: - │ │ │ │ @ CallNode (location: (139,27)-(139,30)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :qux - │ │ │ │ ├── message_loc: (139,27)-(139,30) = "qux" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── operator_loc: (139,25)-(139,27) = "**" - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (138,0)-(138,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (140,0)-(140,3) = "end" - ├── @ DefNode (location: (142,0)-(143,3)) - │ ├── flags: newline - │ ├── name: :bar - │ ├── name_loc: (142,4)-(142,7) = "bar" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (142,8)-(142,19)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 1) - │ │ │ └── @ OptionalKeywordParameterNode (location: (142,8)-(142,19)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :a - │ │ │ ├── name_loc: (142,8)-(142,10) = "a:" - │ │ │ └── value: - │ │ │ @ ParenthesesNode (location: (142,11)-(142,19)) - │ │ │ ├── flags: ∅ - │ │ │ ├── body: - │ │ │ │ @ StatementsNode (location: (142,12)-(142,18)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ RangeNode (location: (142,12)-(142,18)) - │ │ │ │ ├── flags: newline, static_literal, exclude_end - │ │ │ │ ├── left: - │ │ │ │ │ @ IntegerNode (location: (142,12)-(142,13)) - │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ └── value: 1 - │ │ │ │ ├── right: - │ │ │ │ │ @ IntegerNode (location: (142,16)-(142,18)) - │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ └── value: 10 - │ │ │ │ └── operator_loc: (142,13)-(142,16) = "..." - │ │ │ ├── opening_loc: (142,11)-(142,12) = "(" - │ │ │ └── closing_loc: (142,18)-(142,19) = ")" - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:a] - │ ├── def_keyword_loc: (142,0)-(142,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (142,7)-(142,8) = "(" - │ ├── rparen_loc: (142,19)-(142,20) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (143,0)-(143,3) = "end" - ├── @ DefNode (location: (145,0)-(146,3)) - │ ├── flags: newline - │ ├── name: :bar - │ ├── name_loc: (145,4)-(145,7) = "bar" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (145,8)-(145,18)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 1) - │ │ │ └── @ OptionalKeywordParameterNode (location: (145,8)-(145,18)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :a - │ │ │ ├── name_loc: (145,8)-(145,10) = "a:" - │ │ │ └── value: - │ │ │ @ ParenthesesNode (location: (145,11)-(145,18)) - │ │ │ ├── flags: ∅ - │ │ │ ├── body: - │ │ │ │ @ StatementsNode (location: (145,12)-(145,17)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ RangeNode (location: (145,12)-(145,17)) - │ │ │ │ ├── flags: newline, static_literal, exclude_end - │ │ │ │ ├── left: ∅ - │ │ │ │ ├── right: - │ │ │ │ │ @ IntegerNode (location: (145,15)-(145,17)) - │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ └── value: 10 - │ │ │ │ └── operator_loc: (145,12)-(145,15) = "..." - │ │ │ ├── opening_loc: (145,11)-(145,12) = "(" - │ │ │ └── closing_loc: (145,17)-(145,18) = ")" - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:a] - │ ├── def_keyword_loc: (145,0)-(145,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (145,7)-(145,8) = "(" - │ ├── rparen_loc: (145,18)-(145,19) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (146,0)-(146,3) = "end" - ├── @ DefNode (location: (148,0)-(149,3)) - │ ├── flags: newline - │ ├── name: :bar - │ ├── name_loc: (148,4)-(148,7) = "bar" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (148,8)-(148,17)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 1) - │ │ │ └── @ OptionalKeywordParameterNode (location: (148,8)-(148,17)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :a - │ │ │ ├── name_loc: (148,8)-(148,10) = "a:" - │ │ │ └── value: - │ │ │ @ ParenthesesNode (location: (148,11)-(148,17)) - │ │ │ ├── flags: ∅ - │ │ │ ├── body: - │ │ │ │ @ StatementsNode (location: (148,12)-(148,16)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ RangeNode (location: (148,12)-(148,16)) - │ │ │ │ ├── flags: newline, static_literal, exclude_end - │ │ │ │ ├── left: - │ │ │ │ │ @ IntegerNode (location: (148,12)-(148,13)) - │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ └── value: 1 - │ │ │ │ ├── right: ∅ - │ │ │ │ └── operator_loc: (148,13)-(148,16) = "..." - │ │ │ ├── opening_loc: (148,11)-(148,12) = "(" - │ │ │ └── closing_loc: (148,16)-(148,17) = ")" - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:a] - │ ├── def_keyword_loc: (148,0)-(148,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (148,7)-(148,8) = "(" - │ ├── rparen_loc: (148,17)-(148,18) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (149,0)-(149,3) = "end" - ├── @ DefNode (location: (151,0)-(152,3)) - │ ├── flags: newline - │ ├── name: :bar - │ ├── name_loc: (151,4)-(151,7) = "bar" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (151,8)-(151,20)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 1) - │ │ │ └── @ OptionalParameterNode (location: (151,8)-(151,20)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :a - │ │ │ ├── name_loc: (151,8)-(151,9) = "a" - │ │ │ ├── operator_loc: (151,10)-(151,11) = "=" - │ │ │ └── value: - │ │ │ @ ParenthesesNode (location: (151,12)-(151,20)) - │ │ │ ├── flags: ∅ - │ │ │ ├── body: - │ │ │ │ @ StatementsNode (location: (151,13)-(151,19)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ RangeNode (location: (151,13)-(151,19)) - │ │ │ │ ├── flags: newline, static_literal, exclude_end - │ │ │ │ ├── left: - │ │ │ │ │ @ IntegerNode (location: (151,13)-(151,14)) - │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ └── value: 1 - │ │ │ │ ├── right: - │ │ │ │ │ @ IntegerNode (location: (151,17)-(151,19)) - │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ └── value: 10 - │ │ │ │ └── operator_loc: (151,14)-(151,17) = "..." - │ │ │ ├── opening_loc: (151,12)-(151,13) = "(" - │ │ │ └── closing_loc: (151,19)-(151,20) = ")" - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:a] - │ ├── def_keyword_loc: (151,0)-(151,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (151,7)-(151,8) = "(" - │ ├── rparen_loc: (151,20)-(151,21) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (152,0)-(152,3) = "end" - ├── @ DefNode (location: (154,0)-(155,3)) - │ ├── flags: newline - │ ├── name: :bar - │ ├── name_loc: (154,4)-(154,7) = "bar" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (154,8)-(154,19)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 1) - │ │ │ └── @ OptionalParameterNode (location: (154,8)-(154,19)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :a - │ │ │ ├── name_loc: (154,8)-(154,9) = "a" - │ │ │ ├── operator_loc: (154,10)-(154,11) = "=" - │ │ │ └── value: - │ │ │ @ ParenthesesNode (location: (154,12)-(154,19)) - │ │ │ ├── flags: ∅ - │ │ │ ├── body: - │ │ │ │ @ StatementsNode (location: (154,13)-(154,18)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ RangeNode (location: (154,13)-(154,18)) - │ │ │ │ ├── flags: newline, static_literal, exclude_end - │ │ │ │ ├── left: ∅ - │ │ │ │ ├── right: - │ │ │ │ │ @ IntegerNode (location: (154,16)-(154,18)) - │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ └── value: 10 - │ │ │ │ └── operator_loc: (154,13)-(154,16) = "..." - │ │ │ ├── opening_loc: (154,12)-(154,13) = "(" - │ │ │ └── closing_loc: (154,18)-(154,19) = ")" - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:a] - │ ├── def_keyword_loc: (154,0)-(154,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (154,7)-(154,8) = "(" - │ ├── rparen_loc: (154,19)-(154,20) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (155,0)-(155,3) = "end" - ├── @ DefNode (location: (157,0)-(158,3)) - │ ├── flags: newline - │ ├── name: :bar - │ ├── name_loc: (157,4)-(157,7) = "bar" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (157,8)-(157,18)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 1) - │ │ │ └── @ OptionalParameterNode (location: (157,8)-(157,18)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :a - │ │ │ ├── name_loc: (157,8)-(157,9) = "a" - │ │ │ ├── operator_loc: (157,10)-(157,11) = "=" - │ │ │ └── value: - │ │ │ @ ParenthesesNode (location: (157,12)-(157,18)) - │ │ │ ├── flags: ∅ - │ │ │ ├── body: - │ │ │ │ @ StatementsNode (location: (157,13)-(157,17)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ RangeNode (location: (157,13)-(157,17)) - │ │ │ │ ├── flags: newline, static_literal, exclude_end - │ │ │ │ ├── left: - │ │ │ │ │ @ IntegerNode (location: (157,13)-(157,14)) - │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ └── value: 1 - │ │ │ │ ├── right: ∅ - │ │ │ │ └── operator_loc: (157,14)-(157,17) = "..." - │ │ │ ├── opening_loc: (157,12)-(157,13) = "(" - │ │ │ └── closing_loc: (157,17)-(157,18) = ")" - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:a] - │ ├── def_keyword_loc: (157,0)-(157,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (157,7)-(157,8) = "(" - │ ├── rparen_loc: (157,18)-(157,19) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (158,0)-(158,3) = "end" - ├── @ DefNode (location: (160,0)-(162,3)) - │ ├── flags: newline - │ ├── name: :method - │ ├── name_loc: (160,4)-(160,10) = "method" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (160,11)-(160,12)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (160,11)-(160,12)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :a - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (161,2)-(161,14)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (161,2)-(161,14)) - │ │ ├── flags: newline - │ │ ├── receiver: - │ │ │ @ CallNode (location: (161,2)-(161,6)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :item - │ │ │ ├── message_loc: (161,2)-(161,6) = "item" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :>> - │ │ ├── message_loc: (161,7)-(161,9) = ">>" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (161,10)-(161,14)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ CallNode (location: (161,10)-(161,14)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :a - │ │ │ ├── message_loc: (161,10)-(161,11) = "a" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: - │ │ │ @ BlockNode (location: (161,12)-(161,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── locals: [] - │ │ │ ├── parameters: ∅ - │ │ │ ├── body: ∅ - │ │ │ ├── opening_loc: (161,12)-(161,13) = "{" - │ │ │ └── closing_loc: (161,13)-(161,14) = "}" - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── locals: [:a] - │ ├── def_keyword_loc: (160,0)-(160,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (160,10)-(160,11) = "(" - │ ├── rparen_loc: (160,12)-(160,13) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (162,0)-(162,3) = "end" - ├── @ LocalVariableWriteNode (location: (164,0)-(164,7)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── depth: 0 - │ ├── name_loc: (164,0)-(164,3) = "foo" - │ ├── value: - │ │ @ IntegerNode (location: (164,6)-(164,7)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ └── operator_loc: (164,4)-(164,5) = "=" - ├── @ DefNode (location: (165,0)-(165,16)) - │ ├── flags: newline - │ ├── name: :bar - │ ├── name_loc: (165,8)-(165,11) = "bar" - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (165,4)-(165,7)) - │ │ ├── flags: ∅ - │ │ ├── name: :foo - │ │ └── depth: 0 - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (165,0)-(165,3) = "def" - │ ├── operator_loc: (165,7)-(165,8) = "." - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (165,13)-(165,16) = "end" - ├── @ DefNode (location: (167,0)-(167,18)) - │ ├── flags: newline - │ ├── name: :f - │ ├── name_loc: (167,4)-(167,5) = "f" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (167,6)-(167,7)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: - │ │ │ @ RestParameterNode (location: (167,6)-(167,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: ∅ - │ │ │ ├── name_loc: ∅ - │ │ │ └── operator_loc: (167,6)-(167,7) = "*" - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (167,10)-(167,13)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ ArrayNode (location: (167,10)-(167,13)) - │ │ ├── flags: newline, contains_splat - │ │ ├── elements: (length: 1) - │ │ │ └── @ SplatNode (location: (167,11)-(167,12)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (167,11)-(167,12) = "*" - │ │ │ └── expression: ∅ - │ │ ├── opening_loc: (167,10)-(167,11) = "[" - │ │ └── closing_loc: (167,12)-(167,13) = "]" - │ ├── locals: [] - │ ├── def_keyword_loc: (167,0)-(167,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (167,5)-(167,6) = "(" - │ ├── rparen_loc: (167,7)-(167,8) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (167,15)-(167,18) = "end" - ├── @ DefNode (location: (169,0)-(169,15)) - │ ├── flags: newline - │ ├── name: :f - │ ├── name_loc: (169,4)-(169,5) = "f" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (169,6)-(169,10)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 1) - │ │ │ └── @ OptionalKeywordParameterNode (location: (169,6)-(169,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :x - │ │ │ ├── name_loc: (169,6)-(169,8) = "x:" - │ │ │ └── value: - │ │ │ @ CallNode (location: (169,8)-(169,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── receiver: - │ │ │ │ @ CallNode (location: (169,9)-(169,10)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :a - │ │ │ │ ├── message_loc: (169,9)-(169,10) = "a" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :-@ - │ │ │ ├── message_loc: (169,8)-(169,9) = "-" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:x] - │ ├── def_keyword_loc: (169,0)-(169,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (169,12)-(169,15) = "end" - ├── @ DefNode (location: (171,0)-(171,15)) - │ ├── flags: newline - │ ├── name: :f - │ ├── name_loc: (171,4)-(171,5) = "f" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (171,6)-(171,10)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 1) - │ │ │ └── @ OptionalKeywordParameterNode (location: (171,6)-(171,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :x - │ │ │ ├── name_loc: (171,6)-(171,8) = "x:" - │ │ │ └── value: - │ │ │ @ CallNode (location: (171,8)-(171,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── receiver: - │ │ │ │ @ CallNode (location: (171,9)-(171,10)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :a - │ │ │ │ ├── message_loc: (171,9)-(171,10) = "a" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :+@ - │ │ │ ├── message_loc: (171,8)-(171,9) = "+" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:x] - │ ├── def_keyword_loc: (171,0)-(171,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (171,12)-(171,15) = "end" - ├── @ DefNode (location: (173,0)-(173,15)) - │ ├── flags: newline - │ ├── name: :f - │ ├── name_loc: (173,4)-(173,5) = "f" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (173,6)-(173,10)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 1) - │ │ │ └── @ OptionalKeywordParameterNode (location: (173,6)-(173,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :x - │ │ │ ├── name_loc: (173,6)-(173,8) = "x:" - │ │ │ └── value: - │ │ │ @ CallNode (location: (173,8)-(173,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── receiver: - │ │ │ │ @ CallNode (location: (173,9)-(173,10)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :a - │ │ │ │ ├── message_loc: (173,9)-(173,10) = "a" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :! - │ │ │ ├── message_loc: (173,8)-(173,9) = "!" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:x] - │ ├── def_keyword_loc: (173,0)-(173,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (173,12)-(173,15) = "end" - ├── @ DefNode (location: (175,0)-(175,20)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (175,4)-(175,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (175,8)-(175,15)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 1) - │ │ │ └── @ OptionalKeywordParameterNode (location: (175,8)-(175,15)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :x - │ │ │ ├── name_loc: (175,8)-(175,10) = "x:" - │ │ │ └── value: - │ │ │ @ StringNode (location: (175,10)-(175,15)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (175,10)-(175,12) = "%(" - │ │ │ ├── content_loc: (175,12)-(175,14) = "xx" - │ │ │ ├── closing_loc: (175,14)-(175,15) = ")" - │ │ │ └── unescaped: "xx" - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:x] - │ ├── def_keyword_loc: (175,0)-(175,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (175,17)-(175,20) = "end" - ├── @ DefNode (location: (177,0)-(179,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (177,4)-(177,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (177,8)-(177,11)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: - │ │ │ @ ForwardingParameterNode (location: (177,8)-(177,11)) - │ │ │ └── flags: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (178,2)-(178,10)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (178,2)-(178,10)) - │ │ ├── flags: newline, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (178,2)-(178,5) = "bar" - │ │ ├── opening_loc: (178,5)-(178,6) = "(" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (178,6)-(178,9)) - │ │ │ ├── flags: contains_forwarding - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ ForwardingArgumentsNode (location: (178,6)-(178,9)) - │ │ │ └── flags: ∅ - │ │ ├── closing_loc: (178,9)-(178,10) = ")" - │ │ └── block: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (177,0)-(177,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (177,7)-(177,8) = "(" - │ ├── rparen_loc: (177,11)-(177,12) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (179,0)-(179,3) = "end" - ├── @ DefNode (location: (181,0)-(181,42)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (181,4)-(181,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (181,8)-(181,37)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 1) - │ │ │ └── @ OptionalParameterNode (location: (181,8)-(181,37)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── name_loc: (181,8)-(181,11) = "bar" - │ │ │ ├── operator_loc: (181,12)-(181,13) = "=" - │ │ │ └── value: - │ │ │ @ ParenthesesNode (location: (181,14)-(181,37)) - │ │ │ ├── flags: ∅ - │ │ │ ├── body: - │ │ │ │ @ StatementsNode (location: (181,15)-(181,36)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 2) - │ │ │ │ ├── @ DefNode (location: (181,15)-(181,33)) - │ │ │ │ │ ├── flags: newline - │ │ │ │ │ ├── name: :baz - │ │ │ │ │ ├── name_loc: (181,19)-(181,22) = "baz" - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── parameters: - │ │ │ │ │ │ @ ParametersNode (location: (181,23)-(181,26)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ ├── requireds: (length: 1) - │ │ │ │ │ │ │ └── @ RequiredParameterNode (location: (181,23)-(181,26)) - │ │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ │ └── name: :bar - │ │ │ │ │ │ ├── optionals: (length: 0) - │ │ │ │ │ │ ├── rest: ∅ - │ │ │ │ │ │ ├── posts: (length: 0) - │ │ │ │ │ │ ├── keywords: (length: 0) - │ │ │ │ │ │ ├── keyword_rest: ∅ - │ │ │ │ │ │ └── block: ∅ - │ │ │ │ │ ├── body: - │ │ │ │ │ │ @ StatementsNode (location: (181,30)-(181,33)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ └── body: (length: 1) - │ │ │ │ │ │ └── @ LocalVariableReadNode (location: (181,30)-(181,33)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ ├── name: :bar - │ │ │ │ │ │ └── depth: 0 - │ │ │ │ │ ├── locals: [:bar] - │ │ │ │ │ ├── def_keyword_loc: (181,15)-(181,18) = "def" - │ │ │ │ │ ├── operator_loc: ∅ - │ │ │ │ │ ├── lparen_loc: (181,22)-(181,23) = "(" - │ │ │ │ │ ├── rparen_loc: (181,26)-(181,27) = ")" - │ │ │ │ │ ├── equal_loc: (181,28)-(181,29) = "=" - │ │ │ │ │ └── end_keyword_loc: ∅ - │ │ │ │ └── @ IntegerNode (location: (181,35)-(181,36)) - │ │ │ │ ├── flags: newline, static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ ├── opening_loc: (181,14)-(181,15) = "(" - │ │ │ └── closing_loc: (181,36)-(181,37) = ")" - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (181,41)-(181,42)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ IntegerNode (location: (181,41)-(181,42)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── locals: [:bar] - │ ├── def_keyword_loc: (181,0)-(181,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (181,7)-(181,8) = "(" - │ ├── rparen_loc: (181,37)-(181,38) = ")" - │ ├── equal_loc: (181,39)-(181,40) = "=" - │ └── end_keyword_loc: ∅ - └── @ DefNode (location: (183,0)-(183,37)) - ├── flags: newline - ├── name: :foo - ├── name_loc: (183,21)-(183,24) = "foo" - ├── receiver: - │ @ ParenthesesNode (location: (183,4)-(183,20)) - │ ├── flags: ∅ - │ ├── body: - │ │ @ ClassNode (location: (183,5)-(183,19)) - │ │ ├── flags: ∅ - │ │ ├── locals: [] - │ │ ├── class_keyword_loc: (183,5)-(183,10) = "class" - │ │ ├── constant_path: - │ │ │ @ ConstantReadNode (location: (183,11)-(183,14)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :Foo - │ │ ├── inheritance_operator_loc: ∅ - │ │ ├── superclass: ∅ - │ │ ├── body: ∅ - │ │ ├── end_keyword_loc: (183,16)-(183,19) = "end" - │ │ └── name: :Foo - │ ├── opening_loc: (183,4)-(183,5) = "(" - │ └── closing_loc: (183,19)-(183,20) = ")" - ├── parameters: - │ @ ParametersNode (location: (183,25)-(183,32)) - │ ├── flags: ∅ - │ ├── requireds: (length: 0) - │ ├── optionals: (length: 1) - │ │ └── @ OptionalParameterNode (location: (183,25)-(183,32)) - │ │ ├── flags: ∅ - │ │ ├── name: :bar - │ │ ├── name_loc: (183,25)-(183,28) = "bar" - │ │ ├── operator_loc: (183,29)-(183,30) = "=" - │ │ └── value: - │ │ @ IntegerNode (location: (183,31)-(183,32)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── rest: ∅ - │ ├── posts: (length: 0) - │ ├── keywords: (length: 0) - │ ├── keyword_rest: ∅ - │ └── block: ∅ - ├── body: - │ @ StatementsNode (location: (183,36)-(183,37)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ IntegerNode (location: (183,36)-(183,37)) - │ ├── flags: static_literal, decimal - │ └── value: 2 - ├── locals: [:bar] - ├── def_keyword_loc: (183,0)-(183,3) = "def" - ├── operator_loc: (183,20)-(183,21) = "." - ├── lparen_loc: (183,24)-(183,25) = "(" - ├── rparen_loc: (183,32)-(183,33) = ")" - ├── equal_loc: (183,34)-(183,35) = "=" - └── end_keyword_loc: ∅ diff --git a/test/prism/snapshots/modules.txt b/test/prism/snapshots/modules.txt deleted file mode 100644 index 5e001229014f1f..00000000000000 --- a/test/prism/snapshots/modules.txt +++ /dev/null @@ -1,204 +0,0 @@ -@ ProgramNode (location: (1,0)-(18,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(18,3)) - ├── flags: ∅ - └── body: (length: 7) - ├── @ ModuleNode (location: (1,0)-(1,18)) - │ ├── flags: newline - │ ├── locals: [:a] - │ ├── module_keyword_loc: (1,0)-(1,6) = "module" - │ ├── constant_path: - │ │ @ ConstantReadNode (location: (1,7)-(1,8)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── body: - │ │ @ StatementsNode (location: (1,9)-(1,14)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ LocalVariableWriteNode (location: (1,9)-(1,14)) - │ │ ├── flags: newline - │ │ ├── name: :a - │ │ ├── depth: 0 - │ │ ├── name_loc: (1,9)-(1,10) = "a" - │ │ ├── value: - │ │ │ @ IntegerNode (location: (1,13)-(1,14)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── operator_loc: (1,11)-(1,12) = "=" - │ ├── end_keyword_loc: (1,15)-(1,18) = "end" - │ └── name: :A - ├── @ InterpolatedStringNode (location: (3,0)-(3,18)) - │ ├── flags: newline - │ ├── opening_loc: (3,0)-(3,3) = "%Q{" - │ ├── parts: (length: 3) - │ │ ├── @ StringNode (location: (3,3)-(3,7)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (3,3)-(3,7) = "aaa " - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "aaa " - │ │ ├── @ EmbeddedStatementsNode (location: (3,7)-(3,13)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (3,7)-(3,9) = "\#{" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (3,9)-(3,12)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (3,9)-(3,12)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :bbb - │ │ │ │ ├── message_loc: (3,9)-(3,12) = "bbb" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── closing_loc: (3,12)-(3,13) = "}" - │ │ └── @ StringNode (location: (3,13)-(3,17)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (3,13)-(3,17) = " ccc" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: " ccc" - │ └── closing_loc: (3,17)-(3,18) = "}" - ├── @ ModuleNode (location: (5,0)-(6,3)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── module_keyword_loc: (5,0)-(5,6) = "module" - │ ├── constant_path: - │ │ @ ConstantPathNode (location: (5,7)-(5,11)) - │ │ ├── flags: ∅ - │ │ ├── parent: - │ │ │ @ CallNode (location: (5,7)-(5,8)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :m - │ │ │ ├── message_loc: (5,7)-(5,8) = "m" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── name: :M - │ │ ├── delimiter_loc: (5,8)-(5,10) = "::" - │ │ └── name_loc: (5,10)-(5,11) = "M" - │ ├── body: ∅ - │ ├── end_keyword_loc: (6,0)-(6,3) = "end" - │ └── name: :M - ├── @ ModuleNode (location: (8,0)-(9,19)) - │ ├── flags: newline - │ ├── locals: [:x] - │ ├── module_keyword_loc: (8,0)-(8,6) = "module" - │ ├── constant_path: - │ │ @ ConstantReadNode (location: (8,7)-(8,8)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── body: - │ │ @ BeginNode (location: (8,0)-(9,19)) - │ │ ├── flags: ∅ - │ │ ├── begin_keyword_loc: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (9,1)-(9,6)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ LocalVariableWriteNode (location: (9,1)-(9,6)) - │ │ │ ├── flags: newline - │ │ │ ├── name: :x - │ │ │ ├── depth: 0 - │ │ │ ├── name_loc: (9,1)-(9,2) = "x" - │ │ │ ├── value: - │ │ │ │ @ IntegerNode (location: (9,5)-(9,6)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ └── operator_loc: (9,3)-(9,4) = "=" - │ │ ├── rescue_clause: - │ │ │ @ RescueNode (location: (9,8)-(9,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── keyword_loc: (9,8)-(9,14) = "rescue" - │ │ │ ├── exceptions: (length: 0) - │ │ │ ├── operator_loc: ∅ - │ │ │ ├── reference: ∅ - │ │ │ ├── statements: ∅ - │ │ │ └── subsequent: ∅ - │ │ ├── else_clause: ∅ - │ │ ├── ensure_clause: ∅ - │ │ └── end_keyword_loc: (9,16)-(9,19) = "end" - │ ├── end_keyword_loc: (9,16)-(9,19) = "end" - │ └── name: :A - ├── @ ModuleNode (location: (11,0)-(12,3)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── module_keyword_loc: (11,0)-(11,6) = "module" - │ ├── constant_path: - │ │ @ ConstantPathNode (location: (11,7)-(11,10)) - │ │ ├── flags: ∅ - │ │ ├── parent: ∅ - │ │ ├── name: :A - │ │ ├── delimiter_loc: (11,7)-(11,9) = "::" - │ │ └── name_loc: (11,9)-(11,10) = "A" - │ ├── body: ∅ - │ ├── end_keyword_loc: (12,0)-(12,3) = "end" - │ └── name: :A - ├── @ ModuleNode (location: (14,0)-(15,3)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── module_keyword_loc: (14,0)-(14,6) = "module" - │ ├── constant_path: - │ │ @ ConstantPathNode (location: (14,7)-(14,13)) - │ │ ├── flags: ∅ - │ │ ├── parent: - │ │ │ @ CallNode (location: (14,7)-(14,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── receiver: - │ │ │ │ @ ConstantReadNode (location: (14,7)-(14,8)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :A - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :[] - │ │ │ ├── message_loc: (14,8)-(14,10) = "[]" - │ │ │ ├── opening_loc: (14,8)-(14,9) = "[" - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: (14,9)-(14,10) = "]" - │ │ │ └── block: ∅ - │ │ ├── name: :B - │ │ ├── delimiter_loc: (14,10)-(14,12) = "::" - │ │ └── name_loc: (14,12)-(14,13) = "B" - │ ├── body: ∅ - │ ├── end_keyword_loc: (15,0)-(15,3) = "end" - │ └── name: :B - └── @ ModuleNode (location: (17,0)-(18,3)) - ├── flags: newline - ├── locals: [] - ├── module_keyword_loc: (17,0)-(17,6) = "module" - ├── constant_path: - │ @ ConstantPathNode (location: (17,7)-(17,14)) - │ ├── flags: ∅ - │ ├── parent: - │ │ @ CallNode (location: (17,7)-(17,11)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ ConstantReadNode (location: (17,7)-(17,8)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :A - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :[] - │ │ ├── message_loc: (17,8)-(17,11) = "[1]" - │ │ ├── opening_loc: (17,8)-(17,9) = "[" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (17,9)-(17,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (17,9)-(17,10)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── closing_loc: (17,10)-(17,11) = "]" - │ │ └── block: ∅ - │ ├── name: :B - │ ├── delimiter_loc: (17,11)-(17,13) = "::" - │ └── name_loc: (17,13)-(17,14) = "B" - ├── body: ∅ - ├── end_keyword_loc: (18,0)-(18,3) = "end" - └── name: :B diff --git a/test/prism/snapshots/multi_write.txt b/test/prism/snapshots/multi_write.txt deleted file mode 100644 index fa36f50423f762..00000000000000 --- a/test/prism/snapshots/multi_write.txt +++ /dev/null @@ -1,111 +0,0 @@ -@ ProgramNode (location: (1,0)-(4,26)) -├── flags: ∅ -├── locals: [:foo, :bar] -└── statements: - @ StatementsNode (location: (1,0)-(4,26)) - ├── flags: ∅ - └── body: (length: 4) - ├── @ LocalVariableWriteNode (location: (1,0)-(1,18)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── depth: 0 - │ ├── name_loc: (1,0)-(1,3) = "foo" - │ ├── value: - │ │ @ RescueModifierNode (location: (1,6)-(1,18)) - │ │ ├── flags: ∅ - │ │ ├── expression: - │ │ │ @ IntegerNode (location: (1,6)-(1,7)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── keyword_loc: (1,8)-(1,14) = "rescue" - │ │ └── rescue_expression: - │ │ @ NilNode (location: (1,15)-(1,18)) - │ │ └── flags: static_literal - │ └── operator_loc: (1,4)-(1,5) = "=" - ├── @ MultiWriteNode (location: (2,0)-(2,23)) - │ ├── flags: newline - │ ├── lefts: (length: 2) - │ │ ├── @ LocalVariableTargetNode (location: (2,0)-(2,3)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :foo - │ │ │ └── depth: 0 - │ │ └── @ LocalVariableTargetNode (location: (2,5)-(2,8)) - │ │ ├── flags: ∅ - │ │ ├── name: :bar - │ │ └── depth: 0 - │ ├── rest: ∅ - │ ├── rights: (length: 0) - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── operator_loc: (2,9)-(2,10) = "=" - │ └── value: - │ @ RescueModifierNode (location: (2,11)-(2,23)) - │ ├── flags: ∅ - │ ├── expression: - │ │ @ IntegerNode (location: (2,11)-(2,12)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── keyword_loc: (2,13)-(2,19) = "rescue" - │ └── rescue_expression: - │ @ NilNode (location: (2,20)-(2,23)) - │ └── flags: static_literal - ├── @ RescueModifierNode (location: (3,0)-(3,21)) - │ ├── flags: newline - │ ├── expression: - │ │ @ LocalVariableWriteNode (location: (3,0)-(3,10)) - │ │ ├── flags: ∅ - │ │ ├── name: :foo - │ │ ├── depth: 0 - │ │ ├── name_loc: (3,0)-(3,3) = "foo" - │ │ ├── value: - │ │ │ @ ArrayNode (location: (3,6)-(3,10)) - │ │ │ ├── flags: static_literal - │ │ │ ├── elements: (length: 2) - │ │ │ │ ├── @ IntegerNode (location: (3,6)-(3,7)) - │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ └── value: 1 - │ │ │ │ └── @ IntegerNode (location: (3,9)-(3,10)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 2 - │ │ │ ├── opening_loc: ∅ - │ │ │ └── closing_loc: ∅ - │ │ └── operator_loc: (3,4)-(3,5) = "=" - │ ├── keyword_loc: (3,11)-(3,17) = "rescue" - │ └── rescue_expression: - │ @ NilNode (location: (3,18)-(3,21)) - │ └── flags: static_literal - └── @ MultiWriteNode (location: (4,0)-(4,26)) - ├── flags: newline - ├── lefts: (length: 2) - │ ├── @ LocalVariableTargetNode (location: (4,0)-(4,3)) - │ │ ├── flags: ∅ - │ │ ├── name: :foo - │ │ └── depth: 0 - │ └── @ LocalVariableTargetNode (location: (4,5)-(4,8)) - │ ├── flags: ∅ - │ ├── name: :bar - │ └── depth: 0 - ├── rest: ∅ - ├── rights: (length: 0) - ├── lparen_loc: ∅ - ├── rparen_loc: ∅ - ├── operator_loc: (4,9)-(4,10) = "=" - └── value: - @ RescueModifierNode (location: (4,11)-(4,26)) - ├── flags: ∅ - ├── expression: - │ @ ArrayNode (location: (4,11)-(4,15)) - │ ├── flags: static_literal - │ ├── elements: (length: 2) - │ │ ├── @ IntegerNode (location: (4,11)-(4,12)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── @ IntegerNode (location: (4,14)-(4,15)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── opening_loc: ∅ - │ └── closing_loc: ∅ - ├── keyword_loc: (4,16)-(4,22) = "rescue" - └── rescue_expression: - @ NilNode (location: (4,23)-(4,26)) - └── flags: static_literal diff --git a/test/prism/snapshots/newline_terminated.txt b/test/prism/snapshots/newline_terminated.txt deleted file mode 100644 index 85e996fa5a2377..00000000000000 --- a/test/prism/snapshots/newline_terminated.txt +++ /dev/null @@ -1,109 +0,0 @@ -@ ProgramNode (location: (3,0)-(41,0)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (3,0)-(41,0)) - ├── flags: ∅ - └── body: (length: 17) - ├── @ StringNode (location: (3,0)-(3,6)) - │ ├── flags: newline - │ ├── opening_loc: (3,0)-(3,2) = "% " - │ ├── content_loc: (3,2)-(3,5) = "abc" - │ ├── closing_loc: (3,5)-(3,6) = " " - │ └── unescaped: "abc" - ├── @ StringNode (location: (4,0)-(4,6)) - │ ├── flags: newline - │ ├── opening_loc: (4,0)-(4,2) = "%\t" - │ ├── content_loc: (4,2)-(4,5) = "abc" - │ ├── closing_loc: (4,5)-(4,6) = "\t" - │ └── unescaped: "abc" - ├── @ StringNode (location: (5,0)-(5,6)) - │ ├── flags: newline - │ ├── opening_loc: (5,0)-(5,2) = "%\v" - │ ├── content_loc: (5,2)-(5,5) = "abc" - │ ├── closing_loc: (5,5)-(5,6) = "\v" - │ └── unescaped: "abc" - ├── @ StringNode (location: (6,0)-(6,6)) - │ ├── flags: newline - │ ├── opening_loc: (6,0)-(6,2) = "%\r" - │ ├── content_loc: (6,2)-(6,5) = "abc" - │ ├── closing_loc: (6,5)-(6,6) = "\r" - │ └── unescaped: "abc" - ├── @ StringNode (location: (7,0)-(9,0)) - │ ├── flags: newline - │ ├── opening_loc: (7,0)-(8,0) = "%\n" - │ ├── content_loc: (8,0)-(8,3) = "abc" - │ ├── closing_loc: (8,3)-(9,0) = "\n" - │ └── unescaped: "abc" - ├── @ StringNode (location: (10,0)-(10,6)) - │ ├── flags: newline - │ ├── opening_loc: (10,0)-(10,2) = "%\u0000" - │ ├── content_loc: (10,2)-(10,5) = "abc" - │ ├── closing_loc: (10,5)-(10,6) = "\u0000" - │ └── unescaped: "abc" - ├── @ StringNode (location: (11,0)-(13,0)) - │ ├── flags: newline - │ ├── opening_loc: (11,0)-(12,0) = "%\n" - │ ├── content_loc: (12,0)-(12,3) = "abc" - │ ├── closing_loc: (12,3)-(13,0) = "\n" - │ └── unescaped: "abc" - ├── @ StringNode (location: (14,0)-(16,0)) - │ ├── flags: newline - │ ├── opening_loc: (14,0)-(15,0) = "%\n" - │ ├── content_loc: (15,0)-(15,4) = "\rabc" - │ ├── closing_loc: (15,4)-(16,0) = "\n" - │ └── unescaped: "\rabc" - ├── @ StringNode (location: (17,0)-(19,0)) - │ ├── flags: newline - │ ├── opening_loc: (17,0)-(18,0) = "%\n" - │ ├── content_loc: (18,0)-(18,4) = "\rabc" - │ ├── closing_loc: (18,4)-(19,0) = "\n" - │ └── unescaped: "\rabc" - ├── @ StringNode (location: (20,0)-(22,0)) - │ ├── flags: newline - │ ├── opening_loc: (20,0)-(21,0) = "%\n" - │ ├── content_loc: (21,0)-(21,3) = "abc" - │ ├── closing_loc: (21,3)-(22,0) = "\n" - │ └── unescaped: "abc" - ├── @ StringNode (location: (23,0)-(23,6)) - │ ├── flags: newline - │ ├── opening_loc: (23,0)-(23,2) = "%\r" - │ ├── content_loc: (23,2)-(23,5) = "abc" - │ ├── closing_loc: (23,5)-(23,6) = "\r" - │ └── unescaped: "abc" - ├── @ StringNode (location: (24,0)-(26,0)) - │ ├── flags: newline - │ ├── opening_loc: (24,0)-(25,0) = "%\n" - │ ├── content_loc: (25,0)-(25,3) = "abc" - │ ├── closing_loc: (25,3)-(26,0) = "\n" - │ └── unescaped: "abc" - ├── @ StringNode (location: (27,0)-(29,0)) - │ ├── flags: newline - │ ├── opening_loc: (27,0)-(28,0) = "%\n" - │ ├── content_loc: (28,0)-(28,3) = "abc" - │ ├── closing_loc: (28,3)-(29,0) = "\n" - │ └── unescaped: "abc" - ├── @ StringNode (location: (30,0)-(32,0)) - │ ├── flags: newline - │ ├── opening_loc: (30,0)-(31,0) = "%\n" - │ ├── content_loc: (31,0)-(31,3) = "foo" - │ ├── closing_loc: (31,3)-(32,0) = "\n" - │ └── unescaped: "foo" - ├── @ StringNode (location: (33,0)-(35,0)) - │ ├── flags: newline - │ ├── opening_loc: (33,0)-(34,0) = "%q\n" - │ ├── content_loc: (34,0)-(34,3) = "foo" - │ ├── closing_loc: (34,3)-(35,0) = "\n" - │ └── unescaped: "foo" - ├── @ StringNode (location: (36,0)-(38,0)) - │ ├── flags: newline - │ ├── opening_loc: (36,0)-(37,0) = "%Q\n" - │ ├── content_loc: (37,0)-(37,3) = "foo" - │ ├── closing_loc: (37,3)-(38,0) = "\n" - │ └── unescaped: "foo" - └── @ RegularExpressionNode (location: (39,0)-(41,0)) - ├── flags: newline, static_literal, forced_us_ascii_encoding - ├── opening_loc: (39,0)-(40,0) = "%r\n" - ├── content_loc: (40,0)-(40,3) = "foo" - ├── closing_loc: (40,3)-(41,0) = "\n" - └── unescaped: "foo" diff --git a/test/prism/snapshots/next.txt b/test/prism/snapshots/next.txt deleted file mode 100644 index 5b0becea1c81dd..00000000000000 --- a/test/prism/snapshots/next.txt +++ /dev/null @@ -1,372 +0,0 @@ -@ ProgramNode (location: (1,0)-(24,15)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(24,15)) - ├── flags: ∅ - └── body: (length: 10) - ├── @ CallNode (location: (1,0)-(1,12)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :tap - │ ├── message_loc: (1,0)-(1,3) = "tap" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (1,4)-(1,12)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (1,6)-(1,10)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ NextNode (location: (1,6)-(1,10)) - │ │ ├── flags: newline - │ │ ├── arguments: ∅ - │ │ └── keyword_loc: (1,6)-(1,10) = "next" - │ ├── opening_loc: (1,4)-(1,5) = "{" - │ └── closing_loc: (1,11)-(1,12) = "}" - ├── @ CallNode (location: (3,0)-(3,26)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :tap - │ ├── message_loc: (3,0)-(3,3) = "tap" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (3,4)-(3,26)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (3,6)-(3,24)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ NextNode (location: (3,6)-(3,24)) - │ │ ├── flags: newline - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (3,11)-(3,24)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 3) - │ │ │ ├── @ ParenthesesNode (location: (3,11)-(3,14)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── body: - │ │ │ │ │ @ StatementsNode (location: (3,12)-(3,13)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── body: (length: 1) - │ │ │ │ │ └── @ IntegerNode (location: (3,12)-(3,13)) - │ │ │ │ │ ├── flags: newline, static_literal, decimal - │ │ │ │ │ └── value: 1 - │ │ │ │ ├── opening_loc: (3,11)-(3,12) = "(" - │ │ │ │ └── closing_loc: (3,13)-(3,14) = ")" - │ │ │ ├── @ ParenthesesNode (location: (3,16)-(3,19)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── body: - │ │ │ │ │ @ StatementsNode (location: (3,17)-(3,18)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── body: (length: 1) - │ │ │ │ │ └── @ IntegerNode (location: (3,17)-(3,18)) - │ │ │ │ │ ├── flags: newline, static_literal, decimal - │ │ │ │ │ └── value: 2 - │ │ │ │ ├── opening_loc: (3,16)-(3,17) = "(" - │ │ │ │ └── closing_loc: (3,18)-(3,19) = ")" - │ │ │ └── @ ParenthesesNode (location: (3,21)-(3,24)) - │ │ │ ├── flags: ∅ - │ │ │ ├── body: - │ │ │ │ @ StatementsNode (location: (3,22)-(3,23)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ IntegerNode (location: (3,22)-(3,23)) - │ │ │ │ ├── flags: newline, static_literal, decimal - │ │ │ │ └── value: 3 - │ │ │ ├── opening_loc: (3,21)-(3,22) = "(" - │ │ │ └── closing_loc: (3,23)-(3,24) = ")" - │ │ └── keyword_loc: (3,6)-(3,10) = "next" - │ ├── opening_loc: (3,4)-(3,5) = "{" - │ └── closing_loc: (3,25)-(3,26) = "}" - ├── @ CallNode (location: (5,0)-(5,14)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :tap - │ ├── message_loc: (5,0)-(5,3) = "tap" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (5,4)-(5,14)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (5,6)-(5,12)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ NextNode (location: (5,6)-(5,12)) - │ │ ├── flags: newline - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (5,11)-(5,12)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (5,11)-(5,12)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── keyword_loc: (5,6)-(5,10) = "next" - │ ├── opening_loc: (5,4)-(5,5) = "{" - │ └── closing_loc: (5,13)-(5,14) = "}" - ├── @ CallNode (location: (7,0)-(8,3)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :tap - │ ├── message_loc: (7,0)-(7,3) = "tap" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (7,4)-(8,3)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (7,6)-(8,1)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ NextNode (location: (7,6)-(8,1)) - │ │ ├── flags: newline - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (7,11)-(8,1)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 3) - │ │ │ ├── @ IntegerNode (location: (7,11)-(7,12)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ ├── @ IntegerNode (location: (7,14)-(7,15)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 2 - │ │ │ └── @ IntegerNode (location: (8,0)-(8,1)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 3 - │ │ └── keyword_loc: (7,6)-(7,10) = "next" - │ ├── opening_loc: (7,4)-(7,5) = "{" - │ └── closing_loc: (8,2)-(8,3) = "}" - ├── @ CallNode (location: (10,0)-(10,20)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :tap - │ ├── message_loc: (10,0)-(10,3) = "tap" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (10,4)-(10,20)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (10,6)-(10,18)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ NextNode (location: (10,6)-(10,18)) - │ │ ├── flags: newline - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (10,11)-(10,18)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 3) - │ │ │ ├── @ IntegerNode (location: (10,11)-(10,12)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ ├── @ IntegerNode (location: (10,14)-(10,15)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 2 - │ │ │ └── @ IntegerNode (location: (10,17)-(10,18)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 3 - │ │ └── keyword_loc: (10,6)-(10,10) = "next" - │ ├── opening_loc: (10,4)-(10,5) = "{" - │ └── closing_loc: (10,19)-(10,20) = "}" - ├── @ CallNode (location: (12,0)-(12,22)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :tap - │ ├── message_loc: (12,0)-(12,3) = "tap" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (12,4)-(12,22)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (12,6)-(12,20)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ NextNode (location: (12,6)-(12,20)) - │ │ ├── flags: newline - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (12,11)-(12,20)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ ArrayNode (location: (12,11)-(12,20)) - │ │ │ ├── flags: static_literal - │ │ │ ├── elements: (length: 3) - │ │ │ │ ├── @ IntegerNode (location: (12,12)-(12,13)) - │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ └── value: 1 - │ │ │ │ ├── @ IntegerNode (location: (12,15)-(12,16)) - │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ └── value: 2 - │ │ │ │ └── @ IntegerNode (location: (12,18)-(12,19)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 3 - │ │ │ ├── opening_loc: (12,11)-(12,12) = "[" - │ │ │ └── closing_loc: (12,19)-(12,20) = "]" - │ │ └── keyword_loc: (12,6)-(12,10) = "next" - │ ├── opening_loc: (12,4)-(12,5) = "{" - │ └── closing_loc: (12,21)-(12,22) = "}" - ├── @ CallNode (location: (14,0)-(17,3)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :tap - │ ├── message_loc: (14,0)-(14,3) = "tap" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (14,4)-(17,3)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (14,6)-(17,1)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ NextNode (location: (14,6)-(17,1)) - │ │ ├── flags: newline - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (14,10)-(17,1)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ ParenthesesNode (location: (14,10)-(17,1)) - │ │ │ ├── flags: ∅ - │ │ │ ├── body: - │ │ │ │ @ StatementsNode (location: (15,2)-(16,3)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 2) - │ │ │ │ ├── @ IntegerNode (location: (15,2)-(15,3)) - │ │ │ │ │ ├── flags: newline, static_literal, decimal - │ │ │ │ │ └── value: 1 - │ │ │ │ └── @ IntegerNode (location: (16,2)-(16,3)) - │ │ │ │ ├── flags: newline, static_literal, decimal - │ │ │ │ └── value: 2 - │ │ │ ├── opening_loc: (14,10)-(14,11) = "(" - │ │ │ └── closing_loc: (17,0)-(17,1) = ")" - │ │ └── keyword_loc: (14,6)-(14,10) = "next" - │ ├── opening_loc: (14,4)-(14,5) = "{" - │ └── closing_loc: (17,2)-(17,3) = "}" - ├── @ CallNode (location: (19,0)-(20,3)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :tap - │ ├── message_loc: (19,0)-(19,3) = "tap" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (19,4)-(20,3)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (19,6)-(20,1)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 2) - │ │ ├── @ NextNode (location: (19,6)-(19,10)) - │ │ │ ├── flags: newline - │ │ │ ├── arguments: ∅ - │ │ │ └── keyword_loc: (19,6)-(19,10) = "next" - │ │ └── @ IntegerNode (location: (20,0)-(20,1)) - │ │ ├── flags: newline, static_literal, decimal - │ │ └── value: 1 - │ ├── opening_loc: (19,4)-(19,5) = "{" - │ └── closing_loc: (20,2)-(20,3) = "}" - ├── @ CallNode (location: (22,0)-(22,14)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :tap - │ ├── message_loc: (22,0)-(22,3) = "tap" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (22,4)-(22,14)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (22,6)-(22,12)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ NextNode (location: (22,6)-(22,12)) - │ │ ├── flags: newline - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (22,10)-(22,12)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ ParenthesesNode (location: (22,10)-(22,12)) - │ │ │ ├── flags: ∅ - │ │ │ ├── body: ∅ - │ │ │ ├── opening_loc: (22,10)-(22,11) = "(" - │ │ │ └── closing_loc: (22,11)-(22,12) = ")" - │ │ └── keyword_loc: (22,6)-(22,10) = "next" - │ ├── opening_loc: (22,4)-(22,5) = "{" - │ └── closing_loc: (22,13)-(22,14) = "}" - └── @ CallNode (location: (24,0)-(24,15)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :tap - ├── message_loc: (24,0)-(24,3) = "tap" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (24,4)-(24,15)) - ├── flags: ∅ - ├── locals: [] - ├── parameters: ∅ - ├── body: - │ @ StatementsNode (location: (24,6)-(24,13)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ NextNode (location: (24,6)-(24,13)) - │ ├── flags: newline - │ ├── arguments: - │ │ @ ArgumentsNode (location: (24,10)-(24,13)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ ParenthesesNode (location: (24,10)-(24,13)) - │ │ ├── flags: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (24,11)-(24,12)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ IntegerNode (location: (24,11)-(24,12)) - │ │ │ ├── flags: newline, static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── opening_loc: (24,10)-(24,11) = "(" - │ │ └── closing_loc: (24,12)-(24,13) = ")" - │ └── keyword_loc: (24,6)-(24,10) = "next" - ├── opening_loc: (24,4)-(24,5) = "{" - └── closing_loc: (24,14)-(24,15) = "}" diff --git a/test/prism/snapshots/nils.txt b/test/prism/snapshots/nils.txt deleted file mode 100644 index 275bc373a534c7..00000000000000 --- a/test/prism/snapshots/nils.txt +++ /dev/null @@ -1,43 +0,0 @@ -@ ProgramNode (location: (1,0)-(12,11)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(12,11)) - ├── flags: ∅ - └── body: (length: 5) - ├── @ NilNode (location: (1,0)-(1,3)) - │ └── flags: newline, static_literal - ├── @ ParenthesesNode (location: (3,0)-(3,2)) - │ ├── flags: newline - │ ├── body: ∅ - │ ├── opening_loc: (3,0)-(3,1) = "(" - │ └── closing_loc: (3,1)-(3,2) = ")" - ├── @ ParenthesesNode (location: (5,0)-(8,1)) - │ ├── flags: newline - │ ├── body: ∅ - │ ├── opening_loc: (5,0)-(5,1) = "(" - │ └── closing_loc: (8,0)-(8,1) = ")" - ├── @ PostExecutionNode (location: (10,0)-(10,9)) - │ ├── flags: newline - │ ├── statements: - │ │ @ StatementsNode (location: (10,6)-(10,7)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ IntegerNode (location: (10,6)-(10,7)) - │ │ ├── flags: newline, static_literal, decimal - │ │ └── value: 1 - │ ├── keyword_loc: (10,0)-(10,3) = "END" - │ ├── opening_loc: (10,4)-(10,5) = "{" - │ └── closing_loc: (10,8)-(10,9) = "}" - └── @ PreExecutionNode (location: (12,0)-(12,11)) - ├── flags: newline - ├── statements: - │ @ StatementsNode (location: (12,8)-(12,9)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ IntegerNode (location: (12,8)-(12,9)) - │ ├── flags: newline, static_literal, decimal - │ └── value: 1 - ├── keyword_loc: (12,0)-(12,5) = "BEGIN" - ├── opening_loc: (12,6)-(12,7) = "{" - └── closing_loc: (12,10)-(12,11) = "}" diff --git a/test/prism/snapshots/non_alphanumeric_methods.txt b/test/prism/snapshots/non_alphanumeric_methods.txt deleted file mode 100644 index 2d29d365e467a8..00000000000000 --- a/test/prism/snapshots/non_alphanumeric_methods.txt +++ /dev/null @@ -1,545 +0,0 @@ -@ ProgramNode (location: (1,0)-(105,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(105,3)) - ├── flags: ∅ - └── body: (length: 36) - ├── @ DefNode (location: (1,0)-(2,3)) - │ ├── flags: newline - │ ├── name: :! - │ ├── name_loc: (1,4)-(1,5) = "!" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (1,0)-(1,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (2,0)-(2,3) = "end" - ├── @ DefNode (location: (4,0)-(5,3)) - │ ├── flags: newline - │ ├── name: :!= - │ ├── name_loc: (4,4)-(4,6) = "!=" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (4,0)-(4,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (5,0)-(5,3) = "end" - ├── @ DefNode (location: (7,0)-(8,3)) - │ ├── flags: newline - │ ├── name: :!~ - │ ├── name_loc: (7,4)-(7,6) = "!~" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (7,0)-(7,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (8,0)-(8,3) = "end" - ├── @ DefNode (location: (10,0)-(11,3)) - │ ├── flags: newline - │ ├── name: :% - │ ├── name_loc: (10,4)-(10,5) = "%" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (10,0)-(10,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (11,0)-(11,3) = "end" - ├── @ DefNode (location: (13,0)-(14,3)) - │ ├── flags: newline - │ ├── name: :+ - │ ├── name_loc: (13,9)-(13,10) = "+" - │ ├── receiver: - │ │ @ SelfNode (location: (13,4)-(13,8)) - │ │ └── flags: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (13,0)-(13,3) = "def" - │ ├── operator_loc: (13,8)-(13,9) = "." - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (14,0)-(14,3) = "end" - ├── @ DefNode (location: (16,0)-(17,3)) - │ ├── flags: newline - │ ├── name: :& - │ ├── name_loc: (16,4)-(16,5) = "&" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (16,0)-(16,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (17,0)-(17,3) = "end" - ├── @ DefNode (location: (19,0)-(20,3)) - │ ├── flags: newline - │ ├── name: :* - │ ├── name_loc: (19,4)-(19,5) = "*" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (19,0)-(19,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (20,0)-(20,3) = "end" - ├── @ DefNode (location: (22,0)-(23,3)) - │ ├── flags: newline - │ ├── name: :** - │ ├── name_loc: (22,4)-(22,6) = "**" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (22,0)-(22,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (23,0)-(23,3) = "end" - ├── @ StringNode (location: (25,0)-(25,6)) - │ ├── flags: newline - │ ├── opening_loc: (25,0)-(25,2) = "%|" - │ ├── content_loc: (25,2)-(25,5) = "abc" - │ ├── closing_loc: (25,5)-(25,6) = "|" - │ └── unescaped: "abc" - ├── @ DefNode (location: (27,0)-(28,3)) - │ ├── flags: newline - │ ├── name: :+ - │ ├── name_loc: (27,4)-(27,5) = "+" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (27,6)-(27,9)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: - │ │ │ @ KeywordRestParameterNode (location: (27,6)-(27,9)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :b - │ │ │ ├── name_loc: (27,8)-(27,9) = "b" - │ │ │ └── operator_loc: (27,6)-(27,8) = "**" - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:b] - │ ├── def_keyword_loc: (27,0)-(27,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (28,0)-(28,3) = "end" - ├── @ DefNode (location: (30,0)-(31,3)) - │ ├── flags: newline - │ ├── name: :+ - │ ├── name_loc: (30,4)-(30,5) = "+" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (30,0)-(30,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (30,5)-(30,6) = "(" - │ ├── rparen_loc: (30,6)-(30,7) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (31,0)-(31,3) = "end" - ├── @ DefNode (location: (33,0)-(34,3)) - │ ├── flags: newline - │ ├── name: :+ - │ ├── name_loc: (33,4)-(33,5) = "+" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (33,6)-(33,7)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (33,6)-(33,7)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :b - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:b] - │ ├── def_keyword_loc: (33,0)-(33,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (34,0)-(34,3) = "end" - ├── @ DefNode (location: (36,0)-(37,3)) - │ ├── flags: newline - │ ├── name: :+ - │ ├── name_loc: (36,9)-(36,10) = "+" - │ ├── receiver: - │ │ @ SelfNode (location: (36,4)-(36,8)) - │ │ └── flags: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (36,0)-(36,3) = "def" - │ ├── operator_loc: (36,8)-(36,9) = "." - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (37,0)-(37,3) = "end" - ├── @ DefNode (location: (39,0)-(40,3)) - │ ├── flags: newline - │ ├── name: :+ - │ ├── name_loc: (39,4)-(39,5) = "+" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (39,0)-(39,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (40,0)-(40,3) = "end" - ├── @ DefNode (location: (42,0)-(43,3)) - │ ├── flags: newline - │ ├── name: :+@ - │ ├── name_loc: (42,4)-(42,6) = "+@" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (42,0)-(42,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (43,0)-(43,3) = "end" - ├── @ DefNode (location: (45,0)-(46,3)) - │ ├── flags: newline - │ ├── name: :- - │ ├── name_loc: (45,4)-(45,5) = "-" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (45,0)-(45,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (46,0)-(46,3) = "end" - ├── @ DefNode (location: (48,0)-(48,11)) - │ ├── flags: newline - │ ├── name: :- - │ ├── name_loc: (48,6)-(48,7) = "-" - │ ├── receiver: - │ │ @ CallNode (location: (48,4)-(48,5)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (48,4)-(48,5) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (48,0)-(48,3) = "def" - │ ├── operator_loc: (48,5)-(48,6) = "." - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (48,8)-(48,11) = "end" - ├── @ DefNode (location: (50,0)-(51,3)) - │ ├── flags: newline - │ ├── name: :-@ - │ ├── name_loc: (50,4)-(50,6) = "-@" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (50,0)-(50,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (51,0)-(51,3) = "end" - ├── @ DefNode (location: (53,0)-(54,3)) - │ ├── flags: newline - │ ├── name: :/ - │ ├── name_loc: (53,4)-(53,5) = "/" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (53,0)-(53,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (54,0)-(54,3) = "end" - ├── @ DefNode (location: (56,0)-(57,3)) - │ ├── flags: newline - │ ├── name: :< - │ ├── name_loc: (56,4)-(56,5) = "<" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (56,0)-(56,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (57,0)-(57,3) = "end" - ├── @ DefNode (location: (59,0)-(60,3)) - │ ├── flags: newline - │ ├── name: :<< - │ ├── name_loc: (59,4)-(59,6) = "<<" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (59,0)-(59,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (60,0)-(60,3) = "end" - ├── @ DefNode (location: (62,0)-(63,3)) - │ ├── flags: newline - │ ├── name: :<= - │ ├── name_loc: (62,4)-(62,6) = "<=" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (62,0)-(62,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (63,0)-(63,3) = "end" - ├── @ DefNode (location: (65,0)-(66,3)) - │ ├── flags: newline - │ ├── name: :<=> - │ ├── name_loc: (65,4)-(65,7) = "<=>" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (65,0)-(65,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (66,0)-(66,3) = "end" - ├── @ DefNode (location: (68,0)-(69,3)) - │ ├── flags: newline - │ ├── name: :== - │ ├── name_loc: (68,4)-(68,6) = "==" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (68,0)-(68,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (69,0)-(69,3) = "end" - ├── @ DefNode (location: (71,0)-(72,3)) - │ ├── flags: newline - │ ├── name: :=== - │ ├── name_loc: (71,4)-(71,7) = "===" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (71,0)-(71,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (72,0)-(72,3) = "end" - ├── @ DefNode (location: (74,0)-(75,3)) - │ ├── flags: newline - │ ├── name: :=~ - │ ├── name_loc: (74,4)-(74,6) = "=~" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (74,0)-(74,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (75,0)-(75,3) = "end" - ├── @ DefNode (location: (77,0)-(78,3)) - │ ├── flags: newline - │ ├── name: :> - │ ├── name_loc: (77,4)-(77,5) = ">" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (77,0)-(77,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (78,0)-(78,3) = "end" - ├── @ DefNode (location: (80,0)-(81,3)) - │ ├── flags: newline - │ ├── name: :>= - │ ├── name_loc: (80,4)-(80,6) = ">=" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (80,0)-(80,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (81,0)-(81,3) = "end" - ├── @ DefNode (location: (83,0)-(84,3)) - │ ├── flags: newline - │ ├── name: :>> - │ ├── name_loc: (83,4)-(83,6) = ">>" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (83,0)-(83,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (84,0)-(84,3) = "end" - ├── @ DefNode (location: (86,0)-(87,3)) - │ ├── flags: newline - │ ├── name: :[] - │ ├── name_loc: (86,4)-(86,6) = "[]" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (86,0)-(86,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (87,0)-(87,3) = "end" - ├── @ DefNode (location: (89,0)-(90,3)) - │ ├── flags: newline - │ ├── name: :[]= - │ ├── name_loc: (89,4)-(89,7) = "[]=" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (89,0)-(89,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (90,0)-(90,3) = "end" - ├── @ DefNode (location: (92,0)-(93,3)) - │ ├── flags: newline - │ ├── name: :^ - │ ├── name_loc: (92,4)-(92,5) = "^" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (92,0)-(92,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (93,0)-(93,3) = "end" - ├── @ DefNode (location: (95,0)-(96,3)) - │ ├── flags: newline - │ ├── name: :` - │ ├── name_loc: (95,4)-(95,5) = "`" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (95,0)-(95,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (96,0)-(96,3) = "end" - ├── @ DefNode (location: (98,0)-(99,3)) - │ ├── flags: newline - │ ├── name: :` - │ ├── name_loc: (98,9)-(98,10) = "`" - │ ├── receiver: - │ │ @ SelfNode (location: (98,4)-(98,8)) - │ │ └── flags: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (98,0)-(98,3) = "def" - │ ├── operator_loc: (98,8)-(98,9) = "." - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (99,0)-(99,3) = "end" - ├── @ DefNode (location: (101,0)-(102,3)) - │ ├── flags: newline - │ ├── name: :| - │ ├── name_loc: (101,4)-(101,5) = "|" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (101,0)-(101,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (102,0)-(102,3) = "end" - └── @ DefNode (location: (104,0)-(105,3)) - ├── flags: newline - ├── name: :~ - ├── name_loc: (104,4)-(104,5) = "~" - ├── receiver: ∅ - ├── parameters: ∅ - ├── body: ∅ - ├── locals: [] - ├── def_keyword_loc: (104,0)-(104,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: ∅ - ├── rparen_loc: ∅ - ├── equal_loc: ∅ - └── end_keyword_loc: (105,0)-(105,3) = "end" diff --git a/test/prism/snapshots/not.txt b/test/prism/snapshots/not.txt deleted file mode 100644 index e164b18813a44d..00000000000000 --- a/test/prism/snapshots/not.txt +++ /dev/null @@ -1,360 +0,0 @@ -@ ProgramNode (location: (1,0)-(37,16)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(37,16)) - ├── flags: ∅ - └── body: (length: 10) - ├── @ AndNode (location: (1,0)-(1,19)) - │ ├── flags: newline - │ ├── left: - │ │ @ CallNode (location: (1,0)-(1,7)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ CallNode (location: (1,4)-(1,7)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (1,4)-(1,7) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :! - │ │ ├── message_loc: (1,0)-(1,3) = "not" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── right: - │ │ @ CallNode (location: (1,12)-(1,19)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ CallNode (location: (1,16)-(1,19)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (1,16)-(1,19) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :! - │ │ ├── message_loc: (1,12)-(1,15) = "not" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── operator_loc: (1,8)-(1,11) = "and" - ├── @ CallNode (location: (3,0)-(3,16)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ AndNode (location: (3,4)-(3,15)) - │ │ ├── flags: ∅ - │ │ ├── left: - │ │ │ @ CallNode (location: (3,4)-(3,7)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (3,4)-(3,7) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── right: - │ │ │ @ CallNode (location: (3,12)-(3,15)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (3,12)-(3,15) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: (3,8)-(3,11) = "and" - │ ├── call_operator_loc: ∅ - │ ├── name: :! - │ ├── message_loc: (3,0)-(3,3) = "not" - │ ├── opening_loc: (3,3)-(3,4) = "(" - │ ├── arguments: ∅ - │ ├── closing_loc: (3,15)-(3,16) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (5,0)-(5,7)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (5,4)-(5,7)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (5,4)-(5,7) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :! - │ ├── message_loc: (5,0)-(5,3) = "not" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ AndNode (location: (7,0)-(8,5)) - │ ├── flags: newline - │ ├── left: - │ │ @ CallNode (location: (7,0)-(7,7)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ CallNode (location: (7,4)-(7,7)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (7,4)-(7,7) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :! - │ │ ├── message_loc: (7,0)-(7,3) = "not" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── right: - │ │ @ CallNode (location: (7,12)-(8,5)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ CallNode (location: (8,2)-(8,5)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (8,2)-(8,5) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :! - │ │ ├── message_loc: (7,12)-(7,15) = "not" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── operator_loc: (7,8)-(7,11) = "and" - ├── @ AndNode (location: (11,0)-(13,5)) - │ ├── flags: newline - │ ├── left: - │ │ @ CallNode (location: (11,0)-(11,7)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ CallNode (location: (11,4)-(11,7)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (11,4)-(11,7) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :! - │ │ ├── message_loc: (11,0)-(11,3) = "not" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── right: - │ │ @ CallNode (location: (12,4)-(13,5)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ CallNode (location: (13,2)-(13,5)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (13,2)-(13,5) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :! - │ │ ├── message_loc: (12,4)-(12,7) = "not" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── operator_loc: (11,8)-(11,11) = "and" - ├── @ AndNode (location: (16,0)-(20,5)) - │ ├── flags: newline - │ ├── left: - │ │ @ CallNode (location: (16,0)-(16,7)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ CallNode (location: (16,4)-(16,7)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (16,4)-(16,7) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :! - │ │ ├── message_loc: (16,0)-(16,3) = "not" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── right: - │ │ @ CallNode (location: (17,2)-(20,5)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ CallNode (location: (20,2)-(20,5)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (20,2)-(20,5) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :! - │ │ ├── message_loc: (17,2)-(17,5) = "not" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── operator_loc: (16,8)-(16,11) = "and" - ├── @ CallNode (location: (22,0)-(25,1)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (22,4)-(22,7)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (22,4)-(22,7) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :! - │ ├── message_loc: (22,0)-(22,3) = "not" - │ ├── opening_loc: (22,3)-(22,4) = "(" - │ ├── arguments: ∅ - │ ├── closing_loc: (25,0)-(25,1) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (27,0)-(33,3)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (30,0)-(30,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (30,0)-(30,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :! - │ ├── message_loc: (27,0)-(27,3) = "not" - │ ├── opening_loc: (27,3)-(27,4) = "(" - │ ├── arguments: ∅ - │ ├── closing_loc: (33,2)-(33,3) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (35,0)-(35,14)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ FlipFlopNode (location: (35,4)-(35,14)) - │ │ ├── flags: ∅ - │ │ ├── left: - │ │ │ @ CallNode (location: (35,4)-(35,7)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (35,4)-(35,7) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── right: - │ │ │ @ CallNode (location: (35,11)-(35,14)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (35,11)-(35,14) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: (35,8)-(35,10) = ".." - │ ├── call_operator_loc: ∅ - │ ├── name: :! - │ ├── message_loc: (35,0)-(35,3) = "not" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── @ CallNode (location: (37,0)-(37,16)) - ├── flags: newline - ├── receiver: - │ @ ParenthesesNode (location: (37,4)-(37,16)) - │ ├── flags: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (37,5)-(37,15)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ FlipFlopNode (location: (37,5)-(37,15)) - │ │ ├── flags: newline - │ │ ├── left: - │ │ │ @ CallNode (location: (37,5)-(37,8)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (37,5)-(37,8) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── right: - │ │ │ @ CallNode (location: (37,12)-(37,15)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (37,12)-(37,15) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: (37,9)-(37,11) = ".." - │ ├── opening_loc: (37,4)-(37,5) = "(" - │ └── closing_loc: (37,15)-(37,16) = ")" - ├── call_operator_loc: ∅ - ├── name: :! - ├── message_loc: (37,0)-(37,3) = "not" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/numbers.txt b/test/prism/snapshots/numbers.txt deleted file mode 100644 index 4512427ef320ad..00000000000000 --- a/test/prism/snapshots/numbers.txt +++ /dev/null @@ -1,147 +0,0 @@ -@ ProgramNode (location: (1,0)-(67,5)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(67,5)) - ├── flags: ∅ - └── body: (length: 34) - ├── @ IntegerNode (location: (1,0)-(1,1)) - │ ├── flags: newline, static_literal, decimal - │ └── value: 0 - ├── @ IntegerNode (location: (3,0)-(3,1)) - │ ├── flags: newline, static_literal, decimal - │ └── value: 1 - ├── @ FloatNode (location: (5,0)-(5,3)) - │ ├── flags: newline, static_literal - │ └── value: 1.0 - ├── @ IntegerNode (location: (7,0)-(7,1)) - │ ├── flags: newline, static_literal, decimal - │ └── value: 2 - ├── @ IntegerNode (location: (9,0)-(9,3)) - │ ├── flags: newline, static_literal, binary - │ └── value: 0 - ├── @ IntegerNode (location: (11,0)-(11,3)) - │ ├── flags: newline, static_literal, binary - │ └── value: 1 - ├── @ IntegerNode (location: (13,0)-(13,4)) - │ ├── flags: newline, static_literal, binary - │ └── value: 2 - ├── @ IntegerNode (location: (15,0)-(15,3)) - │ ├── flags: newline, static_literal, decimal - │ └── value: 0 - ├── @ IntegerNode (location: (17,0)-(17,3)) - │ ├── flags: newline, static_literal, decimal - │ └── value: 1 - ├── @ IntegerNode (location: (19,0)-(19,3)) - │ ├── flags: newline, static_literal, decimal - │ └── value: 2 - ├── @ IntegerNode (location: (21,0)-(21,2)) - │ ├── flags: newline, static_literal, octal - │ └── value: 0 - ├── @ IntegerNode (location: (23,0)-(23,2)) - │ ├── flags: newline, static_literal, octal - │ └── value: 1 - ├── @ IntegerNode (location: (25,0)-(25,2)) - │ ├── flags: newline, static_literal, octal - │ └── value: 2 - ├── @ IntegerNode (location: (27,0)-(27,3)) - │ ├── flags: newline, static_literal, octal - │ └── value: 0 - ├── @ IntegerNode (location: (29,0)-(29,3)) - │ ├── flags: newline, static_literal, octal - │ └── value: 1 - ├── @ IntegerNode (location: (31,0)-(31,3)) - │ ├── flags: newline, static_literal, octal - │ └── value: 2 - ├── @ IntegerNode (location: (33,0)-(33,3)) - │ ├── flags: newline, static_literal, hexadecimal - │ └── value: 0 - ├── @ IntegerNode (location: (35,0)-(35,3)) - │ ├── flags: newline, static_literal, hexadecimal - │ └── value: 1 - ├── @ IntegerNode (location: (37,0)-(37,3)) - │ ├── flags: newline, static_literal, hexadecimal - │ └── value: 2 - ├── @ ImaginaryNode (location: (39,0)-(39,2)) - │ ├── flags: newline, static_literal - │ └── numeric: - │ @ IntegerNode (location: (39,0)-(39,1)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── @ RationalNode (location: (41,0)-(41,2)) - │ ├── flags: newline, static_literal, decimal - │ ├── numerator: 1 - │ └── denominator: 1 - ├── @ IntegerNode (location: (43,0)-(43,2)) - │ ├── flags: newline, static_literal, decimal - │ └── value: -1 - ├── @ ImaginaryNode (location: (45,0)-(45,3)) - │ ├── flags: newline, static_literal - │ └── numeric: - │ @ RationalNode (location: (45,0)-(45,2)) - │ ├── flags: static_literal, decimal - │ ├── numerator: 1 - │ └── denominator: 1 - ├── @ RationalNode (location: (47,0)-(47,4)) - │ ├── flags: newline, static_literal, decimal - │ ├── numerator: 6 - │ └── denominator: 5 - ├── @ ImaginaryNode (location: (49,0)-(49,5)) - │ ├── flags: newline, static_literal - │ └── numeric: - │ @ RationalNode (location: (49,0)-(49,4)) - │ ├── flags: static_literal, decimal - │ ├── numerator: 6 - │ └── denominator: 5 - ├── @ ImaginaryNode (location: (51,0)-(51,4)) - │ ├── flags: newline, static_literal - │ └── numeric: - │ @ RationalNode (location: (51,0)-(51,3)) - │ ├── flags: static_literal, decimal - │ ├── numerator: -1 - │ └── denominator: 1 - ├── @ RationalNode (location: (53,0)-(53,5)) - │ ├── flags: newline, static_literal, decimal - │ ├── numerator: -6 - │ └── denominator: 5 - ├── @ ImaginaryNode (location: (55,0)-(55,6)) - │ ├── flags: newline, static_literal - │ └── numeric: - │ @ RationalNode (location: (55,0)-(55,5)) - │ ├── flags: static_literal, decimal - │ ├── numerator: -6 - │ └── denominator: 5 - ├── @ RationalNode (location: (57,0)-(57,4)) - │ ├── flags: newline, static_literal, octal - │ ├── numerator: 1 - │ └── denominator: 1 - ├── @ ImaginaryNode (location: (59,0)-(59,4)) - │ ├── flags: newline, static_literal - │ └── numeric: - │ @ IntegerNode (location: (59,0)-(59,3)) - │ ├── flags: static_literal, octal - │ └── value: 1 - ├── @ ImaginaryNode (location: (61,0)-(61,5)) - │ ├── flags: newline, static_literal - │ └── numeric: - │ @ RationalNode (location: (61,0)-(61,4)) - │ ├── flags: static_literal, octal - │ ├── numerator: 1 - │ └── denominator: 1 - ├── @ RationalNode (location: (63,0)-(63,4)) - │ ├── flags: newline, static_literal, decimal - │ ├── numerator: 1 - │ └── denominator: 1 - ├── @ ImaginaryNode (location: (65,0)-(65,4)) - │ ├── flags: newline, static_literal - │ └── numeric: - │ @ IntegerNode (location: (65,0)-(65,3)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - └── @ ImaginaryNode (location: (67,0)-(67,5)) - ├── flags: newline, static_literal - └── numeric: - @ RationalNode (location: (67,0)-(67,4)) - ├── flags: static_literal, binary - ├── numerator: 1 - └── denominator: 1 diff --git a/test/prism/snapshots/patterns.txt b/test/prism/snapshots/patterns.txt deleted file mode 100644 index 1857bcd21c3358..00000000000000 --- a/test/prism/snapshots/patterns.txt +++ /dev/null @@ -1,5570 +0,0 @@ -@ ProgramNode (location: (1,0)-(220,31)) -├── flags: ∅ -├── locals: [:bar, :baz, :qux, :b, :a, :foo, :x, :_a] -└── statements: - @ StatementsNode (location: (1,0)-(220,31)) - ├── flags: ∅ - └── body: (length: 182) - ├── @ MatchRequiredNode (location: (1,0)-(1,10)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (1,0)-(1,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (1,0)-(1,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ LocalVariableTargetNode (location: (1,7)-(1,10)) - │ │ ├── flags: ∅ - │ │ ├── name: :bar - │ │ └── depth: 0 - │ └── operator_loc: (1,4)-(1,6) = "=>" - ├── @ MatchRequiredNode (location: (2,0)-(2,8)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (2,0)-(2,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (2,0)-(2,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ IntegerNode (location: (2,7)-(2,8)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ └── operator_loc: (2,4)-(2,6) = "=>" - ├── @ MatchRequiredNode (location: (3,0)-(3,10)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (3,0)-(3,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (3,0)-(3,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ FloatNode (location: (3,7)-(3,10)) - │ │ ├── flags: static_literal - │ │ └── value: 1.0 - │ └── operator_loc: (3,4)-(3,6) = "=>" - ├── @ MatchRequiredNode (location: (4,0)-(4,9)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (4,0)-(4,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (4,0)-(4,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ ImaginaryNode (location: (4,7)-(4,9)) - │ │ ├── flags: static_literal - │ │ └── numeric: - │ │ @ IntegerNode (location: (4,7)-(4,8)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ └── operator_loc: (4,4)-(4,6) = "=>" - ├── @ MatchRequiredNode (location: (5,0)-(5,9)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (5,0)-(5,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (5,0)-(5,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ RationalNode (location: (5,7)-(5,9)) - │ │ ├── flags: static_literal, decimal - │ │ ├── numerator: 1 - │ │ └── denominator: 1 - │ └── operator_loc: (5,4)-(5,6) = "=>" - ├── @ MatchRequiredNode (location: (6,0)-(6,11)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (6,0)-(6,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (6,0)-(6,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ SymbolNode (location: (6,7)-(6,11)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (6,7)-(6,8) = ":" - │ │ ├── value_loc: (6,8)-(6,11) = "foo" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "foo" - │ └── operator_loc: (6,4)-(6,6) = "=>" - ├── @ MatchRequiredNode (location: (7,0)-(7,14)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (7,0)-(7,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (7,0)-(7,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ SymbolNode (location: (7,7)-(7,14)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (7,7)-(7,10) = "%s[" - │ │ ├── value_loc: (7,10)-(7,13) = "foo" - │ │ ├── closing_loc: (7,13)-(7,14) = "]" - │ │ └── unescaped: "foo" - │ └── operator_loc: (7,4)-(7,6) = "=>" - ├── @ MatchRequiredNode (location: (8,0)-(8,13)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (8,0)-(8,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (8,0)-(8,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ SymbolNode (location: (8,7)-(8,13)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (8,7)-(8,9) = ":\"" - │ │ ├── value_loc: (8,9)-(8,12) = "foo" - │ │ ├── closing_loc: (8,12)-(8,13) = "\"" - │ │ └── unescaped: "foo" - │ └── operator_loc: (8,4)-(8,6) = "=>" - ├── @ MatchRequiredNode (location: (9,0)-(9,12)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (9,0)-(9,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (9,0)-(9,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ RegularExpressionNode (location: (9,7)-(9,12)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (9,7)-(9,8) = "/" - │ │ ├── content_loc: (9,8)-(9,11) = "foo" - │ │ ├── closing_loc: (9,11)-(9,12) = "/" - │ │ └── unescaped: "foo" - │ └── operator_loc: (9,4)-(9,6) = "=>" - ├── @ MatchRequiredNode (location: (10,0)-(10,12)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (10,0)-(10,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (10,0)-(10,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ XStringNode (location: (10,7)-(10,12)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (10,7)-(10,8) = "`" - │ │ ├── content_loc: (10,8)-(10,11) = "foo" - │ │ ├── closing_loc: (10,11)-(10,12) = "`" - │ │ └── unescaped: "foo" - │ └── operator_loc: (10,4)-(10,6) = "=>" - ├── @ MatchRequiredNode (location: (11,0)-(11,14)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (11,0)-(11,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (11,0)-(11,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ XStringNode (location: (11,7)-(11,14)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (11,7)-(11,10) = "%x[" - │ │ ├── content_loc: (11,10)-(11,13) = "foo" - │ │ ├── closing_loc: (11,13)-(11,14) = "]" - │ │ └── unescaped: "foo" - │ └── operator_loc: (11,4)-(11,6) = "=>" - ├── @ MatchRequiredNode (location: (12,0)-(12,14)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (12,0)-(12,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (12,0)-(12,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ ArrayNode (location: (12,7)-(12,14)) - │ │ ├── flags: static_literal - │ │ ├── elements: (length: 1) - │ │ │ └── @ SymbolNode (location: (12,10)-(12,13)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (12,10)-(12,13) = "foo" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "foo" - │ │ ├── opening_loc: (12,7)-(12,10) = "%i[" - │ │ └── closing_loc: (12,13)-(12,14) = "]" - │ └── operator_loc: (12,4)-(12,6) = "=>" - ├── @ MatchRequiredNode (location: (13,0)-(13,14)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (13,0)-(13,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (13,0)-(13,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ ArrayNode (location: (13,7)-(13,14)) - │ │ ├── flags: static_literal - │ │ ├── elements: (length: 1) - │ │ │ └── @ SymbolNode (location: (13,10)-(13,13)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (13,10)-(13,13) = "foo" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "foo" - │ │ ├── opening_loc: (13,7)-(13,10) = "%I[" - │ │ └── closing_loc: (13,13)-(13,14) = "]" - │ └── operator_loc: (13,4)-(13,6) = "=>" - ├── @ MatchRequiredNode (location: (14,0)-(14,14)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (14,0)-(14,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (14,0)-(14,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ ArrayNode (location: (14,7)-(14,14)) - │ │ ├── flags: ∅ - │ │ ├── elements: (length: 1) - │ │ │ └── @ StringNode (location: (14,10)-(14,13)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (14,10)-(14,13) = "foo" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "foo" - │ │ ├── opening_loc: (14,7)-(14,10) = "%w[" - │ │ └── closing_loc: (14,13)-(14,14) = "]" - │ └── operator_loc: (14,4)-(14,6) = "=>" - ├── @ MatchRequiredNode (location: (15,0)-(15,14)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (15,0)-(15,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (15,0)-(15,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ ArrayNode (location: (15,7)-(15,14)) - │ │ ├── flags: ∅ - │ │ ├── elements: (length: 1) - │ │ │ └── @ StringNode (location: (15,10)-(15,13)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (15,10)-(15,13) = "foo" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "foo" - │ │ ├── opening_loc: (15,7)-(15,10) = "%W[" - │ │ └── closing_loc: (15,13)-(15,14) = "]" - │ └── operator_loc: (15,4)-(15,6) = "=>" - ├── @ MatchRequiredNode (location: (16,0)-(16,14)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (16,0)-(16,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (16,0)-(16,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ StringNode (location: (16,7)-(16,14)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (16,7)-(16,10) = "%q[" - │ │ ├── content_loc: (16,10)-(16,13) = "foo" - │ │ ├── closing_loc: (16,13)-(16,14) = "]" - │ │ └── unescaped: "foo" - │ └── operator_loc: (16,4)-(16,6) = "=>" - ├── @ MatchRequiredNode (location: (17,0)-(17,14)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (17,0)-(17,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (17,0)-(17,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ StringNode (location: (17,7)-(17,14)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (17,7)-(17,10) = "%Q[" - │ │ ├── content_loc: (17,10)-(17,13) = "foo" - │ │ ├── closing_loc: (17,13)-(17,14) = "]" - │ │ └── unescaped: "foo" - │ └── operator_loc: (17,4)-(17,6) = "=>" - ├── @ MatchRequiredNode (location: (18,0)-(18,12)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (18,0)-(18,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (18,0)-(18,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ StringNode (location: (18,7)-(18,12)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (18,7)-(18,8) = "\"" - │ │ ├── content_loc: (18,8)-(18,11) = "foo" - │ │ ├── closing_loc: (18,11)-(18,12) = "\"" - │ │ └── unescaped: "foo" - │ └── operator_loc: (18,4)-(18,6) = "=>" - ├── @ MatchRequiredNode (location: (19,0)-(19,10)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (19,0)-(19,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (19,0)-(19,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ NilNode (location: (19,7)-(19,10)) - │ │ └── flags: static_literal - │ └── operator_loc: (19,4)-(19,6) = "=>" - ├── @ MatchRequiredNode (location: (20,0)-(20,11)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (20,0)-(20,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (20,0)-(20,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ SelfNode (location: (20,7)-(20,11)) - │ │ └── flags: ∅ - │ └── operator_loc: (20,4)-(20,6) = "=>" - ├── @ MatchRequiredNode (location: (21,0)-(21,11)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (21,0)-(21,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (21,0)-(21,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ TrueNode (location: (21,7)-(21,11)) - │ │ └── flags: static_literal - │ └── operator_loc: (21,4)-(21,6) = "=>" - ├── @ MatchRequiredNode (location: (22,0)-(22,12)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (22,0)-(22,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (22,0)-(22,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ FalseNode (location: (22,7)-(22,12)) - │ │ └── flags: static_literal - │ └── operator_loc: (22,4)-(22,6) = "=>" - ├── @ MatchRequiredNode (location: (23,0)-(23,15)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (23,0)-(23,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (23,0)-(23,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ SourceFileNode (location: (23,7)-(23,15)) - │ │ ├── flags: ∅ - │ │ └── filepath: "patterns.txt" - │ └── operator_loc: (23,4)-(23,6) = "=>" - ├── @ MatchRequiredNode (location: (24,0)-(24,15)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (24,0)-(24,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (24,0)-(24,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ SourceLineNode (location: (24,7)-(24,15)) - │ │ └── flags: static_literal - │ └── operator_loc: (24,4)-(24,6) = "=>" - ├── @ MatchRequiredNode (location: (25,0)-(25,19)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (25,0)-(25,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (25,0)-(25,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ SourceEncodingNode (location: (25,7)-(25,19)) - │ │ └── flags: static_literal - │ └── operator_loc: (25,4)-(25,6) = "=>" - ├── @ MatchRequiredNode (location: (26,0)-(26,17)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (26,0)-(26,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (26,0)-(26,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ LambdaNode (location: (26,7)-(26,17)) - │ │ ├── flags: ∅ - │ │ ├── locals: [] - │ │ ├── operator_loc: (26,7)-(26,9) = "->" - │ │ ├── opening_loc: (26,10)-(26,11) = "{" - │ │ ├── closing_loc: (26,16)-(26,17) = "}" - │ │ ├── parameters: ∅ - │ │ └── body: - │ │ @ StatementsNode (location: (26,12)-(26,15)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ LocalVariableReadNode (location: (26,12)-(26,15)) - │ │ ├── flags: newline - │ │ ├── name: :bar - │ │ └── depth: 1 - │ └── operator_loc: (26,4)-(26,6) = "=>" - ├── @ MatchRequiredNode (location: (28,0)-(28,13)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (28,0)-(28,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (28,0)-(28,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ RangeNode (location: (28,7)-(28,13)) - │ │ ├── flags: static_literal - │ │ ├── left: - │ │ │ @ IntegerNode (location: (28,7)-(28,8)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── right: - │ │ │ @ IntegerNode (location: (28,12)-(28,13)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── operator_loc: (28,9)-(28,11) = ".." - │ └── operator_loc: (28,4)-(28,6) = "=>" - ├── @ MatchRequiredNode (location: (29,0)-(29,17)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (29,0)-(29,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (29,0)-(29,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ RangeNode (location: (29,7)-(29,17)) - │ │ ├── flags: ∅ - │ │ ├── left: - │ │ │ @ FloatNode (location: (29,7)-(29,10)) - │ │ │ ├── flags: static_literal - │ │ │ └── value: 1.0 - │ │ ├── right: - │ │ │ @ FloatNode (location: (29,14)-(29,17)) - │ │ │ ├── flags: static_literal - │ │ │ └── value: 1.0 - │ │ └── operator_loc: (29,11)-(29,13) = ".." - │ └── operator_loc: (29,4)-(29,6) = "=>" - ├── @ MatchRequiredNode (location: (30,0)-(30,15)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (30,0)-(30,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (30,0)-(30,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ RangeNode (location: (30,7)-(30,15)) - │ │ ├── flags: ∅ - │ │ ├── left: - │ │ │ @ ImaginaryNode (location: (30,7)-(30,9)) - │ │ │ ├── flags: static_literal - │ │ │ └── numeric: - │ │ │ @ IntegerNode (location: (30,7)-(30,8)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── right: - │ │ │ @ ImaginaryNode (location: (30,13)-(30,15)) - │ │ │ ├── flags: static_literal - │ │ │ └── numeric: - │ │ │ @ IntegerNode (location: (30,13)-(30,14)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── operator_loc: (30,10)-(30,12) = ".." - │ └── operator_loc: (30,4)-(30,6) = "=>" - ├── @ MatchRequiredNode (location: (31,0)-(31,15)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (31,0)-(31,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (31,0)-(31,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ RangeNode (location: (31,7)-(31,15)) - │ │ ├── flags: ∅ - │ │ ├── left: - │ │ │ @ RationalNode (location: (31,7)-(31,9)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ ├── numerator: 1 - │ │ │ └── denominator: 1 - │ │ ├── right: - │ │ │ @ RationalNode (location: (31,13)-(31,15)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ ├── numerator: 1 - │ │ │ └── denominator: 1 - │ │ └── operator_loc: (31,10)-(31,12) = ".." - │ └── operator_loc: (31,4)-(31,6) = "=>" - ├── @ MatchRequiredNode (location: (32,0)-(32,19)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (32,0)-(32,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (32,0)-(32,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ RangeNode (location: (32,7)-(32,19)) - │ │ ├── flags: ∅ - │ │ ├── left: - │ │ │ @ SymbolNode (location: (32,7)-(32,11)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (32,7)-(32,8) = ":" - │ │ │ ├── value_loc: (32,8)-(32,11) = "foo" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "foo" - │ │ ├── right: - │ │ │ @ SymbolNode (location: (32,15)-(32,19)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (32,15)-(32,16) = ":" - │ │ │ ├── value_loc: (32,16)-(32,19) = "foo" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "foo" - │ │ └── operator_loc: (32,12)-(32,14) = ".." - │ └── operator_loc: (32,4)-(32,6) = "=>" - ├── @ MatchRequiredNode (location: (33,0)-(33,25)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (33,0)-(33,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (33,0)-(33,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ RangeNode (location: (33,7)-(33,25)) - │ │ ├── flags: ∅ - │ │ ├── left: - │ │ │ @ SymbolNode (location: (33,7)-(33,14)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (33,7)-(33,10) = "%s[" - │ │ │ ├── value_loc: (33,10)-(33,13) = "foo" - │ │ │ ├── closing_loc: (33,13)-(33,14) = "]" - │ │ │ └── unescaped: "foo" - │ │ ├── right: - │ │ │ @ SymbolNode (location: (33,18)-(33,25)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (33,18)-(33,21) = "%s[" - │ │ │ ├── value_loc: (33,21)-(33,24) = "foo" - │ │ │ ├── closing_loc: (33,24)-(33,25) = "]" - │ │ │ └── unescaped: "foo" - │ │ └── operator_loc: (33,15)-(33,17) = ".." - │ └── operator_loc: (33,4)-(33,6) = "=>" - ├── @ MatchRequiredNode (location: (34,0)-(34,23)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (34,0)-(34,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (34,0)-(34,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ RangeNode (location: (34,7)-(34,23)) - │ │ ├── flags: ∅ - │ │ ├── left: - │ │ │ @ SymbolNode (location: (34,7)-(34,13)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (34,7)-(34,9) = ":\"" - │ │ │ ├── value_loc: (34,9)-(34,12) = "foo" - │ │ │ ├── closing_loc: (34,12)-(34,13) = "\"" - │ │ │ └── unescaped: "foo" - │ │ ├── right: - │ │ │ @ SymbolNode (location: (34,17)-(34,23)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (34,17)-(34,19) = ":\"" - │ │ │ ├── value_loc: (34,19)-(34,22) = "foo" - │ │ │ ├── closing_loc: (34,22)-(34,23) = "\"" - │ │ │ └── unescaped: "foo" - │ │ └── operator_loc: (34,14)-(34,16) = ".." - │ └── operator_loc: (34,4)-(34,6) = "=>" - ├── @ MatchRequiredNode (location: (35,0)-(35,21)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (35,0)-(35,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (35,0)-(35,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ RangeNode (location: (35,7)-(35,21)) - │ │ ├── flags: ∅ - │ │ ├── left: - │ │ │ @ RegularExpressionNode (location: (35,7)-(35,12)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (35,7)-(35,8) = "/" - │ │ │ ├── content_loc: (35,8)-(35,11) = "foo" - │ │ │ ├── closing_loc: (35,11)-(35,12) = "/" - │ │ │ └── unescaped: "foo" - │ │ ├── right: - │ │ │ @ RegularExpressionNode (location: (35,16)-(35,21)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (35,16)-(35,17) = "/" - │ │ │ ├── content_loc: (35,17)-(35,20) = "foo" - │ │ │ ├── closing_loc: (35,20)-(35,21) = "/" - │ │ │ └── unescaped: "foo" - │ │ └── operator_loc: (35,13)-(35,15) = ".." - │ └── operator_loc: (35,4)-(35,6) = "=>" - ├── @ MatchRequiredNode (location: (36,0)-(36,21)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (36,0)-(36,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (36,0)-(36,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ RangeNode (location: (36,7)-(36,21)) - │ │ ├── flags: ∅ - │ │ ├── left: - │ │ │ @ XStringNode (location: (36,7)-(36,12)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (36,7)-(36,8) = "`" - │ │ │ ├── content_loc: (36,8)-(36,11) = "foo" - │ │ │ ├── closing_loc: (36,11)-(36,12) = "`" - │ │ │ └── unescaped: "foo" - │ │ ├── right: - │ │ │ @ XStringNode (location: (36,16)-(36,21)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (36,16)-(36,17) = "`" - │ │ │ ├── content_loc: (36,17)-(36,20) = "foo" - │ │ │ ├── closing_loc: (36,20)-(36,21) = "`" - │ │ │ └── unescaped: "foo" - │ │ └── operator_loc: (36,13)-(36,15) = ".." - │ └── operator_loc: (36,4)-(36,6) = "=>" - ├── @ MatchRequiredNode (location: (37,0)-(37,25)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (37,0)-(37,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (37,0)-(37,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ RangeNode (location: (37,7)-(37,25)) - │ │ ├── flags: ∅ - │ │ ├── left: - │ │ │ @ XStringNode (location: (37,7)-(37,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (37,7)-(37,10) = "%x[" - │ │ │ ├── content_loc: (37,10)-(37,13) = "foo" - │ │ │ ├── closing_loc: (37,13)-(37,14) = "]" - │ │ │ └── unescaped: "foo" - │ │ ├── right: - │ │ │ @ XStringNode (location: (37,18)-(37,25)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (37,18)-(37,21) = "%x[" - │ │ │ ├── content_loc: (37,21)-(37,24) = "foo" - │ │ │ ├── closing_loc: (37,24)-(37,25) = "]" - │ │ │ └── unescaped: "foo" - │ │ └── operator_loc: (37,15)-(37,17) = ".." - │ └── operator_loc: (37,4)-(37,6) = "=>" - ├── @ MatchRequiredNode (location: (38,0)-(38,25)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (38,0)-(38,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (38,0)-(38,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ RangeNode (location: (38,7)-(38,25)) - │ │ ├── flags: ∅ - │ │ ├── left: - │ │ │ @ ArrayNode (location: (38,7)-(38,14)) - │ │ │ ├── flags: static_literal - │ │ │ ├── elements: (length: 1) - │ │ │ │ └── @ SymbolNode (location: (38,10)-(38,13)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── value_loc: (38,10)-(38,13) = "foo" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "foo" - │ │ │ ├── opening_loc: (38,7)-(38,10) = "%i[" - │ │ │ └── closing_loc: (38,13)-(38,14) = "]" - │ │ ├── right: - │ │ │ @ ArrayNode (location: (38,18)-(38,25)) - │ │ │ ├── flags: static_literal - │ │ │ ├── elements: (length: 1) - │ │ │ │ └── @ SymbolNode (location: (38,21)-(38,24)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── value_loc: (38,21)-(38,24) = "foo" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "foo" - │ │ │ ├── opening_loc: (38,18)-(38,21) = "%i[" - │ │ │ └── closing_loc: (38,24)-(38,25) = "]" - │ │ └── operator_loc: (38,15)-(38,17) = ".." - │ └── operator_loc: (38,4)-(38,6) = "=>" - ├── @ MatchRequiredNode (location: (39,0)-(39,25)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (39,0)-(39,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (39,0)-(39,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ RangeNode (location: (39,7)-(39,25)) - │ │ ├── flags: ∅ - │ │ ├── left: - │ │ │ @ ArrayNode (location: (39,7)-(39,14)) - │ │ │ ├── flags: static_literal - │ │ │ ├── elements: (length: 1) - │ │ │ │ └── @ SymbolNode (location: (39,10)-(39,13)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── value_loc: (39,10)-(39,13) = "foo" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "foo" - │ │ │ ├── opening_loc: (39,7)-(39,10) = "%I[" - │ │ │ └── closing_loc: (39,13)-(39,14) = "]" - │ │ ├── right: - │ │ │ @ ArrayNode (location: (39,18)-(39,25)) - │ │ │ ├── flags: static_literal - │ │ │ ├── elements: (length: 1) - │ │ │ │ └── @ SymbolNode (location: (39,21)-(39,24)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── value_loc: (39,21)-(39,24) = "foo" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "foo" - │ │ │ ├── opening_loc: (39,18)-(39,21) = "%I[" - │ │ │ └── closing_loc: (39,24)-(39,25) = "]" - │ │ └── operator_loc: (39,15)-(39,17) = ".." - │ └── operator_loc: (39,4)-(39,6) = "=>" - ├── @ MatchRequiredNode (location: (40,0)-(40,25)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (40,0)-(40,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (40,0)-(40,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ RangeNode (location: (40,7)-(40,25)) - │ │ ├── flags: ∅ - │ │ ├── left: - │ │ │ @ ArrayNode (location: (40,7)-(40,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── elements: (length: 1) - │ │ │ │ └── @ StringNode (location: (40,10)-(40,13)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── content_loc: (40,10)-(40,13) = "foo" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "foo" - │ │ │ ├── opening_loc: (40,7)-(40,10) = "%w[" - │ │ │ └── closing_loc: (40,13)-(40,14) = "]" - │ │ ├── right: - │ │ │ @ ArrayNode (location: (40,18)-(40,25)) - │ │ │ ├── flags: ∅ - │ │ │ ├── elements: (length: 1) - │ │ │ │ └── @ StringNode (location: (40,21)-(40,24)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── content_loc: (40,21)-(40,24) = "foo" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "foo" - │ │ │ ├── opening_loc: (40,18)-(40,21) = "%w[" - │ │ │ └── closing_loc: (40,24)-(40,25) = "]" - │ │ └── operator_loc: (40,15)-(40,17) = ".." - │ └── operator_loc: (40,4)-(40,6) = "=>" - ├── @ MatchRequiredNode (location: (41,0)-(41,25)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (41,0)-(41,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (41,0)-(41,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ RangeNode (location: (41,7)-(41,25)) - │ │ ├── flags: ∅ - │ │ ├── left: - │ │ │ @ ArrayNode (location: (41,7)-(41,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── elements: (length: 1) - │ │ │ │ └── @ StringNode (location: (41,10)-(41,13)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── content_loc: (41,10)-(41,13) = "foo" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "foo" - │ │ │ ├── opening_loc: (41,7)-(41,10) = "%W[" - │ │ │ └── closing_loc: (41,13)-(41,14) = "]" - │ │ ├── right: - │ │ │ @ ArrayNode (location: (41,18)-(41,25)) - │ │ │ ├── flags: ∅ - │ │ │ ├── elements: (length: 1) - │ │ │ │ └── @ StringNode (location: (41,21)-(41,24)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── content_loc: (41,21)-(41,24) = "foo" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "foo" - │ │ │ ├── opening_loc: (41,18)-(41,21) = "%W[" - │ │ │ └── closing_loc: (41,24)-(41,25) = "]" - │ │ └── operator_loc: (41,15)-(41,17) = ".." - │ └── operator_loc: (41,4)-(41,6) = "=>" - ├── @ MatchRequiredNode (location: (42,0)-(42,25)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (42,0)-(42,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (42,0)-(42,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ RangeNode (location: (42,7)-(42,25)) - │ │ ├── flags: ∅ - │ │ ├── left: - │ │ │ @ StringNode (location: (42,7)-(42,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (42,7)-(42,10) = "%q[" - │ │ │ ├── content_loc: (42,10)-(42,13) = "foo" - │ │ │ ├── closing_loc: (42,13)-(42,14) = "]" - │ │ │ └── unescaped: "foo" - │ │ ├── right: - │ │ │ @ StringNode (location: (42,18)-(42,25)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (42,18)-(42,21) = "%q[" - │ │ │ ├── content_loc: (42,21)-(42,24) = "foo" - │ │ │ ├── closing_loc: (42,24)-(42,25) = "]" - │ │ │ └── unescaped: "foo" - │ │ └── operator_loc: (42,15)-(42,17) = ".." - │ └── operator_loc: (42,4)-(42,6) = "=>" - ├── @ MatchRequiredNode (location: (43,0)-(43,25)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (43,0)-(43,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (43,0)-(43,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ RangeNode (location: (43,7)-(43,25)) - │ │ ├── flags: ∅ - │ │ ├── left: - │ │ │ @ StringNode (location: (43,7)-(43,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (43,7)-(43,10) = "%Q[" - │ │ │ ├── content_loc: (43,10)-(43,13) = "foo" - │ │ │ ├── closing_loc: (43,13)-(43,14) = "]" - │ │ │ └── unescaped: "foo" - │ │ ├── right: - │ │ │ @ StringNode (location: (43,18)-(43,25)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (43,18)-(43,21) = "%Q[" - │ │ │ ├── content_loc: (43,21)-(43,24) = "foo" - │ │ │ ├── closing_loc: (43,24)-(43,25) = "]" - │ │ │ └── unescaped: "foo" - │ │ └── operator_loc: (43,15)-(43,17) = ".." - │ └── operator_loc: (43,4)-(43,6) = "=>" - ├── @ MatchRequiredNode (location: (44,0)-(44,21)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (44,0)-(44,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (44,0)-(44,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ RangeNode (location: (44,7)-(44,21)) - │ │ ├── flags: ∅ - │ │ ├── left: - │ │ │ @ StringNode (location: (44,7)-(44,12)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (44,7)-(44,8) = "\"" - │ │ │ ├── content_loc: (44,8)-(44,11) = "foo" - │ │ │ ├── closing_loc: (44,11)-(44,12) = "\"" - │ │ │ └── unescaped: "foo" - │ │ ├── right: - │ │ │ @ StringNode (location: (44,16)-(44,21)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (44,16)-(44,17) = "\"" - │ │ │ ├── content_loc: (44,17)-(44,20) = "foo" - │ │ │ ├── closing_loc: (44,20)-(44,21) = "\"" - │ │ │ └── unescaped: "foo" - │ │ └── operator_loc: (44,13)-(44,15) = ".." - │ └── operator_loc: (44,4)-(44,6) = "=>" - ├── @ MatchRequiredNode (location: (45,0)-(45,17)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (45,0)-(45,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (45,0)-(45,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ RangeNode (location: (45,7)-(45,17)) - │ │ ├── flags: static_literal - │ │ ├── left: - │ │ │ @ NilNode (location: (45,7)-(45,10)) - │ │ │ └── flags: static_literal - │ │ ├── right: - │ │ │ @ NilNode (location: (45,14)-(45,17)) - │ │ │ └── flags: static_literal - │ │ └── operator_loc: (45,11)-(45,13) = ".." - │ └── operator_loc: (45,4)-(45,6) = "=>" - ├── @ MatchRequiredNode (location: (46,0)-(46,19)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (46,0)-(46,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (46,0)-(46,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ RangeNode (location: (46,7)-(46,19)) - │ │ ├── flags: ∅ - │ │ ├── left: - │ │ │ @ SelfNode (location: (46,7)-(46,11)) - │ │ │ └── flags: ∅ - │ │ ├── right: - │ │ │ @ SelfNode (location: (46,15)-(46,19)) - │ │ │ └── flags: ∅ - │ │ └── operator_loc: (46,12)-(46,14) = ".." - │ └── operator_loc: (46,4)-(46,6) = "=>" - ├── @ MatchRequiredNode (location: (47,0)-(47,19)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (47,0)-(47,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (47,0)-(47,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ RangeNode (location: (47,7)-(47,19)) - │ │ ├── flags: ∅ - │ │ ├── left: - │ │ │ @ TrueNode (location: (47,7)-(47,11)) - │ │ │ └── flags: static_literal - │ │ ├── right: - │ │ │ @ TrueNode (location: (47,15)-(47,19)) - │ │ │ └── flags: static_literal - │ │ └── operator_loc: (47,12)-(47,14) = ".." - │ └── operator_loc: (47,4)-(47,6) = "=>" - ├── @ MatchRequiredNode (location: (48,0)-(48,21)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (48,0)-(48,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (48,0)-(48,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ RangeNode (location: (48,7)-(48,21)) - │ │ ├── flags: ∅ - │ │ ├── left: - │ │ │ @ FalseNode (location: (48,7)-(48,12)) - │ │ │ └── flags: static_literal - │ │ ├── right: - │ │ │ @ FalseNode (location: (48,16)-(48,21)) - │ │ │ └── flags: static_literal - │ │ └── operator_loc: (48,13)-(48,15) = ".." - │ └── operator_loc: (48,4)-(48,6) = "=>" - ├── @ MatchRequiredNode (location: (49,0)-(49,27)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (49,0)-(49,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (49,0)-(49,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ RangeNode (location: (49,7)-(49,27)) - │ │ ├── flags: ∅ - │ │ ├── left: - │ │ │ @ SourceFileNode (location: (49,7)-(49,15)) - │ │ │ ├── flags: ∅ - │ │ │ └── filepath: "patterns.txt" - │ │ ├── right: - │ │ │ @ SourceFileNode (location: (49,19)-(49,27)) - │ │ │ ├── flags: ∅ - │ │ │ └── filepath: "patterns.txt" - │ │ └── operator_loc: (49,16)-(49,18) = ".." - │ └── operator_loc: (49,4)-(49,6) = "=>" - ├── @ MatchRequiredNode (location: (50,0)-(50,27)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (50,0)-(50,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (50,0)-(50,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ RangeNode (location: (50,7)-(50,27)) - │ │ ├── flags: ∅ - │ │ ├── left: - │ │ │ @ SourceLineNode (location: (50,7)-(50,15)) - │ │ │ └── flags: static_literal - │ │ ├── right: - │ │ │ @ SourceLineNode (location: (50,19)-(50,27)) - │ │ │ └── flags: static_literal - │ │ └── operator_loc: (50,16)-(50,18) = ".." - │ └── operator_loc: (50,4)-(50,6) = "=>" - ├── @ MatchRequiredNode (location: (51,0)-(51,35)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (51,0)-(51,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (51,0)-(51,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ RangeNode (location: (51,7)-(51,35)) - │ │ ├── flags: ∅ - │ │ ├── left: - │ │ │ @ SourceEncodingNode (location: (51,7)-(51,19)) - │ │ │ └── flags: static_literal - │ │ ├── right: - │ │ │ @ SourceEncodingNode (location: (51,23)-(51,35)) - │ │ │ └── flags: static_literal - │ │ └── operator_loc: (51,20)-(51,22) = ".." - │ └── operator_loc: (51,4)-(51,6) = "=>" - ├── @ MatchRequiredNode (location: (52,0)-(52,31)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (52,0)-(52,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (52,0)-(52,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ RangeNode (location: (52,7)-(52,31)) - │ │ ├── flags: ∅ - │ │ ├── left: - │ │ │ @ LambdaNode (location: (52,7)-(52,17)) - │ │ │ ├── flags: ∅ - │ │ │ ├── locals: [] - │ │ │ ├── operator_loc: (52,7)-(52,9) = "->" - │ │ │ ├── opening_loc: (52,10)-(52,11) = "{" - │ │ │ ├── closing_loc: (52,16)-(52,17) = "}" - │ │ │ ├── parameters: ∅ - │ │ │ └── body: - │ │ │ @ StatementsNode (location: (52,12)-(52,15)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ LocalVariableReadNode (location: (52,12)-(52,15)) - │ │ │ ├── flags: newline - │ │ │ ├── name: :bar - │ │ │ └── depth: 1 - │ │ ├── right: - │ │ │ @ LambdaNode (location: (52,21)-(52,31)) - │ │ │ ├── flags: ∅ - │ │ │ ├── locals: [] - │ │ │ ├── operator_loc: (52,21)-(52,23) = "->" - │ │ │ ├── opening_loc: (52,24)-(52,25) = "{" - │ │ │ ├── closing_loc: (52,30)-(52,31) = "}" - │ │ │ ├── parameters: ∅ - │ │ │ └── body: - │ │ │ @ StatementsNode (location: (52,26)-(52,29)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ LocalVariableReadNode (location: (52,26)-(52,29)) - │ │ │ ├── flags: newline - │ │ │ ├── name: :bar - │ │ │ └── depth: 1 - │ │ └── operator_loc: (52,18)-(52,20) = ".." - │ └── operator_loc: (52,4)-(52,6) = "=>" - ├── @ LocalVariableWriteNode (location: (54,0)-(54,7)) - │ ├── flags: newline - │ ├── name: :bar - │ ├── depth: 0 - │ ├── name_loc: (54,0)-(54,3) = "bar" - │ ├── value: - │ │ @ IntegerNode (location: (54,6)-(54,7)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ └── operator_loc: (54,4)-(54,5) = "=" - ├── @ MatchRequiredNode (location: (54,9)-(54,20)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (54,9)-(54,12)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (54,9)-(54,12) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ PinnedVariableNode (location: (54,16)-(54,20)) - │ │ ├── flags: ∅ - │ │ ├── variable: - │ │ │ @ LocalVariableReadNode (location: (54,17)-(54,20)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :bar - │ │ │ └── depth: 0 - │ │ └── operator_loc: (54,16)-(54,17) = "^" - │ └── operator_loc: (54,13)-(54,15) = "=>" - ├── @ MatchRequiredNode (location: (55,0)-(55,12)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (55,0)-(55,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (55,0)-(55,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ PinnedVariableNode (location: (55,7)-(55,12)) - │ │ ├── flags: ∅ - │ │ ├── variable: - │ │ │ @ InstanceVariableReadNode (location: (55,8)-(55,12)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :@bar - │ │ └── operator_loc: (55,7)-(55,8) = "^" - │ └── operator_loc: (55,4)-(55,6) = "=>" - ├── @ MatchRequiredNode (location: (56,0)-(56,13)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (56,0)-(56,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (56,0)-(56,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ PinnedVariableNode (location: (56,7)-(56,13)) - │ │ ├── flags: ∅ - │ │ ├── variable: - │ │ │ @ ClassVariableReadNode (location: (56,8)-(56,13)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :@@bar - │ │ └── operator_loc: (56,7)-(56,8) = "^" - │ └── operator_loc: (56,4)-(56,6) = "=>" - ├── @ MatchRequiredNode (location: (57,0)-(57,12)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (57,0)-(57,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (57,0)-(57,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ PinnedVariableNode (location: (57,7)-(57,12)) - │ │ ├── flags: ∅ - │ │ ├── variable: - │ │ │ @ GlobalVariableReadNode (location: (57,8)-(57,12)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :$bar - │ │ └── operator_loc: (57,7)-(57,8) = "^" - │ └── operator_loc: (57,4)-(57,6) = "=>" - ├── @ MatchRequiredNode (location: (59,0)-(59,11)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (59,0)-(59,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (59,0)-(59,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ PinnedExpressionNode (location: (59,7)-(59,11)) - │ │ ├── flags: ∅ - │ │ ├── expression: - │ │ │ @ IntegerNode (location: (59,9)-(59,10)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── operator_loc: (59,7)-(59,8) = "^" - │ │ ├── lparen_loc: (59,8)-(59,9) = "(" - │ │ └── rparen_loc: (59,10)-(59,11) = ")" - │ └── operator_loc: (59,4)-(59,6) = "=>" - ├── @ MatchRequiredNode (location: (60,0)-(60,13)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (60,0)-(60,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (60,0)-(60,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ PinnedExpressionNode (location: (60,7)-(60,13)) - │ │ ├── flags: ∅ - │ │ ├── expression: - │ │ │ @ NilNode (location: (60,9)-(60,12)) - │ │ │ └── flags: static_literal - │ │ ├── operator_loc: (60,7)-(60,8) = "^" - │ │ ├── lparen_loc: (60,8)-(60,9) = "(" - │ │ └── rparen_loc: (60,12)-(60,13) = ")" - │ └── operator_loc: (60,4)-(60,6) = "=>" - ├── @ MatchRequiredNode (location: (61,0)-(61,23)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (61,0)-(61,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (61,0)-(61,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ PinnedExpressionNode (location: (61,7)-(61,23)) - │ │ ├── flags: ∅ - │ │ ├── expression: - │ │ │ @ CallNode (location: (61,9)-(61,22)) - │ │ │ ├── flags: ∅ - │ │ │ ├── receiver: - │ │ │ │ @ StringNode (location: (61,9)-(61,14)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── opening_loc: (61,9)-(61,10) = "\"" - │ │ │ │ ├── content_loc: (61,10)-(61,13) = "bar" - │ │ │ │ ├── closing_loc: (61,13)-(61,14) = "\"" - │ │ │ │ └── unescaped: "bar" - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :+ - │ │ │ ├── message_loc: (61,15)-(61,16) = "+" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (61,17)-(61,22)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ StringNode (location: (61,17)-(61,22)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── opening_loc: (61,17)-(61,18) = "\"" - │ │ │ │ ├── content_loc: (61,18)-(61,21) = "baz" - │ │ │ │ ├── closing_loc: (61,21)-(61,22) = "\"" - │ │ │ │ └── unescaped: "baz" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── operator_loc: (61,7)-(61,8) = "^" - │ │ ├── lparen_loc: (61,8)-(61,9) = "(" - │ │ └── rparen_loc: (61,22)-(61,23) = ")" - │ └── operator_loc: (61,4)-(61,6) = "=>" - ├── @ MatchRequiredNode (location: (63,0)-(63,10)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (63,0)-(63,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (63,0)-(63,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ ConstantReadNode (location: (63,7)-(63,10)) - │ │ ├── flags: ∅ - │ │ └── name: :Foo - │ └── operator_loc: (63,4)-(63,6) = "=>" - ├── @ MatchRequiredNode (location: (64,0)-(64,20)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (64,0)-(64,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (64,0)-(64,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ ConstantPathNode (location: (64,7)-(64,20)) - │ │ ├── flags: ∅ - │ │ ├── parent: - │ │ │ @ ConstantPathNode (location: (64,7)-(64,15)) - │ │ │ ├── flags: ∅ - │ │ │ ├── parent: - │ │ │ │ @ ConstantReadNode (location: (64,7)-(64,10)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :Foo - │ │ │ ├── name: :Bar - │ │ │ ├── delimiter_loc: (64,10)-(64,12) = "::" - │ │ │ └── name_loc: (64,12)-(64,15) = "Bar" - │ │ ├── name: :Baz - │ │ ├── delimiter_loc: (64,15)-(64,17) = "::" - │ │ └── name_loc: (64,17)-(64,20) = "Baz" - │ └── operator_loc: (64,4)-(64,6) = "=>" - ├── @ MatchRequiredNode (location: (65,0)-(65,12)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (65,0)-(65,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (65,0)-(65,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ ConstantPathNode (location: (65,7)-(65,12)) - │ │ ├── flags: ∅ - │ │ ├── parent: ∅ - │ │ ├── name: :Foo - │ │ ├── delimiter_loc: (65,7)-(65,9) = "::" - │ │ └── name_loc: (65,9)-(65,12) = "Foo" - │ └── operator_loc: (65,4)-(65,6) = "=>" - ├── @ MatchRequiredNode (location: (66,0)-(66,22)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (66,0)-(66,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (66,0)-(66,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ ConstantPathNode (location: (66,7)-(66,22)) - │ │ ├── flags: ∅ - │ │ ├── parent: - │ │ │ @ ConstantPathNode (location: (66,7)-(66,17)) - │ │ │ ├── flags: ∅ - │ │ │ ├── parent: - │ │ │ │ @ ConstantPathNode (location: (66,7)-(66,12)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── parent: ∅ - │ │ │ │ ├── name: :Foo - │ │ │ │ ├── delimiter_loc: (66,7)-(66,9) = "::" - │ │ │ │ └── name_loc: (66,9)-(66,12) = "Foo" - │ │ │ ├── name: :Bar - │ │ │ ├── delimiter_loc: (66,12)-(66,14) = "::" - │ │ │ └── name_loc: (66,14)-(66,17) = "Bar" - │ │ ├── name: :Baz - │ │ ├── delimiter_loc: (66,17)-(66,19) = "::" - │ │ └── name_loc: (66,19)-(66,22) = "Baz" - │ └── operator_loc: (66,4)-(66,6) = "=>" - ├── @ MatchRequiredNode (location: (68,0)-(68,12)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (68,0)-(68,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (68,0)-(68,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (68,7)-(68,12)) - │ │ ├── flags: ∅ - │ │ ├── constant: - │ │ │ @ ConstantReadNode (location: (68,7)-(68,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :Foo - │ │ ├── requireds: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── opening_loc: (68,10)-(68,11) = "(" - │ │ └── closing_loc: (68,11)-(68,12) = ")" - │ └── operator_loc: (68,4)-(68,6) = "=>" - ├── @ MatchRequiredNode (location: (69,0)-(69,13)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (69,0)-(69,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (69,0)-(69,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (69,7)-(69,13)) - │ │ ├── flags: ∅ - │ │ ├── constant: - │ │ │ @ ConstantReadNode (location: (69,7)-(69,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :Foo - │ │ ├── requireds: (length: 1) - │ │ │ └── @ IntegerNode (location: (69,11)-(69,12)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── opening_loc: (69,10)-(69,11) = "(" - │ │ └── closing_loc: (69,12)-(69,13) = ")" - │ └── operator_loc: (69,4)-(69,6) = "=>" - ├── @ MatchRequiredNode (location: (70,0)-(70,19)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (70,0)-(70,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (70,0)-(70,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (70,7)-(70,19)) - │ │ ├── flags: ∅ - │ │ ├── constant: - │ │ │ @ ConstantReadNode (location: (70,7)-(70,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :Foo - │ │ ├── requireds: (length: 3) - │ │ │ ├── @ IntegerNode (location: (70,11)-(70,12)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ ├── @ IntegerNode (location: (70,14)-(70,15)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 2 - │ │ │ └── @ IntegerNode (location: (70,17)-(70,18)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 3 - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── opening_loc: (70,10)-(70,11) = "(" - │ │ └── closing_loc: (70,18)-(70,19) = ")" - │ └── operator_loc: (70,4)-(70,6) = "=>" - ├── @ MatchRequiredNode (location: (71,0)-(71,15)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (71,0)-(71,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (71,0)-(71,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (71,7)-(71,15)) - │ │ ├── flags: ∅ - │ │ ├── constant: - │ │ │ @ ConstantReadNode (location: (71,7)-(71,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :Foo - │ │ ├── requireds: (length: 1) - │ │ │ └── @ LocalVariableTargetNode (location: (71,11)-(71,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :bar - │ │ │ └── depth: 0 - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── opening_loc: (71,10)-(71,11) = "(" - │ │ └── closing_loc: (71,14)-(71,15) = ")" - │ └── operator_loc: (71,4)-(71,6) = "=>" - ├── @ MatchRequiredNode (location: (72,0)-(72,21)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (72,0)-(72,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (72,0)-(72,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (72,7)-(72,21)) - │ │ ├── flags: ∅ - │ │ ├── constant: - │ │ │ @ ConstantReadNode (location: (72,7)-(72,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :Foo - │ │ ├── requireds: (length: 0) - │ │ ├── rest: - │ │ │ @ SplatNode (location: (72,11)-(72,15)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (72,11)-(72,12) = "*" - │ │ │ └── expression: - │ │ │ @ LocalVariableTargetNode (location: (72,12)-(72,15)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :bar - │ │ │ └── depth: 0 - │ │ ├── posts: (length: 1) - │ │ │ └── @ LocalVariableTargetNode (location: (72,17)-(72,20)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :baz - │ │ │ └── depth: 0 - │ │ ├── opening_loc: (72,10)-(72,11) = "(" - │ │ └── closing_loc: (72,20)-(72,21) = ")" - │ └── operator_loc: (72,4)-(72,6) = "=>" - ├── @ MatchRequiredNode (location: (73,0)-(73,21)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (73,0)-(73,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (73,0)-(73,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (73,7)-(73,21)) - │ │ ├── flags: ∅ - │ │ ├── constant: - │ │ │ @ ConstantReadNode (location: (73,7)-(73,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :Foo - │ │ ├── requireds: (length: 1) - │ │ │ └── @ LocalVariableTargetNode (location: (73,11)-(73,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :bar - │ │ │ └── depth: 0 - │ │ ├── rest: - │ │ │ @ SplatNode (location: (73,16)-(73,20)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (73,16)-(73,17) = "*" - │ │ │ └── expression: - │ │ │ @ LocalVariableTargetNode (location: (73,17)-(73,20)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :baz - │ │ │ └── depth: 0 - │ │ ├── posts: (length: 0) - │ │ ├── opening_loc: (73,10)-(73,11) = "(" - │ │ └── closing_loc: (73,20)-(73,21) = ")" - │ └── operator_loc: (73,4)-(73,6) = "=>" - ├── @ MatchRequiredNode (location: (74,0)-(74,27)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (74,0)-(74,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (74,0)-(74,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ FindPatternNode (location: (74,7)-(74,27)) - │ │ ├── flags: ∅ - │ │ ├── constant: - │ │ │ @ ConstantReadNode (location: (74,7)-(74,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :Foo - │ │ ├── left: - │ │ │ @ SplatNode (location: (74,11)-(74,15)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (74,11)-(74,12) = "*" - │ │ │ └── expression: - │ │ │ @ LocalVariableTargetNode (location: (74,12)-(74,15)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :bar - │ │ │ └── depth: 0 - │ │ ├── requireds: (length: 1) - │ │ │ └── @ LocalVariableTargetNode (location: (74,17)-(74,20)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :baz - │ │ │ └── depth: 0 - │ │ ├── right: - │ │ │ @ SplatNode (location: (74,22)-(74,26)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (74,22)-(74,23) = "*" - │ │ │ └── expression: - │ │ │ @ LocalVariableTargetNode (location: (74,23)-(74,26)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :qux - │ │ │ └── depth: 0 - │ │ ├── opening_loc: (74,10)-(74,11) = "(" - │ │ └── closing_loc: (74,26)-(74,27) = ")" - │ └── operator_loc: (74,4)-(74,6) = "=>" - ├── @ MatchRequiredNode (location: (76,0)-(76,12)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (76,0)-(76,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (76,0)-(76,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (76,7)-(76,12)) - │ │ ├── flags: ∅ - │ │ ├── constant: - │ │ │ @ ConstantReadNode (location: (76,7)-(76,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :Foo - │ │ ├── requireds: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── opening_loc: (76,10)-(76,11) = "[" - │ │ └── closing_loc: (76,11)-(76,12) = "]" - │ └── operator_loc: (76,4)-(76,6) = "=>" - ├── @ MatchRequiredNode (location: (77,0)-(77,13)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (77,0)-(77,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (77,0)-(77,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (77,7)-(77,13)) - │ │ ├── flags: ∅ - │ │ ├── constant: - │ │ │ @ ConstantReadNode (location: (77,7)-(77,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :Foo - │ │ ├── requireds: (length: 1) - │ │ │ └── @ IntegerNode (location: (77,11)-(77,12)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── opening_loc: (77,10)-(77,11) = "[" - │ │ └── closing_loc: (77,12)-(77,13) = "]" - │ └── operator_loc: (77,4)-(77,6) = "=>" - ├── @ MatchRequiredNode (location: (78,0)-(78,19)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (78,0)-(78,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (78,0)-(78,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (78,7)-(78,19)) - │ │ ├── flags: ∅ - │ │ ├── constant: - │ │ │ @ ConstantReadNode (location: (78,7)-(78,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :Foo - │ │ ├── requireds: (length: 3) - │ │ │ ├── @ IntegerNode (location: (78,11)-(78,12)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ ├── @ IntegerNode (location: (78,14)-(78,15)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 2 - │ │ │ └── @ IntegerNode (location: (78,17)-(78,18)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 3 - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── opening_loc: (78,10)-(78,11) = "[" - │ │ └── closing_loc: (78,18)-(78,19) = "]" - │ └── operator_loc: (78,4)-(78,6) = "=>" - ├── @ MatchRequiredNode (location: (79,0)-(79,17)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (79,0)-(79,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (79,0)-(79,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (79,7)-(79,17)) - │ │ ├── flags: ∅ - │ │ ├── constant: - │ │ │ @ ConstantReadNode (location: (79,7)-(79,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :Foo - │ │ ├── requireds: (length: 1) - │ │ │ └── @ ArrayPatternNode (location: (79,11)-(79,16)) - │ │ │ ├── flags: ∅ - │ │ │ ├── constant: - │ │ │ │ @ ConstantReadNode (location: (79,11)-(79,14)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :Foo - │ │ │ ├── requireds: (length: 0) - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── opening_loc: (79,14)-(79,15) = "[" - │ │ │ └── closing_loc: (79,15)-(79,16) = "]" - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── opening_loc: (79,10)-(79,11) = "[" - │ │ └── closing_loc: (79,16)-(79,17) = "]" - │ └── operator_loc: (79,4)-(79,6) = "=>" - ├── @ MatchRequiredNode (location: (80,0)-(80,15)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (80,0)-(80,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (80,0)-(80,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (80,7)-(80,15)) - │ │ ├── flags: ∅ - │ │ ├── constant: - │ │ │ @ ConstantReadNode (location: (80,7)-(80,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :Foo - │ │ ├── requireds: (length: 1) - │ │ │ └── @ LocalVariableTargetNode (location: (80,11)-(80,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :bar - │ │ │ └── depth: 0 - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── opening_loc: (80,10)-(80,11) = "[" - │ │ └── closing_loc: (80,14)-(80,15) = "]" - │ └── operator_loc: (80,4)-(80,6) = "=>" - ├── @ MatchRequiredNode (location: (81,0)-(81,21)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (81,0)-(81,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (81,0)-(81,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (81,7)-(81,21)) - │ │ ├── flags: ∅ - │ │ ├── constant: - │ │ │ @ ConstantReadNode (location: (81,7)-(81,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :Foo - │ │ ├── requireds: (length: 0) - │ │ ├── rest: - │ │ │ @ SplatNode (location: (81,11)-(81,15)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (81,11)-(81,12) = "*" - │ │ │ └── expression: - │ │ │ @ LocalVariableTargetNode (location: (81,12)-(81,15)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :bar - │ │ │ └── depth: 0 - │ │ ├── posts: (length: 1) - │ │ │ └── @ LocalVariableTargetNode (location: (81,17)-(81,20)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :baz - │ │ │ └── depth: 0 - │ │ ├── opening_loc: (81,10)-(81,11) = "[" - │ │ └── closing_loc: (81,20)-(81,21) = "]" - │ └── operator_loc: (81,4)-(81,6) = "=>" - ├── @ MatchRequiredNode (location: (82,0)-(82,21)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (82,0)-(82,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (82,0)-(82,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (82,7)-(82,21)) - │ │ ├── flags: ∅ - │ │ ├── constant: - │ │ │ @ ConstantReadNode (location: (82,7)-(82,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :Foo - │ │ ├── requireds: (length: 1) - │ │ │ └── @ LocalVariableTargetNode (location: (82,11)-(82,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :bar - │ │ │ └── depth: 0 - │ │ ├── rest: - │ │ │ @ SplatNode (location: (82,16)-(82,20)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (82,16)-(82,17) = "*" - │ │ │ └── expression: - │ │ │ @ LocalVariableTargetNode (location: (82,17)-(82,20)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :baz - │ │ │ └── depth: 0 - │ │ ├── posts: (length: 0) - │ │ ├── opening_loc: (82,10)-(82,11) = "[" - │ │ └── closing_loc: (82,20)-(82,21) = "]" - │ └── operator_loc: (82,4)-(82,6) = "=>" - ├── @ MatchRequiredNode (location: (83,0)-(83,27)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (83,0)-(83,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (83,0)-(83,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ FindPatternNode (location: (83,7)-(83,27)) - │ │ ├── flags: ∅ - │ │ ├── constant: - │ │ │ @ ConstantReadNode (location: (83,7)-(83,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :Foo - │ │ ├── left: - │ │ │ @ SplatNode (location: (83,11)-(83,15)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (83,11)-(83,12) = "*" - │ │ │ └── expression: - │ │ │ @ LocalVariableTargetNode (location: (83,12)-(83,15)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :bar - │ │ │ └── depth: 0 - │ │ ├── requireds: (length: 1) - │ │ │ └── @ LocalVariableTargetNode (location: (83,17)-(83,20)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :baz - │ │ │ └── depth: 0 - │ │ ├── right: - │ │ │ @ SplatNode (location: (83,22)-(83,26)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (83,22)-(83,23) = "*" - │ │ │ └── expression: - │ │ │ @ LocalVariableTargetNode (location: (83,23)-(83,26)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :qux - │ │ │ └── depth: 0 - │ │ ├── opening_loc: (83,10)-(83,11) = "[" - │ │ └── closing_loc: (83,26)-(83,27) = "]" - │ └── operator_loc: (83,4)-(83,6) = "=>" - ├── @ MatchRequiredNode (location: (85,0)-(85,11)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (85,0)-(85,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (85,0)-(85,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (85,7)-(85,11)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── rest: - │ │ │ @ SplatNode (location: (85,7)-(85,11)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (85,7)-(85,8) = "*" - │ │ │ └── expression: - │ │ │ @ LocalVariableTargetNode (location: (85,8)-(85,11)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :bar - │ │ │ └── depth: 0 - │ │ ├── posts: (length: 0) - │ │ ├── opening_loc: ∅ - │ │ └── closing_loc: ∅ - │ └── operator_loc: (85,4)-(85,6) = "=>" - ├── @ MatchRequiredNode (location: (86,0)-(86,21)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (86,0)-(86,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (86,0)-(86,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (86,7)-(86,21)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── rest: - │ │ │ @ SplatNode (location: (86,7)-(86,11)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (86,7)-(86,8) = "*" - │ │ │ └── expression: - │ │ │ @ LocalVariableTargetNode (location: (86,8)-(86,11)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :bar - │ │ │ └── depth: 0 - │ │ ├── posts: (length: 2) - │ │ │ ├── @ LocalVariableTargetNode (location: (86,13)-(86,16)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ └── depth: 0 - │ │ │ └── @ LocalVariableTargetNode (location: (86,18)-(86,21)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :qux - │ │ │ └── depth: 0 - │ │ ├── opening_loc: ∅ - │ │ └── closing_loc: ∅ - │ └── operator_loc: (86,4)-(86,6) = "=>" - ├── @ MatchRequiredNode (location: (87,0)-(87,21)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (87,0)-(87,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (87,0)-(87,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (87,7)-(87,21)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ LocalVariableTargetNode (location: (87,7)-(87,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :bar - │ │ │ └── depth: 0 - │ │ ├── rest: - │ │ │ @ SplatNode (location: (87,12)-(87,16)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (87,12)-(87,13) = "*" - │ │ │ └── expression: - │ │ │ @ LocalVariableTargetNode (location: (87,13)-(87,16)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :baz - │ │ │ └── depth: 0 - │ │ ├── posts: (length: 1) - │ │ │ └── @ LocalVariableTargetNode (location: (87,18)-(87,21)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :qux - │ │ │ └── depth: 0 - │ │ ├── opening_loc: ∅ - │ │ └── closing_loc: ∅ - │ └── operator_loc: (87,4)-(87,6) = "=>" - ├── @ MatchRequiredNode (location: (88,0)-(88,21)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (88,0)-(88,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (88,0)-(88,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (88,7)-(88,21)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── requireds: (length: 2) - │ │ │ ├── @ LocalVariableTargetNode (location: (88,7)-(88,10)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :bar - │ │ │ │ └── depth: 0 - │ │ │ └── @ LocalVariableTargetNode (location: (88,12)-(88,15)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :baz - │ │ │ └── depth: 0 - │ │ ├── rest: - │ │ │ @ SplatNode (location: (88,17)-(88,21)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (88,17)-(88,18) = "*" - │ │ │ └── expression: - │ │ │ @ LocalVariableTargetNode (location: (88,18)-(88,21)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :qux - │ │ │ └── depth: 0 - │ │ ├── posts: (length: 0) - │ │ ├── opening_loc: ∅ - │ │ └── closing_loc: ∅ - │ └── operator_loc: (88,4)-(88,6) = "=>" - ├── @ MatchRequiredNode (location: (89,0)-(89,22)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (89,0)-(89,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (89,0)-(89,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ FindPatternNode (location: (89,7)-(89,22)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── left: - │ │ │ @ SplatNode (location: (89,7)-(89,11)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (89,7)-(89,8) = "*" - │ │ │ └── expression: - │ │ │ @ LocalVariableTargetNode (location: (89,8)-(89,11)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :bar - │ │ │ └── depth: 0 - │ │ ├── requireds: (length: 1) - │ │ │ └── @ LocalVariableTargetNode (location: (89,13)-(89,16)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :baz - │ │ │ └── depth: 0 - │ │ ├── right: - │ │ │ @ SplatNode (location: (89,18)-(89,22)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (89,18)-(89,19) = "*" - │ │ │ └── expression: - │ │ │ @ LocalVariableTargetNode (location: (89,19)-(89,22)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :qux - │ │ │ └── depth: 0 - │ │ ├── opening_loc: ∅ - │ │ └── closing_loc: ∅ - │ └── operator_loc: (89,4)-(89,6) = "=>" - ├── @ MatchRequiredNode (location: (91,0)-(91,11)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (91,0)-(91,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (91,0)-(91,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (91,7)-(91,11)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ LocalVariableTargetNode (location: (91,7)-(91,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :bar - │ │ │ └── depth: 0 - │ │ ├── rest: - │ │ │ @ ImplicitRestNode (location: (91,10)-(91,11)) - │ │ │ └── flags: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── opening_loc: ∅ - │ │ └── closing_loc: ∅ - │ └── operator_loc: (91,4)-(91,6) = "=>" - ├── @ MatchRequiredNode (location: (95,0)-(95,9)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (95,0)-(95,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (95,0)-(95,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (95,7)-(95,9)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── opening_loc: (95,7)-(95,8) = "[" - │ │ └── closing_loc: (95,8)-(95,9) = "]" - │ └── operator_loc: (95,4)-(95,6) = "=>" - ├── @ MatchRequiredNode (location: (96,0)-(96,17)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (96,0)-(96,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (96,0)-(96,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (96,7)-(96,17)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ ArrayPatternNode (location: (96,8)-(96,16)) - │ │ │ ├── flags: ∅ - │ │ │ ├── constant: ∅ - │ │ │ ├── requireds: (length: 1) - │ │ │ │ └── @ ArrayPatternNode (location: (96,9)-(96,15)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── constant: ∅ - │ │ │ │ ├── requireds: (length: 1) - │ │ │ │ │ └── @ ArrayPatternNode (location: (96,10)-(96,14)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── constant: ∅ - │ │ │ │ │ ├── requireds: (length: 1) - │ │ │ │ │ │ └── @ ArrayPatternNode (location: (96,11)-(96,13)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ ├── constant: ∅ - │ │ │ │ │ │ ├── requireds: (length: 0) - │ │ │ │ │ │ ├── rest: ∅ - │ │ │ │ │ │ ├── posts: (length: 0) - │ │ │ │ │ │ ├── opening_loc: (96,11)-(96,12) = "[" - │ │ │ │ │ │ └── closing_loc: (96,12)-(96,13) = "]" - │ │ │ │ │ ├── rest: ∅ - │ │ │ │ │ ├── posts: (length: 0) - │ │ │ │ │ ├── opening_loc: (96,10)-(96,11) = "[" - │ │ │ │ │ └── closing_loc: (96,13)-(96,14) = "]" - │ │ │ │ ├── rest: ∅ - │ │ │ │ ├── posts: (length: 0) - │ │ │ │ ├── opening_loc: (96,9)-(96,10) = "[" - │ │ │ │ └── closing_loc: (96,14)-(96,15) = "]" - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── opening_loc: (96,8)-(96,9) = "[" - │ │ │ └── closing_loc: (96,15)-(96,16) = "]" - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── opening_loc: (96,7)-(96,8) = "[" - │ │ └── closing_loc: (96,16)-(96,17) = "]" - │ └── operator_loc: (96,4)-(96,6) = "=>" - ├── @ MatchRequiredNode (location: (98,0)-(98,13)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (98,0)-(98,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (98,0)-(98,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (98,7)-(98,13)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── rest: - │ │ │ @ SplatNode (location: (98,8)-(98,12)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (98,8)-(98,9) = "*" - │ │ │ └── expression: - │ │ │ @ LocalVariableTargetNode (location: (98,9)-(98,12)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :bar - │ │ │ └── depth: 0 - │ │ ├── posts: (length: 0) - │ │ ├── opening_loc: (98,7)-(98,8) = "[" - │ │ └── closing_loc: (98,12)-(98,13) = "]" - │ └── operator_loc: (98,4)-(98,6) = "=>" - ├── @ MatchRequiredNode (location: (99,0)-(99,23)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (99,0)-(99,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (99,0)-(99,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (99,7)-(99,23)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── rest: - │ │ │ @ SplatNode (location: (99,8)-(99,12)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (99,8)-(99,9) = "*" - │ │ │ └── expression: - │ │ │ @ LocalVariableTargetNode (location: (99,9)-(99,12)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :bar - │ │ │ └── depth: 0 - │ │ ├── posts: (length: 2) - │ │ │ ├── @ LocalVariableTargetNode (location: (99,14)-(99,17)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ └── depth: 0 - │ │ │ └── @ LocalVariableTargetNode (location: (99,19)-(99,22)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :qux - │ │ │ └── depth: 0 - │ │ ├── opening_loc: (99,7)-(99,8) = "[" - │ │ └── closing_loc: (99,22)-(99,23) = "]" - │ └── operator_loc: (99,4)-(99,6) = "=>" - ├── @ MatchRequiredNode (location: (100,0)-(100,23)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (100,0)-(100,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (100,0)-(100,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (100,7)-(100,23)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ LocalVariableTargetNode (location: (100,8)-(100,11)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :bar - │ │ │ └── depth: 0 - │ │ ├── rest: - │ │ │ @ SplatNode (location: (100,13)-(100,17)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (100,13)-(100,14) = "*" - │ │ │ └── expression: - │ │ │ @ LocalVariableTargetNode (location: (100,14)-(100,17)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :baz - │ │ │ └── depth: 0 - │ │ ├── posts: (length: 1) - │ │ │ └── @ LocalVariableTargetNode (location: (100,19)-(100,22)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :qux - │ │ │ └── depth: 0 - │ │ ├── opening_loc: (100,7)-(100,8) = "[" - │ │ └── closing_loc: (100,22)-(100,23) = "]" - │ └── operator_loc: (100,4)-(100,6) = "=>" - ├── @ MatchRequiredNode (location: (101,0)-(101,23)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (101,0)-(101,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (101,0)-(101,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (101,7)-(101,23)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── requireds: (length: 2) - │ │ │ ├── @ LocalVariableTargetNode (location: (101,8)-(101,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :bar - │ │ │ │ └── depth: 0 - │ │ │ └── @ LocalVariableTargetNode (location: (101,13)-(101,16)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :baz - │ │ │ └── depth: 0 - │ │ ├── rest: - │ │ │ @ SplatNode (location: (101,18)-(101,22)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (101,18)-(101,19) = "*" - │ │ │ └── expression: - │ │ │ @ LocalVariableTargetNode (location: (101,19)-(101,22)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :qux - │ │ │ └── depth: 0 - │ │ ├── posts: (length: 0) - │ │ ├── opening_loc: (101,7)-(101,8) = "[" - │ │ └── closing_loc: (101,22)-(101,23) = "]" - │ └── operator_loc: (101,4)-(101,6) = "=>" - ├── @ MatchRequiredNode (location: (102,0)-(102,24)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (102,0)-(102,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (102,0)-(102,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ FindPatternNode (location: (102,7)-(102,24)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── left: - │ │ │ @ SplatNode (location: (102,8)-(102,12)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (102,8)-(102,9) = "*" - │ │ │ └── expression: - │ │ │ @ LocalVariableTargetNode (location: (102,9)-(102,12)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :bar - │ │ │ └── depth: 0 - │ │ ├── requireds: (length: 1) - │ │ │ └── @ LocalVariableTargetNode (location: (102,14)-(102,17)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :baz - │ │ │ └── depth: 0 - │ │ ├── right: - │ │ │ @ SplatNode (location: (102,19)-(102,23)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (102,19)-(102,20) = "*" - │ │ │ └── expression: - │ │ │ @ LocalVariableTargetNode (location: (102,20)-(102,23)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :qux - │ │ │ └── depth: 0 - │ │ ├── opening_loc: (102,7)-(102,8) = "[" - │ │ └── closing_loc: (102,23)-(102,24) = "]" - │ └── operator_loc: (102,4)-(102,6) = "=>" - ├── @ MatchPredicateNode (location: (104,0)-(104,10)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (104,0)-(104,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (104,0)-(104,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ LocalVariableTargetNode (location: (104,7)-(104,10)) - │ │ ├── flags: ∅ - │ │ ├── name: :bar - │ │ └── depth: 0 - │ └── operator_loc: (104,4)-(104,6) = "in" - ├── @ MatchPredicateNode (location: (105,0)-(105,8)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (105,0)-(105,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (105,0)-(105,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ IntegerNode (location: (105,7)-(105,8)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ └── operator_loc: (105,4)-(105,6) = "in" - ├── @ MatchPredicateNode (location: (106,0)-(106,10)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (106,0)-(106,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (106,0)-(106,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ FloatNode (location: (106,7)-(106,10)) - │ │ ├── flags: static_literal - │ │ └── value: 1.0 - │ └── operator_loc: (106,4)-(106,6) = "in" - ├── @ MatchPredicateNode (location: (107,0)-(107,9)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (107,0)-(107,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (107,0)-(107,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ ImaginaryNode (location: (107,7)-(107,9)) - │ │ ├── flags: static_literal - │ │ └── numeric: - │ │ @ IntegerNode (location: (107,7)-(107,8)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ └── operator_loc: (107,4)-(107,6) = "in" - ├── @ MatchPredicateNode (location: (108,0)-(108,9)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (108,0)-(108,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (108,0)-(108,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ RationalNode (location: (108,7)-(108,9)) - │ │ ├── flags: static_literal, decimal - │ │ ├── numerator: 1 - │ │ └── denominator: 1 - │ └── operator_loc: (108,4)-(108,6) = "in" - ├── @ MatchPredicateNode (location: (109,0)-(109,11)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (109,0)-(109,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (109,0)-(109,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ SymbolNode (location: (109,7)-(109,11)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (109,7)-(109,8) = ":" - │ │ ├── value_loc: (109,8)-(109,11) = "foo" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "foo" - │ └── operator_loc: (109,4)-(109,6) = "in" - ├── @ MatchPredicateNode (location: (110,0)-(110,14)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (110,0)-(110,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (110,0)-(110,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ SymbolNode (location: (110,7)-(110,14)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (110,7)-(110,10) = "%s[" - │ │ ├── value_loc: (110,10)-(110,13) = "foo" - │ │ ├── closing_loc: (110,13)-(110,14) = "]" - │ │ └── unescaped: "foo" - │ └── operator_loc: (110,4)-(110,6) = "in" - ├── @ MatchPredicateNode (location: (111,0)-(111,13)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (111,0)-(111,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (111,0)-(111,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ SymbolNode (location: (111,7)-(111,13)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (111,7)-(111,9) = ":\"" - │ │ ├── value_loc: (111,9)-(111,12) = "foo" - │ │ ├── closing_loc: (111,12)-(111,13) = "\"" - │ │ └── unescaped: "foo" - │ └── operator_loc: (111,4)-(111,6) = "in" - ├── @ MatchPredicateNode (location: (112,0)-(112,12)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (112,0)-(112,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (112,0)-(112,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ RegularExpressionNode (location: (112,7)-(112,12)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (112,7)-(112,8) = "/" - │ │ ├── content_loc: (112,8)-(112,11) = "foo" - │ │ ├── closing_loc: (112,11)-(112,12) = "/" - │ │ └── unescaped: "foo" - │ └── operator_loc: (112,4)-(112,6) = "in" - ├── @ MatchPredicateNode (location: (113,0)-(113,12)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (113,0)-(113,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (113,0)-(113,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ XStringNode (location: (113,7)-(113,12)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (113,7)-(113,8) = "`" - │ │ ├── content_loc: (113,8)-(113,11) = "foo" - │ │ ├── closing_loc: (113,11)-(113,12) = "`" - │ │ └── unescaped: "foo" - │ └── operator_loc: (113,4)-(113,6) = "in" - ├── @ MatchPredicateNode (location: (114,0)-(114,14)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (114,0)-(114,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (114,0)-(114,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ XStringNode (location: (114,7)-(114,14)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (114,7)-(114,10) = "%x[" - │ │ ├── content_loc: (114,10)-(114,13) = "foo" - │ │ ├── closing_loc: (114,13)-(114,14) = "]" - │ │ └── unescaped: "foo" - │ └── operator_loc: (114,4)-(114,6) = "in" - ├── @ MatchPredicateNode (location: (115,0)-(115,14)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (115,0)-(115,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (115,0)-(115,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ ArrayNode (location: (115,7)-(115,14)) - │ │ ├── flags: static_literal - │ │ ├── elements: (length: 1) - │ │ │ └── @ SymbolNode (location: (115,10)-(115,13)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (115,10)-(115,13) = "foo" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "foo" - │ │ ├── opening_loc: (115,7)-(115,10) = "%i[" - │ │ └── closing_loc: (115,13)-(115,14) = "]" - │ └── operator_loc: (115,4)-(115,6) = "in" - ├── @ MatchPredicateNode (location: (116,0)-(116,14)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (116,0)-(116,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (116,0)-(116,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ ArrayNode (location: (116,7)-(116,14)) - │ │ ├── flags: static_literal - │ │ ├── elements: (length: 1) - │ │ │ └── @ SymbolNode (location: (116,10)-(116,13)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (116,10)-(116,13) = "foo" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "foo" - │ │ ├── opening_loc: (116,7)-(116,10) = "%I[" - │ │ └── closing_loc: (116,13)-(116,14) = "]" - │ └── operator_loc: (116,4)-(116,6) = "in" - ├── @ MatchPredicateNode (location: (117,0)-(117,14)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (117,0)-(117,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (117,0)-(117,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ ArrayNode (location: (117,7)-(117,14)) - │ │ ├── flags: ∅ - │ │ ├── elements: (length: 1) - │ │ │ └── @ StringNode (location: (117,10)-(117,13)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (117,10)-(117,13) = "foo" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "foo" - │ │ ├── opening_loc: (117,7)-(117,10) = "%w[" - │ │ └── closing_loc: (117,13)-(117,14) = "]" - │ └── operator_loc: (117,4)-(117,6) = "in" - ├── @ MatchPredicateNode (location: (118,0)-(118,14)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (118,0)-(118,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (118,0)-(118,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ ArrayNode (location: (118,7)-(118,14)) - │ │ ├── flags: ∅ - │ │ ├── elements: (length: 1) - │ │ │ └── @ StringNode (location: (118,10)-(118,13)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (118,10)-(118,13) = "foo" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "foo" - │ │ ├── opening_loc: (118,7)-(118,10) = "%W[" - │ │ └── closing_loc: (118,13)-(118,14) = "]" - │ └── operator_loc: (118,4)-(118,6) = "in" - ├── @ MatchPredicateNode (location: (119,0)-(119,14)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (119,0)-(119,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (119,0)-(119,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ StringNode (location: (119,7)-(119,14)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (119,7)-(119,10) = "%q[" - │ │ ├── content_loc: (119,10)-(119,13) = "foo" - │ │ ├── closing_loc: (119,13)-(119,14) = "]" - │ │ └── unescaped: "foo" - │ └── operator_loc: (119,4)-(119,6) = "in" - ├── @ MatchPredicateNode (location: (120,0)-(120,14)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (120,0)-(120,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (120,0)-(120,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ StringNode (location: (120,7)-(120,14)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (120,7)-(120,10) = "%Q[" - │ │ ├── content_loc: (120,10)-(120,13) = "foo" - │ │ ├── closing_loc: (120,13)-(120,14) = "]" - │ │ └── unescaped: "foo" - │ └── operator_loc: (120,4)-(120,6) = "in" - ├── @ MatchPredicateNode (location: (121,0)-(121,12)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (121,0)-(121,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (121,0)-(121,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ StringNode (location: (121,7)-(121,12)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (121,7)-(121,8) = "\"" - │ │ ├── content_loc: (121,8)-(121,11) = "foo" - │ │ ├── closing_loc: (121,11)-(121,12) = "\"" - │ │ └── unescaped: "foo" - │ └── operator_loc: (121,4)-(121,6) = "in" - ├── @ MatchPredicateNode (location: (122,0)-(122,10)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (122,0)-(122,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (122,0)-(122,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ NilNode (location: (122,7)-(122,10)) - │ │ └── flags: static_literal - │ └── operator_loc: (122,4)-(122,6) = "in" - ├── @ MatchPredicateNode (location: (123,0)-(123,11)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (123,0)-(123,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (123,0)-(123,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ SelfNode (location: (123,7)-(123,11)) - │ │ └── flags: ∅ - │ └── operator_loc: (123,4)-(123,6) = "in" - ├── @ MatchPredicateNode (location: (124,0)-(124,11)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (124,0)-(124,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (124,0)-(124,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ TrueNode (location: (124,7)-(124,11)) - │ │ └── flags: static_literal - │ └── operator_loc: (124,4)-(124,6) = "in" - ├── @ MatchPredicateNode (location: (125,0)-(125,12)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (125,0)-(125,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (125,0)-(125,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ FalseNode (location: (125,7)-(125,12)) - │ │ └── flags: static_literal - │ └── operator_loc: (125,4)-(125,6) = "in" - ├── @ MatchPredicateNode (location: (126,0)-(126,15)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (126,0)-(126,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (126,0)-(126,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ SourceFileNode (location: (126,7)-(126,15)) - │ │ ├── flags: ∅ - │ │ └── filepath: "patterns.txt" - │ └── operator_loc: (126,4)-(126,6) = "in" - ├── @ MatchPredicateNode (location: (127,0)-(127,15)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (127,0)-(127,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (127,0)-(127,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ SourceLineNode (location: (127,7)-(127,15)) - │ │ └── flags: static_literal - │ └── operator_loc: (127,4)-(127,6) = "in" - ├── @ MatchPredicateNode (location: (128,0)-(128,19)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (128,0)-(128,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (128,0)-(128,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ SourceEncodingNode (location: (128,7)-(128,19)) - │ │ └── flags: static_literal - │ └── operator_loc: (128,4)-(128,6) = "in" - ├── @ MatchPredicateNode (location: (129,0)-(129,17)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (129,0)-(129,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (129,0)-(129,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ LambdaNode (location: (129,7)-(129,17)) - │ │ ├── flags: ∅ - │ │ ├── locals: [] - │ │ ├── operator_loc: (129,7)-(129,9) = "->" - │ │ ├── opening_loc: (129,10)-(129,11) = "{" - │ │ ├── closing_loc: (129,16)-(129,17) = "}" - │ │ ├── parameters: ∅ - │ │ └── body: - │ │ @ StatementsNode (location: (129,12)-(129,15)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ LocalVariableReadNode (location: (129,12)-(129,15)) - │ │ ├── flags: newline - │ │ ├── name: :bar - │ │ └── depth: 1 - │ └── operator_loc: (129,4)-(129,6) = "in" - ├── @ MatchPredicateNode (location: (131,0)-(131,11)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (131,0)-(131,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (131,0)-(131,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (131,7)-(131,11)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ LocalVariableTargetNode (location: (131,7)-(131,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :bar - │ │ │ └── depth: 0 - │ │ ├── rest: - │ │ │ @ ImplicitRestNode (location: (131,10)-(131,11)) - │ │ │ └── flags: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── opening_loc: ∅ - │ │ └── closing_loc: ∅ - │ └── operator_loc: (131,4)-(131,6) = "in" - ├── @ CaseMatchNode (location: (135,0)-(135,25)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (135,5)-(135,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (135,5)-(135,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (135,10)-(135,21)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ LocalVariableTargetNode (location: (135,13)-(135,16)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :bar - │ │ │ └── depth: 0 - │ │ ├── statements: ∅ - │ │ ├── in_loc: (135,10)-(135,12) = "in" - │ │ └── then_loc: (135,17)-(135,21) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (135,0)-(135,4) = "case" - │ └── end_keyword_loc: (135,22)-(135,25) = "end" - ├── @ CaseMatchNode (location: (136,0)-(136,23)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (136,5)-(136,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (136,5)-(136,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (136,10)-(136,19)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ IntegerNode (location: (136,13)-(136,14)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── statements: ∅ - │ │ ├── in_loc: (136,10)-(136,12) = "in" - │ │ └── then_loc: (136,15)-(136,19) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (136,0)-(136,4) = "case" - │ └── end_keyword_loc: (136,20)-(136,23) = "end" - ├── @ CaseMatchNode (location: (137,0)-(137,25)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (137,5)-(137,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (137,5)-(137,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (137,10)-(137,21)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ FloatNode (location: (137,13)-(137,16)) - │ │ │ ├── flags: static_literal - │ │ │ └── value: 1.0 - │ │ ├── statements: ∅ - │ │ ├── in_loc: (137,10)-(137,12) = "in" - │ │ └── then_loc: (137,17)-(137,21) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (137,0)-(137,4) = "case" - │ └── end_keyword_loc: (137,22)-(137,25) = "end" - ├── @ CaseMatchNode (location: (138,0)-(138,24)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (138,5)-(138,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (138,5)-(138,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (138,10)-(138,20)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ ImaginaryNode (location: (138,13)-(138,15)) - │ │ │ ├── flags: static_literal - │ │ │ └── numeric: - │ │ │ @ IntegerNode (location: (138,13)-(138,14)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── statements: ∅ - │ │ ├── in_loc: (138,10)-(138,12) = "in" - │ │ └── then_loc: (138,16)-(138,20) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (138,0)-(138,4) = "case" - │ └── end_keyword_loc: (138,21)-(138,24) = "end" - ├── @ CaseMatchNode (location: (139,0)-(139,24)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (139,5)-(139,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (139,5)-(139,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (139,10)-(139,20)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ RationalNode (location: (139,13)-(139,15)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ ├── numerator: 1 - │ │ │ └── denominator: 1 - │ │ ├── statements: ∅ - │ │ ├── in_loc: (139,10)-(139,12) = "in" - │ │ └── then_loc: (139,16)-(139,20) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (139,0)-(139,4) = "case" - │ └── end_keyword_loc: (139,21)-(139,24) = "end" - ├── @ CaseMatchNode (location: (140,0)-(140,26)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (140,5)-(140,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (140,5)-(140,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (140,10)-(140,22)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ SymbolNode (location: (140,13)-(140,17)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (140,13)-(140,14) = ":" - │ │ │ ├── value_loc: (140,14)-(140,17) = "foo" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "foo" - │ │ ├── statements: ∅ - │ │ ├── in_loc: (140,10)-(140,12) = "in" - │ │ └── then_loc: (140,18)-(140,22) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (140,0)-(140,4) = "case" - │ └── end_keyword_loc: (140,23)-(140,26) = "end" - ├── @ CaseMatchNode (location: (141,0)-(141,29)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (141,5)-(141,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (141,5)-(141,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (141,10)-(141,25)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ SymbolNode (location: (141,13)-(141,20)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (141,13)-(141,16) = "%s[" - │ │ │ ├── value_loc: (141,16)-(141,19) = "foo" - │ │ │ ├── closing_loc: (141,19)-(141,20) = "]" - │ │ │ └── unescaped: "foo" - │ │ ├── statements: ∅ - │ │ ├── in_loc: (141,10)-(141,12) = "in" - │ │ └── then_loc: (141,21)-(141,25) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (141,0)-(141,4) = "case" - │ └── end_keyword_loc: (141,26)-(141,29) = "end" - ├── @ CaseMatchNode (location: (142,0)-(142,28)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (142,5)-(142,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (142,5)-(142,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (142,10)-(142,24)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ SymbolNode (location: (142,13)-(142,19)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (142,13)-(142,15) = ":\"" - │ │ │ ├── value_loc: (142,15)-(142,18) = "foo" - │ │ │ ├── closing_loc: (142,18)-(142,19) = "\"" - │ │ │ └── unescaped: "foo" - │ │ ├── statements: ∅ - │ │ ├── in_loc: (142,10)-(142,12) = "in" - │ │ └── then_loc: (142,20)-(142,24) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (142,0)-(142,4) = "case" - │ └── end_keyword_loc: (142,25)-(142,28) = "end" - ├── @ CaseMatchNode (location: (143,0)-(143,27)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (143,5)-(143,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (143,5)-(143,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (143,10)-(143,23)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ RegularExpressionNode (location: (143,13)-(143,18)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (143,13)-(143,14) = "/" - │ │ │ ├── content_loc: (143,14)-(143,17) = "foo" - │ │ │ ├── closing_loc: (143,17)-(143,18) = "/" - │ │ │ └── unescaped: "foo" - │ │ ├── statements: ∅ - │ │ ├── in_loc: (143,10)-(143,12) = "in" - │ │ └── then_loc: (143,19)-(143,23) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (143,0)-(143,4) = "case" - │ └── end_keyword_loc: (143,24)-(143,27) = "end" - ├── @ CaseMatchNode (location: (144,0)-(144,27)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (144,5)-(144,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (144,5)-(144,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (144,10)-(144,23)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ XStringNode (location: (144,13)-(144,18)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (144,13)-(144,14) = "`" - │ │ │ ├── content_loc: (144,14)-(144,17) = "foo" - │ │ │ ├── closing_loc: (144,17)-(144,18) = "`" - │ │ │ └── unescaped: "foo" - │ │ ├── statements: ∅ - │ │ ├── in_loc: (144,10)-(144,12) = "in" - │ │ └── then_loc: (144,19)-(144,23) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (144,0)-(144,4) = "case" - │ └── end_keyword_loc: (144,24)-(144,27) = "end" - ├── @ CaseMatchNode (location: (145,0)-(145,29)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (145,5)-(145,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (145,5)-(145,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (145,10)-(145,25)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ XStringNode (location: (145,13)-(145,20)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (145,13)-(145,16) = "%x[" - │ │ │ ├── content_loc: (145,16)-(145,19) = "foo" - │ │ │ ├── closing_loc: (145,19)-(145,20) = "]" - │ │ │ └── unescaped: "foo" - │ │ ├── statements: ∅ - │ │ ├── in_loc: (145,10)-(145,12) = "in" - │ │ └── then_loc: (145,21)-(145,25) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (145,0)-(145,4) = "case" - │ └── end_keyword_loc: (145,26)-(145,29) = "end" - ├── @ CaseMatchNode (location: (146,0)-(146,29)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (146,5)-(146,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (146,5)-(146,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (146,10)-(146,25)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ ArrayNode (location: (146,13)-(146,20)) - │ │ │ ├── flags: static_literal - │ │ │ ├── elements: (length: 1) - │ │ │ │ └── @ SymbolNode (location: (146,16)-(146,19)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── value_loc: (146,16)-(146,19) = "foo" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "foo" - │ │ │ ├── opening_loc: (146,13)-(146,16) = "%i[" - │ │ │ └── closing_loc: (146,19)-(146,20) = "]" - │ │ ├── statements: ∅ - │ │ ├── in_loc: (146,10)-(146,12) = "in" - │ │ └── then_loc: (146,21)-(146,25) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (146,0)-(146,4) = "case" - │ └── end_keyword_loc: (146,26)-(146,29) = "end" - ├── @ CaseMatchNode (location: (147,0)-(147,29)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (147,5)-(147,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (147,5)-(147,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (147,10)-(147,25)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ ArrayNode (location: (147,13)-(147,20)) - │ │ │ ├── flags: static_literal - │ │ │ ├── elements: (length: 1) - │ │ │ │ └── @ SymbolNode (location: (147,16)-(147,19)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── value_loc: (147,16)-(147,19) = "foo" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "foo" - │ │ │ ├── opening_loc: (147,13)-(147,16) = "%I[" - │ │ │ └── closing_loc: (147,19)-(147,20) = "]" - │ │ ├── statements: ∅ - │ │ ├── in_loc: (147,10)-(147,12) = "in" - │ │ └── then_loc: (147,21)-(147,25) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (147,0)-(147,4) = "case" - │ └── end_keyword_loc: (147,26)-(147,29) = "end" - ├── @ CaseMatchNode (location: (148,0)-(148,29)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (148,5)-(148,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (148,5)-(148,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (148,10)-(148,25)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ ArrayNode (location: (148,13)-(148,20)) - │ │ │ ├── flags: ∅ - │ │ │ ├── elements: (length: 1) - │ │ │ │ └── @ StringNode (location: (148,16)-(148,19)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── content_loc: (148,16)-(148,19) = "foo" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "foo" - │ │ │ ├── opening_loc: (148,13)-(148,16) = "%w[" - │ │ │ └── closing_loc: (148,19)-(148,20) = "]" - │ │ ├── statements: ∅ - │ │ ├── in_loc: (148,10)-(148,12) = "in" - │ │ └── then_loc: (148,21)-(148,25) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (148,0)-(148,4) = "case" - │ └── end_keyword_loc: (148,26)-(148,29) = "end" - ├── @ CaseMatchNode (location: (149,0)-(149,29)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (149,5)-(149,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (149,5)-(149,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (149,10)-(149,25)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ ArrayNode (location: (149,13)-(149,20)) - │ │ │ ├── flags: ∅ - │ │ │ ├── elements: (length: 1) - │ │ │ │ └── @ StringNode (location: (149,16)-(149,19)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── content_loc: (149,16)-(149,19) = "foo" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "foo" - │ │ │ ├── opening_loc: (149,13)-(149,16) = "%W[" - │ │ │ └── closing_loc: (149,19)-(149,20) = "]" - │ │ ├── statements: ∅ - │ │ ├── in_loc: (149,10)-(149,12) = "in" - │ │ └── then_loc: (149,21)-(149,25) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (149,0)-(149,4) = "case" - │ └── end_keyword_loc: (149,26)-(149,29) = "end" - ├── @ CaseMatchNode (location: (150,0)-(150,29)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (150,5)-(150,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (150,5)-(150,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (150,10)-(150,25)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ StringNode (location: (150,13)-(150,20)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (150,13)-(150,16) = "%q[" - │ │ │ ├── content_loc: (150,16)-(150,19) = "foo" - │ │ │ ├── closing_loc: (150,19)-(150,20) = "]" - │ │ │ └── unescaped: "foo" - │ │ ├── statements: ∅ - │ │ ├── in_loc: (150,10)-(150,12) = "in" - │ │ └── then_loc: (150,21)-(150,25) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (150,0)-(150,4) = "case" - │ └── end_keyword_loc: (150,26)-(150,29) = "end" - ├── @ CaseMatchNode (location: (151,0)-(151,29)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (151,5)-(151,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (151,5)-(151,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (151,10)-(151,25)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ StringNode (location: (151,13)-(151,20)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (151,13)-(151,16) = "%Q[" - │ │ │ ├── content_loc: (151,16)-(151,19) = "foo" - │ │ │ ├── closing_loc: (151,19)-(151,20) = "]" - │ │ │ └── unescaped: "foo" - │ │ ├── statements: ∅ - │ │ ├── in_loc: (151,10)-(151,12) = "in" - │ │ └── then_loc: (151,21)-(151,25) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (151,0)-(151,4) = "case" - │ └── end_keyword_loc: (151,26)-(151,29) = "end" - ├── @ CaseMatchNode (location: (152,0)-(152,27)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (152,5)-(152,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (152,5)-(152,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (152,10)-(152,23)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ StringNode (location: (152,13)-(152,18)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (152,13)-(152,14) = "\"" - │ │ │ ├── content_loc: (152,14)-(152,17) = "foo" - │ │ │ ├── closing_loc: (152,17)-(152,18) = "\"" - │ │ │ └── unescaped: "foo" - │ │ ├── statements: ∅ - │ │ ├── in_loc: (152,10)-(152,12) = "in" - │ │ └── then_loc: (152,19)-(152,23) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (152,0)-(152,4) = "case" - │ └── end_keyword_loc: (152,24)-(152,27) = "end" - ├── @ CaseMatchNode (location: (153,0)-(153,25)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (153,5)-(153,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (153,5)-(153,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (153,10)-(153,21)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ NilNode (location: (153,13)-(153,16)) - │ │ │ └── flags: static_literal - │ │ ├── statements: ∅ - │ │ ├── in_loc: (153,10)-(153,12) = "in" - │ │ └── then_loc: (153,17)-(153,21) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (153,0)-(153,4) = "case" - │ └── end_keyword_loc: (153,22)-(153,25) = "end" - ├── @ CaseMatchNode (location: (154,0)-(154,26)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (154,5)-(154,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (154,5)-(154,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (154,10)-(154,22)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ SelfNode (location: (154,13)-(154,17)) - │ │ │ └── flags: ∅ - │ │ ├── statements: ∅ - │ │ ├── in_loc: (154,10)-(154,12) = "in" - │ │ └── then_loc: (154,18)-(154,22) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (154,0)-(154,4) = "case" - │ └── end_keyword_loc: (154,23)-(154,26) = "end" - ├── @ CaseMatchNode (location: (155,0)-(155,26)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (155,5)-(155,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (155,5)-(155,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (155,10)-(155,22)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ TrueNode (location: (155,13)-(155,17)) - │ │ │ └── flags: static_literal - │ │ ├── statements: ∅ - │ │ ├── in_loc: (155,10)-(155,12) = "in" - │ │ └── then_loc: (155,18)-(155,22) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (155,0)-(155,4) = "case" - │ └── end_keyword_loc: (155,23)-(155,26) = "end" - ├── @ CaseMatchNode (location: (156,0)-(156,27)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (156,5)-(156,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (156,5)-(156,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (156,10)-(156,23)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ FalseNode (location: (156,13)-(156,18)) - │ │ │ └── flags: static_literal - │ │ ├── statements: ∅ - │ │ ├── in_loc: (156,10)-(156,12) = "in" - │ │ └── then_loc: (156,19)-(156,23) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (156,0)-(156,4) = "case" - │ └── end_keyword_loc: (156,24)-(156,27) = "end" - ├── @ CaseMatchNode (location: (157,0)-(157,30)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (157,5)-(157,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (157,5)-(157,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (157,10)-(157,26)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ SourceFileNode (location: (157,13)-(157,21)) - │ │ │ ├── flags: ∅ - │ │ │ └── filepath: "patterns.txt" - │ │ ├── statements: ∅ - │ │ ├── in_loc: (157,10)-(157,12) = "in" - │ │ └── then_loc: (157,22)-(157,26) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (157,0)-(157,4) = "case" - │ └── end_keyword_loc: (157,27)-(157,30) = "end" - ├── @ CaseMatchNode (location: (158,0)-(158,30)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (158,5)-(158,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (158,5)-(158,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (158,10)-(158,26)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ SourceLineNode (location: (158,13)-(158,21)) - │ │ │ └── flags: static_literal - │ │ ├── statements: ∅ - │ │ ├── in_loc: (158,10)-(158,12) = "in" - │ │ └── then_loc: (158,22)-(158,26) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (158,0)-(158,4) = "case" - │ └── end_keyword_loc: (158,27)-(158,30) = "end" - ├── @ CaseMatchNode (location: (159,0)-(159,34)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (159,5)-(159,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (159,5)-(159,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (159,10)-(159,30)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ SourceEncodingNode (location: (159,13)-(159,25)) - │ │ │ └── flags: static_literal - │ │ ├── statements: ∅ - │ │ ├── in_loc: (159,10)-(159,12) = "in" - │ │ └── then_loc: (159,26)-(159,30) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (159,0)-(159,4) = "case" - │ └── end_keyword_loc: (159,31)-(159,34) = "end" - ├── @ CaseMatchNode (location: (160,0)-(160,32)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (160,5)-(160,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (160,5)-(160,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (160,10)-(160,28)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ LambdaNode (location: (160,13)-(160,23)) - │ │ │ ├── flags: ∅ - │ │ │ ├── locals: [] - │ │ │ ├── operator_loc: (160,13)-(160,15) = "->" - │ │ │ ├── opening_loc: (160,16)-(160,17) = "{" - │ │ │ ├── closing_loc: (160,22)-(160,23) = "}" - │ │ │ ├── parameters: ∅ - │ │ │ └── body: - │ │ │ @ StatementsNode (location: (160,18)-(160,21)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ LocalVariableReadNode (location: (160,18)-(160,21)) - │ │ │ ├── flags: newline - │ │ │ ├── name: :bar - │ │ │ └── depth: 1 - │ │ ├── statements: ∅ - │ │ ├── in_loc: (160,10)-(160,12) = "in" - │ │ └── then_loc: (160,24)-(160,28) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (160,0)-(160,4) = "case" - │ └── end_keyword_loc: (160,29)-(160,32) = "end" - ├── @ CaseMatchNode (location: (162,0)-(162,32)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (162,5)-(162,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (162,5)-(162,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (162,10)-(162,28)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ IfNode (location: (162,13)-(162,23)) - │ │ │ ├── flags: newline - │ │ │ ├── if_keyword_loc: (162,17)-(162,19) = "if" - │ │ │ ├── predicate: - │ │ │ │ @ LocalVariableReadNode (location: (162,20)-(162,23)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ └── depth: 0 - │ │ │ ├── then_keyword_loc: ∅ - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (162,13)-(162,16)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ LocalVariableTargetNode (location: (162,13)-(162,16)) - │ │ │ │ ├── flags: newline - │ │ │ │ ├── name: :bar - │ │ │ │ └── depth: 0 - │ │ │ ├── subsequent: ∅ - │ │ │ └── end_keyword_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── in_loc: (162,10)-(162,12) = "in" - │ │ └── then_loc: (162,24)-(162,28) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (162,0)-(162,4) = "case" - │ └── end_keyword_loc: (162,29)-(162,32) = "end" - ├── @ CaseMatchNode (location: (163,0)-(163,30)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (163,5)-(163,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (163,5)-(163,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (163,10)-(163,26)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ IfNode (location: (163,13)-(163,21)) - │ │ │ ├── flags: newline - │ │ │ ├── if_keyword_loc: (163,15)-(163,17) = "if" - │ │ │ ├── predicate: - │ │ │ │ @ LocalVariableReadNode (location: (163,18)-(163,21)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ └── depth: 0 - │ │ │ ├── then_keyword_loc: ∅ - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (163,13)-(163,14)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ IntegerNode (location: (163,13)-(163,14)) - │ │ │ │ ├── flags: newline, static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ ├── subsequent: ∅ - │ │ │ └── end_keyword_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── in_loc: (163,10)-(163,12) = "in" - │ │ └── then_loc: (163,22)-(163,26) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (163,0)-(163,4) = "case" - │ └── end_keyword_loc: (163,27)-(163,30) = "end" - ├── @ CaseMatchNode (location: (164,0)-(164,32)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (164,5)-(164,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (164,5)-(164,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (164,10)-(164,28)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ IfNode (location: (164,13)-(164,23)) - │ │ │ ├── flags: newline - │ │ │ ├── if_keyword_loc: (164,17)-(164,19) = "if" - │ │ │ ├── predicate: - │ │ │ │ @ LocalVariableReadNode (location: (164,20)-(164,23)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ └── depth: 0 - │ │ │ ├── then_keyword_loc: ∅ - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (164,13)-(164,16)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ FloatNode (location: (164,13)-(164,16)) - │ │ │ │ ├── flags: newline, static_literal - │ │ │ │ └── value: 1.0 - │ │ │ ├── subsequent: ∅ - │ │ │ └── end_keyword_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── in_loc: (164,10)-(164,12) = "in" - │ │ └── then_loc: (164,24)-(164,28) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (164,0)-(164,4) = "case" - │ └── end_keyword_loc: (164,29)-(164,32) = "end" - ├── @ CaseMatchNode (location: (165,0)-(165,31)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (165,5)-(165,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (165,5)-(165,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (165,10)-(165,27)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ IfNode (location: (165,13)-(165,22)) - │ │ │ ├── flags: newline - │ │ │ ├── if_keyword_loc: (165,16)-(165,18) = "if" - │ │ │ ├── predicate: - │ │ │ │ @ LocalVariableReadNode (location: (165,19)-(165,22)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ └── depth: 0 - │ │ │ ├── then_keyword_loc: ∅ - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (165,13)-(165,15)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ ImaginaryNode (location: (165,13)-(165,15)) - │ │ │ │ ├── flags: newline, static_literal - │ │ │ │ └── numeric: - │ │ │ │ @ IntegerNode (location: (165,13)-(165,14)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ ├── subsequent: ∅ - │ │ │ └── end_keyword_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── in_loc: (165,10)-(165,12) = "in" - │ │ └── then_loc: (165,23)-(165,27) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (165,0)-(165,4) = "case" - │ └── end_keyword_loc: (165,28)-(165,31) = "end" - ├── @ CaseMatchNode (location: (166,0)-(166,31)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (166,5)-(166,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (166,5)-(166,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (166,10)-(166,27)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ IfNode (location: (166,13)-(166,22)) - │ │ │ ├── flags: newline - │ │ │ ├── if_keyword_loc: (166,16)-(166,18) = "if" - │ │ │ ├── predicate: - │ │ │ │ @ LocalVariableReadNode (location: (166,19)-(166,22)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ └── depth: 0 - │ │ │ ├── then_keyword_loc: ∅ - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (166,13)-(166,15)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ RationalNode (location: (166,13)-(166,15)) - │ │ │ │ ├── flags: newline, static_literal, decimal - │ │ │ │ ├── numerator: 1 - │ │ │ │ └── denominator: 1 - │ │ │ ├── subsequent: ∅ - │ │ │ └── end_keyword_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── in_loc: (166,10)-(166,12) = "in" - │ │ └── then_loc: (166,23)-(166,27) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (166,0)-(166,4) = "case" - │ └── end_keyword_loc: (166,28)-(166,31) = "end" - ├── @ CaseMatchNode (location: (167,0)-(167,33)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (167,5)-(167,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (167,5)-(167,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (167,10)-(167,29)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ IfNode (location: (167,13)-(167,24)) - │ │ │ ├── flags: newline - │ │ │ ├── if_keyword_loc: (167,18)-(167,20) = "if" - │ │ │ ├── predicate: - │ │ │ │ @ LocalVariableReadNode (location: (167,21)-(167,24)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ └── depth: 0 - │ │ │ ├── then_keyword_loc: ∅ - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (167,13)-(167,17)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ SymbolNode (location: (167,13)-(167,17)) - │ │ │ │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: (167,13)-(167,14) = ":" - │ │ │ │ ├── value_loc: (167,14)-(167,17) = "foo" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "foo" - │ │ │ ├── subsequent: ∅ - │ │ │ └── end_keyword_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── in_loc: (167,10)-(167,12) = "in" - │ │ └── then_loc: (167,25)-(167,29) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (167,0)-(167,4) = "case" - │ └── end_keyword_loc: (167,30)-(167,33) = "end" - ├── @ CaseMatchNode (location: (168,0)-(168,36)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (168,5)-(168,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (168,5)-(168,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (168,10)-(168,32)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ IfNode (location: (168,13)-(168,27)) - │ │ │ ├── flags: newline - │ │ │ ├── if_keyword_loc: (168,21)-(168,23) = "if" - │ │ │ ├── predicate: - │ │ │ │ @ LocalVariableReadNode (location: (168,24)-(168,27)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ └── depth: 0 - │ │ │ ├── then_keyword_loc: ∅ - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (168,13)-(168,20)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ SymbolNode (location: (168,13)-(168,20)) - │ │ │ │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: (168,13)-(168,16) = "%s[" - │ │ │ │ ├── value_loc: (168,16)-(168,19) = "foo" - │ │ │ │ ├── closing_loc: (168,19)-(168,20) = "]" - │ │ │ │ └── unescaped: "foo" - │ │ │ ├── subsequent: ∅ - │ │ │ └── end_keyword_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── in_loc: (168,10)-(168,12) = "in" - │ │ └── then_loc: (168,28)-(168,32) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (168,0)-(168,4) = "case" - │ └── end_keyword_loc: (168,33)-(168,36) = "end" - ├── @ CaseMatchNode (location: (169,0)-(169,35)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (169,5)-(169,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (169,5)-(169,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (169,10)-(169,31)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ IfNode (location: (169,13)-(169,26)) - │ │ │ ├── flags: newline - │ │ │ ├── if_keyword_loc: (169,20)-(169,22) = "if" - │ │ │ ├── predicate: - │ │ │ │ @ LocalVariableReadNode (location: (169,23)-(169,26)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ └── depth: 0 - │ │ │ ├── then_keyword_loc: ∅ - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (169,13)-(169,19)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ SymbolNode (location: (169,13)-(169,19)) - │ │ │ │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: (169,13)-(169,15) = ":\"" - │ │ │ │ ├── value_loc: (169,15)-(169,18) = "foo" - │ │ │ │ ├── closing_loc: (169,18)-(169,19) = "\"" - │ │ │ │ └── unescaped: "foo" - │ │ │ ├── subsequent: ∅ - │ │ │ └── end_keyword_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── in_loc: (169,10)-(169,12) = "in" - │ │ └── then_loc: (169,27)-(169,31) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (169,0)-(169,4) = "case" - │ └── end_keyword_loc: (169,32)-(169,35) = "end" - ├── @ CaseMatchNode (location: (170,0)-(170,34)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (170,5)-(170,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (170,5)-(170,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (170,10)-(170,30)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ IfNode (location: (170,13)-(170,25)) - │ │ │ ├── flags: newline - │ │ │ ├── if_keyword_loc: (170,19)-(170,21) = "if" - │ │ │ ├── predicate: - │ │ │ │ @ LocalVariableReadNode (location: (170,22)-(170,25)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ └── depth: 0 - │ │ │ ├── then_keyword_loc: ∅ - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (170,13)-(170,18)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ RegularExpressionNode (location: (170,13)-(170,18)) - │ │ │ │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: (170,13)-(170,14) = "/" - │ │ │ │ ├── content_loc: (170,14)-(170,17) = "foo" - │ │ │ │ ├── closing_loc: (170,17)-(170,18) = "/" - │ │ │ │ └── unescaped: "foo" - │ │ │ ├── subsequent: ∅ - │ │ │ └── end_keyword_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── in_loc: (170,10)-(170,12) = "in" - │ │ └── then_loc: (170,26)-(170,30) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (170,0)-(170,4) = "case" - │ └── end_keyword_loc: (170,31)-(170,34) = "end" - ├── @ CaseMatchNode (location: (171,0)-(171,34)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (171,5)-(171,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (171,5)-(171,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (171,10)-(171,30)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ IfNode (location: (171,13)-(171,25)) - │ │ │ ├── flags: newline - │ │ │ ├── if_keyword_loc: (171,19)-(171,21) = "if" - │ │ │ ├── predicate: - │ │ │ │ @ LocalVariableReadNode (location: (171,22)-(171,25)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ └── depth: 0 - │ │ │ ├── then_keyword_loc: ∅ - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (171,13)-(171,18)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ XStringNode (location: (171,13)-(171,18)) - │ │ │ │ ├── flags: newline - │ │ │ │ ├── opening_loc: (171,13)-(171,14) = "`" - │ │ │ │ ├── content_loc: (171,14)-(171,17) = "foo" - │ │ │ │ ├── closing_loc: (171,17)-(171,18) = "`" - │ │ │ │ └── unescaped: "foo" - │ │ │ ├── subsequent: ∅ - │ │ │ └── end_keyword_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── in_loc: (171,10)-(171,12) = "in" - │ │ └── then_loc: (171,26)-(171,30) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (171,0)-(171,4) = "case" - │ └── end_keyword_loc: (171,31)-(171,34) = "end" - ├── @ CaseMatchNode (location: (172,0)-(172,36)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (172,5)-(172,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (172,5)-(172,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (172,10)-(172,32)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ IfNode (location: (172,13)-(172,27)) - │ │ │ ├── flags: newline - │ │ │ ├── if_keyword_loc: (172,21)-(172,23) = "if" - │ │ │ ├── predicate: - │ │ │ │ @ LocalVariableReadNode (location: (172,24)-(172,27)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ └── depth: 0 - │ │ │ ├── then_keyword_loc: ∅ - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (172,13)-(172,20)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ XStringNode (location: (172,13)-(172,20)) - │ │ │ │ ├── flags: newline - │ │ │ │ ├── opening_loc: (172,13)-(172,16) = "%x[" - │ │ │ │ ├── content_loc: (172,16)-(172,19) = "foo" - │ │ │ │ ├── closing_loc: (172,19)-(172,20) = "]" - │ │ │ │ └── unescaped: "foo" - │ │ │ ├── subsequent: ∅ - │ │ │ └── end_keyword_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── in_loc: (172,10)-(172,12) = "in" - │ │ └── then_loc: (172,28)-(172,32) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (172,0)-(172,4) = "case" - │ └── end_keyword_loc: (172,33)-(172,36) = "end" - ├── @ CaseMatchNode (location: (173,0)-(173,36)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (173,5)-(173,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (173,5)-(173,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (173,10)-(173,32)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ IfNode (location: (173,13)-(173,27)) - │ │ │ ├── flags: newline - │ │ │ ├── if_keyword_loc: (173,21)-(173,23) = "if" - │ │ │ ├── predicate: - │ │ │ │ @ LocalVariableReadNode (location: (173,24)-(173,27)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ └── depth: 0 - │ │ │ ├── then_keyword_loc: ∅ - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (173,13)-(173,20)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ ArrayNode (location: (173,13)-(173,20)) - │ │ │ │ ├── flags: newline, static_literal - │ │ │ │ ├── elements: (length: 1) - │ │ │ │ │ └── @ SymbolNode (location: (173,16)-(173,19)) - │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── value_loc: (173,16)-(173,19) = "foo" - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── unescaped: "foo" - │ │ │ │ ├── opening_loc: (173,13)-(173,16) = "%i[" - │ │ │ │ └── closing_loc: (173,19)-(173,20) = "]" - │ │ │ ├── subsequent: ∅ - │ │ │ └── end_keyword_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── in_loc: (173,10)-(173,12) = "in" - │ │ └── then_loc: (173,28)-(173,32) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (173,0)-(173,4) = "case" - │ └── end_keyword_loc: (173,33)-(173,36) = "end" - ├── @ CaseMatchNode (location: (174,0)-(174,36)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (174,5)-(174,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (174,5)-(174,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (174,10)-(174,32)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ IfNode (location: (174,13)-(174,27)) - │ │ │ ├── flags: newline - │ │ │ ├── if_keyword_loc: (174,21)-(174,23) = "if" - │ │ │ ├── predicate: - │ │ │ │ @ LocalVariableReadNode (location: (174,24)-(174,27)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ └── depth: 0 - │ │ │ ├── then_keyword_loc: ∅ - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (174,13)-(174,20)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ ArrayNode (location: (174,13)-(174,20)) - │ │ │ │ ├── flags: newline, static_literal - │ │ │ │ ├── elements: (length: 1) - │ │ │ │ │ └── @ SymbolNode (location: (174,16)-(174,19)) - │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── value_loc: (174,16)-(174,19) = "foo" - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── unescaped: "foo" - │ │ │ │ ├── opening_loc: (174,13)-(174,16) = "%I[" - │ │ │ │ └── closing_loc: (174,19)-(174,20) = "]" - │ │ │ ├── subsequent: ∅ - │ │ │ └── end_keyword_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── in_loc: (174,10)-(174,12) = "in" - │ │ └── then_loc: (174,28)-(174,32) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (174,0)-(174,4) = "case" - │ └── end_keyword_loc: (174,33)-(174,36) = "end" - ├── @ CaseMatchNode (location: (175,0)-(175,36)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (175,5)-(175,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (175,5)-(175,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (175,10)-(175,32)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ IfNode (location: (175,13)-(175,27)) - │ │ │ ├── flags: newline - │ │ │ ├── if_keyword_loc: (175,21)-(175,23) = "if" - │ │ │ ├── predicate: - │ │ │ │ @ LocalVariableReadNode (location: (175,24)-(175,27)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ └── depth: 0 - │ │ │ ├── then_keyword_loc: ∅ - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (175,13)-(175,20)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ ArrayNode (location: (175,13)-(175,20)) - │ │ │ │ ├── flags: newline - │ │ │ │ ├── elements: (length: 1) - │ │ │ │ │ └── @ StringNode (location: (175,16)-(175,19)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── content_loc: (175,16)-(175,19) = "foo" - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── unescaped: "foo" - │ │ │ │ ├── opening_loc: (175,13)-(175,16) = "%w[" - │ │ │ │ └── closing_loc: (175,19)-(175,20) = "]" - │ │ │ ├── subsequent: ∅ - │ │ │ └── end_keyword_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── in_loc: (175,10)-(175,12) = "in" - │ │ └── then_loc: (175,28)-(175,32) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (175,0)-(175,4) = "case" - │ └── end_keyword_loc: (175,33)-(175,36) = "end" - ├── @ CaseMatchNode (location: (176,0)-(176,36)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (176,5)-(176,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (176,5)-(176,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (176,10)-(176,32)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ IfNode (location: (176,13)-(176,27)) - │ │ │ ├── flags: newline - │ │ │ ├── if_keyword_loc: (176,21)-(176,23) = "if" - │ │ │ ├── predicate: - │ │ │ │ @ LocalVariableReadNode (location: (176,24)-(176,27)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ └── depth: 0 - │ │ │ ├── then_keyword_loc: ∅ - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (176,13)-(176,20)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ ArrayNode (location: (176,13)-(176,20)) - │ │ │ │ ├── flags: newline - │ │ │ │ ├── elements: (length: 1) - │ │ │ │ │ └── @ StringNode (location: (176,16)-(176,19)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── content_loc: (176,16)-(176,19) = "foo" - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── unescaped: "foo" - │ │ │ │ ├── opening_loc: (176,13)-(176,16) = "%W[" - │ │ │ │ └── closing_loc: (176,19)-(176,20) = "]" - │ │ │ ├── subsequent: ∅ - │ │ │ └── end_keyword_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── in_loc: (176,10)-(176,12) = "in" - │ │ └── then_loc: (176,28)-(176,32) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (176,0)-(176,4) = "case" - │ └── end_keyword_loc: (176,33)-(176,36) = "end" - ├── @ CaseMatchNode (location: (177,0)-(177,36)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (177,5)-(177,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (177,5)-(177,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (177,10)-(177,32)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ IfNode (location: (177,13)-(177,27)) - │ │ │ ├── flags: newline - │ │ │ ├── if_keyword_loc: (177,21)-(177,23) = "if" - │ │ │ ├── predicate: - │ │ │ │ @ LocalVariableReadNode (location: (177,24)-(177,27)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ └── depth: 0 - │ │ │ ├── then_keyword_loc: ∅ - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (177,13)-(177,20)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ StringNode (location: (177,13)-(177,20)) - │ │ │ │ ├── flags: newline - │ │ │ │ ├── opening_loc: (177,13)-(177,16) = "%q[" - │ │ │ │ ├── content_loc: (177,16)-(177,19) = "foo" - │ │ │ │ ├── closing_loc: (177,19)-(177,20) = "]" - │ │ │ │ └── unescaped: "foo" - │ │ │ ├── subsequent: ∅ - │ │ │ └── end_keyword_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── in_loc: (177,10)-(177,12) = "in" - │ │ └── then_loc: (177,28)-(177,32) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (177,0)-(177,4) = "case" - │ └── end_keyword_loc: (177,33)-(177,36) = "end" - ├── @ CaseMatchNode (location: (178,0)-(178,36)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (178,5)-(178,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (178,5)-(178,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (178,10)-(178,32)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ IfNode (location: (178,13)-(178,27)) - │ │ │ ├── flags: newline - │ │ │ ├── if_keyword_loc: (178,21)-(178,23) = "if" - │ │ │ ├── predicate: - │ │ │ │ @ LocalVariableReadNode (location: (178,24)-(178,27)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ └── depth: 0 - │ │ │ ├── then_keyword_loc: ∅ - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (178,13)-(178,20)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ StringNode (location: (178,13)-(178,20)) - │ │ │ │ ├── flags: newline - │ │ │ │ ├── opening_loc: (178,13)-(178,16) = "%Q[" - │ │ │ │ ├── content_loc: (178,16)-(178,19) = "foo" - │ │ │ │ ├── closing_loc: (178,19)-(178,20) = "]" - │ │ │ │ └── unescaped: "foo" - │ │ │ ├── subsequent: ∅ - │ │ │ └── end_keyword_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── in_loc: (178,10)-(178,12) = "in" - │ │ └── then_loc: (178,28)-(178,32) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (178,0)-(178,4) = "case" - │ └── end_keyword_loc: (178,33)-(178,36) = "end" - ├── @ CaseMatchNode (location: (179,0)-(179,34)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (179,5)-(179,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (179,5)-(179,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (179,10)-(179,30)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ IfNode (location: (179,13)-(179,25)) - │ │ │ ├── flags: newline - │ │ │ ├── if_keyword_loc: (179,19)-(179,21) = "if" - │ │ │ ├── predicate: - │ │ │ │ @ LocalVariableReadNode (location: (179,22)-(179,25)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ └── depth: 0 - │ │ │ ├── then_keyword_loc: ∅ - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (179,13)-(179,18)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ StringNode (location: (179,13)-(179,18)) - │ │ │ │ ├── flags: newline - │ │ │ │ ├── opening_loc: (179,13)-(179,14) = "\"" - │ │ │ │ ├── content_loc: (179,14)-(179,17) = "foo" - │ │ │ │ ├── closing_loc: (179,17)-(179,18) = "\"" - │ │ │ │ └── unescaped: "foo" - │ │ │ ├── subsequent: ∅ - │ │ │ └── end_keyword_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── in_loc: (179,10)-(179,12) = "in" - │ │ └── then_loc: (179,26)-(179,30) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (179,0)-(179,4) = "case" - │ └── end_keyword_loc: (179,31)-(179,34) = "end" - ├── @ CaseMatchNode (location: (180,0)-(180,32)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (180,5)-(180,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (180,5)-(180,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (180,10)-(180,28)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ IfNode (location: (180,13)-(180,23)) - │ │ │ ├── flags: newline - │ │ │ ├── if_keyword_loc: (180,17)-(180,19) = "if" - │ │ │ ├── predicate: - │ │ │ │ @ LocalVariableReadNode (location: (180,20)-(180,23)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ └── depth: 0 - │ │ │ ├── then_keyword_loc: ∅ - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (180,13)-(180,16)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ NilNode (location: (180,13)-(180,16)) - │ │ │ │ └── flags: newline, static_literal - │ │ │ ├── subsequent: ∅ - │ │ │ └── end_keyword_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── in_loc: (180,10)-(180,12) = "in" - │ │ └── then_loc: (180,24)-(180,28) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (180,0)-(180,4) = "case" - │ └── end_keyword_loc: (180,29)-(180,32) = "end" - ├── @ CaseMatchNode (location: (181,0)-(181,33)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (181,5)-(181,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (181,5)-(181,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (181,10)-(181,29)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ IfNode (location: (181,13)-(181,24)) - │ │ │ ├── flags: newline - │ │ │ ├── if_keyword_loc: (181,18)-(181,20) = "if" - │ │ │ ├── predicate: - │ │ │ │ @ LocalVariableReadNode (location: (181,21)-(181,24)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ └── depth: 0 - │ │ │ ├── then_keyword_loc: ∅ - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (181,13)-(181,17)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ SelfNode (location: (181,13)-(181,17)) - │ │ │ │ └── flags: newline - │ │ │ ├── subsequent: ∅ - │ │ │ └── end_keyword_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── in_loc: (181,10)-(181,12) = "in" - │ │ └── then_loc: (181,25)-(181,29) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (181,0)-(181,4) = "case" - │ └── end_keyword_loc: (181,30)-(181,33) = "end" - ├── @ CaseMatchNode (location: (182,0)-(182,33)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (182,5)-(182,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (182,5)-(182,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (182,10)-(182,29)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ IfNode (location: (182,13)-(182,24)) - │ │ │ ├── flags: newline - │ │ │ ├── if_keyword_loc: (182,18)-(182,20) = "if" - │ │ │ ├── predicate: - │ │ │ │ @ LocalVariableReadNode (location: (182,21)-(182,24)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ └── depth: 0 - │ │ │ ├── then_keyword_loc: ∅ - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (182,13)-(182,17)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ TrueNode (location: (182,13)-(182,17)) - │ │ │ │ └── flags: newline, static_literal - │ │ │ ├── subsequent: ∅ - │ │ │ └── end_keyword_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── in_loc: (182,10)-(182,12) = "in" - │ │ └── then_loc: (182,25)-(182,29) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (182,0)-(182,4) = "case" - │ └── end_keyword_loc: (182,30)-(182,33) = "end" - ├── @ CaseMatchNode (location: (183,0)-(183,34)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (183,5)-(183,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (183,5)-(183,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (183,10)-(183,30)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ IfNode (location: (183,13)-(183,25)) - │ │ │ ├── flags: newline - │ │ │ ├── if_keyword_loc: (183,19)-(183,21) = "if" - │ │ │ ├── predicate: - │ │ │ │ @ LocalVariableReadNode (location: (183,22)-(183,25)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ └── depth: 0 - │ │ │ ├── then_keyword_loc: ∅ - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (183,13)-(183,18)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ FalseNode (location: (183,13)-(183,18)) - │ │ │ │ └── flags: newline, static_literal - │ │ │ ├── subsequent: ∅ - │ │ │ └── end_keyword_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── in_loc: (183,10)-(183,12) = "in" - │ │ └── then_loc: (183,26)-(183,30) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (183,0)-(183,4) = "case" - │ └── end_keyword_loc: (183,31)-(183,34) = "end" - ├── @ CaseMatchNode (location: (184,0)-(184,37)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (184,5)-(184,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (184,5)-(184,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (184,10)-(184,33)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ IfNode (location: (184,13)-(184,28)) - │ │ │ ├── flags: newline - │ │ │ ├── if_keyword_loc: (184,22)-(184,24) = "if" - │ │ │ ├── predicate: - │ │ │ │ @ LocalVariableReadNode (location: (184,25)-(184,28)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ └── depth: 0 - │ │ │ ├── then_keyword_loc: ∅ - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (184,13)-(184,21)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ SourceFileNode (location: (184,13)-(184,21)) - │ │ │ │ ├── flags: newline - │ │ │ │ └── filepath: "patterns.txt" - │ │ │ ├── subsequent: ∅ - │ │ │ └── end_keyword_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── in_loc: (184,10)-(184,12) = "in" - │ │ └── then_loc: (184,29)-(184,33) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (184,0)-(184,4) = "case" - │ └── end_keyword_loc: (184,34)-(184,37) = "end" - ├── @ CaseMatchNode (location: (185,0)-(185,37)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (185,5)-(185,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (185,5)-(185,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (185,10)-(185,33)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ IfNode (location: (185,13)-(185,28)) - │ │ │ ├── flags: newline - │ │ │ ├── if_keyword_loc: (185,22)-(185,24) = "if" - │ │ │ ├── predicate: - │ │ │ │ @ LocalVariableReadNode (location: (185,25)-(185,28)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ └── depth: 0 - │ │ │ ├── then_keyword_loc: ∅ - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (185,13)-(185,21)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ SourceLineNode (location: (185,13)-(185,21)) - │ │ │ │ └── flags: newline, static_literal - │ │ │ ├── subsequent: ∅ - │ │ │ └── end_keyword_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── in_loc: (185,10)-(185,12) = "in" - │ │ └── then_loc: (185,29)-(185,33) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (185,0)-(185,4) = "case" - │ └── end_keyword_loc: (185,34)-(185,37) = "end" - ├── @ CaseMatchNode (location: (186,0)-(186,41)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (186,5)-(186,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (186,5)-(186,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (186,10)-(186,37)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ IfNode (location: (186,13)-(186,32)) - │ │ │ ├── flags: newline - │ │ │ ├── if_keyword_loc: (186,26)-(186,28) = "if" - │ │ │ ├── predicate: - │ │ │ │ @ LocalVariableReadNode (location: (186,29)-(186,32)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ └── depth: 0 - │ │ │ ├── then_keyword_loc: ∅ - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (186,13)-(186,25)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ SourceEncodingNode (location: (186,13)-(186,25)) - │ │ │ │ └── flags: newline, static_literal - │ │ │ ├── subsequent: ∅ - │ │ │ └── end_keyword_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── in_loc: (186,10)-(186,12) = "in" - │ │ └── then_loc: (186,33)-(186,37) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (186,0)-(186,4) = "case" - │ └── end_keyword_loc: (186,38)-(186,41) = "end" - ├── @ CaseMatchNode (location: (187,0)-(187,39)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (187,5)-(187,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (187,5)-(187,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (187,10)-(187,35)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ IfNode (location: (187,13)-(187,30)) - │ │ │ ├── flags: newline - │ │ │ ├── if_keyword_loc: (187,24)-(187,26) = "if" - │ │ │ ├── predicate: - │ │ │ │ @ LocalVariableReadNode (location: (187,27)-(187,30)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ └── depth: 0 - │ │ │ ├── then_keyword_loc: ∅ - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (187,13)-(187,23)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ LambdaNode (location: (187,13)-(187,23)) - │ │ │ │ ├── flags: newline - │ │ │ │ ├── locals: [] - │ │ │ │ ├── operator_loc: (187,13)-(187,15) = "->" - │ │ │ │ ├── opening_loc: (187,16)-(187,17) = "{" - │ │ │ │ ├── closing_loc: (187,22)-(187,23) = "}" - │ │ │ │ ├── parameters: ∅ - │ │ │ │ └── body: - │ │ │ │ @ StatementsNode (location: (187,18)-(187,21)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ LocalVariableReadNode (location: (187,18)-(187,21)) - │ │ │ │ ├── flags: newline - │ │ │ │ ├── name: :bar - │ │ │ │ └── depth: 1 - │ │ │ ├── subsequent: ∅ - │ │ │ └── end_keyword_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── in_loc: (187,10)-(187,12) = "in" - │ │ └── then_loc: (187,31)-(187,35) = "then" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (187,0)-(187,4) = "case" - │ └── end_keyword_loc: (187,36)-(187,39) = "end" - ├── @ IfNode (location: (189,0)-(190,3)) - │ ├── flags: newline - │ ├── if_keyword_loc: (189,0)-(189,2) = "if" - │ ├── predicate: - │ │ @ MatchPredicateNode (location: (189,3)-(189,10)) - │ │ ├── flags: ∅ - │ │ ├── value: - │ │ │ @ CallNode (location: (189,3)-(189,4)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :a - │ │ │ ├── message_loc: (189,3)-(189,4) = "a" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── pattern: - │ │ │ @ ArrayPatternNode (location: (189,8)-(189,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── constant: ∅ - │ │ │ ├── requireds: (length: 0) - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── opening_loc: (189,8)-(189,9) = "[" - │ │ │ └── closing_loc: (189,9)-(189,10) = "]" - │ │ └── operator_loc: (189,5)-(189,7) = "in" - │ ├── then_keyword_loc: ∅ - │ ├── statements: ∅ - │ ├── subsequent: ∅ - │ └── end_keyword_loc: (190,0)-(190,3) = "end" - ├── @ MatchRequiredNode (location: (192,0)-(194,1)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (192,0)-(192,1)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (192,0)-(192,1) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (192,5)-(194,1)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ LocalVariableTargetNode (location: (193,2)-(193,3)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :b - │ │ │ └── depth: 0 - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── opening_loc: (192,5)-(192,6) = "[" - │ │ └── closing_loc: (194,0)-(194,1) = "]" - │ └── operator_loc: (192,2)-(192,4) = "=>" - ├── @ MatchPredicateNode (location: (196,0)-(200,1)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (196,0)-(196,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (196,0)-(196,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ HashPatternNode (location: (196,7)-(200,1)) - │ │ ├── flags: ∅ - │ │ ├── constant: - │ │ │ @ ConstantReadNode (location: (196,7)-(196,8)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :A - │ │ ├── elements: (length: 1) - │ │ │ └── @ AssocNode (location: (197,2)-(199,3)) - │ │ │ ├── flags: ∅ - │ │ │ ├── key: - │ │ │ │ @ SymbolNode (location: (197,2)-(197,6)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── value_loc: (197,2)-(197,5) = "bar" - │ │ │ │ ├── closing_loc: (197,5)-(197,6) = ":" - │ │ │ │ └── unescaped: "bar" - │ │ │ ├── value: - │ │ │ │ @ HashPatternNode (location: (197,7)-(199,3)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── constant: - │ │ │ │ │ @ ConstantReadNode (location: (197,7)-(197,8)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── name: :B - │ │ │ │ ├── elements: (length: 1) - │ │ │ │ │ └── @ AssocNode (location: (198,4)-(198,12)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── key: - │ │ │ │ │ │ @ SymbolNode (location: (198,4)-(198,10)) - │ │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ │ ├── value_loc: (198,4)-(198,9) = "value" - │ │ │ │ │ │ ├── closing_loc: (198,9)-(198,10) = ":" - │ │ │ │ │ │ └── unescaped: "value" - │ │ │ │ │ ├── value: - │ │ │ │ │ │ @ LocalVariableTargetNode (location: (198,11)-(198,12)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ ├── name: :a - │ │ │ │ │ │ └── depth: 0 - │ │ │ │ │ └── operator_loc: ∅ - │ │ │ │ ├── rest: ∅ - │ │ │ │ ├── opening_loc: (197,8)-(197,9) = "[" - │ │ │ │ └── closing_loc: (199,2)-(199,3) = "]" - │ │ │ └── operator_loc: ∅ - │ │ ├── rest: ∅ - │ │ ├── opening_loc: (196,8)-(196,9) = "[" - │ │ └── closing_loc: (200,0)-(200,1) = "]" - │ └── operator_loc: (196,4)-(196,6) = "in" - ├── @ MatchPredicateNode (location: (202,0)-(202,17)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (202,0)-(202,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (202,0)-(202,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ CapturePatternNode (location: (202,7)-(202,17)) - │ │ ├── flags: ∅ - │ │ ├── value: - │ │ │ @ LocalVariableTargetNode (location: (202,7)-(202,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :bar - │ │ │ └── depth: 0 - │ │ ├── target: - │ │ │ @ LocalVariableTargetNode (location: (202,14)-(202,17)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :baz - │ │ │ └── depth: 0 - │ │ └── operator_loc: (202,11)-(202,13) = "=>" - │ └── operator_loc: (202,4)-(202,6) = "in" - ├── @ MatchRequiredNode (location: (203,0)-(203,17)) - │ ├── flags: newline - │ ├── value: - │ │ @ CallNode (location: (203,0)-(203,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (203,0)-(203,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── pattern: - │ │ @ CapturePatternNode (location: (203,7)-(203,17)) - │ │ ├── flags: ∅ - │ │ ├── value: - │ │ │ @ LocalVariableTargetNode (location: (203,7)-(203,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :bar - │ │ │ └── depth: 0 - │ │ ├── target: - │ │ │ @ LocalVariableTargetNode (location: (203,14)-(203,17)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :baz - │ │ │ └── depth: 0 - │ │ └── operator_loc: (203,11)-(203,13) = "=>" - │ └── operator_loc: (203,4)-(203,6) = "=>" - ├── @ MultiWriteNode (location: (205,0)-(205,20)) - │ ├── flags: newline - │ ├── lefts: (length: 3) - │ │ ├── @ LocalVariableTargetNode (location: (205,0)-(205,3)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :foo - │ │ │ └── depth: 0 - │ │ ├── @ LocalVariableTargetNode (location: (205,5)-(205,8)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :bar - │ │ │ └── depth: 0 - │ │ └── @ LocalVariableTargetNode (location: (205,10)-(205,13)) - │ │ ├── flags: ∅ - │ │ ├── name: :baz - │ │ └── depth: 0 - │ ├── rest: ∅ - │ ├── rights: (length: 0) - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── operator_loc: (205,14)-(205,15) = "=" - │ └── value: - │ @ ArrayNode (location: (205,16)-(205,20)) - │ ├── flags: static_literal - │ ├── elements: (length: 2) - │ │ ├── @ IntegerNode (location: (205,16)-(205,17)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── @ IntegerNode (location: (205,19)-(205,20)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── opening_loc: ∅ - │ └── closing_loc: ∅ - ├── @ CallNode (location: (206,0)-(208,3)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (206,0)-(206,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (206,4)-(208,3)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (207,2)-(207,29)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ MatchRequiredNode (location: (207,2)-(207,29)) - │ │ ├── flags: newline - │ │ ├── value: - │ │ │ @ ArrayNode (location: (207,2)-(207,8)) - │ │ │ ├── flags: static_literal - │ │ │ ├── elements: (length: 2) - │ │ │ │ ├── @ IntegerNode (location: (207,3)-(207,4)) - │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ └── value: 1 - │ │ │ │ └── @ IntegerNode (location: (207,6)-(207,7)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 2 - │ │ │ ├── opening_loc: (207,2)-(207,3) = "[" - │ │ │ └── closing_loc: (207,7)-(207,8) = "]" - │ │ ├── pattern: - │ │ │ @ CapturePatternNode (location: (207,12)-(207,29)) - │ │ │ ├── flags: ∅ - │ │ │ ├── value: - │ │ │ │ @ ArrayPatternNode (location: (207,12)-(207,22)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── constant: ∅ - │ │ │ │ ├── requireds: (length: 2) - │ │ │ │ │ ├── @ LocalVariableTargetNode (location: (207,13)-(207,16)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ ├── name: :foo - │ │ │ │ │ │ └── depth: 1 - │ │ │ │ │ └── @ LocalVariableTargetNode (location: (207,18)-(207,21)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── name: :bar - │ │ │ │ │ └── depth: 1 - │ │ │ │ ├── rest: ∅ - │ │ │ │ ├── posts: (length: 0) - │ │ │ │ ├── opening_loc: (207,12)-(207,13) = "[" - │ │ │ │ └── closing_loc: (207,21)-(207,22) = "]" - │ │ │ ├── target: - │ │ │ │ @ LocalVariableTargetNode (location: (207,26)-(207,29)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ └── depth: 1 - │ │ │ └── operator_loc: (207,23)-(207,25) = "=>" - │ │ └── operator_loc: (207,9)-(207,11) = "=>" - │ ├── opening_loc: (206,4)-(206,6) = "do" - │ └── closing_loc: (208,0)-(208,3) = "end" - ├── @ MatchRequiredNode (location: (210,0)-(210,19)) - │ ├── flags: newline - │ ├── value: - │ │ @ LocalVariableReadNode (location: (210,0)-(210,3)) - │ │ ├── flags: ∅ - │ │ ├── name: :foo - │ │ └── depth: 0 - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (210,7)-(210,19)) - │ │ ├── flags: ∅ - │ │ ├── constant: - │ │ │ @ ConstantReadNode (location: (210,7)-(210,13)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :Object - │ │ ├── requireds: (length: 1) - │ │ │ └── @ HashPatternNode (location: (210,14)-(210,18)) - │ │ │ ├── flags: ∅ - │ │ │ ├── constant: ∅ - │ │ │ ├── elements: (length: 1) - │ │ │ │ └── @ AssocNode (location: (210,15)-(210,17)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── key: - │ │ │ │ │ @ SymbolNode (location: (210,15)-(210,17)) - │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── value_loc: (210,15)-(210,16) = "x" - │ │ │ │ │ ├── closing_loc: (210,16)-(210,17) = ":" - │ │ │ │ │ └── unescaped: "x" - │ │ │ │ ├── value: - │ │ │ │ │ @ ImplicitNode (location: (210,15)-(210,16)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── value: - │ │ │ │ │ @ LocalVariableTargetNode (location: (210,15)-(210,16)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── name: :x - │ │ │ │ │ └── depth: 0 - │ │ │ │ └── operator_loc: ∅ - │ │ │ ├── rest: ∅ - │ │ │ ├── opening_loc: (210,14)-(210,15) = "{" - │ │ │ └── closing_loc: (210,17)-(210,18) = "}" - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── opening_loc: (210,13)-(210,14) = "[" - │ │ └── closing_loc: (210,18)-(210,19) = "]" - │ └── operator_loc: (210,4)-(210,6) = "=>" - ├── @ CallNode (location: (212,0)-(212,19)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ IntegerNode (location: (212,0)-(212,1)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── call_operator_loc: (212,1)-(212,2) = "." - │ ├── name: :then - │ ├── message_loc: (212,2)-(212,6) = "then" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (212,7)-(212,19)) - │ ├── flags: ∅ - │ ├── locals: [:_1] - │ ├── parameters: - │ │ @ NumberedParametersNode (location: (212,7)-(212,19)) - │ │ ├── flags: ∅ - │ │ └── maximum: 1 - │ ├── body: - │ │ @ StatementsNode (location: (212,9)-(212,17)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ MatchPredicateNode (location: (212,9)-(212,17)) - │ │ ├── flags: newline - │ │ ├── value: - │ │ │ @ IntegerNode (location: (212,9)-(212,10)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── pattern: - │ │ │ @ PinnedVariableNode (location: (212,14)-(212,17)) - │ │ │ ├── flags: ∅ - │ │ │ ├── variable: - │ │ │ │ @ LocalVariableReadNode (location: (212,15)-(212,17)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :_1 - │ │ │ │ └── depth: 0 - │ │ │ └── operator_loc: (212,14)-(212,15) = "^" - │ │ └── operator_loc: (212,11)-(212,13) = "in" - │ ├── opening_loc: (212,7)-(212,8) = "{" - │ └── closing_loc: (212,18)-(212,19) = "}" - ├── @ MultiWriteNode (location: (214,0)-(217,5)) - │ ├── flags: newline - │ ├── lefts: (length: 2) - │ │ ├── @ LocalVariableTargetNode (location: (215,2)-(215,3)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :a - │ │ │ └── depth: 0 - │ │ └── @ LocalVariableTargetNode (location: (216,2)-(216,3)) - │ │ ├── flags: ∅ - │ │ ├── name: :b - │ │ └── depth: 0 - │ ├── rest: ∅ - │ ├── rights: (length: 0) - │ ├── lparen_loc: (214,0)-(214,1) = "(" - │ ├── rparen_loc: (217,0)-(217,1) = ")" - │ ├── operator_loc: (217,2)-(217,3) = "=" - │ └── value: - │ @ CallNode (location: (217,4)-(217,5)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :c - │ ├── message_loc: (217,4)-(217,5) = "c" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CaseMatchNode (location: (219,0)-(219,25)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ ParenthesesNode (location: (219,5)-(219,7)) - │ │ ├── flags: ∅ - │ │ ├── body: ∅ - │ │ ├── opening_loc: (219,5)-(219,6) = "(" - │ │ └── closing_loc: (219,6)-(219,7) = ")" - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (219,9)-(219,20)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ ArrayPatternNode (location: (219,12)-(219,20)) - │ │ │ ├── flags: ∅ - │ │ │ ├── constant: ∅ - │ │ │ ├── requireds: (length: 2) - │ │ │ │ ├── @ LocalVariableTargetNode (location: (219,13)-(219,15)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── name: :_a - │ │ │ │ │ └── depth: 0 - │ │ │ │ └── @ LocalVariableTargetNode (location: (219,17)-(219,19)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :_a - │ │ │ │ └── depth: 0 - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── opening_loc: (219,12)-(219,13) = "[" - │ │ │ └── closing_loc: (219,19)-(219,20) = "]" - │ │ ├── statements: ∅ - │ │ ├── in_loc: (219,9)-(219,11) = "in" - │ │ └── then_loc: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (219,0)-(219,4) = "case" - │ └── end_keyword_loc: (219,22)-(219,25) = "end" - └── @ CaseMatchNode (location: (220,0)-(220,31)) - ├── flags: newline - ├── predicate: - │ @ ParenthesesNode (location: (220,5)-(220,7)) - │ ├── flags: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (220,5)-(220,6) = "(" - │ └── closing_loc: (220,6)-(220,7) = ")" - ├── conditions: (length: 1) - │ └── @ InNode (location: (220,9)-(220,26)) - │ ├── flags: ∅ - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (220,12)-(220,26)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── requireds: (length: 2) - │ │ │ ├── @ HashPatternNode (location: (220,13)-(220,18)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── constant: ∅ - │ │ │ │ ├── elements: (length: 1) - │ │ │ │ │ └── @ AssocNode (location: (220,14)-(220,17)) - │ │ │ │ │ ├── flags: static_literal - │ │ │ │ │ ├── key: - │ │ │ │ │ │ @ SymbolNode (location: (220,14)-(220,16)) - │ │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ │ ├── value_loc: (220,14)-(220,15) = "a" - │ │ │ │ │ │ ├── closing_loc: (220,15)-(220,16) = ":" - │ │ │ │ │ │ └── unescaped: "a" - │ │ │ │ │ ├── value: - │ │ │ │ │ │ @ IntegerNode (location: (220,16)-(220,17)) - │ │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ │ └── value: 1 - │ │ │ │ │ └── operator_loc: ∅ - │ │ │ │ ├── rest: ∅ - │ │ │ │ ├── opening_loc: (220,13)-(220,14) = "{" - │ │ │ │ └── closing_loc: (220,17)-(220,18) = "}" - │ │ │ └── @ HashPatternNode (location: (220,20)-(220,25)) - │ │ │ ├── flags: ∅ - │ │ │ ├── constant: ∅ - │ │ │ ├── elements: (length: 1) - │ │ │ │ └── @ AssocNode (location: (220,21)-(220,24)) - │ │ │ │ ├── flags: static_literal - │ │ │ │ ├── key: - │ │ │ │ │ @ SymbolNode (location: (220,21)-(220,23)) - │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── value_loc: (220,21)-(220,22) = "a" - │ │ │ │ │ ├── closing_loc: (220,22)-(220,23) = ":" - │ │ │ │ │ └── unescaped: "a" - │ │ │ │ ├── value: - │ │ │ │ │ @ IntegerNode (location: (220,23)-(220,24)) - │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ └── value: 2 - │ │ │ │ └── operator_loc: ∅ - │ │ │ ├── rest: ∅ - │ │ │ ├── opening_loc: (220,20)-(220,21) = "{" - │ │ │ └── closing_loc: (220,24)-(220,25) = "}" - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── opening_loc: (220,12)-(220,13) = "[" - │ │ └── closing_loc: (220,25)-(220,26) = "]" - │ ├── statements: ∅ - │ ├── in_loc: (220,9)-(220,11) = "in" - │ └── then_loc: ∅ - ├── else_clause: ∅ - ├── case_keyword_loc: (220,0)-(220,4) = "case" - └── end_keyword_loc: (220,28)-(220,31) = "end" diff --git a/test/prism/snapshots/procs.txt b/test/prism/snapshots/procs.txt deleted file mode 100644 index 91a53e98f661f3..00000000000000 --- a/test/prism/snapshots/procs.txt +++ /dev/null @@ -1,451 +0,0 @@ -@ ProgramNode (location: (1,0)-(27,19)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(27,19)) - ├── flags: ∅ - └── body: (length: 10) - ├── @ LambdaNode (location: (1,0)-(1,21)) - │ ├── flags: newline - │ ├── locals: [:a, :b, :c, :d] - │ ├── operator_loc: (1,0)-(1,2) = "->" - │ ├── opening_loc: (1,16)-(1,17) = "{" - │ ├── closing_loc: (1,20)-(1,21) = "}" - │ ├── parameters: - │ │ @ BlockParametersNode (location: (1,3)-(1,15)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (1,4)-(1,5)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (1,4)-(1,5)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :a - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 3) - │ │ │ ├── @ BlockLocalVariableNode (location: (1,7)-(1,8)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :b - │ │ │ ├── @ BlockLocalVariableNode (location: (1,10)-(1,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :c - │ │ │ └── @ BlockLocalVariableNode (location: (1,13)-(1,14)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :d - │ │ ├── opening_loc: (1,3)-(1,4) = "(" - │ │ └── closing_loc: (1,14)-(1,15) = ")" - │ └── body: - │ @ StatementsNode (location: (1,18)-(1,19)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ LocalVariableReadNode (location: (1,18)-(1,19)) - │ ├── flags: newline - │ ├── name: :b - │ └── depth: 0 - ├── @ LambdaNode (location: (3,0)-(5,3)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── operator_loc: (3,0)-(3,2) = "->" - │ ├── opening_loc: (3,3)-(3,5) = "do" - │ ├── closing_loc: (5,0)-(5,3) = "end" - │ ├── parameters: ∅ - │ └── body: - │ @ BeginNode (location: (3,3)-(5,3)) - │ ├── flags: ∅ - │ ├── begin_keyword_loc: ∅ - │ ├── statements: ∅ - │ ├── rescue_clause: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: - │ │ @ EnsureNode (location: (4,0)-(5,3)) - │ │ ├── flags: ∅ - │ │ ├── ensure_keyword_loc: (4,0)-(4,6) = "ensure" - │ │ ├── statements: ∅ - │ │ └── end_keyword_loc: (5,0)-(5,3) = "end" - │ └── end_keyword_loc: (5,0)-(5,3) = "end" - ├── @ LambdaNode (location: (7,0)-(11,3)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── operator_loc: (7,0)-(7,2) = "->" - │ ├── opening_loc: (7,3)-(7,5) = "do" - │ ├── closing_loc: (11,0)-(11,3) = "end" - │ ├── parameters: ∅ - │ └── body: - │ @ BeginNode (location: (7,3)-(11,3)) - │ ├── flags: ∅ - │ ├── begin_keyword_loc: ∅ - │ ├── statements: ∅ - │ ├── rescue_clause: - │ │ @ RescueNode (location: (8,0)-(8,6)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (8,0)-(8,6) = "rescue" - │ │ ├── exceptions: (length: 0) - │ │ ├── operator_loc: ∅ - │ │ ├── reference: ∅ - │ │ ├── statements: ∅ - │ │ └── subsequent: ∅ - │ ├── else_clause: - │ │ @ ElseNode (location: (9,0)-(10,6)) - │ │ ├── flags: ∅ - │ │ ├── else_keyword_loc: (9,0)-(9,4) = "else" - │ │ ├── statements: ∅ - │ │ └── end_keyword_loc: (10,0)-(10,6) = "ensure" - │ ├── ensure_clause: - │ │ @ EnsureNode (location: (10,0)-(11,3)) - │ │ ├── flags: ∅ - │ │ ├── ensure_keyword_loc: (10,0)-(10,6) = "ensure" - │ │ ├── statements: ∅ - │ │ └── end_keyword_loc: (11,0)-(11,3) = "end" - │ └── end_keyword_loc: (11,0)-(11,3) = "end" - ├── @ LambdaNode (location: (13,0)-(13,10)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── operator_loc: (13,0)-(13,2) = "->" - │ ├── opening_loc: (13,3)-(13,4) = "{" - │ ├── closing_loc: (13,9)-(13,10) = "}" - │ ├── parameters: ∅ - │ └── body: - │ @ StatementsNode (location: (13,5)-(13,8)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (13,5)-(13,8)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (13,5)-(13,8) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ LambdaNode (location: (15,0)-(15,15)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── operator_loc: (15,0)-(15,2) = "->" - │ ├── opening_loc: (15,3)-(15,5) = "do" - │ ├── closing_loc: (15,12)-(15,15) = "end" - │ ├── parameters: ∅ - │ └── body: - │ @ StatementsNode (location: (15,7)-(15,10)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (15,7)-(15,10)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (15,7)-(15,10) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ LambdaNode (location: (17,0)-(17,29)) - │ ├── flags: newline - │ ├── locals: [:a, :b, :c, :d, :e] - │ ├── operator_loc: (17,0)-(17,2) = "->" - │ ├── opening_loc: (17,24)-(17,25) = "{" - │ ├── closing_loc: (17,28)-(17,29) = "}" - │ ├── parameters: - │ │ @ BlockParametersNode (location: (17,3)-(17,23)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (17,3)-(17,23)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (17,3)-(17,4)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :a - │ │ │ ├── optionals: (length: 1) - │ │ │ │ └── @ OptionalParameterNode (location: (17,6)-(17,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :b - │ │ │ │ ├── name_loc: (17,6)-(17,7) = "b" - │ │ │ │ ├── operator_loc: (17,8)-(17,9) = "=" - │ │ │ │ └── value: - │ │ │ │ @ IntegerNode (location: (17,10)-(17,11)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 2) - │ │ │ │ ├── @ RequiredKeywordParameterNode (location: (17,13)-(17,15)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── name: :c - │ │ │ │ │ └── name_loc: (17,13)-(17,15) = "c:" - │ │ │ │ └── @ RequiredKeywordParameterNode (location: (17,17)-(17,19)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :d - │ │ │ │ └── name_loc: (17,17)-(17,19) = "d:" - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: - │ │ │ @ BlockParameterNode (location: (17,21)-(17,23)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :e - │ │ │ ├── name_loc: (17,22)-(17,23) = "e" - │ │ │ └── operator_loc: (17,21)-(17,22) = "&" - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: ∅ - │ │ └── closing_loc: ∅ - │ └── body: - │ @ StatementsNode (location: (17,26)-(17,27)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ LocalVariableReadNode (location: (17,26)-(17,27)) - │ ├── flags: newline - │ ├── name: :a - │ └── depth: 0 - ├── @ LambdaNode (location: (19,0)-(19,40)) - │ ├── flags: newline - │ ├── locals: [:a, :b, :c, :d, :e, :f, :g] - │ ├── operator_loc: (19,0)-(19,2) = "->" - │ ├── opening_loc: (19,35)-(19,36) = "{" - │ ├── closing_loc: (19,39)-(19,40) = "}" - │ ├── parameters: - │ │ @ BlockParametersNode (location: (19,3)-(19,34)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (19,4)-(19,33)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (19,4)-(19,5)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :a - │ │ │ ├── optionals: (length: 1) - │ │ │ │ └── @ OptionalParameterNode (location: (19,7)-(19,12)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :b - │ │ │ │ ├── name_loc: (19,7)-(19,8) = "b" - │ │ │ │ ├── operator_loc: (19,9)-(19,10) = "=" - │ │ │ │ └── value: - │ │ │ │ @ IntegerNode (location: (19,11)-(19,12)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ ├── rest: - │ │ │ │ @ RestParameterNode (location: (19,14)-(19,16)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :c - │ │ │ │ ├── name_loc: (19,15)-(19,16) = "c" - │ │ │ │ └── operator_loc: (19,14)-(19,15) = "*" - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 2) - │ │ │ │ ├── @ RequiredKeywordParameterNode (location: (19,18)-(19,20)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── name: :d - │ │ │ │ │ └── name_loc: (19,18)-(19,20) = "d:" - │ │ │ │ └── @ RequiredKeywordParameterNode (location: (19,22)-(19,24)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :e - │ │ │ │ └── name_loc: (19,22)-(19,24) = "e:" - │ │ │ ├── keyword_rest: - │ │ │ │ @ KeywordRestParameterNode (location: (19,26)-(19,29)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :f - │ │ │ │ ├── name_loc: (19,28)-(19,29) = "f" - │ │ │ │ └── operator_loc: (19,26)-(19,28) = "**" - │ │ │ └── block: - │ │ │ @ BlockParameterNode (location: (19,31)-(19,33)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :g - │ │ │ ├── name_loc: (19,32)-(19,33) = "g" - │ │ │ └── operator_loc: (19,31)-(19,32) = "&" - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: (19,3)-(19,4) = "(" - │ │ └── closing_loc: (19,33)-(19,34) = ")" - │ └── body: - │ @ StatementsNode (location: (19,37)-(19,38)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ LocalVariableReadNode (location: (19,37)-(19,38)) - │ ├── flags: newline - │ ├── name: :a - │ └── depth: 0 - ├── @ LambdaNode (location: (21,0)-(23,3)) - │ ├── flags: newline - │ ├── locals: [:a, :b, :c, :d, :e, :f, :g] - │ ├── operator_loc: (21,0)-(21,2) = "->" - │ ├── opening_loc: (21,35)-(21,37) = "do" - │ ├── closing_loc: (23,0)-(23,3) = "end" - │ ├── parameters: - │ │ @ BlockParametersNode (location: (21,3)-(21,34)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (21,4)-(21,33)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (21,4)-(21,5)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :a - │ │ │ ├── optionals: (length: 1) - │ │ │ │ └── @ OptionalParameterNode (location: (21,7)-(21,12)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :b - │ │ │ │ ├── name_loc: (21,7)-(21,8) = "b" - │ │ │ │ ├── operator_loc: (21,9)-(21,10) = "=" - │ │ │ │ └── value: - │ │ │ │ @ IntegerNode (location: (21,11)-(21,12)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ ├── rest: - │ │ │ │ @ RestParameterNode (location: (21,14)-(21,16)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :c - │ │ │ │ ├── name_loc: (21,15)-(21,16) = "c" - │ │ │ │ └── operator_loc: (21,14)-(21,15) = "*" - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 2) - │ │ │ │ ├── @ RequiredKeywordParameterNode (location: (21,18)-(21,20)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── name: :d - │ │ │ │ │ └── name_loc: (21,18)-(21,20) = "d:" - │ │ │ │ └── @ RequiredKeywordParameterNode (location: (21,22)-(21,24)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :e - │ │ │ │ └── name_loc: (21,22)-(21,24) = "e:" - │ │ │ ├── keyword_rest: - │ │ │ │ @ KeywordRestParameterNode (location: (21,26)-(21,29)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :f - │ │ │ │ ├── name_loc: (21,28)-(21,29) = "f" - │ │ │ │ └── operator_loc: (21,26)-(21,28) = "**" - │ │ │ └── block: - │ │ │ @ BlockParameterNode (location: (21,31)-(21,33)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :g - │ │ │ ├── name_loc: (21,32)-(21,33) = "g" - │ │ │ └── operator_loc: (21,31)-(21,32) = "&" - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: (21,3)-(21,4) = "(" - │ │ └── closing_loc: (21,33)-(21,34) = ")" - │ └── body: - │ @ StatementsNode (location: (22,2)-(22,3)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ LocalVariableReadNode (location: (22,2)-(22,3)) - │ ├── flags: newline - │ ├── name: :a - │ └── depth: 0 - ├── @ LambdaNode (location: (25,0)-(25,25)) - │ ├── flags: newline - │ ├── locals: [:a] - │ ├── operator_loc: (25,0)-(25,2) = "->" - │ ├── opening_loc: (25,7)-(25,8) = "{" - │ ├── closing_loc: (25,24)-(25,25) = "}" - │ ├── parameters: - │ │ @ BlockParametersNode (location: (25,3)-(25,6)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (25,4)-(25,5)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (25,4)-(25,5)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :a - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: (25,3)-(25,4) = "(" - │ │ └── closing_loc: (25,5)-(25,6) = ")" - │ └── body: - │ @ StatementsNode (location: (25,9)-(25,23)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ LambdaNode (location: (25,9)-(25,23)) - │ ├── flags: newline - │ ├── locals: [:b] - │ ├── operator_loc: (25,9)-(25,11) = "->" - │ ├── opening_loc: (25,14)-(25,15) = "{" - │ ├── closing_loc: (25,22)-(25,23) = "}" - │ ├── parameters: - │ │ @ BlockParametersNode (location: (25,12)-(25,13)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (25,12)-(25,13)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (25,12)-(25,13)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :b - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: ∅ - │ │ └── closing_loc: ∅ - │ └── body: - │ @ StatementsNode (location: (25,16)-(25,21)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (25,16)-(25,21)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (25,16)-(25,17)) - │ │ ├── flags: ∅ - │ │ ├── name: :a - │ │ └── depth: 1 - │ ├── call_operator_loc: ∅ - │ ├── name: :* - │ ├── message_loc: (25,18)-(25,19) = "*" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (25,20)-(25,21)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ LocalVariableReadNode (location: (25,20)-(25,21)) - │ │ ├── flags: ∅ - │ │ ├── name: :b - │ │ └── depth: 0 - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── @ LambdaNode (location: (27,0)-(27,19)) - ├── flags: newline - ├── locals: [:a, :b, :c] - ├── operator_loc: (27,0)-(27,2) = "->" - ├── opening_loc: (27,16)-(27,17) = "{" - ├── closing_loc: (27,18)-(27,19) = "}" - ├── parameters: - │ @ BlockParametersNode (location: (27,3)-(27,15)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (27,4)-(27,14)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ MultiTargetNode (location: (27,4)-(27,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── lefts: (length: 2) - │ │ │ │ ├── @ RequiredParameterNode (location: (27,5)-(27,6)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── name: :a - │ │ │ │ └── @ RequiredParameterNode (location: (27,8)-(27,9)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :b - │ │ │ ├── rest: ∅ - │ │ │ ├── rights: (length: 0) - │ │ │ ├── lparen_loc: (27,4)-(27,5) = "(" - │ │ │ └── rparen_loc: (27,9)-(27,10) = ")" - │ │ ├── optionals: (length: 0) - │ │ ├── rest: - │ │ │ @ RestParameterNode (location: (27,12)-(27,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :c - │ │ │ ├── name_loc: (27,13)-(27,14) = "c" - │ │ │ └── operator_loc: (27,12)-(27,13) = "*" - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (27,3)-(27,4) = "(" - │ └── closing_loc: (27,14)-(27,15) = ")" - └── body: ∅ diff --git a/test/prism/snapshots/range_begin_open_exclusive.txt b/test/prism/snapshots/range_begin_open_exclusive.txt deleted file mode 100644 index e4ca315fc2b031..00000000000000 --- a/test/prism/snapshots/range_begin_open_exclusive.txt +++ /dev/null @@ -1,15 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,4)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,4)) - ├── flags: ∅ - └── body: (length: 1) - └── @ RangeNode (location: (1,0)-(1,4)) - ├── flags: newline, static_literal, exclude_end - ├── left: ∅ - ├── right: - │ @ IntegerNode (location: (1,3)-(1,4)) - │ ├── flags: static_literal, decimal - │ └── value: 2 - └── operator_loc: (1,0)-(1,3) = "..." diff --git a/test/prism/snapshots/range_begin_open_inclusive.txt b/test/prism/snapshots/range_begin_open_inclusive.txt deleted file mode 100644 index 45aa88a5d1007c..00000000000000 --- a/test/prism/snapshots/range_begin_open_inclusive.txt +++ /dev/null @@ -1,15 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ RangeNode (location: (1,0)-(1,3)) - ├── flags: newline, static_literal - ├── left: ∅ - ├── right: - │ @ IntegerNode (location: (1,2)-(1,3)) - │ ├── flags: static_literal, decimal - │ └── value: 2 - └── operator_loc: (1,0)-(1,2) = ".." diff --git a/test/prism/snapshots/range_end_open_exclusive.txt b/test/prism/snapshots/range_end_open_exclusive.txt deleted file mode 100644 index d0d3f810a3718c..00000000000000 --- a/test/prism/snapshots/range_end_open_exclusive.txt +++ /dev/null @@ -1,15 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,4)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,4)) - ├── flags: ∅ - └── body: (length: 1) - └── @ RangeNode (location: (1,0)-(1,4)) - ├── flags: newline, static_literal, exclude_end - ├── left: - │ @ IntegerNode (location: (1,0)-(1,1)) - │ ├── flags: static_literal, decimal - │ └── value: 2 - ├── right: ∅ - └── operator_loc: (1,1)-(1,4) = "..." diff --git a/test/prism/snapshots/range_end_open_inclusive.txt b/test/prism/snapshots/range_end_open_inclusive.txt deleted file mode 100644 index 8bfee649a3cd2e..00000000000000 --- a/test/prism/snapshots/range_end_open_inclusive.txt +++ /dev/null @@ -1,15 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ RangeNode (location: (1,0)-(1,3)) - ├── flags: newline, static_literal - ├── left: - │ @ IntegerNode (location: (1,0)-(1,1)) - │ ├── flags: static_literal, decimal - │ └── value: 2 - ├── right: ∅ - └── operator_loc: (1,1)-(1,3) = ".." diff --git a/test/prism/snapshots/ranges.txt b/test/prism/snapshots/ranges.txt deleted file mode 100644 index 81dbe3d901d827..00000000000000 --- a/test/prism/snapshots/ranges.txt +++ /dev/null @@ -1,548 +0,0 @@ -@ ProgramNode (location: (1,0)-(49,7)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(49,7)) - ├── flags: ∅ - └── body: (length: 25) - ├── @ ParenthesesNode (location: (1,0)-(1,6)) - │ ├── flags: newline - │ ├── body: - │ │ @ StatementsNode (location: (1,1)-(1,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ RangeNode (location: (1,1)-(1,5)) - │ │ ├── flags: newline, static_literal, exclude_end - │ │ ├── left: ∅ - │ │ ├── right: - │ │ │ @ IntegerNode (location: (1,4)-(1,5)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ └── operator_loc: (1,1)-(1,4) = "..." - │ ├── opening_loc: (1,0)-(1,1) = "(" - │ └── closing_loc: (1,5)-(1,6) = ")" - ├── @ ParenthesesNode (location: (3,0)-(3,5)) - │ ├── flags: newline - │ ├── body: - │ │ @ StatementsNode (location: (3,1)-(3,4)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ RangeNode (location: (3,1)-(3,4)) - │ │ ├── flags: newline, static_literal - │ │ ├── left: ∅ - │ │ ├── right: - │ │ │ @ IntegerNode (location: (3,3)-(3,4)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ └── operator_loc: (3,1)-(3,3) = ".." - │ ├── opening_loc: (3,0)-(3,1) = "(" - │ └── closing_loc: (3,4)-(3,5) = ")" - ├── @ RangeNode (location: (5,0)-(5,5)) - │ ├── flags: newline, static_literal, exclude_end - │ ├── left: - │ │ @ IntegerNode (location: (5,0)-(5,1)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── right: - │ │ @ IntegerNode (location: (5,4)-(5,5)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ └── operator_loc: (5,1)-(5,4) = "..." - ├── @ CallNode (location: (7,0)-(7,9)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (7,0)-(7,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (7,0)-(7,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :[] - │ ├── message_loc: (7,3)-(7,9) = "[...2]" - │ ├── opening_loc: (7,3)-(7,4) = "[" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (7,4)-(7,8)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ RangeNode (location: (7,4)-(7,8)) - │ │ ├── flags: static_literal, exclude_end - │ │ ├── left: ∅ - │ │ ├── right: - │ │ │ @ IntegerNode (location: (7,7)-(7,8)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ └── operator_loc: (7,4)-(7,7) = "..." - │ ├── closing_loc: (7,8)-(7,9) = "]" - │ └── block: ∅ - ├── @ HashNode (location: (9,0)-(9,15)) - │ ├── flags: newline - │ ├── opening_loc: (9,0)-(9,1) = "{" - │ ├── elements: (length: 1) - │ │ └── @ AssocNode (location: (9,2)-(9,13)) - │ │ ├── flags: ∅ - │ │ ├── key: - │ │ │ @ SymbolNode (location: (9,2)-(9,6)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (9,2)-(9,5) = "foo" - │ │ │ ├── closing_loc: (9,5)-(9,6) = ":" - │ │ │ └── unescaped: "foo" - │ │ ├── value: - │ │ │ @ RangeNode (location: (9,7)-(9,13)) - │ │ │ ├── flags: exclude_end - │ │ │ ├── left: ∅ - │ │ │ ├── right: - │ │ │ │ @ CallNode (location: (9,10)-(9,13)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :bar - │ │ │ │ ├── message_loc: (9,10)-(9,13) = "bar" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── operator_loc: (9,7)-(9,10) = "..." - │ │ └── operator_loc: ∅ - │ └── closing_loc: (9,14)-(9,15) = "}" - ├── @ ParenthesesNode (location: (11,0)-(11,6)) - │ ├── flags: newline - │ ├── body: - │ │ @ StatementsNode (location: (11,1)-(11,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ RangeNode (location: (11,1)-(11,5)) - │ │ ├── flags: newline, static_literal, exclude_end - │ │ ├── left: - │ │ │ @ IntegerNode (location: (11,1)-(11,2)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── right: ∅ - │ │ └── operator_loc: (11,2)-(11,5) = "..." - │ ├── opening_loc: (11,0)-(11,1) = "(" - │ └── closing_loc: (11,5)-(11,6) = ")" - ├── @ RangeNode (location: (13,0)-(13,4)) - │ ├── flags: newline, static_literal - │ ├── left: - │ │ @ IntegerNode (location: (13,0)-(13,1)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── right: - │ │ @ IntegerNode (location: (13,3)-(13,4)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ └── operator_loc: (13,1)-(13,3) = ".." - ├── @ HashNode (location: (15,0)-(15,14)) - │ ├── flags: newline - │ ├── opening_loc: (15,0)-(15,1) = "{" - │ ├── elements: (length: 1) - │ │ └── @ AssocNode (location: (15,2)-(15,12)) - │ │ ├── flags: ∅ - │ │ ├── key: - │ │ │ @ SymbolNode (location: (15,2)-(15,6)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (15,2)-(15,5) = "foo" - │ │ │ ├── closing_loc: (15,5)-(15,6) = ":" - │ │ │ └── unescaped: "foo" - │ │ ├── value: - │ │ │ @ RangeNode (location: (15,7)-(15,12)) - │ │ │ ├── flags: ∅ - │ │ │ ├── left: ∅ - │ │ │ ├── right: - │ │ │ │ @ CallNode (location: (15,9)-(15,12)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :bar - │ │ │ │ ├── message_loc: (15,9)-(15,12) = "bar" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── operator_loc: (15,7)-(15,9) = ".." - │ │ └── operator_loc: ∅ - │ └── closing_loc: (15,13)-(15,14) = "}" - ├── @ ParenthesesNode (location: (17,0)-(17,5)) - │ ├── flags: newline - │ ├── body: - │ │ @ StatementsNode (location: (17,1)-(17,4)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ RangeNode (location: (17,1)-(17,4)) - │ │ ├── flags: newline, static_literal - │ │ ├── left: - │ │ │ @ IntegerNode (location: (17,1)-(17,2)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── right: ∅ - │ │ └── operator_loc: (17,2)-(17,4) = ".." - │ ├── opening_loc: (17,0)-(17,1) = "(" - │ └── closing_loc: (17,4)-(17,5) = ")" - ├── @ RangeNode (location: (19,0)-(19,8)) - │ ├── flags: newline - │ ├── left: - │ │ @ IntegerNode (location: (19,0)-(19,1)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── right: - │ │ @ RangeNode (location: (19,5)-(19,8)) - │ │ ├── flags: static_literal - │ │ ├── left: ∅ - │ │ ├── right: - │ │ │ @ IntegerNode (location: (19,7)-(19,8)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── operator_loc: (19,5)-(19,7) = ".." - │ └── operator_loc: (19,2)-(19,4) = ".." - ├── @ AndNode (location: (21,0)-(21,8)) - │ ├── flags: newline - │ ├── left: - │ │ @ RangeNode (location: (21,0)-(21,3)) - │ │ ├── flags: static_literal - │ │ ├── left: - │ │ │ @ IntegerNode (location: (21,0)-(21,1)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── right: ∅ - │ │ └── operator_loc: (21,1)-(21,3) = ".." - │ ├── right: - │ │ @ IntegerNode (location: (21,7)-(21,8)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ └── operator_loc: (21,4)-(21,6) = "&&" - ├── @ CallNode (location: (23,0)-(23,8)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ RangeNode (location: (23,0)-(23,3)) - │ │ ├── flags: static_literal - │ │ ├── left: - │ │ │ @ IntegerNode (location: (23,0)-(23,1)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── right: ∅ - │ │ └── operator_loc: (23,1)-(23,3) = ".." - │ ├── call_operator_loc: ∅ - │ ├── name: :== - │ ├── message_loc: (23,4)-(23,6) = "==" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (23,7)-(23,8)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (23,7)-(23,8)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (25,0)-(25,8)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ RangeNode (location: (25,0)-(25,3)) - │ │ ├── flags: static_literal - │ │ ├── left: - │ │ │ @ IntegerNode (location: (25,0)-(25,1)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── right: ∅ - │ │ └── operator_loc: (25,1)-(25,3) = ".." - │ ├── call_operator_loc: ∅ - │ ├── name: :!= - │ ├── message_loc: (25,4)-(25,6) = "!=" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (25,7)-(25,8)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (25,7)-(25,8)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (27,0)-(27,9)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ RangeNode (location: (27,0)-(27,3)) - │ │ ├── flags: static_literal - │ │ ├── left: - │ │ │ @ IntegerNode (location: (27,0)-(27,1)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── right: ∅ - │ │ └── operator_loc: (27,1)-(27,3) = ".." - │ ├── call_operator_loc: ∅ - │ ├── name: :=== - │ ├── message_loc: (27,4)-(27,7) = "===" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (27,8)-(27,9)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (27,8)-(27,9)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (29,0)-(29,9)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ RangeNode (location: (29,0)-(29,3)) - │ │ ├── flags: static_literal - │ │ ├── left: - │ │ │ @ IntegerNode (location: (29,0)-(29,1)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── right: ∅ - │ │ └── operator_loc: (29,1)-(29,3) = ".." - │ ├── call_operator_loc: ∅ - │ ├── name: :<=> - │ ├── message_loc: (29,4)-(29,7) = "<=>" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (29,8)-(29,9)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (29,8)-(29,9)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (31,0)-(31,8)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ RangeNode (location: (31,0)-(31,3)) - │ │ ├── flags: static_literal - │ │ ├── left: - │ │ │ @ IntegerNode (location: (31,0)-(31,1)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── right: ∅ - │ │ └── operator_loc: (31,1)-(31,3) = ".." - │ ├── call_operator_loc: ∅ - │ ├── name: :=~ - │ ├── message_loc: (31,4)-(31,6) = "=~" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (31,7)-(31,8)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (31,7)-(31,8)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (33,0)-(33,8)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ RangeNode (location: (33,0)-(33,3)) - │ │ ├── flags: static_literal - │ │ ├── left: - │ │ │ @ IntegerNode (location: (33,0)-(33,1)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── right: ∅ - │ │ └── operator_loc: (33,1)-(33,3) = ".." - │ ├── call_operator_loc: ∅ - │ ├── name: :!~ - │ ├── message_loc: (33,4)-(33,6) = "!~" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (33,7)-(33,8)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (33,7)-(33,8)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (35,0)-(35,7)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ RangeNode (location: (35,0)-(35,3)) - │ │ ├── flags: static_literal - │ │ ├── left: - │ │ │ @ IntegerNode (location: (35,0)-(35,1)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── right: ∅ - │ │ └── operator_loc: (35,1)-(35,3) = ".." - │ ├── call_operator_loc: ∅ - │ ├── name: :< - │ ├── message_loc: (35,4)-(35,5) = "<" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (35,6)-(35,7)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (35,6)-(35,7)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (37,0)-(37,7)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ RangeNode (location: (37,0)-(37,3)) - │ │ ├── flags: static_literal - │ │ ├── left: - │ │ │ @ IntegerNode (location: (37,0)-(37,1)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── right: ∅ - │ │ └── operator_loc: (37,1)-(37,3) = ".." - │ ├── call_operator_loc: ∅ - │ ├── name: :> - │ ├── message_loc: (37,4)-(37,5) = ">" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (37,6)-(37,7)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (37,6)-(37,7)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (39,0)-(39,8)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ RangeNode (location: (39,0)-(39,3)) - │ │ ├── flags: static_literal - │ │ ├── left: - │ │ │ @ IntegerNode (location: (39,0)-(39,1)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── right: ∅ - │ │ └── operator_loc: (39,1)-(39,3) = ".." - │ ├── call_operator_loc: ∅ - │ ├── name: :<= - │ ├── message_loc: (39,4)-(39,6) = "<=" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (39,7)-(39,8)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (39,7)-(39,8)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (41,0)-(41,8)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ RangeNode (location: (41,0)-(41,3)) - │ │ ├── flags: static_literal - │ │ ├── left: - │ │ │ @ IntegerNode (location: (41,0)-(41,1)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── right: ∅ - │ │ └── operator_loc: (41,1)-(41,3) = ".." - │ ├── call_operator_loc: ∅ - │ ├── name: :>= - │ ├── message_loc: (41,4)-(41,6) = ">=" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (41,7)-(41,8)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (41,7)-(41,8)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (43,0)-(43,8)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ RangeNode (location: (43,0)-(43,3)) - │ │ ├── flags: static_literal - │ │ ├── left: - │ │ │ @ IntegerNode (location: (43,0)-(43,1)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── right: ∅ - │ │ └── operator_loc: (43,1)-(43,3) = ".." - │ ├── call_operator_loc: ∅ - │ ├── name: :<< - │ ├── message_loc: (43,4)-(43,6) = "<<" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (43,7)-(43,8)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (43,7)-(43,8)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (45,0)-(45,8)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ RangeNode (location: (45,0)-(45,3)) - │ │ ├── flags: static_literal - │ │ ├── left: - │ │ │ @ IntegerNode (location: (45,0)-(45,1)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── right: ∅ - │ │ └── operator_loc: (45,1)-(45,3) = ".." - │ ├── call_operator_loc: ∅ - │ ├── name: :>> - │ ├── message_loc: (45,4)-(45,6) = ">>" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (45,7)-(45,8)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (45,7)-(45,8)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ RangeNode (location: (47,0)-(47,7)) - │ ├── flags: newline - │ ├── left: - │ │ @ IntegerNode (location: (47,0)-(47,1)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── right: - │ │ @ CallNode (location: (47,4)-(47,7)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ IntegerNode (location: (47,6)-(47,7)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :+@ - │ │ ├── message_loc: (47,4)-(47,5) = "+" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── operator_loc: (47,1)-(47,3) = ".." - └── @ RangeNode (location: (49,0)-(49,7)) - ├── flags: newline - ├── left: - │ @ IntegerNode (location: (49,0)-(49,1)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── right: - │ @ CallNode (location: (49,4)-(49,7)) - │ ├── flags: ∅ - │ ├── receiver: - │ │ @ IntegerNode (location: (49,6)-(49,7)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── call_operator_loc: ∅ - │ ├── name: :-@ - │ ├── message_loc: (49,4)-(49,5) = "-" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── operator_loc: (49,1)-(49,3) = ".." diff --git a/test/prism/snapshots/regex.txt b/test/prism/snapshots/regex.txt deleted file mode 100644 index c90e68976070a7..00000000000000 --- a/test/prism/snapshots/regex.txt +++ /dev/null @@ -1,545 +0,0 @@ -@ ProgramNode (location: (1,0)-(48,10)) -├── flags: ∅ -├── locals: [:foo, :ab, :abc, :a] -└── statements: - @ StatementsNode (location: (1,0)-(48,10)) - ├── flags: ∅ - └── body: (length: 26) - ├── @ CallNode (location: (1,0)-(1,9)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (1,0)-(1,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,4)-(1,9)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ RegularExpressionNode (location: (1,4)-(1,9)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (1,4)-(1,5) = "/" - │ │ ├── content_loc: (1,5)-(1,8) = "bar" - │ │ ├── closing_loc: (1,8)-(1,9) = "/" - │ │ └── unescaped: "bar" - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ RegularExpressionNode (location: (3,0)-(3,8)) - │ ├── flags: newline, static_literal, ignore_case, forced_us_ascii_encoding - │ ├── opening_loc: (3,0)-(3,3) = "%r{" - │ ├── content_loc: (3,3)-(3,6) = "abc" - │ ├── closing_loc: (3,6)-(3,8) = "}i" - │ └── unescaped: "abc" - ├── @ RegularExpressionNode (location: (5,0)-(5,5)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (5,0)-(5,1) = "/" - │ ├── content_loc: (5,1)-(5,4) = "a\\b" - │ ├── closing_loc: (5,4)-(5,5) = "/" - │ └── unescaped: "a\\b" - ├── @ InterpolatedRegularExpressionNode (location: (7,0)-(7,11)) - │ ├── flags: newline - │ ├── opening_loc: (7,0)-(7,1) = "/" - │ ├── parts: (length: 2) - │ │ ├── @ StringNode (location: (7,1)-(7,5)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (7,1)-(7,5) = "aaa " - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "aaa " - │ │ └── @ EmbeddedVariableNode (location: (7,5)-(7,10)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (7,5)-(7,6) = "#" - │ │ └── variable: - │ │ @ GlobalVariableReadNode (location: (7,6)-(7,10)) - │ │ ├── flags: ∅ - │ │ └── name: :$bbb - │ └── closing_loc: (7,10)-(7,11) = "/" - ├── @ InterpolatedRegularExpressionNode (location: (9,0)-(9,16)) - │ ├── flags: newline - │ ├── opening_loc: (9,0)-(9,1) = "/" - │ ├── parts: (length: 3) - │ │ ├── @ StringNode (location: (9,1)-(9,5)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (9,1)-(9,5) = "aaa " - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "aaa " - │ │ ├── @ EmbeddedStatementsNode (location: (9,5)-(9,11)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (9,5)-(9,7) = "\#{" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (9,7)-(9,10)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (9,7)-(9,10)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :bbb - │ │ │ │ ├── message_loc: (9,7)-(9,10) = "bbb" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── closing_loc: (9,10)-(9,11) = "}" - │ │ └── @ StringNode (location: (9,11)-(9,15)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (9,11)-(9,15) = " ccc" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: " ccc" - │ └── closing_loc: (9,15)-(9,16) = "/" - ├── @ ArrayNode (location: (11,0)-(11,27)) - │ ├── flags: newline - │ ├── elements: (length: 2) - │ │ ├── @ MatchWriteNode (location: (11,1)-(11,21)) - │ │ │ ├── flags: ∅ - │ │ │ ├── call: - │ │ │ │ @ CallNode (location: (11,1)-(11,21)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── receiver: - │ │ │ │ │ @ RegularExpressionNode (location: (11,1)-(11,14)) - │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ │ ├── opening_loc: (11,1)-(11,2) = "/" - │ │ │ │ │ ├── content_loc: (11,2)-(11,13) = "(?bar)" - │ │ │ │ │ ├── closing_loc: (11,13)-(11,14) = "/" - │ │ │ │ │ └── unescaped: "(?bar)" - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :=~ - │ │ │ │ ├── message_loc: (11,15)-(11,17) = "=~" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: - │ │ │ │ │ @ ArgumentsNode (location: (11,18)-(11,21)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── arguments: (length: 1) - │ │ │ │ │ └── @ CallNode (location: (11,18)-(11,21)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :baz - │ │ │ │ │ ├── message_loc: (11,18)-(11,21) = "baz" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── targets: (length: 1) - │ │ │ └── @ LocalVariableTargetNode (location: (11,5)-(11,8)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :foo - │ │ │ └── depth: 0 - │ │ └── @ LocalVariableReadNode (location: (11,23)-(11,26)) - │ │ ├── flags: ∅ - │ │ ├── name: :foo - │ │ └── depth: 0 - │ ├── opening_loc: (11,0)-(11,1) = "[" - │ └── closing_loc: (11,26)-(11,27) = "]" - ├── @ RegularExpressionNode (location: (13,0)-(13,6)) - │ ├── flags: newline, static_literal, ignore_case, forced_us_ascii_encoding - │ ├── opening_loc: (13,0)-(13,1) = "/" - │ ├── content_loc: (13,1)-(13,4) = "abc" - │ ├── closing_loc: (13,4)-(13,6) = "/i" - │ └── unescaped: "abc" - ├── @ RegularExpressionNode (location: (15,0)-(15,26)) - │ ├── flags: newline, static_literal, ignore_case, forced_us_ascii_encoding - │ ├── opening_loc: (15,0)-(15,3) = "%r/" - │ ├── content_loc: (15,3)-(15,24) = "[a-z$._?][\\w$.?\#@~]*:" - │ ├── closing_loc: (15,24)-(15,26) = "/i" - │ └── unescaped: "[a-z$._?][\\w$.?\#@~]*:" - ├── @ RegularExpressionNode (location: (17,0)-(17,37)) - │ ├── flags: newline, static_literal, ignore_case, forced_us_ascii_encoding - │ ├── opening_loc: (17,0)-(17,3) = "%r/" - │ ├── content_loc: (17,3)-(17,35) = "([a-z$._?][\\w$.?\#@~]*)(\\s+)(equ)" - │ ├── closing_loc: (17,35)-(17,37) = "/i" - │ └── unescaped: "([a-z$._?][\\w$.?\#@~]*)(\\s+)(equ)" - ├── @ RegularExpressionNode (location: (19,0)-(19,25)) - │ ├── flags: newline, static_literal, ignore_case, forced_us_ascii_encoding - │ ├── opening_loc: (19,0)-(19,3) = "%r/" - │ ├── content_loc: (19,3)-(19,23) = "[a-z$._?][\\w$.?\#@~]*" - │ ├── closing_loc: (19,23)-(19,25) = "/i" - │ └── unescaped: "[a-z$._?][\\w$.?\#@~]*" - ├── @ RegularExpressionNode (location: (21,0)-(24,1)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (21,0)-(21,3) = "%r(" - │ ├── content_loc: (21,3)-(24,0) = "\n(?:[\#$%_']|\\(\\)|\\(,\\)|\\[\\]|[0-9])*\n (?:[\#$%_']+)\n" - │ ├── closing_loc: (24,0)-(24,1) = ")" - │ └── unescaped: "\n(?:[\#$%_']|\\(\\)|\\(,\\)|\\[\\]|[0-9])*\n (?:[\#$%_']+)\n" - ├── @ CallNode (location: (26,0)-(26,16)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ RegularExpressionNode (location: (26,0)-(26,8)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (26,0)-(26,1) = "/" - │ │ ├── content_loc: (26,1)-(26,7) = "(?#\\))" - │ │ ├── closing_loc: (26,7)-(26,8) = "/" - │ │ └── unescaped: "(?#\\))" - │ ├── call_operator_loc: ∅ - │ ├── name: :=~ - │ ├── message_loc: (26,9)-(26,11) = "=~" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (26,12)-(26,16)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ StringNode (location: (26,12)-(26,16)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (26,12)-(26,13) = "\"" - │ │ ├── content_loc: (26,13)-(26,15) = "hi" - │ │ ├── closing_loc: (26,15)-(26,16) = "\"" - │ │ └── unescaped: "hi" - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ RegularExpressionNode (location: (28,0)-(28,9)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (28,0)-(28,3) = "%r#" - │ ├── content_loc: (28,3)-(28,8) = "pound" - │ ├── closing_loc: (28,8)-(28,9) = "#" - │ └── unescaped: "pound" - ├── @ InterpolatedRegularExpressionNode (location: (30,0)-(30,13)) - │ ├── flags: newline, once - │ ├── opening_loc: (30,0)-(30,1) = "/" - │ ├── parts: (length: 2) - │ │ ├── @ StringNode (location: (30,1)-(30,5)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (30,1)-(30,5) = "aaa " - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "aaa " - │ │ └── @ EmbeddedStatementsNode (location: (30,5)-(30,11)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (30,5)-(30,7) = "\#{" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (30,7)-(30,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (30,7)-(30,10)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bbb - │ │ │ ├── message_loc: (30,7)-(30,10) = "bbb" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── closing_loc: (30,10)-(30,11) = "}" - │ └── closing_loc: (30,11)-(30,13) = "/o" - ├── @ MatchWriteNode (location: (32,0)-(33,10)) - │ ├── flags: newline - │ ├── call: - │ │ @ CallNode (location: (32,0)-(33,10)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ RegularExpressionNode (location: (32,0)-(33,4)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (32,0)-(32,1) = "/" - │ │ │ ├── content_loc: (32,1)-(33,3) = "(?)" - │ │ │ ├── closing_loc: (33,3)-(33,4) = "/" - │ │ │ └── unescaped: "(?)" - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :=~ - │ │ ├── message_loc: (33,5)-(33,7) = "=~" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (33,8)-(33,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ StringNode (location: (33,8)-(33,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (33,8)-(33,9) = "\"" - │ │ │ ├── content_loc: (33,9)-(33,9) = "" - │ │ │ ├── closing_loc: (33,9)-(33,10) = "\"" - │ │ │ └── unescaped: "" - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── targets: (length: 1) - │ └── @ LocalVariableTargetNode (location: (32,0)-(33,4)) - │ ├── flags: ∅ - │ ├── name: :ab - │ └── depth: 0 - ├── @ LocalVariableReadNode (location: (33,12)-(33,14)) - │ ├── flags: newline - │ ├── name: :ab - │ └── depth: 0 - ├── @ MatchWriteNode (location: (35,0)-(35,24)) - │ ├── flags: newline - │ ├── call: - │ │ @ CallNode (location: (35,0)-(35,24)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ RegularExpressionNode (location: (35,0)-(35,18)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (35,0)-(35,1) = "/" - │ │ │ ├── content_loc: (35,1)-(35,17) = "(?)(?)" - │ │ │ ├── closing_loc: (35,17)-(35,18) = "/" - │ │ │ └── unescaped: "(?)(?)" - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :=~ - │ │ ├── message_loc: (35,19)-(35,21) = "=~" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (35,22)-(35,24)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ StringNode (location: (35,22)-(35,24)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (35,22)-(35,23) = "\"" - │ │ │ ├── content_loc: (35,23)-(35,23) = "" - │ │ │ ├── closing_loc: (35,23)-(35,24) = "\"" - │ │ │ └── unescaped: "" - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── targets: (length: 1) - │ └── @ LocalVariableTargetNode (location: (35,4)-(35,7)) - │ ├── flags: ∅ - │ ├── name: :abc - │ └── depth: 0 - ├── @ LocalVariableReadNode (location: (35,26)-(35,29)) - │ ├── flags: newline - │ ├── name: :abc - │ └── depth: 0 - ├── @ CallNode (location: (37,0)-(37,16)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ RegularExpressionNode (location: (37,0)-(37,10)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (37,0)-(37,1) = "/" - │ │ ├── content_loc: (37,1)-(37,9) = "(?)" - │ │ ├── closing_loc: (37,9)-(37,10) = "/" - │ │ └── unescaped: "(?)" - │ ├── call_operator_loc: ∅ - │ ├── name: :=~ - │ ├── message_loc: (37,11)-(37,13) = "=~" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (37,14)-(37,16)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ StringNode (location: (37,14)-(37,16)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (37,14)-(37,15) = "\"" - │ │ ├── content_loc: (37,15)-(37,15) = "" - │ │ ├── closing_loc: (37,15)-(37,16) = "\"" - │ │ └── unescaped: "" - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ LocalVariableWriteNode (location: (39,0)-(39,5)) - │ ├── flags: newline - │ ├── name: :a - │ ├── depth: 0 - │ ├── name_loc: (39,0)-(39,1) = "a" - │ ├── value: - │ │ @ IntegerNode (location: (39,4)-(39,5)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ └── operator_loc: (39,2)-(39,3) = "=" - ├── @ CallNode (location: (40,0)-(40,24)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :tap - │ ├── message_loc: (40,0)-(40,3) = "tap" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (40,4)-(40,24)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (40,6)-(40,22)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ MatchWriteNode (location: (40,6)-(40,22)) - │ │ ├── flags: newline - │ │ ├── call: - │ │ │ @ CallNode (location: (40,6)-(40,22)) - │ │ │ ├── flags: ∅ - │ │ │ ├── receiver: - │ │ │ │ @ RegularExpressionNode (location: (40,6)-(40,14)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: (40,6)-(40,7) = "/" - │ │ │ │ ├── content_loc: (40,7)-(40,13) = "(?)" - │ │ │ │ ├── closing_loc: (40,13)-(40,14) = "/" - │ │ │ │ └── unescaped: "(?)" - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :=~ - │ │ │ ├── message_loc: (40,15)-(40,17) = "=~" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (40,18)-(40,22)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ CallNode (location: (40,18)-(40,22)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :to_s - │ │ │ │ ├── message_loc: (40,18)-(40,22) = "to_s" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── targets: (length: 1) - │ │ └── @ LocalVariableTargetNode (location: (40,10)-(40,11)) - │ │ ├── flags: ∅ - │ │ ├── name: :a - │ │ └── depth: 1 - │ ├── opening_loc: (40,4)-(40,5) = "{" - │ └── closing_loc: (40,23)-(40,24) = "}" - ├── @ MatchWriteNode (location: (42,0)-(42,16)) - │ ├── flags: newline - │ ├── call: - │ │ @ CallNode (location: (42,0)-(42,16)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ RegularExpressionNode (location: (42,0)-(42,10)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (42,0)-(42,1) = "/" - │ │ │ ├── content_loc: (42,1)-(42,9) = "(?)" - │ │ │ ├── closing_loc: (42,9)-(42,10) = "/" - │ │ │ └── unescaped: "(?)" - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :=~ - │ │ ├── message_loc: (42,11)-(42,13) = "=~" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (42,14)-(42,16)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ StringNode (location: (42,14)-(42,16)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (42,14)-(42,15) = "\"" - │ │ │ ├── content_loc: (42,15)-(42,15) = "" - │ │ │ ├── closing_loc: (42,15)-(42,16) = "\"" - │ │ │ └── unescaped: "" - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── targets: (length: 1) - │ └── @ LocalVariableTargetNode (location: (42,4)-(42,7)) - │ ├── flags: ∅ - │ ├── name: :foo - │ └── depth: 0 - ├── @ CallNode (location: (43,0)-(43,16)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ RegularExpressionNode (location: (43,0)-(43,10)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (43,0)-(43,1) = "/" - │ │ ├── content_loc: (43,1)-(43,9) = "(?)" - │ │ ├── closing_loc: (43,9)-(43,10) = "/" - │ │ └── unescaped: "(?)" - │ ├── call_operator_loc: ∅ - │ ├── name: :=~ - │ ├── message_loc: (43,11)-(43,13) = "=~" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (43,14)-(43,16)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ StringNode (location: (43,14)-(43,16)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (43,14)-(43,15) = "\"" - │ │ ├── content_loc: (43,15)-(43,15) = "" - │ │ ├── closing_loc: (43,15)-(43,16) = "\"" - │ │ └── unescaped: "" - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (45,0)-(45,16)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ RegularExpressionNode (location: (45,0)-(45,10)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (45,0)-(45,1) = "/" - │ │ ├── content_loc: (45,1)-(45,9) = "(?)" - │ │ ├── closing_loc: (45,9)-(45,10) = "/" - │ │ └── unescaped: "(?)" - │ ├── call_operator_loc: ∅ - │ ├── name: :=~ - │ ├── message_loc: (45,11)-(45,13) = "=~" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (45,14)-(45,16)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ StringNode (location: (45,14)-(45,16)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (45,14)-(45,15) = "\"" - │ │ ├── content_loc: (45,15)-(45,15) = "" - │ │ ├── closing_loc: (45,15)-(45,16) = "\"" - │ │ └── unescaped: "" - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ DefNode (location: (46,0)-(46,32)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (46,4)-(46,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (46,8)-(46,12)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 1) - │ │ │ └── @ RequiredKeywordParameterNode (location: (46,8)-(46,12)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :nil - │ │ │ └── name_loc: (46,8)-(46,12) = "nil:" - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (46,16)-(46,32)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ MatchWriteNode (location: (46,16)-(46,32)) - │ │ ├── flags: ∅ - │ │ ├── call: - │ │ │ @ CallNode (location: (46,16)-(46,32)) - │ │ │ ├── flags: ∅ - │ │ │ ├── receiver: - │ │ │ │ @ RegularExpressionNode (location: (46,16)-(46,26)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: (46,16)-(46,17) = "/" - │ │ │ │ ├── content_loc: (46,17)-(46,25) = "(?)" - │ │ │ │ ├── closing_loc: (46,25)-(46,26) = "/" - │ │ │ │ └── unescaped: "(?)" - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :=~ - │ │ │ ├── message_loc: (46,27)-(46,29) = "=~" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (46,30)-(46,32)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ StringNode (location: (46,30)-(46,32)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── opening_loc: (46,30)-(46,31) = "\"" - │ │ │ │ ├── content_loc: (46,31)-(46,31) = "" - │ │ │ │ ├── closing_loc: (46,31)-(46,32) = "\"" - │ │ │ │ └── unescaped: "" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── targets: (length: 1) - │ │ └── @ LocalVariableTargetNode (location: (46,20)-(46,23)) - │ │ ├── flags: ∅ - │ │ ├── name: :nil - │ │ └── depth: 0 - │ ├── locals: [:nil] - │ ├── def_keyword_loc: (46,0)-(46,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (46,7)-(46,8) = "(" - │ ├── rparen_loc: (46,12)-(46,13) = ")" - │ ├── equal_loc: (46,14)-(46,15) = "=" - │ └── end_keyword_loc: ∅ - └── @ RegularExpressionNode (location: (48,0)-(48,10)) - ├── flags: newline, static_literal, extended, forced_us_ascii_encoding - ├── opening_loc: (48,0)-(48,1) = "/" - ├── content_loc: (48,1)-(48,8) = "(?-x:#)" - ├── closing_loc: (48,8)-(48,10) = "/x" - └── unescaped: "(?-x:#)" diff --git a/test/prism/snapshots/regex_char_width.txt b/test/prism/snapshots/regex_char_width.txt deleted file mode 100644 index 664e4e8850a254..00000000000000 --- a/test/prism/snapshots/regex_char_width.txt +++ /dev/null @@ -1,57 +0,0 @@ -@ ProgramNode (location: (2,0)-(3,6)) -├── flags: ∅ -├── locals: [:a, :b] -└── statements: - @ StatementsNode (location: (2,0)-(3,6)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ MatchWriteNode (location: (2,0)-(2,36)) - │ ├── flags: newline - │ ├── call: - │ │ @ CallNode (location: (2,0)-(2,36)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ RegularExpressionNode (location: (2,0)-(2,22)) - │ │ │ ├── flags: static_literal - │ │ │ ├── opening_loc: (2,0)-(2,1) = "/" - │ │ │ ├── content_loc: (2,1)-(2,21) = "\x{E285}\xA7(?.)\x{E285}\xA9(?.)" - │ │ │ ├── closing_loc: (2,21)-(2,22) = "/" - │ │ │ └── unescaped: "\x{E285}\xA7(?.)\x{E285}\xA9(?.)" - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :=~ - │ │ ├── message_loc: (2,23)-(2,25) = "=~" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (2,26)-(2,36)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ StringNode (location: (2,26)-(2,36)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (2,26)-(2,27) = "'" - │ │ │ ├── content_loc: (2,27)-(2,35) = "\x{E285}\xA7a\x{E285}\xA9b" - │ │ │ ├── closing_loc: (2,35)-(2,36) = "'" - │ │ │ └── unescaped: "\x{E285}\xA7a\x{E285}\xA9b" - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── targets: (length: 2) - │ ├── @ LocalVariableTargetNode (location: (2,7)-(2,8)) - │ │ ├── flags: ∅ - │ │ ├── name: :a - │ │ └── depth: 0 - │ └── @ LocalVariableTargetNode (location: (2,17)-(2,18)) - │ ├── flags: ∅ - │ ├── name: :b - │ └── depth: 0 - └── @ ArrayNode (location: (3,0)-(3,6)) - ├── flags: newline - ├── elements: (length: 2) - │ ├── @ LocalVariableReadNode (location: (3,1)-(3,2)) - │ │ ├── flags: ∅ - │ │ ├── name: :a - │ │ └── depth: 0 - │ └── @ LocalVariableReadNode (location: (3,4)-(3,5)) - │ ├── flags: ∅ - │ ├── name: :b - │ └── depth: 0 - ├── opening_loc: (3,0)-(3,1) = "[" - └── closing_loc: (3,5)-(3,6) = "]" diff --git a/test/prism/snapshots/repeat_parameters.txt b/test/prism/snapshots/repeat_parameters.txt deleted file mode 100644 index 1dbf120e9cbbac..00000000000000 --- a/test/prism/snapshots/repeat_parameters.txt +++ /dev/null @@ -1,509 +0,0 @@ -@ ProgramNode (location: (1,0)-(38,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(38,3)) - ├── flags: ∅ - └── body: (length: 13) - ├── @ DefNode (location: (1,0)-(2,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (1,4)-(1,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,8)-(1,12)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 2) - │ │ │ ├── @ RequiredParameterNode (location: (1,8)-(1,9)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :a - │ │ │ └── @ RequiredParameterNode (location: (1,11)-(1,12)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :_ - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:a, :_] - │ ├── def_keyword_loc: (1,0)-(1,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (1,7)-(1,8) = "(" - │ ├── rparen_loc: (1,12)-(1,13) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (2,0)-(2,3) = "end" - ├── @ DefNode (location: (4,0)-(5,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (4,4)-(4,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (4,8)-(4,15)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 3) - │ │ │ ├── @ RequiredParameterNode (location: (4,8)-(4,9)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :a - │ │ │ ├── @ RequiredParameterNode (location: (4,11)-(4,12)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :_ - │ │ │ └── @ RequiredParameterNode (location: (4,14)-(4,15)) - │ │ │ ├── flags: repeated_parameter - │ │ │ └── name: :_ - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:a, :_] - │ ├── def_keyword_loc: (4,0)-(4,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (4,7)-(4,8) = "(" - │ ├── rparen_loc: (4,15)-(4,16) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (5,0)-(5,3) = "end" - ├── @ DefNode (location: (7,0)-(8,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (7,4)-(7,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (7,8)-(7,19)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 4) - │ │ │ ├── @ RequiredParameterNode (location: (7,8)-(7,9)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :a - │ │ │ ├── @ RequiredParameterNode (location: (7,11)-(7,12)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :_ - │ │ │ ├── @ RequiredParameterNode (location: (7,14)-(7,15)) - │ │ │ │ ├── flags: repeated_parameter - │ │ │ │ └── name: :_ - │ │ │ └── @ RequiredParameterNode (location: (7,17)-(7,19)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :_b - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:a, :_, :_b] - │ ├── def_keyword_loc: (7,0)-(7,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (7,7)-(7,8) = "(" - │ ├── rparen_loc: (7,19)-(7,20) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (8,0)-(8,3) = "end" - ├── @ DefNode (location: (10,0)-(11,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (10,4)-(10,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (10,8)-(10,23)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 5) - │ │ │ ├── @ RequiredParameterNode (location: (10,8)-(10,9)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :a - │ │ │ ├── @ RequiredParameterNode (location: (10,11)-(10,12)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :_ - │ │ │ ├── @ RequiredParameterNode (location: (10,14)-(10,15)) - │ │ │ │ ├── flags: repeated_parameter - │ │ │ │ └── name: :_ - │ │ │ ├── @ RequiredParameterNode (location: (10,17)-(10,19)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :_b - │ │ │ └── @ RequiredParameterNode (location: (10,21)-(10,23)) - │ │ │ ├── flags: repeated_parameter - │ │ │ └── name: :_b - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:a, :_, :_b] - │ ├── def_keyword_loc: (10,0)-(10,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (10,7)-(10,8) = "(" - │ ├── rparen_loc: (10,23)-(10,24) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (11,0)-(11,3) = "end" - ├── @ DefNode (location: (13,0)-(14,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (13,4)-(13,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (13,8)-(13,35)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 3) - │ │ │ ├── @ RequiredParameterNode (location: (13,8)-(13,9)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :a - │ │ │ ├── @ MultiTargetNode (location: (13,11)-(13,22)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── lefts: (length: 1) - │ │ │ │ │ └── @ RequiredParameterNode (location: (13,12)-(13,13)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── name: :b - │ │ │ │ ├── rest: - │ │ │ │ │ @ SplatNode (location: (13,15)-(13,18)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── operator_loc: (13,15)-(13,16) = "*" - │ │ │ │ │ └── expression: - │ │ │ │ │ @ RequiredParameterNode (location: (13,16)-(13,18)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── name: :_c - │ │ │ │ ├── rights: (length: 1) - │ │ │ │ │ └── @ RequiredParameterNode (location: (13,20)-(13,21)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── name: :d - │ │ │ │ ├── lparen_loc: (13,11)-(13,12) = "(" - │ │ │ │ └── rparen_loc: (13,21)-(13,22) = ")" - │ │ │ └── @ MultiTargetNode (location: (13,24)-(13,35)) - │ │ │ ├── flags: ∅ - │ │ │ ├── lefts: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (13,25)-(13,26)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :e - │ │ │ ├── rest: - │ │ │ │ @ SplatNode (location: (13,28)-(13,31)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── operator_loc: (13,28)-(13,29) = "*" - │ │ │ │ └── expression: - │ │ │ │ @ RequiredParameterNode (location: (13,29)-(13,31)) - │ │ │ │ ├── flags: repeated_parameter - │ │ │ │ └── name: :_c - │ │ │ ├── rights: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (13,33)-(13,34)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :f - │ │ │ ├── lparen_loc: (13,24)-(13,25) = "(" - │ │ │ └── rparen_loc: (13,34)-(13,35) = ")" - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:a, :b, :_c, :d, :e, :f] - │ ├── def_keyword_loc: (13,0)-(13,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (13,7)-(13,8) = "(" - │ ├── rparen_loc: (13,35)-(13,36) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (14,0)-(14,3) = "end" - ├── @ DefNode (location: (16,0)-(17,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (16,4)-(16,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (16,8)-(16,20)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 4) - │ │ │ ├── @ RequiredParameterNode (location: (16,8)-(16,10)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :_a - │ │ │ ├── @ RequiredParameterNode (location: (16,12)-(16,14)) - │ │ │ │ ├── flags: repeated_parameter - │ │ │ │ └── name: :_a - │ │ │ ├── @ RequiredParameterNode (location: (16,16)-(16,17)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :b - │ │ │ └── @ RequiredParameterNode (location: (16,19)-(16,20)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :c - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:_a, :b, :c] - │ ├── def_keyword_loc: (16,0)-(16,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (16,7)-(16,8) = "(" - │ ├── rparen_loc: (16,20)-(16,21) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (17,0)-(17,3) = "end" - ├── @ DefNode (location: (19,0)-(20,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (19,4)-(19,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (19,8)-(19,32)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 2) - │ │ │ ├── @ MultiTargetNode (location: (19,8)-(19,19)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── lefts: (length: 1) - │ │ │ │ │ └── @ RequiredParameterNode (location: (19,9)-(19,10)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── name: :a - │ │ │ │ ├── rest: - │ │ │ │ │ @ SplatNode (location: (19,12)-(19,15)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── operator_loc: (19,12)-(19,13) = "*" - │ │ │ │ │ └── expression: - │ │ │ │ │ @ RequiredParameterNode (location: (19,13)-(19,15)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── name: :_b - │ │ │ │ ├── rights: (length: 1) - │ │ │ │ │ └── @ RequiredParameterNode (location: (19,17)-(19,18)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── name: :c - │ │ │ │ ├── lparen_loc: (19,8)-(19,9) = "(" - │ │ │ │ └── rparen_loc: (19,18)-(19,19) = ")" - │ │ │ └── @ MultiTargetNode (location: (19,21)-(19,32)) - │ │ │ ├── flags: ∅ - │ │ │ ├── lefts: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (19,22)-(19,23)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :d - │ │ │ ├── rest: - │ │ │ │ @ SplatNode (location: (19,25)-(19,28)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── operator_loc: (19,25)-(19,26) = "*" - │ │ │ │ └── expression: - │ │ │ │ @ RequiredParameterNode (location: (19,26)-(19,28)) - │ │ │ │ ├── flags: repeated_parameter - │ │ │ │ └── name: :_b - │ │ │ ├── rights: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (19,30)-(19,31)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :e - │ │ │ ├── lparen_loc: (19,21)-(19,22) = "(" - │ │ │ └── rparen_loc: (19,31)-(19,32) = ")" - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:a, :_b, :c, :d, :e] - │ ├── def_keyword_loc: (19,0)-(19,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (19,7)-(19,8) = "(" - │ ├── rparen_loc: (19,32)-(19,33) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (20,0)-(20,3) = "end" - ├── @ DefNode (location: (22,0)-(23,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (22,4)-(22,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (22,8)-(22,22)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 2) - │ │ │ ├── @ OptionalParameterNode (location: (22,8)-(22,14)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :_a - │ │ │ │ ├── name_loc: (22,8)-(22,10) = "_a" - │ │ │ │ ├── operator_loc: (22,11)-(22,12) = "=" - │ │ │ │ └── value: - │ │ │ │ @ IntegerNode (location: (22,13)-(22,14)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ └── @ OptionalParameterNode (location: (22,16)-(22,22)) - │ │ │ ├── flags: repeated_parameter - │ │ │ ├── name: :_a - │ │ │ ├── name_loc: (22,16)-(22,18) = "_a" - │ │ │ ├── operator_loc: (22,19)-(22,20) = "=" - │ │ │ └── value: - │ │ │ @ IntegerNode (location: (22,21)-(22,22)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:_a] - │ ├── def_keyword_loc: (22,0)-(22,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (22,7)-(22,8) = "(" - │ ├── rparen_loc: (22,22)-(22,23) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (23,0)-(23,3) = "end" - ├── @ DefNode (location: (25,0)-(26,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (25,4)-(25,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (25,8)-(25,16)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 2) - │ │ │ ├── @ RequiredKeywordParameterNode (location: (25,8)-(25,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :_a - │ │ │ │ └── name_loc: (25,8)-(25,11) = "_a:" - │ │ │ └── @ RequiredKeywordParameterNode (location: (25,13)-(25,16)) - │ │ │ ├── flags: repeated_parameter - │ │ │ ├── name: :_a - │ │ │ └── name_loc: (25,13)-(25,16) = "_a:" - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:_a] - │ ├── def_keyword_loc: (25,0)-(25,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (25,7)-(25,8) = "(" - │ ├── rparen_loc: (25,16)-(25,17) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (26,0)-(26,3) = "end" - ├── @ DefNode (location: (28,0)-(29,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (28,4)-(28,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (28,8)-(28,20)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 2) - │ │ │ ├── @ OptionalKeywordParameterNode (location: (28,8)-(28,13)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :_a - │ │ │ │ ├── name_loc: (28,8)-(28,11) = "_a:" - │ │ │ │ └── value: - │ │ │ │ @ IntegerNode (location: (28,12)-(28,13)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ └── @ OptionalKeywordParameterNode (location: (28,15)-(28,20)) - │ │ │ ├── flags: repeated_parameter - │ │ │ ├── name: :_a - │ │ │ ├── name_loc: (28,15)-(28,18) = "_a:" - │ │ │ └── value: - │ │ │ @ IntegerNode (location: (28,19)-(28,20)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:_a] - │ ├── def_keyword_loc: (28,0)-(28,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (28,7)-(28,8) = "(" - │ ├── rparen_loc: (28,20)-(28,21) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (29,0)-(29,3) = "end" - ├── @ DefNode (location: (31,0)-(32,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (31,4)-(31,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (31,8)-(31,16)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (31,8)-(31,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :_a - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: - │ │ │ @ KeywordRestParameterNode (location: (31,12)-(31,16)) - │ │ │ ├── flags: repeated_parameter - │ │ │ ├── name: :_a - │ │ │ ├── name_loc: (31,14)-(31,16) = "_a" - │ │ │ └── operator_loc: (31,12)-(31,14) = "**" - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:_a] - │ ├── def_keyword_loc: (31,0)-(31,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (31,7)-(31,8) = "(" - │ ├── rparen_loc: (31,16)-(31,17) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (32,0)-(32,3) = "end" - ├── @ DefNode (location: (34,0)-(35,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (34,4)-(34,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (34,8)-(34,15)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (34,8)-(34,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :_a - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: - │ │ @ BlockParameterNode (location: (34,12)-(34,15)) - │ │ ├── flags: repeated_parameter - │ │ ├── name: :_a - │ │ ├── name_loc: (34,13)-(34,15) = "_a" - │ │ └── operator_loc: (34,12)-(34,13) = "&" - │ ├── body: ∅ - │ ├── locals: [:_a] - │ ├── def_keyword_loc: (34,0)-(34,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (34,7)-(34,8) = "(" - │ ├── rparen_loc: (34,15)-(34,16) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (35,0)-(35,3) = "end" - └── @ DefNode (location: (37,0)-(38,3)) - ├── flags: newline - ├── name: :foo - ├── name_loc: (37,4)-(37,7) = "foo" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (37,8)-(37,15)) - │ ├── flags: ∅ - │ ├── requireds: (length: 1) - │ │ └── @ RequiredParameterNode (location: (37,8)-(37,10)) - │ │ ├── flags: ∅ - │ │ └── name: :_a - │ ├── optionals: (length: 0) - │ ├── rest: - │ │ @ RestParameterNode (location: (37,12)-(37,15)) - │ │ ├── flags: repeated_parameter - │ │ ├── name: :_a - │ │ ├── name_loc: (37,13)-(37,15) = "_a" - │ │ └── operator_loc: (37,12)-(37,13) = "*" - │ ├── posts: (length: 0) - │ ├── keywords: (length: 0) - │ ├── keyword_rest: ∅ - │ └── block: ∅ - ├── body: ∅ - ├── locals: [:_a] - ├── def_keyword_loc: (37,0)-(37,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: (37,7)-(37,8) = "(" - ├── rparen_loc: (37,15)-(37,16) = ")" - ├── equal_loc: ∅ - └── end_keyword_loc: (38,0)-(38,3) = "end" diff --git a/test/prism/snapshots/rescue.txt b/test/prism/snapshots/rescue.txt deleted file mode 100644 index 38f692bbeda415..00000000000000 --- a/test/prism/snapshots/rescue.txt +++ /dev/null @@ -1,584 +0,0 @@ -@ ProgramNode (location: (1,0)-(35,18)) -├── flags: ∅ -├── locals: [:a, :z] -└── statements: - @ StatementsNode (location: (1,0)-(35,18)) - ├── flags: ∅ - └── body: (length: 14) - ├── @ RescueModifierNode (location: (1,0)-(1,14)) - │ ├── flags: newline - │ ├── expression: - │ │ @ CallNode (location: (1,0)-(1,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (1,0)-(1,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── keyword_loc: (1,4)-(1,10) = "rescue" - │ └── rescue_expression: - │ @ NilNode (location: (1,11)-(1,14)) - │ └── flags: static_literal - ├── @ RescueModifierNode (location: (3,0)-(4,3)) - │ ├── flags: newline - │ ├── expression: - │ │ @ CallNode (location: (3,0)-(3,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (3,0)-(3,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── keyword_loc: (3,4)-(3,10) = "rescue" - │ └── rescue_expression: - │ @ NilNode (location: (4,0)-(4,3)) - │ └── flags: static_literal - ├── @ CallNode (location: (6,0)-(6,24)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :tap - │ ├── message_loc: (6,0)-(6,3) = "tap" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (6,4)-(6,24)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (6,6)-(6,22)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ RescueModifierNode (location: (6,6)-(6,22)) - │ │ ├── flags: newline - │ │ ├── expression: - │ │ │ @ BreakNode (location: (6,6)-(6,11)) - │ │ │ ├── flags: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ └── keyword_loc: (6,6)-(6,11) = "break" - │ │ ├── keyword_loc: (6,12)-(6,18) = "rescue" - │ │ └── rescue_expression: - │ │ @ NilNode (location: (6,19)-(6,22)) - │ │ └── flags: static_literal - │ ├── opening_loc: (6,4)-(6,5) = "{" - │ └── closing_loc: (6,23)-(6,24) = "}" - ├── @ CallNode (location: (8,0)-(8,23)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :tap - │ ├── message_loc: (8,0)-(8,3) = "tap" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (8,4)-(8,23)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (8,6)-(8,21)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ RescueModifierNode (location: (8,6)-(8,21)) - │ │ ├── flags: newline - │ │ ├── expression: - │ │ │ @ NextNode (location: (8,6)-(8,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ └── keyword_loc: (8,6)-(8,10) = "next" - │ │ ├── keyword_loc: (8,11)-(8,17) = "rescue" - │ │ └── rescue_expression: - │ │ @ NilNode (location: (8,18)-(8,21)) - │ │ └── flags: static_literal - │ ├── opening_loc: (8,4)-(8,5) = "{" - │ └── closing_loc: (8,22)-(8,23) = "}" - ├── @ RescueModifierNode (location: (10,0)-(10,17)) - │ ├── flags: newline - │ ├── expression: - │ │ @ ReturnNode (location: (10,0)-(10,6)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (10,0)-(10,6) = "return" - │ │ └── arguments: ∅ - │ ├── keyword_loc: (10,7)-(10,13) = "rescue" - │ └── rescue_expression: - │ @ NilNode (location: (10,14)-(10,17)) - │ └── flags: static_literal - ├── @ RescueModifierNode (location: (12,0)-(12,19)) - │ ├── flags: newline - │ ├── expression: - │ │ @ CallNode (location: (12,0)-(12,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (12,0)-(12,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── keyword_loc: (12,4)-(12,10) = "rescue" - │ └── rescue_expression: - │ @ OrNode (location: (12,11)-(12,19)) - │ ├── flags: ∅ - │ ├── left: - │ │ @ NilNode (location: (12,11)-(12,14)) - │ │ └── flags: static_literal - │ ├── right: - │ │ @ IntegerNode (location: (12,18)-(12,19)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ └── operator_loc: (12,15)-(12,17) = "||" - ├── @ RescueModifierNode (location: (14,0)-(14,22)) - │ ├── flags: newline - │ ├── expression: - │ │ @ CallNode (location: (14,0)-(14,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (14,0)-(14,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── keyword_loc: (14,4)-(14,10) = "rescue" - │ └── rescue_expression: - │ @ IfNode (location: (14,11)-(14,22)) - │ ├── flags: newline - │ ├── if_keyword_loc: ∅ - │ ├── predicate: - │ │ @ NilNode (location: (14,11)-(14,14)) - │ │ └── flags: static_literal - │ ├── then_keyword_loc: (14,15)-(14,16) = "?" - │ ├── statements: - │ │ @ StatementsNode (location: (14,17)-(14,18)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ IntegerNode (location: (14,17)-(14,18)) - │ │ ├── flags: newline, static_literal, decimal - │ │ └── value: 1 - │ ├── subsequent: - │ │ @ ElseNode (location: (14,19)-(14,22)) - │ │ ├── flags: ∅ - │ │ ├── else_keyword_loc: (14,19)-(14,20) = ":" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (14,21)-(14,22)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ IntegerNode (location: (14,21)-(14,22)) - │ │ │ ├── flags: newline, static_literal, decimal - │ │ │ └── value: 2 - │ │ └── end_keyword_loc: ∅ - │ └── end_keyword_loc: ∅ - ├── @ BeginNode (location: (16,0)-(16,24)) - │ ├── flags: newline - │ ├── begin_keyword_loc: (16,0)-(16,5) = "begin" - │ ├── statements: - │ │ @ StatementsNode (location: (16,7)-(16,8)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (16,7)-(16,8)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (16,7)-(16,8) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── rescue_clause: - │ │ @ RescueNode (location: (16,10)-(16,19)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (16,10)-(16,16) = "rescue" - │ │ ├── exceptions: (length: 1) - │ │ │ └── @ SplatNode (location: (16,17)-(16,19)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (16,17)-(16,18) = "*" - │ │ │ └── expression: - │ │ │ @ CallNode (location: (16,18)-(16,19)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (16,18)-(16,19) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── operator_loc: ∅ - │ │ ├── reference: ∅ - │ │ ├── statements: ∅ - │ │ └── subsequent: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: ∅ - │ └── end_keyword_loc: (16,21)-(16,24) = "end" - ├── @ CallNode (location: (18,0)-(20,3)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (18,0)-(18,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (18,4)-(20,3)) - │ ├── flags: ∅ - │ ├── locals: [:x] - │ ├── parameters: - │ │ @ BlockParametersNode (location: (18,7)-(18,10)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (18,8)-(18,9)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (18,8)-(18,9)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :x - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: (18,7)-(18,8) = "|" - │ │ └── closing_loc: (18,9)-(18,10) = "|" - │ ├── body: - │ │ @ StatementsNode (location: (19,2)-(19,40)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ RescueModifierNode (location: (19,2)-(19,40)) - │ │ ├── flags: newline - │ │ ├── expression: - │ │ │ @ CallNode (location: (19,2)-(19,8)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (19,2)-(19,5) = "bar" - │ │ │ ├── opening_loc: (19,5)-(19,6) = "(" - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (19,6)-(19,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ CallNode (location: (19,6)-(19,7)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :y - │ │ │ │ ├── message_loc: (19,6)-(19,7) = "y" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── closing_loc: (19,7)-(19,8) = ")" - │ │ │ └── block: ∅ - │ │ ├── keyword_loc: (19,9)-(19,15) = "rescue" - │ │ └── rescue_expression: - │ │ @ CallNode (location: (19,16)-(19,40)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :ArgumentError - │ │ ├── message_loc: (19,16)-(19,29) = "ArgumentError" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (19,30)-(19,40)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ CallNode (location: (19,30)-(19,40)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :fail - │ │ │ ├── message_loc: (19,30)-(19,34) = "fail" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (19,35)-(19,40)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ StringNode (location: (19,35)-(19,40)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── opening_loc: (19,35)-(19,36) = "\"" - │ │ │ │ ├── content_loc: (19,36)-(19,39) = "baz" - │ │ │ │ ├── closing_loc: (19,39)-(19,40) = "\"" - │ │ │ │ └── unescaped: "baz" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── opening_loc: (18,4)-(18,6) = "do" - │ └── closing_loc: (20,0)-(20,3) = "end" - ├── @ IfNode (location: (22,0)-(24,3)) - │ ├── flags: newline - │ ├── if_keyword_loc: (22,0)-(22,2) = "if" - │ ├── predicate: - │ │ @ LocalVariableWriteNode (location: (22,3)-(22,21)) - │ │ ├── flags: ∅ - │ │ ├── name: :a - │ │ ├── depth: 0 - │ │ ├── name_loc: (22,3)-(22,4) = "a" - │ │ ├── value: - │ │ │ @ RescueModifierNode (location: (22,7)-(22,21)) - │ │ │ ├── flags: ∅ - │ │ │ ├── expression: - │ │ │ │ @ CallNode (location: (22,7)-(22,10)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :foo - │ │ │ │ ├── message_loc: (22,7)-(22,10) = "foo" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── keyword_loc: (22,11)-(22,17) = "rescue" - │ │ │ └── rescue_expression: - │ │ │ @ NilNode (location: (22,18)-(22,21)) - │ │ │ └── flags: static_literal - │ │ └── operator_loc: (22,5)-(22,6) = "=" - │ ├── then_keyword_loc: ∅ - │ ├── statements: - │ │ @ StatementsNode (location: (23,2)-(23,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (23,2)-(23,5)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (23,2)-(23,5) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── subsequent: ∅ - │ └── end_keyword_loc: (24,0)-(24,3) = "end" - ├── @ DefNode (location: (26,0)-(26,44)) - │ ├── flags: newline - │ ├── name: :some_method - │ ├── name_loc: (26,4)-(26,15) = "some_method" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (26,18)-(26,44)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ RescueModifierNode (location: (26,18)-(26,44)) - │ │ ├── flags: ∅ - │ │ ├── expression: - │ │ │ @ CallNode (location: (26,18)-(26,33)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :other_method - │ │ │ ├── message_loc: (26,18)-(26,30) = "other_method" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (26,31)-(26,33)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ IntegerNode (location: (26,31)-(26,33)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 42 - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── keyword_loc: (26,34)-(26,40) = "rescue" - │ │ └── rescue_expression: - │ │ @ NilNode (location: (26,41)-(26,44)) - │ │ └── flags: static_literal - │ ├── locals: [] - │ ├── def_keyword_loc: (26,0)-(26,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: (26,16)-(26,17) = "=" - │ └── end_keyword_loc: ∅ - ├── @ DefNode (location: (28,0)-(31,3)) - │ ├── flags: newline - │ ├── name: :a - │ ├── name_loc: (28,4)-(28,5) = "a" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ BeginNode (location: (28,0)-(31,3)) - │ │ ├── flags: ∅ - │ │ ├── begin_keyword_loc: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (29,2)-(29,6)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (29,2)-(29,6)) - │ │ │ ├── flags: newline, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :a - │ │ │ ├── message_loc: (29,2)-(29,3) = "a" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (29,4)-(29,6)) - │ │ │ │ ├── flags: contains_keywords - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ KeywordHashNode (location: (29,4)-(29,6)) - │ │ │ │ ├── flags: symbol_keys - │ │ │ │ └── elements: (length: 1) - │ │ │ │ └── @ AssocNode (location: (29,4)-(29,6)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── key: - │ │ │ │ │ @ SymbolNode (location: (29,4)-(29,6)) - │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── value_loc: (29,4)-(29,5) = "b" - │ │ │ │ │ ├── closing_loc: (29,5)-(29,6) = ":" - │ │ │ │ │ └── unescaped: "b" - │ │ │ │ ├── value: - │ │ │ │ │ @ ImplicitNode (location: (29,4)-(29,6)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── value: - │ │ │ │ │ @ CallNode (location: (29,4)-(29,6)) - │ │ │ │ │ ├── flags: ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :b - │ │ │ │ │ ├── message_loc: (29,4)-(29,5) = "b" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ └── operator_loc: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── rescue_clause: - │ │ │ @ RescueNode (location: (30,0)-(30,6)) - │ │ │ ├── flags: ∅ - │ │ │ ├── keyword_loc: (30,0)-(30,6) = "rescue" - │ │ │ ├── exceptions: (length: 0) - │ │ │ ├── operator_loc: ∅ - │ │ │ ├── reference: ∅ - │ │ │ ├── statements: ∅ - │ │ │ └── subsequent: ∅ - │ │ ├── else_clause: ∅ - │ │ ├── ensure_clause: ∅ - │ │ └── end_keyword_loc: (31,0)-(31,3) = "end" - │ ├── locals: [] - │ ├── def_keyword_loc: (28,0)-(28,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (31,0)-(31,3) = "end" - ├── @ RescueModifierNode (location: (33,0)-(33,21)) - │ ├── flags: newline - │ ├── expression: - │ │ @ IfNode (location: (33,0)-(33,10)) - │ │ ├── flags: newline - │ │ ├── if_keyword_loc: (33,4)-(33,6) = "if" - │ │ ├── predicate: - │ │ │ @ CallNode (location: (33,7)-(33,10)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (33,7)-(33,10) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── then_keyword_loc: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (33,0)-(33,3)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (33,0)-(33,3)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (33,0)-(33,3) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── subsequent: ∅ - │ │ └── end_keyword_loc: ∅ - │ ├── keyword_loc: (33,11)-(33,17) = "rescue" - │ └── rescue_expression: - │ @ CallNode (location: (33,18)-(33,21)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :baz - │ ├── message_loc: (33,18)-(33,21) = "baz" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── @ LocalVariableWriteNode (location: (35,0)-(35,18)) - ├── flags: newline - ├── name: :z - ├── depth: 0 - ├── name_loc: (35,0)-(35,1) = "z" - ├── value: - │ @ RescueModifierNode (location: (35,4)-(35,18)) - │ ├── flags: ∅ - │ ├── expression: - │ │ @ CallNode (location: (35,4)-(35,7)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :x - │ │ ├── message_loc: (35,4)-(35,5) = "x" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (35,6)-(35,7)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ CallNode (location: (35,6)-(35,7)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :y - │ │ │ ├── message_loc: (35,6)-(35,7) = "y" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── keyword_loc: (35,8)-(35,14) = "rescue" - │ └── rescue_expression: - │ @ CallNode (location: (35,15)-(35,18)) - │ ├── flags: ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :c - │ ├── message_loc: (35,15)-(35,16) = "c" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (35,17)-(35,18)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (35,17)-(35,18)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :d - │ │ ├── message_loc: (35,17)-(35,18) = "d" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── operator_loc: (35,2)-(35,3) = "=" diff --git a/test/prism/snapshots/return.txt b/test/prism/snapshots/return.txt deleted file mode 100644 index fc2bd70fbc52d9..00000000000000 --- a/test/prism/snapshots/return.txt +++ /dev/null @@ -1,179 +0,0 @@ -@ ProgramNode (location: (1,0)-(23,9)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(23,9)) - ├── flags: ∅ - └── body: (length: 10) - ├── @ ReturnNode (location: (1,0)-(1,6)) - │ ├── flags: newline - │ ├── keyword_loc: (1,0)-(1,6) = "return" - │ └── arguments: ∅ - ├── @ ReturnNode (location: (3,0)-(3,20)) - │ ├── flags: newline - │ ├── keyword_loc: (3,0)-(3,6) = "return" - │ └── arguments: - │ @ ArgumentsNode (location: (3,7)-(3,20)) - │ ├── flags: ∅ - │ └── arguments: (length: 3) - │ ├── @ ParenthesesNode (location: (3,7)-(3,10)) - │ │ ├── flags: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (3,8)-(3,9)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ IntegerNode (location: (3,8)-(3,9)) - │ │ │ ├── flags: newline, static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── opening_loc: (3,7)-(3,8) = "(" - │ │ └── closing_loc: (3,9)-(3,10) = ")" - │ ├── @ ParenthesesNode (location: (3,12)-(3,15)) - │ │ ├── flags: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (3,13)-(3,14)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ IntegerNode (location: (3,13)-(3,14)) - │ │ │ ├── flags: newline, static_literal, decimal - │ │ │ └── value: 2 - │ │ ├── opening_loc: (3,12)-(3,13) = "(" - │ │ └── closing_loc: (3,14)-(3,15) = ")" - │ └── @ ParenthesesNode (location: (3,17)-(3,20)) - │ ├── flags: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (3,18)-(3,19)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ IntegerNode (location: (3,18)-(3,19)) - │ │ ├── flags: newline, static_literal, decimal - │ │ └── value: 3 - │ ├── opening_loc: (3,17)-(3,18) = "(" - │ └── closing_loc: (3,19)-(3,20) = ")" - ├── @ ReturnNode (location: (5,0)-(5,9)) - │ ├── flags: newline - │ ├── keyword_loc: (5,0)-(5,6) = "return" - │ └── arguments: - │ @ ArgumentsNode (location: (5,7)-(5,9)) - │ ├── flags: contains_splat - │ └── arguments: (length: 1) - │ └── @ SplatNode (location: (5,7)-(5,9)) - │ ├── flags: ∅ - │ ├── operator_loc: (5,7)-(5,8) = "*" - │ └── expression: - │ @ IntegerNode (location: (5,8)-(5,9)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── @ ReturnNode (location: (7,0)-(7,8)) - │ ├── flags: newline - │ ├── keyword_loc: (7,0)-(7,6) = "return" - │ └── arguments: - │ @ ArgumentsNode (location: (7,7)-(7,8)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ IntegerNode (location: (7,7)-(7,8)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── @ ReturnNode (location: (9,0)-(10,1)) - │ ├── flags: newline - │ ├── keyword_loc: (9,0)-(9,6) = "return" - │ └── arguments: - │ @ ArgumentsNode (location: (9,7)-(10,1)) - │ ├── flags: ∅ - │ └── arguments: (length: 3) - │ ├── @ IntegerNode (location: (9,7)-(9,8)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── @ IntegerNode (location: (9,10)-(9,11)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ └── @ IntegerNode (location: (10,0)-(10,1)) - │ ├── flags: static_literal, decimal - │ └── value: 3 - ├── @ ReturnNode (location: (12,0)-(12,14)) - │ ├── flags: newline - │ ├── keyword_loc: (12,0)-(12,6) = "return" - │ └── arguments: - │ @ ArgumentsNode (location: (12,7)-(12,14)) - │ ├── flags: ∅ - │ └── arguments: (length: 3) - │ ├── @ IntegerNode (location: (12,7)-(12,8)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── @ IntegerNode (location: (12,10)-(12,11)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ └── @ IntegerNode (location: (12,13)-(12,14)) - │ ├── flags: static_literal, decimal - │ └── value: 3 - ├── @ ReturnNode (location: (14,0)-(14,16)) - │ ├── flags: newline - │ ├── keyword_loc: (14,0)-(14,6) = "return" - │ └── arguments: - │ @ ArgumentsNode (location: (14,7)-(14,16)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ ArrayNode (location: (14,7)-(14,16)) - │ ├── flags: static_literal - │ ├── elements: (length: 3) - │ │ ├── @ IntegerNode (location: (14,8)-(14,9)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── @ IntegerNode (location: (14,11)-(14,12)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ └── @ IntegerNode (location: (14,14)-(14,15)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 3 - │ ├── opening_loc: (14,7)-(14,8) = "[" - │ └── closing_loc: (14,15)-(14,16) = "]" - ├── @ ReturnNode (location: (16,0)-(19,1)) - │ ├── flags: newline - │ ├── keyword_loc: (16,0)-(16,6) = "return" - │ └── arguments: - │ @ ArgumentsNode (location: (16,6)-(19,1)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ ParenthesesNode (location: (16,6)-(19,1)) - │ ├── flags: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (17,2)-(18,3)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 2) - │ │ ├── @ IntegerNode (location: (17,2)-(17,3)) - │ │ │ ├── flags: newline, static_literal, decimal - │ │ │ └── value: 1 - │ │ └── @ IntegerNode (location: (18,2)-(18,3)) - │ │ ├── flags: newline, static_literal, decimal - │ │ └── value: 2 - │ ├── opening_loc: (16,6)-(16,7) = "(" - │ └── closing_loc: (19,0)-(19,1) = ")" - ├── @ ReturnNode (location: (21,0)-(21,8)) - │ ├── flags: newline - │ ├── keyword_loc: (21,0)-(21,6) = "return" - │ └── arguments: - │ @ ArgumentsNode (location: (21,6)-(21,8)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ ParenthesesNode (location: (21,6)-(21,8)) - │ ├── flags: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (21,6)-(21,7) = "(" - │ └── closing_loc: (21,7)-(21,8) = ")" - └── @ ReturnNode (location: (23,0)-(23,9)) - ├── flags: newline - ├── keyword_loc: (23,0)-(23,6) = "return" - └── arguments: - @ ArgumentsNode (location: (23,6)-(23,9)) - ├── flags: ∅ - └── arguments: (length: 1) - └── @ ParenthesesNode (location: (23,6)-(23,9)) - ├── flags: ∅ - ├── body: - │ @ StatementsNode (location: (23,7)-(23,8)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ IntegerNode (location: (23,7)-(23,8)) - │ ├── flags: newline, static_literal, decimal - │ └── value: 1 - ├── opening_loc: (23,6)-(23,7) = "(" - └── closing_loc: (23,8)-(23,9) = ")" diff --git a/test/prism/snapshots/seattlerb/BEGIN.txt b/test/prism/snapshots/seattlerb/BEGIN.txt deleted file mode 100644 index a0d73a8039b91c..00000000000000 --- a/test/prism/snapshots/seattlerb/BEGIN.txt +++ /dev/null @@ -1,19 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,12)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,12)) - ├── flags: ∅ - └── body: (length: 1) - └── @ PreExecutionNode (location: (1,0)-(1,12)) - ├── flags: newline - ├── statements: - │ @ StatementsNode (location: (1,8)-(1,10)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ IntegerNode (location: (1,8)-(1,10)) - │ ├── flags: newline, static_literal, decimal - │ └── value: 42 - ├── keyword_loc: (1,0)-(1,5) = "BEGIN" - ├── opening_loc: (1,6)-(1,7) = "{" - └── closing_loc: (1,11)-(1,12) = "}" diff --git a/test/prism/snapshots/seattlerb/TestRubyParserShared.txt b/test/prism/snapshots/seattlerb/TestRubyParserShared.txt deleted file mode 100644 index 7a488a20aab3eb..00000000000000 --- a/test/prism/snapshots/seattlerb/TestRubyParserShared.txt +++ /dev/null @@ -1,398 +0,0 @@ -@ ProgramNode (location: (1,0)-(92,1)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(92,1)) - ├── flags: ∅ - └── body: (length: 16) - ├── @ ArrayNode (location: (1,0)-(4,1)) - │ ├── flags: newline, static_literal - │ ├── elements: (length: 0) - │ ├── opening_loc: (1,0)-(1,3) = "%I[" - │ └── closing_loc: (4,0)-(4,1) = "]" - ├── @ ArrayNode (location: (6,0)-(9,1)) - │ ├── flags: newline, static_literal - │ ├── elements: (length: 2) - │ │ ├── @ SymbolNode (location: (7,0)-(7,5)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (7,0)-(7,5) = "line2" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "line2" - │ │ └── @ SymbolNode (location: (8,0)-(8,5)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: ∅ - │ │ ├── value_loc: (8,0)-(8,5) = "line3" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "line3" - │ ├── opening_loc: (6,0)-(6,3) = "%I[" - │ └── closing_loc: (9,0)-(9,1) = "]" - ├── @ ArrayNode (location: (11,0)-(14,1)) - │ ├── flags: newline, static_literal - │ ├── elements: (length: 0) - │ ├── opening_loc: (11,0)-(11,3) = "%W[" - │ └── closing_loc: (14,0)-(14,1) = "]" - ├── @ ArrayNode (location: (16,0)-(19,1)) - │ ├── flags: newline - │ ├── elements: (length: 2) - │ │ ├── @ StringNode (location: (17,0)-(17,5)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (17,0)-(17,5) = "line2" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "line2" - │ │ └── @ StringNode (location: (18,0)-(18,5)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (18,0)-(18,5) = "line3" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "line3" - │ ├── opening_loc: (16,0)-(16,3) = "%W[" - │ └── closing_loc: (19,0)-(19,1) = "]" - ├── @ ArrayNode (location: (21,0)-(24,1)) - │ ├── flags: newline, static_literal - │ ├── elements: (length: 0) - │ ├── opening_loc: (21,0)-(21,3) = "%i[" - │ └── closing_loc: (24,0)-(24,1) = "]" - ├── @ ArrayNode (location: (26,0)-(29,1)) - │ ├── flags: newline, static_literal - │ ├── elements: (length: 2) - │ │ ├── @ SymbolNode (location: (27,0)-(27,5)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (27,0)-(27,5) = "line2" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "line2" - │ │ └── @ SymbolNode (location: (28,0)-(28,5)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: ∅ - │ │ ├── value_loc: (28,0)-(28,5) = "line3" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "line3" - │ ├── opening_loc: (26,0)-(26,3) = "%i[" - │ └── closing_loc: (29,0)-(29,1) = "]" - ├── @ RegularExpressionNode (location: (31,0)-(34,1)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (31,0)-(31,3) = "%r[" - │ ├── content_loc: (31,3)-(34,0) = "\n\n\n" - │ ├── closing_loc: (34,0)-(34,1) = "]" - │ └── unescaped: "\n\n\n" - ├── @ ArrayNode (location: (36,0)-(39,1)) - │ ├── flags: newline, static_literal - │ ├── elements: (length: 0) - │ ├── opening_loc: (36,0)-(36,3) = "%w[" - │ └── closing_loc: (39,0)-(39,1) = "]" - ├── @ ArrayNode (location: (41,0)-(44,1)) - │ ├── flags: newline - │ ├── elements: (length: 2) - │ │ ├── @ StringNode (location: (42,0)-(42,5)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (42,0)-(42,5) = "line2" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "line2" - │ │ └── @ StringNode (location: (43,0)-(43,5)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (43,0)-(43,5) = "line3" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "line3" - │ ├── opening_loc: (41,0)-(41,3) = "%w[" - │ └── closing_loc: (44,0)-(44,1) = "]" - ├── @ ArrayNode (location: (46,0)-(49,1)) - │ ├── flags: newline, static_literal - │ ├── elements: (length: 2) - │ │ ├── @ SymbolNode (location: (47,0)-(47,6)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (47,0)-(47,1) = ":" - │ │ │ ├── value_loc: (47,1)-(47,6) = "line2" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "line2" - │ │ └── @ SymbolNode (location: (48,0)-(48,6)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (48,0)-(48,1) = ":" - │ │ ├── value_loc: (48,1)-(48,6) = "line3" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "line3" - │ ├── opening_loc: (46,0)-(46,1) = "[" - │ └── closing_loc: (49,0)-(49,1) = "]" - ├── @ ClassNode (location: (51,0)-(56,3)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── class_keyword_loc: (51,0)-(51,5) = "class" - │ ├── constant_path: - │ │ @ ConstantReadNode (location: (51,6)-(51,7)) - │ │ ├── flags: ∅ - │ │ └── name: :X - │ ├── inheritance_operator_loc: ∅ - │ ├── superclass: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (52,2)-(55,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ DefNode (location: (52,2)-(55,5)) - │ │ ├── flags: newline - │ │ ├── name: :y - │ │ ├── name_loc: (52,11)-(52,12) = "y" - │ │ ├── receiver: - │ │ │ @ SelfNode (location: (52,6)-(52,10)) - │ │ │ └── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (52,13)-(53,9)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 2) - │ │ │ │ ├── @ RequiredParameterNode (location: (52,13)-(52,14)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── name: :a - │ │ │ │ └── @ RequiredParameterNode (location: (53,8)-(53,9)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :b - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (54,4)-(54,9)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (54,4)-(54,9)) - │ │ │ ├── flags: newline - │ │ │ ├── receiver: - │ │ │ │ @ LocalVariableReadNode (location: (54,4)-(54,5)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :a - │ │ │ │ └── depth: 0 - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :+ - │ │ │ ├── message_loc: (54,6)-(54,7) = "+" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (54,8)-(54,9)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ LocalVariableReadNode (location: (54,8)-(54,9)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :b - │ │ │ │ └── depth: 0 - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: [:a, :b] - │ │ ├── def_keyword_loc: (52,2)-(52,5) = "def" - │ │ ├── operator_loc: (52,10)-(52,11) = "." - │ │ ├── lparen_loc: (52,12)-(52,13) = "(" - │ │ ├── rparen_loc: (53,9)-(53,10) = ")" - │ │ ├── equal_loc: ∅ - │ │ └── end_keyword_loc: (55,2)-(55,5) = "end" - │ ├── end_keyword_loc: (56,0)-(56,3) = "end" - │ └── name: :X - ├── @ ClassNode (location: (59,0)-(63,3)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── class_keyword_loc: (59,0)-(59,5) = "class" - │ ├── constant_path: - │ │ @ ConstantReadNode (location: (59,6)-(59,7)) - │ │ ├── flags: ∅ - │ │ └── name: :X - │ ├── inheritance_operator_loc: ∅ - │ ├── superclass: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (60,2)-(62,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ ClassNode (location: (60,2)-(62,5)) - │ │ ├── flags: newline - │ │ ├── locals: [] - │ │ ├── class_keyword_loc: (60,2)-(60,7) = "class" - │ │ ├── constant_path: - │ │ │ @ ConstantReadNode (location: (60,8)-(60,9)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :Y - │ │ ├── inheritance_operator_loc: ∅ - │ │ ├── superclass: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (61,4)-(61,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ ConstantWriteNode (location: (61,4)-(61,10)) - │ │ │ ├── flags: newline - │ │ │ ├── name: :Z - │ │ │ ├── name_loc: (61,4)-(61,5) = "Z" - │ │ │ ├── value: - │ │ │ │ @ IntegerNode (location: (61,8)-(61,10)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 42 - │ │ │ └── operator_loc: (61,6)-(61,7) = "=" - │ │ ├── end_keyword_loc: (62,2)-(62,5) = "end" - │ │ └── name: :Y - │ ├── end_keyword_loc: (63,0)-(63,3) = "end" - │ └── name: :X - ├── @ ClassNode (location: (66,0)-(71,3)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── class_keyword_loc: (66,0)-(66,5) = "class" - │ ├── constant_path: - │ │ @ ConstantReadNode (location: (66,6)-(66,7)) - │ │ ├── flags: ∅ - │ │ └── name: :X - │ ├── inheritance_operator_loc: ∅ - │ ├── superclass: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (67,2)-(70,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ DefNode (location: (67,2)-(70,5)) - │ │ ├── flags: newline - │ │ ├── name: :y - │ │ ├── name_loc: (67,6)-(67,7) = "y" - │ │ ├── receiver: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (67,8)-(68,9)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 2) - │ │ │ │ ├── @ RequiredParameterNode (location: (67,8)-(67,9)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── name: :a - │ │ │ │ └── @ RequiredParameterNode (location: (68,8)-(68,9)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :b - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (69,4)-(69,9)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (69,4)-(69,9)) - │ │ │ ├── flags: newline - │ │ │ ├── receiver: - │ │ │ │ @ LocalVariableReadNode (location: (69,4)-(69,5)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :a - │ │ │ │ └── depth: 0 - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :+ - │ │ │ ├── message_loc: (69,6)-(69,7) = "+" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (69,8)-(69,9)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ LocalVariableReadNode (location: (69,8)-(69,9)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :b - │ │ │ │ └── depth: 0 - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: [:a, :b] - │ │ ├── def_keyword_loc: (67,2)-(67,5) = "def" - │ │ ├── operator_loc: ∅ - │ │ ├── lparen_loc: (67,7)-(67,8) = "(" - │ │ ├── rparen_loc: (68,9)-(68,10) = ")" - │ │ ├── equal_loc: ∅ - │ │ └── end_keyword_loc: (70,2)-(70,5) = "end" - │ ├── end_keyword_loc: (71,0)-(71,3) = "end" - │ └── name: :X - ├── @ ModuleNode (location: (74,0)-(79,3)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── module_keyword_loc: (74,0)-(74,6) = "module" - │ ├── constant_path: - │ │ @ ConstantReadNode (location: (74,7)-(74,8)) - │ │ ├── flags: ∅ - │ │ └── name: :X - │ ├── body: - │ │ @ StatementsNode (location: (75,2)-(78,3)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ ConstantWriteNode (location: (75,2)-(78,3)) - │ │ ├── flags: newline - │ │ ├── name: :X - │ │ ├── name_loc: (75,2)-(75,3) = "X" - │ │ ├── value: - │ │ │ @ ArrayNode (location: (75,6)-(78,3)) - │ │ │ ├── flags: static_literal - │ │ │ ├── elements: (length: 2) - │ │ │ │ ├── @ SymbolNode (location: (76,4)-(76,10)) - │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ │ ├── opening_loc: (76,4)-(76,5) = ":" - │ │ │ │ │ ├── value_loc: (76,5)-(76,10) = "line3" - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── unescaped: "line3" - │ │ │ │ └── @ SymbolNode (location: (77,4)-(77,10)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: (77,4)-(77,5) = ":" - │ │ │ │ ├── value_loc: (77,5)-(77,10) = "line4" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "line4" - │ │ │ ├── opening_loc: (75,6)-(75,7) = "[" - │ │ │ └── closing_loc: (78,2)-(78,3) = "]" - │ │ └── operator_loc: (75,4)-(75,5) = "=" - │ ├── end_keyword_loc: (79,0)-(79,3) = "end" - │ └── name: :X - ├── @ ModuleNode (location: (82,0)-(86,3)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── module_keyword_loc: (82,0)-(82,6) = "module" - │ ├── constant_path: - │ │ @ ConstantReadNode (location: (82,7)-(82,8)) - │ │ ├── flags: ∅ - │ │ └── name: :X - │ ├── body: - │ │ @ StatementsNode (location: (83,2)-(85,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ ModuleNode (location: (83,2)-(85,5)) - │ │ ├── flags: newline - │ │ ├── locals: [] - │ │ ├── module_keyword_loc: (83,2)-(83,8) = "module" - │ │ ├── constant_path: - │ │ │ @ ConstantReadNode (location: (83,9)-(83,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :Y - │ │ ├── body: - │ │ │ @ StatementsNode (location: (84,4)-(84,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ ConstantWriteNode (location: (84,4)-(84,10)) - │ │ │ ├── flags: newline - │ │ │ ├── name: :Z - │ │ │ ├── name_loc: (84,4)-(84,5) = "Z" - │ │ │ ├── value: - │ │ │ │ @ IntegerNode (location: (84,8)-(84,10)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 42 - │ │ │ └── operator_loc: (84,6)-(84,7) = "=" - │ │ ├── end_keyword_loc: (85,2)-(85,5) = "end" - │ │ └── name: :Y - │ ├── end_keyword_loc: (86,0)-(86,3) = "end" - │ └── name: :X - └── @ CallNode (location: (89,0)-(92,1)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :x - ├── message_loc: (89,0)-(89,1) = "x" - ├── opening_loc: (89,1)-(89,2) = "(" - ├── arguments: - │ @ ArgumentsNode (location: (90,0)-(91,6)) - │ ├── flags: ∅ - │ └── arguments: (length: 2) - │ ├── @ SymbolNode (location: (90,0)-(90,6)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (90,0)-(90,1) = ":" - │ │ ├── value_loc: (90,1)-(90,6) = "line2" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "line2" - │ └── @ SymbolNode (location: (91,0)-(91,6)) - │ ├── flags: static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (91,0)-(91,1) = ":" - │ ├── value_loc: (91,1)-(91,6) = "line3" - │ ├── closing_loc: ∅ - │ └── unescaped: "line3" - ├── closing_loc: (92,0)-(92,1) = ")" - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/__ENCODING__.txt b/test/prism/snapshots/seattlerb/__ENCODING__.txt deleted file mode 100644 index f04dfb6cb8694b..00000000000000 --- a/test/prism/snapshots/seattlerb/__ENCODING__.txt +++ /dev/null @@ -1,9 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,12)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,12)) - ├── flags: ∅ - └── body: (length: 1) - └── @ SourceEncodingNode (location: (1,0)-(1,12)) - └── flags: newline, static_literal diff --git a/test/prism/snapshots/seattlerb/alias_gvar_backref.txt b/test/prism/snapshots/seattlerb/alias_gvar_backref.txt deleted file mode 100644 index 47b0e80b6447c2..00000000000000 --- a/test/prism/snapshots/seattlerb/alias_gvar_backref.txt +++ /dev/null @@ -1,18 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,15)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,15)) - ├── flags: ∅ - └── body: (length: 1) - └── @ AliasGlobalVariableNode (location: (1,0)-(1,15)) - ├── flags: newline - ├── new_name: - │ @ GlobalVariableReadNode (location: (1,6)-(1,12)) - │ ├── flags: ∅ - │ └── name: :$MATCH - ├── old_name: - │ @ BackReferenceReadNode (location: (1,13)-(1,15)) - │ ├── flags: ∅ - │ └── name: :$& - └── keyword_loc: (1,0)-(1,5) = "alias" diff --git a/test/prism/snapshots/seattlerb/alias_resword.txt b/test/prism/snapshots/seattlerb/alias_resword.txt deleted file mode 100644 index 44a4727283eaa7..00000000000000 --- a/test/prism/snapshots/seattlerb/alias_resword.txt +++ /dev/null @@ -1,24 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,12)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,12)) - ├── flags: ∅ - └── body: (length: 1) - └── @ AliasMethodNode (location: (1,0)-(1,12)) - ├── flags: newline - ├── new_name: - │ @ SymbolNode (location: (1,6)-(1,8)) - │ ├── flags: static_literal, forced_us_ascii_encoding - │ ├── opening_loc: ∅ - │ ├── value_loc: (1,6)-(1,8) = "in" - │ ├── closing_loc: ∅ - │ └── unescaped: "in" - ├── old_name: - │ @ SymbolNode (location: (1,9)-(1,12)) - │ ├── flags: static_literal, forced_us_ascii_encoding - │ ├── opening_loc: ∅ - │ ├── value_loc: (1,9)-(1,12) = "out" - │ ├── closing_loc: ∅ - │ └── unescaped: "out" - └── keyword_loc: (1,0)-(1,5) = "alias" diff --git a/test/prism/snapshots/seattlerb/and_multi.txt b/test/prism/snapshots/seattlerb/and_multi.txt deleted file mode 100644 index f98ad67e1026b9..00000000000000 --- a/test/prism/snapshots/seattlerb/and_multi.txt +++ /dev/null @@ -1,33 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,4)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,4)) - ├── flags: ∅ - └── body: (length: 1) - └── @ AndNode (location: (1,0)-(3,4)) - ├── flags: newline - ├── left: - │ @ AndNode (location: (1,0)-(2,9)) - │ ├── flags: ∅ - │ ├── left: - │ │ @ TrueNode (location: (1,0)-(1,4)) - │ │ └── flags: static_literal - │ ├── right: - │ │ @ CallNode (location: (2,0)-(2,9)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ FalseNode (location: (2,4)-(2,9)) - │ │ │ └── flags: static_literal - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :! - │ │ ├── message_loc: (2,0)-(2,3) = "not" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── operator_loc: (1,5)-(1,8) = "and" - ├── right: - │ @ TrueNode (location: (3,0)-(3,4)) - │ └── flags: static_literal - └── operator_loc: (2,10)-(2,13) = "and" diff --git a/test/prism/snapshots/seattlerb/aref_args_assocs.txt b/test/prism/snapshots/seattlerb/aref_args_assocs.txt deleted file mode 100644 index cbd07920379988..00000000000000 --- a/test/prism/snapshots/seattlerb/aref_args_assocs.txt +++ /dev/null @@ -1,26 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,8)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,8)) - ├── flags: ∅ - └── body: (length: 1) - └── @ ArrayNode (location: (1,0)-(1,8)) - ├── flags: newline - ├── elements: (length: 1) - │ └── @ KeywordHashNode (location: (1,1)-(1,7)) - │ ├── flags: ∅ - │ └── elements: (length: 1) - │ └── @ AssocNode (location: (1,1)-(1,7)) - │ ├── flags: static_literal - │ ├── key: - │ │ @ IntegerNode (location: (1,1)-(1,2)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── value: - │ │ @ IntegerNode (location: (1,6)-(1,7)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ └── operator_loc: (1,3)-(1,5) = "=>" - ├── opening_loc: (1,0)-(1,1) = "[" - └── closing_loc: (1,7)-(1,8) = "]" diff --git a/test/prism/snapshots/seattlerb/aref_args_lit_assocs.txt b/test/prism/snapshots/seattlerb/aref_args_lit_assocs.txt deleted file mode 100644 index 7302f728e3beaa..00000000000000 --- a/test/prism/snapshots/seattlerb/aref_args_lit_assocs.txt +++ /dev/null @@ -1,29 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,11)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,11)) - ├── flags: ∅ - └── body: (length: 1) - └── @ ArrayNode (location: (1,0)-(1,11)) - ├── flags: newline - ├── elements: (length: 2) - │ ├── @ IntegerNode (location: (1,1)-(1,2)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ └── @ KeywordHashNode (location: (1,4)-(1,10)) - │ ├── flags: ∅ - │ └── elements: (length: 1) - │ └── @ AssocNode (location: (1,4)-(1,10)) - │ ├── flags: static_literal - │ ├── key: - │ │ @ IntegerNode (location: (1,4)-(1,5)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── value: - │ │ @ IntegerNode (location: (1,9)-(1,10)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 3 - │ └── operator_loc: (1,6)-(1,8) = "=>" - ├── opening_loc: (1,0)-(1,1) = "[" - └── closing_loc: (1,10)-(1,11) = "]" diff --git a/test/prism/snapshots/seattlerb/args_kw_block.txt b/test/prism/snapshots/seattlerb/args_kw_block.txt deleted file mode 100644 index 88081dfa1452d7..00000000000000 --- a/test/prism/snapshots/seattlerb/args_kw_block.txt +++ /dev/null @@ -1,43 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,20)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,20)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(1,20)) - ├── flags: newline - ├── name: :f - ├── name_loc: (1,4)-(1,5) = "f" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (1,6)-(1,14)) - │ ├── flags: ∅ - │ ├── requireds: (length: 0) - │ ├── optionals: (length: 0) - │ ├── rest: ∅ - │ ├── posts: (length: 0) - │ ├── keywords: (length: 1) - │ │ └── @ OptionalKeywordParameterNode (location: (1,6)-(1,10)) - │ │ ├── flags: ∅ - │ │ ├── name: :a - │ │ ├── name_loc: (1,6)-(1,8) = "a:" - │ │ └── value: - │ │ @ IntegerNode (location: (1,9)-(1,10)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── keyword_rest: ∅ - │ └── block: - │ @ BlockParameterNode (location: (1,12)-(1,14)) - │ ├── flags: ∅ - │ ├── name: :b - │ ├── name_loc: (1,13)-(1,14) = "b" - │ └── operator_loc: (1,12)-(1,13) = "&" - ├── body: ∅ - ├── locals: [:a, :b] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: (1,5)-(1,6) = "(" - ├── rparen_loc: (1,14)-(1,15) = ")" - ├── equal_loc: ∅ - └── end_keyword_loc: (1,17)-(1,20) = "end" diff --git a/test/prism/snapshots/seattlerb/array_line_breaks.txt b/test/prism/snapshots/seattlerb/array_line_breaks.txt deleted file mode 100644 index a2d21e90ad6f39..00000000000000 --- a/test/prism/snapshots/seattlerb/array_line_breaks.txt +++ /dev/null @@ -1,27 +0,0 @@ -@ ProgramNode (location: (1,0)-(4,1)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(4,1)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ ArrayNode (location: (1,0)-(3,4)) - │ ├── flags: newline - │ ├── elements: (length: 2) - │ │ ├── @ StringNode (location: (2,0)-(2,3)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (2,0)-(2,1) = "'" - │ │ │ ├── content_loc: (2,1)-(2,2) = "a" - │ │ │ ├── closing_loc: (2,2)-(2,3) = "'" - │ │ │ └── unescaped: "a" - │ │ └── @ StringNode (location: (3,0)-(3,3)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (3,0)-(3,1) = "'" - │ │ ├── content_loc: (3,1)-(3,2) = "b" - │ │ ├── closing_loc: (3,2)-(3,3) = "'" - │ │ └── unescaped: "b" - │ ├── opening_loc: (1,0)-(1,1) = "[" - │ └── closing_loc: (3,3)-(3,4) = "]" - └── @ IntegerNode (location: (4,0)-(4,1)) - ├── flags: newline, static_literal, decimal - └── value: 1 diff --git a/test/prism/snapshots/seattlerb/array_lits_trailing_calls.txt b/test/prism/snapshots/seattlerb/array_lits_trailing_calls.txt deleted file mode 100644 index 2de5a054a66695..00000000000000 --- a/test/prism/snapshots/seattlerb/array_lits_trailing_calls.txt +++ /dev/null @@ -1,37 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,4)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,4)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ CallNode (location: (1,0)-(1,6)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ArrayNode (location: (1,0)-(1,4)) - │ │ ├── flags: static_literal - │ │ ├── elements: (length: 0) - │ │ ├── opening_loc: (1,0)-(1,3) = "%w[" - │ │ └── closing_loc: (1,3)-(1,4) = "]" - │ ├── call_operator_loc: (1,4)-(1,5) = "." - │ ├── name: :b - │ ├── message_loc: (1,5)-(1,6) = "b" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── @ CallNode (location: (3,0)-(3,4)) - ├── flags: newline - ├── receiver: - │ @ ArrayNode (location: (3,0)-(3,2)) - │ ├── flags: static_literal - │ ├── elements: (length: 0) - │ ├── opening_loc: (3,0)-(3,1) = "[" - │ └── closing_loc: (3,1)-(3,2) = "]" - ├── call_operator_loc: (3,2)-(3,3) = "." - ├── name: :b - ├── message_loc: (3,3)-(3,4) = "b" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/assoc__bare.txt b/test/prism/snapshots/seattlerb/assoc__bare.txt deleted file mode 100644 index 530360ef66ff23..00000000000000 --- a/test/prism/snapshots/seattlerb/assoc__bare.txt +++ /dev/null @@ -1,36 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,6)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,6)) - ├── flags: ∅ - └── body: (length: 1) - └── @ HashNode (location: (1,0)-(1,6)) - ├── flags: newline - ├── opening_loc: (1,0)-(1,1) = "{" - ├── elements: (length: 1) - │ └── @ AssocNode (location: (1,2)-(1,4)) - │ ├── flags: ∅ - │ ├── key: - │ │ @ SymbolNode (location: (1,2)-(1,4)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: ∅ - │ │ ├── value_loc: (1,2)-(1,3) = "y" - │ │ ├── closing_loc: (1,3)-(1,4) = ":" - │ │ └── unescaped: "y" - │ ├── value: - │ │ @ ImplicitNode (location: (1,2)-(1,4)) - │ │ ├── flags: ∅ - │ │ └── value: - │ │ @ CallNode (location: (1,2)-(1,4)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :y - │ │ ├── message_loc: (1,2)-(1,3) = "y" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── operator_loc: ∅ - └── closing_loc: (1,5)-(1,6) = "}" diff --git a/test/prism/snapshots/seattlerb/assoc_label.txt b/test/prism/snapshots/seattlerb/assoc_label.txt deleted file mode 100644 index 91b94bbc1cc0a0..00000000000000 --- a/test/prism/snapshots/seattlerb/assoc_label.txt +++ /dev/null @@ -1,37 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,6)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,6)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,6)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :a - ├── message_loc: (1,0)-(1,1) = "a" - ├── opening_loc: (1,1)-(1,2) = "(" - ├── arguments: - │ @ ArgumentsNode (location: (1,2)-(1,5)) - │ ├── flags: contains_keywords - │ └── arguments: (length: 1) - │ └── @ KeywordHashNode (location: (1,2)-(1,5)) - │ ├── flags: symbol_keys - │ └── elements: (length: 1) - │ └── @ AssocNode (location: (1,2)-(1,5)) - │ ├── flags: static_literal - │ ├── key: - │ │ @ SymbolNode (location: (1,2)-(1,4)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: ∅ - │ │ ├── value_loc: (1,2)-(1,3) = "b" - │ │ ├── closing_loc: (1,3)-(1,4) = ":" - │ │ └── unescaped: "b" - │ ├── value: - │ │ @ IntegerNode (location: (1,4)-(1,5)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ └── operator_loc: ∅ - ├── closing_loc: (1,5)-(1,6) = ")" - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/attr_asgn_colon_id.txt b/test/prism/snapshots/seattlerb/attr_asgn_colon_id.txt deleted file mode 100644 index 67802fc8a4ea7f..00000000000000 --- a/test/prism/snapshots/seattlerb/attr_asgn_colon_id.txt +++ /dev/null @@ -1,26 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,8)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,8)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,8)) - ├── flags: newline, attribute_write - ├── receiver: - │ @ ConstantReadNode (location: (1,0)-(1,1)) - │ ├── flags: ∅ - │ └── name: :A - ├── call_operator_loc: (1,1)-(1,3) = "::" - ├── name: :b= - ├── message_loc: (1,3)-(1,4) = "b" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,7)-(1,8)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ IntegerNode (location: (1,7)-(1,8)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/attrasgn_array_arg.txt b/test/prism/snapshots/seattlerb/attrasgn_array_arg.txt deleted file mode 100644 index 43853b4ef91d11..00000000000000 --- a/test/prism/snapshots/seattlerb/attrasgn_array_arg.txt +++ /dev/null @@ -1,44 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,13)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,13)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,13)) - ├── flags: newline, attribute_write - ├── receiver: - │ @ CallNode (location: (1,0)-(1,1)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (1,0)-(1,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: ∅ - ├── name: :[]= - ├── message_loc: (1,1)-(1,9) = "[[1, 2]]" - ├── opening_loc: (1,1)-(1,2) = "[" - ├── arguments: - │ @ ArgumentsNode (location: (1,2)-(1,13)) - │ ├── flags: ∅ - │ └── arguments: (length: 2) - │ ├── @ ArrayNode (location: (1,2)-(1,8)) - │ │ ├── flags: static_literal - │ │ ├── elements: (length: 2) - │ │ │ ├── @ IntegerNode (location: (1,3)-(1,4)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ └── @ IntegerNode (location: (1,6)-(1,7)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ ├── opening_loc: (1,2)-(1,3) = "[" - │ │ └── closing_loc: (1,7)-(1,8) = "]" - │ └── @ IntegerNode (location: (1,12)-(1,13)) - │ ├── flags: static_literal, decimal - │ └── value: 3 - ├── closing_loc: (1,8)-(1,9) = "]" - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/attrasgn_array_lhs.txt b/test/prism/snapshots/seattlerb/attrasgn_array_lhs.txt deleted file mode 100644 index 5729407edc1f17..00000000000000 --- a/test/prism/snapshots/seattlerb/attrasgn_array_lhs.txt +++ /dev/null @@ -1,85 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,42)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,42)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,42)) - ├── flags: newline, attribute_write - ├── receiver: - │ @ ArrayNode (location: (1,0)-(1,12)) - │ ├── flags: static_literal - │ ├── elements: (length: 4) - │ │ ├── @ IntegerNode (location: (1,1)-(1,2)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── @ IntegerNode (location: (1,4)-(1,5)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ ├── @ IntegerNode (location: (1,7)-(1,8)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 3 - │ │ └── @ IntegerNode (location: (1,10)-(1,11)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 4 - │ ├── opening_loc: (1,0)-(1,1) = "[" - │ └── closing_loc: (1,11)-(1,12) = "]" - ├── call_operator_loc: ∅ - ├── name: :[]= - ├── message_loc: (1,12)-(1,24) = "[from .. to]" - ├── opening_loc: (1,12)-(1,13) = "[" - ├── arguments: - │ @ ArgumentsNode (location: (1,13)-(1,42)) - │ ├── flags: ∅ - │ └── arguments: (length: 2) - │ ├── @ RangeNode (location: (1,13)-(1,23)) - │ │ ├── flags: ∅ - │ │ ├── left: - │ │ │ @ CallNode (location: (1,13)-(1,17)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :from - │ │ │ ├── message_loc: (1,13)-(1,17) = "from" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── right: - │ │ │ @ CallNode (location: (1,21)-(1,23)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :to - │ │ │ ├── message_loc: (1,21)-(1,23) = "to" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: (1,18)-(1,20) = ".." - │ └── @ ArrayNode (location: (1,27)-(1,42)) - │ ├── flags: ∅ - │ ├── elements: (length: 3) - │ │ ├── @ StringNode (location: (1,28)-(1,31)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (1,28)-(1,29) = "\"" - │ │ │ ├── content_loc: (1,29)-(1,30) = "a" - │ │ │ ├── closing_loc: (1,30)-(1,31) = "\"" - │ │ │ └── unescaped: "a" - │ │ ├── @ StringNode (location: (1,33)-(1,36)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (1,33)-(1,34) = "\"" - │ │ │ ├── content_loc: (1,34)-(1,35) = "b" - │ │ │ ├── closing_loc: (1,35)-(1,36) = "\"" - │ │ │ └── unescaped: "b" - │ │ └── @ StringNode (location: (1,38)-(1,41)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (1,38)-(1,39) = "\"" - │ │ ├── content_loc: (1,39)-(1,40) = "c" - │ │ ├── closing_loc: (1,40)-(1,41) = "\"" - │ │ └── unescaped: "c" - │ ├── opening_loc: (1,27)-(1,28) = "[" - │ └── closing_loc: (1,41)-(1,42) = "]" - ├── closing_loc: (1,23)-(1,24) = "]" - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/attrasgn_primary_dot_constant.txt b/test/prism/snapshots/seattlerb/attrasgn_primary_dot_constant.txt deleted file mode 100644 index 2c06df2609b95d..00000000000000 --- a/test/prism/snapshots/seattlerb/attrasgn_primary_dot_constant.txt +++ /dev/null @@ -1,33 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,7)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,7)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,7)) - ├── flags: newline, attribute_write - ├── receiver: - │ @ CallNode (location: (1,0)-(1,1)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (1,0)-(1,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: (1,1)-(1,2) = "." - ├── name: :B= - ├── message_loc: (1,2)-(1,3) = "B" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,6)-(1,7)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ IntegerNode (location: (1,6)-(1,7)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/backticks_interpolation_line.txt b/test/prism/snapshots/seattlerb/backticks_interpolation_line.txt deleted file mode 100644 index 8c6a163c48a6c9..00000000000000 --- a/test/prism/snapshots/seattlerb/backticks_interpolation_line.txt +++ /dev/null @@ -1,43 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,8)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,8)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,8)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :x - ├── message_loc: (1,0)-(1,1) = "x" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,2)-(1,8)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ InterpolatedXStringNode (location: (1,2)-(1,8)) - │ ├── flags: ∅ - │ ├── opening_loc: (1,2)-(1,3) = "`" - │ ├── parts: (length: 1) - │ │ └── @ EmbeddedStatementsNode (location: (1,3)-(1,7)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (1,3)-(1,5) = "\#{" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (1,5)-(1,6)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (1,5)-(1,6)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :y - │ │ │ ├── message_loc: (1,5)-(1,6) = "y" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── closing_loc: (1,6)-(1,7) = "}" - │ └── closing_loc: (1,7)-(1,8) = "`" - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/bang_eq.txt b/test/prism/snapshots/seattlerb/bang_eq.txt deleted file mode 100644 index 6bbd4a6ea2205d..00000000000000 --- a/test/prism/snapshots/seattlerb/bang_eq.txt +++ /dev/null @@ -1,26 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,6)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,6)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,6)) - ├── flags: newline - ├── receiver: - │ @ IntegerNode (location: (1,0)-(1,1)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── call_operator_loc: ∅ - ├── name: :!= - ├── message_loc: (1,2)-(1,4) = "!=" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,5)-(1,6)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ IntegerNode (location: (1,5)-(1,6)) - │ ├── flags: static_literal, decimal - │ └── value: 2 - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/bdot2.txt b/test/prism/snapshots/seattlerb/bdot2.txt deleted file mode 100644 index b1c05c0fc46e26..00000000000000 --- a/test/prism/snapshots/seattlerb/bdot2.txt +++ /dev/null @@ -1,40 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,3)) - ├── flags: ∅ - └── body: (length: 3) - ├── @ RangeNode (location: (1,0)-(1,4)) - │ ├── flags: newline, static_literal - │ ├── left: ∅ - │ ├── right: - │ │ @ IntegerNode (location: (1,2)-(1,4)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 10 - │ └── operator_loc: (1,0)-(1,2) = ".." - ├── @ RangeNode (location: (2,2)-(2,5)) - │ ├── flags: newline - │ ├── left: ∅ - │ ├── right: - │ │ @ CallNode (location: (2,4)-(2,5)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (2,4)-(2,5) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── operator_loc: (2,2)-(2,4) = ".." - └── @ CallNode (location: (3,2)-(3,3)) - ├── flags: newline, variable_call, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :c - ├── message_loc: (3,2)-(3,3) = "c" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/bdot3.txt b/test/prism/snapshots/seattlerb/bdot3.txt deleted file mode 100644 index 0b35268f19a2e8..00000000000000 --- a/test/prism/snapshots/seattlerb/bdot3.txt +++ /dev/null @@ -1,40 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,3)) - ├── flags: ∅ - └── body: (length: 3) - ├── @ RangeNode (location: (1,0)-(1,5)) - │ ├── flags: newline, static_literal, exclude_end - │ ├── left: ∅ - │ ├── right: - │ │ @ IntegerNode (location: (1,3)-(1,5)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 10 - │ └── operator_loc: (1,0)-(1,3) = "..." - ├── @ RangeNode (location: (2,2)-(2,6)) - │ ├── flags: newline, exclude_end - │ ├── left: ∅ - │ ├── right: - │ │ @ CallNode (location: (2,5)-(2,6)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (2,5)-(2,6) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── operator_loc: (2,2)-(2,5) = "..." - └── @ CallNode (location: (3,2)-(3,3)) - ├── flags: newline, variable_call, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :c - ├── message_loc: (3,2)-(3,3) = "c" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/begin_ensure_no_bodies.txt b/test/prism/snapshots/seattlerb/begin_ensure_no_bodies.txt deleted file mode 100644 index 6ebcc2e052736f..00000000000000 --- a/test/prism/snapshots/seattlerb/begin_ensure_no_bodies.txt +++ /dev/null @@ -1,20 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ BeginNode (location: (1,0)-(3,3)) - ├── flags: newline - ├── begin_keyword_loc: (1,0)-(1,5) = "begin" - ├── statements: ∅ - ├── rescue_clause: ∅ - ├── else_clause: ∅ - ├── ensure_clause: - │ @ EnsureNode (location: (2,0)-(3,3)) - │ ├── flags: ∅ - │ ├── ensure_keyword_loc: (2,0)-(2,6) = "ensure" - │ ├── statements: ∅ - │ └── end_keyword_loc: (3,0)-(3,3) = "end" - └── end_keyword_loc: (3,0)-(3,3) = "end" diff --git a/test/prism/snapshots/seattlerb/begin_rescue_else_ensure_bodies.txt b/test/prism/snapshots/seattlerb/begin_rescue_else_ensure_bodies.txt deleted file mode 100644 index 9fda6c10e60361..00000000000000 --- a/test/prism/snapshots/seattlerb/begin_rescue_else_ensure_bodies.txt +++ /dev/null @@ -1,57 +0,0 @@ -@ ProgramNode (location: (1,0)-(9,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(9,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ BeginNode (location: (1,0)-(9,3)) - ├── flags: newline - ├── begin_keyword_loc: (1,0)-(1,5) = "begin" - ├── statements: - │ @ StatementsNode (location: (2,2)-(2,3)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ IntegerNode (location: (2,2)-(2,3)) - │ ├── flags: newline, static_literal, decimal - │ └── value: 1 - ├── rescue_clause: - │ @ RescueNode (location: (3,0)-(4,3)) - │ ├── flags: ∅ - │ ├── keyword_loc: (3,0)-(3,6) = "rescue" - │ ├── exceptions: (length: 0) - │ ├── operator_loc: ∅ - │ ├── reference: ∅ - │ ├── statements: - │ │ @ StatementsNode (location: (4,2)-(4,3)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ IntegerNode (location: (4,2)-(4,3)) - │ │ ├── flags: newline, static_literal, decimal - │ │ └── value: 2 - │ └── subsequent: ∅ - ├── else_clause: - │ @ ElseNode (location: (5,0)-(7,6)) - │ ├── flags: ∅ - │ ├── else_keyword_loc: (5,0)-(5,4) = "else" - │ ├── statements: - │ │ @ StatementsNode (location: (6,2)-(6,3)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ IntegerNode (location: (6,2)-(6,3)) - │ │ ├── flags: newline, static_literal, decimal - │ │ └── value: 3 - │ └── end_keyword_loc: (7,0)-(7,6) = "ensure" - ├── ensure_clause: - │ @ EnsureNode (location: (7,0)-(9,3)) - │ ├── flags: ∅ - │ ├── ensure_keyword_loc: (7,0)-(7,6) = "ensure" - │ ├── statements: - │ │ @ StatementsNode (location: (8,2)-(8,3)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ IntegerNode (location: (8,2)-(8,3)) - │ │ ├── flags: newline, static_literal, decimal - │ │ └── value: 4 - │ └── end_keyword_loc: (9,0)-(9,3) = "end" - └── end_keyword_loc: (9,0)-(9,3) = "end" diff --git a/test/prism/snapshots/seattlerb/begin_rescue_else_ensure_no_bodies.txt b/test/prism/snapshots/seattlerb/begin_rescue_else_ensure_no_bodies.txt deleted file mode 100644 index 356d1ea9ab1f3b..00000000000000 --- a/test/prism/snapshots/seattlerb/begin_rescue_else_ensure_no_bodies.txt +++ /dev/null @@ -1,33 +0,0 @@ -@ ProgramNode (location: (1,0)-(9,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(9,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ BeginNode (location: (1,0)-(9,3)) - ├── flags: newline - ├── begin_keyword_loc: (1,0)-(1,5) = "begin" - ├── statements: ∅ - ├── rescue_clause: - │ @ RescueNode (location: (3,0)-(3,6)) - │ ├── flags: ∅ - │ ├── keyword_loc: (3,0)-(3,6) = "rescue" - │ ├── exceptions: (length: 0) - │ ├── operator_loc: ∅ - │ ├── reference: ∅ - │ ├── statements: ∅ - │ └── subsequent: ∅ - ├── else_clause: - │ @ ElseNode (location: (5,0)-(7,6)) - │ ├── flags: ∅ - │ ├── else_keyword_loc: (5,0)-(5,4) = "else" - │ ├── statements: ∅ - │ └── end_keyword_loc: (7,0)-(7,6) = "ensure" - ├── ensure_clause: - │ @ EnsureNode (location: (7,0)-(9,3)) - │ ├── flags: ∅ - │ ├── ensure_keyword_loc: (7,0)-(7,6) = "ensure" - │ ├── statements: ∅ - │ └── end_keyword_loc: (9,0)-(9,3) = "end" - └── end_keyword_loc: (9,0)-(9,3) = "end" diff --git a/test/prism/snapshots/seattlerb/begin_rescue_ensure_no_bodies.txt b/test/prism/snapshots/seattlerb/begin_rescue_ensure_no_bodies.txt deleted file mode 100644 index aa744870e79621..00000000000000 --- a/test/prism/snapshots/seattlerb/begin_rescue_ensure_no_bodies.txt +++ /dev/null @@ -1,28 +0,0 @@ -@ ProgramNode (location: (1,0)-(4,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(4,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ BeginNode (location: (1,0)-(4,3)) - ├── flags: newline - ├── begin_keyword_loc: (1,0)-(1,5) = "begin" - ├── statements: ∅ - ├── rescue_clause: - │ @ RescueNode (location: (2,0)-(2,6)) - │ ├── flags: ∅ - │ ├── keyword_loc: (2,0)-(2,6) = "rescue" - │ ├── exceptions: (length: 0) - │ ├── operator_loc: ∅ - │ ├── reference: ∅ - │ ├── statements: ∅ - │ └── subsequent: ∅ - ├── else_clause: ∅ - ├── ensure_clause: - │ @ EnsureNode (location: (3,0)-(4,3)) - │ ├── flags: ∅ - │ ├── ensure_keyword_loc: (3,0)-(3,6) = "ensure" - │ ├── statements: ∅ - │ └── end_keyword_loc: (4,0)-(4,3) = "end" - └── end_keyword_loc: (4,0)-(4,3) = "end" diff --git a/test/prism/snapshots/seattlerb/block_arg__bare.txt b/test/prism/snapshots/seattlerb/block_arg__bare.txt deleted file mode 100644 index ceafdcebbc57f4..00000000000000 --- a/test/prism/snapshots/seattlerb/block_arg__bare.txt +++ /dev/null @@ -1,35 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,13)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,13)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(1,13)) - ├── flags: newline - ├── name: :x - ├── name_loc: (1,4)-(1,5) = "x" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (1,6)-(1,7)) - │ ├── flags: ∅ - │ ├── requireds: (length: 0) - │ ├── optionals: (length: 0) - │ ├── rest: ∅ - │ ├── posts: (length: 0) - │ ├── keywords: (length: 0) - │ ├── keyword_rest: ∅ - │ └── block: - │ @ BlockParameterNode (location: (1,6)-(1,7)) - │ ├── flags: ∅ - │ ├── name: ∅ - │ ├── name_loc: ∅ - │ └── operator_loc: (1,6)-(1,7) = "&" - ├── body: ∅ - ├── locals: [] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: (1,5)-(1,6) = "(" - ├── rparen_loc: (1,7)-(1,8) = ")" - ├── equal_loc: ∅ - └── end_keyword_loc: (1,10)-(1,13) = "end" diff --git a/test/prism/snapshots/seattlerb/block_arg_kwsplat.txt b/test/prism/snapshots/seattlerb/block_arg_kwsplat.txt deleted file mode 100644 index 20756c8378ca46..00000000000000 --- a/test/prism/snapshots/seattlerb/block_arg_kwsplat.txt +++ /dev/null @@ -1,44 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,11)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,11)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,11)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :a - ├── message_loc: (1,0)-(1,1) = "a" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,11)) - ├── flags: ∅ - ├── locals: [:b] - ├── parameters: - │ @ BlockParametersNode (location: (1,4)-(1,9)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,5)-(1,8)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: - │ │ │ @ KeywordRestParameterNode (location: (1,5)-(1,8)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :b - │ │ │ ├── name_loc: (1,7)-(1,8) = "b" - │ │ │ └── operator_loc: (1,5)-(1,7) = "**" - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,4)-(1,5) = "|" - │ └── closing_loc: (1,8)-(1,9) = "|" - ├── body: ∅ - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,10)-(1,11) = "}" diff --git a/test/prism/snapshots/seattlerb/block_arg_opt_arg_block.txt b/test/prism/snapshots/seattlerb/block_arg_opt_arg_block.txt deleted file mode 100644 index dd89df907daad6..00000000000000 --- a/test/prism/snapshots/seattlerb/block_arg_opt_arg_block.txt +++ /dev/null @@ -1,59 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,21)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,21)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,21)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :a - ├── message_loc: (1,0)-(1,1) = "a" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,21)) - ├── flags: ∅ - ├── locals: [:b, :c, :d, :e] - ├── parameters: - │ @ BlockParametersNode (location: (1,4)-(1,19)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,5)-(1,18)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (1,5)-(1,6)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :b - │ │ ├── optionals: (length: 1) - │ │ │ └── @ OptionalParameterNode (location: (1,8)-(1,11)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :c - │ │ │ ├── name_loc: (1,8)-(1,9) = "c" - │ │ │ ├── operator_loc: (1,9)-(1,10) = "=" - │ │ │ └── value: - │ │ │ @ IntegerNode (location: (1,10)-(1,11)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (1,13)-(1,14)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :d - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: - │ │ @ BlockParameterNode (location: (1,16)-(1,18)) - │ │ ├── flags: ∅ - │ │ ├── name: :e - │ │ ├── name_loc: (1,17)-(1,18) = "e" - │ │ └── operator_loc: (1,16)-(1,17) = "&" - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,4)-(1,5) = "|" - │ └── closing_loc: (1,18)-(1,19) = "|" - ├── body: ∅ - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,20)-(1,21) = "}" diff --git a/test/prism/snapshots/seattlerb/block_arg_opt_splat.txt b/test/prism/snapshots/seattlerb/block_arg_opt_splat.txt deleted file mode 100644 index cefc1a85153b95..00000000000000 --- a/test/prism/snapshots/seattlerb/block_arg_opt_splat.txt +++ /dev/null @@ -1,56 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,20)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,20)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,20)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :a - ├── message_loc: (1,0)-(1,1) = "a" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,20)) - ├── flags: ∅ - ├── locals: [:b, :c, :d] - ├── parameters: - │ @ BlockParametersNode (location: (1,4)-(1,18)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,5)-(1,17)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (1,5)-(1,6)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :b - │ │ ├── optionals: (length: 1) - │ │ │ └── @ OptionalParameterNode (location: (1,8)-(1,13)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :c - │ │ │ ├── name_loc: (1,8)-(1,9) = "c" - │ │ │ ├── operator_loc: (1,10)-(1,11) = "=" - │ │ │ └── value: - │ │ │ @ IntegerNode (location: (1,12)-(1,13)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── rest: - │ │ │ @ RestParameterNode (location: (1,15)-(1,17)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :d - │ │ │ ├── name_loc: (1,16)-(1,17) = "d" - │ │ │ └── operator_loc: (1,15)-(1,16) = "*" - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,4)-(1,5) = "|" - │ └── closing_loc: (1,17)-(1,18) = "|" - ├── body: ∅ - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,19)-(1,20) = "}" diff --git a/test/prism/snapshots/seattlerb/block_arg_opt_splat_arg_block_omfg.txt b/test/prism/snapshots/seattlerb/block_arg_opt_splat_arg_block_omfg.txt deleted file mode 100644 index bf66e376fd7573..00000000000000 --- a/test/prism/snapshots/seattlerb/block_arg_opt_splat_arg_block_omfg.txt +++ /dev/null @@ -1,64 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,25)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,25)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,25)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :a - ├── message_loc: (1,0)-(1,1) = "a" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,25)) - ├── flags: ∅ - ├── locals: [:b, :c, :d, :e, :f] - ├── parameters: - │ @ BlockParametersNode (location: (1,4)-(1,23)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,5)-(1,22)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (1,5)-(1,6)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :b - │ │ ├── optionals: (length: 1) - │ │ │ └── @ OptionalParameterNode (location: (1,8)-(1,11)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :c - │ │ │ ├── name_loc: (1,8)-(1,9) = "c" - │ │ │ ├── operator_loc: (1,9)-(1,10) = "=" - │ │ │ └── value: - │ │ │ @ IntegerNode (location: (1,10)-(1,11)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── rest: - │ │ │ @ RestParameterNode (location: (1,13)-(1,15)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :d - │ │ │ ├── name_loc: (1,14)-(1,15) = "d" - │ │ │ └── operator_loc: (1,13)-(1,14) = "*" - │ │ ├── posts: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (1,17)-(1,18)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :e - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: - │ │ @ BlockParameterNode (location: (1,20)-(1,22)) - │ │ ├── flags: ∅ - │ │ ├── name: :f - │ │ ├── name_loc: (1,21)-(1,22) = "f" - │ │ └── operator_loc: (1,20)-(1,21) = "&" - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,4)-(1,5) = "|" - │ └── closing_loc: (1,22)-(1,23) = "|" - ├── body: ∅ - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,24)-(1,25) = "}" diff --git a/test/prism/snapshots/seattlerb/block_arg_optional.txt b/test/prism/snapshots/seattlerb/block_arg_optional.txt deleted file mode 100644 index 5fecfc31ab31a4..00000000000000 --- a/test/prism/snapshots/seattlerb/block_arg_optional.txt +++ /dev/null @@ -1,48 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,13)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,13)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,13)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :a - ├── message_loc: (1,0)-(1,1) = "a" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,13)) - ├── flags: ∅ - ├── locals: [:b] - ├── parameters: - │ @ BlockParametersNode (location: (1,4)-(1,11)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,5)-(1,10)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 1) - │ │ │ └── @ OptionalParameterNode (location: (1,5)-(1,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :b - │ │ │ ├── name_loc: (1,5)-(1,6) = "b" - │ │ │ ├── operator_loc: (1,7)-(1,8) = "=" - │ │ │ └── value: - │ │ │ @ IntegerNode (location: (1,9)-(1,10)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,4)-(1,5) = "|" - │ └── closing_loc: (1,10)-(1,11) = "|" - ├── body: ∅ - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,12)-(1,13) = "}" diff --git a/test/prism/snapshots/seattlerb/block_arg_scope.txt b/test/prism/snapshots/seattlerb/block_arg_scope.txt deleted file mode 100644 index e90d6445b2db06..00000000000000 --- a/test/prism/snapshots/seattlerb/block_arg_scope.txt +++ /dev/null @@ -1,45 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,12)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,12)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,12)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :a - ├── message_loc: (1,0)-(1,1) = "a" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,12)) - ├── flags: ∅ - ├── locals: [:b, :c] - ├── parameters: - │ @ BlockParametersNode (location: (1,4)-(1,10)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,5)-(1,6)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (1,5)-(1,6)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :b - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 1) - │ │ └── @ BlockLocalVariableNode (location: (1,8)-(1,9)) - │ │ ├── flags: ∅ - │ │ └── name: :c - │ ├── opening_loc: (1,4)-(1,5) = "|" - │ └── closing_loc: (1,9)-(1,10) = "|" - ├── body: ∅ - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,11)-(1,12) = "}" diff --git a/test/prism/snapshots/seattlerb/block_arg_scope2.txt b/test/prism/snapshots/seattlerb/block_arg_scope2.txt deleted file mode 100644 index c9f7242d8a77e8..00000000000000 --- a/test/prism/snapshots/seattlerb/block_arg_scope2.txt +++ /dev/null @@ -1,48 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,14)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,14)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,14)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :a - ├── message_loc: (1,0)-(1,1) = "a" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,14)) - ├── flags: ∅ - ├── locals: [:b, :c, :d] - ├── parameters: - │ @ BlockParametersNode (location: (1,3)-(1,12)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,4)-(1,5)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (1,4)-(1,5)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :b - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 2) - │ │ ├── @ BlockLocalVariableNode (location: (1,7)-(1,8)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :c - │ │ └── @ BlockLocalVariableNode (location: (1,10)-(1,11)) - │ │ ├── flags: ∅ - │ │ └── name: :d - │ ├── opening_loc: (1,3)-(1,4) = "|" - │ └── closing_loc: (1,11)-(1,12) = "|" - ├── body: ∅ - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,13)-(1,14) = "}" diff --git a/test/prism/snapshots/seattlerb/block_arg_splat_arg.txt b/test/prism/snapshots/seattlerb/block_arg_splat_arg.txt deleted file mode 100644 index 6ae1b1dade72d4..00000000000000 --- a/test/prism/snapshots/seattlerb/block_arg_splat_arg.txt +++ /dev/null @@ -1,50 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,16)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,16)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,16)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :a - ├── message_loc: (1,0)-(1,1) = "a" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,16)) - ├── flags: ∅ - ├── locals: [:b, :c, :d] - ├── parameters: - │ @ BlockParametersNode (location: (1,4)-(1,14)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,5)-(1,13)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (1,5)-(1,6)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :b - │ │ ├── optionals: (length: 0) - │ │ ├── rest: - │ │ │ @ RestParameterNode (location: (1,8)-(1,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :c - │ │ │ ├── name_loc: (1,9)-(1,10) = "c" - │ │ │ └── operator_loc: (1,8)-(1,9) = "*" - │ │ ├── posts: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (1,12)-(1,13)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :d - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,4)-(1,5) = "|" - │ └── closing_loc: (1,13)-(1,14) = "|" - ├── body: ∅ - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,15)-(1,16) = "}" diff --git a/test/prism/snapshots/seattlerb/block_args_kwargs.txt b/test/prism/snapshots/seattlerb/block_args_kwargs.txt deleted file mode 100644 index 45876c6dc129c9..00000000000000 --- a/test/prism/snapshots/seattlerb/block_args_kwargs.txt +++ /dev/null @@ -1,51 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,23)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,23)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,23)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :f - ├── message_loc: (1,0)-(1,1) = "f" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,23)) - ├── flags: ∅ - ├── locals: [:kwargs] - ├── parameters: - │ @ BlockParametersNode (location: (1,4)-(1,14)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,5)-(1,13)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: - │ │ │ @ KeywordRestParameterNode (location: (1,5)-(1,13)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :kwargs - │ │ │ ├── name_loc: (1,7)-(1,13) = "kwargs" - │ │ │ └── operator_loc: (1,5)-(1,7) = "**" - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,4)-(1,5) = "|" - │ └── closing_loc: (1,13)-(1,14) = "|" - ├── body: - │ @ StatementsNode (location: (1,15)-(1,21)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ LocalVariableReadNode (location: (1,15)-(1,21)) - │ ├── flags: newline - │ ├── name: :kwargs - │ └── depth: 0 - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,22)-(1,23) = "}" diff --git a/test/prism/snapshots/seattlerb/block_args_no_kwargs.txt b/test/prism/snapshots/seattlerb/block_args_no_kwargs.txt deleted file mode 100644 index 298bc26ce0ac30..00000000000000 --- a/test/prism/snapshots/seattlerb/block_args_no_kwargs.txt +++ /dev/null @@ -1,43 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,13)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,13)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,13)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :f - ├── message_loc: (1,0)-(1,1) = "f" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,13)) - ├── flags: ∅ - ├── locals: [] - ├── parameters: - │ @ BlockParametersNode (location: (1,4)-(1,11)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,5)-(1,10)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: - │ │ │ @ NoKeywordsParameterNode (location: (1,5)-(1,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (1,5)-(1,7) = "**" - │ │ │ └── keyword_loc: (1,7)-(1,10) = "nil" - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,4)-(1,5) = "|" - │ └── closing_loc: (1,10)-(1,11) = "|" - ├── body: ∅ - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,12)-(1,13) = "}" diff --git a/test/prism/snapshots/seattlerb/block_args_opt1.txt b/test/prism/snapshots/seattlerb/block_args_opt1.txt deleted file mode 100644 index d23bd5edce02c3..00000000000000 --- a/test/prism/snapshots/seattlerb/block_args_opt1.txt +++ /dev/null @@ -1,67 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,24)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,24)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,24)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :f - ├── message_loc: (1,0)-(1,1) = "f" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,24)) - ├── flags: ∅ - ├── locals: [:a, :b] - ├── parameters: - │ @ BlockParametersNode (location: (1,4)-(1,15)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,5)-(1,14)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (1,5)-(1,6)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :a - │ │ ├── optionals: (length: 1) - │ │ │ └── @ OptionalParameterNode (location: (1,8)-(1,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :b - │ │ │ ├── name_loc: (1,8)-(1,9) = "b" - │ │ │ ├── operator_loc: (1,10)-(1,11) = "=" - │ │ │ └── value: - │ │ │ @ IntegerNode (location: (1,12)-(1,14)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 42 - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,4)-(1,5) = "|" - │ └── closing_loc: (1,14)-(1,15) = "|" - ├── body: - │ @ StatementsNode (location: (1,16)-(1,22)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ ArrayNode (location: (1,16)-(1,22)) - │ ├── flags: newline - │ ├── elements: (length: 2) - │ │ ├── @ LocalVariableReadNode (location: (1,17)-(1,18)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :a - │ │ │ └── depth: 0 - │ │ └── @ LocalVariableReadNode (location: (1,20)-(1,21)) - │ │ ├── flags: ∅ - │ │ ├── name: :b - │ │ └── depth: 0 - │ ├── opening_loc: (1,16)-(1,17) = "[" - │ └── closing_loc: (1,21)-(1,22) = "]" - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,23)-(1,24) = "}" diff --git a/test/prism/snapshots/seattlerb/block_args_opt2.txt b/test/prism/snapshots/seattlerb/block_args_opt2.txt deleted file mode 100644 index 7170768b1cb943..00000000000000 --- a/test/prism/snapshots/seattlerb/block_args_opt2.txt +++ /dev/null @@ -1,57 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,18)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,18)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,18)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :a - ├── message_loc: (1,0)-(1,1) = "a" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,18)) - ├── flags: ∅ - ├── locals: [:b, :c] - ├── parameters: - │ @ BlockParametersNode (location: (1,4)-(1,16)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,6)-(1,14)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 2) - │ │ │ ├── @ OptionalParameterNode (location: (1,6)-(1,9)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :b - │ │ │ │ ├── name_loc: (1,6)-(1,7) = "b" - │ │ │ │ ├── operator_loc: (1,7)-(1,8) = "=" - │ │ │ │ └── value: - │ │ │ │ @ IntegerNode (location: (1,8)-(1,9)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ └── @ OptionalParameterNode (location: (1,11)-(1,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :c - │ │ │ ├── name_loc: (1,11)-(1,12) = "c" - │ │ │ ├── operator_loc: (1,12)-(1,13) = "=" - │ │ │ └── value: - │ │ │ @ IntegerNode (location: (1,13)-(1,14)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,4)-(1,5) = "|" - │ └── closing_loc: (1,15)-(1,16) = "|" - ├── body: ∅ - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,17)-(1,18) = "}" diff --git a/test/prism/snapshots/seattlerb/block_args_opt2_2.txt b/test/prism/snapshots/seattlerb/block_args_opt2_2.txt deleted file mode 100644 index 34d04dbe54b4a0..00000000000000 --- a/test/prism/snapshots/seattlerb/block_args_opt2_2.txt +++ /dev/null @@ -1,80 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,35)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,35)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,35)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :f - ├── message_loc: (1,0)-(1,1) = "f" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,35)) - ├── flags: ∅ - ├── locals: [:a, :b, :c] - ├── parameters: - │ @ BlockParametersNode (location: (1,4)-(1,23)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,5)-(1,22)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (1,5)-(1,6)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :a - │ │ ├── optionals: (length: 2) - │ │ │ ├── @ OptionalParameterNode (location: (1,8)-(1,14)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :b - │ │ │ │ ├── name_loc: (1,8)-(1,9) = "b" - │ │ │ │ ├── operator_loc: (1,10)-(1,11) = "=" - │ │ │ │ └── value: - │ │ │ │ @ IntegerNode (location: (1,12)-(1,14)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 42 - │ │ │ └── @ OptionalParameterNode (location: (1,16)-(1,22)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :c - │ │ │ ├── name_loc: (1,16)-(1,17) = "c" - │ │ │ ├── operator_loc: (1,18)-(1,19) = "=" - │ │ │ └── value: - │ │ │ @ IntegerNode (location: (1,20)-(1,22)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 24 - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,4)-(1,5) = "|" - │ └── closing_loc: (1,22)-(1,23) = "|" - ├── body: - │ @ StatementsNode (location: (1,24)-(1,33)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ ArrayNode (location: (1,24)-(1,33)) - │ ├── flags: newline - │ ├── elements: (length: 3) - │ │ ├── @ LocalVariableReadNode (location: (1,25)-(1,26)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :a - │ │ │ └── depth: 0 - │ │ ├── @ LocalVariableReadNode (location: (1,28)-(1,29)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :b - │ │ │ └── depth: 0 - │ │ └── @ LocalVariableReadNode (location: (1,31)-(1,32)) - │ │ ├── flags: ∅ - │ │ ├── name: :c - │ │ └── depth: 0 - │ ├── opening_loc: (1,24)-(1,25) = "[" - │ └── closing_loc: (1,32)-(1,33) = "]" - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,34)-(1,35) = "}" diff --git a/test/prism/snapshots/seattlerb/block_args_opt3.txt b/test/prism/snapshots/seattlerb/block_args_opt3.txt deleted file mode 100644 index 508d062ce2e354..00000000000000 --- a/test/prism/snapshots/seattlerb/block_args_opt3.txt +++ /dev/null @@ -1,89 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,42)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,42)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,42)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :f - ├── message_loc: (1,0)-(1,1) = "f" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,42)) - ├── flags: ∅ - ├── locals: [:a, :b, :c, :d] - ├── parameters: - │ @ BlockParametersNode (location: (1,4)-(1,27)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,5)-(1,26)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (1,5)-(1,6)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :a - │ │ ├── optionals: (length: 2) - │ │ │ ├── @ OptionalParameterNode (location: (1,8)-(1,14)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :b - │ │ │ │ ├── name_loc: (1,8)-(1,9) = "b" - │ │ │ │ ├── operator_loc: (1,10)-(1,11) = "=" - │ │ │ │ └── value: - │ │ │ │ @ IntegerNode (location: (1,12)-(1,14)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 42 - │ │ │ └── @ OptionalParameterNode (location: (1,16)-(1,22)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :c - │ │ │ ├── name_loc: (1,16)-(1,17) = "c" - │ │ │ ├── operator_loc: (1,18)-(1,19) = "=" - │ │ │ └── value: - │ │ │ @ IntegerNode (location: (1,20)-(1,22)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 24 - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: - │ │ @ BlockParameterNode (location: (1,24)-(1,26)) - │ │ ├── flags: ∅ - │ │ ├── name: :d - │ │ ├── name_loc: (1,25)-(1,26) = "d" - │ │ └── operator_loc: (1,24)-(1,25) = "&" - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,4)-(1,5) = "|" - │ └── closing_loc: (1,26)-(1,27) = "|" - ├── body: - │ @ StatementsNode (location: (1,28)-(1,40)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ ArrayNode (location: (1,28)-(1,40)) - │ ├── flags: newline - │ ├── elements: (length: 4) - │ │ ├── @ LocalVariableReadNode (location: (1,29)-(1,30)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :a - │ │ │ └── depth: 0 - │ │ ├── @ LocalVariableReadNode (location: (1,32)-(1,33)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :b - │ │ │ └── depth: 0 - │ │ ├── @ LocalVariableReadNode (location: (1,35)-(1,36)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :c - │ │ │ └── depth: 0 - │ │ └── @ LocalVariableReadNode (location: (1,38)-(1,39)) - │ │ ├── flags: ∅ - │ │ ├── name: :d - │ │ └── depth: 0 - │ ├── opening_loc: (1,28)-(1,29) = "[" - │ └── closing_loc: (1,39)-(1,40) = "]" - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,41)-(1,42) = "}" diff --git a/test/prism/snapshots/seattlerb/block_call_defn_call_block_call.txt b/test/prism/snapshots/seattlerb/block_call_defn_call_block_call.txt deleted file mode 100644 index 4e6ad90afd1257..00000000000000 --- a/test/prism/snapshots/seattlerb/block_call_defn_call_block_call.txt +++ /dev/null @@ -1,86 +0,0 @@ -@ ProgramNode (location: (1,0)-(4,11)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(4,11)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ CallNode (location: (1,0)-(3,4)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (1,0)-(1,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,2)-(3,4)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ DefNode (location: (1,2)-(3,4)) - │ │ ├── flags: ∅ - │ │ ├── name: :b - │ │ ├── name_loc: (1,6)-(1,7) = "b" - │ │ ├── receiver: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (1,8)-(1,9)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (1,8)-(1,9)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :c - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (2,1)-(2,2)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (2,1)-(2,2)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :d - │ │ │ ├── message_loc: (2,1)-(2,2) = "d" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: [:c] - │ │ ├── def_keyword_loc: (1,2)-(1,5) = "def" - │ │ ├── operator_loc: ∅ - │ │ ├── lparen_loc: (1,7)-(1,8) = "(" - │ │ ├── rparen_loc: (1,9)-(1,10) = ")" - │ │ ├── equal_loc: ∅ - │ │ └── end_keyword_loc: (3,1)-(3,4) = "end" - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── @ CallNode (location: (4,1)-(4,11)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (4,1)-(4,2)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :e - │ ├── message_loc: (4,1)-(4,2) = "e" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: (4,2)-(4,3) = "." - ├── name: :f - ├── message_loc: (4,3)-(4,4) = "f" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (4,5)-(4,11)) - ├── flags: ∅ - ├── locals: [] - ├── parameters: ∅ - ├── body: ∅ - ├── opening_loc: (4,5)-(4,7) = "do" - └── closing_loc: (4,8)-(4,11) = "end" diff --git a/test/prism/snapshots/seattlerb/block_call_dot_op2_brace_block.txt b/test/prism/snapshots/seattlerb/block_call_dot_op2_brace_block.txt deleted file mode 100644 index 5f05b1f6ff4015..00000000000000 --- a/test/prism/snapshots/seattlerb/block_call_dot_op2_brace_block.txt +++ /dev/null @@ -1,108 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,31)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,31)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,31)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (1,0)-(1,16)) - │ ├── flags: ∅ - │ ├── receiver: - │ │ @ CallNode (location: (1,0)-(1,1)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (1,0)-(1,1) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (1,1)-(1,2) = "." - │ ├── name: :b - │ ├── message_loc: (1,2)-(1,3) = "b" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,4)-(1,7)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (1,4)-(1,7)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :c - │ │ ├── message_loc: (1,4)-(1,5) = "c" - │ │ ├── opening_loc: (1,5)-(1,6) = "(" - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: (1,6)-(1,7) = ")" - │ │ └── block: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (1,8)-(1,16)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (1,11)-(1,12)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (1,11)-(1,12)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :d - │ │ ├── message_loc: (1,11)-(1,12) = "d" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── opening_loc: (1,8)-(1,10) = "do" - │ └── closing_loc: (1,13)-(1,16) = "end" - ├── call_operator_loc: (1,16)-(1,17) = "." - ├── name: :e - ├── message_loc: (1,17)-(1,18) = "e" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,19)-(1,31)) - ├── flags: ∅ - ├── locals: [:f] - ├── parameters: - │ @ BlockParametersNode (location: (1,22)-(1,25)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,23)-(1,24)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (1,23)-(1,24)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :f - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,22)-(1,23) = "|" - │ └── closing_loc: (1,24)-(1,25) = "|" - ├── body: - │ @ StatementsNode (location: (1,26)-(1,27)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,26)-(1,27)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :g - │ ├── message_loc: (1,26)-(1,27) = "g" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── opening_loc: (1,19)-(1,21) = "do" - └── closing_loc: (1,28)-(1,31) = "end" diff --git a/test/prism/snapshots/seattlerb/block_call_dot_op2_cmd_args_do_block.txt b/test/prism/snapshots/seattlerb/block_call_dot_op2_cmd_args_do_block.txt deleted file mode 100644 index ca141580b7d8fb..00000000000000 --- a/test/prism/snapshots/seattlerb/block_call_dot_op2_cmd_args_do_block.txt +++ /dev/null @@ -1,121 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,33)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,33)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,33)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (1,0)-(1,16)) - │ ├── flags: ∅ - │ ├── receiver: - │ │ @ CallNode (location: (1,0)-(1,1)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (1,0)-(1,1) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (1,1)-(1,2) = "." - │ ├── name: :b - │ ├── message_loc: (1,2)-(1,3) = "b" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,4)-(1,7)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (1,4)-(1,7)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :c - │ │ ├── message_loc: (1,4)-(1,5) = "c" - │ │ ├── opening_loc: (1,5)-(1,6) = "(" - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: (1,6)-(1,7) = ")" - │ │ └── block: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (1,8)-(1,16)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (1,11)-(1,12)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (1,11)-(1,12)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :d - │ │ ├── message_loc: (1,11)-(1,12) = "d" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── opening_loc: (1,8)-(1,10) = "do" - │ └── closing_loc: (1,13)-(1,16) = "end" - ├── call_operator_loc: (1,16)-(1,17) = "." - ├── name: :e - ├── message_loc: (1,17)-(1,18) = "e" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,19)-(1,20)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ CallNode (location: (1,19)-(1,20)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :f - │ ├── message_loc: (1,19)-(1,20) = "f" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,21)-(1,33)) - ├── flags: ∅ - ├── locals: [:g] - ├── parameters: - │ @ BlockParametersNode (location: (1,24)-(1,27)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,25)-(1,26)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (1,25)-(1,26)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :g - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,24)-(1,25) = "|" - │ └── closing_loc: (1,26)-(1,27) = "|" - ├── body: - │ @ StatementsNode (location: (1,28)-(1,29)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,28)-(1,29)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :h - │ ├── message_loc: (1,28)-(1,29) = "h" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── opening_loc: (1,21)-(1,23) = "do" - └── closing_loc: (1,30)-(1,33) = "end" diff --git a/test/prism/snapshots/seattlerb/block_call_operation_colon.txt b/test/prism/snapshots/seattlerb/block_call_operation_colon.txt deleted file mode 100644 index cecd421263869f..00000000000000 --- a/test/prism/snapshots/seattlerb/block_call_operation_colon.txt +++ /dev/null @@ -1,57 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,15)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,15)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,15)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (1,0)-(1,12)) - │ ├── flags: ∅ - │ ├── receiver: - │ │ @ CallNode (location: (1,0)-(1,1)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (1,0)-(1,1) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (1,1)-(1,2) = "." - │ ├── name: :b - │ ├── message_loc: (1,2)-(1,3) = "b" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,4)-(1,5)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (1,4)-(1,5)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :c - │ │ ├── message_loc: (1,4)-(1,5) = "c" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (1,6)-(1,12)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (1,6)-(1,8) = "do" - │ └── closing_loc: (1,9)-(1,12) = "end" - ├── call_operator_loc: (1,12)-(1,14) = "::" - ├── name: :d - ├── message_loc: (1,14)-(1,15) = "d" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/block_call_operation_dot.txt b/test/prism/snapshots/seattlerb/block_call_operation_dot.txt deleted file mode 100644 index 5c661fb49a9a57..00000000000000 --- a/test/prism/snapshots/seattlerb/block_call_operation_dot.txt +++ /dev/null @@ -1,57 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,14)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,14)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,14)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (1,0)-(1,12)) - │ ├── flags: ∅ - │ ├── receiver: - │ │ @ CallNode (location: (1,0)-(1,1)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (1,0)-(1,1) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (1,1)-(1,2) = "." - │ ├── name: :b - │ ├── message_loc: (1,2)-(1,3) = "b" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,4)-(1,5)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (1,4)-(1,5)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :c - │ │ ├── message_loc: (1,4)-(1,5) = "c" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (1,6)-(1,12)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (1,6)-(1,8) = "do" - │ └── closing_loc: (1,9)-(1,12) = "end" - ├── call_operator_loc: (1,12)-(1,13) = "." - ├── name: :d - ├── message_loc: (1,13)-(1,14) = "d" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/block_call_paren_call_block_call.txt b/test/prism/snapshots/seattlerb/block_call_paren_call_block_call.txt deleted file mode 100644 index 93c4b05f9bcddb..00000000000000 --- a/test/prism/snapshots/seattlerb/block_call_paren_call_block_call.txt +++ /dev/null @@ -1,65 +0,0 @@ -@ ProgramNode (location: (1,0)-(2,10)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(2,10)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ CallNode (location: (1,0)-(1,5)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (1,0)-(1,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,2)-(1,5)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ ParenthesesNode (location: (1,2)-(1,5)) - │ │ ├── flags: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (1,3)-(1,4)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (1,3)-(1,4)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (1,3)-(1,4) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── opening_loc: (1,2)-(1,3) = "(" - │ │ └── closing_loc: (1,4)-(1,5) = ")" - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── @ CallNode (location: (2,0)-(2,10)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (2,0)-(2,1)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :c - │ ├── message_loc: (2,0)-(2,1) = "c" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: (2,1)-(2,2) = "." - ├── name: :d - ├── message_loc: (2,2)-(2,3) = "d" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (2,4)-(2,10)) - ├── flags: ∅ - ├── locals: [] - ├── parameters: ∅ - ├── body: ∅ - ├── opening_loc: (2,4)-(2,6) = "do" - └── closing_loc: (2,7)-(2,10) = "end" diff --git a/test/prism/snapshots/seattlerb/block_command_operation_colon.txt b/test/prism/snapshots/seattlerb/block_command_operation_colon.txt deleted file mode 100644 index c71fbe2f4a0a58..00000000000000 --- a/test/prism/snapshots/seattlerb/block_command_operation_colon.txt +++ /dev/null @@ -1,52 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,17)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,17)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,17)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (1,0)-(1,11)) - │ ├── flags: ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (1,0)-(1,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,2)-(1,4)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ SymbolNode (location: (1,2)-(1,4)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (1,2)-(1,3) = ":" - │ │ ├── value_loc: (1,3)-(1,4) = "b" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "b" - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (1,5)-(1,11)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (1,5)-(1,7) = "do" - │ └── closing_loc: (1,8)-(1,11) = "end" - ├── call_operator_loc: (1,11)-(1,13) = "::" - ├── name: :c - ├── message_loc: (1,13)-(1,14) = "c" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,15)-(1,17)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ SymbolNode (location: (1,15)-(1,17)) - │ ├── flags: static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (1,15)-(1,16) = ":" - │ ├── value_loc: (1,16)-(1,17) = "d" - │ ├── closing_loc: ∅ - │ └── unescaped: "d" - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/block_command_operation_dot.txt b/test/prism/snapshots/seattlerb/block_command_operation_dot.txt deleted file mode 100644 index 68d98c99b46e2c..00000000000000 --- a/test/prism/snapshots/seattlerb/block_command_operation_dot.txt +++ /dev/null @@ -1,52 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,16)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,16)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,16)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (1,0)-(1,11)) - │ ├── flags: ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (1,0)-(1,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,2)-(1,4)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ SymbolNode (location: (1,2)-(1,4)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (1,2)-(1,3) = ":" - │ │ ├── value_loc: (1,3)-(1,4) = "b" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "b" - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (1,5)-(1,11)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (1,5)-(1,7) = "do" - │ └── closing_loc: (1,8)-(1,11) = "end" - ├── call_operator_loc: (1,11)-(1,12) = "." - ├── name: :c - ├── message_loc: (1,12)-(1,13) = "c" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,14)-(1,16)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ SymbolNode (location: (1,14)-(1,16)) - │ ├── flags: static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (1,14)-(1,15) = ":" - │ ├── value_loc: (1,15)-(1,16) = "d" - │ ├── closing_loc: ∅ - │ └── unescaped: "d" - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/block_decomp_anon_splat_arg.txt b/test/prism/snapshots/seattlerb/block_decomp_anon_splat_arg.txt deleted file mode 100644 index 5628cacc97867d..00000000000000 --- a/test/prism/snapshots/seattlerb/block_decomp_anon_splat_arg.txt +++ /dev/null @@ -1,53 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,14)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,14)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,14)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :f - ├── message_loc: (1,0)-(1,1) = "f" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,14)) - ├── flags: ∅ - ├── locals: [:a] - ├── parameters: - │ @ BlockParametersNode (location: (1,4)-(1,12)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,5)-(1,11)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ MultiTargetNode (location: (1,5)-(1,11)) - │ │ │ ├── flags: ∅ - │ │ │ ├── lefts: (length: 0) - │ │ │ ├── rest: - │ │ │ │ @ SplatNode (location: (1,6)-(1,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── operator_loc: (1,6)-(1,7) = "*" - │ │ │ │ └── expression: ∅ - │ │ │ ├── rights: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (1,9)-(1,10)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :a - │ │ │ ├── lparen_loc: (1,5)-(1,6) = "(" - │ │ │ └── rparen_loc: (1,10)-(1,11) = ")" - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,4)-(1,5) = "|" - │ └── closing_loc: (1,11)-(1,12) = "|" - ├── body: ∅ - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,13)-(1,14) = "}" diff --git a/test/prism/snapshots/seattlerb/block_decomp_arg_splat.txt b/test/prism/snapshots/seattlerb/block_decomp_arg_splat.txt deleted file mode 100644 index b13e13d167ef8e..00000000000000 --- a/test/prism/snapshots/seattlerb/block_decomp_arg_splat.txt +++ /dev/null @@ -1,53 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,14)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,14)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,14)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :a - ├── message_loc: (1,0)-(1,1) = "a" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,14)) - ├── flags: ∅ - ├── locals: [:b] - ├── parameters: - │ @ BlockParametersNode (location: (1,4)-(1,12)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,5)-(1,11)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ MultiTargetNode (location: (1,5)-(1,11)) - │ │ │ ├── flags: ∅ - │ │ │ ├── lefts: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (1,6)-(1,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :b - │ │ │ ├── rest: - │ │ │ │ @ SplatNode (location: (1,9)-(1,10)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── operator_loc: (1,9)-(1,10) = "*" - │ │ │ │ └── expression: ∅ - │ │ │ ├── rights: (length: 0) - │ │ │ ├── lparen_loc: (1,5)-(1,6) = "(" - │ │ │ └── rparen_loc: (1,10)-(1,11) = ")" - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,4)-(1,5) = "|" - │ └── closing_loc: (1,11)-(1,12) = "|" - ├── body: ∅ - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,13)-(1,14) = "}" diff --git a/test/prism/snapshots/seattlerb/block_decomp_arg_splat_arg.txt b/test/prism/snapshots/seattlerb/block_decomp_arg_splat_arg.txt deleted file mode 100644 index ba0a6202cedc07..00000000000000 --- a/test/prism/snapshots/seattlerb/block_decomp_arg_splat_arg.txt +++ /dev/null @@ -1,59 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,18)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,18)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,18)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :f - ├── message_loc: (1,0)-(1,1) = "f" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,18)) - ├── flags: ∅ - ├── locals: [:a, :b, :c] - ├── parameters: - │ @ BlockParametersNode (location: (1,4)-(1,16)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,5)-(1,15)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ MultiTargetNode (location: (1,5)-(1,15)) - │ │ │ ├── flags: ∅ - │ │ │ ├── lefts: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (1,6)-(1,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :a - │ │ │ ├── rest: - │ │ │ │ @ SplatNode (location: (1,9)-(1,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── operator_loc: (1,9)-(1,10) = "*" - │ │ │ │ └── expression: - │ │ │ │ @ RequiredParameterNode (location: (1,10)-(1,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :b - │ │ │ ├── rights: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (1,13)-(1,14)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :c - │ │ │ ├── lparen_loc: (1,5)-(1,6) = "(" - │ │ │ └── rparen_loc: (1,14)-(1,15) = ")" - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,4)-(1,5) = "|" - │ └── closing_loc: (1,15)-(1,16) = "|" - ├── body: ∅ - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,17)-(1,18) = "}" diff --git a/test/prism/snapshots/seattlerb/block_decomp_splat.txt b/test/prism/snapshots/seattlerb/block_decomp_splat.txt deleted file mode 100644 index fd8ad4bda1fa46..00000000000000 --- a/test/prism/snapshots/seattlerb/block_decomp_splat.txt +++ /dev/null @@ -1,53 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,12)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,12)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,12)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :f - ├── message_loc: (1,0)-(1,1) = "f" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,12)) - ├── flags: ∅ - ├── locals: [:a] - ├── parameters: - │ @ BlockParametersNode (location: (1,4)-(1,10)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,5)-(1,9)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ MultiTargetNode (location: (1,5)-(1,9)) - │ │ │ ├── flags: ∅ - │ │ │ ├── lefts: (length: 0) - │ │ │ ├── rest: - │ │ │ │ @ SplatNode (location: (1,6)-(1,8)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── operator_loc: (1,6)-(1,7) = "*" - │ │ │ │ └── expression: - │ │ │ │ @ RequiredParameterNode (location: (1,7)-(1,8)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :a - │ │ │ ├── rights: (length: 0) - │ │ │ ├── lparen_loc: (1,5)-(1,6) = "(" - │ │ │ └── rparen_loc: (1,8)-(1,9) = ")" - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,4)-(1,5) = "|" - │ └── closing_loc: (1,9)-(1,10) = "|" - ├── body: ∅ - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,11)-(1,12) = "}" diff --git a/test/prism/snapshots/seattlerb/block_kw.txt b/test/prism/snapshots/seattlerb/block_kw.txt deleted file mode 100644 index d76998ecb6636a..00000000000000 --- a/test/prism/snapshots/seattlerb/block_kw.txt +++ /dev/null @@ -1,47 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,15)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,15)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,15)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :blah - ├── message_loc: (1,0)-(1,4) = "blah" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,5)-(1,15)) - ├── flags: ∅ - ├── locals: [:k] - ├── parameters: - │ @ BlockParametersNode (location: (1,7)-(1,13)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,8)-(1,12)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 1) - │ │ │ └── @ OptionalKeywordParameterNode (location: (1,8)-(1,12)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :k - │ │ │ ├── name_loc: (1,8)-(1,10) = "k:" - │ │ │ └── value: - │ │ │ @ IntegerNode (location: (1,10)-(1,12)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 42 - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,7)-(1,8) = "|" - │ └── closing_loc: (1,12)-(1,13) = "|" - ├── body: ∅ - ├── opening_loc: (1,5)-(1,6) = "{" - └── closing_loc: (1,14)-(1,15) = "}" diff --git a/test/prism/snapshots/seattlerb/block_kw__required.txt b/test/prism/snapshots/seattlerb/block_kw__required.txt deleted file mode 100644 index f04987d854fd10..00000000000000 --- a/test/prism/snapshots/seattlerb/block_kw__required.txt +++ /dev/null @@ -1,43 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,16)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,16)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,16)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :blah - ├── message_loc: (1,0)-(1,4) = "blah" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,5)-(1,16)) - ├── flags: ∅ - ├── locals: [:k] - ├── parameters: - │ @ BlockParametersNode (location: (1,8)-(1,12)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,9)-(1,11)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 1) - │ │ │ └── @ RequiredKeywordParameterNode (location: (1,9)-(1,11)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :k - │ │ │ └── name_loc: (1,9)-(1,11) = "k:" - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,8)-(1,9) = "|" - │ └── closing_loc: (1,11)-(1,12) = "|" - ├── body: ∅ - ├── opening_loc: (1,5)-(1,7) = "do" - └── closing_loc: (1,13)-(1,16) = "end" diff --git a/test/prism/snapshots/seattlerb/block_kwarg_lvar.txt b/test/prism/snapshots/seattlerb/block_kwarg_lvar.txt deleted file mode 100644 index 861348f2a2a4a7..00000000000000 --- a/test/prism/snapshots/seattlerb/block_kwarg_lvar.txt +++ /dev/null @@ -1,57 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,20)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,20)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,20)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :bl - ├── message_loc: (1,0)-(1,2) = "bl" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,3)-(1,20)) - ├── flags: ∅ - ├── locals: [:kw] - ├── parameters: - │ @ BlockParametersNode (location: (1,5)-(1,15)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,6)-(1,14)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 1) - │ │ │ └── @ OptionalKeywordParameterNode (location: (1,6)-(1,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :kw - │ │ │ ├── name_loc: (1,6)-(1,9) = "kw:" - │ │ │ └── value: - │ │ │ @ SymbolNode (location: (1,10)-(1,14)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (1,10)-(1,11) = ":" - │ │ │ ├── value_loc: (1,11)-(1,14) = "val" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "val" - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,5)-(1,6) = "|" - │ └── closing_loc: (1,14)-(1,15) = "|" - ├── body: - │ @ StatementsNode (location: (1,16)-(1,18)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ LocalVariableReadNode (location: (1,16)-(1,18)) - │ ├── flags: newline - │ ├── name: :kw - │ └── depth: 0 - ├── opening_loc: (1,3)-(1,4) = "{" - └── closing_loc: (1,19)-(1,20) = "}" diff --git a/test/prism/snapshots/seattlerb/block_kwarg_lvar_multiple.txt b/test/prism/snapshots/seattlerb/block_kwarg_lvar_multiple.txt deleted file mode 100644 index f1c1fef8a38c48..00000000000000 --- a/test/prism/snapshots/seattlerb/block_kwarg_lvar_multiple.txt +++ /dev/null @@ -1,68 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,33)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,33)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,33)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :bl - ├── message_loc: (1,0)-(1,2) = "bl" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,3)-(1,33)) - ├── flags: ∅ - ├── locals: [:kw, :kw2] - ├── parameters: - │ @ BlockParametersNode (location: (1,5)-(1,28)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,6)-(1,26)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 2) - │ │ │ ├── @ OptionalKeywordParameterNode (location: (1,6)-(1,14)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :kw - │ │ │ │ ├── name_loc: (1,6)-(1,9) = "kw:" - │ │ │ │ └── value: - │ │ │ │ @ SymbolNode (location: (1,10)-(1,14)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: (1,10)-(1,11) = ":" - │ │ │ │ ├── value_loc: (1,11)-(1,14) = "val" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "val" - │ │ │ └── @ OptionalKeywordParameterNode (location: (1,16)-(1,26)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :kw2 - │ │ │ ├── name_loc: (1,16)-(1,20) = "kw2:" - │ │ │ └── value: - │ │ │ @ SymbolNode (location: (1,21)-(1,26)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (1,21)-(1,22) = ":" - │ │ │ ├── value_loc: (1,22)-(1,26) = "val2" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "val2" - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,5)-(1,6) = "|" - │ └── closing_loc: (1,27)-(1,28) = "|" - ├── body: - │ @ StatementsNode (location: (1,29)-(1,31)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ LocalVariableReadNode (location: (1,29)-(1,31)) - │ ├── flags: newline - │ ├── name: :kw - │ └── depth: 0 - ├── opening_loc: (1,3)-(1,4) = "{" - └── closing_loc: (1,32)-(1,33) = "}" diff --git a/test/prism/snapshots/seattlerb/block_opt_arg.txt b/test/prism/snapshots/seattlerb/block_opt_arg.txt deleted file mode 100644 index 39be11ac92d193..00000000000000 --- a/test/prism/snapshots/seattlerb/block_opt_arg.txt +++ /dev/null @@ -1,51 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,14)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,14)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,14)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :a - ├── message_loc: (1,0)-(1,1) = "a" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,14)) - ├── flags: ∅ - ├── locals: [:b, :c] - ├── parameters: - │ @ BlockParametersNode (location: (1,4)-(1,12)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,5)-(1,11)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 1) - │ │ │ └── @ OptionalParameterNode (location: (1,5)-(1,8)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :b - │ │ │ ├── name_loc: (1,5)-(1,6) = "b" - │ │ │ ├── operator_loc: (1,6)-(1,7) = "=" - │ │ │ └── value: - │ │ │ @ IntegerNode (location: (1,7)-(1,8)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (1,10)-(1,11)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :c - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,4)-(1,5) = "|" - │ └── closing_loc: (1,11)-(1,12) = "|" - ├── body: ∅ - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,13)-(1,14) = "}" diff --git a/test/prism/snapshots/seattlerb/block_opt_splat.txt b/test/prism/snapshots/seattlerb/block_opt_splat.txt deleted file mode 100644 index 3898212dc00f64..00000000000000 --- a/test/prism/snapshots/seattlerb/block_opt_splat.txt +++ /dev/null @@ -1,53 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,17)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,17)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,17)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :a - ├── message_loc: (1,0)-(1,1) = "a" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,17)) - ├── flags: ∅ - ├── locals: [:b, :c] - ├── parameters: - │ @ BlockParametersNode (location: (1,4)-(1,15)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,5)-(1,14)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 1) - │ │ │ └── @ OptionalParameterNode (location: (1,5)-(1,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :b - │ │ │ ├── name_loc: (1,5)-(1,6) = "b" - │ │ │ ├── operator_loc: (1,7)-(1,8) = "=" - │ │ │ └── value: - │ │ │ @ IntegerNode (location: (1,9)-(1,10)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── rest: - │ │ │ @ RestParameterNode (location: (1,12)-(1,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :c - │ │ │ ├── name_loc: (1,13)-(1,14) = "c" - │ │ │ └── operator_loc: (1,12)-(1,13) = "*" - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,4)-(1,5) = "|" - │ └── closing_loc: (1,14)-(1,15) = "|" - ├── body: ∅ - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,16)-(1,17) = "}" diff --git a/test/prism/snapshots/seattlerb/block_opt_splat_arg_block_omfg.txt b/test/prism/snapshots/seattlerb/block_opt_splat_arg_block_omfg.txt deleted file mode 100644 index ed4857ad25a939..00000000000000 --- a/test/prism/snapshots/seattlerb/block_opt_splat_arg_block_omfg.txt +++ /dev/null @@ -1,61 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,22)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,22)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,22)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :a - ├── message_loc: (1,0)-(1,1) = "a" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,22)) - ├── flags: ∅ - ├── locals: [:b, :c, :d, :e] - ├── parameters: - │ @ BlockParametersNode (location: (1,4)-(1,20)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,5)-(1,19)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 1) - │ │ │ └── @ OptionalParameterNode (location: (1,5)-(1,8)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :b - │ │ │ ├── name_loc: (1,5)-(1,6) = "b" - │ │ │ ├── operator_loc: (1,6)-(1,7) = "=" - │ │ │ └── value: - │ │ │ @ IntegerNode (location: (1,7)-(1,8)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── rest: - │ │ │ @ RestParameterNode (location: (1,10)-(1,12)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :c - │ │ │ ├── name_loc: (1,11)-(1,12) = "c" - │ │ │ └── operator_loc: (1,10)-(1,11) = "*" - │ │ ├── posts: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (1,14)-(1,15)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :d - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: - │ │ @ BlockParameterNode (location: (1,17)-(1,19)) - │ │ ├── flags: ∅ - │ │ ├── name: :e - │ │ ├── name_loc: (1,18)-(1,19) = "e" - │ │ └── operator_loc: (1,17)-(1,18) = "&" - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,4)-(1,5) = "|" - │ └── closing_loc: (1,19)-(1,20) = "|" - ├── body: ∅ - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,21)-(1,22) = "}" diff --git a/test/prism/snapshots/seattlerb/block_optarg.txt b/test/prism/snapshots/seattlerb/block_optarg.txt deleted file mode 100644 index 2172571eb12da5..00000000000000 --- a/test/prism/snapshots/seattlerb/block_optarg.txt +++ /dev/null @@ -1,51 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,14)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,14)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,14)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :a - ├── message_loc: (1,0)-(1,1) = "a" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,14)) - ├── flags: ∅ - ├── locals: [:b] - ├── parameters: - │ @ BlockParametersNode (location: (1,4)-(1,12)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,5)-(1,11)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 1) - │ │ │ └── @ OptionalParameterNode (location: (1,5)-(1,11)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :b - │ │ │ ├── name_loc: (1,5)-(1,6) = "b" - │ │ │ ├── operator_loc: (1,7)-(1,8) = "=" - │ │ │ └── value: - │ │ │ @ SymbolNode (location: (1,9)-(1,11)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (1,9)-(1,10) = ":" - │ │ │ ├── value_loc: (1,10)-(1,11) = "c" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "c" - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,4)-(1,5) = "|" - │ └── closing_loc: (1,11)-(1,12) = "|" - ├── body: ∅ - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,13)-(1,14) = "}" diff --git a/test/prism/snapshots/seattlerb/block_paren_splat.txt b/test/prism/snapshots/seattlerb/block_paren_splat.txt deleted file mode 100644 index b6c2da679bb072..00000000000000 --- a/test/prism/snapshots/seattlerb/block_paren_splat.txt +++ /dev/null @@ -1,56 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,15)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,15)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,15)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :a - ├── message_loc: (1,0)-(1,1) = "a" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,15)) - ├── flags: ∅ - ├── locals: [:b, :c] - ├── parameters: - │ @ BlockParametersNode (location: (1,4)-(1,13)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,5)-(1,12)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ MultiTargetNode (location: (1,5)-(1,12)) - │ │ │ ├── flags: ∅ - │ │ │ ├── lefts: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (1,6)-(1,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :b - │ │ │ ├── rest: - │ │ │ │ @ SplatNode (location: (1,9)-(1,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── operator_loc: (1,9)-(1,10) = "*" - │ │ │ │ └── expression: - │ │ │ │ @ RequiredParameterNode (location: (1,10)-(1,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :c - │ │ │ ├── rights: (length: 0) - │ │ │ ├── lparen_loc: (1,5)-(1,6) = "(" - │ │ │ └── rparen_loc: (1,11)-(1,12) = ")" - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,4)-(1,5) = "|" - │ └── closing_loc: (1,12)-(1,13) = "|" - ├── body: ∅ - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,14)-(1,15) = "}" diff --git a/test/prism/snapshots/seattlerb/block_reg_optarg.txt b/test/prism/snapshots/seattlerb/block_reg_optarg.txt deleted file mode 100644 index 0173b92e8f08f6..00000000000000 --- a/test/prism/snapshots/seattlerb/block_reg_optarg.txt +++ /dev/null @@ -1,54 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,17)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,17)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,17)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :a - ├── message_loc: (1,0)-(1,1) = "a" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,17)) - ├── flags: ∅ - ├── locals: [:b, :c] - ├── parameters: - │ @ BlockParametersNode (location: (1,4)-(1,15)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,5)-(1,14)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (1,5)-(1,6)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :b - │ │ ├── optionals: (length: 1) - │ │ │ └── @ OptionalParameterNode (location: (1,8)-(1,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :c - │ │ │ ├── name_loc: (1,8)-(1,9) = "c" - │ │ │ ├── operator_loc: (1,10)-(1,11) = "=" - │ │ │ └── value: - │ │ │ @ SymbolNode (location: (1,12)-(1,14)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (1,12)-(1,13) = ":" - │ │ │ ├── value_loc: (1,13)-(1,14) = "d" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "d" - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,4)-(1,5) = "|" - │ └── closing_loc: (1,14)-(1,15) = "|" - ├── body: ∅ - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,16)-(1,17) = "}" diff --git a/test/prism/snapshots/seattlerb/block_return.txt b/test/prism/snapshots/seattlerb/block_return.txt deleted file mode 100644 index 0eee33c844e2b3..00000000000000 --- a/test/prism/snapshots/seattlerb/block_return.txt +++ /dev/null @@ -1,62 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,27)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,27)) - ├── flags: ∅ - └── body: (length: 1) - └── @ ReturnNode (location: (1,0)-(1,27)) - ├── flags: newline - ├── keyword_loc: (1,0)-(1,6) = "return" - └── arguments: - @ ArgumentsNode (location: (1,7)-(1,27)) - ├── flags: ∅ - └── arguments: (length: 1) - └── @ CallNode (location: (1,7)-(1,27)) - ├── flags: ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :foo - ├── message_loc: (1,7)-(1,10) = "foo" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,11)-(1,14)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ CallNode (location: (1,11)-(1,14)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :arg - │ ├── message_loc: (1,11)-(1,14) = "arg" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,15)-(1,27)) - ├── flags: ∅ - ├── locals: [:bar] - ├── parameters: - │ @ BlockParametersNode (location: (1,18)-(1,23)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,19)-(1,22)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (1,19)-(1,22)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :bar - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,18)-(1,19) = "|" - │ └── closing_loc: (1,22)-(1,23) = "|" - ├── body: ∅ - ├── opening_loc: (1,15)-(1,17) = "do" - └── closing_loc: (1,24)-(1,27) = "end" diff --git a/test/prism/snapshots/seattlerb/block_scope.txt b/test/prism/snapshots/seattlerb/block_scope.txt deleted file mode 100644 index ef659bb38ebe4f..00000000000000 --- a/test/prism/snapshots/seattlerb/block_scope.txt +++ /dev/null @@ -1,33 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,10)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,10)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,10)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :a - ├── message_loc: (1,0)-(1,1) = "a" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,10)) - ├── flags: ∅ - ├── locals: [:b] - ├── parameters: - │ @ BlockParametersNode (location: (1,4)-(1,8)) - │ ├── flags: ∅ - │ ├── parameters: ∅ - │ ├── locals: (length: 1) - │ │ └── @ BlockLocalVariableNode (location: (1,6)-(1,7)) - │ │ ├── flags: ∅ - │ │ └── name: :b - │ ├── opening_loc: (1,4)-(1,5) = "|" - │ └── closing_loc: (1,7)-(1,8) = "|" - ├── body: ∅ - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,9)-(1,10) = "}" diff --git a/test/prism/snapshots/seattlerb/block_splat_reg.txt b/test/prism/snapshots/seattlerb/block_splat_reg.txt deleted file mode 100644 index b5eb009c52dc89..00000000000000 --- a/test/prism/snapshots/seattlerb/block_splat_reg.txt +++ /dev/null @@ -1,47 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,13)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,13)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,13)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :a - ├── message_loc: (1,0)-(1,1) = "a" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,13)) - ├── flags: ∅ - ├── locals: [:b, :c] - ├── parameters: - │ @ BlockParametersNode (location: (1,4)-(1,11)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,5)-(1,10)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: - │ │ │ @ RestParameterNode (location: (1,5)-(1,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :b - │ │ │ ├── name_loc: (1,6)-(1,7) = "b" - │ │ │ └── operator_loc: (1,5)-(1,6) = "*" - │ │ ├── posts: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (1,9)-(1,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :c - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,4)-(1,5) = "|" - │ └── closing_loc: (1,10)-(1,11) = "|" - ├── body: ∅ - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,12)-(1,13) = "}" diff --git a/test/prism/snapshots/seattlerb/bug169.txt b/test/prism/snapshots/seattlerb/bug169.txt deleted file mode 100644 index c55df4257ded69..00000000000000 --- a/test/prism/snapshots/seattlerb/bug169.txt +++ /dev/null @@ -1,32 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,7)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,7)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,7)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :m - ├── message_loc: (1,0)-(1,1) = "m" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,2)-(1,4)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ ParenthesesNode (location: (1,2)-(1,4)) - │ ├── flags: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (1,2)-(1,3) = "(" - │ └── closing_loc: (1,3)-(1,4) = ")" - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,5)-(1,7)) - ├── flags: ∅ - ├── locals: [] - ├── parameters: ∅ - ├── body: ∅ - ├── opening_loc: (1,5)-(1,6) = "{" - └── closing_loc: (1,6)-(1,7) = "}" diff --git a/test/prism/snapshots/seattlerb/bug179.txt b/test/prism/snapshots/seattlerb/bug179.txt deleted file mode 100644 index 4392d5ec27c6cb..00000000000000 --- a/test/prism/snapshots/seattlerb/bug179.txt +++ /dev/null @@ -1,32 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,9)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,9)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,9)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :p - ├── message_loc: (1,0)-(1,1) = "p" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,2)-(1,9)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ RangeNode (location: (1,2)-(1,9)) - │ ├── flags: ∅ - │ ├── left: - │ │ @ ParenthesesNode (location: (1,2)-(1,4)) - │ │ ├── flags: ∅ - │ │ ├── body: ∅ - │ │ ├── opening_loc: (1,2)-(1,3) = "(" - │ │ └── closing_loc: (1,3)-(1,4) = ")" - │ ├── right: - │ │ @ NilNode (location: (1,6)-(1,9)) - │ │ └── flags: static_literal - │ └── operator_loc: (1,4)-(1,6) = ".." - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/bug190.txt b/test/prism/snapshots/seattlerb/bug190.txt deleted file mode 100644 index 004ca16a60c502..00000000000000 --- a/test/prism/snapshots/seattlerb/bug190.txt +++ /dev/null @@ -1,13 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,6)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,6)) - ├── flags: ∅ - └── body: (length: 1) - └── @ RegularExpressionNode (location: (1,0)-(1,6)) - ├── flags: newline, static_literal, forced_us_ascii_encoding - ├── opening_loc: (1,0)-(1,3) = "%r'" - ├── content_loc: (1,3)-(1,5) = "\\'" - ├── closing_loc: (1,5)-(1,6) = "'" - └── unescaped: "'" diff --git a/test/prism/snapshots/seattlerb/bug191.txt b/test/prism/snapshots/seattlerb/bug191.txt deleted file mode 100644 index 27b7f97f45007d..00000000000000 --- a/test/prism/snapshots/seattlerb/bug191.txt +++ /dev/null @@ -1,97 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,9)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,9)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ IfNode (location: (1,0)-(1,9)) - │ ├── flags: newline - │ ├── if_keyword_loc: ∅ - │ ├── predicate: - │ │ @ CallNode (location: (1,0)-(1,1)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (1,0)-(1,1) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── then_keyword_loc: (1,2)-(1,3) = "?" - │ ├── statements: - │ │ @ StatementsNode (location: (1,4)-(1,6)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ StringNode (location: (1,4)-(1,6)) - │ │ ├── flags: newline - │ │ ├── opening_loc: (1,4)-(1,5) = "\"" - │ │ ├── content_loc: (1,5)-(1,5) = "" - │ │ ├── closing_loc: (1,5)-(1,6) = "\"" - │ │ └── unescaped: "" - │ ├── subsequent: - │ │ @ ElseNode (location: (1,6)-(1,9)) - │ │ ├── flags: ∅ - │ │ ├── else_keyword_loc: (1,6)-(1,7) = ":" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (1,8)-(1,9)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (1,8)-(1,9)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (1,8)-(1,9) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── end_keyword_loc: ∅ - │ └── end_keyword_loc: ∅ - └── @ IfNode (location: (3,0)-(3,9)) - ├── flags: newline - ├── if_keyword_loc: ∅ - ├── predicate: - │ @ CallNode (location: (3,0)-(3,1)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (3,0)-(3,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── then_keyword_loc: (3,2)-(3,3) = "?" - ├── statements: - │ @ StatementsNode (location: (3,4)-(3,6)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ StringNode (location: (3,4)-(3,6)) - │ ├── flags: newline - │ ├── opening_loc: (3,4)-(3,5) = "'" - │ ├── content_loc: (3,5)-(3,5) = "" - │ ├── closing_loc: (3,5)-(3,6) = "'" - │ └── unescaped: "" - ├── subsequent: - │ @ ElseNode (location: (3,6)-(3,9)) - │ ├── flags: ∅ - │ ├── else_keyword_loc: (3,6)-(3,7) = ":" - │ ├── statements: - │ │ @ StatementsNode (location: (3,8)-(3,9)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (3,8)-(3,9)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :b - │ │ ├── message_loc: (3,8)-(3,9) = "b" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── end_keyword_loc: ∅ - └── end_keyword_loc: ∅ diff --git a/test/prism/snapshots/seattlerb/bug202.txt b/test/prism/snapshots/seattlerb/bug202.txt deleted file mode 100644 index f907081c208a28..00000000000000 --- a/test/prism/snapshots/seattlerb/bug202.txt +++ /dev/null @@ -1,26 +0,0 @@ -@ ProgramNode (location: (1,0)-(2,10)) -├── flags: ∅ -├── locals: [:测试] -└── statements: - @ StatementsNode (location: (1,0)-(2,10)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ GlobalVariableWriteNode (location: (1,0)-(1,11)) - │ ├── flags: newline - │ ├── name: :$测试 - │ ├── name_loc: (1,0)-(1,7) = "$测试" - │ ├── value: - │ │ @ IntegerNode (location: (1,10)-(1,11)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ └── operator_loc: (1,8)-(1,9) = "=" - └── @ LocalVariableWriteNode (location: (2,0)-(2,10)) - ├── flags: newline - ├── name: :测试 - ├── depth: 0 - ├── name_loc: (2,0)-(2,6) = "测试" - ├── value: - │ @ IntegerNode (location: (2,9)-(2,10)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - └── operator_loc: (2,7)-(2,8) = "=" diff --git a/test/prism/snapshots/seattlerb/bug236.txt b/test/prism/snapshots/seattlerb/bug236.txt deleted file mode 100644 index 792020dc78b52f..00000000000000 --- a/test/prism/snapshots/seattlerb/bug236.txt +++ /dev/null @@ -1,79 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,6)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,6)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ CallNode (location: (1,0)-(1,7)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :x - │ ├── message_loc: (1,0)-(1,1) = "x" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (1,1)-(1,7)) - │ ├── flags: ∅ - │ ├── locals: [:a] - │ ├── parameters: - │ │ @ BlockParametersNode (location: (1,2)-(1,6)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (1,3)-(1,5)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (1,3)-(1,4)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :a - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: - │ │ │ │ @ ImplicitRestNode (location: (1,4)-(1,5)) - │ │ │ │ └── flags: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: (1,2)-(1,3) = "|" - │ │ └── closing_loc: (1,5)-(1,6) = "|" - │ ├── body: ∅ - │ ├── opening_loc: (1,1)-(1,2) = "{" - │ └── closing_loc: (1,6)-(1,7) = "}" - └── @ CallNode (location: (3,0)-(3,6)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :x - ├── message_loc: (3,0)-(3,1) = "x" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (3,1)-(3,6)) - ├── flags: ∅ - ├── locals: [:a] - ├── parameters: - │ @ BlockParametersNode (location: (3,2)-(3,5)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (3,3)-(3,4)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (3,3)-(3,4)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :a - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (3,2)-(3,3) = "|" - │ └── closing_loc: (3,4)-(3,5) = "|" - ├── body: ∅ - ├── opening_loc: (3,1)-(3,2) = "{" - └── closing_loc: (3,5)-(3,6) = "}" diff --git a/test/prism/snapshots/seattlerb/bug290.txt b/test/prism/snapshots/seattlerb/bug290.txt deleted file mode 100644 index 85d75c0d16132f..00000000000000 --- a/test/prism/snapshots/seattlerb/bug290.txt +++ /dev/null @@ -1,28 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ BeginNode (location: (1,0)-(3,3)) - ├── flags: newline - ├── begin_keyword_loc: (1,0)-(1,5) = "begin" - ├── statements: - │ @ StatementsNode (location: (2,2)-(2,5)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (2,2)-(2,5)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (2,2)-(2,5) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── rescue_clause: ∅ - ├── else_clause: ∅ - ├── ensure_clause: ∅ - └── end_keyword_loc: (3,0)-(3,3) = "end" diff --git a/test/prism/snapshots/seattlerb/bug_187.txt b/test/prism/snapshots/seattlerb/bug_187.txt deleted file mode 100644 index 6a5786e34ab08b..00000000000000 --- a/test/prism/snapshots/seattlerb/bug_187.txt +++ /dev/null @@ -1,64 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(3,3)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :private - ├── message_loc: (1,0)-(1,7) = "private" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,8)-(3,3)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ DefNode (location: (1,8)-(3,3)) - │ ├── flags: ∅ - │ ├── name: :f - │ ├── name_loc: (1,12)-(1,13) = "f" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (2,0)-(2,10)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (2,0)-(2,10)) - │ │ ├── flags: newline - │ │ ├── receiver: - │ │ │ @ CallNode (location: (2,0)-(2,1)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :a - │ │ │ ├── message_loc: (2,0)-(2,1) = "a" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: (2,1)-(2,2) = "." - │ │ ├── name: :b - │ │ ├── message_loc: (2,2)-(2,3) = "b" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: - │ │ @ BlockNode (location: (2,4)-(2,10)) - │ │ ├── flags: ∅ - │ │ ├── locals: [] - │ │ ├── parameters: ∅ - │ │ ├── body: ∅ - │ │ ├── opening_loc: (2,4)-(2,6) = "do" - │ │ └── closing_loc: (2,7)-(2,10) = "end" - │ ├── locals: [] - │ ├── def_keyword_loc: (1,8)-(1,11) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (3,0)-(3,3) = "end" - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/bug_215.txt b/test/prism/snapshots/seattlerb/bug_215.txt deleted file mode 100644 index ee82b4f1da9982..00000000000000 --- a/test/prism/snapshots/seattlerb/bug_215.txt +++ /dev/null @@ -1,17 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,13)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,13)) - ├── flags: ∅ - └── body: (length: 1) - └── @ UndefNode (location: (1,0)-(1,13)) - ├── flags: newline - ├── names: (length: 1) - │ └── @ SymbolNode (location: (1,6)-(1,13)) - │ ├── flags: static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (1,6)-(1,9) = "%s(" - │ ├── value_loc: (1,9)-(1,12) = "foo" - │ ├── closing_loc: (1,12)-(1,13) = ")" - │ └── unescaped: "foo" - └── keyword_loc: (1,0)-(1,5) = "undef" diff --git a/test/prism/snapshots/seattlerb/bug_249.txt b/test/prism/snapshots/seattlerb/bug_249.txt deleted file mode 100644 index 06daa80e41d8f0..00000000000000 --- a/test/prism/snapshots/seattlerb/bug_249.txt +++ /dev/null @@ -1,95 +0,0 @@ -@ ProgramNode (location: (1,0)-(4,28)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(4,28)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(4,28)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :mount - ├── message_loc: (1,0)-(1,5) = "mount" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,6)-(4,28)) - │ ├── flags: contains_keywords - │ └── arguments: (length: 2) - │ ├── @ CallNode (location: (1,6)-(4,9)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ ParenthesesNode (location: (1,6)-(4,5)) - │ │ │ ├── flags: ∅ - │ │ │ ├── body: - │ │ │ │ @ StatementsNode (location: (1,7)-(4,4)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (1,7)-(4,4)) - │ │ │ │ ├── flags: newline - │ │ │ │ ├── receiver: - │ │ │ │ │ @ ConstantReadNode (location: (1,7)-(1,12)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── name: :Class - │ │ │ │ ├── call_operator_loc: (1,12)-(1,13) = "." - │ │ │ │ ├── name: :new - │ │ │ │ ├── message_loc: (1,13)-(1,16) = "new" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: - │ │ │ │ @ BlockNode (location: (1,17)-(4,4)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── locals: [] - │ │ │ │ ├── parameters: ∅ - │ │ │ │ ├── body: - │ │ │ │ │ @ StatementsNode (location: (2,0)-(3,3)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── body: (length: 1) - │ │ │ │ │ └── @ DefNode (location: (2,0)-(3,3)) - │ │ │ │ │ ├── flags: newline - │ │ │ │ │ ├── name: :initialize - │ │ │ │ │ ├── name_loc: (2,4)-(2,14) = "initialize" - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── parameters: ∅ - │ │ │ │ │ ├── body: ∅ - │ │ │ │ │ ├── locals: [] - │ │ │ │ │ ├── def_keyword_loc: (2,0)-(2,3) = "def" - │ │ │ │ │ ├── operator_loc: ∅ - │ │ │ │ │ ├── lparen_loc: ∅ - │ │ │ │ │ ├── rparen_loc: ∅ - │ │ │ │ │ ├── equal_loc: ∅ - │ │ │ │ │ └── end_keyword_loc: (3,0)-(3,3) = "end" - │ │ │ │ ├── opening_loc: (1,17)-(1,19) = "do" - │ │ │ │ └── closing_loc: (4,1)-(4,4) = "end" - │ │ │ ├── opening_loc: (1,6)-(1,7) = "(" - │ │ │ └── closing_loc: (4,4)-(4,5) = ")" - │ │ ├── call_operator_loc: (4,5)-(4,6) = "." - │ │ ├── name: :new - │ │ ├── message_loc: (4,6)-(4,9) = "new" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── @ KeywordHashNode (location: (4,11)-(4,28)) - │ ├── flags: symbol_keys - │ └── elements: (length: 1) - │ └── @ AssocNode (location: (4,11)-(4,28)) - │ ├── flags: ∅ - │ ├── key: - │ │ @ SymbolNode (location: (4,11)-(4,14)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (4,11)-(4,12) = ":" - │ │ ├── value_loc: (4,12)-(4,14) = "at" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "at" - │ ├── value: - │ │ @ StringNode (location: (4,18)-(4,28)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (4,18)-(4,19) = "'" - │ │ ├── content_loc: (4,19)-(4,27) = "endpoint" - │ │ ├── closing_loc: (4,27)-(4,28) = "'" - │ │ └── unescaped: "endpoint" - │ └── operator_loc: (4,15)-(4,17) = "=>" - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/bug_and.txt b/test/prism/snapshots/seattlerb/bug_and.txt deleted file mode 100644 index 89eb403b4a8061..00000000000000 --- a/test/prism/snapshots/seattlerb/bug_and.txt +++ /dev/null @@ -1,28 +0,0 @@ -@ ProgramNode (location: (1,0)-(4,11)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(4,11)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ AndNode (location: (1,0)-(2,4)) - │ ├── flags: newline - │ ├── left: - │ │ @ TrueNode (location: (1,0)-(1,4)) - │ │ └── flags: static_literal - │ ├── right: - │ │ @ TrueNode (location: (2,0)-(2,4)) - │ │ └── flags: static_literal - │ └── operator_loc: (1,5)-(1,8) = "and" - └── @ AndNode (location: (4,0)-(4,11)) - ├── flags: newline - ├── left: - │ @ TrueNode (location: (4,0)-(4,4)) - │ └── flags: static_literal - ├── right: - │ @ ArrayNode (location: (4,9)-(4,11)) - │ ├── flags: static_literal - │ ├── elements: (length: 0) - │ ├── opening_loc: (4,9)-(4,10) = "[" - │ └── closing_loc: (4,10)-(4,11) = "]" - └── operator_loc: (4,5)-(4,8) = "and" diff --git a/test/prism/snapshots/seattlerb/bug_args__19.txt b/test/prism/snapshots/seattlerb/bug_args__19.txt deleted file mode 100644 index 5b1d897718a323..00000000000000 --- a/test/prism/snapshots/seattlerb/bug_args__19.txt +++ /dev/null @@ -1,65 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,16)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,16)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,16)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :f - ├── message_loc: (1,0)-(1,1) = "f" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,16)) - ├── flags: ∅ - ├── locals: [:a, :b] - ├── parameters: - │ @ BlockParametersNode (location: (1,4)-(1,12)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,5)-(1,11)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ MultiTargetNode (location: (1,5)-(1,11)) - │ │ │ ├── flags: ∅ - │ │ │ ├── lefts: (length: 2) - │ │ │ │ ├── @ RequiredParameterNode (location: (1,6)-(1,7)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── name: :a - │ │ │ │ └── @ RequiredParameterNode (location: (1,9)-(1,10)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :b - │ │ │ ├── rest: ∅ - │ │ │ ├── rights: (length: 0) - │ │ │ ├── lparen_loc: (1,5)-(1,6) = "(" - │ │ │ └── rparen_loc: (1,10)-(1,11) = ")" - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,4)-(1,5) = "|" - │ └── closing_loc: (1,11)-(1,12) = "|" - ├── body: - │ @ StatementsNode (location: (1,13)-(1,14)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,13)-(1,14)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :d - │ ├── message_loc: (1,13)-(1,14) = "d" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,15)-(1,16) = "}" diff --git a/test/prism/snapshots/seattlerb/bug_args_masgn.txt b/test/prism/snapshots/seattlerb/bug_args_masgn.txt deleted file mode 100644 index 6456d82ecc3130..00000000000000 --- a/test/prism/snapshots/seattlerb/bug_args_masgn.txt +++ /dev/null @@ -1,55 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,17)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,17)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,17)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :f - ├── message_loc: (1,0)-(1,1) = "f" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,17)) - ├── flags: ∅ - ├── locals: [:a, :b, :c] - ├── parameters: - │ @ BlockParametersNode (location: (1,4)-(1,15)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,5)-(1,14)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 2) - │ │ │ ├── @ MultiTargetNode (location: (1,5)-(1,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── lefts: (length: 2) - │ │ │ │ │ ├── @ RequiredParameterNode (location: (1,6)-(1,7)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ └── name: :a - │ │ │ │ │ └── @ RequiredParameterNode (location: (1,9)-(1,10)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── name: :b - │ │ │ │ ├── rest: ∅ - │ │ │ │ ├── rights: (length: 0) - │ │ │ │ ├── lparen_loc: (1,5)-(1,6) = "(" - │ │ │ │ └── rparen_loc: (1,10)-(1,11) = ")" - │ │ │ └── @ RequiredParameterNode (location: (1,13)-(1,14)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :c - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,4)-(1,5) = "|" - │ └── closing_loc: (1,14)-(1,15) = "|" - ├── body: ∅ - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,16)-(1,17) = "}" diff --git a/test/prism/snapshots/seattlerb/bug_args_masgn2.txt b/test/prism/snapshots/seattlerb/bug_args_masgn2.txt deleted file mode 100644 index bd9fc6116115d0..00000000000000 --- a/test/prism/snapshots/seattlerb/bug_args_masgn2.txt +++ /dev/null @@ -1,65 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,22)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,22)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,22)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :f - ├── message_loc: (1,0)-(1,1) = "f" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,22)) - ├── flags: ∅ - ├── locals: [:a, :b, :c, :d] - ├── parameters: - │ @ BlockParametersNode (location: (1,4)-(1,20)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,5)-(1,19)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 2) - │ │ │ ├── @ MultiTargetNode (location: (1,5)-(1,16)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── lefts: (length: 2) - │ │ │ │ │ ├── @ MultiTargetNode (location: (1,6)-(1,12)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ ├── lefts: (length: 2) - │ │ │ │ │ │ │ ├── @ RequiredParameterNode (location: (1,7)-(1,8)) - │ │ │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ │ │ └── name: :a - │ │ │ │ │ │ │ └── @ RequiredParameterNode (location: (1,10)-(1,11)) - │ │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ │ └── name: :b - │ │ │ │ │ │ ├── rest: ∅ - │ │ │ │ │ │ ├── rights: (length: 0) - │ │ │ │ │ │ ├── lparen_loc: (1,6)-(1,7) = "(" - │ │ │ │ │ │ └── rparen_loc: (1,11)-(1,12) = ")" - │ │ │ │ │ └── @ RequiredParameterNode (location: (1,14)-(1,15)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── name: :c - │ │ │ │ ├── rest: ∅ - │ │ │ │ ├── rights: (length: 0) - │ │ │ │ ├── lparen_loc: (1,5)-(1,6) = "(" - │ │ │ │ └── rparen_loc: (1,15)-(1,16) = ")" - │ │ │ └── @ RequiredParameterNode (location: (1,18)-(1,19)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :d - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,4)-(1,5) = "|" - │ └── closing_loc: (1,19)-(1,20) = "|" - ├── body: ∅ - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,21)-(1,22) = "}" diff --git a/test/prism/snapshots/seattlerb/bug_args_masgn_outer_parens__19.txt b/test/prism/snapshots/seattlerb/bug_args_masgn_outer_parens__19.txt deleted file mode 100644 index ad62bd4daa50db..00000000000000 --- a/test/prism/snapshots/seattlerb/bug_args_masgn_outer_parens__19.txt +++ /dev/null @@ -1,62 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,19)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,19)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,19)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :f - ├── message_loc: (1,0)-(1,1) = "f" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,19)) - ├── flags: ∅ - ├── locals: [:k, :v, :i] - ├── parameters: - │ @ BlockParametersNode (location: (1,4)-(1,17)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,5)-(1,16)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ MultiTargetNode (location: (1,5)-(1,16)) - │ │ │ ├── flags: ∅ - │ │ │ ├── lefts: (length: 2) - │ │ │ │ ├── @ MultiTargetNode (location: (1,6)-(1,12)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── lefts: (length: 2) - │ │ │ │ │ │ ├── @ RequiredParameterNode (location: (1,7)-(1,8)) - │ │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ │ └── name: :k - │ │ │ │ │ │ └── @ RequiredParameterNode (location: (1,10)-(1,11)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ └── name: :v - │ │ │ │ │ ├── rest: ∅ - │ │ │ │ │ ├── rights: (length: 0) - │ │ │ │ │ ├── lparen_loc: (1,6)-(1,7) = "(" - │ │ │ │ │ └── rparen_loc: (1,11)-(1,12) = ")" - │ │ │ │ └── @ RequiredParameterNode (location: (1,14)-(1,15)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :i - │ │ │ ├── rest: ∅ - │ │ │ ├── rights: (length: 0) - │ │ │ ├── lparen_loc: (1,5)-(1,6) = "(" - │ │ │ └── rparen_loc: (1,15)-(1,16) = ")" - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,4)-(1,5) = "|" - │ └── closing_loc: (1,16)-(1,17) = "|" - ├── body: ∅ - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,18)-(1,19) = "}" diff --git a/test/prism/snapshots/seattlerb/bug_call_arglist_parens.txt b/test/prism/snapshots/seattlerb/bug_call_arglist_parens.txt deleted file mode 100644 index 6954854baeba87..00000000000000 --- a/test/prism/snapshots/seattlerb/bug_call_arglist_parens.txt +++ /dev/null @@ -1,122 +0,0 @@ -@ ProgramNode (location: (1,6)-(11,9)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,6)-(11,9)) - ├── flags: ∅ - └── body: (length: 3) - ├── @ DefNode (location: (1,6)-(3,9)) - │ ├── flags: newline - │ ├── name: :f - │ ├── name_loc: (1,10)-(1,11) = "f" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (2,8)-(2,17)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (2,8)-(2,17)) - │ │ ├── flags: newline, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :g - │ │ ├── message_loc: (2,8)-(2,9) = "g" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (2,10)-(2,17)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 2) - │ │ │ ├── @ ParenthesesNode (location: (2,10)-(2,14)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── body: - │ │ │ │ │ @ StatementsNode (location: (2,12)-(2,13)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── body: (length: 1) - │ │ │ │ │ └── @ IntegerNode (location: (2,12)-(2,13)) - │ │ │ │ │ ├── flags: newline, static_literal, decimal - │ │ │ │ │ └── value: 1 - │ │ │ │ ├── opening_loc: (2,10)-(2,11) = "(" - │ │ │ │ └── closing_loc: (2,13)-(2,14) = ")" - │ │ │ └── @ IntegerNode (location: (2,16)-(2,17)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (1,6)-(1,9) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (3,6)-(3,9) = "end" - ├── @ DefNode (location: (6,6)-(8,9)) - │ ├── flags: newline - │ ├── name: :f - │ ├── name_loc: (6,10)-(6,11) = "f" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (7,8)-(7,16)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (7,8)-(7,16)) - │ │ ├── flags: newline, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :g - │ │ ├── message_loc: (7,8)-(7,9) = "g" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (7,10)-(7,16)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 2) - │ │ │ ├── @ ParenthesesNode (location: (7,10)-(7,13)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── body: - │ │ │ │ │ @ StatementsNode (location: (7,11)-(7,12)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── body: (length: 1) - │ │ │ │ │ └── @ IntegerNode (location: (7,11)-(7,12)) - │ │ │ │ │ ├── flags: newline, static_literal, decimal - │ │ │ │ │ └── value: 1 - │ │ │ │ ├── opening_loc: (7,10)-(7,11) = "(" - │ │ │ │ └── closing_loc: (7,12)-(7,13) = ")" - │ │ │ └── @ IntegerNode (location: (7,15)-(7,16)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (6,6)-(6,9) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (6,11)-(6,12) = "(" - │ ├── rparen_loc: (6,12)-(6,13) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (8,6)-(8,9) = "end" - └── @ CallNode (location: (11,0)-(11,9)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :g - ├── message_loc: (11,0)-(11,1) = "g" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (11,2)-(11,9)) - │ ├── flags: ∅ - │ └── arguments: (length: 2) - │ ├── @ ParenthesesNode (location: (11,2)-(11,6)) - │ │ ├── flags: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (11,4)-(11,5)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ IntegerNode (location: (11,4)-(11,5)) - │ │ │ ├── flags: newline, static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── opening_loc: (11,2)-(11,3) = "(" - │ │ └── closing_loc: (11,5)-(11,6) = ")" - │ └── @ IntegerNode (location: (11,8)-(11,9)) - │ ├── flags: static_literal, decimal - │ └── value: 2 - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/bug_case_when_regexp.txt b/test/prism/snapshots/seattlerb/bug_case_when_regexp.txt deleted file mode 100644 index e24a170ad4f80a..00000000000000 --- a/test/prism/snapshots/seattlerb/bug_case_when_regexp.txt +++ /dev/null @@ -1,32 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,26)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,26)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CaseNode (location: (1,0)-(1,26)) - ├── flags: newline - ├── predicate: - │ @ SymbolNode (location: (1,5)-(1,7)) - │ ├── flags: static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (1,5)-(1,6) = ":" - │ ├── value_loc: (1,6)-(1,7) = "x" - │ ├── closing_loc: ∅ - │ └── unescaped: "x" - ├── conditions: (length: 1) - │ └── @ WhenNode (location: (1,9)-(1,22)) - │ ├── flags: ∅ - │ ├── keyword_loc: (1,9)-(1,13) = "when" - │ ├── conditions: (length: 1) - │ │ └── @ RegularExpressionNode (location: (1,14)-(1,17)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (1,14)-(1,15) = "/" - │ │ ├── content_loc: (1,15)-(1,16) = "x" - │ │ ├── closing_loc: (1,16)-(1,17) = "/" - │ │ └── unescaped: "x" - │ ├── then_keyword_loc: (1,18)-(1,22) = "then" - │ └── statements: ∅ - ├── else_clause: ∅ - ├── case_keyword_loc: (1,0)-(1,4) = "case" - └── end_keyword_loc: (1,23)-(1,26) = "end" diff --git a/test/prism/snapshots/seattlerb/bug_comma.txt b/test/prism/snapshots/seattlerb/bug_comma.txt deleted file mode 100644 index d370ea0ac0ec4d..00000000000000 --- a/test/prism/snapshots/seattlerb/bug_comma.txt +++ /dev/null @@ -1,44 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,24)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,24)) - ├── flags: ∅ - └── body: (length: 1) - └── @ IfNode (location: (1,0)-(1,24)) - ├── flags: newline - ├── if_keyword_loc: (1,0)-(1,2) = "if" - ├── predicate: - │ @ CallNode (location: (1,3)-(1,15)) - │ ├── flags: ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :test - │ ├── message_loc: (1,3)-(1,7) = "test" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,8)-(1,15)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ StringNode (location: (1,8)-(1,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (1,8)-(1,9) = "?" - │ │ │ ├── content_loc: (1,9)-(1,10) = "d" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "d" - │ │ └── @ CallNode (location: (1,12)-(1,15)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :dir - │ │ ├── message_loc: (1,12)-(1,15) = "dir" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── then_keyword_loc: (1,16)-(1,20) = "then" - ├── statements: ∅ - ├── subsequent: ∅ - └── end_keyword_loc: (1,21)-(1,24) = "end" diff --git a/test/prism/snapshots/seattlerb/bug_cond_pct.txt b/test/prism/snapshots/seattlerb/bug_cond_pct.txt deleted file mode 100644 index 0b96c5c44e45c4..00000000000000 --- a/test/prism/snapshots/seattlerb/bug_cond_pct.txt +++ /dev/null @@ -1,26 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,28)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,28)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CaseNode (location: (1,0)-(1,28)) - ├── flags: newline - ├── predicate: ∅ - ├── conditions: (length: 1) - │ └── @ WhenNode (location: (1,6)-(1,23)) - │ ├── flags: ∅ - │ ├── keyword_loc: (1,6)-(1,10) = "when" - │ ├── conditions: (length: 1) - │ │ └── @ RegularExpressionNode (location: (1,11)-(1,23)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (1,11)-(1,14) = "%r%" - │ │ ├── content_loc: (1,14)-(1,22) = "blahblah" - │ │ ├── closing_loc: (1,22)-(1,23) = "%" - │ │ └── unescaped: "blahblah" - │ ├── then_keyword_loc: ∅ - │ └── statements: ∅ - ├── else_clause: ∅ - ├── case_keyword_loc: (1,0)-(1,4) = "case" - └── end_keyword_loc: (1,25)-(1,28) = "end" diff --git a/test/prism/snapshots/seattlerb/bug_hash_args.txt b/test/prism/snapshots/seattlerb/bug_hash_args.txt deleted file mode 100644 index cd90f0ebc60a0e..00000000000000 --- a/test/prism/snapshots/seattlerb/bug_hash_args.txt +++ /dev/null @@ -1,42 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,19)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,19)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,19)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :foo - ├── message_loc: (1,0)-(1,3) = "foo" - ├── opening_loc: (1,3)-(1,4) = "(" - ├── arguments: - │ @ ArgumentsNode (location: (1,4)-(1,18)) - │ ├── flags: contains_keywords - │ └── arguments: (length: 2) - │ ├── @ SymbolNode (location: (1,4)-(1,8)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (1,4)-(1,5) = ":" - │ │ ├── value_loc: (1,5)-(1,8) = "bar" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "bar" - │ └── @ KeywordHashNode (location: (1,10)-(1,18)) - │ ├── flags: symbol_keys - │ └── elements: (length: 1) - │ └── @ AssocNode (location: (1,10)-(1,18)) - │ ├── flags: static_literal - │ ├── key: - │ │ @ SymbolNode (location: (1,10)-(1,14)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: ∅ - │ │ ├── value_loc: (1,10)-(1,13) = "baz" - │ │ ├── closing_loc: (1,13)-(1,14) = ":" - │ │ └── unescaped: "baz" - │ ├── value: - │ │ @ NilNode (location: (1,15)-(1,18)) - │ │ └── flags: static_literal - │ └── operator_loc: ∅ - ├── closing_loc: (1,18)-(1,19) = ")" - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/bug_hash_args_trailing_comma.txt b/test/prism/snapshots/seattlerb/bug_hash_args_trailing_comma.txt deleted file mode 100644 index 8c06cabf1c245c..00000000000000 --- a/test/prism/snapshots/seattlerb/bug_hash_args_trailing_comma.txt +++ /dev/null @@ -1,42 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,20)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,20)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,20)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :foo - ├── message_loc: (1,0)-(1,3) = "foo" - ├── opening_loc: (1,3)-(1,4) = "(" - ├── arguments: - │ @ ArgumentsNode (location: (1,4)-(1,18)) - │ ├── flags: contains_keywords - │ └── arguments: (length: 2) - │ ├── @ SymbolNode (location: (1,4)-(1,8)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (1,4)-(1,5) = ":" - │ │ ├── value_loc: (1,5)-(1,8) = "bar" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "bar" - │ └── @ KeywordHashNode (location: (1,10)-(1,18)) - │ ├── flags: symbol_keys - │ └── elements: (length: 1) - │ └── @ AssocNode (location: (1,10)-(1,18)) - │ ├── flags: static_literal - │ ├── key: - │ │ @ SymbolNode (location: (1,10)-(1,14)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: ∅ - │ │ ├── value_loc: (1,10)-(1,13) = "baz" - │ │ ├── closing_loc: (1,13)-(1,14) = ":" - │ │ └── unescaped: "baz" - │ ├── value: - │ │ @ NilNode (location: (1,15)-(1,18)) - │ │ └── flags: static_literal - │ └── operator_loc: ∅ - ├── closing_loc: (1,19)-(1,20) = ")" - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/bug_hash_interp_array.txt b/test/prism/snapshots/seattlerb/bug_hash_interp_array.txt deleted file mode 100644 index 3d9fc56850b08e..00000000000000 --- a/test/prism/snapshots/seattlerb/bug_hash_interp_array.txt +++ /dev/null @@ -1,32 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,13)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,13)) - ├── flags: ∅ - └── body: (length: 1) - └── @ HashNode (location: (1,0)-(1,13)) - ├── flags: newline - ├── opening_loc: (1,0)-(1,1) = "{" - ├── elements: (length: 1) - │ └── @ AssocNode (location: (1,2)-(1,11)) - │ ├── flags: ∅ - │ ├── key: - │ │ @ InterpolatedSymbolNode (location: (1,2)-(1,8)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (1,2)-(1,3) = "\"" - │ │ ├── parts: (length: 1) - │ │ │ └── @ EmbeddedStatementsNode (location: (1,3)-(1,6)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (1,3)-(1,5) = "\#{" - │ │ │ ├── statements: ∅ - │ │ │ └── closing_loc: (1,5)-(1,6) = "}" - │ │ └── closing_loc: (1,6)-(1,8) = "\":" - │ ├── value: - │ │ @ ArrayNode (location: (1,9)-(1,11)) - │ │ ├── flags: static_literal - │ │ ├── elements: (length: 0) - │ │ ├── opening_loc: (1,9)-(1,10) = "[" - │ │ └── closing_loc: (1,10)-(1,11) = "]" - │ └── operator_loc: ∅ - └── closing_loc: (1,12)-(1,13) = "}" diff --git a/test/prism/snapshots/seattlerb/bug_masgn_right.txt b/test/prism/snapshots/seattlerb/bug_masgn_right.txt deleted file mode 100644 index e5b635d802d3c0..00000000000000 --- a/test/prism/snapshots/seattlerb/bug_masgn_right.txt +++ /dev/null @@ -1,55 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,17)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,17)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,17)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :f - ├── message_loc: (1,0)-(1,1) = "f" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,17)) - ├── flags: ∅ - ├── locals: [:a, :b, :c] - ├── parameters: - │ @ BlockParametersNode (location: (1,4)-(1,15)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,5)-(1,14)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 2) - │ │ │ ├── @ RequiredParameterNode (location: (1,5)-(1,6)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :a - │ │ │ └── @ MultiTargetNode (location: (1,8)-(1,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── lefts: (length: 2) - │ │ │ │ ├── @ RequiredParameterNode (location: (1,9)-(1,10)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── name: :b - │ │ │ │ └── @ RequiredParameterNode (location: (1,12)-(1,13)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :c - │ │ │ ├── rest: ∅ - │ │ │ ├── rights: (length: 0) - │ │ │ ├── lparen_loc: (1,8)-(1,9) = "(" - │ │ │ └── rparen_loc: (1,13)-(1,14) = ")" - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,4)-(1,5) = "|" - │ └── closing_loc: (1,14)-(1,15) = "|" - ├── body: ∅ - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,16)-(1,17) = "}" diff --git a/test/prism/snapshots/seattlerb/bug_not_parens.txt b/test/prism/snapshots/seattlerb/bug_not_parens.txt deleted file mode 100644 index 163fb79564f8c3..00000000000000 --- a/test/prism/snapshots/seattlerb/bug_not_parens.txt +++ /dev/null @@ -1,27 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,6)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,6)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,6)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (1,4)-(1,5)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (1,4)-(1,5) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: ∅ - ├── name: :! - ├── message_loc: (1,0)-(1,3) = "not" - ├── opening_loc: (1,3)-(1,4) = "(" - ├── arguments: ∅ - ├── closing_loc: (1,5)-(1,6) = ")" - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/bug_op_asgn_rescue.txt b/test/prism/snapshots/seattlerb/bug_op_asgn_rescue.txt deleted file mode 100644 index 9da753aece04eb..00000000000000 --- a/test/prism/snapshots/seattlerb/bug_op_asgn_rescue.txt +++ /dev/null @@ -1,31 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,18)) -├── flags: ∅ -├── locals: [:a] -└── statements: - @ StatementsNode (location: (1,0)-(1,18)) - ├── flags: ∅ - └── body: (length: 1) - └── @ LocalVariableOrWriteNode (location: (1,0)-(1,18)) - ├── flags: newline - ├── name_loc: (1,0)-(1,1) = "a" - ├── operator_loc: (1,2)-(1,5) = "||=" - ├── value: - │ @ RescueModifierNode (location: (1,6)-(1,18)) - │ ├── flags: ∅ - │ ├── expression: - │ │ @ CallNode (location: (1,6)-(1,7)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :b - │ │ ├── message_loc: (1,6)-(1,7) = "b" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── keyword_loc: (1,8)-(1,14) = "rescue" - │ └── rescue_expression: - │ @ NilNode (location: (1,15)-(1,18)) - │ └── flags: static_literal - ├── name: :a - └── depth: 0 diff --git a/test/prism/snapshots/seattlerb/call_and.txt b/test/prism/snapshots/seattlerb/call_and.txt deleted file mode 100644 index 640f355c4a1fb8..00000000000000 --- a/test/prism/snapshots/seattlerb/call_and.txt +++ /dev/null @@ -1,26 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,5)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,5)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,5)) - ├── flags: newline - ├── receiver: - │ @ IntegerNode (location: (1,0)-(1,1)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── call_operator_loc: ∅ - ├── name: :& - ├── message_loc: (1,2)-(1,3) = "&" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,4)-(1,5)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ IntegerNode (location: (1,4)-(1,5)) - │ ├── flags: static_literal, decimal - │ └── value: 2 - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/call_arg_assoc.txt b/test/prism/snapshots/seattlerb/call_arg_assoc.txt deleted file mode 100644 index b8ec9070317132..00000000000000 --- a/test/prism/snapshots/seattlerb/call_arg_assoc.txt +++ /dev/null @@ -1,37 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,10)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,10)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,10)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :f - ├── message_loc: (1,0)-(1,1) = "f" - ├── opening_loc: (1,1)-(1,2) = "(" - ├── arguments: - │ @ ArgumentsNode (location: (1,2)-(1,9)) - │ ├── flags: contains_keywords - │ └── arguments: (length: 2) - │ ├── @ IntegerNode (location: (1,2)-(1,3)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ └── @ KeywordHashNode (location: (1,5)-(1,9)) - │ ├── flags: ∅ - │ └── elements: (length: 1) - │ └── @ AssocNode (location: (1,5)-(1,9)) - │ ├── flags: static_literal - │ ├── key: - │ │ @ IntegerNode (location: (1,5)-(1,6)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── value: - │ │ @ IntegerNode (location: (1,8)-(1,9)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 3 - │ └── operator_loc: (1,6)-(1,8) = "=>" - ├── closing_loc: (1,9)-(1,10) = ")" - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/call_arg_assoc_kwsplat.txt b/test/prism/snapshots/seattlerb/call_arg_assoc_kwsplat.txt deleted file mode 100644 index 11142b272191e5..00000000000000 --- a/test/prism/snapshots/seattlerb/call_arg_assoc_kwsplat.txt +++ /dev/null @@ -1,47 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,16)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,16)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,16)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :f - ├── message_loc: (1,0)-(1,1) = "f" - ├── opening_loc: (1,1)-(1,2) = "(" - ├── arguments: - │ @ ArgumentsNode (location: (1,2)-(1,15)) - │ ├── flags: contains_keywords, contains_keyword_splat - │ └── arguments: (length: 2) - │ ├── @ IntegerNode (location: (1,2)-(1,3)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ └── @ KeywordHashNode (location: (1,5)-(1,15)) - │ ├── flags: ∅ - │ └── elements: (length: 2) - │ ├── @ AssocNode (location: (1,5)-(1,10)) - │ │ ├── flags: static_literal - │ │ ├── key: - │ │ │ @ SymbolNode (location: (1,5)-(1,8)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (1,5)-(1,7) = "kw" - │ │ │ ├── closing_loc: (1,7)-(1,8) = ":" - │ │ │ └── unescaped: "kw" - │ │ ├── value: - │ │ │ @ IntegerNode (location: (1,9)-(1,10)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ └── operator_loc: ∅ - │ └── @ AssocSplatNode (location: (1,12)-(1,15)) - │ ├── flags: ∅ - │ ├── value: - │ │ @ IntegerNode (location: (1,14)-(1,15)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 3 - │ └── operator_loc: (1,12)-(1,14) = "**" - ├── closing_loc: (1,15)-(1,16) = ")" - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/call_arg_kwsplat.txt b/test/prism/snapshots/seattlerb/call_arg_kwsplat.txt deleted file mode 100644 index 853f7103e3e673..00000000000000 --- a/test/prism/snapshots/seattlerb/call_arg_kwsplat.txt +++ /dev/null @@ -1,40 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,9)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,9)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,9)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :a - ├── message_loc: (1,0)-(1,1) = "a" - ├── opening_loc: (1,1)-(1,2) = "(" - ├── arguments: - │ @ ArgumentsNode (location: (1,2)-(1,8)) - │ ├── flags: contains_keywords, contains_keyword_splat - │ └── arguments: (length: 2) - │ ├── @ CallNode (location: (1,2)-(1,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :b - │ │ ├── message_loc: (1,2)-(1,3) = "b" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── @ KeywordHashNode (location: (1,5)-(1,8)) - │ ├── flags: ∅ - │ └── elements: (length: 1) - │ └── @ AssocSplatNode (location: (1,5)-(1,8)) - │ ├── flags: ∅ - │ ├── value: - │ │ @ IntegerNode (location: (1,7)-(1,8)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ └── operator_loc: (1,5)-(1,7) = "**" - ├── closing_loc: (1,8)-(1,9) = ")" - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/call_args_assoc_quoted.txt b/test/prism/snapshots/seattlerb/call_args_assoc_quoted.txt deleted file mode 100644 index 615bee5b4a9681..00000000000000 --- a/test/prism/snapshots/seattlerb/call_args_assoc_quoted.txt +++ /dev/null @@ -1,114 +0,0 @@ -@ ProgramNode (location: (1,0)-(5,8)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(5,8)) - ├── flags: ∅ - └── body: (length: 3) - ├── @ CallNode (location: (1,0)-(1,11)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :x - │ ├── message_loc: (1,0)-(1,1) = "x" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,2)-(1,11)) - │ │ ├── flags: contains_keywords - │ │ └── arguments: (length: 1) - │ │ └── @ KeywordHashNode (location: (1,2)-(1,11)) - │ │ ├── flags: ∅ - │ │ └── elements: (length: 1) - │ │ └── @ AssocNode (location: (1,2)-(1,11)) - │ │ ├── flags: ∅ - │ │ ├── key: - │ │ │ @ InterpolatedSymbolNode (location: (1,2)-(1,9)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (1,2)-(1,3) = "\"" - │ │ │ ├── parts: (length: 1) - │ │ │ │ └── @ EmbeddedStatementsNode (location: (1,3)-(1,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── opening_loc: (1,3)-(1,5) = "\#{" - │ │ │ │ ├── statements: - │ │ │ │ │ @ StatementsNode (location: (1,5)-(1,6)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── body: (length: 1) - │ │ │ │ │ └── @ CallNode (location: (1,5)-(1,6)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :k - │ │ │ │ │ ├── message_loc: (1,5)-(1,6) = "k" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ └── closing_loc: (1,6)-(1,7) = "}" - │ │ │ └── closing_loc: (1,7)-(1,9) = "\":" - │ │ ├── value: - │ │ │ @ IntegerNode (location: (1,9)-(1,11)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 42 - │ │ └── operator_loc: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (3,0)-(3,8)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :x - │ ├── message_loc: (3,0)-(3,1) = "x" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (3,2)-(3,8)) - │ │ ├── flags: contains_keywords - │ │ └── arguments: (length: 1) - │ │ └── @ KeywordHashNode (location: (3,2)-(3,8)) - │ │ ├── flags: symbol_keys - │ │ └── elements: (length: 1) - │ │ └── @ AssocNode (location: (3,2)-(3,8)) - │ │ ├── flags: static_literal - │ │ ├── key: - │ │ │ @ SymbolNode (location: (3,2)-(3,6)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (3,2)-(3,3) = "\"" - │ │ │ ├── value_loc: (3,3)-(3,4) = "k" - │ │ │ ├── closing_loc: (3,4)-(3,6) = "\":" - │ │ │ └── unescaped: "k" - │ │ ├── value: - │ │ │ @ IntegerNode (location: (3,6)-(3,8)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 42 - │ │ └── operator_loc: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── @ CallNode (location: (5,0)-(5,8)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :x - ├── message_loc: (5,0)-(5,1) = "x" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (5,2)-(5,8)) - │ ├── flags: contains_keywords - │ └── arguments: (length: 1) - │ └── @ KeywordHashNode (location: (5,2)-(5,8)) - │ ├── flags: symbol_keys - │ └── elements: (length: 1) - │ └── @ AssocNode (location: (5,2)-(5,8)) - │ ├── flags: static_literal - │ ├── key: - │ │ @ SymbolNode (location: (5,2)-(5,6)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (5,2)-(5,3) = "'" - │ │ ├── value_loc: (5,3)-(5,4) = "k" - │ │ ├── closing_loc: (5,4)-(5,6) = "':" - │ │ └── unescaped: "k" - │ ├── value: - │ │ @ IntegerNode (location: (5,6)-(5,8)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 42 - │ └── operator_loc: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/call_args_assoc_trailing_comma.txt b/test/prism/snapshots/seattlerb/call_args_assoc_trailing_comma.txt deleted file mode 100644 index 00bc620f544829..00000000000000 --- a/test/prism/snapshots/seattlerb/call_args_assoc_trailing_comma.txt +++ /dev/null @@ -1,37 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,11)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,11)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,11)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :f - ├── message_loc: (1,0)-(1,1) = "f" - ├── opening_loc: (1,1)-(1,2) = "(" - ├── arguments: - │ @ ArgumentsNode (location: (1,2)-(1,9)) - │ ├── flags: contains_keywords - │ └── arguments: (length: 2) - │ ├── @ IntegerNode (location: (1,2)-(1,3)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ └── @ KeywordHashNode (location: (1,5)-(1,9)) - │ ├── flags: ∅ - │ └── elements: (length: 1) - │ └── @ AssocNode (location: (1,5)-(1,9)) - │ ├── flags: static_literal - │ ├── key: - │ │ @ IntegerNode (location: (1,5)-(1,6)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── value: - │ │ @ IntegerNode (location: (1,8)-(1,9)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 3 - │ └── operator_loc: (1,6)-(1,8) = "=>" - ├── closing_loc: (1,10)-(1,11) = ")" - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/call_args_command.txt b/test/prism/snapshots/seattlerb/call_args_command.txt deleted file mode 100644 index 6fe112f224aa59..00000000000000 --- a/test/prism/snapshots/seattlerb/call_args_command.txt +++ /dev/null @@ -1,56 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,9)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,9)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,9)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (1,0)-(1,1)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (1,0)-(1,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: (1,1)-(1,2) = "." - ├── name: :b - ├── message_loc: (1,2)-(1,3) = "b" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,4)-(1,9)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ CallNode (location: (1,4)-(1,9)) - │ ├── flags: ∅ - │ ├── receiver: - │ │ @ CallNode (location: (1,4)-(1,5)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :c - │ │ ├── message_loc: (1,4)-(1,5) = "c" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (1,5)-(1,6) = "." - │ ├── name: :d - │ ├── message_loc: (1,6)-(1,7) = "d" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,8)-(1,9)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (1,8)-(1,9)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/call_array_arg.txt b/test/prism/snapshots/seattlerb/call_array_arg.txt deleted file mode 100644 index cec613bc582e44..00000000000000 --- a/test/prism/snapshots/seattlerb/call_array_arg.txt +++ /dev/null @@ -1,40 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,13)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,13)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,13)) - ├── flags: newline - ├── receiver: - │ @ IntegerNode (location: (1,0)-(1,1)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── call_operator_loc: ∅ - ├── name: :== - ├── message_loc: (1,2)-(1,4) = "==" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,5)-(1,13)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ ArrayNode (location: (1,5)-(1,13)) - │ ├── flags: static_literal - │ ├── elements: (length: 2) - │ │ ├── @ SymbolNode (location: (1,6)-(1,8)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (1,6)-(1,7) = ":" - │ │ │ ├── value_loc: (1,7)-(1,8) = "b" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "b" - │ │ └── @ SymbolNode (location: (1,10)-(1,12)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (1,10)-(1,11) = ":" - │ │ ├── value_loc: (1,11)-(1,12) = "c" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "c" - │ ├── opening_loc: (1,5)-(1,6) = "[" - │ └── closing_loc: (1,12)-(1,13) = "]" - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/call_array_block_call.txt b/test/prism/snapshots/seattlerb/call_array_block_call.txt deleted file mode 100644 index 4a044924e9f31e..00000000000000 --- a/test/prism/snapshots/seattlerb/call_array_block_call.txt +++ /dev/null @@ -1,44 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,19)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,19)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,19)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :a - ├── message_loc: (1,0)-(1,1) = "a" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,2)-(1,19)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ ArrayNode (location: (1,2)-(1,19)) - │ ├── flags: ∅ - │ ├── elements: (length: 2) - │ │ ├── @ NilNode (location: (1,4)-(1,7)) - │ │ │ └── flags: static_literal - │ │ └── @ CallNode (location: (1,9)-(1,17)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :b - │ │ ├── message_loc: (1,9)-(1,10) = "b" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: - │ │ @ BlockNode (location: (1,11)-(1,17)) - │ │ ├── flags: ∅ - │ │ ├── locals: [] - │ │ ├── parameters: ∅ - │ │ ├── body: ∅ - │ │ ├── opening_loc: (1,11)-(1,13) = "do" - │ │ └── closing_loc: (1,14)-(1,17) = "end" - │ ├── opening_loc: (1,2)-(1,3) = "[" - │ └── closing_loc: (1,18)-(1,19) = "]" - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/call_array_lambda_block_call.txt b/test/prism/snapshots/seattlerb/call_array_lambda_block_call.txt deleted file mode 100644 index dca64e5f7b25ae..00000000000000 --- a/test/prism/snapshots/seattlerb/call_array_lambda_block_call.txt +++ /dev/null @@ -1,46 +0,0 @@ -@ ProgramNode (location: (1,0)-(2,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(2,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(2,3)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :a - ├── message_loc: (1,0)-(1,1) = "a" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,2)-(1,11)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ ArrayNode (location: (1,2)-(1,11)) - │ ├── flags: ∅ - │ ├── elements: (length: 1) - │ │ └── @ LambdaNode (location: (1,3)-(1,10)) - │ │ ├── flags: ∅ - │ │ ├── locals: [] - │ │ ├── operator_loc: (1,3)-(1,5) = "->" - │ │ ├── opening_loc: (1,8)-(1,9) = "{" - │ │ ├── closing_loc: (1,9)-(1,10) = "}" - │ │ ├── parameters: - │ │ │ @ BlockParametersNode (location: (1,5)-(1,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── parameters: ∅ - │ │ │ ├── locals: (length: 0) - │ │ │ ├── opening_loc: (1,5)-(1,6) = "(" - │ │ │ └── closing_loc: (1,6)-(1,7) = ")" - │ │ └── body: ∅ - │ ├── opening_loc: (1,2)-(1,3) = "[" - │ └── closing_loc: (1,10)-(1,11) = "]" - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,12)-(2,3)) - ├── flags: ∅ - ├── locals: [] - ├── parameters: ∅ - ├── body: ∅ - ├── opening_loc: (1,12)-(1,14) = "do" - └── closing_loc: (2,0)-(2,3) = "end" diff --git a/test/prism/snapshots/seattlerb/call_array_lit_inline_hash.txt b/test/prism/snapshots/seattlerb/call_array_lit_inline_hash.txt deleted file mode 100644 index f83c7a55e5b592..00000000000000 --- a/test/prism/snapshots/seattlerb/call_array_lit_inline_hash.txt +++ /dev/null @@ -1,48 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,16)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,16)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,16)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :a - ├── message_loc: (1,0)-(1,1) = "a" - ├── opening_loc: (1,1)-(1,2) = "(" - ├── arguments: - │ @ ArgumentsNode (location: (1,2)-(1,15)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ ArrayNode (location: (1,2)-(1,15)) - │ ├── flags: ∅ - │ ├── elements: (length: 2) - │ │ ├── @ SymbolNode (location: (1,3)-(1,5)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (1,3)-(1,4) = ":" - │ │ │ ├── value_loc: (1,4)-(1,5) = "b" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "b" - │ │ └── @ KeywordHashNode (location: (1,7)-(1,14)) - │ │ ├── flags: symbol_keys - │ │ └── elements: (length: 1) - │ │ └── @ AssocNode (location: (1,7)-(1,14)) - │ │ ├── flags: static_literal - │ │ ├── key: - │ │ │ @ SymbolNode (location: (1,7)-(1,9)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (1,7)-(1,8) = ":" - │ │ │ ├── value_loc: (1,8)-(1,9) = "c" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "c" - │ │ ├── value: - │ │ │ @ IntegerNode (location: (1,13)-(1,14)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── operator_loc: (1,10)-(1,12) = "=>" - │ ├── opening_loc: (1,2)-(1,3) = "[" - │ └── closing_loc: (1,14)-(1,15) = "]" - ├── closing_loc: (1,15)-(1,16) = ")" - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/call_assoc.txt b/test/prism/snapshots/seattlerb/call_assoc.txt deleted file mode 100644 index a4e4512a0821cd..00000000000000 --- a/test/prism/snapshots/seattlerb/call_assoc.txt +++ /dev/null @@ -1,34 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,7)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,7)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,7)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :f - ├── message_loc: (1,0)-(1,1) = "f" - ├── opening_loc: (1,1)-(1,2) = "(" - ├── arguments: - │ @ ArgumentsNode (location: (1,2)-(1,6)) - │ ├── flags: contains_keywords - │ └── arguments: (length: 1) - │ └── @ KeywordHashNode (location: (1,2)-(1,6)) - │ ├── flags: ∅ - │ └── elements: (length: 1) - │ └── @ AssocNode (location: (1,2)-(1,6)) - │ ├── flags: static_literal - │ ├── key: - │ │ @ IntegerNode (location: (1,2)-(1,3)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── value: - │ │ @ IntegerNode (location: (1,5)-(1,6)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 3 - │ └── operator_loc: (1,3)-(1,5) = "=>" - ├── closing_loc: (1,6)-(1,7) = ")" - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/call_assoc_new.txt b/test/prism/snapshots/seattlerb/call_assoc_new.txt deleted file mode 100644 index 6cbc942a6ba486..00000000000000 --- a/test/prism/snapshots/seattlerb/call_assoc_new.txt +++ /dev/null @@ -1,37 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,6)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,6)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,6)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :f - ├── message_loc: (1,0)-(1,1) = "f" - ├── opening_loc: (1,1)-(1,2) = "(" - ├── arguments: - │ @ ArgumentsNode (location: (1,2)-(1,5)) - │ ├── flags: contains_keywords - │ └── arguments: (length: 1) - │ └── @ KeywordHashNode (location: (1,2)-(1,5)) - │ ├── flags: symbol_keys - │ └── elements: (length: 1) - │ └── @ AssocNode (location: (1,2)-(1,5)) - │ ├── flags: static_literal - │ ├── key: - │ │ @ SymbolNode (location: (1,2)-(1,4)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: ∅ - │ │ ├── value_loc: (1,2)-(1,3) = "a" - │ │ ├── closing_loc: (1,3)-(1,4) = ":" - │ │ └── unescaped: "a" - │ ├── value: - │ │ @ IntegerNode (location: (1,4)-(1,5)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 3 - │ └── operator_loc: ∅ - ├── closing_loc: (1,5)-(1,6) = ")" - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/call_assoc_new_if_multiline.txt b/test/prism/snapshots/seattlerb/call_assoc_new_if_multiline.txt deleted file mode 100644 index a258b734a30c17..00000000000000 --- a/test/prism/snapshots/seattlerb/call_assoc_new_if_multiline.txt +++ /dev/null @@ -1,65 +0,0 @@ -@ ProgramNode (location: (1,0)-(5,4)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(5,4)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(5,4)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :a - ├── message_loc: (1,0)-(1,1) = "a" - ├── opening_loc: (1,1)-(1,2) = "(" - ├── arguments: - │ @ ArgumentsNode (location: (1,2)-(5,3)) - │ ├── flags: contains_keywords - │ └── arguments: (length: 1) - │ └── @ KeywordHashNode (location: (1,2)-(5,3)) - │ ├── flags: symbol_keys - │ └── elements: (length: 1) - │ └── @ AssocNode (location: (1,2)-(5,3)) - │ ├── flags: ∅ - │ ├── key: - │ │ @ SymbolNode (location: (1,2)-(1,4)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: ∅ - │ │ ├── value_loc: (1,2)-(1,3) = "b" - │ │ ├── closing_loc: (1,3)-(1,4) = ":" - │ │ └── unescaped: "b" - │ ├── value: - │ │ @ IfNode (location: (1,5)-(5,3)) - │ │ ├── flags: newline - │ │ ├── if_keyword_loc: (1,5)-(1,7) = "if" - │ │ ├── predicate: - │ │ │ @ SymbolNode (location: (1,8)-(1,10)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (1,8)-(1,9) = ":" - │ │ │ ├── value_loc: (1,9)-(1,10) = "c" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "c" - │ │ ├── then_keyword_loc: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (2,0)-(2,1)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ IntegerNode (location: (2,0)-(2,1)) - │ │ │ ├── flags: newline, static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── subsequent: - │ │ │ @ ElseNode (location: (3,0)-(5,3)) - │ │ │ ├── flags: ∅ - │ │ │ ├── else_keyword_loc: (3,0)-(3,4) = "else" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (4,0)-(4,1)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ IntegerNode (location: (4,0)-(4,1)) - │ │ │ │ ├── flags: newline, static_literal, decimal - │ │ │ │ └── value: 2 - │ │ │ └── end_keyword_loc: (5,0)-(5,3) = "end" - │ │ └── end_keyword_loc: (5,0)-(5,3) = "end" - │ └── operator_loc: ∅ - ├── closing_loc: (5,3)-(5,4) = ")" - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/call_assoc_trailing_comma.txt b/test/prism/snapshots/seattlerb/call_assoc_trailing_comma.txt deleted file mode 100644 index a240775d69b8af..00000000000000 --- a/test/prism/snapshots/seattlerb/call_assoc_trailing_comma.txt +++ /dev/null @@ -1,34 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,8)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,8)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,8)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :f - ├── message_loc: (1,0)-(1,1) = "f" - ├── opening_loc: (1,1)-(1,2) = "(" - ├── arguments: - │ @ ArgumentsNode (location: (1,2)-(1,6)) - │ ├── flags: contains_keywords - │ └── arguments: (length: 1) - │ └── @ KeywordHashNode (location: (1,2)-(1,6)) - │ ├── flags: ∅ - │ └── elements: (length: 1) - │ └── @ AssocNode (location: (1,2)-(1,6)) - │ ├── flags: static_literal - │ ├── key: - │ │ @ IntegerNode (location: (1,2)-(1,3)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── value: - │ │ @ IntegerNode (location: (1,5)-(1,6)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ └── operator_loc: (1,3)-(1,5) = "=>" - ├── closing_loc: (1,7)-(1,8) = ")" - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/call_bang_command_call.txt b/test/prism/snapshots/seattlerb/call_bang_command_call.txt deleted file mode 100644 index e226d652785347..00000000000000 --- a/test/prism/snapshots/seattlerb/call_bang_command_call.txt +++ /dev/null @@ -1,43 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,7)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,7)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,7)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (1,2)-(1,7)) - │ ├── flags: ∅ - │ ├── receiver: - │ │ @ CallNode (location: (1,2)-(1,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (1,2)-(1,3) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (1,3)-(1,4) = "." - │ ├── name: :b - │ ├── message_loc: (1,4)-(1,5) = "b" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,6)-(1,7)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (1,6)-(1,7)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: ∅ - ├── name: :! - ├── message_loc: (1,0)-(1,1) = "!" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/call_bang_squiggle.txt b/test/prism/snapshots/seattlerb/call_bang_squiggle.txt deleted file mode 100644 index 5c10841f73936e..00000000000000 --- a/test/prism/snapshots/seattlerb/call_bang_squiggle.txt +++ /dev/null @@ -1,26 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,6)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,6)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,6)) - ├── flags: newline - ├── receiver: - │ @ IntegerNode (location: (1,0)-(1,1)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── call_operator_loc: ∅ - ├── name: :!~ - ├── message_loc: (1,2)-(1,4) = "!~" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,5)-(1,6)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ IntegerNode (location: (1,5)-(1,6)) - │ ├── flags: static_literal, decimal - │ └── value: 2 - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/call_begin_call_block_call.txt b/test/prism/snapshots/seattlerb/call_begin_call_block_call.txt deleted file mode 100644 index 240a3aaa76b5c6..00000000000000 --- a/test/prism/snapshots/seattlerb/call_begin_call_block_call.txt +++ /dev/null @@ -1,58 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(3,3)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :a - ├── message_loc: (1,0)-(1,1) = "a" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,2)-(3,3)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ BeginNode (location: (1,2)-(3,3)) - │ ├── flags: ∅ - │ ├── begin_keyword_loc: (1,2)-(1,7) = "begin" - │ ├── statements: - │ │ @ StatementsNode (location: (2,0)-(2,10)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (2,0)-(2,10)) - │ │ ├── flags: newline - │ │ ├── receiver: - │ │ │ @ CallNode (location: (2,0)-(2,1)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (2,0)-(2,1) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: (2,1)-(2,2) = "." - │ │ ├── name: :c - │ │ ├── message_loc: (2,2)-(2,3) = "c" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: - │ │ @ BlockNode (location: (2,4)-(2,10)) - │ │ ├── flags: ∅ - │ │ ├── locals: [] - │ │ ├── parameters: ∅ - │ │ ├── body: ∅ - │ │ ├── opening_loc: (2,4)-(2,6) = "do" - │ │ └── closing_loc: (2,7)-(2,10) = "end" - │ ├── rescue_clause: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: ∅ - │ └── end_keyword_loc: (3,0)-(3,3) = "end" - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/call_block_arg_named.txt b/test/prism/snapshots/seattlerb/call_block_arg_named.txt deleted file mode 100644 index db6fc7a059a0f0..00000000000000 --- a/test/prism/snapshots/seattlerb/call_block_arg_named.txt +++ /dev/null @@ -1,31 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,6)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,6)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,6)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :x - ├── message_loc: (1,0)-(1,1) = "x" - ├── opening_loc: (1,1)-(1,2) = "(" - ├── arguments: ∅ - ├── closing_loc: (1,6)-(1,7) = ")" - └── block: - @ BlockArgumentNode (location: (1,2)-(1,6)) - ├── flags: ∅ - ├── expression: - │ @ CallNode (location: (1,3)-(1,6)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :blk - │ ├── message_loc: (1,3)-(1,6) = "blk" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── operator_loc: (1,2)-(1,3) = "&" diff --git a/test/prism/snapshots/seattlerb/call_carat.txt b/test/prism/snapshots/seattlerb/call_carat.txt deleted file mode 100644 index 88ed832aca93de..00000000000000 --- a/test/prism/snapshots/seattlerb/call_carat.txt +++ /dev/null @@ -1,26 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,5)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,5)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,5)) - ├── flags: newline - ├── receiver: - │ @ IntegerNode (location: (1,0)-(1,1)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── call_operator_loc: ∅ - ├── name: :^ - ├── message_loc: (1,2)-(1,3) = "^" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,4)-(1,5)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ IntegerNode (location: (1,4)-(1,5)) - │ ├── flags: static_literal, decimal - │ └── value: 2 - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/call_colon2.txt b/test/prism/snapshots/seattlerb/call_colon2.txt deleted file mode 100644 index 85e39cd3636104..00000000000000 --- a/test/prism/snapshots/seattlerb/call_colon2.txt +++ /dev/null @@ -1,20 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,4)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,4)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,4)) - ├── flags: newline - ├── receiver: - │ @ ConstantReadNode (location: (1,0)-(1,1)) - │ ├── flags: ∅ - │ └── name: :A - ├── call_operator_loc: (1,1)-(1,3) = "::" - ├── name: :b - ├── message_loc: (1,3)-(1,4) = "b" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/call_colon_parens.txt b/test/prism/snapshots/seattlerb/call_colon_parens.txt deleted file mode 100644 index 19141c34133911..00000000000000 --- a/test/prism/snapshots/seattlerb/call_colon_parens.txt +++ /dev/null @@ -1,20 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,5)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,5)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,5)) - ├── flags: newline - ├── receiver: - │ @ IntegerNode (location: (1,0)-(1,1)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── call_operator_loc: (1,1)-(1,3) = "::" - ├── name: :call - ├── message_loc: ∅ - ├── opening_loc: (1,3)-(1,4) = "(" - ├── arguments: ∅ - ├── closing_loc: (1,4)-(1,5) = ")" - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/call_div.txt b/test/prism/snapshots/seattlerb/call_div.txt deleted file mode 100644 index 55a410977c3baa..00000000000000 --- a/test/prism/snapshots/seattlerb/call_div.txt +++ /dev/null @@ -1,26 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,5)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,5)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,5)) - ├── flags: newline - ├── receiver: - │ @ IntegerNode (location: (1,0)-(1,1)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── call_operator_loc: ∅ - ├── name: :/ - ├── message_loc: (1,2)-(1,3) = "/" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,4)-(1,5)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ IntegerNode (location: (1,4)-(1,5)) - │ ├── flags: static_literal, decimal - │ └── value: 2 - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/call_dot_parens.txt b/test/prism/snapshots/seattlerb/call_dot_parens.txt deleted file mode 100644 index 29b592a960dc18..00000000000000 --- a/test/prism/snapshots/seattlerb/call_dot_parens.txt +++ /dev/null @@ -1,20 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,4)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,4)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,4)) - ├── flags: newline - ├── receiver: - │ @ IntegerNode (location: (1,0)-(1,1)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── call_operator_loc: (1,1)-(1,2) = "." - ├── name: :call - ├── message_loc: ∅ - ├── opening_loc: (1,2)-(1,3) = "(" - ├── arguments: ∅ - ├── closing_loc: (1,3)-(1,4) = ")" - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/call_env.txt b/test/prism/snapshots/seattlerb/call_env.txt deleted file mode 100644 index 933621594f850c..00000000000000 --- a/test/prism/snapshots/seattlerb/call_env.txt +++ /dev/null @@ -1,27 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,7)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,7)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,7)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (1,0)-(1,1)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (1,0)-(1,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: (1,1)-(1,2) = "." - ├── name: :happy - ├── message_loc: (1,2)-(1,7) = "happy" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/call_eq3.txt b/test/prism/snapshots/seattlerb/call_eq3.txt deleted file mode 100644 index 52e4b00c5ce7b7..00000000000000 --- a/test/prism/snapshots/seattlerb/call_eq3.txt +++ /dev/null @@ -1,26 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,7)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,7)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,7)) - ├── flags: newline - ├── receiver: - │ @ IntegerNode (location: (1,0)-(1,1)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── call_operator_loc: ∅ - ├── name: :=== - ├── message_loc: (1,2)-(1,5) = "===" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,6)-(1,7)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ IntegerNode (location: (1,6)-(1,7)) - │ ├── flags: static_literal, decimal - │ └── value: 2 - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/call_gt.txt b/test/prism/snapshots/seattlerb/call_gt.txt deleted file mode 100644 index 22371dd8ca0e47..00000000000000 --- a/test/prism/snapshots/seattlerb/call_gt.txt +++ /dev/null @@ -1,26 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,5)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,5)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,5)) - ├── flags: newline - ├── receiver: - │ @ IntegerNode (location: (1,0)-(1,1)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── call_operator_loc: ∅ - ├── name: :> - ├── message_loc: (1,2)-(1,3) = ">" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,4)-(1,5)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ IntegerNode (location: (1,4)-(1,5)) - │ ├── flags: static_literal, decimal - │ └── value: 2 - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/call_kwsplat.txt b/test/prism/snapshots/seattlerb/call_kwsplat.txt deleted file mode 100644 index 17773e769335a6..00000000000000 --- a/test/prism/snapshots/seattlerb/call_kwsplat.txt +++ /dev/null @@ -1,30 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,6)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,6)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,6)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :a - ├── message_loc: (1,0)-(1,1) = "a" - ├── opening_loc: (1,1)-(1,2) = "(" - ├── arguments: - │ @ ArgumentsNode (location: (1,2)-(1,5)) - │ ├── flags: contains_keywords, contains_keyword_splat - │ └── arguments: (length: 1) - │ └── @ KeywordHashNode (location: (1,2)-(1,5)) - │ ├── flags: ∅ - │ └── elements: (length: 1) - │ └── @ AssocSplatNode (location: (1,2)-(1,5)) - │ ├── flags: ∅ - │ ├── value: - │ │ @ IntegerNode (location: (1,4)-(1,5)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ └── operator_loc: (1,2)-(1,4) = "**" - ├── closing_loc: (1,5)-(1,6) = ")" - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/call_leading_dots.txt b/test/prism/snapshots/seattlerb/call_leading_dots.txt deleted file mode 100644 index 5562afcd7020f5..00000000000000 --- a/test/prism/snapshots/seattlerb/call_leading_dots.txt +++ /dev/null @@ -1,37 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,2)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,2)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(3,2)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (1,0)-(2,2)) - │ ├── flags: ∅ - │ ├── receiver: - │ │ @ CallNode (location: (1,0)-(1,1)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (1,0)-(1,1) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (2,0)-(2,1) = "." - │ ├── name: :b - │ ├── message_loc: (2,1)-(2,2) = "b" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: (3,0)-(3,1) = "." - ├── name: :c - ├── message_loc: (3,1)-(3,2) = "c" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/call_leading_dots_comment.txt b/test/prism/snapshots/seattlerb/call_leading_dots_comment.txt deleted file mode 100644 index f285e42cbf4b67..00000000000000 --- a/test/prism/snapshots/seattlerb/call_leading_dots_comment.txt +++ /dev/null @@ -1,37 +0,0 @@ -@ ProgramNode (location: (1,0)-(4,2)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(4,2)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(4,2)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (1,0)-(2,2)) - │ ├── flags: ∅ - │ ├── receiver: - │ │ @ CallNode (location: (1,0)-(1,1)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (1,0)-(1,1) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (2,0)-(2,1) = "." - │ ├── name: :b - │ ├── message_loc: (2,1)-(2,2) = "b" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: (4,0)-(4,1) = "." - ├── name: :d - ├── message_loc: (4,1)-(4,2) = "d" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/call_lt.txt b/test/prism/snapshots/seattlerb/call_lt.txt deleted file mode 100644 index bec3deddd083b5..00000000000000 --- a/test/prism/snapshots/seattlerb/call_lt.txt +++ /dev/null @@ -1,26 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,5)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,5)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,5)) - ├── flags: newline - ├── receiver: - │ @ IntegerNode (location: (1,0)-(1,1)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── call_operator_loc: ∅ - ├── name: :< - ├── message_loc: (1,2)-(1,3) = "<" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,4)-(1,5)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ IntegerNode (location: (1,4)-(1,5)) - │ ├── flags: static_literal, decimal - │ └── value: 2 - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/call_lte.txt b/test/prism/snapshots/seattlerb/call_lte.txt deleted file mode 100644 index a71e03ee1283ec..00000000000000 --- a/test/prism/snapshots/seattlerb/call_lte.txt +++ /dev/null @@ -1,26 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,6)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,6)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,6)) - ├── flags: newline - ├── receiver: - │ @ IntegerNode (location: (1,0)-(1,1)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── call_operator_loc: ∅ - ├── name: :<= - ├── message_loc: (1,2)-(1,4) = "<=" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,5)-(1,6)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ IntegerNode (location: (1,5)-(1,6)) - │ ├── flags: static_literal, decimal - │ └── value: 2 - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/call_not.txt b/test/prism/snapshots/seattlerb/call_not.txt deleted file mode 100644 index e9df80fb9f2a84..00000000000000 --- a/test/prism/snapshots/seattlerb/call_not.txt +++ /dev/null @@ -1,20 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,6)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,6)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,6)) - ├── flags: newline - ├── receiver: - │ @ IntegerNode (location: (1,4)-(1,6)) - │ ├── flags: static_literal, decimal - │ └── value: 42 - ├── call_operator_loc: ∅ - ├── name: :! - ├── message_loc: (1,0)-(1,3) = "not" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/call_pipe.txt b/test/prism/snapshots/seattlerb/call_pipe.txt deleted file mode 100644 index 8cf68211a99ea7..00000000000000 --- a/test/prism/snapshots/seattlerb/call_pipe.txt +++ /dev/null @@ -1,26 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,5)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,5)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,5)) - ├── flags: newline - ├── receiver: - │ @ IntegerNode (location: (1,0)-(1,1)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── call_operator_loc: ∅ - ├── name: :| - ├── message_loc: (1,2)-(1,3) = "|" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,4)-(1,5)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ IntegerNode (location: (1,4)-(1,5)) - │ ├── flags: static_literal, decimal - │ └── value: 2 - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/call_rshift.txt b/test/prism/snapshots/seattlerb/call_rshift.txt deleted file mode 100644 index 28948a044f9da0..00000000000000 --- a/test/prism/snapshots/seattlerb/call_rshift.txt +++ /dev/null @@ -1,26 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,6)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,6)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,6)) - ├── flags: newline - ├── receiver: - │ @ IntegerNode (location: (1,0)-(1,1)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── call_operator_loc: ∅ - ├── name: :>> - ├── message_loc: (1,2)-(1,4) = ">>" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,5)-(1,6)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ IntegerNode (location: (1,5)-(1,6)) - │ ├── flags: static_literal, decimal - │ └── value: 2 - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/call_self_brackets.txt b/test/prism/snapshots/seattlerb/call_self_brackets.txt deleted file mode 100644 index e4f5e2c41313aa..00000000000000 --- a/test/prism/snapshots/seattlerb/call_self_brackets.txt +++ /dev/null @@ -1,25 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,7)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,7)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,7)) - ├── flags: newline, ignore_visibility - ├── receiver: - │ @ SelfNode (location: (1,0)-(1,4)) - │ └── flags: ∅ - ├── call_operator_loc: ∅ - ├── name: :[] - ├── message_loc: (1,4)-(1,7) = "[1]" - ├── opening_loc: (1,4)-(1,5) = "[" - ├── arguments: - │ @ ArgumentsNode (location: (1,5)-(1,6)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ IntegerNode (location: (1,5)-(1,6)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── closing_loc: (1,6)-(1,7) = "]" - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/call_spaceship.txt b/test/prism/snapshots/seattlerb/call_spaceship.txt deleted file mode 100644 index 4ea67f2e00bb5b..00000000000000 --- a/test/prism/snapshots/seattlerb/call_spaceship.txt +++ /dev/null @@ -1,26 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,7)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,7)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,7)) - ├── flags: newline - ├── receiver: - │ @ IntegerNode (location: (1,0)-(1,1)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── call_operator_loc: ∅ - ├── name: :<=> - ├── message_loc: (1,2)-(1,5) = "<=>" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,6)-(1,7)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ IntegerNode (location: (1,6)-(1,7)) - │ ├── flags: static_literal, decimal - │ └── value: 2 - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/call_stabby_do_end_with_block.txt b/test/prism/snapshots/seattlerb/call_stabby_do_end_with_block.txt deleted file mode 100644 index 0e83d334cacf2b..00000000000000 --- a/test/prism/snapshots/seattlerb/call_stabby_do_end_with_block.txt +++ /dev/null @@ -1,47 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,22)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,22)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,22)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :a - ├── message_loc: (1,0)-(1,1) = "a" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,2)-(1,13)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ LambdaNode (location: (1,2)-(1,13)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── operator_loc: (1,2)-(1,4) = "->" - │ ├── opening_loc: (1,5)-(1,7) = "do" - │ ├── closing_loc: (1,10)-(1,13) = "end" - │ ├── parameters: ∅ - │ └── body: - │ @ StatementsNode (location: (1,8)-(1,9)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ IntegerNode (location: (1,8)-(1,9)) - │ ├── flags: newline, static_literal, decimal - │ └── value: 1 - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,14)-(1,22)) - ├── flags: ∅ - ├── locals: [] - ├── parameters: ∅ - ├── body: - │ @ StatementsNode (location: (1,17)-(1,18)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ IntegerNode (location: (1,17)-(1,18)) - │ ├── flags: newline, static_literal, decimal - │ └── value: 2 - ├── opening_loc: (1,14)-(1,16) = "do" - └── closing_loc: (1,19)-(1,22) = "end" diff --git a/test/prism/snapshots/seattlerb/call_stabby_with_braces_block.txt b/test/prism/snapshots/seattlerb/call_stabby_with_braces_block.txt deleted file mode 100644 index 705f8b8d0224c6..00000000000000 --- a/test/prism/snapshots/seattlerb/call_stabby_with_braces_block.txt +++ /dev/null @@ -1,47 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,19)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,19)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,19)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :a - ├── message_loc: (1,0)-(1,1) = "a" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,2)-(1,10)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ LambdaNode (location: (1,2)-(1,10)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── operator_loc: (1,2)-(1,4) = "->" - │ ├── opening_loc: (1,5)-(1,6) = "{" - │ ├── closing_loc: (1,9)-(1,10) = "}" - │ ├── parameters: ∅ - │ └── body: - │ @ StatementsNode (location: (1,7)-(1,8)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ IntegerNode (location: (1,7)-(1,8)) - │ ├── flags: newline, static_literal, decimal - │ └── value: 1 - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,11)-(1,19)) - ├── flags: ∅ - ├── locals: [] - ├── parameters: ∅ - ├── body: - │ @ StatementsNode (location: (1,14)-(1,15)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ IntegerNode (location: (1,14)-(1,15)) - │ ├── flags: newline, static_literal, decimal - │ └── value: 2 - ├── opening_loc: (1,11)-(1,13) = "do" - └── closing_loc: (1,16)-(1,19) = "end" diff --git a/test/prism/snapshots/seattlerb/call_star.txt b/test/prism/snapshots/seattlerb/call_star.txt deleted file mode 100644 index 06bee81f30da40..00000000000000 --- a/test/prism/snapshots/seattlerb/call_star.txt +++ /dev/null @@ -1,26 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,5)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,5)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,5)) - ├── flags: newline - ├── receiver: - │ @ IntegerNode (location: (1,0)-(1,1)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── call_operator_loc: ∅ - ├── name: :* - ├── message_loc: (1,2)-(1,3) = "*" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,4)-(1,5)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ IntegerNode (location: (1,4)-(1,5)) - │ ├── flags: static_literal, decimal - │ └── value: 2 - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/call_star2.txt b/test/prism/snapshots/seattlerb/call_star2.txt deleted file mode 100644 index bd367d2e758fc8..00000000000000 --- a/test/prism/snapshots/seattlerb/call_star2.txt +++ /dev/null @@ -1,26 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,6)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,6)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,6)) - ├── flags: newline - ├── receiver: - │ @ IntegerNode (location: (1,0)-(1,1)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── call_operator_loc: ∅ - ├── name: :** - ├── message_loc: (1,2)-(1,4) = "**" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,5)-(1,6)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ IntegerNode (location: (1,5)-(1,6)) - │ ├── flags: static_literal, decimal - │ └── value: 2 - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/call_trailing_comma.txt b/test/prism/snapshots/seattlerb/call_trailing_comma.txt deleted file mode 100644 index 01cb77a25a060f..00000000000000 --- a/test/prism/snapshots/seattlerb/call_trailing_comma.txt +++ /dev/null @@ -1,23 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,5)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,5)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,5)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :f - ├── message_loc: (1,0)-(1,1) = "f" - ├── opening_loc: (1,1)-(1,2) = "(" - ├── arguments: - │ @ ArgumentsNode (location: (1,2)-(1,3)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ IntegerNode (location: (1,2)-(1,3)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── closing_loc: (1,4)-(1,5) = ")" - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/call_trailing_dots.txt b/test/prism/snapshots/seattlerb/call_trailing_dots.txt deleted file mode 100644 index 73ffd855ad8839..00000000000000 --- a/test/prism/snapshots/seattlerb/call_trailing_dots.txt +++ /dev/null @@ -1,37 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,1)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,1)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(3,1)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (1,0)-(2,1)) - │ ├── flags: ∅ - │ ├── receiver: - │ │ @ CallNode (location: (1,0)-(1,1)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (1,0)-(1,1) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (1,1)-(1,2) = "." - │ ├── name: :b - │ ├── message_loc: (2,0)-(2,1) = "b" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: (2,1)-(2,2) = "." - ├── name: :c - ├── message_loc: (3,0)-(3,1) = "c" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/call_unary_bang.txt b/test/prism/snapshots/seattlerb/call_unary_bang.txt deleted file mode 100644 index b08f0706930f40..00000000000000 --- a/test/prism/snapshots/seattlerb/call_unary_bang.txt +++ /dev/null @@ -1,20 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,2)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,2)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,2)) - ├── flags: newline - ├── receiver: - │ @ IntegerNode (location: (1,1)-(1,2)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── call_operator_loc: ∅ - ├── name: :! - ├── message_loc: (1,0)-(1,1) = "!" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/case_in.txt b/test/prism/snapshots/seattlerb/case_in.txt deleted file mode 100644 index 929cca0d38256d..00000000000000 --- a/test/prism/snapshots/seattlerb/case_in.txt +++ /dev/null @@ -1,1109 +0,0 @@ -@ ProgramNode (location: (1,0)-(111,3)) -├── flags: ∅ -├── locals: [:b, :_, :lhs, :x, :rhs, :c, :e] -└── statements: - @ StatementsNode (location: (1,0)-(111,3)) - ├── flags: ∅ - └── body: (length: 28) - ├── @ CaseMatchNode (location: (1,0)-(3,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ SymbolNode (location: (1,5)-(1,7)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (1,5)-(1,6) = ":" - │ │ ├── value_loc: (1,6)-(1,7) = "a" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "a" - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (2,0)-(2,8)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ HashPatternNode (location: (2,4)-(2,8)) - │ │ │ ├── flags: ∅ - │ │ │ ├── constant: ∅ - │ │ │ ├── elements: (length: 1) - │ │ │ │ └── @ AssocNode (location: (2,4)-(2,8)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── key: - │ │ │ │ │ @ SymbolNode (location: (2,4)-(2,8)) - │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ │ ├── opening_loc: (2,4)-(2,5) = "\"" - │ │ │ │ │ ├── value_loc: (2,5)-(2,6) = "b" - │ │ │ │ │ ├── closing_loc: (2,6)-(2,8) = "\":" - │ │ │ │ │ └── unescaped: "b" - │ │ │ │ ├── value: - │ │ │ │ │ @ ImplicitNode (location: (2,5)-(2,6)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── value: - │ │ │ │ │ @ LocalVariableTargetNode (location: (2,5)-(2,6)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── name: :b - │ │ │ │ │ └── depth: 0 - │ │ │ │ └── operator_loc: ∅ - │ │ │ ├── rest: ∅ - │ │ │ ├── opening_loc: ∅ - │ │ │ └── closing_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── in_loc: (2,0)-(2,2) = "in" - │ │ └── then_loc: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (1,0)-(1,4) = "case" - │ └── end_keyword_loc: (3,0)-(3,3) = "end" - ├── @ CaseMatchNode (location: (5,0)-(7,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ SymbolNode (location: (5,5)-(5,7)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (5,5)-(5,6) = ":" - │ │ ├── value_loc: (5,6)-(5,7) = "a" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "a" - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (6,0)-(6,10)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ ArrayNode (location: (6,3)-(6,10)) - │ │ │ ├── flags: static_literal - │ │ │ ├── elements: (length: 2) - │ │ │ │ ├── @ SymbolNode (location: (6,6)-(6,7)) - │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── value_loc: (6,6)-(6,7) = "a" - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── unescaped: "a" - │ │ │ │ └── @ SymbolNode (location: (6,8)-(6,9)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── value_loc: (6,8)-(6,9) = "b" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "b" - │ │ │ ├── opening_loc: (6,3)-(6,6) = "%I[" - │ │ │ └── closing_loc: (6,9)-(6,10) = "]" - │ │ ├── statements: ∅ - │ │ ├── in_loc: (6,0)-(6,2) = "in" - │ │ └── then_loc: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (5,0)-(5,4) = "case" - │ └── end_keyword_loc: (7,0)-(7,3) = "end" - ├── @ CaseMatchNode (location: (9,0)-(11,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ SymbolNode (location: (9,5)-(9,7)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (9,5)-(9,6) = ":" - │ │ ├── value_loc: (9,6)-(9,7) = "a" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "a" - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (10,0)-(10,10)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ ArrayNode (location: (10,3)-(10,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── elements: (length: 2) - │ │ │ │ ├── @ StringNode (location: (10,6)-(10,7)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── content_loc: (10,6)-(10,7) = "a" - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── unescaped: "a" - │ │ │ │ └── @ StringNode (location: (10,8)-(10,9)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── content_loc: (10,8)-(10,9) = "b" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "b" - │ │ │ ├── opening_loc: (10,3)-(10,6) = "%W[" - │ │ │ └── closing_loc: (10,9)-(10,10) = "]" - │ │ ├── statements: ∅ - │ │ ├── in_loc: (10,0)-(10,2) = "in" - │ │ └── then_loc: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (9,0)-(9,4) = "case" - │ └── end_keyword_loc: (11,0)-(11,3) = "end" - ├── @ CaseMatchNode (location: (13,0)-(15,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ SymbolNode (location: (13,5)-(13,7)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (13,5)-(13,6) = ":" - │ │ ├── value_loc: (13,6)-(13,7) = "a" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "a" - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (14,0)-(14,10)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ ArrayNode (location: (14,3)-(14,10)) - │ │ │ ├── flags: static_literal - │ │ │ ├── elements: (length: 2) - │ │ │ │ ├── @ SymbolNode (location: (14,6)-(14,7)) - │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── value_loc: (14,6)-(14,7) = "a" - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── unescaped: "a" - │ │ │ │ └── @ SymbolNode (location: (14,8)-(14,9)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── value_loc: (14,8)-(14,9) = "b" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "b" - │ │ │ ├── opening_loc: (14,3)-(14,6) = "%i[" - │ │ │ └── closing_loc: (14,9)-(14,10) = "]" - │ │ ├── statements: ∅ - │ │ ├── in_loc: (14,0)-(14,2) = "in" - │ │ └── then_loc: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (13,0)-(13,4) = "case" - │ └── end_keyword_loc: (15,0)-(15,3) = "end" - ├── @ CaseMatchNode (location: (17,0)-(19,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ SymbolNode (location: (17,5)-(17,7)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (17,5)-(17,6) = ":" - │ │ ├── value_loc: (17,6)-(17,7) = "a" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "a" - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (18,0)-(18,10)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ ArrayNode (location: (18,3)-(18,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── elements: (length: 2) - │ │ │ │ ├── @ StringNode (location: (18,6)-(18,7)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── content_loc: (18,6)-(18,7) = "a" - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── unescaped: "a" - │ │ │ │ └── @ StringNode (location: (18,8)-(18,9)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── content_loc: (18,8)-(18,9) = "b" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "b" - │ │ │ ├── opening_loc: (18,3)-(18,6) = "%w[" - │ │ │ └── closing_loc: (18,9)-(18,10) = "]" - │ │ ├── statements: ∅ - │ │ ├── in_loc: (18,0)-(18,2) = "in" - │ │ └── then_loc: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (17,0)-(17,4) = "case" - │ └── end_keyword_loc: (19,0)-(19,3) = "end" - ├── @ CaseMatchNode (location: (21,0)-(23,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ SymbolNode (location: (21,5)-(21,7)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (21,5)-(21,6) = ":" - │ │ ├── value_loc: (21,6)-(21,7) = "a" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "a" - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (22,0)-(22,10)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ ParenthesesNode (location: (22,3)-(22,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── body: - │ │ │ │ @ RangeNode (location: (22,4)-(22,9)) - │ │ │ │ ├── flags: static_literal, exclude_end - │ │ │ │ ├── left: ∅ - │ │ │ │ ├── right: - │ │ │ │ │ @ IntegerNode (location: (22,7)-(22,9)) - │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ └── value: 10 - │ │ │ │ └── operator_loc: (22,4)-(22,7) = "..." - │ │ │ ├── opening_loc: (22,3)-(22,4) = "(" - │ │ │ └── closing_loc: (22,9)-(22,10) = ")" - │ │ ├── statements: ∅ - │ │ ├── in_loc: (22,0)-(22,2) = "in" - │ │ └── then_loc: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (21,0)-(21,4) = "case" - │ └── end_keyword_loc: (23,0)-(23,3) = "end" - ├── @ CaseMatchNode (location: (25,0)-(27,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ SymbolNode (location: (25,5)-(25,7)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (25,5)-(25,6) = ":" - │ │ ├── value_loc: (25,6)-(25,7) = "a" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "a" - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (26,0)-(26,9)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ ParenthesesNode (location: (26,3)-(26,9)) - │ │ │ ├── flags: ∅ - │ │ │ ├── body: - │ │ │ │ @ RangeNode (location: (26,4)-(26,8)) - │ │ │ │ ├── flags: static_literal - │ │ │ │ ├── left: ∅ - │ │ │ │ ├── right: - │ │ │ │ │ @ IntegerNode (location: (26,6)-(26,8)) - │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ └── value: 10 - │ │ │ │ └── operator_loc: (26,4)-(26,6) = ".." - │ │ │ ├── opening_loc: (26,3)-(26,4) = "(" - │ │ │ └── closing_loc: (26,8)-(26,9) = ")" - │ │ ├── statements: ∅ - │ │ ├── in_loc: (26,0)-(26,2) = "in" - │ │ └── then_loc: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (25,0)-(25,4) = "case" - │ └── end_keyword_loc: (27,0)-(27,3) = "end" - ├── @ CaseMatchNode (location: (29,0)-(31,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ SymbolNode (location: (29,5)-(29,7)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (29,5)-(29,6) = ":" - │ │ ├── value_loc: (29,6)-(29,7) = "a" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "a" - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (30,0)-(30,9)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ ParenthesesNode (location: (30,3)-(30,9)) - │ │ │ ├── flags: ∅ - │ │ │ ├── body: - │ │ │ │ @ RangeNode (location: (30,4)-(30,8)) - │ │ │ │ ├── flags: static_literal, exclude_end - │ │ │ │ ├── left: - │ │ │ │ │ @ IntegerNode (location: (30,4)-(30,5)) - │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ └── value: 1 - │ │ │ │ ├── right: ∅ - │ │ │ │ └── operator_loc: (30,5)-(30,8) = "..." - │ │ │ ├── opening_loc: (30,3)-(30,4) = "(" - │ │ │ └── closing_loc: (30,8)-(30,9) = ")" - │ │ ├── statements: ∅ - │ │ ├── in_loc: (30,0)-(30,2) = "in" - │ │ └── then_loc: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (29,0)-(29,4) = "case" - │ └── end_keyword_loc: (31,0)-(31,3) = "end" - ├── @ CaseMatchNode (location: (33,0)-(35,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ SymbolNode (location: (33,5)-(33,7)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (33,5)-(33,6) = ":" - │ │ ├── value_loc: (33,6)-(33,7) = "a" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "a" - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (34,0)-(34,10)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ ParenthesesNode (location: (34,3)-(34,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── body: - │ │ │ │ @ RangeNode (location: (34,4)-(34,9)) - │ │ │ │ ├── flags: static_literal, exclude_end - │ │ │ │ ├── left: - │ │ │ │ │ @ IntegerNode (location: (34,4)-(34,5)) - │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ └── value: 1 - │ │ │ │ ├── right: - │ │ │ │ │ @ IntegerNode (location: (34,8)-(34,9)) - │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ └── value: 3 - │ │ │ │ └── operator_loc: (34,5)-(34,8) = "..." - │ │ │ ├── opening_loc: (34,3)-(34,4) = "(" - │ │ │ └── closing_loc: (34,9)-(34,10) = ")" - │ │ ├── statements: ∅ - │ │ ├── in_loc: (34,0)-(34,2) = "in" - │ │ └── then_loc: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (33,0)-(33,4) = "case" - │ └── end_keyword_loc: (35,0)-(35,3) = "end" - ├── @ CaseMatchNode (location: (37,0)-(39,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ SymbolNode (location: (37,5)-(37,7)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (37,5)-(37,6) = ":" - │ │ ├── value_loc: (37,6)-(37,7) = "a" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "a" - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (38,0)-(38,7)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ ParenthesesNode (location: (38,3)-(38,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── body: - │ │ │ │ @ IntegerNode (location: (38,4)-(38,6)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 42 - │ │ │ ├── opening_loc: (38,3)-(38,4) = "(" - │ │ │ └── closing_loc: (38,6)-(38,7) = ")" - │ │ ├── statements: ∅ - │ │ ├── in_loc: (38,0)-(38,2) = "in" - │ │ └── then_loc: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (37,0)-(37,4) = "case" - │ └── end_keyword_loc: (39,0)-(39,3) = "end" - ├── @ CaseMatchNode (location: (41,0)-(43,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ SymbolNode (location: (41,5)-(41,7)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (41,5)-(41,6) = ":" - │ │ ├── value_loc: (41,6)-(41,7) = "a" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "a" - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (42,0)-(42,8)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ HashPatternNode (location: (42,3)-(42,8)) - │ │ │ ├── flags: ∅ - │ │ │ ├── constant: ∅ - │ │ │ ├── elements: (length: 0) - │ │ │ ├── rest: - │ │ │ │ @ NoKeywordsParameterNode (location: (42,3)-(42,8)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── operator_loc: (42,3)-(42,5) = "**" - │ │ │ │ └── keyword_loc: (42,5)-(42,8) = "nil" - │ │ │ ├── opening_loc: ∅ - │ │ │ └── closing_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── in_loc: (42,0)-(42,2) = "in" - │ │ └── then_loc: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (41,0)-(41,4) = "case" - │ └── end_keyword_loc: (43,0)-(43,3) = "end" - ├── @ CaseMatchNode (location: (45,0)-(47,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ SymbolNode (location: (45,5)-(45,7)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (45,5)-(45,6) = ":" - │ │ ├── value_loc: (45,6)-(45,7) = "a" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "a" - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (46,0)-(46,11)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ RegularExpressionNode (location: (46,3)-(46,11)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (46,3)-(46,4) = "/" - │ │ │ ├── content_loc: (46,4)-(46,10) = "regexp" - │ │ │ ├── closing_loc: (46,10)-(46,11) = "/" - │ │ │ └── unescaped: "regexp" - │ │ ├── statements: ∅ - │ │ ├── in_loc: (46,0)-(46,2) = "in" - │ │ └── then_loc: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (45,0)-(45,4) = "case" - │ └── end_keyword_loc: (47,0)-(47,3) = "end" - ├── @ CaseMatchNode (location: (49,0)-(51,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ SymbolNode (location: (49,5)-(49,7)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (49,5)-(49,6) = ":" - │ │ ├── value_loc: (49,6)-(49,7) = "a" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "a" - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (50,0)-(50,13)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ ArrayPatternNode (location: (50,3)-(50,13)) - │ │ │ ├── flags: ∅ - │ │ │ ├── constant: ∅ - │ │ │ ├── requireds: (length: 1) - │ │ │ │ └── @ SymbolNode (location: (50,3)-(50,5)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: (50,3)-(50,4) = ":" - │ │ │ │ ├── value_loc: (50,4)-(50,5) = "b" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "b" - │ │ │ ├── rest: - │ │ │ │ @ SplatNode (location: (50,7)-(50,9)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── operator_loc: (50,7)-(50,8) = "*" - │ │ │ │ └── expression: - │ │ │ │ @ LocalVariableTargetNode (location: (50,8)-(50,9)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :_ - │ │ │ │ └── depth: 0 - │ │ │ ├── posts: (length: 1) - │ │ │ │ └── @ SymbolNode (location: (50,11)-(50,13)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: (50,11)-(50,12) = ":" - │ │ │ │ ├── value_loc: (50,12)-(50,13) = "c" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "c" - │ │ │ ├── opening_loc: ∅ - │ │ │ └── closing_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── in_loc: (50,0)-(50,2) = "in" - │ │ └── then_loc: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (49,0)-(49,4) = "case" - │ └── end_keyword_loc: (51,0)-(51,3) = "end" - ├── @ CaseMatchNode (location: (53,0)-(55,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ SymbolNode (location: (53,5)-(53,7)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (53,5)-(53,6) = ":" - │ │ ├── value_loc: (53,6)-(53,7) = "a" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "a" - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (54,0)-(54,11)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ ArrayPatternNode (location: (54,3)-(54,11)) - │ │ │ ├── flags: ∅ - │ │ │ ├── constant: ∅ - │ │ │ ├── requireds: (length: 2) - │ │ │ │ ├── @ SymbolNode (location: (54,3)-(54,5)) - │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ │ ├── opening_loc: (54,3)-(54,4) = ":" - │ │ │ │ │ ├── value_loc: (54,4)-(54,5) = "b" - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── unescaped: "b" - │ │ │ │ └── @ ArrayPatternNode (location: (54,7)-(54,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── constant: ∅ - │ │ │ │ ├── requireds: (length: 1) - │ │ │ │ │ └── @ SymbolNode (location: (54,8)-(54,10)) - │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ │ ├── opening_loc: (54,8)-(54,9) = ":" - │ │ │ │ │ ├── value_loc: (54,9)-(54,10) = "c" - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── unescaped: "c" - │ │ │ │ ├── rest: ∅ - │ │ │ │ ├── posts: (length: 0) - │ │ │ │ ├── opening_loc: (54,7)-(54,8) = "[" - │ │ │ │ └── closing_loc: (54,10)-(54,11) = "]" - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── opening_loc: ∅ - │ │ │ └── closing_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── in_loc: (54,0)-(54,2) = "in" - │ │ └── then_loc: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (53,0)-(53,4) = "case" - │ └── end_keyword_loc: (55,0)-(55,3) = "end" - ├── @ CaseMatchNode (location: (57,0)-(59,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ SymbolNode (location: (57,5)-(57,7)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (57,5)-(57,6) = ":" - │ │ ├── value_loc: (57,6)-(57,7) = "a" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "a" - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (58,0)-(58,11)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ ArrayPatternNode (location: (58,3)-(58,11)) - │ │ │ ├── flags: ∅ - │ │ │ ├── constant: - │ │ │ │ @ ConstantReadNode (location: (58,3)-(58,9)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :Symbol - │ │ │ ├── requireds: (length: 0) - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── opening_loc: (58,9)-(58,10) = "(" - │ │ │ └── closing_loc: (58,10)-(58,11) = ")" - │ │ ├── statements: ∅ - │ │ ├── in_loc: (58,0)-(58,2) = "in" - │ │ └── then_loc: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (57,0)-(57,4) = "case" - │ └── end_keyword_loc: (59,0)-(59,3) = "end" - ├── @ CaseMatchNode (location: (61,0)-(63,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ SymbolNode (location: (61,5)-(61,7)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (61,5)-(61,6) = ":" - │ │ ├── value_loc: (61,6)-(61,7) = "a" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "a" - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (62,0)-(62,24)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ FindPatternNode (location: (62,3)-(62,24)) - │ │ │ ├── flags: ∅ - │ │ │ ├── constant: - │ │ │ │ @ ConstantReadNode (location: (62,3)-(62,9)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :Symbol - │ │ │ ├── left: - │ │ │ │ @ SplatNode (location: (62,10)-(62,14)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── operator_loc: (62,10)-(62,11) = "*" - │ │ │ │ └── expression: - │ │ │ │ @ LocalVariableTargetNode (location: (62,11)-(62,14)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :lhs - │ │ │ │ └── depth: 0 - │ │ │ ├── requireds: (length: 1) - │ │ │ │ └── @ LocalVariableTargetNode (location: (62,16)-(62,17)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :x - │ │ │ │ └── depth: 0 - │ │ │ ├── right: - │ │ │ │ @ SplatNode (location: (62,19)-(62,23)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── operator_loc: (62,19)-(62,20) = "*" - │ │ │ │ └── expression: - │ │ │ │ @ LocalVariableTargetNode (location: (62,20)-(62,23)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :rhs - │ │ │ │ └── depth: 0 - │ │ │ ├── opening_loc: (62,9)-(62,10) = "(" - │ │ │ └── closing_loc: (62,23)-(62,24) = ")" - │ │ ├── statements: ∅ - │ │ ├── in_loc: (62,0)-(62,2) = "in" - │ │ └── then_loc: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (61,0)-(61,4) = "case" - │ └── end_keyword_loc: (63,0)-(63,3) = "end" - ├── @ CaseMatchNode (location: (65,0)-(67,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ SymbolNode (location: (65,5)-(65,7)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (65,5)-(65,6) = ":" - │ │ ├── value_loc: (65,6)-(65,7) = "a" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "a" - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (66,0)-(66,24)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ FindPatternNode (location: (66,3)-(66,24)) - │ │ │ ├── flags: ∅ - │ │ │ ├── constant: - │ │ │ │ @ ConstantReadNode (location: (66,3)-(66,9)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :Symbol - │ │ │ ├── left: - │ │ │ │ @ SplatNode (location: (66,10)-(66,14)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── operator_loc: (66,10)-(66,11) = "*" - │ │ │ │ └── expression: - │ │ │ │ @ LocalVariableTargetNode (location: (66,11)-(66,14)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :lhs - │ │ │ │ └── depth: 0 - │ │ │ ├── requireds: (length: 1) - │ │ │ │ └── @ LocalVariableTargetNode (location: (66,16)-(66,17)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :x - │ │ │ │ └── depth: 0 - │ │ │ ├── right: - │ │ │ │ @ SplatNode (location: (66,19)-(66,23)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── operator_loc: (66,19)-(66,20) = "*" - │ │ │ │ └── expression: - │ │ │ │ @ LocalVariableTargetNode (location: (66,20)-(66,23)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :rhs - │ │ │ │ └── depth: 0 - │ │ │ ├── opening_loc: (66,9)-(66,10) = "[" - │ │ │ └── closing_loc: (66,23)-(66,24) = "]" - │ │ ├── statements: ∅ - │ │ ├── in_loc: (66,0)-(66,2) = "in" - │ │ └── then_loc: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (65,0)-(65,4) = "case" - │ └── end_keyword_loc: (67,0)-(67,3) = "end" - ├── @ CaseMatchNode (location: (69,0)-(71,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ SymbolNode (location: (69,5)-(69,7)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (69,5)-(69,6) = ":" - │ │ ├── value_loc: (69,6)-(69,7) = "a" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "a" - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (70,0)-(70,22)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ ArrayPatternNode (location: (70,3)-(70,22)) - │ │ │ ├── flags: ∅ - │ │ │ ├── constant: ∅ - │ │ │ ├── requireds: (length: 2) - │ │ │ │ ├── @ LambdaNode (location: (70,4)-(70,18)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── locals: [:b] - │ │ │ │ │ ├── operator_loc: (70,4)-(70,6) = "->" - │ │ │ │ │ ├── opening_loc: (70,10)-(70,11) = "{" - │ │ │ │ │ ├── closing_loc: (70,17)-(70,18) = "}" - │ │ │ │ │ ├── parameters: - │ │ │ │ │ │ @ BlockParametersNode (location: (70,6)-(70,9)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ ├── parameters: - │ │ │ │ │ │ │ @ ParametersNode (location: (70,7)-(70,8)) - │ │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ │ ├── requireds: (length: 1) - │ │ │ │ │ │ │ │ └── @ RequiredParameterNode (location: (70,7)-(70,8)) - │ │ │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ │ │ └── name: :b - │ │ │ │ │ │ │ ├── optionals: (length: 0) - │ │ │ │ │ │ │ ├── rest: ∅ - │ │ │ │ │ │ │ ├── posts: (length: 0) - │ │ │ │ │ │ │ ├── keywords: (length: 0) - │ │ │ │ │ │ │ ├── keyword_rest: ∅ - │ │ │ │ │ │ │ └── block: ∅ - │ │ │ │ │ │ ├── locals: (length: 0) - │ │ │ │ │ │ ├── opening_loc: (70,6)-(70,7) = "(" - │ │ │ │ │ │ └── closing_loc: (70,8)-(70,9) = ")" - │ │ │ │ │ └── body: - │ │ │ │ │ @ StatementsNode (location: (70,12)-(70,16)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── body: (length: 1) - │ │ │ │ │ └── @ TrueNode (location: (70,12)-(70,16)) - │ │ │ │ │ └── flags: newline, static_literal - │ │ │ │ └── @ LocalVariableTargetNode (location: (70,20)-(70,21)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :c - │ │ │ │ └── depth: 0 - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── opening_loc: (70,3)-(70,4) = "[" - │ │ │ └── closing_loc: (70,21)-(70,22) = "]" - │ │ ├── statements: ∅ - │ │ ├── in_loc: (70,0)-(70,2) = "in" - │ │ └── then_loc: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (69,0)-(69,4) = "case" - │ └── end_keyword_loc: (71,0)-(71,3) = "end" - ├── @ CaseMatchNode (location: (73,0)-(75,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ SymbolNode (location: (73,5)-(73,7)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (73,5)-(73,6) = ":" - │ │ ├── value_loc: (73,6)-(73,7) = "a" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "a" - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (74,0)-(74,28)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ ArrayPatternNode (location: (74,3)-(74,28)) - │ │ │ ├── flags: ∅ - │ │ │ ├── constant: ∅ - │ │ │ ├── requireds: (length: 4) - │ │ │ │ ├── @ SymbolNode (location: (74,4)-(74,6)) - │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ │ ├── opening_loc: (74,4)-(74,5) = ":" - │ │ │ │ │ ├── value_loc: (74,5)-(74,6) = "a" - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── unescaped: "a" - │ │ │ │ ├── @ LocalVariableTargetNode (location: (74,8)-(74,9)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── name: :b - │ │ │ │ │ └── depth: 0 - │ │ │ │ ├── @ LocalVariableTargetNode (location: (74,11)-(74,12)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── name: :c - │ │ │ │ │ └── depth: 0 - │ │ │ │ └── @ ArrayPatternNode (location: (74,14)-(74,27)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── constant: ∅ - │ │ │ │ ├── requireds: (length: 1) - │ │ │ │ │ └── @ SymbolNode (location: (74,15)-(74,17)) - │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ │ ├── opening_loc: (74,15)-(74,16) = ":" - │ │ │ │ │ ├── value_loc: (74,16)-(74,17) = "d" - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── unescaped: "d" - │ │ │ │ ├── rest: - │ │ │ │ │ @ SplatNode (location: (74,19)-(74,21)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── operator_loc: (74,19)-(74,20) = "*" - │ │ │ │ │ └── expression: - │ │ │ │ │ @ LocalVariableTargetNode (location: (74,20)-(74,21)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── name: :e - │ │ │ │ │ └── depth: 0 - │ │ │ │ ├── posts: (length: 1) - │ │ │ │ │ └── @ NilNode (location: (74,23)-(74,26)) - │ │ │ │ │ └── flags: static_literal - │ │ │ │ ├── opening_loc: (74,14)-(74,15) = "[" - │ │ │ │ └── closing_loc: (74,26)-(74,27) = "]" - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── opening_loc: (74,3)-(74,4) = "[" - │ │ │ └── closing_loc: (74,27)-(74,28) = "]" - │ │ ├── statements: ∅ - │ │ ├── in_loc: (74,0)-(74,2) = "in" - │ │ └── then_loc: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (73,0)-(73,4) = "case" - │ └── end_keyword_loc: (75,0)-(75,3) = "end" - ├── @ CaseMatchNode (location: (77,0)-(79,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ SymbolNode (location: (77,5)-(77,7)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (77,5)-(77,6) = ":" - │ │ ├── value_loc: (77,6)-(77,7) = "a" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "a" - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (78,0)-(78,12)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ ArrayPatternNode (location: (78,3)-(78,12)) - │ │ │ ├── flags: ∅ - │ │ │ ├── constant: ∅ - │ │ │ ├── requireds: (length: 1) - │ │ │ │ └── @ ConstantReadNode (location: (78,4)-(78,5)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :A - │ │ │ ├── rest: - │ │ │ │ @ SplatNode (location: (78,7)-(78,8)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── operator_loc: (78,7)-(78,8) = "*" - │ │ │ │ └── expression: ∅ - │ │ │ ├── posts: (length: 1) - │ │ │ │ └── @ ConstantReadNode (location: (78,10)-(78,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :B - │ │ │ ├── opening_loc: (78,3)-(78,4) = "[" - │ │ │ └── closing_loc: (78,11)-(78,12) = "]" - │ │ ├── statements: ∅ - │ │ ├── in_loc: (78,0)-(78,2) = "in" - │ │ └── then_loc: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (77,0)-(77,4) = "case" - │ └── end_keyword_loc: (79,0)-(79,3) = "end" - ├── @ CaseMatchNode (location: (81,0)-(83,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ SymbolNode (location: (81,5)-(81,7)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (81,5)-(81,6) = ":" - │ │ ├── value_loc: (81,6)-(81,7) = "a" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "a" - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (82,0)-(82,22)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ ArrayPatternNode (location: (82,3)-(82,22)) - │ │ │ ├── flags: ∅ - │ │ │ ├── constant: ∅ - │ │ │ ├── requireds: (length: 2) - │ │ │ │ ├── @ ArrayPatternNode (location: (82,4)-(82,11)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── constant: ∅ - │ │ │ │ │ ├── requireds: (length: 2) - │ │ │ │ │ │ ├── @ SymbolNode (location: (82,5)-(82,7)) - │ │ │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ │ │ │ ├── opening_loc: (82,5)-(82,6) = ":" - │ │ │ │ │ │ │ ├── value_loc: (82,6)-(82,7) = "b" - │ │ │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ │ │ └── unescaped: "b" - │ │ │ │ │ │ └── @ LocalVariableTargetNode (location: (82,9)-(82,10)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ ├── name: :c - │ │ │ │ │ │ └── depth: 0 - │ │ │ │ │ ├── rest: ∅ - │ │ │ │ │ ├── posts: (length: 0) - │ │ │ │ │ ├── opening_loc: (82,4)-(82,5) = "[" - │ │ │ │ │ └── closing_loc: (82,10)-(82,11) = "]" - │ │ │ │ └── @ ArrayPatternNode (location: (82,13)-(82,21)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── constant: ∅ - │ │ │ │ ├── requireds: (length: 2) - │ │ │ │ │ ├── @ SymbolNode (location: (82,14)-(82,16)) - │ │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ │ │ ├── opening_loc: (82,14)-(82,15) = ":" - │ │ │ │ │ │ ├── value_loc: (82,15)-(82,16) = "d" - │ │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ │ └── unescaped: "d" - │ │ │ │ │ └── @ PinnedVariableNode (location: (82,18)-(82,20)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── variable: - │ │ │ │ │ │ @ LocalVariableReadNode (location: (82,19)-(82,20)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ ├── name: :e - │ │ │ │ │ │ └── depth: 0 - │ │ │ │ │ └── operator_loc: (82,18)-(82,19) = "^" - │ │ │ │ ├── rest: ∅ - │ │ │ │ ├── posts: (length: 0) - │ │ │ │ ├── opening_loc: (82,13)-(82,14) = "[" - │ │ │ │ └── closing_loc: (82,20)-(82,21) = "]" - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── opening_loc: (82,3)-(82,4) = "[" - │ │ │ └── closing_loc: (82,21)-(82,22) = "]" - │ │ ├── statements: ∅ - │ │ ├── in_loc: (82,0)-(82,2) = "in" - │ │ └── then_loc: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (81,0)-(81,4) = "case" - │ └── end_keyword_loc: (83,0)-(83,3) = "end" - ├── @ CaseMatchNode (location: (85,0)-(87,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ SymbolNode (location: (85,5)-(85,7)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (85,5)-(85,6) = ":" - │ │ ├── value_loc: (85,6)-(85,7) = "a" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "a" - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (86,0)-(86,5)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ ArrayPatternNode (location: (86,3)-(86,5)) - │ │ │ ├── flags: ∅ - │ │ │ ├── constant: ∅ - │ │ │ ├── requireds: (length: 0) - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── opening_loc: (86,3)-(86,4) = "[" - │ │ │ └── closing_loc: (86,4)-(86,5) = "]" - │ │ ├── statements: ∅ - │ │ ├── in_loc: (86,0)-(86,2) = "in" - │ │ └── then_loc: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (85,0)-(85,4) = "case" - │ └── end_keyword_loc: (87,0)-(87,3) = "end" - ├── @ CaseMatchNode (location: (89,0)-(91,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ SymbolNode (location: (89,5)-(89,7)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (89,5)-(89,6) = ":" - │ │ ├── value_loc: (89,6)-(89,7) = "a" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "a" - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (90,0)-(90,9)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ ArrayPatternNode (location: (90,3)-(90,9)) - │ │ │ ├── flags: ∅ - │ │ │ ├── constant: ∅ - │ │ │ ├── requireds: (length: 1) - │ │ │ │ └── @ PinnedExpressionNode (location: (90,4)-(90,8)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── expression: - │ │ │ │ │ @ CallNode (location: (90,6)-(90,7)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :a - │ │ │ │ │ ├── message_loc: (90,6)-(90,7) = "a" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── operator_loc: (90,4)-(90,5) = "^" - │ │ │ │ ├── lparen_loc: (90,5)-(90,6) = "(" - │ │ │ │ └── rparen_loc: (90,7)-(90,8) = ")" - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── opening_loc: (90,3)-(90,4) = "[" - │ │ │ └── closing_loc: (90,8)-(90,9) = "]" - │ │ ├── statements: ∅ - │ │ ├── in_loc: (90,0)-(90,2) = "in" - │ │ └── then_loc: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (89,0)-(89,4) = "case" - │ └── end_keyword_loc: (91,0)-(91,3) = "end" - ├── @ CaseMatchNode (location: (93,0)-(95,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ SymbolNode (location: (93,5)-(93,7)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (93,5)-(93,6) = ":" - │ │ ├── value_loc: (93,6)-(93,7) = "a" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "a" - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (94,0)-(94,19)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ ArrayPatternNode (location: (94,3)-(94,19)) - │ │ │ ├── flags: ∅ - │ │ │ ├── constant: ∅ - │ │ │ ├── requireds: (length: 3) - │ │ │ │ ├── @ PinnedVariableNode (location: (94,4)-(94,7)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── variable: - │ │ │ │ │ │ @ InstanceVariableReadNode (location: (94,5)-(94,7)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ └── name: :@a - │ │ │ │ │ └── operator_loc: (94,4)-(94,5) = "^" - │ │ │ │ ├── @ PinnedVariableNode (location: (94,9)-(94,12)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── variable: - │ │ │ │ │ │ @ GlobalVariableReadNode (location: (94,10)-(94,12)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ └── name: :$b - │ │ │ │ │ └── operator_loc: (94,9)-(94,10) = "^" - │ │ │ │ └── @ PinnedVariableNode (location: (94,14)-(94,18)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── variable: - │ │ │ │ │ @ ClassVariableReadNode (location: (94,15)-(94,18)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── name: :@@c - │ │ │ │ └── operator_loc: (94,14)-(94,15) = "^" - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── opening_loc: (94,3)-(94,4) = "[" - │ │ │ └── closing_loc: (94,18)-(94,19) = "]" - │ │ ├── statements: ∅ - │ │ ├── in_loc: (94,0)-(94,2) = "in" - │ │ └── then_loc: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (93,0)-(93,4) = "case" - │ └── end_keyword_loc: (95,0)-(95,3) = "end" - ├── @ CaseMatchNode (location: (97,0)-(99,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ SymbolNode (location: (97,5)-(97,7)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (97,5)-(97,6) = ":" - │ │ ├── value_loc: (97,6)-(97,7) = "a" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "a" - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (98,0)-(98,12)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ XStringNode (location: (98,3)-(98,12)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (98,3)-(98,4) = "`" - │ │ │ ├── content_loc: (98,4)-(98,11) = "echo hi" - │ │ │ ├── closing_loc: (98,11)-(98,12) = "`" - │ │ │ └── unescaped: "echo hi" - │ │ ├── statements: ∅ - │ │ ├── in_loc: (98,0)-(98,2) = "in" - │ │ └── then_loc: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (97,0)-(97,4) = "case" - │ └── end_keyword_loc: (99,0)-(99,3) = "end" - ├── @ CaseMatchNode (location: (101,0)-(103,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ SymbolNode (location: (101,5)-(101,7)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (101,5)-(101,6) = ":" - │ │ ├── value_loc: (101,6)-(101,7) = "a" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "a" - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (102,0)-(102,16)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ ArrayPatternNode (location: (102,3)-(102,16)) - │ │ │ ├── flags: ∅ - │ │ │ ├── constant: ∅ - │ │ │ ├── requireds: (length: 3) - │ │ │ │ ├── @ NilNode (location: (102,3)-(102,6)) - │ │ │ │ │ └── flags: static_literal - │ │ │ │ ├── @ NilNode (location: (102,8)-(102,11)) - │ │ │ │ │ └── flags: static_literal - │ │ │ │ └── @ NilNode (location: (102,13)-(102,16)) - │ │ │ │ └── flags: static_literal - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── opening_loc: ∅ - │ │ │ └── closing_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── in_loc: (102,0)-(102,2) = "in" - │ │ └── then_loc: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (101,0)-(101,4) = "case" - │ └── end_keyword_loc: (103,0)-(103,3) = "end" - ├── @ CaseMatchNode (location: (105,0)-(107,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ SymbolNode (location: (105,5)-(105,7)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (105,5)-(105,6) = ":" - │ │ ├── value_loc: (105,6)-(105,7) = "a" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "a" - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (106,0)-(106,11)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ HashPatternNode (location: (106,3)-(106,11)) - │ │ │ ├── flags: ∅ - │ │ │ ├── constant: ∅ - │ │ │ ├── elements: (length: 1) - │ │ │ │ └── @ AssocNode (location: (106,5)-(106,9)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── key: - │ │ │ │ │ @ SymbolNode (location: (106,5)-(106,9)) - │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ │ ├── opening_loc: (106,5)-(106,6) = "\"" - │ │ │ │ │ ├── value_loc: (106,6)-(106,7) = "b" - │ │ │ │ │ ├── closing_loc: (106,7)-(106,9) = "\":" - │ │ │ │ │ └── unescaped: "b" - │ │ │ │ ├── value: - │ │ │ │ │ @ ImplicitNode (location: (106,6)-(106,7)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── value: - │ │ │ │ │ @ LocalVariableTargetNode (location: (106,6)-(106,7)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── name: :b - │ │ │ │ │ └── depth: 0 - │ │ │ │ └── operator_loc: ∅ - │ │ │ ├── rest: ∅ - │ │ │ ├── opening_loc: (106,3)-(106,4) = "{" - │ │ │ └── closing_loc: (106,10)-(106,11) = "}" - │ │ ├── statements: ∅ - │ │ ├── in_loc: (106,0)-(106,2) = "in" - │ │ └── then_loc: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (105,0)-(105,4) = "case" - │ └── end_keyword_loc: (107,0)-(107,3) = "end" - └── @ CaseMatchNode (location: (109,0)-(111,3)) - ├── flags: newline - ├── predicate: - │ @ SymbolNode (location: (109,5)-(109,7)) - │ ├── flags: static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (109,5)-(109,6) = ":" - │ ├── value_loc: (109,6)-(109,7) = "a" - │ ├── closing_loc: ∅ - │ └── unescaped: "a" - ├── conditions: (length: 1) - │ └── @ InNode (location: (110,0)-(110,5)) - │ ├── flags: ∅ - │ ├── pattern: - │ │ @ HashPatternNode (location: (110,3)-(110,5)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── elements: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── opening_loc: (110,3)-(110,4) = "{" - │ │ └── closing_loc: (110,4)-(110,5) = "}" - │ ├── statements: ∅ - │ ├── in_loc: (110,0)-(110,2) = "in" - │ └── then_loc: ∅ - ├── else_clause: ∅ - ├── case_keyword_loc: (109,0)-(109,4) = "case" - └── end_keyword_loc: (111,0)-(111,3) = "end" diff --git a/test/prism/snapshots/seattlerb/case_in_31.txt b/test/prism/snapshots/seattlerb/case_in_31.txt deleted file mode 100644 index 4abddbcdced444..00000000000000 --- a/test/prism/snapshots/seattlerb/case_in_31.txt +++ /dev/null @@ -1,57 +0,0 @@ -@ ProgramNode (location: (1,0)-(4,3)) -├── flags: ∅ -├── locals: [:c] -└── statements: - @ StatementsNode (location: (1,0)-(4,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CaseMatchNode (location: (1,0)-(4,3)) - ├── flags: newline - ├── predicate: - │ @ SymbolNode (location: (1,5)-(1,7)) - │ ├── flags: static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (1,5)-(1,6) = ":" - │ ├── value_loc: (1,6)-(1,7) = "a" - │ ├── closing_loc: ∅ - │ └── unescaped: "a" - ├── conditions: (length: 1) - │ └── @ InNode (location: (2,0)-(3,4)) - │ ├── flags: ∅ - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (2,3)-(2,11)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ SymbolNode (location: (2,4)-(2,6)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (2,4)-(2,5) = ":" - │ │ │ ├── value_loc: (2,5)-(2,6) = "b" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "b" - │ │ ├── rest: - │ │ │ @ SplatNode (location: (2,8)-(2,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (2,8)-(2,9) = "*" - │ │ │ └── expression: - │ │ │ @ LocalVariableTargetNode (location: (2,9)-(2,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :c - │ │ │ └── depth: 0 - │ │ ├── posts: (length: 0) - │ │ ├── opening_loc: (2,3)-(2,4) = "[" - │ │ └── closing_loc: (2,10)-(2,11) = "]" - │ ├── statements: - │ │ @ StatementsNode (location: (3,2)-(3,4)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ SymbolNode (location: (3,2)-(3,4)) - │ │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (3,2)-(3,3) = ":" - │ │ ├── value_loc: (3,3)-(3,4) = "d" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "d" - │ ├── in_loc: (2,0)-(2,2) = "in" - │ └── then_loc: ∅ - ├── else_clause: ∅ - ├── case_keyword_loc: (1,0)-(1,4) = "case" - └── end_keyword_loc: (4,0)-(4,3) = "end" diff --git a/test/prism/snapshots/seattlerb/case_in_37.txt b/test/prism/snapshots/seattlerb/case_in_37.txt deleted file mode 100644 index 5ef6d916af5d51..00000000000000 --- a/test/prism/snapshots/seattlerb/case_in_37.txt +++ /dev/null @@ -1,68 +0,0 @@ -@ ProgramNode (location: (1,0)-(4,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(4,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CaseMatchNode (location: (1,0)-(4,3)) - ├── flags: newline - ├── predicate: - │ @ SymbolNode (location: (1,5)-(1,7)) - │ ├── flags: static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (1,5)-(1,6) = ":" - │ ├── value_loc: (1,6)-(1,7) = "a" - │ ├── closing_loc: ∅ - │ └── unescaped: "a" - ├── conditions: (length: 1) - │ └── @ InNode (location: (2,0)-(3,4)) - │ ├── flags: ∅ - │ ├── pattern: - │ │ @ HashPatternNode (location: (2,3)-(2,19)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── elements: (length: 1) - │ │ │ └── @ AssocNode (location: (2,5)-(2,17)) - │ │ │ ├── flags: ∅ - │ │ │ ├── key: - │ │ │ │ @ SymbolNode (location: (2,5)-(2,7)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── value_loc: (2,5)-(2,6) = "b" - │ │ │ │ ├── closing_loc: (2,6)-(2,7) = ":" - │ │ │ │ └── unescaped: "b" - │ │ │ ├── value: - │ │ │ │ @ ArrayPatternNode (location: (2,8)-(2,17)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── constant: ∅ - │ │ │ │ ├── requireds: (length: 1) - │ │ │ │ │ └── @ ConstantReadNode (location: (2,9)-(2,13)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── name: :Hash - │ │ │ │ ├── rest: - │ │ │ │ │ @ SplatNode (location: (2,15)-(2,16)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── operator_loc: (2,15)-(2,16) = "*" - │ │ │ │ │ └── expression: ∅ - │ │ │ │ ├── posts: (length: 0) - │ │ │ │ ├── opening_loc: (2,8)-(2,9) = "[" - │ │ │ │ └── closing_loc: (2,16)-(2,17) = "]" - │ │ │ └── operator_loc: ∅ - │ │ ├── rest: ∅ - │ │ ├── opening_loc: (2,3)-(2,4) = "{" - │ │ └── closing_loc: (2,18)-(2,19) = "}" - │ ├── statements: - │ │ @ StatementsNode (location: (3,2)-(3,4)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ SymbolNode (location: (3,2)-(3,4)) - │ │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (3,2)-(3,3) = ":" - │ │ ├── value_loc: (3,3)-(3,4) = "c" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "c" - │ ├── in_loc: (2,0)-(2,2) = "in" - │ └── then_loc: ∅ - ├── else_clause: ∅ - ├── case_keyword_loc: (1,0)-(1,4) = "case" - └── end_keyword_loc: (4,0)-(4,3) = "end" diff --git a/test/prism/snapshots/seattlerb/case_in_42.txt b/test/prism/snapshots/seattlerb/case_in_42.txt deleted file mode 100644 index 9c6d21c68efd79..00000000000000 --- a/test/prism/snapshots/seattlerb/case_in_42.txt +++ /dev/null @@ -1,53 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,3)) -├── flags: ∅ -├── locals: [:_] -└── statements: - @ StatementsNode (location: (1,0)-(3,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CaseMatchNode (location: (1,0)-(3,3)) - ├── flags: newline - ├── predicate: - │ @ SymbolNode (location: (1,5)-(1,7)) - │ ├── flags: static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (1,5)-(1,6) = ":" - │ ├── value_loc: (1,6)-(1,7) = "a" - │ ├── closing_loc: ∅ - │ └── unescaped: "a" - ├── conditions: (length: 1) - │ └── @ InNode (location: (2,0)-(2,18)) - │ ├── flags: ∅ - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (2,3)-(2,9)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ SymbolNode (location: (2,3)-(2,5)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (2,3)-(2,4) = ":" - │ │ │ ├── value_loc: (2,4)-(2,5) = "b" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "b" - │ │ ├── rest: - │ │ │ @ SplatNode (location: (2,7)-(2,9)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (2,7)-(2,8) = "*" - │ │ │ └── expression: - │ │ │ @ LocalVariableTargetNode (location: (2,8)-(2,9)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :_ - │ │ │ └── depth: 0 - │ │ ├── posts: (length: 0) - │ │ ├── opening_loc: ∅ - │ │ └── closing_loc: ∅ - │ ├── statements: - │ │ @ StatementsNode (location: (2,15)-(2,18)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ NilNode (location: (2,15)-(2,18)) - │ │ └── flags: newline, static_literal - │ ├── in_loc: (2,0)-(2,2) = "in" - │ └── then_loc: (2,10)-(2,14) = "then" - ├── else_clause: ∅ - ├── case_keyword_loc: (1,0)-(1,4) = "case" - └── end_keyword_loc: (3,0)-(3,3) = "end" diff --git a/test/prism/snapshots/seattlerb/case_in_42_2.txt b/test/prism/snapshots/seattlerb/case_in_42_2.txt deleted file mode 100644 index e16df21fa27460..00000000000000 --- a/test/prism/snapshots/seattlerb/case_in_42_2.txt +++ /dev/null @@ -1,50 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,3)) -├── flags: ∅ -├── locals: [:list] -└── statements: - @ StatementsNode (location: (1,0)-(3,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CaseMatchNode (location: (1,0)-(3,3)) - ├── flags: newline - ├── predicate: - │ @ SymbolNode (location: (1,5)-(1,7)) - │ ├── flags: static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (1,5)-(1,6) = ":" - │ ├── value_loc: (1,6)-(1,7) = "a" - │ ├── closing_loc: ∅ - │ └── unescaped: "a" - ├── conditions: (length: 1) - │ └── @ InNode (location: (2,0)-(2,20)) - │ ├── flags: ∅ - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (2,3)-(2,11)) - │ │ ├── flags: ∅ - │ │ ├── constant: - │ │ │ @ ConstantReadNode (location: (2,3)-(2,4)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :A - │ │ ├── requireds: (length: 0) - │ │ ├── rest: - │ │ │ @ SplatNode (location: (2,5)-(2,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (2,5)-(2,6) = "*" - │ │ │ └── expression: - │ │ │ @ LocalVariableTargetNode (location: (2,6)-(2,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :list - │ │ │ └── depth: 0 - │ │ ├── posts: (length: 0) - │ │ ├── opening_loc: (2,4)-(2,5) = "(" - │ │ └── closing_loc: (2,10)-(2,11) = ")" - │ ├── statements: - │ │ @ StatementsNode (location: (2,17)-(2,20)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ NilNode (location: (2,17)-(2,20)) - │ │ └── flags: newline, static_literal - │ ├── in_loc: (2,0)-(2,2) = "in" - │ └── then_loc: (2,12)-(2,16) = "then" - ├── else_clause: ∅ - ├── case_keyword_loc: (1,0)-(1,4) = "case" - └── end_keyword_loc: (3,0)-(3,3) = "end" diff --git a/test/prism/snapshots/seattlerb/case_in_47.txt b/test/prism/snapshots/seattlerb/case_in_47.txt deleted file mode 100644 index ee11204f615927..00000000000000 --- a/test/prism/snapshots/seattlerb/case_in_47.txt +++ /dev/null @@ -1,59 +0,0 @@ -@ ProgramNode (location: (1,0)-(4,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(4,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CaseMatchNode (location: (1,0)-(4,3)) - ├── flags: newline - ├── predicate: - │ @ SymbolNode (location: (1,5)-(1,7)) - │ ├── flags: static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (1,5)-(1,6) = ":" - │ ├── value_loc: (1,6)-(1,7) = "a" - │ ├── closing_loc: ∅ - │ └── unescaped: "a" - ├── conditions: (length: 1) - │ └── @ InNode (location: (2,0)-(3,4)) - │ ├── flags: ∅ - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (2,3)-(2,14)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── rest: - │ │ │ @ SplatNode (location: (2,4)-(2,5)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (2,4)-(2,5) = "*" - │ │ │ └── expression: ∅ - │ │ ├── posts: (length: 2) - │ │ │ ├── @ SymbolNode (location: (2,7)-(2,9)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: (2,7)-(2,8) = ":" - │ │ │ │ ├── value_loc: (2,8)-(2,9) = "b" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "b" - │ │ │ └── @ SymbolNode (location: (2,11)-(2,13)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (2,11)-(2,12) = ":" - │ │ │ ├── value_loc: (2,12)-(2,13) = "c" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "c" - │ │ ├── opening_loc: (2,3)-(2,4) = "[" - │ │ └── closing_loc: (2,13)-(2,14) = "]" - │ ├── statements: - │ │ @ StatementsNode (location: (3,2)-(3,4)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ SymbolNode (location: (3,2)-(3,4)) - │ │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (3,2)-(3,3) = ":" - │ │ ├── value_loc: (3,3)-(3,4) = "d" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "d" - │ ├── in_loc: (2,0)-(2,2) = "in" - │ └── then_loc: ∅ - ├── else_clause: ∅ - ├── case_keyword_loc: (1,0)-(1,4) = "case" - └── end_keyword_loc: (4,0)-(4,3) = "end" diff --git a/test/prism/snapshots/seattlerb/case_in_67.txt b/test/prism/snapshots/seattlerb/case_in_67.txt deleted file mode 100644 index 103277a39d91db..00000000000000 --- a/test/prism/snapshots/seattlerb/case_in_67.txt +++ /dev/null @@ -1,39 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CaseMatchNode (location: (1,0)-(3,3)) - ├── flags: newline - ├── predicate: - │ @ SymbolNode (location: (1,5)-(1,7)) - │ ├── flags: static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (1,5)-(1,6) = ":" - │ ├── value_loc: (1,6)-(1,7) = "a" - │ ├── closing_loc: ∅ - │ └── unescaped: "a" - ├── conditions: (length: 1) - │ └── @ InNode (location: (2,0)-(2,15)) - │ ├── flags: ∅ - │ ├── pattern: - │ │ @ RangeNode (location: (2,3)-(2,6)) - │ │ ├── flags: static_literal - │ │ ├── left: - │ │ │ @ IntegerNode (location: (2,3)-(2,4)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── right: ∅ - │ │ └── operator_loc: (2,4)-(2,6) = ".." - │ ├── statements: - │ │ @ StatementsNode (location: (2,12)-(2,15)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ NilNode (location: (2,12)-(2,15)) - │ │ └── flags: newline, static_literal - │ ├── in_loc: (2,0)-(2,2) = "in" - │ └── then_loc: (2,7)-(2,11) = "then" - ├── else_clause: ∅ - ├── case_keyword_loc: (1,0)-(1,4) = "case" - └── end_keyword_loc: (3,0)-(3,3) = "end" diff --git a/test/prism/snapshots/seattlerb/case_in_86.txt b/test/prism/snapshots/seattlerb/case_in_86.txt deleted file mode 100644 index b163ae64e4f4bd..00000000000000 --- a/test/prism/snapshots/seattlerb/case_in_86.txt +++ /dev/null @@ -1,60 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CaseMatchNode (location: (1,0)-(3,3)) - ├── flags: newline - ├── predicate: - │ @ ArrayNode (location: (1,5)-(1,13)) - │ ├── flags: static_literal - │ ├── elements: (length: 2) - │ │ ├── @ SymbolNode (location: (1,6)-(1,8)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (1,6)-(1,7) = ":" - │ │ │ ├── value_loc: (1,7)-(1,8) = "a" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "a" - │ │ └── @ SymbolNode (location: (1,10)-(1,12)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (1,10)-(1,11) = ":" - │ │ ├── value_loc: (1,11)-(1,12) = "b" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "b" - │ ├── opening_loc: (1,5)-(1,6) = "[" - │ └── closing_loc: (1,12)-(1,13) = "]" - ├── conditions: (length: 1) - │ └── @ InNode (location: (2,0)-(2,25)) - │ ├── flags: ∅ - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (2,3)-(2,16)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ ConstantPathNode (location: (2,3)-(2,13)) - │ │ │ ├── flags: ∅ - │ │ │ ├── parent: ∅ - │ │ │ ├── name: :NilClass - │ │ │ ├── delimiter_loc: (2,3)-(2,5) = "::" - │ │ │ └── name_loc: (2,5)-(2,13) = "NilClass" - │ │ ├── rest: - │ │ │ @ SplatNode (location: (2,15)-(2,16)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (2,15)-(2,16) = "*" - │ │ │ └── expression: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── opening_loc: ∅ - │ │ └── closing_loc: ∅ - │ ├── statements: - │ │ @ StatementsNode (location: (2,22)-(2,25)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ NilNode (location: (2,22)-(2,25)) - │ │ └── flags: newline, static_literal - │ ├── in_loc: (2,0)-(2,2) = "in" - │ └── then_loc: (2,17)-(2,21) = "then" - ├── else_clause: ∅ - ├── case_keyword_loc: (1,0)-(1,4) = "case" - └── end_keyword_loc: (3,0)-(3,3) = "end" diff --git a/test/prism/snapshots/seattlerb/case_in_86_2.txt b/test/prism/snapshots/seattlerb/case_in_86_2.txt deleted file mode 100644 index bf6b2ff53da8dd..00000000000000 --- a/test/prism/snapshots/seattlerb/case_in_86_2.txt +++ /dev/null @@ -1,60 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CaseMatchNode (location: (1,0)-(3,3)) - ├── flags: newline - ├── predicate: - │ @ ArrayNode (location: (1,5)-(1,13)) - │ ├── flags: static_literal - │ ├── elements: (length: 2) - │ │ ├── @ SymbolNode (location: (1,6)-(1,8)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (1,6)-(1,7) = ":" - │ │ │ ├── value_loc: (1,7)-(1,8) = "a" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "a" - │ │ └── @ SymbolNode (location: (1,10)-(1,12)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (1,10)-(1,11) = ":" - │ │ ├── value_loc: (1,11)-(1,12) = "b" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "b" - │ ├── opening_loc: (1,5)-(1,6) = "[" - │ └── closing_loc: (1,12)-(1,13) = "]" - ├── conditions: (length: 1) - │ └── @ InNode (location: (2,0)-(2,25)) - │ ├── flags: ∅ - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (2,3)-(2,16)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── rest: - │ │ │ @ SplatNode (location: (2,3)-(2,4)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (2,3)-(2,4) = "*" - │ │ │ └── expression: ∅ - │ │ ├── posts: (length: 1) - │ │ │ └── @ ConstantPathNode (location: (2,6)-(2,16)) - │ │ │ ├── flags: ∅ - │ │ │ ├── parent: ∅ - │ │ │ ├── name: :NilClass - │ │ │ ├── delimiter_loc: (2,6)-(2,8) = "::" - │ │ │ └── name_loc: (2,8)-(2,16) = "NilClass" - │ │ ├── opening_loc: ∅ - │ │ └── closing_loc: ∅ - │ ├── statements: - │ │ @ StatementsNode (location: (2,22)-(2,25)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ NilNode (location: (2,22)-(2,25)) - │ │ └── flags: newline, static_literal - │ ├── in_loc: (2,0)-(2,2) = "in" - │ └── then_loc: (2,17)-(2,21) = "then" - ├── else_clause: ∅ - ├── case_keyword_loc: (1,0)-(1,4) = "case" - └── end_keyword_loc: (3,0)-(3,3) = "end" diff --git a/test/prism/snapshots/seattlerb/case_in_array_pat_const.txt b/test/prism/snapshots/seattlerb/case_in_array_pat_const.txt deleted file mode 100644 index c0aae6a723b710..00000000000000 --- a/test/prism/snapshots/seattlerb/case_in_array_pat_const.txt +++ /dev/null @@ -1,50 +0,0 @@ -@ ProgramNode (location: (1,0)-(4,3)) -├── flags: ∅ -├── locals: [:c] -└── statements: - @ StatementsNode (location: (1,0)-(4,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CaseMatchNode (location: (1,0)-(4,3)) - ├── flags: newline - ├── predicate: - │ @ SymbolNode (location: (1,5)-(1,7)) - │ ├── flags: static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (1,5)-(1,6) = ":" - │ ├── value_loc: (1,6)-(1,7) = "a" - │ ├── closing_loc: ∅ - │ └── unescaped: "a" - ├── conditions: (length: 1) - │ └── @ InNode (location: (2,0)-(3,4)) - │ ├── flags: ∅ - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (2,3)-(2,7)) - │ │ ├── flags: ∅ - │ │ ├── constant: - │ │ │ @ ConstantReadNode (location: (2,3)-(2,4)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :B - │ │ ├── requireds: (length: 1) - │ │ │ └── @ LocalVariableTargetNode (location: (2,5)-(2,6)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :c - │ │ │ └── depth: 0 - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── opening_loc: (2,4)-(2,5) = "[" - │ │ └── closing_loc: (2,6)-(2,7) = "]" - │ ├── statements: - │ │ @ StatementsNode (location: (3,2)-(3,4)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ SymbolNode (location: (3,2)-(3,4)) - │ │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (3,2)-(3,3) = ":" - │ │ ├── value_loc: (3,3)-(3,4) = "d" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "d" - │ ├── in_loc: (2,0)-(2,2) = "in" - │ └── then_loc: ∅ - ├── else_clause: ∅ - ├── case_keyword_loc: (1,0)-(1,4) = "case" - └── end_keyword_loc: (4,0)-(4,3) = "end" diff --git a/test/prism/snapshots/seattlerb/case_in_array_pat_const2.txt b/test/prism/snapshots/seattlerb/case_in_array_pat_const2.txt deleted file mode 100644 index 7739dde6287406..00000000000000 --- a/test/prism/snapshots/seattlerb/case_in_array_pat_const2.txt +++ /dev/null @@ -1,56 +0,0 @@ -@ ProgramNode (location: (1,0)-(4,3)) -├── flags: ∅ -├── locals: [:d] -└── statements: - @ StatementsNode (location: (1,0)-(4,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CaseMatchNode (location: (1,0)-(4,3)) - ├── flags: newline - ├── predicate: - │ @ SymbolNode (location: (1,5)-(1,7)) - │ ├── flags: static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (1,5)-(1,6) = ":" - │ ├── value_loc: (1,6)-(1,7) = "a" - │ ├── closing_loc: ∅ - │ └── unescaped: "a" - ├── conditions: (length: 1) - │ └── @ InNode (location: (2,0)-(3,4)) - │ ├── flags: ∅ - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (2,3)-(2,10)) - │ │ ├── flags: ∅ - │ │ ├── constant: - │ │ │ @ ConstantPathNode (location: (2,3)-(2,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── parent: - │ │ │ │ @ ConstantReadNode (location: (2,3)-(2,4)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :B - │ │ │ ├── name: :C - │ │ │ ├── delimiter_loc: (2,4)-(2,6) = "::" - │ │ │ └── name_loc: (2,6)-(2,7) = "C" - │ │ ├── requireds: (length: 1) - │ │ │ └── @ LocalVariableTargetNode (location: (2,8)-(2,9)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :d - │ │ │ └── depth: 0 - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── opening_loc: (2,7)-(2,8) = "[" - │ │ └── closing_loc: (2,9)-(2,10) = "]" - │ ├── statements: - │ │ @ StatementsNode (location: (3,2)-(3,4)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ SymbolNode (location: (3,2)-(3,4)) - │ │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (3,2)-(3,3) = ":" - │ │ ├── value_loc: (3,3)-(3,4) = "e" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "e" - │ ├── in_loc: (2,0)-(2,2) = "in" - │ └── then_loc: ∅ - ├── else_clause: ∅ - ├── case_keyword_loc: (1,0)-(1,4) = "case" - └── end_keyword_loc: (4,0)-(4,3) = "end" diff --git a/test/prism/snapshots/seattlerb/case_in_array_pat_paren_assign.txt b/test/prism/snapshots/seattlerb/case_in_array_pat_paren_assign.txt deleted file mode 100644 index e34cac73c4e5fc..00000000000000 --- a/test/prism/snapshots/seattlerb/case_in_array_pat_paren_assign.txt +++ /dev/null @@ -1,58 +0,0 @@ -@ ProgramNode (location: (1,0)-(4,3)) -├── flags: ∅ -├── locals: [:d] -└── statements: - @ StatementsNode (location: (1,0)-(4,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CaseMatchNode (location: (1,0)-(4,3)) - ├── flags: newline - ├── predicate: - │ @ SymbolNode (location: (1,5)-(1,7)) - │ ├── flags: static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (1,5)-(1,6) = ":" - │ ├── value_loc: (1,6)-(1,7) = "a" - │ ├── closing_loc: ∅ - │ └── unescaped: "a" - ├── conditions: (length: 1) - │ └── @ InNode (location: (2,0)-(3,4)) - │ ├── flags: ∅ - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (2,3)-(2,12)) - │ │ ├── flags: ∅ - │ │ ├── constant: - │ │ │ @ ConstantReadNode (location: (2,3)-(2,4)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :B - │ │ ├── requireds: (length: 1) - │ │ │ └── @ CapturePatternNode (location: (2,5)-(2,11)) - │ │ │ ├── flags: ∅ - │ │ │ ├── value: - │ │ │ │ @ ConstantReadNode (location: (2,5)-(2,6)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :C - │ │ │ ├── target: - │ │ │ │ @ LocalVariableTargetNode (location: (2,10)-(2,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :d - │ │ │ │ └── depth: 0 - │ │ │ └── operator_loc: (2,7)-(2,9) = "=>" - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── opening_loc: (2,4)-(2,5) = "(" - │ │ └── closing_loc: (2,11)-(2,12) = ")" - │ ├── statements: - │ │ @ StatementsNode (location: (3,2)-(3,4)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ SymbolNode (location: (3,2)-(3,4)) - │ │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (3,2)-(3,3) = ":" - │ │ ├── value_loc: (3,3)-(3,4) = "d" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "d" - │ ├── in_loc: (2,0)-(2,2) = "in" - │ └── then_loc: ∅ - ├── else_clause: ∅ - ├── case_keyword_loc: (1,0)-(1,4) = "case" - └── end_keyword_loc: (4,0)-(4,3) = "end" diff --git a/test/prism/snapshots/seattlerb/case_in_const.txt b/test/prism/snapshots/seattlerb/case_in_const.txt deleted file mode 100644 index 49097d26dfd638..00000000000000 --- a/test/prism/snapshots/seattlerb/case_in_const.txt +++ /dev/null @@ -1,35 +0,0 @@ -@ ProgramNode (location: (1,0)-(4,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(4,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CaseMatchNode (location: (1,0)-(4,3)) - ├── flags: newline - ├── predicate: - │ @ ConstantReadNode (location: (1,5)-(1,10)) - │ ├── flags: ∅ - │ └── name: :Array - ├── conditions: (length: 1) - │ └── @ InNode (location: (2,0)-(3,4)) - │ ├── flags: ∅ - │ ├── pattern: - │ │ @ ConstantReadNode (location: (2,3)-(2,8)) - │ │ ├── flags: ∅ - │ │ └── name: :Class - │ ├── statements: - │ │ @ StatementsNode (location: (3,2)-(3,4)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ SymbolNode (location: (3,2)-(3,4)) - │ │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (3,2)-(3,3) = ":" - │ │ ├── value_loc: (3,3)-(3,4) = "b" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "b" - │ ├── in_loc: (2,0)-(2,2) = "in" - │ └── then_loc: ∅ - ├── else_clause: ∅ - ├── case_keyword_loc: (1,0)-(1,4) = "case" - └── end_keyword_loc: (4,0)-(4,3) = "end" diff --git a/test/prism/snapshots/seattlerb/case_in_else.txt b/test/prism/snapshots/seattlerb/case_in_else.txt deleted file mode 100644 index e0cdf5125c004f..00000000000000 --- a/test/prism/snapshots/seattlerb/case_in_else.txt +++ /dev/null @@ -1,49 +0,0 @@ -@ ProgramNode (location: (1,0)-(6,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(6,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CaseMatchNode (location: (1,0)-(6,3)) - ├── flags: newline - ├── predicate: - │ @ ConstantReadNode (location: (1,5)-(1,10)) - │ ├── flags: ∅ - │ └── name: :Array - ├── conditions: (length: 1) - │ └── @ InNode (location: (2,0)-(3,4)) - │ ├── flags: ∅ - │ ├── pattern: - │ │ @ ConstantReadNode (location: (2,3)-(2,8)) - │ │ ├── flags: ∅ - │ │ └── name: :Class - │ ├── statements: - │ │ @ StatementsNode (location: (3,2)-(3,4)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ SymbolNode (location: (3,2)-(3,4)) - │ │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (3,2)-(3,3) = ":" - │ │ ├── value_loc: (3,3)-(3,4) = "b" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "b" - │ ├── in_loc: (2,0)-(2,2) = "in" - │ └── then_loc: ∅ - ├── else_clause: - │ @ ElseNode (location: (4,0)-(6,3)) - │ ├── flags: ∅ - │ ├── else_keyword_loc: (4,0)-(4,4) = "else" - │ ├── statements: - │ │ @ StatementsNode (location: (5,2)-(5,4)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ SymbolNode (location: (5,2)-(5,4)) - │ │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (5,2)-(5,3) = ":" - │ │ ├── value_loc: (5,3)-(5,4) = "c" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "c" - │ └── end_keyword_loc: (6,0)-(6,3) = "end" - ├── case_keyword_loc: (1,0)-(1,4) = "case" - └── end_keyword_loc: (6,0)-(6,3) = "end" diff --git a/test/prism/snapshots/seattlerb/case_in_find.txt b/test/prism/snapshots/seattlerb/case_in_find.txt deleted file mode 100644 index c6337d7c85073b..00000000000000 --- a/test/prism/snapshots/seattlerb/case_in_find.txt +++ /dev/null @@ -1,56 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,3)) -├── flags: ∅ -├── locals: [:a, :b] -└── statements: - @ StatementsNode (location: (1,0)-(3,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CaseMatchNode (location: (1,0)-(3,3)) - ├── flags: newline - ├── predicate: - │ @ SymbolNode (location: (1,5)-(1,7)) - │ ├── flags: static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (1,5)-(1,6) = ":" - │ ├── value_loc: (1,6)-(1,7) = "a" - │ ├── closing_loc: ∅ - │ └── unescaped: "a" - ├── conditions: (length: 1) - │ └── @ InNode (location: (2,2)-(2,15)) - │ ├── flags: ∅ - │ ├── pattern: - │ │ @ FindPatternNode (location: (2,5)-(2,15)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── left: - │ │ │ @ SplatNode (location: (2,5)-(2,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (2,5)-(2,6) = "*" - │ │ │ └── expression: - │ │ │ @ LocalVariableTargetNode (location: (2,6)-(2,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :a - │ │ │ └── depth: 0 - │ │ ├── requireds: (length: 1) - │ │ │ └── @ SymbolNode (location: (2,9)-(2,11)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (2,9)-(2,10) = ":" - │ │ │ ├── value_loc: (2,10)-(2,11) = "+" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "+" - │ │ ├── right: - │ │ │ @ SplatNode (location: (2,13)-(2,15)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (2,13)-(2,14) = "*" - │ │ │ └── expression: - │ │ │ @ LocalVariableTargetNode (location: (2,14)-(2,15)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :b - │ │ │ └── depth: 0 - │ │ ├── opening_loc: ∅ - │ │ └── closing_loc: ∅ - │ ├── statements: ∅ - │ ├── in_loc: (2,2)-(2,4) = "in" - │ └── then_loc: ∅ - ├── else_clause: ∅ - ├── case_keyword_loc: (1,0)-(1,4) = "case" - └── end_keyword_loc: (3,0)-(3,3) = "end" diff --git a/test/prism/snapshots/seattlerb/case_in_find_array.txt b/test/prism/snapshots/seattlerb/case_in_find_array.txt deleted file mode 100644 index 986925904f4001..00000000000000 --- a/test/prism/snapshots/seattlerb/case_in_find_array.txt +++ /dev/null @@ -1,52 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,3)) -├── flags: ∅ -├── locals: [:c] -└── statements: - @ StatementsNode (location: (1,0)-(3,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CaseMatchNode (location: (1,0)-(3,3)) - ├── flags: newline - ├── predicate: - │ @ SymbolNode (location: (1,5)-(1,7)) - │ ├── flags: static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (1,5)-(1,6) = ":" - │ ├── value_loc: (1,6)-(1,7) = "a" - │ ├── closing_loc: ∅ - │ └── unescaped: "a" - ├── conditions: (length: 1) - │ └── @ InNode (location: (2,0)-(2,16)) - │ ├── flags: ∅ - │ ├── pattern: - │ │ @ FindPatternNode (location: (2,3)-(2,16)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── left: - │ │ │ @ SplatNode (location: (2,4)-(2,5)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (2,4)-(2,5) = "*" - │ │ │ └── expression: ∅ - │ │ ├── requireds: (length: 2) - │ │ │ ├── @ SymbolNode (location: (2,7)-(2,9)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: (2,7)-(2,8) = ":" - │ │ │ │ ├── value_loc: (2,8)-(2,9) = "b" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "b" - │ │ │ └── @ LocalVariableTargetNode (location: (2,11)-(2,12)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :c - │ │ │ └── depth: 0 - │ │ ├── right: - │ │ │ @ SplatNode (location: (2,14)-(2,15)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (2,14)-(2,15) = "*" - │ │ │ └── expression: ∅ - │ │ ├── opening_loc: (2,3)-(2,4) = "[" - │ │ └── closing_loc: (2,15)-(2,16) = "]" - │ ├── statements: ∅ - │ ├── in_loc: (2,0)-(2,2) = "in" - │ └── then_loc: ∅ - ├── else_clause: ∅ - ├── case_keyword_loc: (1,0)-(1,4) = "case" - └── end_keyword_loc: (3,0)-(3,3) = "end" diff --git a/test/prism/snapshots/seattlerb/case_in_hash_pat.txt b/test/prism/snapshots/seattlerb/case_in_hash_pat.txt deleted file mode 100644 index e3f62d026e7d55..00000000000000 --- a/test/prism/snapshots/seattlerb/case_in_hash_pat.txt +++ /dev/null @@ -1,76 +0,0 @@ -@ ProgramNode (location: (1,0)-(4,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(4,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CaseMatchNode (location: (1,0)-(4,3)) - ├── flags: newline - ├── predicate: - │ @ SymbolNode (location: (1,5)-(1,7)) - │ ├── flags: static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (1,5)-(1,6) = ":" - │ ├── value_loc: (1,6)-(1,7) = "a" - │ ├── closing_loc: ∅ - │ └── unescaped: "a" - ├── conditions: (length: 1) - │ └── @ InNode (location: (2,0)-(3,4)) - │ ├── flags: ∅ - │ ├── pattern: - │ │ @ HashPatternNode (location: (2,3)-(2,21)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── elements: (length: 2) - │ │ │ ├── @ AssocNode (location: (2,5)-(2,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── key: - │ │ │ │ │ @ SymbolNode (location: (2,5)-(2,7)) - │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── value_loc: (2,5)-(2,6) = "b" - │ │ │ │ │ ├── closing_loc: (2,6)-(2,7) = ":" - │ │ │ │ │ └── unescaped: "b" - │ │ │ │ ├── value: - │ │ │ │ │ @ StringNode (location: (2,8)-(2,11)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── opening_loc: (2,8)-(2,9) = "'" - │ │ │ │ │ ├── content_loc: (2,9)-(2,10) = "c" - │ │ │ │ │ ├── closing_loc: (2,10)-(2,11) = "'" - │ │ │ │ │ └── unescaped: "c" - │ │ │ │ └── operator_loc: ∅ - │ │ │ └── @ AssocNode (location: (2,13)-(2,19)) - │ │ │ ├── flags: ∅ - │ │ │ ├── key: - │ │ │ │ @ SymbolNode (location: (2,13)-(2,15)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── value_loc: (2,13)-(2,14) = "d" - │ │ │ │ ├── closing_loc: (2,14)-(2,15) = ":" - │ │ │ │ └── unescaped: "d" - │ │ │ ├── value: - │ │ │ │ @ StringNode (location: (2,16)-(2,19)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── opening_loc: (2,16)-(2,17) = "\"" - │ │ │ │ ├── content_loc: (2,17)-(2,18) = "e" - │ │ │ │ ├── closing_loc: (2,18)-(2,19) = "\"" - │ │ │ │ └── unescaped: "e" - │ │ │ └── operator_loc: ∅ - │ │ ├── rest: ∅ - │ │ ├── opening_loc: (2,3)-(2,4) = "{" - │ │ └── closing_loc: (2,20)-(2,21) = "}" - │ ├── statements: - │ │ @ StatementsNode (location: (3,2)-(3,4)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ SymbolNode (location: (3,2)-(3,4)) - │ │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (3,2)-(3,3) = ":" - │ │ ├── value_loc: (3,3)-(3,4) = "f" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "f" - │ ├── in_loc: (2,0)-(2,2) = "in" - │ └── then_loc: (2,22)-(2,26) = "then" - ├── else_clause: ∅ - ├── case_keyword_loc: (1,0)-(1,4) = "case" - └── end_keyword_loc: (4,0)-(4,3) = "end" diff --git a/test/prism/snapshots/seattlerb/case_in_hash_pat_assign.txt b/test/prism/snapshots/seattlerb/case_in_hash_pat_assign.txt deleted file mode 100644 index 483c932680991b..00000000000000 --- a/test/prism/snapshots/seattlerb/case_in_hash_pat_assign.txt +++ /dev/null @@ -1,100 +0,0 @@ -@ ProgramNode (location: (1,0)-(4,3)) -├── flags: ∅ -├── locals: [:x, :f] -└── statements: - @ StatementsNode (location: (1,0)-(4,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CaseMatchNode (location: (1,0)-(4,3)) - ├── flags: newline - ├── predicate: - │ @ SymbolNode (location: (1,5)-(1,7)) - │ ├── flags: static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (1,5)-(1,6) = ":" - │ ├── value_loc: (1,6)-(1,7) = "a" - │ ├── closing_loc: ∅ - │ └── unescaped: "a" - ├── conditions: (length: 1) - │ └── @ InNode (location: (2,0)-(3,4)) - │ ├── flags: ∅ - │ ├── pattern: - │ │ @ HashPatternNode (location: (2,3)-(2,34)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── elements: (length: 3) - │ │ │ ├── @ AssocNode (location: (2,5)-(2,20)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── key: - │ │ │ │ │ @ SymbolNode (location: (2,5)-(2,7)) - │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── value_loc: (2,5)-(2,6) = "b" - │ │ │ │ │ ├── closing_loc: (2,6)-(2,7) = ":" - │ │ │ │ │ └── unescaped: "b" - │ │ │ │ ├── value: - │ │ │ │ │ @ CapturePatternNode (location: (2,8)-(2,20)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── value: - │ │ │ │ │ │ @ ConstantReadNode (location: (2,8)-(2,15)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ └── name: :Integer - │ │ │ │ │ ├── target: - │ │ │ │ │ │ @ LocalVariableTargetNode (location: (2,19)-(2,20)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ ├── name: :x - │ │ │ │ │ │ └── depth: 0 - │ │ │ │ │ └── operator_loc: (2,16)-(2,18) = "=>" - │ │ │ │ └── operator_loc: ∅ - │ │ │ ├── @ AssocNode (location: (2,22)-(2,28)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── key: - │ │ │ │ │ @ SymbolNode (location: (2,22)-(2,24)) - │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── value_loc: (2,22)-(2,23) = "d" - │ │ │ │ │ ├── closing_loc: (2,23)-(2,24) = ":" - │ │ │ │ │ └── unescaped: "d" - │ │ │ │ ├── value: - │ │ │ │ │ @ StringNode (location: (2,25)-(2,28)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── opening_loc: (2,25)-(2,26) = "\"" - │ │ │ │ │ ├── content_loc: (2,26)-(2,27) = "e" - │ │ │ │ │ ├── closing_loc: (2,27)-(2,28) = "\"" - │ │ │ │ │ └── unescaped: "e" - │ │ │ │ └── operator_loc: ∅ - │ │ │ └── @ AssocNode (location: (2,30)-(2,32)) - │ │ │ ├── flags: ∅ - │ │ │ ├── key: - │ │ │ │ @ SymbolNode (location: (2,30)-(2,32)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── value_loc: (2,30)-(2,31) = "f" - │ │ │ │ ├── closing_loc: (2,31)-(2,32) = ":" - │ │ │ │ └── unescaped: "f" - │ │ │ ├── value: - │ │ │ │ @ ImplicitNode (location: (2,30)-(2,31)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── value: - │ │ │ │ @ LocalVariableTargetNode (location: (2,30)-(2,31)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :f - │ │ │ │ └── depth: 0 - │ │ │ └── operator_loc: ∅ - │ │ ├── rest: ∅ - │ │ ├── opening_loc: (2,3)-(2,4) = "{" - │ │ └── closing_loc: (2,33)-(2,34) = "}" - │ ├── statements: - │ │ @ StatementsNode (location: (3,2)-(3,4)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ SymbolNode (location: (3,2)-(3,4)) - │ │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (3,2)-(3,3) = ":" - │ │ ├── value_loc: (3,3)-(3,4) = "g" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "g" - │ ├── in_loc: (2,0)-(2,2) = "in" - │ └── then_loc: (2,35)-(2,39) = "then" - ├── else_clause: ∅ - ├── case_keyword_loc: (1,0)-(1,4) = "case" - └── end_keyword_loc: (4,0)-(4,3) = "end" diff --git a/test/prism/snapshots/seattlerb/case_in_hash_pat_paren_assign.txt b/test/prism/snapshots/seattlerb/case_in_hash_pat_paren_assign.txt deleted file mode 100644 index b6e809326a15cf..00000000000000 --- a/test/prism/snapshots/seattlerb/case_in_hash_pat_paren_assign.txt +++ /dev/null @@ -1,59 +0,0 @@ -@ ProgramNode (location: (1,0)-(4,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(4,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CaseMatchNode (location: (1,0)-(4,3)) - ├── flags: newline - ├── predicate: - │ @ SymbolNode (location: (1,5)-(1,7)) - │ ├── flags: static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (1,5)-(1,6) = ":" - │ ├── value_loc: (1,6)-(1,7) = "a" - │ ├── closing_loc: ∅ - │ └── unescaped: "a" - ├── conditions: (length: 1) - │ └── @ InNode (location: (2,0)-(3,4)) - │ ├── flags: ∅ - │ ├── pattern: - │ │ @ HashPatternNode (location: (2,3)-(2,11)) - │ │ ├── flags: ∅ - │ │ ├── constant: - │ │ │ @ ConstantReadNode (location: (2,3)-(2,4)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :B - │ │ ├── elements: (length: 1) - │ │ │ └── @ AssocNode (location: (2,5)-(2,10)) - │ │ │ ├── flags: static_literal - │ │ │ ├── key: - │ │ │ │ @ SymbolNode (location: (2,5)-(2,7)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── value_loc: (2,5)-(2,6) = "a" - │ │ │ │ ├── closing_loc: (2,6)-(2,7) = ":" - │ │ │ │ └── unescaped: "a" - │ │ │ ├── value: - │ │ │ │ @ IntegerNode (location: (2,8)-(2,10)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 42 - │ │ │ └── operator_loc: ∅ - │ │ ├── rest: ∅ - │ │ ├── opening_loc: (2,4)-(2,5) = "(" - │ │ └── closing_loc: (2,10)-(2,11) = ")" - │ ├── statements: - │ │ @ StatementsNode (location: (3,2)-(3,4)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ SymbolNode (location: (3,2)-(3,4)) - │ │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (3,2)-(3,3) = ":" - │ │ ├── value_loc: (3,3)-(3,4) = "d" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "d" - │ ├── in_loc: (2,0)-(2,2) = "in" - │ └── then_loc: ∅ - ├── else_clause: ∅ - ├── case_keyword_loc: (1,0)-(1,4) = "case" - └── end_keyword_loc: (4,0)-(4,3) = "end" diff --git a/test/prism/snapshots/seattlerb/case_in_hash_pat_paren_true.txt b/test/prism/snapshots/seattlerb/case_in_hash_pat_paren_true.txt deleted file mode 100644 index a54402103082bb..00000000000000 --- a/test/prism/snapshots/seattlerb/case_in_hash_pat_paren_true.txt +++ /dev/null @@ -1,55 +0,0 @@ -@ ProgramNode (location: (1,0)-(4,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(4,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CaseMatchNode (location: (1,0)-(4,3)) - ├── flags: newline - ├── predicate: - │ @ SymbolNode (location: (1,5)-(1,7)) - │ ├── flags: static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (1,5)-(1,6) = ":" - │ ├── value_loc: (1,6)-(1,7) = "a" - │ ├── closing_loc: ∅ - │ └── unescaped: "a" - ├── conditions: (length: 1) - │ └── @ InNode (location: (2,0)-(3,4)) - │ ├── flags: ∅ - │ ├── pattern: - │ │ @ HashPatternNode (location: (2,3)-(2,10)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── elements: (length: 1) - │ │ │ └── @ AssocNode (location: (2,3)-(2,10)) - │ │ │ ├── flags: static_literal - │ │ │ ├── key: - │ │ │ │ @ SymbolNode (location: (2,3)-(2,5)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── value_loc: (2,3)-(2,4) = "b" - │ │ │ │ ├── closing_loc: (2,4)-(2,5) = ":" - │ │ │ │ └── unescaped: "b" - │ │ │ ├── value: - │ │ │ │ @ TrueNode (location: (2,6)-(2,10)) - │ │ │ │ └── flags: static_literal - │ │ │ └── operator_loc: ∅ - │ │ ├── rest: ∅ - │ │ ├── opening_loc: ∅ - │ │ └── closing_loc: ∅ - │ ├── statements: - │ │ @ StatementsNode (location: (3,2)-(3,4)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ SymbolNode (location: (3,2)-(3,4)) - │ │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (3,2)-(3,3) = ":" - │ │ ├── value_loc: (3,3)-(3,4) = "c" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "c" - │ ├── in_loc: (2,0)-(2,2) = "in" - │ └── then_loc: (2,11)-(2,15) = "then" - ├── else_clause: ∅ - ├── case_keyword_loc: (1,0)-(1,4) = "case" - └── end_keyword_loc: (4,0)-(4,3) = "end" diff --git a/test/prism/snapshots/seattlerb/case_in_hash_pat_rest.txt b/test/prism/snapshots/seattlerb/case_in_hash_pat_rest.txt deleted file mode 100644 index 71f7e126bc1848..00000000000000 --- a/test/prism/snapshots/seattlerb/case_in_hash_pat_rest.txt +++ /dev/null @@ -1,65 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,3)) -├── flags: ∅ -├── locals: [:c, :rest] -└── statements: - @ StatementsNode (location: (1,0)-(3,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CaseMatchNode (location: (1,0)-(3,3)) - ├── flags: newline - ├── predicate: - │ @ SymbolNode (location: (1,5)-(1,7)) - │ ├── flags: static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (1,5)-(1,6) = ":" - │ ├── value_loc: (1,6)-(1,7) = "a" - │ ├── closing_loc: ∅ - │ └── unescaped: "a" - ├── conditions: (length: 1) - │ └── @ InNode (location: (2,0)-(2,23)) - │ ├── flags: ∅ - │ ├── pattern: - │ │ @ HashPatternNode (location: (2,3)-(2,15)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── elements: (length: 1) - │ │ │ └── @ AssocNode (location: (2,3)-(2,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── key: - │ │ │ │ @ SymbolNode (location: (2,3)-(2,5)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── value_loc: (2,3)-(2,4) = "b" - │ │ │ │ ├── closing_loc: (2,4)-(2,5) = ":" - │ │ │ │ └── unescaped: "b" - │ │ │ ├── value: - │ │ │ │ @ LocalVariableTargetNode (location: (2,6)-(2,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :c - │ │ │ │ └── depth: 0 - │ │ │ └── operator_loc: ∅ - │ │ ├── rest: - │ │ │ @ AssocSplatNode (location: (2,9)-(2,15)) - │ │ │ ├── flags: ∅ - │ │ │ ├── value: - │ │ │ │ @ LocalVariableTargetNode (location: (2,11)-(2,15)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :rest - │ │ │ │ └── depth: 0 - │ │ │ └── operator_loc: (2,9)-(2,11) = "**" - │ │ ├── opening_loc: ∅ - │ │ └── closing_loc: ∅ - │ ├── statements: - │ │ @ StatementsNode (location: (2,21)-(2,23)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ SymbolNode (location: (2,21)-(2,23)) - │ │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (2,21)-(2,22) = ":" - │ │ ├── value_loc: (2,22)-(2,23) = "d" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "d" - │ ├── in_loc: (2,0)-(2,2) = "in" - │ └── then_loc: (2,16)-(2,20) = "then" - ├── else_clause: ∅ - ├── case_keyword_loc: (1,0)-(1,4) = "case" - └── end_keyword_loc: (3,0)-(3,3) = "end" diff --git a/test/prism/snapshots/seattlerb/case_in_hash_pat_rest_solo.txt b/test/prism/snapshots/seattlerb/case_in_hash_pat_rest_solo.txt deleted file mode 100644 index 01b324e086c62b..00000000000000 --- a/test/prism/snapshots/seattlerb/case_in_hash_pat_rest_solo.txt +++ /dev/null @@ -1,50 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,3)) -├── flags: ∅ -├── locals: [:rest] -└── statements: - @ StatementsNode (location: (1,0)-(3,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CaseMatchNode (location: (1,0)-(3,3)) - ├── flags: newline - ├── predicate: - │ @ SymbolNode (location: (1,5)-(1,7)) - │ ├── flags: static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (1,5)-(1,6) = ":" - │ ├── value_loc: (1,6)-(1,7) = "a" - │ ├── closing_loc: ∅ - │ └── unescaped: "a" - ├── conditions: (length: 1) - │ └── @ InNode (location: (2,0)-(2,17)) - │ ├── flags: ∅ - │ ├── pattern: - │ │ @ HashPatternNode (location: (2,3)-(2,9)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── elements: (length: 0) - │ │ ├── rest: - │ │ │ @ AssocSplatNode (location: (2,3)-(2,9)) - │ │ │ ├── flags: ∅ - │ │ │ ├── value: - │ │ │ │ @ LocalVariableTargetNode (location: (2,5)-(2,9)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :rest - │ │ │ │ └── depth: 0 - │ │ │ └── operator_loc: (2,3)-(2,5) = "**" - │ │ ├── opening_loc: ∅ - │ │ └── closing_loc: ∅ - │ ├── statements: - │ │ @ StatementsNode (location: (2,15)-(2,17)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ SymbolNode (location: (2,15)-(2,17)) - │ │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (2,15)-(2,16) = ":" - │ │ ├── value_loc: (2,16)-(2,17) = "d" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "d" - │ ├── in_loc: (2,0)-(2,2) = "in" - │ └── then_loc: (2,10)-(2,14) = "then" - ├── else_clause: ∅ - ├── case_keyword_loc: (1,0)-(1,4) = "case" - └── end_keyword_loc: (3,0)-(3,3) = "end" diff --git a/test/prism/snapshots/seattlerb/case_in_if_unless_post_mod.txt b/test/prism/snapshots/seattlerb/case_in_if_unless_post_mod.txt deleted file mode 100644 index 3da03ffbc3fbf3..00000000000000 --- a/test/prism/snapshots/seattlerb/case_in_if_unless_post_mod.txt +++ /dev/null @@ -1,82 +0,0 @@ -@ ProgramNode (location: (1,0)-(6,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(6,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CaseMatchNode (location: (1,0)-(6,3)) - ├── flags: newline - ├── predicate: - │ @ SymbolNode (location: (1,5)-(1,7)) - │ ├── flags: static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (1,5)-(1,6) = ":" - │ ├── value_loc: (1,6)-(1,7) = "a" - │ ├── closing_loc: ∅ - │ └── unescaped: "a" - ├── conditions: (length: 2) - │ ├── @ InNode (location: (2,0)-(3,4)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ IfNode (location: (2,3)-(2,12)) - │ │ │ ├── flags: newline - │ │ │ ├── if_keyword_loc: (2,5)-(2,7) = "if" - │ │ │ ├── predicate: - │ │ │ │ @ TrueNode (location: (2,8)-(2,12)) - │ │ │ │ └── flags: static_literal - │ │ │ ├── then_keyword_loc: ∅ - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (2,3)-(2,4)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ ConstantReadNode (location: (2,3)-(2,4)) - │ │ │ │ ├── flags: newline - │ │ │ │ └── name: :A - │ │ │ ├── subsequent: ∅ - │ │ │ └── end_keyword_loc: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (3,2)-(3,4)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ SymbolNode (location: (3,2)-(3,4)) - │ │ │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (3,2)-(3,3) = ":" - │ │ │ ├── value_loc: (3,3)-(3,4) = "C" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "C" - │ │ ├── in_loc: (2,0)-(2,2) = "in" - │ │ └── then_loc: ∅ - │ └── @ InNode (location: (4,0)-(5,4)) - │ ├── flags: ∅ - │ ├── pattern: - │ │ @ UnlessNode (location: (4,3)-(4,17)) - │ │ ├── flags: newline - │ │ ├── keyword_loc: (4,5)-(4,11) = "unless" - │ │ ├── predicate: - │ │ │ @ FalseNode (location: (4,12)-(4,17)) - │ │ │ └── flags: static_literal - │ │ ├── then_keyword_loc: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (4,3)-(4,4)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ ConstantReadNode (location: (4,3)-(4,4)) - │ │ │ ├── flags: newline - │ │ │ └── name: :D - │ │ ├── else_clause: ∅ - │ │ └── end_keyword_loc: ∅ - │ ├── statements: - │ │ @ StatementsNode (location: (5,2)-(5,4)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ SymbolNode (location: (5,2)-(5,4)) - │ │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (5,2)-(5,3) = ":" - │ │ ├── value_loc: (5,3)-(5,4) = "E" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "E" - │ ├── in_loc: (4,0)-(4,2) = "in" - │ └── then_loc: ∅ - ├── else_clause: ∅ - ├── case_keyword_loc: (1,0)-(1,4) = "case" - └── end_keyword_loc: (6,0)-(6,3) = "end" diff --git a/test/prism/snapshots/seattlerb/case_in_multiple.txt b/test/prism/snapshots/seattlerb/case_in_multiple.txt deleted file mode 100644 index 173136fc6fba8c..00000000000000 --- a/test/prism/snapshots/seattlerb/case_in_multiple.txt +++ /dev/null @@ -1,68 +0,0 @@ -@ ProgramNode (location: (1,0)-(6,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(6,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CaseMatchNode (location: (1,0)-(6,3)) - ├── flags: newline - ├── predicate: - │ @ SymbolNode (location: (1,5)-(1,7)) - │ ├── flags: static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (1,5)-(1,6) = ":" - │ ├── value_loc: (1,6)-(1,7) = "a" - │ ├── closing_loc: ∅ - │ └── unescaped: "a" - ├── conditions: (length: 2) - │ ├── @ InNode (location: (2,0)-(3,4)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ ConstantPathNode (location: (2,3)-(2,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── parent: - │ │ │ │ @ ConstantReadNode (location: (2,3)-(2,4)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :A - │ │ │ ├── name: :B - │ │ │ ├── delimiter_loc: (2,4)-(2,6) = "::" - │ │ │ └── name_loc: (2,6)-(2,7) = "B" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (3,2)-(3,4)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ SymbolNode (location: (3,2)-(3,4)) - │ │ │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (3,2)-(3,3) = ":" - │ │ │ ├── value_loc: (3,3)-(3,4) = "C" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "C" - │ │ ├── in_loc: (2,0)-(2,2) = "in" - │ │ └── then_loc: ∅ - │ └── @ InNode (location: (4,0)-(5,4)) - │ ├── flags: ∅ - │ ├── pattern: - │ │ @ ConstantPathNode (location: (4,3)-(4,7)) - │ │ ├── flags: ∅ - │ │ ├── parent: - │ │ │ @ ConstantReadNode (location: (4,3)-(4,4)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :D - │ │ ├── name: :E - │ │ ├── delimiter_loc: (4,4)-(4,6) = "::" - │ │ └── name_loc: (4,6)-(4,7) = "E" - │ ├── statements: - │ │ @ StatementsNode (location: (5,2)-(5,4)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ SymbolNode (location: (5,2)-(5,4)) - │ │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (5,2)-(5,3) = ":" - │ │ ├── value_loc: (5,3)-(5,4) = "F" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "F" - │ ├── in_loc: (4,0)-(4,2) = "in" - │ └── then_loc: ∅ - ├── else_clause: ∅ - ├── case_keyword_loc: (1,0)-(1,4) = "case" - └── end_keyword_loc: (6,0)-(6,3) = "end" diff --git a/test/prism/snapshots/seattlerb/case_in_or.txt b/test/prism/snapshots/seattlerb/case_in_or.txt deleted file mode 100644 index 7bcf50293d1b70..00000000000000 --- a/test/prism/snapshots/seattlerb/case_in_or.txt +++ /dev/null @@ -1,46 +0,0 @@ -@ ProgramNode (location: (1,0)-(4,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(4,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CaseMatchNode (location: (1,0)-(4,3)) - ├── flags: newline - ├── predicate: - │ @ SymbolNode (location: (1,5)-(1,7)) - │ ├── flags: static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (1,5)-(1,6) = ":" - │ ├── value_loc: (1,6)-(1,7) = "a" - │ ├── closing_loc: ∅ - │ └── unescaped: "a" - ├── conditions: (length: 1) - │ └── @ InNode (location: (2,0)-(3,4)) - │ ├── flags: ∅ - │ ├── pattern: - │ │ @ AlternationPatternNode (location: (2,3)-(2,8)) - │ │ ├── flags: ∅ - │ │ ├── left: - │ │ │ @ ConstantReadNode (location: (2,3)-(2,4)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :B - │ │ ├── right: - │ │ │ @ ConstantReadNode (location: (2,7)-(2,8)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :C - │ │ └── operator_loc: (2,5)-(2,6) = "|" - │ ├── statements: - │ │ @ StatementsNode (location: (3,2)-(3,4)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ SymbolNode (location: (3,2)-(3,4)) - │ │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (3,2)-(3,3) = ":" - │ │ ├── value_loc: (3,3)-(3,4) = "d" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "d" - │ ├── in_loc: (2,0)-(2,2) = "in" - │ └── then_loc: ∅ - ├── else_clause: ∅ - ├── case_keyword_loc: (1,0)-(1,4) = "case" - └── end_keyword_loc: (4,0)-(4,3) = "end" diff --git a/test/prism/snapshots/seattlerb/class_comments.txt b/test/prism/snapshots/seattlerb/class_comments.txt deleted file mode 100644 index 75350722a1ac28..00000000000000 --- a/test/prism/snapshots/seattlerb/class_comments.txt +++ /dev/null @@ -1,37 +0,0 @@ -@ ProgramNode (location: (4,0)-(9,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (4,0)-(9,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ ClassNode (location: (4,0)-(9,3)) - ├── flags: newline - ├── locals: [] - ├── class_keyword_loc: (4,0)-(4,5) = "class" - ├── constant_path: - │ @ ConstantReadNode (location: (4,6)-(4,7)) - │ ├── flags: ∅ - │ └── name: :X - ├── inheritance_operator_loc: ∅ - ├── superclass: ∅ - ├── body: - │ @ StatementsNode (location: (6,2)-(8,5)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ DefNode (location: (6,2)-(8,5)) - │ ├── flags: newline - │ ├── name: :blah - │ ├── name_loc: (6,6)-(6,10) = "blah" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (6,2)-(6,5) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (8,2)-(8,5) = "end" - ├── end_keyword_loc: (9,0)-(9,3) = "end" - └── name: :X diff --git a/test/prism/snapshots/seattlerb/cond_unary_minus.txt b/test/prism/snapshots/seattlerb/cond_unary_minus.txt deleted file mode 100644 index 69a998475e5ae0..00000000000000 --- a/test/prism/snapshots/seattlerb/cond_unary_minus.txt +++ /dev/null @@ -1,18 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,10)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,10)) - ├── flags: ∅ - └── body: (length: 1) - └── @ IfNode (location: (1,0)-(1,10)) - ├── flags: newline - ├── if_keyword_loc: (1,0)-(1,2) = "if" - ├── predicate: - │ @ IntegerNode (location: (1,3)-(1,5)) - │ ├── flags: static_literal, decimal - │ └── value: -1 - ├── then_keyword_loc: ∅ - ├── statements: ∅ - ├── subsequent: ∅ - └── end_keyword_loc: (1,7)-(1,10) = "end" diff --git a/test/prism/snapshots/seattlerb/const_2_op_asgn_or2.txt b/test/prism/snapshots/seattlerb/const_2_op_asgn_or2.txt deleted file mode 100644 index 25d77dac2d5df5..00000000000000 --- a/test/prism/snapshots/seattlerb/const_2_op_asgn_or2.txt +++ /dev/null @@ -1,27 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,12)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,12)) - ├── flags: ∅ - └── body: (length: 1) - └── @ ConstantPathOrWriteNode (location: (1,0)-(1,12)) - ├── flags: newline - ├── target: - │ @ ConstantPathNode (location: (1,0)-(1,6)) - │ ├── flags: ∅ - │ ├── parent: - │ │ @ ConstantPathNode (location: (1,0)-(1,3)) - │ │ ├── flags: ∅ - │ │ ├── parent: ∅ - │ │ ├── name: :X - │ │ ├── delimiter_loc: (1,0)-(1,2) = "::" - │ │ └── name_loc: (1,2)-(1,3) = "X" - │ ├── name: :Y - │ ├── delimiter_loc: (1,3)-(1,5) = "::" - │ └── name_loc: (1,5)-(1,6) = "Y" - ├── operator_loc: (1,7)-(1,10) = "||=" - └── value: - @ IntegerNode (location: (1,11)-(1,12)) - ├── flags: static_literal, decimal - └── value: 1 diff --git a/test/prism/snapshots/seattlerb/const_3_op_asgn_or.txt b/test/prism/snapshots/seattlerb/const_3_op_asgn_or.txt deleted file mode 100644 index dc098bcf23c4e5..00000000000000 --- a/test/prism/snapshots/seattlerb/const_3_op_asgn_or.txt +++ /dev/null @@ -1,21 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,9)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,9)) - ├── flags: ∅ - └── body: (length: 1) - └── @ ConstantPathOrWriteNode (location: (1,0)-(1,9)) - ├── flags: newline - ├── target: - │ @ ConstantPathNode (location: (1,0)-(1,3)) - │ ├── flags: ∅ - │ ├── parent: ∅ - │ ├── name: :X - │ ├── delimiter_loc: (1,0)-(1,2) = "::" - │ └── name_loc: (1,2)-(1,3) = "X" - ├── operator_loc: (1,4)-(1,7) = "||=" - └── value: - @ IntegerNode (location: (1,8)-(1,9)) - ├── flags: static_literal, decimal - └── value: 1 diff --git a/test/prism/snapshots/seattlerb/const_op_asgn_and1.txt b/test/prism/snapshots/seattlerb/const_op_asgn_and1.txt deleted file mode 100644 index 63b8bc190b1447..00000000000000 --- a/test/prism/snapshots/seattlerb/const_op_asgn_and1.txt +++ /dev/null @@ -1,22 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,8)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,8)) - ├── flags: ∅ - └── body: (length: 1) - └── @ ConstantPathOperatorWriteNode (location: (1,0)-(1,8)) - ├── flags: newline - ├── target: - │ @ ConstantPathNode (location: (1,0)-(1,3)) - │ ├── flags: ∅ - │ ├── parent: ∅ - │ ├── name: :X - │ ├── delimiter_loc: (1,0)-(1,2) = "::" - │ └── name_loc: (1,2)-(1,3) = "X" - ├── binary_operator_loc: (1,4)-(1,6) = "&=" - ├── value: - │ @ IntegerNode (location: (1,7)-(1,8)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - └── binary_operator: :& diff --git a/test/prism/snapshots/seattlerb/const_op_asgn_and2.txt b/test/prism/snapshots/seattlerb/const_op_asgn_and2.txt deleted file mode 100644 index c1ac2bcf526132..00000000000000 --- a/test/prism/snapshots/seattlerb/const_op_asgn_and2.txt +++ /dev/null @@ -1,21 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,9)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,9)) - ├── flags: ∅ - └── body: (length: 1) - └── @ ConstantPathAndWriteNode (location: (1,0)-(1,9)) - ├── flags: newline - ├── target: - │ @ ConstantPathNode (location: (1,0)-(1,3)) - │ ├── flags: ∅ - │ ├── parent: ∅ - │ ├── name: :X - │ ├── delimiter_loc: (1,0)-(1,2) = "::" - │ └── name_loc: (1,2)-(1,3) = "X" - ├── operator_loc: (1,4)-(1,7) = "&&=" - └── value: - @ IntegerNode (location: (1,8)-(1,9)) - ├── flags: static_literal, decimal - └── value: 1 diff --git a/test/prism/snapshots/seattlerb/const_op_asgn_or.txt b/test/prism/snapshots/seattlerb/const_op_asgn_or.txt deleted file mode 100644 index 0a53593d123cbe..00000000000000 --- a/test/prism/snapshots/seattlerb/const_op_asgn_or.txt +++ /dev/null @@ -1,24 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,10)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,10)) - ├── flags: ∅ - └── body: (length: 1) - └── @ ConstantPathOrWriteNode (location: (1,0)-(1,10)) - ├── flags: newline - ├── target: - │ @ ConstantPathNode (location: (1,0)-(1,4)) - │ ├── flags: ∅ - │ ├── parent: - │ │ @ ConstantReadNode (location: (1,0)-(1,1)) - │ │ ├── flags: ∅ - │ │ └── name: :X - │ ├── name: :Y - │ ├── delimiter_loc: (1,1)-(1,3) = "::" - │ └── name_loc: (1,3)-(1,4) = "Y" - ├── operator_loc: (1,5)-(1,8) = "||=" - └── value: - @ IntegerNode (location: (1,9)-(1,10)) - ├── flags: static_literal, decimal - └── value: 1 diff --git a/test/prism/snapshots/seattlerb/defined_eh_parens.txt b/test/prism/snapshots/seattlerb/defined_eh_parens.txt deleted file mode 100644 index 7e18a24787572f..00000000000000 --- a/test/prism/snapshots/seattlerb/defined_eh_parens.txt +++ /dev/null @@ -1,16 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,12)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,12)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefinedNode (location: (1,0)-(1,12)) - ├── flags: newline - ├── lparen_loc: (1,8)-(1,9) = "(" - ├── value: - │ @ IntegerNode (location: (1,9)-(1,11)) - │ ├── flags: static_literal, decimal - │ └── value: 42 - ├── rparen_loc: (1,11)-(1,12) = ")" - └── keyword_loc: (1,0)-(1,8) = "defined?" diff --git a/test/prism/snapshots/seattlerb/defn_arg_asplat_arg.txt b/test/prism/snapshots/seattlerb/defn_arg_asplat_arg.txt deleted file mode 100644 index 312b0214d6f61b..00000000000000 --- a/test/prism/snapshots/seattlerb/defn_arg_asplat_arg.txt +++ /dev/null @@ -1,41 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,29)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,29)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(1,29)) - ├── flags: newline - ├── name: :call - ├── name_loc: (1,4)-(1,8) = "call" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (1,9)-(1,24)) - │ ├── flags: ∅ - │ ├── requireds: (length: 1) - │ │ └── @ RequiredParameterNode (location: (1,9)-(1,15)) - │ │ ├── flags: ∅ - │ │ └── name: :interp - │ ├── optionals: (length: 0) - │ ├── rest: - │ │ @ RestParameterNode (location: (1,17)-(1,18)) - │ │ ├── flags: ∅ - │ │ ├── name: ∅ - │ │ ├── name_loc: ∅ - │ │ └── operator_loc: (1,17)-(1,18) = "*" - │ ├── posts: (length: 1) - │ │ └── @ RequiredParameterNode (location: (1,20)-(1,24)) - │ │ ├── flags: ∅ - │ │ └── name: :args - │ ├── keywords: (length: 0) - │ ├── keyword_rest: ∅ - │ └── block: ∅ - ├── body: ∅ - ├── locals: [:interp, :args] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: (1,8)-(1,9) = "(" - ├── rparen_loc: (1,24)-(1,25) = ")" - ├── equal_loc: ∅ - └── end_keyword_loc: (1,26)-(1,29) = "end" diff --git a/test/prism/snapshots/seattlerb/defn_arg_forward_args.txt b/test/prism/snapshots/seattlerb/defn_arg_forward_args.txt deleted file mode 100644 index ababd94b111292..00000000000000 --- a/test/prism/snapshots/seattlerb/defn_arg_forward_args.txt +++ /dev/null @@ -1,57 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,29)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,29)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(1,29)) - ├── flags: newline - ├── name: :a - ├── name_loc: (1,4)-(1,5) = "a" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (1,6)-(1,12)) - │ ├── flags: ∅ - │ ├── requireds: (length: 1) - │ │ └── @ RequiredParameterNode (location: (1,6)-(1,7)) - │ │ ├── flags: ∅ - │ │ └── name: :x - │ ├── optionals: (length: 0) - │ ├── rest: ∅ - │ ├── posts: (length: 0) - │ ├── keywords: (length: 0) - │ ├── keyword_rest: - │ │ @ ForwardingParameterNode (location: (1,9)-(1,12)) - │ │ └── flags: ∅ - │ └── block: ∅ - ├── body: - │ @ StatementsNode (location: (1,15)-(1,24)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,15)-(1,24)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :b - │ ├── message_loc: (1,15)-(1,16) = "b" - │ ├── opening_loc: (1,16)-(1,17) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,17)-(1,23)) - │ │ ├── flags: contains_forwarding - │ │ └── arguments: (length: 2) - │ │ ├── @ LocalVariableReadNode (location: (1,17)-(1,18)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :x - │ │ │ └── depth: 0 - │ │ └── @ ForwardingArgumentsNode (location: (1,20)-(1,23)) - │ │ └── flags: ∅ - │ ├── closing_loc: (1,23)-(1,24) = ")" - │ └── block: ∅ - ├── locals: [:x] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: (1,5)-(1,6) = "(" - ├── rparen_loc: (1,12)-(1,13) = ")" - ├── equal_loc: ∅ - └── end_keyword_loc: (1,26)-(1,29) = "end" diff --git a/test/prism/snapshots/seattlerb/defn_args_forward_args.txt b/test/prism/snapshots/seattlerb/defn_args_forward_args.txt deleted file mode 100644 index d689049433afc3..00000000000000 --- a/test/prism/snapshots/seattlerb/defn_args_forward_args.txt +++ /dev/null @@ -1,69 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,41)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,41)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(1,41)) - ├── flags: newline - ├── name: :a - ├── name_loc: (1,4)-(1,5) = "a" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (1,6)-(1,18)) - │ ├── flags: ∅ - │ ├── requireds: (length: 3) - │ │ ├── @ RequiredParameterNode (location: (1,6)-(1,7)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :x - │ │ ├── @ RequiredParameterNode (location: (1,9)-(1,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :y - │ │ └── @ RequiredParameterNode (location: (1,12)-(1,13)) - │ │ ├── flags: ∅ - │ │ └── name: :z - │ ├── optionals: (length: 0) - │ ├── rest: ∅ - │ ├── posts: (length: 0) - │ ├── keywords: (length: 0) - │ ├── keyword_rest: - │ │ @ ForwardingParameterNode (location: (1,15)-(1,18)) - │ │ └── flags: ∅ - │ └── block: ∅ - ├── body: - │ @ StatementsNode (location: (1,21)-(1,36)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,21)-(1,36)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :b - │ ├── message_loc: (1,21)-(1,22) = "b" - │ ├── opening_loc: (1,22)-(1,23) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,23)-(1,35)) - │ │ ├── flags: contains_forwarding - │ │ └── arguments: (length: 3) - │ │ ├── @ SymbolNode (location: (1,23)-(1,27)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (1,23)-(1,24) = ":" - │ │ │ ├── value_loc: (1,24)-(1,27) = "get" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "get" - │ │ ├── @ LocalVariableReadNode (location: (1,29)-(1,30)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :z - │ │ │ └── depth: 0 - │ │ └── @ ForwardingArgumentsNode (location: (1,32)-(1,35)) - │ │ └── flags: ∅ - │ ├── closing_loc: (1,35)-(1,36) = ")" - │ └── block: ∅ - ├── locals: [:x, :y, :z] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: (1,5)-(1,6) = "(" - ├── rparen_loc: (1,18)-(1,19) = ")" - ├── equal_loc: ∅ - └── end_keyword_loc: (1,38)-(1,41) = "end" diff --git a/test/prism/snapshots/seattlerb/defn_comments.txt b/test/prism/snapshots/seattlerb/defn_comments.txt deleted file mode 100644 index 8ea66b77603487..00000000000000 --- a/test/prism/snapshots/seattlerb/defn_comments.txt +++ /dev/null @@ -1,21 +0,0 @@ -@ ProgramNode (location: (4,0)-(5,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (4,0)-(5,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (4,0)-(5,3)) - ├── flags: newline - ├── name: :blah - ├── name_loc: (4,4)-(4,8) = "blah" - ├── receiver: ∅ - ├── parameters: ∅ - ├── body: ∅ - ├── locals: [] - ├── def_keyword_loc: (4,0)-(4,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: ∅ - ├── rparen_loc: ∅ - ├── equal_loc: ∅ - └── end_keyword_loc: (5,0)-(5,3) = "end" diff --git a/test/prism/snapshots/seattlerb/defn_endless_command.txt b/test/prism/snapshots/seattlerb/defn_endless_command.txt deleted file mode 100644 index 12149a821cb204..00000000000000 --- a/test/prism/snapshots/seattlerb/defn_endless_command.txt +++ /dev/null @@ -1,40 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,33)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,33)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(1,33)) - ├── flags: newline - ├── name: :some_method - ├── name_loc: (1,4)-(1,15) = "some_method" - ├── receiver: ∅ - ├── parameters: ∅ - ├── body: - │ @ StatementsNode (location: (1,18)-(1,33)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,18)-(1,33)) - │ ├── flags: ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :other_method - │ ├── message_loc: (1,18)-(1,30) = "other_method" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,31)-(1,33)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (1,31)-(1,33)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 42 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── locals: [] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: ∅ - ├── rparen_loc: ∅ - ├── equal_loc: (1,16)-(1,17) = "=" - └── end_keyword_loc: ∅ diff --git a/test/prism/snapshots/seattlerb/defn_endless_command_rescue.txt b/test/prism/snapshots/seattlerb/defn_endless_command_rescue.txt deleted file mode 100644 index 99194a5ce9418a..00000000000000 --- a/test/prism/snapshots/seattlerb/defn_endless_command_rescue.txt +++ /dev/null @@ -1,48 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,43)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,43)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(1,43)) - ├── flags: newline - ├── name: :some_method - ├── name_loc: (1,4)-(1,15) = "some_method" - ├── receiver: ∅ - ├── parameters: ∅ - ├── body: - │ @ StatementsNode (location: (1,18)-(1,43)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ RescueModifierNode (location: (1,18)-(1,43)) - │ ├── flags: ∅ - │ ├── expression: - │ │ @ CallNode (location: (1,18)-(1,33)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :other_method - │ │ ├── message_loc: (1,18)-(1,30) = "other_method" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (1,31)-(1,33)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (1,31)-(1,33)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 42 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── keyword_loc: (1,34)-(1,40) = "rescue" - │ └── rescue_expression: - │ @ IntegerNode (location: (1,41)-(1,43)) - │ ├── flags: static_literal, decimal - │ └── value: 24 - ├── locals: [] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: ∅ - ├── rparen_loc: ∅ - ├── equal_loc: (1,16)-(1,17) = "=" - └── end_keyword_loc: ∅ diff --git a/test/prism/snapshots/seattlerb/defn_forward_args.txt b/test/prism/snapshots/seattlerb/defn_forward_args.txt deleted file mode 100644 index 58a97028c6c5d4..00000000000000 --- a/test/prism/snapshots/seattlerb/defn_forward_args.txt +++ /dev/null @@ -1,50 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,23)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,23)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(1,23)) - ├── flags: newline - ├── name: :a - ├── name_loc: (1,4)-(1,5) = "a" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (1,6)-(1,9)) - │ ├── flags: ∅ - │ ├── requireds: (length: 0) - │ ├── optionals: (length: 0) - │ ├── rest: ∅ - │ ├── posts: (length: 0) - │ ├── keywords: (length: 0) - │ ├── keyword_rest: - │ │ @ ForwardingParameterNode (location: (1,6)-(1,9)) - │ │ └── flags: ∅ - │ └── block: ∅ - ├── body: - │ @ StatementsNode (location: (1,12)-(1,18)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,12)-(1,18)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :b - │ ├── message_loc: (1,12)-(1,13) = "b" - │ ├── opening_loc: (1,13)-(1,14) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,14)-(1,17)) - │ │ ├── flags: contains_forwarding - │ │ └── arguments: (length: 1) - │ │ └── @ ForwardingArgumentsNode (location: (1,14)-(1,17)) - │ │ └── flags: ∅ - │ ├── closing_loc: (1,17)-(1,18) = ")" - │ └── block: ∅ - ├── locals: [] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: (1,5)-(1,6) = "(" - ├── rparen_loc: (1,9)-(1,10) = ")" - ├── equal_loc: ∅ - └── end_keyword_loc: (1,20)-(1,23) = "end" diff --git a/test/prism/snapshots/seattlerb/defn_forward_args__no_parens.txt b/test/prism/snapshots/seattlerb/defn_forward_args__no_parens.txt deleted file mode 100644 index 5d8e09f6c04f6e..00000000000000 --- a/test/prism/snapshots/seattlerb/defn_forward_args__no_parens.txt +++ /dev/null @@ -1,50 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(3,3)) - ├── flags: newline - ├── name: :f - ├── name_loc: (1,4)-(1,5) = "f" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (1,6)-(1,9)) - │ ├── flags: ∅ - │ ├── requireds: (length: 0) - │ ├── optionals: (length: 0) - │ ├── rest: ∅ - │ ├── posts: (length: 0) - │ ├── keywords: (length: 0) - │ ├── keyword_rest: - │ │ @ ForwardingParameterNode (location: (1,6)-(1,9)) - │ │ └── flags: ∅ - │ └── block: ∅ - ├── body: - │ @ StatementsNode (location: (2,2)-(2,8)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (2,2)-(2,8)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :m - │ ├── message_loc: (2,2)-(2,3) = "m" - │ ├── opening_loc: (2,3)-(2,4) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (2,4)-(2,7)) - │ │ ├── flags: contains_forwarding - │ │ └── arguments: (length: 1) - │ │ └── @ ForwardingArgumentsNode (location: (2,4)-(2,7)) - │ │ └── flags: ∅ - │ ├── closing_loc: (2,7)-(2,8) = ")" - │ └── block: ∅ - ├── locals: [] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: ∅ - ├── rparen_loc: ∅ - ├── equal_loc: ∅ - └── end_keyword_loc: (3,0)-(3,3) = "end" diff --git a/test/prism/snapshots/seattlerb/defn_kwarg_env.txt b/test/prism/snapshots/seattlerb/defn_kwarg_env.txt deleted file mode 100644 index 0df82b5dc2be21..00000000000000 --- a/test/prism/snapshots/seattlerb/defn_kwarg_env.txt +++ /dev/null @@ -1,62 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,45)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,45)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(1,45)) - ├── flags: newline - ├── name: :test - ├── name_loc: (1,4)-(1,8) = "test" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (1,9)-(1,18)) - │ ├── flags: ∅ - │ ├── requireds: (length: 0) - │ ├── optionals: (length: 0) - │ ├── rest: ∅ - │ ├── posts: (length: 0) - │ ├── keywords: (length: 0) - │ ├── keyword_rest: - │ │ @ KeywordRestParameterNode (location: (1,9)-(1,18)) - │ │ ├── flags: ∅ - │ │ ├── name: :testing - │ │ ├── name_loc: (1,11)-(1,18) = "testing" - │ │ └── operator_loc: (1,9)-(1,11) = "**" - │ └── block: ∅ - ├── body: - │ @ StatementsNode (location: (1,20)-(1,41)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,20)-(1,41)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :test_splat - │ ├── message_loc: (1,20)-(1,30) = "test_splat" - │ ├── opening_loc: (1,30)-(1,31) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,31)-(1,40)) - │ │ ├── flags: contains_keywords, contains_keyword_splat - │ │ └── arguments: (length: 1) - │ │ └── @ KeywordHashNode (location: (1,31)-(1,40)) - │ │ ├── flags: ∅ - │ │ └── elements: (length: 1) - │ │ └── @ AssocSplatNode (location: (1,31)-(1,40)) - │ │ ├── flags: ∅ - │ │ ├── value: - │ │ │ @ LocalVariableReadNode (location: (1,33)-(1,40)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :testing - │ │ │ └── depth: 0 - │ │ └── operator_loc: (1,31)-(1,33) = "**" - │ ├── closing_loc: (1,40)-(1,41) = ")" - │ └── block: ∅ - ├── locals: [:testing] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: (1,8)-(1,9) = "(" - ├── rparen_loc: (1,18)-(1,19) = ")" - ├── equal_loc: ∅ - └── end_keyword_loc: (1,42)-(1,45) = "end" diff --git a/test/prism/snapshots/seattlerb/defn_kwarg_kwarg.txt b/test/prism/snapshots/seattlerb/defn_kwarg_kwarg.txt deleted file mode 100644 index ead1437a86fae8..00000000000000 --- a/test/prism/snapshots/seattlerb/defn_kwarg_kwarg.txt +++ /dev/null @@ -1,49 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,24)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,24)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(1,24)) - ├── flags: newline - ├── name: :f - ├── name_loc: (1,4)-(1,5) = "f" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (1,6)-(1,19)) - │ ├── flags: ∅ - │ ├── requireds: (length: 1) - │ │ └── @ RequiredParameterNode (location: (1,6)-(1,7)) - │ │ ├── flags: ∅ - │ │ └── name: :a - │ ├── optionals: (length: 0) - │ ├── rest: ∅ - │ ├── posts: (length: 0) - │ ├── keywords: (length: 2) - │ │ ├── @ OptionalKeywordParameterNode (location: (1,9)-(1,13)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :b - │ │ │ ├── name_loc: (1,9)-(1,11) = "b:" - │ │ │ └── value: - │ │ │ @ IntegerNode (location: (1,12)-(1,13)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── @ OptionalKeywordParameterNode (location: (1,15)-(1,19)) - │ │ ├── flags: ∅ - │ │ ├── name: :c - │ │ ├── name_loc: (1,15)-(1,17) = "c:" - │ │ └── value: - │ │ @ IntegerNode (location: (1,18)-(1,19)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── keyword_rest: ∅ - │ └── block: ∅ - ├── body: ∅ - ├── locals: [:a, :b, :c] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: (1,5)-(1,6) = "(" - ├── rparen_loc: (1,19)-(1,20) = ")" - ├── equal_loc: ∅ - └── end_keyword_loc: (1,21)-(1,24) = "end" diff --git a/test/prism/snapshots/seattlerb/defn_kwarg_kwsplat.txt b/test/prism/snapshots/seattlerb/defn_kwarg_kwsplat.txt deleted file mode 100644 index 2b228334604e2d..00000000000000 --- a/test/prism/snapshots/seattlerb/defn_kwarg_kwsplat.txt +++ /dev/null @@ -1,43 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,20)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,20)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(1,20)) - ├── flags: newline - ├── name: :a - ├── name_loc: (1,4)-(1,5) = "a" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (1,6)-(1,15)) - │ ├── flags: ∅ - │ ├── requireds: (length: 0) - │ ├── optionals: (length: 0) - │ ├── rest: ∅ - │ ├── posts: (length: 0) - │ ├── keywords: (length: 1) - │ │ └── @ OptionalKeywordParameterNode (location: (1,6)-(1,10)) - │ │ ├── flags: ∅ - │ │ ├── name: :b - │ │ ├── name_loc: (1,6)-(1,8) = "b:" - │ │ └── value: - │ │ @ IntegerNode (location: (1,9)-(1,10)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── keyword_rest: - │ │ @ KeywordRestParameterNode (location: (1,12)-(1,15)) - │ │ ├── flags: ∅ - │ │ ├── name: :c - │ │ ├── name_loc: (1,14)-(1,15) = "c" - │ │ └── operator_loc: (1,12)-(1,14) = "**" - │ └── block: ∅ - ├── body: ∅ - ├── locals: [:b, :c] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: (1,5)-(1,6) = "(" - ├── rparen_loc: (1,15)-(1,16) = ")" - ├── equal_loc: ∅ - └── end_keyword_loc: (1,17)-(1,20) = "end" diff --git a/test/prism/snapshots/seattlerb/defn_kwarg_kwsplat_anon.txt b/test/prism/snapshots/seattlerb/defn_kwarg_kwsplat_anon.txt deleted file mode 100644 index 1e0e1f132e7416..00000000000000 --- a/test/prism/snapshots/seattlerb/defn_kwarg_kwsplat_anon.txt +++ /dev/null @@ -1,43 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,19)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,19)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(1,19)) - ├── flags: newline - ├── name: :a - ├── name_loc: (1,4)-(1,5) = "a" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (1,6)-(1,14)) - │ ├── flags: ∅ - │ ├── requireds: (length: 0) - │ ├── optionals: (length: 0) - │ ├── rest: ∅ - │ ├── posts: (length: 0) - │ ├── keywords: (length: 1) - │ │ └── @ OptionalKeywordParameterNode (location: (1,6)-(1,10)) - │ │ ├── flags: ∅ - │ │ ├── name: :b - │ │ ├── name_loc: (1,6)-(1,8) = "b:" - │ │ └── value: - │ │ @ IntegerNode (location: (1,9)-(1,10)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── keyword_rest: - │ │ @ KeywordRestParameterNode (location: (1,12)-(1,14)) - │ │ ├── flags: ∅ - │ │ ├── name: ∅ - │ │ ├── name_loc: ∅ - │ │ └── operator_loc: (1,12)-(1,14) = "**" - │ └── block: ∅ - ├── body: ∅ - ├── locals: [:b] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: (1,5)-(1,6) = "(" - ├── rparen_loc: (1,14)-(1,15) = ")" - ├── equal_loc: ∅ - └── end_keyword_loc: (1,16)-(1,19) = "end" diff --git a/test/prism/snapshots/seattlerb/defn_kwarg_lvar.txt b/test/prism/snapshots/seattlerb/defn_kwarg_lvar.txt deleted file mode 100644 index 0835d3987db21c..00000000000000 --- a/test/prism/snapshots/seattlerb/defn_kwarg_lvar.txt +++ /dev/null @@ -1,48 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,26)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,26)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(1,26)) - ├── flags: newline - ├── name: :fun - ├── name_loc: (1,4)-(1,7) = "fun" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (1,8)-(1,16)) - │ ├── flags: ∅ - │ ├── requireds: (length: 0) - │ ├── optionals: (length: 0) - │ ├── rest: ∅ - │ ├── posts: (length: 0) - │ ├── keywords: (length: 1) - │ │ └── @ OptionalKeywordParameterNode (location: (1,8)-(1,16)) - │ │ ├── flags: ∅ - │ │ ├── name: :kw - │ │ ├── name_loc: (1,8)-(1,11) = "kw:" - │ │ └── value: - │ │ @ SymbolNode (location: (1,12)-(1,16)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (1,12)-(1,13) = ":" - │ │ ├── value_loc: (1,13)-(1,16) = "val" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "val" - │ ├── keyword_rest: ∅ - │ └── block: ∅ - ├── body: - │ @ StatementsNode (location: (1,19)-(1,21)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ LocalVariableReadNode (location: (1,19)-(1,21)) - │ ├── flags: newline - │ ├── name: :kw - │ └── depth: 0 - ├── locals: [:kw] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: (1,7)-(1,8) = "(" - ├── rparen_loc: (1,16)-(1,17) = ")" - ├── equal_loc: ∅ - └── end_keyword_loc: (1,23)-(1,26) = "end" diff --git a/test/prism/snapshots/seattlerb/defn_kwarg_no_parens.txt b/test/prism/snapshots/seattlerb/defn_kwarg_no_parens.txt deleted file mode 100644 index 3f6af5e0ee49a9..00000000000000 --- a/test/prism/snapshots/seattlerb/defn_kwarg_no_parens.txt +++ /dev/null @@ -1,38 +0,0 @@ -@ ProgramNode (location: (1,0)-(2,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(2,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(2,3)) - ├── flags: newline - ├── name: :f - ├── name_loc: (1,4)-(1,5) = "f" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (1,6)-(1,10)) - │ ├── flags: ∅ - │ ├── requireds: (length: 0) - │ ├── optionals: (length: 0) - │ ├── rest: ∅ - │ ├── posts: (length: 0) - │ ├── keywords: (length: 1) - │ │ └── @ OptionalKeywordParameterNode (location: (1,6)-(1,10)) - │ │ ├── flags: ∅ - │ │ ├── name: :a - │ │ ├── name_loc: (1,6)-(1,8) = "a:" - │ │ └── value: - │ │ @ IntegerNode (location: (1,9)-(1,10)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── keyword_rest: ∅ - │ └── block: ∅ - ├── body: ∅ - ├── locals: [:a] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: ∅ - ├── rparen_loc: ∅ - ├── equal_loc: ∅ - └── end_keyword_loc: (2,0)-(2,3) = "end" diff --git a/test/prism/snapshots/seattlerb/defn_kwarg_val.txt b/test/prism/snapshots/seattlerb/defn_kwarg_val.txt deleted file mode 100644 index 38cb995c093258..00000000000000 --- a/test/prism/snapshots/seattlerb/defn_kwarg_val.txt +++ /dev/null @@ -1,41 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,17)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,17)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(1,17)) - ├── flags: newline - ├── name: :f - ├── name_loc: (1,4)-(1,5) = "f" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (1,6)-(1,12)) - │ ├── flags: ∅ - │ ├── requireds: (length: 1) - │ │ └── @ RequiredParameterNode (location: (1,6)-(1,7)) - │ │ ├── flags: ∅ - │ │ └── name: :a - │ ├── optionals: (length: 0) - │ ├── rest: ∅ - │ ├── posts: (length: 0) - │ ├── keywords: (length: 1) - │ │ └── @ OptionalKeywordParameterNode (location: (1,9)-(1,12)) - │ │ ├── flags: ∅ - │ │ ├── name: :b - │ │ ├── name_loc: (1,9)-(1,11) = "b:" - │ │ └── value: - │ │ @ IntegerNode (location: (1,11)-(1,12)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── keyword_rest: ∅ - │ └── block: ∅ - ├── body: ∅ - ├── locals: [:a, :b] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: (1,5)-(1,6) = "(" - ├── rparen_loc: (1,12)-(1,13) = ")" - ├── equal_loc: ∅ - └── end_keyword_loc: (1,14)-(1,17) = "end" diff --git a/test/prism/snapshots/seattlerb/defn_no_kwargs.txt b/test/prism/snapshots/seattlerb/defn_no_kwargs.txt deleted file mode 100644 index 778b300a4be2e1..00000000000000 --- a/test/prism/snapshots/seattlerb/defn_no_kwargs.txt +++ /dev/null @@ -1,34 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,17)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,17)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(1,17)) - ├── flags: newline - ├── name: :x - ├── name_loc: (1,4)-(1,5) = "x" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (1,6)-(1,11)) - │ ├── flags: ∅ - │ ├── requireds: (length: 0) - │ ├── optionals: (length: 0) - │ ├── rest: ∅ - │ ├── posts: (length: 0) - │ ├── keywords: (length: 0) - │ ├── keyword_rest: - │ │ @ NoKeywordsParameterNode (location: (1,6)-(1,11)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (1,6)-(1,8) = "**" - │ │ └── keyword_loc: (1,8)-(1,11) = "nil" - │ └── block: ∅ - ├── body: ∅ - ├── locals: [] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: (1,5)-(1,6) = "(" - ├── rparen_loc: (1,11)-(1,12) = ")" - ├── equal_loc: ∅ - └── end_keyword_loc: (1,14)-(1,17) = "end" diff --git a/test/prism/snapshots/seattlerb/defn_oneliner.txt b/test/prism/snapshots/seattlerb/defn_oneliner.txt deleted file mode 100644 index 81ca22f010e69c..00000000000000 --- a/test/prism/snapshots/seattlerb/defn_oneliner.txt +++ /dev/null @@ -1,53 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,27)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,27)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(1,27)) - ├── flags: newline - ├── name: :exec - ├── name_loc: (1,4)-(1,8) = "exec" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (1,9)-(1,12)) - │ ├── flags: ∅ - │ ├── requireds: (length: 1) - │ │ └── @ RequiredParameterNode (location: (1,9)-(1,12)) - │ │ ├── flags: ∅ - │ │ └── name: :cmd - │ ├── optionals: (length: 0) - │ ├── rest: ∅ - │ ├── posts: (length: 0) - │ ├── keywords: (length: 0) - │ ├── keyword_rest: ∅ - │ └── block: ∅ - ├── body: - │ @ StatementsNode (location: (1,16)-(1,27)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,16)-(1,27)) - │ ├── flags: ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :system - │ ├── message_loc: (1,16)-(1,22) = "system" - │ ├── opening_loc: (1,22)-(1,23) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,23)-(1,26)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ LocalVariableReadNode (location: (1,23)-(1,26)) - │ │ ├── flags: ∅ - │ │ ├── name: :cmd - │ │ └── depth: 0 - │ ├── closing_loc: (1,26)-(1,27) = ")" - │ └── block: ∅ - ├── locals: [:cmd] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: (1,8)-(1,9) = "(" - ├── rparen_loc: (1,12)-(1,13) = ")" - ├── equal_loc: (1,14)-(1,15) = "=" - └── end_keyword_loc: ∅ diff --git a/test/prism/snapshots/seattlerb/defn_oneliner_eq2.txt b/test/prism/snapshots/seattlerb/defn_oneliner_eq2.txt deleted file mode 100644 index 414ecff4eddf49..00000000000000 --- a/test/prism/snapshots/seattlerb/defn_oneliner_eq2.txt +++ /dev/null @@ -1,55 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ ClassNode (location: (1,0)-(3,3)) - ├── flags: newline - ├── locals: [] - ├── class_keyword_loc: (1,0)-(1,5) = "class" - ├── constant_path: - │ @ ConstantReadNode (location: (1,6)-(1,7)) - │ ├── flags: ∅ - │ └── name: :X - ├── inheritance_operator_loc: ∅ - ├── superclass: ∅ - ├── body: - │ @ StatementsNode (location: (2,2)-(2,16)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ DefNode (location: (2,2)-(2,16)) - │ ├── flags: newline - │ ├── name: :== - │ ├── name_loc: (2,6)-(2,8) = "==" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (2,9)-(2,10)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (2,9)-(2,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :o - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (2,14)-(2,16)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ IntegerNode (location: (2,14)-(2,16)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 42 - │ ├── locals: [:o] - │ ├── def_keyword_loc: (2,2)-(2,5) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (2,8)-(2,9) = "(" - │ ├── rparen_loc: (2,10)-(2,11) = ")" - │ ├── equal_loc: (2,12)-(2,13) = "=" - │ └── end_keyword_loc: ∅ - ├── end_keyword_loc: (3,0)-(3,3) = "end" - └── name: :X diff --git a/test/prism/snapshots/seattlerb/defn_oneliner_noargs.txt b/test/prism/snapshots/seattlerb/defn_oneliner_noargs.txt deleted file mode 100644 index 5928f64179fc9b..00000000000000 --- a/test/prism/snapshots/seattlerb/defn_oneliner_noargs.txt +++ /dev/null @@ -1,34 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,17)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,17)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(1,17)) - ├── flags: newline - ├── name: :exec - ├── name_loc: (1,4)-(1,8) = "exec" - ├── receiver: ∅ - ├── parameters: ∅ - ├── body: - │ @ StatementsNode (location: (1,11)-(1,17)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,11)-(1,17)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :system - │ ├── message_loc: (1,11)-(1,17) = "system" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── locals: [] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: ∅ - ├── rparen_loc: ∅ - ├── equal_loc: (1,9)-(1,10) = "=" - └── end_keyword_loc: ∅ diff --git a/test/prism/snapshots/seattlerb/defn_oneliner_noargs_parentheses.txt b/test/prism/snapshots/seattlerb/defn_oneliner_noargs_parentheses.txt deleted file mode 100644 index d0cd777039ee97..00000000000000 --- a/test/prism/snapshots/seattlerb/defn_oneliner_noargs_parentheses.txt +++ /dev/null @@ -1,34 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,19)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,19)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(1,19)) - ├── flags: newline - ├── name: :exec - ├── name_loc: (1,4)-(1,8) = "exec" - ├── receiver: ∅ - ├── parameters: ∅ - ├── body: - │ @ StatementsNode (location: (1,13)-(1,19)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,13)-(1,19)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :system - │ ├── message_loc: (1,13)-(1,19) = "system" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── locals: [] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: (1,8)-(1,9) = "(" - ├── rparen_loc: (1,9)-(1,10) = ")" - ├── equal_loc: (1,11)-(1,12) = "=" - └── end_keyword_loc: ∅ diff --git a/test/prism/snapshots/seattlerb/defn_oneliner_rescue.txt b/test/prism/snapshots/seattlerb/defn_oneliner_rescue.txt deleted file mode 100644 index d6cfba773d634f..00000000000000 --- a/test/prism/snapshots/seattlerb/defn_oneliner_rescue.txt +++ /dev/null @@ -1,180 +0,0 @@ -@ ProgramNode (location: (1,0)-(13,38)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(13,38)) - ├── flags: ∅ - └── body: (length: 3) - ├── @ DefNode (location: (1,0)-(5,3)) - │ ├── flags: newline - │ ├── name: :exec - │ ├── name_loc: (1,4)-(1,8) = "exec" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,9)-(1,12)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (1,9)-(1,12)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :cmd - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ BeginNode (location: (1,0)-(5,3)) - │ │ ├── flags: ∅ - │ │ ├── begin_keyword_loc: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (2,2)-(2,13)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (2,2)-(2,13)) - │ │ │ ├── flags: newline, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :system - │ │ │ ├── message_loc: (2,2)-(2,8) = "system" - │ │ │ ├── opening_loc: (2,8)-(2,9) = "(" - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (2,9)-(2,12)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ LocalVariableReadNode (location: (2,9)-(2,12)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :cmd - │ │ │ │ └── depth: 0 - │ │ │ ├── closing_loc: (2,12)-(2,13) = ")" - │ │ │ └── block: ∅ - │ │ ├── rescue_clause: - │ │ │ @ RescueNode (location: (3,0)-(4,5)) - │ │ │ ├── flags: ∅ - │ │ │ ├── keyword_loc: (3,0)-(3,6) = "rescue" - │ │ │ ├── exceptions: (length: 0) - │ │ │ ├── operator_loc: ∅ - │ │ │ ├── reference: ∅ - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (4,2)-(4,5)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ NilNode (location: (4,2)-(4,5)) - │ │ │ │ └── flags: newline, static_literal - │ │ │ └── subsequent: ∅ - │ │ ├── else_clause: ∅ - │ │ ├── ensure_clause: ∅ - │ │ └── end_keyword_loc: (5,0)-(5,3) = "end" - │ ├── locals: [:cmd] - │ ├── def_keyword_loc: (1,0)-(1,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (1,8)-(1,9) = "(" - │ ├── rparen_loc: (1,12)-(1,13) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (5,0)-(5,3) = "end" - ├── @ DefNode (location: (8,0)-(10,3)) - │ ├── flags: newline - │ ├── name: :exec - │ ├── name_loc: (8,4)-(8,8) = "exec" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (8,9)-(8,12)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (8,9)-(8,12)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :cmd - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (9,2)-(9,24)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ RescueModifierNode (location: (9,2)-(9,24)) - │ │ ├── flags: newline - │ │ ├── expression: - │ │ │ @ CallNode (location: (9,2)-(9,13)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :system - │ │ │ ├── message_loc: (9,2)-(9,8) = "system" - │ │ │ ├── opening_loc: (9,8)-(9,9) = "(" - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (9,9)-(9,12)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ LocalVariableReadNode (location: (9,9)-(9,12)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :cmd - │ │ │ │ └── depth: 0 - │ │ │ ├── closing_loc: (9,12)-(9,13) = ")" - │ │ │ └── block: ∅ - │ │ ├── keyword_loc: (9,14)-(9,20) = "rescue" - │ │ └── rescue_expression: - │ │ @ NilNode (location: (9,21)-(9,24)) - │ │ └── flags: static_literal - │ ├── locals: [:cmd] - │ ├── def_keyword_loc: (8,0)-(8,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (8,8)-(8,9) = "(" - │ ├── rparen_loc: (8,12)-(8,13) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (10,0)-(10,3) = "end" - └── @ DefNode (location: (13,0)-(13,38)) - ├── flags: newline - ├── name: :exec - ├── name_loc: (13,4)-(13,8) = "exec" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (13,9)-(13,12)) - │ ├── flags: ∅ - │ ├── requireds: (length: 1) - │ │ └── @ RequiredParameterNode (location: (13,9)-(13,12)) - │ │ ├── flags: ∅ - │ │ └── name: :cmd - │ ├── optionals: (length: 0) - │ ├── rest: ∅ - │ ├── posts: (length: 0) - │ ├── keywords: (length: 0) - │ ├── keyword_rest: ∅ - │ └── block: ∅ - ├── body: - │ @ StatementsNode (location: (13,16)-(13,38)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ RescueModifierNode (location: (13,16)-(13,38)) - │ ├── flags: ∅ - │ ├── expression: - │ │ @ CallNode (location: (13,16)-(13,27)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :system - │ │ ├── message_loc: (13,16)-(13,22) = "system" - │ │ ├── opening_loc: (13,22)-(13,23) = "(" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (13,23)-(13,26)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ LocalVariableReadNode (location: (13,23)-(13,26)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :cmd - │ │ │ └── depth: 0 - │ │ ├── closing_loc: (13,26)-(13,27) = ")" - │ │ └── block: ∅ - │ ├── keyword_loc: (13,28)-(13,34) = "rescue" - │ └── rescue_expression: - │ @ NilNode (location: (13,35)-(13,38)) - │ └── flags: static_literal - ├── locals: [:cmd] - ├── def_keyword_loc: (13,0)-(13,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: (13,8)-(13,9) = "(" - ├── rparen_loc: (13,12)-(13,13) = ")" - ├── equal_loc: (13,14)-(13,15) = "=" - └── end_keyword_loc: ∅ diff --git a/test/prism/snapshots/seattlerb/defn_opt_last_arg.txt b/test/prism/snapshots/seattlerb/defn_opt_last_arg.txt deleted file mode 100644 index f7c37e3d457b35..00000000000000 --- a/test/prism/snapshots/seattlerb/defn_opt_last_arg.txt +++ /dev/null @@ -1,38 +0,0 @@ -@ ProgramNode (location: (1,0)-(2,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(2,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(2,3)) - ├── flags: newline - ├── name: :m - ├── name_loc: (1,4)-(1,5) = "m" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (1,6)-(1,17)) - │ ├── flags: ∅ - │ ├── requireds: (length: 0) - │ ├── optionals: (length: 1) - │ │ └── @ OptionalParameterNode (location: (1,6)-(1,17)) - │ │ ├── flags: ∅ - │ │ ├── name: :arg - │ │ ├── name_loc: (1,6)-(1,9) = "arg" - │ │ ├── operator_loc: (1,10)-(1,11) = "=" - │ │ └── value: - │ │ @ FalseNode (location: (1,12)-(1,17)) - │ │ └── flags: static_literal - │ ├── rest: ∅ - │ ├── posts: (length: 0) - │ ├── keywords: (length: 0) - │ ├── keyword_rest: ∅ - │ └── block: ∅ - ├── body: ∅ - ├── locals: [:arg] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: ∅ - ├── rparen_loc: ∅ - ├── equal_loc: ∅ - └── end_keyword_loc: (2,0)-(2,3) = "end" diff --git a/test/prism/snapshots/seattlerb/defn_opt_reg.txt b/test/prism/snapshots/seattlerb/defn_opt_reg.txt deleted file mode 100644 index 9bdd14390504ee..00000000000000 --- a/test/prism/snapshots/seattlerb/defn_opt_reg.txt +++ /dev/null @@ -1,41 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,19)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,19)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(1,19)) - ├── flags: newline - ├── name: :f - ├── name_loc: (1,4)-(1,5) = "f" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (1,6)-(1,14)) - │ ├── flags: ∅ - │ ├── requireds: (length: 0) - │ ├── optionals: (length: 1) - │ │ └── @ OptionalParameterNode (location: (1,6)-(1,11)) - │ │ ├── flags: ∅ - │ │ ├── name: :a - │ │ ├── name_loc: (1,6)-(1,7) = "a" - │ │ ├── operator_loc: (1,7)-(1,8) = "=" - │ │ └── value: - │ │ @ NilNode (location: (1,8)-(1,11)) - │ │ └── flags: static_literal - │ ├── rest: ∅ - │ ├── posts: (length: 1) - │ │ └── @ RequiredParameterNode (location: (1,13)-(1,14)) - │ │ ├── flags: ∅ - │ │ └── name: :b - │ ├── keywords: (length: 0) - │ ├── keyword_rest: ∅ - │ └── block: ∅ - ├── body: ∅ - ├── locals: [:a, :b] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: (1,5)-(1,6) = "(" - ├── rparen_loc: (1,14)-(1,15) = ")" - ├── equal_loc: ∅ - └── end_keyword_loc: (1,16)-(1,19) = "end" diff --git a/test/prism/snapshots/seattlerb/defn_opt_splat_arg.txt b/test/prism/snapshots/seattlerb/defn_opt_splat_arg.txt deleted file mode 100644 index d90fddc6533ace..00000000000000 --- a/test/prism/snapshots/seattlerb/defn_opt_splat_arg.txt +++ /dev/null @@ -1,47 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,24)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,24)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(1,24)) - ├── flags: newline - ├── name: :f - ├── name_loc: (1,4)-(1,5) = "f" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (1,7)-(1,19)) - │ ├── flags: ∅ - │ ├── requireds: (length: 0) - │ ├── optionals: (length: 1) - │ │ └── @ OptionalParameterNode (location: (1,7)-(1,12)) - │ │ ├── flags: ∅ - │ │ ├── name: :a - │ │ ├── name_loc: (1,7)-(1,8) = "a" - │ │ ├── operator_loc: (1,9)-(1,10) = "=" - │ │ └── value: - │ │ @ IntegerNode (location: (1,11)-(1,12)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── rest: - │ │ @ RestParameterNode (location: (1,14)-(1,16)) - │ │ ├── flags: ∅ - │ │ ├── name: :b - │ │ ├── name_loc: (1,15)-(1,16) = "b" - │ │ └── operator_loc: (1,14)-(1,15) = "*" - │ ├── posts: (length: 1) - │ │ └── @ RequiredParameterNode (location: (1,18)-(1,19)) - │ │ ├── flags: ∅ - │ │ └── name: :c - │ ├── keywords: (length: 0) - │ ├── keyword_rest: ∅ - │ └── block: ∅ - ├── body: ∅ - ├── locals: [:a, :b, :c] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: (1,6)-(1,7) = "(" - ├── rparen_loc: (1,19)-(1,20) = ")" - ├── equal_loc: ∅ - └── end_keyword_loc: (1,21)-(1,24) = "end" diff --git a/test/prism/snapshots/seattlerb/defn_powarg.txt b/test/prism/snapshots/seattlerb/defn_powarg.txt deleted file mode 100644 index 8d4ff4283ac141..00000000000000 --- a/test/prism/snapshots/seattlerb/defn_powarg.txt +++ /dev/null @@ -1,35 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,17)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,17)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(1,17)) - ├── flags: newline - ├── name: :f - ├── name_loc: (1,4)-(1,5) = "f" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (1,6)-(1,12)) - │ ├── flags: ∅ - │ ├── requireds: (length: 0) - │ ├── optionals: (length: 0) - │ ├── rest: ∅ - │ ├── posts: (length: 0) - │ ├── keywords: (length: 0) - │ ├── keyword_rest: - │ │ @ KeywordRestParameterNode (location: (1,6)-(1,12)) - │ │ ├── flags: ∅ - │ │ ├── name: :opts - │ │ ├── name_loc: (1,8)-(1,12) = "opts" - │ │ └── operator_loc: (1,6)-(1,8) = "**" - │ └── block: ∅ - ├── body: ∅ - ├── locals: [:opts] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: (1,5)-(1,6) = "(" - ├── rparen_loc: (1,12)-(1,13) = ")" - ├── equal_loc: ∅ - └── end_keyword_loc: (1,14)-(1,17) = "end" diff --git a/test/prism/snapshots/seattlerb/defn_reg_opt_reg.txt b/test/prism/snapshots/seattlerb/defn_reg_opt_reg.txt deleted file mode 100644 index 0cd1435e8f992b..00000000000000 --- a/test/prism/snapshots/seattlerb/defn_reg_opt_reg.txt +++ /dev/null @@ -1,48 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,23)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,23)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(1,23)) - ├── flags: newline - ├── name: :f - ├── name_loc: (1,4)-(1,5) = "f" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (1,6)-(1,18)) - │ ├── flags: ∅ - │ ├── requireds: (length: 1) - │ │ └── @ RequiredParameterNode (location: (1,6)-(1,7)) - │ │ ├── flags: ∅ - │ │ └── name: :a - │ ├── optionals: (length: 1) - │ │ └── @ OptionalParameterNode (location: (1,9)-(1,15)) - │ │ ├── flags: ∅ - │ │ ├── name: :b - │ │ ├── name_loc: (1,9)-(1,10) = "b" - │ │ ├── operator_loc: (1,11)-(1,12) = "=" - │ │ └── value: - │ │ @ SymbolNode (location: (1,13)-(1,15)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (1,13)-(1,14) = ":" - │ │ ├── value_loc: (1,14)-(1,15) = "c" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "c" - │ ├── rest: ∅ - │ ├── posts: (length: 1) - │ │ └── @ RequiredParameterNode (location: (1,17)-(1,18)) - │ │ ├── flags: ∅ - │ │ └── name: :d - │ ├── keywords: (length: 0) - │ ├── keyword_rest: ∅ - │ └── block: ∅ - ├── body: ∅ - ├── locals: [:a, :b, :d] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: (1,5)-(1,6) = "(" - ├── rparen_loc: (1,18)-(1,19) = ")" - ├── equal_loc: ∅ - └── end_keyword_loc: (1,20)-(1,23) = "end" diff --git a/test/prism/snapshots/seattlerb/defn_splat_arg.txt b/test/prism/snapshots/seattlerb/defn_splat_arg.txt deleted file mode 100644 index c137e263c4433c..00000000000000 --- a/test/prism/snapshots/seattlerb/defn_splat_arg.txt +++ /dev/null @@ -1,38 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,15)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,15)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(1,15)) - ├── flags: newline - ├── name: :f - ├── name_loc: (1,4)-(1,5) = "f" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (1,6)-(1,10)) - │ ├── flags: ∅ - │ ├── requireds: (length: 0) - │ ├── optionals: (length: 0) - │ ├── rest: - │ │ @ RestParameterNode (location: (1,6)-(1,7)) - │ │ ├── flags: ∅ - │ │ ├── name: ∅ - │ │ ├── name_loc: ∅ - │ │ └── operator_loc: (1,6)-(1,7) = "*" - │ ├── posts: (length: 1) - │ │ └── @ RequiredParameterNode (location: (1,9)-(1,10)) - │ │ ├── flags: ∅ - │ │ └── name: :a - │ ├── keywords: (length: 0) - │ ├── keyword_rest: ∅ - │ └── block: ∅ - ├── body: ∅ - ├── locals: [:a] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: (1,5)-(1,6) = "(" - ├── rparen_loc: (1,10)-(1,11) = ")" - ├── equal_loc: ∅ - └── end_keyword_loc: (1,12)-(1,15) = "end" diff --git a/test/prism/snapshots/seattlerb/defn_unary_not.txt b/test/prism/snapshots/seattlerb/defn_unary_not.txt deleted file mode 100644 index 0722d3cdca18a2..00000000000000 --- a/test/prism/snapshots/seattlerb/defn_unary_not.txt +++ /dev/null @@ -1,26 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,17)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,17)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(1,17)) - ├── flags: newline - ├── name: :! - ├── name_loc: (1,4)-(1,6) = "!@" - ├── receiver: ∅ - ├── parameters: ∅ - ├── body: - │ @ StatementsNode (location: (1,8)-(1,12)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ TrueNode (location: (1,8)-(1,12)) - │ └── flags: newline, static_literal - ├── locals: [] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: ∅ - ├── rparen_loc: ∅ - ├── equal_loc: ∅ - └── end_keyword_loc: (1,14)-(1,17) = "end" diff --git a/test/prism/snapshots/seattlerb/defns_reserved.txt b/test/prism/snapshots/seattlerb/defns_reserved.txt deleted file mode 100644 index 10361184ac86a7..00000000000000 --- a/test/prism/snapshots/seattlerb/defns_reserved.txt +++ /dev/null @@ -1,23 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,20)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,20)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(1,20)) - ├── flags: newline - ├── name: :return - ├── name_loc: (1,9)-(1,15) = "return" - ├── receiver: - │ @ SelfNode (location: (1,4)-(1,8)) - │ └── flags: ∅ - ├── parameters: ∅ - ├── body: ∅ - ├── locals: [] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: (1,8)-(1,9) = "." - ├── lparen_loc: ∅ - ├── rparen_loc: ∅ - ├── equal_loc: ∅ - └── end_keyword_loc: (1,17)-(1,20) = "end" diff --git a/test/prism/snapshots/seattlerb/defs_as_arg_with_do_block_inside.txt b/test/prism/snapshots/seattlerb/defs_as_arg_with_do_block_inside.txt deleted file mode 100644 index f9479eb11bddca..00000000000000 --- a/test/prism/snapshots/seattlerb/defs_as_arg_with_do_block_inside.txt +++ /dev/null @@ -1,66 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,30)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,30)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,30)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :p - ├── message_loc: (1,0)-(1,1) = "p" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,2)-(1,30)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ DefNode (location: (1,2)-(1,30)) - │ ├── flags: ∅ - │ ├── name: :b - │ ├── name_loc: (1,11)-(1,12) = "b" - │ ├── receiver: - │ │ @ SelfNode (location: (1,6)-(1,10)) - │ │ └── flags: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (1,14)-(1,25)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (1,14)-(1,25)) - │ │ ├── flags: newline - │ │ ├── receiver: - │ │ │ @ CallNode (location: (1,14)-(1,15)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :x - │ │ │ ├── message_loc: (1,14)-(1,15) = "x" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: (1,15)-(1,16) = "." - │ │ ├── name: :y - │ │ ├── message_loc: (1,16)-(1,17) = "y" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: - │ │ @ BlockNode (location: (1,18)-(1,25)) - │ │ ├── flags: ∅ - │ │ ├── locals: [] - │ │ ├── parameters: ∅ - │ │ ├── body: ∅ - │ │ ├── opening_loc: (1,18)-(1,20) = "do" - │ │ └── closing_loc: (1,22)-(1,25) = "end" - │ ├── locals: [] - │ ├── def_keyword_loc: (1,2)-(1,5) = "def" - │ ├── operator_loc: (1,10)-(1,11) = "." - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (1,27)-(1,30) = "end" - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/defs_comments.txt b/test/prism/snapshots/seattlerb/defs_comments.txt deleted file mode 100644 index 7f94497978b32a..00000000000000 --- a/test/prism/snapshots/seattlerb/defs_comments.txt +++ /dev/null @@ -1,23 +0,0 @@ -@ ProgramNode (location: (4,0)-(5,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (4,0)-(5,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (4,0)-(5,3)) - ├── flags: newline - ├── name: :blah - ├── name_loc: (4,9)-(4,13) = "blah" - ├── receiver: - │ @ SelfNode (location: (4,4)-(4,8)) - │ └── flags: ∅ - ├── parameters: ∅ - ├── body: ∅ - ├── locals: [] - ├── def_keyword_loc: (4,0)-(4,3) = "def" - ├── operator_loc: (4,8)-(4,9) = "." - ├── lparen_loc: ∅ - ├── rparen_loc: ∅ - ├── equal_loc: ∅ - └── end_keyword_loc: (5,0)-(5,3) = "end" diff --git a/test/prism/snapshots/seattlerb/defs_endless_command.txt b/test/prism/snapshots/seattlerb/defs_endless_command.txt deleted file mode 100644 index f34d667901c789..00000000000000 --- a/test/prism/snapshots/seattlerb/defs_endless_command.txt +++ /dev/null @@ -1,50 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,35)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,35)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(1,35)) - ├── flags: newline - ├── name: :some_method - ├── name_loc: (1,6)-(1,17) = "some_method" - ├── receiver: - │ @ CallNode (location: (1,4)-(1,5)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :x - │ ├── message_loc: (1,4)-(1,5) = "x" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── parameters: ∅ - ├── body: - │ @ StatementsNode (location: (1,20)-(1,35)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,20)-(1,35)) - │ ├── flags: ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :other_method - │ ├── message_loc: (1,20)-(1,32) = "other_method" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,33)-(1,35)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (1,33)-(1,35)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 42 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── locals: [] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: (1,5)-(1,6) = "." - ├── lparen_loc: ∅ - ├── rparen_loc: ∅ - ├── equal_loc: (1,18)-(1,19) = "=" - └── end_keyword_loc: ∅ diff --git a/test/prism/snapshots/seattlerb/defs_endless_command_rescue.txt b/test/prism/snapshots/seattlerb/defs_endless_command_rescue.txt deleted file mode 100644 index fe859369400bbe..00000000000000 --- a/test/prism/snapshots/seattlerb/defs_endless_command_rescue.txt +++ /dev/null @@ -1,58 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,45)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,45)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(1,45)) - ├── flags: newline - ├── name: :some_method - ├── name_loc: (1,6)-(1,17) = "some_method" - ├── receiver: - │ @ CallNode (location: (1,4)-(1,5)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :x - │ ├── message_loc: (1,4)-(1,5) = "x" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── parameters: ∅ - ├── body: - │ @ StatementsNode (location: (1,20)-(1,45)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ RescueModifierNode (location: (1,20)-(1,45)) - │ ├── flags: ∅ - │ ├── expression: - │ │ @ CallNode (location: (1,20)-(1,35)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :other_method - │ │ ├── message_loc: (1,20)-(1,32) = "other_method" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (1,33)-(1,35)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (1,33)-(1,35)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 42 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── keyword_loc: (1,36)-(1,42) = "rescue" - │ └── rescue_expression: - │ @ IntegerNode (location: (1,43)-(1,45)) - │ ├── flags: static_literal, decimal - │ └── value: 24 - ├── locals: [] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: (1,5)-(1,6) = "." - ├── lparen_loc: ∅ - ├── rparen_loc: ∅ - ├── equal_loc: (1,18)-(1,19) = "=" - └── end_keyword_loc: ∅ diff --git a/test/prism/snapshots/seattlerb/defs_kwarg.txt b/test/prism/snapshots/seattlerb/defs_kwarg.txt deleted file mode 100644 index 86a2d562e3aafa..00000000000000 --- a/test/prism/snapshots/seattlerb/defs_kwarg.txt +++ /dev/null @@ -1,40 +0,0 @@ -@ ProgramNode (location: (1,0)-(2,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(2,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(2,3)) - ├── flags: newline - ├── name: :a - ├── name_loc: (1,9)-(1,10) = "a" - ├── receiver: - │ @ SelfNode (location: (1,4)-(1,8)) - │ └── flags: ∅ - ├── parameters: - │ @ ParametersNode (location: (1,11)-(1,15)) - │ ├── flags: ∅ - │ ├── requireds: (length: 0) - │ ├── optionals: (length: 0) - │ ├── rest: ∅ - │ ├── posts: (length: 0) - │ ├── keywords: (length: 1) - │ │ └── @ OptionalKeywordParameterNode (location: (1,11)-(1,15)) - │ │ ├── flags: ∅ - │ │ ├── name: :b - │ │ ├── name_loc: (1,11)-(1,13) = "b:" - │ │ └── value: - │ │ @ IntegerNode (location: (1,14)-(1,15)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── keyword_rest: ∅ - │ └── block: ∅ - ├── body: ∅ - ├── locals: [:b] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: (1,8)-(1,9) = "." - ├── lparen_loc: ∅ - ├── rparen_loc: ∅ - ├── equal_loc: ∅ - └── end_keyword_loc: (2,0)-(2,3) = "end" diff --git a/test/prism/snapshots/seattlerb/defs_oneliner.txt b/test/prism/snapshots/seattlerb/defs_oneliner.txt deleted file mode 100644 index c99b81084407a2..00000000000000 --- a/test/prism/snapshots/seattlerb/defs_oneliner.txt +++ /dev/null @@ -1,55 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,32)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,32)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(1,32)) - ├── flags: newline - ├── name: :exec - ├── name_loc: (1,9)-(1,13) = "exec" - ├── receiver: - │ @ SelfNode (location: (1,4)-(1,8)) - │ └── flags: ∅ - ├── parameters: - │ @ ParametersNode (location: (1,14)-(1,17)) - │ ├── flags: ∅ - │ ├── requireds: (length: 1) - │ │ └── @ RequiredParameterNode (location: (1,14)-(1,17)) - │ │ ├── flags: ∅ - │ │ └── name: :cmd - │ ├── optionals: (length: 0) - │ ├── rest: ∅ - │ ├── posts: (length: 0) - │ ├── keywords: (length: 0) - │ ├── keyword_rest: ∅ - │ └── block: ∅ - ├── body: - │ @ StatementsNode (location: (1,21)-(1,32)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,21)-(1,32)) - │ ├── flags: ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :system - │ ├── message_loc: (1,21)-(1,27) = "system" - │ ├── opening_loc: (1,27)-(1,28) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,28)-(1,31)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ LocalVariableReadNode (location: (1,28)-(1,31)) - │ │ ├── flags: ∅ - │ │ ├── name: :cmd - │ │ └── depth: 0 - │ ├── closing_loc: (1,31)-(1,32) = ")" - │ └── block: ∅ - ├── locals: [:cmd] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: (1,8)-(1,9) = "." - ├── lparen_loc: (1,13)-(1,14) = "(" - ├── rparen_loc: (1,17)-(1,18) = ")" - ├── equal_loc: (1,19)-(1,20) = "=" - └── end_keyword_loc: ∅ diff --git a/test/prism/snapshots/seattlerb/defs_oneliner_eq2.txt b/test/prism/snapshots/seattlerb/defs_oneliner_eq2.txt deleted file mode 100644 index 328ba5d78b27aa..00000000000000 --- a/test/prism/snapshots/seattlerb/defs_oneliner_eq2.txt +++ /dev/null @@ -1,57 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ ClassNode (location: (1,0)-(3,3)) - ├── flags: newline - ├── locals: [] - ├── class_keyword_loc: (1,0)-(1,5) = "class" - ├── constant_path: - │ @ ConstantReadNode (location: (1,6)-(1,7)) - │ ├── flags: ∅ - │ └── name: :X - ├── inheritance_operator_loc: ∅ - ├── superclass: ∅ - ├── body: - │ @ StatementsNode (location: (2,2)-(2,21)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ DefNode (location: (2,2)-(2,21)) - │ ├── flags: newline - │ ├── name: :== - │ ├── name_loc: (2,11)-(2,13) = "==" - │ ├── receiver: - │ │ @ SelfNode (location: (2,6)-(2,10)) - │ │ └── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (2,14)-(2,15)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (2,14)-(2,15)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :o - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (2,19)-(2,21)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ IntegerNode (location: (2,19)-(2,21)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 42 - │ ├── locals: [:o] - │ ├── def_keyword_loc: (2,2)-(2,5) = "def" - │ ├── operator_loc: (2,10)-(2,11) = "." - │ ├── lparen_loc: (2,13)-(2,14) = "(" - │ ├── rparen_loc: (2,15)-(2,16) = ")" - │ ├── equal_loc: (2,17)-(2,18) = "=" - │ └── end_keyword_loc: ∅ - ├── end_keyword_loc: (3,0)-(3,3) = "end" - └── name: :X diff --git a/test/prism/snapshots/seattlerb/defs_oneliner_rescue.txt b/test/prism/snapshots/seattlerb/defs_oneliner_rescue.txt deleted file mode 100644 index 985744d45e93bc..00000000000000 --- a/test/prism/snapshots/seattlerb/defs_oneliner_rescue.txt +++ /dev/null @@ -1,186 +0,0 @@ -@ ProgramNode (location: (1,0)-(13,43)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(13,43)) - ├── flags: ∅ - └── body: (length: 3) - ├── @ DefNode (location: (1,0)-(5,3)) - │ ├── flags: newline - │ ├── name: :exec - │ ├── name_loc: (1,9)-(1,13) = "exec" - │ ├── receiver: - │ │ @ SelfNode (location: (1,4)-(1,8)) - │ │ └── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,14)-(1,17)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (1,14)-(1,17)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :cmd - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ BeginNode (location: (1,0)-(5,3)) - │ │ ├── flags: ∅ - │ │ ├── begin_keyword_loc: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (2,2)-(2,13)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (2,2)-(2,13)) - │ │ │ ├── flags: newline, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :system - │ │ │ ├── message_loc: (2,2)-(2,8) = "system" - │ │ │ ├── opening_loc: (2,8)-(2,9) = "(" - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (2,9)-(2,12)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ LocalVariableReadNode (location: (2,9)-(2,12)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :cmd - │ │ │ │ └── depth: 0 - │ │ │ ├── closing_loc: (2,12)-(2,13) = ")" - │ │ │ └── block: ∅ - │ │ ├── rescue_clause: - │ │ │ @ RescueNode (location: (3,0)-(4,5)) - │ │ │ ├── flags: ∅ - │ │ │ ├── keyword_loc: (3,0)-(3,6) = "rescue" - │ │ │ ├── exceptions: (length: 0) - │ │ │ ├── operator_loc: ∅ - │ │ │ ├── reference: ∅ - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (4,2)-(4,5)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ NilNode (location: (4,2)-(4,5)) - │ │ │ │ └── flags: newline, static_literal - │ │ │ └── subsequent: ∅ - │ │ ├── else_clause: ∅ - │ │ ├── ensure_clause: ∅ - │ │ └── end_keyword_loc: (5,0)-(5,3) = "end" - │ ├── locals: [:cmd] - │ ├── def_keyword_loc: (1,0)-(1,3) = "def" - │ ├── operator_loc: (1,8)-(1,9) = "." - │ ├── lparen_loc: (1,13)-(1,14) = "(" - │ ├── rparen_loc: (1,17)-(1,18) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (5,0)-(5,3) = "end" - ├── @ DefNode (location: (8,0)-(10,3)) - │ ├── flags: newline - │ ├── name: :exec - │ ├── name_loc: (8,9)-(8,13) = "exec" - │ ├── receiver: - │ │ @ SelfNode (location: (8,4)-(8,8)) - │ │ └── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (8,14)-(8,17)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (8,14)-(8,17)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :cmd - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (9,2)-(9,24)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ RescueModifierNode (location: (9,2)-(9,24)) - │ │ ├── flags: newline - │ │ ├── expression: - │ │ │ @ CallNode (location: (9,2)-(9,13)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :system - │ │ │ ├── message_loc: (9,2)-(9,8) = "system" - │ │ │ ├── opening_loc: (9,8)-(9,9) = "(" - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (9,9)-(9,12)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ LocalVariableReadNode (location: (9,9)-(9,12)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :cmd - │ │ │ │ └── depth: 0 - │ │ │ ├── closing_loc: (9,12)-(9,13) = ")" - │ │ │ └── block: ∅ - │ │ ├── keyword_loc: (9,14)-(9,20) = "rescue" - │ │ └── rescue_expression: - │ │ @ NilNode (location: (9,21)-(9,24)) - │ │ └── flags: static_literal - │ ├── locals: [:cmd] - │ ├── def_keyword_loc: (8,0)-(8,3) = "def" - │ ├── operator_loc: (8,8)-(8,9) = "." - │ ├── lparen_loc: (8,13)-(8,14) = "(" - │ ├── rparen_loc: (8,17)-(8,18) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (10,0)-(10,3) = "end" - └── @ DefNode (location: (13,0)-(13,43)) - ├── flags: newline - ├── name: :exec - ├── name_loc: (13,9)-(13,13) = "exec" - ├── receiver: - │ @ SelfNode (location: (13,4)-(13,8)) - │ └── flags: ∅ - ├── parameters: - │ @ ParametersNode (location: (13,14)-(13,17)) - │ ├── flags: ∅ - │ ├── requireds: (length: 1) - │ │ └── @ RequiredParameterNode (location: (13,14)-(13,17)) - │ │ ├── flags: ∅ - │ │ └── name: :cmd - │ ├── optionals: (length: 0) - │ ├── rest: ∅ - │ ├── posts: (length: 0) - │ ├── keywords: (length: 0) - │ ├── keyword_rest: ∅ - │ └── block: ∅ - ├── body: - │ @ StatementsNode (location: (13,21)-(13,43)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ RescueModifierNode (location: (13,21)-(13,43)) - │ ├── flags: ∅ - │ ├── expression: - │ │ @ CallNode (location: (13,21)-(13,32)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :system - │ │ ├── message_loc: (13,21)-(13,27) = "system" - │ │ ├── opening_loc: (13,27)-(13,28) = "(" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (13,28)-(13,31)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ LocalVariableReadNode (location: (13,28)-(13,31)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :cmd - │ │ │ └── depth: 0 - │ │ ├── closing_loc: (13,31)-(13,32) = ")" - │ │ └── block: ∅ - │ ├── keyword_loc: (13,33)-(13,39) = "rescue" - │ └── rescue_expression: - │ @ NilNode (location: (13,40)-(13,43)) - │ └── flags: static_literal - ├── locals: [:cmd] - ├── def_keyword_loc: (13,0)-(13,3) = "def" - ├── operator_loc: (13,8)-(13,9) = "." - ├── lparen_loc: (13,13)-(13,14) = "(" - ├── rparen_loc: (13,17)-(13,18) = ")" - ├── equal_loc: (13,19)-(13,20) = "=" - └── end_keyword_loc: ∅ diff --git a/test/prism/snapshots/seattlerb/difficult0_.txt b/test/prism/snapshots/seattlerb/difficult0_.txt deleted file mode 100644 index 233440b101920c..00000000000000 --- a/test/prism/snapshots/seattlerb/difficult0_.txt +++ /dev/null @@ -1,75 +0,0 @@ -@ ProgramNode (location: (1,0)-(4,8)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(4,8)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(4,8)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :p - ├── message_loc: (1,0)-(1,1) = "p" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,2)-(4,8)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ CallNode (location: (1,2)-(4,8)) - │ ├── flags: ∅ - │ ├── receiver: - │ │ @ CallNode (location: (1,2)-(4,4)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ StringNode (location: (1,2)-(1,8)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (1,2)-(1,8) = "<<-END" - │ │ │ ├── content_loc: (2,0)-(3,0) = " a\n" - │ │ │ ├── closing_loc: (3,0)-(4,0) = " END\n" - │ │ │ └── unescaped: " a\n" - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :+ - │ │ ├── message_loc: (1,8)-(1,9) = "+" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (1,9)-(4,4)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ InterpolatedStringNode (location: (1,9)-(4,4)) - │ │ │ ├── flags: static_literal - │ │ │ ├── opening_loc: (1,9)-(1,10) = "'" - │ │ │ ├── parts: (length: 2) - │ │ │ │ ├── @ StringNode (location: (1,10)-(2,0)) - │ │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── content_loc: (1,10)-(2,0) = "b\n" - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── unescaped: "b\n" - │ │ │ │ └── @ StringNode (location: (4,0)-(4,3)) - │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── content_loc: (4,0)-(4,3) = " c" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: " c" - │ │ │ └── closing_loc: (4,3)-(4,4) = "'" - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :+ - │ ├── message_loc: (4,4)-(4,5) = "+" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (4,5)-(4,8)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ StringNode (location: (4,5)-(4,8)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (4,5)-(4,6) = "'" - │ │ ├── content_loc: (4,6)-(4,7) = "d" - │ │ ├── closing_loc: (4,7)-(4,8) = "'" - │ │ └── unescaped: "d" - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/difficult1_line_numbers.txt b/test/prism/snapshots/seattlerb/difficult1_line_numbers.txt deleted file mode 100644 index c34579e6ac8a5a..00000000000000 --- a/test/prism/snapshots/seattlerb/difficult1_line_numbers.txt +++ /dev/null @@ -1,272 +0,0 @@ -@ ProgramNode (location: (1,0)-(12,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(12,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ IfNode (location: (1,0)-(12,3)) - ├── flags: newline - ├── if_keyword_loc: (1,0)-(1,2) = "if" - ├── predicate: - │ @ TrueNode (location: (1,3)-(1,7)) - │ └── flags: static_literal - ├── then_keyword_loc: ∅ - ├── statements: - │ @ StatementsNode (location: (2,2)-(11,11)) - │ ├── flags: ∅ - │ └── body: (length: 10) - │ ├── @ CallNode (location: (2,2)-(2,5)) - │ │ ├── flags: newline, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :p - │ │ ├── message_loc: (2,2)-(2,3) = "p" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (2,4)-(2,5)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (2,4)-(2,5)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── @ CallNode (location: (3,2)-(3,7)) - │ │ ├── flags: newline - │ │ ├── receiver: - │ │ │ @ CallNode (location: (3,2)-(3,3)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :a - │ │ │ ├── message_loc: (3,2)-(3,3) = "a" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: (3,3)-(3,4) = "." - │ │ ├── name: :b - │ │ ├── message_loc: (3,4)-(3,5) = "b" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (3,6)-(3,7)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (3,6)-(3,7)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── @ CallNode (location: (4,2)-(4,10)) - │ │ ├── flags: newline - │ │ ├── receiver: - │ │ │ @ CallNode (location: (4,2)-(4,3)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :c - │ │ │ ├── message_loc: (4,2)-(4,3) = "c" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: (4,3)-(4,4) = "." - │ │ ├── name: :d - │ │ ├── message_loc: (4,4)-(4,5) = "d" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (4,6)-(4,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 2) - │ │ │ ├── @ IntegerNode (location: (4,6)-(4,7)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 3 - │ │ │ └── @ IntegerNode (location: (4,9)-(4,10)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 4 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── @ CallNode (location: (5,2)-(5,7)) - │ │ ├── flags: newline - │ │ ├── receiver: - │ │ │ @ CallNode (location: (5,2)-(5,3)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :e - │ │ │ ├── message_loc: (5,2)-(5,3) = "e" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: (5,3)-(5,4) = "." - │ │ ├── name: :f - │ │ ├── message_loc: (5,4)-(5,5) = "f" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (5,6)-(5,7)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (5,6)-(5,7)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 5 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── @ CallNode (location: (6,2)-(6,10)) - │ │ ├── flags: newline - │ │ ├── receiver: - │ │ │ @ CallNode (location: (6,2)-(6,3)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :g - │ │ │ ├── message_loc: (6,2)-(6,3) = "g" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: (6,3)-(6,4) = "." - │ │ ├── name: :h - │ │ ├── message_loc: (6,4)-(6,5) = "h" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (6,6)-(6,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 2) - │ │ │ ├── @ IntegerNode (location: (6,6)-(6,7)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 6 - │ │ │ └── @ IntegerNode (location: (6,9)-(6,10)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 7 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── @ CallNode (location: (7,2)-(7,6)) - │ │ ├── flags: newline, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :p - │ │ ├── message_loc: (7,2)-(7,3) = "p" - │ │ ├── opening_loc: (7,3)-(7,4) = "(" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (7,4)-(7,5)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (7,4)-(7,5)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── closing_loc: (7,5)-(7,6) = ")" - │ │ └── block: ∅ - │ ├── @ CallNode (location: (8,2)-(8,8)) - │ │ ├── flags: newline - │ │ ├── receiver: - │ │ │ @ CallNode (location: (8,2)-(8,3)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :a - │ │ │ ├── message_loc: (8,2)-(8,3) = "a" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: (8,3)-(8,4) = "." - │ │ ├── name: :b - │ │ ├── message_loc: (8,4)-(8,5) = "b" - │ │ ├── opening_loc: (8,5)-(8,6) = "(" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (8,6)-(8,7)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (8,6)-(8,7)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ ├── closing_loc: (8,7)-(8,8) = ")" - │ │ └── block: ∅ - │ ├── @ CallNode (location: (9,2)-(9,11)) - │ │ ├── flags: newline - │ │ ├── receiver: - │ │ │ @ CallNode (location: (9,2)-(9,3)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :c - │ │ │ ├── message_loc: (9,2)-(9,3) = "c" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: (9,3)-(9,4) = "." - │ │ ├── name: :d - │ │ ├── message_loc: (9,4)-(9,5) = "d" - │ │ ├── opening_loc: (9,5)-(9,6) = "(" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (9,6)-(9,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 2) - │ │ │ ├── @ IntegerNode (location: (9,6)-(9,7)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 3 - │ │ │ └── @ IntegerNode (location: (9,9)-(9,10)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 4 - │ │ ├── closing_loc: (9,10)-(9,11) = ")" - │ │ └── block: ∅ - │ ├── @ CallNode (location: (10,2)-(10,8)) - │ │ ├── flags: newline - │ │ ├── receiver: - │ │ │ @ CallNode (location: (10,2)-(10,3)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :e - │ │ │ ├── message_loc: (10,2)-(10,3) = "e" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: (10,3)-(10,4) = "." - │ │ ├── name: :f - │ │ ├── message_loc: (10,4)-(10,5) = "f" - │ │ ├── opening_loc: (10,5)-(10,6) = "(" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (10,6)-(10,7)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (10,6)-(10,7)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 5 - │ │ ├── closing_loc: (10,7)-(10,8) = ")" - │ │ └── block: ∅ - │ └── @ CallNode (location: (11,2)-(11,11)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (11,2)-(11,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :g - │ │ ├── message_loc: (11,2)-(11,3) = "g" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (11,3)-(11,4) = "." - │ ├── name: :h - │ ├── message_loc: (11,4)-(11,5) = "h" - │ ├── opening_loc: (11,5)-(11,6) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (11,6)-(11,10)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ IntegerNode (location: (11,6)-(11,7)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 6 - │ │ └── @ IntegerNode (location: (11,9)-(11,10)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 7 - │ ├── closing_loc: (11,10)-(11,11) = ")" - │ └── block: ∅ - ├── subsequent: ∅ - └── end_keyword_loc: (12,0)-(12,3) = "end" diff --git a/test/prism/snapshots/seattlerb/difficult1_line_numbers2.txt b/test/prism/snapshots/seattlerb/difficult1_line_numbers2.txt deleted file mode 100644 index ae710f997f3a68..00000000000000 --- a/test/prism/snapshots/seattlerb/difficult1_line_numbers2.txt +++ /dev/null @@ -1,86 +0,0 @@ -@ ProgramNode (location: (1,0)-(7,1)) -├── flags: ∅ -├── locals: [:b, :c] -└── statements: - @ StatementsNode (location: (1,0)-(7,1)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ IfNode (location: (1,0)-(6,3)) - │ ├── flags: newline - │ ├── if_keyword_loc: (1,0)-(1,2) = "if" - │ ├── predicate: - │ │ @ TrueNode (location: (1,3)-(1,7)) - │ │ └── flags: static_literal - │ ├── then_keyword_loc: (1,8)-(1,12) = "then" - │ ├── statements: - │ │ @ StatementsNode (location: (2,2)-(5,6)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 4) - │ │ ├── @ CallNode (location: (2,2)-(2,8)) - │ │ │ ├── flags: newline, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :p - │ │ │ ├── message_loc: (2,2)-(2,3) = "p" - │ │ │ ├── opening_loc: (2,3)-(2,4) = "(" - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (2,4)-(2,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ StringNode (location: (2,4)-(2,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── opening_loc: (2,4)-(2,5) = "\"" - │ │ │ │ ├── content_loc: (2,5)-(2,6) = "a" - │ │ │ │ ├── closing_loc: (2,6)-(2,7) = "\"" - │ │ │ │ └── unescaped: "a" - │ │ │ ├── closing_loc: (2,7)-(2,8) = ")" - │ │ │ └── block: ∅ - │ │ ├── @ LocalVariableWriteNode (location: (3,2)-(3,7)) - │ │ │ ├── flags: newline - │ │ │ ├── name: :b - │ │ │ ├── depth: 0 - │ │ │ ├── name_loc: (3,2)-(3,3) = "b" - │ │ │ ├── value: - │ │ │ │ @ IntegerNode (location: (3,6)-(3,7)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ └── operator_loc: (3,4)-(3,5) = "=" - │ │ ├── @ CallNode (location: (4,2)-(4,5)) - │ │ │ ├── flags: newline, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :p - │ │ │ ├── message_loc: (4,2)-(4,3) = "p" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (4,4)-(4,5)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ LocalVariableReadNode (location: (4,4)-(4,5)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :b - │ │ │ │ └── depth: 0 - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── @ LocalVariableWriteNode (location: (5,2)-(5,6)) - │ │ ├── flags: newline - │ │ ├── name: :c - │ │ ├── depth: 0 - │ │ ├── name_loc: (5,2)-(5,3) = "c" - │ │ ├── value: - │ │ │ @ IntegerNode (location: (5,5)-(5,6)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── operator_loc: (5,4)-(5,5) = "=" - │ ├── subsequent: ∅ - │ └── end_keyword_loc: (6,0)-(6,3) = "end" - └── @ CallNode (location: (7,0)-(7,1)) - ├── flags: newline, variable_call, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :a - ├── message_loc: (7,0)-(7,1) = "a" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/difficult2_.txt b/test/prism/snapshots/seattlerb/difficult2_.txt deleted file mode 100644 index 2a7e8e49d0f57a..00000000000000 --- a/test/prism/snapshots/seattlerb/difficult2_.txt +++ /dev/null @@ -1,81 +0,0 @@ -@ ProgramNode (location: (1,0)-(2,6)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(2,6)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ IfNode (location: (1,0)-(1,13)) - │ ├── flags: newline - │ ├── if_keyword_loc: ∅ - │ ├── predicate: - │ │ @ IntegerNode (location: (1,0)-(1,1)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── then_keyword_loc: (1,2)-(1,3) = "?" - │ ├── statements: - │ │ @ StatementsNode (location: (1,4)-(1,9)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (1,4)-(1,9)) - │ │ ├── flags: newline, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :b - │ │ ├── message_loc: (1,4)-(1,5) = "b" - │ │ ├── opening_loc: (1,5)-(1,6) = "(" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (1,6)-(1,8)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ StringNode (location: (1,6)-(1,8)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (1,6)-(1,7) = "'" - │ │ │ ├── content_loc: (1,7)-(1,7) = "" - │ │ │ ├── closing_loc: (1,7)-(1,8) = "'" - │ │ │ └── unescaped: "" - │ │ ├── closing_loc: (1,8)-(1,9) = ")" - │ │ └── block: ∅ - │ ├── subsequent: - │ │ @ ElseNode (location: (1,10)-(1,13)) - │ │ ├── flags: ∅ - │ │ ├── else_keyword_loc: (1,10)-(1,11) = ":" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (1,12)-(1,13)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ IntegerNode (location: (1,12)-(1,13)) - │ │ │ ├── flags: newline, static_literal, decimal - │ │ │ └── value: 2 - │ │ └── end_keyword_loc: ∅ - │ └── end_keyword_loc: ∅ - └── @ CallNode (location: (2,0)-(2,6)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :a - ├── message_loc: (2,0)-(2,1) = "a" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (2,2)-(2,6)) - │ ├── flags: contains_keywords - │ └── arguments: (length: 1) - │ └── @ KeywordHashNode (location: (2,2)-(2,6)) - │ ├── flags: symbol_keys - │ └── elements: (length: 1) - │ └── @ AssocNode (location: (2,2)-(2,6)) - │ ├── flags: static_literal - │ ├── key: - │ │ @ SymbolNode (location: (2,2)-(2,4)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: ∅ - │ │ ├── value_loc: (2,2)-(2,3) = "d" - │ │ ├── closing_loc: (2,3)-(2,4) = ":" - │ │ └── unescaped: "d" - │ ├── value: - │ │ @ IntegerNode (location: (2,5)-(2,6)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 3 - │ └── operator_loc: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/difficult3_.txt b/test/prism/snapshots/seattlerb/difficult3_.txt deleted file mode 100644 index 313cfa4cf265c2..00000000000000 --- a/test/prism/snapshots/seattlerb/difficult3_.txt +++ /dev/null @@ -1,59 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,18)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,18)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,18)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :f - ├── message_loc: (1,0)-(1,1) = "f" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,18)) - ├── flags: ∅ - ├── locals: [:a, :b, :c] - ├── parameters: - │ @ BlockParametersNode (location: (1,4)-(1,16)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,5)-(1,15)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 2) - │ │ │ ├── @ RequiredParameterNode (location: (1,5)-(1,6)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :a - │ │ │ └── @ MultiTargetNode (location: (1,8)-(1,15)) - │ │ │ ├── flags: ∅ - │ │ │ ├── lefts: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (1,9)-(1,10)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :b - │ │ │ ├── rest: - │ │ │ │ @ SplatNode (location: (1,12)-(1,14)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── operator_loc: (1,12)-(1,13) = "*" - │ │ │ │ └── expression: - │ │ │ │ @ RequiredParameterNode (location: (1,13)-(1,14)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :c - │ │ │ ├── rights: (length: 0) - │ │ │ ├── lparen_loc: (1,8)-(1,9) = "(" - │ │ │ └── rparen_loc: (1,14)-(1,15) = ")" - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,4)-(1,5) = "|" - │ └── closing_loc: (1,15)-(1,16) = "|" - ├── body: ∅ - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,17)-(1,18) = "}" diff --git a/test/prism/snapshots/seattlerb/difficult3_2.txt b/test/prism/snapshots/seattlerb/difficult3_2.txt deleted file mode 100644 index e1eed78c7963eb..00000000000000 --- a/test/prism/snapshots/seattlerb/difficult3_2.txt +++ /dev/null @@ -1,47 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,13)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,13)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,13)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :f - ├── message_loc: (1,0)-(1,1) = "f" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,13)) - ├── flags: ∅ - ├── locals: [:a, :b] - ├── parameters: - │ @ BlockParametersNode (location: (1,4)-(1,11)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,5)-(1,10)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: - │ │ │ @ RestParameterNode (location: (1,5)-(1,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :a - │ │ │ ├── name_loc: (1,6)-(1,7) = "a" - │ │ │ └── operator_loc: (1,5)-(1,6) = "*" - │ │ ├── posts: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (1,9)-(1,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :b - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,4)-(1,5) = "|" - │ └── closing_loc: (1,10)-(1,11) = "|" - ├── body: ∅ - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,12)-(1,13) = "}" diff --git a/test/prism/snapshots/seattlerb/difficult3_3.txt b/test/prism/snapshots/seattlerb/difficult3_3.txt deleted file mode 100644 index 5dcd71d651508a..00000000000000 --- a/test/prism/snapshots/seattlerb/difficult3_3.txt +++ /dev/null @@ -1,52 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,17)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,17)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,17)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :f - ├── message_loc: (1,0)-(1,1) = "f" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,17)) - ├── flags: ∅ - ├── locals: [:a, :b, :c] - ├── parameters: - │ @ BlockParametersNode (location: (1,4)-(1,15)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,5)-(1,14)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: - │ │ │ @ RestParameterNode (location: (1,5)-(1,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :a - │ │ │ ├── name_loc: (1,6)-(1,7) = "a" - │ │ │ └── operator_loc: (1,5)-(1,6) = "*" - │ │ ├── posts: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (1,9)-(1,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :b - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: - │ │ @ BlockParameterNode (location: (1,12)-(1,14)) - │ │ ├── flags: ∅ - │ │ ├── name: :c - │ │ ├── name_loc: (1,13)-(1,14) = "c" - │ │ └── operator_loc: (1,12)-(1,13) = "&" - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,4)-(1,5) = "|" - │ └── closing_loc: (1,14)-(1,15) = "|" - ├── body: ∅ - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,16)-(1,17) = "}" diff --git a/test/prism/snapshots/seattlerb/difficult3_4.txt b/test/prism/snapshots/seattlerb/difficult3_4.txt deleted file mode 100644 index b733c42265eb6d..00000000000000 --- a/test/prism/snapshots/seattlerb/difficult3_4.txt +++ /dev/null @@ -1,47 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,17)) -├── flags: ∅ -├── locals: [:a] -└── statements: - @ StatementsNode (location: (1,0)-(1,17)) - ├── flags: ∅ - └── body: (length: 1) - └── @ LocalVariableWriteNode (location: (1,0)-(1,17)) - ├── flags: newline - ├── name: :a - ├── depth: 0 - ├── name_loc: (1,0)-(1,1) = "a" - ├── value: - │ @ IfNode (location: (1,2)-(1,17)) - │ ├── flags: newline - │ ├── if_keyword_loc: ∅ - │ ├── predicate: - │ │ @ CallNode (location: (1,2)-(1,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :b - │ │ ├── message_loc: (1,2)-(1,3) = "b" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── then_keyword_loc: (1,4)-(1,5) = "?" - │ ├── statements: - │ │ @ StatementsNode (location: (1,6)-(1,10)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ TrueNode (location: (1,6)-(1,10)) - │ │ └── flags: newline, static_literal - │ ├── subsequent: - │ │ @ ElseNode (location: (1,10)-(1,17)) - │ │ ├── flags: ∅ - │ │ ├── else_keyword_loc: (1,10)-(1,11) = ":" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (1,12)-(1,17)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ FalseNode (location: (1,12)-(1,17)) - │ │ │ └── flags: newline, static_literal - │ │ └── end_keyword_loc: ∅ - │ └── end_keyword_loc: ∅ - └── operator_loc: (1,1)-(1,2) = "=" diff --git a/test/prism/snapshots/seattlerb/difficult3_5.txt b/test/prism/snapshots/seattlerb/difficult3_5.txt deleted file mode 100644 index b8bbbdc03ec5a1..00000000000000 --- a/test/prism/snapshots/seattlerb/difficult3_5.txt +++ /dev/null @@ -1,54 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,19)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,19)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,19)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :f - ├── message_loc: (1,0)-(1,1) = "f" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,2)-(1,19)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ LambdaNode (location: (1,2)-(1,19)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── operator_loc: (1,2)-(1,4) = "->" - │ ├── opening_loc: (1,7)-(1,8) = "{" - │ ├── closing_loc: (1,18)-(1,19) = "}" - │ ├── parameters: - │ │ @ BlockParametersNode (location: (1,4)-(1,6)) - │ │ ├── flags: ∅ - │ │ ├── parameters: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: (1,4)-(1,5) = "(" - │ │ └── closing_loc: (1,5)-(1,6) = ")" - │ └── body: - │ @ StatementsNode (location: (1,9)-(1,17)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,9)-(1,17)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :g - │ ├── message_loc: (1,9)-(1,10) = "g" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (1,11)-(1,17)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (1,11)-(1,13) = "do" - │ └── closing_loc: (1,14)-(1,17) = "end" - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/difficult3__10.txt b/test/prism/snapshots/seattlerb/difficult3__10.txt deleted file mode 100644 index a5ce0762f16700..00000000000000 --- a/test/prism/snapshots/seattlerb/difficult3__10.txt +++ /dev/null @@ -1,59 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,18)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,18)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,18)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :f - ├── message_loc: (1,0)-(1,1) = "f" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,18)) - ├── flags: ∅ - ├── locals: [:a, :b, :c] - ├── parameters: - │ @ BlockParametersNode (location: (1,4)-(1,16)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,5)-(1,15)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 2) - │ │ │ ├── @ RequiredParameterNode (location: (1,5)-(1,6)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :a - │ │ │ └── @ MultiTargetNode (location: (1,8)-(1,15)) - │ │ │ ├── flags: ∅ - │ │ │ ├── lefts: (length: 0) - │ │ │ ├── rest: - │ │ │ │ @ SplatNode (location: (1,9)-(1,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── operator_loc: (1,9)-(1,10) = "*" - │ │ │ │ └── expression: - │ │ │ │ @ RequiredParameterNode (location: (1,10)-(1,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :b - │ │ │ ├── rights: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (1,13)-(1,14)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :c - │ │ │ ├── lparen_loc: (1,8)-(1,9) = "(" - │ │ │ └── rparen_loc: (1,14)-(1,15) = ")" - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,4)-(1,5) = "|" - │ └── closing_loc: (1,15)-(1,16) = "|" - ├── body: ∅ - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,17)-(1,18) = "}" diff --git a/test/prism/snapshots/seattlerb/difficult3__11.txt b/test/prism/snapshots/seattlerb/difficult3__11.txt deleted file mode 100644 index c1017885d8ef16..00000000000000 --- a/test/prism/snapshots/seattlerb/difficult3__11.txt +++ /dev/null @@ -1,53 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,14)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,14)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,14)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :f - ├── message_loc: (1,0)-(1,1) = "f" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,14)) - ├── flags: ∅ - ├── locals: [:a] - ├── parameters: - │ @ BlockParametersNode (location: (1,4)-(1,12)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,5)-(1,11)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 2) - │ │ │ ├── @ RequiredParameterNode (location: (1,5)-(1,6)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :a - │ │ │ └── @ MultiTargetNode (location: (1,8)-(1,11)) - │ │ │ ├── flags: ∅ - │ │ │ ├── lefts: (length: 0) - │ │ │ ├── rest: - │ │ │ │ @ SplatNode (location: (1,9)-(1,10)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── operator_loc: (1,9)-(1,10) = "*" - │ │ │ │ └── expression: ∅ - │ │ │ ├── rights: (length: 0) - │ │ │ ├── lparen_loc: (1,8)-(1,9) = "(" - │ │ │ └── rparen_loc: (1,10)-(1,11) = ")" - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,4)-(1,5) = "|" - │ └── closing_loc: (1,11)-(1,12) = "|" - ├── body: ∅ - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,13)-(1,14) = "}" diff --git a/test/prism/snapshots/seattlerb/difficult3__12.txt b/test/prism/snapshots/seattlerb/difficult3__12.txt deleted file mode 100644 index bbcfad48b4c68a..00000000000000 --- a/test/prism/snapshots/seattlerb/difficult3__12.txt +++ /dev/null @@ -1,56 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,17)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,17)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,17)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :f - ├── message_loc: (1,0)-(1,1) = "f" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,17)) - ├── flags: ∅ - ├── locals: [:a, :b] - ├── parameters: - │ @ BlockParametersNode (location: (1,4)-(1,15)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,5)-(1,14)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 2) - │ │ │ ├── @ RequiredParameterNode (location: (1,5)-(1,6)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :a - │ │ │ └── @ MultiTargetNode (location: (1,8)-(1,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── lefts: (length: 0) - │ │ │ ├── rest: - │ │ │ │ @ SplatNode (location: (1,9)-(1,10)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── operator_loc: (1,9)-(1,10) = "*" - │ │ │ │ └── expression: ∅ - │ │ │ ├── rights: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (1,12)-(1,13)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :b - │ │ │ ├── lparen_loc: (1,8)-(1,9) = "(" - │ │ │ └── rparen_loc: (1,13)-(1,14) = ")" - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,4)-(1,5) = "|" - │ └── closing_loc: (1,14)-(1,15) = "|" - ├── body: ∅ - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,16)-(1,17) = "}" diff --git a/test/prism/snapshots/seattlerb/difficult3__6.txt b/test/prism/snapshots/seattlerb/difficult3__6.txt deleted file mode 100644 index 95d1ac39b58409..00000000000000 --- a/test/prism/snapshots/seattlerb/difficult3__6.txt +++ /dev/null @@ -1,62 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,21)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,21)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,21)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :f - ├── message_loc: (1,0)-(1,1) = "f" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,21)) - ├── flags: ∅ - ├── locals: [:a, :b, :c, :d] - ├── parameters: - │ @ BlockParametersNode (location: (1,4)-(1,19)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,5)-(1,18)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 2) - │ │ │ ├── @ RequiredParameterNode (location: (1,5)-(1,6)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :a - │ │ │ └── @ MultiTargetNode (location: (1,8)-(1,18)) - │ │ │ ├── flags: ∅ - │ │ │ ├── lefts: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (1,9)-(1,10)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :b - │ │ │ ├── rest: - │ │ │ │ @ SplatNode (location: (1,12)-(1,14)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── operator_loc: (1,12)-(1,13) = "*" - │ │ │ │ └── expression: - │ │ │ │ @ RequiredParameterNode (location: (1,13)-(1,14)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :c - │ │ │ ├── rights: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (1,16)-(1,17)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :d - │ │ │ ├── lparen_loc: (1,8)-(1,9) = "(" - │ │ │ └── rparen_loc: (1,17)-(1,18) = ")" - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,4)-(1,5) = "|" - │ └── closing_loc: (1,18)-(1,19) = "|" - ├── body: ∅ - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,20)-(1,21) = "}" diff --git a/test/prism/snapshots/seattlerb/difficult3__7.txt b/test/prism/snapshots/seattlerb/difficult3__7.txt deleted file mode 100644 index 4640cfdb534854..00000000000000 --- a/test/prism/snapshots/seattlerb/difficult3__7.txt +++ /dev/null @@ -1,56 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,17)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,17)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,17)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :f - ├── message_loc: (1,0)-(1,1) = "f" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,17)) - ├── flags: ∅ - ├── locals: [:a, :b] - ├── parameters: - │ @ BlockParametersNode (location: (1,4)-(1,15)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,5)-(1,14)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 2) - │ │ │ ├── @ RequiredParameterNode (location: (1,5)-(1,6)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :a - │ │ │ └── @ MultiTargetNode (location: (1,8)-(1,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── lefts: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (1,9)-(1,10)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :b - │ │ │ ├── rest: - │ │ │ │ @ SplatNode (location: (1,12)-(1,13)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── operator_loc: (1,12)-(1,13) = "*" - │ │ │ │ └── expression: ∅ - │ │ │ ├── rights: (length: 0) - │ │ │ ├── lparen_loc: (1,8)-(1,9) = "(" - │ │ │ └── rparen_loc: (1,13)-(1,14) = ")" - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,4)-(1,5) = "|" - │ └── closing_loc: (1,14)-(1,15) = "|" - ├── body: ∅ - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,16)-(1,17) = "}" diff --git a/test/prism/snapshots/seattlerb/difficult3__8.txt b/test/prism/snapshots/seattlerb/difficult3__8.txt deleted file mode 100644 index e19cbfc279eb08..00000000000000 --- a/test/prism/snapshots/seattlerb/difficult3__8.txt +++ /dev/null @@ -1,59 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,20)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,20)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,20)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :f - ├── message_loc: (1,0)-(1,1) = "f" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,20)) - ├── flags: ∅ - ├── locals: [:a, :b, :c] - ├── parameters: - │ @ BlockParametersNode (location: (1,4)-(1,18)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,5)-(1,17)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 2) - │ │ │ ├── @ RequiredParameterNode (location: (1,5)-(1,6)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :a - │ │ │ └── @ MultiTargetNode (location: (1,8)-(1,17)) - │ │ │ ├── flags: ∅ - │ │ │ ├── lefts: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (1,9)-(1,10)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :b - │ │ │ ├── rest: - │ │ │ │ @ SplatNode (location: (1,12)-(1,13)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── operator_loc: (1,12)-(1,13) = "*" - │ │ │ │ └── expression: ∅ - │ │ │ ├── rights: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (1,15)-(1,16)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :c - │ │ │ ├── lparen_loc: (1,8)-(1,9) = "(" - │ │ │ └── rparen_loc: (1,16)-(1,17) = ")" - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,4)-(1,5) = "|" - │ └── closing_loc: (1,17)-(1,18) = "|" - ├── body: ∅ - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,19)-(1,20) = "}" diff --git a/test/prism/snapshots/seattlerb/difficult3__9.txt b/test/prism/snapshots/seattlerb/difficult3__9.txt deleted file mode 100644 index 2259351b41f94e..00000000000000 --- a/test/prism/snapshots/seattlerb/difficult3__9.txt +++ /dev/null @@ -1,56 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,15)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,15)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,15)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :f - ├── message_loc: (1,0)-(1,1) = "f" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,15)) - ├── flags: ∅ - ├── locals: [:a, :b] - ├── parameters: - │ @ BlockParametersNode (location: (1,4)-(1,13)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,5)-(1,12)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 2) - │ │ │ ├── @ RequiredParameterNode (location: (1,5)-(1,6)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :a - │ │ │ └── @ MultiTargetNode (location: (1,8)-(1,12)) - │ │ │ ├── flags: ∅ - │ │ │ ├── lefts: (length: 0) - │ │ │ ├── rest: - │ │ │ │ @ SplatNode (location: (1,9)-(1,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── operator_loc: (1,9)-(1,10) = "*" - │ │ │ │ └── expression: - │ │ │ │ @ RequiredParameterNode (location: (1,10)-(1,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :b - │ │ │ ├── rights: (length: 0) - │ │ │ ├── lparen_loc: (1,8)-(1,9) = "(" - │ │ │ └── rparen_loc: (1,11)-(1,12) = ")" - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,4)-(1,5) = "|" - │ └── closing_loc: (1,12)-(1,13) = "|" - ├── body: ∅ - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,14)-(1,15) = "}" diff --git a/test/prism/snapshots/seattlerb/difficult4__leading_dots.txt b/test/prism/snapshots/seattlerb/difficult4__leading_dots.txt deleted file mode 100644 index 4201ed00aadd84..00000000000000 --- a/test/prism/snapshots/seattlerb/difficult4__leading_dots.txt +++ /dev/null @@ -1,27 +0,0 @@ -@ ProgramNode (location: (1,0)-(2,2)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(2,2)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(2,2)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (1,0)-(1,1)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (1,0)-(1,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: (2,0)-(2,1) = "." - ├── name: :b - ├── message_loc: (2,1)-(2,2) = "b" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/difficult4__leading_dots2.txt b/test/prism/snapshots/seattlerb/difficult4__leading_dots2.txt deleted file mode 100644 index 8dd122ddd444bc..00000000000000 --- a/test/prism/snapshots/seattlerb/difficult4__leading_dots2.txt +++ /dev/null @@ -1,18 +0,0 @@ -@ ProgramNode (location: (1,0)-(2,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(2,3)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ IntegerNode (location: (1,0)-(1,1)) - │ ├── flags: newline, static_literal, decimal - │ └── value: 1 - └── @ RangeNode (location: (2,0)-(2,3)) - ├── flags: newline, static_literal - ├── left: ∅ - ├── right: - │ @ IntegerNode (location: (2,2)-(2,3)) - │ ├── flags: static_literal, decimal - │ └── value: 3 - └── operator_loc: (2,0)-(2,2) = ".." diff --git a/test/prism/snapshots/seattlerb/difficult6_.txt b/test/prism/snapshots/seattlerb/difficult6_.txt deleted file mode 100644 index fc273bda46d91d..00000000000000 --- a/test/prism/snapshots/seattlerb/difficult6_.txt +++ /dev/null @@ -1,70 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,25)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,25)) - ├── flags: ∅ - └── body: (length: 1) - └── @ LambdaNode (location: (1,0)-(1,25)) - ├── flags: newline - ├── locals: [:a, :b] - ├── operator_loc: (1,0)-(1,2) = "->" - ├── opening_loc: (1,13)-(1,14) = "{" - ├── closing_loc: (1,24)-(1,25) = "}" - ├── parameters: - │ @ BlockParametersNode (location: (1,2)-(1,12)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,3)-(1,11)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (1,3)-(1,4)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :a - │ │ ├── optionals: (length: 1) - │ │ │ └── @ OptionalParameterNode (location: (1,6)-(1,11)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :b - │ │ │ ├── name_loc: (1,6)-(1,7) = "b" - │ │ │ ├── operator_loc: (1,7)-(1,8) = "=" - │ │ │ └── value: - │ │ │ @ NilNode (location: (1,8)-(1,11)) - │ │ │ └── flags: static_literal - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,2)-(1,3) = "(" - │ └── closing_loc: (1,11)-(1,12) = ")" - └── body: - @ StatementsNode (location: (1,15)-(1,23)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,15)-(1,23)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :p - ├── message_loc: (1,15)-(1,16) = "p" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,17)-(1,23)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ ArrayNode (location: (1,17)-(1,23)) - │ ├── flags: ∅ - │ ├── elements: (length: 2) - │ │ ├── @ LocalVariableReadNode (location: (1,18)-(1,19)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :a - │ │ │ └── depth: 0 - │ │ └── @ LocalVariableReadNode (location: (1,21)-(1,22)) - │ │ ├── flags: ∅ - │ │ ├── name: :b - │ │ └── depth: 0 - │ ├── opening_loc: (1,17)-(1,18) = "[" - │ └── closing_loc: (1,22)-(1,23) = "]" - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/difficult6__7.txt b/test/prism/snapshots/seattlerb/difficult6__7.txt deleted file mode 100644 index 509da6914f4725..00000000000000 --- a/test/prism/snapshots/seattlerb/difficult6__7.txt +++ /dev/null @@ -1,61 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,11)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,11)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,11)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (1,0)-(1,1)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (1,0)-(1,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: (1,1)-(1,2) = "." - ├── name: :b - ├── message_loc: (1,2)-(1,3) = "b" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,4)-(1,7)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ ParenthesesNode (location: (1,4)-(1,7)) - │ ├── flags: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (1,5)-(1,6)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ IntegerNode (location: (1,5)-(1,6)) - │ │ ├── flags: newline, static_literal, decimal - │ │ └── value: 1 - │ ├── opening_loc: (1,4)-(1,5) = "(" - │ └── closing_loc: (1,6)-(1,7) = ")" - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,8)-(1,11)) - ├── flags: ∅ - ├── locals: [] - ├── parameters: ∅ - ├── body: - │ @ StatementsNode (location: (1,9)-(1,10)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,9)-(1,10)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :c - │ ├── message_loc: (1,9)-(1,10) = "c" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── opening_loc: (1,8)-(1,9) = "{" - └── closing_loc: (1,10)-(1,11) = "}" diff --git a/test/prism/snapshots/seattlerb/difficult6__8.txt b/test/prism/snapshots/seattlerb/difficult6__8.txt deleted file mode 100644 index c6fece62cb418d..00000000000000 --- a/test/prism/snapshots/seattlerb/difficult6__8.txt +++ /dev/null @@ -1,61 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,12)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,12)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,12)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (1,0)-(1,1)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (1,0)-(1,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: (1,1)-(1,3) = "::" - ├── name: :b - ├── message_loc: (1,3)-(1,4) = "b" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,5)-(1,8)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ ParenthesesNode (location: (1,5)-(1,8)) - │ ├── flags: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (1,6)-(1,7)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ IntegerNode (location: (1,6)-(1,7)) - │ │ ├── flags: newline, static_literal, decimal - │ │ └── value: 1 - │ ├── opening_loc: (1,5)-(1,6) = "(" - │ └── closing_loc: (1,7)-(1,8) = ")" - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,9)-(1,12)) - ├── flags: ∅ - ├── locals: [] - ├── parameters: ∅ - ├── body: - │ @ StatementsNode (location: (1,10)-(1,11)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,10)-(1,11)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :c - │ ├── message_loc: (1,10)-(1,11) = "c" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── opening_loc: (1,9)-(1,10) = "{" - └── closing_loc: (1,11)-(1,12) = "}" diff --git a/test/prism/snapshots/seattlerb/difficult7_.txt b/test/prism/snapshots/seattlerb/difficult7_.txt deleted file mode 100644 index 2cf03ce57e6964..00000000000000 --- a/test/prism/snapshots/seattlerb/difficult7_.txt +++ /dev/null @@ -1,105 +0,0 @@ -@ ProgramNode (location: (1,6)-(4,7)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,6)-(4,7)) - ├── flags: ∅ - └── body: (length: 1) - └── @ HashNode (location: (1,6)-(4,7)) - ├── flags: newline - ├── opening_loc: (1,6)-(1,7) = "{" - ├── elements: (length: 2) - │ ├── @ AssocNode (location: (2,8)-(2,33)) - │ │ ├── flags: ∅ - │ │ ├── key: - │ │ │ @ SymbolNode (location: (2,8)-(2,10)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (2,8)-(2,9) = "a" - │ │ │ ├── closing_loc: (2,9)-(2,10) = ":" - │ │ │ └── unescaped: "a" - │ │ ├── value: - │ │ │ @ CallNode (location: (2,11)-(2,33)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :lambda - │ │ │ ├── message_loc: (2,11)-(2,17) = "lambda" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: - │ │ │ @ BlockNode (location: (2,18)-(2,33)) - │ │ │ ├── flags: ∅ - │ │ │ ├── locals: [] - │ │ │ ├── parameters: ∅ - │ │ │ ├── body: - │ │ │ │ @ StatementsNode (location: (2,20)-(2,31)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ IfNode (location: (2,20)-(2,31)) - │ │ │ │ ├── flags: newline - │ │ │ │ ├── if_keyword_loc: ∅ - │ │ │ │ ├── predicate: - │ │ │ │ │ @ CallNode (location: (2,20)-(2,21)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :b - │ │ │ │ │ ├── message_loc: (2,20)-(2,21) = "b" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── then_keyword_loc: (2,22)-(2,23) = "?" - │ │ │ │ ├── statements: - │ │ │ │ │ @ StatementsNode (location: (2,24)-(2,27)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── body: (length: 1) - │ │ │ │ │ └── @ CallNode (location: (2,24)-(2,27)) - │ │ │ │ │ ├── flags: newline, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :c - │ │ │ │ │ ├── message_loc: (2,24)-(2,25) = "c" - │ │ │ │ │ ├── opening_loc: (2,25)-(2,26) = "(" - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: (2,26)-(2,27) = ")" - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── subsequent: - │ │ │ │ │ @ ElseNode (location: (2,28)-(2,31)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── else_keyword_loc: (2,28)-(2,29) = ":" - │ │ │ │ │ ├── statements: - │ │ │ │ │ │ @ StatementsNode (location: (2,30)-(2,31)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ └── body: (length: 1) - │ │ │ │ │ │ └── @ CallNode (location: (2,30)-(2,31)) - │ │ │ │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ │ ├── name: :d - │ │ │ │ │ │ ├── message_loc: (2,30)-(2,31) = "d" - │ │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ │ └── block: ∅ - │ │ │ │ │ └── end_keyword_loc: ∅ - │ │ │ │ └── end_keyword_loc: ∅ - │ │ │ ├── opening_loc: (2,18)-(2,19) = "{" - │ │ │ └── closing_loc: (2,32)-(2,33) = "}" - │ │ └── operator_loc: ∅ - │ └── @ AssocNode (location: (3,8)-(3,14)) - │ ├── flags: static_literal - │ ├── key: - │ │ @ SymbolNode (location: (3,8)-(3,10)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: ∅ - │ │ ├── value_loc: (3,8)-(3,9) = "e" - │ │ ├── closing_loc: (3,9)-(3,10) = ":" - │ │ └── unescaped: "e" - │ ├── value: - │ │ @ NilNode (location: (3,11)-(3,14)) - │ │ └── flags: static_literal - │ └── operator_loc: ∅ - └── closing_loc: (4,6)-(4,7) = "}" diff --git a/test/prism/snapshots/seattlerb/do_bug.txt b/test/prism/snapshots/seattlerb/do_bug.txt deleted file mode 100644 index 8d1a0b786ce944..00000000000000 --- a/test/prism/snapshots/seattlerb/do_bug.txt +++ /dev/null @@ -1,68 +0,0 @@ -@ ProgramNode (location: (1,0)-(4,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(4,3)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ CallNode (location: (1,0)-(1,3)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (1,0)-(1,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,2)-(1,3)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (1,2)-(1,3)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── @ CallNode (location: (2,0)-(4,3)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (2,0)-(2,1)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (2,0)-(2,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: (2,1)-(2,2) = "." - ├── name: :b - ├── message_loc: (2,2)-(2,3) = "b" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (2,4)-(4,3)) - ├── flags: ∅ - ├── locals: [:c] - ├── parameters: - │ @ BlockParametersNode (location: (2,7)-(2,10)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (2,8)-(2,9)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (2,8)-(2,9)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :c - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (2,7)-(2,8) = "|" - │ └── closing_loc: (2,9)-(2,10) = "|" - ├── body: ∅ - ├── opening_loc: (2,4)-(2,6) = "do" - └── closing_loc: (4,0)-(4,3) = "end" diff --git a/test/prism/snapshots/seattlerb/do_lambda.txt b/test/prism/snapshots/seattlerb/do_lambda.txt deleted file mode 100644 index 76383b0ada0a0b..00000000000000 --- a/test/prism/snapshots/seattlerb/do_lambda.txt +++ /dev/null @@ -1,21 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,11)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,11)) - ├── flags: ∅ - └── body: (length: 1) - └── @ LambdaNode (location: (1,0)-(1,11)) - ├── flags: newline - ├── locals: [] - ├── operator_loc: (1,0)-(1,2) = "->" - ├── opening_loc: (1,5)-(1,7) = "do" - ├── closing_loc: (1,8)-(1,11) = "end" - ├── parameters: - │ @ BlockParametersNode (location: (1,2)-(1,4)) - │ ├── flags: ∅ - │ ├── parameters: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,2)-(1,3) = "(" - │ └── closing_loc: (1,3)-(1,4) = ")" - └── body: ∅ diff --git a/test/prism/snapshots/seattlerb/dot2_nil__26.txt b/test/prism/snapshots/seattlerb/dot2_nil__26.txt deleted file mode 100644 index fc5122055f51ec..00000000000000 --- a/test/prism/snapshots/seattlerb/dot2_nil__26.txt +++ /dev/null @@ -1,22 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ RangeNode (location: (1,0)-(1,3)) - ├── flags: newline - ├── left: - │ @ CallNode (location: (1,0)-(1,1)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (1,0)-(1,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── right: ∅ - └── operator_loc: (1,1)-(1,3) = ".." diff --git a/test/prism/snapshots/seattlerb/dot3_nil__26.txt b/test/prism/snapshots/seattlerb/dot3_nil__26.txt deleted file mode 100644 index c2277975db0ad9..00000000000000 --- a/test/prism/snapshots/seattlerb/dot3_nil__26.txt +++ /dev/null @@ -1,22 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,4)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,4)) - ├── flags: ∅ - └── body: (length: 1) - └── @ RangeNode (location: (1,0)-(1,4)) - ├── flags: newline, exclude_end - ├── left: - │ @ CallNode (location: (1,0)-(1,1)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (1,0)-(1,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── right: ∅ - └── operator_loc: (1,1)-(1,4) = "..." diff --git a/test/prism/snapshots/seattlerb/dstr_evstr.txt b/test/prism/snapshots/seattlerb/dstr_evstr.txt deleted file mode 100644 index 143d8ff5840a7a..00000000000000 --- a/test/prism/snapshots/seattlerb/dstr_evstr.txt +++ /dev/null @@ -1,44 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,12)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,12)) - ├── flags: ∅ - └── body: (length: 1) - └── @ InterpolatedStringNode (location: (1,0)-(1,12)) - ├── flags: newline - ├── opening_loc: (1,0)-(1,1) = "\"" - ├── parts: (length: 2) - │ ├── @ EmbeddedStatementsNode (location: (1,1)-(1,7)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (1,1)-(1,3) = "\#{" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (1,3)-(1,6)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ StringNode (location: (1,3)-(1,6)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: (1,3)-(1,4) = "'" - │ │ │ ├── content_loc: (1,4)-(1,5) = "a" - │ │ │ ├── closing_loc: (1,5)-(1,6) = "'" - │ │ │ └── unescaped: "a" - │ │ └── closing_loc: (1,6)-(1,7) = "}" - │ └── @ EmbeddedStatementsNode (location: (1,7)-(1,11)) - │ ├── flags: ∅ - │ ├── opening_loc: (1,7)-(1,9) = "\#{" - │ ├── statements: - │ │ @ StatementsNode (location: (1,9)-(1,10)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (1,9)-(1,10)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :b - │ │ ├── message_loc: (1,9)-(1,10) = "b" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── closing_loc: (1,10)-(1,11) = "}" - └── closing_loc: (1,11)-(1,12) = "\"" diff --git a/test/prism/snapshots/seattlerb/dstr_evstr_empty_end.txt b/test/prism/snapshots/seattlerb/dstr_evstr_empty_end.txt deleted file mode 100644 index 8e3ade63c97361..00000000000000 --- a/test/prism/snapshots/seattlerb/dstr_evstr_empty_end.txt +++ /dev/null @@ -1,30 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,11)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,11)) - ├── flags: ∅ - └── body: (length: 1) - └── @ InterpolatedSymbolNode (location: (1,0)-(1,11)) - ├── flags: newline - ├── opening_loc: (1,0)-(1,2) = ":\"" - ├── parts: (length: 1) - │ └── @ EmbeddedStatementsNode (location: (1,2)-(1,10)) - │ ├── flags: ∅ - │ ├── opening_loc: (1,2)-(1,4) = "\#{" - │ ├── statements: - │ │ @ StatementsNode (location: (1,4)-(1,9)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (1,4)-(1,9)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :field - │ │ ├── message_loc: (1,4)-(1,9) = "field" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── closing_loc: (1,9)-(1,10) = "}" - └── closing_loc: (1,10)-(1,11) = "\"" diff --git a/test/prism/snapshots/seattlerb/dstr_lex_state.txt b/test/prism/snapshots/seattlerb/dstr_lex_state.txt deleted file mode 100644 index 2bdeab0834ede0..00000000000000 --- a/test/prism/snapshots/seattlerb/dstr_lex_state.txt +++ /dev/null @@ -1,39 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,8)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,8)) - ├── flags: ∅ - └── body: (length: 1) - └── @ InterpolatedStringNode (location: (1,0)-(1,8)) - ├── flags: newline - ├── opening_loc: (1,0)-(1,1) = "\"" - ├── parts: (length: 1) - │ └── @ EmbeddedStatementsNode (location: (1,1)-(1,7)) - │ ├── flags: ∅ - │ ├── opening_loc: (1,1)-(1,3) = "\#{" - │ ├── statements: - │ │ @ StatementsNode (location: (1,3)-(1,6)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (1,3)-(1,6)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :p - │ │ ├── message_loc: (1,3)-(1,4) = "p" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (1,4)-(1,6)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ SymbolNode (location: (1,4)-(1,6)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (1,4)-(1,5) = ":" - │ │ │ ├── value_loc: (1,5)-(1,6) = "a" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "a" - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── closing_loc: (1,6)-(1,7) = "}" - └── closing_loc: (1,7)-(1,8) = "\"" diff --git a/test/prism/snapshots/seattlerb/dstr_str.txt b/test/prism/snapshots/seattlerb/dstr_str.txt deleted file mode 100644 index 7b3e0e36ad5006..00000000000000 --- a/test/prism/snapshots/seattlerb/dstr_str.txt +++ /dev/null @@ -1,32 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,10)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,10)) - ├── flags: ∅ - └── body: (length: 1) - └── @ InterpolatedStringNode (location: (1,0)-(1,10)) - ├── flags: newline, static_literal, mutable - ├── opening_loc: (1,0)-(1,1) = "\"" - ├── parts: (length: 2) - │ ├── @ EmbeddedStatementsNode (location: (1,1)-(1,7)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (1,1)-(1,3) = "\#{" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (1,3)-(1,6)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ StringNode (location: (1,3)-(1,6)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: (1,3)-(1,4) = "'" - │ │ │ ├── content_loc: (1,4)-(1,5) = "a" - │ │ │ ├── closing_loc: (1,5)-(1,6) = "'" - │ │ │ └── unescaped: "a" - │ │ └── closing_loc: (1,6)-(1,7) = "}" - │ └── @ StringNode (location: (1,7)-(1,9)) - │ ├── flags: static_literal, frozen - │ ├── opening_loc: ∅ - │ ├── content_loc: (1,7)-(1,9) = " b" - │ ├── closing_loc: ∅ - │ └── unescaped: " b" - └── closing_loc: (1,9)-(1,10) = "\"" diff --git a/test/prism/snapshots/seattlerb/dsym_esc_to_sym.txt b/test/prism/snapshots/seattlerb/dsym_esc_to_sym.txt deleted file mode 100644 index 4224e305e9f9ca..00000000000000 --- a/test/prism/snapshots/seattlerb/dsym_esc_to_sym.txt +++ /dev/null @@ -1,13 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,17)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,17)) - ├── flags: ∅ - └── body: (length: 1) - └── @ SymbolNode (location: (1,0)-(1,17)) - ├── flags: newline, static_literal, forced_utf8_encoding - ├── opening_loc: (1,0)-(1,2) = ":\"" - ├── value_loc: (1,2)-(1,16) = "Variet\\303\\240" - ├── closing_loc: (1,16)-(1,17) = "\"" - └── unescaped: "Varietà" diff --git a/test/prism/snapshots/seattlerb/dsym_to_sym.txt b/test/prism/snapshots/seattlerb/dsym_to_sym.txt deleted file mode 100644 index 7c5d2bef87497b..00000000000000 --- a/test/prism/snapshots/seattlerb/dsym_to_sym.txt +++ /dev/null @@ -1,41 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,13)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,13)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ AliasMethodNode (location: (1,0)-(1,17)) - │ ├── flags: newline - │ ├── new_name: - │ │ @ SymbolNode (location: (1,6)-(1,11)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (1,6)-(1,8) = ":\"" - │ │ ├── value_loc: (1,8)-(1,10) = "<<" - │ │ ├── closing_loc: (1,10)-(1,11) = "\"" - │ │ └── unescaped: "<<" - │ ├── old_name: - │ │ @ SymbolNode (location: (1,12)-(1,17)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (1,12)-(1,14) = ":\"" - │ │ ├── value_loc: (1,14)-(1,16) = ">>" - │ │ ├── closing_loc: (1,16)-(1,17) = "\"" - │ │ └── unescaped: ">>" - │ └── keyword_loc: (1,0)-(1,5) = "alias" - └── @ AliasMethodNode (location: (3,0)-(3,13)) - ├── flags: newline - ├── new_name: - │ @ SymbolNode (location: (3,6)-(3,9)) - │ ├── flags: static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (3,6)-(3,7) = ":" - │ ├── value_loc: (3,7)-(3,9) = "<<" - │ ├── closing_loc: ∅ - │ └── unescaped: "<<" - ├── old_name: - │ @ SymbolNode (location: (3,10)-(3,13)) - │ ├── flags: static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (3,10)-(3,11) = ":" - │ ├── value_loc: (3,11)-(3,13) = ">>" - │ ├── closing_loc: ∅ - │ └── unescaped: ">>" - └── keyword_loc: (3,0)-(3,5) = "alias" diff --git a/test/prism/snapshots/seattlerb/eq_begin_line_numbers.txt b/test/prism/snapshots/seattlerb/eq_begin_line_numbers.txt deleted file mode 100644 index 010ee71da042ef..00000000000000 --- a/test/prism/snapshots/seattlerb/eq_begin_line_numbers.txt +++ /dev/null @@ -1,13 +0,0 @@ -@ ProgramNode (location: (1,0)-(6,1)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(6,1)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ IntegerNode (location: (1,0)-(1,1)) - │ ├── flags: newline, static_literal, decimal - │ └── value: 1 - └── @ IntegerNode (location: (6,0)-(6,1)) - ├── flags: newline, static_literal, decimal - └── value: 2 diff --git a/test/prism/snapshots/seattlerb/eq_begin_why_wont_people_use_their_spacebar.txt b/test/prism/snapshots/seattlerb/eq_begin_why_wont_people_use_their_spacebar.txt deleted file mode 100644 index 5f6a3fe62ee9c4..00000000000000 --- a/test/prism/snapshots/seattlerb/eq_begin_why_wont_people_use_their_spacebar.txt +++ /dev/null @@ -1,54 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,8)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,8)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(3,8)) - ├── flags: newline, attribute_write - ├── receiver: - │ @ CallNode (location: (1,0)-(1,1)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :h - │ ├── message_loc: (1,0)-(1,1) = "h" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: ∅ - ├── name: :[]= - ├── message_loc: (1,1)-(1,4) = "[k]" - ├── opening_loc: (1,1)-(1,2) = "[" - ├── arguments: - │ @ ArgumentsNode (location: (1,2)-(3,8)) - │ ├── flags: ∅ - │ └── arguments: (length: 2) - │ ├── @ CallNode (location: (1,2)-(1,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :k - │ │ ├── message_loc: (1,2)-(1,3) = "k" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── @ BeginNode (location: (1,5)-(3,8)) - │ ├── flags: ∅ - │ ├── begin_keyword_loc: (1,5)-(1,10) = "begin" - │ ├── statements: - │ │ @ StatementsNode (location: (2,7)-(2,9)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ IntegerNode (location: (2,7)-(2,9)) - │ │ ├── flags: newline, static_literal, decimal - │ │ └── value: 42 - │ ├── rescue_clause: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: ∅ - │ └── end_keyword_loc: (3,5)-(3,8) = "end" - ├── closing_loc: (1,3)-(1,4) = "]" - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/evstr_evstr.txt b/test/prism/snapshots/seattlerb/evstr_evstr.txt deleted file mode 100644 index c8dba1c3e55443..00000000000000 --- a/test/prism/snapshots/seattlerb/evstr_evstr.txt +++ /dev/null @@ -1,48 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,10)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,10)) - ├── flags: ∅ - └── body: (length: 1) - └── @ InterpolatedStringNode (location: (1,0)-(1,10)) - ├── flags: newline - ├── opening_loc: (1,0)-(1,1) = "\"" - ├── parts: (length: 2) - │ ├── @ EmbeddedStatementsNode (location: (1,1)-(1,5)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (1,1)-(1,3) = "\#{" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (1,3)-(1,4)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (1,3)-(1,4)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :a - │ │ │ ├── message_loc: (1,3)-(1,4) = "a" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── closing_loc: (1,4)-(1,5) = "}" - │ └── @ EmbeddedStatementsNode (location: (1,5)-(1,9)) - │ ├── flags: ∅ - │ ├── opening_loc: (1,5)-(1,7) = "\#{" - │ ├── statements: - │ │ @ StatementsNode (location: (1,7)-(1,8)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (1,7)-(1,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :b - │ │ ├── message_loc: (1,7)-(1,8) = "b" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── closing_loc: (1,8)-(1,9) = "}" - └── closing_loc: (1,9)-(1,10) = "\"" diff --git a/test/prism/snapshots/seattlerb/evstr_str.txt b/test/prism/snapshots/seattlerb/evstr_str.txt deleted file mode 100644 index 69a992b19a9dd1..00000000000000 --- a/test/prism/snapshots/seattlerb/evstr_str.txt +++ /dev/null @@ -1,36 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,8)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,8)) - ├── flags: ∅ - └── body: (length: 1) - └── @ InterpolatedStringNode (location: (1,0)-(1,8)) - ├── flags: newline - ├── opening_loc: (1,0)-(1,1) = "\"" - ├── parts: (length: 2) - │ ├── @ EmbeddedStatementsNode (location: (1,1)-(1,5)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (1,1)-(1,3) = "\#{" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (1,3)-(1,4)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (1,3)-(1,4)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :a - │ │ │ ├── message_loc: (1,3)-(1,4) = "a" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── closing_loc: (1,4)-(1,5) = "}" - │ └── @ StringNode (location: (1,5)-(1,7)) - │ ├── flags: static_literal, frozen - │ ├── opening_loc: ∅ - │ ├── content_loc: (1,5)-(1,7) = " b" - │ ├── closing_loc: ∅ - │ └── unescaped: " b" - └── closing_loc: (1,7)-(1,8) = "\"" diff --git a/test/prism/snapshots/seattlerb/expr_not_bang.txt b/test/prism/snapshots/seattlerb/expr_not_bang.txt deleted file mode 100644 index 868ef85648f759..00000000000000 --- a/test/prism/snapshots/seattlerb/expr_not_bang.txt +++ /dev/null @@ -1,40 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,5)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,5)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,5)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (1,2)-(1,5)) - │ ├── flags: ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (1,2)-(1,3) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,4)-(1,5)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (1,4)-(1,5)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :b - │ │ ├── message_loc: (1,4)-(1,5) = "b" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: ∅ - ├── name: :! - ├── message_loc: (1,0)-(1,1) = "!" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/f_kw.txt b/test/prism/snapshots/seattlerb/f_kw.txt deleted file mode 100644 index e2b82371b87734..00000000000000 --- a/test/prism/snapshots/seattlerb/f_kw.txt +++ /dev/null @@ -1,38 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,15)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,15)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(1,15)) - ├── flags: newline - ├── name: :x - ├── name_loc: (1,4)-(1,5) = "x" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (1,6)-(1,10)) - │ ├── flags: ∅ - │ ├── requireds: (length: 0) - │ ├── optionals: (length: 0) - │ ├── rest: ∅ - │ ├── posts: (length: 0) - │ ├── keywords: (length: 1) - │ │ └── @ OptionalKeywordParameterNode (location: (1,6)-(1,10)) - │ │ ├── flags: ∅ - │ │ ├── name: :k - │ │ ├── name_loc: (1,6)-(1,8) = "k:" - │ │ └── value: - │ │ @ IntegerNode (location: (1,8)-(1,10)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 42 - │ ├── keyword_rest: ∅ - │ └── block: ∅ - ├── body: ∅ - ├── locals: [:k] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: ∅ - ├── rparen_loc: ∅ - ├── equal_loc: ∅ - └── end_keyword_loc: (1,12)-(1,15) = "end" diff --git a/test/prism/snapshots/seattlerb/f_kw__required.txt b/test/prism/snapshots/seattlerb/f_kw__required.txt deleted file mode 100644 index c44dbbf2fc81c0..00000000000000 --- a/test/prism/snapshots/seattlerb/f_kw__required.txt +++ /dev/null @@ -1,34 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,13)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,13)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(1,13)) - ├── flags: newline - ├── name: :x - ├── name_loc: (1,4)-(1,5) = "x" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (1,6)-(1,8)) - │ ├── flags: ∅ - │ ├── requireds: (length: 0) - │ ├── optionals: (length: 0) - │ ├── rest: ∅ - │ ├── posts: (length: 0) - │ ├── keywords: (length: 1) - │ │ └── @ RequiredKeywordParameterNode (location: (1,6)-(1,8)) - │ │ ├── flags: ∅ - │ │ ├── name: :k - │ │ └── name_loc: (1,6)-(1,8) = "k:" - │ ├── keyword_rest: ∅ - │ └── block: ∅ - ├── body: ∅ - ├── locals: [:k] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: ∅ - ├── rparen_loc: ∅ - ├── equal_loc: ∅ - └── end_keyword_loc: (1,10)-(1,13) = "end" diff --git a/test/prism/snapshots/seattlerb/flip2_env_lvar.txt b/test/prism/snapshots/seattlerb/flip2_env_lvar.txt deleted file mode 100644 index def6ffaf3a7e84..00000000000000 --- a/test/prism/snapshots/seattlerb/flip2_env_lvar.txt +++ /dev/null @@ -1,40 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,16)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,16)) - ├── flags: ∅ - └── body: (length: 1) - └── @ IfNode (location: (1,0)-(1,16)) - ├── flags: newline - ├── if_keyword_loc: (1,0)-(1,2) = "if" - ├── predicate: - │ @ FlipFlopNode (location: (1,3)-(1,7)) - │ ├── flags: ∅ - │ ├── left: - │ │ @ CallNode (location: (1,3)-(1,4)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (1,3)-(1,4) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── right: - │ │ @ CallNode (location: (1,6)-(1,7)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :b - │ │ ├── message_loc: (1,6)-(1,7) = "b" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── operator_loc: (1,4)-(1,6) = ".." - ├── then_keyword_loc: (1,8)-(1,12) = "then" - ├── statements: ∅ - ├── subsequent: ∅ - └── end_keyword_loc: (1,13)-(1,16) = "end" diff --git a/test/prism/snapshots/seattlerb/float_with_if_modifier.txt b/test/prism/snapshots/seattlerb/float_with_if_modifier.txt deleted file mode 100644 index 400c90b17cb591..00000000000000 --- a/test/prism/snapshots/seattlerb/float_with_if_modifier.txt +++ /dev/null @@ -1,23 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,10)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,10)) - ├── flags: ∅ - └── body: (length: 1) - └── @ IfNode (location: (1,0)-(1,10)) - ├── flags: newline - ├── if_keyword_loc: (1,3)-(1,5) = "if" - ├── predicate: - │ @ TrueNode (location: (1,6)-(1,10)) - │ └── flags: static_literal - ├── then_keyword_loc: ∅ - ├── statements: - │ @ StatementsNode (location: (1,0)-(1,3)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ FloatNode (location: (1,0)-(1,3)) - │ ├── flags: newline, static_literal - │ └── value: 1.0 - ├── subsequent: ∅ - └── end_keyword_loc: ∅ diff --git a/test/prism/snapshots/seattlerb/heredoc__backslash_dos_format.txt b/test/prism/snapshots/seattlerb/heredoc__backslash_dos_format.txt deleted file mode 100644 index 7d745587b3f14f..00000000000000 --- a/test/prism/snapshots/seattlerb/heredoc__backslash_dos_format.txt +++ /dev/null @@ -1,20 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,12)) -├── flags: ∅ -├── locals: [:str] -└── statements: - @ StatementsNode (location: (1,0)-(1,12)) - ├── flags: ∅ - └── body: (length: 1) - └── @ LocalVariableWriteNode (location: (1,0)-(1,12)) - ├── flags: newline - ├── name: :str - ├── depth: 0 - ├── name_loc: (1,0)-(1,3) = "str" - ├── value: - │ @ StringNode (location: (1,6)-(1,12)) - │ ├── flags: ∅ - │ ├── opening_loc: (1,6)-(1,12) = "<<-XXX" - │ ├── content_loc: (2,0)-(4,0) = "before\\\r\nafter\r\n" - │ ├── closing_loc: (4,0)-(5,0) = "XXX\r\n" - │ └── unescaped: "beforeafter\n" - └── operator_loc: (1,4)-(1,5) = "=" diff --git a/test/prism/snapshots/seattlerb/heredoc_backslash_nl.txt b/test/prism/snapshots/seattlerb/heredoc_backslash_nl.txt deleted file mode 100644 index 4c34bf6ef60586..00000000000000 --- a/test/prism/snapshots/seattlerb/heredoc_backslash_nl.txt +++ /dev/null @@ -1,19 +0,0 @@ -@ ProgramNode (location: (1,0)-(5,7)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(5,7)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ StringNode (location: (1,0)-(3,1)) - │ ├── flags: newline - │ ├── opening_loc: (1,0)-(1,1) = "\"" - │ ├── content_loc: (1,1)-(3,0) = " why would someone do this? \\\n blah\n" - │ ├── closing_loc: (3,0)-(3,1) = "\"" - │ └── unescaped: " why would someone do this? blah\n" - └── @ StringNode (location: (5,0)-(5,7)) - ├── flags: newline - ├── opening_loc: (5,0)-(5,7) = "<<-DESC" - ├── content_loc: (6,0)-(8,0) = " why would someone do this? \\\n blah\n" - ├── closing_loc: (8,0)-(9,0) = "DESC\n" - └── unescaped: " why would someone do this? blah\n" diff --git a/test/prism/snapshots/seattlerb/heredoc_bad_hex_escape.txt b/test/prism/snapshots/seattlerb/heredoc_bad_hex_escape.txt deleted file mode 100644 index 1c521108c04f04..00000000000000 --- a/test/prism/snapshots/seattlerb/heredoc_bad_hex_escape.txt +++ /dev/null @@ -1,20 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,9)) -├── flags: ∅ -├── locals: [:s] -└── statements: - @ StatementsNode (location: (1,0)-(1,9)) - ├── flags: ∅ - └── body: (length: 1) - └── @ LocalVariableWriteNode (location: (1,0)-(1,9)) - ├── flags: newline - ├── name: :s - ├── depth: 0 - ├── name_loc: (1,0)-(1,1) = "s" - ├── value: - │ @ StringNode (location: (1,4)-(1,9)) - │ ├── flags: forced_utf8_encoding - │ ├── opening_loc: (1,4)-(1,9) = "< - ├── message_loc: (1,3)-(1,4) = ">" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,5)-(1,6)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ IntegerNode (location: (1,5)-(1,6)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/safe_call_rhs_newline.txt b/test/prism/snapshots/seattlerb/safe_call_rhs_newline.txt deleted file mode 100644 index 50d03b7044288f..00000000000000 --- a/test/prism/snapshots/seattlerb/safe_call_rhs_newline.txt +++ /dev/null @@ -1,34 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,8)) -├── flags: ∅ -├── locals: [:c] -└── statements: - @ StatementsNode (location: (1,0)-(1,8)) - ├── flags: ∅ - └── body: (length: 1) - └── @ LocalVariableWriteNode (location: (1,0)-(1,8)) - ├── flags: newline - ├── name: :c - ├── depth: 0 - ├── name_loc: (1,0)-(1,1) = "c" - ├── value: - │ @ CallNode (location: (1,4)-(1,8)) - │ ├── flags: safe_navigation - │ ├── receiver: - │ │ @ CallNode (location: (1,4)-(1,5)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (1,4)-(1,5) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (1,5)-(1,7) = "&." - │ ├── name: :b - │ ├── message_loc: (1,7)-(1,8) = "b" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── operator_loc: (1,2)-(1,3) = "=" diff --git a/test/prism/snapshots/seattlerb/safe_calls.txt b/test/prism/snapshots/seattlerb/safe_calls.txt deleted file mode 100644 index 5d853af648eacd..00000000000000 --- a/test/prism/snapshots/seattlerb/safe_calls.txt +++ /dev/null @@ -1,43 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,10)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,10)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,10)) - ├── flags: newline, safe_navigation - ├── receiver: - │ @ CallNode (location: (1,0)-(1,4)) - │ ├── flags: safe_navigation - │ ├── receiver: - │ │ @ CallNode (location: (1,0)-(1,1)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (1,0)-(1,1) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (1,1)-(1,3) = "&." - │ ├── name: :b - │ ├── message_loc: (1,3)-(1,4) = "b" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: (1,4)-(1,6) = "&." - ├── name: :c - ├── message_loc: (1,6)-(1,7) = "c" - ├── opening_loc: (1,7)-(1,8) = "(" - ├── arguments: - │ @ ArgumentsNode (location: (1,8)-(1,9)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ IntegerNode (location: (1,8)-(1,9)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── closing_loc: (1,9)-(1,10) = ")" - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/safe_op_asgn.txt b/test/prism/snapshots/seattlerb/safe_op_asgn.txt deleted file mode 100644 index 31ad5a813dfdb3..00000000000000 --- a/test/prism/snapshots/seattlerb/safe_op_asgn.txt +++ /dev/null @@ -1,43 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,11)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,11)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallOperatorWriteNode (location: (1,0)-(1,11)) - ├── flags: newline, safe_navigation - ├── receiver: - │ @ CallNode (location: (1,0)-(1,1)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (1,0)-(1,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: (1,1)-(1,3) = "&." - ├── message_loc: (1,3)-(1,4) = "b" - ├── read_name: :b - ├── write_name: :b= - ├── binary_operator: :+ - ├── binary_operator_loc: (1,5)-(1,7) = "+=" - └── value: - @ CallNode (location: (1,8)-(1,11)) - ├── flags: ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :x - ├── message_loc: (1,8)-(1,9) = "x" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,10)-(1,11)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ IntegerNode (location: (1,10)-(1,11)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/safe_op_asgn2.txt b/test/prism/snapshots/seattlerb/safe_op_asgn2.txt deleted file mode 100644 index 81d42aac635bd9..00000000000000 --- a/test/prism/snapshots/seattlerb/safe_op_asgn2.txt +++ /dev/null @@ -1,36 +0,0 @@ -@ ProgramNode (location: (1,0)-(2,1)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(2,1)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallOrWriteNode (location: (1,0)-(2,1)) - ├── flags: newline, safe_navigation - ├── receiver: - │ @ CallNode (location: (1,0)-(1,1)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (1,0)-(1,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: (1,1)-(1,3) = "&." - ├── message_loc: (1,3)-(1,4) = "b" - ├── read_name: :b - ├── write_name: :b= - ├── operator_loc: (1,5)-(1,8) = "||=" - └── value: - @ CallNode (location: (2,0)-(2,1)) - ├── flags: variable_call, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :x - ├── message_loc: (2,0)-(2,1) = "x" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/slashy_newlines_within_string.txt b/test/prism/snapshots/seattlerb/slashy_newlines_within_string.txt deleted file mode 100644 index 061e67ca6af4de..00000000000000 --- a/test/prism/snapshots/seattlerb/slashy_newlines_within_string.txt +++ /dev/null @@ -1,59 +0,0 @@ -@ ProgramNode (location: (1,0)-(6,5)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(6,5)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ CallNode (location: (1,0)-(4,8)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :puts - │ ├── message_loc: (1,0)-(1,4) = "puts" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,5)-(4,8)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ StringNode (location: (1,5)-(4,8)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (1,5)-(1,6) = "\"" - │ │ ├── content_loc: (1,6)-(4,7) = "hello\\\n my\\\n dear\\\n friend" - │ │ ├── closing_loc: (4,7)-(4,8) = "\"" - │ │ └── unescaped: "hello my dear friend" - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── @ CallNode (location: (6,0)-(6,5)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (6,0)-(6,1)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (6,0)-(6,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: ∅ - ├── name: :+ - ├── message_loc: (6,2)-(6,3) = "+" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (6,4)-(6,5)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ CallNode (location: (6,4)-(6,5)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :b - │ ├── message_loc: (6,4)-(6,5) = "b" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/stabby_arg_no_paren.txt b/test/prism/snapshots/seattlerb/stabby_arg_no_paren.txt deleted file mode 100644 index e00e82e9c6a11a..00000000000000 --- a/test/prism/snapshots/seattlerb/stabby_arg_no_paren.txt +++ /dev/null @@ -1,33 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,5)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,5)) - ├── flags: ∅ - └── body: (length: 1) - └── @ LambdaNode (location: (1,0)-(1,5)) - ├── flags: newline - ├── locals: [:a] - ├── operator_loc: (1,0)-(1,2) = "->" - ├── opening_loc: (1,3)-(1,4) = "{" - ├── closing_loc: (1,4)-(1,5) = "}" - ├── parameters: - │ @ BlockParametersNode (location: (1,2)-(1,3)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,2)-(1,3)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (1,2)-(1,3)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :a - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: ∅ - │ └── closing_loc: ∅ - └── body: ∅ diff --git a/test/prism/snapshots/seattlerb/stabby_arg_opt_splat_arg_block_omfg.txt b/test/prism/snapshots/seattlerb/stabby_arg_opt_splat_arg_block_omfg.txt deleted file mode 100644 index b0b9a93f613b3b..00000000000000 --- a/test/prism/snapshots/seattlerb/stabby_arg_opt_splat_arg_block_omfg.txt +++ /dev/null @@ -1,55 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,23)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,23)) - ├── flags: ∅ - └── body: (length: 1) - └── @ LambdaNode (location: (1,0)-(1,23)) - ├── flags: newline - ├── locals: [:b, :c, :d, :e, :f] - ├── operator_loc: (1,0)-(1,2) = "->" - ├── opening_loc: (1,21)-(1,22) = "{" - ├── closing_loc: (1,22)-(1,23) = "}" - ├── parameters: - │ @ BlockParametersNode (location: (1,2)-(1,21)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,3)-(1,20)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (1,3)-(1,4)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :b - │ │ ├── optionals: (length: 1) - │ │ │ └── @ OptionalParameterNode (location: (1,6)-(1,9)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :c - │ │ │ ├── name_loc: (1,6)-(1,7) = "c" - │ │ │ ├── operator_loc: (1,7)-(1,8) = "=" - │ │ │ └── value: - │ │ │ @ IntegerNode (location: (1,8)-(1,9)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── rest: - │ │ │ @ RestParameterNode (location: (1,11)-(1,13)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :d - │ │ │ ├── name_loc: (1,12)-(1,13) = "d" - │ │ │ └── operator_loc: (1,11)-(1,12) = "*" - │ │ ├── posts: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (1,15)-(1,16)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :e - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: - │ │ @ BlockParameterNode (location: (1,18)-(1,20)) - │ │ ├── flags: ∅ - │ │ ├── name: :f - │ │ ├── name_loc: (1,19)-(1,20) = "f" - │ │ └── operator_loc: (1,18)-(1,19) = "&" - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,2)-(1,3) = "(" - │ └── closing_loc: (1,20)-(1,21) = ")" - └── body: ∅ diff --git a/test/prism/snapshots/seattlerb/stabby_block_iter_call.txt b/test/prism/snapshots/seattlerb/stabby_block_iter_call.txt deleted file mode 100644 index 97695636071356..00000000000000 --- a/test/prism/snapshots/seattlerb/stabby_block_iter_call.txt +++ /dev/null @@ -1,64 +0,0 @@ -@ ProgramNode (location: (1,0)-(4,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(4,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(4,3)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :x - ├── message_loc: (1,0)-(1,1) = "x" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,2)-(4,3)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ LambdaNode (location: (1,2)-(4,3)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── operator_loc: (1,2)-(1,4) = "->" - │ ├── opening_loc: (1,8)-(1,10) = "do" - │ ├── closing_loc: (4,0)-(4,3) = "end" - │ ├── parameters: - │ │ @ BlockParametersNode (location: (1,5)-(1,7)) - │ │ ├── flags: ∅ - │ │ ├── parameters: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: (1,5)-(1,6) = "(" - │ │ └── closing_loc: (1,6)-(1,7) = ")" - │ └── body: - │ @ StatementsNode (location: (2,0)-(3,3)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (2,0)-(3,3)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (2,0)-(2,1)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (2,0)-(2,1) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (2,1)-(2,2) = "." - │ ├── name: :b - │ ├── message_loc: (2,2)-(2,3) = "b" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (2,4)-(3,3)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (2,4)-(2,6) = "do" - │ └── closing_loc: (3,0)-(3,3) = "end" - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/stabby_block_iter_call_no_target_with_arg.txt b/test/prism/snapshots/seattlerb/stabby_block_iter_call_no_target_with_arg.txt deleted file mode 100644 index 5d60be6e86d138..00000000000000 --- a/test/prism/snapshots/seattlerb/stabby_block_iter_call_no_target_with_arg.txt +++ /dev/null @@ -1,60 +0,0 @@ -@ ProgramNode (location: (1,0)-(4,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(4,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(4,3)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :x - ├── message_loc: (1,0)-(1,1) = "x" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,2)-(4,3)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ LambdaNode (location: (1,2)-(4,3)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── operator_loc: (1,2)-(1,4) = "->" - │ ├── opening_loc: (1,8)-(1,10) = "do" - │ ├── closing_loc: (4,0)-(4,3) = "end" - │ ├── parameters: - │ │ @ BlockParametersNode (location: (1,5)-(1,7)) - │ │ ├── flags: ∅ - │ │ ├── parameters: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: (1,5)-(1,6) = "(" - │ │ └── closing_loc: (1,6)-(1,7) = ")" - │ └── body: - │ @ StatementsNode (location: (2,0)-(3,3)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (2,0)-(3,3)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (2,0)-(2,1) = "a" - │ ├── opening_loc: (2,1)-(2,2) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (2,2)-(2,3)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (2,2)-(2,3)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: (2,3)-(2,4) = ")" - │ └── block: - │ @ BlockNode (location: (2,5)-(3,3)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (2,5)-(2,7) = "do" - │ └── closing_loc: (3,0)-(3,3) = "end" - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/stabby_block_kw.txt b/test/prism/snapshots/seattlerb/stabby_block_kw.txt deleted file mode 100644 index 456eb691009e11..00000000000000 --- a/test/prism/snapshots/seattlerb/stabby_block_kw.txt +++ /dev/null @@ -1,38 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,13)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,13)) - ├── flags: ∅ - └── body: (length: 1) - └── @ LambdaNode (location: (1,0)-(1,13)) - ├── flags: newline - ├── locals: [:k] - ├── operator_loc: (1,0)-(1,2) = "->" - ├── opening_loc: (1,10)-(1,11) = "{" - ├── closing_loc: (1,12)-(1,13) = "}" - ├── parameters: - │ @ BlockParametersNode (location: (1,3)-(1,9)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,4)-(1,8)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 1) - │ │ │ └── @ OptionalKeywordParameterNode (location: (1,4)-(1,8)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :k - │ │ │ ├── name_loc: (1,4)-(1,6) = "k:" - │ │ │ └── value: - │ │ │ @ IntegerNode (location: (1,6)-(1,8)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 42 - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,3)-(1,4) = "(" - │ └── closing_loc: (1,8)-(1,9) = ")" - └── body: ∅ diff --git a/test/prism/snapshots/seattlerb/stabby_block_kw__required.txt b/test/prism/snapshots/seattlerb/stabby_block_kw__required.txt deleted file mode 100644 index 823a5adca4ef75..00000000000000 --- a/test/prism/snapshots/seattlerb/stabby_block_kw__required.txt +++ /dev/null @@ -1,34 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,11)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,11)) - ├── flags: ∅ - └── body: (length: 1) - └── @ LambdaNode (location: (1,0)-(1,11)) - ├── flags: newline - ├── locals: [:k] - ├── operator_loc: (1,0)-(1,2) = "->" - ├── opening_loc: (1,8)-(1,9) = "{" - ├── closing_loc: (1,10)-(1,11) = "}" - ├── parameters: - │ @ BlockParametersNode (location: (1,3)-(1,7)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,4)-(1,6)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 1) - │ │ │ └── @ RequiredKeywordParameterNode (location: (1,4)-(1,6)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :k - │ │ │ └── name_loc: (1,4)-(1,6) = "k:" - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,3)-(1,4) = "(" - │ └── closing_loc: (1,6)-(1,7) = ")" - └── body: ∅ diff --git a/test/prism/snapshots/seattlerb/stabby_proc_scope.txt b/test/prism/snapshots/seattlerb/stabby_proc_scope.txt deleted file mode 100644 index c0b073a4391328..00000000000000 --- a/test/prism/snapshots/seattlerb/stabby_proc_scope.txt +++ /dev/null @@ -1,36 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,11)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,11)) - ├── flags: ∅ - └── body: (length: 1) - └── @ LambdaNode (location: (1,0)-(1,11)) - ├── flags: newline - ├── locals: [:a, :b] - ├── operator_loc: (1,0)-(1,2) = "->" - ├── opening_loc: (1,9)-(1,10) = "{" - ├── closing_loc: (1,10)-(1,11) = "}" - ├── parameters: - │ @ BlockParametersNode (location: (1,2)-(1,8)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,3)-(1,4)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (1,3)-(1,4)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :a - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 1) - │ │ └── @ BlockLocalVariableNode (location: (1,6)-(1,7)) - │ │ ├── flags: ∅ - │ │ └── name: :b - │ ├── opening_loc: (1,2)-(1,3) = "(" - │ └── closing_loc: (1,7)-(1,8) = ")" - └── body: ∅ diff --git a/test/prism/snapshots/seattlerb/str_backslashes.txt b/test/prism/snapshots/seattlerb/str_backslashes.txt deleted file mode 100644 index e73793beb8d36c..00000000000000 --- a/test/prism/snapshots/seattlerb/str_backslashes.txt +++ /dev/null @@ -1,26 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,204)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,204)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,204)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :x - ├── message_loc: (1,0)-(1,1) = "x" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,2)-(1,204)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ StringNode (location: (1,2)-(1,204)) - │ ├── flags: ∅ - │ ├── opening_loc: (1,2)-(1,3) = "'" - │ ├── content_loc: (1,3)-(1,203) = "\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n" - │ ├── closing_loc: (1,203)-(1,204) = "'" - │ └── unescaped: "\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n" - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/str_double_double_escaped_newline.txt b/test/prism/snapshots/seattlerb/str_double_double_escaped_newline.txt deleted file mode 100644 index fa7444d7e71a34..00000000000000 --- a/test/prism/snapshots/seattlerb/str_double_double_escaped_newline.txt +++ /dev/null @@ -1,36 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,9)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,9)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ CallNode (location: (1,0)-(1,7)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (1,0)-(1,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,2)-(1,7)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ StringNode (location: (1,2)-(1,7)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (1,2)-(1,3) = "\"" - │ │ ├── content_loc: (1,3)-(1,6) = "\\\\n" - │ │ ├── closing_loc: (1,6)-(1,7) = "\"" - │ │ └── unescaped: "\\n" - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── @ CallNode (location: (1,8)-(1,9)) - ├── flags: newline, variable_call, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :b - ├── message_loc: (1,8)-(1,9) = "b" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/str_double_escaped_newline.txt b/test/prism/snapshots/seattlerb/str_double_escaped_newline.txt deleted file mode 100644 index c91c9139195c65..00000000000000 --- a/test/prism/snapshots/seattlerb/str_double_escaped_newline.txt +++ /dev/null @@ -1,36 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,8)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,8)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ CallNode (location: (1,0)-(1,6)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (1,0)-(1,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,2)-(1,6)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ StringNode (location: (1,2)-(1,6)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (1,2)-(1,3) = "\"" - │ │ ├── content_loc: (1,3)-(1,5) = "\\n" - │ │ ├── closing_loc: (1,5)-(1,6) = "\"" - │ │ └── unescaped: "\n" - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── @ CallNode (location: (1,7)-(1,8)) - ├── flags: newline, variable_call, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :b - ├── message_loc: (1,7)-(1,8) = "b" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/str_double_newline.txt b/test/prism/snapshots/seattlerb/str_double_newline.txt deleted file mode 100644 index 7809a9aafff7c9..00000000000000 --- a/test/prism/snapshots/seattlerb/str_double_newline.txt +++ /dev/null @@ -1,36 +0,0 @@ -@ ProgramNode (location: (1,0)-(2,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(2,3)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ CallNode (location: (1,0)-(2,1)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (1,0)-(1,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,2)-(2,1)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ StringNode (location: (1,2)-(2,1)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (1,2)-(1,3) = "\"" - │ │ ├── content_loc: (1,3)-(2,0) = "\n" - │ │ ├── closing_loc: (2,0)-(2,1) = "\"" - │ │ └── unescaped: "\n" - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── @ CallNode (location: (2,2)-(2,3)) - ├── flags: newline, variable_call, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :b - ├── message_loc: (2,2)-(2,3) = "b" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/str_evstr.txt b/test/prism/snapshots/seattlerb/str_evstr.txt deleted file mode 100644 index 98b65f00f84f89..00000000000000 --- a/test/prism/snapshots/seattlerb/str_evstr.txt +++ /dev/null @@ -1,36 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,8)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,8)) - ├── flags: ∅ - └── body: (length: 1) - └── @ InterpolatedStringNode (location: (1,0)-(1,8)) - ├── flags: newline - ├── opening_loc: (1,0)-(1,1) = "\"" - ├── parts: (length: 2) - │ ├── @ StringNode (location: (1,1)-(1,3)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (1,1)-(1,3) = "a " - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "a " - │ └── @ EmbeddedStatementsNode (location: (1,3)-(1,7)) - │ ├── flags: ∅ - │ ├── opening_loc: (1,3)-(1,5) = "\#{" - │ ├── statements: - │ │ @ StatementsNode (location: (1,5)-(1,6)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (1,5)-(1,6)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :b - │ │ ├── message_loc: (1,5)-(1,6) = "b" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── closing_loc: (1,6)-(1,7) = "}" - └── closing_loc: (1,7)-(1,8) = "\"" diff --git a/test/prism/snapshots/seattlerb/str_evstr_escape.txt b/test/prism/snapshots/seattlerb/str_evstr_escape.txt deleted file mode 100644 index f6559cc822fe09..00000000000000 --- a/test/prism/snapshots/seattlerb/str_evstr_escape.txt +++ /dev/null @@ -1,42 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,16)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,16)) - ├── flags: ∅ - └── body: (length: 1) - └── @ InterpolatedStringNode (location: (1,0)-(1,16)) - ├── flags: newline - ├── opening_loc: (1,0)-(1,1) = "\"" - ├── parts: (length: 3) - │ ├── @ StringNode (location: (1,1)-(1,3)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (1,1)-(1,3) = "a " - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "a " - │ ├── @ EmbeddedStatementsNode (location: (1,3)-(1,7)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (1,3)-(1,5) = "\#{" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (1,5)-(1,6)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (1,5)-(1,6)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (1,5)-(1,6) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── closing_loc: (1,6)-(1,7) = "}" - │ └── @ StringNode (location: (1,7)-(1,15)) - │ ├── flags: static_literal, forced_utf8_encoding, frozen - │ ├── opening_loc: ∅ - │ ├── content_loc: (1,7)-(1,15) = "\\302\\275" - │ ├── closing_loc: ∅ - │ └── unescaped: "½" - └── closing_loc: (1,15)-(1,16) = "\"" diff --git a/test/prism/snapshots/seattlerb/str_heredoc_interp.txt b/test/prism/snapshots/seattlerb/str_heredoc_interp.txt deleted file mode 100644 index 1261eec6c3f5db..00000000000000 --- a/test/prism/snapshots/seattlerb/str_heredoc_interp.txt +++ /dev/null @@ -1,36 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,4)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,4)) - ├── flags: ∅ - └── body: (length: 1) - └── @ InterpolatedStringNode (location: (1,0)-(1,4)) - ├── flags: newline - ├── opening_loc: (1,0)-(1,4) = "<<\"\"" - ├── parts: (length: 2) - │ ├── @ EmbeddedStatementsNode (location: (2,0)-(2,4)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (2,0)-(2,2) = "\#{" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (2,2)-(2,3)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (2,2)-(2,3)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :x - │ │ │ ├── message_loc: (2,2)-(2,3) = "x" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── closing_loc: (2,3)-(2,4) = "}" - │ └── @ StringNode (location: (2,4)-(4,0)) - │ ├── flags: static_literal, frozen - │ ├── opening_loc: ∅ - │ ├── content_loc: (2,4)-(4,0) = "\nblah2\n" - │ ├── closing_loc: ∅ - │ └── unescaped: "\nblah2\n" - └── closing_loc: (4,0)-(5,0) = "\n" diff --git a/test/prism/snapshots/seattlerb/str_interp_ternary_or_label.txt b/test/prism/snapshots/seattlerb/str_interp_ternary_or_label.txt deleted file mode 100644 index 8161109337c35f..00000000000000 --- a/test/prism/snapshots/seattlerb/str_interp_ternary_or_label.txt +++ /dev/null @@ -1,113 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,23)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,23)) - ├── flags: ∅ - └── body: (length: 1) - └── @ InterpolatedStringNode (location: (1,0)-(1,23)) - ├── flags: newline - ├── opening_loc: (1,0)-(1,1) = "\"" - ├── parts: (length: 1) - │ └── @ EmbeddedStatementsNode (location: (1,1)-(1,22)) - │ ├── flags: ∅ - │ ├── opening_loc: (1,1)-(1,3) = "\#{" - │ ├── statements: - │ │ @ StatementsNode (location: (1,3)-(1,21)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ IfNode (location: (1,3)-(1,21)) - │ │ ├── flags: ∅ - │ │ ├── if_keyword_loc: ∅ - │ │ ├── predicate: - │ │ │ @ CallNode (location: (1,3)-(1,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── receiver: - │ │ │ │ @ CallNode (location: (1,3)-(1,4)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :a - │ │ │ │ ├── message_loc: (1,3)-(1,4) = "a" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── call_operator_loc: (1,4)-(1,5) = "." - │ │ │ ├── name: :b? - │ │ │ ├── message_loc: (1,5)-(1,7) = "b?" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── then_keyword_loc: (1,8)-(1,9) = "?" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (1,10)-(1,17)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (1,10)-(1,17)) - │ │ │ ├── flags: newline - │ │ │ ├── receiver: - │ │ │ │ @ CallNode (location: (1,10)-(1,14)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── receiver: - │ │ │ │ │ @ StringNode (location: (1,10)-(1,12)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── opening_loc: (1,10)-(1,11) = "\"" - │ │ │ │ │ ├── content_loc: (1,11)-(1,11) = "" - │ │ │ │ │ ├── closing_loc: (1,11)-(1,12) = "\"" - │ │ │ │ │ └── unescaped: "" - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :+ - │ │ │ │ ├── message_loc: (1,12)-(1,13) = "+" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: - │ │ │ │ │ @ ArgumentsNode (location: (1,13)-(1,14)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── arguments: (length: 1) - │ │ │ │ │ └── @ CallNode (location: (1,13)-(1,14)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :a - │ │ │ │ │ ├── message_loc: (1,13)-(1,14) = "a" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :+ - │ │ │ ├── message_loc: (1,14)-(1,15) = "+" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (1,15)-(1,17)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ StringNode (location: (1,15)-(1,17)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── opening_loc: (1,15)-(1,16) = "\"" - │ │ │ │ ├── content_loc: (1,16)-(1,16) = "" - │ │ │ │ ├── closing_loc: (1,16)-(1,17) = "\"" - │ │ │ │ └── unescaped: "" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── subsequent: - │ │ │ @ ElseNode (location: (1,17)-(1,21)) - │ │ │ ├── flags: ∅ - │ │ │ ├── else_keyword_loc: (1,17)-(1,18) = ":" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (1,19)-(1,21)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ StringNode (location: (1,19)-(1,21)) - │ │ │ │ ├── flags: newline - │ │ │ │ ├── opening_loc: (1,19)-(1,20) = "\"" - │ │ │ │ ├── content_loc: (1,20)-(1,20) = "" - │ │ │ │ ├── closing_loc: (1,20)-(1,21) = "\"" - │ │ │ │ └── unescaped: "" - │ │ │ └── end_keyword_loc: ∅ - │ │ └── end_keyword_loc: ∅ - │ └── closing_loc: (1,21)-(1,22) = "}" - └── closing_loc: (1,22)-(1,23) = "\"" diff --git a/test/prism/snapshots/seattlerb/str_lit_concat_bad_encodings.txt b/test/prism/snapshots/seattlerb/str_lit_concat_bad_encodings.txt deleted file mode 100644 index 4a80bc33058086..00000000000000 --- a/test/prism/snapshots/seattlerb/str_lit_concat_bad_encodings.txt +++ /dev/null @@ -1,24 +0,0 @@ -@ ProgramNode (location: (1,0)-(2,66)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(2,66)) - ├── flags: ∅ - └── body: (length: 1) - └── @ InterpolatedStringNode (location: (1,0)-(2,66)) - ├── flags: newline, static_literal - ├── opening_loc: ∅ - ├── parts: (length: 2) - │ ├── @ StringNode (location: (1,0)-(1,62)) - │ │ ├── flags: static_literal, forced_utf8_encoding, frozen - │ │ ├── opening_loc: (1,0)-(1,1) = "\"" - │ │ ├── content_loc: (1,1)-(1,61) = "\\xE3\\xD3\\x8B\\xE3\\x83\\xBC\\x83\\xE3\\x83\\xE3\\x82\\xB3\\xA3\\x82\\x99" - │ │ ├── closing_loc: (1,61)-(1,62) = "\"" - │ │ └── unescaped: "\xE3Ӌー\x83\xE3\x83コ\xA3\x82\x99" - │ └── @ StringNode (location: (2,8)-(2,66)) - │ ├── flags: static_literal, forced_utf8_encoding, frozen - │ ├── opening_loc: (2,8)-(2,9) = "\"" - │ ├── content_loc: (2,9)-(2,65) = "\\xE3\\x83\\xB3\\xE3\\x83\\x8F\\xE3\\x82\\x9A\\xC3\\xBD;foo@bar.com" - │ ├── closing_loc: (2,65)-(2,66) = "\"" - │ └── unescaped: "ンパý;foo@bar.com" - └── closing_loc: ∅ diff --git a/test/prism/snapshots/seattlerb/str_newline_hash_line_number.txt b/test/prism/snapshots/seattlerb/str_newline_hash_line_number.txt deleted file mode 100644 index 1ac2e04c60848e..00000000000000 --- a/test/prism/snapshots/seattlerb/str_newline_hash_line_number.txt +++ /dev/null @@ -1,16 +0,0 @@ -@ ProgramNode (location: (1,0)-(2,1)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(2,1)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ StringNode (location: (1,0)-(1,11)) - │ ├── flags: newline - │ ├── opening_loc: (1,0)-(1,1) = "\"" - │ ├── content_loc: (1,1)-(1,10) = "\\n\\n\\n\\n#" - │ ├── closing_loc: (1,10)-(1,11) = "\"" - │ └── unescaped: "\n\n\n\n#" - └── @ IntegerNode (location: (2,0)-(2,1)) - ├── flags: newline, static_literal, decimal - └── value: 1 diff --git a/test/prism/snapshots/seattlerb/str_pct_Q_nested.txt b/test/prism/snapshots/seattlerb/str_pct_Q_nested.txt deleted file mode 100644 index 76a0f5a5cf1ef6..00000000000000 --- a/test/prism/snapshots/seattlerb/str_pct_Q_nested.txt +++ /dev/null @@ -1,42 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,26)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,26)) - ├── flags: ∅ - └── body: (length: 1) - └── @ InterpolatedStringNode (location: (1,0)-(1,26)) - ├── flags: newline - ├── opening_loc: (1,0)-(1,3) = "%Q[" - ├── parts: (length: 3) - │ ├── @ StringNode (location: (1,3)-(1,11)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (1,3)-(1,11) = "before [" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "before [" - │ ├── @ EmbeddedStatementsNode (location: (1,11)-(1,18)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (1,11)-(1,13) = "\#{" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (1,13)-(1,17)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (1,13)-(1,17)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :nest - │ │ │ ├── message_loc: (1,13)-(1,17) = "nest" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── closing_loc: (1,17)-(1,18) = "}" - │ └── @ StringNode (location: (1,18)-(1,25)) - │ ├── flags: static_literal, frozen - │ ├── opening_loc: ∅ - │ ├── content_loc: (1,18)-(1,25) = "] after" - │ ├── closing_loc: ∅ - │ └── unescaped: "] after" - └── closing_loc: (1,25)-(1,26) = "]" diff --git a/test/prism/snapshots/seattlerb/str_pct_nested_nested.txt b/test/prism/snapshots/seattlerb/str_pct_nested_nested.txt deleted file mode 100644 index 02125b374da97f..00000000000000 --- a/test/prism/snapshots/seattlerb/str_pct_nested_nested.txt +++ /dev/null @@ -1,48 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,20)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,20)) - ├── flags: ∅ - └── body: (length: 1) - └── @ InterpolatedStringNode (location: (1,0)-(1,20)) - ├── flags: newline - ├── opening_loc: (1,0)-(1,2) = "%{" - ├── parts: (length: 3) - │ ├── @ StringNode (location: (1,2)-(1,5)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (1,2)-(1,5) = " { " - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: " { " - │ ├── @ EmbeddedStatementsNode (location: (1,5)-(1,16)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (1,5)-(1,7) = "\#{" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (1,8)-(1,14)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ InterpolatedStringNode (location: (1,8)-(1,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (1,8)-(1,9) = "\"" - │ │ │ ├── parts: (length: 1) - │ │ │ │ └── @ EmbeddedStatementsNode (location: (1,9)-(1,13)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── opening_loc: (1,9)-(1,11) = "\#{" - │ │ │ │ ├── statements: - │ │ │ │ │ @ StatementsNode (location: (1,11)-(1,12)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── body: (length: 1) - │ │ │ │ │ └── @ IntegerNode (location: (1,11)-(1,12)) - │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ └── value: 1 - │ │ │ │ └── closing_loc: (1,12)-(1,13) = "}" - │ │ │ └── closing_loc: (1,13)-(1,14) = "\"" - │ │ └── closing_loc: (1,15)-(1,16) = "}" - │ └── @ StringNode (location: (1,16)-(1,19)) - │ ├── flags: static_literal, frozen - │ ├── opening_loc: ∅ - │ ├── content_loc: (1,16)-(1,19) = " } " - │ ├── closing_loc: ∅ - │ └── unescaped: " } " - └── closing_loc: (1,19)-(1,20) = "}" diff --git a/test/prism/snapshots/seattlerb/str_pct_q.txt b/test/prism/snapshots/seattlerb/str_pct_q.txt deleted file mode 100644 index ddcbb1ac562b46..00000000000000 --- a/test/prism/snapshots/seattlerb/str_pct_q.txt +++ /dev/null @@ -1,13 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,9)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,9)) - ├── flags: ∅ - └── body: (length: 1) - └── @ StringNode (location: (1,0)-(1,9)) - ├── flags: newline - ├── opening_loc: (1,0)-(1,3) = "%q{" - ├── content_loc: (1,3)-(1,8) = "a b c" - ├── closing_loc: (1,8)-(1,9) = "}" - └── unescaped: "a b c" diff --git a/test/prism/snapshots/seattlerb/str_single_double_escaped_newline.txt b/test/prism/snapshots/seattlerb/str_single_double_escaped_newline.txt deleted file mode 100644 index 2187edc92debcb..00000000000000 --- a/test/prism/snapshots/seattlerb/str_single_double_escaped_newline.txt +++ /dev/null @@ -1,36 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,9)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,9)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ CallNode (location: (1,0)-(1,7)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (1,0)-(1,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,2)-(1,7)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ StringNode (location: (1,2)-(1,7)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (1,2)-(1,3) = "'" - │ │ ├── content_loc: (1,3)-(1,6) = "\\\\n" - │ │ ├── closing_loc: (1,6)-(1,7) = "'" - │ │ └── unescaped: "\\n" - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── @ CallNode (location: (1,8)-(1,9)) - ├── flags: newline, variable_call, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :b - ├── message_loc: (1,8)-(1,9) = "b" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/str_single_escaped_newline.txt b/test/prism/snapshots/seattlerb/str_single_escaped_newline.txt deleted file mode 100644 index 36028e09d0b3d6..00000000000000 --- a/test/prism/snapshots/seattlerb/str_single_escaped_newline.txt +++ /dev/null @@ -1,36 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,8)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,8)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ CallNode (location: (1,0)-(1,6)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (1,0)-(1,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,2)-(1,6)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ StringNode (location: (1,2)-(1,6)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (1,2)-(1,3) = "'" - │ │ ├── content_loc: (1,3)-(1,5) = "\\n" - │ │ ├── closing_loc: (1,5)-(1,6) = "'" - │ │ └── unescaped: "\\n" - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── @ CallNode (location: (1,7)-(1,8)) - ├── flags: newline, variable_call, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :b - ├── message_loc: (1,7)-(1,8) = "b" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/str_single_newline.txt b/test/prism/snapshots/seattlerb/str_single_newline.txt deleted file mode 100644 index b53d1ed81aaa1c..00000000000000 --- a/test/prism/snapshots/seattlerb/str_single_newline.txt +++ /dev/null @@ -1,36 +0,0 @@ -@ ProgramNode (location: (1,0)-(2,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(2,3)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ CallNode (location: (1,0)-(2,1)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (1,0)-(1,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,2)-(2,1)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ StringNode (location: (1,2)-(2,1)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (1,2)-(1,3) = "'" - │ │ ├── content_loc: (1,3)-(2,0) = "\n" - │ │ ├── closing_loc: (2,0)-(2,1) = "'" - │ │ └── unescaped: "\n" - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── @ CallNode (location: (2,2)-(2,3)) - ├── flags: newline, variable_call, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :b - ├── message_loc: (2,2)-(2,3) = "b" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/str_str.txt b/test/prism/snapshots/seattlerb/str_str.txt deleted file mode 100644 index 37a57d2fd6c6bf..00000000000000 --- a/test/prism/snapshots/seattlerb/str_str.txt +++ /dev/null @@ -1,32 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,10)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,10)) - ├── flags: ∅ - └── body: (length: 1) - └── @ InterpolatedStringNode (location: (1,0)-(1,10)) - ├── flags: newline, static_literal, mutable - ├── opening_loc: (1,0)-(1,1) = "\"" - ├── parts: (length: 2) - │ ├── @ StringNode (location: (1,1)-(1,3)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (1,1)-(1,3) = "a " - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "a " - │ └── @ EmbeddedStatementsNode (location: (1,3)-(1,9)) - │ ├── flags: ∅ - │ ├── opening_loc: (1,3)-(1,5) = "\#{" - │ ├── statements: - │ │ @ StatementsNode (location: (1,5)-(1,8)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ StringNode (location: (1,5)-(1,8)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: (1,5)-(1,6) = "'" - │ │ ├── content_loc: (1,6)-(1,7) = "b" - │ │ ├── closing_loc: (1,7)-(1,8) = "'" - │ │ └── unescaped: "b" - │ └── closing_loc: (1,8)-(1,9) = "}" - └── closing_loc: (1,9)-(1,10) = "\"" diff --git a/test/prism/snapshots/seattlerb/str_str_str.txt b/test/prism/snapshots/seattlerb/str_str_str.txt deleted file mode 100644 index ed74c1a954ef1c..00000000000000 --- a/test/prism/snapshots/seattlerb/str_str_str.txt +++ /dev/null @@ -1,38 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,12)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,12)) - ├── flags: ∅ - └── body: (length: 1) - └── @ InterpolatedStringNode (location: (1,0)-(1,12)) - ├── flags: newline, static_literal, mutable - ├── opening_loc: (1,0)-(1,1) = "\"" - ├── parts: (length: 3) - │ ├── @ StringNode (location: (1,1)-(1,3)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (1,1)-(1,3) = "a " - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "a " - │ ├── @ EmbeddedStatementsNode (location: (1,3)-(1,9)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (1,3)-(1,5) = "\#{" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (1,5)-(1,8)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ StringNode (location: (1,5)-(1,8)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: (1,5)-(1,6) = "'" - │ │ │ ├── content_loc: (1,6)-(1,7) = "b" - │ │ │ ├── closing_loc: (1,7)-(1,8) = "'" - │ │ │ └── unescaped: "b" - │ │ └── closing_loc: (1,8)-(1,9) = "}" - │ └── @ StringNode (location: (1,9)-(1,11)) - │ ├── flags: static_literal, frozen - │ ├── opening_loc: ∅ - │ ├── content_loc: (1,9)-(1,11) = " c" - │ ├── closing_loc: ∅ - │ └── unescaped: " c" - └── closing_loc: (1,11)-(1,12) = "\"" diff --git a/test/prism/snapshots/seattlerb/super_arg.txt b/test/prism/snapshots/seattlerb/super_arg.txt deleted file mode 100644 index 76acc38ce7a1a2..00000000000000 --- a/test/prism/snapshots/seattlerb/super_arg.txt +++ /dev/null @@ -1,20 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,8)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,8)) - ├── flags: ∅ - └── body: (length: 1) - └── @ SuperNode (location: (1,0)-(1,8)) - ├── flags: newline - ├── keyword_loc: (1,0)-(1,5) = "super" - ├── lparen_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,6)-(1,8)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ IntegerNode (location: (1,6)-(1,8)) - │ ├── flags: static_literal, decimal - │ └── value: 42 - ├── rparen_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/symbol_empty.txt b/test/prism/snapshots/seattlerb/symbol_empty.txt deleted file mode 100644 index 945a0e3a51e743..00000000000000 --- a/test/prism/snapshots/seattlerb/symbol_empty.txt +++ /dev/null @@ -1,13 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ SymbolNode (location: (1,0)-(1,3)) - ├── flags: newline, static_literal, forced_us_ascii_encoding - ├── opening_loc: (1,0)-(1,2) = ":'" - ├── value_loc: (1,2)-(1,2) = "" - ├── closing_loc: (1,2)-(1,3) = "'" - └── unescaped: "" diff --git a/test/prism/snapshots/seattlerb/symbol_list.txt b/test/prism/snapshots/seattlerb/symbol_list.txt deleted file mode 100644 index 6ee21564bb3ee7..00000000000000 --- a/test/prism/snapshots/seattlerb/symbol_list.txt +++ /dev/null @@ -1,58 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,13)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,13)) - ├── flags: ∅ - └── body: (length: 1) - └── @ ArrayNode (location: (1,0)-(1,13)) - ├── flags: newline - ├── elements: (length: 2) - │ ├── @ InterpolatedSymbolNode (location: (1,3)-(1,7)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: ∅ - │ │ ├── parts: (length: 1) - │ │ │ └── @ EmbeddedStatementsNode (location: (1,3)-(1,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (1,3)-(1,5) = "\#{" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (1,5)-(1,6)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (1,5)-(1,6)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :a - │ │ │ │ ├── message_loc: (1,5)-(1,6) = "a" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── closing_loc: (1,6)-(1,7) = "}" - │ │ └── closing_loc: ∅ - │ └── @ InterpolatedSymbolNode (location: (1,8)-(1,12)) - │ ├── flags: ∅ - │ ├── opening_loc: ∅ - │ ├── parts: (length: 1) - │ │ └── @ EmbeddedStatementsNode (location: (1,8)-(1,12)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (1,8)-(1,10) = "\#{" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (1,10)-(1,11)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (1,10)-(1,11)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (1,10)-(1,11) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── closing_loc: (1,11)-(1,12) = "}" - │ └── closing_loc: ∅ - ├── opening_loc: (1,0)-(1,3) = "%I[" - └── closing_loc: (1,12)-(1,13) = "]" diff --git a/test/prism/snapshots/seattlerb/symbols.txt b/test/prism/snapshots/seattlerb/symbols.txt deleted file mode 100644 index c7292c201f5f6a..00000000000000 --- a/test/prism/snapshots/seattlerb/symbols.txt +++ /dev/null @@ -1,30 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,9)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,9)) - ├── flags: ∅ - └── body: (length: 1) - └── @ ArrayNode (location: (1,0)-(1,9)) - ├── flags: newline, static_literal - ├── elements: (length: 3) - │ ├── @ SymbolNode (location: (1,3)-(1,4)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: ∅ - │ │ ├── value_loc: (1,3)-(1,4) = "a" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "a" - │ ├── @ SymbolNode (location: (1,5)-(1,6)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: ∅ - │ │ ├── value_loc: (1,5)-(1,6) = "b" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "b" - │ └── @ SymbolNode (location: (1,7)-(1,8)) - │ ├── flags: static_literal, forced_us_ascii_encoding - │ ├── opening_loc: ∅ - │ ├── value_loc: (1,7)-(1,8) = "c" - │ ├── closing_loc: ∅ - │ └── unescaped: "c" - ├── opening_loc: (1,0)-(1,3) = "%i(" - └── closing_loc: (1,8)-(1,9) = ")" diff --git a/test/prism/snapshots/seattlerb/symbols_empty.txt b/test/prism/snapshots/seattlerb/symbols_empty.txt deleted file mode 100644 index 955a6eda727493..00000000000000 --- a/test/prism/snapshots/seattlerb/symbols_empty.txt +++ /dev/null @@ -1,12 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,4)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,4)) - ├── flags: ∅ - └── body: (length: 1) - └── @ ArrayNode (location: (1,0)-(1,4)) - ├── flags: newline, static_literal - ├── elements: (length: 0) - ├── opening_loc: (1,0)-(1,3) = "%i(" - └── closing_loc: (1,3)-(1,4) = ")" diff --git a/test/prism/snapshots/seattlerb/symbols_empty_space.txt b/test/prism/snapshots/seattlerb/symbols_empty_space.txt deleted file mode 100644 index 291a775b356f5b..00000000000000 --- a/test/prism/snapshots/seattlerb/symbols_empty_space.txt +++ /dev/null @@ -1,12 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,5)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,5)) - ├── flags: ∅ - └── body: (length: 1) - └── @ ArrayNode (location: (1,0)-(1,5)) - ├── flags: newline, static_literal - ├── elements: (length: 0) - ├── opening_loc: (1,0)-(1,3) = "%i(" - └── closing_loc: (1,4)-(1,5) = ")" diff --git a/test/prism/snapshots/seattlerb/symbols_interp.txt b/test/prism/snapshots/seattlerb/symbols_interp.txt deleted file mode 100644 index 373f8363cd57be..00000000000000 --- a/test/prism/snapshots/seattlerb/symbols_interp.txt +++ /dev/null @@ -1,30 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,15)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,15)) - ├── flags: ∅ - └── body: (length: 1) - └── @ ArrayNode (location: (1,0)-(1,15)) - ├── flags: newline, static_literal - ├── elements: (length: 3) - │ ├── @ SymbolNode (location: (1,3)-(1,4)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: ∅ - │ │ ├── value_loc: (1,3)-(1,4) = "a" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "a" - │ ├── @ SymbolNode (location: (1,5)-(1,12)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: ∅ - │ │ ├── value_loc: (1,5)-(1,12) = "b\#{1+1}" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "b\#{1+1}" - │ └── @ SymbolNode (location: (1,13)-(1,14)) - │ ├── flags: static_literal, forced_us_ascii_encoding - │ ├── opening_loc: ∅ - │ ├── value_loc: (1,13)-(1,14) = "c" - │ ├── closing_loc: ∅ - │ └── unescaped: "c" - ├── opening_loc: (1,0)-(1,3) = "%i(" - └── closing_loc: (1,14)-(1,15) = ")" diff --git a/test/prism/snapshots/seattlerb/thingy.txt b/test/prism/snapshots/seattlerb/thingy.txt deleted file mode 100644 index edbcd8e25beda2..00000000000000 --- a/test/prism/snapshots/seattlerb/thingy.txt +++ /dev/null @@ -1,59 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,7)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,7)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ CallNode (location: (1,0)-(1,6)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (1,0)-(1,1)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :f - │ │ ├── message_loc: (1,0)-(1,1) = "f" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (1,1)-(1,2) = "." - │ ├── name: :call - │ ├── message_loc: ∅ - │ ├── opening_loc: (1,2)-(1,3) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,3)-(1,5)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (1,3)-(1,5)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 42 - │ ├── closing_loc: (1,5)-(1,6) = ")" - │ └── block: ∅ - └── @ CallNode (location: (3,0)-(3,7)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (3,0)-(3,1)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :f - │ ├── message_loc: (3,0)-(3,1) = "f" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: (3,1)-(3,3) = "::" - ├── name: :call - ├── message_loc: ∅ - ├── opening_loc: (3,3)-(3,4) = "(" - ├── arguments: - │ @ ArgumentsNode (location: (3,4)-(3,6)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ IntegerNode (location: (3,4)-(3,6)) - │ ├── flags: static_literal, decimal - │ └── value: 42 - ├── closing_loc: (3,6)-(3,7) = ")" - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/uminus_float.txt b/test/prism/snapshots/seattlerb/uminus_float.txt deleted file mode 100644 index dfaaf0682757e7..00000000000000 --- a/test/prism/snapshots/seattlerb/uminus_float.txt +++ /dev/null @@ -1,10 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,4)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,4)) - ├── flags: ∅ - └── body: (length: 1) - └── @ FloatNode (location: (1,0)-(1,4)) - ├── flags: newline, static_literal - └── value: -0.0 diff --git a/test/prism/snapshots/seattlerb/unary_minus.txt b/test/prism/snapshots/seattlerb/unary_minus.txt deleted file mode 100644 index d10ff3a89e74bb..00000000000000 --- a/test/prism/snapshots/seattlerb/unary_minus.txt +++ /dev/null @@ -1,27 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,2)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,2)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,2)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (1,1)-(1,2)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (1,1)-(1,2) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: ∅ - ├── name: :-@ - ├── message_loc: (1,0)-(1,1) = "-" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/unary_plus.txt b/test/prism/snapshots/seattlerb/unary_plus.txt deleted file mode 100644 index 11cb2ebabdd6a5..00000000000000 --- a/test/prism/snapshots/seattlerb/unary_plus.txt +++ /dev/null @@ -1,27 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,2)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,2)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,2)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (1,1)-(1,2)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (1,1)-(1,2) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: ∅ - ├── name: :+@ - ├── message_loc: (1,0)-(1,1) = "+" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/unary_plus_on_literal.txt b/test/prism/snapshots/seattlerb/unary_plus_on_literal.txt deleted file mode 100644 index 3431fd6cfeb2a2..00000000000000 --- a/test/prism/snapshots/seattlerb/unary_plus_on_literal.txt +++ /dev/null @@ -1,23 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,3)) - ├── flags: newline - ├── receiver: - │ @ SymbolNode (location: (1,1)-(1,3)) - │ ├── flags: static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (1,1)-(1,2) = ":" - │ ├── value_loc: (1,2)-(1,3) = "a" - │ ├── closing_loc: ∅ - │ └── unescaped: "a" - ├── call_operator_loc: ∅ - ├── name: :+@ - ├── message_loc: (1,0)-(1,1) = "+" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/unary_tilde.txt b/test/prism/snapshots/seattlerb/unary_tilde.txt deleted file mode 100644 index 52a4fa86304408..00000000000000 --- a/test/prism/snapshots/seattlerb/unary_tilde.txt +++ /dev/null @@ -1,27 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,2)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,2)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,2)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (1,1)-(1,2)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (1,1)-(1,2) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: ∅ - ├── name: :~ - ├── message_loc: (1,0)-(1,1) = "~" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/utf8_bom.txt b/test/prism/snapshots/seattlerb/utf8_bom.txt deleted file mode 100644 index c26bb1741bdb4c..00000000000000 --- a/test/prism/snapshots/seattlerb/utf8_bom.txt +++ /dev/null @@ -1,23 +0,0 @@ -@ ProgramNode (location: (2,0)-(2,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (2,0)-(2,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (2,0)-(2,3)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :p - ├── message_loc: (2,0)-(2,1) = "p" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (2,2)-(2,3)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ IntegerNode (location: (2,2)-(2,3)) - │ ├── flags: static_literal, decimal - │ └── value: 0 - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/seattlerb/when_splat.txt b/test/prism/snapshots/seattlerb/when_splat.txt deleted file mode 100644 index 6df6e773977264..00000000000000 --- a/test/prism/snapshots/seattlerb/when_splat.txt +++ /dev/null @@ -1,44 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,25)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,25)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CaseNode (location: (1,0)-(1,25)) - ├── flags: newline - ├── predicate: - │ @ CallNode (location: (1,5)-(1,6)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (1,5)-(1,6) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── conditions: (length: 1) - │ └── @ WhenNode (location: (1,8)-(1,20)) - │ ├── flags: ∅ - │ ├── keyword_loc: (1,8)-(1,12) = "when" - │ ├── conditions: (length: 1) - │ │ └── @ SplatNode (location: (1,13)-(1,15)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (1,13)-(1,14) = "*" - │ │ └── expression: - │ │ @ CallNode (location: (1,14)-(1,15)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :b - │ │ ├── message_loc: (1,14)-(1,15) = "b" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── then_keyword_loc: (1,16)-(1,20) = "then" - │ └── statements: ∅ - ├── else_clause: ∅ - ├── case_keyword_loc: (1,0)-(1,4) = "case" - └── end_keyword_loc: (1,22)-(1,25) = "end" diff --git a/test/prism/snapshots/seattlerb/words_interp.txt b/test/prism/snapshots/seattlerb/words_interp.txt deleted file mode 100644 index 4dc5944538f068..00000000000000 --- a/test/prism/snapshots/seattlerb/words_interp.txt +++ /dev/null @@ -1,34 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,9)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,9)) - ├── flags: ∅ - └── body: (length: 1) - └── @ ArrayNode (location: (1,0)-(1,9)) - ├── flags: newline - ├── elements: (length: 1) - │ └── @ InterpolatedStringNode (location: (1,3)-(1,8)) - │ ├── flags: ∅ - │ ├── opening_loc: ∅ - │ ├── parts: (length: 2) - │ │ ├── @ EmbeddedStatementsNode (location: (1,3)-(1,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (1,3)-(1,5) = "\#{" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (1,5)-(1,6)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ IntegerNode (location: (1,5)-(1,6)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ └── closing_loc: (1,6)-(1,7) = "}" - │ │ └── @ StringNode (location: (1,7)-(1,8)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (1,7)-(1,8) = "b" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "b" - │ └── closing_loc: ∅ - ├── opening_loc: (1,0)-(1,3) = "%W(" - └── closing_loc: (1,8)-(1,9) = ")" diff --git a/test/prism/snapshots/single_method_call_with_bang.txt b/test/prism/snapshots/single_method_call_with_bang.txt deleted file mode 100644 index 8baca8888d6d36..00000000000000 --- a/test/prism/snapshots/single_method_call_with_bang.txt +++ /dev/null @@ -1,17 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,4)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,4)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,4)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :foo! - ├── message_loc: (1,0)-(1,4) = "foo!" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/single_quote_heredocs.txt b/test/prism/snapshots/single_quote_heredocs.txt deleted file mode 100644 index 0221f33e341b78..00000000000000 --- a/test/prism/snapshots/single_quote_heredocs.txt +++ /dev/null @@ -1,13 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,8)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,8)) - ├── flags: ∅ - └── body: (length: 1) - └── @ StringNode (location: (1,0)-(1,8)) - ├── flags: newline - ├── opening_loc: (1,0)-(1,8) = "<<-'EOS'" - ├── content_loc: (2,0)-(3,0) = " cd L:\\Work\\MG3710IQPro\\Develop\n" - ├── closing_loc: (3,0)-(4,0) = "EOS\n" - └── unescaped: " cd L:\\Work\\MG3710IQPro\\Develop\n" diff --git a/test/prism/snapshots/spanning_heredoc.txt b/test/prism/snapshots/spanning_heredoc.txt deleted file mode 100644 index f880f64434e373..00000000000000 --- a/test/prism/snapshots/spanning_heredoc.txt +++ /dev/null @@ -1,420 +0,0 @@ -@ ProgramNode (location: (4,0)-(63,2)) -├── flags: ∅ -├── locals: [:a] -└── statements: - @ StatementsNode (location: (4,0)-(63,2)) - ├── flags: ∅ - └── body: (length: 14) - ├── @ CallNode (location: (4,0)-(7,7)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :pp - │ ├── message_loc: (4,0)-(4,2) = "pp" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (4,3)-(7,7)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (4,3)-(7,7)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ StringNode (location: (4,3)-(4,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (4,3)-(4,7) = "<<-A" - │ │ │ ├── content_loc: (5,0)-(6,0) = "a\n" - │ │ │ ├── closing_loc: (6,0)-(7,0) = "A\n" - │ │ │ └── unescaped: "a\n" - │ │ ├── call_operator_loc: (4,7)-(4,8) = "." - │ │ ├── name: :gsub - │ │ ├── message_loc: (4,8)-(4,12) = "gsub" - │ │ ├── opening_loc: (4,12)-(4,13) = "(" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (4,13)-(7,6)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 2) - │ │ │ ├── @ InterpolatedRegularExpressionNode (location: (4,13)-(7,2)) - │ │ │ │ ├── flags: static_literal - │ │ │ │ ├── opening_loc: (4,13)-(4,14) = "/" - │ │ │ │ ├── parts: (length: 2) - │ │ │ │ │ ├── @ StringNode (location: (4,14)-(4,16)) - │ │ │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ │ ├── content_loc: (4,14)-(4,16) = "b\\" - │ │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ │ └── unescaped: "b" - │ │ │ │ │ └── @ StringNode (location: (7,0)-(7,1)) - │ │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── content_loc: (7,0)-(7,1) = "b" - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── unescaped: "b" - │ │ │ │ └── closing_loc: (7,1)-(7,2) = "/" - │ │ │ └── @ StringNode (location: (7,4)-(7,6)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (7,4)-(7,5) = "\"" - │ │ │ ├── content_loc: (7,5)-(7,5) = "" - │ │ │ ├── closing_loc: (7,5)-(7,6) = "\"" - │ │ │ └── unescaped: "" - │ │ ├── closing_loc: (7,6)-(7,7) = ")" - │ │ └── block: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (10,0)-(13,2)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :pp - │ ├── message_loc: (10,0)-(10,2) = "pp" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (10,3)-(13,2)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ StringNode (location: (10,3)-(10,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (10,3)-(10,7) = "<<-A" - │ │ │ ├── content_loc: (11,0)-(12,0) = "c\n" - │ │ │ ├── closing_loc: (12,0)-(13,0) = "A\n" - │ │ │ └── unescaped: "c\n" - │ │ └── @ InterpolatedStringNode (location: (10,9)-(13,2)) - │ │ ├── flags: static_literal - │ │ ├── opening_loc: (10,9)-(10,10) = "\"" - │ │ ├── parts: (length: 2) - │ │ │ ├── @ StringNode (location: (10,10)-(10,12)) - │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── content_loc: (10,10)-(10,12) = "d\\" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "d" - │ │ │ └── @ StringNode (location: (13,0)-(13,1)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (13,0)-(13,1) = "d" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "d" - │ │ └── closing_loc: (13,1)-(13,2) = "\"" - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (16,0)-(19,2)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :pp - │ ├── message_loc: (16,0)-(16,2) = "pp" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (16,3)-(19,2)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ StringNode (location: (16,3)-(16,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (16,3)-(16,7) = "<<-A" - │ │ │ ├── content_loc: (17,0)-(18,0) = "e\n" - │ │ │ ├── closing_loc: (18,0)-(19,0) = "A\n" - │ │ │ └── unescaped: "e\n" - │ │ └── @ InterpolatedStringNode (location: (16,9)-(19,2)) - │ │ ├── flags: static_literal - │ │ ├── opening_loc: (16,9)-(16,12) = "%q[" - │ │ ├── parts: (length: 2) - │ │ │ ├── @ StringNode (location: (16,12)-(16,14)) - │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── content_loc: (16,12)-(16,14) = "f\\" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "f\\\n" - │ │ │ └── @ StringNode (location: (19,0)-(19,1)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (19,0)-(19,1) = "f" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "f" - │ │ └── closing_loc: (19,1)-(19,2) = "]" - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (22,0)-(25,2)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :pp - │ ├── message_loc: (22,0)-(22,2) = "pp" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (22,3)-(25,2)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ StringNode (location: (22,3)-(22,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (22,3)-(22,7) = "<<-A" - │ │ │ ├── content_loc: (23,0)-(24,0) = "g\n" - │ │ │ ├── closing_loc: (24,0)-(25,0) = "A\n" - │ │ │ └── unescaped: "g\n" - │ │ └── @ InterpolatedStringNode (location: (22,9)-(25,2)) - │ │ ├── flags: static_literal - │ │ ├── opening_loc: (22,9)-(22,12) = "%Q[" - │ │ ├── parts: (length: 2) - │ │ │ ├── @ StringNode (location: (22,12)-(22,14)) - │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── content_loc: (22,12)-(22,14) = "h\\" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "h" - │ │ │ └── @ StringNode (location: (25,0)-(25,1)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (25,0)-(25,1) = "h" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "h" - │ │ └── closing_loc: (25,1)-(25,2) = "]" - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (28,0)-(31,2)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :pp - │ ├── message_loc: (28,0)-(28,2) = "pp" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (28,3)-(31,2)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ StringNode (location: (28,3)-(28,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (28,3)-(28,7) = "<<-A" - │ │ │ ├── content_loc: (29,0)-(30,0) = "i\n" - │ │ │ ├── closing_loc: (30,0)-(31,0) = "A\n" - │ │ │ └── unescaped: "i\n" - │ │ └── @ ArrayNode (location: (28,9)-(31,2)) - │ │ ├── flags: ∅ - │ │ ├── elements: (length: 2) - │ │ │ ├── @ StringNode (location: (28,12)-(28,14)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── content_loc: (28,12)-(28,14) = "j\\" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "j\n" - │ │ │ └── @ StringNode (location: (31,0)-(31,1)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (31,0)-(31,1) = "j" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "j" - │ │ ├── opening_loc: (28,9)-(28,12) = "%w[" - │ │ └── closing_loc: (31,1)-(31,2) = "]" - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (35,0)-(38,2)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :pp - │ ├── message_loc: (35,0)-(35,2) = "pp" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (35,3)-(38,2)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ StringNode (location: (35,3)-(35,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (35,3)-(35,7) = "<<-A" - │ │ │ ├── content_loc: (36,0)-(37,0) = "k\n" - │ │ │ ├── closing_loc: (37,0)-(38,0) = "A\n" - │ │ │ └── unescaped: "k\n" - │ │ └── @ ArrayNode (location: (35,9)-(38,2)) - │ │ ├── flags: static_literal - │ │ ├── elements: (length: 1) - │ │ │ └── @ InterpolatedStringNode (location: (35,12)-(38,1)) - │ │ │ ├── flags: static_literal - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── parts: (length: 2) - │ │ │ │ ├── @ StringNode (location: (35,12)-(35,14)) - │ │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── content_loc: (35,12)-(35,14) = "l\\" - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── unescaped: "l\n" - │ │ │ │ └── @ StringNode (location: (38,0)-(38,1)) - │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── content_loc: (38,0)-(38,1) = "l" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "l" - │ │ │ └── closing_loc: ∅ - │ │ ├── opening_loc: (35,9)-(35,12) = "%W[" - │ │ └── closing_loc: (38,1)-(38,2) = "]" - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (41,0)-(44,2)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :pp - │ ├── message_loc: (41,0)-(41,2) = "pp" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (41,3)-(44,2)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ StringNode (location: (41,3)-(41,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (41,3)-(41,7) = "<<-A" - │ │ │ ├── content_loc: (42,0)-(43,0) = "m\n" - │ │ │ ├── closing_loc: (43,0)-(44,0) = "A\n" - │ │ │ └── unescaped: "m\n" - │ │ └── @ ArrayNode (location: (41,9)-(44,2)) - │ │ ├── flags: static_literal - │ │ ├── elements: (length: 2) - │ │ │ ├── @ SymbolNode (location: (41,12)-(41,14)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── value_loc: (41,12)-(41,14) = "n\\" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "n\n" - │ │ │ └── @ SymbolNode (location: (44,0)-(44,1)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (44,0)-(44,1) = "n" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "n" - │ │ ├── opening_loc: (41,9)-(41,12) = "%i[" - │ │ └── closing_loc: (44,1)-(44,2) = "]" - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (48,0)-(51,2)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :pp - │ ├── message_loc: (48,0)-(48,2) = "pp" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (48,3)-(51,2)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ StringNode (location: (48,3)-(48,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (48,3)-(48,7) = "<<-A" - │ │ │ ├── content_loc: (49,0)-(50,0) = "o\n" - │ │ │ ├── closing_loc: (50,0)-(51,0) = "A\n" - │ │ │ └── unescaped: "o\n" - │ │ └── @ ArrayNode (location: (48,9)-(51,2)) - │ │ ├── flags: static_literal - │ │ ├── elements: (length: 1) - │ │ │ └── @ InterpolatedSymbolNode (location: (48,12)-(48,14)) - │ │ │ ├── flags: static_literal - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── parts: (length: 2) - │ │ │ │ ├── @ StringNode (location: (48,12)-(48,14)) - │ │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── content_loc: (48,12)-(48,14) = "p\\" - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── unescaped: "p\n" - │ │ │ │ └── @ StringNode (location: (48,12)-(48,14)) - │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── content_loc: (48,12)-(48,14) = "p\\" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "p" - │ │ │ └── closing_loc: ∅ - │ │ ├── opening_loc: (48,9)-(48,12) = "%I[" - │ │ └── closing_loc: (51,1)-(51,2) = "]" - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ StringNode (location: (53,0)-(53,3)) - │ ├── flags: newline - │ ├── opening_loc: (53,0)-(53,3) = "<)" - │ │ │ └── closing_loc: (55,6)-(55,7) = "/" - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :=~ - │ │ ├── message_loc: (55,8)-(55,10) = "=~" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (55,11)-(55,13)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ StringNode (location: (55,11)-(55,13)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (55,11)-(55,12) = "'" - │ │ │ ├── content_loc: (55,12)-(55,12) = "" - │ │ │ ├── closing_loc: (55,12)-(55,13) = "'" - │ │ │ └── unescaped: "" - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── targets: (length: 1) - │ └── @ LocalVariableTargetNode (location: (53,5)-(55,7)) - │ ├── flags: ∅ - │ ├── name: :a - │ └── depth: 0 - ├── @ StringNode (location: (57,0)-(57,3)) - │ ├── flags: newline - │ ├── opening_loc: (57,0)-(57,3) = "<=" - ├── @ SymbolNode (location: (77,0)-(77,3)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (77,0)-(77,1) = ":" - │ ├── value_loc: (77,1)-(77,3) = ">>" - │ ├── closing_loc: ∅ - │ └── unescaped: ">>" - ├── @ SymbolNode (location: (79,0)-(79,2)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (79,0)-(79,1) = ":" - │ ├── value_loc: (79,1)-(79,2) = ">" - │ ├── closing_loc: ∅ - │ └── unescaped: ">" - ├── @ SymbolNode (location: (81,0)-(81,4)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (81,0)-(81,1) = ":" - │ ├── value_loc: (81,1)-(81,4) = "<=>" - │ ├── closing_loc: ∅ - │ └── unescaped: "<=>" - ├── @ SymbolNode (location: (83,0)-(83,3)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (83,0)-(83,1) = ":" - │ ├── value_loc: (83,1)-(83,3) = "<=" - │ ├── closing_loc: ∅ - │ └── unescaped: "<=" - ├── @ SymbolNode (location: (85,0)-(85,3)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (85,0)-(85,1) = ":" - │ ├── value_loc: (85,1)-(85,3) = "<<" - │ ├── closing_loc: ∅ - │ └── unescaped: "<<" - ├── @ SymbolNode (location: (87,0)-(87,2)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (87,0)-(87,1) = ":" - │ ├── value_loc: (87,1)-(87,2) = "<" - │ ├── closing_loc: ∅ - │ └── unescaped: "<" - ├── @ SymbolNode (location: (89,0)-(89,9)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (89,0)-(89,1) = ":" - │ ├── value_loc: (89,1)-(89,9) = "__LINE__" - │ ├── closing_loc: ∅ - │ └── unescaped: "__LINE__" - ├── @ SymbolNode (location: (91,0)-(91,9)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (91,0)-(91,1) = ":" - │ ├── value_loc: (91,1)-(91,9) = "__FILE__" - │ ├── closing_loc: ∅ - │ └── unescaped: "__FILE__" - └── @ SymbolNode (location: (93,0)-(93,13)) - ├── flags: newline, static_literal, forced_us_ascii_encoding - ├── opening_loc: (93,0)-(93,1) = ":" - ├── value_loc: (93,1)-(93,13) = "__ENCODING__" - ├── closing_loc: ∅ - └── unescaped: "__ENCODING__" diff --git a/test/prism/snapshots/ternary_operator.txt b/test/prism/snapshots/ternary_operator.txt deleted file mode 100644 index 4d6a7423f9263a..00000000000000 --- a/test/prism/snapshots/ternary_operator.txt +++ /dev/null @@ -1,340 +0,0 @@ -@ ProgramNode (location: (1,0)-(15,12)) -├── flags: ∅ -├── locals: [:_a] -└── statements: - @ StatementsNode (location: (1,0)-(15,12)) - ├── flags: ∅ - └── body: (length: 8) - ├── @ IfNode (location: (1,0)-(1,9)) - │ ├── flags: newline - │ ├── if_keyword_loc: ∅ - │ ├── predicate: - │ │ @ CallNode (location: (1,0)-(1,1)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (1,0)-(1,1) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── then_keyword_loc: (1,2)-(1,3) = "?" - │ ├── statements: - │ │ @ StatementsNode (location: (1,4)-(1,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (1,4)-(1,5)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :b - │ │ ├── message_loc: (1,4)-(1,5) = "b" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── subsequent: - │ │ @ ElseNode (location: (1,6)-(1,9)) - │ │ ├── flags: ∅ - │ │ ├── else_keyword_loc: (1,6)-(1,7) = ":" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (1,8)-(1,9)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (1,8)-(1,9)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :c - │ │ │ ├── message_loc: (1,8)-(1,9) = "c" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── end_keyword_loc: ∅ - │ └── end_keyword_loc: ∅ - ├── @ IfNode (location: (3,0)-(3,27)) - │ ├── flags: newline - │ ├── if_keyword_loc: ∅ - │ ├── predicate: - │ │ @ CallNode (location: (3,0)-(3,1)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (3,0)-(3,1) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── then_keyword_loc: (3,2)-(3,3) = "?" - │ ├── statements: - │ │ @ StatementsNode (location: (3,4)-(3,14)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ DefinedNode (location: (3,4)-(3,14)) - │ │ ├── flags: newline - │ │ ├── lparen_loc: ∅ - │ │ ├── value: - │ │ │ @ CallNode (location: (3,13)-(3,14)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (3,13)-(3,14) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── rparen_loc: ∅ - │ │ └── keyword_loc: (3,4)-(3,12) = "defined?" - │ ├── subsequent: - │ │ @ ElseNode (location: (3,15)-(3,27)) - │ │ ├── flags: ∅ - │ │ ├── else_keyword_loc: (3,15)-(3,16) = ":" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (3,17)-(3,27)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ DefinedNode (location: (3,17)-(3,27)) - │ │ │ ├── flags: newline - │ │ │ ├── lparen_loc: ∅ - │ │ │ ├── value: - │ │ │ │ @ CallNode (location: (3,26)-(3,27)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :c - │ │ │ │ ├── message_loc: (3,26)-(3,27) = "c" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── rparen_loc: ∅ - │ │ │ └── keyword_loc: (3,17)-(3,25) = "defined?" - │ │ └── end_keyword_loc: ∅ - │ └── end_keyword_loc: ∅ - ├── @ IfNode (location: (5,0)-(5,15)) - │ ├── flags: newline - │ ├── if_keyword_loc: ∅ - │ ├── predicate: - │ │ @ CallNode (location: (5,0)-(5,6)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :empty? - │ │ ├── message_loc: (5,0)-(5,6) = "empty?" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── then_keyword_loc: (5,6)-(5,7) = "?" - │ ├── statements: - │ │ @ StatementsNode (location: (5,7)-(5,11)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ TrueNode (location: (5,7)-(5,11)) - │ │ └── flags: newline, static_literal - │ ├── subsequent: - │ │ @ ElseNode (location: (5,11)-(5,15)) - │ │ ├── flags: ∅ - │ │ ├── else_keyword_loc: (5,11)-(5,12) = ":" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (5,12)-(5,15)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ NilNode (location: (5,12)-(5,15)) - │ │ │ └── flags: newline, static_literal - │ │ └── end_keyword_loc: ∅ - │ └── end_keyword_loc: ∅ - ├── @ IfNode (location: (7,0)-(7,16)) - │ ├── flags: newline - │ ├── if_keyword_loc: ∅ - │ ├── predicate: - │ │ @ CallNode (location: (7,0)-(7,6)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :empty? - │ │ ├── message_loc: (7,0)-(7,6) = "empty?" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── then_keyword_loc: (7,6)-(7,7) = "?" - │ ├── statements: - │ │ @ StatementsNode (location: (7,7)-(7,12)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ FalseNode (location: (7,7)-(7,12)) - │ │ └── flags: newline, static_literal - │ ├── subsequent: - │ │ @ ElseNode (location: (7,12)-(7,16)) - │ │ ├── flags: ∅ - │ │ ├── else_keyword_loc: (7,12)-(7,13) = ":" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (7,13)-(7,16)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ NilNode (location: (7,13)-(7,16)) - │ │ │ └── flags: newline, static_literal - │ │ └── end_keyword_loc: ∅ - │ └── end_keyword_loc: ∅ - ├── @ IfNode (location: (9,0)-(9,14)) - │ ├── flags: newline - │ ├── if_keyword_loc: ∅ - │ ├── predicate: - │ │ @ CallNode (location: (9,0)-(9,6)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :empty? - │ │ ├── message_loc: (9,0)-(9,6) = "empty?" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── then_keyword_loc: (9,6)-(9,7) = "?" - │ ├── statements: - │ │ @ StatementsNode (location: (9,7)-(9,10)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ NilNode (location: (9,7)-(9,10)) - │ │ └── flags: newline, static_literal - │ ├── subsequent: - │ │ @ ElseNode (location: (9,10)-(9,14)) - │ │ ├── flags: ∅ - │ │ ├── else_keyword_loc: (9,10)-(9,11) = ":" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (9,11)-(9,14)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ NilNode (location: (9,11)-(9,14)) - │ │ │ └── flags: newline, static_literal - │ │ └── end_keyword_loc: ∅ - │ └── end_keyword_loc: ∅ - ├── @ IfNode (location: (11,0)-(11,10)) - │ ├── flags: newline - │ ├── if_keyword_loc: ∅ - │ ├── predicate: - │ │ @ CallNode (location: (11,0)-(11,2)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a? - │ │ ├── message_loc: (11,0)-(11,2) = "a?" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── then_keyword_loc: (11,2)-(11,3) = "?" - │ ├── statements: - │ │ @ StatementsNode (location: (11,3)-(11,6)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ NilNode (location: (11,3)-(11,6)) - │ │ └── flags: newline, static_literal - │ ├── subsequent: - │ │ @ ElseNode (location: (11,6)-(11,10)) - │ │ ├── flags: ∅ - │ │ ├── else_keyword_loc: (11,6)-(11,7) = ":" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (11,7)-(11,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ NilNode (location: (11,7)-(11,10)) - │ │ │ └── flags: newline, static_literal - │ │ └── end_keyword_loc: ∅ - │ └── end_keyword_loc: ∅ - ├── @ IfNode (location: (13,0)-(13,14)) - │ ├── flags: newline - │ ├── if_keyword_loc: ∅ - │ ├── predicate: - │ │ @ CallNode (location: (13,0)-(13,1)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (13,0)-(13,1) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── then_keyword_loc: (13,2)-(13,3) = "?" - │ ├── statements: - │ │ @ StatementsNode (location: (13,3)-(13,7)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (13,3)-(13,7)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :var1 - │ │ ├── message_loc: (13,3)-(13,7) = "var1" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── subsequent: - │ │ @ ElseNode (location: (13,8)-(13,14)) - │ │ ├── flags: ∅ - │ │ ├── else_keyword_loc: (13,8)-(13,9) = ":" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (13,10)-(13,14)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (13,10)-(13,14)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :var2 - │ │ │ ├── message_loc: (13,10)-(13,14) = "var2" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── end_keyword_loc: ∅ - │ └── end_keyword_loc: ∅ - └── @ IfNode (location: (15,0)-(15,12)) - ├── flags: newline - ├── if_keyword_loc: ∅ - ├── predicate: - │ @ CallNode (location: (15,0)-(15,4)) - │ ├── flags: ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :nil? - │ ├── message_loc: (15,0)-(15,4) = "nil?" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── then_keyword_loc: (15,4)-(15,5) = "?" - ├── statements: - │ @ StatementsNode (location: (15,5)-(15,10)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ LocalVariableWriteNode (location: (15,5)-(15,10)) - │ ├── flags: newline - │ ├── name: :_a - │ ├── depth: 0 - │ ├── name_loc: (15,5)-(15,7) = "_a" - │ ├── value: - │ │ @ IntegerNode (location: (15,9)-(15,10)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ └── operator_loc: (15,8)-(15,9) = "=" - ├── subsequent: - │ @ ElseNode (location: (15,10)-(15,12)) - │ ├── flags: ∅ - │ ├── else_keyword_loc: (15,10)-(15,11) = ":" - │ ├── statements: - │ │ @ StatementsNode (location: (15,11)-(15,12)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ IntegerNode (location: (15,11)-(15,12)) - │ │ ├── flags: newline, static_literal, decimal - │ │ └── value: 1 - │ └── end_keyword_loc: ∅ - └── end_keyword_loc: ∅ diff --git a/test/prism/snapshots/tilde_heredocs.txt b/test/prism/snapshots/tilde_heredocs.txt deleted file mode 100644 index dc6321ce1a5972..00000000000000 --- a/test/prism/snapshots/tilde_heredocs.txt +++ /dev/null @@ -1,421 +0,0 @@ -@ ProgramNode (location: (1,0)-(94,6)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(94,6)) - ├── flags: ∅ - └── body: (length: 19) - ├── @ InterpolatedStringNode (location: (1,0)-(1,6)) - │ ├── flags: newline - │ ├── opening_loc: (1,0)-(1,6) = "<<~EOF" - │ ├── parts: (length: 4) - │ │ ├── @ StringNode (location: (2,0)-(3,0)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (2,0)-(3,0) = " a\n" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: " a\n" - │ │ ├── @ EmbeddedStatementsNode (location: (3,0)-(3,4)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (3,0)-(3,2) = "\#{" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (3,2)-(3,3)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ IntegerNode (location: (3,2)-(3,3)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ └── closing_loc: (3,3)-(3,4) = "}" - │ │ ├── @ StringNode (location: (3,4)-(4,0)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (3,4)-(4,0) = "\n" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "\n" - │ │ └── @ StringNode (location: (4,0)-(5,0)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (4,0)-(5,0) = " a\n" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: " a\n" - │ └── closing_loc: (5,0)-(6,0) = "EOF\n" - ├── @ StringNode (location: (7,0)-(7,6)) - │ ├── flags: newline - │ ├── opening_loc: (7,0)-(7,6) = "<<~EOF" - │ ├── content_loc: (8,0)-(9,0) = " a\n" - │ ├── closing_loc: (9,0)-(10,0) = "EOF\n" - │ └── unescaped: "a\n" - ├── @ InterpolatedStringNode (location: (11,0)-(11,6)) - │ ├── flags: newline, static_literal - │ ├── opening_loc: (11,0)-(11,6) = "<<~EOF" - │ ├── parts: (length: 3) - │ │ ├── @ StringNode (location: (12,0)-(13,0)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (12,0)-(13,0) = "\ta\n" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "\ta\n" - │ │ ├── @ StringNode (location: (13,0)-(14,0)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (13,0)-(14,0) = " b\n" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "b\n" - │ │ └── @ StringNode (location: (14,0)-(15,0)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (14,0)-(15,0) = "\t\tc\n" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "\t\tc\n" - │ └── closing_loc: (15,0)-(16,0) = "EOF\n" - ├── @ InterpolatedStringNode (location: (17,0)-(17,6)) - │ ├── flags: newline - │ ├── opening_loc: (17,0)-(17,6) = "<<~EOF" - │ ├── parts: (length: 2) - │ │ ├── @ EmbeddedStatementsNode (location: (18,2)-(18,6)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (18,2)-(18,4) = "\#{" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (18,4)-(18,5)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ IntegerNode (location: (18,4)-(18,5)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ └── closing_loc: (18,5)-(18,6) = "}" - │ │ └── @ StringNode (location: (18,6)-(19,0)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (18,6)-(19,0) = " a\n" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: " a\n" - │ └── closing_loc: (19,0)-(20,0) = "EOF\n" - ├── @ InterpolatedStringNode (location: (21,0)-(21,6)) - │ ├── flags: newline - │ ├── opening_loc: (21,0)-(21,6) = "<<~EOF" - │ ├── parts: (length: 3) - │ │ ├── @ StringNode (location: (22,0)-(22,4)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (22,0)-(22,4) = " a " - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "a " - │ │ ├── @ EmbeddedStatementsNode (location: (22,4)-(22,8)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (22,4)-(22,6) = "\#{" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (22,6)-(22,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ IntegerNode (location: (22,6)-(22,7)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ └── closing_loc: (22,7)-(22,8) = "}" - │ │ └── @ StringNode (location: (22,8)-(23,0)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (22,8)-(23,0) = "\n" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "\n" - │ └── closing_loc: (23,0)-(24,0) = "EOF\n" - ├── @ InterpolatedStringNode (location: (25,0)-(25,6)) - │ ├── flags: newline - │ ├── opening_loc: (25,0)-(25,6) = "<<~EOF" - │ ├── parts: (length: 3) - │ │ ├── @ StringNode (location: (26,0)-(27,0)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (26,0)-(27,0) = " a\n" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: " a\n" - │ │ ├── @ EmbeddedStatementsNode (location: (27,1)-(27,5)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (27,1)-(27,3) = "\#{" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (27,3)-(27,4)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ IntegerNode (location: (27,3)-(27,4)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ └── closing_loc: (27,4)-(27,5) = "}" - │ │ └── @ StringNode (location: (27,5)-(28,0)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (27,5)-(28,0) = "\n" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "\n" - │ └── closing_loc: (28,0)-(29,0) = "EOF\n" - ├── @ InterpolatedStringNode (location: (30,0)-(30,6)) - │ ├── flags: newline - │ ├── opening_loc: (30,0)-(30,6) = "<<~EOF" - │ ├── parts: (length: 3) - │ │ ├── @ StringNode (location: (31,0)-(32,0)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (31,0)-(32,0) = " a\n" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "a\n" - │ │ ├── @ EmbeddedStatementsNode (location: (32,2)-(32,6)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (32,2)-(32,4) = "\#{" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (32,4)-(32,5)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ IntegerNode (location: (32,4)-(32,5)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ └── closing_loc: (32,5)-(32,6) = "}" - │ │ └── @ StringNode (location: (32,6)-(33,0)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (32,6)-(33,0) = "\n" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "\n" - │ └── closing_loc: (33,0)-(34,0) = "EOF\n" - ├── @ InterpolatedStringNode (location: (35,0)-(35,6)) - │ ├── flags: newline, static_literal - │ ├── opening_loc: (35,0)-(35,6) = "<<~EOF" - │ ├── parts: (length: 2) - │ │ ├── @ StringNode (location: (36,0)-(37,0)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (36,0)-(37,0) = " a\n" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "a\n" - │ │ └── @ StringNode (location: (37,0)-(38,0)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (37,0)-(38,0) = " b\n" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "b\n" - │ └── closing_loc: (38,0)-(39,0) = "EOF\n" - ├── @ InterpolatedStringNode (location: (40,0)-(40,6)) - │ ├── flags: newline, static_literal - │ ├── opening_loc: (40,0)-(40,6) = "<<~EOF" - │ ├── parts: (length: 2) - │ │ ├── @ StringNode (location: (41,0)-(42,0)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (41,0)-(42,0) = " a\n" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "a\n" - │ │ └── @ StringNode (location: (42,0)-(43,0)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (42,0)-(43,0) = " b\n" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: " b\n" - │ └── closing_loc: (43,0)-(44,0) = "EOF\n" - ├── @ InterpolatedStringNode (location: (45,0)-(45,6)) - │ ├── flags: newline, static_literal - │ ├── opening_loc: (45,0)-(45,6) = "<<~EOF" - │ ├── parts: (length: 2) - │ │ ├── @ StringNode (location: (46,0)-(47,0)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (46,0)-(47,0) = "\t\t\ta\n" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "\ta\n" - │ │ └── @ StringNode (location: (47,0)-(48,0)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (47,0)-(48,0) = "\t\tb\n" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "b\n" - │ └── closing_loc: (48,0)-(49,0) = "EOF\n" - ├── @ StringNode (location: (50,0)-(50,8)) - │ ├── flags: newline - │ ├── opening_loc: (50,0)-(50,8) = "<<~'EOF'" - │ ├── content_loc: (51,0)-(52,0) = " a \#{1}\n" - │ ├── closing_loc: (52,0)-(53,0) = "EOF\n" - │ └── unescaped: "a \#{1}\n" - ├── @ InterpolatedStringNode (location: (54,0)-(54,6)) - │ ├── flags: newline, static_literal - │ ├── opening_loc: (54,0)-(54,6) = "<<~EOF" - │ ├── parts: (length: 2) - │ │ ├── @ StringNode (location: (55,0)-(56,0)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (55,0)-(56,0) = "\ta\n" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "a\n" - │ │ └── @ StringNode (location: (56,0)-(57,0)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (56,0)-(57,0) = "\t b\n" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: " b\n" - │ └── closing_loc: (57,0)-(58,0) = "EOF\n" - ├── @ InterpolatedStringNode (location: (59,0)-(59,6)) - │ ├── flags: newline, static_literal - │ ├── opening_loc: (59,0)-(59,6) = "<<~EOF" - │ ├── parts: (length: 2) - │ │ ├── @ StringNode (location: (60,0)-(61,0)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (60,0)-(61,0) = "\t a\n" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: " a\n" - │ │ └── @ StringNode (location: (61,0)-(62,0)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (61,0)-(62,0) = "\tb\n" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "b\n" - │ └── closing_loc: (62,0)-(63,0) = "EOF\n" - ├── @ InterpolatedStringNode (location: (64,0)-(64,6)) - │ ├── flags: newline, static_literal - │ ├── opening_loc: (64,0)-(64,6) = "<<~EOF" - │ ├── parts: (length: 2) - │ │ ├── @ StringNode (location: (65,0)-(66,0)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (65,0)-(66,0) = " \ta\n" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "a\n" - │ │ └── @ StringNode (location: (66,0)-(67,0)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (66,0)-(67,0) = " b\n" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "b\n" - │ └── closing_loc: (67,0)-(68,0) = "EOF\n" - ├── @ InterpolatedStringNode (location: (69,0)-(69,6)) - │ ├── flags: newline, static_literal - │ ├── opening_loc: (69,0)-(69,6) = "<<~EOF" - │ ├── parts: (length: 3) - │ │ ├── @ StringNode (location: (70,0)-(71,0)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (70,0)-(71,0) = " a\n" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "a\n" - │ │ ├── @ StringNode (location: (71,0)-(72,0)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (71,0)-(72,0) = "\n" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "\n" - │ │ └── @ StringNode (location: (72,0)-(73,0)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (72,0)-(73,0) = " b\n" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "b\n" - │ └── closing_loc: (73,0)-(74,0) = "EOF\n" - ├── @ InterpolatedStringNode (location: (75,0)-(75,6)) - │ ├── flags: newline, static_literal - │ ├── opening_loc: (75,0)-(75,6) = "<<~EOF" - │ ├── parts: (length: 3) - │ │ ├── @ StringNode (location: (76,0)-(77,0)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (76,0)-(77,0) = " a\n" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "a\n" - │ │ ├── @ StringNode (location: (77,0)-(78,0)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (77,0)-(78,0) = "\n" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "\n" - │ │ └── @ StringNode (location: (78,0)-(79,0)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (78,0)-(79,0) = " b\n" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "b\n" - │ └── closing_loc: (79,0)-(80,0) = "EOF\n" - ├── @ InterpolatedStringNode (location: (81,0)-(81,6)) - │ ├── flags: newline, static_literal - │ ├── opening_loc: (81,0)-(81,6) = "<<~EOF" - │ ├── parts: (length: 5) - │ │ ├── @ StringNode (location: (82,0)-(83,0)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (82,0)-(83,0) = " a\n" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "a\n" - │ │ ├── @ StringNode (location: (83,0)-(84,0)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (83,0)-(84,0) = "\n" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "\n" - │ │ ├── @ StringNode (location: (84,0)-(85,0)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (84,0)-(85,0) = "\n" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "\n" - │ │ ├── @ StringNode (location: (85,0)-(86,0)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (85,0)-(86,0) = "\n" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "\n" - │ │ └── @ StringNode (location: (86,0)-(87,0)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (86,0)-(87,0) = " b\n" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "b\n" - │ └── closing_loc: (87,0)-(88,0) = "EOF\n" - ├── @ InterpolatedStringNode (location: (89,0)-(89,6)) - │ ├── flags: newline - │ ├── opening_loc: (89,0)-(89,6) = "<<~EOF" - │ ├── parts: (length: 3) - │ │ ├── @ StringNode (location: (90,0)-(91,0)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (90,0)-(91,0) = "\n" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "\n" - │ │ ├── @ EmbeddedStatementsNode (location: (91,2)-(91,6)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (91,2)-(91,4) = "\#{" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (91,4)-(91,5)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ IntegerNode (location: (91,4)-(91,5)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ └── closing_loc: (91,5)-(91,6) = "}" - │ │ └── @ StringNode (location: (91,6)-(92,0)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (91,6)-(92,0) = "a\n" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "a\n" - │ └── closing_loc: (92,0)-(93,0) = " EOF\n" - └── @ InterpolatedStringNode (location: (94,0)-(94,6)) - ├── flags: newline - ├── opening_loc: (94,0)-(94,6) = "<<~EOT" - ├── parts: (length: 3) - │ ├── @ EmbeddedStatementsNode (location: (95,2)-(95,6)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (95,2)-(95,4) = "\#{" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (95,4)-(95,5)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ IntegerNode (location: (95,4)-(95,5)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── closing_loc: (95,5)-(95,6) = "}" - │ ├── @ StringNode (location: (95,6)-(96,0)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (95,6)-(96,0) = "\n" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "\n" - │ └── @ StringNode (location: (96,0)-(97,0)) - │ ├── flags: static_literal, frozen - │ ├── opening_loc: ∅ - │ ├── content_loc: (96,0)-(97,0) = "\tb\n" - │ ├── closing_loc: ∅ - │ └── unescaped: "\tb\n" - └── closing_loc: (97,0)-(98,0) = "EOT\n" diff --git a/test/prism/snapshots/undef.txt b/test/prism/snapshots/undef.txt deleted file mode 100644 index 7491fc4c953659..00000000000000 --- a/test/prism/snapshots/undef.txt +++ /dev/null @@ -1,131 +0,0 @@ -@ ProgramNode (location: (1,0)-(17,14)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(17,14)) - ├── flags: ∅ - └── body: (length: 9) - ├── @ UndefNode (location: (1,0)-(1,7)) - │ ├── flags: newline - │ ├── names: (length: 1) - │ │ └── @ SymbolNode (location: (1,6)-(1,7)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: ∅ - │ │ ├── value_loc: (1,6)-(1,7) = "a" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "a" - │ └── keyword_loc: (1,0)-(1,5) = "undef" - ├── @ UndefNode (location: (3,0)-(3,10)) - │ ├── flags: newline - │ ├── names: (length: 2) - │ │ ├── @ SymbolNode (location: (3,6)-(3,7)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (3,6)-(3,7) = "a" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "a" - │ │ └── @ SymbolNode (location: (3,9)-(3,10)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: ∅ - │ │ ├── value_loc: (3,9)-(3,10) = "b" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "b" - │ └── keyword_loc: (3,0)-(3,5) = "undef" - ├── @ UndefNode (location: (5,0)-(5,8)) - │ ├── flags: newline - │ ├── names: (length: 1) - │ │ └── @ SymbolNode (location: (5,6)-(5,8)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: ∅ - │ │ ├── value_loc: (5,6)-(5,8) = "if" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "if" - │ └── keyword_loc: (5,0)-(5,5) = "undef" - ├── @ UndefNode (location: (7,0)-(7,9)) - │ ├── flags: newline - │ ├── names: (length: 1) - │ │ └── @ SymbolNode (location: (7,6)-(7,9)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: ∅ - │ │ ├── value_loc: (7,6)-(7,9) = "<=>" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "<=>" - │ └── keyword_loc: (7,0)-(7,5) = "undef" - ├── @ UndefNode (location: (9,0)-(9,8)) - │ ├── flags: newline - │ ├── names: (length: 1) - │ │ └── @ SymbolNode (location: (9,6)-(9,8)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (9,6)-(9,7) = ":" - │ │ ├── value_loc: (9,7)-(9,8) = "a" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "a" - │ └── keyword_loc: (9,0)-(9,5) = "undef" - ├── @ UndefNode (location: (11,0)-(11,16)) - │ ├── flags: newline - │ ├── names: (length: 3) - │ │ ├── @ SymbolNode (location: (11,6)-(11,8)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (11,6)-(11,7) = ":" - │ │ │ ├── value_loc: (11,7)-(11,8) = "a" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "a" - │ │ ├── @ SymbolNode (location: (11,10)-(11,12)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (11,10)-(11,11) = ":" - │ │ │ ├── value_loc: (11,11)-(11,12) = "b" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "b" - │ │ └── @ SymbolNode (location: (11,14)-(11,16)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (11,14)-(11,15) = ":" - │ │ ├── value_loc: (11,15)-(11,16) = "c" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "c" - │ └── keyword_loc: (11,0)-(11,5) = "undef" - ├── @ UndefNode (location: (13,0)-(13,12)) - │ ├── flags: newline - │ ├── names: (length: 1) - │ │ └── @ SymbolNode (location: (13,6)-(13,12)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (13,6)-(13,8) = ":'" - │ │ ├── value_loc: (13,8)-(13,11) = "abc" - │ │ ├── closing_loc: (13,11)-(13,12) = "'" - │ │ └── unescaped: "abc" - │ └── keyword_loc: (13,0)-(13,5) = "undef" - ├── @ UndefNode (location: (15,0)-(15,16)) - │ ├── flags: newline - │ ├── names: (length: 1) - │ │ └── @ InterpolatedSymbolNode (location: (15,6)-(15,16)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (15,6)-(15,8) = ":\"" - │ │ ├── parts: (length: 2) - │ │ │ ├── @ StringNode (location: (15,8)-(15,11)) - │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── content_loc: (15,8)-(15,11) = "abc" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "abc" - │ │ │ └── @ EmbeddedStatementsNode (location: (15,11)-(15,15)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (15,11)-(15,13) = "\#{" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (15,13)-(15,14)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ IntegerNode (location: (15,13)-(15,14)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ └── closing_loc: (15,14)-(15,15) = "}" - │ │ └── closing_loc: (15,15)-(15,16) = "\"" - │ └── keyword_loc: (15,0)-(15,5) = "undef" - └── @ UndefNode (location: (17,0)-(17,14)) - ├── flags: newline - ├── names: (length: 1) - │ └── @ SymbolNode (location: (17,6)-(17,14)) - │ ├── flags: static_literal, forced_us_ascii_encoding - │ ├── opening_loc: ∅ - │ ├── value_loc: (17,6)-(17,14) = "Constant" - │ ├── closing_loc: ∅ - │ └── unescaped: "Constant" - └── keyword_loc: (17,0)-(17,5) = "undef" diff --git a/test/prism/snapshots/unescaping.txt b/test/prism/snapshots/unescaping.txt deleted file mode 100644 index 822fbe7d8f2936..00000000000000 --- a/test/prism/snapshots/unescaping.txt +++ /dev/null @@ -1,36 +0,0 @@ -@ ProgramNode (location: (1,0)-(7,7)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(7,7)) - ├── flags: ∅ - └── body: (length: 4) - ├── @ ArrayNode (location: (1,0)-(1,10)) - │ ├── flags: newline - │ ├── elements: (length: 1) - │ │ └── @ StringNode (location: (1,1)-(1,9)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (1,1)-(1,2) = "\"" - │ │ ├── content_loc: (1,2)-(1,8) = "\\c\#{1}" - │ │ ├── closing_loc: (1,8)-(1,9) = "\"" - │ │ └── unescaped: "\u0003{1}" - │ ├── opening_loc: (1,0)-(1,1) = "[" - │ └── closing_loc: (1,9)-(1,10) = "]" - ├── @ RegularExpressionNode (location: (3,0)-(3,8)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (3,0)-(3,1) = "/" - │ ├── content_loc: (3,1)-(3,7) = "\\c\#{1}" - │ ├── closing_loc: (3,7)-(3,8) = "/" - │ └── unescaped: "\\x03{1}" - ├── @ StringNode (location: (5,0)-(5,8)) - │ ├── flags: newline - │ ├── opening_loc: (5,0)-(5,1) = "\"" - │ ├── content_loc: (5,1)-(5,7) = "\\c\#{1}" - │ ├── closing_loc: (5,7)-(5,8) = "\"" - │ └── unescaped: "\u0003{1}" - └── @ StringNode (location: (7,0)-(7,7)) - ├── flags: newline - ├── opening_loc: (7,0)-(7,7) = "<<~HERE" - ├── content_loc: (8,0)-(9,0) = " \\c\#{1}\n" - ├── closing_loc: (9,0)-(10,0) = "HERE\n" - └── unescaped: "\u0003{1}\n" diff --git a/test/prism/snapshots/unless.txt b/test/prism/snapshots/unless.txt deleted file mode 100644 index 9e62b0c0a96999..00000000000000 --- a/test/prism/snapshots/unless.txt +++ /dev/null @@ -1,203 +0,0 @@ -@ ProgramNode (location: (1,0)-(14,22)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(14,22)) - ├── flags: ∅ - └── body: (length: 7) - ├── @ UnlessNode (location: (1,0)-(1,19)) - │ ├── flags: newline - │ ├── keyword_loc: (1,0)-(1,6) = "unless" - │ ├── predicate: - │ │ @ TrueNode (location: (1,7)-(1,11)) - │ │ └── flags: static_literal - │ ├── then_keyword_loc: ∅ - │ ├── statements: - │ │ @ StatementsNode (location: (1,13)-(1,14)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ IntegerNode (location: (1,13)-(1,14)) - │ │ ├── flags: newline, static_literal, decimal - │ │ └── value: 1 - │ ├── else_clause: ∅ - │ └── end_keyword_loc: (1,16)-(1,19) = "end" - ├── @ UnlessNode (location: (3,0)-(4,12)) - │ ├── flags: newline - │ ├── keyword_loc: (3,0)-(3,6) = "unless" - │ ├── predicate: - │ │ @ TrueNode (location: (3,7)-(3,11)) - │ │ └── flags: static_literal - │ ├── then_keyword_loc: ∅ - │ ├── statements: - │ │ @ StatementsNode (location: (4,0)-(4,1)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ IntegerNode (location: (4,0)-(4,1)) - │ │ ├── flags: newline, static_literal, decimal - │ │ └── value: 1 - │ ├── else_clause: - │ │ @ ElseNode (location: (4,2)-(4,12)) - │ │ ├── flags: ∅ - │ │ ├── else_keyword_loc: (4,2)-(4,6) = "else" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (4,7)-(4,8)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ IntegerNode (location: (4,7)-(4,8)) - │ │ │ ├── flags: newline, static_literal, decimal - │ │ │ └── value: 2 - │ │ └── end_keyword_loc: (4,9)-(4,12) = "end" - │ └── end_keyword_loc: (4,9)-(4,12) = "end" - ├── @ UnlessNode (location: (6,0)-(6,13)) - │ ├── flags: newline - │ ├── keyword_loc: (6,2)-(6,8) = "unless" - │ ├── predicate: - │ │ @ TrueNode (location: (6,9)-(6,13)) - │ │ └── flags: static_literal - │ ├── then_keyword_loc: ∅ - │ ├── statements: - │ │ @ StatementsNode (location: (6,0)-(6,1)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ IntegerNode (location: (6,0)-(6,1)) - │ │ ├── flags: newline, static_literal, decimal - │ │ └── value: 1 - │ ├── else_clause: ∅ - │ └── end_keyword_loc: ∅ - ├── @ CallNode (location: (8,0)-(8,25)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :tap - │ ├── message_loc: (8,0)-(8,3) = "tap" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (8,4)-(8,25)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (8,6)-(8,23)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ UnlessNode (location: (8,6)-(8,23)) - │ │ ├── flags: newline - │ │ ├── keyword_loc: (8,12)-(8,18) = "unless" - │ │ ├── predicate: - │ │ │ @ TrueNode (location: (8,19)-(8,23)) - │ │ │ └── flags: static_literal - │ │ ├── then_keyword_loc: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (8,6)-(8,11)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ BreakNode (location: (8,6)-(8,11)) - │ │ │ ├── flags: newline - │ │ │ ├── arguments: ∅ - │ │ │ └── keyword_loc: (8,6)-(8,11) = "break" - │ │ ├── else_clause: ∅ - │ │ └── end_keyword_loc: ∅ - │ ├── opening_loc: (8,4)-(8,5) = "{" - │ └── closing_loc: (8,24)-(8,25) = "}" - ├── @ CallNode (location: (10,0)-(10,24)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :tap - │ ├── message_loc: (10,0)-(10,3) = "tap" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (10,4)-(10,24)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (10,6)-(10,22)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ UnlessNode (location: (10,6)-(10,22)) - │ │ ├── flags: newline - │ │ ├── keyword_loc: (10,11)-(10,17) = "unless" - │ │ ├── predicate: - │ │ │ @ TrueNode (location: (10,18)-(10,22)) - │ │ │ └── flags: static_literal - │ │ ├── then_keyword_loc: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (10,6)-(10,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ NextNode (location: (10,6)-(10,10)) - │ │ │ ├── flags: newline - │ │ │ ├── arguments: ∅ - │ │ │ └── keyword_loc: (10,6)-(10,10) = "next" - │ │ ├── else_clause: ∅ - │ │ └── end_keyword_loc: ∅ - │ ├── opening_loc: (10,4)-(10,5) = "{" - │ └── closing_loc: (10,23)-(10,24) = "}" - ├── @ UnlessNode (location: (12,0)-(12,18)) - │ ├── flags: newline - │ ├── keyword_loc: (12,7)-(12,13) = "unless" - │ ├── predicate: - │ │ @ TrueNode (location: (12,14)-(12,18)) - │ │ └── flags: static_literal - │ ├── then_keyword_loc: ∅ - │ ├── statements: - │ │ @ StatementsNode (location: (12,0)-(12,6)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ ReturnNode (location: (12,0)-(12,6)) - │ │ ├── flags: newline - │ │ ├── keyword_loc: (12,0)-(12,6) = "return" - │ │ └── arguments: ∅ - │ ├── else_clause: ∅ - │ └── end_keyword_loc: ∅ - └── @ UnlessNode (location: (14,0)-(14,22)) - ├── flags: newline - ├── keyword_loc: (14,11)-(14,17) = "unless" - ├── predicate: - │ @ CallNode (location: (14,18)-(14,22)) - │ ├── flags: ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :bar? - │ ├── message_loc: (14,18)-(14,22) = "bar?" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── then_keyword_loc: ∅ - ├── statements: - │ @ StatementsNode (location: (14,0)-(14,10)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (14,0)-(14,10)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (14,0)-(14,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (14,4)-(14,10)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ SymbolNode (location: (14,4)-(14,6)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (14,4)-(14,5) = ":" - │ │ │ ├── value_loc: (14,5)-(14,6) = "a" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "a" - │ │ └── @ SymbolNode (location: (14,8)-(14,10)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (14,8)-(14,9) = ":" - │ │ ├── value_loc: (14,9)-(14,10) = "b" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "b" - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── else_clause: ∅ - └── end_keyword_loc: ∅ diff --git a/test/prism/snapshots/unparser/corpus/literal/alias.txt b/test/prism/snapshots/unparser/corpus/literal/alias.txt deleted file mode 100644 index 6ce892b54d0943..00000000000000 --- a/test/prism/snapshots/unparser/corpus/literal/alias.txt +++ /dev/null @@ -1,35 +0,0 @@ -@ ProgramNode (location: (1,0)-(2,15)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(2,15)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ AliasGlobalVariableNode (location: (1,0)-(1,15)) - │ ├── flags: newline - │ ├── new_name: - │ │ @ GlobalVariableReadNode (location: (1,6)-(1,10)) - │ │ ├── flags: ∅ - │ │ └── name: :$foo - │ ├── old_name: - │ │ @ GlobalVariableReadNode (location: (1,11)-(1,15)) - │ │ ├── flags: ∅ - │ │ └── name: :$bar - │ └── keyword_loc: (1,0)-(1,5) = "alias" - └── @ AliasMethodNode (location: (2,0)-(2,15)) - ├── flags: newline - ├── new_name: - │ @ SymbolNode (location: (2,6)-(2,10)) - │ ├── flags: static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (2,6)-(2,7) = ":" - │ ├── value_loc: (2,7)-(2,10) = "foo" - │ ├── closing_loc: ∅ - │ └── unescaped: "foo" - ├── old_name: - │ @ SymbolNode (location: (2,11)-(2,15)) - │ ├── flags: static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (2,11)-(2,12) = ":" - │ ├── value_loc: (2,12)-(2,15) = "bar" - │ ├── closing_loc: ∅ - │ └── unescaped: "bar" - └── keyword_loc: (2,0)-(2,5) = "alias" diff --git a/test/prism/snapshots/unparser/corpus/literal/assignment.txt b/test/prism/snapshots/unparser/corpus/literal/assignment.txt deleted file mode 100644 index 4e4ed86e7b6b69..00000000000000 --- a/test/prism/snapshots/unparser/corpus/literal/assignment.txt +++ /dev/null @@ -1,1181 +0,0 @@ -@ ProgramNode (location: (1,0)-(51,17)) -├── flags: ∅ -├── locals: [:a, :b, :foo, :c, :x] -└── statements: - @ StatementsNode (location: (1,0)-(51,17)) - ├── flags: ∅ - └── body: (length: 43) - ├── @ GlobalVariableWriteNode (location: (1,0)-(1,6)) - │ ├── flags: newline - │ ├── name: :$a - │ ├── name_loc: (1,0)-(1,2) = "$a" - │ ├── value: - │ │ @ IntegerNode (location: (1,5)-(1,6)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ └── operator_loc: (1,3)-(1,4) = "=" - ├── @ MultiWriteNode (location: (2,0)-(2,17)) - │ ├── flags: newline - │ ├── lefts: (length: 2) - │ │ ├── @ GlobalVariableTargetNode (location: (2,1)-(2,3)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :$a - │ │ └── @ GlobalVariableTargetNode (location: (2,5)-(2,7)) - │ │ ├── flags: ∅ - │ │ └── name: :$b - │ ├── rest: ∅ - │ ├── rights: (length: 0) - │ ├── lparen_loc: (2,0)-(2,1) = "(" - │ ├── rparen_loc: (2,7)-(2,8) = ")" - │ ├── operator_loc: (2,9)-(2,10) = "=" - │ └── value: - │ @ ArrayNode (location: (2,11)-(2,17)) - │ ├── flags: static_literal - │ ├── elements: (length: 2) - │ │ ├── @ IntegerNode (location: (2,12)-(2,13)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── @ IntegerNode (location: (2,15)-(2,16)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── opening_loc: (2,11)-(2,12) = "[" - │ └── closing_loc: (2,16)-(2,17) = "]" - ├── @ MultiWriteNode (location: (3,0)-(3,13)) - │ ├── flags: newline - │ ├── lefts: (length: 2) - │ │ ├── @ MultiTargetNode (location: (3,1)-(3,5)) - │ │ │ ├── flags: ∅ - │ │ │ ├── lefts: (length: 1) - │ │ │ │ └── @ LocalVariableTargetNode (location: (3,2)-(3,3)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :a - │ │ │ │ └── depth: 0 - │ │ │ ├── rest: - │ │ │ │ @ ImplicitRestNode (location: (3,3)-(3,4)) - │ │ │ │ └── flags: ∅ - │ │ │ ├── rights: (length: 0) - │ │ │ ├── lparen_loc: (3,1)-(3,2) = "(" - │ │ │ └── rparen_loc: (3,4)-(3,5) = ")" - │ │ └── @ LocalVariableTargetNode (location: (3,7)-(3,8)) - │ │ ├── flags: ∅ - │ │ ├── name: :b - │ │ └── depth: 0 - │ ├── rest: ∅ - │ ├── rights: (length: 0) - │ ├── lparen_loc: (3,0)-(3,1) = "(" - │ ├── rparen_loc: (3,8)-(3,9) = ")" - │ ├── operator_loc: (3,10)-(3,11) = "=" - │ └── value: - │ @ IntegerNode (location: (3,12)-(3,13)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── @ MultiWriteNode (location: (4,0)-(4,9)) - │ ├── flags: newline - │ ├── lefts: (length: 0) - │ ├── rest: - │ │ @ SplatNode (location: (4,1)-(4,3)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (4,1)-(4,2) = "*" - │ │ └── expression: - │ │ @ LocalVariableTargetNode (location: (4,2)-(4,3)) - │ │ ├── flags: ∅ - │ │ ├── name: :a - │ │ └── depth: 0 - │ ├── rights: (length: 0) - │ ├── lparen_loc: (4,0)-(4,1) = "(" - │ ├── rparen_loc: (4,3)-(4,4) = ")" - │ ├── operator_loc: (4,5)-(4,6) = "=" - │ └── value: - │ @ ArrayNode (location: (4,7)-(4,9)) - │ ├── flags: static_literal - │ ├── elements: (length: 0) - │ ├── opening_loc: (4,7)-(4,8) = "[" - │ └── closing_loc: (4,8)-(4,9) = "]" - ├── @ MultiWriteNode (location: (5,0)-(5,15)) - │ ├── flags: newline - │ ├── lefts: (length: 0) - │ ├── rest: - │ │ @ SplatNode (location: (5,1)-(5,5)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (5,1)-(5,2) = "*" - │ │ └── expression: - │ │ @ LocalVariableTargetNode (location: (5,2)-(5,5)) - │ │ ├── flags: ∅ - │ │ ├── name: :foo - │ │ └── depth: 0 - │ ├── rights: (length: 0) - │ ├── lparen_loc: (5,0)-(5,1) = "(" - │ ├── rparen_loc: (5,5)-(5,6) = ")" - │ ├── operator_loc: (5,7)-(5,8) = "=" - │ └── value: - │ @ ArrayNode (location: (5,9)-(5,15)) - │ ├── flags: static_literal - │ ├── elements: (length: 2) - │ │ ├── @ IntegerNode (location: (5,10)-(5,11)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── @ IntegerNode (location: (5,13)-(5,14)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── opening_loc: (5,9)-(5,10) = "[" - │ └── closing_loc: (5,14)-(5,15) = "]" - ├── @ MultiWriteNode (location: (6,0)-(6,19)) - │ ├── flags: newline - │ ├── lefts: (length: 2) - │ │ ├── @ ClassVariableTargetNode (location: (6,1)-(6,4)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :@@a - │ │ └── @ ClassVariableTargetNode (location: (6,6)-(6,9)) - │ │ ├── flags: ∅ - │ │ └── name: :@@b - │ ├── rest: ∅ - │ ├── rights: (length: 0) - │ ├── lparen_loc: (6,0)-(6,1) = "(" - │ ├── rparen_loc: (6,9)-(6,10) = ")" - │ ├── operator_loc: (6,11)-(6,12) = "=" - │ └── value: - │ @ ArrayNode (location: (6,13)-(6,19)) - │ ├── flags: static_literal - │ ├── elements: (length: 2) - │ │ ├── @ IntegerNode (location: (6,14)-(6,15)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── @ IntegerNode (location: (6,17)-(6,18)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── opening_loc: (6,13)-(6,14) = "[" - │ └── closing_loc: (6,18)-(6,19) = "]" - ├── @ MultiWriteNode (location: (7,0)-(7,17)) - │ ├── flags: newline - │ ├── lefts: (length: 2) - │ │ ├── @ InstanceVariableTargetNode (location: (7,1)-(7,3)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :@a - │ │ └── @ InstanceVariableTargetNode (location: (7,5)-(7,7)) - │ │ ├── flags: ∅ - │ │ └── name: :@b - │ ├── rest: ∅ - │ ├── rights: (length: 0) - │ ├── lparen_loc: (7,0)-(7,1) = "(" - │ ├── rparen_loc: (7,7)-(7,8) = ")" - │ ├── operator_loc: (7,9)-(7,10) = "=" - │ └── value: - │ @ ArrayNode (location: (7,11)-(7,17)) - │ ├── flags: static_literal - │ ├── elements: (length: 2) - │ │ ├── @ IntegerNode (location: (7,12)-(7,13)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── @ IntegerNode (location: (7,15)-(7,16)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── opening_loc: (7,11)-(7,12) = "[" - │ └── closing_loc: (7,16)-(7,17) = "]" - ├── @ MultiWriteNode (location: (8,0)-(8,25)) - │ ├── flags: newline - │ ├── lefts: (length: 2) - │ │ ├── @ LocalVariableTargetNode (location: (8,1)-(8,2)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :a - │ │ │ └── depth: 0 - │ │ └── @ MultiTargetNode (location: (8,4)-(8,10)) - │ │ ├── flags: ∅ - │ │ ├── lefts: (length: 2) - │ │ │ ├── @ LocalVariableTargetNode (location: (8,5)-(8,6)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :b - │ │ │ │ └── depth: 0 - │ │ │ └── @ LocalVariableTargetNode (location: (8,8)-(8,9)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :c - │ │ │ └── depth: 0 - │ │ ├── rest: ∅ - │ │ ├── rights: (length: 0) - │ │ ├── lparen_loc: (8,4)-(8,5) = "(" - │ │ └── rparen_loc: (8,9)-(8,10) = ")" - │ ├── rest: ∅ - │ ├── rights: (length: 0) - │ ├── lparen_loc: (8,0)-(8,1) = "(" - │ ├── rparen_loc: (8,10)-(8,11) = ")" - │ ├── operator_loc: (8,12)-(8,13) = "=" - │ └── value: - │ @ ArrayNode (location: (8,14)-(8,25)) - │ ├── flags: ∅ - │ ├── elements: (length: 2) - │ │ ├── @ IntegerNode (location: (8,15)-(8,16)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── @ ArrayNode (location: (8,18)-(8,24)) - │ │ ├── flags: static_literal - │ │ ├── elements: (length: 2) - │ │ │ ├── @ IntegerNode (location: (8,19)-(8,20)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 2 - │ │ │ └── @ IntegerNode (location: (8,22)-(8,23)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 3 - │ │ ├── opening_loc: (8,18)-(8,19) = "[" - │ │ └── closing_loc: (8,23)-(8,24) = "]" - │ ├── opening_loc: (8,14)-(8,15) = "[" - │ └── closing_loc: (8,24)-(8,25) = "]" - ├── @ MultiWriteNode (location: (9,0)-(9,15)) - │ ├── flags: newline - │ ├── lefts: (length: 1) - │ │ └── @ LocalVariableTargetNode (location: (9,1)-(9,2)) - │ │ ├── flags: ∅ - │ │ ├── name: :a - │ │ └── depth: 0 - │ ├── rest: - │ │ @ SplatNode (location: (9,4)-(9,5)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (9,4)-(9,5) = "*" - │ │ └── expression: ∅ - │ ├── rights: (length: 0) - │ ├── lparen_loc: (9,0)-(9,1) = "(" - │ ├── rparen_loc: (9,5)-(9,6) = ")" - │ ├── operator_loc: (9,7)-(9,8) = "=" - │ └── value: - │ @ ArrayNode (location: (9,9)-(9,15)) - │ ├── flags: static_literal - │ ├── elements: (length: 2) - │ │ ├── @ IntegerNode (location: (9,10)-(9,11)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── @ IntegerNode (location: (9,13)-(9,14)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── opening_loc: (9,9)-(9,10) = "[" - │ └── closing_loc: (9,14)-(9,15) = "]" - ├── @ MultiWriteNode (location: (10,0)-(10,18)) - │ ├── flags: newline - │ ├── lefts: (length: 1) - │ │ └── @ LocalVariableTargetNode (location: (10,1)-(10,2)) - │ │ ├── flags: ∅ - │ │ ├── name: :a - │ │ └── depth: 0 - │ ├── rest: - │ │ @ SplatNode (location: (10,4)-(10,8)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (10,4)-(10,5) = "*" - │ │ └── expression: - │ │ @ LocalVariableTargetNode (location: (10,5)-(10,8)) - │ │ ├── flags: ∅ - │ │ ├── name: :foo - │ │ └── depth: 0 - │ ├── rights: (length: 0) - │ ├── lparen_loc: (10,0)-(10,1) = "(" - │ ├── rparen_loc: (10,8)-(10,9) = ")" - │ ├── operator_loc: (10,10)-(10,11) = "=" - │ └── value: - │ @ ArrayNode (location: (10,12)-(10,18)) - │ ├── flags: static_literal - │ ├── elements: (length: 2) - │ │ ├── @ IntegerNode (location: (10,13)-(10,14)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── @ IntegerNode (location: (10,16)-(10,17)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── opening_loc: (10,12)-(10,13) = "[" - │ └── closing_loc: (10,17)-(10,18) = "]" - ├── @ MultiWriteNode (location: (11,0)-(11,15)) - │ ├── flags: newline - │ ├── lefts: (length: 2) - │ │ ├── @ LocalVariableTargetNode (location: (11,1)-(11,2)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :a - │ │ │ └── depth: 0 - │ │ └── @ LocalVariableTargetNode (location: (11,4)-(11,5)) - │ │ ├── flags: ∅ - │ │ ├── name: :b - │ │ └── depth: 0 - │ ├── rest: ∅ - │ ├── rights: (length: 0) - │ ├── lparen_loc: (11,0)-(11,1) = "(" - │ ├── rparen_loc: (11,5)-(11,6) = ")" - │ ├── operator_loc: (11,7)-(11,8) = "=" - │ └── value: - │ @ ArrayNode (location: (11,9)-(11,15)) - │ ├── flags: static_literal - │ ├── elements: (length: 2) - │ │ ├── @ IntegerNode (location: (11,10)-(11,11)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── @ IntegerNode (location: (11,13)-(11,14)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── opening_loc: (11,9)-(11,10) = "[" - │ └── closing_loc: (11,14)-(11,15) = "]" - ├── @ MultiWriteNode (location: (12,0)-(12,12)) - │ ├── flags: newline - │ ├── lefts: (length: 2) - │ │ ├── @ LocalVariableTargetNode (location: (12,1)-(12,2)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :a - │ │ │ └── depth: 0 - │ │ └── @ LocalVariableTargetNode (location: (12,4)-(12,5)) - │ │ ├── flags: ∅ - │ │ ├── name: :b - │ │ └── depth: 0 - │ ├── rest: ∅ - │ ├── rights: (length: 0) - │ ├── lparen_loc: (12,0)-(12,1) = "(" - │ ├── rparen_loc: (12,5)-(12,6) = ")" - │ ├── operator_loc: (12,7)-(12,8) = "=" - │ └── value: - │ @ LocalVariableReadNode (location: (12,9)-(12,12)) - │ ├── flags: ∅ - │ ├── name: :foo - │ └── depth: 0 - ├── @ MultiWriteNode (location: (13,0)-(13,10)) - │ ├── flags: newline - │ ├── lefts: (length: 1) - │ │ └── @ LocalVariableTargetNode (location: (13,1)-(13,2)) - │ │ ├── flags: ∅ - │ │ ├── name: :a - │ │ └── depth: 0 - │ ├── rest: - │ │ @ ImplicitRestNode (location: (13,2)-(13,3)) - │ │ └── flags: ∅ - │ ├── rights: (length: 0) - │ ├── lparen_loc: (13,0)-(13,1) = "(" - │ ├── rparen_loc: (13,3)-(13,4) = ")" - │ ├── operator_loc: (13,5)-(13,6) = "=" - │ └── value: - │ @ LocalVariableReadNode (location: (13,7)-(13,10)) - │ ├── flags: ∅ - │ ├── name: :foo - │ └── depth: 0 - ├── @ MultiWriteNode (location: (14,0)-(14,23)) - │ ├── flags: newline - │ ├── lefts: (length: 2) - │ │ ├── @ CallTargetNode (location: (14,1)-(14,6)) - │ │ │ ├── flags: ∅ - │ │ │ ├── receiver: - │ │ │ │ @ LocalVariableReadNode (location: (14,1)-(14,2)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :a - │ │ │ │ └── depth: 0 - │ │ │ ├── call_operator_loc: (14,2)-(14,3) = "." - │ │ │ ├── name: :foo= - │ │ │ └── message_loc: (14,3)-(14,6) = "foo" - │ │ └── @ CallTargetNode (location: (14,8)-(14,13)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ LocalVariableReadNode (location: (14,8)-(14,9)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :a - │ │ │ └── depth: 0 - │ │ ├── call_operator_loc: (14,9)-(14,10) = "." - │ │ ├── name: :bar= - │ │ └── message_loc: (14,10)-(14,13) = "bar" - │ ├── rest: ∅ - │ ├── rights: (length: 0) - │ ├── lparen_loc: (14,0)-(14,1) = "(" - │ ├── rparen_loc: (14,13)-(14,14) = ")" - │ ├── operator_loc: (14,15)-(14,16) = "=" - │ └── value: - │ @ ArrayNode (location: (14,17)-(14,23)) - │ ├── flags: static_literal - │ ├── elements: (length: 2) - │ │ ├── @ IntegerNode (location: (14,18)-(14,19)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── @ IntegerNode (location: (14,21)-(14,22)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── opening_loc: (14,17)-(14,18) = "[" - │ └── closing_loc: (14,22)-(14,23) = "]" - ├── @ MultiWriteNode (location: (15,0)-(15,24)) - │ ├── flags: newline - │ ├── lefts: (length: 2) - │ │ ├── @ IndexTargetNode (location: (15,1)-(15,8)) - │ │ │ ├── flags: attribute_write - │ │ │ ├── receiver: - │ │ │ │ @ LocalVariableReadNode (location: (15,1)-(15,2)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :a - │ │ │ │ └── depth: 0 - │ │ │ ├── opening_loc: (15,2)-(15,3) = "[" - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (15,3)-(15,7)) - │ │ │ │ ├── flags: contains_splat - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ SplatNode (location: (15,3)-(15,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── operator_loc: (15,3)-(15,4) = "*" - │ │ │ │ └── expression: - │ │ │ │ @ LocalVariableReadNode (location: (15,4)-(15,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :foo - │ │ │ │ └── depth: 0 - │ │ │ ├── closing_loc: (15,7)-(15,8) = "]" - │ │ │ └── block: ∅ - │ │ └── @ IndexTargetNode (location: (15,10)-(15,14)) - │ │ ├── flags: attribute_write - │ │ ├── receiver: - │ │ │ @ LocalVariableReadNode (location: (15,10)-(15,11)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :a - │ │ │ └── depth: 0 - │ │ ├── opening_loc: (15,11)-(15,12) = "[" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (15,12)-(15,13)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (15,12)-(15,13)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── closing_loc: (15,13)-(15,14) = "]" - │ │ └── block: ∅ - │ ├── rest: ∅ - │ ├── rights: (length: 0) - │ ├── lparen_loc: (15,0)-(15,1) = "(" - │ ├── rparen_loc: (15,14)-(15,15) = ")" - │ ├── operator_loc: (15,16)-(15,17) = "=" - │ └── value: - │ @ ArrayNode (location: (15,18)-(15,24)) - │ ├── flags: static_literal - │ ├── elements: (length: 2) - │ │ ├── @ IntegerNode (location: (15,19)-(15,20)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── @ IntegerNode (location: (15,22)-(15,23)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── opening_loc: (15,18)-(15,19) = "[" - │ └── closing_loc: (15,23)-(15,24) = "]" - ├── @ MultiWriteNode (location: (16,0)-(16,21)) - │ ├── flags: newline - │ ├── lefts: (length: 2) - │ │ ├── @ IndexTargetNode (location: (16,1)-(16,5)) - │ │ │ ├── flags: attribute_write - │ │ │ ├── receiver: - │ │ │ │ @ LocalVariableReadNode (location: (16,1)-(16,2)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :a - │ │ │ │ └── depth: 0 - │ │ │ ├── opening_loc: (16,2)-(16,3) = "[" - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (16,3)-(16,4)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ IntegerNode (location: (16,3)-(16,4)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 0 - │ │ │ ├── closing_loc: (16,4)-(16,5) = "]" - │ │ │ └── block: ∅ - │ │ └── @ IndexTargetNode (location: (16,7)-(16,11)) - │ │ ├── flags: attribute_write - │ │ ├── receiver: - │ │ │ @ LocalVariableReadNode (location: (16,7)-(16,8)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :a - │ │ │ └── depth: 0 - │ │ ├── opening_loc: (16,8)-(16,9) = "[" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (16,9)-(16,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (16,9)-(16,10)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── closing_loc: (16,10)-(16,11) = "]" - │ │ └── block: ∅ - │ ├── rest: ∅ - │ ├── rights: (length: 0) - │ ├── lparen_loc: (16,0)-(16,1) = "(" - │ ├── rparen_loc: (16,11)-(16,12) = ")" - │ ├── operator_loc: (16,13)-(16,14) = "=" - │ └── value: - │ @ ArrayNode (location: (16,15)-(16,21)) - │ ├── flags: static_literal - │ ├── elements: (length: 2) - │ │ ├── @ IntegerNode (location: (16,16)-(16,17)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── @ IntegerNode (location: (16,19)-(16,20)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── opening_loc: (16,15)-(16,16) = "[" - │ └── closing_loc: (16,20)-(16,21) = "]" - ├── @ MultiWriteNode (location: (17,0)-(17,12)) - │ ├── flags: newline - │ ├── lefts: (length: 0) - │ ├── rest: - │ │ @ SplatNode (location: (17,1)-(17,7)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (17,1)-(17,2) = "*" - │ │ └── expression: - │ │ @ CallTargetNode (location: (17,2)-(17,7)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ LocalVariableReadNode (location: (17,2)-(17,3)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :c - │ │ │ └── depth: 0 - │ │ ├── call_operator_loc: (17,3)-(17,4) = "." - │ │ ├── name: :foo= - │ │ └── message_loc: (17,4)-(17,7) = "foo" - │ ├── rights: (length: 0) - │ ├── lparen_loc: (17,0)-(17,1) = "(" - │ ├── rparen_loc: (17,7)-(17,8) = ")" - │ ├── operator_loc: (17,9)-(17,10) = "=" - │ └── value: - │ @ IntegerNode (location: (17,11)-(17,12)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── @ ConstantPathWriteNode (location: (18,0)-(18,13)) - │ ├── flags: newline - │ ├── target: - │ │ @ ConstantPathNode (location: (18,0)-(18,5)) - │ │ ├── flags: ∅ - │ │ ├── parent: ∅ - │ │ ├── name: :Foo - │ │ ├── delimiter_loc: (18,0)-(18,2) = "::" - │ │ └── name_loc: (18,2)-(18,5) = "Foo" - │ ├── operator_loc: (18,6)-(18,7) = "=" - │ └── value: - │ @ ConstantPathNode (location: (18,8)-(18,13)) - │ ├── flags: ∅ - │ ├── parent: ∅ - │ ├── name: :Bar - │ ├── delimiter_loc: (18,8)-(18,10) = "::" - │ └── name_loc: (18,10)-(18,13) = "Bar" - ├── @ ClassVariableWriteNode (location: (19,0)-(19,7)) - │ ├── flags: newline - │ ├── name: :@@a - │ ├── name_loc: (19,0)-(19,3) = "@@a" - │ ├── value: - │ │ @ IntegerNode (location: (19,6)-(19,7)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ └── operator_loc: (19,4)-(19,5) = "=" - ├── @ InstanceVariableWriteNode (location: (20,0)-(20,6)) - │ ├── flags: newline - │ ├── name: :@a - │ ├── name_loc: (20,0)-(20,2) = "@a" - │ ├── value: - │ │ @ IntegerNode (location: (20,5)-(20,6)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ └── operator_loc: (20,3)-(20,4) = "=" - ├── @ ConstantWriteNode (location: (21,0)-(21,9)) - │ ├── flags: newline - │ ├── name: :CONST - │ ├── name_loc: (21,0)-(21,5) = "CONST" - │ ├── value: - │ │ @ IntegerNode (location: (21,8)-(21,9)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ └── operator_loc: (21,6)-(21,7) = "=" - ├── @ ConstantPathWriteNode (location: (22,0)-(22,23)) - │ ├── flags: newline - │ ├── target: - │ │ @ ConstantPathNode (location: (22,0)-(22,19)) - │ │ ├── flags: ∅ - │ │ ├── parent: - │ │ │ @ ConstantPathNode (location: (22,0)-(22,12)) - │ │ │ ├── flags: ∅ - │ │ │ ├── parent: - │ │ │ │ @ ConstantReadNode (location: (22,0)-(22,4)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :Name - │ │ │ ├── name: :Spaced - │ │ │ ├── delimiter_loc: (22,4)-(22,6) = "::" - │ │ │ └── name_loc: (22,6)-(22,12) = "Spaced" - │ │ ├── name: :CONST - │ │ ├── delimiter_loc: (22,12)-(22,14) = "::" - │ │ └── name_loc: (22,14)-(22,19) = "CONST" - │ ├── operator_loc: (22,20)-(22,21) = "=" - │ └── value: - │ @ IntegerNode (location: (22,22)-(22,23)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── @ LocalVariableWriteNode (location: (23,0)-(23,16)) - │ ├── flags: newline - │ ├── name: :a - │ ├── depth: 0 - │ ├── name_loc: (23,0)-(23,1) = "a" - │ ├── value: - │ │ @ ParenthesesNode (location: (23,4)-(23,16)) - │ │ ├── flags: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (23,5)-(23,15)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ MultiWriteNode (location: (23,5)-(23,15)) - │ │ │ ├── flags: newline - │ │ │ ├── lefts: (length: 2) - │ │ │ │ ├── @ LocalVariableTargetNode (location: (23,6)-(23,7)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── name: :b - │ │ │ │ │ └── depth: 0 - │ │ │ │ └── @ LocalVariableTargetNode (location: (23,9)-(23,10)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :c - │ │ │ │ └── depth: 0 - │ │ │ ├── rest: ∅ - │ │ │ ├── rights: (length: 0) - │ │ │ ├── lparen_loc: (23,5)-(23,6) = "(" - │ │ │ ├── rparen_loc: (23,10)-(23,11) = ")" - │ │ │ ├── operator_loc: (23,12)-(23,13) = "=" - │ │ │ └── value: - │ │ │ @ IntegerNode (location: (23,14)-(23,15)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── opening_loc: (23,4)-(23,5) = "(" - │ │ └── closing_loc: (23,15)-(23,16) = ")" - │ └── operator_loc: (23,2)-(23,3) = "=" - ├── @ LocalVariableWriteNode (location: (24,0)-(24,5)) - │ ├── flags: newline - │ ├── name: :a - │ ├── depth: 0 - │ ├── name_loc: (24,0)-(24,1) = "a" - │ ├── value: - │ │ @ IntegerNode (location: (24,4)-(24,5)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ └── operator_loc: (24,2)-(24,3) = "=" - ├── @ LocalVariableWriteNode (location: (25,0)-(25,11)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── depth: 0 - │ ├── name_loc: (25,0)-(25,3) = "foo" - │ ├── value: - │ │ @ CallNode (location: (25,6)-(25,11)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (25,6)-(25,9) = "foo" - │ │ ├── opening_loc: (25,9)-(25,10) = "(" - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: (25,10)-(25,11) = ")" - │ │ └── block: ∅ - │ └── operator_loc: (25,4)-(25,5) = "=" - ├── @ CallNode (location: (26,0)-(26,9)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (26,0)-(26,3)) - │ │ ├── flags: ∅ - │ │ ├── name: :foo - │ │ └── depth: 0 - │ ├── call_operator_loc: (26,3)-(26,4) = "." - │ ├── name: :[]= - │ ├── message_loc: (26,4)-(26,7) = "[]=" - │ ├── opening_loc: (26,7)-(26,8) = "(" - │ ├── arguments: ∅ - │ ├── closing_loc: (26,8)-(26,9) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (27,0)-(27,13)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (27,0)-(27,3)) - │ │ ├── flags: ∅ - │ │ ├── name: :foo - │ │ └── depth: 0 - │ ├── call_operator_loc: (27,3)-(27,4) = "." - │ ├── name: :[]= - │ ├── message_loc: (27,4)-(27,7) = "[]=" - │ ├── opening_loc: (27,7)-(27,8) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (27,8)-(27,12)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ IntegerNode (location: (27,8)-(27,9)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── @ IntegerNode (location: (27,11)-(27,12)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── closing_loc: (27,12)-(27,13) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (28,0)-(28,11)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (28,0)-(28,3)) - │ │ ├── flags: ∅ - │ │ ├── name: :foo - │ │ └── depth: 0 - │ ├── call_operator_loc: (28,3)-(28,4) = "." - │ ├── name: :[]= - │ ├── message_loc: (28,4)-(28,7) = "[]=" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (28,7)-(28,11)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ TrueNode (location: (28,7)-(28,11)) - │ │ └── flags: static_literal - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (29,0)-(29,19)) - │ ├── flags: newline, attribute_write - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (29,0)-(29,3)) - │ │ ├── flags: ∅ - │ │ ├── name: :foo - │ │ └── depth: 0 - │ ├── call_operator_loc: ∅ - │ ├── name: :[]= - │ ├── message_loc: (29,3)-(29,11) = "[*index]" - │ ├── opening_loc: (29,3)-(29,4) = "[" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (29,4)-(29,19)) - │ │ ├── flags: contains_splat - │ │ └── arguments: (length: 2) - │ │ ├── @ SplatNode (location: (29,4)-(29,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (29,4)-(29,5) = "*" - │ │ │ └── expression: - │ │ │ @ CallNode (location: (29,5)-(29,10)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :index - │ │ │ ├── message_loc: (29,5)-(29,10) = "index" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── @ CallNode (location: (29,14)-(29,19)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :value - │ │ ├── message_loc: (29,14)-(29,19) = "value" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (29,10)-(29,11) = "]" - │ └── block: ∅ - ├── @ CallNode (location: (30,0)-(30,17)) - │ ├── flags: newline, attribute_write - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (30,0)-(30,3)) - │ │ ├── flags: ∅ - │ │ ├── name: :foo - │ │ └── depth: 0 - │ ├── call_operator_loc: ∅ - │ ├── name: :[]= - │ ├── message_loc: (30,3)-(30,9) = "[1..2]" - │ ├── opening_loc: (30,3)-(30,4) = "[" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (30,4)-(30,17)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ RangeNode (location: (30,4)-(30,8)) - │ │ │ ├── flags: static_literal - │ │ │ ├── left: - │ │ │ │ @ IntegerNode (location: (30,4)-(30,5)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ ├── right: - │ │ │ │ @ IntegerNode (location: (30,7)-(30,8)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 2 - │ │ │ └── operator_loc: (30,5)-(30,7) = ".." - │ │ └── @ CallNode (location: (30,12)-(30,17)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :value - │ │ ├── message_loc: (30,12)-(30,17) = "value" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (30,8)-(30,9) = "]" - │ └── block: ∅ - ├── @ CallNode (location: (31,0)-(31,9)) - │ ├── flags: newline, attribute_write - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (31,0)-(31,3)) - │ │ ├── flags: ∅ - │ │ ├── name: :foo - │ │ └── depth: 0 - │ ├── call_operator_loc: ∅ - │ ├── name: :[]= - │ ├── message_loc: (31,3)-(31,5) = "[]" - │ ├── opening_loc: (31,3)-(31,4) = "[" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (31,8)-(31,9)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (31,8)-(31,9)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: (31,4)-(31,5) = "]" - │ └── block: ∅ - ├── @ CallNode (location: (32,0)-(32,17)) - │ ├── flags: newline, attribute_write - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (32,0)-(32,3)) - │ │ ├── flags: ∅ - │ │ ├── name: :foo - │ │ └── depth: 0 - │ ├── call_operator_loc: ∅ - │ ├── name: :[]= - │ ├── message_loc: (32,3)-(32,9) = "[a, b]" - │ ├── opening_loc: (32,3)-(32,4) = "[" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (32,4)-(32,17)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 3) - │ │ ├── @ LocalVariableReadNode (location: (32,4)-(32,5)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :a - │ │ │ └── depth: 0 - │ │ ├── @ LocalVariableReadNode (location: (32,7)-(32,8)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :b - │ │ │ └── depth: 0 - │ │ └── @ CallNode (location: (32,12)-(32,17)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :value - │ │ ├── message_loc: (32,12)-(32,17) = "value" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (32,8)-(32,9) = "]" - │ └── block: ∅ - ├── @ CallNode (location: (33,0)-(33,18)) - │ ├── flags: newline, attribute_write - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (33,0)-(33,3)) - │ │ ├── flags: ∅ - │ │ ├── name: :foo - │ │ └── depth: 0 - │ ├── call_operator_loc: ∅ - │ ├── name: :[]= - │ ├── message_loc: (33,3)-(33,10) = "[index]" - │ ├── opening_loc: (33,3)-(33,4) = "[" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (33,4)-(33,18)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (33,4)-(33,9)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :index - │ │ │ ├── message_loc: (33,4)-(33,9) = "index" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── @ CallNode (location: (33,13)-(33,18)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :value - │ │ ├── message_loc: (33,13)-(33,18) = "value" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (33,9)-(33,10) = "]" - │ └── block: ∅ - ├── @ LocalVariableWriteNode (location: (34,0)-(34,7)) - │ ├── flags: newline - │ ├── name: :x - │ ├── depth: 0 - │ ├── name_loc: (34,0)-(34,1) = "x" - │ ├── value: - │ │ @ StringNode (location: (34,4)-(34,7)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (34,4)-(34,6) = "%(" - │ │ ├── content_loc: (34,6)-(34,6) = "" - │ │ ├── closing_loc: (34,6)-(34,7) = ")" - │ │ └── unescaped: "" - │ └── operator_loc: (34,2)-(34,3) = "=" - ├── @ CallNode (location: (35,0)-(35,7)) - │ ├── flags: newline, attribute_write - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (35,0)-(35,1)) - │ │ ├── flags: ∅ - │ │ ├── name: :x - │ │ └── depth: 0 - │ ├── call_operator_loc: (35,1)-(35,2) = "." - │ ├── name: :x= - │ ├── message_loc: (35,2)-(35,3) = "x" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (35,4)-(35,7)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ StringNode (location: (35,4)-(35,7)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (35,4)-(35,6) = "%(" - │ │ ├── content_loc: (35,6)-(35,6) = "" - │ │ ├── closing_loc: (35,6)-(35,7) = ")" - │ │ └── unescaped: "" - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (36,0)-(36,12)) - │ ├── flags: newline, attribute_write - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (36,0)-(36,1)) - │ │ ├── flags: ∅ - │ │ ├── name: :x - │ │ └── depth: 0 - │ ├── call_operator_loc: ∅ - │ ├── name: :[]= - │ ├── message_loc: (36,1)-(36,6) = "[%()]" - │ ├── opening_loc: (36,1)-(36,2) = "[" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (36,2)-(36,12)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ StringNode (location: (36,2)-(36,5)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (36,2)-(36,4) = "%(" - │ │ │ ├── content_loc: (36,4)-(36,4) = "" - │ │ │ ├── closing_loc: (36,4)-(36,5) = ")" - │ │ │ └── unescaped: "" - │ │ └── @ CallNode (location: (36,9)-(36,12)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (36,9)-(36,12) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (36,5)-(36,6) = "]" - │ └── block: ∅ - ├── @ IndexOrWriteNode (location: (37,0)-(37,14)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (37,0)-(37,1)) - │ │ ├── flags: ∅ - │ │ ├── name: :a - │ │ └── depth: 0 - │ ├── call_operator_loc: ∅ - │ ├── opening_loc: (37,1)-(37,2) = "[" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (37,2)-(37,5)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ StringNode (location: (37,2)-(37,5)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (37,2)-(37,4) = "%(" - │ │ ├── content_loc: (37,4)-(37,4) = "" - │ │ ├── closing_loc: (37,4)-(37,5) = ")" - │ │ └── unescaped: "" - │ ├── closing_loc: (37,5)-(37,6) = "]" - │ ├── block: ∅ - │ ├── operator_loc: (37,7)-(37,10) = "||=" - │ └── value: - │ @ CallNode (location: (37,11)-(37,14)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :bar - │ ├── message_loc: (37,11)-(37,14) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ InstanceVariableOrWriteNode (location: (38,0)-(38,10)) - │ ├── flags: newline - │ ├── name: :@a - │ ├── name_loc: (38,0)-(38,2) = "@a" - │ ├── operator_loc: (38,3)-(38,6) = "||=" - │ └── value: - │ @ StringNode (location: (38,7)-(38,10)) - │ ├── flags: ∅ - │ ├── opening_loc: (38,7)-(38,9) = "%(" - │ ├── content_loc: (38,9)-(38,9) = "" - │ ├── closing_loc: (38,9)-(38,10) = ")" - │ └── unescaped: "" - ├── @ LocalVariableWriteNode (location: (39,0)-(39,14)) - │ ├── flags: newline - │ ├── name: :x - │ ├── depth: 0 - │ ├── name_loc: (39,0)-(39,1) = "x" - │ ├── value: - │ │ @ InterpolatedStringNode (location: (39,4)-(39,14)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (39,4)-(39,14) = "<<-HEREDOC" - │ │ ├── parts: (length: 3) - │ │ │ ├── @ StringNode (location: (40,0)-(40,2)) - │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── content_loc: (40,0)-(40,2) = " " - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: " " - │ │ │ ├── @ EmbeddedStatementsNode (location: (40,2)-(40,5)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── opening_loc: (40,2)-(40,4) = "\#{" - │ │ │ │ ├── statements: ∅ - │ │ │ │ └── closing_loc: (40,4)-(40,5) = "}" - │ │ │ └── @ StringNode (location: (40,5)-(41,0)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (40,5)-(41,0) = "\n" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "\n" - │ │ └── closing_loc: (41,0)-(42,0) = "HEREDOC\n" - │ └── operator_loc: (39,2)-(39,3) = "=" - ├── @ CallNode (location: (42,0)-(42,14)) - │ ├── flags: newline, attribute_write - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (42,0)-(42,1)) - │ │ ├── flags: ∅ - │ │ ├── name: :x - │ │ └── depth: 0 - │ ├── call_operator_loc: (42,1)-(42,2) = "." - │ ├── name: :x= - │ ├── message_loc: (42,2)-(42,3) = "x" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (42,4)-(42,14)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ InterpolatedStringNode (location: (42,4)-(42,14)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (42,4)-(42,14) = "<<-HEREDOC" - │ │ ├── parts: (length: 3) - │ │ │ ├── @ StringNode (location: (43,0)-(43,2)) - │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── content_loc: (43,0)-(43,2) = " " - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: " " - │ │ │ ├── @ EmbeddedStatementsNode (location: (43,2)-(43,5)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── opening_loc: (43,2)-(43,4) = "\#{" - │ │ │ │ ├── statements: ∅ - │ │ │ │ └── closing_loc: (43,4)-(43,5) = "}" - │ │ │ └── @ StringNode (location: (43,5)-(44,0)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (43,5)-(44,0) = "\n" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "\n" - │ │ └── closing_loc: (44,0)-(45,0) = "HEREDOC\n" - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (45,0)-(45,16)) - │ ├── flags: newline, attribute_write - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (45,0)-(45,1)) - │ │ ├── flags: ∅ - │ │ ├── name: :x - │ │ └── depth: 0 - │ ├── call_operator_loc: ∅ - │ ├── name: :[]= - │ ├── message_loc: (45,1)-(45,3) = "[]" - │ ├── opening_loc: (45,1)-(45,2) = "[" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (45,6)-(45,16)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ InterpolatedStringNode (location: (45,6)-(45,16)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (45,6)-(45,16) = "<<-HEREDOC" - │ │ ├── parts: (length: 3) - │ │ │ ├── @ StringNode (location: (46,0)-(46,2)) - │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── content_loc: (46,0)-(46,2) = " " - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: " " - │ │ │ ├── @ EmbeddedStatementsNode (location: (46,2)-(46,5)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── opening_loc: (46,2)-(46,4) = "\#{" - │ │ │ │ ├── statements: ∅ - │ │ │ │ └── closing_loc: (46,4)-(46,5) = "}" - │ │ │ └── @ StringNode (location: (46,5)-(47,0)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (46,5)-(47,0) = "\n" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "\n" - │ │ └── closing_loc: (47,0)-(48,0) = "HEREDOC\n" - │ ├── closing_loc: (45,2)-(45,3) = "]" - │ └── block: ∅ - ├── @ IndexOrWriteNode (location: (48,0)-(48,21)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (48,0)-(48,1)) - │ │ ├── flags: ∅ - │ │ ├── name: :a - │ │ └── depth: 0 - │ ├── call_operator_loc: ∅ - │ ├── opening_loc: (48,1)-(48,2) = "[" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (48,2)-(48,12)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ InterpolatedStringNode (location: (48,2)-(48,12)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (48,2)-(48,12) = "<<-HEREDOC" - │ │ ├── parts: (length: 3) - │ │ │ ├── @ StringNode (location: (49,0)-(49,2)) - │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── content_loc: (49,0)-(49,2) = " " - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: " " - │ │ │ ├── @ EmbeddedStatementsNode (location: (49,2)-(49,5)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── opening_loc: (49,2)-(49,4) = "\#{" - │ │ │ │ ├── statements: ∅ - │ │ │ │ └── closing_loc: (49,4)-(49,5) = "}" - │ │ │ └── @ StringNode (location: (49,5)-(50,0)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (49,5)-(50,0) = "\n" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "\n" - │ │ └── closing_loc: (50,0)-(51,0) = "HEREDOC\n" - │ ├── closing_loc: (48,12)-(48,13) = "]" - │ ├── block: ∅ - │ ├── operator_loc: (48,14)-(48,17) = "||=" - │ └── value: - │ @ CallNode (location: (48,18)-(48,21)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :bar - │ ├── message_loc: (48,18)-(48,21) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── @ InstanceVariableOrWriteNode (location: (51,0)-(51,17)) - ├── flags: newline - ├── name: :@a - ├── name_loc: (51,0)-(51,2) = "@a" - ├── operator_loc: (51,3)-(51,6) = "||=" - └── value: - @ InterpolatedStringNode (location: (51,7)-(51,17)) - ├── flags: ∅ - ├── opening_loc: (51,7)-(51,17) = "<<-HEREDOC" - ├── parts: (length: 3) - │ ├── @ StringNode (location: (52,0)-(52,2)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (52,0)-(52,2) = " " - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: " " - │ ├── @ EmbeddedStatementsNode (location: (52,2)-(52,5)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (52,2)-(52,4) = "\#{" - │ │ ├── statements: ∅ - │ │ └── closing_loc: (52,4)-(52,5) = "}" - │ └── @ StringNode (location: (52,5)-(53,0)) - │ ├── flags: static_literal, frozen - │ ├── opening_loc: ∅ - │ ├── content_loc: (52,5)-(53,0) = "\n" - │ ├── closing_loc: ∅ - │ └── unescaped: "\n" - └── closing_loc: (53,0)-(54,0) = "HEREDOC\n" diff --git a/test/prism/snapshots/unparser/corpus/literal/block.txt b/test/prism/snapshots/unparser/corpus/literal/block.txt deleted file mode 100644 index 4320ede87b64ca..00000000000000 --- a/test/prism/snapshots/unparser/corpus/literal/block.txt +++ /dev/null @@ -1,1541 +0,0 @@ -@ ProgramNode (location: (1,0)-(96,1)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(96,1)) - ├── flags: ∅ - └── body: (length: 30) - ├── @ CallNode (location: (1,0)-(2,1)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (1,0)-(1,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (1,4)-(2,1)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (1,4)-(1,5) = "{" - │ └── closing_loc: (2,0)-(2,1) = "}" - ├── @ CallNode (location: (3,0)-(4,1)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (3,0)-(3,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (3,4)-(4,1)) - │ ├── flags: ∅ - │ ├── locals: [:a] - │ ├── parameters: - │ │ @ BlockParametersNode (location: (3,6)-(3,9)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (3,7)-(3,8)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (3,7)-(3,8)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :a - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: (3,6)-(3,7) = "|" - │ │ └── closing_loc: (3,8)-(3,9) = "|" - │ ├── body: ∅ - │ ├── opening_loc: (3,4)-(3,5) = "{" - │ └── closing_loc: (4,0)-(4,1) = "}" - ├── @ CallNode (location: (5,0)-(6,1)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (5,0)-(5,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (5,4)-(6,1)) - │ ├── flags: ∅ - │ ├── locals: [:a] - │ ├── parameters: - │ │ @ BlockParametersNode (location: (5,6)-(5,10)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (5,7)-(5,9)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (5,7)-(5,8)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :a - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: - │ │ │ │ @ ImplicitRestNode (location: (5,8)-(5,9)) - │ │ │ │ └── flags: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: (5,6)-(5,7) = "|" - │ │ └── closing_loc: (5,9)-(5,10) = "|" - │ ├── body: ∅ - │ ├── opening_loc: (5,4)-(5,5) = "{" - │ └── closing_loc: (6,0)-(6,1) = "}" - ├── @ CallNode (location: (7,0)-(8,1)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (7,0)-(7,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (7,4)-(8,1)) - │ ├── flags: ∅ - │ ├── locals: [:a, :x] - │ ├── parameters: - │ │ @ BlockParametersNode (location: (7,6)-(7,13)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (7,7)-(7,9)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (7,7)-(7,8)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :a - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: - │ │ │ │ @ ImplicitRestNode (location: (7,8)-(7,9)) - │ │ │ │ └── flags: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 1) - │ │ │ └── @ BlockLocalVariableNode (location: (7,11)-(7,12)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :x - │ │ ├── opening_loc: (7,6)-(7,7) = "|" - │ │ └── closing_loc: (7,12)-(7,13) = "|" - │ ├── body: ∅ - │ ├── opening_loc: (7,4)-(7,5) = "{" - │ └── closing_loc: (8,0)-(8,1) = "}" - ├── @ CallNode (location: (9,0)-(10,1)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (9,0)-(9,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (9,4)-(10,1)) - │ ├── flags: ∅ - │ ├── locals: [:a, :b] - │ ├── parameters: - │ │ @ BlockParametersNode (location: (9,6)-(9,12)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (9,7)-(9,11)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 2) - │ │ │ │ ├── @ RequiredParameterNode (location: (9,7)-(9,8)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── name: :a - │ │ │ │ └── @ RequiredParameterNode (location: (9,10)-(9,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :b - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: (9,6)-(9,7) = "|" - │ │ └── closing_loc: (9,11)-(9,12) = "|" - │ ├── body: ∅ - │ ├── opening_loc: (9,4)-(9,5) = "{" - │ └── closing_loc: (10,0)-(10,1) = "}" - ├── @ CallNode (location: (11,0)-(13,1)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (11,0)-(11,3) = "foo" - │ ├── opening_loc: (11,3)-(11,4) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (11,4)-(11,5)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (11,4)-(11,5)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: (11,5)-(11,6) = ")" - │ └── block: - │ @ BlockNode (location: (11,7)-(13,1)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (12,2)-(12,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ NilNode (location: (12,2)-(12,5)) - │ │ └── flags: newline, static_literal - │ ├── opening_loc: (11,7)-(11,8) = "{" - │ └── closing_loc: (13,0)-(13,1) = "}" - ├── @ CallNode (location: (14,0)-(16,1)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (14,0)-(14,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (14,4)-(16,1)) - │ ├── flags: ∅ - │ ├── locals: [:a, :b] - │ ├── parameters: - │ │ @ BlockParametersNode (location: (14,6)-(14,13)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (14,7)-(14,12)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (14,7)-(14,8)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :a - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: - │ │ │ │ @ RestParameterNode (location: (14,10)-(14,12)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :b - │ │ │ │ ├── name_loc: (14,11)-(14,12) = "b" - │ │ │ │ └── operator_loc: (14,10)-(14,11) = "*" - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: (14,6)-(14,7) = "|" - │ │ └── closing_loc: (14,12)-(14,13) = "|" - │ ├── body: - │ │ @ StatementsNode (location: (15,2)-(15,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ NilNode (location: (15,2)-(15,5)) - │ │ └── flags: newline, static_literal - │ ├── opening_loc: (14,4)-(14,5) = "{" - │ └── closing_loc: (16,0)-(16,1) = "}" - ├── @ CallNode (location: (17,0)-(19,1)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (17,0)-(17,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (17,4)-(19,1)) - │ ├── flags: ∅ - │ ├── locals: [:a] - │ ├── parameters: - │ │ @ BlockParametersNode (location: (17,6)-(17,12)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (17,7)-(17,11)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (17,7)-(17,8)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :a - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: - │ │ │ │ @ RestParameterNode (location: (17,10)-(17,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: ∅ - │ │ │ │ ├── name_loc: ∅ - │ │ │ │ └── operator_loc: (17,10)-(17,11) = "*" - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: (17,6)-(17,7) = "|" - │ │ └── closing_loc: (17,11)-(17,12) = "|" - │ ├── body: - │ │ @ StatementsNode (location: (18,2)-(18,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ NilNode (location: (18,2)-(18,5)) - │ │ └── flags: newline, static_literal - │ ├── opening_loc: (17,4)-(17,5) = "{" - │ └── closing_loc: (19,0)-(19,1) = "}" - ├── @ CallNode (location: (20,0)-(22,1)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (20,0)-(20,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (20,4)-(22,1)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (21,2)-(21,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (21,2)-(21,5)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (21,2)-(21,5) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── opening_loc: (20,4)-(20,5) = "{" - │ └── closing_loc: (22,0)-(22,1) = "}" - ├── @ CallNode (location: (23,0)-(25,1)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (23,0)-(23,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (23,0)-(23,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (23,3)-(23,4) = "." - │ ├── name: :bar - │ ├── message_loc: (23,4)-(23,7) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (23,8)-(25,1)) - │ ├── flags: ∅ - │ ├── locals: [:a, :b, :c] - │ ├── parameters: - │ │ @ BlockParametersNode (location: (23,10)-(23,21)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (23,11)-(23,20)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 2) - │ │ │ │ ├── @ MultiTargetNode (location: (23,11)-(23,17)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── lefts: (length: 2) - │ │ │ │ │ │ ├── @ RequiredParameterNode (location: (23,12)-(23,13)) - │ │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ │ └── name: :a - │ │ │ │ │ │ └── @ RequiredParameterNode (location: (23,15)-(23,16)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ └── name: :b - │ │ │ │ │ ├── rest: ∅ - │ │ │ │ │ ├── rights: (length: 0) - │ │ │ │ │ ├── lparen_loc: (23,11)-(23,12) = "(" - │ │ │ │ │ └── rparen_loc: (23,16)-(23,17) = ")" - │ │ │ │ └── @ RequiredParameterNode (location: (23,19)-(23,20)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :c - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: (23,10)-(23,11) = "|" - │ │ └── closing_loc: (23,20)-(23,21) = "|" - │ ├── body: - │ │ @ StatementsNode (location: (24,2)-(24,3)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (24,2)-(24,3)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :d - │ │ ├── message_loc: (24,2)-(24,3) = "d" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── opening_loc: (23,8)-(23,9) = "{" - │ └── closing_loc: (25,0)-(25,1) = "}" - ├── @ CallNode (location: (26,0)-(27,1)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (26,0)-(26,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (26,0)-(26,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (26,3)-(26,4) = "." - │ ├── name: :bar - │ ├── message_loc: (26,4)-(26,7) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (26,8)-(27,1)) - │ ├── flags: ∅ - │ ├── locals: [:a, :b] - │ ├── parameters: - │ │ @ BlockParametersNode (location: (26,10)-(26,17)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (26,11)-(26,13)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 0) - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: - │ │ │ │ @ RestParameterNode (location: (26,11)-(26,13)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :a - │ │ │ │ ├── name_loc: (26,12)-(26,13) = "a" - │ │ │ │ └── operator_loc: (26,11)-(26,12) = "*" - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 1) - │ │ │ └── @ BlockLocalVariableNode (location: (26,15)-(26,16)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :b - │ │ ├── opening_loc: (26,10)-(26,11) = "|" - │ │ └── closing_loc: (26,16)-(26,17) = "|" - │ ├── body: ∅ - │ ├── opening_loc: (26,8)-(26,9) = "{" - │ └── closing_loc: (27,0)-(27,1) = "}" - ├── @ CallNode (location: (28,0)-(29,1)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (28,0)-(28,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (28,0)-(28,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (28,3)-(28,4) = "." - │ ├── name: :bar - │ ├── message_loc: (28,4)-(28,7) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (28,8)-(29,1)) - │ ├── flags: ∅ - │ ├── locals: [:a, :b] - │ ├── parameters: - │ │ @ BlockParametersNode (location: (28,10)-(28,16)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (28,11)-(28,12)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (28,11)-(28,12)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :a - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 1) - │ │ │ └── @ BlockLocalVariableNode (location: (28,14)-(28,15)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :b - │ │ ├── opening_loc: (28,10)-(28,11) = "|" - │ │ └── closing_loc: (28,15)-(28,16) = "|" - │ ├── body: ∅ - │ ├── opening_loc: (28,8)-(28,9) = "{" - │ └── closing_loc: (29,0)-(29,1) = "}" - ├── @ CallNode (location: (30,0)-(31,1)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (30,0)-(30,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (30,0)-(30,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (30,3)-(30,4) = "." - │ ├── name: :bar - │ ├── message_loc: (30,4)-(30,7) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (30,8)-(31,1)) - │ ├── flags: ∅ - │ ├── locals: [:a, :b] - │ ├── parameters: - │ │ @ BlockParametersNode (location: (30,10)-(30,18)) - │ │ ├── flags: ∅ - │ │ ├── parameters: ∅ - │ │ ├── locals: (length: 2) - │ │ │ ├── @ BlockLocalVariableNode (location: (30,13)-(30,14)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :a - │ │ │ └── @ BlockLocalVariableNode (location: (30,16)-(30,17)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :b - │ │ ├── opening_loc: (30,10)-(30,11) = "|" - │ │ └── closing_loc: (30,17)-(30,18) = "|" - │ ├── body: ∅ - │ ├── opening_loc: (30,8)-(30,9) = "{" - │ └── closing_loc: (31,0)-(31,1) = "}" - ├── @ CallNode (location: (32,0)-(34,1)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (32,0)-(32,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (32,0)-(32,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (32,3)-(32,4) = "." - │ ├── name: :bar - │ ├── message_loc: (32,4)-(32,7) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (32,8)-(34,1)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: - │ │ @ BlockParametersNode (location: (32,10)-(32,13)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (32,11)-(32,12)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 0) - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: - │ │ │ │ @ RestParameterNode (location: (32,11)-(32,12)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: ∅ - │ │ │ │ ├── name_loc: ∅ - │ │ │ │ └── operator_loc: (32,11)-(32,12) = "*" - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: (32,10)-(32,11) = "|" - │ │ └── closing_loc: (32,12)-(32,13) = "|" - │ ├── body: - │ │ @ StatementsNode (location: (33,2)-(33,3)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (33,2)-(33,3)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :d - │ │ ├── message_loc: (33,2)-(33,3) = "d" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── opening_loc: (32,8)-(32,9) = "{" - │ └── closing_loc: (34,0)-(34,1) = "}" - ├── @ CallNode (location: (35,0)-(37,1)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (35,0)-(35,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (35,0)-(35,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (35,3)-(35,4) = "." - │ ├── name: :bar - │ ├── message_loc: (35,4)-(35,7) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (35,8)-(37,1)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: - │ │ @ BlockParametersNode (location: (35,10)-(35,15)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (35,11)-(35,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 1) - │ │ │ │ └── @ MultiTargetNode (location: (35,11)-(35,14)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── lefts: (length: 0) - │ │ │ │ ├── rest: - │ │ │ │ │ @ SplatNode (location: (35,12)-(35,13)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── operator_loc: (35,12)-(35,13) = "*" - │ │ │ │ │ └── expression: ∅ - │ │ │ │ ├── rights: (length: 0) - │ │ │ │ ├── lparen_loc: (35,11)-(35,12) = "(" - │ │ │ │ └── rparen_loc: (35,13)-(35,14) = ")" - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: (35,10)-(35,11) = "|" - │ │ └── closing_loc: (35,14)-(35,15) = "|" - │ ├── body: - │ │ @ StatementsNode (location: (36,2)-(36,3)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (36,2)-(36,3)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :d - │ │ ├── message_loc: (36,2)-(36,3) = "d" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── opening_loc: (35,8)-(35,9) = "{" - │ └── closing_loc: (37,0)-(37,1) = "}" - ├── @ CallNode (location: (38,0)-(40,1)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (38,0)-(38,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (38,0)-(38,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (38,3)-(38,4) = "." - │ ├── name: :bar - │ ├── message_loc: (38,4)-(38,7) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (38,8)-(40,1)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: - │ │ @ BlockParametersNode (location: (38,10)-(38,17)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (38,11)-(38,16)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 1) - │ │ │ │ └── @ MultiTargetNode (location: (38,11)-(38,16)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── lefts: (length: 1) - │ │ │ │ │ └── @ MultiTargetNode (location: (38,12)-(38,15)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── lefts: (length: 0) - │ │ │ │ │ ├── rest: - │ │ │ │ │ │ @ SplatNode (location: (38,13)-(38,14)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ ├── operator_loc: (38,13)-(38,14) = "*" - │ │ │ │ │ │ └── expression: ∅ - │ │ │ │ │ ├── rights: (length: 0) - │ │ │ │ │ ├── lparen_loc: (38,12)-(38,13) = "(" - │ │ │ │ │ └── rparen_loc: (38,14)-(38,15) = ")" - │ │ │ │ ├── rest: ∅ - │ │ │ │ ├── rights: (length: 0) - │ │ │ │ ├── lparen_loc: (38,11)-(38,12) = "(" - │ │ │ │ └── rparen_loc: (38,15)-(38,16) = ")" - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: (38,10)-(38,11) = "|" - │ │ └── closing_loc: (38,16)-(38,17) = "|" - │ ├── body: - │ │ @ StatementsNode (location: (39,2)-(39,3)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (39,2)-(39,3)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :d - │ │ ├── message_loc: (39,2)-(39,3) = "d" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── opening_loc: (38,8)-(38,9) = "{" - │ └── closing_loc: (40,0)-(40,1) = "}" - ├── @ CallNode (location: (41,0)-(43,1)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (41,0)-(41,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (41,0)-(41,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (41,3)-(41,4) = "." - │ ├── name: :bar - │ ├── message_loc: (41,4)-(41,7) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (41,8)-(43,1)) - │ ├── flags: ∅ - │ ├── locals: [:a] - │ ├── parameters: - │ │ @ BlockParametersNode (location: (41,10)-(41,20)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (41,11)-(41,19)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 1) - │ │ │ │ └── @ MultiTargetNode (location: (41,11)-(41,19)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── lefts: (length: 2) - │ │ │ │ │ ├── @ RequiredParameterNode (location: (41,12)-(41,13)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ └── name: :a - │ │ │ │ │ └── @ MultiTargetNode (location: (41,15)-(41,18)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── lefts: (length: 0) - │ │ │ │ │ ├── rest: - │ │ │ │ │ │ @ SplatNode (location: (41,16)-(41,17)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ ├── operator_loc: (41,16)-(41,17) = "*" - │ │ │ │ │ │ └── expression: ∅ - │ │ │ │ │ ├── rights: (length: 0) - │ │ │ │ │ ├── lparen_loc: (41,15)-(41,16) = "(" - │ │ │ │ │ └── rparen_loc: (41,17)-(41,18) = ")" - │ │ │ │ ├── rest: ∅ - │ │ │ │ ├── rights: (length: 0) - │ │ │ │ ├── lparen_loc: (41,11)-(41,12) = "(" - │ │ │ │ └── rparen_loc: (41,18)-(41,19) = ")" - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: (41,10)-(41,11) = "|" - │ │ └── closing_loc: (41,19)-(41,20) = "|" - │ ├── body: - │ │ @ StatementsNode (location: (42,2)-(42,3)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (42,2)-(42,3)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :d - │ │ ├── message_loc: (42,2)-(42,3) = "d" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── opening_loc: (41,8)-(41,9) = "{" - │ └── closing_loc: (43,0)-(43,1) = "}" - ├── @ CallNode (location: (44,0)-(46,1)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (44,0)-(44,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (44,0)-(44,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (44,3)-(44,4) = "." - │ ├── name: :bar - │ ├── message_loc: (44,4)-(44,7) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (44,8)-(46,1)) - │ ├── flags: ∅ - │ ├── locals: [:a, :b] - │ ├── parameters: - │ │ @ BlockParametersNode (location: (44,10)-(44,18)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (44,11)-(44,17)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 1) - │ │ │ │ └── @ MultiTargetNode (location: (44,11)-(44,17)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── lefts: (length: 2) - │ │ │ │ │ ├── @ RequiredParameterNode (location: (44,12)-(44,13)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ └── name: :a - │ │ │ │ │ └── @ RequiredParameterNode (location: (44,15)-(44,16)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── name: :b - │ │ │ │ ├── rest: ∅ - │ │ │ │ ├── rights: (length: 0) - │ │ │ │ ├── lparen_loc: (44,11)-(44,12) = "(" - │ │ │ │ └── rparen_loc: (44,16)-(44,17) = ")" - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: (44,10)-(44,11) = "|" - │ │ └── closing_loc: (44,17)-(44,18) = "|" - │ ├── body: - │ │ @ StatementsNode (location: (45,2)-(45,3)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (45,2)-(45,3)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :d - │ │ ├── message_loc: (45,2)-(45,3) = "d" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── opening_loc: (44,8)-(44,9) = "{" - │ └── closing_loc: (46,0)-(46,1) = "}" - ├── @ CallNode (location: (47,0)-(48,5)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (47,0)-(48,1)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ CallNode (location: (47,0)-(47,3)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (47,0)-(47,3) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: (47,3)-(47,4) = "." - │ │ ├── name: :bar - │ │ ├── message_loc: (47,4)-(47,7) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: - │ │ @ BlockNode (location: (47,8)-(48,1)) - │ │ ├── flags: ∅ - │ │ ├── locals: [] - │ │ ├── parameters: ∅ - │ │ ├── body: ∅ - │ │ ├── opening_loc: (47,8)-(47,9) = "{" - │ │ └── closing_loc: (48,0)-(48,1) = "}" - │ ├── call_operator_loc: (48,1)-(48,2) = "." - │ ├── name: :baz - │ ├── message_loc: (48,2)-(48,5) = "baz" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (49,0)-(51,3)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :m - │ ├── message_loc: (49,0)-(49,1) = "m" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (49,2)-(51,3)) - │ ├── flags: ∅ - │ ├── locals: [:e] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ BeginNode (location: (49,2)-(51,3)) - │ │ ├── flags: ∅ - │ │ ├── begin_keyword_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── rescue_clause: - │ │ │ @ RescueNode (location: (50,0)-(50,21)) - │ │ │ ├── flags: ∅ - │ │ │ ├── keyword_loc: (50,0)-(50,6) = "rescue" - │ │ │ ├── exceptions: (length: 1) - │ │ │ │ └── @ ConstantReadNode (location: (50,7)-(50,16)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :Exception - │ │ │ ├── operator_loc: (50,17)-(50,19) = "=>" - │ │ │ ├── reference: - │ │ │ │ @ LocalVariableTargetNode (location: (50,20)-(50,21)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :e - │ │ │ │ └── depth: 0 - │ │ │ ├── statements: ∅ - │ │ │ └── subsequent: ∅ - │ │ ├── else_clause: ∅ - │ │ ├── ensure_clause: ∅ - │ │ └── end_keyword_loc: (51,0)-(51,3) = "end" - │ ├── opening_loc: (49,2)-(49,4) = "do" - │ └── closing_loc: (51,0)-(51,3) = "end" - ├── @ CallNode (location: (52,0)-(56,3)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :m - │ ├── message_loc: (52,0)-(52,1) = "m" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (52,2)-(56,3)) - │ ├── flags: ∅ - │ ├── locals: [:bar] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ BeginNode (location: (52,2)-(56,3)) - │ │ ├── flags: ∅ - │ │ ├── begin_keyword_loc: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (53,2)-(53,5)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (53,2)-(53,5)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (53,2)-(53,5) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── rescue_clause: - │ │ │ @ RescueNode (location: (54,0)-(55,5)) - │ │ │ ├── flags: ∅ - │ │ │ ├── keyword_loc: (54,0)-(54,6) = "rescue" - │ │ │ ├── exceptions: (length: 1) - │ │ │ │ └── @ ConstantReadNode (location: (54,7)-(54,16)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :Exception - │ │ │ ├── operator_loc: (54,17)-(54,19) = "=>" - │ │ │ ├── reference: - │ │ │ │ @ LocalVariableTargetNode (location: (54,20)-(54,23)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :bar - │ │ │ │ └── depth: 0 - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (55,2)-(55,5)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ LocalVariableReadNode (location: (55,2)-(55,5)) - │ │ │ │ ├── flags: newline - │ │ │ │ ├── name: :bar - │ │ │ │ └── depth: 0 - │ │ │ └── subsequent: ∅ - │ │ ├── else_clause: ∅ - │ │ ├── ensure_clause: ∅ - │ │ └── end_keyword_loc: (56,0)-(56,3) = "end" - │ ├── opening_loc: (52,2)-(52,4) = "do" - │ └── closing_loc: (56,0)-(56,3) = "end" - ├── @ CallNode (location: (57,0)-(61,3)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :m - │ ├── message_loc: (57,0)-(57,1) = "m" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (57,2)-(61,3)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ BeginNode (location: (57,2)-(61,3)) - │ │ ├── flags: ∅ - │ │ ├── begin_keyword_loc: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (58,2)-(58,5)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (58,2)-(58,5)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (58,2)-(58,5) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── rescue_clause: - │ │ │ @ RescueNode (location: (59,0)-(60,5)) - │ │ │ ├── flags: ∅ - │ │ │ ├── keyword_loc: (59,0)-(59,6) = "rescue" - │ │ │ ├── exceptions: (length: 2) - │ │ │ │ ├── @ ConstantReadNode (location: (59,7)-(59,16)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── name: :SomeError - │ │ │ │ └── @ SplatNode (location: (59,18)-(59,22)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── operator_loc: (59,18)-(59,19) = "*" - │ │ │ │ └── expression: - │ │ │ │ @ CallNode (location: (59,19)-(59,22)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :bar - │ │ │ │ ├── message_loc: (59,19)-(59,22) = "bar" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── operator_loc: ∅ - │ │ │ ├── reference: ∅ - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (60,2)-(60,5)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (60,2)-(60,5)) - │ │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ ├── message_loc: (60,2)-(60,5) = "baz" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── subsequent: ∅ - │ │ ├── else_clause: ∅ - │ │ ├── ensure_clause: ∅ - │ │ └── end_keyword_loc: (61,0)-(61,3) = "end" - │ ├── opening_loc: (57,2)-(57,4) = "do" - │ └── closing_loc: (61,0)-(61,3) = "end" - ├── @ CallNode (location: (62,0)-(66,3)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :m - │ ├── message_loc: (62,0)-(62,1) = "m" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (62,2)-(66,3)) - │ ├── flags: ∅ - │ ├── locals: [:exception] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ BeginNode (location: (62,2)-(66,3)) - │ │ ├── flags: ∅ - │ │ ├── begin_keyword_loc: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (63,2)-(63,5)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (63,2)-(63,5)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (63,2)-(63,5) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── rescue_clause: - │ │ │ @ RescueNode (location: (64,0)-(65,5)) - │ │ │ ├── flags: ∅ - │ │ │ ├── keyword_loc: (64,0)-(64,6) = "rescue" - │ │ │ ├── exceptions: (length: 2) - │ │ │ │ ├── @ ConstantReadNode (location: (64,7)-(64,16)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── name: :SomeError - │ │ │ │ └── @ SplatNode (location: (64,18)-(64,22)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── operator_loc: (64,18)-(64,19) = "*" - │ │ │ │ └── expression: - │ │ │ │ @ CallNode (location: (64,19)-(64,22)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :bar - │ │ │ │ ├── message_loc: (64,19)-(64,22) = "bar" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── operator_loc: (64,23)-(64,25) = "=>" - │ │ │ ├── reference: - │ │ │ │ @ LocalVariableTargetNode (location: (64,26)-(64,35)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :exception - │ │ │ │ └── depth: 0 - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (65,2)-(65,5)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (65,2)-(65,5)) - │ │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ ├── message_loc: (65,2)-(65,5) = "baz" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── subsequent: ∅ - │ │ ├── else_clause: ∅ - │ │ ├── ensure_clause: ∅ - │ │ └── end_keyword_loc: (66,0)-(66,3) = "end" - │ ├── opening_loc: (62,2)-(62,4) = "do" - │ └── closing_loc: (66,0)-(66,3) = "end" - ├── @ CallNode (location: (67,0)-(71,3)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :m - │ ├── message_loc: (67,0)-(67,1) = "m" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (67,2)-(71,3)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ BeginNode (location: (67,2)-(71,3)) - │ │ ├── flags: ∅ - │ │ ├── begin_keyword_loc: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (68,2)-(68,5)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (68,2)-(68,5)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (68,2)-(68,5) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── rescue_clause: - │ │ │ @ RescueNode (location: (69,0)-(70,5)) - │ │ │ ├── flags: ∅ - │ │ │ ├── keyword_loc: (69,0)-(69,6) = "rescue" - │ │ │ ├── exceptions: (length: 1) - │ │ │ │ └── @ SplatNode (location: (69,7)-(69,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── operator_loc: (69,7)-(69,8) = "*" - │ │ │ │ └── expression: - │ │ │ │ @ CallNode (location: (69,8)-(69,11)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :bar - │ │ │ │ ├── message_loc: (69,8)-(69,11) = "bar" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── operator_loc: ∅ - │ │ │ ├── reference: ∅ - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (70,2)-(70,5)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (70,2)-(70,5)) - │ │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ ├── message_loc: (70,2)-(70,5) = "baz" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── subsequent: ∅ - │ │ ├── else_clause: ∅ - │ │ ├── ensure_clause: ∅ - │ │ └── end_keyword_loc: (71,0)-(71,3) = "end" - │ ├── opening_loc: (67,2)-(67,4) = "do" - │ └── closing_loc: (71,0)-(71,3) = "end" - ├── @ CallNode (location: (72,0)-(75,3)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :m - │ ├── message_loc: (72,0)-(72,1) = "m" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (72,2)-(75,3)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ BeginNode (location: (72,2)-(75,3)) - │ │ ├── flags: ∅ - │ │ ├── begin_keyword_loc: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (73,2)-(73,5)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (73,2)-(73,5)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (73,2)-(73,5) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── rescue_clause: - │ │ │ @ RescueNode (location: (74,0)-(74,16)) - │ │ │ ├── flags: ∅ - │ │ │ ├── keyword_loc: (74,0)-(74,6) = "rescue" - │ │ │ ├── exceptions: (length: 1) - │ │ │ │ └── @ ConstantReadNode (location: (74,7)-(74,16)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :LoadError - │ │ │ ├── operator_loc: ∅ - │ │ │ ├── reference: ∅ - │ │ │ ├── statements: ∅ - │ │ │ └── subsequent: ∅ - │ │ ├── else_clause: ∅ - │ │ ├── ensure_clause: ∅ - │ │ └── end_keyword_loc: (75,0)-(75,3) = "end" - │ ├── opening_loc: (72,2)-(72,4) = "do" - │ └── closing_loc: (75,0)-(75,3) = "end" - ├── @ CallNode (location: (76,0)-(81,3)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :m - │ ├── message_loc: (76,0)-(76,1) = "m" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (76,2)-(81,3)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ BeginNode (location: (76,2)-(81,3)) - │ │ ├── flags: ∅ - │ │ ├── begin_keyword_loc: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (77,2)-(77,5)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (77,2)-(77,5)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (77,2)-(77,5) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── rescue_clause: - │ │ │ @ RescueNode (location: (78,0)-(78,6)) - │ │ │ ├── flags: ∅ - │ │ │ ├── keyword_loc: (78,0)-(78,6) = "rescue" - │ │ │ ├── exceptions: (length: 0) - │ │ │ ├── operator_loc: ∅ - │ │ │ ├── reference: ∅ - │ │ │ ├── statements: ∅ - │ │ │ └── subsequent: ∅ - │ │ ├── else_clause: - │ │ │ @ ElseNode (location: (79,0)-(81,3)) - │ │ │ ├── flags: ∅ - │ │ │ ├── else_keyword_loc: (79,0)-(79,4) = "else" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (80,2)-(80,5)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (80,2)-(80,5)) - │ │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ ├── message_loc: (80,2)-(80,5) = "baz" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── end_keyword_loc: (81,0)-(81,3) = "end" - │ │ ├── ensure_clause: ∅ - │ │ └── end_keyword_loc: (81,0)-(81,3) = "end" - │ ├── opening_loc: (76,2)-(76,4) = "do" - │ └── closing_loc: (81,0)-(81,3) = "end" - ├── @ CallNode (location: (82,0)-(86,3)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :m - │ ├── message_loc: (82,0)-(82,1) = "m" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (82,2)-(86,3)) - │ ├── flags: ∅ - │ ├── locals: [:exception] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ BeginNode (location: (82,2)-(86,3)) - │ │ ├── flags: ∅ - │ │ ├── begin_keyword_loc: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (83,2)-(83,5)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (83,2)-(83,5)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (83,2)-(83,5) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── rescue_clause: - │ │ │ @ RescueNode (location: (84,0)-(85,5)) - │ │ │ ├── flags: ∅ - │ │ │ ├── keyword_loc: (84,0)-(84,6) = "rescue" - │ │ │ ├── exceptions: (length: 1) - │ │ │ │ └── @ SplatNode (location: (84,7)-(84,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── operator_loc: (84,7)-(84,8) = "*" - │ │ │ │ └── expression: - │ │ │ │ @ CallNode (location: (84,8)-(84,11)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :bar - │ │ │ │ ├── message_loc: (84,8)-(84,11) = "bar" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── operator_loc: (84,12)-(84,14) = "=>" - │ │ │ ├── reference: - │ │ │ │ @ LocalVariableTargetNode (location: (84,15)-(84,24)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :exception - │ │ │ │ └── depth: 0 - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (85,2)-(85,5)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (85,2)-(85,5)) - │ │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ ├── message_loc: (85,2)-(85,5) = "baz" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── subsequent: ∅ - │ │ ├── else_clause: ∅ - │ │ ├── ensure_clause: ∅ - │ │ └── end_keyword_loc: (86,0)-(86,3) = "end" - │ ├── opening_loc: (82,2)-(82,4) = "do" - │ └── closing_loc: (86,0)-(86,3) = "end" - ├── @ CallNode (location: (87,0)-(89,3)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :m - │ ├── message_loc: (87,0)-(87,1) = "m" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (87,2)-(89,3)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ BeginNode (location: (87,2)-(89,3)) - │ │ ├── flags: ∅ - │ │ ├── begin_keyword_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── rescue_clause: ∅ - │ │ ├── else_clause: ∅ - │ │ ├── ensure_clause: - │ │ │ @ EnsureNode (location: (88,0)-(89,3)) - │ │ │ ├── flags: ∅ - │ │ │ ├── ensure_keyword_loc: (88,0)-(88,6) = "ensure" - │ │ │ ├── statements: ∅ - │ │ │ └── end_keyword_loc: (89,0)-(89,3) = "end" - │ │ └── end_keyword_loc: (89,0)-(89,3) = "end" - │ ├── opening_loc: (87,2)-(87,4) = "do" - │ └── closing_loc: (89,0)-(89,3) = "end" - ├── @ CallNode (location: (90,0)-(93,3)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :m - │ ├── message_loc: (90,0)-(90,1) = "m" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (90,2)-(93,3)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ BeginNode (location: (90,2)-(93,3)) - │ │ ├── flags: ∅ - │ │ ├── begin_keyword_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── rescue_clause: - │ │ │ @ RescueNode (location: (91,0)-(91,6)) - │ │ │ ├── flags: ∅ - │ │ │ ├── keyword_loc: (91,0)-(91,6) = "rescue" - │ │ │ ├── exceptions: (length: 0) - │ │ │ ├── operator_loc: ∅ - │ │ │ ├── reference: ∅ - │ │ │ ├── statements: ∅ - │ │ │ └── subsequent: ∅ - │ │ ├── else_clause: ∅ - │ │ ├── ensure_clause: - │ │ │ @ EnsureNode (location: (92,0)-(93,3)) - │ │ │ ├── flags: ∅ - │ │ │ ├── ensure_keyword_loc: (92,0)-(92,6) = "ensure" - │ │ │ ├── statements: ∅ - │ │ │ └── end_keyword_loc: (93,0)-(93,3) = "end" - │ │ └── end_keyword_loc: (93,0)-(93,3) = "end" - │ ├── opening_loc: (90,2)-(90,4) = "do" - │ └── closing_loc: (93,0)-(93,3) = "end" - └── @ CallNode (location: (94,0)-(96,1)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :bar - ├── message_loc: (94,0)-(94,3) = "bar" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (94,4)-(96,1)) - ├── flags: ∅ - ├── locals: [:_1, :_2] - ├── parameters: - │ @ NumberedParametersNode (location: (94,4)-(96,1)) - │ ├── flags: ∅ - │ └── maximum: 2 - ├── body: - │ @ StatementsNode (location: (95,2)-(95,9)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (95,2)-(95,9)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (95,2)-(95,4)) - │ │ ├── flags: ∅ - │ │ ├── name: :_1 - │ │ └── depth: 0 - │ ├── call_operator_loc: ∅ - │ ├── name: :+ - │ ├── message_loc: (95,5)-(95,6) = "+" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (95,7)-(95,9)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ LocalVariableReadNode (location: (95,7)-(95,9)) - │ │ ├── flags: ∅ - │ │ ├── name: :_2 - │ │ └── depth: 0 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── opening_loc: (94,4)-(94,5) = "{" - └── closing_loc: (96,0)-(96,1) = "}" diff --git a/test/prism/snapshots/unparser/corpus/literal/case.txt b/test/prism/snapshots/unparser/corpus/literal/case.txt deleted file mode 100644 index 5e831cc6c3a1c0..00000000000000 --- a/test/prism/snapshots/unparser/corpus/literal/case.txt +++ /dev/null @@ -1,480 +0,0 @@ -@ ProgramNode (location: (1,0)-(37,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(37,3)) - ├── flags: ∅ - └── body: (length: 8) - ├── @ CaseNode (location: (1,0)-(6,3)) - │ ├── flags: newline - │ ├── predicate: ∅ - │ ├── conditions: (length: 2) - │ │ ├── @ WhenNode (location: (2,0)-(3,5)) - │ │ │ ├── flags: ∅ - │ │ │ ├── keyword_loc: (2,0)-(2,4) = "when" - │ │ │ ├── conditions: (length: 1) - │ │ │ │ └── @ CallNode (location: (2,5)-(2,8)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :bar - │ │ │ │ ├── message_loc: (2,5)-(2,8) = "bar" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── then_keyword_loc: ∅ - │ │ │ └── statements: - │ │ │ @ StatementsNode (location: (3,2)-(3,5)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (3,2)-(3,5)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :baz - │ │ │ ├── message_loc: (3,2)-(3,5) = "baz" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── @ WhenNode (location: (4,0)-(5,5)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (4,0)-(4,4) = "when" - │ │ ├── conditions: (length: 1) - │ │ │ └── @ CallNode (location: (4,5)-(4,8)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :baz - │ │ │ ├── message_loc: (4,5)-(4,8) = "baz" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── then_keyword_loc: ∅ - │ │ └── statements: - │ │ @ StatementsNode (location: (5,2)-(5,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (5,2)-(5,5)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (5,2)-(5,5) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (1,0)-(1,4) = "case" - │ └── end_keyword_loc: (6,0)-(6,3) = "end" - ├── @ CaseNode (location: (7,0)-(11,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (7,5)-(7,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (7,5)-(7,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 2) - │ │ ├── @ WhenNode (location: (8,0)-(8,8)) - │ │ │ ├── flags: ∅ - │ │ │ ├── keyword_loc: (8,0)-(8,4) = "when" - │ │ │ ├── conditions: (length: 1) - │ │ │ │ └── @ CallNode (location: (8,5)-(8,8)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :bar - │ │ │ │ ├── message_loc: (8,5)-(8,8) = "bar" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── then_keyword_loc: ∅ - │ │ │ └── statements: ∅ - │ │ └── @ WhenNode (location: (9,0)-(10,5)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (9,0)-(9,4) = "when" - │ │ ├── conditions: (length: 1) - │ │ │ └── @ CallNode (location: (9,5)-(9,8)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :baz - │ │ │ ├── message_loc: (9,5)-(9,8) = "baz" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── then_keyword_loc: ∅ - │ │ └── statements: - │ │ @ StatementsNode (location: (10,2)-(10,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (10,2)-(10,5)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (10,2)-(10,5) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (7,0)-(7,4) = "case" - │ └── end_keyword_loc: (11,0)-(11,3) = "end" - ├── @ CaseNode (location: (12,0)-(17,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (12,5)-(12,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (12,5)-(12,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 2) - │ │ ├── @ WhenNode (location: (13,0)-(14,5)) - │ │ │ ├── flags: ∅ - │ │ │ ├── keyword_loc: (13,0)-(13,4) = "when" - │ │ │ ├── conditions: (length: 1) - │ │ │ │ └── @ CallNode (location: (13,5)-(13,8)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :bar - │ │ │ │ ├── message_loc: (13,5)-(13,8) = "bar" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── then_keyword_loc: ∅ - │ │ │ └── statements: - │ │ │ @ StatementsNode (location: (14,2)-(14,5)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (14,2)-(14,5)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :baz - │ │ │ ├── message_loc: (14,2)-(14,5) = "baz" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── @ WhenNode (location: (15,0)-(16,5)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (15,0)-(15,4) = "when" - │ │ ├── conditions: (length: 1) - │ │ │ └── @ CallNode (location: (15,5)-(15,8)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :baz - │ │ │ ├── message_loc: (15,5)-(15,8) = "baz" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── then_keyword_loc: ∅ - │ │ └── statements: - │ │ @ StatementsNode (location: (16,2)-(16,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (16,2)-(16,5)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (16,2)-(16,5) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (12,0)-(12,4) = "case" - │ └── end_keyword_loc: (17,0)-(17,3) = "end" - ├── @ CaseNode (location: (18,0)-(21,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (18,5)-(18,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (18,5)-(18,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ WhenNode (location: (19,0)-(20,8)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (19,0)-(19,4) = "when" - │ │ ├── conditions: (length: 2) - │ │ │ ├── @ CallNode (location: (19,5)-(19,8)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :bar - │ │ │ │ ├── message_loc: (19,5)-(19,8) = "bar" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── @ CallNode (location: (19,10)-(19,13)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :baz - │ │ │ ├── message_loc: (19,10)-(19,13) = "baz" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── then_keyword_loc: ∅ - │ │ └── statements: - │ │ @ StatementsNode (location: (20,2)-(20,8)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ SymbolNode (location: (20,2)-(20,8)) - │ │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (20,2)-(20,3) = ":" - │ │ ├── value_loc: (20,3)-(20,8) = "other" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "other" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (18,0)-(18,4) = "case" - │ └── end_keyword_loc: (21,0)-(21,3) = "end" - ├── @ CaseNode (location: (22,0)-(25,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (22,5)-(22,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (22,5)-(22,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ WhenNode (location: (23,0)-(24,8)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (23,0)-(23,4) = "when" - │ │ ├── conditions: (length: 1) - │ │ │ └── @ SplatNode (location: (23,5)-(23,9)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (23,5)-(23,6) = "*" - │ │ │ └── expression: - │ │ │ @ CallNode (location: (23,6)-(23,9)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (23,6)-(23,9) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── then_keyword_loc: ∅ - │ │ └── statements: - │ │ @ StatementsNode (location: (24,2)-(24,8)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ SymbolNode (location: (24,2)-(24,8)) - │ │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (24,2)-(24,3) = ":" - │ │ ├── value_loc: (24,3)-(24,8) = "value" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "value" - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (22,0)-(22,4) = "case" - │ └── end_keyword_loc: (25,0)-(25,3) = "end" - ├── @ CaseNode (location: (26,0)-(31,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (26,5)-(26,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (26,5)-(26,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ WhenNode (location: (27,0)-(28,5)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (27,0)-(27,4) = "when" - │ │ ├── conditions: (length: 1) - │ │ │ └── @ CallNode (location: (27,5)-(27,8)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (27,5)-(27,8) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── then_keyword_loc: ∅ - │ │ └── statements: - │ │ @ StatementsNode (location: (28,2)-(28,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (28,2)-(28,5)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :baz - │ │ ├── message_loc: (28,2)-(28,5) = "baz" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── else_clause: - │ │ @ ElseNode (location: (29,0)-(31,3)) - │ │ ├── flags: ∅ - │ │ ├── else_keyword_loc: (29,0)-(29,4) = "else" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (30,2)-(30,6)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ SymbolNode (location: (30,2)-(30,6)) - │ │ │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (30,2)-(30,3) = ":" - │ │ │ ├── value_loc: (30,3)-(30,6) = "foo" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "foo" - │ │ └── end_keyword_loc: (31,0)-(31,3) = "end" - │ ├── case_keyword_loc: (26,0)-(26,4) = "case" - │ └── end_keyword_loc: (31,0)-(31,3) = "end" - ├── @ CaseNode (location: (32,0)-(34,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (32,5)-(32,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (32,5)-(32,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ WhenNode (location: (33,0)-(33,15)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (33,0)-(33,4) = "when" - │ │ ├── conditions: (length: 1) - │ │ │ └── @ SplatNode (location: (33,5)-(33,15)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (33,5)-(33,6) = "*" - │ │ │ └── expression: - │ │ │ @ CallNode (location: (33,6)-(33,15)) - │ │ │ ├── flags: ∅ - │ │ │ ├── receiver: - │ │ │ │ @ CallNode (location: (33,6)-(33,9)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :bar - │ │ │ │ ├── message_loc: (33,6)-(33,9) = "bar" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :| - │ │ │ ├── message_loc: (33,10)-(33,11) = "|" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (33,12)-(33,15)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ CallNode (location: (33,12)-(33,15)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ ├── message_loc: (33,12)-(33,15) = "baz" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── then_keyword_loc: ∅ - │ │ └── statements: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (32,0)-(32,4) = "case" - │ └── end_keyword_loc: (34,0)-(34,3) = "end" - └── @ CaseNode (location: (35,0)-(37,3)) - ├── flags: newline - ├── predicate: - │ @ CallNode (location: (35,5)-(35,8)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (35,5)-(35,8) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── conditions: (length: 1) - │ └── @ WhenNode (location: (36,0)-(36,15)) - │ ├── flags: ∅ - │ ├── keyword_loc: (36,0)-(36,4) = "when" - │ ├── conditions: (length: 1) - │ │ └── @ SplatNode (location: (36,5)-(36,15)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (36,5)-(36,6) = "*" - │ │ └── expression: - │ │ @ CallNode (location: (36,6)-(36,15)) - │ │ ├── flags: attribute_write - │ │ ├── receiver: - │ │ │ @ CallNode (location: (36,6)-(36,9)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (36,6)-(36,9) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: (36,9)-(36,10) = "." - │ │ ├── name: :baz= - │ │ ├── message_loc: (36,10)-(36,13) = "baz" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (36,14)-(36,15)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (36,14)-(36,15)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── then_keyword_loc: ∅ - │ └── statements: ∅ - ├── else_clause: ∅ - ├── case_keyword_loc: (35,0)-(35,4) = "case" - └── end_keyword_loc: (37,0)-(37,3) = "end" diff --git a/test/prism/snapshots/unparser/corpus/literal/class.txt b/test/prism/snapshots/unparser/corpus/literal/class.txt deleted file mode 100644 index add60ce30560a2..00000000000000 --- a/test/prism/snapshots/unparser/corpus/literal/class.txt +++ /dev/null @@ -1,260 +0,0 @@ -@ ProgramNode (location: (1,0)-(35,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(35,3)) - ├── flags: ∅ - └── body: (length: 10) - ├── @ ClassNode (location: (1,0)-(2,3)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── class_keyword_loc: (1,0)-(1,5) = "class" - │ ├── constant_path: - │ │ @ ConstantReadNode (location: (1,6)-(1,7)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── inheritance_operator_loc: ∅ - │ ├── superclass: ∅ - │ ├── body: ∅ - │ ├── end_keyword_loc: (2,0)-(2,3) = "end" - │ └── name: :A - ├── @ SingletonClassNode (location: (4,0)-(5,3)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── class_keyword_loc: (4,0)-(4,5) = "class" - │ ├── operator_loc: (4,6)-(4,8) = "<<" - │ ├── expression: - │ │ @ CallNode (location: (4,9)-(4,10)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (4,9)-(4,10) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ └── end_keyword_loc: (5,0)-(5,3) = "end" - ├── @ SingletonClassNode (location: (7,0)-(9,3)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── class_keyword_loc: (7,0)-(7,5) = "class" - │ ├── operator_loc: (7,6)-(7,8) = "<<" - │ ├── expression: - │ │ @ CallNode (location: (7,9)-(7,10)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (7,9)-(7,10) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (8,2)-(8,3)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (8,2)-(8,3)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :b - │ │ ├── message_loc: (8,2)-(8,3) = "b" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── end_keyword_loc: (9,0)-(9,3) = "end" - ├── @ ClassNode (location: (11,0)-(12,3)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── class_keyword_loc: (11,0)-(11,5) = "class" - │ ├── constant_path: - │ │ @ ConstantPathNode (location: (11,6)-(11,10)) - │ │ ├── flags: ∅ - │ │ ├── parent: - │ │ │ @ ConstantReadNode (location: (11,6)-(11,7)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :A - │ │ ├── name: :B - │ │ ├── delimiter_loc: (11,7)-(11,9) = "::" - │ │ └── name_loc: (11,9)-(11,10) = "B" - │ ├── inheritance_operator_loc: ∅ - │ ├── superclass: ∅ - │ ├── body: ∅ - │ ├── end_keyword_loc: (12,0)-(12,3) = "end" - │ └── name: :B - ├── @ ClassNode (location: (14,0)-(15,3)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── class_keyword_loc: (14,0)-(14,5) = "class" - │ ├── constant_path: - │ │ @ ConstantPathNode (location: (14,6)-(14,13)) - │ │ ├── flags: ∅ - │ │ ├── parent: - │ │ │ @ ConstantPathNode (location: (14,6)-(14,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── parent: - │ │ │ │ @ ConstantReadNode (location: (14,6)-(14,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :A - │ │ │ ├── name: :B - │ │ │ ├── delimiter_loc: (14,7)-(14,9) = "::" - │ │ │ └── name_loc: (14,9)-(14,10) = "B" - │ │ ├── name: :C - │ │ ├── delimiter_loc: (14,10)-(14,12) = "::" - │ │ └── name_loc: (14,12)-(14,13) = "C" - │ ├── inheritance_operator_loc: ∅ - │ ├── superclass: ∅ - │ ├── body: ∅ - │ ├── end_keyword_loc: (15,0)-(15,3) = "end" - │ └── name: :C - ├── @ ClassNode (location: (17,0)-(18,3)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── class_keyword_loc: (17,0)-(17,5) = "class" - │ ├── constant_path: - │ │ @ ConstantReadNode (location: (17,6)-(17,7)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── inheritance_operator_loc: (17,8)-(17,9) = "<" - │ ├── superclass: - │ │ @ ConstantReadNode (location: (17,10)-(17,11)) - │ │ ├── flags: ∅ - │ │ └── name: :B - │ ├── body: ∅ - │ ├── end_keyword_loc: (18,0)-(18,3) = "end" - │ └── name: :A - ├── @ ClassNode (location: (20,0)-(21,3)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── class_keyword_loc: (20,0)-(20,5) = "class" - │ ├── constant_path: - │ │ @ ConstantReadNode (location: (20,6)-(20,7)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── inheritance_operator_loc: (20,8)-(20,9) = "<" - │ ├── superclass: - │ │ @ ConstantPathNode (location: (20,10)-(20,14)) - │ │ ├── flags: ∅ - │ │ ├── parent: - │ │ │ @ ConstantReadNode (location: (20,10)-(20,11)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :B - │ │ ├── name: :C - │ │ ├── delimiter_loc: (20,11)-(20,13) = "::" - │ │ └── name_loc: (20,13)-(20,14) = "C" - │ ├── body: ∅ - │ ├── end_keyword_loc: (21,0)-(21,3) = "end" - │ └── name: :A - ├── @ ClassNode (location: (23,0)-(24,3)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── class_keyword_loc: (23,0)-(23,5) = "class" - │ ├── constant_path: - │ │ @ ConstantPathNode (location: (23,6)-(23,10)) - │ │ ├── flags: ∅ - │ │ ├── parent: - │ │ │ @ ConstantReadNode (location: (23,6)-(23,7)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :A - │ │ ├── name: :B - │ │ ├── delimiter_loc: (23,7)-(23,9) = "::" - │ │ └── name_loc: (23,9)-(23,10) = "B" - │ ├── inheritance_operator_loc: (23,11)-(23,12) = "<" - │ ├── superclass: - │ │ @ ConstantPathNode (location: (23,13)-(23,17)) - │ │ ├── flags: ∅ - │ │ ├── parent: - │ │ │ @ ConstantReadNode (location: (23,13)-(23,14)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :C - │ │ ├── name: :D - │ │ ├── delimiter_loc: (23,14)-(23,16) = "::" - │ │ └── name_loc: (23,16)-(23,17) = "D" - │ ├── body: ∅ - │ ├── end_keyword_loc: (24,0)-(24,3) = "end" - │ └── name: :B - ├── @ ClassNode (location: (26,0)-(32,3)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── class_keyword_loc: (26,0)-(26,5) = "class" - │ ├── constant_path: - │ │ @ ConstantReadNode (location: (26,6)-(26,7)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── inheritance_operator_loc: ∅ - │ ├── superclass: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (27,2)-(31,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 2) - │ │ ├── @ CallNode (location: (27,2)-(27,16)) - │ │ │ ├── flags: newline, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :include - │ │ │ ├── message_loc: (27,2)-(27,9) = "include" - │ │ │ ├── opening_loc: (27,9)-(27,10) = "(" - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (27,10)-(27,15)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ CallNode (location: (27,10)-(27,15)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── receiver: - │ │ │ │ │ @ ConstantReadNode (location: (27,10)-(27,11)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── name: :B - │ │ │ │ ├── call_operator_loc: (27,11)-(27,12) = "." - │ │ │ │ ├── name: :new - │ │ │ │ ├── message_loc: (27,12)-(27,15) = "new" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── closing_loc: (27,15)-(27,16) = ")" - │ │ │ └── block: ∅ - │ │ └── @ DefNode (location: (29,2)-(31,5)) - │ │ ├── flags: newline - │ │ ├── name: :foo - │ │ ├── name_loc: (29,6)-(29,9) = "foo" - │ │ ├── receiver: ∅ - │ │ ├── parameters: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (30,4)-(30,8)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ SymbolNode (location: (30,4)-(30,8)) - │ │ │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (30,4)-(30,5) = ":" - │ │ │ ├── value_loc: (30,5)-(30,8) = "bar" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "bar" - │ │ ├── locals: [] - │ │ ├── def_keyword_loc: (29,2)-(29,5) = "def" - │ │ ├── operator_loc: ∅ - │ │ ├── lparen_loc: ∅ - │ │ ├── rparen_loc: ∅ - │ │ ├── equal_loc: ∅ - │ │ └── end_keyword_loc: (31,2)-(31,5) = "end" - │ ├── end_keyword_loc: (32,0)-(32,3) = "end" - │ └── name: :A - └── @ ClassNode (location: (34,0)-(35,3)) - ├── flags: newline - ├── locals: [] - ├── class_keyword_loc: (34,0)-(34,5) = "class" - ├── constant_path: - │ @ ConstantPathNode (location: (34,6)-(34,9)) - │ ├── flags: ∅ - │ ├── parent: ∅ - │ ├── name: :A - │ ├── delimiter_loc: (34,6)-(34,8) = "::" - │ └── name_loc: (34,8)-(34,9) = "A" - ├── inheritance_operator_loc: ∅ - ├── superclass: ∅ - ├── body: ∅ - ├── end_keyword_loc: (35,0)-(35,3) = "end" - └── name: :A diff --git a/test/prism/snapshots/unparser/corpus/literal/def.txt b/test/prism/snapshots/unparser/corpus/literal/def.txt deleted file mode 100644 index d27977cbde6dfa..00000000000000 --- a/test/prism/snapshots/unparser/corpus/literal/def.txt +++ /dev/null @@ -1,1325 +0,0 @@ -@ ProgramNode (location: (1,0)-(134,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(134,3)) - ├── flags: ∅ - └── body: (length: 30) - ├── @ DefNode (location: (1,0)-(9,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (1,4)-(1,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ BeginNode (location: (1,0)-(9,3)) - │ │ ├── flags: ∅ - │ │ ├── begin_keyword_loc: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (2,2)-(2,3)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (2,2)-(2,3)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :a - │ │ │ ├── message_loc: (2,2)-(2,3) = "a" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── rescue_clause: - │ │ │ @ RescueNode (location: (3,0)-(4,3)) - │ │ │ ├── flags: ∅ - │ │ │ ├── keyword_loc: (3,0)-(3,6) = "rescue" - │ │ │ ├── exceptions: (length: 0) - │ │ │ ├── operator_loc: ∅ - │ │ │ ├── reference: ∅ - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (4,2)-(4,3)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (4,2)-(4,3)) - │ │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :b - │ │ │ │ ├── message_loc: (4,2)-(4,3) = "b" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── subsequent: ∅ - │ │ ├── else_clause: - │ │ │ @ ElseNode (location: (5,0)-(7,6)) - │ │ │ ├── flags: ∅ - │ │ │ ├── else_keyword_loc: (5,0)-(5,4) = "else" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (6,2)-(6,3)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (6,2)-(6,3)) - │ │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :c - │ │ │ │ ├── message_loc: (6,2)-(6,3) = "c" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── end_keyword_loc: (7,0)-(7,6) = "ensure" - │ │ ├── ensure_clause: - │ │ │ @ EnsureNode (location: (7,0)-(9,3)) - │ │ │ ├── flags: ∅ - │ │ │ ├── ensure_keyword_loc: (7,0)-(7,6) = "ensure" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (8,2)-(8,3)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (8,2)-(8,3)) - │ │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :d - │ │ │ │ ├── message_loc: (8,2)-(8,3) = "d" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── end_keyword_loc: (9,0)-(9,3) = "end" - │ │ └── end_keyword_loc: (9,0)-(9,3) = "end" - │ ├── locals: [] - │ ├── def_keyword_loc: (1,0)-(1,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (9,0)-(9,3) = "end" - ├── @ DefNode (location: (11,0)-(19,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (11,4)-(11,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ BeginNode (location: (11,0)-(19,3)) - │ │ ├── flags: ∅ - │ │ ├── begin_keyword_loc: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (12,2)-(12,12)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ RescueModifierNode (location: (12,2)-(12,12)) - │ │ │ ├── flags: newline - │ │ │ ├── expression: - │ │ │ │ @ CallNode (location: (12,2)-(12,3)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :a - │ │ │ │ ├── message_loc: (12,2)-(12,3) = "a" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── keyword_loc: (12,4)-(12,10) = "rescue" - │ │ │ └── rescue_expression: - │ │ │ @ CallNode (location: (12,11)-(12,12)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (12,11)-(12,12) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── rescue_clause: - │ │ │ @ RescueNode (location: (13,0)-(14,3)) - │ │ │ ├── flags: ∅ - │ │ │ ├── keyword_loc: (13,0)-(13,6) = "rescue" - │ │ │ ├── exceptions: (length: 0) - │ │ │ ├── operator_loc: ∅ - │ │ │ ├── reference: ∅ - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (14,2)-(14,3)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (14,2)-(14,3)) - │ │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :b - │ │ │ │ ├── message_loc: (14,2)-(14,3) = "b" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── subsequent: ∅ - │ │ ├── else_clause: - │ │ │ @ ElseNode (location: (15,0)-(17,6)) - │ │ │ ├── flags: ∅ - │ │ │ ├── else_keyword_loc: (15,0)-(15,4) = "else" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (16,2)-(16,3)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (16,2)-(16,3)) - │ │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :c - │ │ │ │ ├── message_loc: (16,2)-(16,3) = "c" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── end_keyword_loc: (17,0)-(17,6) = "ensure" - │ │ ├── ensure_clause: - │ │ │ @ EnsureNode (location: (17,0)-(19,3)) - │ │ │ ├── flags: ∅ - │ │ │ ├── ensure_keyword_loc: (17,0)-(17,6) = "ensure" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (18,2)-(18,3)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (18,2)-(18,3)) - │ │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :d - │ │ │ │ ├── message_loc: (18,2)-(18,3) = "d" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── end_keyword_loc: (19,0)-(19,3) = "end" - │ │ └── end_keyword_loc: (19,0)-(19,3) = "end" - │ ├── locals: [] - │ ├── def_keyword_loc: (11,0)-(11,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (19,0)-(19,3) = "end" - ├── @ DefNode (location: (21,0)-(22,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (21,4)-(21,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (21,8)-(21,18)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 2) - │ │ │ ├── @ RequiredKeywordParameterNode (location: (21,8)-(21,12)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :bar - │ │ │ │ └── name_loc: (21,8)-(21,12) = "bar:" - │ │ │ └── @ RequiredKeywordParameterNode (location: (21,14)-(21,18)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :baz - │ │ │ └── name_loc: (21,14)-(21,18) = "baz:" - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:bar, :baz] - │ ├── def_keyword_loc: (21,0)-(21,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (21,7)-(21,8) = "(" - │ ├── rparen_loc: (21,18)-(21,19) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (22,0)-(22,3) = "end" - ├── @ DefNode (location: (24,0)-(25,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (24,4)-(24,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (24,0)-(24,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (25,0)-(25,3) = "end" - ├── @ DefNode (location: (27,0)-(29,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (27,4)-(27,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (28,2)-(28,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (28,2)-(28,5)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (28,2)-(28,5) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (27,0)-(27,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (29,0)-(29,3) = "end" - ├── @ DefNode (location: (31,0)-(37,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (31,4)-(31,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ BeginNode (location: (31,0)-(37,3)) - │ │ ├── flags: ∅ - │ │ ├── begin_keyword_loc: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (32,2)-(32,5)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (32,2)-(32,5)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (32,2)-(32,5) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── rescue_clause: - │ │ │ @ RescueNode (location: (33,0)-(34,5)) - │ │ │ ├── flags: ∅ - │ │ │ ├── keyword_loc: (33,0)-(33,6) = "rescue" - │ │ │ ├── exceptions: (length: 0) - │ │ │ ├── operator_loc: ∅ - │ │ │ ├── reference: ∅ - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (34,2)-(34,5)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (34,2)-(34,5)) - │ │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :bar - │ │ │ │ ├── message_loc: (34,2)-(34,5) = "bar" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── subsequent: ∅ - │ │ ├── else_clause: ∅ - │ │ ├── ensure_clause: - │ │ │ @ EnsureNode (location: (35,0)-(37,3)) - │ │ │ ├── flags: ∅ - │ │ │ ├── ensure_keyword_loc: (35,0)-(35,6) = "ensure" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (36,2)-(36,5)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (36,2)-(36,5)) - │ │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ ├── message_loc: (36,2)-(36,5) = "baz" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── end_keyword_loc: (37,0)-(37,3) = "end" - │ │ └── end_keyword_loc: (37,0)-(37,3) = "end" - │ ├── locals: [] - │ ├── def_keyword_loc: (31,0)-(31,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (37,0)-(37,3) = "end" - ├── @ DefNode (location: (39,0)-(43,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (39,4)-(39,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ BeginNode (location: (39,0)-(43,3)) - │ │ ├── flags: ∅ - │ │ ├── begin_keyword_loc: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (40,2)-(40,5)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (40,2)-(40,5)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (40,2)-(40,5) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── rescue_clause: ∅ - │ │ ├── else_clause: ∅ - │ │ ├── ensure_clause: - │ │ │ @ EnsureNode (location: (41,0)-(43,3)) - │ │ │ ├── flags: ∅ - │ │ │ ├── ensure_keyword_loc: (41,0)-(41,6) = "ensure" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (42,2)-(42,5)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (42,2)-(42,5)) - │ │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ ├── message_loc: (42,2)-(42,5) = "baz" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── end_keyword_loc: (43,0)-(43,3) = "end" - │ │ └── end_keyword_loc: (43,0)-(43,3) = "end" - │ ├── locals: [] - │ ├── def_keyword_loc: (39,0)-(39,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (43,0)-(43,3) = "end" - ├── @ DefNode (location: (45,0)-(49,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (45,4)-(45,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ BeginNode (location: (45,0)-(49,3)) - │ │ ├── flags: ∅ - │ │ ├── begin_keyword_loc: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (46,2)-(46,5)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (46,2)-(46,5)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (46,2)-(46,5) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── rescue_clause: - │ │ │ @ RescueNode (location: (47,0)-(48,5)) - │ │ │ ├── flags: ∅ - │ │ │ ├── keyword_loc: (47,0)-(47,6) = "rescue" - │ │ │ ├── exceptions: (length: 0) - │ │ │ ├── operator_loc: ∅ - │ │ │ ├── reference: ∅ - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (48,2)-(48,5)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (48,2)-(48,5)) - │ │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ ├── message_loc: (48,2)-(48,5) = "baz" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── subsequent: ∅ - │ │ ├── else_clause: ∅ - │ │ ├── ensure_clause: ∅ - │ │ └── end_keyword_loc: (49,0)-(49,3) = "end" - │ ├── locals: [] - │ ├── def_keyword_loc: (45,0)-(45,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (49,0)-(49,3) = "end" - ├── @ DefNode (location: (51,0)-(53,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (51,4)-(51,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (51,8)-(51,11)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (51,8)-(51,11)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :bar - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (52,2)-(52,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ LocalVariableReadNode (location: (52,2)-(52,5)) - │ │ ├── flags: newline - │ │ ├── name: :bar - │ │ └── depth: 0 - │ ├── locals: [:bar] - │ ├── def_keyword_loc: (51,0)-(51,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (51,7)-(51,8) = "(" - │ ├── rparen_loc: (51,11)-(51,12) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (53,0)-(53,3) = "end" - ├── @ DefNode (location: (55,0)-(57,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (55,4)-(55,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (55,8)-(55,16)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 2) - │ │ │ ├── @ RequiredParameterNode (location: (55,8)-(55,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :bar - │ │ │ └── @ RequiredParameterNode (location: (55,13)-(55,16)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :baz - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (56,2)-(56,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ LocalVariableReadNode (location: (56,2)-(56,5)) - │ │ ├── flags: newline - │ │ ├── name: :bar - │ │ └── depth: 0 - │ ├── locals: [:bar, :baz] - │ ├── def_keyword_loc: (55,0)-(55,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (55,7)-(55,8) = "(" - │ ├── rparen_loc: (55,16)-(55,17) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (57,0)-(57,3) = "end" - ├── @ DefNode (location: (59,0)-(61,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (59,4)-(59,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (59,8)-(59,16)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 1) - │ │ │ └── @ OptionalParameterNode (location: (59,8)-(59,16)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── name_loc: (59,8)-(59,11) = "bar" - │ │ │ ├── operator_loc: (59,12)-(59,13) = "=" - │ │ │ └── value: - │ │ │ @ ParenthesesNode (location: (59,14)-(59,16)) - │ │ │ ├── flags: ∅ - │ │ │ ├── body: ∅ - │ │ │ ├── opening_loc: (59,14)-(59,15) = "(" - │ │ │ └── closing_loc: (59,15)-(59,16) = ")" - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (60,2)-(60,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ LocalVariableReadNode (location: (60,2)-(60,5)) - │ │ ├── flags: newline - │ │ ├── name: :bar - │ │ └── depth: 0 - │ ├── locals: [:bar] - │ ├── def_keyword_loc: (59,0)-(59,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (59,7)-(59,8) = "(" - │ ├── rparen_loc: (59,16)-(59,17) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (61,0)-(61,3) = "end" - ├── @ DefNode (location: (63,0)-(64,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (63,4)-(63,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (63,8)-(63,24)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 1) - │ │ │ └── @ OptionalParameterNode (location: (63,8)-(63,24)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── name_loc: (63,8)-(63,11) = "bar" - │ │ │ ├── operator_loc: (63,12)-(63,13) = "=" - │ │ │ └── value: - │ │ │ @ ParenthesesNode (location: (63,14)-(63,24)) - │ │ │ ├── flags: ∅ - │ │ │ ├── body: - │ │ │ │ @ StatementsNode (location: (63,15)-(63,23)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 2) - │ │ │ │ ├── @ CallNode (location: (63,15)-(63,18)) - │ │ │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :baz - │ │ │ │ │ ├── message_loc: (63,15)-(63,18) = "baz" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ └── @ NilNode (location: (63,20)-(63,23)) - │ │ │ │ └── flags: newline, static_literal - │ │ │ ├── opening_loc: (63,14)-(63,15) = "(" - │ │ │ └── closing_loc: (63,23)-(63,24) = ")" - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:bar] - │ ├── def_keyword_loc: (63,0)-(63,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (63,7)-(63,8) = "(" - │ ├── rparen_loc: (63,24)-(63,25) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (64,0)-(64,3) = "end" - ├── @ DefNode (location: (66,0)-(68,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (66,4)-(66,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (66,8)-(66,18)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 1) - │ │ │ └── @ OptionalParameterNode (location: (66,8)-(66,18)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── name_loc: (66,8)-(66,11) = "bar" - │ │ │ ├── operator_loc: (66,12)-(66,13) = "=" - │ │ │ └── value: - │ │ │ @ TrueNode (location: (66,14)-(66,18)) - │ │ │ └── flags: static_literal - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (67,2)-(67,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ LocalVariableReadNode (location: (67,2)-(67,5)) - │ │ ├── flags: newline - │ │ ├── name: :bar - │ │ └── depth: 0 - │ ├── locals: [:bar] - │ ├── def_keyword_loc: (66,0)-(66,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (66,7)-(66,8) = "(" - │ ├── rparen_loc: (66,18)-(66,19) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (68,0)-(68,3) = "end" - ├── @ DefNode (location: (70,0)-(72,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (70,4)-(70,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (70,8)-(70,23)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (70,8)-(70,11)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :bar - │ │ ├── optionals: (length: 1) - │ │ │ └── @ OptionalParameterNode (location: (70,13)-(70,23)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :baz - │ │ │ ├── name_loc: (70,13)-(70,16) = "baz" - │ │ │ ├── operator_loc: (70,17)-(70,18) = "=" - │ │ │ └── value: - │ │ │ @ TrueNode (location: (70,19)-(70,23)) - │ │ │ └── flags: static_literal - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (71,2)-(71,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ LocalVariableReadNode (location: (71,2)-(71,5)) - │ │ ├── flags: newline - │ │ ├── name: :bar - │ │ └── depth: 0 - │ ├── locals: [:bar, :baz] - │ ├── def_keyword_loc: (70,0)-(70,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (70,7)-(70,8) = "(" - │ ├── rparen_loc: (70,23)-(70,24) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (72,0)-(72,3) = "end" - ├── @ DefNode (location: (74,0)-(75,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (74,4)-(74,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (74,8)-(74,14)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 1) - │ │ │ └── @ OptionalKeywordParameterNode (location: (74,8)-(74,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── name_loc: (74,8)-(74,12) = "bar:" - │ │ │ └── value: - │ │ │ @ IntegerNode (location: (74,13)-(74,14)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:bar] - │ ├── def_keyword_loc: (74,0)-(74,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (74,7)-(74,8) = "(" - │ ├── rparen_loc: (74,14)-(74,15) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (75,0)-(75,3) = "end" - ├── @ DefNode (location: (77,0)-(78,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (77,4)-(77,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (77,8)-(77,16)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 1) - │ │ │ └── @ OptionalKeywordParameterNode (location: (77,8)-(77,16)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── name_loc: (77,8)-(77,12) = "bar:" - │ │ │ └── value: - │ │ │ @ CallNode (location: (77,13)-(77,16)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :baz - │ │ │ ├── message_loc: (77,13)-(77,16) = "baz" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:bar] - │ ├── def_keyword_loc: (77,0)-(77,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (77,7)-(77,8) = "(" - │ ├── rparen_loc: (77,16)-(77,17) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (78,0)-(78,3) = "end" - ├── @ DefNode (location: (80,0)-(81,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (80,4)-(80,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (80,8)-(80,18)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 1) - │ │ │ └── @ OptionalKeywordParameterNode (location: (80,8)-(80,18)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── name_loc: (80,8)-(80,12) = "bar:" - │ │ │ └── value: - │ │ │ @ CallNode (location: (80,13)-(80,18)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (80,13)-(80,16) = "bar" - │ │ │ ├── opening_loc: (80,16)-(80,17) = "(" - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: (80,17)-(80,18) = ")" - │ │ │ └── block: ∅ - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:bar] - │ ├── def_keyword_loc: (80,0)-(80,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (80,7)-(80,8) = "(" - │ ├── rparen_loc: (80,18)-(80,19) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (81,0)-(81,3) = "end" - ├── @ DefNode (location: (83,0)-(85,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (83,4)-(83,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (83,8)-(83,9)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: - │ │ │ @ RestParameterNode (location: (83,8)-(83,9)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: ∅ - │ │ │ ├── name_loc: ∅ - │ │ │ └── operator_loc: (83,8)-(83,9) = "*" - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (84,2)-(84,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (84,2)-(84,5)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (84,2)-(84,5) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (83,0)-(83,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (83,7)-(83,8) = "(" - │ ├── rparen_loc: (83,9)-(83,10) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (85,0)-(85,3) = "end" - ├── @ DefNode (location: (87,0)-(89,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (87,4)-(87,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (87,8)-(87,12)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: - │ │ │ @ RestParameterNode (location: (87,8)-(87,12)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── name_loc: (87,9)-(87,12) = "bar" - │ │ │ └── operator_loc: (87,8)-(87,9) = "*" - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (88,2)-(88,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ LocalVariableReadNode (location: (88,2)-(88,5)) - │ │ ├── flags: newline - │ │ ├── name: :bar - │ │ └── depth: 0 - │ ├── locals: [:bar] - │ ├── def_keyword_loc: (87,0)-(87,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (87,7)-(87,8) = "(" - │ ├── rparen_loc: (87,12)-(87,13) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (89,0)-(89,3) = "end" - ├── @ DefNode (location: (91,0)-(93,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (91,4)-(91,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (91,8)-(91,17)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (91,8)-(91,11)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :bar - │ │ ├── optionals: (length: 0) - │ │ ├── rest: - │ │ │ @ RestParameterNode (location: (91,13)-(91,17)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :baz - │ │ │ ├── name_loc: (91,14)-(91,17) = "baz" - │ │ │ └── operator_loc: (91,13)-(91,14) = "*" - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (92,2)-(92,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ LocalVariableReadNode (location: (92,2)-(92,5)) - │ │ ├── flags: newline - │ │ ├── name: :bar - │ │ └── depth: 0 - │ ├── locals: [:bar, :baz] - │ ├── def_keyword_loc: (91,0)-(91,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (91,7)-(91,8) = "(" - │ ├── rparen_loc: (91,17)-(91,18) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (93,0)-(93,3) = "end" - ├── @ DefNode (location: (95,0)-(97,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (95,4)-(95,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (95,8)-(95,24)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 1) - │ │ │ └── @ OptionalParameterNode (location: (95,8)-(95,18)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :baz - │ │ │ ├── name_loc: (95,8)-(95,11) = "baz" - │ │ │ ├── operator_loc: (95,12)-(95,13) = "=" - │ │ │ └── value: - │ │ │ @ TrueNode (location: (95,14)-(95,18)) - │ │ │ └── flags: static_literal - │ │ ├── rest: - │ │ │ @ RestParameterNode (location: (95,20)-(95,24)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :bor - │ │ │ ├── name_loc: (95,21)-(95,24) = "bor" - │ │ │ └── operator_loc: (95,20)-(95,21) = "*" - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (96,2)-(96,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (96,2)-(96,5)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (96,2)-(96,5) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── locals: [:baz, :bor] - │ ├── def_keyword_loc: (95,0)-(95,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (95,7)-(95,8) = "(" - │ ├── rparen_loc: (95,24)-(95,25) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (97,0)-(97,3) = "end" - ├── @ DefNode (location: (99,0)-(101,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (99,4)-(99,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (99,8)-(99,32)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 1) - │ │ │ └── @ OptionalParameterNode (location: (99,8)-(99,18)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :baz - │ │ │ ├── name_loc: (99,8)-(99,11) = "baz" - │ │ │ ├── operator_loc: (99,12)-(99,13) = "=" - │ │ │ └── value: - │ │ │ @ TrueNode (location: (99,14)-(99,18)) - │ │ │ └── flags: static_literal - │ │ ├── rest: - │ │ │ @ RestParameterNode (location: (99,20)-(99,24)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :bor - │ │ │ ├── name_loc: (99,21)-(99,24) = "bor" - │ │ │ └── operator_loc: (99,20)-(99,21) = "*" - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: - │ │ @ BlockParameterNode (location: (99,26)-(99,32)) - │ │ ├── flags: ∅ - │ │ ├── name: :block - │ │ ├── name_loc: (99,27)-(99,32) = "block" - │ │ └── operator_loc: (99,26)-(99,27) = "&" - │ ├── body: - │ │ @ StatementsNode (location: (100,2)-(100,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (100,2)-(100,5)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (100,2)-(100,5) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── locals: [:baz, :bor, :block] - │ ├── def_keyword_loc: (99,0)-(99,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (99,7)-(99,8) = "(" - │ ├── rparen_loc: (99,32)-(99,33) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (101,0)-(101,3) = "end" - ├── @ DefNode (location: (103,0)-(105,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (103,4)-(103,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (103,8)-(103,29)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (103,8)-(103,11)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :bar - │ │ ├── optionals: (length: 1) - │ │ │ └── @ OptionalParameterNode (location: (103,13)-(103,23)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :baz - │ │ │ ├── name_loc: (103,13)-(103,16) = "baz" - │ │ │ ├── operator_loc: (103,17)-(103,18) = "=" - │ │ │ └── value: - │ │ │ @ TrueNode (location: (103,19)-(103,23)) - │ │ │ └── flags: static_literal - │ │ ├── rest: - │ │ │ @ RestParameterNode (location: (103,25)-(103,29)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :bor - │ │ │ ├── name_loc: (103,26)-(103,29) = "bor" - │ │ │ └── operator_loc: (103,25)-(103,26) = "*" - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (104,2)-(104,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ LocalVariableReadNode (location: (104,2)-(104,5)) - │ │ ├── flags: newline - │ │ ├── name: :bar - │ │ └── depth: 0 - │ ├── locals: [:bar, :baz, :bor] - │ ├── def_keyword_loc: (103,0)-(103,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (103,7)-(103,8) = "(" - │ ├── rparen_loc: (103,29)-(103,30) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (105,0)-(105,3) = "end" - ├── @ DefNode (location: (107,0)-(109,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (107,4)-(107,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (107,8)-(107,14)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: - │ │ @ BlockParameterNode (location: (107,8)-(107,14)) - │ │ ├── flags: ∅ - │ │ ├── name: :block - │ │ ├── name_loc: (107,9)-(107,14) = "block" - │ │ └── operator_loc: (107,8)-(107,9) = "&" - │ ├── body: - │ │ @ StatementsNode (location: (108,2)-(108,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (108,2)-(108,5)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (108,2)-(108,5) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── locals: [:block] - │ ├── def_keyword_loc: (107,0)-(107,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (107,7)-(107,8) = "(" - │ ├── rparen_loc: (107,14)-(107,15) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (109,0)-(109,3) = "end" - ├── @ DefNode (location: (111,0)-(113,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (111,4)-(111,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (111,8)-(111,19)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (111,8)-(111,11)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :bar - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: - │ │ @ BlockParameterNode (location: (111,13)-(111,19)) - │ │ ├── flags: ∅ - │ │ ├── name: :block - │ │ ├── name_loc: (111,14)-(111,19) = "block" - │ │ └── operator_loc: (111,13)-(111,14) = "&" - │ ├── body: - │ │ @ StatementsNode (location: (112,2)-(112,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ LocalVariableReadNode (location: (112,2)-(112,5)) - │ │ ├── flags: newline - │ │ ├── name: :bar - │ │ └── depth: 0 - │ ├── locals: [:bar, :block] - │ ├── def_keyword_loc: (111,0)-(111,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (111,7)-(111,8) = "(" - │ ├── rparen_loc: (111,19)-(111,20) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (113,0)-(113,3) = "end" - ├── @ DefNode (location: (115,0)-(118,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (115,4)-(115,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (116,2)-(117,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 2) - │ │ ├── @ CallNode (location: (116,2)-(116,5)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (116,2)-(116,5) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── @ CallNode (location: (117,2)-(117,5)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :baz - │ │ ├── message_loc: (117,2)-(117,5) = "baz" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (115,0)-(115,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (118,0)-(118,3) = "end" - ├── @ DefNode (location: (120,0)-(121,3)) - │ ├── flags: newline - │ ├── name: :f - │ ├── name_loc: (120,4)-(120,5) = "f" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (120,6)-(120,11)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ MultiTargetNode (location: (120,6)-(120,11)) - │ │ │ ├── flags: ∅ - │ │ │ ├── lefts: (length: 1) - │ │ │ │ └── @ MultiTargetNode (location: (120,7)-(120,10)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── lefts: (length: 1) - │ │ │ │ │ └── @ RequiredParameterNode (location: (120,8)-(120,9)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── name: :a - │ │ │ │ ├── rest: ∅ - │ │ │ │ ├── rights: (length: 0) - │ │ │ │ ├── lparen_loc: (120,7)-(120,8) = "(" - │ │ │ │ └── rparen_loc: (120,9)-(120,10) = ")" - │ │ │ ├── rest: ∅ - │ │ │ ├── rights: (length: 0) - │ │ │ ├── lparen_loc: (120,6)-(120,7) = "(" - │ │ │ └── rparen_loc: (120,10)-(120,11) = ")" - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:a] - │ ├── def_keyword_loc: (120,0)-(120,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (120,5)-(120,6) = "(" - │ ├── rparen_loc: (120,11)-(120,12) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (121,0)-(121,3) = "end" - ├── @ DefNode (location: (123,0)-(124,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (123,4)-(123,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (123,8)-(123,26)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 2) - │ │ │ ├── @ RequiredKeywordParameterNode (location: (123,8)-(123,12)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :bar - │ │ │ │ └── name_loc: (123,8)-(123,12) = "bar:" - │ │ │ └── @ OptionalKeywordParameterNode (location: (123,14)-(123,26)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :baz - │ │ │ ├── name_loc: (123,14)-(123,18) = "baz:" - │ │ │ └── value: - │ │ │ @ StringNode (location: (123,19)-(123,26)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (123,19)-(123,20) = "\"" - │ │ │ ├── content_loc: (123,20)-(123,25) = "value" - │ │ │ ├── closing_loc: (123,25)-(123,26) = "\"" - │ │ │ └── unescaped: "value" - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:bar, :baz] - │ ├── def_keyword_loc: (123,0)-(123,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (123,7)-(123,8) = "(" - │ ├── rparen_loc: (123,26)-(123,27) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (124,0)-(124,3) = "end" - ├── @ DefNode (location: (126,0)-(130,3)) - │ ├── flags: newline - │ ├── name: :f - │ ├── name_loc: (126,4)-(126,5) = "f" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (127,2)-(127,12)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ InterpolatedStringNode (location: (127,2)-(127,12)) - │ │ ├── flags: newline - │ │ ├── opening_loc: (127,2)-(127,12) = "<<-HEREDOC" - │ │ ├── parts: (length: 3) - │ │ │ ├── @ StringNode (location: (128,0)-(128,4)) - │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── content_loc: (128,0)-(128,4) = " " - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: " " - │ │ │ ├── @ EmbeddedStatementsNode (location: (128,4)-(128,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── opening_loc: (128,4)-(128,6) = "\#{" - │ │ │ │ ├── statements: ∅ - │ │ │ │ └── closing_loc: (128,6)-(128,7) = "}" - │ │ │ └── @ StringNode (location: (128,7)-(129,0)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (128,7)-(129,0) = "\n" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "\n" - │ │ └── closing_loc: (129,0)-(130,0) = " HEREDOC\n" - │ ├── locals: [] - │ ├── def_keyword_loc: (126,0)-(126,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (130,0)-(130,3) = "end" - └── @ DefNode (location: (132,0)-(134,3)) - ├── flags: newline - ├── name: :f - ├── name_loc: (132,4)-(132,5) = "f" - ├── receiver: ∅ - ├── parameters: ∅ - ├── body: - │ @ StatementsNode (location: (133,2)-(133,5)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ StringNode (location: (133,2)-(133,5)) - │ ├── flags: newline - │ ├── opening_loc: (133,2)-(133,4) = "%(" - │ ├── content_loc: (133,4)-(133,4) = "" - │ ├── closing_loc: (133,4)-(133,5) = ")" - │ └── unescaped: "" - ├── locals: [] - ├── def_keyword_loc: (132,0)-(132,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: ∅ - ├── rparen_loc: ∅ - ├── equal_loc: ∅ - └── end_keyword_loc: (134,0)-(134,3) = "end" diff --git a/test/prism/snapshots/unparser/corpus/literal/defined.txt b/test/prism/snapshots/unparser/corpus/literal/defined.txt deleted file mode 100644 index d1b5a15685e0d3..00000000000000 --- a/test/prism/snapshots/unparser/corpus/literal/defined.txt +++ /dev/null @@ -1,67 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,27)) -├── flags: ∅ -├── locals: [:a, :b] -└── statements: - @ StatementsNode (location: (1,0)-(3,27)) - ├── flags: ∅ - └── body: (length: 3) - ├── @ DefinedNode (location: (1,0)-(1,14)) - │ ├── flags: newline - │ ├── lparen_loc: (1,8)-(1,9) = "(" - │ ├── value: - │ │ @ InstanceVariableReadNode (location: (1,9)-(1,13)) - │ │ ├── flags: ∅ - │ │ └── name: :@foo - │ ├── rparen_loc: (1,13)-(1,14) = ")" - │ └── keyword_loc: (1,0)-(1,8) = "defined?" - ├── @ DefinedNode (location: (2,0)-(2,13)) - │ ├── flags: newline - │ ├── lparen_loc: (2,8)-(2,9) = "(" - │ ├── value: - │ │ @ ConstantReadNode (location: (2,9)-(2,12)) - │ │ ├── flags: ∅ - │ │ └── name: :Foo - │ ├── rparen_loc: (2,12)-(2,13) = ")" - │ └── keyword_loc: (2,0)-(2,8) = "defined?" - └── @ DefinedNode (location: (3,0)-(3,27)) - ├── flags: newline - ├── lparen_loc: (3,8)-(3,9) = "(" - ├── value: - │ @ ParenthesesNode (location: (3,9)-(3,26)) - │ ├── flags: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (3,10)-(3,25)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ MultiWriteNode (location: (3,10)-(3,25)) - │ │ ├── flags: newline - │ │ ├── lefts: (length: 2) - │ │ │ ├── @ LocalVariableTargetNode (location: (3,11)-(3,12)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :a - │ │ │ │ └── depth: 0 - │ │ │ └── @ LocalVariableTargetNode (location: (3,14)-(3,15)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :b - │ │ │ └── depth: 0 - │ │ ├── rest: ∅ - │ │ ├── rights: (length: 0) - │ │ ├── lparen_loc: (3,10)-(3,11) = "(" - │ │ ├── rparen_loc: (3,15)-(3,16) = ")" - │ │ ├── operator_loc: (3,17)-(3,18) = "=" - │ │ └── value: - │ │ @ ArrayNode (location: (3,19)-(3,25)) - │ │ ├── flags: static_literal - │ │ ├── elements: (length: 2) - │ │ │ ├── @ IntegerNode (location: (3,20)-(3,21)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ └── @ IntegerNode (location: (3,23)-(3,24)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ ├── opening_loc: (3,19)-(3,20) = "[" - │ │ └── closing_loc: (3,24)-(3,25) = "]" - │ ├── opening_loc: (3,9)-(3,10) = "(" - │ └── closing_loc: (3,25)-(3,26) = ")" - ├── rparen_loc: (3,26)-(3,27) = ")" - └── keyword_loc: (3,0)-(3,8) = "defined?" diff --git a/test/prism/snapshots/unparser/corpus/literal/defs.txt b/test/prism/snapshots/unparser/corpus/literal/defs.txt deleted file mode 100644 index 33c24f3b24ef74..00000000000000 --- a/test/prism/snapshots/unparser/corpus/literal/defs.txt +++ /dev/null @@ -1,395 +0,0 @@ -@ ProgramNode (location: (1,0)-(40,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(40,3)) - ├── flags: ∅ - └── body: (length: 10) - ├── @ DefNode (location: (1,0)-(2,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (1,9)-(1,12) = "foo" - │ ├── receiver: - │ │ @ SelfNode (location: (1,4)-(1,8)) - │ │ └── flags: ∅ - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (1,0)-(1,3) = "def" - │ ├── operator_loc: (1,8)-(1,9) = "." - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (2,0)-(2,3) = "end" - ├── @ DefNode (location: (4,0)-(6,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (4,9)-(4,12) = "foo" - │ ├── receiver: - │ │ @ SelfNode (location: (4,4)-(4,8)) - │ │ └── flags: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (5,2)-(5,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (5,2)-(5,5)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (5,2)-(5,5) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (4,0)-(4,3) = "def" - │ ├── operator_loc: (4,8)-(4,9) = "." - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (6,0)-(6,3) = "end" - ├── @ DefNode (location: (8,0)-(11,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (8,9)-(8,12) = "foo" - │ ├── receiver: - │ │ @ SelfNode (location: (8,4)-(8,8)) - │ │ └── flags: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (9,2)-(10,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 2) - │ │ ├── @ CallNode (location: (9,2)-(9,5)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (9,2)-(9,5) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── @ CallNode (location: (10,2)-(10,5)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :baz - │ │ ├── message_loc: (10,2)-(10,5) = "baz" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (8,0)-(8,3) = "def" - │ ├── operator_loc: (8,8)-(8,9) = "." - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (11,0)-(11,3) = "end" - ├── @ DefNode (location: (13,0)-(15,3)) - │ ├── flags: newline - │ ├── name: :bar - │ ├── name_loc: (13,8)-(13,11) = "bar" - │ ├── receiver: - │ │ @ ConstantReadNode (location: (13,4)-(13,7)) - │ │ ├── flags: ∅ - │ │ └── name: :Foo - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (14,2)-(14,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (14,2)-(14,5)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (14,2)-(14,5) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (13,0)-(13,3) = "def" - │ ├── operator_loc: (13,7)-(13,8) = "." - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (15,0)-(15,3) = "end" - ├── @ DefNode (location: (17,0)-(20,3)) - │ ├── flags: newline - │ ├── name: :bar - │ ├── name_loc: (18,3)-(18,6) = "bar" - │ ├── receiver: - │ │ @ ParenthesesNode (location: (17,4)-(18,2)) - │ │ ├── flags: ∅ - │ │ ├── body: - │ │ │ @ CallNode (location: (17,5)-(18,1)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (17,5)-(17,8) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: - │ │ │ @ BlockNode (location: (17,9)-(18,1)) - │ │ │ ├── flags: ∅ - │ │ │ ├── locals: [:bar] - │ │ │ ├── parameters: - │ │ │ │ @ BlockParametersNode (location: (17,11)-(17,16)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── parameters: - │ │ │ │ │ @ ParametersNode (location: (17,12)-(17,15)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── requireds: (length: 1) - │ │ │ │ │ │ └── @ RequiredParameterNode (location: (17,12)-(17,15)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ └── name: :bar - │ │ │ │ │ ├── optionals: (length: 0) - │ │ │ │ │ ├── rest: ∅ - │ │ │ │ │ ├── posts: (length: 0) - │ │ │ │ │ ├── keywords: (length: 0) - │ │ │ │ │ ├── keyword_rest: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── locals: (length: 0) - │ │ │ │ ├── opening_loc: (17,11)-(17,12) = "|" - │ │ │ │ └── closing_loc: (17,15)-(17,16) = "|" - │ │ │ ├── body: ∅ - │ │ │ ├── opening_loc: (17,9)-(17,10) = "{" - │ │ │ └── closing_loc: (18,0)-(18,1) = "}" - │ │ ├── opening_loc: (17,4)-(17,5) = "(" - │ │ └── closing_loc: (18,1)-(18,2) = ")" - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (19,2)-(19,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (19,2)-(19,5)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (19,2)-(19,5) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (17,0)-(17,3) = "def" - │ ├── operator_loc: (18,2)-(18,3) = "." - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (20,0)-(20,3) = "end" - ├── @ DefNode (location: (22,0)-(24,3)) - │ ├── flags: newline - │ ├── name: :bar - │ ├── name_loc: (22,13)-(22,16) = "bar" - │ ├── receiver: - │ │ @ ParenthesesNode (location: (22,4)-(22,12)) - │ │ ├── flags: ∅ - │ │ ├── body: - │ │ │ @ CallNode (location: (22,5)-(22,11)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (22,5)-(22,8) = "foo" - │ │ │ ├── opening_loc: (22,8)-(22,9) = "(" - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (22,9)-(22,10)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ IntegerNode (location: (22,9)-(22,10)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ ├── closing_loc: (22,10)-(22,11) = ")" - │ │ │ └── block: ∅ - │ │ ├── opening_loc: (22,4)-(22,5) = "(" - │ │ └── closing_loc: (22,11)-(22,12) = ")" - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (23,2)-(23,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (23,2)-(23,5)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (23,2)-(23,5) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (22,0)-(22,3) = "def" - │ ├── operator_loc: (22,12)-(22,13) = "." - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (24,0)-(24,3) = "end" - ├── @ DefNode (location: (26,0)-(28,3)) - │ ├── flags: newline - │ ├── name: :bar - │ ├── name_loc: (26,19)-(26,22) = "bar" - │ ├── receiver: - │ │ @ ParenthesesNode (location: (26,4)-(26,18)) - │ │ ├── flags: ∅ - │ │ ├── body: - │ │ │ @ CallNode (location: (26,5)-(26,17)) - │ │ │ ├── flags: ∅ - │ │ │ ├── receiver: - │ │ │ │ @ ConstantPathNode (location: (26,5)-(26,13)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── parent: - │ │ │ │ │ @ ConstantReadNode (location: (26,5)-(26,8)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── name: :Foo - │ │ │ │ ├── name: :Bar - │ │ │ │ ├── delimiter_loc: (26,8)-(26,10) = "::" - │ │ │ │ └── name_loc: (26,10)-(26,13) = "Bar" - │ │ │ ├── call_operator_loc: (26,13)-(26,14) = "." - │ │ │ ├── name: :baz - │ │ │ ├── message_loc: (26,14)-(26,17) = "baz" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── opening_loc: (26,4)-(26,5) = "(" - │ │ └── closing_loc: (26,17)-(26,18) = ")" - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (27,2)-(27,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (27,2)-(27,5)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :baz - │ │ ├── message_loc: (27,2)-(27,5) = "baz" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (26,0)-(26,3) = "def" - │ ├── operator_loc: (26,18)-(26,19) = "." - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (28,0)-(28,3) = "end" - ├── @ DefNode (location: (30,0)-(32,3)) - │ ├── flags: newline - │ ├── name: :bar - │ ├── name_loc: (30,15)-(30,18) = "bar" - │ ├── receiver: - │ │ @ ParenthesesNode (location: (30,4)-(30,14)) - │ │ ├── flags: ∅ - │ │ ├── body: - │ │ │ @ ConstantPathNode (location: (30,5)-(30,13)) - │ │ │ ├── flags: ∅ - │ │ │ ├── parent: - │ │ │ │ @ ConstantReadNode (location: (30,5)-(30,8)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :Foo - │ │ │ ├── name: :Bar - │ │ │ ├── delimiter_loc: (30,8)-(30,10) = "::" - │ │ │ └── name_loc: (30,10)-(30,13) = "Bar" - │ │ ├── opening_loc: (30,4)-(30,5) = "(" - │ │ └── closing_loc: (30,13)-(30,14) = ")" - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (31,2)-(31,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (31,2)-(31,5)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :baz - │ │ ├── message_loc: (31,2)-(31,5) = "baz" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (30,0)-(30,3) = "def" - │ ├── operator_loc: (30,14)-(30,15) = "." - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (32,0)-(32,3) = "end" - ├── @ DefNode (location: (34,0)-(36,3)) - │ ├── flags: newline - │ ├── name: :bar - │ ├── name_loc: (34,8)-(34,11) = "bar" - │ ├── receiver: - │ │ @ ConstantReadNode (location: (34,4)-(34,7)) - │ │ ├── flags: ∅ - │ │ └── name: :Foo - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (35,2)-(35,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (35,2)-(35,5)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :baz - │ │ ├── message_loc: (35,2)-(35,5) = "baz" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (34,0)-(34,3) = "def" - │ ├── operator_loc: (34,7)-(34,8) = "." - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (36,0)-(36,3) = "end" - └── @ DefNode (location: (38,0)-(40,3)) - ├── flags: newline - ├── name: :bar - ├── name_loc: (38,8)-(38,11) = "bar" - ├── receiver: - │ @ CallNode (location: (38,4)-(38,7)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (38,4)-(38,7) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── parameters: ∅ - ├── body: - │ @ StatementsNode (location: (39,2)-(39,5)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (39,2)-(39,5)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :baz - │ ├── message_loc: (39,2)-(39,5) = "baz" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── locals: [] - ├── def_keyword_loc: (38,0)-(38,3) = "def" - ├── operator_loc: (38,7)-(38,8) = "." - ├── lparen_loc: ∅ - ├── rparen_loc: ∅ - ├── equal_loc: ∅ - └── end_keyword_loc: (40,0)-(40,3) = "end" diff --git a/test/prism/snapshots/unparser/corpus/literal/dstr.txt b/test/prism/snapshots/unparser/corpus/literal/dstr.txt deleted file mode 100644 index 64cb3ff1b20e65..00000000000000 --- a/test/prism/snapshots/unparser/corpus/literal/dstr.txt +++ /dev/null @@ -1,389 +0,0 @@ -@ ProgramNode (location: (1,0)-(37,1)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(37,1)) - ├── flags: ∅ - └── body: (length: 11) - ├── @ IfNode (location: (1,0)-(3,3)) - │ ├── flags: newline - │ ├── if_keyword_loc: (1,0)-(1,2) = "if" - │ ├── predicate: - │ │ @ TrueNode (location: (1,3)-(1,7)) - │ │ └── flags: static_literal - │ ├── then_keyword_loc: ∅ - │ ├── statements: - │ │ @ StatementsNode (location: (2,2)-(2,8)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ InterpolatedStringNode (location: (2,2)-(2,8)) - │ │ ├── flags: newline - │ │ ├── opening_loc: (2,2)-(2,3) = "\"" - │ │ ├── parts: (length: 2) - │ │ │ ├── @ EmbeddedStatementsNode (location: (2,3)-(2,6)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── opening_loc: (2,3)-(2,5) = "\#{" - │ │ │ │ ├── statements: ∅ - │ │ │ │ └── closing_loc: (2,5)-(2,6) = "}" - │ │ │ └── @ StringNode (location: (2,6)-(2,7)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (2,6)-(2,7) = "a" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "a" - │ │ └── closing_loc: (2,7)-(2,8) = "\"" - │ ├── subsequent: ∅ - │ └── end_keyword_loc: (3,0)-(3,3) = "end" - ├── @ IfNode (location: (4,0)-(11,3)) - │ ├── flags: newline - │ ├── if_keyword_loc: (4,0)-(4,2) = "if" - │ ├── predicate: - │ │ @ TrueNode (location: (4,3)-(4,7)) - │ │ └── flags: static_literal - │ ├── then_keyword_loc: ∅ - │ ├── statements: - │ │ @ StatementsNode (location: (5,2)-(10,3)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 2) - │ │ ├── @ InterpolatedStringNode (location: (5,2)-(5,12)) - │ │ │ ├── flags: newline - │ │ │ ├── opening_loc: (5,2)-(5,12) = "<<-HEREDOC" - │ │ │ ├── parts: (length: 3) - │ │ │ │ ├── @ StringNode (location: (6,0)-(7,0)) - │ │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── content_loc: (6,0)-(7,0) = "a\n" - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── unescaped: "a\n" - │ │ │ │ ├── @ EmbeddedStatementsNode (location: (7,0)-(7,3)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── opening_loc: (7,0)-(7,2) = "\#{" - │ │ │ │ │ ├── statements: ∅ - │ │ │ │ │ └── closing_loc: (7,2)-(7,3) = "}" - │ │ │ │ └── @ StringNode (location: (7,3)-(9,0)) - │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── content_loc: (7,3)-(9,0) = "a\nb\n" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "a\nb\n" - │ │ │ └── closing_loc: (9,0)-(10,0) = " HEREDOC\n" - │ │ └── @ CallNode (location: (10,2)-(10,3)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :x - │ │ ├── message_loc: (10,2)-(10,3) = "x" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── subsequent: ∅ - │ └── end_keyword_loc: (11,0)-(11,3) = "end" - ├── @ InterpolatedStringNode (location: (12,0)-(12,10)) - │ ├── flags: newline - │ ├── opening_loc: (12,0)-(12,10) = "<<-HEREDOC" - │ ├── parts: (length: 7) - │ │ ├── @ StringNode (location: (13,0)-(14,0)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (13,0)-(14,0) = "\\\#{}\\\#{}\n" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "\#{}\#{}\n" - │ │ ├── @ EmbeddedStatementsNode (location: (14,0)-(14,3)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (14,0)-(14,2) = "\#{" - │ │ │ ├── statements: ∅ - │ │ │ └── closing_loc: (14,2)-(14,3) = "}" - │ │ ├── @ StringNode (location: (14,3)-(15,0)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (14,3)-(15,0) = "\n" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "\n" - │ │ ├── @ EmbeddedStatementsNode (location: (15,0)-(15,3)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (15,0)-(15,2) = "\#{" - │ │ │ ├── statements: ∅ - │ │ │ └── closing_loc: (15,2)-(15,3) = "}" - │ │ ├── @ StringNode (location: (15,3)-(16,0)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (15,3)-(16,0) = "\n" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "\n" - │ │ ├── @ EmbeddedStatementsNode (location: (16,0)-(16,3)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (16,0)-(16,2) = "\#{" - │ │ │ ├── statements: ∅ - │ │ │ └── closing_loc: (16,2)-(16,3) = "}" - │ │ └── @ StringNode (location: (16,3)-(17,0)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (16,3)-(17,0) = "\n" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "\n" - │ └── closing_loc: (17,0)-(18,0) = "HEREDOC\n" - ├── @ RescueModifierNode (location: (18,0)-(18,21)) - │ ├── flags: newline - │ ├── expression: - │ │ @ InterpolatedStringNode (location: (18,0)-(18,10)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (18,0)-(18,10) = "<<-HEREDOC" - │ │ ├── parts: (length: 2) - │ │ │ ├── @ EmbeddedStatementsNode (location: (19,0)-(19,3)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── opening_loc: (19,0)-(19,2) = "\#{" - │ │ │ │ ├── statements: ∅ - │ │ │ │ └── closing_loc: (19,2)-(19,3) = "}" - │ │ │ └── @ StringNode (location: (19,3)-(21,0)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (19,3)-(21,0) = "\na\n" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "\na\n" - │ │ └── closing_loc: (21,0)-(22,0) = "HEREDOC\n" - │ ├── keyword_loc: (18,11)-(18,17) = "rescue" - │ └── rescue_expression: - │ @ NilNode (location: (18,18)-(18,21)) - │ └── flags: static_literal - ├── @ InterpolatedStringNode (location: (22,0)-(22,6)) - │ ├── flags: newline - │ ├── opening_loc: (22,0)-(22,1) = "\"" - │ ├── parts: (length: 2) - │ │ ├── @ StringNode (location: (22,1)-(22,2)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (22,1)-(22,2) = "a" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "a" - │ │ └── @ EmbeddedVariableNode (location: (22,2)-(22,5)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (22,2)-(22,3) = "#" - │ │ └── variable: - │ │ @ NumberedReferenceReadNode (location: (22,3)-(22,5)) - │ │ ├── flags: ∅ - │ │ └── number: 1 - │ └── closing_loc: (22,5)-(22,6) = "\"" - ├── @ InterpolatedStringNode (location: (23,0)-(23,6)) - │ ├── flags: newline - │ ├── opening_loc: (23,0)-(23,1) = "\"" - │ ├── parts: (length: 2) - │ │ ├── @ StringNode (location: (23,1)-(23,2)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (23,1)-(23,2) = "a" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "a" - │ │ └── @ EmbeddedVariableNode (location: (23,2)-(23,5)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (23,2)-(23,3) = "#" - │ │ └── variable: - │ │ @ GlobalVariableReadNode (location: (23,3)-(23,5)) - │ │ ├── flags: ∅ - │ │ └── name: :$a - │ └── closing_loc: (23,5)-(23,6) = "\"" - ├── @ InterpolatedStringNode (location: (24,0)-(24,6)) - │ ├── flags: newline - │ ├── opening_loc: (24,0)-(24,1) = "\"" - │ ├── parts: (length: 2) - │ │ ├── @ StringNode (location: (24,1)-(24,2)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (24,1)-(24,2) = "a" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "a" - │ │ └── @ EmbeddedVariableNode (location: (24,2)-(24,5)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (24,2)-(24,3) = "#" - │ │ └── variable: - │ │ @ InstanceVariableReadNode (location: (24,3)-(24,5)) - │ │ ├── flags: ∅ - │ │ └── name: :@a - │ └── closing_loc: (24,5)-(24,6) = "\"" - ├── @ InterpolatedStringNode (location: (25,0)-(25,7)) - │ ├── flags: newline - │ ├── opening_loc: (25,0)-(25,1) = "\"" - │ ├── parts: (length: 2) - │ │ ├── @ StringNode (location: (25,1)-(25,2)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (25,1)-(25,2) = "a" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "a" - │ │ └── @ EmbeddedVariableNode (location: (25,2)-(25,6)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (25,2)-(25,3) = "#" - │ │ └── variable: - │ │ @ ClassVariableReadNode (location: (25,3)-(25,6)) - │ │ ├── flags: ∅ - │ │ └── name: :@@a - │ └── closing_loc: (25,6)-(25,7) = "\"" - ├── @ IfNode (location: (26,0)-(30,3)) - │ ├── flags: newline - │ ├── if_keyword_loc: (26,0)-(26,2) = "if" - │ ├── predicate: - │ │ @ TrueNode (location: (26,3)-(26,7)) - │ │ └── flags: static_literal - │ ├── then_keyword_loc: ∅ - │ ├── statements: - │ │ @ StatementsNode (location: (27,2)-(27,19)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ ReturnNode (location: (27,2)-(27,19)) - │ │ ├── flags: newline - │ │ ├── keyword_loc: (27,2)-(27,8) = "return" - │ │ └── arguments: - │ │ @ ArgumentsNode (location: (27,9)-(27,19)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ InterpolatedStringNode (location: (27,9)-(27,19)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (27,9)-(27,19) = "<<-HEREDOC" - │ │ ├── parts: (length: 3) - │ │ │ ├── @ StringNode (location: (28,0)-(28,4)) - │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── content_loc: (28,0)-(28,4) = " " - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: " " - │ │ │ ├── @ EmbeddedStatementsNode (location: (28,4)-(28,9)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── opening_loc: (28,4)-(28,6) = "\#{" - │ │ │ │ ├── statements: - │ │ │ │ │ @ StatementsNode (location: (28,6)-(28,8)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── body: (length: 1) - │ │ │ │ │ └── @ IntegerNode (location: (28,6)-(28,8)) - │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ └── value: 42 - │ │ │ │ └── closing_loc: (28,8)-(28,9) = "}" - │ │ │ └── @ StringNode (location: (28,9)-(29,0)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (28,9)-(29,0) = "\n" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "\n" - │ │ └── closing_loc: (29,0)-(30,0) = " HEREDOC\n" - │ ├── subsequent: ∅ - │ └── end_keyword_loc: (30,0)-(30,3) = "end" - ├── @ CallNode (location: (31,0)-(31,15)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (31,0)-(31,3) = "foo" - │ ├── opening_loc: (31,3)-(31,4) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (31,4)-(31,14)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ InterpolatedStringNode (location: (31,4)-(31,14)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (31,4)-(31,14) = "<<-HEREDOC" - │ │ ├── parts: (length: 3) - │ │ │ ├── @ StringNode (location: (32,0)-(32,2)) - │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── content_loc: (32,0)-(32,2) = " " - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: " " - │ │ │ ├── @ EmbeddedStatementsNode (location: (32,2)-(32,8)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── opening_loc: (32,2)-(32,4) = "\#{" - │ │ │ │ ├── statements: - │ │ │ │ │ @ StatementsNode (location: (32,4)-(32,7)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── body: (length: 1) - │ │ │ │ │ └── @ CallNode (location: (32,4)-(32,7)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :bar - │ │ │ │ │ ├── message_loc: (32,4)-(32,7) = "bar" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ └── closing_loc: (32,7)-(32,8) = "}" - │ │ │ └── @ StringNode (location: (32,8)-(33,0)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (32,8)-(33,0) = "\n" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "\n" - │ │ └── closing_loc: (33,0)-(34,0) = "HEREDOC\n" - │ ├── closing_loc: (31,14)-(31,15) = ")" - │ └── block: ∅ - └── @ CallNode (location: (34,0)-(37,1)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :foo - ├── message_loc: (34,0)-(34,3) = "foo" - ├── opening_loc: (34,3)-(34,4) = "(" - ├── arguments: - │ @ ArgumentsNode (location: (34,4)-(34,14)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ InterpolatedStringNode (location: (34,4)-(34,14)) - │ ├── flags: ∅ - │ ├── opening_loc: (34,4)-(34,14) = "<<-HEREDOC" - │ ├── parts: (length: 3) - │ │ ├── @ StringNode (location: (35,0)-(35,2)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (35,0)-(35,2) = " " - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: " " - │ │ ├── @ EmbeddedStatementsNode (location: (35,2)-(35,8)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (35,2)-(35,4) = "\#{" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (35,4)-(35,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (35,4)-(35,7)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :bar - │ │ │ │ ├── message_loc: (35,4)-(35,7) = "bar" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── closing_loc: (35,7)-(35,8) = "}" - │ │ └── @ StringNode (location: (35,8)-(36,0)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (35,8)-(36,0) = "\n" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "\n" - │ └── closing_loc: (36,0)-(37,0) = "HEREDOC\n" - ├── closing_loc: (34,14)-(34,15) = ")" - └── block: - @ BlockNode (location: (34,16)-(37,1)) - ├── flags: ∅ - ├── locals: [:x] - ├── parameters: - │ @ BlockParametersNode (location: (34,18)-(34,21)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (34,19)-(34,20)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (34,19)-(34,20)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :x - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (34,18)-(34,19) = "|" - │ └── closing_loc: (34,20)-(34,21) = "|" - ├── body: ∅ - ├── opening_loc: (34,16)-(34,17) = "{" - └── closing_loc: (37,0)-(37,1) = "}" diff --git a/test/prism/snapshots/unparser/corpus/literal/empty.txt b/test/prism/snapshots/unparser/corpus/literal/empty.txt deleted file mode 100644 index 5756285aaf2bd2..00000000000000 --- a/test/prism/snapshots/unparser/corpus/literal/empty.txt +++ /dev/null @@ -1,7 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,0)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,0)) - ├── flags: ∅ - └── body: (length: 0) diff --git a/test/prism/snapshots/unparser/corpus/literal/empty_begin.txt b/test/prism/snapshots/unparser/corpus/literal/empty_begin.txt deleted file mode 100644 index 25dc0b26a216a3..00000000000000 --- a/test/prism/snapshots/unparser/corpus/literal/empty_begin.txt +++ /dev/null @@ -1,12 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,2)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,2)) - ├── flags: ∅ - └── body: (length: 1) - └── @ ParenthesesNode (location: (1,0)-(1,2)) - ├── flags: newline - ├── body: ∅ - ├── opening_loc: (1,0)-(1,1) = "(" - └── closing_loc: (1,1)-(1,2) = ")" diff --git a/test/prism/snapshots/unparser/corpus/literal/flipflop.txt b/test/prism/snapshots/unparser/corpus/literal/flipflop.txt deleted file mode 100644 index 418aa242cbecd9..00000000000000 --- a/test/prism/snapshots/unparser/corpus/literal/flipflop.txt +++ /dev/null @@ -1,257 +0,0 @@ -@ ProgramNode (location: (1,0)-(10,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(10,3)) - ├── flags: ∅ - └── body: (length: 4) - ├── @ IfNode (location: (1,0)-(3,3)) - │ ├── flags: newline - │ ├── if_keyword_loc: (1,0)-(1,2) = "if" - │ ├── predicate: - │ │ @ ParenthesesNode (location: (1,3)-(1,23)) - │ │ ├── flags: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (1,4)-(1,22)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ FlipFlopNode (location: (1,4)-(1,22)) - │ │ │ ├── flags: newline - │ │ │ ├── left: - │ │ │ │ @ ParenthesesNode (location: (1,4)-(1,12)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── body: - │ │ │ │ │ @ StatementsNode (location: (1,5)-(1,11)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── body: (length: 1) - │ │ │ │ │ └── @ CallNode (location: (1,5)-(1,11)) - │ │ │ │ │ ├── flags: newline - │ │ │ │ │ ├── receiver: - │ │ │ │ │ │ @ CallNode (location: (1,5)-(1,6)) - │ │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ │ ├── name: :i - │ │ │ │ │ │ ├── message_loc: (1,5)-(1,6) = "i" - │ │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ │ └── block: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :== - │ │ │ │ │ ├── message_loc: (1,7)-(1,9) = "==" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: - │ │ │ │ │ │ @ ArgumentsNode (location: (1,10)-(1,11)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ └── arguments: (length: 1) - │ │ │ │ │ │ └── @ IntegerNode (location: (1,10)-(1,11)) - │ │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ │ └── value: 4 - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── opening_loc: (1,4)-(1,5) = "(" - │ │ │ │ └── closing_loc: (1,11)-(1,12) = ")" - │ │ │ ├── right: - │ │ │ │ @ ParenthesesNode (location: (1,14)-(1,22)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── body: - │ │ │ │ │ @ StatementsNode (location: (1,15)-(1,21)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── body: (length: 1) - │ │ │ │ │ └── @ CallNode (location: (1,15)-(1,21)) - │ │ │ │ │ ├── flags: newline - │ │ │ │ │ ├── receiver: - │ │ │ │ │ │ @ CallNode (location: (1,15)-(1,16)) - │ │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ │ ├── name: :i - │ │ │ │ │ │ ├── message_loc: (1,15)-(1,16) = "i" - │ │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ │ └── block: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :== - │ │ │ │ │ ├── message_loc: (1,17)-(1,19) = "==" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: - │ │ │ │ │ │ @ ArgumentsNode (location: (1,20)-(1,21)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ └── arguments: (length: 1) - │ │ │ │ │ │ └── @ IntegerNode (location: (1,20)-(1,21)) - │ │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ │ └── value: 4 - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── opening_loc: (1,14)-(1,15) = "(" - │ │ │ │ └── closing_loc: (1,21)-(1,22) = ")" - │ │ │ └── operator_loc: (1,12)-(1,14) = ".." - │ │ ├── opening_loc: (1,3)-(1,4) = "(" - │ │ └── closing_loc: (1,22)-(1,23) = ")" - │ ├── then_keyword_loc: ∅ - │ ├── statements: - │ │ @ StatementsNode (location: (2,2)-(2,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (2,2)-(2,5)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (2,2)-(2,5) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── subsequent: ∅ - │ └── end_keyword_loc: (3,0)-(3,3) = "end" - ├── @ IfNode (location: (4,0)-(6,3)) - │ ├── flags: newline - │ ├── if_keyword_loc: (4,0)-(4,2) = "if" - │ ├── predicate: - │ │ @ ParenthesesNode (location: (4,3)-(4,24)) - │ │ ├── flags: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (4,4)-(4,23)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ FlipFlopNode (location: (4,4)-(4,23)) - │ │ │ ├── flags: newline, exclude_end - │ │ │ ├── left: - │ │ │ │ @ ParenthesesNode (location: (4,4)-(4,12)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── body: - │ │ │ │ │ @ StatementsNode (location: (4,5)-(4,11)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── body: (length: 1) - │ │ │ │ │ └── @ CallNode (location: (4,5)-(4,11)) - │ │ │ │ │ ├── flags: newline - │ │ │ │ │ ├── receiver: - │ │ │ │ │ │ @ CallNode (location: (4,5)-(4,6)) - │ │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ │ ├── name: :i - │ │ │ │ │ │ ├── message_loc: (4,5)-(4,6) = "i" - │ │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ │ └── block: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :== - │ │ │ │ │ ├── message_loc: (4,7)-(4,9) = "==" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: - │ │ │ │ │ │ @ ArgumentsNode (location: (4,10)-(4,11)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ └── arguments: (length: 1) - │ │ │ │ │ │ └── @ IntegerNode (location: (4,10)-(4,11)) - │ │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ │ └── value: 4 - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── opening_loc: (4,4)-(4,5) = "(" - │ │ │ │ └── closing_loc: (4,11)-(4,12) = ")" - │ │ │ ├── right: - │ │ │ │ @ ParenthesesNode (location: (4,15)-(4,23)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── body: - │ │ │ │ │ @ StatementsNode (location: (4,16)-(4,22)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── body: (length: 1) - │ │ │ │ │ └── @ CallNode (location: (4,16)-(4,22)) - │ │ │ │ │ ├── flags: newline - │ │ │ │ │ ├── receiver: - │ │ │ │ │ │ @ CallNode (location: (4,16)-(4,17)) - │ │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ │ ├── name: :i - │ │ │ │ │ │ ├── message_loc: (4,16)-(4,17) = "i" - │ │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ │ └── block: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :== - │ │ │ │ │ ├── message_loc: (4,18)-(4,20) = "==" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: - │ │ │ │ │ │ @ ArgumentsNode (location: (4,21)-(4,22)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ └── arguments: (length: 1) - │ │ │ │ │ │ └── @ IntegerNode (location: (4,21)-(4,22)) - │ │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ │ └── value: 4 - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── opening_loc: (4,15)-(4,16) = "(" - │ │ │ │ └── closing_loc: (4,22)-(4,23) = ")" - │ │ │ └── operator_loc: (4,12)-(4,15) = "..." - │ │ ├── opening_loc: (4,3)-(4,4) = "(" - │ │ └── closing_loc: (4,23)-(4,24) = ")" - │ ├── then_keyword_loc: ∅ - │ ├── statements: - │ │ @ StatementsNode (location: (5,2)-(5,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (5,2)-(5,5)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (5,2)-(5,5) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── subsequent: ∅ - │ └── end_keyword_loc: (6,0)-(6,3) = "end" - ├── @ IfNode (location: (7,0)-(8,3)) - │ ├── flags: newline - │ ├── if_keyword_loc: (7,0)-(7,2) = "if" - │ ├── predicate: - │ │ @ FlipFlopNode (location: (7,3)-(7,8)) - │ │ ├── flags: ∅ - │ │ ├── left: ∅ - │ │ ├── right: - │ │ │ @ CallNode (location: (7,5)-(7,8)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (7,5)-(7,8) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: (7,3)-(7,5) = ".." - │ ├── then_keyword_loc: ∅ - │ ├── statements: ∅ - │ ├── subsequent: ∅ - │ └── end_keyword_loc: (8,0)-(8,3) = "end" - └── @ IfNode (location: (9,0)-(10,3)) - ├── flags: newline - ├── if_keyword_loc: (9,0)-(9,2) = "if" - ├── predicate: - │ @ FlipFlopNode (location: (9,3)-(9,8)) - │ ├── flags: ∅ - │ ├── left: - │ │ @ CallNode (location: (9,3)-(9,6)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (9,3)-(9,6) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── right: ∅ - │ └── operator_loc: (9,6)-(9,8) = ".." - ├── then_keyword_loc: ∅ - ├── statements: ∅ - ├── subsequent: ∅ - └── end_keyword_loc: (10,0)-(10,3) = "end" diff --git a/test/prism/snapshots/unparser/corpus/literal/for.txt b/test/prism/snapshots/unparser/corpus/literal/for.txt deleted file mode 100644 index a1722a8a099cf9..00000000000000 --- a/test/prism/snapshots/unparser/corpus/literal/for.txt +++ /dev/null @@ -1,190 +0,0 @@ -@ ProgramNode (location: (1,0)-(12,3)) -├── flags: ∅ -├── locals: [:a, :b] -└── statements: - @ StatementsNode (location: (1,0)-(12,3)) - ├── flags: ∅ - └── body: (length: 4) - ├── @ CallNode (location: (1,0)-(3,4)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :bar - │ ├── message_loc: (1,0)-(1,3) = "bar" - │ ├── opening_loc: (1,3)-(1,4) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,4)-(3,3)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ ForNode (location: (1,4)-(3,3)) - │ │ ├── flags: ∅ - │ │ ├── index: - │ │ │ @ LocalVariableTargetNode (location: (1,8)-(1,9)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :a - │ │ │ └── depth: 0 - │ │ ├── collection: - │ │ │ @ CallNode (location: (1,13)-(1,16)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (1,13)-(1,16) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (2,2)-(2,5)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (2,2)-(2,5)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :baz - │ │ │ ├── message_loc: (2,2)-(2,5) = "baz" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── for_keyword_loc: (1,4)-(1,7) = "for" - │ │ ├── in_keyword_loc: (1,10)-(1,12) = "in" - │ │ ├── do_keyword_loc: (1,17)-(1,19) = "do" - │ │ └── end_keyword_loc: (3,0)-(3,3) = "end" - │ ├── closing_loc: (3,3)-(3,4) = ")" - │ └── block: ∅ - ├── @ ForNode (location: (4,0)-(6,3)) - │ ├── flags: newline - │ ├── index: - │ │ @ LocalVariableTargetNode (location: (4,4)-(4,5)) - │ │ ├── flags: ∅ - │ │ ├── name: :a - │ │ └── depth: 0 - │ ├── collection: - │ │ @ CallNode (location: (4,9)-(4,12)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (4,9)-(4,12) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── statements: - │ │ @ StatementsNode (location: (5,2)-(5,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (5,2)-(5,5)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :baz - │ │ ├── message_loc: (5,2)-(5,5) = "baz" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── for_keyword_loc: (4,0)-(4,3) = "for" - │ ├── in_keyword_loc: (4,6)-(4,8) = "in" - │ ├── do_keyword_loc: (4,13)-(4,15) = "do" - │ └── end_keyword_loc: (6,0)-(6,3) = "end" - ├── @ ForNode (location: (7,0)-(9,3)) - │ ├── flags: newline - │ ├── index: - │ │ @ MultiTargetNode (location: (7,4)-(7,11)) - │ │ ├── flags: ∅ - │ │ ├── lefts: (length: 1) - │ │ │ └── @ LocalVariableTargetNode (location: (7,5)-(7,6)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :a - │ │ │ └── depth: 0 - │ │ ├── rest: - │ │ │ @ SplatNode (location: (7,8)-(7,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (7,8)-(7,9) = "*" - │ │ │ └── expression: - │ │ │ @ LocalVariableTargetNode (location: (7,9)-(7,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :b - │ │ │ └── depth: 0 - │ │ ├── rights: (length: 0) - │ │ ├── lparen_loc: (7,4)-(7,5) = "(" - │ │ └── rparen_loc: (7,10)-(7,11) = ")" - │ ├── collection: - │ │ @ CallNode (location: (7,15)-(7,18)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (7,15)-(7,18) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── statements: - │ │ @ StatementsNode (location: (8,2)-(8,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (8,2)-(8,5)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :baz - │ │ ├── message_loc: (8,2)-(8,5) = "baz" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── for_keyword_loc: (7,0)-(7,3) = "for" - │ ├── in_keyword_loc: (7,12)-(7,14) = "in" - │ ├── do_keyword_loc: (7,19)-(7,21) = "do" - │ └── end_keyword_loc: (9,0)-(9,3) = "end" - └── @ ForNode (location: (10,0)-(12,3)) - ├── flags: newline - ├── index: - │ @ MultiTargetNode (location: (10,4)-(10,10)) - │ ├── flags: ∅ - │ ├── lefts: (length: 2) - │ │ ├── @ LocalVariableTargetNode (location: (10,5)-(10,6)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :a - │ │ │ └── depth: 0 - │ │ └── @ LocalVariableTargetNode (location: (10,8)-(10,9)) - │ │ ├── flags: ∅ - │ │ ├── name: :b - │ │ └── depth: 0 - │ ├── rest: ∅ - │ ├── rights: (length: 0) - │ ├── lparen_loc: (10,4)-(10,5) = "(" - │ └── rparen_loc: (10,9)-(10,10) = ")" - ├── collection: - │ @ CallNode (location: (10,14)-(10,17)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :bar - │ ├── message_loc: (10,14)-(10,17) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── statements: - │ @ StatementsNode (location: (11,2)-(11,5)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (11,2)-(11,5)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :baz - │ ├── message_loc: (11,2)-(11,5) = "baz" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── for_keyword_loc: (10,0)-(10,3) = "for" - ├── in_keyword_loc: (10,11)-(10,13) = "in" - ├── do_keyword_loc: (10,18)-(10,20) = "do" - └── end_keyword_loc: (12,0)-(12,3) = "end" diff --git a/test/prism/snapshots/unparser/corpus/literal/hookexe.txt b/test/prism/snapshots/unparser/corpus/literal/hookexe.txt deleted file mode 100644 index bbcb8fee1b0da7..00000000000000 --- a/test/prism/snapshots/unparser/corpus/literal/hookexe.txt +++ /dev/null @@ -1,55 +0,0 @@ -@ ProgramNode (location: (1,0)-(7,1)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(7,1)) - ├── flags: ∅ - └── body: (length: 3) - ├── @ PreExecutionNode (location: (1,0)-(3,1)) - │ ├── flags: newline - │ ├── statements: - │ │ @ StatementsNode (location: (2,2)-(2,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (2,2)-(2,5)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (2,2)-(2,5) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── keyword_loc: (1,0)-(1,5) = "BEGIN" - │ ├── opening_loc: (1,6)-(1,7) = "{" - │ └── closing_loc: (3,0)-(3,1) = "}" - ├── @ CallNode (location: (4,0)-(4,3)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :bar - │ ├── message_loc: (4,0)-(4,3) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── @ PostExecutionNode (location: (5,0)-(7,1)) - ├── flags: newline - ├── statements: - │ @ StatementsNode (location: (6,2)-(6,5)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (6,2)-(6,5)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :baz - │ ├── message_loc: (6,2)-(6,5) = "baz" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── keyword_loc: (5,0)-(5,3) = "END" - ├── opening_loc: (5,4)-(5,5) = "{" - └── closing_loc: (7,0)-(7,1) = "}" diff --git a/test/prism/snapshots/unparser/corpus/literal/if.txt b/test/prism/snapshots/unparser/corpus/literal/if.txt deleted file mode 100644 index 10240962c59375..00000000000000 --- a/test/prism/snapshots/unparser/corpus/literal/if.txt +++ /dev/null @@ -1,330 +0,0 @@ -@ ProgramNode (location: (1,0)-(36,3)) -├── flags: ∅ -├── locals: [:foo, :pair] -└── statements: - @ StatementsNode (location: (1,0)-(36,3)) - ├── flags: ∅ - └── body: (length: 10) - ├── @ IfNode (location: (1,0)-(3,3)) - │ ├── flags: newline - │ ├── if_keyword_loc: (1,0)-(1,2) = "if" - │ ├── predicate: - │ │ @ MatchLastLineNode (location: (1,3)-(1,8)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (1,3)-(1,4) = "/" - │ │ ├── content_loc: (1,4)-(1,7) = "foo" - │ │ ├── closing_loc: (1,7)-(1,8) = "/" - │ │ └── unescaped: "foo" - │ ├── then_keyword_loc: ∅ - │ ├── statements: - │ │ @ StatementsNode (location: (2,2)-(2,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (2,2)-(2,5)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (2,2)-(2,5) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── subsequent: ∅ - │ └── end_keyword_loc: (3,0)-(3,3) = "end" - ├── @ IfNode (location: (4,0)-(6,3)) - │ ├── flags: newline - │ ├── if_keyword_loc: (4,0)-(4,2) = "if" - │ ├── predicate: - │ │ @ IntegerNode (location: (4,3)-(4,4)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 3 - │ ├── then_keyword_loc: ∅ - │ ├── statements: - │ │ @ StatementsNode (location: (5,2)-(5,3)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ IntegerNode (location: (5,2)-(5,3)) - │ │ ├── flags: newline, static_literal, decimal - │ │ └── value: 9 - │ ├── subsequent: ∅ - │ └── end_keyword_loc: (6,0)-(6,3) = "end" - ├── @ IfNode (location: (7,0)-(11,3)) - │ ├── flags: newline - │ ├── if_keyword_loc: (7,0)-(7,2) = "if" - │ ├── predicate: - │ │ @ IntegerNode (location: (7,3)-(7,4)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 4 - │ ├── then_keyword_loc: ∅ - │ ├── statements: - │ │ @ StatementsNode (location: (8,2)-(8,3)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ IntegerNode (location: (8,2)-(8,3)) - │ │ ├── flags: newline, static_literal, decimal - │ │ └── value: 5 - │ ├── subsequent: - │ │ @ ElseNode (location: (9,0)-(11,3)) - │ │ ├── flags: ∅ - │ │ ├── else_keyword_loc: (9,0)-(9,4) = "else" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (10,2)-(10,3)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ IntegerNode (location: (10,2)-(10,3)) - │ │ │ ├── flags: newline, static_literal, decimal - │ │ │ └── value: 6 - │ │ └── end_keyword_loc: (11,0)-(11,3) = "end" - │ └── end_keyword_loc: (11,0)-(11,3) = "end" - ├── @ UnlessNode (location: (12,0)-(14,3)) - │ ├── flags: newline - │ ├── keyword_loc: (12,0)-(12,6) = "unless" - │ ├── predicate: - │ │ @ IntegerNode (location: (12,7)-(12,8)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 3 - │ ├── then_keyword_loc: ∅ - │ ├── statements: - │ │ @ StatementsNode (location: (13,2)-(13,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ NilNode (location: (13,2)-(13,5)) - │ │ └── flags: newline, static_literal - │ ├── else_clause: ∅ - │ └── end_keyword_loc: (14,0)-(14,3) = "end" - ├── @ UnlessNode (location: (15,0)-(17,3)) - │ ├── flags: newline - │ ├── keyword_loc: (15,0)-(15,6) = "unless" - │ ├── predicate: - │ │ @ IntegerNode (location: (15,7)-(15,8)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 3 - │ ├── then_keyword_loc: ∅ - │ ├── statements: - │ │ @ StatementsNode (location: (16,2)-(16,3)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ IntegerNode (location: (16,2)-(16,3)) - │ │ ├── flags: newline, static_literal, decimal - │ │ └── value: 9 - │ ├── else_clause: ∅ - │ └── end_keyword_loc: (17,0)-(17,3) = "end" - ├── @ IfNode (location: (18,0)-(19,3)) - │ ├── flags: newline - │ ├── if_keyword_loc: (18,0)-(18,2) = "if" - │ ├── predicate: - │ │ @ CallNode (location: (18,3)-(18,6)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (18,3)-(18,6) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── then_keyword_loc: ∅ - │ ├── statements: ∅ - │ ├── subsequent: ∅ - │ └── end_keyword_loc: (19,0)-(19,3) = "end" - ├── @ ModuleNode (location: (21,0)-(23,3)) - │ ├── flags: newline - │ ├── locals: [:foo] - │ ├── module_keyword_loc: (21,0)-(21,6) = "module" - │ ├── constant_path: - │ │ @ ConstantReadNode (location: (21,7)-(21,8)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── body: - │ │ @ StatementsNode (location: (22,2)-(22,18)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ IfNode (location: (22,2)-(22,18)) - │ │ ├── flags: newline - │ │ ├── if_keyword_loc: (22,12)-(22,14) = "if" - │ │ ├── predicate: - │ │ │ @ LocalVariableReadNode (location: (22,15)-(22,18)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :foo - │ │ │ └── depth: 0 - │ │ ├── then_keyword_loc: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (22,2)-(22,11)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ LocalVariableWriteNode (location: (22,2)-(22,11)) - │ │ │ ├── flags: newline - │ │ │ ├── name: :foo - │ │ │ ├── depth: 0 - │ │ │ ├── name_loc: (22,2)-(22,5) = "foo" - │ │ │ ├── value: - │ │ │ │ @ CallNode (location: (22,8)-(22,11)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :bar - │ │ │ │ ├── message_loc: (22,8)-(22,11) = "bar" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── operator_loc: (22,6)-(22,7) = "=" - │ │ ├── subsequent: ∅ - │ │ └── end_keyword_loc: ∅ - │ ├── end_keyword_loc: (23,0)-(23,3) = "end" - │ └── name: :A - ├── @ ModuleNode (location: (25,0)-(27,3)) - │ ├── flags: newline - │ ├── locals: [:foo] - │ ├── module_keyword_loc: (25,0)-(25,6) = "module" - │ ├── constant_path: - │ │ @ ConstantReadNode (location: (25,7)-(25,8)) - │ │ ├── flags: ∅ - │ │ └── name: :B - │ ├── body: - │ │ @ StatementsNode (location: (26,2)-(26,22)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ UnlessNode (location: (26,2)-(26,22)) - │ │ ├── flags: newline - │ │ ├── keyword_loc: (26,12)-(26,18) = "unless" - │ │ ├── predicate: - │ │ │ @ LocalVariableReadNode (location: (26,19)-(26,22)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :foo - │ │ │ └── depth: 0 - │ │ ├── then_keyword_loc: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (26,2)-(26,11)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ LocalVariableWriteNode (location: (26,2)-(26,11)) - │ │ │ ├── flags: newline - │ │ │ ├── name: :foo - │ │ │ ├── depth: 0 - │ │ │ ├── name_loc: (26,2)-(26,5) = "foo" - │ │ │ ├── value: - │ │ │ │ @ CallNode (location: (26,8)-(26,11)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :bar - │ │ │ │ ├── message_loc: (26,8)-(26,11) = "bar" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── operator_loc: (26,6)-(26,7) = "=" - │ │ ├── else_clause: ∅ - │ │ └── end_keyword_loc: ∅ - │ ├── end_keyword_loc: (27,0)-(27,3) = "end" - │ └── name: :B - ├── @ UnlessNode (location: (28,0)-(30,3)) - │ ├── flags: newline - │ ├── keyword_loc: (28,0)-(28,6) = "unless" - │ ├── predicate: - │ │ @ CallNode (location: (28,7)-(28,10)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (28,7)-(28,10) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── then_keyword_loc: ∅ - │ ├── statements: - │ │ @ StatementsNode (location: (29,2)-(29,11)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ LocalVariableWriteNode (location: (29,2)-(29,11)) - │ │ ├── flags: newline - │ │ ├── name: :foo - │ │ ├── depth: 0 - │ │ ├── name_loc: (29,2)-(29,5) = "foo" - │ │ ├── value: - │ │ │ @ CallNode (location: (29,8)-(29,11)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (29,8)-(29,11) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: (29,6)-(29,7) = "=" - │ ├── else_clause: ∅ - │ └── end_keyword_loc: (30,0)-(30,3) = "end" - └── @ IfNode (location: (31,0)-(36,3)) - ├── flags: newline - ├── if_keyword_loc: (31,0)-(31,2) = "if" - ├── predicate: - │ @ CallNode (location: (31,3)-(33,1)) - │ ├── flags: ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (31,3)-(31,6) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (31,7)-(33,1)) - │ ├── flags: ∅ - │ ├── locals: [:pair] - │ ├── parameters: - │ │ @ BlockParametersNode (location: (31,9)-(31,15)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (31,10)-(31,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (31,10)-(31,14)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :pair - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: (31,9)-(31,10) = "|" - │ │ └── closing_loc: (31,14)-(31,15) = "|" - │ ├── body: - │ │ @ StatementsNode (location: (32,2)-(32,6)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ LocalVariableReadNode (location: (32,2)-(32,6)) - │ │ ├── flags: newline - │ │ ├── name: :pair - │ │ └── depth: 0 - │ ├── opening_loc: (31,7)-(31,8) = "{" - │ └── closing_loc: (33,0)-(33,1) = "}" - ├── then_keyword_loc: ∅ - ├── statements: - │ @ StatementsNode (location: (34,2)-(35,5)) - │ ├── flags: ∅ - │ └── body: (length: 2) - │ ├── @ LocalVariableWriteNode (location: (34,2)-(34,13)) - │ │ ├── flags: newline - │ │ ├── name: :pair - │ │ ├── depth: 0 - │ │ ├── name_loc: (34,2)-(34,6) = "pair" - │ │ ├── value: - │ │ │ @ SymbolNode (location: (34,9)-(34,13)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (34,9)-(34,10) = ":" - │ │ │ ├── value_loc: (34,10)-(34,13) = "foo" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "foo" - │ │ └── operator_loc: (34,7)-(34,8) = "=" - │ └── @ LocalVariableReadNode (location: (35,2)-(35,5)) - │ ├── flags: newline - │ ├── name: :foo - │ └── depth: 0 - ├── subsequent: ∅ - └── end_keyword_loc: (36,0)-(36,3) = "end" diff --git a/test/prism/snapshots/unparser/corpus/literal/kwbegin.txt b/test/prism/snapshots/unparser/corpus/literal/kwbegin.txt deleted file mode 100644 index 9c7febe206badd..00000000000000 --- a/test/prism/snapshots/unparser/corpus/literal/kwbegin.txt +++ /dev/null @@ -1,570 +0,0 @@ -@ ProgramNode (location: (1,0)-(80,3)) -├── flags: ∅ -├── locals: [:foo, :bar, :exception] -└── statements: - @ StatementsNode (location: (1,0)-(80,3)) - ├── flags: ∅ - └── body: (length: 14) - ├── @ BeginNode (location: (1,0)-(3,3)) - │ ├── flags: newline - │ ├── begin_keyword_loc: (1,0)-(1,5) = "begin" - │ ├── statements: ∅ - │ ├── rescue_clause: - │ │ @ RescueNode (location: (2,0)-(2,6)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (2,0)-(2,6) = "rescue" - │ │ ├── exceptions: (length: 0) - │ │ ├── operator_loc: ∅ - │ │ ├── reference: ∅ - │ │ ├── statements: ∅ - │ │ └── subsequent: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: ∅ - │ └── end_keyword_loc: (3,0)-(3,3) = "end" - ├── @ BeginNode (location: (5,0)-(7,3)) - │ ├── flags: newline - │ ├── begin_keyword_loc: (5,0)-(5,5) = "begin" - │ ├── statements: ∅ - │ ├── rescue_clause: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: - │ │ @ EnsureNode (location: (6,0)-(7,3)) - │ │ ├── flags: ∅ - │ │ ├── ensure_keyword_loc: (6,0)-(6,6) = "ensure" - │ │ ├── statements: ∅ - │ │ └── end_keyword_loc: (7,0)-(7,3) = "end" - │ └── end_keyword_loc: (7,0)-(7,3) = "end" - ├── @ BeginNode (location: (9,0)-(11,3)) - │ ├── flags: newline - │ ├── begin_keyword_loc: (9,0)-(9,5) = "begin" - │ ├── statements: - │ │ @ StatementsNode (location: (10,2)-(10,3)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (10,2)-(10,3)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (10,2)-(10,3) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── rescue_clause: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: ∅ - │ └── end_keyword_loc: (11,0)-(11,3) = "end" - ├── @ BeginNode (location: (13,0)-(17,3)) - │ ├── flags: newline - │ ├── begin_keyword_loc: (13,0)-(13,5) = "begin" - │ ├── statements: - │ │ @ StatementsNode (location: (14,2)-(14,3)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (14,2)-(14,3)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (14,2)-(14,3) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── rescue_clause: - │ │ @ RescueNode (location: (15,0)-(16,3)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (15,0)-(15,6) = "rescue" - │ │ ├── exceptions: (length: 0) - │ │ ├── operator_loc: ∅ - │ │ ├── reference: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (16,2)-(16,3)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (16,2)-(16,3)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (16,2)-(16,3) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── subsequent: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: ∅ - │ └── end_keyword_loc: (17,0)-(17,3) = "end" - ├── @ BeginNode (location: (19,0)-(24,3)) - │ ├── flags: newline - │ ├── begin_keyword_loc: (19,0)-(19,5) = "begin" - │ ├── statements: - │ │ @ StatementsNode (location: (20,2)-(21,3)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 2) - │ │ ├── @ CallNode (location: (20,2)-(20,3)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :a - │ │ │ ├── message_loc: (20,2)-(20,3) = "a" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── @ CallNode (location: (21,2)-(21,3)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :b - │ │ ├── message_loc: (21,2)-(21,3) = "b" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── rescue_clause: - │ │ @ RescueNode (location: (22,0)-(23,3)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (22,0)-(22,6) = "rescue" - │ │ ├── exceptions: (length: 0) - │ │ ├── operator_loc: ∅ - │ │ ├── reference: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (23,2)-(23,3)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (23,2)-(23,3)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (23,2)-(23,3) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── subsequent: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: ∅ - │ └── end_keyword_loc: (24,0)-(24,3) = "end" - ├── @ BeginNode (location: (26,0)-(28,3)) - │ ├── flags: newline - │ ├── begin_keyword_loc: (26,0)-(26,5) = "begin" - │ ├── statements: ∅ - │ ├── rescue_clause: - │ │ @ RescueNode (location: (27,0)-(27,8)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (27,0)-(27,6) = "rescue" - │ │ ├── exceptions: (length: 1) - │ │ │ └── @ ConstantReadNode (location: (27,7)-(27,8)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :A - │ │ ├── operator_loc: ∅ - │ │ ├── reference: ∅ - │ │ ├── statements: ∅ - │ │ └── subsequent: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: ∅ - │ └── end_keyword_loc: (28,0)-(28,3) = "end" - ├── @ BeginNode (location: (30,0)-(32,3)) - │ ├── flags: newline - │ ├── begin_keyword_loc: (30,0)-(30,5) = "begin" - │ ├── statements: ∅ - │ ├── rescue_clause: - │ │ @ RescueNode (location: (31,0)-(31,15)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (31,0)-(31,6) = "rescue" - │ │ ├── exceptions: (length: 1) - │ │ │ └── @ ConstantReadNode (location: (31,7)-(31,8)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :A - │ │ ├── operator_loc: (31,9)-(31,11) = "=>" - │ │ ├── reference: - │ │ │ @ LocalVariableTargetNode (location: (31,12)-(31,15)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :foo - │ │ │ └── depth: 0 - │ │ ├── statements: ∅ - │ │ └── subsequent: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: ∅ - │ └── end_keyword_loc: (32,0)-(32,3) = "end" - ├── @ BeginNode (location: (34,0)-(42,3)) - │ ├── flags: newline - │ ├── begin_keyword_loc: (34,0)-(34,5) = "begin" - │ ├── statements: - │ │ @ StatementsNode (location: (35,2)-(35,3)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (35,2)-(35,3)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (35,2)-(35,3) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── rescue_clause: - │ │ @ RescueNode (location: (36,0)-(39,3)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (36,0)-(36,6) = "rescue" - │ │ ├── exceptions: (length: 1) - │ │ │ └── @ ConstantReadNode (location: (36,7)-(36,8)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :A - │ │ ├── operator_loc: ∅ - │ │ ├── reference: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (37,2)-(37,3)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (37,2)-(37,3)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (37,2)-(37,3) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── subsequent: - │ │ @ RescueNode (location: (38,0)-(39,3)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (38,0)-(38,6) = "rescue" - │ │ ├── exceptions: (length: 1) - │ │ │ └── @ ConstantReadNode (location: (38,7)-(38,8)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :B - │ │ ├── operator_loc: ∅ - │ │ ├── reference: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (39,2)-(39,3)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (39,2)-(39,3)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :c - │ │ │ ├── message_loc: (39,2)-(39,3) = "c" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── subsequent: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: - │ │ @ EnsureNode (location: (40,0)-(42,3)) - │ │ ├── flags: ∅ - │ │ ├── ensure_keyword_loc: (40,0)-(40,6) = "ensure" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (41,2)-(41,3)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (41,2)-(41,3)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :d - │ │ │ ├── message_loc: (41,2)-(41,3) = "d" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── end_keyword_loc: (42,0)-(42,3) = "end" - │ └── end_keyword_loc: (42,0)-(42,3) = "end" - ├── @ BeginNode (location: (44,0)-(53,3)) - │ ├── flags: newline - │ ├── begin_keyword_loc: (44,0)-(44,5) = "begin" - │ ├── statements: - │ │ @ StatementsNode (location: (45,2)-(49,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ BeginNode (location: (45,2)-(49,5)) - │ │ ├── flags: newline - │ │ ├── begin_keyword_loc: (45,2)-(45,7) = "begin" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (46,4)-(47,7)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 2) - │ │ │ ├── @ LocalVariableReadNode (location: (46,4)-(46,7)) - │ │ │ │ ├── flags: newline - │ │ │ │ ├── name: :foo - │ │ │ │ └── depth: 0 - │ │ │ └── @ CallNode (location: (47,4)-(47,7)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (47,4)-(47,7) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── rescue_clause: - │ │ │ @ RescueNode (location: (48,2)-(48,8)) - │ │ │ ├── flags: ∅ - │ │ │ ├── keyword_loc: (48,2)-(48,8) = "rescue" - │ │ │ ├── exceptions: (length: 0) - │ │ │ ├── operator_loc: ∅ - │ │ │ ├── reference: ∅ - │ │ │ ├── statements: ∅ - │ │ │ └── subsequent: ∅ - │ │ ├── else_clause: ∅ - │ │ ├── ensure_clause: ∅ - │ │ └── end_keyword_loc: (49,2)-(49,5) = "end" - │ ├── rescue_clause: - │ │ @ RescueNode (location: (50,0)-(52,5)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (50,0)-(50,6) = "rescue" - │ │ ├── exceptions: (length: 0) - │ │ ├── operator_loc: ∅ - │ │ ├── reference: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (51,2)-(52,5)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 2) - │ │ │ ├── @ CallNode (location: (51,2)-(51,5)) - │ │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ ├── message_loc: (51,2)-(51,5) = "baz" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── @ CallNode (location: (52,2)-(52,5)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (52,2)-(52,5) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── subsequent: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: ∅ - │ └── end_keyword_loc: (53,0)-(53,3) = "end" - ├── @ BeginNode (location: (55,0)-(58,3)) - │ ├── flags: newline - │ ├── begin_keyword_loc: (55,0)-(55,5) = "begin" - │ ├── statements: - │ │ @ StatementsNode (location: (56,2)-(56,35)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ RescueModifierNode (location: (56,2)-(56,35)) - │ │ ├── flags: newline - │ │ ├── expression: - │ │ │ @ CallNode (location: (56,2)-(56,18)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :raise - │ │ │ ├── message_loc: (56,2)-(56,7) = "raise" - │ │ │ ├── opening_loc: (56,7)-(56,8) = "(" - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (56,8)-(56,17)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ ConstantReadNode (location: (56,8)-(56,17)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :Exception - │ │ │ ├── closing_loc: (56,17)-(56,18) = ")" - │ │ │ └── block: ∅ - │ │ ├── keyword_loc: (56,19)-(56,25) = "rescue" - │ │ └── rescue_expression: - │ │ @ LocalVariableWriteNode (location: (56,26)-(56,35)) - │ │ ├── flags: ∅ - │ │ ├── name: :foo - │ │ ├── depth: 0 - │ │ ├── name_loc: (56,26)-(56,29) = "foo" - │ │ ├── value: - │ │ │ @ CallNode (location: (56,32)-(56,35)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (56,32)-(56,35) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: (56,30)-(56,31) = "=" - │ ├── rescue_clause: - │ │ @ RescueNode (location: (57,0)-(57,16)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (57,0)-(57,6) = "rescue" - │ │ ├── exceptions: (length: 1) - │ │ │ └── @ ConstantReadNode (location: (57,7)-(57,16)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :Exception - │ │ ├── operator_loc: ∅ - │ │ ├── reference: ∅ - │ │ ├── statements: ∅ - │ │ └── subsequent: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: ∅ - │ └── end_keyword_loc: (58,0)-(58,3) = "end" - ├── @ BeginNode (location: (60,0)-(64,3)) - │ ├── flags: newline - │ ├── begin_keyword_loc: (60,0)-(60,5) = "begin" - │ ├── statements: - │ │ @ StatementsNode (location: (61,2)-(61,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ LocalVariableReadNode (location: (61,2)-(61,5)) - │ │ ├── flags: newline - │ │ ├── name: :foo - │ │ └── depth: 0 - │ ├── rescue_clause: - │ │ @ RescueNode (location: (62,0)-(63,5)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (62,0)-(62,6) = "rescue" - │ │ ├── exceptions: (length: 0) - │ │ ├── operator_loc: (62,7)-(62,9) = "=>" - │ │ ├── reference: - │ │ │ @ LocalVariableTargetNode (location: (62,10)-(62,13)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :bar - │ │ │ └── depth: 0 - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (63,2)-(63,5)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ LocalVariableReadNode (location: (63,2)-(63,5)) - │ │ │ ├── flags: newline - │ │ │ ├── name: :bar - │ │ │ └── depth: 0 - │ │ └── subsequent: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: ∅ - │ └── end_keyword_loc: (64,0)-(64,3) = "end" - ├── @ BeginNode (location: (66,0)-(70,3)) - │ ├── flags: newline - │ ├── begin_keyword_loc: (66,0)-(66,5) = "begin" - │ ├── statements: - │ │ @ StatementsNode (location: (67,2)-(67,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ LocalVariableReadNode (location: (67,2)-(67,5)) - │ │ ├── flags: newline - │ │ ├── name: :foo - │ │ └── depth: 0 - │ ├── rescue_clause: - │ │ @ RescueNode (location: (68,0)-(69,5)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (68,0)-(68,6) = "rescue" - │ │ ├── exceptions: (length: 2) - │ │ │ ├── @ ConstantReadNode (location: (68,7)-(68,16)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :Exception - │ │ │ └── @ ConstantReadNode (location: (68,18)-(68,23)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :Other - │ │ ├── operator_loc: (68,24)-(68,26) = "=>" - │ │ ├── reference: - │ │ │ @ LocalVariableTargetNode (location: (68,27)-(68,30)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :bar - │ │ │ └── depth: 0 - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (69,2)-(69,5)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ LocalVariableReadNode (location: (69,2)-(69,5)) - │ │ │ ├── flags: newline - │ │ │ ├── name: :bar - │ │ │ └── depth: 0 - │ │ └── subsequent: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: ∅ - │ └── end_keyword_loc: (70,0)-(70,3) = "end" - ├── @ BeginNode (location: (72,0)-(76,3)) - │ ├── flags: newline - │ ├── begin_keyword_loc: (72,0)-(72,5) = "begin" - │ ├── statements: - │ │ @ StatementsNode (location: (73,2)-(73,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ LocalVariableReadNode (location: (73,2)-(73,5)) - │ │ ├── flags: newline - │ │ ├── name: :bar - │ │ └── depth: 0 - │ ├── rescue_clause: - │ │ @ RescueNode (location: (74,0)-(75,5)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (74,0)-(74,6) = "rescue" - │ │ ├── exceptions: (length: 2) - │ │ │ ├── @ ConstantReadNode (location: (74,7)-(74,16)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :SomeError - │ │ │ └── @ SplatNode (location: (74,18)-(74,22)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (74,18)-(74,19) = "*" - │ │ │ └── expression: - │ │ │ @ LocalVariableReadNode (location: (74,19)-(74,22)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :bar - │ │ │ └── depth: 0 - │ │ ├── operator_loc: (74,23)-(74,25) = "=>" - │ │ ├── reference: - │ │ │ @ LocalVariableTargetNode (location: (74,26)-(74,35)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :exception - │ │ │ └── depth: 0 - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (75,2)-(75,5)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (75,2)-(75,5)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :baz - │ │ │ ├── message_loc: (75,2)-(75,5) = "baz" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── subsequent: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: ∅ - │ └── end_keyword_loc: (76,0)-(76,3) = "end" - └── @ SingletonClassNode (location: (78,0)-(80,3)) - ├── flags: newline - ├── locals: [] - ├── class_keyword_loc: (78,0)-(78,5) = "class" - ├── operator_loc: (78,6)-(78,8) = "<<" - ├── expression: - │ @ SelfNode (location: (78,9)-(78,13)) - │ └── flags: ∅ - ├── body: - │ @ StatementsNode (location: (79,2)-(79,23)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ RescueModifierNode (location: (79,2)-(79,23)) - │ ├── flags: newline - │ ├── expression: - │ │ @ UndefNode (location: (79,2)-(79,12)) - │ │ ├── flags: ∅ - │ │ ├── names: (length: 1) - │ │ │ └── @ SymbolNode (location: (79,8)-(79,12)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (79,8)-(79,9) = ":" - │ │ │ ├── value_loc: (79,9)-(79,12) = "bar" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "bar" - │ │ └── keyword_loc: (79,2)-(79,7) = "undef" - │ ├── keyword_loc: (79,13)-(79,19) = "rescue" - │ └── rescue_expression: - │ @ NilNode (location: (79,20)-(79,23)) - │ └── flags: static_literal - └── end_keyword_loc: (80,0)-(80,3) = "end" diff --git a/test/prism/snapshots/unparser/corpus/literal/lambda.txt b/test/prism/snapshots/unparser/corpus/literal/lambda.txt deleted file mode 100644 index 863678f17b4a8f..00000000000000 --- a/test/prism/snapshots/unparser/corpus/literal/lambda.txt +++ /dev/null @@ -1,170 +0,0 @@ -@ ProgramNode (location: (1,0)-(13,1)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(13,1)) - ├── flags: ∅ - └── body: (length: 6) - ├── @ CallNode (location: (1,0)-(2,1)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :lambda - │ ├── message_loc: (1,0)-(1,6) = "lambda" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (1,7)-(2,1)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (1,7)-(1,8) = "{" - │ └── closing_loc: (2,0)-(2,1) = "}" - ├── @ CallNode (location: (3,0)-(5,1)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :lambda - │ ├── message_loc: (3,0)-(3,6) = "lambda" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (3,7)-(5,1)) - │ ├── flags: ∅ - │ ├── locals: [:a, :b] - │ ├── parameters: - │ │ @ BlockParametersNode (location: (3,9)-(3,15)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (3,10)-(3,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 2) - │ │ │ │ ├── @ RequiredParameterNode (location: (3,10)-(3,11)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── name: :a - │ │ │ │ └── @ RequiredParameterNode (location: (3,13)-(3,14)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :b - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: (3,9)-(3,10) = "|" - │ │ └── closing_loc: (3,14)-(3,15) = "|" - │ ├── body: - │ │ @ StatementsNode (location: (4,2)-(4,3)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ LocalVariableReadNode (location: (4,2)-(4,3)) - │ │ ├── flags: newline - │ │ ├── name: :a - │ │ └── depth: 0 - │ ├── opening_loc: (3,7)-(3,8) = "{" - │ └── closing_loc: (5,0)-(5,1) = "}" - ├── @ LambdaNode (location: (6,0)-(7,1)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── operator_loc: (6,0)-(6,2) = "->" - │ ├── opening_loc: (6,5)-(6,6) = "{" - │ ├── closing_loc: (7,0)-(7,1) = "}" - │ ├── parameters: - │ │ @ BlockParametersNode (location: (6,2)-(6,4)) - │ │ ├── flags: ∅ - │ │ ├── parameters: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: (6,2)-(6,3) = "(" - │ │ └── closing_loc: (6,3)-(6,4) = ")" - │ └── body: ∅ - ├── @ LambdaNode (location: (8,0)-(9,1)) - │ ├── flags: newline - │ ├── locals: [:a] - │ ├── operator_loc: (8,0)-(8,2) = "->" - │ ├── opening_loc: (8,6)-(8,7) = "{" - │ ├── closing_loc: (9,0)-(9,1) = "}" - │ ├── parameters: - │ │ @ BlockParametersNode (location: (8,2)-(8,5)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (8,3)-(8,4)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (8,3)-(8,4)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :a - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: (8,2)-(8,3) = "(" - │ │ └── closing_loc: (8,4)-(8,5) = ")" - │ └── body: ∅ - ├── @ LambdaNode (location: (10,0)-(11,1)) - │ ├── flags: newline - │ ├── locals: [:a, :b] - │ ├── operator_loc: (10,0)-(10,2) = "->" - │ ├── opening_loc: (10,9)-(10,10) = "{" - │ ├── closing_loc: (11,0)-(11,1) = "}" - │ ├── parameters: - │ │ @ BlockParametersNode (location: (10,2)-(10,8)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (10,3)-(10,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 2) - │ │ │ │ ├── @ RequiredParameterNode (location: (10,3)-(10,4)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── name: :a - │ │ │ │ └── @ RequiredParameterNode (location: (10,6)-(10,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :b - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: (10,2)-(10,3) = "(" - │ │ └── closing_loc: (10,7)-(10,8) = ")" - │ └── body: ∅ - └── @ LambdaNode (location: (12,0)-(13,1)) - ├── flags: newline - ├── locals: [:a, :b, :c] - ├── operator_loc: (12,0)-(12,2) = "->" - ├── opening_loc: (12,12)-(12,13) = "{" - ├── closing_loc: (13,0)-(13,1) = "}" - ├── parameters: - │ @ BlockParametersNode (location: (12,2)-(12,11)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (12,3)-(12,7)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 2) - │ │ │ ├── @ RequiredParameterNode (location: (12,3)-(12,4)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :a - │ │ │ └── @ RequiredParameterNode (location: (12,6)-(12,7)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :b - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 1) - │ │ └── @ BlockLocalVariableNode (location: (12,9)-(12,10)) - │ │ ├── flags: ∅ - │ │ └── name: :c - │ ├── opening_loc: (12,2)-(12,3) = "(" - │ └── closing_loc: (12,10)-(12,11) = ")" - └── body: ∅ diff --git a/test/prism/snapshots/unparser/corpus/literal/literal.txt b/test/prism/snapshots/unparser/corpus/literal/literal.txt deleted file mode 100644 index 430a8a06793857..00000000000000 --- a/test/prism/snapshots/unparser/corpus/literal/literal.txt +++ /dev/null @@ -1,1309 +0,0 @@ -@ ProgramNode (location: (1,0)-(91,2)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(91,2)) - ├── flags: ∅ - └── body: (length: 78) - ├── @ HashNode (location: (1,0)-(1,38)) - │ ├── flags: newline - │ ├── opening_loc: (1,0)-(1,1) = "{" - │ ├── elements: (length: 2) - │ │ ├── @ AssocNode (location: (1,2)-(1,21)) - │ │ │ ├── flags: ∅ - │ │ │ ├── key: - │ │ │ │ @ StringNode (location: (1,2)-(1,7)) - │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ ├── opening_loc: (1,2)-(1,3) = "\"" - │ │ │ │ ├── content_loc: (1,3)-(1,6) = "foo" - │ │ │ │ ├── closing_loc: (1,6)-(1,7) = "\"" - │ │ │ │ └── unescaped: "foo" - │ │ │ ├── value: - │ │ │ │ @ InterpolatedStringNode (location: (1,11)-(1,21)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── opening_loc: (1,11)-(1,21) = "<<-HEREDOC" - │ │ │ │ ├── parts: (length: 3) - │ │ │ │ │ ├── @ StringNode (location: (2,0)-(2,2)) - │ │ │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ │ ├── content_loc: (2,0)-(2,2) = " " - │ │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ │ └── unescaped: " " - │ │ │ │ │ ├── @ EmbeddedStatementsNode (location: (2,2)-(2,5)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ ├── opening_loc: (2,2)-(2,4) = "\#{" - │ │ │ │ │ │ ├── statements: ∅ - │ │ │ │ │ │ └── closing_loc: (2,4)-(2,5) = "}" - │ │ │ │ │ └── @ StringNode (location: (2,5)-(3,0)) - │ │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── content_loc: (2,5)-(3,0) = "\n" - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── unescaped: "\n" - │ │ │ │ └── closing_loc: (3,0)-(4,0) = "HEREDOC\n" - │ │ │ └── operator_loc: (1,8)-(1,10) = "=>" - │ │ └── @ AssocNode (location: (1,23)-(1,36)) - │ │ ├── flags: static_literal - │ │ ├── key: - │ │ │ @ StringNode (location: (1,23)-(1,28)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: (1,23)-(1,24) = "\"" - │ │ │ ├── content_loc: (1,24)-(1,27) = "bar" - │ │ │ ├── closing_loc: (1,27)-(1,28) = "\"" - │ │ │ └── unescaped: "bar" - │ │ ├── value: - │ │ │ @ SymbolNode (location: (1,32)-(1,36)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (1,32)-(1,33) = ":" - │ │ │ ├── value_loc: (1,33)-(1,36) = "baz" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "baz" - │ │ └── operator_loc: (1,29)-(1,31) = "=>" - │ └── closing_loc: (1,37)-(1,38) = "}" - ├── @ HashNode (location: (4,0)-(4,31)) - │ ├── flags: newline - │ ├── opening_loc: (4,0)-(4,1) = "{" - │ ├── elements: (length: 2) - │ │ ├── @ AssocNode (location: (4,2)-(4,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── key: - │ │ │ │ @ StringNode (location: (4,2)-(4,7)) - │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ ├── opening_loc: (4,2)-(4,3) = "\"" - │ │ │ │ ├── content_loc: (4,3)-(4,6) = "foo" - │ │ │ │ ├── closing_loc: (4,6)-(4,7) = "\"" - │ │ │ │ └── unescaped: "foo" - │ │ │ ├── value: - │ │ │ │ @ StringNode (location: (4,11)-(4,14)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── opening_loc: (4,11)-(4,13) = "%(" - │ │ │ │ ├── content_loc: (4,13)-(4,13) = "" - │ │ │ │ ├── closing_loc: (4,13)-(4,14) = ")" - │ │ │ │ └── unescaped: "" - │ │ │ └── operator_loc: (4,8)-(4,10) = "=>" - │ │ └── @ AssocNode (location: (4,16)-(4,29)) - │ │ ├── flags: static_literal - │ │ ├── key: - │ │ │ @ StringNode (location: (4,16)-(4,21)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: (4,16)-(4,17) = "\"" - │ │ │ ├── content_loc: (4,17)-(4,20) = "bar" - │ │ │ ├── closing_loc: (4,20)-(4,21) = "\"" - │ │ │ └── unescaped: "bar" - │ │ ├── value: - │ │ │ @ SymbolNode (location: (4,25)-(4,29)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (4,25)-(4,26) = ":" - │ │ │ ├── value_loc: (4,26)-(4,29) = "baz" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "baz" - │ │ └── operator_loc: (4,22)-(4,24) = "=>" - │ └── closing_loc: (4,30)-(4,31) = "}" - ├── @ ArrayNode (location: (5,0)-(5,12)) - │ ├── flags: newline - │ ├── elements: (length: 2) - │ │ ├── @ StringNode (location: (5,1)-(5,6)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (5,1)-(5,2) = "\"" - │ │ │ ├── content_loc: (5,2)-(5,5) = "foo" - │ │ │ ├── closing_loc: (5,5)-(5,6) = "\"" - │ │ │ └── unescaped: "foo" - │ │ └── @ StringNode (location: (5,8)-(5,11)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (5,8)-(5,10) = "%(" - │ │ ├── content_loc: (5,10)-(5,10) = "" - │ │ ├── closing_loc: (5,10)-(5,11) = ")" - │ │ └── unescaped: "" - │ ├── opening_loc: (5,0)-(5,1) = "[" - │ └── closing_loc: (5,11)-(5,12) = "]" - ├── @ CallNode (location: (6,0)-(6,15)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (6,0)-(6,13)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (6,0)-(6,1) = "a" - │ │ ├── opening_loc: (6,1)-(6,2) = "(" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (6,2)-(6,12)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ InterpolatedStringNode (location: (6,2)-(6,12)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (6,2)-(6,12) = "<<-HEREDOC" - │ │ │ ├── parts: (length: 3) - │ │ │ │ ├── @ StringNode (location: (7,0)-(7,2)) - │ │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── content_loc: (7,0)-(7,2) = " " - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── unescaped: " " - │ │ │ │ ├── @ EmbeddedStatementsNode (location: (7,2)-(7,5)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── opening_loc: (7,2)-(7,4) = "\#{" - │ │ │ │ │ ├── statements: ∅ - │ │ │ │ │ └── closing_loc: (7,4)-(7,5) = "}" - │ │ │ │ └── @ StringNode (location: (7,5)-(8,0)) - │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── content_loc: (7,5)-(8,0) = "\n" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "\n" - │ │ │ └── closing_loc: (8,0)-(9,0) = "HEREDOC\n" - │ │ ├── closing_loc: (6,12)-(6,13) = ")" - │ │ └── block: ∅ - │ ├── call_operator_loc: (6,13)-(6,14) = "." - │ ├── name: :a - │ ├── message_loc: (6,14)-(6,15) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (9,0)-(9,8)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (9,0)-(9,6)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (9,0)-(9,1) = "a" - │ │ ├── opening_loc: (9,1)-(9,2) = "(" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (9,2)-(9,5)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ StringNode (location: (9,2)-(9,5)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (9,2)-(9,4) = "%(" - │ │ │ ├── content_loc: (9,4)-(9,4) = "" - │ │ │ ├── closing_loc: (9,4)-(9,5) = ")" - │ │ │ └── unescaped: "" - │ │ ├── closing_loc: (9,5)-(9,6) = ")" - │ │ └── block: ∅ - │ ├── call_operator_loc: (9,6)-(9,7) = "." - │ ├── name: :a - │ ├── message_loc: (9,7)-(9,8) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ HashNode (location: (10,0)-(10,30)) - │ ├── flags: newline - │ ├── opening_loc: (10,0)-(10,1) = "{" - │ ├── elements: (length: 2) - │ │ ├── @ AssocNode (location: (10,2)-(10,21)) - │ │ │ ├── flags: ∅ - │ │ │ ├── key: - │ │ │ │ @ StringNode (location: (10,2)-(10,7)) - │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ ├── opening_loc: (10,2)-(10,3) = "\"" - │ │ │ │ ├── content_loc: (10,3)-(10,6) = "foo" - │ │ │ │ ├── closing_loc: (10,6)-(10,7) = "\"" - │ │ │ │ └── unescaped: "foo" - │ │ │ ├── value: - │ │ │ │ @ InterpolatedStringNode (location: (10,11)-(10,21)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── opening_loc: (10,11)-(10,21) = "<<-HEREDOC" - │ │ │ │ ├── parts: (length: 3) - │ │ │ │ │ ├── @ StringNode (location: (11,0)-(11,2)) - │ │ │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ │ ├── content_loc: (11,0)-(11,2) = " " - │ │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ │ └── unescaped: " " - │ │ │ │ │ ├── @ EmbeddedStatementsNode (location: (11,2)-(11,5)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ ├── opening_loc: (11,2)-(11,4) = "\#{" - │ │ │ │ │ │ ├── statements: ∅ - │ │ │ │ │ │ └── closing_loc: (11,4)-(11,5) = "}" - │ │ │ │ │ └── @ StringNode (location: (11,5)-(12,0)) - │ │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── content_loc: (11,5)-(12,0) = "\n" - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── unescaped: "\n" - │ │ │ │ └── closing_loc: (12,0)-(13,0) = "HEREDOC\n" - │ │ │ └── operator_loc: (10,8)-(10,10) = "=>" - │ │ └── @ AssocSplatNode (location: (10,23)-(10,28)) - │ │ ├── flags: ∅ - │ │ ├── value: - │ │ │ @ CallNode (location: (10,25)-(10,28)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :baz - │ │ │ ├── message_loc: (10,25)-(10,28) = "baz" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: (10,23)-(10,25) = "**" - │ └── closing_loc: (10,29)-(10,30) = "}" - ├── @ HashNode (location: (13,0)-(13,23)) - │ ├── flags: newline - │ ├── opening_loc: (13,0)-(13,1) = "{" - │ ├── elements: (length: 2) - │ │ ├── @ AssocNode (location: (13,2)-(13,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── key: - │ │ │ │ @ StringNode (location: (13,2)-(13,7)) - │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ ├── opening_loc: (13,2)-(13,3) = "\"" - │ │ │ │ ├── content_loc: (13,3)-(13,6) = "foo" - │ │ │ │ ├── closing_loc: (13,6)-(13,7) = "\"" - │ │ │ │ └── unescaped: "foo" - │ │ │ ├── value: - │ │ │ │ @ StringNode (location: (13,11)-(13,14)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── opening_loc: (13,11)-(13,13) = "%(" - │ │ │ │ ├── content_loc: (13,13)-(13,13) = "" - │ │ │ │ ├── closing_loc: (13,13)-(13,14) = ")" - │ │ │ │ └── unescaped: "" - │ │ │ └── operator_loc: (13,8)-(13,10) = "=>" - │ │ └── @ AssocSplatNode (location: (13,16)-(13,21)) - │ │ ├── flags: ∅ - │ │ ├── value: - │ │ │ @ CallNode (location: (13,18)-(13,21)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :baz - │ │ │ ├── message_loc: (13,18)-(13,21) = "baz" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: (13,16)-(13,18) = "**" - │ └── closing_loc: (13,22)-(13,23) = "}" - ├── @ InterpolatedStringNode (location: (14,0)-(14,14)) - │ ├── flags: newline - │ ├── opening_loc: (14,0)-(14,1) = "\"" - │ ├── parts: (length: 5) - │ │ ├── @ EmbeddedVariableNode (location: (14,1)-(14,4)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (14,1)-(14,2) = "#" - │ │ │ └── variable: - │ │ │ @ InstanceVariableReadNode (location: (14,2)-(14,4)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :@a - │ │ ├── @ StringNode (location: (14,4)-(14,5)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (14,4)-(14,5) = " " - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: " " - │ │ ├── @ EmbeddedVariableNode (location: (14,5)-(14,9)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (14,5)-(14,6) = "#" - │ │ │ └── variable: - │ │ │ @ ClassVariableReadNode (location: (14,6)-(14,9)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :@@a - │ │ ├── @ StringNode (location: (14,9)-(14,10)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (14,9)-(14,10) = " " - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: " " - │ │ └── @ EmbeddedVariableNode (location: (14,10)-(14,13)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (14,10)-(14,11) = "#" - │ │ └── variable: - │ │ @ GlobalVariableReadNode (location: (14,11)-(14,13)) - │ │ ├── flags: ∅ - │ │ └── name: :$a - │ └── closing_loc: (14,13)-(14,14) = "\"" - ├── @ IntegerNode (location: (15,0)-(15,1)) - │ ├── flags: newline, static_literal, decimal - │ └── value: 0 - ├── @ CallNode (location: (16,0)-(16,3)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ IntegerNode (location: (16,1)-(16,3)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── call_operator_loc: ∅ - │ ├── name: :+@ - │ ├── message_loc: (16,0)-(16,1) = "+" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ IntegerNode (location: (17,0)-(17,1)) - │ ├── flags: newline, static_literal, decimal - │ └── value: 1 - ├── @ IntegerNode (location: (18,0)-(18,1)) - │ ├── flags: newline, static_literal, decimal - │ └── value: 1 - ├── @ RationalNode (location: (19,0)-(19,2)) - │ ├── flags: newline, static_literal, decimal - │ ├── numerator: 1 - │ └── denominator: 1 - ├── @ RationalNode (location: (20,0)-(20,4)) - │ ├── flags: newline, static_literal, decimal - │ ├── numerator: 3 - │ └── denominator: 2 - ├── @ RationalNode (location: (21,0)-(21,4)) - │ ├── flags: newline, static_literal, decimal - │ ├── numerator: 13 - │ └── denominator: 10 - ├── @ ImaginaryNode (location: (22,0)-(22,2)) - │ ├── flags: newline, static_literal - │ └── numeric: - │ @ IntegerNode (location: (22,0)-(22,1)) - │ ├── flags: static_literal, decimal - │ └── value: 5 - ├── @ ImaginaryNode (location: (23,0)-(23,3)) - │ ├── flags: newline, static_literal - │ └── numeric: - │ @ IntegerNode (location: (23,0)-(23,2)) - │ ├── flags: static_literal, decimal - │ └── value: -5 - ├── @ ImaginaryNode (location: (24,0)-(24,4)) - │ ├── flags: newline, static_literal - │ └── numeric: - │ @ FloatNode (location: (24,0)-(24,3)) - │ ├── flags: static_literal - │ └── value: 0.6 - ├── @ ImaginaryNode (location: (25,0)-(25,5)) - │ ├── flags: newline, static_literal - │ └── numeric: - │ @ FloatNode (location: (25,0)-(25,4)) - │ ├── flags: static_literal - │ └── value: -0.6 - ├── @ ImaginaryNode (location: (26,0)-(26,32)) - │ ├── flags: newline, static_literal - │ └── numeric: - │ @ IntegerNode (location: (26,0)-(26,31)) - │ ├── flags: static_literal, decimal - │ └── value: 1000000000000000000000000000000 - ├── @ ImaginaryNode (location: (27,0)-(27,3)) - │ ├── flags: newline, static_literal - │ └── numeric: - │ @ RationalNode (location: (27,0)-(27,2)) - │ ├── flags: static_literal, decimal - │ ├── numerator: 1 - │ └── denominator: 1 - ├── @ InterpolatedStringNode (location: (28,0)-(28,11)) - │ ├── flags: newline, static_literal - │ ├── opening_loc: ∅ - │ ├── parts: (length: 2) - │ │ ├── @ StringNode (location: (28,0)-(28,5)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: (28,0)-(28,1) = "\"" - │ │ │ ├── content_loc: (28,1)-(28,4) = "foo" - │ │ │ ├── closing_loc: (28,4)-(28,5) = "\"" - │ │ │ └── unescaped: "foo" - │ │ └── @ StringNode (location: (28,6)-(28,11)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: (28,6)-(28,7) = "\"" - │ │ ├── content_loc: (28,7)-(28,10) = "bar" - │ │ ├── closing_loc: (28,10)-(28,11) = "\"" - │ │ └── unescaped: "bar" - │ └── closing_loc: ∅ - ├── @ InterpolatedStringNode (location: (29,0)-(29,15)) - │ ├── flags: newline - │ ├── opening_loc: (29,0)-(29,1) = "\"" - │ ├── parts: (length: 2) - │ │ ├── @ StringNode (location: (29,1)-(29,8)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (29,1)-(29,8) = "foobar " - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "foobar " - │ │ └── @ EmbeddedStatementsNode (location: (29,8)-(29,14)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (29,8)-(29,10) = "\#{" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (29,10)-(29,13)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (29,10)-(29,13)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :baz - │ │ │ ├── message_loc: (29,10)-(29,13) = "baz" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── closing_loc: (29,13)-(29,14) = "}" - │ └── closing_loc: (29,14)-(29,15) = "\"" - ├── @ InterpolatedStringNode (location: (30,0)-(30,12)) - │ ├── flags: newline - │ ├── opening_loc: (30,0)-(30,1) = "\"" - │ ├── parts: (length: 3) - │ │ ├── @ StringNode (location: (30,1)-(30,4)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (30,1)-(30,4) = "foo" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "foo" - │ │ ├── @ EmbeddedStatementsNode (location: (30,4)-(30,8)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (30,4)-(30,6) = "\#{" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (30,6)-(30,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ IntegerNode (location: (30,6)-(30,7)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ └── closing_loc: (30,7)-(30,8) = "}" - │ │ └── @ StringNode (location: (30,8)-(30,11)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (30,8)-(30,11) = "bar" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "bar" - │ └── closing_loc: (30,11)-(30,12) = "\"" - ├── @ InterpolatedStringNode (location: (31,0)-(31,9)) - │ ├── flags: newline - │ ├── opening_loc: (31,0)-(31,1) = "\"" - │ ├── parts: (length: 2) - │ │ ├── @ StringNode (location: (31,1)-(31,5)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (31,1)-(31,5) = "\\\\\\\\" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "\\\\" - │ │ └── @ EmbeddedStatementsNode (location: (31,5)-(31,8)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (31,5)-(31,7) = "\#{" - │ │ ├── statements: ∅ - │ │ └── closing_loc: (31,7)-(31,8) = "}" - │ └── closing_loc: (31,8)-(31,9) = "\"" - ├── @ InterpolatedStringNode (location: (32,0)-(32,9)) - │ ├── flags: newline - │ ├── opening_loc: (32,0)-(32,1) = "\"" - │ ├── parts: (length: 2) - │ │ ├── @ EmbeddedStatementsNode (location: (32,1)-(32,4)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (32,1)-(32,3) = "\#{" - │ │ │ ├── statements: ∅ - │ │ │ └── closing_loc: (32,3)-(32,4) = "}" - │ │ └── @ StringNode (location: (32,4)-(32,8)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (32,4)-(32,8) = "\\\#{}" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "\#{}" - │ └── closing_loc: (32,8)-(32,9) = "\"" - ├── @ InterpolatedStringNode (location: (33,0)-(33,9)) - │ ├── flags: newline - │ ├── opening_loc: (33,0)-(33,1) = "\"" - │ ├── parts: (length: 2) - │ │ ├── @ StringNode (location: (33,1)-(33,5)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (33,1)-(33,5) = "\\\#{}" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "\#{}" - │ │ └── @ EmbeddedStatementsNode (location: (33,5)-(33,8)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (33,5)-(33,7) = "\#{" - │ │ ├── statements: ∅ - │ │ └── closing_loc: (33,7)-(33,8) = "}" - │ └── closing_loc: (33,8)-(33,9) = "\"" - ├── @ StringNode (location: (34,0)-(34,15)) - │ ├── flags: newline - │ ├── opening_loc: (34,0)-(34,1) = "\"" - │ ├── content_loc: (34,1)-(34,14) = "foo\\\\\\\#{@bar}" - │ ├── closing_loc: (34,14)-(34,15) = "\"" - │ └── unescaped: "foo\\\#{@bar}" - ├── @ StringNode (location: (35,0)-(35,4)) - │ ├── flags: newline - │ ├── opening_loc: (35,0)-(35,1) = "\"" - │ ├── content_loc: (35,1)-(35,3) = "\\\"" - │ ├── closing_loc: (35,3)-(35,4) = "\"" - │ └── unescaped: "\"" - ├── @ StringNode (location: (36,0)-(36,9)) - │ ├── flags: newline - │ ├── opening_loc: (36,0)-(36,1) = "\"" - │ ├── content_loc: (36,1)-(36,8) = "foo bar" - │ ├── closing_loc: (36,8)-(36,9) = "\"" - │ └── unescaped: "foo bar" - ├── @ StringNode (location: (37,0)-(37,10)) - │ ├── flags: newline - │ ├── opening_loc: (37,0)-(37,1) = "\"" - │ ├── content_loc: (37,1)-(37,9) = "foo\\nbar" - │ ├── closing_loc: (37,9)-(37,10) = "\"" - │ └── unescaped: "foo\nbar" - ├── @ XStringNode (location: (38,0)-(38,5)) - │ ├── flags: newline - │ ├── opening_loc: (38,0)-(38,1) = "`" - │ ├── content_loc: (38,1)-(38,4) = "foo" - │ ├── closing_loc: (38,4)-(38,5) = "`" - │ └── unescaped: "foo" - ├── @ InterpolatedXStringNode (location: (39,0)-(39,12)) - │ ├── flags: newline - │ ├── opening_loc: (39,0)-(39,1) = "`" - │ ├── parts: (length: 2) - │ │ ├── @ StringNode (location: (39,1)-(39,4)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (39,1)-(39,4) = "foo" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "foo" - │ │ └── @ EmbeddedStatementsNode (location: (39,4)-(39,11)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (39,4)-(39,6) = "\#{" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (39,6)-(39,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ InstanceVariableReadNode (location: (39,6)-(39,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :@bar - │ │ └── closing_loc: (39,10)-(39,11) = "}" - │ └── closing_loc: (39,11)-(39,12) = "`" - ├── @ XStringNode (location: (40,0)-(40,3)) - │ ├── flags: newline - │ ├── opening_loc: (40,0)-(40,1) = "`" - │ ├── content_loc: (40,1)-(40,2) = ")" - │ ├── closing_loc: (40,2)-(40,3) = "`" - │ └── unescaped: ")" - ├── @ XStringNode (location: (41,0)-(41,4)) - │ ├── flags: newline - │ ├── opening_loc: (41,0)-(41,1) = "`" - │ ├── content_loc: (41,1)-(41,3) = "\\`" - │ ├── closing_loc: (41,3)-(41,4) = "`" - │ └── unescaped: "`" - ├── @ XStringNode (location: (42,0)-(42,3)) - │ ├── flags: newline - │ ├── opening_loc: (42,0)-(42,1) = "`" - │ ├── content_loc: (42,1)-(42,2) = "\"" - │ ├── closing_loc: (42,2)-(42,3) = "`" - │ └── unescaped: "\"" - ├── @ SymbolNode (location: (43,0)-(43,4)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (43,0)-(43,1) = ":" - │ ├── value_loc: (43,1)-(43,4) = "foo" - │ ├── closing_loc: ∅ - │ └── unescaped: "foo" - ├── @ SymbolNode (location: (44,0)-(44,6)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (44,0)-(44,2) = ":\"" - │ ├── value_loc: (44,2)-(44,5) = "A B" - │ ├── closing_loc: (44,5)-(44,6) = "\"" - │ └── unescaped: "A B" - ├── @ SymbolNode (location: (45,0)-(45,4)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (45,0)-(45,1) = ":" - │ ├── value_loc: (45,1)-(45,4) = "foo" - │ ├── closing_loc: ∅ - │ └── unescaped: "foo" - ├── @ SymbolNode (location: (46,0)-(46,6)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (46,0)-(46,2) = ":\"" - │ ├── value_loc: (46,2)-(46,5) = "A B" - │ ├── closing_loc: (46,5)-(46,6) = "\"" - │ └── unescaped: "A B" - ├── @ SymbolNode (location: (47,0)-(47,7)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (47,0)-(47,2) = ":\"" - │ ├── value_loc: (47,2)-(47,6) = "A\\\"B" - │ ├── closing_loc: (47,6)-(47,7) = "\"" - │ └── unescaped: "A\"B" - ├── @ SymbolNode (location: (48,0)-(48,3)) - │ ├── flags: newline, static_literal - │ ├── opening_loc: (48,0)-(48,2) = ":\"" - │ ├── value_loc: (1,0)-(1,0) = "" - │ ├── closing_loc: (48,2)-(48,3) = "\"" - │ └── unescaped: "" - ├── @ RegularExpressionNode (location: (49,0)-(49,5)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (49,0)-(49,1) = "/" - │ ├── content_loc: (49,1)-(49,4) = "foo" - │ ├── closing_loc: (49,4)-(49,5) = "/" - │ └── unescaped: "foo" - ├── @ RegularExpressionNode (location: (50,0)-(50,28)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (50,0)-(50,1) = "/" - │ ├── content_loc: (50,1)-(50,27) = "[^-+',.\\/:@[:alnum:]\\[\\]]+" - │ ├── closing_loc: (50,27)-(50,28) = "/" - │ └── unescaped: "[^-+',./:@[:alnum:]\\[\\]]+" - ├── @ InterpolatedRegularExpressionNode (location: (51,0)-(51,12)) - │ ├── flags: newline - │ ├── opening_loc: (51,0)-(51,1) = "/" - │ ├── parts: (length: 2) - │ │ ├── @ StringNode (location: (51,1)-(51,4)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (51,1)-(51,4) = "foo" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "foo" - │ │ └── @ EmbeddedStatementsNode (location: (51,4)-(51,11)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (51,4)-(51,6) = "\#{" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (51,6)-(51,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ InstanceVariableReadNode (location: (51,6)-(51,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :@bar - │ │ └── closing_loc: (51,10)-(51,11) = "}" - │ └── closing_loc: (51,11)-(51,12) = "/" - ├── @ InterpolatedRegularExpressionNode (location: (52,0)-(52,15)) - │ ├── flags: newline, ignore_case, extended, multi_line - │ ├── opening_loc: (52,0)-(52,1) = "/" - │ ├── parts: (length: 2) - │ │ ├── @ StringNode (location: (52,1)-(52,4)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (52,1)-(52,4) = "foo" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "foo" - │ │ └── @ EmbeddedStatementsNode (location: (52,4)-(52,11)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (52,4)-(52,6) = "\#{" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (52,6)-(52,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ InstanceVariableReadNode (location: (52,6)-(52,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :@bar - │ │ └── closing_loc: (52,10)-(52,11) = "}" - │ └── closing_loc: (52,11)-(52,15) = "/imx" - ├── @ InterpolatedRegularExpressionNode (location: (53,0)-(53,13)) - │ ├── flags: newline, static_literal - │ ├── opening_loc: (53,0)-(53,1) = "/" - │ ├── parts: (length: 1) - │ │ └── @ EmbeddedStatementsNode (location: (53,1)-(53,12)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (53,1)-(53,3) = "\#{" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (53,3)-(53,11)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ StringNode (location: (53,3)-(53,11)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: (53,3)-(53,4) = "\"" - │ │ │ ├── content_loc: (53,4)-(53,10) = "\\u0000" - │ │ │ ├── closing_loc: (53,10)-(53,11) = "\"" - │ │ │ └── unescaped: "\u0000" - │ │ └── closing_loc: (53,11)-(53,12) = "}" - │ └── closing_loc: (53,12)-(53,13) = "/" - ├── @ RegularExpressionNode (location: (54,0)-(54,4)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (54,0)-(54,1) = "/" - │ ├── content_loc: (54,1)-(54,3) = "\\n" - │ ├── closing_loc: (54,3)-(54,4) = "/" - │ └── unescaped: "\\n" - ├── @ RegularExpressionNode (location: (55,0)-(55,4)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (55,0)-(55,1) = "/" - │ ├── content_loc: (55,1)-(55,3) = "\\n" - │ ├── closing_loc: (55,3)-(55,4) = "/" - │ └── unescaped: "\\n" - ├── @ RegularExpressionNode (location: (56,0)-(56,5)) - │ ├── flags: newline, static_literal, extended, forced_us_ascii_encoding - │ ├── opening_loc: (56,0)-(56,1) = "/" - │ ├── content_loc: (56,1)-(56,3) = "\\n" - │ ├── closing_loc: (56,3)-(56,5) = "/x" - │ └── unescaped: "\\n" - ├── @ RegularExpressionNode (location: (57,0)-(57,7)) - │ ├── flags: newline, static_literal, extended, forced_us_ascii_encoding - │ ├── opening_loc: (57,0)-(57,1) = "/" - │ ├── content_loc: (57,1)-(57,5) = "\\/\\/" - │ ├── closing_loc: (57,5)-(57,7) = "/x" - │ └── unescaped: "//" - ├── @ InterpolatedSymbolNode (location: (58,0)-(58,15)) - │ ├── flags: newline - │ ├── opening_loc: (58,0)-(58,2) = ":\"" - │ ├── parts: (length: 3) - │ │ ├── @ StringNode (location: (58,2)-(58,5)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (58,2)-(58,5) = "foo" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "foo" - │ │ ├── @ EmbeddedStatementsNode (location: (58,5)-(58,11)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (58,5)-(58,7) = "\#{" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (58,7)-(58,10)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (58,7)-(58,10)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :bar - │ │ │ │ ├── message_loc: (58,7)-(58,10) = "bar" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── closing_loc: (58,10)-(58,11) = "}" - │ │ └── @ StringNode (location: (58,11)-(58,14)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (58,11)-(58,14) = "baz" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "baz" - │ └── closing_loc: (58,14)-(58,15) = "\"" - ├── @ InterpolatedSymbolNode (location: (59,0)-(59,11)) - │ ├── flags: newline, static_literal - │ ├── opening_loc: (59,0)-(59,2) = ":\"" - │ ├── parts: (length: 1) - │ │ └── @ EmbeddedStatementsNode (location: (59,2)-(59,10)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (59,2)-(59,4) = "\#{" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (59,4)-(59,9)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ StringNode (location: (59,4)-(59,9)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: (59,4)-(59,5) = "\"" - │ │ │ ├── content_loc: (59,5)-(59,8) = "foo" - │ │ │ ├── closing_loc: (59,8)-(59,9) = "\"" - │ │ │ └── unescaped: "foo" - │ │ └── closing_loc: (59,9)-(59,10) = "}" - │ └── closing_loc: (59,10)-(59,11) = "\"" - ├── @ RangeNode (location: (60,0)-(60,14)) - │ ├── flags: newline - │ ├── left: - │ │ @ ParenthesesNode (location: (60,0)-(60,11)) - │ │ ├── flags: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (60,1)-(60,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (60,1)-(60,10)) - │ │ │ ├── flags: newline - │ │ │ ├── receiver: - │ │ │ │ @ FloatNode (location: (60,1)-(60,4)) - │ │ │ │ ├── flags: static_literal - │ │ │ │ └── value: 0.0 - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :/ - │ │ │ ├── message_loc: (60,5)-(60,6) = "/" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (60,7)-(60,10)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ FloatNode (location: (60,7)-(60,10)) - │ │ │ │ ├── flags: static_literal - │ │ │ │ └── value: 0.0 - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── opening_loc: (60,0)-(60,1) = "(" - │ │ └── closing_loc: (60,10)-(60,11) = ")" - │ ├── right: - │ │ @ IntegerNode (location: (60,13)-(60,14)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ └── operator_loc: (60,11)-(60,13) = ".." - ├── @ RangeNode (location: (61,0)-(61,14)) - │ ├── flags: newline - │ ├── left: - │ │ @ IntegerNode (location: (61,0)-(61,1)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── right: - │ │ @ ParenthesesNode (location: (61,3)-(61,14)) - │ │ ├── flags: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (61,4)-(61,13)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (61,4)-(61,13)) - │ │ │ ├── flags: newline - │ │ │ ├── receiver: - │ │ │ │ @ FloatNode (location: (61,4)-(61,7)) - │ │ │ │ ├── flags: static_literal - │ │ │ │ └── value: 0.0 - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :/ - │ │ │ ├── message_loc: (61,8)-(61,9) = "/" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (61,10)-(61,13)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ FloatNode (location: (61,10)-(61,13)) - │ │ │ │ ├── flags: static_literal - │ │ │ │ └── value: 0.0 - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── opening_loc: (61,3)-(61,4) = "(" - │ │ └── closing_loc: (61,13)-(61,14) = ")" - │ └── operator_loc: (61,1)-(61,3) = ".." - ├── @ RangeNode (location: (62,0)-(62,16)) - │ ├── flags: newline - │ ├── left: - │ │ @ ParenthesesNode (location: (62,0)-(62,11)) - │ │ ├── flags: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (62,1)-(62,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (62,1)-(62,10)) - │ │ │ ├── flags: newline - │ │ │ ├── receiver: - │ │ │ │ @ FloatNode (location: (62,1)-(62,4)) - │ │ │ │ ├── flags: static_literal - │ │ │ │ └── value: 0.0 - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :/ - │ │ │ ├── message_loc: (62,5)-(62,6) = "/" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (62,7)-(62,10)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ FloatNode (location: (62,7)-(62,10)) - │ │ │ │ ├── flags: static_literal - │ │ │ │ └── value: 0.0 - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── opening_loc: (62,0)-(62,1) = "(" - │ │ └── closing_loc: (62,10)-(62,11) = ")" - │ ├── right: - │ │ @ IntegerNode (location: (62,13)-(62,16)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 100 - │ └── operator_loc: (62,11)-(62,13) = ".." - ├── @ FloatNode (location: (63,0)-(63,4)) - │ ├── flags: newline, static_literal - │ └── value: -0.1 - ├── @ FloatNode (location: (64,0)-(64,3)) - │ ├── flags: newline, static_literal - │ └── value: 0.1 - ├── @ ArrayNode (location: (65,0)-(65,6)) - │ ├── flags: newline, static_literal - │ ├── elements: (length: 2) - │ │ ├── @ IntegerNode (location: (65,1)-(65,2)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── @ IntegerNode (location: (65,4)-(65,5)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── opening_loc: (65,0)-(65,1) = "[" - │ └── closing_loc: (65,5)-(65,6) = "]" - ├── @ ArrayNode (location: (66,0)-(66,11)) - │ ├── flags: newline - │ ├── elements: (length: 3) - │ │ ├── @ IntegerNode (location: (66,1)-(66,2)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── @ ParenthesesNode (location: (66,4)-(66,6)) - │ │ │ ├── flags: ∅ - │ │ │ ├── body: ∅ - │ │ │ ├── opening_loc: (66,4)-(66,5) = "(" - │ │ │ └── closing_loc: (66,5)-(66,6) = ")" - │ │ └── @ CallNode (location: (66,8)-(66,10)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :n2 - │ │ ├── message_loc: (66,8)-(66,10) = "n2" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── opening_loc: (66,0)-(66,1) = "[" - │ └── closing_loc: (66,10)-(66,11) = "]" - ├── @ ArrayNode (location: (67,0)-(67,3)) - │ ├── flags: newline, static_literal - │ ├── elements: (length: 1) - │ │ └── @ IntegerNode (location: (67,1)-(67,2)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── opening_loc: (67,0)-(67,1) = "[" - │ └── closing_loc: (67,2)-(67,3) = "]" - ├── @ ArrayNode (location: (68,0)-(68,2)) - │ ├── flags: newline, static_literal - │ ├── elements: (length: 0) - │ ├── opening_loc: (68,0)-(68,1) = "[" - │ └── closing_loc: (68,1)-(68,2) = "]" - ├── @ ArrayNode (location: (69,0)-(69,10)) - │ ├── flags: newline, contains_splat - │ ├── elements: (length: 2) - │ │ ├── @ IntegerNode (location: (69,1)-(69,2)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── @ SplatNode (location: (69,4)-(69,9)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (69,4)-(69,5) = "*" - │ │ └── expression: - │ │ @ InstanceVariableReadNode (location: (69,5)-(69,9)) - │ │ ├── flags: ∅ - │ │ └── name: :@foo - │ ├── opening_loc: (69,0)-(69,1) = "[" - │ └── closing_loc: (69,9)-(69,10) = "]" - ├── @ ArrayNode (location: (70,0)-(70,10)) - │ ├── flags: newline, contains_splat - │ ├── elements: (length: 2) - │ │ ├── @ SplatNode (location: (70,1)-(70,6)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (70,1)-(70,2) = "*" - │ │ │ └── expression: - │ │ │ @ InstanceVariableReadNode (location: (70,2)-(70,6)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :@foo - │ │ └── @ IntegerNode (location: (70,8)-(70,9)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── opening_loc: (70,0)-(70,1) = "[" - │ └── closing_loc: (70,9)-(70,10) = "]" - ├── @ ArrayNode (location: (71,0)-(71,14)) - │ ├── flags: newline, contains_splat - │ ├── elements: (length: 2) - │ │ ├── @ SplatNode (location: (71,1)-(71,6)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (71,1)-(71,2) = "*" - │ │ │ └── expression: - │ │ │ @ InstanceVariableReadNode (location: (71,2)-(71,6)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :@foo - │ │ └── @ SplatNode (location: (71,8)-(71,13)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (71,8)-(71,9) = "*" - │ │ └── expression: - │ │ @ InstanceVariableReadNode (location: (71,9)-(71,13)) - │ │ ├── flags: ∅ - │ │ └── name: :@baz - │ ├── opening_loc: (71,0)-(71,1) = "[" - │ └── closing_loc: (71,13)-(71,14) = "]" - ├── @ HashNode (location: (72,0)-(72,2)) - │ ├── flags: newline, static_literal - │ ├── opening_loc: (72,0)-(72,1) = "{" - │ ├── elements: (length: 0) - │ └── closing_loc: (72,1)-(72,2) = "}" - ├── @ HashNode (location: (73,0)-(73,12)) - │ ├── flags: newline - │ ├── opening_loc: (73,0)-(73,1) = "{" - │ ├── elements: (length: 1) - │ │ └── @ AssocNode (location: (73,2)-(73,10)) - │ │ ├── flags: ∅ - │ │ ├── key: - │ │ │ @ ParenthesesNode (location: (73,2)-(73,4)) - │ │ │ ├── flags: ∅ - │ │ │ ├── body: ∅ - │ │ │ ├── opening_loc: (73,2)-(73,3) = "(" - │ │ │ └── closing_loc: (73,3)-(73,4) = ")" - │ │ ├── value: - │ │ │ @ ParenthesesNode (location: (73,8)-(73,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── body: ∅ - │ │ │ ├── opening_loc: (73,8)-(73,9) = "(" - │ │ │ └── closing_loc: (73,9)-(73,10) = ")" - │ │ └── operator_loc: (73,5)-(73,7) = "=>" - │ └── closing_loc: (73,11)-(73,12) = "}" - ├── @ HashNode (location: (74,0)-(74,10)) - │ ├── flags: newline, static_literal - │ ├── opening_loc: (74,0)-(74,1) = "{" - │ ├── elements: (length: 1) - │ │ └── @ AssocNode (location: (74,2)-(74,8)) - │ │ ├── flags: static_literal - │ │ ├── key: - │ │ │ @ IntegerNode (location: (74,2)-(74,3)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── value: - │ │ │ @ IntegerNode (location: (74,7)-(74,8)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ └── operator_loc: (74,4)-(74,6) = "=>" - │ └── closing_loc: (74,9)-(74,10) = "}" - ├── @ HashNode (location: (75,0)-(75,18)) - │ ├── flags: newline, static_literal - │ ├── opening_loc: (75,0)-(75,1) = "{" - │ ├── elements: (length: 2) - │ │ ├── @ AssocNode (location: (75,2)-(75,8)) - │ │ │ ├── flags: static_literal - │ │ │ ├── key: - │ │ │ │ @ IntegerNode (location: (75,2)-(75,3)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ ├── value: - │ │ │ │ @ IntegerNode (location: (75,7)-(75,8)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 2 - │ │ │ └── operator_loc: (75,4)-(75,6) = "=>" - │ │ └── @ AssocNode (location: (75,10)-(75,16)) - │ │ ├── flags: static_literal - │ │ ├── key: - │ │ │ @ IntegerNode (location: (75,10)-(75,11)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 3 - │ │ ├── value: - │ │ │ @ IntegerNode (location: (75,15)-(75,16)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 4 - │ │ └── operator_loc: (75,12)-(75,14) = "=>" - │ └── closing_loc: (75,17)-(75,18) = "}" - ├── @ HashNode (location: (76,0)-(76,27)) - │ ├── flags: newline - │ ├── opening_loc: (76,0)-(76,1) = "{" - │ ├── elements: (length: 2) - │ │ ├── @ AssocNode (location: (76,2)-(76,19)) - │ │ │ ├── flags: ∅ - │ │ │ ├── key: - │ │ │ │ @ SymbolNode (location: (76,2)-(76,4)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── value_loc: (76,2)-(76,3) = "a" - │ │ │ │ ├── closing_loc: (76,3)-(76,4) = ":" - │ │ │ │ └── unescaped: "a" - │ │ │ ├── value: - │ │ │ │ @ ParenthesesNode (location: (76,5)-(76,19)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── body: - │ │ │ │ │ @ StatementsNode (location: (76,6)-(76,18)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── body: (length: 1) - │ │ │ │ │ └── @ RescueModifierNode (location: (76,6)-(76,18)) - │ │ │ │ │ ├── flags: newline - │ │ │ │ │ ├── expression: - │ │ │ │ │ │ @ IntegerNode (location: (76,6)-(76,7)) - │ │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ │ └── value: 1 - │ │ │ │ │ ├── keyword_loc: (76,8)-(76,14) = "rescue" - │ │ │ │ │ └── rescue_expression: - │ │ │ │ │ @ CallNode (location: (76,15)-(76,18)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :foo - │ │ │ │ │ ├── message_loc: (76,15)-(76,18) = "foo" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── opening_loc: (76,5)-(76,6) = "(" - │ │ │ │ └── closing_loc: (76,18)-(76,19) = ")" - │ │ │ └── operator_loc: ∅ - │ │ └── @ AssocNode (location: (76,21)-(76,25)) - │ │ ├── flags: static_literal - │ │ ├── key: - │ │ │ @ SymbolNode (location: (76,21)-(76,23)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (76,21)-(76,22) = "b" - │ │ │ ├── closing_loc: (76,22)-(76,23) = ":" - │ │ │ └── unescaped: "b" - │ │ ├── value: - │ │ │ @ IntegerNode (location: (76,24)-(76,25)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ └── operator_loc: ∅ - │ └── closing_loc: (76,26)-(76,27) = "}" - ├── @ HashNode (location: (77,0)-(77,14)) - │ ├── flags: newline, static_literal - │ ├── opening_loc: (77,0)-(77,1) = "{" - │ ├── elements: (length: 2) - │ │ ├── @ AssocNode (location: (77,2)-(77,6)) - │ │ │ ├── flags: static_literal - │ │ │ ├── key: - │ │ │ │ @ SymbolNode (location: (77,2)-(77,4)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── value_loc: (77,2)-(77,3) = "a" - │ │ │ │ ├── closing_loc: (77,3)-(77,4) = ":" - │ │ │ │ └── unescaped: "a" - │ │ │ ├── value: - │ │ │ │ @ IntegerNode (location: (77,5)-(77,6)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ └── operator_loc: ∅ - │ │ └── @ AssocNode (location: (77,8)-(77,12)) - │ │ ├── flags: static_literal - │ │ ├── key: - │ │ │ @ SymbolNode (location: (77,8)-(77,10)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (77,8)-(77,9) = "b" - │ │ │ ├── closing_loc: (77,9)-(77,10) = ":" - │ │ │ └── unescaped: "b" - │ │ ├── value: - │ │ │ @ IntegerNode (location: (77,11)-(77,12)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ └── operator_loc: ∅ - │ └── closing_loc: (77,13)-(77,14) = "}" - ├── @ HashNode (location: (78,0)-(78,9)) - │ ├── flags: newline, static_literal - │ ├── opening_loc: (78,0)-(78,1) = "{" - │ ├── elements: (length: 1) - │ │ └── @ AssocNode (location: (78,2)-(78,7)) - │ │ ├── flags: static_literal - │ │ ├── key: - │ │ │ @ SymbolNode (location: (78,2)-(78,4)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (78,2)-(78,3) = "a" - │ │ │ ├── closing_loc: (78,3)-(78,4) = ":" - │ │ │ └── unescaped: "a" - │ │ ├── value: - │ │ │ @ SymbolNode (location: (78,5)-(78,7)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (78,5)-(78,6) = ":" - │ │ │ ├── value_loc: (78,6)-(78,7) = "a" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "a" - │ │ └── operator_loc: ∅ - │ └── closing_loc: (78,8)-(78,9) = "}" - ├── @ HashNode (location: (79,0)-(79,15)) - │ ├── flags: newline, static_literal - │ ├── opening_loc: (79,0)-(79,1) = "{" - │ ├── elements: (length: 1) - │ │ └── @ AssocNode (location: (79,2)-(79,13)) - │ │ ├── flags: static_literal - │ │ ├── key: - │ │ │ @ SymbolNode (location: (79,2)-(79,8)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (79,2)-(79,4) = ":\"" - │ │ │ ├── value_loc: (79,4)-(79,7) = "a b" - │ │ │ ├── closing_loc: (79,7)-(79,8) = "\"" - │ │ │ └── unescaped: "a b" - │ │ ├── value: - │ │ │ @ IntegerNode (location: (79,12)-(79,13)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── operator_loc: (79,9)-(79,11) = "=>" - │ └── closing_loc: (79,14)-(79,15) = "}" - ├── @ HashNode (location: (80,0)-(80,12)) - │ ├── flags: newline, static_literal - │ ├── opening_loc: (80,0)-(80,1) = "{" - │ ├── elements: (length: 1) - │ │ └── @ AssocNode (location: (80,2)-(80,10)) - │ │ ├── flags: static_literal - │ │ ├── key: - │ │ │ @ SymbolNode (location: (80,2)-(80,5)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (80,2)-(80,3) = ":" - │ │ │ ├── value_loc: (80,3)-(80,5) = "-@" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "-@" - │ │ ├── value: - │ │ │ @ IntegerNode (location: (80,9)-(80,10)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── operator_loc: (80,6)-(80,8) = "=>" - │ └── closing_loc: (80,11)-(80,12) = "}" - ├── @ InterpolatedStringNode (location: (81,0)-(82,7)) - │ ├── flags: newline - │ ├── opening_loc: (81,0)-(81,1) = "\"" - │ ├── parts: (length: 4) - │ │ ├── @ EmbeddedStatementsNode (location: (81,1)-(81,4)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (81,1)-(81,3) = "\#{" - │ │ │ ├── statements: ∅ - │ │ │ └── closing_loc: (81,3)-(81,4) = "}" - │ │ ├── @ StringNode (location: (81,4)-(82,0)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (81,4)-(82,0) = "\n" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "\n" - │ │ ├── @ EmbeddedStatementsNode (location: (82,0)-(82,3)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (82,0)-(82,2) = "\#{" - │ │ │ ├── statements: ∅ - │ │ │ └── closing_loc: (82,2)-(82,3) = "}" - │ │ └── @ StringNode (location: (82,3)-(82,6)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (82,3)-(82,6) = "\\na" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "\na" - │ └── closing_loc: (82,6)-(82,7) = "\"" - ├── @ CallNode (location: (83,0)-(86,1)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (83,0)-(83,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (83,4)-(86,1)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (84,2)-(85,7)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ InterpolatedStringNode (location: (84,2)-(85,7)) - │ │ ├── flags: newline - │ │ ├── opening_loc: (84,2)-(84,3) = "\"" - │ │ ├── parts: (length: 4) - │ │ │ ├── @ EmbeddedStatementsNode (location: (84,3)-(84,6)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── opening_loc: (84,3)-(84,5) = "\#{" - │ │ │ │ ├── statements: ∅ - │ │ │ │ └── closing_loc: (84,5)-(84,6) = "}" - │ │ │ ├── @ StringNode (location: (84,6)-(85,0)) - │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── content_loc: (84,6)-(85,0) = "\n" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "\n" - │ │ │ ├── @ EmbeddedStatementsNode (location: (85,0)-(85,3)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── opening_loc: (85,0)-(85,2) = "\#{" - │ │ │ │ ├── statements: ∅ - │ │ │ │ └── closing_loc: (85,2)-(85,3) = "}" - │ │ │ └── @ StringNode (location: (85,3)-(85,6)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (85,3)-(85,6) = "\\na" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "\na" - │ │ └── closing_loc: (85,6)-(85,7) = "\"" - │ ├── opening_loc: (83,4)-(83,5) = "{" - │ └── closing_loc: (86,0)-(86,1) = "}" - ├── @ SymbolNode (location: (87,0)-(88,2)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (87,0)-(87,2) = ":\"" - │ ├── value_loc: (87,2)-(88,1) = "a\\\\\nb" - │ ├── closing_loc: (88,1)-(88,2) = "\"" - │ └── unescaped: "a\\\nb" - └── @ InterpolatedXStringNode (location: (89,0)-(91,2)) - ├── flags: newline - ├── opening_loc: (89,0)-(89,1) = "`" - ├── parts: (length: 3) - │ ├── @ StringNode (location: (89,1)-(90,0)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (89,1)-(90,0) = " x\n" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: " x\n" - │ ├── @ EmbeddedStatementsNode (location: (90,0)-(90,6)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (90,0)-(90,2) = "\#{" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (90,2)-(90,5)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (90,2)-(90,5)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (90,2)-(90,5) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── closing_loc: (90,5)-(90,6) = "}" - │ └── @ StringNode (location: (90,6)-(91,1)) - │ ├── flags: static_literal, frozen - │ ├── opening_loc: ∅ - │ ├── content_loc: (90,6)-(91,1) = "\n#" - │ ├── closing_loc: ∅ - │ └── unescaped: "\n#" - └── closing_loc: (91,1)-(91,2) = "`" diff --git a/test/prism/snapshots/unparser/corpus/literal/module.txt b/test/prism/snapshots/unparser/corpus/literal/module.txt deleted file mode 100644 index 9ad15d2dcd18fa..00000000000000 --- a/test/prism/snapshots/unparser/corpus/literal/module.txt +++ /dev/null @@ -1,121 +0,0 @@ -@ ProgramNode (location: (1,0)-(16,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(16,3)) - ├── flags: ∅ - └── body: (length: 4) - ├── @ ModuleNode (location: (1,0)-(2,3)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── module_keyword_loc: (1,0)-(1,6) = "module" - │ ├── constant_path: - │ │ @ ConstantReadNode (location: (1,7)-(1,8)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── body: ∅ - │ ├── end_keyword_loc: (2,0)-(2,3) = "end" - │ └── name: :A - ├── @ ModuleNode (location: (4,0)-(5,3)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── module_keyword_loc: (4,0)-(4,6) = "module" - │ ├── constant_path: - │ │ @ ConstantPathNode (location: (4,7)-(4,11)) - │ │ ├── flags: ∅ - │ │ ├── parent: - │ │ │ @ ConstantReadNode (location: (4,7)-(4,8)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :A - │ │ ├── name: :B - │ │ ├── delimiter_loc: (4,8)-(4,10) = "::" - │ │ └── name_loc: (4,10)-(4,11) = "B" - │ ├── body: ∅ - │ ├── end_keyword_loc: (5,0)-(5,3) = "end" - │ └── name: :B - ├── @ ModuleNode (location: (7,0)-(8,3)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── module_keyword_loc: (7,0)-(7,6) = "module" - │ ├── constant_path: - │ │ @ ConstantPathNode (location: (7,7)-(7,14)) - │ │ ├── flags: ∅ - │ │ ├── parent: - │ │ │ @ ConstantPathNode (location: (7,7)-(7,11)) - │ │ │ ├── flags: ∅ - │ │ │ ├── parent: - │ │ │ │ @ ConstantReadNode (location: (7,7)-(7,8)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :A - │ │ │ ├── name: :B - │ │ │ ├── delimiter_loc: (7,8)-(7,10) = "::" - │ │ │ └── name_loc: (7,10)-(7,11) = "B" - │ │ ├── name: :C - │ │ ├── delimiter_loc: (7,11)-(7,13) = "::" - │ │ └── name_loc: (7,13)-(7,14) = "C" - │ ├── body: ∅ - │ ├── end_keyword_loc: (8,0)-(8,3) = "end" - │ └── name: :C - └── @ ModuleNode (location: (10,0)-(16,3)) - ├── flags: newline - ├── locals: [] - ├── module_keyword_loc: (10,0)-(10,6) = "module" - ├── constant_path: - │ @ ConstantReadNode (location: (10,7)-(10,8)) - │ ├── flags: ∅ - │ └── name: :A - ├── body: - │ @ StatementsNode (location: (11,2)-(15,5)) - │ ├── flags: ∅ - │ └── body: (length: 2) - │ ├── @ CallNode (location: (11,2)-(11,16)) - │ │ ├── flags: newline, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :include - │ │ ├── message_loc: (11,2)-(11,9) = "include" - │ │ ├── opening_loc: (11,9)-(11,10) = "(" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (11,10)-(11,15)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ CallNode (location: (11,10)-(11,15)) - │ │ │ ├── flags: ∅ - │ │ │ ├── receiver: - │ │ │ │ @ ConstantReadNode (location: (11,10)-(11,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :B - │ │ │ ├── call_operator_loc: (11,11)-(11,12) = "." - │ │ │ ├── name: :new - │ │ │ ├── message_loc: (11,12)-(11,15) = "new" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── closing_loc: (11,15)-(11,16) = ")" - │ │ └── block: ∅ - │ └── @ DefNode (location: (13,2)-(15,5)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (13,6)-(13,9) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (14,4)-(14,8)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ SymbolNode (location: (14,4)-(14,8)) - │ │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (14,4)-(14,5) = ":" - │ │ ├── value_loc: (14,5)-(14,8) = "bar" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "bar" - │ ├── locals: [] - │ ├── def_keyword_loc: (13,2)-(13,5) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (15,2)-(15,5) = "end" - ├── end_keyword_loc: (16,0)-(16,3) = "end" - └── name: :A diff --git a/test/prism/snapshots/unparser/corpus/literal/opasgn.txt b/test/prism/snapshots/unparser/corpus/literal/opasgn.txt deleted file mode 100644 index 3df6248d4badb7..00000000000000 --- a/test/prism/snapshots/unparser/corpus/literal/opasgn.txt +++ /dev/null @@ -1,539 +0,0 @@ -@ ProgramNode (location: (1,0)-(24,10)) -├── flags: ∅ -├── locals: [:a, :h] -└── statements: - @ StatementsNode (location: (1,0)-(24,10)) - ├── flags: ∅ - └── body: (length: 24) - ├── @ LocalVariableOperatorWriteNode (location: (1,0)-(1,6)) - │ ├── flags: newline - │ ├── name_loc: (1,0)-(1,1) = "a" - │ ├── binary_operator_loc: (1,2)-(1,4) = "+=" - │ ├── value: - │ │ @ IntegerNode (location: (1,5)-(1,6)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── name: :a - │ ├── binary_operator: :+ - │ └── depth: 0 - ├── @ LocalVariableOperatorWriteNode (location: (2,0)-(2,6)) - │ ├── flags: newline - │ ├── name_loc: (2,0)-(2,1) = "a" - │ ├── binary_operator_loc: (2,2)-(2,4) = "-=" - │ ├── value: - │ │ @ IntegerNode (location: (2,5)-(2,6)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── name: :a - │ ├── binary_operator: :- - │ └── depth: 0 - ├── @ LocalVariableOperatorWriteNode (location: (3,0)-(3,7)) - │ ├── flags: newline - │ ├── name_loc: (3,0)-(3,1) = "a" - │ ├── binary_operator_loc: (3,2)-(3,5) = "**=" - │ ├── value: - │ │ @ IntegerNode (location: (3,6)-(3,7)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── name: :a - │ ├── binary_operator: :** - │ └── depth: 0 - ├── @ LocalVariableOperatorWriteNode (location: (4,0)-(4,6)) - │ ├── flags: newline - │ ├── name_loc: (4,0)-(4,1) = "a" - │ ├── binary_operator_loc: (4,2)-(4,4) = "*=" - │ ├── value: - │ │ @ IntegerNode (location: (4,5)-(4,6)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── name: :a - │ ├── binary_operator: :* - │ └── depth: 0 - ├── @ LocalVariableOperatorWriteNode (location: (5,0)-(5,6)) - │ ├── flags: newline - │ ├── name_loc: (5,0)-(5,1) = "a" - │ ├── binary_operator_loc: (5,2)-(5,4) = "/=" - │ ├── value: - │ │ @ IntegerNode (location: (5,5)-(5,6)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── name: :a - │ ├── binary_operator: :/ - │ └── depth: 0 - ├── @ LocalVariableAndWriteNode (location: (6,0)-(6,7)) - │ ├── flags: newline - │ ├── name_loc: (6,0)-(6,1) = "a" - │ ├── operator_loc: (6,2)-(6,5) = "&&=" - │ ├── value: - │ │ @ CallNode (location: (6,6)-(6,7)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :b - │ │ ├── message_loc: (6,6)-(6,7) = "b" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── name: :a - │ └── depth: 0 - ├── @ LocalVariableOrWriteNode (location: (7,0)-(7,7)) - │ ├── flags: newline - │ ├── name_loc: (7,0)-(7,1) = "a" - │ ├── operator_loc: (7,2)-(7,5) = "||=" - │ ├── value: - │ │ @ IntegerNode (location: (7,6)-(7,7)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── name: :a - │ └── depth: 0 - ├── @ CallNode (location: (8,0)-(8,13)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ParenthesesNode (location: (8,0)-(8,9)) - │ │ ├── flags: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (8,1)-(8,8)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ LocalVariableOrWriteNode (location: (8,1)-(8,8)) - │ │ │ ├── flags: newline - │ │ │ ├── name_loc: (8,1)-(8,2) = "a" - │ │ │ ├── operator_loc: (8,3)-(8,6) = "||=" - │ │ │ ├── value: - │ │ │ │ @ IntegerNode (location: (8,7)-(8,8)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 2 - │ │ │ ├── name: :a - │ │ │ └── depth: 0 - │ │ ├── opening_loc: (8,0)-(8,1) = "(" - │ │ └── closing_loc: (8,8)-(8,9) = ")" - │ ├── call_operator_loc: (8,9)-(8,10) = "." - │ ├── name: :bar - │ ├── message_loc: (8,10)-(8,13) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (9,0)-(9,17)) - │ ├── flags: newline, attribute_write - │ ├── receiver: - │ │ @ ParenthesesNode (location: (9,0)-(9,10)) - │ │ ├── flags: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (9,1)-(9,9)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ LocalVariableOrWriteNode (location: (9,1)-(9,9)) - │ │ │ ├── flags: newline - │ │ │ ├── name_loc: (9,1)-(9,2) = "h" - │ │ │ ├── operator_loc: (9,3)-(9,6) = "||=" - │ │ │ ├── value: - │ │ │ │ @ HashNode (location: (9,7)-(9,9)) - │ │ │ │ ├── flags: static_literal - │ │ │ │ ├── opening_loc: (9,7)-(9,8) = "{" - │ │ │ │ ├── elements: (length: 0) - │ │ │ │ └── closing_loc: (9,8)-(9,9) = "}" - │ │ │ ├── name: :h - │ │ │ └── depth: 0 - │ │ ├── opening_loc: (9,0)-(9,1) = "(" - │ │ └── closing_loc: (9,9)-(9,10) = ")" - │ ├── call_operator_loc: ∅ - │ ├── name: :[]= - │ ├── message_loc: (9,10)-(9,13) = "[k]" - │ ├── opening_loc: (9,10)-(9,11) = "[" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (9,11)-(9,17)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (9,11)-(9,12)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :k - │ │ │ ├── message_loc: (9,11)-(9,12) = "k" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── @ CallNode (location: (9,16)-(9,17)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :v - │ │ ├── message_loc: (9,16)-(9,17) = "v" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (9,12)-(9,13) = "]" - │ └── block: ∅ - ├── @ CallOperatorWriteNode (location: (10,0)-(10,8)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (10,0)-(10,1)) - │ │ ├── flags: ∅ - │ │ ├── name: :a - │ │ └── depth: 0 - │ ├── call_operator_loc: (10,1)-(10,2) = "." - │ ├── message_loc: (10,2)-(10,3) = "b" - │ ├── read_name: :b - │ ├── write_name: :b= - │ ├── binary_operator: :+ - │ ├── binary_operator_loc: (10,4)-(10,6) = "+=" - │ └── value: - │ @ IntegerNode (location: (10,7)-(10,8)) - │ ├── flags: static_literal, decimal - │ └── value: 2 - ├── @ CallOperatorWriteNode (location: (11,0)-(11,8)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (11,0)-(11,1)) - │ │ ├── flags: ∅ - │ │ ├── name: :a - │ │ └── depth: 0 - │ ├── call_operator_loc: (11,1)-(11,2) = "." - │ ├── message_loc: (11,2)-(11,3) = "b" - │ ├── read_name: :b - │ ├── write_name: :b= - │ ├── binary_operator: :- - │ ├── binary_operator_loc: (11,4)-(11,6) = "-=" - │ └── value: - │ @ IntegerNode (location: (11,7)-(11,8)) - │ ├── flags: static_literal, decimal - │ └── value: 2 - ├── @ CallOperatorWriteNode (location: (12,0)-(12,9)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (12,0)-(12,1)) - │ │ ├── flags: ∅ - │ │ ├── name: :a - │ │ └── depth: 0 - │ ├── call_operator_loc: (12,1)-(12,2) = "." - │ ├── message_loc: (12,2)-(12,3) = "b" - │ ├── read_name: :b - │ ├── write_name: :b= - │ ├── binary_operator: :** - │ ├── binary_operator_loc: (12,4)-(12,7) = "**=" - │ └── value: - │ @ IntegerNode (location: (12,8)-(12,9)) - │ ├── flags: static_literal, decimal - │ └── value: 2 - ├── @ CallOperatorWriteNode (location: (13,0)-(13,8)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (13,0)-(13,1)) - │ │ ├── flags: ∅ - │ │ ├── name: :a - │ │ └── depth: 0 - │ ├── call_operator_loc: (13,1)-(13,2) = "." - │ ├── message_loc: (13,2)-(13,3) = "b" - │ ├── read_name: :b - │ ├── write_name: :b= - │ ├── binary_operator: :* - │ ├── binary_operator_loc: (13,4)-(13,6) = "*=" - │ └── value: - │ @ IntegerNode (location: (13,7)-(13,8)) - │ ├── flags: static_literal, decimal - │ └── value: 2 - ├── @ CallOperatorWriteNode (location: (14,0)-(14,8)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (14,0)-(14,1)) - │ │ ├── flags: ∅ - │ │ ├── name: :a - │ │ └── depth: 0 - │ ├── call_operator_loc: (14,1)-(14,2) = "." - │ ├── message_loc: (14,2)-(14,3) = "b" - │ ├── read_name: :b - │ ├── write_name: :b= - │ ├── binary_operator: :/ - │ ├── binary_operator_loc: (14,4)-(14,6) = "/=" - │ └── value: - │ @ IntegerNode (location: (14,7)-(14,8)) - │ ├── flags: static_literal, decimal - │ └── value: 2 - ├── @ CallAndWriteNode (location: (15,0)-(15,9)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (15,0)-(15,1)) - │ │ ├── flags: ∅ - │ │ ├── name: :a - │ │ └── depth: 0 - │ ├── call_operator_loc: (15,1)-(15,2) = "." - │ ├── message_loc: (15,2)-(15,3) = "b" - │ ├── read_name: :b - │ ├── write_name: :b= - │ ├── operator_loc: (15,4)-(15,7) = "&&=" - │ └── value: - │ @ CallNode (location: (15,8)-(15,9)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :b - │ ├── message_loc: (15,8)-(15,9) = "b" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallOrWriteNode (location: (16,0)-(16,9)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (16,0)-(16,1)) - │ │ ├── flags: ∅ - │ │ ├── name: :a - │ │ └── depth: 0 - │ ├── call_operator_loc: (16,1)-(16,2) = "." - │ ├── message_loc: (16,2)-(16,3) = "b" - │ ├── read_name: :b - │ ├── write_name: :b= - │ ├── operator_loc: (16,4)-(16,7) = "||=" - │ └── value: - │ @ IntegerNode (location: (16,8)-(16,9)) - │ ├── flags: static_literal, decimal - │ └── value: 2 - ├── @ IndexOperatorWriteNode (location: (17,0)-(17,9)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (17,0)-(17,1)) - │ │ ├── flags: ∅ - │ │ ├── name: :a - │ │ └── depth: 0 - │ ├── call_operator_loc: ∅ - │ ├── opening_loc: (17,1)-(17,2) = "[" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (17,2)-(17,3)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (17,2)-(17,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :b - │ │ ├── message_loc: (17,2)-(17,3) = "b" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (17,3)-(17,4) = "]" - │ ├── block: ∅ - │ ├── binary_operator: :+ - │ ├── binary_operator_loc: (17,5)-(17,7) = "+=" - │ └── value: - │ @ IntegerNode (location: (17,8)-(17,9)) - │ ├── flags: static_literal, decimal - │ └── value: 2 - ├── @ IndexOperatorWriteNode (location: (18,0)-(18,9)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (18,0)-(18,1)) - │ │ ├── flags: ∅ - │ │ ├── name: :a - │ │ └── depth: 0 - │ ├── call_operator_loc: ∅ - │ ├── opening_loc: (18,1)-(18,2) = "[" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (18,2)-(18,3)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (18,2)-(18,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :b - │ │ ├── message_loc: (18,2)-(18,3) = "b" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (18,3)-(18,4) = "]" - │ ├── block: ∅ - │ ├── binary_operator: :- - │ ├── binary_operator_loc: (18,5)-(18,7) = "-=" - │ └── value: - │ @ IntegerNode (location: (18,8)-(18,9)) - │ ├── flags: static_literal, decimal - │ └── value: 2 - ├── @ IndexOperatorWriteNode (location: (19,0)-(19,10)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (19,0)-(19,1)) - │ │ ├── flags: ∅ - │ │ ├── name: :a - │ │ └── depth: 0 - │ ├── call_operator_loc: ∅ - │ ├── opening_loc: (19,1)-(19,2) = "[" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (19,2)-(19,3)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (19,2)-(19,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :b - │ │ ├── message_loc: (19,2)-(19,3) = "b" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (19,3)-(19,4) = "]" - │ ├── block: ∅ - │ ├── binary_operator: :** - │ ├── binary_operator_loc: (19,5)-(19,8) = "**=" - │ └── value: - │ @ IntegerNode (location: (19,9)-(19,10)) - │ ├── flags: static_literal, decimal - │ └── value: 2 - ├── @ IndexOperatorWriteNode (location: (20,0)-(20,9)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (20,0)-(20,1)) - │ │ ├── flags: ∅ - │ │ ├── name: :a - │ │ └── depth: 0 - │ ├── call_operator_loc: ∅ - │ ├── opening_loc: (20,1)-(20,2) = "[" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (20,2)-(20,3)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (20,2)-(20,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :b - │ │ ├── message_loc: (20,2)-(20,3) = "b" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (20,3)-(20,4) = "]" - │ ├── block: ∅ - │ ├── binary_operator: :* - │ ├── binary_operator_loc: (20,5)-(20,7) = "*=" - │ └── value: - │ @ IntegerNode (location: (20,8)-(20,9)) - │ ├── flags: static_literal, decimal - │ └── value: 2 - ├── @ IndexOperatorWriteNode (location: (21,0)-(21,9)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (21,0)-(21,1)) - │ │ ├── flags: ∅ - │ │ ├── name: :a - │ │ └── depth: 0 - │ ├── call_operator_loc: ∅ - │ ├── opening_loc: (21,1)-(21,2) = "[" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (21,2)-(21,3)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (21,2)-(21,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :b - │ │ ├── message_loc: (21,2)-(21,3) = "b" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (21,3)-(21,4) = "]" - │ ├── block: ∅ - │ ├── binary_operator: :/ - │ ├── binary_operator_loc: (21,5)-(21,7) = "/=" - │ └── value: - │ @ IntegerNode (location: (21,8)-(21,9)) - │ ├── flags: static_literal, decimal - │ └── value: 2 - ├── @ IndexAndWriteNode (location: (22,0)-(22,10)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (22,0)-(22,1)) - │ │ ├── flags: ∅ - │ │ ├── name: :a - │ │ └── depth: 0 - │ ├── call_operator_loc: ∅ - │ ├── opening_loc: (22,1)-(22,2) = "[" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (22,2)-(22,3)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (22,2)-(22,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :b - │ │ ├── message_loc: (22,2)-(22,3) = "b" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (22,3)-(22,4) = "]" - │ ├── block: ∅ - │ ├── operator_loc: (22,5)-(22,8) = "&&=" - │ └── value: - │ @ CallNode (location: (22,9)-(22,10)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :b - │ ├── message_loc: (22,9)-(22,10) = "b" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ IndexOrWriteNode (location: (23,0)-(23,10)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (23,0)-(23,1)) - │ │ ├── flags: ∅ - │ │ ├── name: :a - │ │ └── depth: 0 - │ ├── call_operator_loc: ∅ - │ ├── opening_loc: (23,1)-(23,2) = "[" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (23,2)-(23,3)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (23,2)-(23,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :b - │ │ ├── message_loc: (23,2)-(23,3) = "b" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (23,3)-(23,4) = "]" - │ ├── block: ∅ - │ ├── operator_loc: (23,5)-(23,8) = "||=" - │ └── value: - │ @ IntegerNode (location: (23,9)-(23,10)) - │ ├── flags: static_literal, decimal - │ └── value: 2 - └── @ CallOperatorWriteNode (location: (24,0)-(24,10)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (24,0)-(24,3)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (24,0)-(24,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: (24,3)-(24,4) = "." - ├── message_loc: (24,4)-(24,5) = "A" - ├── read_name: :A - ├── write_name: :A= - ├── binary_operator: :+ - ├── binary_operator_loc: (24,6)-(24,8) = "+=" - └── value: - @ IntegerNode (location: (24,9)-(24,10)) - ├── flags: static_literal, decimal - └── value: 1 diff --git a/test/prism/snapshots/unparser/corpus/literal/pattern.txt b/test/prism/snapshots/unparser/corpus/literal/pattern.txt deleted file mode 100644 index 200837c4503ce9..00000000000000 --- a/test/prism/snapshots/unparser/corpus/literal/pattern.txt +++ /dev/null @@ -1,542 +0,0 @@ -@ ProgramNode (location: (1,0)-(41,8)) -├── flags: ∅ -├── locals: [:a, :x, :y] -└── statements: - @ StatementsNode (location: (1,0)-(41,8)) - ├── flags: ∅ - └── body: (length: 4) - ├── @ CaseMatchNode (location: (1,0)-(33,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (1,5)-(1,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (1,5)-(1,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 15) - │ │ ├── @ InNode (location: (2,0)-(3,6)) - │ │ │ ├── flags: ∅ - │ │ │ ├── pattern: - │ │ │ │ @ ArrayPatternNode (location: (2,3)-(2,17)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── constant: - │ │ │ │ │ @ ConstantReadNode (location: (2,3)-(2,4)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── name: :A - │ │ │ │ ├── requireds: (length: 2) - │ │ │ │ │ ├── @ IntegerNode (location: (2,5)-(2,6)) - │ │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ │ └── value: 1 - │ │ │ │ │ └── @ IntegerNode (location: (2,8)-(2,9)) - │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ └── value: 2 - │ │ │ │ ├── rest: - │ │ │ │ │ @ SplatNode (location: (2,11)-(2,13)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── operator_loc: (2,11)-(2,12) = "*" - │ │ │ │ │ └── expression: - │ │ │ │ │ @ LocalVariableTargetNode (location: (2,12)-(2,13)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── name: :a - │ │ │ │ │ └── depth: 0 - │ │ │ │ ├── posts: (length: 1) - │ │ │ │ │ └── @ IntegerNode (location: (2,15)-(2,16)) - │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ └── value: 3 - │ │ │ │ ├── opening_loc: (2,4)-(2,5) = "[" - │ │ │ │ └── closing_loc: (2,16)-(2,17) = "]" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (3,2)-(3,6)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ TrueNode (location: (3,2)-(3,6)) - │ │ │ │ └── flags: newline, static_literal - │ │ │ ├── in_loc: (2,0)-(2,2) = "in" - │ │ │ └── then_loc: (2,18)-(2,22) = "then" - │ │ ├── @ InNode (location: (4,0)-(5,3)) - │ │ │ ├── flags: ∅ - │ │ │ ├── pattern: - │ │ │ │ @ ArrayPatternNode (location: (4,3)-(4,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── constant: ∅ - │ │ │ │ ├── requireds: (length: 2) - │ │ │ │ │ ├── @ IntegerNode (location: (4,4)-(4,5)) - │ │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ │ └── value: 1 - │ │ │ │ │ └── @ IntegerNode (location: (4,7)-(4,8)) - │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ └── value: 2 - │ │ │ │ ├── rest: - │ │ │ │ │ @ ImplicitRestNode (location: (4,8)-(4,9)) - │ │ │ │ │ └── flags: ∅ - │ │ │ │ ├── posts: (length: 0) - │ │ │ │ ├── opening_loc: (4,3)-(4,4) = "[" - │ │ │ │ └── closing_loc: (4,10)-(4,11) = "]" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (5,2)-(5,3)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (5,2)-(5,3)) - │ │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :y - │ │ │ │ ├── message_loc: (5,2)-(5,3) = "y" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── in_loc: (4,0)-(4,2) = "in" - │ │ │ └── then_loc: (4,12)-(4,16) = "then" - │ │ ├── @ InNode (location: (6,0)-(7,6)) - │ │ │ ├── flags: ∅ - │ │ │ ├── pattern: - │ │ │ │ @ HashPatternNode (location: (6,3)-(6,8)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── constant: - │ │ │ │ │ @ ConstantReadNode (location: (6,3)-(6,4)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── name: :A - │ │ │ │ ├── elements: (length: 1) - │ │ │ │ │ └── @ AssocNode (location: (6,5)-(6,7)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── key: - │ │ │ │ │ │ @ SymbolNode (location: (6,5)-(6,7)) - │ │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ │ ├── value_loc: (6,5)-(6,6) = "x" - │ │ │ │ │ │ ├── closing_loc: (6,6)-(6,7) = ":" - │ │ │ │ │ │ └── unescaped: "x" - │ │ │ │ │ ├── value: - │ │ │ │ │ │ @ ImplicitNode (location: (6,5)-(6,6)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ └── value: - │ │ │ │ │ │ @ LocalVariableTargetNode (location: (6,5)-(6,6)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ ├── name: :x - │ │ │ │ │ │ └── depth: 0 - │ │ │ │ │ └── operator_loc: ∅ - │ │ │ │ ├── rest: ∅ - │ │ │ │ ├── opening_loc: (6,4)-(6,5) = "(" - │ │ │ │ └── closing_loc: (6,7)-(6,8) = ")" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (7,2)-(7,6)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ TrueNode (location: (7,2)-(7,6)) - │ │ │ │ └── flags: newline, static_literal - │ │ │ ├── in_loc: (6,0)-(6,2) = "in" - │ │ │ └── then_loc: (6,9)-(6,13) = "then" - │ │ ├── @ InNode (location: (8,0)-(9,6)) - │ │ │ ├── flags: ∅ - │ │ │ ├── pattern: - │ │ │ │ @ HashPatternNode (location: (8,3)-(8,8)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── constant: ∅ - │ │ │ │ ├── elements: (length: 0) - │ │ │ │ ├── rest: - │ │ │ │ │ @ AssocSplatNode (location: (8,4)-(8,7)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── value: - │ │ │ │ │ │ @ LocalVariableTargetNode (location: (8,6)-(8,7)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ ├── name: :a - │ │ │ │ │ │ └── depth: 0 - │ │ │ │ │ └── operator_loc: (8,4)-(8,6) = "**" - │ │ │ │ ├── opening_loc: (8,3)-(8,4) = "{" - │ │ │ │ └── closing_loc: (8,7)-(8,8) = "}" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (9,2)-(9,6)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ TrueNode (location: (9,2)-(9,6)) - │ │ │ │ └── flags: newline, static_literal - │ │ │ ├── in_loc: (8,0)-(8,2) = "in" - │ │ │ └── then_loc: (8,9)-(8,13) = "then" - │ │ ├── @ InNode (location: (10,0)-(11,6)) - │ │ │ ├── flags: ∅ - │ │ │ ├── pattern: - │ │ │ │ @ IfNode (location: (10,3)-(10,13)) - │ │ │ │ ├── flags: newline - │ │ │ │ ├── if_keyword_loc: (10,6)-(10,8) = "if" - │ │ │ │ ├── predicate: - │ │ │ │ │ @ TrueNode (location: (10,9)-(10,13)) - │ │ │ │ │ └── flags: static_literal - │ │ │ │ ├── then_keyword_loc: ∅ - │ │ │ │ ├── statements: - │ │ │ │ │ @ StatementsNode (location: (10,3)-(10,5)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── body: (length: 1) - │ │ │ │ │ └── @ HashPatternNode (location: (10,3)-(10,5)) - │ │ │ │ │ ├── flags: newline - │ │ │ │ │ ├── constant: ∅ - │ │ │ │ │ ├── elements: (length: 0) - │ │ │ │ │ ├── rest: ∅ - │ │ │ │ │ ├── opening_loc: (10,3)-(10,4) = "{" - │ │ │ │ │ └── closing_loc: (10,4)-(10,5) = "}" - │ │ │ │ ├── subsequent: ∅ - │ │ │ │ └── end_keyword_loc: ∅ - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (11,2)-(11,6)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ TrueNode (location: (11,2)-(11,6)) - │ │ │ │ └── flags: newline, static_literal - │ │ │ ├── in_loc: (10,0)-(10,2) = "in" - │ │ │ └── then_loc: (10,14)-(10,18) = "then" - │ │ ├── @ InNode (location: (12,0)-(13,6)) - │ │ │ ├── flags: ∅ - │ │ │ ├── pattern: - │ │ │ │ @ ArrayPatternNode (location: (12,3)-(12,12)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── constant: ∅ - │ │ │ │ ├── requireds: (length: 2) - │ │ │ │ │ ├── @ LocalVariableTargetNode (location: (12,4)-(12,5)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ ├── name: :x - │ │ │ │ │ │ └── depth: 0 - │ │ │ │ │ └── @ LocalVariableTargetNode (location: (12,7)-(12,8)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── name: :y - │ │ │ │ │ └── depth: 0 - │ │ │ │ ├── rest: - │ │ │ │ │ @ SplatNode (location: (12,10)-(12,11)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── operator_loc: (12,10)-(12,11) = "*" - │ │ │ │ │ └── expression: ∅ - │ │ │ │ ├── posts: (length: 0) - │ │ │ │ ├── opening_loc: (12,3)-(12,4) = "[" - │ │ │ │ └── closing_loc: (12,11)-(12,12) = "]" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (13,2)-(13,6)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ TrueNode (location: (13,2)-(13,6)) - │ │ │ │ └── flags: newline, static_literal - │ │ │ ├── in_loc: (12,0)-(12,2) = "in" - │ │ │ └── then_loc: (12,13)-(12,17) = "then" - │ │ ├── @ InNode (location: (14,0)-(15,6)) - │ │ │ ├── flags: ∅ - │ │ │ ├── pattern: - │ │ │ │ @ HashPatternNode (location: (14,3)-(14,16)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── constant: ∅ - │ │ │ │ ├── elements: (length: 2) - │ │ │ │ │ ├── @ AssocNode (location: (14,4)-(14,8)) - │ │ │ │ │ │ ├── flags: static_literal - │ │ │ │ │ │ ├── key: - │ │ │ │ │ │ │ @ SymbolNode (location: (14,4)-(14,6)) - │ │ │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ │ │ ├── value_loc: (14,4)-(14,5) = "a" - │ │ │ │ │ │ │ ├── closing_loc: (14,5)-(14,6) = ":" - │ │ │ │ │ │ │ └── unescaped: "a" - │ │ │ │ │ │ ├── value: - │ │ │ │ │ │ │ @ IntegerNode (location: (14,7)-(14,8)) - │ │ │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ │ │ └── value: 1 - │ │ │ │ │ │ └── operator_loc: ∅ - │ │ │ │ │ └── @ AssocNode (location: (14,10)-(14,15)) - │ │ │ │ │ ├── flags: static_literal - │ │ │ │ │ ├── key: - │ │ │ │ │ │ @ SymbolNode (location: (14,10)-(14,13)) - │ │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ │ ├── value_loc: (14,10)-(14,12) = "aa" - │ │ │ │ │ │ ├── closing_loc: (14,12)-(14,13) = ":" - │ │ │ │ │ │ └── unescaped: "aa" - │ │ │ │ │ ├── value: - │ │ │ │ │ │ @ IntegerNode (location: (14,14)-(14,15)) - │ │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ │ └── value: 2 - │ │ │ │ │ └── operator_loc: ∅ - │ │ │ │ ├── rest: ∅ - │ │ │ │ ├── opening_loc: (14,3)-(14,4) = "{" - │ │ │ │ └── closing_loc: (14,15)-(14,16) = "}" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (15,2)-(15,6)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ TrueNode (location: (15,2)-(15,6)) - │ │ │ │ └── flags: newline, static_literal - │ │ │ ├── in_loc: (14,0)-(14,2) = "in" - │ │ │ └── then_loc: (14,17)-(14,21) = "then" - │ │ ├── @ InNode (location: (16,0)-(17,6)) - │ │ │ ├── flags: ∅ - │ │ │ ├── pattern: - │ │ │ │ @ HashPatternNode (location: (16,3)-(16,5)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── constant: ∅ - │ │ │ │ ├── elements: (length: 0) - │ │ │ │ ├── rest: ∅ - │ │ │ │ ├── opening_loc: (16,3)-(16,4) = "{" - │ │ │ │ └── closing_loc: (16,4)-(16,5) = "}" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (17,2)-(17,6)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ TrueNode (location: (17,2)-(17,6)) - │ │ │ │ └── flags: newline, static_literal - │ │ │ ├── in_loc: (16,0)-(16,2) = "in" - │ │ │ └── then_loc: (16,6)-(16,10) = "then" - │ │ ├── @ InNode (location: (18,0)-(19,6)) - │ │ │ ├── flags: ∅ - │ │ │ ├── pattern: - │ │ │ │ @ HashPatternNode (location: (18,3)-(18,10)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── constant: ∅ - │ │ │ │ ├── elements: (length: 0) - │ │ │ │ ├── rest: - │ │ │ │ │ @ NoKeywordsParameterNode (location: (18,4)-(18,9)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── operator_loc: (18,4)-(18,6) = "**" - │ │ │ │ │ └── keyword_loc: (18,6)-(18,9) = "nil" - │ │ │ │ ├── opening_loc: (18,3)-(18,4) = "{" - │ │ │ │ └── closing_loc: (18,9)-(18,10) = "}" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (19,2)-(19,6)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ TrueNode (location: (19,2)-(19,6)) - │ │ │ │ └── flags: newline, static_literal - │ │ │ ├── in_loc: (18,0)-(18,2) = "in" - │ │ │ └── then_loc: (18,11)-(18,15) = "then" - │ │ ├── @ InNode (location: (20,0)-(21,6)) - │ │ │ ├── flags: ∅ - │ │ │ ├── pattern: - │ │ │ │ @ HashPatternNode (location: (20,3)-(20,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── constant: ∅ - │ │ │ │ ├── elements: (length: 1) - │ │ │ │ │ └── @ AssocNode (location: (20,4)-(20,10)) - │ │ │ │ │ ├── flags: static_literal - │ │ │ │ │ ├── key: - │ │ │ │ │ │ @ SymbolNode (location: (20,4)-(20,8)) - │ │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ │ │ ├── opening_loc: (20,4)-(20,5) = "\"" - │ │ │ │ │ │ ├── value_loc: (20,5)-(20,6) = "a" - │ │ │ │ │ │ ├── closing_loc: (20,6)-(20,8) = "\":" - │ │ │ │ │ │ └── unescaped: "a" - │ │ │ │ │ ├── value: - │ │ │ │ │ │ @ IntegerNode (location: (20,9)-(20,10)) - │ │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ │ └── value: 1 - │ │ │ │ │ └── operator_loc: ∅ - │ │ │ │ ├── rest: ∅ - │ │ │ │ ├── opening_loc: (20,3)-(20,4) = "{" - │ │ │ │ └── closing_loc: (20,10)-(20,11) = "}" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (21,2)-(21,6)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ TrueNode (location: (21,2)-(21,6)) - │ │ │ │ └── flags: newline, static_literal - │ │ │ ├── in_loc: (20,0)-(20,2) = "in" - │ │ │ └── then_loc: (20,12)-(20,16) = "then" - │ │ ├── @ InNode (location: (22,0)-(23,6)) - │ │ │ ├── flags: ∅ - │ │ │ ├── pattern: - │ │ │ │ @ AlternationPatternNode (location: (22,3)-(22,8)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── left: - │ │ │ │ │ @ IntegerNode (location: (22,3)-(22,4)) - │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ └── value: 1 - │ │ │ │ ├── right: - │ │ │ │ │ @ IntegerNode (location: (22,7)-(22,8)) - │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ └── value: 2 - │ │ │ │ └── operator_loc: (22,5)-(22,6) = "|" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (23,2)-(23,6)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ TrueNode (location: (23,2)-(23,6)) - │ │ │ │ └── flags: newline, static_literal - │ │ │ ├── in_loc: (22,0)-(22,2) = "in" - │ │ │ └── then_loc: (22,9)-(22,13) = "then" - │ │ ├── @ InNode (location: (24,0)-(25,6)) - │ │ │ ├── flags: ∅ - │ │ │ ├── pattern: - │ │ │ │ @ CapturePatternNode (location: (24,3)-(24,9)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── value: - │ │ │ │ │ @ IntegerNode (location: (24,3)-(24,4)) - │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ └── value: 1 - │ │ │ │ ├── target: - │ │ │ │ │ @ LocalVariableTargetNode (location: (24,8)-(24,9)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── name: :a - │ │ │ │ │ └── depth: 0 - │ │ │ │ └── operator_loc: (24,5)-(24,7) = "=>" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (25,2)-(25,6)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ TrueNode (location: (25,2)-(25,6)) - │ │ │ │ └── flags: newline, static_literal - │ │ │ ├── in_loc: (24,0)-(24,2) = "in" - │ │ │ └── then_loc: (24,10)-(24,14) = "then" - │ │ ├── @ InNode (location: (26,0)-(27,6)) - │ │ │ ├── flags: ∅ - │ │ │ ├── pattern: - │ │ │ │ @ PinnedVariableNode (location: (26,3)-(26,5)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── variable: - │ │ │ │ │ @ LocalVariableReadNode (location: (26,4)-(26,5)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── name: :x - │ │ │ │ │ └── depth: 0 - │ │ │ │ └── operator_loc: (26,3)-(26,4) = "^" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (27,2)-(27,6)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ TrueNode (location: (27,2)-(27,6)) - │ │ │ │ └── flags: newline, static_literal - │ │ │ ├── in_loc: (26,0)-(26,2) = "in" - │ │ │ └── then_loc: (26,6)-(26,10) = "then" - │ │ ├── @ InNode (location: (28,0)-(28,4)) - │ │ │ ├── flags: ∅ - │ │ │ ├── pattern: - │ │ │ │ @ IntegerNode (location: (28,3)-(28,4)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ ├── statements: ∅ - │ │ │ ├── in_loc: (28,0)-(28,2) = "in" - │ │ │ └── then_loc: ∅ - │ │ └── @ InNode (location: (29,0)-(30,6)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ IntegerNode (location: (29,3)-(29,4)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (30,2)-(30,6)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ TrueNode (location: (30,2)-(30,6)) - │ │ │ └── flags: newline, static_literal - │ │ ├── in_loc: (29,0)-(29,2) = "in" - │ │ └── then_loc: (29,5)-(29,9) = "then" - │ ├── else_clause: - │ │ @ ElseNode (location: (31,0)-(33,3)) - │ │ ├── flags: ∅ - │ │ ├── else_keyword_loc: (31,0)-(31,4) = "else" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (32,2)-(32,6)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ TrueNode (location: (32,2)-(32,6)) - │ │ │ └── flags: newline, static_literal - │ │ └── end_keyword_loc: (33,0)-(33,3) = "end" - │ ├── case_keyword_loc: (1,0)-(1,4) = "case" - │ └── end_keyword_loc: (33,0)-(33,3) = "end" - ├── @ CaseMatchNode (location: (34,0)-(36,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (34,5)-(34,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (34,5)-(34,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (35,0)-(35,17)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ ArrayPatternNode (location: (35,3)-(35,17)) - │ │ │ ├── flags: ∅ - │ │ │ ├── constant: - │ │ │ │ @ ConstantReadNode (location: (35,3)-(35,4)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :A - │ │ │ ├── requireds: (length: 2) - │ │ │ │ ├── @ IntegerNode (location: (35,5)-(35,6)) - │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ └── value: 1 - │ │ │ │ └── @ IntegerNode (location: (35,8)-(35,9)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 2 - │ │ │ ├── rest: - │ │ │ │ @ SplatNode (location: (35,11)-(35,13)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── operator_loc: (35,11)-(35,12) = "*" - │ │ │ │ └── expression: - │ │ │ │ @ LocalVariableTargetNode (location: (35,12)-(35,13)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :a - │ │ │ │ └── depth: 0 - │ │ │ ├── posts: (length: 1) - │ │ │ │ └── @ IntegerNode (location: (35,15)-(35,16)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 3 - │ │ │ ├── opening_loc: (35,4)-(35,5) = "[" - │ │ │ └── closing_loc: (35,16)-(35,17) = "]" - │ │ ├── statements: ∅ - │ │ ├── in_loc: (35,0)-(35,2) = "in" - │ │ └── then_loc: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (34,0)-(34,4) = "case" - │ └── end_keyword_loc: (36,0)-(36,3) = "end" - ├── @ CaseMatchNode (location: (37,0)-(40,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (37,5)-(37,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (37,5)-(37,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 1) - │ │ └── @ InNode (location: (38,0)-(38,4)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ ConstantReadNode (location: (38,3)-(38,4)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :A - │ │ ├── statements: ∅ - │ │ ├── in_loc: (38,0)-(38,2) = "in" - │ │ └── then_loc: ∅ - │ ├── else_clause: - │ │ @ ElseNode (location: (39,0)-(40,3)) - │ │ ├── flags: ∅ - │ │ ├── else_keyword_loc: (39,0)-(39,4) = "else" - │ │ ├── statements: ∅ - │ │ └── end_keyword_loc: (40,0)-(40,3) = "end" - │ ├── case_keyword_loc: (37,0)-(37,4) = "case" - │ └── end_keyword_loc: (40,0)-(40,3) = "end" - └── @ MatchPredicateNode (location: (41,0)-(41,8)) - ├── flags: newline - ├── value: - │ @ IntegerNode (location: (41,0)-(41,1)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── pattern: - │ @ ArrayPatternNode (location: (41,5)-(41,8)) - │ ├── flags: ∅ - │ ├── constant: ∅ - │ ├── requireds: (length: 1) - │ │ └── @ LocalVariableTargetNode (location: (41,6)-(41,7)) - │ │ ├── flags: ∅ - │ │ ├── name: :a - │ │ └── depth: 0 - │ ├── rest: ∅ - │ ├── posts: (length: 0) - │ ├── opening_loc: (41,5)-(41,6) = "[" - │ └── closing_loc: (41,7)-(41,8) = "]" - └── operator_loc: (41,2)-(41,4) = "in" diff --git a/test/prism/snapshots/unparser/corpus/literal/pragma.txt b/test/prism/snapshots/unparser/corpus/literal/pragma.txt deleted file mode 100644 index 2a82f0c860eb5a..00000000000000 --- a/test/prism/snapshots/unparser/corpus/literal/pragma.txt +++ /dev/null @@ -1,24 +0,0 @@ -@ ProgramNode (location: (1,0)-(4,7)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(4,7)) - ├── flags: ∅ - └── body: (length: 4) - ├── @ SourceEncodingNode (location: (1,0)-(1,12)) - │ └── flags: newline, static_literal - ├── @ SourceFileNode (location: (2,0)-(2,8)) - │ ├── flags: newline - │ └── filepath: "unparser/corpus/literal/pragma.txt" - ├── @ SourceLineNode (location: (3,0)-(3,8)) - │ └── flags: newline, static_literal - └── @ CallNode (location: (4,0)-(4,7)) - ├── flags: newline, variable_call, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :__dir__ - ├── message_loc: (4,0)-(4,7) = "__dir__" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/unparser/corpus/literal/range.txt b/test/prism/snapshots/unparser/corpus/literal/range.txt deleted file mode 100644 index d6bbe34b3430a0..00000000000000 --- a/test/prism/snapshots/unparser/corpus/literal/range.txt +++ /dev/null @@ -1,61 +0,0 @@ -@ ProgramNode (location: (1,0)-(4,5)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(4,5)) - ├── flags: ∅ - └── body: (length: 4) - ├── @ ParenthesesNode (location: (1,0)-(1,5)) - │ ├── flags: newline - │ ├── body: - │ │ @ StatementsNode (location: (1,1)-(1,4)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ RangeNode (location: (1,1)-(1,4)) - │ │ ├── flags: newline, static_literal - │ │ ├── left: - │ │ │ @ IntegerNode (location: (1,1)-(1,2)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── right: ∅ - │ │ └── operator_loc: (1,2)-(1,4) = ".." - │ ├── opening_loc: (1,0)-(1,1) = "(" - │ └── closing_loc: (1,4)-(1,5) = ")" - ├── @ RangeNode (location: (2,0)-(2,4)) - │ ├── flags: newline, static_literal - │ ├── left: - │ │ @ IntegerNode (location: (2,0)-(2,1)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── right: - │ │ @ IntegerNode (location: (2,3)-(2,4)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ └── operator_loc: (2,1)-(2,3) = ".." - ├── @ ParenthesesNode (location: (3,0)-(3,6)) - │ ├── flags: newline - │ ├── body: - │ │ @ StatementsNode (location: (3,1)-(3,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ RangeNode (location: (3,1)-(3,5)) - │ │ ├── flags: newline, static_literal, exclude_end - │ │ ├── left: - │ │ │ @ IntegerNode (location: (3,1)-(3,2)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── right: ∅ - │ │ └── operator_loc: (3,2)-(3,5) = "..." - │ ├── opening_loc: (3,0)-(3,1) = "(" - │ └── closing_loc: (3,5)-(3,6) = ")" - └── @ RangeNode (location: (4,0)-(4,5)) - ├── flags: newline, static_literal, exclude_end - ├── left: - │ @ IntegerNode (location: (4,0)-(4,1)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── right: - │ @ IntegerNode (location: (4,4)-(4,5)) - │ ├── flags: static_literal, decimal - │ └── value: 2 - └── operator_loc: (4,1)-(4,4) = "..." diff --git a/test/prism/snapshots/unparser/corpus/literal/rescue.txt b/test/prism/snapshots/unparser/corpus/literal/rescue.txt deleted file mode 100644 index 78801c1d90a204..00000000000000 --- a/test/prism/snapshots/unparser/corpus/literal/rescue.txt +++ /dev/null @@ -1,111 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,27)) -├── flags: ∅ -├── locals: [:x] -└── statements: - @ StatementsNode (location: (1,0)-(3,27)) - ├── flags: ∅ - └── body: (length: 3) - ├── @ RescueModifierNode (location: (1,0)-(1,14)) - │ ├── flags: newline - │ ├── expression: - │ │ @ CallNode (location: (1,0)-(1,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (1,0)-(1,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── keyword_loc: (1,4)-(1,10) = "rescue" - │ └── rescue_expression: - │ @ CallNode (location: (1,11)-(1,14)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :bar - │ ├── message_loc: (1,11)-(1,14) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ RescueModifierNode (location: (2,0)-(2,21)) - │ ├── flags: newline - │ ├── expression: - │ │ @ CallNode (location: (2,0)-(2,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (2,0)-(2,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── keyword_loc: (2,4)-(2,10) = "rescue" - │ └── rescue_expression: - │ @ ReturnNode (location: (2,11)-(2,21)) - │ ├── flags: ∅ - │ ├── keyword_loc: (2,11)-(2,17) = "return" - │ └── arguments: - │ @ ArgumentsNode (location: (2,18)-(2,21)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ CallNode (location: (2,18)-(2,21)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :bar - │ ├── message_loc: (2,18)-(2,21) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── @ LocalVariableWriteNode (location: (3,0)-(3,27)) - ├── flags: newline - ├── name: :x - ├── depth: 0 - ├── name_loc: (3,0)-(3,1) = "x" - ├── value: - │ @ ParenthesesNode (location: (3,4)-(3,27)) - │ ├── flags: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (3,5)-(3,26)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ RescueModifierNode (location: (3,5)-(3,26)) - │ │ ├── flags: newline - │ │ ├── expression: - │ │ │ @ CallNode (location: (3,5)-(3,8)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (3,5)-(3,8) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── keyword_loc: (3,9)-(3,15) = "rescue" - │ │ └── rescue_expression: - │ │ @ ReturnNode (location: (3,16)-(3,26)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (3,16)-(3,22) = "return" - │ │ └── arguments: - │ │ @ ArgumentsNode (location: (3,23)-(3,26)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (3,23)-(3,26)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (3,23)-(3,26) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── opening_loc: (3,4)-(3,5) = "(" - │ └── closing_loc: (3,26)-(3,27) = ")" - └── operator_loc: (3,2)-(3,3) = "=" diff --git a/test/prism/snapshots/unparser/corpus/literal/send.txt b/test/prism/snapshots/unparser/corpus/literal/send.txt deleted file mode 100644 index 4800b4e2e656b1..00000000000000 --- a/test/prism/snapshots/unparser/corpus/literal/send.txt +++ /dev/null @@ -1,2274 +0,0 @@ -@ ProgramNode (location: (1,0)-(84,7)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(84,7)) - ├── flags: ∅ - └── body: (length: 62) - ├── @ ModuleNode (location: (1,0)-(3,3)) - │ ├── flags: newline - │ ├── locals: [:foo, :a, :_] - │ ├── module_keyword_loc: (1,0)-(1,6) = "module" - │ ├── constant_path: - │ │ @ ConstantReadNode (location: (1,7)-(1,8)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── body: - │ │ @ StatementsNode (location: (2,2)-(2,22)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ LocalVariableOrWriteNode (location: (2,2)-(2,22)) - │ │ ├── flags: newline - │ │ ├── name_loc: (2,2)-(2,5) = "foo" - │ │ ├── operator_loc: (2,6)-(2,9) = "||=" - │ │ ├── value: - │ │ │ @ ParenthesesNode (location: (2,10)-(2,22)) - │ │ │ ├── flags: ∅ - │ │ │ ├── body: - │ │ │ │ @ StatementsNode (location: (2,11)-(2,21)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ MultiWriteNode (location: (2,11)-(2,21)) - │ │ │ │ ├── flags: newline - │ │ │ │ ├── lefts: (length: 2) - │ │ │ │ │ ├── @ LocalVariableTargetNode (location: (2,12)-(2,13)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ ├── name: :a - │ │ │ │ │ │ └── depth: 0 - │ │ │ │ │ └── @ LocalVariableTargetNode (location: (2,15)-(2,16)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── name: :_ - │ │ │ │ │ └── depth: 0 - │ │ │ │ ├── rest: ∅ - │ │ │ │ ├── rights: (length: 0) - │ │ │ │ ├── lparen_loc: (2,11)-(2,12) = "(" - │ │ │ │ ├── rparen_loc: (2,16)-(2,17) = ")" - │ │ │ │ ├── operator_loc: (2,18)-(2,19) = "=" - │ │ │ │ └── value: - │ │ │ │ @ CallNode (location: (2,20)-(2,21)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :b - │ │ │ │ ├── message_loc: (2,20)-(2,21) = "b" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── opening_loc: (2,10)-(2,11) = "(" - │ │ │ └── closing_loc: (2,21)-(2,22) = ")" - │ │ ├── name: :foo - │ │ └── depth: 0 - │ ├── end_keyword_loc: (3,0)-(3,3) = "end" - │ └── name: :A - ├── @ ModuleNode (location: (5,0)-(8,3)) - │ ├── flags: newline - │ ├── locals: [:local] - │ ├── module_keyword_loc: (5,0)-(5,6) = "module" - │ ├── constant_path: - │ │ @ ConstantReadNode (location: (5,7)-(5,8)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── body: - │ │ @ StatementsNode (location: (6,2)-(7,11)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 2) - │ │ ├── @ LocalVariableWriteNode (location: (6,2)-(6,11)) - │ │ │ ├── flags: newline - │ │ │ ├── name: :local - │ │ │ ├── depth: 0 - │ │ │ ├── name_loc: (6,2)-(6,7) = "local" - │ │ │ ├── value: - │ │ │ │ @ IntegerNode (location: (6,10)-(6,11)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ └── operator_loc: (6,8)-(6,9) = "=" - │ │ └── @ CallNode (location: (7,2)-(7,11)) - │ │ ├── flags: newline - │ │ ├── receiver: - │ │ │ @ LocalVariableReadNode (location: (7,2)-(7,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :local - │ │ │ └── depth: 0 - │ │ ├── call_operator_loc: (7,7)-(7,8) = "." - │ │ ├── name: :bar - │ │ ├── message_loc: (7,8)-(7,11) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── end_keyword_loc: (8,0)-(8,3) = "end" - │ └── name: :A - ├── @ CallNode (location: (9,0)-(10,7)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ClassNode (location: (9,0)-(10,3)) - │ │ ├── flags: ∅ - │ │ ├── locals: [] - │ │ ├── class_keyword_loc: (9,0)-(9,5) = "class" - │ │ ├── constant_path: - │ │ │ @ ConstantReadNode (location: (9,6)-(9,7)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :A - │ │ ├── inheritance_operator_loc: ∅ - │ │ ├── superclass: ∅ - │ │ ├── body: ∅ - │ │ ├── end_keyword_loc: (10,0)-(10,3) = "end" - │ │ └── name: :A - │ ├── call_operator_loc: (10,3)-(10,4) = "." - │ ├── name: :bar - │ ├── message_loc: (10,4)-(10,7) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (11,0)-(12,7)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ModuleNode (location: (11,0)-(12,3)) - │ │ ├── flags: ∅ - │ │ ├── locals: [] - │ │ ├── module_keyword_loc: (11,0)-(11,6) = "module" - │ │ ├── constant_path: - │ │ │ @ ConstantReadNode (location: (11,7)-(11,8)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :A - │ │ ├── body: ∅ - │ │ ├── end_keyword_loc: (12,0)-(12,3) = "end" - │ │ └── name: :A - │ ├── call_operator_loc: (12,3)-(12,4) = "." - │ ├── name: :bar - │ ├── message_loc: (12,4)-(12,7) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (13,0)-(15,7)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ BeginNode (location: (13,0)-(15,3)) - │ │ ├── flags: ∅ - │ │ ├── begin_keyword_loc: (13,0)-(13,5) = "begin" - │ │ ├── statements: ∅ - │ │ ├── rescue_clause: - │ │ │ @ RescueNode (location: (14,0)-(14,6)) - │ │ │ ├── flags: ∅ - │ │ │ ├── keyword_loc: (14,0)-(14,6) = "rescue" - │ │ │ ├── exceptions: (length: 0) - │ │ │ ├── operator_loc: ∅ - │ │ │ ├── reference: ∅ - │ │ │ ├── statements: ∅ - │ │ │ └── subsequent: ∅ - │ │ ├── else_clause: ∅ - │ │ ├── ensure_clause: ∅ - │ │ └── end_keyword_loc: (15,0)-(15,3) = "end" - │ ├── call_operator_loc: (15,3)-(15,4) = "." - │ ├── name: :bar - │ ├── message_loc: (15,4)-(15,7) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (16,0)-(19,7)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CaseNode (location: (16,0)-(19,3)) - │ │ ├── flags: ∅ - │ │ ├── predicate: - │ │ │ @ ParenthesesNode (location: (16,5)-(17,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── body: - │ │ │ │ @ StatementsNode (location: (16,6)-(17,9)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 2) - │ │ │ │ ├── @ DefNode (location: (16,6)-(17,3)) - │ │ │ │ │ ├── flags: newline - │ │ │ │ │ ├── name: :foo - │ │ │ │ │ ├── name_loc: (16,10)-(16,13) = "foo" - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── parameters: ∅ - │ │ │ │ │ ├── body: ∅ - │ │ │ │ │ ├── locals: [] - │ │ │ │ │ ├── def_keyword_loc: (16,6)-(16,9) = "def" - │ │ │ │ │ ├── operator_loc: ∅ - │ │ │ │ │ ├── lparen_loc: ∅ - │ │ │ │ │ ├── rparen_loc: ∅ - │ │ │ │ │ ├── equal_loc: ∅ - │ │ │ │ │ └── end_keyword_loc: (17,0)-(17,3) = "end" - │ │ │ │ └── @ SymbolNode (location: (17,5)-(17,9)) - │ │ │ │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: (17,5)-(17,6) = ":" - │ │ │ │ ├── value_loc: (17,6)-(17,9) = "bar" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "bar" - │ │ │ ├── opening_loc: (16,5)-(16,6) = "(" - │ │ │ └── closing_loc: (17,9)-(17,10) = ")" - │ │ ├── conditions: (length: 1) - │ │ │ └── @ WhenNode (location: (18,0)-(18,8)) - │ │ │ ├── flags: ∅ - │ │ │ ├── keyword_loc: (18,0)-(18,4) = "when" - │ │ │ ├── conditions: (length: 1) - │ │ │ │ └── @ CallNode (location: (18,5)-(18,8)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :bar - │ │ │ │ ├── message_loc: (18,5)-(18,8) = "bar" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── then_keyword_loc: ∅ - │ │ │ └── statements: ∅ - │ │ ├── else_clause: ∅ - │ │ ├── case_keyword_loc: (16,0)-(16,4) = "case" - │ │ └── end_keyword_loc: (19,0)-(19,3) = "end" - │ ├── call_operator_loc: (19,3)-(19,4) = "." - │ ├── name: :baz - │ ├── message_loc: (19,4)-(19,7) = "baz" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (20,0)-(22,7)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CaseNode (location: (20,0)-(22,3)) - │ │ ├── flags: ∅ - │ │ ├── predicate: - │ │ │ @ CallNode (location: (20,5)-(20,8)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (20,5)-(20,8) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── conditions: (length: 1) - │ │ │ └── @ WhenNode (location: (21,0)-(21,8)) - │ │ │ ├── flags: ∅ - │ │ │ ├── keyword_loc: (21,0)-(21,4) = "when" - │ │ │ ├── conditions: (length: 1) - │ │ │ │ └── @ CallNode (location: (21,5)-(21,8)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :bar - │ │ │ │ ├── message_loc: (21,5)-(21,8) = "bar" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── then_keyword_loc: ∅ - │ │ │ └── statements: ∅ - │ │ ├── else_clause: ∅ - │ │ ├── case_keyword_loc: (20,0)-(20,4) = "case" - │ │ └── end_keyword_loc: (22,0)-(22,3) = "end" - │ ├── call_operator_loc: (22,3)-(22,4) = "." - │ ├── name: :baz - │ ├── message_loc: (22,4)-(22,7) = "baz" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (23,0)-(24,7)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ SingletonClassNode (location: (23,0)-(24,3)) - │ │ ├── flags: ∅ - │ │ ├── locals: [] - │ │ ├── class_keyword_loc: (23,0)-(23,5) = "class" - │ │ ├── operator_loc: (23,6)-(23,8) = "<<" - │ │ ├── expression: - │ │ │ @ SelfNode (location: (23,9)-(23,13)) - │ │ │ └── flags: ∅ - │ │ ├── body: ∅ - │ │ └── end_keyword_loc: (24,0)-(24,3) = "end" - │ ├── call_operator_loc: (24,3)-(24,4) = "." - │ ├── name: :bar - │ ├── message_loc: (24,4)-(24,7) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (25,0)-(26,7)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ DefNode (location: (25,0)-(26,3)) - │ │ ├── flags: ∅ - │ │ ├── name: :foo - │ │ ├── name_loc: (25,9)-(25,12) = "foo" - │ │ ├── receiver: - │ │ │ @ SelfNode (location: (25,4)-(25,8)) - │ │ │ └── flags: ∅ - │ │ ├── parameters: ∅ - │ │ ├── body: ∅ - │ │ ├── locals: [] - │ │ ├── def_keyword_loc: (25,0)-(25,3) = "def" - │ │ ├── operator_loc: (25,8)-(25,9) = "." - │ │ ├── lparen_loc: ∅ - │ │ ├── rparen_loc: ∅ - │ │ ├── equal_loc: ∅ - │ │ └── end_keyword_loc: (26,0)-(26,3) = "end" - │ ├── call_operator_loc: (26,3)-(26,4) = "." - │ ├── name: :bar - │ ├── message_loc: (26,4)-(26,7) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (27,0)-(28,7)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ DefNode (location: (27,0)-(28,3)) - │ │ ├── flags: ∅ - │ │ ├── name: :foo - │ │ ├── name_loc: (27,4)-(27,7) = "foo" - │ │ ├── receiver: ∅ - │ │ ├── parameters: ∅ - │ │ ├── body: ∅ - │ │ ├── locals: [] - │ │ ├── def_keyword_loc: (27,0)-(27,3) = "def" - │ │ ├── operator_loc: ∅ - │ │ ├── lparen_loc: ∅ - │ │ ├── rparen_loc: ∅ - │ │ ├── equal_loc: ∅ - │ │ └── end_keyword_loc: (28,0)-(28,3) = "end" - │ ├── call_operator_loc: (28,3)-(28,4) = "." - │ ├── name: :bar - │ ├── message_loc: (28,4)-(28,7) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (29,0)-(30,7)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ UntilNode (location: (29,0)-(30,3)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (29,0)-(29,5) = "until" - │ │ ├── closing_loc: (30,0)-(30,3) = "end" - │ │ ├── predicate: - │ │ │ @ CallNode (location: (29,6)-(29,9)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (29,6)-(29,9) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── statements: ∅ - │ ├── call_operator_loc: (30,3)-(30,4) = "." - │ ├── name: :bar - │ ├── message_loc: (30,4)-(30,7) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (31,0)-(32,7)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ WhileNode (location: (31,0)-(32,3)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (31,0)-(31,5) = "while" - │ │ ├── closing_loc: (32,0)-(32,3) = "end" - │ │ ├── predicate: - │ │ │ @ CallNode (location: (31,6)-(31,9)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (31,6)-(31,9) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── statements: ∅ - │ ├── call_operator_loc: (32,3)-(32,4) = "." - │ ├── name: :bar - │ ├── message_loc: (32,4)-(32,7) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (33,0)-(34,5)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (33,0)-(34,1)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :loop - │ │ ├── message_loc: (33,0)-(33,4) = "loop" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: - │ │ @ BlockNode (location: (33,5)-(34,1)) - │ │ ├── flags: ∅ - │ │ ├── locals: [] - │ │ ├── parameters: ∅ - │ │ ├── body: ∅ - │ │ ├── opening_loc: (33,5)-(33,6) = "{" - │ │ └── closing_loc: (34,0)-(34,1) = "}" - │ ├── call_operator_loc: (34,1)-(34,2) = "." - │ ├── name: :bar - │ ├── message_loc: (34,2)-(34,5) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (35,0)-(36,7)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ IfNode (location: (35,0)-(36,3)) - │ │ ├── flags: newline - │ │ ├── if_keyword_loc: (35,0)-(35,2) = "if" - │ │ ├── predicate: - │ │ │ @ CallNode (location: (35,3)-(35,6)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (35,3)-(35,6) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── then_keyword_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── subsequent: ∅ - │ │ └── end_keyword_loc: (36,0)-(36,3) = "end" - │ ├── call_operator_loc: (36,3)-(36,4) = "." - │ ├── name: :baz - │ ├── message_loc: (36,4)-(36,7) = "baz" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (37,0)-(37,19)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ParenthesesNode (location: (37,0)-(37,15)) - │ │ ├── flags: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (37,1)-(37,14)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (37,1)-(37,14)) - │ │ │ ├── flags: newline - │ │ │ ├── receiver: - │ │ │ │ @ RegularExpressionNode (location: (37,1)-(37,6)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: (37,1)-(37,2) = "/" - │ │ │ │ ├── content_loc: (37,2)-(37,5) = "bar" - │ │ │ │ ├── closing_loc: (37,5)-(37,6) = "/" - │ │ │ │ └── unescaped: "bar" - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :=~ - │ │ │ ├── message_loc: (37,7)-(37,9) = "=~" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (37,10)-(37,14)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ SymbolNode (location: (37,10)-(37,14)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: (37,10)-(37,11) = ":" - │ │ │ │ ├── value_loc: (37,11)-(37,14) = "foo" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "foo" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── opening_loc: (37,0)-(37,1) = "(" - │ │ └── closing_loc: (37,14)-(37,15) = ")" - │ ├── call_operator_loc: (37,15)-(37,16) = "." - │ ├── name: :foo - │ ├── message_loc: (37,16)-(37,19) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (38,0)-(38,10)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ParenthesesNode (location: (38,0)-(38,6)) - │ │ ├── flags: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (38,1)-(38,5)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ RangeNode (location: (38,1)-(38,5)) - │ │ │ ├── flags: newline, static_literal - │ │ │ ├── left: - │ │ │ │ @ IntegerNode (location: (38,1)-(38,2)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ ├── right: - │ │ │ │ @ IntegerNode (location: (38,4)-(38,5)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 2 - │ │ │ └── operator_loc: (38,2)-(38,4) = ".." - │ │ ├── opening_loc: (38,0)-(38,1) = "(" - │ │ └── closing_loc: (38,5)-(38,6) = ")" - │ ├── call_operator_loc: (38,6)-(38,7) = "." - │ ├── name: :max - │ ├── message_loc: (38,7)-(38,10) = "max" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (39,0)-(39,18)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ParenthesesNode (location: (39,0)-(39,14)) - │ │ ├── flags: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (39,1)-(39,13)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (39,1)-(39,13)) - │ │ │ ├── flags: newline - │ │ │ ├── receiver: - │ │ │ │ @ CallNode (location: (39,1)-(39,4)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :foo - │ │ │ │ ├── message_loc: (39,1)-(39,4) = "foo" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :=~ - │ │ │ ├── message_loc: (39,5)-(39,7) = "=~" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (39,8)-(39,13)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ RegularExpressionNode (location: (39,8)-(39,13)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: (39,8)-(39,9) = "/" - │ │ │ │ ├── content_loc: (39,9)-(39,12) = "bar" - │ │ │ │ ├── closing_loc: (39,12)-(39,13) = "/" - │ │ │ │ └── unescaped: "bar" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── opening_loc: (39,0)-(39,1) = "(" - │ │ └── closing_loc: (39,13)-(39,14) = ")" - │ ├── call_operator_loc: (39,14)-(39,15) = "." - │ ├── name: :foo - │ ├── message_loc: (39,15)-(39,18) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (40,0)-(40,13)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ RegularExpressionNode (location: (40,0)-(40,5)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (40,0)-(40,1) = "/" - │ │ ├── content_loc: (40,1)-(40,4) = "bar" - │ │ ├── closing_loc: (40,4)-(40,5) = "/" - │ │ └── unescaped: "bar" - │ ├── call_operator_loc: ∅ - │ ├── name: :=~ - │ ├── message_loc: (40,6)-(40,8) = "=~" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (40,9)-(40,13)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ SymbolNode (location: (40,9)-(40,13)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (40,9)-(40,10) = ":" - │ │ ├── value_loc: (40,10)-(40,13) = "foo" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "foo" - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (41,0)-(41,12)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ RegularExpressionNode (location: (41,0)-(41,5)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (41,0)-(41,1) = "/" - │ │ ├── content_loc: (41,1)-(41,4) = "bar" - │ │ ├── closing_loc: (41,4)-(41,5) = "/" - │ │ └── unescaped: "bar" - │ ├── call_operator_loc: ∅ - │ ├── name: :=~ - │ ├── message_loc: (41,6)-(41,8) = "=~" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (41,9)-(41,12)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (41,9)-(41,12)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (41,9)-(41,12) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ RangeNode (location: (42,0)-(42,8)) - │ ├── flags: newline - │ ├── left: - │ │ @ IntegerNode (location: (42,0)-(42,1)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── right: - │ │ @ CallNode (location: (42,3)-(42,8)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ IntegerNode (location: (42,3)-(42,4)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ ├── call_operator_loc: (42,4)-(42,5) = "." - │ │ ├── name: :max - │ │ ├── message_loc: (42,5)-(42,8) = "max" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── operator_loc: (42,1)-(42,3) = ".." - ├── @ CallNode (location: (43,0)-(43,5)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ConstantReadNode (location: (43,0)-(43,1)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── call_operator_loc: (43,1)-(43,2) = "." - │ ├── name: :foo - │ ├── message_loc: (43,2)-(43,5) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (44,0)-(44,5)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :FOO - │ ├── message_loc: (44,0)-(44,3) = "FOO" - │ ├── opening_loc: (44,3)-(44,4) = "(" - │ ├── arguments: ∅ - │ ├── closing_loc: (44,4)-(44,5) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (45,0)-(45,4)) - │ ├── flags: newline, safe_navigation - │ ├── receiver: - │ │ @ CallNode (location: (45,0)-(45,1)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (45,0)-(45,1) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (45,1)-(45,3) = "&." - │ ├── name: :b - │ ├── message_loc: (45,3)-(45,4) = "b" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (46,0)-(46,5)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (46,0)-(46,1)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (46,0)-(46,1) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (46,1)-(46,2) = "." - │ ├── name: :foo - │ ├── message_loc: (46,2)-(46,5) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (47,0)-(47,3)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (47,0)-(47,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (48,0)-(48,18)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (48,0)-(48,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (48,0)-(48,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :<< - │ ├── message_loc: (48,4)-(48,6) = "<<" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (48,7)-(48,18)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ ParenthesesNode (location: (48,7)-(48,18)) - │ │ ├── flags: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (48,8)-(48,17)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (48,8)-(48,17)) - │ │ │ ├── flags: newline - │ │ │ ├── receiver: - │ │ │ │ @ CallNode (location: (48,8)-(48,11)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :bar - │ │ │ │ ├── message_loc: (48,8)-(48,11) = "bar" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :* - │ │ │ ├── message_loc: (48,12)-(48,13) = "*" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (48,14)-(48,17)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ CallNode (location: (48,14)-(48,17)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ ├── message_loc: (48,14)-(48,17) = "baz" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── opening_loc: (48,7)-(48,8) = "(" - │ │ └── closing_loc: (48,17)-(48,18) = ")" - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (49,0)-(49,12)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (49,0)-(49,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (49,0)-(49,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :=~ - │ ├── message_loc: (49,4)-(49,6) = "=~" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (49,7)-(49,12)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ RegularExpressionNode (location: (49,7)-(49,12)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (49,7)-(49,8) = "/" - │ │ ├── content_loc: (49,8)-(49,11) = "bar" - │ │ ├── closing_loc: (49,11)-(49,12) = "/" - │ │ └── unescaped: "bar" - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (50,0)-(50,17)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (50,0)-(50,3) = "foo" - │ ├── opening_loc: (50,3)-(50,4) = "(" - │ ├── arguments: ∅ - │ ├── closing_loc: (50,17)-(50,18) = ")" - │ └── block: - │ @ BlockArgumentNode (location: (50,4)-(50,17)) - │ ├── flags: ∅ - │ ├── expression: - │ │ @ ParenthesesNode (location: (50,5)-(50,17)) - │ │ ├── flags: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (50,6)-(50,16)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ OrNode (location: (50,6)-(50,16)) - │ │ │ ├── flags: newline - │ │ │ ├── left: - │ │ │ │ @ CallNode (location: (50,6)-(50,9)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :foo - │ │ │ │ ├── message_loc: (50,6)-(50,9) = "foo" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── right: - │ │ │ │ @ CallNode (location: (50,13)-(50,16)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :bar - │ │ │ │ ├── message_loc: (50,13)-(50,16) = "bar" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── operator_loc: (50,10)-(50,12) = "||" - │ │ ├── opening_loc: (50,5)-(50,6) = "(" - │ │ └── closing_loc: (50,16)-(50,17) = ")" - │ └── operator_loc: (50,4)-(50,5) = "&" - ├── @ CallNode (location: (51,0)-(51,10)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (51,0)-(51,3) = "foo" - │ ├── opening_loc: (51,3)-(51,4) = "(" - │ ├── arguments: ∅ - │ ├── closing_loc: (51,10)-(51,11) = ")" - │ └── block: - │ @ BlockArgumentNode (location: (51,4)-(51,10)) - │ ├── flags: ∅ - │ ├── expression: - │ │ @ CallNode (location: (51,5)-(51,10)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :block - │ │ ├── message_loc: (51,5)-(51,10) = "block" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── operator_loc: (51,4)-(51,5) = "&" - ├── @ CallNode (location: (52,0)-(52,17)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (52,0)-(52,3) = "foo" - │ ├── opening_loc: (52,3)-(52,4) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (52,4)-(52,9)) - │ │ ├── flags: contains_splat - │ │ └── arguments: (length: 1) - │ │ └── @ SplatNode (location: (52,4)-(52,9)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (52,4)-(52,5) = "*" - │ │ └── expression: - │ │ @ CallNode (location: (52,5)-(52,9)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :args - │ │ ├── message_loc: (52,5)-(52,9) = "args" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (52,17)-(52,18) = ")" - │ └── block: - │ @ BlockArgumentNode (location: (52,11)-(52,17)) - │ ├── flags: ∅ - │ ├── expression: - │ │ @ CallNode (location: (52,12)-(52,17)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :block - │ │ ├── message_loc: (52,12)-(52,17) = "block" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── operator_loc: (52,11)-(52,12) = "&" - ├── @ CallNode (location: (53,0)-(53,15)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (53,0)-(53,3) = "foo" - │ ├── opening_loc: (53,3)-(53,4) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (53,4)-(53,14)) - │ │ ├── flags: contains_splat - │ │ └── arguments: (length: 1) - │ │ └── @ SplatNode (location: (53,4)-(53,14)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (53,4)-(53,5) = "*" - │ │ └── expression: - │ │ @ CallNode (location: (53,5)-(53,14)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :arguments - │ │ ├── message_loc: (53,5)-(53,14) = "arguments" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (53,14)-(53,15) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (54,0)-(54,9)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (54,0)-(54,3) = "foo" - │ ├── opening_loc: (54,3)-(54,4) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (54,4)-(54,8)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ IntegerNode (location: (54,4)-(54,5)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── @ IntegerNode (location: (54,7)-(54,8)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── closing_loc: (54,8)-(54,9) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (55,0)-(55,8)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (55,0)-(55,3) = "foo" - │ ├── opening_loc: (55,3)-(55,4) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (55,4)-(55,7)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (55,4)-(55,7)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (55,4)-(55,7) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (55,7)-(55,8) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (56,0)-(56,15)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (56,0)-(56,3) = "foo" - │ ├── opening_loc: (56,3)-(56,4) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (56,4)-(56,14)) - │ │ ├── flags: contains_splat - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (56,4)-(56,7)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (56,4)-(56,7) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── @ SplatNode (location: (56,9)-(56,14)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (56,9)-(56,10) = "*" - │ │ └── expression: - │ │ @ CallNode (location: (56,10)-(56,14)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :args - │ │ ├── message_loc: (56,10)-(56,14) = "args" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (56,14)-(56,15) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (57,0)-(57,17)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (57,0)-(57,3) = "foo" - │ ├── opening_loc: (57,3)-(57,4) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (57,4)-(57,16)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (57,4)-(57,16)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ CallNode (location: (57,4)-(57,7)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (57,4)-(57,7) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :=~ - │ │ ├── message_loc: (57,8)-(57,10) = "=~" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (57,11)-(57,16)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ RegularExpressionNode (location: (57,11)-(57,16)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (57,11)-(57,12) = "/" - │ │ │ ├── content_loc: (57,12)-(57,15) = "bar" - │ │ │ ├── closing_loc: (57,15)-(57,16) = "/" - │ │ │ └── unescaped: "bar" - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (57,16)-(57,17) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (58,0)-(58,13)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (58,0)-(58,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (58,0)-(58,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (58,3)-(58,4) = "." - │ ├── name: :bar - │ ├── message_loc: (58,4)-(58,7) = "bar" - │ ├── opening_loc: (58,7)-(58,8) = "(" - │ ├── arguments: ∅ - │ ├── closing_loc: (58,12)-(58,13) = ")" - │ └── block: - │ @ BlockArgumentNode (location: (58,8)-(58,12)) - │ ├── flags: ∅ - │ ├── expression: - │ │ @ CallNode (location: (58,9)-(58,12)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :baz - │ │ ├── message_loc: (58,9)-(58,12) = "baz" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── operator_loc: (58,8)-(58,9) = "&" - ├── @ CallNode (location: (59,0)-(59,26)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (59,0)-(59,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (59,0)-(59,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (59,3)-(59,4) = "." - │ ├── name: :bar - │ ├── message_loc: (59,4)-(59,7) = "bar" - │ ├── opening_loc: (59,7)-(59,8) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (59,8)-(59,25)) - │ │ ├── flags: contains_splat, contains_multiple_splats - │ │ └── arguments: (length: 3) - │ │ ├── @ SplatNode (location: (59,8)-(59,13)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (59,8)-(59,9) = "*" - │ │ │ └── expression: - │ │ │ @ CallNode (location: (59,9)-(59,13)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :arga - │ │ │ ├── message_loc: (59,9)-(59,13) = "arga" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── @ CallNode (location: (59,15)-(59,18)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (59,15)-(59,18) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── @ SplatNode (location: (59,20)-(59,25)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (59,20)-(59,21) = "*" - │ │ └── expression: - │ │ @ CallNode (location: (59,21)-(59,25)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :argb - │ │ ├── message_loc: (59,21)-(59,25) = "argb" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (59,25)-(59,26) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (60,0)-(60,14)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (60,0)-(60,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (60,0)-(60,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (60,3)-(60,4) = "." - │ ├── name: :bar - │ ├── message_loc: (60,4)-(60,7) = "bar" - │ ├── opening_loc: (60,7)-(60,8) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (60,8)-(60,13)) - │ │ ├── flags: contains_splat - │ │ └── arguments: (length: 1) - │ │ └── @ SplatNode (location: (60,8)-(60,13)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (60,8)-(60,9) = "*" - │ │ └── expression: - │ │ @ CallNode (location: (60,9)-(60,13)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :args - │ │ ├── message_loc: (60,9)-(60,13) = "args" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (60,13)-(60,14) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (61,0)-(61,19)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (61,0)-(61,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (61,0)-(61,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (61,3)-(61,4) = "." - │ ├── name: :bar - │ ├── message_loc: (61,4)-(61,7) = "bar" - │ ├── opening_loc: (61,7)-(61,8) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (61,8)-(61,18)) - │ │ ├── flags: contains_splat - │ │ └── arguments: (length: 2) - │ │ ├── @ SplatNode (location: (61,8)-(61,13)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (61,8)-(61,9) = "*" - │ │ │ └── expression: - │ │ │ @ CallNode (location: (61,9)-(61,13)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :args - │ │ │ ├── message_loc: (61,9)-(61,13) = "args" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── @ CallNode (location: (61,15)-(61,18)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (61,15)-(61,18) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (61,18)-(61,19) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (62,0)-(62,19)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (62,0)-(62,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (62,0)-(62,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (62,3)-(62,4) = "." - │ ├── name: :bar - │ ├── message_loc: (62,4)-(62,7) = "bar" - │ ├── opening_loc: (62,7)-(62,8) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (62,8)-(62,12)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ SymbolNode (location: (62,8)-(62,12)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (62,8)-(62,9) = ":" - │ │ ├── value_loc: (62,9)-(62,12) = "baz" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "baz" - │ ├── closing_loc: (62,18)-(62,19) = ")" - │ └── block: - │ @ BlockArgumentNode (location: (62,14)-(62,18)) - │ ├── flags: ∅ - │ ├── expression: - │ │ @ CallNode (location: (62,15)-(62,18)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :baz - │ │ ├── message_loc: (62,15)-(62,18) = "baz" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── operator_loc: (62,14)-(62,15) = "&" - ├── @ CallNode (location: (63,0)-(63,17)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (63,0)-(63,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (63,0)-(63,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (63,3)-(63,4) = "." - │ ├── name: :bar - │ ├── message_loc: (63,4)-(63,7) = "bar" - │ ├── opening_loc: (63,7)-(63,8) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (63,8)-(63,16)) - │ │ ├── flags: contains_keywords - │ │ └── arguments: (length: 1) - │ │ └── @ KeywordHashNode (location: (63,8)-(63,16)) - │ │ ├── flags: symbol_keys - │ │ └── elements: (length: 1) - │ │ └── @ AssocNode (location: (63,8)-(63,16)) - │ │ ├── flags: ∅ - │ │ ├── key: - │ │ │ @ SymbolNode (location: (63,8)-(63,12)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (63,8)-(63,11) = "baz" - │ │ │ ├── closing_loc: (63,11)-(63,12) = ":" - │ │ │ └── unescaped: "baz" - │ │ ├── value: - │ │ │ @ CallNode (location: (63,13)-(63,16)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :boz - │ │ │ ├── message_loc: (63,13)-(63,16) = "boz" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: ∅ - │ ├── closing_loc: (63,16)-(63,17) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (64,0)-(64,26)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (64,0)-(64,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (64,0)-(64,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (64,3)-(64,4) = "." - │ ├── name: :bar - │ ├── message_loc: (64,4)-(64,7) = "bar" - │ ├── opening_loc: (64,7)-(64,8) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (64,8)-(64,25)) - │ │ ├── flags: contains_keywords - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (64,8)-(64,11)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (64,8)-(64,11) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── @ KeywordHashNode (location: (64,13)-(64,25)) - │ │ ├── flags: ∅ - │ │ └── elements: (length: 1) - │ │ └── @ AssocNode (location: (64,13)-(64,25)) - │ │ ├── flags: ∅ - │ │ ├── key: - │ │ │ @ StringNode (location: (64,13)-(64,18)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: (64,13)-(64,14) = "\"" - │ │ │ ├── content_loc: (64,14)-(64,17) = "baz" - │ │ │ ├── closing_loc: (64,17)-(64,18) = "\"" - │ │ │ └── unescaped: "baz" - │ │ ├── value: - │ │ │ @ CallNode (location: (64,22)-(64,25)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :boz - │ │ │ ├── message_loc: (64,22)-(64,25) = "boz" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: (64,19)-(64,21) = "=>" - │ ├── closing_loc: (64,25)-(64,26) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (65,0)-(65,19)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (65,0)-(65,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (65,0)-(65,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (65,3)-(65,4) = "." - │ ├── name: :bar - │ ├── message_loc: (65,4)-(65,7) = "bar" - │ ├── opening_loc: (65,7)-(65,8) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (65,8)-(65,18)) - │ │ ├── flags: contains_splat - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (65,8)-(65,11)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (65,8)-(65,11) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── @ SplatNode (location: (65,13)-(65,18)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (65,13)-(65,14) = "*" - │ │ └── expression: - │ │ @ CallNode (location: (65,14)-(65,18)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :args - │ │ ├── message_loc: (65,14)-(65,18) = "args" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (65,18)-(65,19) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (66,0)-(66,27)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (66,0)-(66,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (66,0)-(66,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (66,3)-(66,4) = "." - │ ├── name: :bar - │ ├── message_loc: (66,4)-(66,7) = "bar" - │ ├── opening_loc: (66,7)-(66,8) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (66,8)-(66,18)) - │ │ ├── flags: contains_splat - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (66,8)-(66,11)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (66,8)-(66,11) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── @ SplatNode (location: (66,13)-(66,18)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (66,13)-(66,14) = "*" - │ │ └── expression: - │ │ @ CallNode (location: (66,14)-(66,18)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :args - │ │ ├── message_loc: (66,14)-(66,18) = "args" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (66,26)-(66,27) = ")" - │ └── block: - │ @ BlockArgumentNode (location: (66,20)-(66,26)) - │ ├── flags: ∅ - │ ├── expression: - │ │ @ CallNode (location: (66,21)-(66,26)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :block - │ │ ├── message_loc: (66,21)-(66,26) = "block" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── operator_loc: (66,20)-(66,21) = "&" - ├── @ CallNode (location: (67,0)-(67,16)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (67,0)-(67,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (67,0)-(67,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (67,3)-(67,4) = "." - │ ├── name: :bar - │ ├── message_loc: (67,4)-(67,7) = "bar" - │ ├── opening_loc: (67,7)-(67,8) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (67,8)-(67,15)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (67,8)-(67,11)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (67,8)-(67,11) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── @ HashNode (location: (67,13)-(67,15)) - │ │ ├── flags: static_literal - │ │ ├── opening_loc: (67,13)-(67,14) = "{" - │ │ ├── elements: (length: 0) - │ │ └── closing_loc: (67,14)-(67,15) = "}" - │ ├── closing_loc: (67,15)-(67,16) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (68,0)-(68,26)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (68,0)-(68,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (68,0)-(68,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (68,3)-(68,4) = "." - │ ├── name: :bar - │ ├── message_loc: (68,4)-(68,7) = "bar" - │ ├── opening_loc: (68,7)-(68,8) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (68,8)-(68,25)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ HashNode (location: (68,8)-(68,20)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (68,8)-(68,9) = "{" - │ │ │ ├── elements: (length: 1) - │ │ │ │ └── @ AssocNode (location: (68,10)-(68,18)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── key: - │ │ │ │ │ @ SymbolNode (location: (68,10)-(68,14)) - │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── value_loc: (68,10)-(68,13) = "foo" - │ │ │ │ │ ├── closing_loc: (68,13)-(68,14) = ":" - │ │ │ │ │ └── unescaped: "foo" - │ │ │ │ ├── value: - │ │ │ │ │ @ CallNode (location: (68,15)-(68,18)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :boz - │ │ │ │ │ ├── message_loc: (68,15)-(68,18) = "boz" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ └── operator_loc: ∅ - │ │ │ └── closing_loc: (68,19)-(68,20) = "}" - │ │ └── @ CallNode (location: (68,22)-(68,25)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :boz - │ │ ├── message_loc: (68,22)-(68,25) = "boz" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (68,25)-(68,26) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (69,0)-(69,12)) - │ ├── flags: newline, attribute_write - │ ├── receiver: - │ │ @ CallNode (location: (69,0)-(69,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (69,0)-(69,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (69,3)-(69,4) = "." - │ ├── name: :bar= - │ ├── message_loc: (69,4)-(69,7) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (69,8)-(69,12)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ SymbolNode (location: (69,8)-(69,12)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (69,8)-(69,9) = ":" - │ │ ├── value_loc: (69,9)-(69,12) = "baz" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "baz" - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (70,0)-(70,9)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (70,0)-(70,3) = "foo" - │ ├── opening_loc: (70,3)-(70,4) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (70,4)-(70,8)) - │ │ ├── flags: contains_keywords - │ │ └── arguments: (length: 1) - │ │ └── @ KeywordHashNode (location: (70,4)-(70,8)) - │ │ ├── flags: symbol_keys - │ │ └── elements: (length: 1) - │ │ └── @ AssocNode (location: (70,4)-(70,8)) - │ │ ├── flags: ∅ - │ │ ├── key: - │ │ │ @ SymbolNode (location: (70,4)-(70,6)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (70,4)-(70,5) = "a" - │ │ │ ├── closing_loc: (70,5)-(70,6) = ":" - │ │ │ └── unescaped: "a" - │ │ ├── value: - │ │ │ @ CallNode (location: (70,7)-(70,8)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (70,7)-(70,8) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: ∅ - │ ├── closing_loc: (70,8)-(70,9) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (71,0)-(71,11)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (71,0)-(71,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (71,0)-(71,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (71,3)-(71,4) = "." - │ ├── name: :& - │ ├── message_loc: (71,4)-(71,5) = "&" - │ ├── opening_loc: (71,5)-(71,6) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (71,6)-(71,10)) - │ │ ├── flags: contains_keywords - │ │ └── arguments: (length: 1) - │ │ └── @ KeywordHashNode (location: (71,6)-(71,10)) - │ │ ├── flags: symbol_keys - │ │ └── elements: (length: 1) - │ │ └── @ AssocNode (location: (71,6)-(71,10)) - │ │ ├── flags: ∅ - │ │ ├── key: - │ │ │ @ SymbolNode (location: (71,6)-(71,8)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (71,6)-(71,7) = "a" - │ │ │ ├── closing_loc: (71,7)-(71,8) = ":" - │ │ │ └── unescaped: "a" - │ │ ├── value: - │ │ │ @ CallNode (location: (71,9)-(71,10)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (71,9)-(71,10) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: ∅ - │ ├── closing_loc: (71,10)-(71,11) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (72,0)-(72,10)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (72,0)-(72,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (72,0)-(72,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (72,3)-(72,4) = "." - │ ├── name: :& - │ ├── message_loc: (72,4)-(72,5) = "&" - │ ├── opening_loc: (72,5)-(72,6) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (72,6)-(72,9)) - │ │ ├── flags: contains_keywords, contains_keyword_splat - │ │ └── arguments: (length: 1) - │ │ └── @ KeywordHashNode (location: (72,6)-(72,9)) - │ │ ├── flags: ∅ - │ │ └── elements: (length: 1) - │ │ └── @ AssocSplatNode (location: (72,6)-(72,9)) - │ │ ├── flags: ∅ - │ │ ├── value: - │ │ │ @ CallNode (location: (72,8)-(72,9)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :a - │ │ │ ├── message_loc: (72,8)-(72,9) = "a" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: (72,6)-(72,8) = "**" - │ ├── closing_loc: (72,9)-(72,10) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (73,0)-(73,9)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (73,0)-(73,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (73,0)-(73,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :[] - │ ├── message_loc: (73,3)-(73,9) = "[*baz]" - │ ├── opening_loc: (73,3)-(73,4) = "[" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (73,4)-(73,8)) - │ │ ├── flags: contains_splat - │ │ └── arguments: (length: 1) - │ │ └── @ SplatNode (location: (73,4)-(73,8)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (73,4)-(73,5) = "*" - │ │ └── expression: - │ │ @ CallNode (location: (73,5)-(73,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :baz - │ │ ├── message_loc: (73,5)-(73,8) = "baz" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (73,8)-(73,9) = "]" - │ └── block: ∅ - ├── @ CallNode (location: (74,0)-(74,9)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (74,0)-(74,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (74,0)-(74,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :[] - │ ├── message_loc: (74,3)-(74,9) = "[1, 2]" - │ ├── opening_loc: (74,3)-(74,4) = "[" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (74,4)-(74,8)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ IntegerNode (location: (74,4)-(74,5)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── @ IntegerNode (location: (74,7)-(74,8)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── closing_loc: (74,8)-(74,9) = "]" - │ └── block: ∅ - ├── @ CallNode (location: (75,0)-(75,5)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (75,0)-(75,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (75,0)-(75,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :[] - │ ├── message_loc: (75,3)-(75,5) = "[]" - │ ├── opening_loc: (75,3)-(75,4) = "[" - │ ├── arguments: ∅ - │ ├── closing_loc: (75,4)-(75,5) = "]" - │ └── block: ∅ - ├── @ CallNode (location: (76,0)-(76,8)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: - │ │ @ SelfNode (location: (76,0)-(76,4)) - │ │ └── flags: ∅ - │ ├── call_operator_loc: (76,4)-(76,5) = "." - │ ├── name: :foo - │ ├── message_loc: (76,5)-(76,8) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (77,0)-(77,13)) - │ ├── flags: newline, attribute_write, ignore_visibility - │ ├── receiver: - │ │ @ SelfNode (location: (77,0)-(77,4)) - │ │ └── flags: ∅ - │ ├── call_operator_loc: (77,4)-(77,5) = "." - │ ├── name: :foo= - │ ├── message_loc: (77,5)-(77,8) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (77,9)-(77,13)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ SymbolNode (location: (77,9)-(77,13)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (77,9)-(77,10) = ":" - │ │ ├── value_loc: (77,10)-(77,13) = "bar" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "bar" - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (78,0)-(78,17)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ParenthesesNode (location: (78,0)-(78,7)) - │ │ ├── flags: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (78,1)-(78,6)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (78,1)-(78,6)) - │ │ │ ├── flags: newline - │ │ │ ├── receiver: - │ │ │ │ @ CallNode (location: (78,1)-(78,2)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :a - │ │ │ │ ├── message_loc: (78,1)-(78,2) = "a" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :+ - │ │ │ ├── message_loc: (78,3)-(78,4) = "+" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (78,5)-(78,6)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ CallNode (location: (78,5)-(78,6)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :b - │ │ │ │ ├── message_loc: (78,5)-(78,6) = "b" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── opening_loc: (78,0)-(78,1) = "(" - │ │ └── closing_loc: (78,6)-(78,7) = ")" - │ ├── call_operator_loc: ∅ - │ ├── name: :/ - │ ├── message_loc: (78,8)-(78,9) = "/" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (78,10)-(78,17)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ ParenthesesNode (location: (78,10)-(78,17)) - │ │ ├── flags: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (78,11)-(78,16)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (78,11)-(78,16)) - │ │ │ ├── flags: newline - │ │ │ ├── receiver: - │ │ │ │ @ CallNode (location: (78,11)-(78,12)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :c - │ │ │ │ ├── message_loc: (78,11)-(78,12) = "c" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :- - │ │ │ ├── message_loc: (78,13)-(78,14) = "-" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (78,15)-(78,16)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ CallNode (location: (78,15)-(78,16)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :d - │ │ │ │ ├── message_loc: (78,15)-(78,16) = "d" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── opening_loc: (78,10)-(78,11) = "(" - │ │ └── closing_loc: (78,16)-(78,17) = ")" - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (79,0)-(79,19)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ParenthesesNode (location: (79,0)-(79,7)) - │ │ ├── flags: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (79,1)-(79,6)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (79,1)-(79,6)) - │ │ │ ├── flags: newline - │ │ │ ├── receiver: - │ │ │ │ @ CallNode (location: (79,1)-(79,2)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :a - │ │ │ │ ├── message_loc: (79,1)-(79,2) = "a" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :+ - │ │ │ ├── message_loc: (79,3)-(79,4) = "+" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (79,5)-(79,6)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ CallNode (location: (79,5)-(79,6)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :b - │ │ │ │ ├── message_loc: (79,5)-(79,6) = "b" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── opening_loc: (79,0)-(79,1) = "(" - │ │ └── closing_loc: (79,6)-(79,7) = ")" - │ ├── call_operator_loc: ∅ - │ ├── name: :/ - │ ├── message_loc: (79,8)-(79,9) = "/" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (79,10)-(79,19)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (79,10)-(79,19)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ CallNode (location: (79,10)-(79,11)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :c - │ │ │ ├── message_loc: (79,10)-(79,11) = "c" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: (79,11)-(79,12) = "." - │ │ ├── name: :- - │ │ ├── message_loc: (79,12)-(79,13) = "-" - │ │ ├── opening_loc: (79,13)-(79,14) = "(" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (79,14)-(79,18)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 2) - │ │ │ ├── @ CallNode (location: (79,14)-(79,15)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :e - │ │ │ │ ├── message_loc: (79,14)-(79,15) = "e" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── @ CallNode (location: (79,17)-(79,18)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :f - │ │ │ ├── message_loc: (79,17)-(79,18) = "f" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── closing_loc: (79,18)-(79,19) = ")" - │ │ └── block: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (80,0)-(80,17)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ParenthesesNode (location: (80,0)-(80,7)) - │ │ ├── flags: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (80,1)-(80,6)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (80,1)-(80,6)) - │ │ │ ├── flags: newline - │ │ │ ├── receiver: - │ │ │ │ @ CallNode (location: (80,1)-(80,2)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :a - │ │ │ │ ├── message_loc: (80,1)-(80,2) = "a" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :+ - │ │ │ ├── message_loc: (80,3)-(80,4) = "+" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (80,5)-(80,6)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ CallNode (location: (80,5)-(80,6)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :b - │ │ │ │ ├── message_loc: (80,5)-(80,6) = "b" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── opening_loc: (80,0)-(80,1) = "(" - │ │ └── closing_loc: (80,6)-(80,7) = ")" - │ ├── call_operator_loc: ∅ - │ ├── name: :/ - │ ├── message_loc: (80,8)-(80,9) = "/" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (80,10)-(80,17)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (80,10)-(80,17)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ CallNode (location: (80,10)-(80,11)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :c - │ │ │ ├── message_loc: (80,10)-(80,11) = "c" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── call_operator_loc: (80,11)-(80,12) = "." - │ │ ├── name: :- - │ │ ├── message_loc: (80,12)-(80,13) = "-" - │ │ ├── opening_loc: (80,13)-(80,14) = "(" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (80,14)-(80,16)) - │ │ │ ├── flags: contains_splat - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ SplatNode (location: (80,14)-(80,16)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (80,14)-(80,15) = "*" - │ │ │ └── expression: - │ │ │ @ CallNode (location: (80,15)-(80,16)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :f - │ │ │ ├── message_loc: (80,15)-(80,16) = "f" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── closing_loc: (80,16)-(80,17) = ")" - │ │ └── block: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (81,0)-(81,8)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :x - │ ├── message_loc: (81,0)-(81,1) = "x" - │ ├── opening_loc: (81,1)-(81,2) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (81,2)-(81,7)) - │ │ ├── flags: contains_keywords, contains_keyword_splat - │ │ └── arguments: (length: 1) - │ │ └── @ KeywordHashNode (location: (81,2)-(81,7)) - │ │ ├── flags: ∅ - │ │ └── elements: (length: 1) - │ │ └── @ AssocSplatNode (location: (81,2)-(81,7)) - │ │ ├── flags: ∅ - │ │ ├── value: - │ │ │ @ CallNode (location: (81,4)-(81,7)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (81,4)-(81,7) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: (81,2)-(81,4) = "**" - │ ├── closing_loc: (81,7)-(81,8) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (82,0)-(82,6)) - │ ├── flags: newline, safe_navigation - │ ├── receiver: - │ │ @ CallNode (location: (82,0)-(82,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (82,0)-(82,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (82,3)-(82,5) = "&." - │ ├── name: :! - │ ├── message_loc: (82,5)-(82,6) = "!" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (83,0)-(83,8)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (83,0)-(83,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (83,0)-(83,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (83,3)-(83,4) = "." - │ ├── name: :~ - │ ├── message_loc: (83,4)-(83,5) = "~" - │ ├── opening_loc: (83,5)-(83,6) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (83,6)-(83,7)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (83,6)-(83,7)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :b - │ │ ├── message_loc: (83,6)-(83,7) = "b" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (83,7)-(83,8) = ")" - │ └── block: ∅ - └── @ CallNode (location: (84,0)-(84,7)) - ├── flags: newline, safe_navigation - ├── receiver: - │ @ CallNode (location: (84,0)-(84,1)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (84,0)-(84,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: (84,1)-(84,3) = "&." - ├── name: :+ - ├── message_loc: (84,3)-(84,4) = "+" - ├── opening_loc: (84,4)-(84,5) = "(" - ├── arguments: - │ @ ArgumentsNode (location: (84,5)-(84,6)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ CallNode (location: (84,5)-(84,6)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :b - │ ├── message_loc: (84,5)-(84,6) = "b" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── closing_loc: (84,6)-(84,7) = ")" - └── block: ∅ diff --git a/test/prism/snapshots/unparser/corpus/literal/since/27.txt b/test/prism/snapshots/unparser/corpus/literal/since/27.txt deleted file mode 100644 index e4cda312f836bf..00000000000000 --- a/test/prism/snapshots/unparser/corpus/literal/since/27.txt +++ /dev/null @@ -1,58 +0,0 @@ -@ ProgramNode (location: (1,0)-(4,5)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(4,5)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ LambdaNode (location: (1,0)-(3,1)) - │ ├── flags: newline - │ ├── locals: [:_1, :_2] - │ ├── operator_loc: (1,0)-(1,2) = "->" - │ ├── opening_loc: (1,3)-(1,4) = "{" - │ ├── closing_loc: (3,0)-(3,1) = "}" - │ ├── parameters: - │ │ @ NumberedParametersNode (location: (1,0)-(3,1)) - │ │ ├── flags: ∅ - │ │ └── maximum: 2 - │ └── body: - │ @ StatementsNode (location: (2,2)-(2,9)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (2,2)-(2,9)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (2,2)-(2,4)) - │ │ ├── flags: ∅ - │ │ ├── name: :_1 - │ │ └── depth: 0 - │ ├── call_operator_loc: ∅ - │ ├── name: :+ - │ ├── message_loc: (2,5)-(2,6) = "+" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (2,7)-(2,9)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ LocalVariableReadNode (location: (2,7)-(2,9)) - │ │ ├── flags: ∅ - │ │ ├── name: :_2 - │ │ └── depth: 0 - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── @ ParenthesesNode (location: (4,0)-(4,5)) - ├── flags: newline - ├── body: - │ @ StatementsNode (location: (4,1)-(4,4)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ RangeNode (location: (4,1)-(4,4)) - │ ├── flags: newline, static_literal - │ ├── left: ∅ - │ ├── right: - │ │ @ IntegerNode (location: (4,3)-(4,4)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ └── operator_loc: (4,1)-(4,3) = ".." - ├── opening_loc: (4,0)-(4,1) = "(" - └── closing_loc: (4,4)-(4,5) = ")" diff --git a/test/prism/snapshots/unparser/corpus/literal/since/30.txt b/test/prism/snapshots/unparser/corpus/literal/since/30.txt deleted file mode 100644 index 0102b2c97b4f5e..00000000000000 --- a/test/prism/snapshots/unparser/corpus/literal/since/30.txt +++ /dev/null @@ -1,106 +0,0 @@ -@ ProgramNode (location: (1,0)-(4,17)) -├── flags: ∅ -├── locals: [:a, :foo] -└── statements: - @ StatementsNode (location: (1,0)-(4,17)) - ├── flags: ∅ - └── body: (length: 4) - ├── @ MatchRequiredNode (location: (1,0)-(1,8)) - │ ├── flags: newline - │ ├── value: - │ │ @ IntegerNode (location: (1,0)-(1,1)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (1,5)-(1,8)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ LocalVariableTargetNode (location: (1,6)-(1,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :a - │ │ │ └── depth: 0 - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── opening_loc: (1,5)-(1,6) = "[" - │ │ └── closing_loc: (1,7)-(1,8) = "]" - │ └── operator_loc: (1,2)-(1,4) = "=>" - ├── @ MatchRequiredNode (location: (2,0)-(2,8)) - │ ├── flags: newline - │ ├── value: - │ │ @ IntegerNode (location: (2,0)-(2,1)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (2,5)-(2,8)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── rest: - │ │ │ @ SplatNode (location: (2,6)-(2,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (2,6)-(2,7) = "*" - │ │ │ └── expression: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── opening_loc: (2,5)-(2,6) = "[" - │ │ └── closing_loc: (2,7)-(2,8) = "]" - │ └── operator_loc: (2,2)-(2,4) = "=>" - ├── @ MatchPredicateNode (location: (3,0)-(3,15)) - │ ├── flags: newline - │ ├── value: - │ │ @ IntegerNode (location: (3,0)-(3,1)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── pattern: - │ │ @ FindPatternNode (location: (3,5)-(3,15)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── left: - │ │ │ @ SplatNode (location: (3,6)-(3,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (3,6)-(3,7) = "*" - │ │ │ └── expression: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ IntegerNode (location: (3,9)-(3,11)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 42 - │ │ ├── right: - │ │ │ @ SplatNode (location: (3,13)-(3,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (3,13)-(3,14) = "*" - │ │ │ └── expression: ∅ - │ │ ├── opening_loc: (3,5)-(3,6) = "[" - │ │ └── closing_loc: (3,14)-(3,15) = "]" - │ └── operator_loc: (3,2)-(3,4) = "in" - └── @ MatchPredicateNode (location: (4,0)-(4,17)) - ├── flags: newline - ├── value: - │ @ IntegerNode (location: (4,0)-(4,1)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── pattern: - │ @ FindPatternNode (location: (4,5)-(4,17)) - │ ├── flags: ∅ - │ ├── constant: ∅ - │ ├── left: - │ │ @ SplatNode (location: (4,6)-(4,7)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (4,6)-(4,7) = "*" - │ │ └── expression: ∅ - │ ├── requireds: (length: 1) - │ │ └── @ LocalVariableTargetNode (location: (4,9)-(4,10)) - │ │ ├── flags: ∅ - │ │ ├── name: :a - │ │ └── depth: 0 - │ ├── right: - │ │ @ SplatNode (location: (4,12)-(4,16)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (4,12)-(4,13) = "*" - │ │ └── expression: - │ │ @ LocalVariableTargetNode (location: (4,13)-(4,16)) - │ │ ├── flags: ∅ - │ │ ├── name: :foo - │ │ └── depth: 0 - │ ├── opening_loc: (4,5)-(4,6) = "[" - │ └── closing_loc: (4,16)-(4,17) = "]" - └── operator_loc: (4,2)-(4,4) = "in" diff --git a/test/prism/snapshots/unparser/corpus/literal/since/31.txt b/test/prism/snapshots/unparser/corpus/literal/since/31.txt deleted file mode 100644 index 81bcd9662bd136..00000000000000 --- a/test/prism/snapshots/unparser/corpus/literal/since/31.txt +++ /dev/null @@ -1,100 +0,0 @@ -@ ProgramNode (location: (1,0)-(7,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(7,3)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ DefNode (location: (1,0)-(3,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (1,4)-(1,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,8)-(1,9)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: - │ │ @ BlockParameterNode (location: (1,8)-(1,9)) - │ │ ├── flags: ∅ - │ │ ├── name: ∅ - │ │ ├── name_loc: ∅ - │ │ └── operator_loc: (1,8)-(1,9) = "&" - │ ├── body: - │ │ @ StatementsNode (location: (2,2)-(2,7)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (2,2)-(2,7)) - │ │ ├── flags: newline, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (2,2)-(2,5) = "bar" - │ │ ├── opening_loc: (2,5)-(2,6) = "(" - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: (2,7)-(2,8) = ")" - │ │ └── block: - │ │ @ BlockArgumentNode (location: (2,6)-(2,7)) - │ │ ├── flags: ∅ - │ │ ├── expression: ∅ - │ │ └── operator_loc: (2,6)-(2,7) = "&" - │ ├── locals: [] - │ ├── def_keyword_loc: (1,0)-(1,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (1,7)-(1,8) = "(" - │ ├── rparen_loc: (1,9)-(1,10) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (3,0)-(3,3) = "end" - └── @ DefNode (location: (5,0)-(7,3)) - ├── flags: newline - ├── name: :foo - ├── name_loc: (5,4)-(5,7) = "foo" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (5,8)-(5,12)) - │ ├── flags: ∅ - │ ├── requireds: (length: 1) - │ │ └── @ RequiredParameterNode (location: (5,8)-(5,9)) - │ │ ├── flags: ∅ - │ │ └── name: :a - │ ├── optionals: (length: 0) - │ ├── rest: ∅ - │ ├── posts: (length: 0) - │ ├── keywords: (length: 0) - │ ├── keyword_rest: ∅ - │ └── block: - │ @ BlockParameterNode (location: (5,11)-(5,12)) - │ ├── flags: ∅ - │ ├── name: ∅ - │ ├── name_loc: ∅ - │ └── operator_loc: (5,11)-(5,12) = "&" - ├── body: - │ @ StatementsNode (location: (6,2)-(6,7)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (6,2)-(6,7)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :bar - │ ├── message_loc: (6,2)-(6,5) = "bar" - │ ├── opening_loc: (6,5)-(6,6) = "(" - │ ├── arguments: ∅ - │ ├── closing_loc: (6,7)-(6,8) = ")" - │ └── block: - │ @ BlockArgumentNode (location: (6,6)-(6,7)) - │ ├── flags: ∅ - │ ├── expression: ∅ - │ └── operator_loc: (6,6)-(6,7) = "&" - ├── locals: [:a] - ├── def_keyword_loc: (5,0)-(5,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: (5,7)-(5,8) = "(" - ├── rparen_loc: (5,12)-(5,13) = ")" - ├── equal_loc: ∅ - └── end_keyword_loc: (7,0)-(7,3) = "end" diff --git a/test/prism/snapshots/unparser/corpus/literal/since/32.txt b/test/prism/snapshots/unparser/corpus/literal/since/32.txt deleted file mode 100644 index 2b126a0cc5551a..00000000000000 --- a/test/prism/snapshots/unparser/corpus/literal/since/32.txt +++ /dev/null @@ -1,174 +0,0 @@ -@ ProgramNode (location: (1,0)-(11,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(11,3)) - ├── flags: ∅ - └── body: (length: 3) - ├── @ DefNode (location: (1,0)-(3,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (1,4)-(1,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,8)-(1,20)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (1,8)-(1,16)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :argument - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: - │ │ │ @ KeywordRestParameterNode (location: (1,18)-(1,20)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: ∅ - │ │ │ ├── name_loc: ∅ - │ │ │ └── operator_loc: (1,18)-(1,20) = "**" - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (2,2)-(2,19)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (2,2)-(2,19)) - │ │ ├── flags: newline, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (2,2)-(2,5) = "bar" - │ │ ├── opening_loc: (2,5)-(2,6) = "(" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (2,6)-(2,18)) - │ │ │ ├── flags: contains_keywords, contains_keyword_splat - │ │ │ └── arguments: (length: 2) - │ │ │ ├── @ LocalVariableReadNode (location: (2,6)-(2,14)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :argument - │ │ │ │ └── depth: 0 - │ │ │ └── @ KeywordHashNode (location: (2,16)-(2,18)) - │ │ │ ├── flags: ∅ - │ │ │ └── elements: (length: 1) - │ │ │ └── @ AssocSplatNode (location: (2,16)-(2,18)) - │ │ │ ├── flags: ∅ - │ │ │ ├── value: ∅ - │ │ │ └── operator_loc: (2,16)-(2,18) = "**" - │ │ ├── closing_loc: (2,18)-(2,19) = ")" - │ │ └── block: ∅ - │ ├── locals: [:argument] - │ ├── def_keyword_loc: (1,0)-(1,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (1,7)-(1,8) = "(" - │ ├── rparen_loc: (1,20)-(1,21) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (3,0)-(3,3) = "end" - ├── @ DefNode (location: (5,0)-(7,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (5,4)-(5,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (5,8)-(5,19)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (5,8)-(5,16)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :argument - │ │ ├── optionals: (length: 0) - │ │ ├── rest: - │ │ │ @ RestParameterNode (location: (5,18)-(5,19)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: ∅ - │ │ │ ├── name_loc: ∅ - │ │ │ └── operator_loc: (5,18)-(5,19) = "*" - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (6,2)-(6,18)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (6,2)-(6,18)) - │ │ ├── flags: newline, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (6,2)-(6,5) = "bar" - │ │ ├── opening_loc: (6,5)-(6,6) = "(" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (6,6)-(6,17)) - │ │ │ ├── flags: contains_splat - │ │ │ └── arguments: (length: 2) - │ │ │ ├── @ LocalVariableReadNode (location: (6,6)-(6,14)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :argument - │ │ │ │ └── depth: 0 - │ │ │ └── @ SplatNode (location: (6,16)-(6,17)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (6,16)-(6,17) = "*" - │ │ │ └── expression: ∅ - │ │ ├── closing_loc: (6,17)-(6,18) = ")" - │ │ └── block: ∅ - │ ├── locals: [:argument] - │ ├── def_keyword_loc: (5,0)-(5,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (5,7)-(5,8) = "(" - │ ├── rparen_loc: (5,19)-(5,20) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (7,0)-(7,3) = "end" - └── @ DefNode (location: (9,0)-(11,3)) - ├── flags: newline - ├── name: :foo - ├── name_loc: (9,4)-(9,7) = "foo" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (9,8)-(9,10)) - │ ├── flags: ∅ - │ ├── requireds: (length: 0) - │ ├── optionals: (length: 0) - │ ├── rest: ∅ - │ ├── posts: (length: 0) - │ ├── keywords: (length: 0) - │ ├── keyword_rest: - │ │ @ KeywordRestParameterNode (location: (9,8)-(9,10)) - │ │ ├── flags: ∅ - │ │ ├── name: ∅ - │ │ ├── name_loc: ∅ - │ │ └── operator_loc: (9,8)-(9,10) = "**" - │ └── block: ∅ - ├── body: - │ @ StatementsNode (location: (10,2)-(10,20)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ HashNode (location: (10,2)-(10,20)) - │ ├── flags: newline - │ ├── opening_loc: (10,2)-(10,3) = "{" - │ ├── elements: (length: 2) - │ │ ├── @ AssocNode (location: (10,4)-(10,14)) - │ │ │ ├── flags: static_literal - │ │ │ ├── key: - │ │ │ │ @ SymbolNode (location: (10,4)-(10,12)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── value_loc: (10,4)-(10,11) = "default" - │ │ │ │ ├── closing_loc: (10,11)-(10,12) = ":" - │ │ │ │ └── unescaped: "default" - │ │ │ ├── value: - │ │ │ │ @ IntegerNode (location: (10,13)-(10,14)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ └── operator_loc: ∅ - │ │ └── @ AssocSplatNode (location: (10,16)-(10,18)) - │ │ ├── flags: ∅ - │ │ ├── value: ∅ - │ │ └── operator_loc: (10,16)-(10,18) = "**" - │ └── closing_loc: (10,19)-(10,20) = "}" - ├── locals: [] - ├── def_keyword_loc: (9,0)-(9,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: (9,7)-(9,8) = "(" - ├── rparen_loc: (9,10)-(9,11) = ")" - ├── equal_loc: ∅ - └── end_keyword_loc: (11,0)-(11,3) = "end" diff --git a/test/prism/snapshots/unparser/corpus/literal/singletons.txt b/test/prism/snapshots/unparser/corpus/literal/singletons.txt deleted file mode 100644 index 23069207c93422..00000000000000 --- a/test/prism/snapshots/unparser/corpus/literal/singletons.txt +++ /dev/null @@ -1,15 +0,0 @@ -@ ProgramNode (location: (1,0)-(4,4)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(4,4)) - ├── flags: ∅ - └── body: (length: 4) - ├── @ FalseNode (location: (1,0)-(1,5)) - │ └── flags: newline, static_literal - ├── @ NilNode (location: (2,0)-(2,3)) - │ └── flags: newline, static_literal - ├── @ SelfNode (location: (3,0)-(3,4)) - │ └── flags: newline - └── @ TrueNode (location: (4,0)-(4,4)) - └── flags: newline, static_literal diff --git a/test/prism/snapshots/unparser/corpus/literal/super.txt b/test/prism/snapshots/unparser/corpus/literal/super.txt deleted file mode 100644 index a6311116ca5c23..00000000000000 --- a/test/prism/snapshots/unparser/corpus/literal/super.txt +++ /dev/null @@ -1,302 +0,0 @@ -@ ProgramNode (location: (1,0)-(21,1)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(21,1)) - ├── flags: ∅ - └── body: (length: 11) - ├── @ ForwardingSuperNode (location: (1,0)-(1,5)) - │ ├── flags: newline - │ └── block: ∅ - ├── @ SuperNode (location: (2,0)-(2,7)) - │ ├── flags: newline - │ ├── keyword_loc: (2,0)-(2,5) = "super" - │ ├── lparen_loc: (2,5)-(2,6) = "(" - │ ├── arguments: ∅ - │ ├── rparen_loc: (2,6)-(2,7) = ")" - │ └── block: ∅ - ├── @ SuperNode (location: (3,0)-(3,8)) - │ ├── flags: newline - │ ├── keyword_loc: (3,0)-(3,5) = "super" - │ ├── lparen_loc: (3,5)-(3,6) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (3,6)-(3,7)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (3,6)-(3,7)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (3,6)-(3,7) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── rparen_loc: (3,7)-(3,8) = ")" - │ └── block: ∅ - ├── @ SuperNode (location: (4,0)-(4,11)) - │ ├── flags: newline - │ ├── keyword_loc: (4,0)-(4,5) = "super" - │ ├── lparen_loc: (4,5)-(4,6) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (4,6)-(4,10)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (4,6)-(4,7)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :a - │ │ │ ├── message_loc: (4,6)-(4,7) = "a" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── @ CallNode (location: (4,9)-(4,10)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :b - │ │ ├── message_loc: (4,9)-(4,10) = "b" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── rparen_loc: (4,10)-(4,11) = ")" - │ └── block: ∅ - ├── @ SuperNode (location: (5,0)-(5,13)) - │ ├── flags: newline - │ ├── keyword_loc: (5,0)-(5,5) = "super" - │ ├── lparen_loc: (5,5)-(5,6) = "(" - │ ├── arguments: ∅ - │ ├── rparen_loc: (5,12)-(5,13) = ")" - │ └── block: - │ @ BlockArgumentNode (location: (5,6)-(5,12)) - │ ├── flags: ∅ - │ ├── expression: - │ │ @ CallNode (location: (5,7)-(5,12)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :block - │ │ ├── message_loc: (5,7)-(5,12) = "block" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── operator_loc: (5,6)-(5,7) = "&" - ├── @ SuperNode (location: (6,0)-(6,16)) - │ ├── flags: newline - │ ├── keyword_loc: (6,0)-(6,5) = "super" - │ ├── lparen_loc: (6,5)-(6,6) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (6,6)-(6,7)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (6,6)-(6,7)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (6,6)-(6,7) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── rparen_loc: (6,15)-(6,16) = ")" - │ └── block: - │ @ BlockArgumentNode (location: (6,9)-(6,15)) - │ ├── flags: ∅ - │ ├── expression: - │ │ @ CallNode (location: (6,10)-(6,15)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :block - │ │ ├── message_loc: (6,10)-(6,15) = "block" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── operator_loc: (6,9)-(6,10) = "&" - ├── @ SuperNode (location: (7,0)-(9,2)) - │ ├── flags: newline - │ ├── keyword_loc: (7,0)-(7,5) = "super" - │ ├── lparen_loc: (7,5)-(7,6) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (7,6)-(9,1)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (7,6)-(9,1)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (7,6)-(7,7) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: - │ │ @ BlockNode (location: (7,8)-(9,1)) - │ │ ├── flags: ∅ - │ │ ├── locals: [] - │ │ ├── parameters: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (8,2)-(8,5)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (8,2)-(8,5)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (8,2)-(8,5) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── opening_loc: (7,8)-(7,9) = "{" - │ │ └── closing_loc: (9,0)-(9,1) = "}" - │ ├── rparen_loc: (9,1)-(9,2) = ")" - │ └── block: ∅ - ├── @ ForwardingSuperNode (location: (10,0)-(12,1)) - │ ├── flags: newline - │ └── block: - │ @ BlockNode (location: (10,6)-(12,1)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (11,2)-(11,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (11,2)-(11,5)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (11,2)-(11,5) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── opening_loc: (10,6)-(10,7) = "{" - │ └── closing_loc: (12,0)-(12,1) = "}" - ├── @ SuperNode (location: (13,0)-(15,1)) - │ ├── flags: newline - │ ├── keyword_loc: (13,0)-(13,5) = "super" - │ ├── lparen_loc: (13,5)-(13,6) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (13,6)-(13,7)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (13,6)-(13,7)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (13,6)-(13,7) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── rparen_loc: (13,7)-(13,8) = ")" - │ └── block: - │ @ BlockNode (location: (13,9)-(15,1)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (14,2)-(14,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (14,2)-(14,5)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (14,2)-(14,5) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── opening_loc: (13,9)-(13,10) = "{" - │ └── closing_loc: (15,0)-(15,1) = "}" - ├── @ SuperNode (location: (16,0)-(18,1)) - │ ├── flags: newline - │ ├── keyword_loc: (16,0)-(16,5) = "super" - │ ├── lparen_loc: (16,5)-(16,6) = "(" - │ ├── arguments: ∅ - │ ├── rparen_loc: (16,6)-(16,7) = ")" - │ └── block: - │ @ BlockNode (location: (16,8)-(18,1)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (17,2)-(17,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (17,2)-(17,5)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (17,2)-(17,5) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── opening_loc: (16,8)-(16,9) = "{" - │ └── closing_loc: (18,0)-(18,1) = "}" - └── @ SuperNode (location: (19,0)-(21,1)) - ├── flags: newline - ├── keyword_loc: (19,0)-(19,5) = "super" - ├── lparen_loc: (19,5)-(19,6) = "(" - ├── arguments: - │ @ ArgumentsNode (location: (19,6)-(19,10)) - │ ├── flags: ∅ - │ └── arguments: (length: 2) - │ ├── @ CallNode (location: (19,6)-(19,7)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (19,6)-(19,7) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── @ CallNode (location: (19,9)-(19,10)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :b - │ ├── message_loc: (19,9)-(19,10) = "b" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── rparen_loc: (19,10)-(19,11) = ")" - └── block: - @ BlockNode (location: (19,12)-(21,1)) - ├── flags: ∅ - ├── locals: [] - ├── parameters: ∅ - ├── body: - │ @ StatementsNode (location: (20,2)-(20,5)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (20,2)-(20,5)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (20,2)-(20,5) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── opening_loc: (19,12)-(19,13) = "{" - └── closing_loc: (21,0)-(21,1) = "}" diff --git a/test/prism/snapshots/unparser/corpus/literal/unary.txt b/test/prism/snapshots/unparser/corpus/literal/unary.txt deleted file mode 100644 index ec2115e4119d58..00000000000000 --- a/test/prism/snapshots/unparser/corpus/literal/unary.txt +++ /dev/null @@ -1,309 +0,0 @@ -@ ProgramNode (location: (1,0)-(9,9)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(9,9)) - ├── flags: ∅ - └── body: (length: 9) - ├── @ CallNode (location: (1,0)-(1,2)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ IntegerNode (location: (1,1)-(1,2)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── call_operator_loc: ∅ - │ ├── name: :! - │ ├── message_loc: (1,0)-(1,1) = "!" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (2,0)-(2,5)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ParenthesesNode (location: (2,1)-(2,5)) - │ │ ├── flags: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (2,2)-(2,4)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (2,2)-(2,4)) - │ │ │ ├── flags: newline - │ │ │ ├── receiver: - │ │ │ │ @ IntegerNode (location: (2,3)-(2,4)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :! - │ │ │ ├── message_loc: (2,2)-(2,3) = "!" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── opening_loc: (2,1)-(2,2) = "(" - │ │ └── closing_loc: (2,4)-(2,5) = ")" - │ ├── call_operator_loc: ∅ - │ ├── name: :! - │ ├── message_loc: (2,0)-(2,1) = "!" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (3,0)-(3,16)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ ParenthesesNode (location: (3,1)-(3,16)) - │ │ ├── flags: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (3,2)-(3,15)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (3,2)-(3,15)) - │ │ │ ├── flags: newline - │ │ │ ├── receiver: - │ │ │ │ @ ParenthesesNode (location: (3,3)-(3,15)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── body: - │ │ │ │ │ @ StatementsNode (location: (3,4)-(3,14)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── body: (length: 1) - │ │ │ │ │ └── @ OrNode (location: (3,4)-(3,14)) - │ │ │ │ │ ├── flags: newline - │ │ │ │ │ ├── left: - │ │ │ │ │ │ @ CallNode (location: (3,4)-(3,7)) - │ │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ │ ├── name: :foo - │ │ │ │ │ │ ├── message_loc: (3,4)-(3,7) = "foo" - │ │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ │ └── block: ∅ - │ │ │ │ │ ├── right: - │ │ │ │ │ │ @ CallNode (location: (3,11)-(3,14)) - │ │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ │ ├── name: :bar - │ │ │ │ │ │ ├── message_loc: (3,11)-(3,14) = "bar" - │ │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ │ └── block: ∅ - │ │ │ │ │ └── operator_loc: (3,8)-(3,10) = "||" - │ │ │ │ ├── opening_loc: (3,3)-(3,4) = "(" - │ │ │ │ └── closing_loc: (3,14)-(3,15) = ")" - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :! - │ │ │ ├── message_loc: (3,2)-(3,3) = "!" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── opening_loc: (3,1)-(3,2) = "(" - │ │ └── closing_loc: (3,15)-(3,16) = ")" - │ ├── call_operator_loc: ∅ - │ ├── name: :! - │ ├── message_loc: (3,0)-(3,1) = "!" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (4,0)-(4,9)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (4,1)-(4,9)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ ParenthesesNode (location: (4,1)-(4,5)) - │ │ │ ├── flags: ∅ - │ │ │ ├── body: - │ │ │ │ @ StatementsNode (location: (4,2)-(4,4)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (4,2)-(4,4)) - │ │ │ │ ├── flags: newline - │ │ │ │ ├── receiver: - │ │ │ │ │ @ IntegerNode (location: (4,3)-(4,4)) - │ │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ │ └── value: 1 - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :! - │ │ │ │ ├── message_loc: (4,2)-(4,3) = "!" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── opening_loc: (4,1)-(4,2) = "(" - │ │ │ └── closing_loc: (4,4)-(4,5) = ")" - │ │ ├── call_operator_loc: (4,5)-(4,6) = "." - │ │ ├── name: :baz - │ │ ├── message_loc: (4,6)-(4,9) = "baz" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :! - │ ├── message_loc: (4,0)-(4,1) = "!" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (5,0)-(5,2)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (5,1)-(5,2)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (5,1)-(5,2) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :~ - │ ├── message_loc: (5,0)-(5,1) = "~" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (6,0)-(6,2)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (6,1)-(6,2)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (6,1)-(6,2) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :-@ - │ ├── message_loc: (6,0)-(6,1) = "-" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (7,0)-(7,2)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (7,1)-(7,2)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (7,1)-(7,2) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :+@ - │ ├── message_loc: (7,0)-(7,1) = "+" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (8,0)-(8,9)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (8,1)-(8,9)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ ParenthesesNode (location: (8,1)-(8,5)) - │ │ │ ├── flags: ∅ - │ │ │ ├── body: - │ │ │ │ @ StatementsNode (location: (8,2)-(8,4)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (8,2)-(8,4)) - │ │ │ │ ├── flags: newline - │ │ │ │ ├── receiver: - │ │ │ │ │ @ CallNode (location: (8,3)-(8,4)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :a - │ │ │ │ │ ├── message_loc: (8,3)-(8,4) = "a" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :-@ - │ │ │ │ ├── message_loc: (8,2)-(8,3) = "-" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── opening_loc: (8,1)-(8,2) = "(" - │ │ │ └── closing_loc: (8,4)-(8,5) = ")" - │ │ ├── call_operator_loc: (8,5)-(8,6) = "." - │ │ ├── name: :foo - │ │ ├── message_loc: (8,6)-(8,9) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :-@ - │ ├── message_loc: (8,0)-(8,1) = "-" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── @ CallNode (location: (9,0)-(9,9)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (9,1)-(9,9)) - │ ├── flags: ∅ - │ ├── receiver: - │ │ @ ParenthesesNode (location: (9,1)-(9,5)) - │ │ ├── flags: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (9,2)-(9,4)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (9,2)-(9,4)) - │ │ │ ├── flags: newline - │ │ │ ├── receiver: - │ │ │ │ @ CallNode (location: (9,3)-(9,4)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :a - │ │ │ │ ├── message_loc: (9,3)-(9,4) = "a" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :+@ - │ │ │ ├── message_loc: (9,2)-(9,3) = "+" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── opening_loc: (9,1)-(9,2) = "(" - │ │ └── closing_loc: (9,4)-(9,5) = ")" - │ ├── call_operator_loc: (9,5)-(9,6) = "." - │ ├── name: :foo - │ ├── message_loc: (9,6)-(9,9) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: ∅ - ├── name: :+@ - ├── message_loc: (9,0)-(9,1) = "+" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/unparser/corpus/literal/undef.txt b/test/prism/snapshots/unparser/corpus/literal/undef.txt deleted file mode 100644 index b7ccf68e27e78b..00000000000000 --- a/test/prism/snapshots/unparser/corpus/literal/undef.txt +++ /dev/null @@ -1,33 +0,0 @@ -@ ProgramNode (location: (1,0)-(2,16)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(2,16)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ UndefNode (location: (1,0)-(1,10)) - │ ├── flags: newline - │ ├── names: (length: 1) - │ │ └── @ SymbolNode (location: (1,6)-(1,10)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (1,6)-(1,7) = ":" - │ │ ├── value_loc: (1,7)-(1,10) = "foo" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "foo" - │ └── keyword_loc: (1,0)-(1,5) = "undef" - └── @ UndefNode (location: (2,0)-(2,16)) - ├── flags: newline - ├── names: (length: 2) - │ ├── @ SymbolNode (location: (2,6)-(2,10)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (2,6)-(2,7) = ":" - │ │ ├── value_loc: (2,7)-(2,10) = "foo" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "foo" - │ └── @ SymbolNode (location: (2,12)-(2,16)) - │ ├── flags: static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (2,12)-(2,13) = ":" - │ ├── value_loc: (2,13)-(2,16) = "bar" - │ ├── closing_loc: ∅ - │ └── unescaped: "bar" - └── keyword_loc: (2,0)-(2,5) = "undef" diff --git a/test/prism/snapshots/unparser/corpus/literal/variables.txt b/test/prism/snapshots/unparser/corpus/literal/variables.txt deleted file mode 100644 index 3861af1a4629c1..00000000000000 --- a/test/prism/snapshots/unparser/corpus/literal/variables.txt +++ /dev/null @@ -1,62 +0,0 @@ -@ ProgramNode (location: (1,0)-(10,17)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(10,17)) - ├── flags: ∅ - └── body: (length: 10) - ├── @ CallNode (location: (1,0)-(1,1)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (1,0)-(1,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ InstanceVariableReadNode (location: (2,0)-(2,2)) - │ ├── flags: newline - │ └── name: :@a - ├── @ ClassVariableReadNode (location: (3,0)-(3,3)) - │ ├── flags: newline - │ └── name: :@@a - ├── @ GlobalVariableReadNode (location: (4,0)-(4,2)) - │ ├── flags: newline - │ └── name: :$a - ├── @ NumberedReferenceReadNode (location: (5,0)-(5,2)) - │ ├── flags: newline - │ └── number: 1 - ├── @ BackReferenceReadNode (location: (6,0)-(6,2)) - │ ├── flags: newline - │ └── name: :$` - ├── @ ConstantReadNode (location: (7,0)-(7,5)) - │ ├── flags: newline - │ └── name: :CONST - ├── @ ConstantPathNode (location: (8,0)-(8,13)) - │ ├── flags: newline - │ ├── parent: - │ │ @ ConstantReadNode (location: (8,0)-(8,6)) - │ │ ├── flags: ∅ - │ │ └── name: :SCOPED - │ ├── name: :CONST - │ ├── delimiter_loc: (8,6)-(8,8) = "::" - │ └── name_loc: (8,8)-(8,13) = "CONST" - ├── @ ConstantPathNode (location: (9,0)-(9,10)) - │ ├── flags: newline - │ ├── parent: ∅ - │ ├── name: :TOPLEVEL - │ ├── delimiter_loc: (9,0)-(9,2) = "::" - │ └── name_loc: (9,2)-(9,10) = "TOPLEVEL" - └── @ ConstantPathNode (location: (10,0)-(10,17)) - ├── flags: newline - ├── parent: - │ @ ConstantPathNode (location: (10,0)-(10,10)) - │ ├── flags: ∅ - │ ├── parent: ∅ - │ ├── name: :TOPLEVEL - │ ├── delimiter_loc: (10,0)-(10,2) = "::" - │ └── name_loc: (10,2)-(10,10) = "TOPLEVEL" - ├── name: :CONST - ├── delimiter_loc: (10,10)-(10,12) = "::" - └── name_loc: (10,12)-(10,17) = "CONST" diff --git a/test/prism/snapshots/unparser/corpus/literal/while.txt b/test/prism/snapshots/unparser/corpus/literal/while.txt deleted file mode 100644 index 7d9a24ec624313..00000000000000 --- a/test/prism/snapshots/unparser/corpus/literal/while.txt +++ /dev/null @@ -1,786 +0,0 @@ -@ ProgramNode (location: (1,0)-(73,3)) -├── flags: ∅ -├── locals: [:x] -└── statements: - @ StatementsNode (location: (1,0)-(73,3)) - ├── flags: ∅ - └── body: (length: 17) - ├── @ ModuleNode (location: (1,0)-(7,3)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── module_keyword_loc: (1,0)-(1,6) = "module" - │ ├── constant_path: - │ │ @ ConstantReadNode (location: (1,7)-(1,8)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── body: - │ │ @ StatementsNode (location: (2,2)-(6,3)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (2,2)-(6,3)) - │ │ ├── flags: newline, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (2,2)-(2,5) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: - │ │ @ BlockNode (location: (2,6)-(6,3)) - │ │ ├── flags: ∅ - │ │ ├── locals: [:bar, :foo] - │ │ ├── parameters: - │ │ │ @ BlockParametersNode (location: (2,8)-(2,13)) - │ │ │ ├── flags: ∅ - │ │ │ ├── parameters: - │ │ │ │ @ ParametersNode (location: (2,9)-(2,12)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── requireds: (length: 1) - │ │ │ │ │ └── @ RequiredParameterNode (location: (2,9)-(2,12)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── name: :bar - │ │ │ │ ├── optionals: (length: 0) - │ │ │ │ ├── rest: ∅ - │ │ │ │ ├── posts: (length: 0) - │ │ │ │ ├── keywords: (length: 0) - │ │ │ │ ├── keyword_rest: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── locals: (length: 0) - │ │ │ ├── opening_loc: (2,8)-(2,9) = "|" - │ │ │ └── closing_loc: (2,12)-(2,13) = "|" - │ │ ├── body: - │ │ │ @ StatementsNode (location: (3,4)-(5,7)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ WhileNode (location: (3,4)-(5,7)) - │ │ │ ├── flags: newline - │ │ │ ├── keyword_loc: (3,4)-(3,9) = "while" - │ │ │ ├── closing_loc: (5,4)-(5,7) = "end" - │ │ │ ├── predicate: - │ │ │ │ @ CallNode (location: (3,10)-(3,13)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :foo - │ │ │ │ ├── message_loc: (3,10)-(3,13) = "foo" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── statements: - │ │ │ @ StatementsNode (location: (4,6)-(4,15)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ LocalVariableWriteNode (location: (4,6)-(4,15)) - │ │ │ ├── flags: newline - │ │ │ ├── name: :foo - │ │ │ ├── depth: 0 - │ │ │ ├── name_loc: (4,6)-(4,9) = "foo" - │ │ │ ├── value: - │ │ │ │ @ LocalVariableReadNode (location: (4,12)-(4,15)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :bar - │ │ │ │ └── depth: 0 - │ │ │ └── operator_loc: (4,10)-(4,11) = "=" - │ │ ├── opening_loc: (2,6)-(2,7) = "{" - │ │ └── closing_loc: (6,2)-(6,3) = "}" - │ ├── end_keyword_loc: (7,0)-(7,3) = "end" - │ └── name: :A - ├── @ DefNode (location: (9,0)-(11,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (9,4)-(9,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (10,2)-(10,28)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ WhileNode (location: (10,2)-(10,28)) - │ │ ├── flags: newline - │ │ ├── keyword_loc: (10,12)-(10,17) = "while" - │ │ ├── closing_loc: ∅ - │ │ ├── predicate: - │ │ │ @ CallNode (location: (10,18)-(10,28)) - │ │ │ ├── flags: ∅ - │ │ │ ├── receiver: - │ │ │ │ @ LocalVariableReadNode (location: (10,18)-(10,21)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :foo - │ │ │ │ └── depth: 0 - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :!= - │ │ │ ├── message_loc: (10,22)-(10,24) = "!=" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (10,25)-(10,28)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ CallNode (location: (10,25)-(10,28)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ ├── message_loc: (10,25)-(10,28) = "baz" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── statements: - │ │ @ StatementsNode (location: (10,2)-(10,11)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ LocalVariableWriteNode (location: (10,2)-(10,11)) - │ │ ├── flags: newline - │ │ ├── name: :foo - │ │ ├── depth: 0 - │ │ ├── name_loc: (10,2)-(10,5) = "foo" - │ │ ├── value: - │ │ │ @ CallNode (location: (10,8)-(10,11)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (10,8)-(10,11) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: (10,6)-(10,7) = "=" - │ ├── locals: [:foo] - │ ├── def_keyword_loc: (9,0)-(9,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (11,0)-(11,3) = "end" - ├── @ ModuleNode (location: (13,0)-(15,3)) - │ ├── flags: newline - │ ├── locals: [:foo] - │ ├── module_keyword_loc: (13,0)-(13,6) = "module" - │ ├── constant_path: - │ │ @ ConstantReadNode (location: (13,7)-(13,8)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── body: - │ │ @ StatementsNode (location: (14,2)-(14,21)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ WhileNode (location: (14,2)-(14,21)) - │ │ ├── flags: newline - │ │ ├── keyword_loc: (14,12)-(14,17) = "while" - │ │ ├── closing_loc: ∅ - │ │ ├── predicate: - │ │ │ @ LocalVariableReadNode (location: (14,18)-(14,21)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :foo - │ │ │ └── depth: 0 - │ │ └── statements: - │ │ @ StatementsNode (location: (14,2)-(14,11)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ LocalVariableWriteNode (location: (14,2)-(14,11)) - │ │ ├── flags: newline - │ │ ├── name: :foo - │ │ ├── depth: 0 - │ │ ├── name_loc: (14,2)-(14,5) = "foo" - │ │ ├── value: - │ │ │ @ CallNode (location: (14,8)-(14,11)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (14,8)-(14,11) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: (14,6)-(14,7) = "=" - │ ├── end_keyword_loc: (15,0)-(15,3) = "end" - │ └── name: :A - ├── @ ModuleNode (location: (17,0)-(19,3)) - │ ├── flags: newline - │ ├── locals: [:foo] - │ ├── module_keyword_loc: (17,0)-(17,6) = "module" - │ ├── constant_path: - │ │ @ ConstantReadNode (location: (17,7)-(17,8)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── body: - │ │ @ StatementsNode (location: (18,2)-(18,21)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ UntilNode (location: (18,2)-(18,21)) - │ │ ├── flags: newline - │ │ ├── keyword_loc: (18,12)-(18,17) = "until" - │ │ ├── closing_loc: ∅ - │ │ ├── predicate: - │ │ │ @ LocalVariableReadNode (location: (18,18)-(18,21)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :foo - │ │ │ └── depth: 0 - │ │ └── statements: - │ │ @ StatementsNode (location: (18,2)-(18,11)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ LocalVariableWriteNode (location: (18,2)-(18,11)) - │ │ ├── flags: newline - │ │ ├── name: :foo - │ │ ├── depth: 0 - │ │ ├── name_loc: (18,2)-(18,5) = "foo" - │ │ ├── value: - │ │ │ @ CallNode (location: (18,8)-(18,11)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (18,8)-(18,11) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: (18,6)-(18,7) = "=" - │ ├── end_keyword_loc: (19,0)-(19,3) = "end" - │ └── name: :A - ├── @ ModuleNode (location: (21,0)-(25,3)) - │ ├── flags: newline - │ ├── locals: [:foo] - │ ├── module_keyword_loc: (21,0)-(21,6) = "module" - │ ├── constant_path: - │ │ @ ConstantReadNode (location: (21,7)-(21,8)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── body: - │ │ @ StatementsNode (location: (22,2)-(24,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ WhileNode (location: (22,2)-(24,5)) - │ │ ├── flags: newline - │ │ ├── keyword_loc: (22,2)-(22,7) = "while" - │ │ ├── closing_loc: (24,2)-(24,5) = "end" - │ │ ├── predicate: - │ │ │ @ CallNode (location: (22,8)-(22,11)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (22,8)-(22,11) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── statements: - │ │ @ StatementsNode (location: (23,4)-(23,13)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ LocalVariableWriteNode (location: (23,4)-(23,13)) - │ │ ├── flags: newline - │ │ ├── name: :foo - │ │ ├── depth: 0 - │ │ ├── name_loc: (23,4)-(23,7) = "foo" - │ │ ├── value: - │ │ │ @ CallNode (location: (23,10)-(23,13)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (23,10)-(23,13) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: (23,8)-(23,9) = "=" - │ ├── end_keyword_loc: (25,0)-(25,3) = "end" - │ └── name: :A - ├── @ ModuleNode (location: (27,0)-(33,3)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── module_keyword_loc: (27,0)-(27,6) = "module" - │ ├── constant_path: - │ │ @ ConstantReadNode (location: (27,7)-(27,8)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── body: - │ │ @ StatementsNode (location: (28,2)-(32,3)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (28,2)-(32,3)) - │ │ ├── flags: newline, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :each - │ │ ├── message_loc: (28,2)-(28,6) = "each" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: - │ │ @ BlockNode (location: (28,7)-(32,3)) - │ │ ├── flags: ∅ - │ │ ├── locals: [:baz, :foo] - │ │ ├── parameters: - │ │ │ @ BlockParametersNode (location: (28,9)-(28,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── parameters: - │ │ │ │ @ ParametersNode (location: (28,10)-(28,13)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── requireds: (length: 1) - │ │ │ │ │ └── @ RequiredParameterNode (location: (28,10)-(28,13)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── name: :baz - │ │ │ │ ├── optionals: (length: 0) - │ │ │ │ ├── rest: ∅ - │ │ │ │ ├── posts: (length: 0) - │ │ │ │ ├── keywords: (length: 0) - │ │ │ │ ├── keyword_rest: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── locals: (length: 0) - │ │ │ ├── opening_loc: (28,9)-(28,10) = "|" - │ │ │ └── closing_loc: (28,13)-(28,14) = "|" - │ │ ├── body: - │ │ │ @ StatementsNode (location: (29,4)-(31,7)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ WhileNode (location: (29,4)-(31,7)) - │ │ │ ├── flags: newline - │ │ │ ├── keyword_loc: (29,4)-(29,9) = "while" - │ │ │ ├── closing_loc: (31,4)-(31,7) = "end" - │ │ │ ├── predicate: - │ │ │ │ @ CallNode (location: (29,10)-(29,13)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :foo - │ │ │ │ ├── message_loc: (29,10)-(29,13) = "foo" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── statements: - │ │ │ @ StatementsNode (location: (30,6)-(30,15)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ LocalVariableWriteNode (location: (30,6)-(30,15)) - │ │ │ ├── flags: newline - │ │ │ ├── name: :foo - │ │ │ ├── depth: 0 - │ │ │ ├── name_loc: (30,6)-(30,9) = "foo" - │ │ │ ├── value: - │ │ │ │ @ CallNode (location: (30,12)-(30,15)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :bar - │ │ │ │ ├── message_loc: (30,12)-(30,15) = "bar" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── operator_loc: (30,10)-(30,11) = "=" - │ │ ├── opening_loc: (28,7)-(28,8) = "{" - │ │ └── closing_loc: (32,2)-(32,3) = "}" - │ ├── end_keyword_loc: (33,0)-(33,3) = "end" - │ └── name: :A - ├── @ ModuleNode (location: (35,0)-(41,3)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── module_keyword_loc: (35,0)-(35,6) = "module" - │ ├── constant_path: - │ │ @ ConstantReadNode (location: (35,7)-(35,8)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── body: - │ │ @ StatementsNode (location: (36,2)-(40,3)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (36,2)-(40,3)) - │ │ ├── flags: newline, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :each - │ │ ├── message_loc: (36,2)-(36,6) = "each" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: - │ │ @ BlockNode (location: (36,7)-(40,3)) - │ │ ├── flags: ∅ - │ │ ├── locals: [:foo] - │ │ ├── parameters: - │ │ │ @ BlockParametersNode (location: (36,9)-(36,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── parameters: - │ │ │ │ @ ParametersNode (location: (36,10)-(36,13)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── requireds: (length: 1) - │ │ │ │ │ └── @ RequiredParameterNode (location: (36,10)-(36,13)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── name: :foo - │ │ │ │ ├── optionals: (length: 0) - │ │ │ │ ├── rest: ∅ - │ │ │ │ ├── posts: (length: 0) - │ │ │ │ ├── keywords: (length: 0) - │ │ │ │ ├── keyword_rest: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── locals: (length: 0) - │ │ │ ├── opening_loc: (36,9)-(36,10) = "|" - │ │ │ └── closing_loc: (36,13)-(36,14) = "|" - │ │ ├── body: - │ │ │ @ StatementsNode (location: (37,4)-(39,7)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ WhileNode (location: (37,4)-(39,7)) - │ │ │ ├── flags: newline - │ │ │ ├── keyword_loc: (37,4)-(37,9) = "while" - │ │ │ ├── closing_loc: (39,4)-(39,7) = "end" - │ │ │ ├── predicate: - │ │ │ │ @ LocalVariableReadNode (location: (37,10)-(37,13)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :foo - │ │ │ │ └── depth: 0 - │ │ │ └── statements: - │ │ │ @ StatementsNode (location: (38,6)-(38,15)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ LocalVariableWriteNode (location: (38,6)-(38,15)) - │ │ │ ├── flags: newline - │ │ │ ├── name: :foo - │ │ │ ├── depth: 0 - │ │ │ ├── name_loc: (38,6)-(38,9) = "foo" - │ │ │ ├── value: - │ │ │ │ @ CallNode (location: (38,12)-(38,15)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :bar - │ │ │ │ ├── message_loc: (38,12)-(38,15) = "bar" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── operator_loc: (38,10)-(38,11) = "=" - │ │ ├── opening_loc: (36,7)-(36,8) = "{" - │ │ └── closing_loc: (40,2)-(40,3) = "}" - │ ├── end_keyword_loc: (41,0)-(41,3) = "end" - │ └── name: :A - ├── @ LocalVariableWriteNode (location: (42,0)-(44,14)) - │ ├── flags: newline - │ ├── name: :x - │ ├── depth: 0 - │ ├── name_loc: (42,0)-(42,1) = "x" - │ ├── value: - │ │ @ ParenthesesNode (location: (42,4)-(44,14)) - │ │ ├── flags: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (42,5)-(44,13)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ WhileNode (location: (42,5)-(44,13)) - │ │ │ ├── flags: newline, begin_modifier - │ │ │ ├── keyword_loc: (44,4)-(44,9) = "while" - │ │ │ ├── closing_loc: ∅ - │ │ │ ├── predicate: - │ │ │ │ @ CallNode (location: (44,10)-(44,13)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :baz - │ │ │ │ ├── message_loc: (44,10)-(44,13) = "baz" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── statements: - │ │ │ @ StatementsNode (location: (42,5)-(44,3)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ BeginNode (location: (42,5)-(44,3)) - │ │ │ ├── flags: newline - │ │ │ ├── begin_keyword_loc: (42,5)-(42,10) = "begin" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (43,2)-(43,5)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (43,2)-(43,5)) - │ │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :foo - │ │ │ │ ├── message_loc: (43,2)-(43,5) = "foo" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── rescue_clause: ∅ - │ │ │ ├── else_clause: ∅ - │ │ │ ├── ensure_clause: ∅ - │ │ │ └── end_keyword_loc: (44,0)-(44,3) = "end" - │ │ ├── opening_loc: (42,4)-(42,5) = "(" - │ │ └── closing_loc: (44,13)-(44,14) = ")" - │ └── operator_loc: (42,2)-(42,3) = "=" - ├── @ WhileNode (location: (45,0)-(47,13)) - │ ├── flags: newline, begin_modifier - │ ├── keyword_loc: (47,4)-(47,9) = "while" - │ ├── closing_loc: ∅ - │ ├── predicate: - │ │ @ CallNode (location: (47,10)-(47,13)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :baz - │ │ ├── message_loc: (47,10)-(47,13) = "baz" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── statements: - │ @ StatementsNode (location: (45,0)-(47,3)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ BeginNode (location: (45,0)-(47,3)) - │ ├── flags: newline - │ ├── begin_keyword_loc: (45,0)-(45,5) = "begin" - │ ├── statements: - │ │ @ StatementsNode (location: (46,2)-(46,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (46,2)-(46,5)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (46,2)-(46,5) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── rescue_clause: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: ∅ - │ └── end_keyword_loc: (47,0)-(47,3) = "end" - ├── @ UntilNode (location: (48,0)-(51,13)) - │ ├── flags: newline, begin_modifier - │ ├── keyword_loc: (51,4)-(51,9) = "until" - │ ├── closing_loc: ∅ - │ ├── predicate: - │ │ @ CallNode (location: (51,10)-(51,13)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :baz - │ │ ├── message_loc: (51,10)-(51,13) = "baz" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── statements: - │ @ StatementsNode (location: (48,0)-(51,3)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ BeginNode (location: (48,0)-(51,3)) - │ ├── flags: newline - │ ├── begin_keyword_loc: (48,0)-(48,5) = "begin" - │ ├── statements: - │ │ @ StatementsNode (location: (49,2)-(50,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 2) - │ │ ├── @ CallNode (location: (49,2)-(49,5)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (49,2)-(49,5) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── @ CallNode (location: (50,2)-(50,5)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (50,2)-(50,5) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── rescue_clause: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: ∅ - │ └── end_keyword_loc: (51,0)-(51,3) = "end" - ├── @ WhileNode (location: (52,0)-(55,13)) - │ ├── flags: newline, begin_modifier - │ ├── keyword_loc: (55,4)-(55,9) = "while" - │ ├── closing_loc: ∅ - │ ├── predicate: - │ │ @ CallNode (location: (55,10)-(55,13)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :baz - │ │ ├── message_loc: (55,10)-(55,13) = "baz" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── statements: - │ @ StatementsNode (location: (52,0)-(55,3)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ BeginNode (location: (52,0)-(55,3)) - │ ├── flags: newline - │ ├── begin_keyword_loc: (52,0)-(52,5) = "begin" - │ ├── statements: - │ │ @ StatementsNode (location: (53,2)-(54,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 2) - │ │ ├── @ CallNode (location: (53,2)-(53,5)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (53,2)-(53,5) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── @ CallNode (location: (54,2)-(54,5)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (54,2)-(54,5) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── rescue_clause: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: ∅ - │ └── end_keyword_loc: (55,0)-(55,3) = "end" - ├── @ WhileNode (location: (56,0)-(57,3)) - │ ├── flags: newline - │ ├── keyword_loc: (56,0)-(56,5) = "while" - │ ├── closing_loc: (57,0)-(57,3) = "end" - │ ├── predicate: - │ │ @ FalseNode (location: (56,6)-(56,11)) - │ │ └── flags: static_literal - │ └── statements: ∅ - ├── @ WhileNode (location: (58,0)-(60,3)) - │ ├── flags: newline - │ ├── keyword_loc: (58,0)-(58,5) = "while" - │ ├── closing_loc: (60,0)-(60,3) = "end" - │ ├── predicate: - │ │ @ FalseNode (location: (58,6)-(58,11)) - │ │ └── flags: static_literal - │ └── statements: - │ @ StatementsNode (location: (59,2)-(59,3)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ IntegerNode (location: (59,2)-(59,3)) - │ ├── flags: newline, static_literal, decimal - │ └── value: 3 - ├── @ WhileNode (location: (61,0)-(64,3)) - │ ├── flags: newline - │ ├── keyword_loc: (61,0)-(61,5) = "while" - │ ├── closing_loc: (64,0)-(64,3) = "end" - │ ├── predicate: - │ │ @ ParenthesesNode (location: (61,6)-(62,2)) - │ │ ├── flags: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (61,7)-(62,1)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (61,7)-(62,1)) - │ │ │ ├── flags: newline, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (61,7)-(61,10) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: - │ │ │ @ BlockNode (location: (61,11)-(62,1)) - │ │ │ ├── flags: ∅ - │ │ │ ├── locals: [] - │ │ │ ├── parameters: ∅ - │ │ │ ├── body: ∅ - │ │ │ ├── opening_loc: (61,11)-(61,12) = "{" - │ │ │ └── closing_loc: (62,0)-(62,1) = "}" - │ │ ├── opening_loc: (61,6)-(61,7) = "(" - │ │ └── closing_loc: (62,1)-(62,2) = ")" - │ └── statements: - │ @ StatementsNode (location: (63,2)-(63,7)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ SymbolNode (location: (63,2)-(63,7)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (63,2)-(63,3) = ":" - │ ├── value_loc: (63,3)-(63,7) = "body" - │ ├── closing_loc: ∅ - │ └── unescaped: "body" - ├── @ UntilNode (location: (65,0)-(66,3)) - │ ├── flags: newline - │ ├── keyword_loc: (65,0)-(65,5) = "until" - │ ├── closing_loc: (66,0)-(66,3) = "end" - │ ├── predicate: - │ │ @ FalseNode (location: (65,6)-(65,11)) - │ │ └── flags: static_literal - │ └── statements: ∅ - ├── @ UntilNode (location: (67,0)-(69,3)) - │ ├── flags: newline - │ ├── keyword_loc: (67,0)-(67,5) = "until" - │ ├── closing_loc: (69,0)-(69,3) = "end" - │ ├── predicate: - │ │ @ FalseNode (location: (67,6)-(67,11)) - │ │ └── flags: static_literal - │ └── statements: - │ @ StatementsNode (location: (68,2)-(68,3)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ IntegerNode (location: (68,2)-(68,3)) - │ ├── flags: newline, static_literal, decimal - │ └── value: 3 - └── @ UntilNode (location: (70,0)-(73,3)) - ├── flags: newline - ├── keyword_loc: (70,0)-(70,5) = "until" - ├── closing_loc: (73,0)-(73,3) = "end" - ├── predicate: - │ @ ParenthesesNode (location: (70,6)-(71,2)) - │ ├── flags: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (70,7)-(71,1)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (70,7)-(71,1)) - │ │ ├── flags: newline, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (70,7)-(70,10) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: - │ │ @ BlockNode (location: (70,11)-(71,1)) - │ │ ├── flags: ∅ - │ │ ├── locals: [] - │ │ ├── parameters: ∅ - │ │ ├── body: ∅ - │ │ ├── opening_loc: (70,11)-(70,12) = "{" - │ │ └── closing_loc: (71,0)-(71,1) = "}" - │ ├── opening_loc: (70,6)-(70,7) = "(" - │ └── closing_loc: (71,1)-(71,2) = ")" - └── statements: - @ StatementsNode (location: (72,2)-(72,7)) - ├── flags: ∅ - └── body: (length: 1) - └── @ SymbolNode (location: (72,2)-(72,7)) - ├── flags: newline, static_literal, forced_us_ascii_encoding - ├── opening_loc: (72,2)-(72,3) = ":" - ├── value_loc: (72,3)-(72,7) = "body" - ├── closing_loc: ∅ - └── unescaped: "body" diff --git a/test/prism/snapshots/unparser/corpus/semantic/and.txt b/test/prism/snapshots/unparser/corpus/semantic/and.txt deleted file mode 100644 index ad2b6397773197..00000000000000 --- a/test/prism/snapshots/unparser/corpus/semantic/and.txt +++ /dev/null @@ -1,243 +0,0 @@ -@ ProgramNode (location: (1,0)-(8,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(8,3)) - ├── flags: ∅ - └── body: (length: 4) - ├── @ OrNode (location: (1,0)-(1,14)) - │ ├── flags: newline - │ ├── left: - │ │ @ RangeNode (location: (1,0)-(1,5)) - │ │ ├── flags: exclude_end - │ │ ├── left: - │ │ │ @ CallNode (location: (1,0)-(1,1)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :a - │ │ │ ├── message_loc: (1,0)-(1,1) = "a" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── right: - │ │ │ @ CallNode (location: (1,4)-(1,5)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (1,4)-(1,5) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: (1,1)-(1,4) = "..." - │ ├── right: - │ │ @ RangeNode (location: (1,9)-(1,14)) - │ │ ├── flags: exclude_end - │ │ ├── left: - │ │ │ @ CallNode (location: (1,9)-(1,10)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :c - │ │ │ ├── message_loc: (1,9)-(1,10) = "c" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── right: - │ │ │ @ CallNode (location: (1,13)-(1,14)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :d - │ │ │ ├── message_loc: (1,13)-(1,14) = "d" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: (1,10)-(1,13) = "..." - │ └── operator_loc: (1,6)-(1,8) = "or" - ├── @ AndNode (location: (2,0)-(2,15)) - │ ├── flags: newline - │ ├── left: - │ │ @ RangeNode (location: (2,0)-(2,5)) - │ │ ├── flags: exclude_end - │ │ ├── left: - │ │ │ @ CallNode (location: (2,0)-(2,1)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :a - │ │ │ ├── message_loc: (2,0)-(2,1) = "a" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── right: - │ │ │ @ CallNode (location: (2,4)-(2,5)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (2,4)-(2,5) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: (2,1)-(2,4) = "..." - │ ├── right: - │ │ @ RangeNode (location: (2,10)-(2,15)) - │ │ ├── flags: exclude_end - │ │ ├── left: - │ │ │ @ CallNode (location: (2,10)-(2,11)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :c - │ │ │ ├── message_loc: (2,10)-(2,11) = "c" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── right: - │ │ │ @ CallNode (location: (2,14)-(2,15)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :d - │ │ │ ├── message_loc: (2,14)-(2,15) = "d" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: (2,11)-(2,14) = "..." - │ └── operator_loc: (2,6)-(2,9) = "and" - ├── @ IfNode (location: (4,0)-(5,3)) - │ ├── flags: newline - │ ├── if_keyword_loc: (4,0)-(4,2) = "if" - │ ├── predicate: - │ │ @ OrNode (location: (4,3)-(4,17)) - │ │ ├── flags: ∅ - │ │ ├── left: - │ │ │ @ FlipFlopNode (location: (4,3)-(4,8)) - │ │ │ ├── flags: exclude_end - │ │ │ ├── left: - │ │ │ │ @ CallNode (location: (4,3)-(4,4)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :a - │ │ │ │ ├── message_loc: (4,3)-(4,4) = "a" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── right: - │ │ │ │ @ CallNode (location: (4,7)-(4,8)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :b - │ │ │ │ ├── message_loc: (4,7)-(4,8) = "b" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── operator_loc: (4,4)-(4,7) = "..." - │ │ ├── right: - │ │ │ @ FlipFlopNode (location: (4,12)-(4,17)) - │ │ │ ├── flags: exclude_end - │ │ │ ├── left: - │ │ │ │ @ CallNode (location: (4,12)-(4,13)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :c - │ │ │ │ ├── message_loc: (4,12)-(4,13) = "c" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── right: - │ │ │ │ @ CallNode (location: (4,16)-(4,17)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :d - │ │ │ │ ├── message_loc: (4,16)-(4,17) = "d" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── operator_loc: (4,13)-(4,16) = "..." - │ │ └── operator_loc: (4,9)-(4,11) = "or" - │ ├── then_keyword_loc: ∅ - │ ├── statements: ∅ - │ ├── subsequent: ∅ - │ └── end_keyword_loc: (5,0)-(5,3) = "end" - └── @ IfNode (location: (7,0)-(8,3)) - ├── flags: newline - ├── if_keyword_loc: (7,0)-(7,2) = "if" - ├── predicate: - │ @ AndNode (location: (7,3)-(7,18)) - │ ├── flags: ∅ - │ ├── left: - │ │ @ FlipFlopNode (location: (7,3)-(7,8)) - │ │ ├── flags: exclude_end - │ │ ├── left: - │ │ │ @ CallNode (location: (7,3)-(7,4)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :a - │ │ │ ├── message_loc: (7,3)-(7,4) = "a" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── right: - │ │ │ @ CallNode (location: (7,7)-(7,8)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (7,7)-(7,8) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: (7,4)-(7,7) = "..." - │ ├── right: - │ │ @ FlipFlopNode (location: (7,13)-(7,18)) - │ │ ├── flags: exclude_end - │ │ ├── left: - │ │ │ @ CallNode (location: (7,13)-(7,14)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :c - │ │ │ ├── message_loc: (7,13)-(7,14) = "c" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── right: - │ │ │ @ CallNode (location: (7,17)-(7,18)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :d - │ │ │ ├── message_loc: (7,17)-(7,18) = "d" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: (7,14)-(7,17) = "..." - │ └── operator_loc: (7,9)-(7,12) = "and" - ├── then_keyword_loc: ∅ - ├── statements: ∅ - ├── subsequent: ∅ - └── end_keyword_loc: (8,0)-(8,3) = "end" diff --git a/test/prism/snapshots/unparser/corpus/semantic/block.txt b/test/prism/snapshots/unparser/corpus/semantic/block.txt deleted file mode 100644 index ea87b101ec0326..00000000000000 --- a/test/prism/snapshots/unparser/corpus/semantic/block.txt +++ /dev/null @@ -1,213 +0,0 @@ -@ ProgramNode (location: (1,0)-(26,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(26,3)) - ├── flags: ∅ - └── body: (length: 6) - ├── @ CallNode (location: (1,0)-(2,3)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (1,0)-(1,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (1,4)-(2,3)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (1,4)-(1,6) = "do" - │ └── closing_loc: (2,0)-(2,3) = "end" - ├── @ CallNode (location: (4,0)-(6,3)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (4,0)-(4,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (4,4)-(6,3)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ BeginNode (location: (4,4)-(6,3)) - │ │ ├── flags: ∅ - │ │ ├── begin_keyword_loc: ∅ - │ │ ├── statements: ∅ - │ │ ├── rescue_clause: - │ │ │ @ RescueNode (location: (5,0)-(5,6)) - │ │ │ ├── flags: ∅ - │ │ │ ├── keyword_loc: (5,0)-(5,6) = "rescue" - │ │ │ ├── exceptions: (length: 0) - │ │ │ ├── operator_loc: ∅ - │ │ │ ├── reference: ∅ - │ │ │ ├── statements: ∅ - │ │ │ └── subsequent: ∅ - │ │ ├── else_clause: ∅ - │ │ ├── ensure_clause: ∅ - │ │ └── end_keyword_loc: (6,0)-(6,3) = "end" - │ ├── opening_loc: (4,4)-(4,6) = "do" - │ └── closing_loc: (6,0)-(6,3) = "end" - ├── @ CallNode (location: (8,0)-(11,3)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (8,0)-(8,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (8,4)-(11,3)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (9,2)-(10,5)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 2) - │ │ ├── @ RescueModifierNode (location: (9,2)-(9,16)) - │ │ │ ├── flags: newline - │ │ │ ├── expression: - │ │ │ │ @ NilNode (location: (9,2)-(9,5)) - │ │ │ │ └── flags: static_literal - │ │ │ ├── keyword_loc: (9,6)-(9,12) = "rescue" - │ │ │ └── rescue_expression: - │ │ │ @ NilNode (location: (9,13)-(9,16)) - │ │ │ └── flags: static_literal - │ │ └── @ NilNode (location: (10,2)-(10,5)) - │ │ └── flags: newline, static_literal - │ ├── opening_loc: (8,4)-(8,6) = "do" - │ └── closing_loc: (11,0)-(11,3) = "end" - ├── @ CallNode (location: (13,0)-(14,3)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (13,0)-(13,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (13,4)-(14,3)) - │ ├── flags: ∅ - │ ├── locals: [:a] - │ ├── parameters: - │ │ @ BlockParametersNode (location: (13,7)-(13,10)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (13,8)-(13,9)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (13,8)-(13,9)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :a - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: (13,7)-(13,8) = "|" - │ │ └── closing_loc: (13,9)-(13,10) = "|" - │ ├── body: ∅ - │ ├── opening_loc: (13,4)-(13,6) = "do" - │ └── closing_loc: (14,0)-(14,3) = "end" - ├── @ CallNode (location: (16,0)-(20,3)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (16,0)-(16,3) = "foo" - │ ├── opening_loc: (16,3)-(16,4) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (16,4)-(16,10)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ StringNode (location: (16,4)-(16,10)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (16,4)-(16,10) = "<<-DOC" - │ │ ├── content_loc: (17,0)-(18,0) = " b\n" - │ │ ├── closing_loc: (18,0)-(19,0) = "DOC\n" - │ │ └── unescaped: " b\n" - │ ├── closing_loc: (16,10)-(16,11) = ")" - │ └── block: - │ @ BlockNode (location: (16,12)-(20,3)) - │ ├── flags: ∅ - │ ├── locals: [:a] - │ ├── parameters: - │ │ @ BlockParametersNode (location: (16,15)-(16,18)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (16,16)-(16,17)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (16,16)-(16,17)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :a - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: (16,15)-(16,16) = "|" - │ │ └── closing_loc: (16,17)-(16,18) = "|" - │ ├── body: - │ │ @ StatementsNode (location: (19,2)-(19,3)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ LocalVariableReadNode (location: (19,2)-(19,3)) - │ │ ├── flags: newline - │ │ ├── name: :a - │ │ └── depth: 0 - │ ├── opening_loc: (16,12)-(16,14) = "do" - │ └── closing_loc: (20,0)-(20,3) = "end" - └── @ CallNode (location: (22,0)-(26,3)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :foo - ├── message_loc: (22,0)-(22,3) = "foo" - ├── opening_loc: (22,3)-(22,4) = "(" - ├── arguments: - │ @ ArgumentsNode (location: (22,4)-(22,10)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ StringNode (location: (22,4)-(22,10)) - │ ├── flags: ∅ - │ ├── opening_loc: (22,4)-(22,10) = "<<-DOC" - │ ├── content_loc: (23,0)-(24,0) = " b\n" - │ ├── closing_loc: (24,0)-(25,0) = "DOC\n" - │ └── unescaped: " b\n" - ├── closing_loc: (22,10)-(22,11) = ")" - └── block: - @ BlockNode (location: (22,12)-(26,3)) - ├── flags: ∅ - ├── locals: [] - ├── parameters: ∅ - ├── body: - │ @ StatementsNode (location: (25,2)-(25,3)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (25,2)-(25,3)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (25,2)-(25,3) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── opening_loc: (22,12)-(22,14) = "do" - └── closing_loc: (26,0)-(26,3) = "end" diff --git a/test/prism/snapshots/unparser/corpus/semantic/def.txt b/test/prism/snapshots/unparser/corpus/semantic/def.txt deleted file mode 100644 index f05ce02bca7cf3..00000000000000 --- a/test/prism/snapshots/unparser/corpus/semantic/def.txt +++ /dev/null @@ -1,100 +0,0 @@ -@ ProgramNode (location: (1,0)-(7,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(7,3)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ DefNode (location: (1,0)-(3,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (1,4)-(1,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (2,2)-(2,9)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ ParenthesesNode (location: (2,2)-(2,9)) - │ │ ├── flags: newline - │ │ ├── body: - │ │ │ @ StatementsNode (location: (2,3)-(2,8)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (2,3)-(2,8)) - │ │ │ ├── flags: newline - │ │ │ ├── receiver: - │ │ │ │ @ CallNode (location: (2,3)-(2,4)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :a - │ │ │ │ ├── message_loc: (2,3)-(2,4) = "a" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :- - │ │ │ ├── message_loc: (2,5)-(2,6) = "-" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (2,7)-(2,8)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ CallNode (location: (2,7)-(2,8)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :b - │ │ │ │ ├── message_loc: (2,7)-(2,8) = "b" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── opening_loc: (2,2)-(2,3) = "(" - │ │ └── closing_loc: (2,8)-(2,9) = ")" - │ ├── locals: [] - │ ├── def_keyword_loc: (1,0)-(1,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (3,0)-(3,3) = "end" - └── @ DefNode (location: (5,0)-(7,3)) - ├── flags: newline - ├── name: :foo - ├── name_loc: (5,4)-(5,7) = "foo" - ├── receiver: ∅ - ├── parameters: ∅ - ├── body: - │ @ StatementsNode (location: (6,2)-(6,20)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ RescueModifierNode (location: (6,2)-(6,20)) - │ ├── flags: newline - │ ├── expression: - │ │ @ CallNode (location: (6,2)-(6,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (6,2)-(6,3) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── keyword_loc: (6,4)-(6,10) = "rescue" - │ └── rescue_expression: - │ @ ConstantReadNode (location: (6,11)-(6,20)) - │ ├── flags: ∅ - │ └── name: :Exception - ├── locals: [] - ├── def_keyword_loc: (5,0)-(5,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: ∅ - ├── rparen_loc: ∅ - ├── equal_loc: ∅ - └── end_keyword_loc: (7,0)-(7,3) = "end" diff --git a/test/prism/snapshots/unparser/corpus/semantic/dstr.txt b/test/prism/snapshots/unparser/corpus/semantic/dstr.txt deleted file mode 100644 index b1bfbefc8ba7d5..00000000000000 --- a/test/prism/snapshots/unparser/corpus/semantic/dstr.txt +++ /dev/null @@ -1,639 +0,0 @@ -@ ProgramNode (location: (1,0)-(127,11)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(127,11)) - ├── flags: ∅ - └── body: (length: 33) - ├── @ StringNode (location: (1,0)-(1,5)) - │ ├── flags: newline - │ ├── opening_loc: (1,0)-(1,5) = "<= - ├── name_loc: (11,4)-(11,6) = ">=" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (11,7)-(11,12)) - │ ├── flags: ∅ - │ ├── requireds: (length: 1) - │ │ └── @ RequiredParameterNode (location: (11,7)-(11,12)) - │ │ ├── flags: ∅ - │ │ └── name: :other - │ ├── optionals: (length: 0) - │ ├── rest: ∅ - │ ├── posts: (length: 0) - │ ├── keywords: (length: 0) - │ ├── keyword_rest: ∅ - │ └── block: ∅ - ├── body: - │ @ StatementsNode (location: (11,16)-(11,28)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (11,16)-(11,28)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :do_something - │ ├── message_loc: (11,16)-(11,28) = "do_something" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── locals: [:other] - ├── def_keyword_loc: (11,0)-(11,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: (11,6)-(11,7) = "(" - ├── rparen_loc: (11,12)-(11,13) = ")" - ├── equal_loc: (11,14)-(11,15) = "=" - └── end_keyword_loc: ∅ diff --git a/test/prism/snapshots/whitequark/endless_method.txt b/test/prism/snapshots/whitequark/endless_method.txt deleted file mode 100644 index 3c24ab2a7dc1dd..00000000000000 --- a/test/prism/snapshots/whitequark/endless_method.txt +++ /dev/null @@ -1,165 +0,0 @@ -@ ProgramNode (location: (1,0)-(7,22)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(7,22)) - ├── flags: ∅ - └── body: (length: 4) - ├── @ DefNode (location: (1,0)-(1,14)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (1,4)-(1,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (1,12)-(1,14)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ IntegerNode (location: (1,12)-(1,14)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 42 - │ ├── locals: [] - │ ├── def_keyword_loc: (1,0)-(1,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (1,7)-(1,8) = "(" - │ ├── rparen_loc: (1,8)-(1,9) = ")" - │ ├── equal_loc: (1,10)-(1,11) = "=" - │ └── end_keyword_loc: ∅ - ├── @ DefNode (location: (3,0)-(3,18)) - │ ├── flags: newline - │ ├── name: :inc - │ ├── name_loc: (3,4)-(3,7) = "inc" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (3,8)-(3,9)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (3,8)-(3,9)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :x - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (3,13)-(3,18)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (3,13)-(3,18)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ LocalVariableReadNode (location: (3,13)-(3,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :x - │ │ │ └── depth: 0 - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :+ - │ │ ├── message_loc: (3,15)-(3,16) = "+" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (3,17)-(3,18)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (3,17)-(3,18)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── locals: [:x] - │ ├── def_keyword_loc: (3,0)-(3,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (3,7)-(3,8) = "(" - │ ├── rparen_loc: (3,9)-(3,10) = ")" - │ ├── equal_loc: (3,11)-(3,12) = "=" - │ └── end_keyword_loc: ∅ - ├── @ DefNode (location: (5,0)-(5,18)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (5,8)-(5,11) = "foo" - │ ├── receiver: - │ │ @ CallNode (location: (5,4)-(5,7)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :obj - │ │ ├── message_loc: (5,4)-(5,7) = "obj" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (5,16)-(5,18)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ IntegerNode (location: (5,16)-(5,18)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 42 - │ ├── locals: [] - │ ├── def_keyword_loc: (5,0)-(5,3) = "def" - │ ├── operator_loc: (5,7)-(5,8) = "." - │ ├── lparen_loc: (5,11)-(5,12) = "(" - │ ├── rparen_loc: (5,12)-(5,13) = ")" - │ ├── equal_loc: (5,14)-(5,15) = "=" - │ └── end_keyword_loc: ∅ - └── @ DefNode (location: (7,0)-(7,22)) - ├── flags: newline - ├── name: :inc - ├── name_loc: (7,8)-(7,11) = "inc" - ├── receiver: - │ @ CallNode (location: (7,4)-(7,7)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :obj - │ ├── message_loc: (7,4)-(7,7) = "obj" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── parameters: - │ @ ParametersNode (location: (7,12)-(7,13)) - │ ├── flags: ∅ - │ ├── requireds: (length: 1) - │ │ └── @ RequiredParameterNode (location: (7,12)-(7,13)) - │ │ ├── flags: ∅ - │ │ └── name: :x - │ ├── optionals: (length: 0) - │ ├── rest: ∅ - │ ├── posts: (length: 0) - │ ├── keywords: (length: 0) - │ ├── keyword_rest: ∅ - │ └── block: ∅ - ├── body: - │ @ StatementsNode (location: (7,17)-(7,22)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (7,17)-(7,22)) - │ ├── flags: ∅ - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (7,17)-(7,18)) - │ │ ├── flags: ∅ - │ │ ├── name: :x - │ │ └── depth: 0 - │ ├── call_operator_loc: ∅ - │ ├── name: :+ - │ ├── message_loc: (7,19)-(7,20) = "+" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (7,21)-(7,22)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (7,21)-(7,22)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── locals: [:x] - ├── def_keyword_loc: (7,0)-(7,3) = "def" - ├── operator_loc: (7,7)-(7,8) = "." - ├── lparen_loc: (7,11)-(7,12) = "(" - ├── rparen_loc: (7,13)-(7,14) = ")" - ├── equal_loc: (7,15)-(7,16) = "=" - └── end_keyword_loc: ∅ diff --git a/test/prism/snapshots/whitequark/endless_method_command_syntax.txt b/test/prism/snapshots/whitequark/endless_method_command_syntax.txt deleted file mode 100644 index db2c0cec6fe7ce..00000000000000 --- a/test/prism/snapshots/whitequark/endless_method_command_syntax.txt +++ /dev/null @@ -1,427 +0,0 @@ -@ ProgramNode (location: (1,0)-(15,62)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(15,62)) - ├── flags: ∅ - └── body: (length: 8) - ├── @ DefNode (location: (1,0)-(1,22)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (1,4)-(1,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (1,10)-(1,22)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (1,10)-(1,22)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :puts - │ │ ├── message_loc: (1,10)-(1,14) = "puts" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (1,15)-(1,22)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ StringNode (location: (1,15)-(1,22)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (1,15)-(1,16) = "\"" - │ │ │ ├── content_loc: (1,16)-(1,21) = "Hello" - │ │ │ ├── closing_loc: (1,21)-(1,22) = "\"" - │ │ │ └── unescaped: "Hello" - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (1,0)-(1,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: (1,8)-(1,9) = "=" - │ └── end_keyword_loc: ∅ - ├── @ DefNode (location: (3,0)-(3,24)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (3,4)-(3,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (3,12)-(3,24)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (3,12)-(3,24)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :puts - │ │ ├── message_loc: (3,12)-(3,16) = "puts" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (3,17)-(3,24)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ StringNode (location: (3,17)-(3,24)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (3,17)-(3,18) = "\"" - │ │ │ ├── content_loc: (3,18)-(3,23) = "Hello" - │ │ │ ├── closing_loc: (3,23)-(3,24) = "\"" - │ │ │ └── unescaped: "Hello" - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (3,0)-(3,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (3,7)-(3,8) = "(" - │ ├── rparen_loc: (3,8)-(3,9) = ")" - │ ├── equal_loc: (3,10)-(3,11) = "=" - │ └── end_keyword_loc: ∅ - ├── @ DefNode (location: (5,0)-(5,19)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (5,4)-(5,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (5,8)-(5,9)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (5,8)-(5,9)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :x - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (5,13)-(5,19)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (5,13)-(5,19)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :puts - │ │ ├── message_loc: (5,13)-(5,17) = "puts" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (5,18)-(5,19)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ LocalVariableReadNode (location: (5,18)-(5,19)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :x - │ │ │ └── depth: 0 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── locals: [:x] - │ ├── def_keyword_loc: (5,0)-(5,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (5,7)-(5,8) = "(" - │ ├── rparen_loc: (5,9)-(5,10) = ")" - │ ├── equal_loc: (5,11)-(5,12) = "=" - │ └── end_keyword_loc: ∅ - ├── @ DefNode (location: (7,0)-(7,26)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (7,8)-(7,11) = "foo" - │ ├── receiver: - │ │ @ CallNode (location: (7,4)-(7,7)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :obj - │ │ ├── message_loc: (7,4)-(7,7) = "obj" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (7,14)-(7,26)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (7,14)-(7,26)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :puts - │ │ ├── message_loc: (7,14)-(7,18) = "puts" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (7,19)-(7,26)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ StringNode (location: (7,19)-(7,26)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (7,19)-(7,20) = "\"" - │ │ │ ├── content_loc: (7,20)-(7,25) = "Hello" - │ │ │ ├── closing_loc: (7,25)-(7,26) = "\"" - │ │ │ └── unescaped: "Hello" - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (7,0)-(7,3) = "def" - │ ├── operator_loc: (7,7)-(7,8) = "." - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: (7,12)-(7,13) = "=" - │ └── end_keyword_loc: ∅ - ├── @ DefNode (location: (9,0)-(9,28)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (9,8)-(9,11) = "foo" - │ ├── receiver: - │ │ @ CallNode (location: (9,4)-(9,7)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :obj - │ │ ├── message_loc: (9,4)-(9,7) = "obj" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (9,16)-(9,28)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (9,16)-(9,28)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :puts - │ │ ├── message_loc: (9,16)-(9,20) = "puts" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (9,21)-(9,28)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ StringNode (location: (9,21)-(9,28)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (9,21)-(9,22) = "\"" - │ │ │ ├── content_loc: (9,22)-(9,27) = "Hello" - │ │ │ ├── closing_loc: (9,27)-(9,28) = "\"" - │ │ │ └── unescaped: "Hello" - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (9,0)-(9,3) = "def" - │ ├── operator_loc: (9,7)-(9,8) = "." - │ ├── lparen_loc: (9,11)-(9,12) = "(" - │ ├── rparen_loc: (9,12)-(9,13) = ")" - │ ├── equal_loc: (9,14)-(9,15) = "=" - │ └── end_keyword_loc: ∅ - ├── @ DefNode (location: (11,0)-(11,23)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (11,8)-(11,11) = "foo" - │ ├── receiver: - │ │ @ CallNode (location: (11,4)-(11,7)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :obj - │ │ ├── message_loc: (11,4)-(11,7) = "obj" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (11,12)-(11,13)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (11,12)-(11,13)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :x - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (11,17)-(11,23)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (11,17)-(11,23)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :puts - │ │ ├── message_loc: (11,17)-(11,21) = "puts" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (11,22)-(11,23)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ LocalVariableReadNode (location: (11,22)-(11,23)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :x - │ │ │ └── depth: 0 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── locals: [:x] - │ ├── def_keyword_loc: (11,0)-(11,3) = "def" - │ ├── operator_loc: (11,7)-(11,8) = "." - │ ├── lparen_loc: (11,11)-(11,12) = "(" - │ ├── rparen_loc: (11,13)-(11,14) = ")" - │ ├── equal_loc: (11,15)-(11,16) = "=" - │ └── end_keyword_loc: ∅ - ├── @ DefNode (location: (13,0)-(13,60)) - │ ├── flags: newline - │ ├── name: :rescued - │ ├── name_loc: (13,4)-(13,11) = "rescued" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (13,12)-(13,13)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (13,12)-(13,13)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :x - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (13,17)-(13,60)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ RescueModifierNode (location: (13,17)-(13,60)) - │ │ ├── flags: ∅ - │ │ ├── expression: - │ │ │ @ CallNode (location: (13,17)-(13,37)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :raise - │ │ │ ├── message_loc: (13,17)-(13,22) = "raise" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (13,23)-(13,37)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ StringNode (location: (13,23)-(13,37)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── opening_loc: (13,23)-(13,24) = "\"" - │ │ │ │ ├── content_loc: (13,24)-(13,36) = "to be caught" - │ │ │ │ ├── closing_loc: (13,36)-(13,37) = "\"" - │ │ │ │ └── unescaped: "to be caught" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── keyword_loc: (13,38)-(13,44) = "rescue" - │ │ └── rescue_expression: - │ │ @ InterpolatedStringNode (location: (13,45)-(13,60)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (13,45)-(13,46) = "\"" - │ │ ├── parts: (length: 2) - │ │ │ ├── @ StringNode (location: (13,46)-(13,55)) - │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── content_loc: (13,46)-(13,55) = "instance " - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "instance " - │ │ │ └── @ EmbeddedStatementsNode (location: (13,55)-(13,59)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (13,55)-(13,57) = "\#{" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (13,57)-(13,58)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ LocalVariableReadNode (location: (13,57)-(13,58)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :x - │ │ │ │ └── depth: 0 - │ │ │ └── closing_loc: (13,58)-(13,59) = "}" - │ │ └── closing_loc: (13,59)-(13,60) = "\"" - │ ├── locals: [:x] - │ ├── def_keyword_loc: (13,0)-(13,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (13,11)-(13,12) = "(" - │ ├── rparen_loc: (13,13)-(13,14) = ")" - │ ├── equal_loc: (13,15)-(13,16) = "=" - │ └── end_keyword_loc: ∅ - └── @ DefNode (location: (15,0)-(15,62)) - ├── flags: newline - ├── name: :rescued - ├── name_loc: (15,9)-(15,16) = "rescued" - ├── receiver: - │ @ SelfNode (location: (15,4)-(15,8)) - │ └── flags: ∅ - ├── parameters: - │ @ ParametersNode (location: (15,17)-(15,18)) - │ ├── flags: ∅ - │ ├── requireds: (length: 1) - │ │ └── @ RequiredParameterNode (location: (15,17)-(15,18)) - │ │ ├── flags: ∅ - │ │ └── name: :x - │ ├── optionals: (length: 0) - │ ├── rest: ∅ - │ ├── posts: (length: 0) - │ ├── keywords: (length: 0) - │ ├── keyword_rest: ∅ - │ └── block: ∅ - ├── body: - │ @ StatementsNode (location: (15,22)-(15,62)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ RescueModifierNode (location: (15,22)-(15,62)) - │ ├── flags: ∅ - │ ├── expression: - │ │ @ CallNode (location: (15,22)-(15,42)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :raise - │ │ ├── message_loc: (15,22)-(15,27) = "raise" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (15,28)-(15,42)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ StringNode (location: (15,28)-(15,42)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (15,28)-(15,29) = "\"" - │ │ │ ├── content_loc: (15,29)-(15,41) = "to be caught" - │ │ │ ├── closing_loc: (15,41)-(15,42) = "\"" - │ │ │ └── unescaped: "to be caught" - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── keyword_loc: (15,43)-(15,49) = "rescue" - │ └── rescue_expression: - │ @ InterpolatedStringNode (location: (15,50)-(15,62)) - │ ├── flags: ∅ - │ ├── opening_loc: (15,50)-(15,51) = "\"" - │ ├── parts: (length: 2) - │ │ ├── @ StringNode (location: (15,51)-(15,57)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (15,51)-(15,57) = "class " - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "class " - │ │ └── @ EmbeddedStatementsNode (location: (15,57)-(15,61)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (15,57)-(15,59) = "\#{" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (15,59)-(15,60)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ LocalVariableReadNode (location: (15,59)-(15,60)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :x - │ │ │ └── depth: 0 - │ │ └── closing_loc: (15,60)-(15,61) = "}" - │ └── closing_loc: (15,61)-(15,62) = "\"" - ├── locals: [:x] - ├── def_keyword_loc: (15,0)-(15,3) = "def" - ├── operator_loc: (15,8)-(15,9) = "." - ├── lparen_loc: (15,16)-(15,17) = "(" - ├── rparen_loc: (15,18)-(15,19) = ")" - ├── equal_loc: (15,20)-(15,21) = "=" - └── end_keyword_loc: ∅ diff --git a/test/prism/snapshots/whitequark/endless_method_forwarded_args_legacy.txt b/test/prism/snapshots/whitequark/endless_method_forwarded_args_legacy.txt deleted file mode 100644 index eaa10610077355..00000000000000 --- a/test/prism/snapshots/whitequark/endless_method_forwarded_args_legacy.txt +++ /dev/null @@ -1,50 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,23)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,23)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(1,23)) - ├── flags: newline - ├── name: :foo - ├── name_loc: (1,4)-(1,7) = "foo" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (1,8)-(1,11)) - │ ├── flags: ∅ - │ ├── requireds: (length: 0) - │ ├── optionals: (length: 0) - │ ├── rest: ∅ - │ ├── posts: (length: 0) - │ ├── keywords: (length: 0) - │ ├── keyword_rest: - │ │ @ ForwardingParameterNode (location: (1,8)-(1,11)) - │ │ └── flags: ∅ - │ └── block: ∅ - ├── body: - │ @ StatementsNode (location: (1,15)-(1,23)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,15)-(1,23)) - │ ├── flags: ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :bar - │ ├── message_loc: (1,15)-(1,18) = "bar" - │ ├── opening_loc: (1,18)-(1,19) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,19)-(1,22)) - │ │ ├── flags: contains_forwarding - │ │ └── arguments: (length: 1) - │ │ └── @ ForwardingArgumentsNode (location: (1,19)-(1,22)) - │ │ └── flags: ∅ - │ ├── closing_loc: (1,22)-(1,23) = ")" - │ └── block: ∅ - ├── locals: [] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: (1,7)-(1,8) = "(" - ├── rparen_loc: (1,11)-(1,12) = ")" - ├── equal_loc: (1,13)-(1,14) = "=" - └── end_keyword_loc: ∅ diff --git a/test/prism/snapshots/whitequark/endless_method_with_rescue_mod.txt b/test/prism/snapshots/whitequark/endless_method_with_rescue_mod.txt deleted file mode 100644 index c64ba634b73bed..00000000000000 --- a/test/prism/snapshots/whitequark/endless_method_with_rescue_mod.txt +++ /dev/null @@ -1,65 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,25)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,25)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ DefNode (location: (1,0)-(1,20)) - │ ├── flags: newline - │ ├── name: :m - │ ├── name_loc: (1,4)-(1,5) = "m" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (1,10)-(1,20)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ RescueModifierNode (location: (1,10)-(1,20)) - │ │ ├── flags: ∅ - │ │ ├── expression: - │ │ │ @ IntegerNode (location: (1,10)-(1,11)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── keyword_loc: (1,12)-(1,18) = "rescue" - │ │ └── rescue_expression: - │ │ @ IntegerNode (location: (1,19)-(1,20)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── locals: [] - │ ├── def_keyword_loc: (1,0)-(1,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (1,5)-(1,6) = "(" - │ ├── rparen_loc: (1,6)-(1,7) = ")" - │ ├── equal_loc: (1,8)-(1,9) = "=" - │ └── end_keyword_loc: ∅ - └── @ DefNode (location: (3,0)-(3,25)) - ├── flags: newline - ├── name: :m - ├── name_loc: (3,9)-(3,10) = "m" - ├── receiver: - │ @ SelfNode (location: (3,4)-(3,8)) - │ └── flags: ∅ - ├── parameters: ∅ - ├── body: - │ @ StatementsNode (location: (3,15)-(3,25)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ RescueModifierNode (location: (3,15)-(3,25)) - │ ├── flags: ∅ - │ ├── expression: - │ │ @ IntegerNode (location: (3,15)-(3,16)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── keyword_loc: (3,17)-(3,23) = "rescue" - │ └── rescue_expression: - │ @ IntegerNode (location: (3,24)-(3,25)) - │ ├── flags: static_literal, decimal - │ └── value: 2 - ├── locals: [] - ├── def_keyword_loc: (3,0)-(3,3) = "def" - ├── operator_loc: (3,8)-(3,9) = "." - ├── lparen_loc: (3,10)-(3,11) = "(" - ├── rparen_loc: (3,11)-(3,12) = ")" - ├── equal_loc: (3,13)-(3,14) = "=" - └── end_keyword_loc: ∅ diff --git a/test/prism/snapshots/whitequark/endless_method_without_args.txt b/test/prism/snapshots/whitequark/endless_method_without_args.txt deleted file mode 100644 index 0be157df627368..00000000000000 --- a/test/prism/snapshots/whitequark/endless_method_without_args.txt +++ /dev/null @@ -1,105 +0,0 @@ -@ ProgramNode (location: (1,0)-(7,28)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(7,28)) - ├── flags: ∅ - └── body: (length: 4) - ├── @ DefNode (location: (1,0)-(1,12)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (1,4)-(1,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (1,10)-(1,12)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ IntegerNode (location: (1,10)-(1,12)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 42 - │ ├── locals: [] - │ ├── def_keyword_loc: (1,0)-(1,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: (1,8)-(1,9) = "=" - │ └── end_keyword_loc: ∅ - ├── @ DefNode (location: (3,0)-(3,23)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (3,4)-(3,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (3,10)-(3,23)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ RescueModifierNode (location: (3,10)-(3,23)) - │ │ ├── flags: ∅ - │ │ ├── expression: - │ │ │ @ IntegerNode (location: (3,10)-(3,12)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 42 - │ │ ├── keyword_loc: (3,13)-(3,19) = "rescue" - │ │ └── rescue_expression: - │ │ @ NilNode (location: (3,20)-(3,23)) - │ │ └── flags: static_literal - │ ├── locals: [] - │ ├── def_keyword_loc: (3,0)-(3,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: (3,8)-(3,9) = "=" - │ └── end_keyword_loc: ∅ - ├── @ DefNode (location: (5,0)-(5,17)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (5,9)-(5,12) = "foo" - │ ├── receiver: - │ │ @ SelfNode (location: (5,4)-(5,8)) - │ │ └── flags: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (5,15)-(5,17)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ IntegerNode (location: (5,15)-(5,17)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 42 - │ ├── locals: [] - │ ├── def_keyword_loc: (5,0)-(5,3) = "def" - │ ├── operator_loc: (5,8)-(5,9) = "." - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: (5,13)-(5,14) = "=" - │ └── end_keyword_loc: ∅ - └── @ DefNode (location: (7,0)-(7,28)) - ├── flags: newline - ├── name: :foo - ├── name_loc: (7,9)-(7,12) = "foo" - ├── receiver: - │ @ SelfNode (location: (7,4)-(7,8)) - │ └── flags: ∅ - ├── parameters: ∅ - ├── body: - │ @ StatementsNode (location: (7,15)-(7,28)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ RescueModifierNode (location: (7,15)-(7,28)) - │ ├── flags: ∅ - │ ├── expression: - │ │ @ IntegerNode (location: (7,15)-(7,17)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 42 - │ ├── keyword_loc: (7,18)-(7,24) = "rescue" - │ └── rescue_expression: - │ @ NilNode (location: (7,25)-(7,28)) - │ └── flags: static_literal - ├── locals: [] - ├── def_keyword_loc: (7,0)-(7,3) = "def" - ├── operator_loc: (7,8)-(7,9) = "." - ├── lparen_loc: ∅ - ├── rparen_loc: ∅ - ├── equal_loc: (7,13)-(7,14) = "=" - └── end_keyword_loc: ∅ diff --git a/test/prism/snapshots/whitequark/ensure.txt b/test/prism/snapshots/whitequark/ensure.txt deleted file mode 100644 index 63d4a3b05dc8b4..00000000000000 --- a/test/prism/snapshots/whitequark/ensure.txt +++ /dev/null @@ -1,46 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,29)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,29)) - ├── flags: ∅ - └── body: (length: 1) - └── @ BeginNode (location: (1,0)-(1,29)) - ├── flags: newline - ├── begin_keyword_loc: (1,0)-(1,5) = "begin" - ├── statements: - │ @ StatementsNode (location: (1,7)-(1,11)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,7)-(1,11)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :meth - │ ├── message_loc: (1,7)-(1,11) = "meth" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── rescue_clause: ∅ - ├── else_clause: ∅ - ├── ensure_clause: - │ @ EnsureNode (location: (1,13)-(1,29)) - │ ├── flags: ∅ - │ ├── ensure_keyword_loc: (1,13)-(1,19) = "ensure" - │ ├── statements: - │ │ @ StatementsNode (location: (1,21)-(1,24)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (1,21)-(1,24)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (1,21)-(1,24) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── end_keyword_loc: (1,26)-(1,29) = "end" - └── end_keyword_loc: (1,26)-(1,29) = "end" diff --git a/test/prism/snapshots/whitequark/ensure_empty.txt b/test/prism/snapshots/whitequark/ensure_empty.txt deleted file mode 100644 index c7369b7b1f59c4..00000000000000 --- a/test/prism/snapshots/whitequark/ensure_empty.txt +++ /dev/null @@ -1,20 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,16)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,16)) - ├── flags: ∅ - └── body: (length: 1) - └── @ BeginNode (location: (1,0)-(1,16)) - ├── flags: newline - ├── begin_keyword_loc: (1,0)-(1,5) = "begin" - ├── statements: ∅ - ├── rescue_clause: ∅ - ├── else_clause: ∅ - ├── ensure_clause: - │ @ EnsureNode (location: (1,6)-(1,16)) - │ ├── flags: ∅ - │ ├── ensure_keyword_loc: (1,6)-(1,12) = "ensure" - │ ├── statements: ∅ - │ └── end_keyword_loc: (1,13)-(1,16) = "end" - └── end_keyword_loc: (1,13)-(1,16) = "end" diff --git a/test/prism/snapshots/whitequark/false.txt b/test/prism/snapshots/whitequark/false.txt deleted file mode 100644 index 4686f6aa08a145..00000000000000 --- a/test/prism/snapshots/whitequark/false.txt +++ /dev/null @@ -1,9 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,5)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,5)) - ├── flags: ∅ - └── body: (length: 1) - └── @ FalseNode (location: (1,0)-(1,5)) - └── flags: newline, static_literal diff --git a/test/prism/snapshots/whitequark/float.txt b/test/prism/snapshots/whitequark/float.txt deleted file mode 100644 index 7839f899625893..00000000000000 --- a/test/prism/snapshots/whitequark/float.txt +++ /dev/null @@ -1,13 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,4)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,4)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ FloatNode (location: (1,0)-(1,5)) - │ ├── flags: newline, static_literal - │ └── value: -1.33 - └── @ FloatNode (location: (3,0)-(3,4)) - ├── flags: newline, static_literal - └── value: 1.33 diff --git a/test/prism/snapshots/whitequark/for.txt b/test/prism/snapshots/whitequark/for.txt deleted file mode 100644 index 8dca927c905146..00000000000000 --- a/test/prism/snapshots/whitequark/for.txt +++ /dev/null @@ -1,93 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,22)) -├── flags: ∅ -├── locals: [:a] -└── statements: - @ StatementsNode (location: (1,0)-(3,22)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ ForNode (location: (1,0)-(1,24)) - │ ├── flags: newline - │ ├── index: - │ │ @ LocalVariableTargetNode (location: (1,4)-(1,5)) - │ │ ├── flags: ∅ - │ │ ├── name: :a - │ │ └── depth: 0 - │ ├── collection: - │ │ @ CallNode (location: (1,9)-(1,12)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (1,9)-(1,12) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── statements: - │ │ @ StatementsNode (location: (1,16)-(1,19)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (1,16)-(1,19)) - │ │ ├── flags: newline, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :p - │ │ ├── message_loc: (1,16)-(1,17) = "p" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (1,18)-(1,19)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ LocalVariableReadNode (location: (1,18)-(1,19)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :a - │ │ │ └── depth: 0 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── for_keyword_loc: (1,0)-(1,3) = "for" - │ ├── in_keyword_loc: (1,6)-(1,8) = "in" - │ ├── do_keyword_loc: (1,13)-(1,15) = "do" - │ └── end_keyword_loc: (1,21)-(1,24) = "end" - └── @ ForNode (location: (3,0)-(3,22)) - ├── flags: newline - ├── index: - │ @ LocalVariableTargetNode (location: (3,4)-(3,5)) - │ ├── flags: ∅ - │ ├── name: :a - │ └── depth: 0 - ├── collection: - │ @ CallNode (location: (3,9)-(3,12)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (3,9)-(3,12) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── statements: - │ @ StatementsNode (location: (3,14)-(3,17)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (3,14)-(3,17)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :p - │ ├── message_loc: (3,14)-(3,15) = "p" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (3,16)-(3,17)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ LocalVariableReadNode (location: (3,16)-(3,17)) - │ │ ├── flags: ∅ - │ │ ├── name: :a - │ │ └── depth: 0 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── for_keyword_loc: (3,0)-(3,3) = "for" - ├── in_keyword_loc: (3,6)-(3,8) = "in" - ├── do_keyword_loc: ∅ - └── end_keyword_loc: (3,19)-(3,22) = "end" diff --git a/test/prism/snapshots/whitequark/for_mlhs.txt b/test/prism/snapshots/whitequark/for_mlhs.txt deleted file mode 100644 index 0f70dd8a7dad73..00000000000000 --- a/test/prism/snapshots/whitequark/for_mlhs.txt +++ /dev/null @@ -1,65 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,28)) -├── flags: ∅ -├── locals: [:a, :b] -└── statements: - @ StatementsNode (location: (1,0)-(1,28)) - ├── flags: ∅ - └── body: (length: 1) - └── @ ForNode (location: (1,0)-(1,28)) - ├── flags: newline - ├── index: - │ @ MultiTargetNode (location: (1,4)-(1,8)) - │ ├── flags: ∅ - │ ├── lefts: (length: 2) - │ │ ├── @ LocalVariableTargetNode (location: (1,4)-(1,5)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :a - │ │ │ └── depth: 0 - │ │ └── @ LocalVariableTargetNode (location: (1,7)-(1,8)) - │ │ ├── flags: ∅ - │ │ ├── name: :b - │ │ └── depth: 0 - │ ├── rest: ∅ - │ ├── rights: (length: 0) - │ ├── lparen_loc: ∅ - │ └── rparen_loc: ∅ - ├── collection: - │ @ CallNode (location: (1,12)-(1,15)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (1,12)-(1,15) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── statements: - │ @ StatementsNode (location: (1,17)-(1,23)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,17)-(1,23)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :p - │ ├── message_loc: (1,17)-(1,18) = "p" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,19)-(1,23)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ LocalVariableReadNode (location: (1,19)-(1,20)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :a - │ │ │ └── depth: 0 - │ │ └── @ LocalVariableReadNode (location: (1,22)-(1,23)) - │ │ ├── flags: ∅ - │ │ ├── name: :b - │ │ └── depth: 0 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── for_keyword_loc: (1,0)-(1,3) = "for" - ├── in_keyword_loc: (1,9)-(1,11) = "in" - ├── do_keyword_loc: ∅ - └── end_keyword_loc: (1,25)-(1,28) = "end" diff --git a/test/prism/snapshots/whitequark/forward_arg.txt b/test/prism/snapshots/whitequark/forward_arg.txt deleted file mode 100644 index 3879314fa89d88..00000000000000 --- a/test/prism/snapshots/whitequark/forward_arg.txt +++ /dev/null @@ -1,50 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,27)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,27)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(1,27)) - ├── flags: newline - ├── name: :foo - ├── name_loc: (1,4)-(1,7) = "foo" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (1,8)-(1,11)) - │ ├── flags: ∅ - │ ├── requireds: (length: 0) - │ ├── optionals: (length: 0) - │ ├── rest: ∅ - │ ├── posts: (length: 0) - │ ├── keywords: (length: 0) - │ ├── keyword_rest: - │ │ @ ForwardingParameterNode (location: (1,8)-(1,11)) - │ │ └── flags: ∅ - │ └── block: ∅ - ├── body: - │ @ StatementsNode (location: (1,14)-(1,22)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,14)-(1,22)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :bar - │ ├── message_loc: (1,14)-(1,17) = "bar" - │ ├── opening_loc: (1,17)-(1,18) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,18)-(1,21)) - │ │ ├── flags: contains_forwarding - │ │ └── arguments: (length: 1) - │ │ └── @ ForwardingArgumentsNode (location: (1,18)-(1,21)) - │ │ └── flags: ∅ - │ ├── closing_loc: (1,21)-(1,22) = ")" - │ └── block: ∅ - ├── locals: [] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: (1,7)-(1,8) = "(" - ├── rparen_loc: (1,11)-(1,12) = ")" - ├── equal_loc: ∅ - └── end_keyword_loc: (1,24)-(1,27) = "end" diff --git a/test/prism/snapshots/whitequark/forward_arg_with_open_args.txt b/test/prism/snapshots/whitequark/forward_arg_with_open_args.txt deleted file mode 100644 index ea36abae7eadcf..00000000000000 --- a/test/prism/snapshots/whitequark/forward_arg_with_open_args.txt +++ /dev/null @@ -1,456 +0,0 @@ -@ ProgramNode (location: (1,0)-(27,28)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(27,28)) - ├── flags: ∅ - └── body: (length: 10) - ├── @ ParenthesesNode (location: (1,0)-(3,4)) - │ ├── flags: newline - │ ├── body: - │ │ @ StatementsNode (location: (1,1)-(3,3)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ DefNode (location: (1,1)-(3,3)) - │ │ ├── flags: newline - │ │ ├── name: :foo - │ │ ├── name_loc: (1,5)-(1,8) = "foo" - │ │ ├── receiver: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (1,9)-(1,12)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 0) - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: - │ │ │ │ @ ForwardingParameterNode (location: (1,9)-(1,12)) - │ │ │ │ └── flags: ∅ - │ │ │ └── block: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (2,2)-(2,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (2,2)-(2,10)) - │ │ │ ├── flags: newline, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (2,2)-(2,5) = "bar" - │ │ │ ├── opening_loc: (2,5)-(2,6) = "(" - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (2,6)-(2,9)) - │ │ │ │ ├── flags: contains_forwarding - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ ForwardingArgumentsNode (location: (2,6)-(2,9)) - │ │ │ │ └── flags: ∅ - │ │ │ ├── closing_loc: (2,9)-(2,10) = ")" - │ │ │ └── block: ∅ - │ │ ├── locals: [] - │ │ ├── def_keyword_loc: (1,1)-(1,4) = "def" - │ │ ├── operator_loc: ∅ - │ │ ├── lparen_loc: ∅ - │ │ ├── rparen_loc: ∅ - │ │ ├── equal_loc: ∅ - │ │ └── end_keyword_loc: (3,0)-(3,3) = "end" - │ ├── opening_loc: (1,0)-(1,1) = "(" - │ └── closing_loc: (3,3)-(3,4) = ")" - ├── @ ParenthesesNode (location: (5,0)-(5,28)) - │ ├── flags: newline - │ ├── body: - │ │ @ StatementsNode (location: (5,1)-(5,27)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ DefNode (location: (5,1)-(5,27)) - │ │ ├── flags: newline - │ │ ├── name: :foo - │ │ ├── name_loc: (5,5)-(5,8) = "foo" - │ │ ├── receiver: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (5,9)-(5,12)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 0) - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: - │ │ │ │ @ ForwardingParameterNode (location: (5,9)-(5,12)) - │ │ │ │ └── flags: ∅ - │ │ │ └── block: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (5,14)-(5,22)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (5,14)-(5,22)) - │ │ │ ├── flags: newline, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (5,14)-(5,17) = "bar" - │ │ │ ├── opening_loc: (5,17)-(5,18) = "(" - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (5,18)-(5,21)) - │ │ │ │ ├── flags: contains_forwarding - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ ForwardingArgumentsNode (location: (5,18)-(5,21)) - │ │ │ │ └── flags: ∅ - │ │ │ ├── closing_loc: (5,21)-(5,22) = ")" - │ │ │ └── block: ∅ - │ │ ├── locals: [] - │ │ ├── def_keyword_loc: (5,1)-(5,4) = "def" - │ │ ├── operator_loc: ∅ - │ │ ├── lparen_loc: ∅ - │ │ ├── rparen_loc: ∅ - │ │ ├── equal_loc: ∅ - │ │ └── end_keyword_loc: (5,24)-(5,27) = "end" - │ ├── opening_loc: (5,0)-(5,1) = "(" - │ └── closing_loc: (5,27)-(5,28) = ")" - ├── @ DefNode (location: (7,0)-(8,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (7,4)-(7,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (7,8)-(7,11)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: - │ │ │ @ ForwardingParameterNode (location: (7,8)-(7,11)) - │ │ │ └── flags: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (7,0)-(7,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (8,0)-(8,3) = "end" - ├── @ DefNode (location: (10,0)-(10,26)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (10,4)-(10,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (10,8)-(10,11)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: - │ │ │ @ ForwardingParameterNode (location: (10,8)-(10,11)) - │ │ │ └── flags: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (10,13)-(10,21)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (10,13)-(10,21)) - │ │ ├── flags: newline, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (10,13)-(10,16) = "bar" - │ │ ├── opening_loc: (10,16)-(10,17) = "(" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (10,17)-(10,20)) - │ │ │ ├── flags: contains_forwarding - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ ForwardingArgumentsNode (location: (10,17)-(10,20)) - │ │ │ └── flags: ∅ - │ │ ├── closing_loc: (10,20)-(10,21) = ")" - │ │ └── block: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (10,0)-(10,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (10,23)-(10,26) = "end" - ├── @ DefNode (location: (12,0)-(14,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (12,4)-(12,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (12,8)-(12,14)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (12,8)-(12,9)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :a - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: - │ │ │ @ ForwardingParameterNode (location: (12,11)-(12,14)) - │ │ │ └── flags: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (13,2)-(13,10)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (13,2)-(13,10)) - │ │ ├── flags: newline, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (13,2)-(13,5) = "bar" - │ │ ├── opening_loc: (13,5)-(13,6) = "(" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (13,6)-(13,9)) - │ │ │ ├── flags: contains_forwarding - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ ForwardingArgumentsNode (location: (13,6)-(13,9)) - │ │ │ └── flags: ∅ - │ │ ├── closing_loc: (13,9)-(13,10) = ")" - │ │ └── block: ∅ - │ ├── locals: [:a] - │ ├── def_keyword_loc: (12,0)-(12,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (14,0)-(14,3) = "end" - ├── @ DefNode (location: (16,0)-(16,29)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (16,4)-(16,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (16,8)-(16,14)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (16,8)-(16,9)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :a - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: - │ │ │ @ ForwardingParameterNode (location: (16,11)-(16,14)) - │ │ │ └── flags: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (16,16)-(16,24)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (16,16)-(16,24)) - │ │ ├── flags: newline, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (16,16)-(16,19) = "bar" - │ │ ├── opening_loc: (16,19)-(16,20) = "(" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (16,20)-(16,23)) - │ │ │ ├── flags: contains_forwarding - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ ForwardingArgumentsNode (location: (16,20)-(16,23)) - │ │ │ └── flags: ∅ - │ │ ├── closing_loc: (16,23)-(16,24) = ")" - │ │ └── block: ∅ - │ ├── locals: [:a] - │ ├── def_keyword_loc: (16,0)-(16,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (16,26)-(16,29) = "end" - ├── @ DefNode (location: (18,0)-(19,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (18,4)-(18,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (18,8)-(18,21)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (18,8)-(18,9)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :a - │ │ ├── optionals: (length: 1) - │ │ │ └── @ OptionalParameterNode (location: (18,11)-(18,16)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :b - │ │ │ ├── name_loc: (18,11)-(18,12) = "b" - │ │ │ ├── operator_loc: (18,13)-(18,14) = "=" - │ │ │ └── value: - │ │ │ @ IntegerNode (location: (18,15)-(18,16)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: - │ │ │ @ ForwardingParameterNode (location: (18,18)-(18,21)) - │ │ │ └── flags: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:a, :b] - │ ├── def_keyword_loc: (18,0)-(18,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (19,0)-(19,3) = "end" - ├── @ DefNode (location: (21,0)-(23,3)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (21,4)-(21,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (21,8)-(21,18)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 1) - │ │ │ └── @ OptionalParameterNode (location: (21,8)-(21,13)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :b - │ │ │ ├── name_loc: (21,8)-(21,9) = "b" - │ │ │ ├── operator_loc: (21,10)-(21,11) = "=" - │ │ │ └── value: - │ │ │ @ IntegerNode (location: (21,12)-(21,13)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: - │ │ │ @ ForwardingParameterNode (location: (21,15)-(21,18)) - │ │ │ └── flags: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (22,2)-(22,10)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (22,2)-(22,10)) - │ │ ├── flags: newline, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (22,2)-(22,5) = "bar" - │ │ ├── opening_loc: (22,5)-(22,6) = "(" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (22,6)-(22,9)) - │ │ │ ├── flags: contains_forwarding - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ ForwardingArgumentsNode (location: (22,6)-(22,9)) - │ │ │ └── flags: ∅ - │ │ ├── closing_loc: (22,9)-(22,10) = ")" - │ │ └── block: ∅ - │ ├── locals: [:b] - │ ├── def_keyword_loc: (21,0)-(21,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (23,0)-(23,3) = "end" - ├── @ DefNode (location: (25,0)-(25,33)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (25,4)-(25,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (25,8)-(25,18)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 1) - │ │ │ └── @ OptionalParameterNode (location: (25,8)-(25,13)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :b - │ │ │ ├── name_loc: (25,8)-(25,9) = "b" - │ │ │ ├── operator_loc: (25,10)-(25,11) = "=" - │ │ │ └── value: - │ │ │ @ IntegerNode (location: (25,12)-(25,13)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: - │ │ │ @ ForwardingParameterNode (location: (25,15)-(25,18)) - │ │ │ └── flags: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (25,20)-(25,28)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (25,20)-(25,28)) - │ │ ├── flags: newline, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (25,20)-(25,23) = "bar" - │ │ ├── opening_loc: (25,23)-(25,24) = "(" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (25,24)-(25,27)) - │ │ │ ├── flags: contains_forwarding - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ ForwardingArgumentsNode (location: (25,24)-(25,27)) - │ │ │ └── flags: ∅ - │ │ ├── closing_loc: (25,27)-(25,28) = ")" - │ │ └── block: ∅ - │ ├── locals: [:b] - │ ├── def_keyword_loc: (25,0)-(25,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (25,30)-(25,33) = "end" - └── @ DefNode (location: (27,0)-(27,28)) - ├── flags: newline - ├── name: :foo - ├── name_loc: (27,4)-(27,7) = "foo" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (27,8)-(27,14)) - │ ├── flags: ∅ - │ ├── requireds: (length: 1) - │ │ └── @ RequiredParameterNode (location: (27,8)-(27,9)) - │ │ ├── flags: ∅ - │ │ └── name: :a - │ ├── optionals: (length: 0) - │ ├── rest: ∅ - │ ├── posts: (length: 0) - │ ├── keywords: (length: 0) - │ ├── keyword_rest: - │ │ @ ForwardingParameterNode (location: (27,11)-(27,14)) - │ │ └── flags: ∅ - │ └── block: ∅ - ├── body: - │ @ StatementsNode (location: (27,16)-(27,24)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (27,16)-(27,24)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :bar - │ ├── message_loc: (27,16)-(27,19) = "bar" - │ ├── opening_loc: (27,19)-(27,20) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (27,20)-(27,23)) - │ │ ├── flags: contains_forwarding - │ │ └── arguments: (length: 1) - │ │ └── @ ForwardingArgumentsNode (location: (27,20)-(27,23)) - │ │ └── flags: ∅ - │ ├── closing_loc: (27,23)-(27,24) = ")" - │ └── block: ∅ - ├── locals: [:a] - ├── def_keyword_loc: (27,0)-(27,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: (27,7)-(27,8) = "(" - ├── rparen_loc: (27,14)-(27,15) = ")" - ├── equal_loc: ∅ - └── end_keyword_loc: (27,25)-(27,28) = "end" diff --git a/test/prism/snapshots/whitequark/forward_args_legacy.txt b/test/prism/snapshots/whitequark/forward_args_legacy.txt deleted file mode 100644 index 2fda9338f3fe6c..00000000000000 --- a/test/prism/snapshots/whitequark/forward_args_legacy.txt +++ /dev/null @@ -1,115 +0,0 @@ -@ ProgramNode (location: (1,0)-(5,29)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(5,29)) - ├── flags: ∅ - └── body: (length: 3) - ├── @ DefNode (location: (1,0)-(1,27)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (1,4)-(1,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,8)-(1,11)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: - │ │ │ @ ForwardingParameterNode (location: (1,8)-(1,11)) - │ │ │ └── flags: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (1,14)-(1,22)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (1,14)-(1,22)) - │ │ ├── flags: newline, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (1,14)-(1,17) = "bar" - │ │ ├── opening_loc: (1,17)-(1,18) = "(" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (1,18)-(1,21)) - │ │ │ ├── flags: contains_forwarding - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ ForwardingArgumentsNode (location: (1,18)-(1,21)) - │ │ │ └── flags: ∅ - │ │ ├── closing_loc: (1,21)-(1,22) = ")" - │ │ └── block: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (1,0)-(1,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (1,7)-(1,8) = "(" - │ ├── rparen_loc: (1,11)-(1,12) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (1,24)-(1,27) = "end" - ├── @ DefNode (location: (3,0)-(3,17)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (3,4)-(3,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (3,8)-(3,11)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: - │ │ │ @ ForwardingParameterNode (location: (3,8)-(3,11)) - │ │ │ └── flags: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (3,0)-(3,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: (3,7)-(3,8) = "(" - │ ├── rparen_loc: (3,11)-(3,12) = ")" - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (3,14)-(3,17) = "end" - └── @ DefNode (location: (5,0)-(5,29)) - ├── flags: newline - ├── name: :foo - ├── name_loc: (5,4)-(5,7) = "foo" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (5,8)-(5,11)) - │ ├── flags: ∅ - │ ├── requireds: (length: 0) - │ ├── optionals: (length: 0) - │ ├── rest: ∅ - │ ├── posts: (length: 0) - │ ├── keywords: (length: 0) - │ ├── keyword_rest: - │ │ @ ForwardingParameterNode (location: (5,8)-(5,11)) - │ │ └── flags: ∅ - │ └── block: ∅ - ├── body: - │ @ StatementsNode (location: (5,14)-(5,24)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ SuperNode (location: (5,14)-(5,24)) - │ ├── flags: newline - │ ├── keyword_loc: (5,14)-(5,19) = "super" - │ ├── lparen_loc: (5,19)-(5,20) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (5,20)-(5,23)) - │ │ ├── flags: contains_forwarding - │ │ └── arguments: (length: 1) - │ │ └── @ ForwardingArgumentsNode (location: (5,20)-(5,23)) - │ │ └── flags: ∅ - │ ├── rparen_loc: (5,23)-(5,24) = ")" - │ └── block: ∅ - ├── locals: [] - ├── def_keyword_loc: (5,0)-(5,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: (5,7)-(5,8) = "(" - ├── rparen_loc: (5,11)-(5,12) = ")" - ├── equal_loc: ∅ - └── end_keyword_loc: (5,26)-(5,29) = "end" diff --git a/test/prism/snapshots/whitequark/forwarded_argument_with_kwrestarg.txt b/test/prism/snapshots/whitequark/forwarded_argument_with_kwrestarg.txt deleted file mode 100644 index d80ace6fbaf9bd..00000000000000 --- a/test/prism/snapshots/whitequark/forwarded_argument_with_kwrestarg.txt +++ /dev/null @@ -1,65 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,45)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,45)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(1,45)) - ├── flags: newline - ├── name: :foo - ├── name_loc: (1,4)-(1,7) = "foo" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (1,8)-(1,20)) - │ ├── flags: ∅ - │ ├── requireds: (length: 1) - │ │ └── @ RequiredParameterNode (location: (1,8)-(1,16)) - │ │ ├── flags: ∅ - │ │ └── name: :argument - │ ├── optionals: (length: 0) - │ ├── rest: ∅ - │ ├── posts: (length: 0) - │ ├── keywords: (length: 0) - │ ├── keyword_rest: - │ │ @ KeywordRestParameterNode (location: (1,18)-(1,20)) - │ │ ├── flags: ∅ - │ │ ├── name: ∅ - │ │ ├── name_loc: ∅ - │ │ └── operator_loc: (1,18)-(1,20) = "**" - │ └── block: ∅ - ├── body: - │ @ StatementsNode (location: (1,23)-(1,40)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,23)-(1,40)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :bar - │ ├── message_loc: (1,23)-(1,26) = "bar" - │ ├── opening_loc: (1,26)-(1,27) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,27)-(1,39)) - │ │ ├── flags: contains_keywords, contains_keyword_splat - │ │ └── arguments: (length: 2) - │ │ ├── @ LocalVariableReadNode (location: (1,27)-(1,35)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :argument - │ │ │ └── depth: 0 - │ │ └── @ KeywordHashNode (location: (1,37)-(1,39)) - │ │ ├── flags: ∅ - │ │ └── elements: (length: 1) - │ │ └── @ AssocSplatNode (location: (1,37)-(1,39)) - │ │ ├── flags: ∅ - │ │ ├── value: ∅ - │ │ └── operator_loc: (1,37)-(1,39) = "**" - │ ├── closing_loc: (1,39)-(1,40) = ")" - │ └── block: ∅ - ├── locals: [:argument] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: (1,7)-(1,8) = "(" - ├── rparen_loc: (1,20)-(1,21) = ")" - ├── equal_loc: ∅ - └── end_keyword_loc: (1,42)-(1,45) = "end" diff --git a/test/prism/snapshots/whitequark/forwarded_argument_with_restarg.txt b/test/prism/snapshots/whitequark/forwarded_argument_with_restarg.txt deleted file mode 100644 index 2dd95c6cae18b2..00000000000000 --- a/test/prism/snapshots/whitequark/forwarded_argument_with_restarg.txt +++ /dev/null @@ -1,62 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,43)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,43)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(1,43)) - ├── flags: newline - ├── name: :foo - ├── name_loc: (1,4)-(1,7) = "foo" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (1,8)-(1,19)) - │ ├── flags: ∅ - │ ├── requireds: (length: 1) - │ │ └── @ RequiredParameterNode (location: (1,8)-(1,16)) - │ │ ├── flags: ∅ - │ │ └── name: :argument - │ ├── optionals: (length: 0) - │ ├── rest: - │ │ @ RestParameterNode (location: (1,18)-(1,19)) - │ │ ├── flags: ∅ - │ │ ├── name: ∅ - │ │ ├── name_loc: ∅ - │ │ └── operator_loc: (1,18)-(1,19) = "*" - │ ├── posts: (length: 0) - │ ├── keywords: (length: 0) - │ ├── keyword_rest: ∅ - │ └── block: ∅ - ├── body: - │ @ StatementsNode (location: (1,22)-(1,38)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,22)-(1,38)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :bar - │ ├── message_loc: (1,22)-(1,25) = "bar" - │ ├── opening_loc: (1,25)-(1,26) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,26)-(1,37)) - │ │ ├── flags: contains_splat - │ │ └── arguments: (length: 2) - │ │ ├── @ LocalVariableReadNode (location: (1,26)-(1,34)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :argument - │ │ │ └── depth: 0 - │ │ └── @ SplatNode (location: (1,36)-(1,37)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (1,36)-(1,37) = "*" - │ │ └── expression: ∅ - │ ├── closing_loc: (1,37)-(1,38) = ")" - │ └── block: ∅ - ├── locals: [:argument] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: (1,7)-(1,8) = "(" - ├── rparen_loc: (1,19)-(1,20) = ")" - ├── equal_loc: ∅ - └── end_keyword_loc: (1,40)-(1,43) = "end" diff --git a/test/prism/snapshots/whitequark/forwarded_kwrestarg.txt b/test/prism/snapshots/whitequark/forwarded_kwrestarg.txt deleted file mode 100644 index 50cc9ca38b857c..00000000000000 --- a/test/prism/snapshots/whitequark/forwarded_kwrestarg.txt +++ /dev/null @@ -1,58 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,25)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,25)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(1,25)) - ├── flags: newline - ├── name: :foo - ├── name_loc: (1,4)-(1,7) = "foo" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (1,8)-(1,10)) - │ ├── flags: ∅ - │ ├── requireds: (length: 0) - │ ├── optionals: (length: 0) - │ ├── rest: ∅ - │ ├── posts: (length: 0) - │ ├── keywords: (length: 0) - │ ├── keyword_rest: - │ │ @ KeywordRestParameterNode (location: (1,8)-(1,10)) - │ │ ├── flags: ∅ - │ │ ├── name: ∅ - │ │ ├── name_loc: ∅ - │ │ └── operator_loc: (1,8)-(1,10) = "**" - │ └── block: ∅ - ├── body: - │ @ StatementsNode (location: (1,13)-(1,20)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,13)-(1,20)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :bar - │ ├── message_loc: (1,13)-(1,16) = "bar" - │ ├── opening_loc: (1,16)-(1,17) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,17)-(1,19)) - │ │ ├── flags: contains_keywords, contains_keyword_splat - │ │ └── arguments: (length: 1) - │ │ └── @ KeywordHashNode (location: (1,17)-(1,19)) - │ │ ├── flags: ∅ - │ │ └── elements: (length: 1) - │ │ └── @ AssocSplatNode (location: (1,17)-(1,19)) - │ │ ├── flags: ∅ - │ │ ├── value: ∅ - │ │ └── operator_loc: (1,17)-(1,19) = "**" - │ ├── closing_loc: (1,19)-(1,20) = ")" - │ └── block: ∅ - ├── locals: [] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: (1,7)-(1,8) = "(" - ├── rparen_loc: (1,10)-(1,11) = ")" - ├── equal_loc: ∅ - └── end_keyword_loc: (1,22)-(1,25) = "end" diff --git a/test/prism/snapshots/whitequark/forwarded_kwrestarg_with_additional_kwarg.txt b/test/prism/snapshots/whitequark/forwarded_kwrestarg_with_additional_kwarg.txt deleted file mode 100644 index 32ace5cb3d464e..00000000000000 --- a/test/prism/snapshots/whitequark/forwarded_kwrestarg_with_additional_kwarg.txt +++ /dev/null @@ -1,71 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,41)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,41)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(1,41)) - ├── flags: newline - ├── name: :foo - ├── name_loc: (1,4)-(1,7) = "foo" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (1,8)-(1,10)) - │ ├── flags: ∅ - │ ├── requireds: (length: 0) - │ ├── optionals: (length: 0) - │ ├── rest: ∅ - │ ├── posts: (length: 0) - │ ├── keywords: (length: 0) - │ ├── keyword_rest: - │ │ @ KeywordRestParameterNode (location: (1,8)-(1,10)) - │ │ ├── flags: ∅ - │ │ ├── name: ∅ - │ │ ├── name_loc: ∅ - │ │ └── operator_loc: (1,8)-(1,10) = "**" - │ └── block: ∅ - ├── body: - │ @ StatementsNode (location: (1,13)-(1,36)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,13)-(1,36)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :bar - │ ├── message_loc: (1,13)-(1,16) = "bar" - │ ├── opening_loc: (1,16)-(1,17) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,17)-(1,35)) - │ │ ├── flags: contains_keywords, contains_keyword_splat - │ │ └── arguments: (length: 1) - │ │ └── @ KeywordHashNode (location: (1,17)-(1,35)) - │ │ ├── flags: ∅ - │ │ └── elements: (length: 2) - │ │ ├── @ AssocSplatNode (location: (1,17)-(1,19)) - │ │ │ ├── flags: ∅ - │ │ │ ├── value: ∅ - │ │ │ └── operator_loc: (1,17)-(1,19) = "**" - │ │ └── @ AssocNode (location: (1,21)-(1,35)) - │ │ ├── flags: static_literal - │ │ ├── key: - │ │ │ @ SymbolNode (location: (1,21)-(1,30)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (1,21)-(1,29) = "from_foo" - │ │ │ ├── closing_loc: (1,29)-(1,30) = ":" - │ │ │ └── unescaped: "from_foo" - │ │ ├── value: - │ │ │ @ TrueNode (location: (1,31)-(1,35)) - │ │ │ └── flags: static_literal - │ │ └── operator_loc: ∅ - │ ├── closing_loc: (1,35)-(1,36) = ")" - │ └── block: ∅ - ├── locals: [] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: (1,7)-(1,8) = "(" - ├── rparen_loc: (1,10)-(1,11) = ")" - ├── equal_loc: ∅ - └── end_keyword_loc: (1,38)-(1,41) = "end" diff --git a/test/prism/snapshots/whitequark/forwarded_restarg.txt b/test/prism/snapshots/whitequark/forwarded_restarg.txt deleted file mode 100644 index 3e26b2b60eee44..00000000000000 --- a/test/prism/snapshots/whitequark/forwarded_restarg.txt +++ /dev/null @@ -1,55 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,23)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,23)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(1,23)) - ├── flags: newline - ├── name: :foo - ├── name_loc: (1,4)-(1,7) = "foo" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (1,8)-(1,9)) - │ ├── flags: ∅ - │ ├── requireds: (length: 0) - │ ├── optionals: (length: 0) - │ ├── rest: - │ │ @ RestParameterNode (location: (1,8)-(1,9)) - │ │ ├── flags: ∅ - │ │ ├── name: ∅ - │ │ ├── name_loc: ∅ - │ │ └── operator_loc: (1,8)-(1,9) = "*" - │ ├── posts: (length: 0) - │ ├── keywords: (length: 0) - │ ├── keyword_rest: ∅ - │ └── block: ∅ - ├── body: - │ @ StatementsNode (location: (1,12)-(1,18)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,12)-(1,18)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :bar - │ ├── message_loc: (1,12)-(1,15) = "bar" - │ ├── opening_loc: (1,15)-(1,16) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,16)-(1,17)) - │ │ ├── flags: contains_splat - │ │ └── arguments: (length: 1) - │ │ └── @ SplatNode (location: (1,16)-(1,17)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (1,16)-(1,17) = "*" - │ │ └── expression: ∅ - │ ├── closing_loc: (1,17)-(1,18) = ")" - │ └── block: ∅ - ├── locals: [] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: (1,7)-(1,8) = "(" - ├── rparen_loc: (1,9)-(1,10) = ")" - ├── equal_loc: ∅ - └── end_keyword_loc: (1,20)-(1,23) = "end" diff --git a/test/prism/snapshots/whitequark/gvar.txt b/test/prism/snapshots/whitequark/gvar.txt deleted file mode 100644 index 5191f28e241745..00000000000000 --- a/test/prism/snapshots/whitequark/gvar.txt +++ /dev/null @@ -1,10 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,4)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,4)) - ├── flags: ∅ - └── body: (length: 1) - └── @ GlobalVariableReadNode (location: (1,0)-(1,4)) - ├── flags: newline - └── name: :$foo diff --git a/test/prism/snapshots/whitequark/gvasgn.txt b/test/prism/snapshots/whitequark/gvasgn.txt deleted file mode 100644 index e5bfe44d18ac3d..00000000000000 --- a/test/prism/snapshots/whitequark/gvasgn.txt +++ /dev/null @@ -1,16 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,9)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,9)) - ├── flags: ∅ - └── body: (length: 1) - └── @ GlobalVariableWriteNode (location: (1,0)-(1,9)) - ├── flags: newline - ├── name: :$var - ├── name_loc: (1,0)-(1,4) = "$var" - ├── value: - │ @ IntegerNode (location: (1,7)-(1,9)) - │ ├── flags: static_literal, decimal - │ └── value: 10 - └── operator_loc: (1,5)-(1,6) = "=" diff --git a/test/prism/snapshots/whitequark/hash_empty.txt b/test/prism/snapshots/whitequark/hash_empty.txt deleted file mode 100644 index 3f6fcdd171fd32..00000000000000 --- a/test/prism/snapshots/whitequark/hash_empty.txt +++ /dev/null @@ -1,12 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ HashNode (location: (1,0)-(1,3)) - ├── flags: newline, static_literal - ├── opening_loc: (1,0)-(1,1) = "{" - ├── elements: (length: 0) - └── closing_loc: (1,2)-(1,3) = "}" diff --git a/test/prism/snapshots/whitequark/hash_hashrocket.txt b/test/prism/snapshots/whitequark/hash_hashrocket.txt deleted file mode 100644 index fcf3fe3055ba6f..00000000000000 --- a/test/prism/snapshots/whitequark/hash_hashrocket.txt +++ /dev/null @@ -1,56 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,25)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,25)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ HashNode (location: (1,0)-(1,10)) - │ ├── flags: newline, static_literal - │ ├── opening_loc: (1,0)-(1,1) = "{" - │ ├── elements: (length: 1) - │ │ └── @ AssocNode (location: (1,2)-(1,8)) - │ │ ├── flags: static_literal - │ │ ├── key: - │ │ │ @ IntegerNode (location: (1,2)-(1,3)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── value: - │ │ │ @ IntegerNode (location: (1,7)-(1,8)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ └── operator_loc: (1,4)-(1,6) = "=>" - │ └── closing_loc: (1,9)-(1,10) = "}" - └── @ HashNode (location: (3,0)-(3,25)) - ├── flags: newline - ├── opening_loc: (3,0)-(3,1) = "{" - ├── elements: (length: 2) - │ ├── @ AssocNode (location: (3,2)-(3,8)) - │ │ ├── flags: static_literal - │ │ ├── key: - │ │ │ @ IntegerNode (location: (3,2)-(3,3)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── value: - │ │ │ @ IntegerNode (location: (3,7)-(3,8)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ └── operator_loc: (3,4)-(3,6) = "=>" - │ └── @ AssocNode (location: (3,10)-(3,23)) - │ ├── flags: ∅ - │ ├── key: - │ │ @ SymbolNode (location: (3,10)-(3,14)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (3,10)-(3,11) = ":" - │ │ ├── value_loc: (3,11)-(3,14) = "foo" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "foo" - │ ├── value: - │ │ @ StringNode (location: (3,18)-(3,23)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (3,18)-(3,19) = "\"" - │ │ ├── content_loc: (3,19)-(3,22) = "bar" - │ │ ├── closing_loc: (3,22)-(3,23) = "\"" - │ │ └── unescaped: "bar" - │ └── operator_loc: (3,15)-(3,17) = "=>" - └── closing_loc: (3,24)-(3,25) = "}" diff --git a/test/prism/snapshots/whitequark/hash_kwsplat.txt b/test/prism/snapshots/whitequark/hash_kwsplat.txt deleted file mode 100644 index acccc48b3d67ff..00000000000000 --- a/test/prism/snapshots/whitequark/hash_kwsplat.txt +++ /dev/null @@ -1,40 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,17)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,17)) - ├── flags: ∅ - └── body: (length: 1) - └── @ HashNode (location: (1,0)-(1,17)) - ├── flags: newline - ├── opening_loc: (1,0)-(1,1) = "{" - ├── elements: (length: 2) - │ ├── @ AssocNode (location: (1,2)-(1,8)) - │ │ ├── flags: static_literal - │ │ ├── key: - │ │ │ @ SymbolNode (location: (1,2)-(1,6)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (1,2)-(1,5) = "foo" - │ │ │ ├── closing_loc: (1,5)-(1,6) = ":" - │ │ │ └── unescaped: "foo" - │ │ ├── value: - │ │ │ @ IntegerNode (location: (1,7)-(1,8)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ └── operator_loc: ∅ - │ └── @ AssocSplatNode (location: (1,10)-(1,15)) - │ ├── flags: ∅ - │ ├── value: - │ │ @ CallNode (location: (1,12)-(1,15)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (1,12)-(1,15) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── operator_loc: (1,10)-(1,12) = "**" - └── closing_loc: (1,16)-(1,17) = "}" diff --git a/test/prism/snapshots/whitequark/hash_label.txt b/test/prism/snapshots/whitequark/hash_label.txt deleted file mode 100644 index b321e2185920a1..00000000000000 --- a/test/prism/snapshots/whitequark/hash_label.txt +++ /dev/null @@ -1,26 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,10)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,10)) - ├── flags: ∅ - └── body: (length: 1) - └── @ HashNode (location: (1,0)-(1,10)) - ├── flags: newline, static_literal - ├── opening_loc: (1,0)-(1,1) = "{" - ├── elements: (length: 1) - │ └── @ AssocNode (location: (1,2)-(1,8)) - │ ├── flags: static_literal - │ ├── key: - │ │ @ SymbolNode (location: (1,2)-(1,6)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: ∅ - │ │ ├── value_loc: (1,2)-(1,5) = "foo" - │ │ ├── closing_loc: (1,5)-(1,6) = ":" - │ │ └── unescaped: "foo" - │ ├── value: - │ │ @ IntegerNode (location: (1,7)-(1,8)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ └── operator_loc: ∅ - └── closing_loc: (1,9)-(1,10) = "}" diff --git a/test/prism/snapshots/whitequark/hash_label_end.txt b/test/prism/snapshots/whitequark/hash_label_end.txt deleted file mode 100644 index 9e4accee0044e9..00000000000000 --- a/test/prism/snapshots/whitequark/hash_label_end.txt +++ /dev/null @@ -1,112 +0,0 @@ -@ ProgramNode (location: (1,0)-(5,22)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(5,22)) - ├── flags: ∅ - └── body: (length: 3) - ├── @ CallNode (location: (1,0)-(1,12)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :f - │ ├── message_loc: (1,0)-(1,1) = "f" - │ ├── opening_loc: (1,1)-(1,2) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,2)-(1,11)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IfNode (location: (1,2)-(1,11)) - │ │ ├── flags: newline - │ │ ├── if_keyword_loc: ∅ - │ │ ├── predicate: - │ │ │ @ CallNode (location: (1,2)-(1,3)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :a - │ │ │ ├── message_loc: (1,2)-(1,3) = "a" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── then_keyword_loc: (1,4)-(1,5) = "?" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (1,6)-(1,9)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ StringNode (location: (1,6)-(1,9)) - │ │ │ ├── flags: newline - │ │ │ ├── opening_loc: (1,6)-(1,7) = "\"" - │ │ │ ├── content_loc: (1,7)-(1,8) = "a" - │ │ │ ├── closing_loc: (1,8)-(1,9) = "\"" - │ │ │ └── unescaped: "a" - │ │ ├── subsequent: - │ │ │ @ ElseNode (location: (1,9)-(1,11)) - │ │ │ ├── flags: ∅ - │ │ │ ├── else_keyword_loc: (1,9)-(1,10) = ":" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (1,10)-(1,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ IntegerNode (location: (1,10)-(1,11)) - │ │ │ │ ├── flags: newline, static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ └── end_keyword_loc: ∅ - │ │ └── end_keyword_loc: ∅ - │ ├── closing_loc: (1,11)-(1,12) = ")" - │ └── block: ∅ - ├── @ HashNode (location: (3,0)-(3,12)) - │ ├── flags: newline, static_literal - │ ├── opening_loc: (3,0)-(3,1) = "{" - │ ├── elements: (length: 1) - │ │ └── @ AssocNode (location: (3,2)-(3,10)) - │ │ ├── flags: static_literal - │ │ ├── key: - │ │ │ @ SymbolNode (location: (3,2)-(3,8)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (3,2)-(3,3) = "'" - │ │ │ ├── value_loc: (3,3)-(3,6) = "foo" - │ │ │ ├── closing_loc: (3,6)-(3,8) = "':" - │ │ │ └── unescaped: "foo" - │ │ ├── value: - │ │ │ @ IntegerNode (location: (3,9)-(3,10)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ └── operator_loc: ∅ - │ └── closing_loc: (3,11)-(3,12) = "}" - └── @ HashNode (location: (5,0)-(5,22)) - ├── flags: newline - ├── opening_loc: (5,0)-(5,1) = "{" - ├── elements: (length: 2) - │ ├── @ AssocNode (location: (5,2)-(5,10)) - │ │ ├── flags: static_literal - │ │ ├── key: - │ │ │ @ SymbolNode (location: (5,2)-(5,8)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (5,2)-(5,3) = "'" - │ │ │ ├── value_loc: (5,3)-(5,6) = "foo" - │ │ │ ├── closing_loc: (5,6)-(5,8) = "':" - │ │ │ └── unescaped: "foo" - │ │ ├── value: - │ │ │ @ IntegerNode (location: (5,9)-(5,10)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ └── operator_loc: ∅ - │ └── @ AssocNode (location: (5,12)-(5,21)) - │ ├── flags: ∅ - │ ├── key: - │ │ @ SymbolNode (location: (5,12)-(5,18)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (5,12)-(5,13) = "'" - │ │ ├── value_loc: (5,13)-(5,16) = "bar" - │ │ ├── closing_loc: (5,16)-(5,18) = "':" - │ │ └── unescaped: "bar" - │ ├── value: - │ │ @ HashNode (location: (5,19)-(5,21)) - │ │ ├── flags: static_literal - │ │ ├── opening_loc: (5,19)-(5,20) = "{" - │ │ ├── elements: (length: 0) - │ │ └── closing_loc: (5,20)-(5,21) = "}" - │ └── operator_loc: ∅ - └── closing_loc: (5,21)-(5,22) = "}" diff --git a/test/prism/snapshots/whitequark/hash_pair_value_omission.txt b/test/prism/snapshots/whitequark/hash_pair_value_omission.txt deleted file mode 100644 index d87b1ef0f9ffe9..00000000000000 --- a/test/prism/snapshots/whitequark/hash_pair_value_omission.txt +++ /dev/null @@ -1,111 +0,0 @@ -@ ProgramNode (location: (1,0)-(5,7)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(5,7)) - ├── flags: ∅ - └── body: (length: 3) - ├── @ HashNode (location: (1,0)-(1,6)) - │ ├── flags: newline - │ ├── opening_loc: (1,0)-(1,1) = "{" - │ ├── elements: (length: 1) - │ │ └── @ AssocNode (location: (1,1)-(1,5)) - │ │ ├── flags: ∅ - │ │ ├── key: - │ │ │ @ SymbolNode (location: (1,1)-(1,5)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (1,1)-(1,4) = "BAR" - │ │ │ ├── closing_loc: (1,4)-(1,5) = ":" - │ │ │ └── unescaped: "BAR" - │ │ ├── value: - │ │ │ @ ImplicitNode (location: (1,1)-(1,5)) - │ │ │ ├── flags: ∅ - │ │ │ └── value: - │ │ │ @ ConstantReadNode (location: (1,1)-(1,5)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :BAR - │ │ └── operator_loc: ∅ - │ └── closing_loc: (1,5)-(1,6) = "}" - ├── @ HashNode (location: (3,0)-(3,8)) - │ ├── flags: newline - │ ├── opening_loc: (3,0)-(3,1) = "{" - │ ├── elements: (length: 2) - │ │ ├── @ AssocNode (location: (3,1)-(3,3)) - │ │ │ ├── flags: ∅ - │ │ │ ├── key: - │ │ │ │ @ SymbolNode (location: (3,1)-(3,3)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── value_loc: (3,1)-(3,2) = "a" - │ │ │ │ ├── closing_loc: (3,2)-(3,3) = ":" - │ │ │ │ └── unescaped: "a" - │ │ │ ├── value: - │ │ │ │ @ ImplicitNode (location: (3,1)-(3,3)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── value: - │ │ │ │ @ CallNode (location: (3,1)-(3,3)) - │ │ │ │ ├── flags: ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :a - │ │ │ │ ├── message_loc: (3,1)-(3,2) = "a" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── operator_loc: ∅ - │ │ └── @ AssocNode (location: (3,5)-(3,7)) - │ │ ├── flags: ∅ - │ │ ├── key: - │ │ │ @ SymbolNode (location: (3,5)-(3,7)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (3,5)-(3,6) = "b" - │ │ │ ├── closing_loc: (3,6)-(3,7) = ":" - │ │ │ └── unescaped: "b" - │ │ ├── value: - │ │ │ @ ImplicitNode (location: (3,5)-(3,7)) - │ │ │ ├── flags: ∅ - │ │ │ └── value: - │ │ │ @ CallNode (location: (3,5)-(3,7)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (3,5)-(3,6) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: ∅ - │ └── closing_loc: (3,7)-(3,8) = "}" - └── @ HashNode (location: (5,0)-(5,7)) - ├── flags: newline - ├── opening_loc: (5,0)-(5,1) = "{" - ├── elements: (length: 1) - │ └── @ AssocNode (location: (5,1)-(5,6)) - │ ├── flags: ∅ - │ ├── key: - │ │ @ SymbolNode (location: (5,1)-(5,6)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: ∅ - │ │ ├── value_loc: (5,1)-(5,5) = "puts" - │ │ ├── closing_loc: (5,5)-(5,6) = ":" - │ │ └── unescaped: "puts" - │ ├── value: - │ │ @ ImplicitNode (location: (5,1)-(5,6)) - │ │ ├── flags: ∅ - │ │ └── value: - │ │ @ CallNode (location: (5,1)-(5,6)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :puts - │ │ ├── message_loc: (5,1)-(5,5) = "puts" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── operator_loc: ∅ - └── closing_loc: (5,6)-(5,7) = "}" diff --git a/test/prism/snapshots/whitequark/heredoc.txt b/test/prism/snapshots/whitequark/heredoc.txt deleted file mode 100644 index 76b3e94a922b13..00000000000000 --- a/test/prism/snapshots/whitequark/heredoc.txt +++ /dev/null @@ -1,25 +0,0 @@ -@ ProgramNode (location: (1,0)-(11,8)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(11,8)) - ├── flags: ∅ - └── body: (length: 3) - ├── @ StringNode (location: (1,0)-(1,8)) - │ ├── flags: newline - │ ├── opening_loc: (1,0)-(1,8) = "<<'HERE'" - │ ├── content_loc: (2,0)-(4,0) = "foo\nbar\n" - │ ├── closing_loc: (4,0)-(5,0) = "HERE\n" - │ └── unescaped: "foo\nbar\n" - ├── @ StringNode (location: (6,0)-(6,6)) - │ ├── flags: newline - │ ├── opening_loc: (6,0)-(6,6) = "<bar)" - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :=~ - │ │ ├── message_loc: (1,16)-(1,18) = "=~" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (1,19)-(1,24)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ StringNode (location: (1,19)-(1,24)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (1,19)-(1,20) = "'" - │ │ │ ├── content_loc: (1,20)-(1,23) = "bar" - │ │ │ ├── closing_loc: (1,23)-(1,24) = "'" - │ │ │ └── unescaped: "bar" - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── targets: (length: 1) - │ └── @ LocalVariableTargetNode (location: (1,4)-(1,9)) - │ ├── flags: ∅ - │ ├── name: :match - │ └── depth: 0 - └── @ LocalVariableReadNode (location: (1,26)-(1,31)) - ├── flags: newline - ├── name: :match - └── depth: 0 diff --git a/test/prism/snapshots/whitequark/lvasgn.txt b/test/prism/snapshots/whitequark/lvasgn.txt deleted file mode 100644 index 43cb251bd50b0f..00000000000000 --- a/test/prism/snapshots/whitequark/lvasgn.txt +++ /dev/null @@ -1,21 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,13)) -├── flags: ∅ -├── locals: [:var] -└── statements: - @ StatementsNode (location: (1,0)-(1,13)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ LocalVariableWriteNode (location: (1,0)-(1,8)) - │ ├── flags: newline - │ ├── name: :var - │ ├── depth: 0 - │ ├── name_loc: (1,0)-(1,3) = "var" - │ ├── value: - │ │ @ IntegerNode (location: (1,6)-(1,8)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 10 - │ └── operator_loc: (1,4)-(1,5) = "=" - └── @ LocalVariableReadNode (location: (1,10)-(1,13)) - ├── flags: newline - ├── name: :var - └── depth: 0 diff --git a/test/prism/snapshots/whitequark/masgn.txt b/test/prism/snapshots/whitequark/masgn.txt deleted file mode 100644 index a7ce7f5691d480..00000000000000 --- a/test/prism/snapshots/whitequark/masgn.txt +++ /dev/null @@ -1,95 +0,0 @@ -@ ProgramNode (location: (1,0)-(5,20)) -├── flags: ∅ -├── locals: [:foo, :bar, :baz] -└── statements: - @ StatementsNode (location: (1,0)-(5,20)) - ├── flags: ∅ - └── body: (length: 3) - ├── @ MultiWriteNode (location: (1,0)-(1,17)) - │ ├── flags: newline - │ ├── lefts: (length: 2) - │ │ ├── @ LocalVariableTargetNode (location: (1,1)-(1,4)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :foo - │ │ │ └── depth: 0 - │ │ └── @ LocalVariableTargetNode (location: (1,6)-(1,9)) - │ │ ├── flags: ∅ - │ │ ├── name: :bar - │ │ └── depth: 0 - │ ├── rest: ∅ - │ ├── rights: (length: 0) - │ ├── lparen_loc: (1,0)-(1,1) = "(" - │ ├── rparen_loc: (1,9)-(1,10) = ")" - │ ├── operator_loc: (1,11)-(1,12) = "=" - │ └── value: - │ @ ArrayNode (location: (1,13)-(1,17)) - │ ├── flags: static_literal - │ ├── elements: (length: 2) - │ │ ├── @ IntegerNode (location: (1,13)-(1,14)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── @ IntegerNode (location: (1,16)-(1,17)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── opening_loc: ∅ - │ └── closing_loc: ∅ - ├── @ MultiWriteNode (location: (3,0)-(3,15)) - │ ├── flags: newline - │ ├── lefts: (length: 2) - │ │ ├── @ LocalVariableTargetNode (location: (3,0)-(3,3)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :foo - │ │ │ └── depth: 0 - │ │ └── @ LocalVariableTargetNode (location: (3,5)-(3,8)) - │ │ ├── flags: ∅ - │ │ ├── name: :bar - │ │ └── depth: 0 - │ ├── rest: ∅ - │ ├── rights: (length: 0) - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── operator_loc: (3,9)-(3,10) = "=" - │ └── value: - │ @ ArrayNode (location: (3,11)-(3,15)) - │ ├── flags: static_literal - │ ├── elements: (length: 2) - │ │ ├── @ IntegerNode (location: (3,11)-(3,12)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── @ IntegerNode (location: (3,14)-(3,15)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── opening_loc: ∅ - │ └── closing_loc: ∅ - └── @ MultiWriteNode (location: (5,0)-(5,20)) - ├── flags: newline - ├── lefts: (length: 3) - │ ├── @ LocalVariableTargetNode (location: (5,0)-(5,3)) - │ │ ├── flags: ∅ - │ │ ├── name: :foo - │ │ └── depth: 0 - │ ├── @ LocalVariableTargetNode (location: (5,5)-(5,8)) - │ │ ├── flags: ∅ - │ │ ├── name: :bar - │ │ └── depth: 0 - │ └── @ LocalVariableTargetNode (location: (5,10)-(5,13)) - │ ├── flags: ∅ - │ ├── name: :baz - │ └── depth: 0 - ├── rest: ∅ - ├── rights: (length: 0) - ├── lparen_loc: ∅ - ├── rparen_loc: ∅ - ├── operator_loc: (5,14)-(5,15) = "=" - └── value: - @ ArrayNode (location: (5,16)-(5,20)) - ├── flags: static_literal - ├── elements: (length: 2) - │ ├── @ IntegerNode (location: (5,16)-(5,17)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ └── @ IntegerNode (location: (5,19)-(5,20)) - │ ├── flags: static_literal, decimal - │ └── value: 2 - ├── opening_loc: ∅ - └── closing_loc: ∅ diff --git a/test/prism/snapshots/whitequark/masgn_attr.txt b/test/prism/snapshots/whitequark/masgn_attr.txt deleted file mode 100644 index 4e7b85e9608f60..00000000000000 --- a/test/prism/snapshots/whitequark/masgn_attr.txt +++ /dev/null @@ -1,96 +0,0 @@ -@ ProgramNode (location: (1,0)-(5,18)) -├── flags: ∅ -├── locals: [:foo] -└── statements: - @ StatementsNode (location: (1,0)-(5,18)) - ├── flags: ∅ - └── body: (length: 3) - ├── @ MultiWriteNode (location: (1,0)-(1,17)) - │ ├── flags: newline - │ ├── lefts: (length: 2) - │ │ ├── @ CallTargetNode (location: (1,0)-(1,6)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: - │ │ │ │ @ SelfNode (location: (1,0)-(1,4)) - │ │ │ │ └── flags: ∅ - │ │ │ ├── call_operator_loc: (1,4)-(1,5) = "." - │ │ │ ├── name: :A= - │ │ │ └── message_loc: (1,5)-(1,6) = "A" - │ │ └── @ LocalVariableTargetNode (location: (1,8)-(1,11)) - │ │ ├── flags: ∅ - │ │ ├── name: :foo - │ │ └── depth: 0 - │ ├── rest: ∅ - │ ├── rights: (length: 0) - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── operator_loc: (1,12)-(1,13) = "=" - │ └── value: - │ @ LocalVariableReadNode (location: (1,14)-(1,17)) - │ ├── flags: ∅ - │ ├── name: :foo - │ └── depth: 0 - ├── @ MultiWriteNode (location: (3,0)-(3,24)) - │ ├── flags: newline - │ ├── lefts: (length: 2) - │ │ ├── @ CallTargetNode (location: (3,0)-(3,6)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: - │ │ │ │ @ SelfNode (location: (3,0)-(3,4)) - │ │ │ │ └── flags: ∅ - │ │ │ ├── call_operator_loc: (3,4)-(3,5) = "." - │ │ │ ├── name: :a= - │ │ │ └── message_loc: (3,5)-(3,6) = "a" - │ │ └── @ IndexTargetNode (location: (3,8)-(3,18)) - │ │ ├── flags: attribute_write, ignore_visibility - │ │ ├── receiver: - │ │ │ @ SelfNode (location: (3,8)-(3,12)) - │ │ │ └── flags: ∅ - │ │ ├── opening_loc: (3,12)-(3,13) = "[" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (3,13)-(3,17)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 2) - │ │ │ ├── @ IntegerNode (location: (3,13)-(3,14)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ └── @ IntegerNode (location: (3,16)-(3,17)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ ├── closing_loc: (3,17)-(3,18) = "]" - │ │ └── block: ∅ - │ ├── rest: ∅ - │ ├── rights: (length: 0) - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── operator_loc: (3,19)-(3,20) = "=" - │ └── value: - │ @ LocalVariableReadNode (location: (3,21)-(3,24)) - │ ├── flags: ∅ - │ ├── name: :foo - │ └── depth: 0 - └── @ MultiWriteNode (location: (5,0)-(5,18)) - ├── flags: newline - ├── lefts: (length: 2) - │ ├── @ CallTargetNode (location: (5,0)-(5,7)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: - │ │ │ @ SelfNode (location: (5,0)-(5,4)) - │ │ │ └── flags: ∅ - │ │ ├── call_operator_loc: (5,4)-(5,6) = "::" - │ │ ├── name: :a= - │ │ └── message_loc: (5,6)-(5,7) = "a" - │ └── @ LocalVariableTargetNode (location: (5,9)-(5,12)) - │ ├── flags: ∅ - │ ├── name: :foo - │ └── depth: 0 - ├── rest: ∅ - ├── rights: (length: 0) - ├── lparen_loc: ∅ - ├── rparen_loc: ∅ - ├── operator_loc: (5,13)-(5,14) = "=" - └── value: - @ LocalVariableReadNode (location: (5,15)-(5,18)) - ├── flags: ∅ - ├── name: :foo - └── depth: 0 diff --git a/test/prism/snapshots/whitequark/masgn_cmd.txt b/test/prism/snapshots/whitequark/masgn_cmd.txt deleted file mode 100644 index 8ca2afbba0b105..00000000000000 --- a/test/prism/snapshots/whitequark/masgn_cmd.txt +++ /dev/null @@ -1,41 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,16)) -├── flags: ∅ -├── locals: [:foo, :bar] -└── statements: - @ StatementsNode (location: (1,0)-(1,16)) - ├── flags: ∅ - └── body: (length: 1) - └── @ MultiWriteNode (location: (1,0)-(1,16)) - ├── flags: newline - ├── lefts: (length: 2) - │ ├── @ LocalVariableTargetNode (location: (1,0)-(1,3)) - │ │ ├── flags: ∅ - │ │ ├── name: :foo - │ │ └── depth: 0 - │ └── @ LocalVariableTargetNode (location: (1,5)-(1,8)) - │ ├── flags: ∅ - │ ├── name: :bar - │ └── depth: 0 - ├── rest: ∅ - ├── rights: (length: 0) - ├── lparen_loc: ∅ - ├── rparen_loc: ∅ - ├── operator_loc: (1,9)-(1,10) = "=" - └── value: - @ CallNode (location: (1,11)-(1,16)) - ├── flags: ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :m - ├── message_loc: (1,11)-(1,12) = "m" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,13)-(1,16)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ LocalVariableReadNode (location: (1,13)-(1,16)) - │ ├── flags: ∅ - │ ├── name: :foo - │ └── depth: 0 - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/whitequark/masgn_const.txt b/test/prism/snapshots/whitequark/masgn_const.txt deleted file mode 100644 index 160b0b0f033552..00000000000000 --- a/test/prism/snapshots/whitequark/masgn_const.txt +++ /dev/null @@ -1,55 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,18)) -├── flags: ∅ -├── locals: [:foo] -└── statements: - @ StatementsNode (location: (1,0)-(3,18)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ MultiWriteNode (location: (1,0)-(1,14)) - │ ├── flags: newline - │ ├── lefts: (length: 2) - │ │ ├── @ ConstantPathTargetNode (location: (1,0)-(1,3)) - │ │ │ ├── flags: ∅ - │ │ │ ├── parent: ∅ - │ │ │ ├── name: :A - │ │ │ ├── delimiter_loc: (1,0)-(1,2) = "::" - │ │ │ └── name_loc: (1,2)-(1,3) = "A" - │ │ └── @ LocalVariableTargetNode (location: (1,5)-(1,8)) - │ │ ├── flags: ∅ - │ │ ├── name: :foo - │ │ └── depth: 0 - │ ├── rest: ∅ - │ ├── rights: (length: 0) - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── operator_loc: (1,9)-(1,10) = "=" - │ └── value: - │ @ LocalVariableReadNode (location: (1,11)-(1,14)) - │ ├── flags: ∅ - │ ├── name: :foo - │ └── depth: 0 - └── @ MultiWriteNode (location: (3,0)-(3,18)) - ├── flags: newline - ├── lefts: (length: 2) - │ ├── @ ConstantPathTargetNode (location: (3,0)-(3,7)) - │ │ ├── flags: ∅ - │ │ ├── parent: - │ │ │ @ SelfNode (location: (3,0)-(3,4)) - │ │ │ └── flags: ∅ - │ │ ├── name: :A - │ │ ├── delimiter_loc: (3,4)-(3,6) = "::" - │ │ └── name_loc: (3,6)-(3,7) = "A" - │ └── @ LocalVariableTargetNode (location: (3,9)-(3,12)) - │ ├── flags: ∅ - │ ├── name: :foo - │ └── depth: 0 - ├── rest: ∅ - ├── rights: (length: 0) - ├── lparen_loc: ∅ - ├── rparen_loc: ∅ - ├── operator_loc: (3,13)-(3,14) = "=" - └── value: - @ LocalVariableReadNode (location: (3,15)-(3,18)) - ├── flags: ∅ - ├── name: :foo - └── depth: 0 diff --git a/test/prism/snapshots/whitequark/masgn_nested.txt b/test/prism/snapshots/whitequark/masgn_nested.txt deleted file mode 100644 index db92f24ab5f62d..00000000000000 --- a/test/prism/snapshots/whitequark/masgn_nested.txt +++ /dev/null @@ -1,77 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,15)) -├── flags: ∅ -├── locals: [:b, :a, :c] -└── statements: - @ StatementsNode (location: (1,0)-(3,15)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ MultiWriteNode (location: (1,0)-(1,13)) - │ ├── flags: newline - │ ├── lefts: (length: 1) - │ │ └── @ MultiTargetNode (location: (1,1)-(1,6)) - │ │ ├── flags: ∅ - │ │ ├── lefts: (length: 1) - │ │ │ └── @ LocalVariableTargetNode (location: (1,2)-(1,3)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :b - │ │ │ └── depth: 0 - │ │ ├── rest: - │ │ │ @ ImplicitRestNode (location: (1,3)-(1,4)) - │ │ │ └── flags: ∅ - │ │ ├── rights: (length: 0) - │ │ ├── lparen_loc: (1,1)-(1,2) = "(" - │ │ └── rparen_loc: (1,5)-(1,6) = ")" - │ ├── rest: ∅ - │ ├── rights: (length: 0) - │ ├── lparen_loc: (1,0)-(1,1) = "(" - │ ├── rparen_loc: (1,6)-(1,7) = ")" - │ ├── operator_loc: (1,8)-(1,9) = "=" - │ └── value: - │ @ CallNode (location: (1,10)-(1,13)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (1,10)-(1,13) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── @ MultiWriteNode (location: (3,0)-(3,15)) - ├── flags: newline - ├── lefts: (length: 2) - │ ├── @ LocalVariableTargetNode (location: (3,0)-(3,1)) - │ │ ├── flags: ∅ - │ │ ├── name: :a - │ │ └── depth: 0 - │ └── @ MultiTargetNode (location: (3,3)-(3,9)) - │ ├── flags: ∅ - │ ├── lefts: (length: 2) - │ │ ├── @ LocalVariableTargetNode (location: (3,4)-(3,5)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :b - │ │ │ └── depth: 0 - │ │ └── @ LocalVariableTargetNode (location: (3,7)-(3,8)) - │ │ ├── flags: ∅ - │ │ ├── name: :c - │ │ └── depth: 0 - │ ├── rest: ∅ - │ ├── rights: (length: 0) - │ ├── lparen_loc: (3,3)-(3,4) = "(" - │ └── rparen_loc: (3,8)-(3,9) = ")" - ├── rest: ∅ - ├── rights: (length: 0) - ├── lparen_loc: ∅ - ├── rparen_loc: ∅ - ├── operator_loc: (3,10)-(3,11) = "=" - └── value: - @ CallNode (location: (3,12)-(3,15)) - ├── flags: variable_call, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :foo - ├── message_loc: (3,12)-(3,15) = "foo" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/whitequark/masgn_splat.txt b/test/prism/snapshots/whitequark/masgn_splat.txt deleted file mode 100644 index e50174d9de5dd9..00000000000000 --- a/test/prism/snapshots/whitequark/masgn_splat.txt +++ /dev/null @@ -1,323 +0,0 @@ -@ ProgramNode (location: (1,0)-(19,16)) -├── flags: ∅ -├── locals: [:c, :d, :b, :a] -└── statements: - @ StatementsNode (location: (1,0)-(19,16)) - ├── flags: ∅ - └── body: (length: 10) - ├── @ MultiWriteNode (location: (1,0)-(1,7)) - │ ├── flags: newline - │ ├── lefts: (length: 0) - │ ├── rest: - │ │ @ SplatNode (location: (1,0)-(1,1)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (1,0)-(1,1) = "*" - │ │ └── expression: ∅ - │ ├── rights: (length: 0) - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── operator_loc: (1,2)-(1,3) = "=" - │ └── value: - │ @ CallNode (location: (1,4)-(1,7)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :bar - │ ├── message_loc: (1,4)-(1,7) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ MultiWriteNode (location: (3,0)-(3,13)) - │ ├── flags: newline - │ ├── lefts: (length: 0) - │ ├── rest: - │ │ @ SplatNode (location: (3,0)-(3,1)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (3,0)-(3,1) = "*" - │ │ └── expression: ∅ - │ ├── rights: (length: 2) - │ │ ├── @ LocalVariableTargetNode (location: (3,3)-(3,4)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :c - │ │ │ └── depth: 0 - │ │ └── @ LocalVariableTargetNode (location: (3,6)-(3,7)) - │ │ ├── flags: ∅ - │ │ ├── name: :d - │ │ └── depth: 0 - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── operator_loc: (3,8)-(3,9) = "=" - │ └── value: - │ @ CallNode (location: (3,10)-(3,13)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :bar - │ ├── message_loc: (3,10)-(3,13) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ MultiWriteNode (location: (5,0)-(5,8)) - │ ├── flags: newline - │ ├── lefts: (length: 0) - │ ├── rest: - │ │ @ SplatNode (location: (5,0)-(5,2)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (5,0)-(5,1) = "*" - │ │ └── expression: - │ │ @ LocalVariableTargetNode (location: (5,1)-(5,2)) - │ │ ├── flags: ∅ - │ │ ├── name: :b - │ │ └── depth: 0 - │ ├── rights: (length: 0) - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── operator_loc: (5,3)-(5,4) = "=" - │ └── value: - │ @ CallNode (location: (5,5)-(5,8)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :bar - │ ├── message_loc: (5,5)-(5,8) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ MultiWriteNode (location: (7,0)-(7,11)) - │ ├── flags: newline - │ ├── lefts: (length: 0) - │ ├── rest: - │ │ @ SplatNode (location: (7,0)-(7,2)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (7,0)-(7,1) = "*" - │ │ └── expression: - │ │ @ LocalVariableTargetNode (location: (7,1)-(7,2)) - │ │ ├── flags: ∅ - │ │ ├── name: :b - │ │ └── depth: 0 - │ ├── rights: (length: 1) - │ │ └── @ LocalVariableTargetNode (location: (7,4)-(7,5)) - │ │ ├── flags: ∅ - │ │ ├── name: :c - │ │ └── depth: 0 - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── operator_loc: (7,6)-(7,7) = "=" - │ └── value: - │ @ CallNode (location: (7,8)-(7,11)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :bar - │ ├── message_loc: (7,8)-(7,11) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ MultiWriteNode (location: (9,0)-(9,18)) - │ ├── flags: newline - │ ├── lefts: (length: 2) - │ │ ├── @ InstanceVariableTargetNode (location: (9,0)-(9,4)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :@foo - │ │ └── @ ClassVariableTargetNode (location: (9,6)-(9,11)) - │ │ ├── flags: ∅ - │ │ └── name: :@@bar - │ ├── rest: ∅ - │ ├── rights: (length: 0) - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── operator_loc: (9,12)-(9,13) = "=" - │ └── value: - │ @ ArrayNode (location: (9,14)-(9,18)) - │ ├── flags: contains_splat - │ ├── elements: (length: 1) - │ │ └── @ SplatNode (location: (9,14)-(9,18)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (9,14)-(9,15) = "*" - │ │ └── expression: - │ │ @ CallNode (location: (9,15)-(9,18)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (9,15)-(9,18) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── opening_loc: ∅ - │ └── closing_loc: ∅ - ├── @ MultiWriteNode (location: (11,0)-(11,10)) - │ ├── flags: newline - │ ├── lefts: (length: 1) - │ │ └── @ LocalVariableTargetNode (location: (11,0)-(11,1)) - │ │ ├── flags: ∅ - │ │ ├── name: :a - │ │ └── depth: 0 - │ ├── rest: - │ │ @ SplatNode (location: (11,3)-(11,4)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (11,3)-(11,4) = "*" - │ │ └── expression: ∅ - │ ├── rights: (length: 0) - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── operator_loc: (11,5)-(11,6) = "=" - │ └── value: - │ @ CallNode (location: (11,7)-(11,10)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :bar - │ ├── message_loc: (11,7)-(11,10) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ MultiWriteNode (location: (13,0)-(13,13)) - │ ├── flags: newline - │ ├── lefts: (length: 1) - │ │ └── @ LocalVariableTargetNode (location: (13,0)-(13,1)) - │ │ ├── flags: ∅ - │ │ ├── name: :a - │ │ └── depth: 0 - │ ├── rest: - │ │ @ SplatNode (location: (13,3)-(13,4)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (13,3)-(13,4) = "*" - │ │ └── expression: ∅ - │ ├── rights: (length: 1) - │ │ └── @ LocalVariableTargetNode (location: (13,6)-(13,7)) - │ │ ├── flags: ∅ - │ │ ├── name: :c - │ │ └── depth: 0 - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── operator_loc: (13,8)-(13,9) = "=" - │ └── value: - │ @ CallNode (location: (13,10)-(13,13)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :bar - │ ├── message_loc: (13,10)-(13,13) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ MultiWriteNode (location: (15,0)-(15,11)) - │ ├── flags: newline - │ ├── lefts: (length: 1) - │ │ └── @ LocalVariableTargetNode (location: (15,0)-(15,1)) - │ │ ├── flags: ∅ - │ │ ├── name: :a - │ │ └── depth: 0 - │ ├── rest: - │ │ @ SplatNode (location: (15,3)-(15,5)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (15,3)-(15,4) = "*" - │ │ └── expression: - │ │ @ LocalVariableTargetNode (location: (15,4)-(15,5)) - │ │ ├── flags: ∅ - │ │ ├── name: :b - │ │ └── depth: 0 - │ ├── rights: (length: 0) - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── operator_loc: (15,6)-(15,7) = "=" - │ └── value: - │ @ CallNode (location: (15,8)-(15,11)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :bar - │ ├── message_loc: (15,8)-(15,11) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ MultiWriteNode (location: (17,0)-(17,14)) - │ ├── flags: newline - │ ├── lefts: (length: 1) - │ │ └── @ LocalVariableTargetNode (location: (17,0)-(17,1)) - │ │ ├── flags: ∅ - │ │ ├── name: :a - │ │ └── depth: 0 - │ ├── rest: - │ │ @ SplatNode (location: (17,3)-(17,5)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (17,3)-(17,4) = "*" - │ │ └── expression: - │ │ @ LocalVariableTargetNode (location: (17,4)-(17,5)) - │ │ ├── flags: ∅ - │ │ ├── name: :b - │ │ └── depth: 0 - │ ├── rights: (length: 1) - │ │ └── @ LocalVariableTargetNode (location: (17,7)-(17,8)) - │ │ ├── flags: ∅ - │ │ ├── name: :c - │ │ └── depth: 0 - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── operator_loc: (17,9)-(17,10) = "=" - │ └── value: - │ @ CallNode (location: (17,11)-(17,14)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :bar - │ ├── message_loc: (17,11)-(17,14) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── @ MultiWriteNode (location: (19,0)-(19,16)) - ├── flags: newline - ├── lefts: (length: 2) - │ ├── @ LocalVariableTargetNode (location: (19,0)-(19,1)) - │ │ ├── flags: ∅ - │ │ ├── name: :a - │ │ └── depth: 0 - │ └── @ LocalVariableTargetNode (location: (19,3)-(19,4)) - │ ├── flags: ∅ - │ ├── name: :b - │ └── depth: 0 - ├── rest: ∅ - ├── rights: (length: 0) - ├── lparen_loc: ∅ - ├── rparen_loc: ∅ - ├── operator_loc: (19,5)-(19,6) = "=" - └── value: - @ ArrayNode (location: (19,7)-(19,16)) - ├── flags: contains_splat - ├── elements: (length: 2) - │ ├── @ SplatNode (location: (19,7)-(19,11)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (19,7)-(19,8) = "*" - │ │ └── expression: - │ │ @ CallNode (location: (19,8)-(19,11)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (19,8)-(19,11) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── @ CallNode (location: (19,13)-(19,16)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :bar - │ ├── message_loc: (19,13)-(19,16) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── opening_loc: ∅ - └── closing_loc: ∅ diff --git a/test/prism/snapshots/whitequark/method_definition_in_while_cond.txt b/test/prism/snapshots/whitequark/method_definition_in_while_cond.txt deleted file mode 100644 index 34a55fbe02f7b9..00000000000000 --- a/test/prism/snapshots/whitequark/method_definition_in_while_cond.txt +++ /dev/null @@ -1,223 +0,0 @@ -@ ProgramNode (location: (1,0)-(7,47)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(7,47)) - ├── flags: ∅ - └── body: (length: 4) - ├── @ WhileNode (location: (1,0)-(1,45)) - │ ├── flags: newline - │ ├── keyword_loc: (1,0)-(1,5) = "while" - │ ├── closing_loc: (1,42)-(1,45) = "end" - │ ├── predicate: - │ │ @ DefNode (location: (1,6)-(1,33)) - │ │ ├── flags: ∅ - │ │ ├── name: :foo - │ │ ├── name_loc: (1,10)-(1,13) = "foo" - │ │ ├── receiver: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (1,14)-(1,28)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 0) - │ │ │ ├── optionals: (length: 1) - │ │ │ │ └── @ OptionalParameterNode (location: (1,14)-(1,28)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :a - │ │ │ │ ├── name_loc: (1,14)-(1,15) = "a" - │ │ │ │ ├── operator_loc: (1,16)-(1,17) = "=" - │ │ │ │ └── value: - │ │ │ │ @ CallNode (location: (1,18)-(1,28)) - │ │ │ │ ├── flags: ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :tap - │ │ │ │ ├── message_loc: (1,18)-(1,21) = "tap" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: - │ │ │ │ @ BlockNode (location: (1,22)-(1,28)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── locals: [] - │ │ │ │ ├── parameters: ∅ - │ │ │ │ ├── body: ∅ - │ │ │ │ ├── opening_loc: (1,22)-(1,24) = "do" - │ │ │ │ └── closing_loc: (1,25)-(1,28) = "end" - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── body: ∅ - │ │ ├── locals: [:a] - │ │ ├── def_keyword_loc: (1,6)-(1,9) = "def" - │ │ ├── operator_loc: ∅ - │ │ ├── lparen_loc: ∅ - │ │ ├── rparen_loc: ∅ - │ │ ├── equal_loc: ∅ - │ │ └── end_keyword_loc: (1,30)-(1,33) = "end" - │ └── statements: - │ @ StatementsNode (location: (1,35)-(1,40)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ BreakNode (location: (1,35)-(1,40)) - │ ├── flags: newline - │ ├── arguments: ∅ - │ └── keyword_loc: (1,35)-(1,40) = "break" - ├── @ WhileNode (location: (3,0)-(3,42)) - │ ├── flags: newline - │ ├── keyword_loc: (3,0)-(3,5) = "while" - │ ├── closing_loc: (3,39)-(3,42) = "end" - │ ├── predicate: - │ │ @ DefNode (location: (3,6)-(3,30)) - │ │ ├── flags: ∅ - │ │ ├── name: :foo - │ │ ├── name_loc: (3,10)-(3,13) = "foo" - │ │ ├── receiver: ∅ - │ │ ├── parameters: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (3,15)-(3,25)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (3,15)-(3,25)) - │ │ │ ├── flags: newline, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :tap - │ │ │ ├── message_loc: (3,15)-(3,18) = "tap" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: - │ │ │ @ BlockNode (location: (3,19)-(3,25)) - │ │ │ ├── flags: ∅ - │ │ │ ├── locals: [] - │ │ │ ├── parameters: ∅ - │ │ │ ├── body: ∅ - │ │ │ ├── opening_loc: (3,19)-(3,21) = "do" - │ │ │ └── closing_loc: (3,22)-(3,25) = "end" - │ │ ├── locals: [] - │ │ ├── def_keyword_loc: (3,6)-(3,9) = "def" - │ │ ├── operator_loc: ∅ - │ │ ├── lparen_loc: ∅ - │ │ ├── rparen_loc: ∅ - │ │ ├── equal_loc: ∅ - │ │ └── end_keyword_loc: (3,27)-(3,30) = "end" - │ └── statements: - │ @ StatementsNode (location: (3,32)-(3,37)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ BreakNode (location: (3,32)-(3,37)) - │ ├── flags: newline - │ ├── arguments: ∅ - │ └── keyword_loc: (3,32)-(3,37) = "break" - ├── @ WhileNode (location: (5,0)-(5,50)) - │ ├── flags: newline - │ ├── keyword_loc: (5,0)-(5,5) = "while" - │ ├── closing_loc: (5,47)-(5,50) = "end" - │ ├── predicate: - │ │ @ DefNode (location: (5,6)-(5,38)) - │ │ ├── flags: ∅ - │ │ ├── name: :foo - │ │ ├── name_loc: (5,15)-(5,18) = "foo" - │ │ ├── receiver: - │ │ │ @ SelfNode (location: (5,10)-(5,14)) - │ │ │ └── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (5,19)-(5,33)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 0) - │ │ │ ├── optionals: (length: 1) - │ │ │ │ └── @ OptionalParameterNode (location: (5,19)-(5,33)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :a - │ │ │ │ ├── name_loc: (5,19)-(5,20) = "a" - │ │ │ │ ├── operator_loc: (5,21)-(5,22) = "=" - │ │ │ │ └── value: - │ │ │ │ @ CallNode (location: (5,23)-(5,33)) - │ │ │ │ ├── flags: ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :tap - │ │ │ │ ├── message_loc: (5,23)-(5,26) = "tap" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: - │ │ │ │ @ BlockNode (location: (5,27)-(5,33)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── locals: [] - │ │ │ │ ├── parameters: ∅ - │ │ │ │ ├── body: ∅ - │ │ │ │ ├── opening_loc: (5,27)-(5,29) = "do" - │ │ │ │ └── closing_loc: (5,30)-(5,33) = "end" - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── body: ∅ - │ │ ├── locals: [:a] - │ │ ├── def_keyword_loc: (5,6)-(5,9) = "def" - │ │ ├── operator_loc: (5,14)-(5,15) = "." - │ │ ├── lparen_loc: ∅ - │ │ ├── rparen_loc: ∅ - │ │ ├── equal_loc: ∅ - │ │ └── end_keyword_loc: (5,35)-(5,38) = "end" - │ └── statements: - │ @ StatementsNode (location: (5,40)-(5,45)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ BreakNode (location: (5,40)-(5,45)) - │ ├── flags: newline - │ ├── arguments: ∅ - │ └── keyword_loc: (5,40)-(5,45) = "break" - └── @ WhileNode (location: (7,0)-(7,47)) - ├── flags: newline - ├── keyword_loc: (7,0)-(7,5) = "while" - ├── closing_loc: (7,44)-(7,47) = "end" - ├── predicate: - │ @ DefNode (location: (7,6)-(7,35)) - │ ├── flags: ∅ - │ ├── name: :foo - │ ├── name_loc: (7,15)-(7,18) = "foo" - │ ├── receiver: - │ │ @ SelfNode (location: (7,10)-(7,14)) - │ │ └── flags: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (7,20)-(7,30)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (7,20)-(7,30)) - │ │ ├── flags: newline, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :tap - │ │ ├── message_loc: (7,20)-(7,23) = "tap" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: - │ │ @ BlockNode (location: (7,24)-(7,30)) - │ │ ├── flags: ∅ - │ │ ├── locals: [] - │ │ ├── parameters: ∅ - │ │ ├── body: ∅ - │ │ ├── opening_loc: (7,24)-(7,26) = "do" - │ │ └── closing_loc: (7,27)-(7,30) = "end" - │ ├── locals: [] - │ ├── def_keyword_loc: (7,6)-(7,9) = "def" - │ ├── operator_loc: (7,14)-(7,15) = "." - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (7,32)-(7,35) = "end" - └── statements: - @ StatementsNode (location: (7,37)-(7,42)) - ├── flags: ∅ - └── body: (length: 1) - └── @ BreakNode (location: (7,37)-(7,42)) - ├── flags: newline - ├── arguments: ∅ - └── keyword_loc: (7,37)-(7,42) = "break" diff --git a/test/prism/snapshots/whitequark/module.txt b/test/prism/snapshots/whitequark/module.txt deleted file mode 100644 index 2989be01094053..00000000000000 --- a/test/prism/snapshots/whitequark/module.txt +++ /dev/null @@ -1,18 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,15)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,15)) - ├── flags: ∅ - └── body: (length: 1) - └── @ ModuleNode (location: (1,0)-(1,15)) - ├── flags: newline - ├── locals: [] - ├── module_keyword_loc: (1,0)-(1,6) = "module" - ├── constant_path: - │ @ ConstantReadNode (location: (1,7)-(1,10)) - │ ├── flags: ∅ - │ └── name: :Foo - ├── body: ∅ - ├── end_keyword_loc: (1,12)-(1,15) = "end" - └── name: :Foo diff --git a/test/prism/snapshots/whitequark/multiple_pattern_matches.txt b/test/prism/snapshots/whitequark/multiple_pattern_matches.txt deleted file mode 100644 index 24cf259e08f7d9..00000000000000 --- a/test/prism/snapshots/whitequark/multiple_pattern_matches.txt +++ /dev/null @@ -1,203 +0,0 @@ -@ ProgramNode (location: (1,0)-(5,12)) -├── flags: ∅ -├── locals: [:a] -└── statements: - @ StatementsNode (location: (1,0)-(5,12)) - ├── flags: ∅ - └── body: (length: 4) - ├── @ MatchRequiredNode (location: (1,0)-(1,12)) - │ ├── flags: newline - │ ├── value: - │ │ @ HashNode (location: (1,0)-(1,6)) - │ │ ├── flags: static_literal - │ │ ├── opening_loc: (1,0)-(1,1) = "{" - │ │ ├── elements: (length: 1) - │ │ │ └── @ AssocNode (location: (1,1)-(1,5)) - │ │ │ ├── flags: static_literal - │ │ │ ├── key: - │ │ │ │ @ SymbolNode (location: (1,1)-(1,3)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── value_loc: (1,1)-(1,2) = "a" - │ │ │ │ ├── closing_loc: (1,2)-(1,3) = ":" - │ │ │ │ └── unescaped: "a" - │ │ │ ├── value: - │ │ │ │ @ IntegerNode (location: (1,4)-(1,5)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 0 - │ │ │ └── operator_loc: ∅ - │ │ └── closing_loc: (1,5)-(1,6) = "}" - │ ├── pattern: - │ │ @ HashPatternNode (location: (1,10)-(1,12)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── elements: (length: 1) - │ │ │ └── @ AssocNode (location: (1,10)-(1,12)) - │ │ │ ├── flags: ∅ - │ │ │ ├── key: - │ │ │ │ @ SymbolNode (location: (1,10)-(1,12)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── value_loc: (1,10)-(1,11) = "a" - │ │ │ │ ├── closing_loc: (1,11)-(1,12) = ":" - │ │ │ │ └── unescaped: "a" - │ │ │ ├── value: - │ │ │ │ @ ImplicitNode (location: (1,10)-(1,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── value: - │ │ │ │ @ LocalVariableTargetNode (location: (1,10)-(1,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :a - │ │ │ │ └── depth: 0 - │ │ │ └── operator_loc: ∅ - │ │ ├── rest: ∅ - │ │ ├── opening_loc: ∅ - │ │ └── closing_loc: ∅ - │ └── operator_loc: (1,7)-(1,9) = "=>" - ├── @ MatchRequiredNode (location: (2,0)-(2,12)) - │ ├── flags: newline - │ ├── value: - │ │ @ HashNode (location: (2,0)-(2,6)) - │ │ ├── flags: static_literal - │ │ ├── opening_loc: (2,0)-(2,1) = "{" - │ │ ├── elements: (length: 1) - │ │ │ └── @ AssocNode (location: (2,1)-(2,5)) - │ │ │ ├── flags: static_literal - │ │ │ ├── key: - │ │ │ │ @ SymbolNode (location: (2,1)-(2,3)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── value_loc: (2,1)-(2,2) = "a" - │ │ │ │ ├── closing_loc: (2,2)-(2,3) = ":" - │ │ │ │ └── unescaped: "a" - │ │ │ ├── value: - │ │ │ │ @ IntegerNode (location: (2,4)-(2,5)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 0 - │ │ │ └── operator_loc: ∅ - │ │ └── closing_loc: (2,5)-(2,6) = "}" - │ ├── pattern: - │ │ @ HashPatternNode (location: (2,10)-(2,12)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── elements: (length: 1) - │ │ │ └── @ AssocNode (location: (2,10)-(2,12)) - │ │ │ ├── flags: ∅ - │ │ │ ├── key: - │ │ │ │ @ SymbolNode (location: (2,10)-(2,12)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── value_loc: (2,10)-(2,11) = "a" - │ │ │ │ ├── closing_loc: (2,11)-(2,12) = ":" - │ │ │ │ └── unescaped: "a" - │ │ │ ├── value: - │ │ │ │ @ ImplicitNode (location: (2,10)-(2,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── value: - │ │ │ │ @ LocalVariableTargetNode (location: (2,10)-(2,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :a - │ │ │ │ └── depth: 0 - │ │ │ └── operator_loc: ∅ - │ │ ├── rest: ∅ - │ │ ├── opening_loc: ∅ - │ │ └── closing_loc: ∅ - │ └── operator_loc: (2,7)-(2,9) = "=>" - ├── @ MatchPredicateNode (location: (4,0)-(4,12)) - │ ├── flags: newline - │ ├── value: - │ │ @ HashNode (location: (4,0)-(4,6)) - │ │ ├── flags: static_literal - │ │ ├── opening_loc: (4,0)-(4,1) = "{" - │ │ ├── elements: (length: 1) - │ │ │ └── @ AssocNode (location: (4,1)-(4,5)) - │ │ │ ├── flags: static_literal - │ │ │ ├── key: - │ │ │ │ @ SymbolNode (location: (4,1)-(4,3)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── value_loc: (4,1)-(4,2) = "a" - │ │ │ │ ├── closing_loc: (4,2)-(4,3) = ":" - │ │ │ │ └── unescaped: "a" - │ │ │ ├── value: - │ │ │ │ @ IntegerNode (location: (4,4)-(4,5)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 0 - │ │ │ └── operator_loc: ∅ - │ │ └── closing_loc: (4,5)-(4,6) = "}" - │ ├── pattern: - │ │ @ HashPatternNode (location: (4,10)-(4,12)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── elements: (length: 1) - │ │ │ └── @ AssocNode (location: (4,10)-(4,12)) - │ │ │ ├── flags: ∅ - │ │ │ ├── key: - │ │ │ │ @ SymbolNode (location: (4,10)-(4,12)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── value_loc: (4,10)-(4,11) = "a" - │ │ │ │ ├── closing_loc: (4,11)-(4,12) = ":" - │ │ │ │ └── unescaped: "a" - │ │ │ ├── value: - │ │ │ │ @ ImplicitNode (location: (4,10)-(4,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── value: - │ │ │ │ @ LocalVariableTargetNode (location: (4,10)-(4,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :a - │ │ │ │ └── depth: 0 - │ │ │ └── operator_loc: ∅ - │ │ ├── rest: ∅ - │ │ ├── opening_loc: ∅ - │ │ └── closing_loc: ∅ - │ └── operator_loc: (4,7)-(4,9) = "in" - └── @ MatchPredicateNode (location: (5,0)-(5,12)) - ├── flags: newline - ├── value: - │ @ HashNode (location: (5,0)-(5,6)) - │ ├── flags: static_literal - │ ├── opening_loc: (5,0)-(5,1) = "{" - │ ├── elements: (length: 1) - │ │ └── @ AssocNode (location: (5,1)-(5,5)) - │ │ ├── flags: static_literal - │ │ ├── key: - │ │ │ @ SymbolNode (location: (5,1)-(5,3)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (5,1)-(5,2) = "a" - │ │ │ ├── closing_loc: (5,2)-(5,3) = ":" - │ │ │ └── unescaped: "a" - │ │ ├── value: - │ │ │ @ IntegerNode (location: (5,4)-(5,5)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 0 - │ │ └── operator_loc: ∅ - │ └── closing_loc: (5,5)-(5,6) = "}" - ├── pattern: - │ @ HashPatternNode (location: (5,10)-(5,12)) - │ ├── flags: ∅ - │ ├── constant: ∅ - │ ├── elements: (length: 1) - │ │ └── @ AssocNode (location: (5,10)-(5,12)) - │ │ ├── flags: ∅ - │ │ ├── key: - │ │ │ @ SymbolNode (location: (5,10)-(5,12)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (5,10)-(5,11) = "a" - │ │ │ ├── closing_loc: (5,11)-(5,12) = ":" - │ │ │ └── unescaped: "a" - │ │ ├── value: - │ │ │ @ ImplicitNode (location: (5,10)-(5,11)) - │ │ │ ├── flags: ∅ - │ │ │ └── value: - │ │ │ @ LocalVariableTargetNode (location: (5,10)-(5,11)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :a - │ │ │ └── depth: 0 - │ │ └── operator_loc: ∅ - │ ├── rest: ∅ - │ ├── opening_loc: ∅ - │ └── closing_loc: ∅ - └── operator_loc: (5,7)-(5,9) = "in" diff --git a/test/prism/snapshots/whitequark/newline_in_hash_argument.txt b/test/prism/snapshots/whitequark/newline_in_hash_argument.txt deleted file mode 100644 index 2a7d06102d9faf..00000000000000 --- a/test/prism/snapshots/whitequark/newline_in_hash_argument.txt +++ /dev/null @@ -1,182 +0,0 @@ -@ ProgramNode (location: (1,0)-(14,1)) -├── flags: ∅ -├── locals: [:a, :b] -└── statements: - @ StatementsNode (location: (1,0)-(14,1)) - ├── flags: ∅ - └── body: (length: 3) - ├── @ CaseMatchNode (location: (1,0)-(8,3)) - │ ├── flags: newline - │ ├── predicate: - │ │ @ CallNode (location: (1,5)-(1,8)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (1,5)-(1,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── conditions: (length: 2) - │ │ ├── @ InNode (location: (2,0)-(4,4)) - │ │ │ ├── flags: ∅ - │ │ │ ├── pattern: - │ │ │ │ @ HashPatternNode (location: (2,3)-(2,5)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── constant: ∅ - │ │ │ │ ├── elements: (length: 1) - │ │ │ │ │ └── @ AssocNode (location: (2,3)-(2,5)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── key: - │ │ │ │ │ │ @ SymbolNode (location: (2,3)-(2,5)) - │ │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ │ ├── value_loc: (2,3)-(2,4) = "a" - │ │ │ │ │ │ ├── closing_loc: (2,4)-(2,5) = ":" - │ │ │ │ │ │ └── unescaped: "a" - │ │ │ │ │ ├── value: - │ │ │ │ │ │ @ ImplicitNode (location: (2,3)-(2,4)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ └── value: - │ │ │ │ │ │ @ LocalVariableTargetNode (location: (2,3)-(2,4)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ ├── name: :a - │ │ │ │ │ │ └── depth: 0 - │ │ │ │ │ └── operator_loc: ∅ - │ │ │ │ ├── rest: ∅ - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ └── closing_loc: ∅ - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (3,0)-(4,4)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 2) - │ │ │ │ ├── @ IntegerNode (location: (3,0)-(3,1)) - │ │ │ │ │ ├── flags: newline, static_literal, decimal - │ │ │ │ │ └── value: 0 - │ │ │ │ └── @ TrueNode (location: (4,0)-(4,4)) - │ │ │ │ └── flags: newline, static_literal - │ │ │ ├── in_loc: (2,0)-(2,2) = "in" - │ │ │ └── then_loc: ∅ - │ │ └── @ InNode (location: (5,0)-(7,4)) - │ │ ├── flags: ∅ - │ │ ├── pattern: - │ │ │ @ HashPatternNode (location: (5,3)-(5,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── constant: ∅ - │ │ │ ├── elements: (length: 1) - │ │ │ │ └── @ AssocNode (location: (5,3)-(5,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── key: - │ │ │ │ │ @ SymbolNode (location: (5,3)-(5,7)) - │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ │ ├── opening_loc: (5,3)-(5,4) = "\"" - │ │ │ │ │ ├── value_loc: (5,4)-(5,5) = "b" - │ │ │ │ │ ├── closing_loc: (5,5)-(5,7) = "\":" - │ │ │ │ │ └── unescaped: "b" - │ │ │ │ ├── value: - │ │ │ │ │ @ ImplicitNode (location: (5,4)-(5,5)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── value: - │ │ │ │ │ @ LocalVariableTargetNode (location: (5,4)-(5,5)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── name: :b - │ │ │ │ │ └── depth: 0 - │ │ │ │ └── operator_loc: ∅ - │ │ │ ├── rest: ∅ - │ │ │ ├── opening_loc: ∅ - │ │ │ └── closing_loc: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (6,0)-(7,4)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 2) - │ │ │ ├── @ IntegerNode (location: (6,0)-(6,1)) - │ │ │ │ ├── flags: newline, static_literal, decimal - │ │ │ │ └── value: 0 - │ │ │ └── @ TrueNode (location: (7,0)-(7,4)) - │ │ │ └── flags: newline, static_literal - │ │ ├── in_loc: (5,0)-(5,2) = "in" - │ │ └── then_loc: ∅ - │ ├── else_clause: ∅ - │ ├── case_keyword_loc: (1,0)-(1,4) = "case" - │ └── end_keyword_loc: (8,0)-(8,3) = "end" - ├── @ CallNode (location: (10,0)-(11,1)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (10,0)-(10,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :obj - │ │ ├── message_loc: (10,0)-(10,3) = "obj" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (10,3)-(10,4) = "." - │ ├── name: :set - │ ├── message_loc: (10,4)-(10,7) = "set" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (10,8)-(11,1)) - │ │ ├── flags: contains_keywords - │ │ └── arguments: (length: 1) - │ │ └── @ KeywordHashNode (location: (10,8)-(11,1)) - │ │ ├── flags: symbol_keys - │ │ └── elements: (length: 1) - │ │ └── @ AssocNode (location: (10,8)-(11,1)) - │ │ ├── flags: static_literal - │ │ ├── key: - │ │ │ @ SymbolNode (location: (10,8)-(10,14)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (10,8)-(10,9) = "\"" - │ │ │ ├── value_loc: (10,9)-(10,12) = "foo" - │ │ │ ├── closing_loc: (10,12)-(10,14) = "\":" - │ │ │ └── unescaped: "foo" - │ │ ├── value: - │ │ │ @ IntegerNode (location: (11,0)-(11,1)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── operator_loc: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── @ CallNode (location: (13,0)-(14,1)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (13,0)-(13,3)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :obj - │ ├── message_loc: (13,0)-(13,3) = "obj" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: (13,3)-(13,4) = "." - ├── name: :set - ├── message_loc: (13,4)-(13,7) = "set" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (13,8)-(14,1)) - │ ├── flags: contains_keywords - │ └── arguments: (length: 1) - │ └── @ KeywordHashNode (location: (13,8)-(14,1)) - │ ├── flags: symbol_keys - │ └── elements: (length: 1) - │ └── @ AssocNode (location: (13,8)-(14,1)) - │ ├── flags: static_literal - │ ├── key: - │ │ @ SymbolNode (location: (13,8)-(13,12)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: ∅ - │ │ ├── value_loc: (13,8)-(13,11) = "foo" - │ │ ├── closing_loc: (13,11)-(13,12) = ":" - │ │ └── unescaped: "foo" - │ ├── value: - │ │ @ IntegerNode (location: (14,0)-(14,1)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ └── operator_loc: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/whitequark/nil.txt b/test/prism/snapshots/whitequark/nil.txt deleted file mode 100644 index 39b9c2e8214e15..00000000000000 --- a/test/prism/snapshots/whitequark/nil.txt +++ /dev/null @@ -1,9 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ NilNode (location: (1,0)-(1,3)) - └── flags: newline, static_literal diff --git a/test/prism/snapshots/whitequark/nil_expression.txt b/test/prism/snapshots/whitequark/nil_expression.txt deleted file mode 100644 index 00e579864cc9f0..00000000000000 --- a/test/prism/snapshots/whitequark/nil_expression.txt +++ /dev/null @@ -1,20 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,9)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,9)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ ParenthesesNode (location: (1,0)-(1,2)) - │ ├── flags: newline - │ ├── body: ∅ - │ ├── opening_loc: (1,0)-(1,1) = "(" - │ └── closing_loc: (1,1)-(1,2) = ")" - └── @ BeginNode (location: (3,0)-(3,9)) - ├── flags: newline - ├── begin_keyword_loc: (3,0)-(3,5) = "begin" - ├── statements: ∅ - ├── rescue_clause: ∅ - ├── else_clause: ∅ - ├── ensure_clause: ∅ - └── end_keyword_loc: (3,6)-(3,9) = "end" diff --git a/test/prism/snapshots/whitequark/non_lvar_injecting_match.txt b/test/prism/snapshots/whitequark/non_lvar_injecting_match.txt deleted file mode 100644 index 0322423e63e80a..00000000000000 --- a/test/prism/snapshots/whitequark/non_lvar_injecting_match.txt +++ /dev/null @@ -1,48 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,28)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,28)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,28)) - ├── flags: newline - ├── receiver: - │ @ InterpolatedRegularExpressionNode (location: (1,0)-(1,19)) - │ ├── flags: ∅ - │ ├── opening_loc: (1,0)-(1,1) = "/" - │ ├── parts: (length: 2) - │ │ ├── @ EmbeddedStatementsNode (location: (1,1)-(1,5)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (1,1)-(1,3) = "\#{" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (1,3)-(1,4)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ IntegerNode (location: (1,3)-(1,4)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ └── closing_loc: (1,4)-(1,5) = "}" - │ │ └── @ StringNode (location: (1,5)-(1,18)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (1,5)-(1,18) = "(?bar)" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "(?bar)" - │ └── closing_loc: (1,18)-(1,19) = "/" - ├── call_operator_loc: ∅ - ├── name: :=~ - ├── message_loc: (1,20)-(1,22) = "=~" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,23)-(1,28)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ StringNode (location: (1,23)-(1,28)) - │ ├── flags: ∅ - │ ├── opening_loc: (1,23)-(1,24) = "'" - │ ├── content_loc: (1,24)-(1,27) = "bar" - │ ├── closing_loc: (1,27)-(1,28) = "'" - │ └── unescaped: "bar" - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/whitequark/not.txt b/test/prism/snapshots/whitequark/not.txt deleted file mode 100644 index b70792f1548166..00000000000000 --- a/test/prism/snapshots/whitequark/not.txt +++ /dev/null @@ -1,57 +0,0 @@ -@ ProgramNode (location: (1,0)-(5,8)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(5,8)) - ├── flags: ∅ - └── body: (length: 3) - ├── @ CallNode (location: (1,0)-(1,7)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (1,4)-(1,7)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (1,4)-(1,7) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :! - │ ├── message_loc: (1,0)-(1,3) = "not" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (3,0)-(3,5)) - │ ├── flags: newline - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :! - │ ├── message_loc: (3,0)-(3,3) = "not" - │ ├── opening_loc: (3,3)-(3,4) = "(" - │ ├── arguments: ∅ - │ ├── closing_loc: (3,4)-(3,5) = ")" - │ └── block: ∅ - └── @ CallNode (location: (5,0)-(5,8)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (5,4)-(5,7)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (5,4)-(5,7) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: ∅ - ├── name: :! - ├── message_loc: (5,0)-(5,3) = "not" - ├── opening_loc: (5,3)-(5,4) = "(" - ├── arguments: ∅ - ├── closing_loc: (5,7)-(5,8) = ")" - └── block: ∅ diff --git a/test/prism/snapshots/whitequark/not_cmd.txt b/test/prism/snapshots/whitequark/not_cmd.txt deleted file mode 100644 index 0ecd1cc67ee900..00000000000000 --- a/test/prism/snapshots/whitequark/not_cmd.txt +++ /dev/null @@ -1,40 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,9)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,9)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,9)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (1,4)-(1,9)) - │ ├── flags: ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :m - │ ├── message_loc: (1,4)-(1,5) = "m" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,6)-(1,9)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (1,6)-(1,9)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (1,6)-(1,9) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: ∅ - ├── name: :! - ├── message_loc: (1,0)-(1,3) = "not" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/whitequark/not_masgn__24.txt b/test/prism/snapshots/whitequark/not_masgn__24.txt deleted file mode 100644 index d84faadc50c222..00000000000000 --- a/test/prism/snapshots/whitequark/not_masgn__24.txt +++ /dev/null @@ -1,52 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,13)) -├── flags: ∅ -├── locals: [:a, :b] -└── statements: - @ StatementsNode (location: (1,0)-(1,13)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,13)) - ├── flags: newline - ├── receiver: - │ @ ParenthesesNode (location: (1,1)-(1,13)) - │ ├── flags: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (1,2)-(1,12)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ MultiWriteNode (location: (1,2)-(1,12)) - │ │ ├── flags: newline - │ │ ├── lefts: (length: 2) - │ │ │ ├── @ LocalVariableTargetNode (location: (1,2)-(1,3)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :a - │ │ │ │ └── depth: 0 - │ │ │ └── @ LocalVariableTargetNode (location: (1,5)-(1,6)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :b - │ │ │ └── depth: 0 - │ │ ├── rest: ∅ - │ │ ├── rights: (length: 0) - │ │ ├── lparen_loc: ∅ - │ │ ├── rparen_loc: ∅ - │ │ ├── operator_loc: (1,7)-(1,8) = "=" - │ │ └── value: - │ │ @ CallNode (location: (1,9)-(1,12)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (1,9)-(1,12) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── opening_loc: (1,1)-(1,2) = "(" - │ └── closing_loc: (1,12)-(1,13) = ")" - ├── call_operator_loc: ∅ - ├── name: :! - ├── message_loc: (1,0)-(1,1) = "!" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/whitequark/nth_ref.txt b/test/prism/snapshots/whitequark/nth_ref.txt deleted file mode 100644 index cca157454832ec..00000000000000 --- a/test/prism/snapshots/whitequark/nth_ref.txt +++ /dev/null @@ -1,10 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ NumberedReferenceReadNode (location: (1,0)-(1,3)) - ├── flags: newline - └── number: 10 diff --git a/test/prism/snapshots/whitequark/numbered_args_after_27.txt b/test/prism/snapshots/whitequark/numbered_args_after_27.txt deleted file mode 100644 index 7bf09f7904a3e3..00000000000000 --- a/test/prism/snapshots/whitequark/numbered_args_after_27.txt +++ /dev/null @@ -1,165 +0,0 @@ -@ ProgramNode (location: (1,0)-(7,13)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(7,13)) - ├── flags: ∅ - └── body: (length: 4) - ├── @ LambdaNode (location: (1,0)-(1,17)) - │ ├── flags: newline - │ ├── locals: [:_1, :_2, :_3, :_4, :_5, :_6, :_7, :_8, :_9] - │ ├── operator_loc: (1,0)-(1,2) = "->" - │ ├── opening_loc: (1,3)-(1,5) = "do" - │ ├── closing_loc: (1,14)-(1,17) = "end" - │ ├── parameters: - │ │ @ NumberedParametersNode (location: (1,0)-(1,17)) - │ │ ├── flags: ∅ - │ │ └── maximum: 9 - │ └── body: - │ @ StatementsNode (location: (1,6)-(1,13)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,6)-(1,13)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (1,6)-(1,8)) - │ │ ├── flags: ∅ - │ │ ├── name: :_1 - │ │ └── depth: 0 - │ ├── call_operator_loc: ∅ - │ ├── name: :+ - │ ├── message_loc: (1,9)-(1,10) = "+" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,11)-(1,13)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ LocalVariableReadNode (location: (1,11)-(1,13)) - │ │ ├── flags: ∅ - │ │ ├── name: :_9 - │ │ └── depth: 0 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ LambdaNode (location: (3,0)-(3,13)) - │ ├── flags: newline - │ ├── locals: [:_1, :_2, :_3, :_4, :_5, :_6, :_7, :_8, :_9] - │ ├── operator_loc: (3,0)-(3,2) = "->" - │ ├── opening_loc: (3,3)-(3,4) = "{" - │ ├── closing_loc: (3,12)-(3,13) = "}" - │ ├── parameters: - │ │ @ NumberedParametersNode (location: (3,0)-(3,13)) - │ │ ├── flags: ∅ - │ │ └── maximum: 9 - │ └── body: - │ @ StatementsNode (location: (3,5)-(3,12)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (3,5)-(3,12)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (3,5)-(3,7)) - │ │ ├── flags: ∅ - │ │ ├── name: :_1 - │ │ └── depth: 0 - │ ├── call_operator_loc: ∅ - │ ├── name: :+ - │ ├── message_loc: (3,8)-(3,9) = "+" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (3,10)-(3,12)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ LocalVariableReadNode (location: (3,10)-(3,12)) - │ │ ├── flags: ∅ - │ │ ├── name: :_9 - │ │ └── depth: 0 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (5,0)-(5,16)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :m - │ ├── message_loc: (5,0)-(5,1) = "m" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (5,2)-(5,16)) - │ ├── flags: ∅ - │ ├── locals: [:_1, :_2, :_3, :_4, :_5, :_6, :_7, :_8, :_9] - │ ├── parameters: - │ │ @ NumberedParametersNode (location: (5,2)-(5,16)) - │ │ ├── flags: ∅ - │ │ └── maximum: 9 - │ ├── body: - │ │ @ StatementsNode (location: (5,5)-(5,12)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (5,5)-(5,12)) - │ │ ├── flags: newline - │ │ ├── receiver: - │ │ │ @ LocalVariableReadNode (location: (5,5)-(5,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :_1 - │ │ │ └── depth: 0 - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :+ - │ │ ├── message_loc: (5,8)-(5,9) = "+" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (5,10)-(5,12)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ LocalVariableReadNode (location: (5,10)-(5,12)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :_9 - │ │ │ └── depth: 0 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── opening_loc: (5,2)-(5,4) = "do" - │ └── closing_loc: (5,13)-(5,16) = "end" - └── @ CallNode (location: (7,0)-(7,13)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :m - ├── message_loc: (7,0)-(7,1) = "m" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (7,2)-(7,13)) - ├── flags: ∅ - ├── locals: [:_1, :_2, :_3, :_4, :_5, :_6, :_7, :_8, :_9] - ├── parameters: - │ @ NumberedParametersNode (location: (7,2)-(7,13)) - │ ├── flags: ∅ - │ └── maximum: 9 - ├── body: - │ @ StatementsNode (location: (7,4)-(7,11)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (7,4)-(7,11)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (7,4)-(7,6)) - │ │ ├── flags: ∅ - │ │ ├── name: :_1 - │ │ └── depth: 0 - │ ├── call_operator_loc: ∅ - │ ├── name: :+ - │ ├── message_loc: (7,7)-(7,8) = "+" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (7,9)-(7,11)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ LocalVariableReadNode (location: (7,9)-(7,11)) - │ │ ├── flags: ∅ - │ │ ├── name: :_9 - │ │ └── depth: 0 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── opening_loc: (7,2)-(7,3) = "{" - └── closing_loc: (7,12)-(7,13) = "}" diff --git a/test/prism/snapshots/whitequark/numparam_outside_block.txt b/test/prism/snapshots/whitequark/numparam_outside_block.txt deleted file mode 100644 index beef05a392c168..00000000000000 --- a/test/prism/snapshots/whitequark/numparam_outside_block.txt +++ /dev/null @@ -1,127 +0,0 @@ -@ ProgramNode (location: (1,0)-(9,17)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(9,17)) - ├── flags: ∅ - └── body: (length: 5) - ├── @ CallNode (location: (1,0)-(1,2)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :_1 - │ ├── message_loc: (1,0)-(1,2) = "_1" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ SingletonClassNode (location: (3,0)-(3,21)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── class_keyword_loc: (3,0)-(3,5) = "class" - │ ├── operator_loc: (3,6)-(3,8) = "<<" - │ ├── expression: - │ │ @ CallNode (location: (3,9)-(3,12)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (3,9)-(3,12) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (3,14)-(3,16)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (3,14)-(3,16)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :_1 - │ │ ├── message_loc: (3,14)-(3,16) = "_1" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── end_keyword_loc: (3,18)-(3,21) = "end" - ├── @ ClassNode (location: (5,0)-(5,16)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── class_keyword_loc: (5,0)-(5,5) = "class" - │ ├── constant_path: - │ │ @ ConstantReadNode (location: (5,6)-(5,7)) - │ │ ├── flags: ∅ - │ │ └── name: :A - │ ├── inheritance_operator_loc: ∅ - │ ├── superclass: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (5,9)-(5,11)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (5,9)-(5,11)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :_1 - │ │ ├── message_loc: (5,9)-(5,11) = "_1" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── end_keyword_loc: (5,13)-(5,16) = "end" - │ └── name: :A - ├── @ DefNode (location: (7,0)-(7,19)) - │ ├── flags: newline - │ ├── name: :m - │ ├── name_loc: (7,9)-(7,10) = "m" - │ ├── receiver: - │ │ @ SelfNode (location: (7,4)-(7,8)) - │ │ └── flags: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (7,12)-(7,14)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (7,12)-(7,14)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :_1 - │ │ ├── message_loc: (7,12)-(7,14) = "_1" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (7,0)-(7,3) = "def" - │ ├── operator_loc: (7,8)-(7,9) = "." - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (7,16)-(7,19) = "end" - └── @ ModuleNode (location: (9,0)-(9,17)) - ├── flags: newline - ├── locals: [] - ├── module_keyword_loc: (9,0)-(9,6) = "module" - ├── constant_path: - │ @ ConstantReadNode (location: (9,7)-(9,8)) - │ ├── flags: ∅ - │ └── name: :A - ├── body: - │ @ StatementsNode (location: (9,10)-(9,12)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (9,10)-(9,12)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :_1 - │ ├── message_loc: (9,10)-(9,12) = "_1" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── end_keyword_loc: (9,14)-(9,17) = "end" - └── name: :A diff --git a/test/prism/snapshots/whitequark/numparam_ruby_bug_19025.txt b/test/prism/snapshots/whitequark/numparam_ruby_bug_19025.txt deleted file mode 100644 index 5043c9be48be07..00000000000000 --- a/test/prism/snapshots/whitequark/numparam_ruby_bug_19025.txt +++ /dev/null @@ -1,55 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,14)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,14)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,14)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :p - ├── message_loc: (1,0)-(1,1) = "p" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,2)-(1,14)) - ├── flags: ∅ - ├── locals: [:_1] - ├── parameters: - │ @ NumberedParametersNode (location: (1,2)-(1,14)) - │ ├── flags: ∅ - │ └── maximum: 1 - ├── body: - │ @ StatementsNode (location: (1,4)-(1,12)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ ArrayNode (location: (1,4)-(1,12)) - │ ├── flags: newline - │ ├── elements: (length: 1) - │ │ └── @ CallNode (location: (1,5)-(1,11)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ LocalVariableReadNode (location: (1,5)-(1,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :_1 - │ │ │ └── depth: 0 - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :** - │ │ ├── message_loc: (1,8)-(1,10) = "**" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (1,10)-(1,11)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (1,10)-(1,11)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── opening_loc: (1,4)-(1,5) = "[" - │ └── closing_loc: (1,11)-(1,12) = "]" - ├── opening_loc: (1,2)-(1,3) = "{" - └── closing_loc: (1,13)-(1,14) = "}" diff --git a/test/prism/snapshots/whitequark/op_asgn.txt b/test/prism/snapshots/whitequark/op_asgn.txt deleted file mode 100644 index cac3e0e7b1798a..00000000000000 --- a/test/prism/snapshots/whitequark/op_asgn.txt +++ /dev/null @@ -1,76 +0,0 @@ -@ ProgramNode (location: (1,0)-(5,11)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(5,11)) - ├── flags: ∅ - └── body: (length: 3) - ├── @ CallOperatorWriteNode (location: (1,0)-(1,10)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (1,0)-(1,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (1,0)-(1,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (1,3)-(1,4) = "." - │ ├── message_loc: (1,4)-(1,5) = "A" - │ ├── read_name: :A - │ ├── write_name: :A= - │ ├── binary_operator: :+ - │ ├── binary_operator_loc: (1,6)-(1,8) = "+=" - │ └── value: - │ @ IntegerNode (location: (1,9)-(1,10)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── @ CallOperatorWriteNode (location: (3,0)-(3,10)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (3,0)-(3,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (3,0)-(3,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (3,3)-(3,4) = "." - │ ├── message_loc: (3,4)-(3,5) = "a" - │ ├── read_name: :a - │ ├── write_name: :a= - │ ├── binary_operator: :+ - │ ├── binary_operator_loc: (3,6)-(3,8) = "+=" - │ └── value: - │ @ IntegerNode (location: (3,9)-(3,10)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - └── @ CallOperatorWriteNode (location: (5,0)-(5,11)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (5,0)-(5,3)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (5,0)-(5,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: (5,3)-(5,5) = "::" - ├── message_loc: (5,5)-(5,6) = "a" - ├── read_name: :a - ├── write_name: :a= - ├── binary_operator: :+ - ├── binary_operator_loc: (5,7)-(5,9) = "+=" - └── value: - @ IntegerNode (location: (5,10)-(5,11)) - ├── flags: static_literal, decimal - └── value: 1 diff --git a/test/prism/snapshots/whitequark/op_asgn_cmd.txt b/test/prism/snapshots/whitequark/op_asgn_cmd.txt deleted file mode 100644 index 6ee1650274ce3b..00000000000000 --- a/test/prism/snapshots/whitequark/op_asgn_cmd.txt +++ /dev/null @@ -1,181 +0,0 @@ -@ ProgramNode (location: (1,0)-(7,15)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(7,15)) - ├── flags: ∅ - └── body: (length: 4) - ├── @ CallOperatorWriteNode (location: (1,0)-(1,14)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (1,0)-(1,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (1,0)-(1,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (1,3)-(1,4) = "." - │ ├── message_loc: (1,4)-(1,5) = "A" - │ ├── read_name: :A - │ ├── write_name: :A= - │ ├── binary_operator: :+ - │ ├── binary_operator_loc: (1,6)-(1,8) = "+=" - │ └── value: - │ @ CallNode (location: (1,9)-(1,14)) - │ ├── flags: ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :m - │ ├── message_loc: (1,9)-(1,10) = "m" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,11)-(1,14)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (1,11)-(1,14)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (1,11)-(1,14) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallOperatorWriteNode (location: (3,0)-(3,14)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (3,0)-(3,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (3,0)-(3,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (3,3)-(3,4) = "." - │ ├── message_loc: (3,4)-(3,5) = "a" - │ ├── read_name: :a - │ ├── write_name: :a= - │ ├── binary_operator: :+ - │ ├── binary_operator_loc: (3,6)-(3,8) = "+=" - │ └── value: - │ @ CallNode (location: (3,9)-(3,14)) - │ ├── flags: ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :m - │ ├── message_loc: (3,9)-(3,10) = "m" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (3,11)-(3,14)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (3,11)-(3,14)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (3,11)-(3,14) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ ConstantPathOperatorWriteNode (location: (5,0)-(5,15)) - │ ├── flags: newline - │ ├── target: - │ │ @ ConstantPathNode (location: (5,0)-(5,6)) - │ │ ├── flags: ∅ - │ │ ├── parent: - │ │ │ @ CallNode (location: (5,0)-(5,3)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (5,0)-(5,3) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── name: :A - │ │ ├── delimiter_loc: (5,3)-(5,5) = "::" - │ │ └── name_loc: (5,5)-(5,6) = "A" - │ ├── binary_operator_loc: (5,7)-(5,9) = "+=" - │ ├── value: - │ │ @ CallNode (location: (5,10)-(5,15)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :m - │ │ ├── message_loc: (5,10)-(5,11) = "m" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (5,12)-(5,15)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ CallNode (location: (5,12)-(5,15)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (5,12)-(5,15) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── binary_operator: :+ - └── @ CallOperatorWriteNode (location: (7,0)-(7,15)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (7,0)-(7,3)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (7,0)-(7,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: (7,3)-(7,5) = "::" - ├── message_loc: (7,5)-(7,6) = "a" - ├── read_name: :a - ├── write_name: :a= - ├── binary_operator: :+ - ├── binary_operator_loc: (7,7)-(7,9) = "+=" - └── value: - @ CallNode (location: (7,10)-(7,15)) - ├── flags: ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :m - ├── message_loc: (7,10)-(7,11) = "m" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (7,12)-(7,15)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ CallNode (location: (7,12)-(7,15)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (7,12)-(7,15) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/whitequark/op_asgn_index.txt b/test/prism/snapshots/whitequark/op_asgn_index.txt deleted file mode 100644 index 0e2927f0fb14f0..00000000000000 --- a/test/prism/snapshots/whitequark/op_asgn_index.txt +++ /dev/null @@ -1,40 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,14)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,14)) - ├── flags: ∅ - └── body: (length: 1) - └── @ IndexOperatorWriteNode (location: (1,0)-(1,14)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (1,0)-(1,3)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (1,0)-(1,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: ∅ - ├── opening_loc: (1,3)-(1,4) = "[" - ├── arguments: - │ @ ArgumentsNode (location: (1,4)-(1,8)) - │ ├── flags: ∅ - │ └── arguments: (length: 2) - │ ├── @ IntegerNode (location: (1,4)-(1,5)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 0 - │ └── @ IntegerNode (location: (1,7)-(1,8)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── closing_loc: (1,8)-(1,9) = "]" - ├── block: ∅ - ├── binary_operator: :+ - ├── binary_operator_loc: (1,10)-(1,12) = "+=" - └── value: - @ IntegerNode (location: (1,13)-(1,14)) - ├── flags: static_literal, decimal - └── value: 2 diff --git a/test/prism/snapshots/whitequark/op_asgn_index_cmd.txt b/test/prism/snapshots/whitequark/op_asgn_index_cmd.txt deleted file mode 100644 index 84cef7867d31c1..00000000000000 --- a/test/prism/snapshots/whitequark/op_asgn_index_cmd.txt +++ /dev/null @@ -1,60 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,18)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,18)) - ├── flags: ∅ - └── body: (length: 1) - └── @ IndexOperatorWriteNode (location: (1,0)-(1,18)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (1,0)-(1,3)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (1,0)-(1,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: ∅ - ├── opening_loc: (1,3)-(1,4) = "[" - ├── arguments: - │ @ ArgumentsNode (location: (1,4)-(1,8)) - │ ├── flags: ∅ - │ └── arguments: (length: 2) - │ ├── @ IntegerNode (location: (1,4)-(1,5)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 0 - │ └── @ IntegerNode (location: (1,7)-(1,8)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── closing_loc: (1,8)-(1,9) = "]" - ├── block: ∅ - ├── binary_operator: :+ - ├── binary_operator_loc: (1,10)-(1,12) = "+=" - └── value: - @ CallNode (location: (1,13)-(1,18)) - ├── flags: ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :m - ├── message_loc: (1,13)-(1,14) = "m" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,15)-(1,18)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ CallNode (location: (1,15)-(1,18)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (1,15)-(1,18) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/whitequark/optarg.txt b/test/prism/snapshots/whitequark/optarg.txt deleted file mode 100644 index f25b004a00ff25..00000000000000 --- a/test/prism/snapshots/whitequark/optarg.txt +++ /dev/null @@ -1,80 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,24)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,24)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ DefNode (location: (1,0)-(1,18)) - │ ├── flags: newline - │ ├── name: :f - │ ├── name_loc: (1,4)-(1,5) = "f" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,6)-(1,13)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 1) - │ │ │ └── @ OptionalParameterNode (location: (1,6)-(1,13)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── name_loc: (1,6)-(1,9) = "foo" - │ │ │ ├── operator_loc: (1,10)-(1,11) = "=" - │ │ │ └── value: - │ │ │ @ IntegerNode (location: (1,12)-(1,13)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: ∅ - │ ├── locals: [:foo] - │ ├── def_keyword_loc: (1,0)-(1,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (1,15)-(1,18) = "end" - └── @ DefNode (location: (3,0)-(3,24)) - ├── flags: newline - ├── name: :f - ├── name_loc: (3,4)-(3,5) = "f" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (3,6)-(3,18)) - │ ├── flags: ∅ - │ ├── requireds: (length: 0) - │ ├── optionals: (length: 2) - │ │ ├── @ OptionalParameterNode (location: (3,6)-(3,11)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── name_loc: (3,6)-(3,9) = "foo" - │ │ │ ├── operator_loc: (3,9)-(3,10) = "=" - │ │ │ └── value: - │ │ │ @ IntegerNode (location: (3,10)-(3,11)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── @ OptionalParameterNode (location: (3,13)-(3,18)) - │ │ ├── flags: ∅ - │ │ ├── name: :bar - │ │ ├── name_loc: (3,13)-(3,16) = "bar" - │ │ ├── operator_loc: (3,16)-(3,17) = "=" - │ │ └── value: - │ │ @ IntegerNode (location: (3,17)-(3,18)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── rest: ∅ - │ ├── posts: (length: 0) - │ ├── keywords: (length: 0) - │ ├── keyword_rest: ∅ - │ └── block: ∅ - ├── body: ∅ - ├── locals: [:foo, :bar] - ├── def_keyword_loc: (3,0)-(3,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: (3,5)-(3,6) = "(" - ├── rparen_loc: (3,18)-(3,19) = ")" - ├── equal_loc: ∅ - └── end_keyword_loc: (3,21)-(3,24) = "end" diff --git a/test/prism/snapshots/whitequark/or.txt b/test/prism/snapshots/whitequark/or.txt deleted file mode 100644 index 7a23781399e817..00000000000000 --- a/test/prism/snapshots/whitequark/or.txt +++ /dev/null @@ -1,57 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,10)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,10)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ OrNode (location: (1,0)-(1,10)) - │ ├── flags: newline - │ ├── left: - │ │ @ CallNode (location: (1,0)-(1,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (1,0)-(1,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── right: - │ │ @ CallNode (location: (1,7)-(1,10)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (1,7)-(1,10) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── operator_loc: (1,4)-(1,6) = "or" - └── @ OrNode (location: (3,0)-(3,10)) - ├── flags: newline - ├── left: - │ @ CallNode (location: (3,0)-(3,3)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (3,0)-(3,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── right: - │ @ CallNode (location: (3,7)-(3,10)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :bar - │ ├── message_loc: (3,7)-(3,10) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── operator_loc: (3,4)-(3,6) = "||" diff --git a/test/prism/snapshots/whitequark/or_asgn.txt b/test/prism/snapshots/whitequark/or_asgn.txt deleted file mode 100644 index 7234587b45d58b..00000000000000 --- a/test/prism/snapshots/whitequark/or_asgn.txt +++ /dev/null @@ -1,61 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,15)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,15)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ CallOrWriteNode (location: (1,0)-(1,11)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (1,0)-(1,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (1,0)-(1,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (1,3)-(1,4) = "." - │ ├── message_loc: (1,4)-(1,5) = "a" - │ ├── read_name: :a - │ ├── write_name: :a= - │ ├── operator_loc: (1,6)-(1,9) = "||=" - │ └── value: - │ @ IntegerNode (location: (1,10)-(1,11)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - └── @ IndexOrWriteNode (location: (3,0)-(3,15)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (3,0)-(3,3)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (3,0)-(3,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: ∅ - ├── opening_loc: (3,3)-(3,4) = "[" - ├── arguments: - │ @ ArgumentsNode (location: (3,4)-(3,8)) - │ ├── flags: ∅ - │ └── arguments: (length: 2) - │ ├── @ IntegerNode (location: (3,4)-(3,5)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 0 - │ └── @ IntegerNode (location: (3,7)-(3,8)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── closing_loc: (3,8)-(3,9) = "]" - ├── block: ∅ - ├── operator_loc: (3,10)-(3,13) = "||=" - └── value: - @ IntegerNode (location: (3,14)-(3,15)) - ├── flags: static_literal, decimal - └── value: 2 diff --git a/test/prism/snapshots/whitequark/parser_bug_272.txt b/test/prism/snapshots/whitequark/parser_bug_272.txt deleted file mode 100644 index 64df1cf46d2de9..00000000000000 --- a/test/prism/snapshots/whitequark/parser_bug_272.txt +++ /dev/null @@ -1,48 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,15)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,15)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,15)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :a - ├── message_loc: (1,0)-(1,1) = "a" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,2)-(1,4)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ InstanceVariableReadNode (location: (1,2)-(1,4)) - │ ├── flags: ∅ - │ └── name: :@b - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,5)-(1,15)) - ├── flags: ∅ - ├── locals: [:c] - ├── parameters: - │ @ BlockParametersNode (location: (1,8)-(1,11)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,9)-(1,10)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (1,9)-(1,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :c - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,8)-(1,9) = "|" - │ └── closing_loc: (1,10)-(1,11) = "|" - ├── body: ∅ - ├── opening_loc: (1,5)-(1,7) = "do" - └── closing_loc: (1,12)-(1,15) = "end" diff --git a/test/prism/snapshots/whitequark/parser_bug_490.txt b/test/prism/snapshots/whitequark/parser_bug_490.txt deleted file mode 100644 index 89a29c11f56eeb..00000000000000 --- a/test/prism/snapshots/whitequark/parser_bug_490.txt +++ /dev/null @@ -1,129 +0,0 @@ -@ ProgramNode (location: (1,0)-(5,45)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(5,45)) - ├── flags: ∅ - └── body: (length: 3) - ├── @ DefNode (location: (1,0)-(1,39)) - │ ├── flags: newline - │ ├── name: :m - │ ├── name_loc: (1,4)-(1,5) = "m" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (1,7)-(1,34)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ SingletonClassNode (location: (1,7)-(1,34)) - │ │ ├── flags: newline - │ │ ├── locals: [] - │ │ ├── class_keyword_loc: (1,7)-(1,12) = "class" - │ │ ├── operator_loc: (1,13)-(1,15) = "<<" - │ │ ├── expression: - │ │ │ @ SelfNode (location: (1,16)-(1,20)) - │ │ │ └── flags: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (1,22)-(1,29)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ ConstantWriteNode (location: (1,22)-(1,29)) - │ │ │ ├── flags: newline - │ │ │ ├── name: :A - │ │ │ ├── name_loc: (1,22)-(1,23) = "A" - │ │ │ ├── value: - │ │ │ │ @ NilNode (location: (1,26)-(1,29)) - │ │ │ │ └── flags: static_literal - │ │ │ └── operator_loc: (1,24)-(1,25) = "=" - │ │ └── end_keyword_loc: (1,31)-(1,34) = "end" - │ ├── locals: [] - │ ├── def_keyword_loc: (1,0)-(1,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (1,36)-(1,39) = "end" - ├── @ DefNode (location: (3,0)-(3,44)) - │ ├── flags: newline - │ ├── name: :m - │ ├── name_loc: (3,4)-(3,5) = "m" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (3,7)-(3,39)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ SingletonClassNode (location: (3,7)-(3,39)) - │ │ ├── flags: newline - │ │ ├── locals: [] - │ │ ├── class_keyword_loc: (3,7)-(3,12) = "class" - │ │ ├── operator_loc: (3,13)-(3,15) = "<<" - │ │ ├── expression: - │ │ │ @ SelfNode (location: (3,16)-(3,20)) - │ │ │ └── flags: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (3,22)-(3,34)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ ClassNode (location: (3,22)-(3,34)) - │ │ │ ├── flags: newline - │ │ │ ├── locals: [] - │ │ │ ├── class_keyword_loc: (3,22)-(3,27) = "class" - │ │ │ ├── constant_path: - │ │ │ │ @ ConstantReadNode (location: (3,28)-(3,29)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :C - │ │ │ ├── inheritance_operator_loc: ∅ - │ │ │ ├── superclass: ∅ - │ │ │ ├── body: ∅ - │ │ │ ├── end_keyword_loc: (3,31)-(3,34) = "end" - │ │ │ └── name: :C - │ │ └── end_keyword_loc: (3,36)-(3,39) = "end" - │ ├── locals: [] - │ ├── def_keyword_loc: (3,0)-(3,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (3,41)-(3,44) = "end" - └── @ DefNode (location: (5,0)-(5,45)) - ├── flags: newline - ├── name: :m - ├── name_loc: (5,4)-(5,5) = "m" - ├── receiver: ∅ - ├── parameters: ∅ - ├── body: - │ @ StatementsNode (location: (5,7)-(5,40)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ SingletonClassNode (location: (5,7)-(5,40)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── class_keyword_loc: (5,7)-(5,12) = "class" - │ ├── operator_loc: (5,13)-(5,15) = "<<" - │ ├── expression: - │ │ @ SelfNode (location: (5,16)-(5,20)) - │ │ └── flags: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (5,22)-(5,35)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ ModuleNode (location: (5,22)-(5,35)) - │ │ ├── flags: newline - │ │ ├── locals: [] - │ │ ├── module_keyword_loc: (5,22)-(5,28) = "module" - │ │ ├── constant_path: - │ │ │ @ ConstantReadNode (location: (5,29)-(5,30)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :M - │ │ ├── body: ∅ - │ │ ├── end_keyword_loc: (5,32)-(5,35) = "end" - │ │ └── name: :M - │ └── end_keyword_loc: (5,37)-(5,40) = "end" - ├── locals: [] - ├── def_keyword_loc: (5,0)-(5,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: ∅ - ├── rparen_loc: ∅ - ├── equal_loc: ∅ - └── end_keyword_loc: (5,42)-(5,45) = "end" diff --git a/test/prism/snapshots/whitequark/parser_bug_507.txt b/test/prism/snapshots/whitequark/parser_bug_507.txt deleted file mode 100644 index 63a9169d01106f..00000000000000 --- a/test/prism/snapshots/whitequark/parser_bug_507.txt +++ /dev/null @@ -1,42 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,19)) -├── flags: ∅ -├── locals: [:m] -└── statements: - @ StatementsNode (location: (1,0)-(1,19)) - ├── flags: ∅ - └── body: (length: 1) - └── @ LocalVariableWriteNode (location: (1,0)-(1,19)) - ├── flags: newline - ├── name: :m - ├── depth: 0 - ├── name_loc: (1,0)-(1,1) = "m" - ├── value: - │ @ LambdaNode (location: (1,4)-(1,19)) - │ ├── flags: ∅ - │ ├── locals: [:args] - │ ├── operator_loc: (1,4)-(1,6) = "->" - │ ├── opening_loc: (1,13)-(1,15) = "do" - │ ├── closing_loc: (1,16)-(1,19) = "end" - │ ├── parameters: - │ │ @ BlockParametersNode (location: (1,7)-(1,12)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (1,7)-(1,12)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 0) - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: - │ │ │ │ @ RestParameterNode (location: (1,7)-(1,12)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :args - │ │ │ │ ├── name_loc: (1,8)-(1,12) = "args" - │ │ │ │ └── operator_loc: (1,7)-(1,8) = "*" - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: ∅ - │ │ └── closing_loc: ∅ - │ └── body: ∅ - └── operator_loc: (1,2)-(1,3) = "=" diff --git a/test/prism/snapshots/whitequark/parser_bug_518.txt b/test/prism/snapshots/whitequark/parser_bug_518.txt deleted file mode 100644 index 3341167b64d1e8..00000000000000 --- a/test/prism/snapshots/whitequark/parser_bug_518.txt +++ /dev/null @@ -1,23 +0,0 @@ -@ ProgramNode (location: (1,0)-(2,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(2,3)) - ├── flags: ∅ - └── body: (length: 1) - └── @ ClassNode (location: (1,0)-(2,3)) - ├── flags: newline - ├── locals: [] - ├── class_keyword_loc: (1,0)-(1,5) = "class" - ├── constant_path: - │ @ ConstantReadNode (location: (1,6)-(1,7)) - │ ├── flags: ∅ - │ └── name: :A - ├── inheritance_operator_loc: (1,8)-(1,9) = "<" - ├── superclass: - │ @ ConstantReadNode (location: (1,10)-(1,11)) - │ ├── flags: ∅ - │ └── name: :B - ├── body: ∅ - ├── end_keyword_loc: (2,0)-(2,3) = "end" - └── name: :A diff --git a/test/prism/snapshots/whitequark/parser_bug_525.txt b/test/prism/snapshots/whitequark/parser_bug_525.txt deleted file mode 100644 index 46dca6f97d38ac..00000000000000 --- a/test/prism/snapshots/whitequark/parser_bug_525.txt +++ /dev/null @@ -1,71 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,32)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,32)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,32)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :m1 - ├── message_loc: (1,0)-(1,2) = "m1" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,3)-(1,11)) - │ ├── flags: contains_keywords - │ └── arguments: (length: 1) - │ └── @ KeywordHashNode (location: (1,3)-(1,11)) - │ ├── flags: symbol_keys - │ └── elements: (length: 1) - │ └── @ AssocNode (location: (1,3)-(1,11)) - │ ├── flags: ∅ - │ ├── key: - │ │ @ SymbolNode (location: (1,3)-(1,5)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (1,3)-(1,4) = ":" - │ │ ├── value_loc: (1,4)-(1,5) = "k" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "k" - │ ├── value: - │ │ @ CallNode (location: (1,9)-(1,11)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :m2 - │ │ ├── message_loc: (1,9)-(1,11) = "m2" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── operator_loc: (1,6)-(1,8) = "=>" - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,12)-(1,32)) - ├── flags: ∅ - ├── locals: [] - ├── parameters: ∅ - ├── body: - │ @ StatementsNode (location: (1,16)-(1,27)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,16)-(1,27)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :m3 - │ ├── message_loc: (1,16)-(1,18) = "m3" - │ ├── opening_loc: (1,18)-(1,19) = "(" - │ ├── arguments: ∅ - │ ├── closing_loc: (1,19)-(1,20) = ")" - │ └── block: - │ @ BlockNode (location: (1,21)-(1,27)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (1,21)-(1,23) = "do" - │ └── closing_loc: (1,24)-(1,27) = "end" - ├── opening_loc: (1,12)-(1,14) = "do" - └── closing_loc: (1,29)-(1,32) = "end" diff --git a/test/prism/snapshots/whitequark/parser_bug_604.txt b/test/prism/snapshots/whitequark/parser_bug_604.txt deleted file mode 100644 index aa58b2304fbb49..00000000000000 --- a/test/prism/snapshots/whitequark/parser_bug_604.txt +++ /dev/null @@ -1,60 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,14)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,14)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,14)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :m - ├── message_loc: (1,0)-(1,1) = "m" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,2)-(1,7)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ CallNode (location: (1,2)-(1,7)) - │ ├── flags: ∅ - │ ├── receiver: - │ │ @ CallNode (location: (1,2)-(1,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (1,2)-(1,3) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :+ - │ ├── message_loc: (1,4)-(1,5) = "+" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,6)-(1,7)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (1,6)-(1,7)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :b - │ │ ├── message_loc: (1,6)-(1,7) = "b" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,8)-(1,14)) - ├── flags: ∅ - ├── locals: [] - ├── parameters: ∅ - ├── body: ∅ - ├── opening_loc: (1,8)-(1,10) = "do" - └── closing_loc: (1,11)-(1,14) = "end" diff --git a/test/prism/snapshots/whitequark/parser_bug_640.txt b/test/prism/snapshots/whitequark/parser_bug_640.txt deleted file mode 100644 index 1e535e769bf5e6..00000000000000 --- a/test/prism/snapshots/whitequark/parser_bug_640.txt +++ /dev/null @@ -1,24 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,6)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,6)) - ├── flags: ∅ - └── body: (length: 1) - └── @ InterpolatedStringNode (location: (1,0)-(1,6)) - ├── flags: newline, static_literal - ├── opening_loc: (1,0)-(1,6) = "<<~FOO" - ├── parts: (length: 2) - │ ├── @ StringNode (location: (2,0)-(3,0)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (2,0)-(3,0) = " baz\\\n" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "baz" - │ └── @ StringNode (location: (3,0)-(4,0)) - │ ├── flags: static_literal, frozen - │ ├── opening_loc: ∅ - │ ├── content_loc: (3,0)-(4,0) = " qux\n" - │ ├── closing_loc: ∅ - │ └── unescaped: "qux\n" - └── closing_loc: (4,0)-(5,0) = "FOO\n" diff --git a/test/prism/snapshots/whitequark/parser_bug_645.txt b/test/prism/snapshots/whitequark/parser_bug_645.txt deleted file mode 100644 index 0aa65ebe0346da..00000000000000 --- a/test/prism/snapshots/whitequark/parser_bug_645.txt +++ /dev/null @@ -1,41 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,14)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,14)) - ├── flags: ∅ - └── body: (length: 1) - └── @ LambdaNode (location: (1,0)-(1,14)) - ├── flags: newline - ├── locals: [:arg] - ├── operator_loc: (1,0)-(1,2) = "->" - ├── opening_loc: (1,12)-(1,13) = "{" - ├── closing_loc: (1,13)-(1,14) = "}" - ├── parameters: - │ @ BlockParametersNode (location: (1,3)-(1,11)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,4)-(1,10)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 1) - │ │ │ └── @ OptionalParameterNode (location: (1,4)-(1,10)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :arg - │ │ │ ├── name_loc: (1,4)-(1,7) = "arg" - │ │ │ ├── operator_loc: (1,7)-(1,8) = "=" - │ │ │ └── value: - │ │ │ @ HashNode (location: (1,8)-(1,10)) - │ │ │ ├── flags: static_literal - │ │ │ ├── opening_loc: (1,8)-(1,9) = "{" - │ │ │ ├── elements: (length: 0) - │ │ │ └── closing_loc: (1,9)-(1,10) = "}" - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (1,3)-(1,4) = "(" - │ └── closing_loc: (1,10)-(1,11) = ")" - └── body: ∅ diff --git a/test/prism/snapshots/whitequark/parser_bug_830.txt b/test/prism/snapshots/whitequark/parser_bug_830.txt deleted file mode 100644 index 4adbe6256af02b..00000000000000 --- a/test/prism/snapshots/whitequark/parser_bug_830.txt +++ /dev/null @@ -1,13 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,4)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,4)) - ├── flags: ∅ - └── body: (length: 1) - └── @ RegularExpressionNode (location: (1,0)-(1,4)) - ├── flags: newline, static_literal, forced_us_ascii_encoding - ├── opening_loc: (1,0)-(1,1) = "/" - ├── content_loc: (1,1)-(1,3) = "\\(" - ├── closing_loc: (1,3)-(1,4) = "/" - └── unescaped: "\\(" diff --git a/test/prism/snapshots/whitequark/parser_bug_989.txt b/test/prism/snapshots/whitequark/parser_bug_989.txt deleted file mode 100644 index d0aec1ff5e79e6..00000000000000 --- a/test/prism/snapshots/whitequark/parser_bug_989.txt +++ /dev/null @@ -1,13 +0,0 @@ -@ ProgramNode (location: (1,1)-(1,8)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,1)-(1,8)) - ├── flags: ∅ - └── body: (length: 1) - └── @ StringNode (location: (1,1)-(1,8)) - ├── flags: newline - ├── opening_loc: (1,1)-(1,8) = "<<-HERE" - ├── content_loc: (2,0)-(3,0) = "\t\tcontent\n" - ├── closing_loc: (3,0)-(4,0) = "\tHERE\n" - └── unescaped: "\t\tcontent\n" diff --git a/test/prism/snapshots/whitequark/parser_drops_truncated_parts_of_squiggly_heredoc.txt b/test/prism/snapshots/whitequark/parser_drops_truncated_parts_of_squiggly_heredoc.txt deleted file mode 100644 index 3b0f46674bd675..00000000000000 --- a/test/prism/snapshots/whitequark/parser_drops_truncated_parts_of_squiggly_heredoc.txt +++ /dev/null @@ -1,23 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,7)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,7)) - ├── flags: ∅ - └── body: (length: 1) - └── @ InterpolatedStringNode (location: (1,0)-(1,7)) - ├── flags: newline - ├── opening_loc: (1,0)-(1,7) = "<<~HERE" - ├── parts: (length: 2) - │ ├── @ EmbeddedStatementsNode (location: (2,2)-(2,5)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (2,2)-(2,4) = "\#{" - │ │ ├── statements: ∅ - │ │ └── closing_loc: (2,4)-(2,5) = "}" - │ └── @ StringNode (location: (2,5)-(3,0)) - │ ├── flags: static_literal, frozen - │ ├── opening_loc: ∅ - │ ├── content_loc: (2,5)-(3,0) = "\n" - │ ├── closing_loc: ∅ - │ └── unescaped: "\n" - └── closing_loc: (3,0)-(4,0) = "HERE\n" diff --git a/test/prism/snapshots/whitequark/parser_slash_slash_n_escaping_in_literals.txt b/test/prism/snapshots/whitequark/parser_slash_slash_n_escaping_in_literals.txt deleted file mode 100644 index ddd38a5ab73606..00000000000000 --- a/test/prism/snapshots/whitequark/parser_slash_slash_n_escaping_in_literals.txt +++ /dev/null @@ -1,141 +0,0 @@ -@ ProgramNode (location: (1,0)-(62,2)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(62,2)) - ├── flags: ∅ - └── body: (length: 19) - ├── @ StringNode (location: (1,0)-(2,2)) - │ ├── flags: newline - │ ├── opening_loc: (1,0)-(1,1) = "\"" - │ ├── content_loc: (1,1)-(2,1) = "a\\\nb" - │ ├── closing_loc: (2,1)-(2,2) = "\"" - │ └── unescaped: "ab" - ├── @ ArrayNode (location: (4,0)-(5,2)) - │ ├── flags: newline, static_literal - │ ├── elements: (length: 1) - │ │ └── @ SymbolNode (location: (4,3)-(5,1)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: ∅ - │ │ ├── value_loc: (4,3)-(5,1) = "a\\\nb" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "a\nb" - │ ├── opening_loc: (4,0)-(4,3) = "%I{" - │ └── closing_loc: (5,1)-(5,2) = "}" - ├── @ StringNode (location: (7,0)-(8,2)) - │ ├── flags: newline - │ ├── opening_loc: (7,0)-(7,3) = "%Q{" - │ ├── content_loc: (7,3)-(8,1) = "a\\\nb" - │ ├── closing_loc: (8,1)-(8,2) = "}" - │ └── unescaped: "ab" - ├── @ ArrayNode (location: (10,0)-(11,2)) - │ ├── flags: newline - │ ├── elements: (length: 1) - │ │ └── @ StringNode (location: (10,3)-(11,1)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (10,3)-(11,1) = "a\\\nb" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "a\nb" - │ ├── opening_loc: (10,0)-(10,3) = "%W{" - │ └── closing_loc: (11,1)-(11,2) = "}" - ├── @ ArrayNode (location: (13,0)-(14,2)) - │ ├── flags: newline, static_literal - │ ├── elements: (length: 1) - │ │ └── @ SymbolNode (location: (13,3)-(14,1)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: ∅ - │ │ ├── value_loc: (13,3)-(14,1) = "a\\\nb" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "a\nb" - │ ├── opening_loc: (13,0)-(13,3) = "%i{" - │ └── closing_loc: (14,1)-(14,2) = "}" - ├── @ StringNode (location: (16,0)-(17,2)) - │ ├── flags: newline - │ ├── opening_loc: (16,0)-(16,3) = "%q{" - │ ├── content_loc: (16,3)-(17,1) = "a\\\nb" - │ ├── closing_loc: (17,1)-(17,2) = "}" - │ └── unescaped: "a\\\nb" - ├── @ RegularExpressionNode (location: (19,0)-(20,2)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (19,0)-(19,3) = "%r{" - │ ├── content_loc: (19,3)-(20,1) = "a\\\nb" - │ ├── closing_loc: (20,1)-(20,2) = "}" - │ └── unescaped: "ab" - ├── @ SymbolNode (location: (22,0)-(23,2)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (22,0)-(22,3) = "%s{" - │ ├── value_loc: (22,3)-(23,1) = "a\\\nb" - │ ├── closing_loc: (23,1)-(23,2) = "}" - │ └── unescaped: "a\\\nb" - ├── @ ArrayNode (location: (25,0)-(26,2)) - │ ├── flags: newline - │ ├── elements: (length: 1) - │ │ └── @ StringNode (location: (25,3)-(26,1)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (25,3)-(26,1) = "a\\\nb" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "a\nb" - │ ├── opening_loc: (25,0)-(25,3) = "%w{" - │ └── closing_loc: (26,1)-(26,2) = "}" - ├── @ XStringNode (location: (28,0)-(29,2)) - │ ├── flags: newline - │ ├── opening_loc: (28,0)-(28,3) = "%x{" - │ ├── content_loc: (28,3)-(29,1) = "a\\\nb" - │ ├── closing_loc: (29,1)-(29,2) = "}" - │ └── unescaped: "ab" - ├── @ StringNode (location: (31,0)-(32,2)) - │ ├── flags: newline - │ ├── opening_loc: (31,0)-(31,2) = "%{" - │ ├── content_loc: (31,2)-(32,1) = "a\\\nb" - │ ├── closing_loc: (32,1)-(32,2) = "}" - │ └── unescaped: "ab" - ├── @ StringNode (location: (34,0)-(35,2)) - │ ├── flags: newline - │ ├── opening_loc: (34,0)-(34,1) = "'" - │ ├── content_loc: (34,1)-(35,1) = "a\\\nb" - │ ├── closing_loc: (35,1)-(35,2) = "'" - │ └── unescaped: "a\\\nb" - ├── @ RegularExpressionNode (location: (37,0)-(38,2)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (37,0)-(37,1) = "/" - │ ├── content_loc: (37,1)-(38,1) = "a\\\nb" - │ ├── closing_loc: (38,1)-(38,2) = "/" - │ └── unescaped: "ab" - ├── @ SymbolNode (location: (40,0)-(41,2)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (40,0)-(40,2) = ":\"" - │ ├── value_loc: (40,2)-(41,1) = "a\\\nb" - │ ├── closing_loc: (41,1)-(41,2) = "\"" - │ └── unescaped: "ab" - ├── @ SymbolNode (location: (43,0)-(44,2)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (43,0)-(43,2) = ":'" - │ ├── value_loc: (43,2)-(44,1) = "a\\\nb" - │ ├── closing_loc: (44,1)-(44,2) = "'" - │ └── unescaped: "a\\\nb" - ├── @ StringNode (location: (46,0)-(46,9)) - │ ├── flags: newline - │ ├── opening_loc: (46,0)-(46,9) = "<<-\"HERE\"" - │ ├── content_loc: (47,0)-(49,0) = "a\\\nb\n" - │ ├── closing_loc: (49,0)-(50,0) = "HERE\n" - │ └── unescaped: "ab\n" - ├── @ StringNode (location: (51,0)-(51,9)) - │ ├── flags: newline - │ ├── opening_loc: (51,0)-(51,9) = "<<-'HERE'" - │ ├── content_loc: (52,0)-(54,0) = "a\\\nb\n" - │ ├── closing_loc: (54,0)-(55,0) = "HERE\n" - │ └── unescaped: "a\\\nb\n" - ├── @ XStringNode (location: (56,0)-(56,9)) - │ ├── flags: newline - │ ├── opening_loc: (56,0)-(56,9) = "<<-`HERE`" - │ ├── content_loc: (57,0)-(59,0) = "a\\\nb\n" - │ ├── closing_loc: (59,0)-(60,0) = "HERE\n" - │ └── unescaped: "ab\n" - └── @ XStringNode (location: (61,0)-(62,2)) - ├── flags: newline - ├── opening_loc: (61,0)-(61,1) = "`" - ├── content_loc: (61,1)-(62,1) = "a\\\nb" - ├── closing_loc: (62,1)-(62,2) = "`" - └── unescaped: "ab" diff --git a/test/prism/snapshots/whitequark/pattern_matching__FILE__LINE_literals.txt b/test/prism/snapshots/whitequark/pattern_matching__FILE__LINE_literals.txt deleted file mode 100644 index 77b6f0b1eae94e..00000000000000 --- a/test/prism/snapshots/whitequark/pattern_matching__FILE__LINE_literals.txt +++ /dev/null @@ -1,63 +0,0 @@ -@ ProgramNode (location: (1,8)-(3,11)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,8)-(3,11)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CaseMatchNode (location: (1,8)-(3,11)) - ├── flags: newline - ├── predicate: - │ @ ArrayNode (location: (1,13)-(1,51)) - │ ├── flags: ∅ - │ ├── elements: (length: 3) - │ │ ├── @ SourceFileNode (location: (1,14)-(1,22)) - │ │ │ ├── flags: ∅ - │ │ │ └── filepath: "whitequark/pattern_matching__FILE__LINE_literals.txt" - │ │ ├── @ CallNode (location: (1,24)-(1,36)) - │ │ │ ├── flags: ∅ - │ │ │ ├── receiver: - │ │ │ │ @ SourceLineNode (location: (1,24)-(1,32)) - │ │ │ │ └── flags: static_literal - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :+ - │ │ │ ├── message_loc: (1,33)-(1,34) = "+" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (1,35)-(1,36)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ IntegerNode (location: (1,35)-(1,36)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── @ SourceEncodingNode (location: (1,38)-(1,50)) - │ │ └── flags: static_literal - │ ├── opening_loc: (1,13)-(1,14) = "[" - │ └── closing_loc: (1,50)-(1,51) = "]" - ├── conditions: (length: 1) - │ └── @ InNode (location: (2,10)-(2,47)) - │ ├── flags: ∅ - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (2,13)-(2,47)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── requireds: (length: 3) - │ │ │ ├── @ SourceFileNode (location: (2,14)-(2,22)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── filepath: "whitequark/pattern_matching__FILE__LINE_literals.txt" - │ │ │ ├── @ SourceLineNode (location: (2,24)-(2,32)) - │ │ │ │ └── flags: static_literal - │ │ │ └── @ SourceEncodingNode (location: (2,34)-(2,46)) - │ │ │ └── flags: static_literal - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── opening_loc: (2,13)-(2,14) = "[" - │ │ └── closing_loc: (2,46)-(2,47) = "]" - │ ├── statements: ∅ - │ ├── in_loc: (2,10)-(2,12) = "in" - │ └── then_loc: ∅ - ├── else_clause: ∅ - ├── case_keyword_loc: (1,8)-(1,12) = "case" - └── end_keyword_loc: (3,8)-(3,11) = "end" diff --git a/test/prism/snapshots/whitequark/pattern_matching_blank_else.txt b/test/prism/snapshots/whitequark/pattern_matching_blank_else.txt deleted file mode 100644 index af14e7b5a67515..00000000000000 --- a/test/prism/snapshots/whitequark/pattern_matching_blank_else.txt +++ /dev/null @@ -1,37 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,26)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,26)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CaseMatchNode (location: (1,0)-(1,26)) - ├── flags: newline - ├── predicate: - │ @ IntegerNode (location: (1,5)-(1,6)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── conditions: (length: 1) - │ └── @ InNode (location: (1,8)-(1,15)) - │ ├── flags: ∅ - │ ├── pattern: - │ │ @ IntegerNode (location: (1,11)-(1,12)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── statements: - │ │ @ StatementsNode (location: (1,14)-(1,15)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ IntegerNode (location: (1,14)-(1,15)) - │ │ ├── flags: newline, static_literal, decimal - │ │ └── value: 3 - │ ├── in_loc: (1,8)-(1,10) = "in" - │ └── then_loc: ∅ - ├── else_clause: - │ @ ElseNode (location: (1,17)-(1,26)) - │ ├── flags: ∅ - │ ├── else_keyword_loc: (1,17)-(1,21) = "else" - │ ├── statements: ∅ - │ └── end_keyword_loc: (1,23)-(1,26) = "end" - ├── case_keyword_loc: (1,0)-(1,4) = "case" - └── end_keyword_loc: (1,23)-(1,26) = "end" diff --git a/test/prism/snapshots/whitequark/pattern_matching_else.txt b/test/prism/snapshots/whitequark/pattern_matching_else.txt deleted file mode 100644 index 010f002716834b..00000000000000 --- a/test/prism/snapshots/whitequark/pattern_matching_else.txt +++ /dev/null @@ -1,43 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,29)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,29)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CaseMatchNode (location: (1,0)-(1,29)) - ├── flags: newline - ├── predicate: - │ @ IntegerNode (location: (1,5)-(1,6)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── conditions: (length: 1) - │ └── @ InNode (location: (1,8)-(1,15)) - │ ├── flags: ∅ - │ ├── pattern: - │ │ @ IntegerNode (location: (1,11)-(1,12)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ ├── statements: - │ │ @ StatementsNode (location: (1,14)-(1,15)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ IntegerNode (location: (1,14)-(1,15)) - │ │ ├── flags: newline, static_literal, decimal - │ │ └── value: 3 - │ ├── in_loc: (1,8)-(1,10) = "in" - │ └── then_loc: ∅ - ├── else_clause: - │ @ ElseNode (location: (1,17)-(1,29)) - │ ├── flags: ∅ - │ ├── else_keyword_loc: (1,17)-(1,21) = "else" - │ ├── statements: - │ │ @ StatementsNode (location: (1,23)-(1,24)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ IntegerNode (location: (1,23)-(1,24)) - │ │ ├── flags: newline, static_literal, decimal - │ │ └── value: 4 - │ └── end_keyword_loc: (1,26)-(1,29) = "end" - ├── case_keyword_loc: (1,0)-(1,4) = "case" - └── end_keyword_loc: (1,26)-(1,29) = "end" diff --git a/test/prism/snapshots/whitequark/pattern_matching_single_line.txt b/test/prism/snapshots/whitequark/pattern_matching_single_line.txt deleted file mode 100644 index f11ec00951b242..00000000000000 --- a/test/prism/snapshots/whitequark/pattern_matching_single_line.txt +++ /dev/null @@ -1,55 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,11)) -├── flags: ∅ -├── locals: [:a] -└── statements: - @ StatementsNode (location: (1,0)-(3,11)) - ├── flags: ∅ - └── body: (length: 4) - ├── @ MatchRequiredNode (location: (1,0)-(1,8)) - │ ├── flags: newline - │ ├── value: - │ │ @ IntegerNode (location: (1,0)-(1,1)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (1,5)-(1,8)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ LocalVariableTargetNode (location: (1,6)-(1,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :a - │ │ │ └── depth: 0 - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── opening_loc: (1,5)-(1,6) = "[" - │ │ └── closing_loc: (1,7)-(1,8) = "]" - │ └── operator_loc: (1,2)-(1,4) = "=>" - ├── @ LocalVariableReadNode (location: (1,10)-(1,11)) - │ ├── flags: newline - │ ├── name: :a - │ └── depth: 0 - ├── @ MatchPredicateNode (location: (3,0)-(3,8)) - │ ├── flags: newline - │ ├── value: - │ │ @ IntegerNode (location: (3,0)-(3,1)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (3,5)-(3,8)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ LocalVariableTargetNode (location: (3,6)-(3,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :a - │ │ │ └── depth: 0 - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── opening_loc: (3,5)-(3,6) = "[" - │ │ └── closing_loc: (3,7)-(3,8) = "]" - │ └── operator_loc: (3,2)-(3,4) = "in" - └── @ LocalVariableReadNode (location: (3,10)-(3,11)) - ├── flags: newline - ├── name: :a - └── depth: 0 diff --git a/test/prism/snapshots/whitequark/pattern_matching_single_line_allowed_omission_of_parentheses.txt b/test/prism/snapshots/whitequark/pattern_matching_single_line_allowed_omission_of_parentheses.txt deleted file mode 100644 index 51542e9dd2fa5f..00000000000000 --- a/test/prism/snapshots/whitequark/pattern_matching_single_line_allowed_omission_of_parentheses.txt +++ /dev/null @@ -1,291 +0,0 @@ -@ ProgramNode (location: (1,0)-(11,34)) -├── flags: ∅ -├── locals: [:a, :b, :value] -└── statements: - @ StatementsNode (location: (1,0)-(11,34)) - ├── flags: ∅ - └── body: (length: 12) - ├── @ MatchRequiredNode (location: (1,0)-(1,14)) - │ ├── flags: newline - │ ├── value: - │ │ @ ArrayNode (location: (1,0)-(1,6)) - │ │ ├── flags: static_literal - │ │ ├── elements: (length: 2) - │ │ │ ├── @ IntegerNode (location: (1,1)-(1,2)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ └── @ IntegerNode (location: (1,4)-(1,5)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ ├── opening_loc: (1,0)-(1,1) = "[" - │ │ └── closing_loc: (1,5)-(1,6) = "]" - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (1,10)-(1,14)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── requireds: (length: 2) - │ │ │ ├── @ LocalVariableTargetNode (location: (1,10)-(1,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :a - │ │ │ │ └── depth: 0 - │ │ │ └── @ LocalVariableTargetNode (location: (1,13)-(1,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :b - │ │ │ └── depth: 0 - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── opening_loc: ∅ - │ │ └── closing_loc: ∅ - │ └── operator_loc: (1,7)-(1,9) = "=>" - ├── @ LocalVariableReadNode (location: (1,16)-(1,17)) - │ ├── flags: newline - │ ├── name: :a - │ └── depth: 0 - ├── @ MatchPredicateNode (location: (3,0)-(3,14)) - │ ├── flags: newline - │ ├── value: - │ │ @ ArrayNode (location: (3,0)-(3,6)) - │ │ ├── flags: static_literal - │ │ ├── elements: (length: 2) - │ │ │ ├── @ IntegerNode (location: (3,1)-(3,2)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ └── @ IntegerNode (location: (3,4)-(3,5)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ ├── opening_loc: (3,0)-(3,1) = "[" - │ │ └── closing_loc: (3,5)-(3,6) = "]" - │ ├── pattern: - │ │ @ ArrayPatternNode (location: (3,10)-(3,14)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── requireds: (length: 2) - │ │ │ ├── @ LocalVariableTargetNode (location: (3,10)-(3,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :a - │ │ │ │ └── depth: 0 - │ │ │ └── @ LocalVariableTargetNode (location: (3,13)-(3,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :b - │ │ │ └── depth: 0 - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── opening_loc: ∅ - │ │ └── closing_loc: ∅ - │ └── operator_loc: (3,7)-(3,9) = "in" - ├── @ LocalVariableReadNode (location: (3,16)-(3,17)) - │ ├── flags: newline - │ ├── name: :a - │ └── depth: 0 - ├── @ MatchRequiredNode (location: (5,0)-(5,12)) - │ ├── flags: newline - │ ├── value: - │ │ @ HashNode (location: (5,0)-(5,6)) - │ │ ├── flags: static_literal - │ │ ├── opening_loc: (5,0)-(5,1) = "{" - │ │ ├── elements: (length: 1) - │ │ │ └── @ AssocNode (location: (5,1)-(5,5)) - │ │ │ ├── flags: static_literal - │ │ │ ├── key: - │ │ │ │ @ SymbolNode (location: (5,1)-(5,3)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── value_loc: (5,1)-(5,2) = "a" - │ │ │ │ ├── closing_loc: (5,2)-(5,3) = ":" - │ │ │ │ └── unescaped: "a" - │ │ │ ├── value: - │ │ │ │ @ IntegerNode (location: (5,4)-(5,5)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ └── operator_loc: ∅ - │ │ └── closing_loc: (5,5)-(5,6) = "}" - │ ├── pattern: - │ │ @ HashPatternNode (location: (5,10)-(5,12)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── elements: (length: 1) - │ │ │ └── @ AssocNode (location: (5,10)-(5,12)) - │ │ │ ├── flags: ∅ - │ │ │ ├── key: - │ │ │ │ @ SymbolNode (location: (5,10)-(5,12)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── value_loc: (5,10)-(5,11) = "a" - │ │ │ │ ├── closing_loc: (5,11)-(5,12) = ":" - │ │ │ │ └── unescaped: "a" - │ │ │ ├── value: - │ │ │ │ @ ImplicitNode (location: (5,10)-(5,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── value: - │ │ │ │ @ LocalVariableTargetNode (location: (5,10)-(5,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :a - │ │ │ │ └── depth: 0 - │ │ │ └── operator_loc: ∅ - │ │ ├── rest: ∅ - │ │ ├── opening_loc: ∅ - │ │ └── closing_loc: ∅ - │ └── operator_loc: (5,7)-(5,9) = "=>" - ├── @ LocalVariableReadNode (location: (5,14)-(5,15)) - │ ├── flags: newline - │ ├── name: :a - │ └── depth: 0 - ├── @ MatchPredicateNode (location: (7,0)-(7,12)) - │ ├── flags: newline - │ ├── value: - │ │ @ HashNode (location: (7,0)-(7,6)) - │ │ ├── flags: static_literal - │ │ ├── opening_loc: (7,0)-(7,1) = "{" - │ │ ├── elements: (length: 1) - │ │ │ └── @ AssocNode (location: (7,1)-(7,5)) - │ │ │ ├── flags: static_literal - │ │ │ ├── key: - │ │ │ │ @ SymbolNode (location: (7,1)-(7,3)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── value_loc: (7,1)-(7,2) = "a" - │ │ │ │ ├── closing_loc: (7,2)-(7,3) = ":" - │ │ │ │ └── unescaped: "a" - │ │ │ ├── value: - │ │ │ │ @ IntegerNode (location: (7,4)-(7,5)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ └── operator_loc: ∅ - │ │ └── closing_loc: (7,5)-(7,6) = "}" - │ ├── pattern: - │ │ @ HashPatternNode (location: (7,10)-(7,12)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── elements: (length: 1) - │ │ │ └── @ AssocNode (location: (7,10)-(7,12)) - │ │ │ ├── flags: ∅ - │ │ │ ├── key: - │ │ │ │ @ SymbolNode (location: (7,10)-(7,12)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── value_loc: (7,10)-(7,11) = "a" - │ │ │ │ ├── closing_loc: (7,11)-(7,12) = ":" - │ │ │ │ └── unescaped: "a" - │ │ │ ├── value: - │ │ │ │ @ ImplicitNode (location: (7,10)-(7,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── value: - │ │ │ │ @ LocalVariableTargetNode (location: (7,10)-(7,11)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :a - │ │ │ │ └── depth: 0 - │ │ │ └── operator_loc: ∅ - │ │ ├── rest: ∅ - │ │ ├── opening_loc: ∅ - │ │ └── closing_loc: ∅ - │ └── operator_loc: (7,7)-(7,9) = "in" - ├── @ LocalVariableReadNode (location: (7,14)-(7,15)) - │ ├── flags: newline - │ ├── name: :a - │ └── depth: 0 - ├── @ MatchRequiredNode (location: (9,0)-(9,27)) - │ ├── flags: newline - │ ├── value: - │ │ @ HashNode (location: (9,0)-(9,13)) - │ │ ├── flags: static_literal - │ │ ├── opening_loc: (9,0)-(9,1) = "{" - │ │ ├── elements: (length: 1) - │ │ │ └── @ AssocNode (location: (9,1)-(9,12)) - │ │ │ ├── flags: static_literal - │ │ │ ├── key: - │ │ │ │ @ SymbolNode (location: (9,1)-(9,5)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── value_loc: (9,1)-(9,4) = "key" - │ │ │ │ ├── closing_loc: (9,4)-(9,5) = ":" - │ │ │ │ └── unescaped: "key" - │ │ │ ├── value: - │ │ │ │ @ SymbolNode (location: (9,6)-(9,12)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: (9,6)-(9,7) = ":" - │ │ │ │ ├── value_loc: (9,7)-(9,12) = "value" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "value" - │ │ │ └── operator_loc: ∅ - │ │ └── closing_loc: (9,12)-(9,13) = "}" - │ ├── pattern: - │ │ @ HashPatternNode (location: (9,17)-(9,27)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── elements: (length: 1) - │ │ │ └── @ AssocNode (location: (9,17)-(9,27)) - │ │ │ ├── flags: ∅ - │ │ │ ├── key: - │ │ │ │ @ SymbolNode (location: (9,17)-(9,21)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── value_loc: (9,17)-(9,20) = "key" - │ │ │ │ ├── closing_loc: (9,20)-(9,21) = ":" - │ │ │ │ └── unescaped: "key" - │ │ │ ├── value: - │ │ │ │ @ LocalVariableTargetNode (location: (9,22)-(9,27)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :value - │ │ │ │ └── depth: 0 - │ │ │ └── operator_loc: ∅ - │ │ ├── rest: ∅ - │ │ ├── opening_loc: ∅ - │ │ └── closing_loc: ∅ - │ └── operator_loc: (9,14)-(9,16) = "=>" - ├── @ LocalVariableReadNode (location: (9,29)-(9,34)) - │ ├── flags: newline - │ ├── name: :value - │ └── depth: 0 - ├── @ MatchPredicateNode (location: (11,0)-(11,27)) - │ ├── flags: newline - │ ├── value: - │ │ @ HashNode (location: (11,0)-(11,13)) - │ │ ├── flags: static_literal - │ │ ├── opening_loc: (11,0)-(11,1) = "{" - │ │ ├── elements: (length: 1) - │ │ │ └── @ AssocNode (location: (11,1)-(11,12)) - │ │ │ ├── flags: static_literal - │ │ │ ├── key: - │ │ │ │ @ SymbolNode (location: (11,1)-(11,5)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── value_loc: (11,1)-(11,4) = "key" - │ │ │ │ ├── closing_loc: (11,4)-(11,5) = ":" - │ │ │ │ └── unescaped: "key" - │ │ │ ├── value: - │ │ │ │ @ SymbolNode (location: (11,6)-(11,12)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: (11,6)-(11,7) = ":" - │ │ │ │ ├── value_loc: (11,7)-(11,12) = "value" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "value" - │ │ │ └── operator_loc: ∅ - │ │ └── closing_loc: (11,12)-(11,13) = "}" - │ ├── pattern: - │ │ @ HashPatternNode (location: (11,17)-(11,27)) - │ │ ├── flags: ∅ - │ │ ├── constant: ∅ - │ │ ├── elements: (length: 1) - │ │ │ └── @ AssocNode (location: (11,17)-(11,27)) - │ │ │ ├── flags: ∅ - │ │ │ ├── key: - │ │ │ │ @ SymbolNode (location: (11,17)-(11,21)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── value_loc: (11,17)-(11,20) = "key" - │ │ │ │ ├── closing_loc: (11,20)-(11,21) = ":" - │ │ │ │ └── unescaped: "key" - │ │ │ ├── value: - │ │ │ │ @ LocalVariableTargetNode (location: (11,22)-(11,27)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :value - │ │ │ │ └── depth: 0 - │ │ │ └── operator_loc: ∅ - │ │ ├── rest: ∅ - │ │ ├── opening_loc: ∅ - │ │ └── closing_loc: ∅ - │ └── operator_loc: (11,14)-(11,16) = "in" - └── @ LocalVariableReadNode (location: (11,29)-(11,34)) - ├── flags: newline - ├── name: :value - └── depth: 0 diff --git a/test/prism/snapshots/whitequark/postexe.txt b/test/prism/snapshots/whitequark/postexe.txt deleted file mode 100644 index f4648b8a987de2..00000000000000 --- a/test/prism/snapshots/whitequark/postexe.txt +++ /dev/null @@ -1,19 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,9)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,9)) - ├── flags: ∅ - └── body: (length: 1) - └── @ PostExecutionNode (location: (1,0)-(1,9)) - ├── flags: newline - ├── statements: - │ @ StatementsNode (location: (1,6)-(1,7)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ IntegerNode (location: (1,6)-(1,7)) - │ ├── flags: newline, static_literal, decimal - │ └── value: 1 - ├── keyword_loc: (1,0)-(1,3) = "END" - ├── opening_loc: (1,4)-(1,5) = "{" - └── closing_loc: (1,8)-(1,9) = "}" diff --git a/test/prism/snapshots/whitequark/preexe.txt b/test/prism/snapshots/whitequark/preexe.txt deleted file mode 100644 index f9fe60d07a5e70..00000000000000 --- a/test/prism/snapshots/whitequark/preexe.txt +++ /dev/null @@ -1,19 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,11)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,11)) - ├── flags: ∅ - └── body: (length: 1) - └── @ PreExecutionNode (location: (1,0)-(1,11)) - ├── flags: newline - ├── statements: - │ @ StatementsNode (location: (1,8)-(1,9)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ IntegerNode (location: (1,8)-(1,9)) - │ ├── flags: newline, static_literal, decimal - │ └── value: 1 - ├── keyword_loc: (1,0)-(1,5) = "BEGIN" - ├── opening_loc: (1,6)-(1,7) = "{" - └── closing_loc: (1,10)-(1,11) = "}" diff --git a/test/prism/snapshots/whitequark/procarg0.txt b/test/prism/snapshots/whitequark/procarg0.txt deleted file mode 100644 index 90e03ce940dd8f..00000000000000 --- a/test/prism/snapshots/whitequark/procarg0.txt +++ /dev/null @@ -1,87 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,11)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,11)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ CallNode (location: (1,0)-(1,18)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :m - │ ├── message_loc: (1,0)-(1,1) = "m" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (1,2)-(1,18)) - │ ├── flags: ∅ - │ ├── locals: [:foo, :bar] - │ ├── parameters: - │ │ @ BlockParametersNode (location: (1,4)-(1,16)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (1,5)-(1,15)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 1) - │ │ │ │ └── @ MultiTargetNode (location: (1,5)-(1,15)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── lefts: (length: 2) - │ │ │ │ │ ├── @ RequiredParameterNode (location: (1,6)-(1,9)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ └── name: :foo - │ │ │ │ │ └── @ RequiredParameterNode (location: (1,11)-(1,14)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── name: :bar - │ │ │ │ ├── rest: ∅ - │ │ │ │ ├── rights: (length: 0) - │ │ │ │ ├── lparen_loc: (1,5)-(1,6) = "(" - │ │ │ │ └── rparen_loc: (1,14)-(1,15) = ")" - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: (1,4)-(1,5) = "|" - │ │ └── closing_loc: (1,15)-(1,16) = "|" - │ ├── body: ∅ - │ ├── opening_loc: (1,2)-(1,3) = "{" - │ └── closing_loc: (1,17)-(1,18) = "}" - └── @ CallNode (location: (3,0)-(3,11)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :m - ├── message_loc: (3,0)-(3,1) = "m" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (3,2)-(3,11)) - ├── flags: ∅ - ├── locals: [:foo] - ├── parameters: - │ @ BlockParametersNode (location: (3,4)-(3,9)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (3,5)-(3,8)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (3,5)-(3,8)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :foo - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (3,4)-(3,5) = "|" - │ └── closing_loc: (3,8)-(3,9) = "|" - ├── body: ∅ - ├── opening_loc: (3,2)-(3,3) = "{" - └── closing_loc: (3,10)-(3,11) = "}" diff --git a/test/prism/snapshots/whitequark/range_exclusive.txt b/test/prism/snapshots/whitequark/range_exclusive.txt deleted file mode 100644 index 2351c33fbc5d8f..00000000000000 --- a/test/prism/snapshots/whitequark/range_exclusive.txt +++ /dev/null @@ -1,18 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,5)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,5)) - ├── flags: ∅ - └── body: (length: 1) - └── @ RangeNode (location: (1,0)-(1,5)) - ├── flags: newline, static_literal, exclude_end - ├── left: - │ @ IntegerNode (location: (1,0)-(1,1)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── right: - │ @ IntegerNode (location: (1,4)-(1,5)) - │ ├── flags: static_literal, decimal - │ └── value: 2 - └── operator_loc: (1,1)-(1,4) = "..." diff --git a/test/prism/snapshots/whitequark/range_inclusive.txt b/test/prism/snapshots/whitequark/range_inclusive.txt deleted file mode 100644 index 6d703816d656be..00000000000000 --- a/test/prism/snapshots/whitequark/range_inclusive.txt +++ /dev/null @@ -1,18 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,4)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,4)) - ├── flags: ∅ - └── body: (length: 1) - └── @ RangeNode (location: (1,0)-(1,4)) - ├── flags: newline, static_literal - ├── left: - │ @ IntegerNode (location: (1,0)-(1,1)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── right: - │ @ IntegerNode (location: (1,3)-(1,4)) - │ ├── flags: static_literal, decimal - │ └── value: 2 - └── operator_loc: (1,1)-(1,3) = ".." diff --git a/test/prism/snapshots/whitequark/rational.txt b/test/prism/snapshots/whitequark/rational.txt deleted file mode 100644 index f35fa5b5e39fcc..00000000000000 --- a/test/prism/snapshots/whitequark/rational.txt +++ /dev/null @@ -1,15 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,3)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,3)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ RationalNode (location: (1,0)-(1,5)) - │ ├── flags: newline, static_literal, decimal - │ ├── numerator: 421 - │ └── denominator: 10 - └── @ RationalNode (location: (3,0)-(3,3)) - ├── flags: newline, static_literal, decimal - ├── numerator: 42 - └── denominator: 1 diff --git a/test/prism/snapshots/whitequark/regex_interp.txt b/test/prism/snapshots/whitequark/regex_interp.txt deleted file mode 100644 index e440274cc2055f..00000000000000 --- a/test/prism/snapshots/whitequark/regex_interp.txt +++ /dev/null @@ -1,42 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,14)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,14)) - ├── flags: ∅ - └── body: (length: 1) - └── @ InterpolatedRegularExpressionNode (location: (1,0)-(1,14)) - ├── flags: newline - ├── opening_loc: (1,0)-(1,1) = "/" - ├── parts: (length: 3) - │ ├── @ StringNode (location: (1,1)-(1,4)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (1,1)-(1,4) = "foo" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "foo" - │ ├── @ EmbeddedStatementsNode (location: (1,4)-(1,10)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (1,4)-(1,6) = "\#{" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (1,6)-(1,9)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (1,6)-(1,9)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (1,6)-(1,9) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── closing_loc: (1,9)-(1,10) = "}" - │ └── @ StringNode (location: (1,10)-(1,13)) - │ ├── flags: static_literal, frozen - │ ├── opening_loc: ∅ - │ ├── content_loc: (1,10)-(1,13) = "baz" - │ ├── closing_loc: ∅ - │ └── unescaped: "baz" - └── closing_loc: (1,13)-(1,14) = "/" diff --git a/test/prism/snapshots/whitequark/regex_plain.txt b/test/prism/snapshots/whitequark/regex_plain.txt deleted file mode 100644 index 44dde97c79e016..00000000000000 --- a/test/prism/snapshots/whitequark/regex_plain.txt +++ /dev/null @@ -1,13 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,10)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,10)) - ├── flags: ∅ - └── body: (length: 1) - └── @ RegularExpressionNode (location: (1,0)-(1,10)) - ├── flags: newline, static_literal, ignore_case, multi_line, forced_us_ascii_encoding - ├── opening_loc: (1,0)-(1,1) = "/" - ├── content_loc: (1,1)-(1,7) = "source" - ├── closing_loc: (1,7)-(1,10) = "/im" - └── unescaped: "source" diff --git a/test/prism/snapshots/whitequark/resbody_list.txt b/test/prism/snapshots/whitequark/resbody_list.txt deleted file mode 100644 index 3fa753b4349566..00000000000000 --- a/test/prism/snapshots/whitequark/resbody_list.txt +++ /dev/null @@ -1,52 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,39)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,39)) - ├── flags: ∅ - └── body: (length: 1) - └── @ BeginNode (location: (1,0)-(1,39)) - ├── flags: newline - ├── begin_keyword_loc: (1,0)-(1,5) = "begin" - ├── statements: - │ @ StatementsNode (location: (1,7)-(1,11)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,7)-(1,11)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :meth - │ ├── message_loc: (1,7)-(1,11) = "meth" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── rescue_clause: - │ @ RescueNode (location: (1,13)-(1,34)) - │ ├── flags: ∅ - │ ├── keyword_loc: (1,13)-(1,19) = "rescue" - │ ├── exceptions: (length: 1) - │ │ └── @ ConstantReadNode (location: (1,20)-(1,29)) - │ │ ├── flags: ∅ - │ │ └── name: :Exception - │ ├── operator_loc: ∅ - │ ├── reference: ∅ - │ ├── statements: - │ │ @ StatementsNode (location: (1,31)-(1,34)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (1,31)-(1,34)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (1,31)-(1,34) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── subsequent: ∅ - ├── else_clause: ∅ - ├── ensure_clause: ∅ - └── end_keyword_loc: (1,36)-(1,39) = "end" diff --git a/test/prism/snapshots/whitequark/resbody_list_mrhs.txt b/test/prism/snapshots/whitequark/resbody_list_mrhs.txt deleted file mode 100644 index d8889d36e84305..00000000000000 --- a/test/prism/snapshots/whitequark/resbody_list_mrhs.txt +++ /dev/null @@ -1,62 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,44)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,44)) - ├── flags: ∅ - └── body: (length: 1) - └── @ BeginNode (location: (1,0)-(1,44)) - ├── flags: newline - ├── begin_keyword_loc: (1,0)-(1,5) = "begin" - ├── statements: - │ @ StatementsNode (location: (1,7)-(1,11)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,7)-(1,11)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :meth - │ ├── message_loc: (1,7)-(1,11) = "meth" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── rescue_clause: - │ @ RescueNode (location: (1,13)-(1,39)) - │ ├── flags: ∅ - │ ├── keyword_loc: (1,13)-(1,19) = "rescue" - │ ├── exceptions: (length: 2) - │ │ ├── @ ConstantReadNode (location: (1,20)-(1,29)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :Exception - │ │ └── @ CallNode (location: (1,31)-(1,34)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (1,31)-(1,34) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── operator_loc: ∅ - │ ├── reference: ∅ - │ ├── statements: - │ │ @ StatementsNode (location: (1,36)-(1,39)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (1,36)-(1,39)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (1,36)-(1,39) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── subsequent: ∅ - ├── else_clause: ∅ - ├── ensure_clause: ∅ - └── end_keyword_loc: (1,41)-(1,44) = "end" diff --git a/test/prism/snapshots/whitequark/resbody_list_var.txt b/test/prism/snapshots/whitequark/resbody_list_var.txt deleted file mode 100644 index 0fe73828347a1f..00000000000000 --- a/test/prism/snapshots/whitequark/resbody_list_var.txt +++ /dev/null @@ -1,63 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,39)) -├── flags: ∅ -├── locals: [:ex] -└── statements: - @ StatementsNode (location: (1,0)-(1,39)) - ├── flags: ∅ - └── body: (length: 1) - └── @ BeginNode (location: (1,0)-(1,39)) - ├── flags: newline - ├── begin_keyword_loc: (1,0)-(1,5) = "begin" - ├── statements: - │ @ StatementsNode (location: (1,7)-(1,11)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,7)-(1,11)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :meth - │ ├── message_loc: (1,7)-(1,11) = "meth" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── rescue_clause: - │ @ RescueNode (location: (1,13)-(1,34)) - │ ├── flags: ∅ - │ ├── keyword_loc: (1,13)-(1,19) = "rescue" - │ ├── exceptions: (length: 1) - │ │ └── @ CallNode (location: (1,20)-(1,23)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (1,20)-(1,23) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── operator_loc: (1,24)-(1,26) = "=>" - │ ├── reference: - │ │ @ LocalVariableTargetNode (location: (1,27)-(1,29)) - │ │ ├── flags: ∅ - │ │ ├── name: :ex - │ │ └── depth: 0 - │ ├── statements: - │ │ @ StatementsNode (location: (1,31)-(1,34)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (1,31)-(1,34)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (1,31)-(1,34) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── subsequent: ∅ - ├── else_clause: ∅ - ├── ensure_clause: ∅ - └── end_keyword_loc: (1,36)-(1,39) = "end" diff --git a/test/prism/snapshots/whitequark/resbody_var.txt b/test/prism/snapshots/whitequark/resbody_var.txt deleted file mode 100644 index ce5237a01bd534..00000000000000 --- a/test/prism/snapshots/whitequark/resbody_var.txt +++ /dev/null @@ -1,98 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,35)) -├── flags: ∅ -├── locals: [:ex] -└── statements: - @ StatementsNode (location: (1,0)-(3,35)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ BeginNode (location: (1,0)-(1,36)) - │ ├── flags: newline - │ ├── begin_keyword_loc: (1,0)-(1,5) = "begin" - │ ├── statements: - │ │ @ StatementsNode (location: (1,7)-(1,11)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (1,7)-(1,11)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :meth - │ │ ├── message_loc: (1,7)-(1,11) = "meth" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── rescue_clause: - │ │ @ RescueNode (location: (1,13)-(1,31)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (1,13)-(1,19) = "rescue" - │ │ ├── exceptions: (length: 0) - │ │ ├── operator_loc: (1,20)-(1,22) = "=>" - │ │ ├── reference: - │ │ │ @ InstanceVariableTargetNode (location: (1,23)-(1,26)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :@ex - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (1,28)-(1,31)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (1,28)-(1,31)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (1,28)-(1,31) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── subsequent: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: ∅ - │ └── end_keyword_loc: (1,33)-(1,36) = "end" - └── @ BeginNode (location: (3,0)-(3,35)) - ├── flags: newline - ├── begin_keyword_loc: (3,0)-(3,5) = "begin" - ├── statements: - │ @ StatementsNode (location: (3,7)-(3,11)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (3,7)-(3,11)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :meth - │ ├── message_loc: (3,7)-(3,11) = "meth" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── rescue_clause: - │ @ RescueNode (location: (3,13)-(3,30)) - │ ├── flags: ∅ - │ ├── keyword_loc: (3,13)-(3,19) = "rescue" - │ ├── exceptions: (length: 0) - │ ├── operator_loc: (3,20)-(3,22) = "=>" - │ ├── reference: - │ │ @ LocalVariableTargetNode (location: (3,23)-(3,25)) - │ │ ├── flags: ∅ - │ │ ├── name: :ex - │ │ └── depth: 0 - │ ├── statements: - │ │ @ StatementsNode (location: (3,27)-(3,30)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (3,27)-(3,30)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (3,27)-(3,30) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── subsequent: ∅ - ├── else_clause: ∅ - ├── ensure_clause: ∅ - └── end_keyword_loc: (3,32)-(3,35) = "end" diff --git a/test/prism/snapshots/whitequark/rescue.txt b/test/prism/snapshots/whitequark/rescue.txt deleted file mode 100644 index fa421b902c8baa..00000000000000 --- a/test/prism/snapshots/whitequark/rescue.txt +++ /dev/null @@ -1,49 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,29)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,29)) - ├── flags: ∅ - └── body: (length: 1) - └── @ BeginNode (location: (1,0)-(1,29)) - ├── flags: newline - ├── begin_keyword_loc: (1,0)-(1,5) = "begin" - ├── statements: - │ @ StatementsNode (location: (1,7)-(1,11)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,7)-(1,11)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :meth - │ ├── message_loc: (1,7)-(1,11) = "meth" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── rescue_clause: - │ @ RescueNode (location: (1,13)-(1,24)) - │ ├── flags: ∅ - │ ├── keyword_loc: (1,13)-(1,19) = "rescue" - │ ├── exceptions: (length: 0) - │ ├── operator_loc: ∅ - │ ├── reference: ∅ - │ ├── statements: - │ │ @ StatementsNode (location: (1,21)-(1,24)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (1,21)-(1,24)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (1,21)-(1,24) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── subsequent: ∅ - ├── else_clause: ∅ - ├── ensure_clause: ∅ - └── end_keyword_loc: (1,26)-(1,29) = "end" diff --git a/test/prism/snapshots/whitequark/rescue_else.txt b/test/prism/snapshots/whitequark/rescue_else.txt deleted file mode 100644 index 31a4deab9f749a..00000000000000 --- a/test/prism/snapshots/whitequark/rescue_else.txt +++ /dev/null @@ -1,67 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,40)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,40)) - ├── flags: ∅ - └── body: (length: 1) - └── @ BeginNode (location: (1,0)-(1,40)) - ├── flags: newline - ├── begin_keyword_loc: (1,0)-(1,5) = "begin" - ├── statements: - │ @ StatementsNode (location: (1,7)-(1,11)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,7)-(1,11)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :meth - │ ├── message_loc: (1,7)-(1,11) = "meth" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── rescue_clause: - │ @ RescueNode (location: (1,13)-(1,24)) - │ ├── flags: ∅ - │ ├── keyword_loc: (1,13)-(1,19) = "rescue" - │ ├── exceptions: (length: 0) - │ ├── operator_loc: ∅ - │ ├── reference: ∅ - │ ├── statements: - │ │ @ StatementsNode (location: (1,21)-(1,24)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (1,21)-(1,24)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (1,21)-(1,24) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── subsequent: ∅ - ├── else_clause: - │ @ ElseNode (location: (1,26)-(1,40)) - │ ├── flags: ∅ - │ ├── else_keyword_loc: (1,26)-(1,30) = "else" - │ ├── statements: - │ │ @ StatementsNode (location: (1,32)-(1,35)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (1,32)-(1,35)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (1,32)-(1,35) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── end_keyword_loc: (1,37)-(1,40) = "end" - ├── ensure_clause: ∅ - └── end_keyword_loc: (1,37)-(1,40) = "end" diff --git a/test/prism/snapshots/whitequark/rescue_else_ensure.txt b/test/prism/snapshots/whitequark/rescue_else_ensure.txt deleted file mode 100644 index a300a253b87f16..00000000000000 --- a/test/prism/snapshots/whitequark/rescue_else_ensure.txt +++ /dev/null @@ -1,85 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,51)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,51)) - ├── flags: ∅ - └── body: (length: 1) - └── @ BeginNode (location: (1,0)-(1,51)) - ├── flags: newline - ├── begin_keyword_loc: (1,0)-(1,5) = "begin" - ├── statements: - │ @ StatementsNode (location: (1,7)-(1,11)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,7)-(1,11)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :meth - │ ├── message_loc: (1,7)-(1,11) = "meth" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── rescue_clause: - │ @ RescueNode (location: (1,13)-(1,24)) - │ ├── flags: ∅ - │ ├── keyword_loc: (1,13)-(1,19) = "rescue" - │ ├── exceptions: (length: 0) - │ ├── operator_loc: ∅ - │ ├── reference: ∅ - │ ├── statements: - │ │ @ StatementsNode (location: (1,21)-(1,24)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (1,21)-(1,24)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :baz - │ │ ├── message_loc: (1,21)-(1,24) = "baz" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── subsequent: ∅ - ├── else_clause: - │ @ ElseNode (location: (1,26)-(1,42)) - │ ├── flags: ∅ - │ ├── else_keyword_loc: (1,26)-(1,30) = "else" - │ ├── statements: - │ │ @ StatementsNode (location: (1,31)-(1,34)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (1,31)-(1,34)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (1,31)-(1,34) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── end_keyword_loc: (1,36)-(1,42) = "ensure" - ├── ensure_clause: - │ @ EnsureNode (location: (1,36)-(1,51)) - │ ├── flags: ∅ - │ ├── ensure_keyword_loc: (1,36)-(1,42) = "ensure" - │ ├── statements: - │ │ @ StatementsNode (location: (1,44)-(1,47)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (1,44)-(1,47)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (1,44)-(1,47) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── end_keyword_loc: (1,48)-(1,51) = "end" - └── end_keyword_loc: (1,48)-(1,51) = "end" diff --git a/test/prism/snapshots/whitequark/rescue_ensure.txt b/test/prism/snapshots/whitequark/rescue_ensure.txt deleted file mode 100644 index ac345e440aee2f..00000000000000 --- a/test/prism/snapshots/whitequark/rescue_ensure.txt +++ /dev/null @@ -1,67 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,42)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,42)) - ├── flags: ∅ - └── body: (length: 1) - └── @ BeginNode (location: (1,0)-(1,42)) - ├── flags: newline - ├── begin_keyword_loc: (1,0)-(1,5) = "begin" - ├── statements: - │ @ StatementsNode (location: (1,7)-(1,11)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,7)-(1,11)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :meth - │ ├── message_loc: (1,7)-(1,11) = "meth" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── rescue_clause: - │ @ RescueNode (location: (1,13)-(1,24)) - │ ├── flags: ∅ - │ ├── keyword_loc: (1,13)-(1,19) = "rescue" - │ ├── exceptions: (length: 0) - │ ├── operator_loc: ∅ - │ ├── reference: ∅ - │ ├── statements: - │ │ @ StatementsNode (location: (1,21)-(1,24)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (1,21)-(1,24)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :baz - │ │ ├── message_loc: (1,21)-(1,24) = "baz" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── subsequent: ∅ - ├── else_clause: ∅ - ├── ensure_clause: - │ @ EnsureNode (location: (1,26)-(1,42)) - │ ├── flags: ∅ - │ ├── ensure_keyword_loc: (1,26)-(1,32) = "ensure" - │ ├── statements: - │ │ @ StatementsNode (location: (1,34)-(1,37)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (1,34)-(1,37)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (1,34)-(1,37) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── end_keyword_loc: (1,39)-(1,42) = "end" - └── end_keyword_loc: (1,39)-(1,42) = "end" diff --git a/test/prism/snapshots/whitequark/rescue_in_lambda_block.txt b/test/prism/snapshots/whitequark/rescue_in_lambda_block.txt deleted file mode 100644 index 790202d61f2c96..00000000000000 --- a/test/prism/snapshots/whitequark/rescue_in_lambda_block.txt +++ /dev/null @@ -1,31 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,17)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,17)) - ├── flags: ∅ - └── body: (length: 1) - └── @ LambdaNode (location: (1,0)-(1,17)) - ├── flags: newline - ├── locals: [] - ├── operator_loc: (1,0)-(1,2) = "->" - ├── opening_loc: (1,3)-(1,5) = "do" - ├── closing_loc: (1,14)-(1,17) = "end" - ├── parameters: ∅ - └── body: - @ BeginNode (location: (1,3)-(1,17)) - ├── flags: ∅ - ├── begin_keyword_loc: ∅ - ├── statements: ∅ - ├── rescue_clause: - │ @ RescueNode (location: (1,6)-(1,12)) - │ ├── flags: ∅ - │ ├── keyword_loc: (1,6)-(1,12) = "rescue" - │ ├── exceptions: (length: 0) - │ ├── operator_loc: ∅ - │ ├── reference: ∅ - │ ├── statements: ∅ - │ └── subsequent: ∅ - ├── else_clause: ∅ - ├── ensure_clause: ∅ - └── end_keyword_loc: (1,14)-(1,17) = "end" diff --git a/test/prism/snapshots/whitequark/rescue_mod.txt b/test/prism/snapshots/whitequark/rescue_mod.txt deleted file mode 100644 index abed85c1b9e54d..00000000000000 --- a/test/prism/snapshots/whitequark/rescue_mod.txt +++ /dev/null @@ -1,32 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,15)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,15)) - ├── flags: ∅ - └── body: (length: 1) - └── @ RescueModifierNode (location: (1,0)-(1,15)) - ├── flags: newline - ├── expression: - │ @ CallNode (location: (1,0)-(1,4)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :meth - │ ├── message_loc: (1,0)-(1,4) = "meth" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── keyword_loc: (1,5)-(1,11) = "rescue" - └── rescue_expression: - @ CallNode (location: (1,12)-(1,15)) - ├── flags: variable_call, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :bar - ├── message_loc: (1,12)-(1,15) = "bar" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/whitequark/rescue_mod_asgn.txt b/test/prism/snapshots/whitequark/rescue_mod_asgn.txt deleted file mode 100644 index a2fa161e4eaf5d..00000000000000 --- a/test/prism/snapshots/whitequark/rescue_mod_asgn.txt +++ /dev/null @@ -1,39 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,21)) -├── flags: ∅ -├── locals: [:foo] -└── statements: - @ StatementsNode (location: (1,0)-(1,21)) - ├── flags: ∅ - └── body: (length: 1) - └── @ LocalVariableWriteNode (location: (1,0)-(1,21)) - ├── flags: newline - ├── name: :foo - ├── depth: 0 - ├── name_loc: (1,0)-(1,3) = "foo" - ├── value: - │ @ RescueModifierNode (location: (1,6)-(1,21)) - │ ├── flags: ∅ - │ ├── expression: - │ │ @ CallNode (location: (1,6)-(1,10)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :meth - │ │ ├── message_loc: (1,6)-(1,10) = "meth" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── keyword_loc: (1,11)-(1,17) = "rescue" - │ └── rescue_expression: - │ @ CallNode (location: (1,18)-(1,21)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :bar - │ ├── message_loc: (1,18)-(1,21) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── operator_loc: (1,4)-(1,5) = "=" diff --git a/test/prism/snapshots/whitequark/rescue_mod_masgn.txt b/test/prism/snapshots/whitequark/rescue_mod_masgn.txt deleted file mode 100644 index b5ca37b12957c8..00000000000000 --- a/test/prism/snapshots/whitequark/rescue_mod_masgn.txt +++ /dev/null @@ -1,50 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,29)) -├── flags: ∅ -├── locals: [:foo, :bar] -└── statements: - @ StatementsNode (location: (1,0)-(1,29)) - ├── flags: ∅ - └── body: (length: 1) - └── @ MultiWriteNode (location: (1,0)-(1,29)) - ├── flags: newline - ├── lefts: (length: 2) - │ ├── @ LocalVariableTargetNode (location: (1,0)-(1,3)) - │ │ ├── flags: ∅ - │ │ ├── name: :foo - │ │ └── depth: 0 - │ └── @ LocalVariableTargetNode (location: (1,5)-(1,8)) - │ ├── flags: ∅ - │ ├── name: :bar - │ └── depth: 0 - ├── rest: ∅ - ├── rights: (length: 0) - ├── lparen_loc: ∅ - ├── rparen_loc: ∅ - ├── operator_loc: (1,9)-(1,10) = "=" - └── value: - @ RescueModifierNode (location: (1,11)-(1,29)) - ├── flags: ∅ - ├── expression: - │ @ CallNode (location: (1,11)-(1,15)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :meth - │ ├── message_loc: (1,11)-(1,15) = "meth" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── keyword_loc: (1,16)-(1,22) = "rescue" - └── rescue_expression: - @ ArrayNode (location: (1,23)-(1,29)) - ├── flags: static_literal - ├── elements: (length: 2) - │ ├── @ IntegerNode (location: (1,24)-(1,25)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ └── @ IntegerNode (location: (1,27)-(1,28)) - │ ├── flags: static_literal, decimal - │ └── value: 2 - ├── opening_loc: (1,23)-(1,24) = "[" - └── closing_loc: (1,28)-(1,29) = "]" diff --git a/test/prism/snapshots/whitequark/rescue_mod_op_assign.txt b/test/prism/snapshots/whitequark/rescue_mod_op_assign.txt deleted file mode 100644 index 22101d7c98790d..00000000000000 --- a/test/prism/snapshots/whitequark/rescue_mod_op_assign.txt +++ /dev/null @@ -1,40 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,22)) -├── flags: ∅ -├── locals: [:foo] -└── statements: - @ StatementsNode (location: (1,0)-(1,22)) - ├── flags: ∅ - └── body: (length: 1) - └── @ LocalVariableOperatorWriteNode (location: (1,0)-(1,22)) - ├── flags: newline - ├── name_loc: (1,0)-(1,3) = "foo" - ├── binary_operator_loc: (1,4)-(1,6) = "+=" - ├── value: - │ @ RescueModifierNode (location: (1,7)-(1,22)) - │ ├── flags: ∅ - │ ├── expression: - │ │ @ CallNode (location: (1,7)-(1,11)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :meth - │ │ ├── message_loc: (1,7)-(1,11) = "meth" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── keyword_loc: (1,12)-(1,18) = "rescue" - │ └── rescue_expression: - │ @ CallNode (location: (1,19)-(1,22)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :bar - │ ├── message_loc: (1,19)-(1,22) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── name: :foo - ├── binary_operator: :+ - └── depth: 0 diff --git a/test/prism/snapshots/whitequark/rescue_without_begin_end.txt b/test/prism/snapshots/whitequark/rescue_without_begin_end.txt deleted file mode 100644 index 318ecc79e60127..00000000000000 --- a/test/prism/snapshots/whitequark/rescue_without_begin_end.txt +++ /dev/null @@ -1,66 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,30)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,30)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,30)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :meth - ├── message_loc: (1,0)-(1,4) = "meth" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,5)-(1,30)) - ├── flags: ∅ - ├── locals: [] - ├── parameters: ∅ - ├── body: - │ @ BeginNode (location: (1,5)-(1,30)) - │ ├── flags: ∅ - │ ├── begin_keyword_loc: ∅ - │ ├── statements: - │ │ @ StatementsNode (location: (1,9)-(1,12)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (1,9)-(1,12)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (1,9)-(1,12) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── rescue_clause: - │ │ @ RescueNode (location: (1,14)-(1,25)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (1,14)-(1,20) = "rescue" - │ │ ├── exceptions: (length: 0) - │ │ ├── operator_loc: ∅ - │ │ ├── reference: ∅ - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (1,22)-(1,25)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (1,22)-(1,25)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (1,22)-(1,25) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── subsequent: ∅ - │ ├── else_clause: ∅ - │ ├── ensure_clause: ∅ - │ └── end_keyword_loc: (1,27)-(1,30) = "end" - ├── opening_loc: (1,5)-(1,7) = "do" - └── closing_loc: (1,27)-(1,30) = "end" diff --git a/test/prism/snapshots/whitequark/restarg_named.txt b/test/prism/snapshots/whitequark/restarg_named.txt deleted file mode 100644 index 0bb6b9d2ba1bcc..00000000000000 --- a/test/prism/snapshots/whitequark/restarg_named.txt +++ /dev/null @@ -1,35 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,16)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,16)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(1,16)) - ├── flags: newline - ├── name: :f - ├── name_loc: (1,4)-(1,5) = "f" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (1,6)-(1,10)) - │ ├── flags: ∅ - │ ├── requireds: (length: 0) - │ ├── optionals: (length: 0) - │ ├── rest: - │ │ @ RestParameterNode (location: (1,6)-(1,10)) - │ │ ├── flags: ∅ - │ │ ├── name: :foo - │ │ ├── name_loc: (1,7)-(1,10) = "foo" - │ │ └── operator_loc: (1,6)-(1,7) = "*" - │ ├── posts: (length: 0) - │ ├── keywords: (length: 0) - │ ├── keyword_rest: ∅ - │ └── block: ∅ - ├── body: ∅ - ├── locals: [:foo] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: (1,5)-(1,6) = "(" - ├── rparen_loc: (1,10)-(1,11) = ")" - ├── equal_loc: ∅ - └── end_keyword_loc: (1,13)-(1,16) = "end" diff --git a/test/prism/snapshots/whitequark/restarg_unnamed.txt b/test/prism/snapshots/whitequark/restarg_unnamed.txt deleted file mode 100644 index 0fc102a82ca43d..00000000000000 --- a/test/prism/snapshots/whitequark/restarg_unnamed.txt +++ /dev/null @@ -1,35 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,13)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,13)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(1,13)) - ├── flags: newline - ├── name: :f - ├── name_loc: (1,4)-(1,5) = "f" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (1,6)-(1,7)) - │ ├── flags: ∅ - │ ├── requireds: (length: 0) - │ ├── optionals: (length: 0) - │ ├── rest: - │ │ @ RestParameterNode (location: (1,6)-(1,7)) - │ │ ├── flags: ∅ - │ │ ├── name: ∅ - │ │ ├── name_loc: ∅ - │ │ └── operator_loc: (1,6)-(1,7) = "*" - │ ├── posts: (length: 0) - │ ├── keywords: (length: 0) - │ ├── keyword_rest: ∅ - │ └── block: ∅ - ├── body: ∅ - ├── locals: [] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: (1,5)-(1,6) = "(" - ├── rparen_loc: (1,7)-(1,8) = ")" - ├── equal_loc: ∅ - └── end_keyword_loc: (1,10)-(1,13) = "end" diff --git a/test/prism/snapshots/whitequark/return.txt b/test/prism/snapshots/whitequark/return.txt deleted file mode 100644 index 1e059ba63c34e5..00000000000000 --- a/test/prism/snapshots/whitequark/return.txt +++ /dev/null @@ -1,65 +0,0 @@ -@ ProgramNode (location: (1,0)-(7,11)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(7,11)) - ├── flags: ∅ - └── body: (length: 4) - ├── @ ReturnNode (location: (1,0)-(1,6)) - │ ├── flags: newline - │ ├── keyword_loc: (1,0)-(1,6) = "return" - │ └── arguments: ∅ - ├── @ ReturnNode (location: (3,0)-(3,10)) - │ ├── flags: newline - │ ├── keyword_loc: (3,0)-(3,6) = "return" - │ └── arguments: - │ @ ArgumentsNode (location: (3,7)-(3,10)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ CallNode (location: (3,7)-(3,10)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (3,7)-(3,10) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ ReturnNode (location: (5,0)-(5,8)) - │ ├── flags: newline - │ ├── keyword_loc: (5,0)-(5,6) = "return" - │ └── arguments: - │ @ ArgumentsNode (location: (5,6)-(5,8)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ ParenthesesNode (location: (5,6)-(5,8)) - │ ├── flags: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (5,6)-(5,7) = "(" - │ └── closing_loc: (5,7)-(5,8) = ")" - └── @ ReturnNode (location: (7,0)-(7,11)) - ├── flags: newline - ├── keyword_loc: (7,0)-(7,6) = "return" - └── arguments: - @ ArgumentsNode (location: (7,6)-(7,11)) - ├── flags: ∅ - └── arguments: (length: 1) - └── @ ParenthesesNode (location: (7,6)-(7,11)) - ├── flags: ∅ - ├── body: - │ @ StatementsNode (location: (7,7)-(7,10)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (7,7)-(7,10)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (7,7)-(7,10) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── opening_loc: (7,6)-(7,7) = "(" - └── closing_loc: (7,10)-(7,11) = ")" diff --git a/test/prism/snapshots/whitequark/return_block.txt b/test/prism/snapshots/whitequark/return_block.txt deleted file mode 100644 index 90161b67509475..00000000000000 --- a/test/prism/snapshots/whitequark/return_block.txt +++ /dev/null @@ -1,44 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,21)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,21)) - ├── flags: ∅ - └── body: (length: 1) - └── @ ReturnNode (location: (1,0)-(1,21)) - ├── flags: newline - ├── keyword_loc: (1,0)-(1,6) = "return" - └── arguments: - @ ArgumentsNode (location: (1,7)-(1,21)) - ├── flags: ∅ - └── arguments: (length: 1) - └── @ CallNode (location: (1,7)-(1,21)) - ├── flags: ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :fun - ├── message_loc: (1,7)-(1,10) = "fun" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,11)-(1,14)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ CallNode (location: (1,11)-(1,14)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (1,11)-(1,14) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,15)-(1,21)) - ├── flags: ∅ - ├── locals: [] - ├── parameters: ∅ - ├── body: ∅ - ├── opening_loc: (1,15)-(1,17) = "do" - └── closing_loc: (1,18)-(1,21) = "end" diff --git a/test/prism/snapshots/whitequark/ruby_bug_10279.txt b/test/prism/snapshots/whitequark/ruby_bug_10279.txt deleted file mode 100644 index 0076c954a5c3e8..00000000000000 --- a/test/prism/snapshots/whitequark/ruby_bug_10279.txt +++ /dev/null @@ -1,39 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,24)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,24)) - ├── flags: ∅ - └── body: (length: 1) - └── @ HashNode (location: (1,0)-(1,24)) - ├── flags: newline - ├── opening_loc: (1,0)-(1,1) = "{" - ├── elements: (length: 1) - │ └── @ AssocNode (location: (1,1)-(1,23)) - │ ├── flags: ∅ - │ ├── key: - │ │ @ SymbolNode (location: (1,1)-(1,3)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: ∅ - │ │ ├── value_loc: (1,1)-(1,2) = "a" - │ │ ├── closing_loc: (1,2)-(1,3) = ":" - │ │ └── unescaped: "a" - │ ├── value: - │ │ @ IfNode (location: (1,4)-(1,23)) - │ │ ├── flags: newline - │ │ ├── if_keyword_loc: (1,4)-(1,6) = "if" - │ │ ├── predicate: - │ │ │ @ TrueNode (location: (1,7)-(1,11)) - │ │ │ └── flags: static_literal - │ │ ├── then_keyword_loc: (1,12)-(1,16) = "then" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (1,17)-(1,19)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ IntegerNode (location: (1,17)-(1,19)) - │ │ │ ├── flags: newline, static_literal, decimal - │ │ │ └── value: 42 - │ │ ├── subsequent: ∅ - │ │ └── end_keyword_loc: (1,20)-(1,23) = "end" - │ └── operator_loc: ∅ - └── closing_loc: (1,23)-(1,24) = "}" diff --git a/test/prism/snapshots/whitequark/ruby_bug_10653.txt b/test/prism/snapshots/whitequark/ruby_bug_10653.txt deleted file mode 100644 index 3a562d8b1f5076..00000000000000 --- a/test/prism/snapshots/whitequark/ruby_bug_10653.txt +++ /dev/null @@ -1,199 +0,0 @@ -@ ProgramNode (location: (1,0)-(5,31)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(5,31)) - ├── flags: ∅ - └── body: (length: 3) - ├── @ IfNode (location: (1,0)-(1,33)) - │ ├── flags: newline - │ ├── if_keyword_loc: ∅ - │ ├── predicate: - │ │ @ FalseNode (location: (1,0)-(1,5)) - │ │ └── flags: static_literal - │ ├── then_keyword_loc: (1,6)-(1,7) = "?" - │ ├── statements: - │ │ @ StatementsNode (location: (1,8)-(1,20)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (1,8)-(1,20)) - │ │ ├── flags: newline, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :raise - │ │ ├── message_loc: (1,8)-(1,13) = "raise" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: - │ │ @ BlockNode (location: (1,14)-(1,20)) - │ │ ├── flags: ∅ - │ │ ├── locals: [] - │ │ ├── parameters: ∅ - │ │ ├── body: ∅ - │ │ ├── opening_loc: (1,14)-(1,16) = "do" - │ │ └── closing_loc: (1,17)-(1,20) = "end" - │ ├── subsequent: - │ │ @ ElseNode (location: (1,21)-(1,33)) - │ │ ├── flags: ∅ - │ │ ├── else_keyword_loc: (1,21)-(1,22) = ":" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (1,23)-(1,33)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (1,23)-(1,33)) - │ │ │ ├── flags: newline, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :tap - │ │ │ ├── message_loc: (1,23)-(1,26) = "tap" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: - │ │ │ @ BlockNode (location: (1,27)-(1,33)) - │ │ │ ├── flags: ∅ - │ │ │ ├── locals: [] - │ │ │ ├── parameters: ∅ - │ │ │ ├── body: ∅ - │ │ │ ├── opening_loc: (1,27)-(1,29) = "do" - │ │ │ └── closing_loc: (1,30)-(1,33) = "end" - │ │ └── end_keyword_loc: ∅ - │ └── end_keyword_loc: ∅ - ├── @ IfNode (location: (3,0)-(3,25)) - │ ├── flags: newline - │ ├── if_keyword_loc: ∅ - │ ├── predicate: - │ │ @ FalseNode (location: (3,0)-(3,5)) - │ │ └── flags: static_literal - │ ├── then_keyword_loc: (3,6)-(3,7) = "?" - │ ├── statements: - │ │ @ StatementsNode (location: (3,8)-(3,16)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (3,8)-(3,16)) - │ │ ├── flags: newline, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :raise - │ │ ├── message_loc: (3,8)-(3,13) = "raise" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: - │ │ @ BlockNode (location: (3,14)-(3,16)) - │ │ ├── flags: ∅ - │ │ ├── locals: [] - │ │ ├── parameters: ∅ - │ │ ├── body: ∅ - │ │ ├── opening_loc: (3,14)-(3,15) = "{" - │ │ └── closing_loc: (3,15)-(3,16) = "}" - │ ├── subsequent: - │ │ @ ElseNode (location: (3,17)-(3,25)) - │ │ ├── flags: ∅ - │ │ ├── else_keyword_loc: (3,17)-(3,18) = ":" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (3,19)-(3,25)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (3,19)-(3,25)) - │ │ │ ├── flags: newline, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :tap - │ │ │ ├── message_loc: (3,19)-(3,22) = "tap" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: - │ │ │ @ BlockNode (location: (3,23)-(3,25)) - │ │ │ ├── flags: ∅ - │ │ │ ├── locals: [] - │ │ │ ├── parameters: ∅ - │ │ │ ├── body: ∅ - │ │ │ ├── opening_loc: (3,23)-(3,24) = "{" - │ │ │ └── closing_loc: (3,24)-(3,25) = "}" - │ │ └── end_keyword_loc: ∅ - │ └── end_keyword_loc: ∅ - └── @ IfNode (location: (5,0)-(5,31)) - ├── flags: newline - ├── if_keyword_loc: ∅ - ├── predicate: - │ @ TrueNode (location: (5,0)-(5,4)) - │ └── flags: static_literal - ├── then_keyword_loc: (5,5)-(5,6) = "?" - ├── statements: - │ @ StatementsNode (location: (5,7)-(5,27)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (5,7)-(5,27)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ IntegerNode (location: (5,7)-(5,8)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── call_operator_loc: (5,8)-(5,9) = "." - │ ├── name: :tap - │ ├── message_loc: (5,9)-(5,12) = "tap" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (5,13)-(5,27)) - │ ├── flags: ∅ - │ ├── locals: [:n] - │ ├── parameters: - │ │ @ BlockParametersNode (location: (5,16)-(5,19)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (5,17)-(5,18)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (5,17)-(5,18)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :n - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: (5,16)-(5,17) = "|" - │ │ └── closing_loc: (5,18)-(5,19) = "|" - │ ├── body: - │ │ @ StatementsNode (location: (5,20)-(5,23)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (5,20)-(5,23)) - │ │ ├── flags: newline, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :p - │ │ ├── message_loc: (5,20)-(5,21) = "p" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (5,22)-(5,23)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ LocalVariableReadNode (location: (5,22)-(5,23)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :n - │ │ │ └── depth: 0 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── opening_loc: (5,13)-(5,15) = "do" - │ └── closing_loc: (5,24)-(5,27) = "end" - ├── subsequent: - │ @ ElseNode (location: (5,28)-(5,31)) - │ ├── flags: ∅ - │ ├── else_keyword_loc: (5,28)-(5,29) = ":" - │ ├── statements: - │ │ @ StatementsNode (location: (5,30)-(5,31)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ IntegerNode (location: (5,30)-(5,31)) - │ │ ├── flags: newline, static_literal, decimal - │ │ └── value: 0 - │ └── end_keyword_loc: ∅ - └── end_keyword_loc: ∅ diff --git a/test/prism/snapshots/whitequark/ruby_bug_11107.txt b/test/prism/snapshots/whitequark/ruby_bug_11107.txt deleted file mode 100644 index 4ed332f903b9f5..00000000000000 --- a/test/prism/snapshots/whitequark/ruby_bug_11107.txt +++ /dev/null @@ -1,54 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,24)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,24)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,24)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :p - ├── message_loc: (1,0)-(1,1) = "p" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,2)-(1,24)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ LambdaNode (location: (1,2)-(1,24)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── operator_loc: (1,2)-(1,4) = "->" - │ ├── opening_loc: (1,7)-(1,9) = "do" - │ ├── closing_loc: (1,21)-(1,24) = "end" - │ ├── parameters: - │ │ @ BlockParametersNode (location: (1,4)-(1,6)) - │ │ ├── flags: ∅ - │ │ ├── parameters: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: (1,4)-(1,5) = "(" - │ │ └── closing_loc: (1,5)-(1,6) = ")" - │ └── body: - │ @ StatementsNode (location: (1,10)-(1,20)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,10)-(1,20)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (1,10)-(1,11) = "a" - │ ├── opening_loc: (1,11)-(1,12) = "(" - │ ├── arguments: ∅ - │ ├── closing_loc: (1,12)-(1,13) = ")" - │ └── block: - │ @ BlockNode (location: (1,14)-(1,20)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (1,14)-(1,16) = "do" - │ └── closing_loc: (1,17)-(1,20) = "end" - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/whitequark/ruby_bug_11380.txt b/test/prism/snapshots/whitequark/ruby_bug_11380.txt deleted file mode 100644 index 5893034b65d47c..00000000000000 --- a/test/prism/snapshots/whitequark/ruby_bug_11380.txt +++ /dev/null @@ -1,61 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,28)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,28)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,28)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :p - ├── message_loc: (1,0)-(1,1) = "p" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,2)-(1,21)) - │ ├── flags: contains_keywords - │ └── arguments: (length: 2) - │ ├── @ LambdaNode (location: (1,2)-(1,15)) - │ │ ├── flags: ∅ - │ │ ├── locals: [] - │ │ ├── operator_loc: (1,2)-(1,4) = "->" - │ │ ├── opening_loc: (1,5)-(1,6) = "{" - │ │ ├── closing_loc: (1,14)-(1,15) = "}" - │ │ ├── parameters: ∅ - │ │ └── body: - │ │ @ StatementsNode (location: (1,7)-(1,13)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ SymbolNode (location: (1,7)-(1,13)) - │ │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (1,7)-(1,8) = ":" - │ │ ├── value_loc: (1,8)-(1,13) = "hello" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "hello" - │ └── @ KeywordHashNode (location: (1,17)-(1,21)) - │ ├── flags: symbol_keys - │ └── elements: (length: 1) - │ └── @ AssocNode (location: (1,17)-(1,21)) - │ ├── flags: static_literal - │ ├── key: - │ │ @ SymbolNode (location: (1,17)-(1,19)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: ∅ - │ │ ├── value_loc: (1,17)-(1,18) = "a" - │ │ ├── closing_loc: (1,18)-(1,19) = ":" - │ │ └── unescaped: "a" - │ ├── value: - │ │ @ IntegerNode (location: (1,20)-(1,21)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ └── operator_loc: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,22)-(1,28)) - ├── flags: ∅ - ├── locals: [] - ├── parameters: ∅ - ├── body: ∅ - ├── opening_loc: (1,22)-(1,24) = "do" - └── closing_loc: (1,25)-(1,28) = "end" diff --git a/test/prism/snapshots/whitequark/ruby_bug_11873.txt b/test/prism/snapshots/whitequark/ruby_bug_11873.txt deleted file mode 100644 index a92b21748246ed..00000000000000 --- a/test/prism/snapshots/whitequark/ruby_bug_11873.txt +++ /dev/null @@ -1,793 +0,0 @@ -@ ProgramNode (location: (1,0)-(23,22)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(23,22)) - ├── flags: ∅ - └── body: (length: 12) - ├── @ CallNode (location: (1,0)-(1,20)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (1,0)-(1,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,2)-(1,13)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (1,2)-(1,8)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (1,2)-(1,3) = "b" - │ │ │ ├── opening_loc: (1,3)-(1,4) = "(" - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (1,4)-(1,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ CallNode (location: (1,4)-(1,7)) - │ │ │ │ ├── flags: ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :c - │ │ │ │ ├── message_loc: (1,4)-(1,5) = "c" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: - │ │ │ │ │ @ ArgumentsNode (location: (1,6)-(1,7)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── arguments: (length: 1) - │ │ │ │ │ └── @ CallNode (location: (1,6)-(1,7)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :d - │ │ │ │ │ ├── message_loc: (1,6)-(1,7) = "d" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── closing_loc: (1,7)-(1,8) = ")" - │ │ │ └── block: ∅ - │ │ └── @ StringNode (location: (1,10)-(1,13)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (1,10)-(1,11) = "\"" - │ │ ├── content_loc: (1,11)-(1,12) = "x" - │ │ ├── closing_loc: (1,12)-(1,13) = "\"" - │ │ └── unescaped: "x" - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (1,14)-(1,20)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (1,14)-(1,16) = "do" - │ └── closing_loc: (1,17)-(1,20) = "end" - ├── @ CallNode (location: (3,0)-(3,20)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (3,0)-(3,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (3,2)-(3,13)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (3,2)-(3,8)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (3,2)-(3,3) = "b" - │ │ │ ├── opening_loc: (3,3)-(3,4) = "(" - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (3,4)-(3,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ CallNode (location: (3,4)-(3,7)) - │ │ │ │ ├── flags: ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :c - │ │ │ │ ├── message_loc: (3,4)-(3,5) = "c" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: - │ │ │ │ │ @ ArgumentsNode (location: (3,6)-(3,7)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── arguments: (length: 1) - │ │ │ │ │ └── @ CallNode (location: (3,6)-(3,7)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :d - │ │ │ │ │ ├── message_loc: (3,6)-(3,7) = "d" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── closing_loc: (3,7)-(3,8) = ")" - │ │ │ └── block: ∅ - │ │ └── @ RegularExpressionNode (location: (3,10)-(3,13)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (3,10)-(3,11) = "/" - │ │ ├── content_loc: (3,11)-(3,12) = "x" - │ │ ├── closing_loc: (3,12)-(3,13) = "/" - │ │ └── unescaped: "x" - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (3,14)-(3,20)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (3,14)-(3,16) = "do" - │ └── closing_loc: (3,17)-(3,20) = "end" - ├── @ CallNode (location: (5,0)-(5,21)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (5,0)-(5,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (5,2)-(5,14)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (5,2)-(5,8)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (5,2)-(5,3) = "b" - │ │ │ ├── opening_loc: (5,3)-(5,4) = "(" - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (5,4)-(5,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ CallNode (location: (5,4)-(5,7)) - │ │ │ │ ├── flags: ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :c - │ │ │ │ ├── message_loc: (5,4)-(5,5) = "c" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: - │ │ │ │ │ @ ArgumentsNode (location: (5,6)-(5,7)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── arguments: (length: 1) - │ │ │ │ │ └── @ CallNode (location: (5,6)-(5,7)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :d - │ │ │ │ │ ├── message_loc: (5,6)-(5,7) = "d" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── closing_loc: (5,7)-(5,8) = ")" - │ │ │ └── block: ∅ - │ │ └── @ RegularExpressionNode (location: (5,10)-(5,14)) - │ │ ├── flags: static_literal, multi_line, forced_us_ascii_encoding - │ │ ├── opening_loc: (5,10)-(5,11) = "/" - │ │ ├── content_loc: (5,11)-(5,12) = "x" - │ │ ├── closing_loc: (5,12)-(5,14) = "/m" - │ │ └── unescaped: "x" - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (5,15)-(5,21)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (5,15)-(5,17) = "do" - │ └── closing_loc: (5,18)-(5,21) = "end" - ├── @ CallNode (location: (7,0)-(7,21)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (7,0)-(7,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (7,2)-(7,14)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (7,2)-(7,9)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (7,2)-(7,3) = "b" - │ │ │ ├── opening_loc: (7,3)-(7,4) = "(" - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (7,4)-(7,8)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ CallNode (location: (7,4)-(7,8)) - │ │ │ │ ├── flags: ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :c - │ │ │ │ ├── message_loc: (7,4)-(7,5) = "c" - │ │ │ │ ├── opening_loc: (7,5)-(7,6) = "(" - │ │ │ │ ├── arguments: - │ │ │ │ │ @ ArgumentsNode (location: (7,6)-(7,7)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── arguments: (length: 1) - │ │ │ │ │ └── @ CallNode (location: (7,6)-(7,7)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :d - │ │ │ │ │ ├── message_loc: (7,6)-(7,7) = "d" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── closing_loc: (7,7)-(7,8) = ")" - │ │ │ │ └── block: ∅ - │ │ │ ├── closing_loc: (7,8)-(7,9) = ")" - │ │ │ └── block: ∅ - │ │ └── @ StringNode (location: (7,11)-(7,14)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (7,11)-(7,12) = "\"" - │ │ ├── content_loc: (7,12)-(7,13) = "x" - │ │ ├── closing_loc: (7,13)-(7,14) = "\"" - │ │ └── unescaped: "x" - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (7,15)-(7,21)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (7,15)-(7,17) = "do" - │ └── closing_loc: (7,18)-(7,21) = "end" - ├── @ CallNode (location: (9,0)-(9,21)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (9,0)-(9,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (9,2)-(9,14)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (9,2)-(9,9)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (9,2)-(9,3) = "b" - │ │ │ ├── opening_loc: (9,3)-(9,4) = "(" - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (9,4)-(9,8)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ CallNode (location: (9,4)-(9,8)) - │ │ │ │ ├── flags: ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :c - │ │ │ │ ├── message_loc: (9,4)-(9,5) = "c" - │ │ │ │ ├── opening_loc: (9,5)-(9,6) = "(" - │ │ │ │ ├── arguments: - │ │ │ │ │ @ ArgumentsNode (location: (9,6)-(9,7)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── arguments: (length: 1) - │ │ │ │ │ └── @ CallNode (location: (9,6)-(9,7)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :d - │ │ │ │ │ ├── message_loc: (9,6)-(9,7) = "d" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── closing_loc: (9,7)-(9,8) = ")" - │ │ │ │ └── block: ∅ - │ │ │ ├── closing_loc: (9,8)-(9,9) = ")" - │ │ │ └── block: ∅ - │ │ └── @ RegularExpressionNode (location: (9,11)-(9,14)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (9,11)-(9,12) = "/" - │ │ ├── content_loc: (9,12)-(9,13) = "x" - │ │ ├── closing_loc: (9,13)-(9,14) = "/" - │ │ └── unescaped: "x" - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (9,15)-(9,21)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (9,15)-(9,17) = "do" - │ └── closing_loc: (9,18)-(9,21) = "end" - ├── @ CallNode (location: (11,0)-(11,22)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (11,0)-(11,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (11,2)-(11,15)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (11,2)-(11,9)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (11,2)-(11,3) = "b" - │ │ │ ├── opening_loc: (11,3)-(11,4) = "(" - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (11,4)-(11,8)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ CallNode (location: (11,4)-(11,8)) - │ │ │ │ ├── flags: ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :c - │ │ │ │ ├── message_loc: (11,4)-(11,5) = "c" - │ │ │ │ ├── opening_loc: (11,5)-(11,6) = "(" - │ │ │ │ ├── arguments: - │ │ │ │ │ @ ArgumentsNode (location: (11,6)-(11,7)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── arguments: (length: 1) - │ │ │ │ │ └── @ CallNode (location: (11,6)-(11,7)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :d - │ │ │ │ │ ├── message_loc: (11,6)-(11,7) = "d" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── closing_loc: (11,7)-(11,8) = ")" - │ │ │ │ └── block: ∅ - │ │ │ ├── closing_loc: (11,8)-(11,9) = ")" - │ │ │ └── block: ∅ - │ │ └── @ RegularExpressionNode (location: (11,11)-(11,15)) - │ │ ├── flags: static_literal, multi_line, forced_us_ascii_encoding - │ │ ├── opening_loc: (11,11)-(11,12) = "/" - │ │ ├── content_loc: (11,12)-(11,13) = "x" - │ │ ├── closing_loc: (11,13)-(11,15) = "/m" - │ │ └── unescaped: "x" - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (11,16)-(11,22)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (11,16)-(11,18) = "do" - │ └── closing_loc: (11,19)-(11,22) = "end" - ├── @ CallNode (location: (13,0)-(13,20)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (13,0)-(13,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (13,2)-(13,13)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (13,2)-(13,8)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (13,2)-(13,3) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: - │ │ │ @ BlockNode (location: (13,3)-(13,8)) - │ │ │ ├── flags: ∅ - │ │ │ ├── locals: [] - │ │ │ ├── parameters: ∅ - │ │ │ ├── body: - │ │ │ │ @ StatementsNode (location: (13,4)-(13,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (13,4)-(13,7)) - │ │ │ │ ├── flags: newline, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :c - │ │ │ │ ├── message_loc: (13,4)-(13,5) = "c" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: - │ │ │ │ │ @ ArgumentsNode (location: (13,6)-(13,7)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── arguments: (length: 1) - │ │ │ │ │ └── @ CallNode (location: (13,6)-(13,7)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :d - │ │ │ │ │ ├── message_loc: (13,6)-(13,7) = "d" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── opening_loc: (13,3)-(13,4) = "{" - │ │ │ └── closing_loc: (13,7)-(13,8) = "}" - │ │ └── @ StringNode (location: (13,10)-(13,13)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (13,10)-(13,11) = "\"" - │ │ ├── content_loc: (13,11)-(13,12) = "x" - │ │ ├── closing_loc: (13,12)-(13,13) = "\"" - │ │ └── unescaped: "x" - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (13,14)-(13,20)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (13,14)-(13,16) = "do" - │ └── closing_loc: (13,17)-(13,20) = "end" - ├── @ CallNode (location: (15,0)-(15,20)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (15,0)-(15,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (15,2)-(15,13)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (15,2)-(15,8)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (15,2)-(15,3) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: - │ │ │ @ BlockNode (location: (15,3)-(15,8)) - │ │ │ ├── flags: ∅ - │ │ │ ├── locals: [] - │ │ │ ├── parameters: ∅ - │ │ │ ├── body: - │ │ │ │ @ StatementsNode (location: (15,4)-(15,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (15,4)-(15,7)) - │ │ │ │ ├── flags: newline, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :c - │ │ │ │ ├── message_loc: (15,4)-(15,5) = "c" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: - │ │ │ │ │ @ ArgumentsNode (location: (15,6)-(15,7)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── arguments: (length: 1) - │ │ │ │ │ └── @ CallNode (location: (15,6)-(15,7)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :d - │ │ │ │ │ ├── message_loc: (15,6)-(15,7) = "d" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── opening_loc: (15,3)-(15,4) = "{" - │ │ │ └── closing_loc: (15,7)-(15,8) = "}" - │ │ └── @ RegularExpressionNode (location: (15,10)-(15,13)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (15,10)-(15,11) = "/" - │ │ ├── content_loc: (15,11)-(15,12) = "x" - │ │ ├── closing_loc: (15,12)-(15,13) = "/" - │ │ └── unescaped: "x" - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (15,14)-(15,20)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (15,14)-(15,16) = "do" - │ └── closing_loc: (15,17)-(15,20) = "end" - ├── @ CallNode (location: (17,0)-(17,21)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (17,0)-(17,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (17,2)-(17,14)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (17,2)-(17,8)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (17,2)-(17,3) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: - │ │ │ @ BlockNode (location: (17,3)-(17,8)) - │ │ │ ├── flags: ∅ - │ │ │ ├── locals: [] - │ │ │ ├── parameters: ∅ - │ │ │ ├── body: - │ │ │ │ @ StatementsNode (location: (17,4)-(17,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (17,4)-(17,7)) - │ │ │ │ ├── flags: newline, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :c - │ │ │ │ ├── message_loc: (17,4)-(17,5) = "c" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: - │ │ │ │ │ @ ArgumentsNode (location: (17,6)-(17,7)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── arguments: (length: 1) - │ │ │ │ │ └── @ CallNode (location: (17,6)-(17,7)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :d - │ │ │ │ │ ├── message_loc: (17,6)-(17,7) = "d" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── opening_loc: (17,3)-(17,4) = "{" - │ │ │ └── closing_loc: (17,7)-(17,8) = "}" - │ │ └── @ RegularExpressionNode (location: (17,10)-(17,14)) - │ │ ├── flags: static_literal, multi_line, forced_us_ascii_encoding - │ │ ├── opening_loc: (17,10)-(17,11) = "/" - │ │ ├── content_loc: (17,11)-(17,12) = "x" - │ │ ├── closing_loc: (17,12)-(17,14) = "/m" - │ │ └── unescaped: "x" - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (17,15)-(17,21)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (17,15)-(17,17) = "do" - │ └── closing_loc: (17,18)-(17,21) = "end" - ├── @ CallNode (location: (19,0)-(19,21)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (19,0)-(19,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (19,2)-(19,14)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (19,2)-(19,9)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (19,2)-(19,3) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: - │ │ │ @ BlockNode (location: (19,3)-(19,9)) - │ │ │ ├── flags: ∅ - │ │ │ ├── locals: [] - │ │ │ ├── parameters: ∅ - │ │ │ ├── body: - │ │ │ │ @ StatementsNode (location: (19,4)-(19,8)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (19,4)-(19,8)) - │ │ │ │ ├── flags: newline, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :c - │ │ │ │ ├── message_loc: (19,4)-(19,5) = "c" - │ │ │ │ ├── opening_loc: (19,5)-(19,6) = "(" - │ │ │ │ ├── arguments: - │ │ │ │ │ @ ArgumentsNode (location: (19,6)-(19,7)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── arguments: (length: 1) - │ │ │ │ │ └── @ CallNode (location: (19,6)-(19,7)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :d - │ │ │ │ │ ├── message_loc: (19,6)-(19,7) = "d" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── closing_loc: (19,7)-(19,8) = ")" - │ │ │ │ └── block: ∅ - │ │ │ ├── opening_loc: (19,3)-(19,4) = "{" - │ │ │ └── closing_loc: (19,8)-(19,9) = "}" - │ │ └── @ StringNode (location: (19,11)-(19,14)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (19,11)-(19,12) = "\"" - │ │ ├── content_loc: (19,12)-(19,13) = "x" - │ │ ├── closing_loc: (19,13)-(19,14) = "\"" - │ │ └── unescaped: "x" - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (19,15)-(19,21)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (19,15)-(19,17) = "do" - │ └── closing_loc: (19,18)-(19,21) = "end" - ├── @ CallNode (location: (21,0)-(21,21)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (21,0)-(21,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (21,2)-(21,14)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (21,2)-(21,9)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (21,2)-(21,3) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: - │ │ │ @ BlockNode (location: (21,3)-(21,9)) - │ │ │ ├── flags: ∅ - │ │ │ ├── locals: [] - │ │ │ ├── parameters: ∅ - │ │ │ ├── body: - │ │ │ │ @ StatementsNode (location: (21,4)-(21,8)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (21,4)-(21,8)) - │ │ │ │ ├── flags: newline, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :c - │ │ │ │ ├── message_loc: (21,4)-(21,5) = "c" - │ │ │ │ ├── opening_loc: (21,5)-(21,6) = "(" - │ │ │ │ ├── arguments: - │ │ │ │ │ @ ArgumentsNode (location: (21,6)-(21,7)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── arguments: (length: 1) - │ │ │ │ │ └── @ CallNode (location: (21,6)-(21,7)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :d - │ │ │ │ │ ├── message_loc: (21,6)-(21,7) = "d" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── closing_loc: (21,7)-(21,8) = ")" - │ │ │ │ └── block: ∅ - │ │ │ ├── opening_loc: (21,3)-(21,4) = "{" - │ │ │ └── closing_loc: (21,8)-(21,9) = "}" - │ │ └── @ RegularExpressionNode (location: (21,11)-(21,14)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (21,11)-(21,12) = "/" - │ │ ├── content_loc: (21,12)-(21,13) = "x" - │ │ ├── closing_loc: (21,13)-(21,14) = "/" - │ │ └── unescaped: "x" - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (21,15)-(21,21)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (21,15)-(21,17) = "do" - │ └── closing_loc: (21,18)-(21,21) = "end" - └── @ CallNode (location: (23,0)-(23,22)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :a - ├── message_loc: (23,0)-(23,1) = "a" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (23,2)-(23,15)) - │ ├── flags: ∅ - │ └── arguments: (length: 2) - │ ├── @ CallNode (location: (23,2)-(23,9)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :b - │ │ ├── message_loc: (23,2)-(23,3) = "b" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: - │ │ @ BlockNode (location: (23,3)-(23,9)) - │ │ ├── flags: ∅ - │ │ ├── locals: [] - │ │ ├── parameters: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (23,4)-(23,8)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (23,4)-(23,8)) - │ │ │ ├── flags: newline, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :c - │ │ │ ├── message_loc: (23,4)-(23,5) = "c" - │ │ │ ├── opening_loc: (23,5)-(23,6) = "(" - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (23,6)-(23,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ CallNode (location: (23,6)-(23,7)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :d - │ │ │ │ ├── message_loc: (23,6)-(23,7) = "d" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── closing_loc: (23,7)-(23,8) = ")" - │ │ │ └── block: ∅ - │ │ ├── opening_loc: (23,3)-(23,4) = "{" - │ │ └── closing_loc: (23,8)-(23,9) = "}" - │ └── @ RegularExpressionNode (location: (23,11)-(23,15)) - │ ├── flags: static_literal, multi_line, forced_us_ascii_encoding - │ ├── opening_loc: (23,11)-(23,12) = "/" - │ ├── content_loc: (23,12)-(23,13) = "x" - │ ├── closing_loc: (23,13)-(23,15) = "/m" - │ └── unescaped: "x" - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (23,16)-(23,22)) - ├── flags: ∅ - ├── locals: [] - ├── parameters: ∅ - ├── body: ∅ - ├── opening_loc: (23,16)-(23,18) = "do" - └── closing_loc: (23,19)-(23,22) = "end" diff --git a/test/prism/snapshots/whitequark/ruby_bug_11873_a.txt b/test/prism/snapshots/whitequark/ruby_bug_11873_a.txt deleted file mode 100644 index 6897357de824e5..00000000000000 --- a/test/prism/snapshots/whitequark/ruby_bug_11873_a.txt +++ /dev/null @@ -1,1285 +0,0 @@ -@ ProgramNode (location: (1,0)-(39,20)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(39,20)) - ├── flags: ∅ - └── body: (length: 20) - ├── @ CallNode (location: (1,0)-(1,18)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (1,0)-(1,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,2)-(1,11)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (1,2)-(1,8)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (1,2)-(1,3) = "b" - │ │ │ ├── opening_loc: (1,3)-(1,4) = "(" - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (1,4)-(1,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ CallNode (location: (1,4)-(1,7)) - │ │ │ │ ├── flags: ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :c - │ │ │ │ ├── message_loc: (1,4)-(1,5) = "c" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: - │ │ │ │ │ @ ArgumentsNode (location: (1,6)-(1,7)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── arguments: (length: 1) - │ │ │ │ │ └── @ CallNode (location: (1,6)-(1,7)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :d - │ │ │ │ │ ├── message_loc: (1,6)-(1,7) = "d" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── closing_loc: (1,7)-(1,8) = ")" - │ │ │ └── block: ∅ - │ │ └── @ IntegerNode (location: (1,10)-(1,11)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (1,12)-(1,18)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (1,12)-(1,14) = "do" - │ └── closing_loc: (1,15)-(1,18) = "end" - ├── @ CallNode (location: (3,0)-(3,20)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (3,0)-(3,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (3,2)-(3,13)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (3,2)-(3,8)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (3,2)-(3,3) = "b" - │ │ │ ├── opening_loc: (3,3)-(3,4) = "(" - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (3,4)-(3,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ CallNode (location: (3,4)-(3,7)) - │ │ │ │ ├── flags: ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :c - │ │ │ │ ├── message_loc: (3,4)-(3,5) = "c" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: - │ │ │ │ │ @ ArgumentsNode (location: (3,6)-(3,7)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── arguments: (length: 1) - │ │ │ │ │ └── @ CallNode (location: (3,6)-(3,7)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :d - │ │ │ │ │ ├── message_loc: (3,6)-(3,7) = "d" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── closing_loc: (3,7)-(3,8) = ")" - │ │ │ └── block: ∅ - │ │ └── @ FloatNode (location: (3,10)-(3,13)) - │ │ ├── flags: static_literal - │ │ └── value: 1.0 - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (3,14)-(3,20)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (3,14)-(3,16) = "do" - │ └── closing_loc: (3,17)-(3,20) = "end" - ├── @ CallNode (location: (5,0)-(5,21)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (5,0)-(5,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (5,2)-(5,14)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (5,2)-(5,8)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (5,2)-(5,3) = "b" - │ │ │ ├── opening_loc: (5,3)-(5,4) = "(" - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (5,4)-(5,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ CallNode (location: (5,4)-(5,7)) - │ │ │ │ ├── flags: ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :c - │ │ │ │ ├── message_loc: (5,4)-(5,5) = "c" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: - │ │ │ │ │ @ ArgumentsNode (location: (5,6)-(5,7)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── arguments: (length: 1) - │ │ │ │ │ └── @ CallNode (location: (5,6)-(5,7)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :d - │ │ │ │ │ ├── message_loc: (5,6)-(5,7) = "d" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── closing_loc: (5,7)-(5,8) = ")" - │ │ │ └── block: ∅ - │ │ └── @ ImaginaryNode (location: (5,10)-(5,14)) - │ │ ├── flags: static_literal - │ │ └── numeric: - │ │ @ FloatNode (location: (5,10)-(5,13)) - │ │ ├── flags: static_literal - │ │ └── value: 1.0 - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (5,15)-(5,21)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (5,15)-(5,17) = "do" - │ └── closing_loc: (5,18)-(5,21) = "end" - ├── @ CallNode (location: (7,0)-(7,21)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (7,0)-(7,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (7,2)-(7,14)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (7,2)-(7,8)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (7,2)-(7,3) = "b" - │ │ │ ├── opening_loc: (7,3)-(7,4) = "(" - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (7,4)-(7,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ CallNode (location: (7,4)-(7,7)) - │ │ │ │ ├── flags: ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :c - │ │ │ │ ├── message_loc: (7,4)-(7,5) = "c" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: - │ │ │ │ │ @ ArgumentsNode (location: (7,6)-(7,7)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── arguments: (length: 1) - │ │ │ │ │ └── @ CallNode (location: (7,6)-(7,7)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :d - │ │ │ │ │ ├── message_loc: (7,6)-(7,7) = "d" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── closing_loc: (7,7)-(7,8) = ")" - │ │ │ └── block: ∅ - │ │ └── @ RationalNode (location: (7,10)-(7,14)) - │ │ ├── flags: static_literal, decimal - │ │ ├── numerator: 1 - │ │ └── denominator: 1 - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (7,15)-(7,21)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (7,15)-(7,17) = "do" - │ └── closing_loc: (7,18)-(7,21) = "end" - ├── @ CallNode (location: (9,0)-(9,19)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (9,0)-(9,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (9,2)-(9,12)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (9,2)-(9,8)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (9,2)-(9,3) = "b" - │ │ │ ├── opening_loc: (9,3)-(9,4) = "(" - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (9,4)-(9,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ CallNode (location: (9,4)-(9,7)) - │ │ │ │ ├── flags: ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :c - │ │ │ │ ├── message_loc: (9,4)-(9,5) = "c" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: - │ │ │ │ │ @ ArgumentsNode (location: (9,6)-(9,7)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── arguments: (length: 1) - │ │ │ │ │ └── @ CallNode (location: (9,6)-(9,7)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :d - │ │ │ │ │ ├── message_loc: (9,6)-(9,7) = "d" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── closing_loc: (9,7)-(9,8) = ")" - │ │ │ └── block: ∅ - │ │ └── @ SymbolNode (location: (9,10)-(9,12)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (9,10)-(9,11) = ":" - │ │ ├── value_loc: (9,11)-(9,12) = "e" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "e" - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (9,13)-(9,19)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (9,13)-(9,15) = "do" - │ └── closing_loc: (9,16)-(9,19) = "end" - ├── @ CallNode (location: (11,0)-(11,19)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (11,0)-(11,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (11,2)-(11,12)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (11,2)-(11,9)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (11,2)-(11,3) = "b" - │ │ │ ├── opening_loc: (11,3)-(11,4) = "(" - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (11,4)-(11,8)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ CallNode (location: (11,4)-(11,8)) - │ │ │ │ ├── flags: ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :c - │ │ │ │ ├── message_loc: (11,4)-(11,5) = "c" - │ │ │ │ ├── opening_loc: (11,5)-(11,6) = "(" - │ │ │ │ ├── arguments: - │ │ │ │ │ @ ArgumentsNode (location: (11,6)-(11,7)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── arguments: (length: 1) - │ │ │ │ │ └── @ CallNode (location: (11,6)-(11,7)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :d - │ │ │ │ │ ├── message_loc: (11,6)-(11,7) = "d" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── closing_loc: (11,7)-(11,8) = ")" - │ │ │ │ └── block: ∅ - │ │ │ ├── closing_loc: (11,8)-(11,9) = ")" - │ │ │ └── block: ∅ - │ │ └── @ IntegerNode (location: (11,11)-(11,12)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (11,13)-(11,19)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (11,13)-(11,15) = "do" - │ └── closing_loc: (11,16)-(11,19) = "end" - ├── @ CallNode (location: (13,0)-(13,21)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (13,0)-(13,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (13,2)-(13,14)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (13,2)-(13,9)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (13,2)-(13,3) = "b" - │ │ │ ├── opening_loc: (13,3)-(13,4) = "(" - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (13,4)-(13,8)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ CallNode (location: (13,4)-(13,8)) - │ │ │ │ ├── flags: ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :c - │ │ │ │ ├── message_loc: (13,4)-(13,5) = "c" - │ │ │ │ ├── opening_loc: (13,5)-(13,6) = "(" - │ │ │ │ ├── arguments: - │ │ │ │ │ @ ArgumentsNode (location: (13,6)-(13,7)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── arguments: (length: 1) - │ │ │ │ │ └── @ CallNode (location: (13,6)-(13,7)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :d - │ │ │ │ │ ├── message_loc: (13,6)-(13,7) = "d" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── closing_loc: (13,7)-(13,8) = ")" - │ │ │ │ └── block: ∅ - │ │ │ ├── closing_loc: (13,8)-(13,9) = ")" - │ │ │ └── block: ∅ - │ │ └── @ FloatNode (location: (13,11)-(13,14)) - │ │ ├── flags: static_literal - │ │ └── value: 1.0 - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (13,15)-(13,21)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (13,15)-(13,17) = "do" - │ └── closing_loc: (13,18)-(13,21) = "end" - ├── @ CallNode (location: (15,0)-(15,22)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (15,0)-(15,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (15,2)-(15,15)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (15,2)-(15,9)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (15,2)-(15,3) = "b" - │ │ │ ├── opening_loc: (15,3)-(15,4) = "(" - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (15,4)-(15,8)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ CallNode (location: (15,4)-(15,8)) - │ │ │ │ ├── flags: ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :c - │ │ │ │ ├── message_loc: (15,4)-(15,5) = "c" - │ │ │ │ ├── opening_loc: (15,5)-(15,6) = "(" - │ │ │ │ ├── arguments: - │ │ │ │ │ @ ArgumentsNode (location: (15,6)-(15,7)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── arguments: (length: 1) - │ │ │ │ │ └── @ CallNode (location: (15,6)-(15,7)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :d - │ │ │ │ │ ├── message_loc: (15,6)-(15,7) = "d" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── closing_loc: (15,7)-(15,8) = ")" - │ │ │ │ └── block: ∅ - │ │ │ ├── closing_loc: (15,8)-(15,9) = ")" - │ │ │ └── block: ∅ - │ │ └── @ ImaginaryNode (location: (15,11)-(15,15)) - │ │ ├── flags: static_literal - │ │ └── numeric: - │ │ @ FloatNode (location: (15,11)-(15,14)) - │ │ ├── flags: static_literal - │ │ └── value: 1.0 - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (15,16)-(15,22)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (15,16)-(15,18) = "do" - │ └── closing_loc: (15,19)-(15,22) = "end" - ├── @ CallNode (location: (17,0)-(17,22)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (17,0)-(17,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (17,2)-(17,15)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (17,2)-(17,9)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (17,2)-(17,3) = "b" - │ │ │ ├── opening_loc: (17,3)-(17,4) = "(" - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (17,4)-(17,8)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ CallNode (location: (17,4)-(17,8)) - │ │ │ │ ├── flags: ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :c - │ │ │ │ ├── message_loc: (17,4)-(17,5) = "c" - │ │ │ │ ├── opening_loc: (17,5)-(17,6) = "(" - │ │ │ │ ├── arguments: - │ │ │ │ │ @ ArgumentsNode (location: (17,6)-(17,7)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── arguments: (length: 1) - │ │ │ │ │ └── @ CallNode (location: (17,6)-(17,7)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :d - │ │ │ │ │ ├── message_loc: (17,6)-(17,7) = "d" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── closing_loc: (17,7)-(17,8) = ")" - │ │ │ │ └── block: ∅ - │ │ │ ├── closing_loc: (17,8)-(17,9) = ")" - │ │ │ └── block: ∅ - │ │ └── @ RationalNode (location: (17,11)-(17,15)) - │ │ ├── flags: static_literal, decimal - │ │ ├── numerator: 1 - │ │ └── denominator: 1 - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (17,16)-(17,22)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (17,16)-(17,18) = "do" - │ └── closing_loc: (17,19)-(17,22) = "end" - ├── @ CallNode (location: (19,0)-(19,20)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (19,0)-(19,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (19,2)-(19,13)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (19,2)-(19,9)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (19,2)-(19,3) = "b" - │ │ │ ├── opening_loc: (19,3)-(19,4) = "(" - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (19,4)-(19,8)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ CallNode (location: (19,4)-(19,8)) - │ │ │ │ ├── flags: ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :c - │ │ │ │ ├── message_loc: (19,4)-(19,5) = "c" - │ │ │ │ ├── opening_loc: (19,5)-(19,6) = "(" - │ │ │ │ ├── arguments: - │ │ │ │ │ @ ArgumentsNode (location: (19,6)-(19,7)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── arguments: (length: 1) - │ │ │ │ │ └── @ CallNode (location: (19,6)-(19,7)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :d - │ │ │ │ │ ├── message_loc: (19,6)-(19,7) = "d" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── closing_loc: (19,7)-(19,8) = ")" - │ │ │ │ └── block: ∅ - │ │ │ ├── closing_loc: (19,8)-(19,9) = ")" - │ │ │ └── block: ∅ - │ │ └── @ SymbolNode (location: (19,11)-(19,13)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (19,11)-(19,12) = ":" - │ │ ├── value_loc: (19,12)-(19,13) = "e" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "e" - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (19,14)-(19,20)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (19,14)-(19,16) = "do" - │ └── closing_loc: (19,17)-(19,20) = "end" - ├── @ CallNode (location: (21,0)-(21,18)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (21,0)-(21,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (21,2)-(21,11)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (21,2)-(21,8)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (21,2)-(21,3) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: - │ │ │ @ BlockNode (location: (21,3)-(21,8)) - │ │ │ ├── flags: ∅ - │ │ │ ├── locals: [] - │ │ │ ├── parameters: ∅ - │ │ │ ├── body: - │ │ │ │ @ StatementsNode (location: (21,4)-(21,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (21,4)-(21,7)) - │ │ │ │ ├── flags: newline, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :c - │ │ │ │ ├── message_loc: (21,4)-(21,5) = "c" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: - │ │ │ │ │ @ ArgumentsNode (location: (21,6)-(21,7)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── arguments: (length: 1) - │ │ │ │ │ └── @ CallNode (location: (21,6)-(21,7)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :d - │ │ │ │ │ ├── message_loc: (21,6)-(21,7) = "d" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── opening_loc: (21,3)-(21,4) = "{" - │ │ │ └── closing_loc: (21,7)-(21,8) = "}" - │ │ └── @ IntegerNode (location: (21,10)-(21,11)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (21,12)-(21,18)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (21,12)-(21,14) = "do" - │ └── closing_loc: (21,15)-(21,18) = "end" - ├── @ CallNode (location: (23,0)-(23,20)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (23,0)-(23,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (23,2)-(23,13)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (23,2)-(23,8)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (23,2)-(23,3) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: - │ │ │ @ BlockNode (location: (23,3)-(23,8)) - │ │ │ ├── flags: ∅ - │ │ │ ├── locals: [] - │ │ │ ├── parameters: ∅ - │ │ │ ├── body: - │ │ │ │ @ StatementsNode (location: (23,4)-(23,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (23,4)-(23,7)) - │ │ │ │ ├── flags: newline, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :c - │ │ │ │ ├── message_loc: (23,4)-(23,5) = "c" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: - │ │ │ │ │ @ ArgumentsNode (location: (23,6)-(23,7)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── arguments: (length: 1) - │ │ │ │ │ └── @ CallNode (location: (23,6)-(23,7)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :d - │ │ │ │ │ ├── message_loc: (23,6)-(23,7) = "d" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── opening_loc: (23,3)-(23,4) = "{" - │ │ │ └── closing_loc: (23,7)-(23,8) = "}" - │ │ └── @ FloatNode (location: (23,10)-(23,13)) - │ │ ├── flags: static_literal - │ │ └── value: 1.0 - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (23,14)-(23,20)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (23,14)-(23,16) = "do" - │ └── closing_loc: (23,17)-(23,20) = "end" - ├── @ CallNode (location: (25,0)-(25,21)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (25,0)-(25,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (25,2)-(25,14)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (25,2)-(25,8)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (25,2)-(25,3) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: - │ │ │ @ BlockNode (location: (25,3)-(25,8)) - │ │ │ ├── flags: ∅ - │ │ │ ├── locals: [] - │ │ │ ├── parameters: ∅ - │ │ │ ├── body: - │ │ │ │ @ StatementsNode (location: (25,4)-(25,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (25,4)-(25,7)) - │ │ │ │ ├── flags: newline, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :c - │ │ │ │ ├── message_loc: (25,4)-(25,5) = "c" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: - │ │ │ │ │ @ ArgumentsNode (location: (25,6)-(25,7)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── arguments: (length: 1) - │ │ │ │ │ └── @ CallNode (location: (25,6)-(25,7)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :d - │ │ │ │ │ ├── message_loc: (25,6)-(25,7) = "d" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── opening_loc: (25,3)-(25,4) = "{" - │ │ │ └── closing_loc: (25,7)-(25,8) = "}" - │ │ └── @ ImaginaryNode (location: (25,10)-(25,14)) - │ │ ├── flags: static_literal - │ │ └── numeric: - │ │ @ FloatNode (location: (25,10)-(25,13)) - │ │ ├── flags: static_literal - │ │ └── value: 1.0 - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (25,15)-(25,21)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (25,15)-(25,17) = "do" - │ └── closing_loc: (25,18)-(25,21) = "end" - ├── @ CallNode (location: (27,0)-(27,21)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (27,0)-(27,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (27,2)-(27,14)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (27,2)-(27,8)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (27,2)-(27,3) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: - │ │ │ @ BlockNode (location: (27,3)-(27,8)) - │ │ │ ├── flags: ∅ - │ │ │ ├── locals: [] - │ │ │ ├── parameters: ∅ - │ │ │ ├── body: - │ │ │ │ @ StatementsNode (location: (27,4)-(27,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (27,4)-(27,7)) - │ │ │ │ ├── flags: newline, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :c - │ │ │ │ ├── message_loc: (27,4)-(27,5) = "c" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: - │ │ │ │ │ @ ArgumentsNode (location: (27,6)-(27,7)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── arguments: (length: 1) - │ │ │ │ │ └── @ CallNode (location: (27,6)-(27,7)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :d - │ │ │ │ │ ├── message_loc: (27,6)-(27,7) = "d" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── opening_loc: (27,3)-(27,4) = "{" - │ │ │ └── closing_loc: (27,7)-(27,8) = "}" - │ │ └── @ RationalNode (location: (27,10)-(27,14)) - │ │ ├── flags: static_literal, decimal - │ │ ├── numerator: 1 - │ │ └── denominator: 1 - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (27,15)-(27,21)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (27,15)-(27,17) = "do" - │ └── closing_loc: (27,18)-(27,21) = "end" - ├── @ CallNode (location: (29,0)-(29,19)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (29,0)-(29,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (29,2)-(29,12)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (29,2)-(29,8)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (29,2)-(29,3) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: - │ │ │ @ BlockNode (location: (29,3)-(29,8)) - │ │ │ ├── flags: ∅ - │ │ │ ├── locals: [] - │ │ │ ├── parameters: ∅ - │ │ │ ├── body: - │ │ │ │ @ StatementsNode (location: (29,4)-(29,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (29,4)-(29,7)) - │ │ │ │ ├── flags: newline, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :c - │ │ │ │ ├── message_loc: (29,4)-(29,5) = "c" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: - │ │ │ │ │ @ ArgumentsNode (location: (29,6)-(29,7)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── arguments: (length: 1) - │ │ │ │ │ └── @ CallNode (location: (29,6)-(29,7)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :d - │ │ │ │ │ ├── message_loc: (29,6)-(29,7) = "d" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── opening_loc: (29,3)-(29,4) = "{" - │ │ │ └── closing_loc: (29,7)-(29,8) = "}" - │ │ └── @ SymbolNode (location: (29,10)-(29,12)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (29,10)-(29,11) = ":" - │ │ ├── value_loc: (29,11)-(29,12) = "e" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "e" - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (29,13)-(29,19)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (29,13)-(29,15) = "do" - │ └── closing_loc: (29,16)-(29,19) = "end" - ├── @ CallNode (location: (31,0)-(31,19)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (31,0)-(31,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (31,2)-(31,12)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (31,2)-(31,9)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (31,2)-(31,3) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: - │ │ │ @ BlockNode (location: (31,3)-(31,9)) - │ │ │ ├── flags: ∅ - │ │ │ ├── locals: [] - │ │ │ ├── parameters: ∅ - │ │ │ ├── body: - │ │ │ │ @ StatementsNode (location: (31,4)-(31,8)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (31,4)-(31,8)) - │ │ │ │ ├── flags: newline, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :c - │ │ │ │ ├── message_loc: (31,4)-(31,5) = "c" - │ │ │ │ ├── opening_loc: (31,5)-(31,6) = "(" - │ │ │ │ ├── arguments: - │ │ │ │ │ @ ArgumentsNode (location: (31,6)-(31,7)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── arguments: (length: 1) - │ │ │ │ │ └── @ CallNode (location: (31,6)-(31,7)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :d - │ │ │ │ │ ├── message_loc: (31,6)-(31,7) = "d" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── closing_loc: (31,7)-(31,8) = ")" - │ │ │ │ └── block: ∅ - │ │ │ ├── opening_loc: (31,3)-(31,4) = "{" - │ │ │ └── closing_loc: (31,8)-(31,9) = "}" - │ │ └── @ IntegerNode (location: (31,11)-(31,12)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (31,13)-(31,19)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (31,13)-(31,15) = "do" - │ └── closing_loc: (31,16)-(31,19) = "end" - ├── @ CallNode (location: (33,0)-(33,21)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (33,0)-(33,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (33,2)-(33,14)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (33,2)-(33,9)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (33,2)-(33,3) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: - │ │ │ @ BlockNode (location: (33,3)-(33,9)) - │ │ │ ├── flags: ∅ - │ │ │ ├── locals: [] - │ │ │ ├── parameters: ∅ - │ │ │ ├── body: - │ │ │ │ @ StatementsNode (location: (33,4)-(33,8)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (33,4)-(33,8)) - │ │ │ │ ├── flags: newline, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :c - │ │ │ │ ├── message_loc: (33,4)-(33,5) = "c" - │ │ │ │ ├── opening_loc: (33,5)-(33,6) = "(" - │ │ │ │ ├── arguments: - │ │ │ │ │ @ ArgumentsNode (location: (33,6)-(33,7)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── arguments: (length: 1) - │ │ │ │ │ └── @ CallNode (location: (33,6)-(33,7)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :d - │ │ │ │ │ ├── message_loc: (33,6)-(33,7) = "d" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── closing_loc: (33,7)-(33,8) = ")" - │ │ │ │ └── block: ∅ - │ │ │ ├── opening_loc: (33,3)-(33,4) = "{" - │ │ │ └── closing_loc: (33,8)-(33,9) = "}" - │ │ └── @ FloatNode (location: (33,11)-(33,14)) - │ │ ├── flags: static_literal - │ │ └── value: 1.0 - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (33,15)-(33,21)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (33,15)-(33,17) = "do" - │ └── closing_loc: (33,18)-(33,21) = "end" - ├── @ CallNode (location: (35,0)-(35,22)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (35,0)-(35,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (35,2)-(35,15)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (35,2)-(35,9)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (35,2)-(35,3) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: - │ │ │ @ BlockNode (location: (35,3)-(35,9)) - │ │ │ ├── flags: ∅ - │ │ │ ├── locals: [] - │ │ │ ├── parameters: ∅ - │ │ │ ├── body: - │ │ │ │ @ StatementsNode (location: (35,4)-(35,8)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (35,4)-(35,8)) - │ │ │ │ ├── flags: newline, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :c - │ │ │ │ ├── message_loc: (35,4)-(35,5) = "c" - │ │ │ │ ├── opening_loc: (35,5)-(35,6) = "(" - │ │ │ │ ├── arguments: - │ │ │ │ │ @ ArgumentsNode (location: (35,6)-(35,7)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── arguments: (length: 1) - │ │ │ │ │ └── @ CallNode (location: (35,6)-(35,7)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :d - │ │ │ │ │ ├── message_loc: (35,6)-(35,7) = "d" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── closing_loc: (35,7)-(35,8) = ")" - │ │ │ │ └── block: ∅ - │ │ │ ├── opening_loc: (35,3)-(35,4) = "{" - │ │ │ └── closing_loc: (35,8)-(35,9) = "}" - │ │ └── @ ImaginaryNode (location: (35,11)-(35,15)) - │ │ ├── flags: static_literal - │ │ └── numeric: - │ │ @ FloatNode (location: (35,11)-(35,14)) - │ │ ├── flags: static_literal - │ │ └── value: 1.0 - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (35,16)-(35,22)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (35,16)-(35,18) = "do" - │ └── closing_loc: (35,19)-(35,22) = "end" - ├── @ CallNode (location: (37,0)-(37,22)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (37,0)-(37,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (37,2)-(37,15)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ CallNode (location: (37,2)-(37,9)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :b - │ │ │ ├── message_loc: (37,2)-(37,3) = "b" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: - │ │ │ @ BlockNode (location: (37,3)-(37,9)) - │ │ │ ├── flags: ∅ - │ │ │ ├── locals: [] - │ │ │ ├── parameters: ∅ - │ │ │ ├── body: - │ │ │ │ @ StatementsNode (location: (37,4)-(37,8)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (37,4)-(37,8)) - │ │ │ │ ├── flags: newline, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :c - │ │ │ │ ├── message_loc: (37,4)-(37,5) = "c" - │ │ │ │ ├── opening_loc: (37,5)-(37,6) = "(" - │ │ │ │ ├── arguments: - │ │ │ │ │ @ ArgumentsNode (location: (37,6)-(37,7)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── arguments: (length: 1) - │ │ │ │ │ └── @ CallNode (location: (37,6)-(37,7)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :d - │ │ │ │ │ ├── message_loc: (37,6)-(37,7) = "d" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── closing_loc: (37,7)-(37,8) = ")" - │ │ │ │ └── block: ∅ - │ │ │ ├── opening_loc: (37,3)-(37,4) = "{" - │ │ │ └── closing_loc: (37,8)-(37,9) = "}" - │ │ └── @ RationalNode (location: (37,11)-(37,15)) - │ │ ├── flags: static_literal, decimal - │ │ ├── numerator: 1 - │ │ └── denominator: 1 - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (37,16)-(37,22)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (37,16)-(37,18) = "do" - │ └── closing_loc: (37,19)-(37,22) = "end" - └── @ CallNode (location: (39,0)-(39,20)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :a - ├── message_loc: (39,0)-(39,1) = "a" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (39,2)-(39,13)) - │ ├── flags: ∅ - │ └── arguments: (length: 2) - │ ├── @ CallNode (location: (39,2)-(39,9)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :b - │ │ ├── message_loc: (39,2)-(39,3) = "b" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: - │ │ @ BlockNode (location: (39,3)-(39,9)) - │ │ ├── flags: ∅ - │ │ ├── locals: [] - │ │ ├── parameters: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (39,4)-(39,8)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (39,4)-(39,8)) - │ │ │ ├── flags: newline, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :c - │ │ │ ├── message_loc: (39,4)-(39,5) = "c" - │ │ │ ├── opening_loc: (39,5)-(39,6) = "(" - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (39,6)-(39,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ CallNode (location: (39,6)-(39,7)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :d - │ │ │ │ ├── message_loc: (39,6)-(39,7) = "d" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── closing_loc: (39,7)-(39,8) = ")" - │ │ │ └── block: ∅ - │ │ ├── opening_loc: (39,3)-(39,4) = "{" - │ │ └── closing_loc: (39,8)-(39,9) = "}" - │ └── @ SymbolNode (location: (39,11)-(39,13)) - │ ├── flags: static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (39,11)-(39,12) = ":" - │ ├── value_loc: (39,12)-(39,13) = "e" - │ ├── closing_loc: ∅ - │ └── unescaped: "e" - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (39,14)-(39,20)) - ├── flags: ∅ - ├── locals: [] - ├── parameters: ∅ - ├── body: ∅ - ├── opening_loc: (39,14)-(39,16) = "do" - └── closing_loc: (39,17)-(39,20) = "end" diff --git a/test/prism/snapshots/whitequark/ruby_bug_11873_b.txt b/test/prism/snapshots/whitequark/ruby_bug_11873_b.txt deleted file mode 100644 index 263f4f8dd30b3e..00000000000000 --- a/test/prism/snapshots/whitequark/ruby_bug_11873_b.txt +++ /dev/null @@ -1,103 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,25)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,25)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,25)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :p - ├── message_loc: (1,0)-(1,1) = "p" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,2)-(1,18)) - │ ├── flags: ∅ - │ └── arguments: (length: 2) - │ ├── @ CallNode (location: (1,2)-(1,13)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :p - │ │ ├── message_loc: (1,2)-(1,3) = "p" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: - │ │ @ BlockNode (location: (1,3)-(1,13)) - │ │ ├── flags: ∅ - │ │ ├── locals: [] - │ │ ├── parameters: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (1,4)-(1,12)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 2) - │ │ │ ├── @ CallNode (location: (1,4)-(1,8)) - │ │ │ │ ├── flags: newline, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :p - │ │ │ │ ├── message_loc: (1,4)-(1,5) = "p" - │ │ │ │ ├── opening_loc: (1,5)-(1,6) = "(" - │ │ │ │ ├── arguments: - │ │ │ │ │ @ ArgumentsNode (location: (1,6)-(1,7)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── arguments: (length: 1) - │ │ │ │ │ └── @ CallNode (location: (1,6)-(1,7)) - │ │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ │ ├── receiver: ∅ - │ │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ │ ├── name: :p - │ │ │ │ │ ├── message_loc: (1,6)-(1,7) = "p" - │ │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ │ ├── arguments: ∅ - │ │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ │ └── block: ∅ - │ │ │ │ ├── closing_loc: (1,7)-(1,8) = ")" - │ │ │ │ └── block: ∅ - │ │ │ └── @ CallNode (location: (1,9)-(1,12)) - │ │ │ ├── flags: newline, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :p - │ │ │ ├── message_loc: (1,9)-(1,10) = "p" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (1,11)-(1,12)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ CallNode (location: (1,11)-(1,12)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :p - │ │ │ │ ├── message_loc: (1,11)-(1,12) = "p" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── opening_loc: (1,3)-(1,4) = "{" - │ │ └── closing_loc: (1,12)-(1,13) = "}" - │ └── @ CallNode (location: (1,15)-(1,18)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :tap - │ ├── message_loc: (1,15)-(1,18) = "tap" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,19)-(1,25)) - ├── flags: ∅ - ├── locals: [] - ├── parameters: ∅ - ├── body: ∅ - ├── opening_loc: (1,19)-(1,21) = "do" - └── closing_loc: (1,22)-(1,25) = "end" diff --git a/test/prism/snapshots/whitequark/ruby_bug_11989.txt b/test/prism/snapshots/whitequark/ruby_bug_11989.txt deleted file mode 100644 index 96bafab7e9eb71..00000000000000 --- a/test/prism/snapshots/whitequark/ruby_bug_11989.txt +++ /dev/null @@ -1,26 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,8)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,8)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,8)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :p - ├── message_loc: (1,0)-(1,1) = "p" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,2)-(1,8)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ StringNode (location: (1,2)-(1,8)) - │ ├── flags: ∅ - │ ├── opening_loc: (1,2)-(1,8) = "<<~\"E\"" - │ ├── content_loc: (2,0)-(3,0) = " x\\n y\n" - │ ├── closing_loc: (3,0)-(4,0) = "E\n" - │ └── unescaped: "x\n y\n" - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/whitequark/ruby_bug_11990.txt b/test/prism/snapshots/whitequark/ruby_bug_11990.txt deleted file mode 100644 index 095381d13085b3..00000000000000 --- a/test/prism/snapshots/whitequark/ruby_bug_11990.txt +++ /dev/null @@ -1,37 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,12)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,12)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,12)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :p - ├── message_loc: (1,0)-(1,1) = "p" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,2)-(1,12)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ InterpolatedStringNode (location: (1,2)-(1,12)) - │ ├── flags: static_literal - │ ├── opening_loc: ∅ - │ ├── parts: (length: 2) - │ │ ├── @ StringNode (location: (1,2)-(1,6)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: (1,2)-(1,6) = "<<~E" - │ │ │ ├── content_loc: (2,0)-(3,0) = " x\n" - │ │ │ ├── closing_loc: (3,0)-(4,0) = "E\n" - │ │ │ └── unescaped: "x\n" - │ │ └── @ StringNode (location: (1,7)-(1,12)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: (1,7)-(1,8) = "\"" - │ │ ├── content_loc: (1,8)-(1,11) = " y" - │ │ ├── closing_loc: (1,11)-(1,12) = "\"" - │ │ └── unescaped: " y" - │ └── closing_loc: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/whitequark/ruby_bug_12073.txt b/test/prism/snapshots/whitequark/ruby_bug_12073.txt deleted file mode 100644 index 0b20229de91190..00000000000000 --- a/test/prism/snapshots/whitequark/ruby_bug_12073.txt +++ /dev/null @@ -1,104 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,34)) -├── flags: ∅ -├── locals: [:a] -└── statements: - @ StatementsNode (location: (1,0)-(3,34)) - ├── flags: ∅ - └── body: (length: 3) - ├── @ LocalVariableWriteNode (location: (1,0)-(1,5)) - │ ├── flags: newline - │ ├── name: :a - │ ├── depth: 0 - │ ├── name_loc: (1,0)-(1,1) = "a" - │ ├── value: - │ │ @ IntegerNode (location: (1,4)-(1,5)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ └── operator_loc: (1,2)-(1,3) = "=" - ├── @ CallNode (location: (1,7)-(1,13)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (1,7)-(1,8) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,9)-(1,13)) - │ │ ├── flags: contains_keywords - │ │ └── arguments: (length: 1) - │ │ └── @ KeywordHashNode (location: (1,9)-(1,13)) - │ │ ├── flags: symbol_keys - │ │ └── elements: (length: 1) - │ │ └── @ AssocNode (location: (1,9)-(1,13)) - │ │ ├── flags: static_literal - │ │ ├── key: - │ │ │ @ SymbolNode (location: (1,9)-(1,11)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (1,9)-(1,10) = "b" - │ │ │ ├── closing_loc: (1,10)-(1,11) = ":" - │ │ │ └── unescaped: "b" - │ │ ├── value: - │ │ │ @ IntegerNode (location: (1,12)-(1,13)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── operator_loc: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── @ DefNode (location: (3,0)-(3,34)) - ├── flags: newline - ├── name: :foo - ├── name_loc: (3,4)-(3,7) = "foo" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (3,8)-(3,13)) - │ ├── flags: ∅ - │ ├── requireds: (length: 1) - │ │ └── @ RequiredParameterNode (location: (3,8)-(3,13)) - │ │ ├── flags: ∅ - │ │ └── name: :raise - │ ├── optionals: (length: 0) - │ ├── rest: ∅ - │ ├── posts: (length: 0) - │ ├── keywords: (length: 0) - │ ├── keyword_rest: ∅ - │ └── block: ∅ - ├── body: - │ @ StatementsNode (location: (3,15)-(3,29)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (3,15)-(3,29)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :raise - │ ├── message_loc: (3,15)-(3,20) = "raise" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (3,21)-(3,29)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 2) - │ │ ├── @ ConstantPathNode (location: (3,21)-(3,25)) - │ │ │ ├── flags: ∅ - │ │ │ ├── parent: - │ │ │ │ @ ConstantReadNode (location: (3,21)-(3,22)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :A - │ │ │ ├── name: :B - │ │ │ ├── delimiter_loc: (3,22)-(3,24) = "::" - │ │ │ └── name_loc: (3,24)-(3,25) = "B" - │ │ └── @ StringNode (location: (3,27)-(3,29)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (3,27)-(3,28) = "'" - │ │ ├── content_loc: (3,28)-(3,28) = "" - │ │ ├── closing_loc: (3,28)-(3,29) = "'" - │ │ └── unescaped: "" - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── locals: [:raise] - ├── def_keyword_loc: (3,0)-(3,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: ∅ - ├── rparen_loc: ∅ - ├── equal_loc: ∅ - └── end_keyword_loc: (3,31)-(3,34) = "end" diff --git a/test/prism/snapshots/whitequark/ruby_bug_12402.txt b/test/prism/snapshots/whitequark/ruby_bug_12402.txt deleted file mode 100644 index 6f915342c03624..00000000000000 --- a/test/prism/snapshots/whitequark/ruby_bug_12402.txt +++ /dev/null @@ -1,613 +0,0 @@ -@ ProgramNode (location: (1,0)-(27,31)) -├── flags: ∅ -├── locals: [:foo] -└── statements: - @ StatementsNode (location: (1,0)-(27,31)) - ├── flags: ∅ - └── body: (length: 14) - ├── @ LocalVariableOperatorWriteNode (location: (1,0)-(1,27)) - │ ├── flags: newline - │ ├── name_loc: (1,0)-(1,3) = "foo" - │ ├── binary_operator_loc: (1,4)-(1,6) = "+=" - │ ├── value: - │ │ @ RescueModifierNode (location: (1,7)-(1,27)) - │ │ ├── flags: ∅ - │ │ ├── expression: - │ │ │ @ CallNode (location: (1,7)-(1,16)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :raise - │ │ │ ├── message_loc: (1,7)-(1,12) = "raise" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (1,13)-(1,16)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ CallNode (location: (1,13)-(1,16)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :bar - │ │ │ │ ├── message_loc: (1,13)-(1,16) = "bar" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── keyword_loc: (1,17)-(1,23) = "rescue" - │ │ └── rescue_expression: - │ │ @ NilNode (location: (1,24)-(1,27)) - │ │ └── flags: static_literal - │ ├── name: :foo - │ ├── binary_operator: :+ - │ └── depth: 0 - ├── @ LocalVariableOperatorWriteNode (location: (3,0)-(3,28)) - │ ├── flags: newline - │ ├── name_loc: (3,0)-(3,3) = "foo" - │ ├── binary_operator_loc: (3,4)-(3,6) = "+=" - │ ├── value: - │ │ @ RescueModifierNode (location: (3,7)-(3,28)) - │ │ ├── flags: ∅ - │ │ ├── expression: - │ │ │ @ CallNode (location: (3,7)-(3,17)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :raise - │ │ │ ├── message_loc: (3,7)-(3,12) = "raise" - │ │ │ ├── opening_loc: (3,12)-(3,13) = "(" - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (3,13)-(3,16)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ CallNode (location: (3,13)-(3,16)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :bar - │ │ │ │ ├── message_loc: (3,13)-(3,16) = "bar" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── closing_loc: (3,16)-(3,17) = ")" - │ │ │ └── block: ∅ - │ │ ├── keyword_loc: (3,18)-(3,24) = "rescue" - │ │ └── rescue_expression: - │ │ @ NilNode (location: (3,25)-(3,28)) - │ │ └── flags: static_literal - │ ├── name: :foo - │ ├── binary_operator: :+ - │ └── depth: 0 - ├── @ LocalVariableWriteNode (location: (5,0)-(5,26)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── depth: 0 - │ ├── name_loc: (5,0)-(5,3) = "foo" - │ ├── value: - │ │ @ RescueModifierNode (location: (5,6)-(5,26)) - │ │ ├── flags: ∅ - │ │ ├── expression: - │ │ │ @ CallNode (location: (5,6)-(5,15)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :raise - │ │ │ ├── message_loc: (5,6)-(5,11) = "raise" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (5,12)-(5,15)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ CallNode (location: (5,12)-(5,15)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :bar - │ │ │ │ ├── message_loc: (5,12)-(5,15) = "bar" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── keyword_loc: (5,16)-(5,22) = "rescue" - │ │ └── rescue_expression: - │ │ @ NilNode (location: (5,23)-(5,26)) - │ │ └── flags: static_literal - │ └── operator_loc: (5,4)-(5,5) = "=" - ├── @ LocalVariableWriteNode (location: (7,0)-(7,27)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── depth: 0 - │ ├── name_loc: (7,0)-(7,3) = "foo" - │ ├── value: - │ │ @ RescueModifierNode (location: (7,6)-(7,27)) - │ │ ├── flags: ∅ - │ │ ├── expression: - │ │ │ @ CallNode (location: (7,6)-(7,16)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :raise - │ │ │ ├── message_loc: (7,6)-(7,11) = "raise" - │ │ │ ├── opening_loc: (7,11)-(7,12) = "(" - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (7,12)-(7,15)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ CallNode (location: (7,12)-(7,15)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :bar - │ │ │ │ ├── message_loc: (7,12)-(7,15) = "bar" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── closing_loc: (7,15)-(7,16) = ")" - │ │ │ └── block: ∅ - │ │ ├── keyword_loc: (7,17)-(7,23) = "rescue" - │ │ └── rescue_expression: - │ │ @ NilNode (location: (7,24)-(7,27)) - │ │ └── flags: static_literal - │ └── operator_loc: (7,4)-(7,5) = "=" - ├── @ CallOperatorWriteNode (location: (9,0)-(9,29)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (9,0)-(9,3)) - │ │ ├── flags: ∅ - │ │ ├── name: :foo - │ │ └── depth: 0 - │ ├── call_operator_loc: (9,3)-(9,4) = "." - │ ├── message_loc: (9,4)-(9,5) = "C" - │ ├── read_name: :C - │ ├── write_name: :C= - │ ├── binary_operator: :+ - │ ├── binary_operator_loc: (9,6)-(9,8) = "+=" - │ └── value: - │ @ RescueModifierNode (location: (9,9)-(9,29)) - │ ├── flags: ∅ - │ ├── expression: - │ │ @ CallNode (location: (9,9)-(9,18)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :raise - │ │ ├── message_loc: (9,9)-(9,14) = "raise" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (9,15)-(9,18)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ CallNode (location: (9,15)-(9,18)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (9,15)-(9,18) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── keyword_loc: (9,19)-(9,25) = "rescue" - │ └── rescue_expression: - │ @ NilNode (location: (9,26)-(9,29)) - │ └── flags: static_literal - ├── @ CallOperatorWriteNode (location: (11,0)-(11,30)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (11,0)-(11,3)) - │ │ ├── flags: ∅ - │ │ ├── name: :foo - │ │ └── depth: 0 - │ ├── call_operator_loc: (11,3)-(11,4) = "." - │ ├── message_loc: (11,4)-(11,5) = "C" - │ ├── read_name: :C - │ ├── write_name: :C= - │ ├── binary_operator: :+ - │ ├── binary_operator_loc: (11,6)-(11,8) = "+=" - │ └── value: - │ @ RescueModifierNode (location: (11,9)-(11,30)) - │ ├── flags: ∅ - │ ├── expression: - │ │ @ CallNode (location: (11,9)-(11,19)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :raise - │ │ ├── message_loc: (11,9)-(11,14) = "raise" - │ │ ├── opening_loc: (11,14)-(11,15) = "(" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (11,15)-(11,18)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ CallNode (location: (11,15)-(11,18)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (11,15)-(11,18) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── closing_loc: (11,18)-(11,19) = ")" - │ │ └── block: ∅ - │ ├── keyword_loc: (11,20)-(11,26) = "rescue" - │ └── rescue_expression: - │ @ NilNode (location: (11,27)-(11,30)) - │ └── flags: static_literal - ├── @ CallOperatorWriteNode (location: (13,0)-(13,29)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (13,0)-(13,3)) - │ │ ├── flags: ∅ - │ │ ├── name: :foo - │ │ └── depth: 0 - │ ├── call_operator_loc: (13,3)-(13,4) = "." - │ ├── message_loc: (13,4)-(13,5) = "m" - │ ├── read_name: :m - │ ├── write_name: :m= - │ ├── binary_operator: :+ - │ ├── binary_operator_loc: (13,6)-(13,8) = "+=" - │ └── value: - │ @ RescueModifierNode (location: (13,9)-(13,29)) - │ ├── flags: ∅ - │ ├── expression: - │ │ @ CallNode (location: (13,9)-(13,18)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :raise - │ │ ├── message_loc: (13,9)-(13,14) = "raise" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (13,15)-(13,18)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ CallNode (location: (13,15)-(13,18)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (13,15)-(13,18) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── keyword_loc: (13,19)-(13,25) = "rescue" - │ └── rescue_expression: - │ @ NilNode (location: (13,26)-(13,29)) - │ └── flags: static_literal - ├── @ CallOperatorWriteNode (location: (15,0)-(15,30)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (15,0)-(15,3)) - │ │ ├── flags: ∅ - │ │ ├── name: :foo - │ │ └── depth: 0 - │ ├── call_operator_loc: (15,3)-(15,4) = "." - │ ├── message_loc: (15,4)-(15,5) = "m" - │ ├── read_name: :m - │ ├── write_name: :m= - │ ├── binary_operator: :+ - │ ├── binary_operator_loc: (15,6)-(15,8) = "+=" - │ └── value: - │ @ RescueModifierNode (location: (15,9)-(15,30)) - │ ├── flags: ∅ - │ ├── expression: - │ │ @ CallNode (location: (15,9)-(15,19)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :raise - │ │ ├── message_loc: (15,9)-(15,14) = "raise" - │ │ ├── opening_loc: (15,14)-(15,15) = "(" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (15,15)-(15,18)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ CallNode (location: (15,15)-(15,18)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (15,15)-(15,18) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── closing_loc: (15,18)-(15,19) = ")" - │ │ └── block: ∅ - │ ├── keyword_loc: (15,20)-(15,26) = "rescue" - │ └── rescue_expression: - │ @ NilNode (location: (15,27)-(15,30)) - │ └── flags: static_literal - ├── @ ConstantPathOrWriteNode (location: (17,0)-(17,31)) - │ ├── flags: newline - │ ├── target: - │ │ @ ConstantPathNode (location: (17,0)-(17,6)) - │ │ ├── flags: ∅ - │ │ ├── parent: - │ │ │ @ LocalVariableReadNode (location: (17,0)-(17,3)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :foo - │ │ │ └── depth: 0 - │ │ ├── name: :C - │ │ ├── delimiter_loc: (17,3)-(17,5) = "::" - │ │ └── name_loc: (17,5)-(17,6) = "C" - │ ├── operator_loc: (17,7)-(17,10) = "||=" - │ └── value: - │ @ RescueModifierNode (location: (17,11)-(17,31)) - │ ├── flags: ∅ - │ ├── expression: - │ │ @ CallNode (location: (17,11)-(17,20)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :raise - │ │ ├── message_loc: (17,11)-(17,16) = "raise" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (17,17)-(17,20)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ CallNode (location: (17,17)-(17,20)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (17,17)-(17,20) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── keyword_loc: (17,21)-(17,27) = "rescue" - │ └── rescue_expression: - │ @ NilNode (location: (17,28)-(17,31)) - │ └── flags: static_literal - ├── @ ConstantPathOrWriteNode (location: (19,0)-(19,32)) - │ ├── flags: newline - │ ├── target: - │ │ @ ConstantPathNode (location: (19,0)-(19,6)) - │ │ ├── flags: ∅ - │ │ ├── parent: - │ │ │ @ LocalVariableReadNode (location: (19,0)-(19,3)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :foo - │ │ │ └── depth: 0 - │ │ ├── name: :C - │ │ ├── delimiter_loc: (19,3)-(19,5) = "::" - │ │ └── name_loc: (19,5)-(19,6) = "C" - │ ├── operator_loc: (19,7)-(19,10) = "||=" - │ └── value: - │ @ RescueModifierNode (location: (19,11)-(19,32)) - │ ├── flags: ∅ - │ ├── expression: - │ │ @ CallNode (location: (19,11)-(19,21)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :raise - │ │ ├── message_loc: (19,11)-(19,16) = "raise" - │ │ ├── opening_loc: (19,16)-(19,17) = "(" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (19,17)-(19,20)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ CallNode (location: (19,17)-(19,20)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (19,17)-(19,20) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── closing_loc: (19,20)-(19,21) = ")" - │ │ └── block: ∅ - │ ├── keyword_loc: (19,22)-(19,28) = "rescue" - │ └── rescue_expression: - │ @ NilNode (location: (19,29)-(19,32)) - │ └── flags: static_literal - ├── @ CallOperatorWriteNode (location: (21,0)-(21,30)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (21,0)-(21,3)) - │ │ ├── flags: ∅ - │ │ ├── name: :foo - │ │ └── depth: 0 - │ ├── call_operator_loc: (21,3)-(21,5) = "::" - │ ├── message_loc: (21,5)-(21,6) = "m" - │ ├── read_name: :m - │ ├── write_name: :m= - │ ├── binary_operator: :+ - │ ├── binary_operator_loc: (21,7)-(21,9) = "+=" - │ └── value: - │ @ RescueModifierNode (location: (21,10)-(21,30)) - │ ├── flags: ∅ - │ ├── expression: - │ │ @ CallNode (location: (21,10)-(21,19)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :raise - │ │ ├── message_loc: (21,10)-(21,15) = "raise" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (21,16)-(21,19)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ CallNode (location: (21,16)-(21,19)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (21,16)-(21,19) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── keyword_loc: (21,20)-(21,26) = "rescue" - │ └── rescue_expression: - │ @ NilNode (location: (21,27)-(21,30)) - │ └── flags: static_literal - ├── @ CallOperatorWriteNode (location: (23,0)-(23,31)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (23,0)-(23,3)) - │ │ ├── flags: ∅ - │ │ ├── name: :foo - │ │ └── depth: 0 - │ ├── call_operator_loc: (23,3)-(23,5) = "::" - │ ├── message_loc: (23,5)-(23,6) = "m" - │ ├── read_name: :m - │ ├── write_name: :m= - │ ├── binary_operator: :+ - │ ├── binary_operator_loc: (23,7)-(23,9) = "+=" - │ └── value: - │ @ RescueModifierNode (location: (23,10)-(23,31)) - │ ├── flags: ∅ - │ ├── expression: - │ │ @ CallNode (location: (23,10)-(23,20)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :raise - │ │ ├── message_loc: (23,10)-(23,15) = "raise" - │ │ ├── opening_loc: (23,15)-(23,16) = "(" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (23,16)-(23,19)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ CallNode (location: (23,16)-(23,19)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (23,16)-(23,19) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── closing_loc: (23,19)-(23,20) = ")" - │ │ └── block: ∅ - │ ├── keyword_loc: (23,21)-(23,27) = "rescue" - │ └── rescue_expression: - │ @ NilNode (location: (23,28)-(23,31)) - │ └── flags: static_literal - ├── @ IndexOperatorWriteNode (location: (25,0)-(25,30)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ LocalVariableReadNode (location: (25,0)-(25,3)) - │ │ ├── flags: ∅ - │ │ ├── name: :foo - │ │ └── depth: 0 - │ ├── call_operator_loc: ∅ - │ ├── opening_loc: (25,3)-(25,4) = "[" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (25,4)-(25,5)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (25,4)-(25,5)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 0 - │ ├── closing_loc: (25,5)-(25,6) = "]" - │ ├── block: ∅ - │ ├── binary_operator: :+ - │ ├── binary_operator_loc: (25,7)-(25,9) = "+=" - │ └── value: - │ @ RescueModifierNode (location: (25,10)-(25,30)) - │ ├── flags: ∅ - │ ├── expression: - │ │ @ CallNode (location: (25,10)-(25,19)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :raise - │ │ ├── message_loc: (25,10)-(25,15) = "raise" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (25,16)-(25,19)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ CallNode (location: (25,16)-(25,19)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (25,16)-(25,19) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── keyword_loc: (25,20)-(25,26) = "rescue" - │ └── rescue_expression: - │ @ NilNode (location: (25,27)-(25,30)) - │ └── flags: static_literal - └── @ IndexOperatorWriteNode (location: (27,0)-(27,31)) - ├── flags: newline - ├── receiver: - │ @ LocalVariableReadNode (location: (27,0)-(27,3)) - │ ├── flags: ∅ - │ ├── name: :foo - │ └── depth: 0 - ├── call_operator_loc: ∅ - ├── opening_loc: (27,3)-(27,4) = "[" - ├── arguments: - │ @ ArgumentsNode (location: (27,4)-(27,5)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ IntegerNode (location: (27,4)-(27,5)) - │ ├── flags: static_literal, decimal - │ └── value: 0 - ├── closing_loc: (27,5)-(27,6) = "]" - ├── block: ∅ - ├── binary_operator: :+ - ├── binary_operator_loc: (27,7)-(27,9) = "+=" - └── value: - @ RescueModifierNode (location: (27,10)-(27,31)) - ├── flags: ∅ - ├── expression: - │ @ CallNode (location: (27,10)-(27,20)) - │ ├── flags: ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :raise - │ ├── message_loc: (27,10)-(27,15) = "raise" - │ ├── opening_loc: (27,15)-(27,16) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (27,16)-(27,19)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (27,16)-(27,19)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (27,16)-(27,19) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (27,19)-(27,20) = ")" - │ └── block: ∅ - ├── keyword_loc: (27,21)-(27,27) = "rescue" - └── rescue_expression: - @ NilNode (location: (27,28)-(27,31)) - └── flags: static_literal diff --git a/test/prism/snapshots/whitequark/ruby_bug_12669.txt b/test/prism/snapshots/whitequark/ruby_bug_12669.txt deleted file mode 100644 index 9d1a924b79a0a6..00000000000000 --- a/test/prism/snapshots/whitequark/ruby_bug_12669.txt +++ /dev/null @@ -1,143 +0,0 @@ -@ ProgramNode (location: (1,0)-(7,16)) -├── flags: ∅ -├── locals: [:a, :b] -└── statements: - @ StatementsNode (location: (1,0)-(7,16)) - ├── flags: ∅ - └── body: (length: 4) - ├── @ LocalVariableOperatorWriteNode (location: (1,0)-(1,18)) - │ ├── flags: newline - │ ├── name_loc: (1,0)-(1,1) = "a" - │ ├── binary_operator_loc: (1,2)-(1,4) = "+=" - │ ├── value: - │ │ @ LocalVariableOperatorWriteNode (location: (1,5)-(1,18)) - │ │ ├── flags: ∅ - │ │ ├── name_loc: (1,5)-(1,6) = "b" - │ │ ├── binary_operator_loc: (1,7)-(1,9) = "+=" - │ │ ├── value: - │ │ │ @ CallNode (location: (1,10)-(1,18)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :raise - │ │ │ ├── message_loc: (1,10)-(1,15) = "raise" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (1,16)-(1,18)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ SymbolNode (location: (1,16)-(1,18)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: (1,16)-(1,17) = ":" - │ │ │ │ ├── value_loc: (1,17)-(1,18) = "x" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "x" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── name: :b - │ │ ├── binary_operator: :+ - │ │ └── depth: 0 - │ ├── name: :a - │ ├── binary_operator: :+ - │ └── depth: 0 - ├── @ LocalVariableOperatorWriteNode (location: (3,0)-(3,17)) - │ ├── flags: newline - │ ├── name_loc: (3,0)-(3,1) = "a" - │ ├── binary_operator_loc: (3,2)-(3,4) = "+=" - │ ├── value: - │ │ @ LocalVariableWriteNode (location: (3,5)-(3,17)) - │ │ ├── flags: ∅ - │ │ ├── name: :b - │ │ ├── depth: 0 - │ │ ├── name_loc: (3,5)-(3,6) = "b" - │ │ ├── value: - │ │ │ @ CallNode (location: (3,9)-(3,17)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :raise - │ │ │ ├── message_loc: (3,9)-(3,14) = "raise" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (3,15)-(3,17)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ SymbolNode (location: (3,15)-(3,17)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: (3,15)-(3,16) = ":" - │ │ │ │ ├── value_loc: (3,16)-(3,17) = "x" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "x" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── operator_loc: (3,7)-(3,8) = "=" - │ ├── name: :a - │ ├── binary_operator: :+ - │ └── depth: 0 - ├── @ LocalVariableWriteNode (location: (5,0)-(5,17)) - │ ├── flags: newline - │ ├── name: :a - │ ├── depth: 0 - │ ├── name_loc: (5,0)-(5,1) = "a" - │ ├── value: - │ │ @ LocalVariableOperatorWriteNode (location: (5,4)-(5,17)) - │ │ ├── flags: ∅ - │ │ ├── name_loc: (5,4)-(5,5) = "b" - │ │ ├── binary_operator_loc: (5,6)-(5,8) = "+=" - │ │ ├── value: - │ │ │ @ CallNode (location: (5,9)-(5,17)) - │ │ │ ├── flags: ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :raise - │ │ │ ├── message_loc: (5,9)-(5,14) = "raise" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: - │ │ │ │ @ ArgumentsNode (location: (5,15)-(5,17)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── arguments: (length: 1) - │ │ │ │ └── @ SymbolNode (location: (5,15)-(5,17)) - │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ │ ├── opening_loc: (5,15)-(5,16) = ":" - │ │ │ │ ├── value_loc: (5,16)-(5,17) = "x" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "x" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── name: :b - │ │ ├── binary_operator: :+ - │ │ └── depth: 0 - │ └── operator_loc: (5,2)-(5,3) = "=" - └── @ LocalVariableWriteNode (location: (7,0)-(7,16)) - ├── flags: newline - ├── name: :a - ├── depth: 0 - ├── name_loc: (7,0)-(7,1) = "a" - ├── value: - │ @ LocalVariableWriteNode (location: (7,4)-(7,16)) - │ ├── flags: ∅ - │ ├── name: :b - │ ├── depth: 0 - │ ├── name_loc: (7,4)-(7,5) = "b" - │ ├── value: - │ │ @ CallNode (location: (7,8)-(7,16)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :raise - │ │ ├── message_loc: (7,8)-(7,13) = "raise" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (7,14)-(7,16)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ SymbolNode (location: (7,14)-(7,16)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: (7,14)-(7,15) = ":" - │ │ │ ├── value_loc: (7,15)-(7,16) = "x" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "x" - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── operator_loc: (7,6)-(7,7) = "=" - └── operator_loc: (7,2)-(7,3) = "=" diff --git a/test/prism/snapshots/whitequark/ruby_bug_12686.txt b/test/prism/snapshots/whitequark/ruby_bug_12686.txt deleted file mode 100644 index 515ee75674238a..00000000000000 --- a/test/prism/snapshots/whitequark/ruby_bug_12686.txt +++ /dev/null @@ -1,45 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,16)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,16)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,16)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :f - ├── message_loc: (1,0)-(1,1) = "f" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,2)-(1,16)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ ParenthesesNode (location: (1,2)-(1,16)) - │ ├── flags: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (1,3)-(1,15)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ RescueModifierNode (location: (1,3)-(1,15)) - │ │ ├── flags: newline - │ │ ├── expression: - │ │ │ @ CallNode (location: (1,3)-(1,4)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :g - │ │ │ ├── message_loc: (1,3)-(1,4) = "g" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── keyword_loc: (1,5)-(1,11) = "rescue" - │ │ └── rescue_expression: - │ │ @ NilNode (location: (1,12)-(1,15)) - │ │ └── flags: static_literal - │ ├── opening_loc: (1,2)-(1,3) = "(" - │ └── closing_loc: (1,15)-(1,16) = ")" - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/whitequark/ruby_bug_13547.txt b/test/prism/snapshots/whitequark/ruby_bug_13547.txt deleted file mode 100644 index d0ac79d7ff4201..00000000000000 --- a/test/prism/snapshots/whitequark/ruby_bug_13547.txt +++ /dev/null @@ -1,34 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,9)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,9)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,9)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (1,0)-(1,4)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :meth - │ ├── message_loc: (1,0)-(1,4) = "meth" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: ∅ - ├── name: :[] - ├── message_loc: (1,4)-(1,6) = "[]" - ├── opening_loc: (1,4)-(1,5) = "[" - ├── arguments: ∅ - ├── closing_loc: (1,5)-(1,6) = "]" - └── block: - @ BlockNode (location: (1,7)-(1,9)) - ├── flags: ∅ - ├── locals: [] - ├── parameters: ∅ - ├── body: ∅ - ├── opening_loc: (1,7)-(1,8) = "{" - └── closing_loc: (1,8)-(1,9) = "}" diff --git a/test/prism/snapshots/whitequark/ruby_bug_14690.txt b/test/prism/snapshots/whitequark/ruby_bug_14690.txt deleted file mode 100644 index 377c0e0a0ea3c7..00000000000000 --- a/test/prism/snapshots/whitequark/ruby_bug_14690.txt +++ /dev/null @@ -1,65 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,23)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,23)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,23)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :let - ├── message_loc: (1,0)-(1,3) = "let" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,4)-(1,6)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ ParenthesesNode (location: (1,4)-(1,6)) - │ ├── flags: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (1,4)-(1,5) = "(" - │ └── closing_loc: (1,5)-(1,6) = ")" - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,7)-(1,23)) - ├── flags: ∅ - ├── locals: [] - ├── parameters: ∅ - ├── body: - │ @ StatementsNode (location: (1,9)-(1,21)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,9)-(1,21)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :m - │ ├── message_loc: (1,9)-(1,10) = "m" - │ ├── opening_loc: (1,10)-(1,11) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,11)-(1,12)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (1,11)-(1,12)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :a - │ │ ├── message_loc: (1,11)-(1,12) = "a" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (1,12)-(1,13) = ")" - │ └── block: - │ @ BlockNode (location: (1,14)-(1,21)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (1,14)-(1,16) = "do" - │ └── closing_loc: (1,18)-(1,21) = "end" - ├── opening_loc: (1,7)-(1,8) = "{" - └── closing_loc: (1,22)-(1,23) = "}" diff --git a/test/prism/snapshots/whitequark/ruby_bug_15789.txt b/test/prism/snapshots/whitequark/ruby_bug_15789.txt deleted file mode 100644 index c6ac7447a86c7d..00000000000000 --- a/test/prism/snapshots/whitequark/ruby_bug_15789.txt +++ /dev/null @@ -1,140 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,19)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,19)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ CallNode (location: (1,0)-(1,20)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :m - │ ├── message_loc: (1,0)-(1,1) = "m" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,2)-(1,20)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ LambdaNode (location: (1,2)-(1,20)) - │ │ ├── flags: ∅ - │ │ ├── locals: [:a] - │ │ ├── operator_loc: (1,2)-(1,4) = "->" - │ │ ├── opening_loc: (1,17)-(1,18) = "{" - │ │ ├── closing_loc: (1,19)-(1,20) = "}" - │ │ ├── parameters: - │ │ │ @ BlockParametersNode (location: (1,4)-(1,16)) - │ │ │ ├── flags: ∅ - │ │ │ ├── parameters: - │ │ │ │ @ ParametersNode (location: (1,5)-(1,15)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── requireds: (length: 0) - │ │ │ │ ├── optionals: (length: 1) - │ │ │ │ │ └── @ OptionalParameterNode (location: (1,5)-(1,15)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── name: :a - │ │ │ │ │ ├── name_loc: (1,5)-(1,6) = "a" - │ │ │ │ │ ├── operator_loc: (1,7)-(1,8) = "=" - │ │ │ │ │ └── value: - │ │ │ │ │ @ LambdaNode (location: (1,9)-(1,15)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ ├── locals: [:_1] - │ │ │ │ │ ├── operator_loc: (1,9)-(1,11) = "->" - │ │ │ │ │ ├── opening_loc: (1,11)-(1,12) = "{" - │ │ │ │ │ ├── closing_loc: (1,14)-(1,15) = "}" - │ │ │ │ │ ├── parameters: - │ │ │ │ │ │ @ NumberedParametersNode (location: (1,9)-(1,15)) - │ │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ │ └── maximum: 1 - │ │ │ │ │ └── body: - │ │ │ │ │ @ StatementsNode (location: (1,12)-(1,14)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── body: (length: 1) - │ │ │ │ │ └── @ LocalVariableReadNode (location: (1,12)-(1,14)) - │ │ │ │ │ ├── flags: newline - │ │ │ │ │ ├── name: :_1 - │ │ │ │ │ └── depth: 0 - │ │ │ │ ├── rest: ∅ - │ │ │ │ ├── posts: (length: 0) - │ │ │ │ ├── keywords: (length: 0) - │ │ │ │ ├── keyword_rest: ∅ - │ │ │ │ └── block: ∅ - │ │ │ ├── locals: (length: 0) - │ │ │ ├── opening_loc: (1,4)-(1,5) = "(" - │ │ │ └── closing_loc: (1,15)-(1,16) = ")" - │ │ └── body: - │ │ @ StatementsNode (location: (1,18)-(1,19)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ LocalVariableReadNode (location: (1,18)-(1,19)) - │ │ ├── flags: newline - │ │ ├── name: :a - │ │ └── depth: 0 - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── @ CallNode (location: (3,0)-(3,19)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :m - ├── message_loc: (3,0)-(3,1) = "m" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (3,2)-(3,19)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ LambdaNode (location: (3,2)-(3,19)) - │ ├── flags: ∅ - │ ├── locals: [:a] - │ ├── operator_loc: (3,2)-(3,4) = "->" - │ ├── opening_loc: (3,16)-(3,17) = "{" - │ ├── closing_loc: (3,18)-(3,19) = "}" - │ ├── parameters: - │ │ @ BlockParametersNode (location: (3,4)-(3,15)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (3,5)-(3,14)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 0) - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 1) - │ │ │ │ └── @ OptionalKeywordParameterNode (location: (3,5)-(3,14)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :a - │ │ │ │ ├── name_loc: (3,5)-(3,7) = "a:" - │ │ │ │ └── value: - │ │ │ │ @ LambdaNode (location: (3,8)-(3,14)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── locals: [:_1] - │ │ │ │ ├── operator_loc: (3,8)-(3,10) = "->" - │ │ │ │ ├── opening_loc: (3,10)-(3,11) = "{" - │ │ │ │ ├── closing_loc: (3,13)-(3,14) = "}" - │ │ │ │ ├── parameters: - │ │ │ │ │ @ NumberedParametersNode (location: (3,8)-(3,14)) - │ │ │ │ │ ├── flags: ∅ - │ │ │ │ │ └── maximum: 1 - │ │ │ │ └── body: - │ │ │ │ @ StatementsNode (location: (3,11)-(3,13)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ LocalVariableReadNode (location: (3,11)-(3,13)) - │ │ │ │ ├── flags: newline - │ │ │ │ ├── name: :_1 - │ │ │ │ └── depth: 0 - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: (3,4)-(3,5) = "(" - │ │ └── closing_loc: (3,14)-(3,15) = ")" - │ └── body: - │ @ StatementsNode (location: (3,17)-(3,18)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ LocalVariableReadNode (location: (3,17)-(3,18)) - │ ├── flags: newline - │ ├── name: :a - │ └── depth: 0 - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/whitequark/ruby_bug_9669.txt b/test/prism/snapshots/whitequark/ruby_bug_9669.txt deleted file mode 100644 index c771c50c8a67d1..00000000000000 --- a/test/prism/snapshots/whitequark/ruby_bug_9669.txt +++ /dev/null @@ -1,67 +0,0 @@ -@ ProgramNode (location: (1,0)-(8,1)) -├── flags: ∅ -├── locals: [:o] -└── statements: - @ StatementsNode (location: (1,0)-(8,1)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ DefNode (location: (1,0)-(3,3)) - │ ├── flags: newline - │ ├── name: :a - │ ├── name_loc: (1,4)-(1,5) = "a" - │ ├── receiver: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,6)-(1,8)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 1) - │ │ │ └── @ RequiredKeywordParameterNode (location: (1,6)-(1,8)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :b - │ │ │ └── name_loc: (1,6)-(1,8) = "b:" - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (2,0)-(2,6)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ ReturnNode (location: (2,0)-(2,6)) - │ │ ├── flags: newline - │ │ ├── keyword_loc: (2,0)-(2,6) = "return" - │ │ └── arguments: ∅ - │ ├── locals: [:b] - │ ├── def_keyword_loc: (1,0)-(1,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (3,0)-(3,3) = "end" - └── @ LocalVariableWriteNode (location: (5,0)-(8,1)) - ├── flags: newline - ├── name: :o - ├── depth: 0 - ├── name_loc: (5,0)-(5,1) = "o" - ├── value: - │ @ HashNode (location: (5,4)-(8,1)) - │ ├── flags: static_literal - │ ├── opening_loc: (5,4)-(5,5) = "{" - │ ├── elements: (length: 1) - │ │ └── @ AssocNode (location: (6,0)-(7,1)) - │ │ ├── flags: static_literal - │ │ ├── key: - │ │ │ @ SymbolNode (location: (6,0)-(6,2)) - │ │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── value_loc: (6,0)-(6,1) = "a" - │ │ │ ├── closing_loc: (6,1)-(6,2) = ":" - │ │ │ └── unescaped: "a" - │ │ ├── value: - │ │ │ @ IntegerNode (location: (7,0)-(7,1)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── operator_loc: ∅ - │ └── closing_loc: (8,0)-(8,1) = "}" - └── operator_loc: (5,2)-(5,3) = "=" diff --git a/test/prism/snapshots/whitequark/sclass.txt b/test/prism/snapshots/whitequark/sclass.txt deleted file mode 100644 index 346d1a4149cbe9..00000000000000 --- a/test/prism/snapshots/whitequark/sclass.txt +++ /dev/null @@ -1,30 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,22)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,22)) - ├── flags: ∅ - └── body: (length: 1) - └── @ SingletonClassNode (location: (1,0)-(1,22)) - ├── flags: newline - ├── locals: [] - ├── class_keyword_loc: (1,0)-(1,5) = "class" - ├── operator_loc: (1,6)-(1,8) = "<<" - ├── expression: - │ @ CallNode (location: (1,9)-(1,12)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (1,9)-(1,12) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── body: - │ @ StatementsNode (location: (1,14)-(1,17)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ NilNode (location: (1,14)-(1,17)) - │ └── flags: newline, static_literal - └── end_keyword_loc: (1,19)-(1,22) = "end" diff --git a/test/prism/snapshots/whitequark/self.txt b/test/prism/snapshots/whitequark/self.txt deleted file mode 100644 index e3a1a9f7df9f2a..00000000000000 --- a/test/prism/snapshots/whitequark/self.txt +++ /dev/null @@ -1,9 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,4)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,4)) - ├── flags: ∅ - └── body: (length: 1) - └── @ SelfNode (location: (1,0)-(1,4)) - └── flags: newline diff --git a/test/prism/snapshots/whitequark/send_attr_asgn.txt b/test/prism/snapshots/whitequark/send_attr_asgn.txt deleted file mode 100644 index faeb5a7c7cbb0c..00000000000000 --- a/test/prism/snapshots/whitequark/send_attr_asgn.txt +++ /dev/null @@ -1,109 +0,0 @@ -@ ProgramNode (location: (1,0)-(7,10)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(7,10)) - ├── flags: ∅ - └── body: (length: 4) - ├── @ CallNode (location: (1,0)-(1,9)) - │ ├── flags: newline, attribute_write - │ ├── receiver: - │ │ @ CallNode (location: (1,0)-(1,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (1,0)-(1,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (1,3)-(1,4) = "." - │ ├── name: :A= - │ ├── message_loc: (1,4)-(1,5) = "A" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,8)-(1,9)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (1,8)-(1,9)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (3,0)-(3,9)) - │ ├── flags: newline, attribute_write - │ ├── receiver: - │ │ @ CallNode (location: (3,0)-(3,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (3,0)-(3,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (3,3)-(3,4) = "." - │ ├── name: :a= - │ ├── message_loc: (3,4)-(3,5) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (3,8)-(3,9)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (3,8)-(3,9)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ ConstantPathWriteNode (location: (5,0)-(5,10)) - │ ├── flags: newline - │ ├── target: - │ │ @ ConstantPathNode (location: (5,0)-(5,6)) - │ │ ├── flags: ∅ - │ │ ├── parent: - │ │ │ @ CallNode (location: (5,0)-(5,3)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :foo - │ │ │ ├── message_loc: (5,0)-(5,3) = "foo" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── name: :A - │ │ ├── delimiter_loc: (5,3)-(5,5) = "::" - │ │ └── name_loc: (5,5)-(5,6) = "A" - │ ├── operator_loc: (5,7)-(5,8) = "=" - │ └── value: - │ @ IntegerNode (location: (5,9)-(5,10)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - └── @ CallNode (location: (7,0)-(7,10)) - ├── flags: newline, attribute_write - ├── receiver: - │ @ CallNode (location: (7,0)-(7,3)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (7,0)-(7,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: (7,3)-(7,5) = "::" - ├── name: :a= - ├── message_loc: (7,5)-(7,6) = "a" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (7,9)-(7,10)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ IntegerNode (location: (7,9)-(7,10)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/whitequark/send_attr_asgn_conditional.txt b/test/prism/snapshots/whitequark/send_attr_asgn_conditional.txt deleted file mode 100644 index cb849e3f053ca9..00000000000000 --- a/test/prism/snapshots/whitequark/send_attr_asgn_conditional.txt +++ /dev/null @@ -1,33 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,8)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,8)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,8)) - ├── flags: newline, safe_navigation, attribute_write - ├── receiver: - │ @ CallNode (location: (1,0)-(1,1)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (1,0)-(1,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: (1,1)-(1,3) = "&." - ├── name: :b= - ├── message_loc: (1,3)-(1,4) = "b" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,7)-(1,8)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ IntegerNode (location: (1,7)-(1,8)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/whitequark/send_binary_op.txt b/test/prism/snapshots/whitequark/send_binary_op.txt deleted file mode 100644 index 49a2cffa659ae8..00000000000000 --- a/test/prism/snapshots/whitequark/send_binary_op.txt +++ /dev/null @@ -1,553 +0,0 @@ -@ ProgramNode (location: (1,0)-(41,7)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(41,7)) - ├── flags: ∅ - └── body: (length: 21) - ├── @ CallNode (location: (1,0)-(1,8)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (1,0)-(1,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (1,0)-(1,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :!= - │ ├── message_loc: (1,4)-(1,6) = "!=" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,7)-(1,8)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (1,7)-(1,8)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (3,0)-(3,8)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (3,0)-(3,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (3,0)-(3,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :!~ - │ ├── message_loc: (3,4)-(3,6) = "!~" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (3,7)-(3,8)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (3,7)-(3,8)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (5,0)-(5,7)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (5,0)-(5,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (5,0)-(5,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :% - │ ├── message_loc: (5,4)-(5,5) = "%" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (5,6)-(5,7)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (5,6)-(5,7)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (7,0)-(7,7)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (7,0)-(7,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (7,0)-(7,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :& - │ ├── message_loc: (7,4)-(7,5) = "&" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (7,6)-(7,7)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (7,6)-(7,7)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (9,0)-(9,7)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (9,0)-(9,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (9,0)-(9,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :* - │ ├── message_loc: (9,4)-(9,5) = "*" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (9,6)-(9,7)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (9,6)-(9,7)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (11,0)-(11,8)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (11,0)-(11,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (11,0)-(11,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :** - │ ├── message_loc: (11,4)-(11,6) = "**" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (11,7)-(11,8)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (11,7)-(11,8)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (13,0)-(13,7)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (13,0)-(13,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (13,0)-(13,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :+ - │ ├── message_loc: (13,4)-(13,5) = "+" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (13,6)-(13,7)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (13,6)-(13,7)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (15,0)-(15,7)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (15,0)-(15,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (15,0)-(15,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :- - │ ├── message_loc: (15,4)-(15,5) = "-" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (15,6)-(15,7)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (15,6)-(15,7)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (17,0)-(17,7)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (17,0)-(17,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (17,0)-(17,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :/ - │ ├── message_loc: (17,4)-(17,5) = "/" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (17,6)-(17,7)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (17,6)-(17,7)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (19,0)-(19,7)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (19,0)-(19,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (19,0)-(19,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :< - │ ├── message_loc: (19,4)-(19,5) = "<" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (19,6)-(19,7)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (19,6)-(19,7)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (21,0)-(21,8)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (21,0)-(21,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (21,0)-(21,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :<< - │ ├── message_loc: (21,4)-(21,6) = "<<" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (21,7)-(21,8)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (21,7)-(21,8)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (23,0)-(23,8)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (23,0)-(23,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (23,0)-(23,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :<= - │ ├── message_loc: (23,4)-(23,6) = "<=" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (23,7)-(23,8)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (23,7)-(23,8)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (25,0)-(25,9)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (25,0)-(25,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (25,0)-(25,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :<=> - │ ├── message_loc: (25,4)-(25,7) = "<=>" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (25,8)-(25,9)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (25,8)-(25,9)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (27,0)-(27,8)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (27,0)-(27,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (27,0)-(27,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :== - │ ├── message_loc: (27,4)-(27,6) = "==" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (27,7)-(27,8)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (27,7)-(27,8)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (29,0)-(29,9)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (29,0)-(29,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (29,0)-(29,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :=== - │ ├── message_loc: (29,4)-(29,7) = "===" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (29,8)-(29,9)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (29,8)-(29,9)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (31,0)-(31,8)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (31,0)-(31,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (31,0)-(31,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :=~ - │ ├── message_loc: (31,4)-(31,6) = "=~" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (31,7)-(31,8)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (31,7)-(31,8)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (33,0)-(33,7)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (33,0)-(33,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (33,0)-(33,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :> - │ ├── message_loc: (33,4)-(33,5) = ">" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (33,6)-(33,7)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (33,6)-(33,7)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (35,0)-(35,8)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (35,0)-(35,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (35,0)-(35,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :>= - │ ├── message_loc: (35,4)-(35,6) = ">=" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (35,7)-(35,8)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (35,7)-(35,8)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (37,0)-(37,8)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (37,0)-(37,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (37,0)-(37,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :>> - │ ├── message_loc: (37,4)-(37,6) = ">>" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (37,7)-(37,8)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (37,7)-(37,8)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (39,0)-(39,7)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (39,0)-(39,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (39,0)-(39,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :^ - │ ├── message_loc: (39,4)-(39,5) = "^" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (39,6)-(39,7)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (39,6)-(39,7)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── @ CallNode (location: (41,0)-(41,7)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (41,0)-(41,3)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (41,0)-(41,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: ∅ - ├── name: :| - ├── message_loc: (41,4)-(41,5) = "|" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (41,6)-(41,7)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ IntegerNode (location: (41,6)-(41,7)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/whitequark/send_block_chain_cmd.txt b/test/prism/snapshots/whitequark/send_block_chain_cmd.txt deleted file mode 100644 index bce45c38eed623..00000000000000 --- a/test/prism/snapshots/whitequark/send_block_chain_cmd.txt +++ /dev/null @@ -1,337 +0,0 @@ -@ ProgramNode (location: (1,0)-(13,23)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(13,23)) - ├── flags: ∅ - └── body: (length: 7) - ├── @ CallNode (location: (1,0)-(1,21)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (1,0)-(1,13)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :meth - │ │ ├── message_loc: (1,0)-(1,4) = "meth" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (1,5)-(1,6)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (1,5)-(1,6)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── closing_loc: ∅ - │ │ └── block: - │ │ @ BlockNode (location: (1,7)-(1,13)) - │ │ ├── flags: ∅ - │ │ ├── locals: [] - │ │ ├── parameters: ∅ - │ │ ├── body: ∅ - │ │ ├── opening_loc: (1,7)-(1,9) = "do" - │ │ └── closing_loc: (1,10)-(1,13) = "end" - │ ├── call_operator_loc: (1,13)-(1,14) = "." - │ ├── name: :fun - │ ├── message_loc: (1,14)-(1,17) = "fun" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,18)-(1,21)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (1,18)-(1,21)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (1,18)-(1,21) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (3,0)-(3,28)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (3,0)-(3,13)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :meth - │ │ ├── message_loc: (3,0)-(3,4) = "meth" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (3,5)-(3,6)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (3,5)-(3,6)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── closing_loc: ∅ - │ │ └── block: - │ │ @ BlockNode (location: (3,7)-(3,13)) - │ │ ├── flags: ∅ - │ │ ├── locals: [] - │ │ ├── parameters: ∅ - │ │ ├── body: ∅ - │ │ ├── opening_loc: (3,7)-(3,9) = "do" - │ │ └── closing_loc: (3,10)-(3,13) = "end" - │ ├── call_operator_loc: (3,13)-(3,14) = "." - │ ├── name: :fun - │ ├── message_loc: (3,14)-(3,17) = "fun" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (3,18)-(3,21)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (3,18)-(3,21)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (3,18)-(3,21) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (3,22)-(3,28)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (3,22)-(3,24) = "do" - │ └── closing_loc: (3,25)-(3,28) = "end" - ├── @ CallNode (location: (5,0)-(5,20)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (5,0)-(5,13)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :meth - │ │ ├── message_loc: (5,0)-(5,4) = "meth" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (5,5)-(5,6)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (5,5)-(5,6)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── closing_loc: ∅ - │ │ └── block: - │ │ @ BlockNode (location: (5,7)-(5,13)) - │ │ ├── flags: ∅ - │ │ ├── locals: [] - │ │ ├── parameters: ∅ - │ │ ├── body: ∅ - │ │ ├── opening_loc: (5,7)-(5,9) = "do" - │ │ └── closing_loc: (5,10)-(5,13) = "end" - │ ├── call_operator_loc: (5,13)-(5,14) = "." - │ ├── name: :fun - │ ├── message_loc: (5,14)-(5,17) = "fun" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (5,18)-(5,20)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (5,18)-(5,19) = "{" - │ └── closing_loc: (5,19)-(5,20) = "}" - ├── @ CallNode (location: (7,0)-(7,22)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (7,0)-(7,13)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :meth - │ │ ├── message_loc: (7,0)-(7,4) = "meth" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (7,5)-(7,6)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (7,5)-(7,6)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── closing_loc: ∅ - │ │ └── block: - │ │ @ BlockNode (location: (7,7)-(7,13)) - │ │ ├── flags: ∅ - │ │ ├── locals: [] - │ │ ├── parameters: ∅ - │ │ ├── body: ∅ - │ │ ├── opening_loc: (7,7)-(7,9) = "do" - │ │ └── closing_loc: (7,10)-(7,13) = "end" - │ ├── call_operator_loc: (7,13)-(7,14) = "." - │ ├── name: :fun - │ ├── message_loc: (7,14)-(7,17) = "fun" - │ ├── opening_loc: (7,17)-(7,18) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (7,18)-(7,21)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (7,18)-(7,21)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (7,18)-(7,21) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (7,21)-(7,22) = ")" - │ └── block: ∅ - ├── @ CallNode (location: (9,0)-(9,25)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (9,0)-(9,13)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :meth - │ │ ├── message_loc: (9,0)-(9,4) = "meth" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (9,5)-(9,6)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (9,5)-(9,6)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── closing_loc: ∅ - │ │ └── block: - │ │ @ BlockNode (location: (9,7)-(9,13)) - │ │ ├── flags: ∅ - │ │ ├── locals: [] - │ │ ├── parameters: ∅ - │ │ ├── body: ∅ - │ │ ├── opening_loc: (9,7)-(9,9) = "do" - │ │ └── closing_loc: (9,10)-(9,13) = "end" - │ ├── call_operator_loc: (9,13)-(9,14) = "." - │ ├── name: :fun - │ ├── message_loc: (9,14)-(9,17) = "fun" - │ ├── opening_loc: (9,17)-(9,18) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (9,18)-(9,21)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (9,18)-(9,21)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (9,18)-(9,21) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: (9,21)-(9,22) = ")" - │ └── block: - │ @ BlockNode (location: (9,23)-(9,25)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (9,23)-(9,24) = "{" - │ └── closing_loc: (9,24)-(9,25) = "}" - ├── @ CallNode (location: (11,0)-(11,22)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (11,0)-(11,13)) - │ │ ├── flags: ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :meth - │ │ ├── message_loc: (11,0)-(11,4) = "meth" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (11,5)-(11,6)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (11,5)-(11,6)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── closing_loc: ∅ - │ │ └── block: - │ │ @ BlockNode (location: (11,7)-(11,13)) - │ │ ├── flags: ∅ - │ │ ├── locals: [] - │ │ ├── parameters: ∅ - │ │ ├── body: ∅ - │ │ ├── opening_loc: (11,7)-(11,9) = "do" - │ │ └── closing_loc: (11,10)-(11,13) = "end" - │ ├── call_operator_loc: (11,13)-(11,15) = "::" - │ ├── name: :fun - │ ├── message_loc: (11,15)-(11,18) = "fun" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (11,19)-(11,22)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (11,19)-(11,22)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (11,19)-(11,22) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── @ CallNode (location: (13,0)-(13,23)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (13,0)-(13,13)) - │ ├── flags: ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :meth - │ ├── message_loc: (13,0)-(13,4) = "meth" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (13,5)-(13,6)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (13,5)-(13,6)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (13,7)-(13,13)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (13,7)-(13,9) = "do" - │ └── closing_loc: (13,10)-(13,13) = "end" - ├── call_operator_loc: (13,13)-(13,15) = "::" - ├── name: :fun - ├── message_loc: (13,15)-(13,18) = "fun" - ├── opening_loc: (13,18)-(13,19) = "(" - ├── arguments: - │ @ ArgumentsNode (location: (13,19)-(13,22)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ CallNode (location: (13,19)-(13,22)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :bar - │ ├── message_loc: (13,19)-(13,22) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── closing_loc: (13,22)-(13,23) = ")" - └── block: ∅ diff --git a/test/prism/snapshots/whitequark/send_block_conditional.txt b/test/prism/snapshots/whitequark/send_block_conditional.txt deleted file mode 100644 index 86ef0dbf36eddd..00000000000000 --- a/test/prism/snapshots/whitequark/send_block_conditional.txt +++ /dev/null @@ -1,34 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,11)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,11)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,11)) - ├── flags: newline, safe_navigation - ├── receiver: - │ @ CallNode (location: (1,0)-(1,3)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (1,0)-(1,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: (1,3)-(1,5) = "&." - ├── name: :bar - ├── message_loc: (1,5)-(1,8) = "bar" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,9)-(1,11)) - ├── flags: ∅ - ├── locals: [] - ├── parameters: ∅ - ├── body: ∅ - ├── opening_loc: (1,9)-(1,10) = "{" - └── closing_loc: (1,10)-(1,11) = "}" diff --git a/test/prism/snapshots/whitequark/send_call.txt b/test/prism/snapshots/whitequark/send_call.txt deleted file mode 100644 index 4ed17fbaee07f0..00000000000000 --- a/test/prism/snapshots/whitequark/send_call.txt +++ /dev/null @@ -1,59 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,8)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,8)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ CallNode (location: (1,0)-(1,7)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (1,0)-(1,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (1,0)-(1,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (1,3)-(1,4) = "." - │ ├── name: :call - │ ├── message_loc: ∅ - │ ├── opening_loc: (1,4)-(1,5) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,5)-(1,6)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (1,5)-(1,6)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── closing_loc: (1,6)-(1,7) = ")" - │ └── block: ∅ - └── @ CallNode (location: (3,0)-(3,8)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (3,0)-(3,3)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (3,0)-(3,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: (3,3)-(3,5) = "::" - ├── name: :call - ├── message_loc: ∅ - ├── opening_loc: (3,5)-(3,6) = "(" - ├── arguments: - │ @ ArgumentsNode (location: (3,6)-(3,7)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ IntegerNode (location: (3,6)-(3,7)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── closing_loc: (3,7)-(3,8) = ")" - └── block: ∅ diff --git a/test/prism/snapshots/whitequark/send_conditional.txt b/test/prism/snapshots/whitequark/send_conditional.txt deleted file mode 100644 index 7faa6ac04e0739..00000000000000 --- a/test/prism/snapshots/whitequark/send_conditional.txt +++ /dev/null @@ -1,27 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,4)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,4)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,4)) - ├── flags: newline, safe_navigation - ├── receiver: - │ @ CallNode (location: (1,0)-(1,1)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (1,0)-(1,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: (1,1)-(1,3) = "&." - ├── name: :b - ├── message_loc: (1,3)-(1,4) = "b" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/whitequark/send_index.txt b/test/prism/snapshots/whitequark/send_index.txt deleted file mode 100644 index 5aec47c484912f..00000000000000 --- a/test/prism/snapshots/whitequark/send_index.txt +++ /dev/null @@ -1,36 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,9)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,9)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,9)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (1,0)-(1,3)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (1,0)-(1,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: ∅ - ├── name: :[] - ├── message_loc: (1,3)-(1,9) = "[1, 2]" - ├── opening_loc: (1,3)-(1,4) = "[" - ├── arguments: - │ @ ArgumentsNode (location: (1,4)-(1,8)) - │ ├── flags: ∅ - │ └── arguments: (length: 2) - │ ├── @ IntegerNode (location: (1,4)-(1,5)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ └── @ IntegerNode (location: (1,7)-(1,8)) - │ ├── flags: static_literal, decimal - │ └── value: 2 - ├── closing_loc: (1,8)-(1,9) = "]" - └── block: ∅ diff --git a/test/prism/snapshots/whitequark/send_index_asgn.txt b/test/prism/snapshots/whitequark/send_index_asgn.txt deleted file mode 100644 index fe0f71956a0d26..00000000000000 --- a/test/prism/snapshots/whitequark/send_index_asgn.txt +++ /dev/null @@ -1,39 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,13)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,13)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,13)) - ├── flags: newline, attribute_write - ├── receiver: - │ @ CallNode (location: (1,0)-(1,3)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (1,0)-(1,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: ∅ - ├── name: :[]= - ├── message_loc: (1,3)-(1,9) = "[1, 2]" - ├── opening_loc: (1,3)-(1,4) = "[" - ├── arguments: - │ @ ArgumentsNode (location: (1,4)-(1,13)) - │ ├── flags: ∅ - │ └── arguments: (length: 3) - │ ├── @ IntegerNode (location: (1,4)-(1,5)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── @ IntegerNode (location: (1,7)-(1,8)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ └── @ IntegerNode (location: (1,12)-(1,13)) - │ ├── flags: static_literal, decimal - │ └── value: 3 - ├── closing_loc: (1,8)-(1,9) = "]" - └── block: ∅ diff --git a/test/prism/snapshots/whitequark/send_index_asgn_legacy.txt b/test/prism/snapshots/whitequark/send_index_asgn_legacy.txt deleted file mode 100644 index fe0f71956a0d26..00000000000000 --- a/test/prism/snapshots/whitequark/send_index_asgn_legacy.txt +++ /dev/null @@ -1,39 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,13)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,13)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,13)) - ├── flags: newline, attribute_write - ├── receiver: - │ @ CallNode (location: (1,0)-(1,3)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (1,0)-(1,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: ∅ - ├── name: :[]= - ├── message_loc: (1,3)-(1,9) = "[1, 2]" - ├── opening_loc: (1,3)-(1,4) = "[" - ├── arguments: - │ @ ArgumentsNode (location: (1,4)-(1,13)) - │ ├── flags: ∅ - │ └── arguments: (length: 3) - │ ├── @ IntegerNode (location: (1,4)-(1,5)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── @ IntegerNode (location: (1,7)-(1,8)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 2 - │ └── @ IntegerNode (location: (1,12)-(1,13)) - │ ├── flags: static_literal, decimal - │ └── value: 3 - ├── closing_loc: (1,8)-(1,9) = "]" - └── block: ∅ diff --git a/test/prism/snapshots/whitequark/send_index_cmd.txt b/test/prism/snapshots/whitequark/send_index_cmd.txt deleted file mode 100644 index 89a5c41fc3c7db..00000000000000 --- a/test/prism/snapshots/whitequark/send_index_cmd.txt +++ /dev/null @@ -1,53 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,10)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,10)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,10)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (1,0)-(1,3)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (1,0)-(1,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: ∅ - ├── name: :[] - ├── message_loc: (1,3)-(1,10) = "[m bar]" - ├── opening_loc: (1,3)-(1,4) = "[" - ├── arguments: - │ @ ArgumentsNode (location: (1,4)-(1,9)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ CallNode (location: (1,4)-(1,9)) - │ ├── flags: ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :m - │ ├── message_loc: (1,4)-(1,5) = "m" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,6)-(1,9)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (1,6)-(1,9)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (1,6)-(1,9) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── closing_loc: (1,9)-(1,10) = "]" - └── block: ∅ diff --git a/test/prism/snapshots/whitequark/send_index_legacy.txt b/test/prism/snapshots/whitequark/send_index_legacy.txt deleted file mode 100644 index 5aec47c484912f..00000000000000 --- a/test/prism/snapshots/whitequark/send_index_legacy.txt +++ /dev/null @@ -1,36 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,9)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,9)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,9)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (1,0)-(1,3)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (1,0)-(1,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: ∅ - ├── name: :[] - ├── message_loc: (1,3)-(1,9) = "[1, 2]" - ├── opening_loc: (1,3)-(1,4) = "[" - ├── arguments: - │ @ ArgumentsNode (location: (1,4)-(1,8)) - │ ├── flags: ∅ - │ └── arguments: (length: 2) - │ ├── @ IntegerNode (location: (1,4)-(1,5)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ └── @ IntegerNode (location: (1,7)-(1,8)) - │ ├── flags: static_literal, decimal - │ └── value: 2 - ├── closing_loc: (1,8)-(1,9) = "]" - └── block: ∅ diff --git a/test/prism/snapshots/whitequark/send_lambda.txt b/test/prism/snapshots/whitequark/send_lambda.txt deleted file mode 100644 index a1693734e83444..00000000000000 --- a/test/prism/snapshots/whitequark/send_lambda.txt +++ /dev/null @@ -1,51 +0,0 @@ -@ ProgramNode (location: (1,0)-(5,5)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(5,5)) - ├── flags: ∅ - └── body: (length: 3) - ├── @ LambdaNode (location: (1,0)-(1,8)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── operator_loc: (1,0)-(1,2) = "->" - │ ├── opening_loc: (1,5)-(1,6) = "{" - │ ├── closing_loc: (1,7)-(1,8) = "}" - │ ├── parameters: - │ │ @ BlockParametersNode (location: (1,3)-(1,4)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (1,3)-(1,4)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 0) - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: - │ │ │ │ @ RestParameterNode (location: (1,3)-(1,4)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: ∅ - │ │ │ │ ├── name_loc: ∅ - │ │ │ │ └── operator_loc: (1,3)-(1,4) = "*" - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: ∅ - │ │ └── closing_loc: ∅ - │ └── body: ∅ - ├── @ LambdaNode (location: (3,0)-(3,9)) - │ ├── flags: newline - │ ├── locals: [] - │ ├── operator_loc: (3,0)-(3,2) = "->" - │ ├── opening_loc: (3,3)-(3,5) = "do" - │ ├── closing_loc: (3,6)-(3,9) = "end" - │ ├── parameters: ∅ - │ └── body: ∅ - └── @ LambdaNode (location: (5,0)-(5,5)) - ├── flags: newline - ├── locals: [] - ├── operator_loc: (5,0)-(5,2) = "->" - ├── opening_loc: (5,2)-(5,3) = "{" - ├── closing_loc: (5,4)-(5,5) = "}" - ├── parameters: ∅ - └── body: ∅ diff --git a/test/prism/snapshots/whitequark/send_lambda_args.txt b/test/prism/snapshots/whitequark/send_lambda_args.txt deleted file mode 100644 index ffa9a6ba9e4e7e..00000000000000 --- a/test/prism/snapshots/whitequark/send_lambda_args.txt +++ /dev/null @@ -1,59 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,9)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,9)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ LambdaNode (location: (1,0)-(1,10)) - │ ├── flags: newline - │ ├── locals: [:a] - │ ├── operator_loc: (1,0)-(1,2) = "->" - │ ├── opening_loc: (1,7)-(1,8) = "{" - │ ├── closing_loc: (1,9)-(1,10) = "}" - │ ├── parameters: - │ │ @ BlockParametersNode (location: (1,3)-(1,6)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (1,4)-(1,5)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 1) - │ │ │ │ └── @ RequiredParameterNode (location: (1,4)-(1,5)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── name: :a - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 0) - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: (1,3)-(1,4) = "(" - │ │ └── closing_loc: (1,5)-(1,6) = ")" - │ └── body: ∅ - └── @ LambdaNode (location: (3,0)-(3,9)) - ├── flags: newline - ├── locals: [:a] - ├── operator_loc: (3,0)-(3,2) = "->" - ├── opening_loc: (3,6)-(3,7) = "{" - ├── closing_loc: (3,8)-(3,9) = "}" - ├── parameters: - │ @ BlockParametersNode (location: (3,2)-(3,5)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (3,3)-(3,4)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (3,3)-(3,4)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :a - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: (3,2)-(3,3) = "(" - │ └── closing_loc: (3,4)-(3,5) = ")" - └── body: ∅ diff --git a/test/prism/snapshots/whitequark/send_lambda_args_noparen.txt b/test/prism/snapshots/whitequark/send_lambda_args_noparen.txt deleted file mode 100644 index 2cbe43e6e01b4d..00000000000000 --- a/test/prism/snapshots/whitequark/send_lambda_args_noparen.txt +++ /dev/null @@ -1,65 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,9)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,9)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ LambdaNode (location: (1,0)-(1,11)) - │ ├── flags: newline - │ ├── locals: [:a] - │ ├── operator_loc: (1,0)-(1,2) = "->" - │ ├── opening_loc: (1,8)-(1,9) = "{" - │ ├── closing_loc: (1,10)-(1,11) = "}" - │ ├── parameters: - │ │ @ BlockParametersNode (location: (1,3)-(1,7)) - │ │ ├── flags: ∅ - │ │ ├── parameters: - │ │ │ @ ParametersNode (location: (1,3)-(1,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── requireds: (length: 0) - │ │ │ ├── optionals: (length: 0) - │ │ │ ├── rest: ∅ - │ │ │ ├── posts: (length: 0) - │ │ │ ├── keywords: (length: 1) - │ │ │ │ └── @ OptionalKeywordParameterNode (location: (1,3)-(1,7)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ ├── name: :a - │ │ │ │ ├── name_loc: (1,3)-(1,5) = "a:" - │ │ │ │ └── value: - │ │ │ │ @ IntegerNode (location: (1,6)-(1,7)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ ├── keyword_rest: ∅ - │ │ │ └── block: ∅ - │ │ ├── locals: (length: 0) - │ │ ├── opening_loc: ∅ - │ │ └── closing_loc: ∅ - │ └── body: ∅ - └── @ LambdaNode (location: (3,0)-(3,9)) - ├── flags: newline - ├── locals: [:a] - ├── operator_loc: (3,0)-(3,2) = "->" - ├── opening_loc: (3,6)-(3,7) = "{" - ├── closing_loc: (3,8)-(3,9) = "}" - ├── parameters: - │ @ BlockParametersNode (location: (3,3)-(3,5)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (3,3)-(3,5)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 0) - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 1) - │ │ │ └── @ RequiredKeywordParameterNode (location: (3,3)-(3,5)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :a - │ │ │ └── name_loc: (3,3)-(3,5) = "a:" - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 0) - │ ├── opening_loc: ∅ - │ └── closing_loc: ∅ - └── body: ∅ diff --git a/test/prism/snapshots/whitequark/send_lambda_args_shadow.txt b/test/prism/snapshots/whitequark/send_lambda_args_shadow.txt deleted file mode 100644 index 5cd6660d4a5900..00000000000000 --- a/test/prism/snapshots/whitequark/send_lambda_args_shadow.txt +++ /dev/null @@ -1,39 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,19)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,19)) - ├── flags: ∅ - └── body: (length: 1) - └── @ LambdaNode (location: (1,0)-(1,19)) - ├── flags: newline - ├── locals: [:a, :foo, :bar] - ├── operator_loc: (1,0)-(1,2) = "->" - ├── opening_loc: (1,16)-(1,17) = "{" - ├── closing_loc: (1,18)-(1,19) = "}" - ├── parameters: - │ @ BlockParametersNode (location: (1,2)-(1,15)) - │ ├── flags: ∅ - │ ├── parameters: - │ │ @ ParametersNode (location: (1,3)-(1,4)) - │ │ ├── flags: ∅ - │ │ ├── requireds: (length: 1) - │ │ │ └── @ RequiredParameterNode (location: (1,3)-(1,4)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :a - │ │ ├── optionals: (length: 0) - │ │ ├── rest: ∅ - │ │ ├── posts: (length: 0) - │ │ ├── keywords: (length: 0) - │ │ ├── keyword_rest: ∅ - │ │ └── block: ∅ - │ ├── locals: (length: 2) - │ │ ├── @ BlockLocalVariableNode (location: (1,6)-(1,9)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :foo - │ │ └── @ BlockLocalVariableNode (location: (1,11)-(1,14)) - │ │ ├── flags: ∅ - │ │ └── name: :bar - │ ├── opening_loc: (1,2)-(1,3) = "(" - │ └── closing_loc: (1,14)-(1,15) = ")" - └── body: ∅ diff --git a/test/prism/snapshots/whitequark/send_lambda_legacy.txt b/test/prism/snapshots/whitequark/send_lambda_legacy.txt deleted file mode 100644 index 902e1404592c09..00000000000000 --- a/test/prism/snapshots/whitequark/send_lambda_legacy.txt +++ /dev/null @@ -1,15 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,5)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,5)) - ├── flags: ∅ - └── body: (length: 1) - └── @ LambdaNode (location: (1,0)-(1,5)) - ├── flags: newline - ├── locals: [] - ├── operator_loc: (1,0)-(1,2) = "->" - ├── opening_loc: (1,2)-(1,3) = "{" - ├── closing_loc: (1,4)-(1,5) = "}" - ├── parameters: ∅ - └── body: ∅ diff --git a/test/prism/snapshots/whitequark/send_op_asgn_conditional.txt b/test/prism/snapshots/whitequark/send_op_asgn_conditional.txt deleted file mode 100644 index 68e09171f8859c..00000000000000 --- a/test/prism/snapshots/whitequark/send_op_asgn_conditional.txt +++ /dev/null @@ -1,29 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,10)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,10)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallAndWriteNode (location: (1,0)-(1,10)) - ├── flags: newline, safe_navigation - ├── receiver: - │ @ CallNode (location: (1,0)-(1,1)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :a - │ ├── message_loc: (1,0)-(1,1) = "a" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: (1,1)-(1,3) = "&." - ├── message_loc: (1,3)-(1,4) = "b" - ├── read_name: :b - ├── write_name: :b= - ├── operator_loc: (1,5)-(1,8) = "&&=" - └── value: - @ IntegerNode (location: (1,9)-(1,10)) - ├── flags: static_literal, decimal - └── value: 1 diff --git a/test/prism/snapshots/whitequark/send_plain.txt b/test/prism/snapshots/whitequark/send_plain.txt deleted file mode 100644 index 96643ddcab7ea9..00000000000000 --- a/test/prism/snapshots/whitequark/send_plain.txt +++ /dev/null @@ -1,67 +0,0 @@ -@ ProgramNode (location: (1,0)-(5,8)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(5,8)) - ├── flags: ∅ - └── body: (length: 3) - ├── @ CallNode (location: (1,0)-(1,7)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (1,0)-(1,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (1,0)-(1,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (1,3)-(1,4) = "." - │ ├── name: :fun - │ ├── message_loc: (1,4)-(1,7) = "fun" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (3,0)-(3,10)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (3,0)-(3,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (3,0)-(3,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (3,3)-(3,5) = "::" - │ ├── name: :Fun - │ ├── message_loc: (3,5)-(3,8) = "Fun" - │ ├── opening_loc: (3,8)-(3,9) = "(" - │ ├── arguments: ∅ - │ ├── closing_loc: (3,9)-(3,10) = ")" - │ └── block: ∅ - └── @ CallNode (location: (5,0)-(5,8)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (5,0)-(5,3)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (5,0)-(5,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: (5,3)-(5,5) = "::" - ├── name: :fun - ├── message_loc: (5,5)-(5,8) = "fun" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/whitequark/send_plain_cmd.txt b/test/prism/snapshots/whitequark/send_plain_cmd.txt deleted file mode 100644 index 2785712baae0c5..00000000000000 --- a/test/prism/snapshots/whitequark/send_plain_cmd.txt +++ /dev/null @@ -1,106 +0,0 @@ -@ ProgramNode (location: (1,0)-(5,12)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(5,12)) - ├── flags: ∅ - └── body: (length: 3) - ├── @ CallNode (location: (1,0)-(1,11)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (1,0)-(1,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (1,0)-(1,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (1,3)-(1,4) = "." - │ ├── name: :fun - │ ├── message_loc: (1,4)-(1,7) = "fun" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,8)-(1,11)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (1,8)-(1,11)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (1,8)-(1,11) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (3,0)-(3,12)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (3,0)-(3,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (3,0)-(3,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (3,3)-(3,5) = "::" - │ ├── name: :Fun - │ ├── message_loc: (3,5)-(3,8) = "Fun" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (3,9)-(3,12)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (3,9)-(3,12)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (3,9)-(3,12) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── @ CallNode (location: (5,0)-(5,12)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (5,0)-(5,3)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (5,0)-(5,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: (5,3)-(5,5) = "::" - ├── name: :fun - ├── message_loc: (5,5)-(5,8) = "fun" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (5,9)-(5,12)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ CallNode (location: (5,9)-(5,12)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :bar - │ ├── message_loc: (5,9)-(5,12) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/whitequark/send_self.txt b/test/prism/snapshots/whitequark/send_self.txt deleted file mode 100644 index f3c56f5413b59b..00000000000000 --- a/test/prism/snapshots/whitequark/send_self.txt +++ /dev/null @@ -1,43 +0,0 @@ -@ ProgramNode (location: (1,0)-(5,6)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(5,6)) - ├── flags: ∅ - └── body: (length: 3) - ├── @ CallNode (location: (1,0)-(1,3)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :fun - │ ├── message_loc: (1,0)-(1,3) = "fun" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (3,0)-(3,4)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :fun! - │ ├── message_loc: (3,0)-(3,4) = "fun!" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── @ CallNode (location: (5,0)-(5,6)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :fun - ├── message_loc: (5,0)-(5,3) = "fun" - ├── opening_loc: (5,3)-(5,4) = "(" - ├── arguments: - │ @ ArgumentsNode (location: (5,4)-(5,5)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ IntegerNode (location: (5,4)-(5,5)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── closing_loc: (5,5)-(5,6) = ")" - └── block: ∅ diff --git a/test/prism/snapshots/whitequark/send_self_block.txt b/test/prism/snapshots/whitequark/send_self_block.txt deleted file mode 100644 index 2d526d5d48ae9c..00000000000000 --- a/test/prism/snapshots/whitequark/send_self_block.txt +++ /dev/null @@ -1,81 +0,0 @@ -@ ProgramNode (location: (1,0)-(7,10)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(7,10)) - ├── flags: ∅ - └── body: (length: 4) - ├── @ CallNode (location: (1,0)-(1,10)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :fun - │ ├── message_loc: (1,0)-(1,3) = "fun" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (1,4)-(1,10)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (1,4)-(1,6) = "do" - │ └── closing_loc: (1,7)-(1,10) = "end" - ├── @ CallNode (location: (3,0)-(3,7)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :fun - │ ├── message_loc: (3,0)-(3,3) = "fun" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (3,4)-(3,7)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (3,4)-(3,5) = "{" - │ └── closing_loc: (3,6)-(3,7) = "}" - ├── @ CallNode (location: (5,0)-(5,9)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :fun - │ ├── message_loc: (5,0)-(5,3) = "fun" - │ ├── opening_loc: (5,3)-(5,4) = "(" - │ ├── arguments: ∅ - │ ├── closing_loc: (5,4)-(5,5) = ")" - │ └── block: - │ @ BlockNode (location: (5,6)-(5,9)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (5,6)-(5,7) = "{" - │ └── closing_loc: (5,8)-(5,9) = "}" - └── @ CallNode (location: (7,0)-(7,10)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :fun - ├── message_loc: (7,0)-(7,3) = "fun" - ├── opening_loc: (7,3)-(7,4) = "(" - ├── arguments: - │ @ ArgumentsNode (location: (7,4)-(7,5)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ IntegerNode (location: (7,4)-(7,5)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── closing_loc: (7,5)-(7,6) = ")" - └── block: - @ BlockNode (location: (7,7)-(7,10)) - ├── flags: ∅ - ├── locals: [] - ├── parameters: ∅ - ├── body: ∅ - ├── opening_loc: (7,7)-(7,8) = "{" - └── closing_loc: (7,9)-(7,10) = "}" diff --git a/test/prism/snapshots/whitequark/send_unary_op.txt b/test/prism/snapshots/whitequark/send_unary_op.txt deleted file mode 100644 index 970b78417f285e..00000000000000 --- a/test/prism/snapshots/whitequark/send_unary_op.txt +++ /dev/null @@ -1,67 +0,0 @@ -@ ProgramNode (location: (1,0)-(5,4)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(5,4)) - ├── flags: ∅ - └── body: (length: 3) - ├── @ CallNode (location: (1,0)-(1,4)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (1,1)-(1,4)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (1,1)-(1,4) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :+@ - │ ├── message_loc: (1,0)-(1,1) = "+" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (3,0)-(3,4)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (3,1)-(3,4)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (3,1)-(3,4) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :-@ - │ ├── message_loc: (3,0)-(3,1) = "-" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── @ CallNode (location: (5,0)-(5,4)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (5,1)-(5,4)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (5,1)-(5,4) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: ∅ - ├── name: :~ - ├── message_loc: (5,0)-(5,1) = "~" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/whitequark/slash_newline_in_heredocs.txt b/test/prism/snapshots/whitequark/slash_newline_in_heredocs.txt deleted file mode 100644 index bd9fa7916d8715..00000000000000 --- a/test/prism/snapshots/whitequark/slash_newline_in_heredocs.txt +++ /dev/null @@ -1,36 +0,0 @@ -@ ProgramNode (location: (1,0)-(8,4)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(8,4)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ StringNode (location: (1,0)-(1,4)) - │ ├── flags: newline - │ ├── opening_loc: (1,0)-(1,4) = "<<-E" - │ ├── content_loc: (2,0)-(5,0) = " 1 \\\n 2\n 3\n" - │ ├── closing_loc: (5,0)-(6,0) = "E\n" - │ └── unescaped: " 1 2\n 3\n" - └── @ InterpolatedStringNode (location: (8,0)-(8,4)) - ├── flags: newline, static_literal - ├── opening_loc: (8,0)-(8,4) = "<<~E" - ├── parts: (length: 3) - │ ├── @ StringNode (location: (9,0)-(10,0)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (9,0)-(10,0) = " 1 \\\n" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "1 " - │ ├── @ StringNode (location: (10,0)-(11,0)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (10,0)-(11,0) = " 2\n" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "2\n" - │ └── @ StringNode (location: (11,0)-(12,0)) - │ ├── flags: static_literal, frozen - │ ├── opening_loc: ∅ - │ ├── content_loc: (11,0)-(12,0) = " 3\n" - │ ├── closing_loc: ∅ - │ └── unescaped: "3\n" - └── closing_loc: (12,0)-(13,0) = "E\n" diff --git a/test/prism/snapshots/whitequark/space_args_arg.txt b/test/prism/snapshots/whitequark/space_args_arg.txt deleted file mode 100644 index a0149c5f3261b3..00000000000000 --- a/test/prism/snapshots/whitequark/space_args_arg.txt +++ /dev/null @@ -1,31 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,7)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,7)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,7)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :fun - ├── message_loc: (1,0)-(1,3) = "fun" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,4)-(1,7)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ ParenthesesNode (location: (1,4)-(1,7)) - │ ├── flags: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (1,5)-(1,6)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ IntegerNode (location: (1,5)-(1,6)) - │ │ ├── flags: newline, static_literal, decimal - │ │ └── value: 1 - │ ├── opening_loc: (1,4)-(1,5) = "(" - │ └── closing_loc: (1,6)-(1,7) = ")" - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/whitequark/space_args_arg_block.txt b/test/prism/snapshots/whitequark/space_args_arg_block.txt deleted file mode 100644 index c3289c1448c554..00000000000000 --- a/test/prism/snapshots/whitequark/space_args_arg_block.txt +++ /dev/null @@ -1,120 +0,0 @@ -@ ProgramNode (location: (1,0)-(5,10)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(5,10)) - ├── flags: ∅ - └── body: (length: 3) - ├── @ CallNode (location: (1,0)-(1,14)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (1,0)-(1,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (1,0)-(1,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (1,3)-(1,4) = "." - │ ├── name: :fun - │ ├── message_loc: (1,4)-(1,7) = "fun" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,8)-(1,11)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ ParenthesesNode (location: (1,8)-(1,11)) - │ │ ├── flags: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (1,9)-(1,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ IntegerNode (location: (1,9)-(1,10)) - │ │ │ ├── flags: newline, static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── opening_loc: (1,8)-(1,9) = "(" - │ │ └── closing_loc: (1,10)-(1,11) = ")" - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (1,12)-(1,14)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (1,12)-(1,13) = "{" - │ └── closing_loc: (1,13)-(1,14) = "}" - ├── @ CallNode (location: (3,0)-(3,15)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (3,0)-(3,3)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (3,0)-(3,3) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: (3,3)-(3,5) = "::" - │ ├── name: :fun - │ ├── message_loc: (3,5)-(3,8) = "fun" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (3,9)-(3,12)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ ParenthesesNode (location: (3,9)-(3,12)) - │ │ ├── flags: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (3,10)-(3,11)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ IntegerNode (location: (3,10)-(3,11)) - │ │ │ ├── flags: newline, static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── opening_loc: (3,9)-(3,10) = "(" - │ │ └── closing_loc: (3,11)-(3,12) = ")" - │ ├── closing_loc: ∅ - │ └── block: - │ @ BlockNode (location: (3,13)-(3,15)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (3,13)-(3,14) = "{" - │ └── closing_loc: (3,14)-(3,15) = "}" - └── @ CallNode (location: (5,0)-(5,10)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :fun - ├── message_loc: (5,0)-(5,3) = "fun" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (5,4)-(5,7)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ ParenthesesNode (location: (5,4)-(5,7)) - │ ├── flags: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (5,5)-(5,6)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ IntegerNode (location: (5,5)-(5,6)) - │ │ ├── flags: newline, static_literal, decimal - │ │ └── value: 1 - │ ├── opening_loc: (5,4)-(5,5) = "(" - │ └── closing_loc: (5,6)-(5,7) = ")" - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (5,8)-(5,10)) - ├── flags: ∅ - ├── locals: [] - ├── parameters: ∅ - ├── body: ∅ - ├── opening_loc: (5,8)-(5,9) = "{" - └── closing_loc: (5,9)-(5,10) = "}" diff --git a/test/prism/snapshots/whitequark/space_args_arg_call.txt b/test/prism/snapshots/whitequark/space_args_arg_call.txt deleted file mode 100644 index 538a865e2acd03..00000000000000 --- a/test/prism/snapshots/whitequark/space_args_arg_call.txt +++ /dev/null @@ -1,41 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,12)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,12)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,12)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :fun - ├── message_loc: (1,0)-(1,3) = "fun" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,4)-(1,12)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ CallNode (location: (1,4)-(1,12)) - │ ├── flags: ∅ - │ ├── receiver: - │ │ @ ParenthesesNode (location: (1,4)-(1,7)) - │ │ ├── flags: ∅ - │ │ ├── body: - │ │ │ @ StatementsNode (location: (1,5)-(1,6)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ IntegerNode (location: (1,5)-(1,6)) - │ │ │ ├── flags: newline, static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── opening_loc: (1,4)-(1,5) = "(" - │ │ └── closing_loc: (1,6)-(1,7) = ")" - │ ├── call_operator_loc: (1,7)-(1,8) = "." - │ ├── name: :to_i - │ ├── message_loc: (1,8)-(1,12) = "to_i" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/whitequark/space_args_arg_newline.txt b/test/prism/snapshots/whitequark/space_args_arg_newline.txt deleted file mode 100644 index d3fbe232999636..00000000000000 --- a/test/prism/snapshots/whitequark/space_args_arg_newline.txt +++ /dev/null @@ -1,31 +0,0 @@ -@ ProgramNode (location: (1,0)-(2,1)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(2,1)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(2,1)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :fun - ├── message_loc: (1,0)-(1,3) = "fun" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,4)-(2,1)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ ParenthesesNode (location: (1,4)-(2,1)) - │ ├── flags: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (1,5)-(1,6)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ IntegerNode (location: (1,5)-(1,6)) - │ │ ├── flags: newline, static_literal, decimal - │ │ └── value: 1 - │ ├── opening_loc: (1,4)-(1,5) = "(" - │ └── closing_loc: (2,0)-(2,1) = ")" - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/whitequark/space_args_block.txt b/test/prism/snapshots/whitequark/space_args_block.txt deleted file mode 100644 index 19b5064886bd2e..00000000000000 --- a/test/prism/snapshots/whitequark/space_args_block.txt +++ /dev/null @@ -1,32 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,9)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,9)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,9)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :fun - ├── message_loc: (1,0)-(1,3) = "fun" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,4)-(1,6)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ ParenthesesNode (location: (1,4)-(1,6)) - │ ├── flags: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (1,4)-(1,5) = "(" - │ └── closing_loc: (1,5)-(1,6) = ")" - ├── closing_loc: ∅ - └── block: - @ BlockNode (location: (1,7)-(1,9)) - ├── flags: ∅ - ├── locals: [] - ├── parameters: ∅ - ├── body: ∅ - ├── opening_loc: (1,7)-(1,8) = "{" - └── closing_loc: (1,8)-(1,9) = "}" diff --git a/test/prism/snapshots/whitequark/space_args_cmd.txt b/test/prism/snapshots/whitequark/space_args_cmd.txt deleted file mode 100644 index f91b7edbbe4ebb..00000000000000 --- a/test/prism/snapshots/whitequark/space_args_cmd.txt +++ /dev/null @@ -1,51 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,11)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,11)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,11)) - ├── flags: newline, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :fun - ├── message_loc: (1,0)-(1,3) = "fun" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (1,4)-(1,11)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ ParenthesesNode (location: (1,4)-(1,11)) - │ ├── flags: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (1,5)-(1,10)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (1,5)-(1,10)) - │ │ ├── flags: newline, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :f - │ │ ├── message_loc: (1,5)-(1,6) = "f" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (1,7)-(1,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ CallNode (location: (1,7)-(1,10)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (1,7)-(1,10) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── opening_loc: (1,4)-(1,5) = "(" - │ └── closing_loc: (1,10)-(1,11) = ")" - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/whitequark/string___FILE__.txt b/test/prism/snapshots/whitequark/string___FILE__.txt deleted file mode 100644 index 98cd05e689badf..00000000000000 --- a/test/prism/snapshots/whitequark/string___FILE__.txt +++ /dev/null @@ -1,10 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,8)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,8)) - ├── flags: ∅ - └── body: (length: 1) - └── @ SourceFileNode (location: (1,0)-(1,8)) - ├── flags: newline - └── filepath: "whitequark/string___FILE__.txt" diff --git a/test/prism/snapshots/whitequark/string_concat.txt b/test/prism/snapshots/whitequark/string_concat.txt deleted file mode 100644 index 1320fae371c1de..00000000000000 --- a/test/prism/snapshots/whitequark/string_concat.txt +++ /dev/null @@ -1,36 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,14)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,14)) - ├── flags: ∅ - └── body: (length: 1) - └── @ InterpolatedStringNode (location: (1,0)-(1,14)) - ├── flags: newline - ├── opening_loc: ∅ - ├── parts: (length: 2) - │ ├── @ InterpolatedStringNode (location: (1,0)-(1,8)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (1,0)-(1,1) = "\"" - │ │ ├── parts: (length: 2) - │ │ │ ├── @ StringNode (location: (1,1)-(1,4)) - │ │ │ │ ├── flags: static_literal, frozen - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── content_loc: (1,1)-(1,4) = "foo" - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── unescaped: "foo" - │ │ │ └── @ EmbeddedVariableNode (location: (1,4)-(1,7)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (1,4)-(1,5) = "#" - │ │ │ └── variable: - │ │ │ @ InstanceVariableReadNode (location: (1,5)-(1,7)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :@a - │ │ └── closing_loc: (1,7)-(1,8) = "\"" - │ └── @ StringNode (location: (1,9)-(1,14)) - │ ├── flags: static_literal, frozen - │ ├── opening_loc: (1,9)-(1,10) = "\"" - │ ├── content_loc: (1,10)-(1,13) = "bar" - │ ├── closing_loc: (1,13)-(1,14) = "\"" - │ └── unescaped: "bar" - └── closing_loc: ∅ diff --git a/test/prism/snapshots/whitequark/string_dvar.txt b/test/prism/snapshots/whitequark/string_dvar.txt deleted file mode 100644 index ab11f000136911..00000000000000 --- a/test/prism/snapshots/whitequark/string_dvar.txt +++ /dev/null @@ -1,45 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,14)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,14)) - ├── flags: ∅ - └── body: (length: 1) - └── @ InterpolatedStringNode (location: (1,0)-(1,14)) - ├── flags: newline - ├── opening_loc: (1,0)-(1,1) = "\"" - ├── parts: (length: 5) - │ ├── @ EmbeddedVariableNode (location: (1,1)-(1,4)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (1,1)-(1,2) = "#" - │ │ └── variable: - │ │ @ InstanceVariableReadNode (location: (1,2)-(1,4)) - │ │ ├── flags: ∅ - │ │ └── name: :@a - │ ├── @ StringNode (location: (1,4)-(1,5)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (1,4)-(1,5) = " " - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: " " - │ ├── @ EmbeddedVariableNode (location: (1,5)-(1,9)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (1,5)-(1,6) = "#" - │ │ └── variable: - │ │ @ ClassVariableReadNode (location: (1,6)-(1,9)) - │ │ ├── flags: ∅ - │ │ └── name: :@@a - │ ├── @ StringNode (location: (1,9)-(1,10)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (1,9)-(1,10) = " " - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: " " - │ └── @ EmbeddedVariableNode (location: (1,10)-(1,13)) - │ ├── flags: ∅ - │ ├── operator_loc: (1,10)-(1,11) = "#" - │ └── variable: - │ @ GlobalVariableReadNode (location: (1,11)-(1,13)) - │ ├── flags: ∅ - │ └── name: :$a - └── closing_loc: (1,13)-(1,14) = "\"" diff --git a/test/prism/snapshots/whitequark/string_interp.txt b/test/prism/snapshots/whitequark/string_interp.txt deleted file mode 100644 index 22ddaed0cd4491..00000000000000 --- a/test/prism/snapshots/whitequark/string_interp.txt +++ /dev/null @@ -1,42 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,14)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,14)) - ├── flags: ∅ - └── body: (length: 1) - └── @ InterpolatedStringNode (location: (1,0)-(1,14)) - ├── flags: newline - ├── opening_loc: (1,0)-(1,1) = "\"" - ├── parts: (length: 3) - │ ├── @ StringNode (location: (1,1)-(1,4)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (1,1)-(1,4) = "foo" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "foo" - │ ├── @ EmbeddedStatementsNode (location: (1,4)-(1,10)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (1,4)-(1,6) = "\#{" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (1,6)-(1,9)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (1,6)-(1,9)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (1,6)-(1,9) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── closing_loc: (1,9)-(1,10) = "}" - │ └── @ StringNode (location: (1,10)-(1,13)) - │ ├── flags: static_literal, frozen - │ ├── opening_loc: ∅ - │ ├── content_loc: (1,10)-(1,13) = "baz" - │ ├── closing_loc: ∅ - │ └── unescaped: "baz" - └── closing_loc: (1,13)-(1,14) = "\"" diff --git a/test/prism/snapshots/whitequark/string_plain.txt b/test/prism/snapshots/whitequark/string_plain.txt deleted file mode 100644 index 0a763cef602cba..00000000000000 --- a/test/prism/snapshots/whitequark/string_plain.txt +++ /dev/null @@ -1,19 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,8)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,8)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ StringNode (location: (1,0)-(1,10)) - │ ├── flags: newline - │ ├── opening_loc: (1,0)-(1,3) = "%q(" - │ ├── content_loc: (1,3)-(1,9) = "foobar" - │ ├── closing_loc: (1,9)-(1,10) = ")" - │ └── unescaped: "foobar" - └── @ StringNode (location: (3,0)-(3,8)) - ├── flags: newline - ├── opening_loc: (3,0)-(3,1) = "'" - ├── content_loc: (3,1)-(3,7) = "foobar" - ├── closing_loc: (3,7)-(3,8) = "'" - └── unescaped: "foobar" diff --git a/test/prism/snapshots/whitequark/super.txt b/test/prism/snapshots/whitequark/super.txt deleted file mode 100644 index da89dbda287d42..00000000000000 --- a/test/prism/snapshots/whitequark/super.txt +++ /dev/null @@ -1,54 +0,0 @@ -@ ProgramNode (location: (1,0)-(5,10)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(5,10)) - ├── flags: ∅ - └── body: (length: 3) - ├── @ SuperNode (location: (1,0)-(1,9)) - │ ├── flags: newline - │ ├── keyword_loc: (1,0)-(1,5) = "super" - │ ├── lparen_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,6)-(1,9)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ CallNode (location: (1,6)-(1,9)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (1,6)-(1,9) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── rparen_loc: ∅ - │ └── block: ∅ - ├── @ SuperNode (location: (3,0)-(3,7)) - │ ├── flags: newline - │ ├── keyword_loc: (3,0)-(3,5) = "super" - │ ├── lparen_loc: (3,5)-(3,6) = "(" - │ ├── arguments: ∅ - │ ├── rparen_loc: (3,6)-(3,7) = ")" - │ └── block: ∅ - └── @ SuperNode (location: (5,0)-(5,10)) - ├── flags: newline - ├── keyword_loc: (5,0)-(5,5) = "super" - ├── lparen_loc: (5,5)-(5,6) = "(" - ├── arguments: - │ @ ArgumentsNode (location: (5,6)-(5,9)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ CallNode (location: (5,6)-(5,9)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (5,6)-(5,9) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── rparen_loc: (5,9)-(5,10) = ")" - └── block: ∅ diff --git a/test/prism/snapshots/whitequark/super_block.txt b/test/prism/snapshots/whitequark/super_block.txt deleted file mode 100644 index 095856ef408b1a..00000000000000 --- a/test/prism/snapshots/whitequark/super_block.txt +++ /dev/null @@ -1,54 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,21)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,21)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ ForwardingSuperNode (location: (1,0)-(1,12)) - │ ├── flags: newline - │ └── block: - │ @ BlockNode (location: (1,6)-(1,12)) - │ ├── flags: ∅ - │ ├── locals: [] - │ ├── parameters: ∅ - │ ├── body: ∅ - │ ├── opening_loc: (1,6)-(1,8) = "do" - │ └── closing_loc: (1,9)-(1,12) = "end" - └── @ SuperNode (location: (3,0)-(3,21)) - ├── flags: newline - ├── keyword_loc: (3,0)-(3,5) = "super" - ├── lparen_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (3,6)-(3,14)) - │ ├── flags: ∅ - │ └── arguments: (length: 2) - │ ├── @ CallNode (location: (3,6)-(3,9)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (3,6)-(3,9) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── @ CallNode (location: (3,11)-(3,14)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :bar - │ ├── message_loc: (3,11)-(3,14) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── rparen_loc: ∅ - └── block: - @ BlockNode (location: (3,15)-(3,21)) - ├── flags: ∅ - ├── locals: [] - ├── parameters: ∅ - ├── body: ∅ - ├── opening_loc: (3,15)-(3,17) = "do" - └── closing_loc: (3,18)-(3,21) = "end" diff --git a/test/prism/snapshots/whitequark/symbol_interp.txt b/test/prism/snapshots/whitequark/symbol_interp.txt deleted file mode 100644 index 46a24b6c7e2f9b..00000000000000 --- a/test/prism/snapshots/whitequark/symbol_interp.txt +++ /dev/null @@ -1,42 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,15)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,15)) - ├── flags: ∅ - └── body: (length: 1) - └── @ InterpolatedSymbolNode (location: (1,0)-(1,15)) - ├── flags: newline - ├── opening_loc: (1,0)-(1,2) = ":\"" - ├── parts: (length: 3) - │ ├── @ StringNode (location: (1,2)-(1,5)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (1,2)-(1,5) = "foo" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "foo" - │ ├── @ EmbeddedStatementsNode (location: (1,5)-(1,11)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (1,5)-(1,7) = "\#{" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (1,7)-(1,10)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (1,7)-(1,10)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (1,7)-(1,10) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── closing_loc: (1,10)-(1,11) = "}" - │ └── @ StringNode (location: (1,11)-(1,14)) - │ ├── flags: static_literal, frozen - │ ├── opening_loc: ∅ - │ ├── content_loc: (1,11)-(1,14) = "baz" - │ ├── closing_loc: ∅ - │ └── unescaped: "baz" - └── closing_loc: (1,14)-(1,15) = "\"" diff --git a/test/prism/snapshots/whitequark/symbol_plain.txt b/test/prism/snapshots/whitequark/symbol_plain.txt deleted file mode 100644 index 803f2847cd496b..00000000000000 --- a/test/prism/snapshots/whitequark/symbol_plain.txt +++ /dev/null @@ -1,19 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,4)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,4)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ SymbolNode (location: (1,0)-(1,6)) - │ ├── flags: newline, static_literal, forced_us_ascii_encoding - │ ├── opening_loc: (1,0)-(1,2) = ":'" - │ ├── value_loc: (1,2)-(1,5) = "foo" - │ ├── closing_loc: (1,5)-(1,6) = "'" - │ └── unescaped: "foo" - └── @ SymbolNode (location: (3,0)-(3,4)) - ├── flags: newline, static_literal, forced_us_ascii_encoding - ├── opening_loc: (3,0)-(3,1) = ":" - ├── value_loc: (3,1)-(3,4) = "foo" - ├── closing_loc: ∅ - └── unescaped: "foo" diff --git a/test/prism/snapshots/whitequark/ternary.txt b/test/prism/snapshots/whitequark/ternary.txt deleted file mode 100644 index 4aa79916751f83..00000000000000 --- a/test/prism/snapshots/whitequark/ternary.txt +++ /dev/null @@ -1,42 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,11)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,11)) - ├── flags: ∅ - └── body: (length: 1) - └── @ IfNode (location: (1,0)-(1,11)) - ├── flags: newline - ├── if_keyword_loc: ∅ - ├── predicate: - │ @ CallNode (location: (1,0)-(1,3)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (1,0)-(1,3) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── then_keyword_loc: (1,4)-(1,5) = "?" - ├── statements: - │ @ StatementsNode (location: (1,6)-(1,7)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ IntegerNode (location: (1,6)-(1,7)) - │ ├── flags: newline, static_literal, decimal - │ └── value: 1 - ├── subsequent: - │ @ ElseNode (location: (1,8)-(1,11)) - │ ├── flags: ∅ - │ ├── else_keyword_loc: (1,8)-(1,9) = ":" - │ ├── statements: - │ │ @ StatementsNode (location: (1,10)-(1,11)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ IntegerNode (location: (1,10)-(1,11)) - │ │ ├── flags: newline, static_literal, decimal - │ │ └── value: 2 - │ └── end_keyword_loc: ∅ - └── end_keyword_loc: ∅ diff --git a/test/prism/snapshots/whitequark/ternary_ambiguous_symbol.txt b/test/prism/snapshots/whitequark/ternary_ambiguous_symbol.txt deleted file mode 100644 index 4d1900fc5f7087..00000000000000 --- a/test/prism/snapshots/whitequark/ternary_ambiguous_symbol.txt +++ /dev/null @@ -1,61 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,13)) -├── flags: ∅ -├── locals: [:t] -└── statements: - @ StatementsNode (location: (1,0)-(1,13)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ LocalVariableWriteNode (location: (1,0)-(1,3)) - │ ├── flags: newline - │ ├── name: :t - │ ├── depth: 0 - │ ├── name_loc: (1,0)-(1,1) = "t" - │ ├── value: - │ │ @ IntegerNode (location: (1,2)-(1,3)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ └── operator_loc: (1,1)-(1,2) = "=" - └── @ IfNode (location: (1,4)-(1,13)) - ├── flags: newline - ├── if_keyword_loc: ∅ - ├── predicate: - │ @ ParenthesesNode (location: (1,4)-(1,9)) - │ ├── flags: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (1,5)-(1,8)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (1,5)-(1,8)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (1,5)-(1,8) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── opening_loc: (1,4)-(1,5) = "(" - │ └── closing_loc: (1,8)-(1,9) = ")" - ├── then_keyword_loc: (1,9)-(1,10) = "?" - ├── statements: - │ @ StatementsNode (location: (1,10)-(1,11)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ LocalVariableReadNode (location: (1,10)-(1,11)) - │ ├── flags: newline - │ ├── name: :t - │ └── depth: 0 - ├── subsequent: - │ @ ElseNode (location: (1,11)-(1,13)) - │ ├── flags: ∅ - │ ├── else_keyword_loc: (1,11)-(1,12) = ":" - │ ├── statements: - │ │ @ StatementsNode (location: (1,12)-(1,13)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ ConstantReadNode (location: (1,12)-(1,13)) - │ │ ├── flags: newline - │ │ └── name: :T - │ └── end_keyword_loc: ∅ - └── end_keyword_loc: ∅ diff --git a/test/prism/snapshots/whitequark/trailing_forward_arg.txt b/test/prism/snapshots/whitequark/trailing_forward_arg.txt deleted file mode 100644 index 75fce37a343609..00000000000000 --- a/test/prism/snapshots/whitequark/trailing_forward_arg.txt +++ /dev/null @@ -1,63 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,40)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,40)) - ├── flags: ∅ - └── body: (length: 1) - └── @ DefNode (location: (1,0)-(1,40)) - ├── flags: newline - ├── name: :foo - ├── name_loc: (1,4)-(1,7) = "foo" - ├── receiver: ∅ - ├── parameters: - │ @ ParametersNode (location: (1,8)-(1,17)) - │ ├── flags: ∅ - │ ├── requireds: (length: 2) - │ │ ├── @ RequiredParameterNode (location: (1,8)-(1,9)) - │ │ │ ├── flags: ∅ - │ │ │ └── name: :a - │ │ └── @ RequiredParameterNode (location: (1,11)-(1,12)) - │ │ ├── flags: ∅ - │ │ └── name: :b - │ ├── optionals: (length: 0) - │ ├── rest: ∅ - │ ├── posts: (length: 0) - │ ├── keywords: (length: 0) - │ ├── keyword_rest: - │ │ @ ForwardingParameterNode (location: (1,14)-(1,17)) - │ │ └── flags: ∅ - │ └── block: ∅ - ├── body: - │ @ StatementsNode (location: (1,20)-(1,35)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,20)-(1,35)) - │ ├── flags: newline, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :bar - │ ├── message_loc: (1,20)-(1,23) = "bar" - │ ├── opening_loc: (1,23)-(1,24) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,24)-(1,34)) - │ │ ├── flags: contains_forwarding - │ │ └── arguments: (length: 3) - │ │ ├── @ LocalVariableReadNode (location: (1,24)-(1,25)) - │ │ │ ├── flags: ∅ - │ │ │ ├── name: :a - │ │ │ └── depth: 0 - │ │ ├── @ IntegerNode (location: (1,27)-(1,29)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 42 - │ │ └── @ ForwardingArgumentsNode (location: (1,31)-(1,34)) - │ │ └── flags: ∅ - │ ├── closing_loc: (1,34)-(1,35) = ")" - │ └── block: ∅ - ├── locals: [:a, :b] - ├── def_keyword_loc: (1,0)-(1,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: (1,7)-(1,8) = "(" - ├── rparen_loc: (1,17)-(1,18) = ")" - ├── equal_loc: ∅ - └── end_keyword_loc: (1,37)-(1,40) = "end" diff --git a/test/prism/snapshots/whitequark/true.txt b/test/prism/snapshots/whitequark/true.txt deleted file mode 100644 index ba705338bafb88..00000000000000 --- a/test/prism/snapshots/whitequark/true.txt +++ /dev/null @@ -1,9 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,4)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,4)) - ├── flags: ∅ - └── body: (length: 1) - └── @ TrueNode (location: (1,0)-(1,4)) - └── flags: newline, static_literal diff --git a/test/prism/snapshots/whitequark/unary_num_pow_precedence.txt b/test/prism/snapshots/whitequark/unary_num_pow_precedence.txt deleted file mode 100644 index 0f2fb776b4293e..00000000000000 --- a/test/prism/snapshots/whitequark/unary_num_pow_precedence.txt +++ /dev/null @@ -1,84 +0,0 @@ -@ ProgramNode (location: (1,0)-(5,10)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(5,10)) - ├── flags: ∅ - └── body: (length: 3) - ├── @ CallNode (location: (1,0)-(1,10)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ FloatNode (location: (1,0)-(1,4)) - │ │ ├── flags: static_literal - │ │ └── value: 2.0 - │ ├── call_operator_loc: ∅ - │ ├── name: :** - │ ├── message_loc: (1,5)-(1,7) = "**" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,8)-(1,10)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (1,8)-(1,10)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 10 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── @ CallNode (location: (3,0)-(3,8)) - │ ├── flags: newline - │ ├── receiver: - │ │ @ CallNode (location: (3,1)-(3,8)) - │ │ ├── flags: ∅ - │ │ ├── receiver: - │ │ │ @ IntegerNode (location: (3,1)-(3,2)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :** - │ │ ├── message_loc: (3,3)-(3,5) = "**" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (3,6)-(3,8)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (3,6)-(3,8)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 10 - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :-@ - │ ├── message_loc: (3,0)-(3,1) = "-" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── @ CallNode (location: (5,0)-(5,10)) - ├── flags: newline - ├── receiver: - │ @ CallNode (location: (5,1)-(5,10)) - │ ├── flags: ∅ - │ ├── receiver: - │ │ @ FloatNode (location: (5,1)-(5,4)) - │ │ ├── flags: static_literal - │ │ └── value: 2.0 - │ ├── call_operator_loc: ∅ - │ ├── name: :** - │ ├── message_loc: (5,5)-(5,7) = "**" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (5,8)-(5,10)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ IntegerNode (location: (5,8)-(5,10)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 10 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── call_operator_loc: ∅ - ├── name: :-@ - ├── message_loc: (5,0)-(5,1) = "-" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/whitequark/undef.txt b/test/prism/snapshots/whitequark/undef.txt deleted file mode 100644 index a24ba2f86845ba..00000000000000 --- a/test/prism/snapshots/whitequark/undef.txt +++ /dev/null @@ -1,45 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,27)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,27)) - ├── flags: ∅ - └── body: (length: 1) - └── @ UndefNode (location: (1,0)-(1,27)) - ├── flags: newline - ├── names: (length: 3) - │ ├── @ SymbolNode (location: (1,6)-(1,9)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: ∅ - │ │ ├── value_loc: (1,6)-(1,9) = "foo" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "foo" - │ ├── @ SymbolNode (location: (1,11)-(1,15)) - │ │ ├── flags: static_literal, forced_us_ascii_encoding - │ │ ├── opening_loc: (1,11)-(1,12) = ":" - │ │ ├── value_loc: (1,12)-(1,15) = "bar" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "bar" - │ └── @ InterpolatedSymbolNode (location: (1,17)-(1,27)) - │ ├── flags: ∅ - │ ├── opening_loc: (1,17)-(1,19) = ":\"" - │ ├── parts: (length: 2) - │ │ ├── @ StringNode (location: (1,19)-(1,22)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (1,19)-(1,22) = "foo" - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "foo" - │ │ └── @ EmbeddedStatementsNode (location: (1,22)-(1,26)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (1,22)-(1,24) = "\#{" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (1,24)-(1,25)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ IntegerNode (location: (1,24)-(1,25)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── closing_loc: (1,25)-(1,26) = "}" - │ └── closing_loc: (1,26)-(1,27) = "\"" - └── keyword_loc: (1,0)-(1,5) = "undef" diff --git a/test/prism/snapshots/whitequark/unless.txt b/test/prism/snapshots/whitequark/unless.txt deleted file mode 100644 index 3d417e355d456a..00000000000000 --- a/test/prism/snapshots/whitequark/unless.txt +++ /dev/null @@ -1,69 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,20)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,20)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ UnlessNode (location: (1,0)-(1,24)) - │ ├── flags: newline - │ ├── keyword_loc: (1,0)-(1,6) = "unless" - │ ├── predicate: - │ │ @ CallNode (location: (1,7)-(1,10)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (1,7)-(1,10) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── then_keyword_loc: (1,11)-(1,15) = "then" - │ ├── statements: - │ │ @ StatementsNode (location: (1,16)-(1,19)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (1,16)-(1,19)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (1,16)-(1,19) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── else_clause: ∅ - │ └── end_keyword_loc: (1,21)-(1,24) = "end" - └── @ UnlessNode (location: (3,0)-(3,20)) - ├── flags: newline - ├── keyword_loc: (3,0)-(3,6) = "unless" - ├── predicate: - │ @ CallNode (location: (3,7)-(3,10)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (3,7)-(3,10) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── then_keyword_loc: ∅ - ├── statements: - │ @ StatementsNode (location: (3,12)-(3,15)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (3,12)-(3,15)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :bar - │ ├── message_loc: (3,12)-(3,15) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── else_clause: ∅ - └── end_keyword_loc: (3,17)-(3,20) = "end" diff --git a/test/prism/snapshots/whitequark/unless_else.txt b/test/prism/snapshots/whitequark/unless_else.txt deleted file mode 100644 index ffdb21569242a4..00000000000000 --- a/test/prism/snapshots/whitequark/unless_else.txt +++ /dev/null @@ -1,105 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,30)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,30)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ UnlessNode (location: (1,0)-(1,34)) - │ ├── flags: newline - │ ├── keyword_loc: (1,0)-(1,6) = "unless" - │ ├── predicate: - │ │ @ CallNode (location: (1,7)-(1,10)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (1,7)-(1,10) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── then_keyword_loc: (1,11)-(1,15) = "then" - │ ├── statements: - │ │ @ StatementsNode (location: (1,16)-(1,19)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (1,16)-(1,19)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (1,16)-(1,19) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── else_clause: - │ │ @ ElseNode (location: (1,21)-(1,34)) - │ │ ├── flags: ∅ - │ │ ├── else_keyword_loc: (1,21)-(1,25) = "else" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (1,26)-(1,29)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (1,26)-(1,29)) - │ │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :baz - │ │ │ ├── message_loc: (1,26)-(1,29) = "baz" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── end_keyword_loc: (1,31)-(1,34) = "end" - │ └── end_keyword_loc: (1,31)-(1,34) = "end" - └── @ UnlessNode (location: (3,0)-(3,30)) - ├── flags: newline - ├── keyword_loc: (3,0)-(3,6) = "unless" - ├── predicate: - │ @ CallNode (location: (3,7)-(3,10)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (3,7)-(3,10) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── then_keyword_loc: ∅ - ├── statements: - │ @ StatementsNode (location: (3,12)-(3,15)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (3,12)-(3,15)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :bar - │ ├── message_loc: (3,12)-(3,15) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── else_clause: - │ @ ElseNode (location: (3,17)-(3,30)) - │ ├── flags: ∅ - │ ├── else_keyword_loc: (3,17)-(3,21) = "else" - │ ├── statements: - │ │ @ StatementsNode (location: (3,22)-(3,25)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (3,22)-(3,25)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :baz - │ │ ├── message_loc: (3,22)-(3,25) = "baz" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── end_keyword_loc: (3,27)-(3,30) = "end" - └── end_keyword_loc: (3,27)-(3,30) = "end" diff --git a/test/prism/snapshots/whitequark/unless_mod.txt b/test/prism/snapshots/whitequark/unless_mod.txt deleted file mode 100644 index 5dd1c2d25d4270..00000000000000 --- a/test/prism/snapshots/whitequark/unless_mod.txt +++ /dev/null @@ -1,38 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,14)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,14)) - ├── flags: ∅ - └── body: (length: 1) - └── @ UnlessNode (location: (1,0)-(1,14)) - ├── flags: newline - ├── keyword_loc: (1,4)-(1,10) = "unless" - ├── predicate: - │ @ CallNode (location: (1,11)-(1,14)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (1,11)-(1,14) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── then_keyword_loc: ∅ - ├── statements: - │ @ StatementsNode (location: (1,0)-(1,3)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,0)-(1,3)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :bar - │ ├── message_loc: (1,0)-(1,3) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── else_clause: ∅ - └── end_keyword_loc: ∅ diff --git a/test/prism/snapshots/whitequark/until.txt b/test/prism/snapshots/whitequark/until.txt deleted file mode 100644 index 0a0f2b35be89fe..00000000000000 --- a/test/prism/snapshots/whitequark/until.txt +++ /dev/null @@ -1,65 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,19)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,19)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ UntilNode (location: (1,0)-(1,21)) - │ ├── flags: newline - │ ├── keyword_loc: (1,0)-(1,5) = "until" - │ ├── closing_loc: (1,18)-(1,21) = "end" - │ ├── predicate: - │ │ @ CallNode (location: (1,6)-(1,9)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (1,6)-(1,9) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── statements: - │ @ StatementsNode (location: (1,13)-(1,17)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,13)-(1,17)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :meth - │ ├── message_loc: (1,13)-(1,17) = "meth" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── @ UntilNode (location: (3,0)-(3,19)) - ├── flags: newline - ├── keyword_loc: (3,0)-(3,5) = "until" - ├── closing_loc: (3,16)-(3,19) = "end" - ├── predicate: - │ @ CallNode (location: (3,6)-(3,9)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (3,6)-(3,9) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── statements: - @ StatementsNode (location: (3,11)-(3,15)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (3,11)-(3,15)) - ├── flags: newline, variable_call, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :meth - ├── message_loc: (3,11)-(3,15) = "meth" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/whitequark/until_mod.txt b/test/prism/snapshots/whitequark/until_mod.txt deleted file mode 100644 index f491018524dac1..00000000000000 --- a/test/prism/snapshots/whitequark/until_mod.txt +++ /dev/null @@ -1,36 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,14)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,14)) - ├── flags: ∅ - └── body: (length: 1) - └── @ UntilNode (location: (1,0)-(1,14)) - ├── flags: newline - ├── keyword_loc: (1,5)-(1,10) = "until" - ├── closing_loc: ∅ - ├── predicate: - │ @ CallNode (location: (1,11)-(1,14)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (1,11)-(1,14) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── statements: - @ StatementsNode (location: (1,0)-(1,4)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,4)) - ├── flags: newline, variable_call, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :meth - ├── message_loc: (1,0)-(1,4) = "meth" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/whitequark/until_post.txt b/test/prism/snapshots/whitequark/until_post.txt deleted file mode 100644 index c5efd5ebe7a9ab..00000000000000 --- a/test/prism/snapshots/whitequark/until_post.txt +++ /dev/null @@ -1,47 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,24)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,24)) - ├── flags: ∅ - └── body: (length: 1) - └── @ UntilNode (location: (1,0)-(1,24)) - ├── flags: newline, begin_modifier - ├── keyword_loc: (1,15)-(1,20) = "until" - ├── closing_loc: ∅ - ├── predicate: - │ @ CallNode (location: (1,21)-(1,24)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (1,21)-(1,24) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── statements: - @ StatementsNode (location: (1,0)-(1,14)) - ├── flags: ∅ - └── body: (length: 1) - └── @ BeginNode (location: (1,0)-(1,14)) - ├── flags: newline - ├── begin_keyword_loc: (1,0)-(1,5) = "begin" - ├── statements: - │ @ StatementsNode (location: (1,6)-(1,10)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,6)-(1,10)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :meth - │ ├── message_loc: (1,6)-(1,10) = "meth" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── rescue_clause: ∅ - ├── else_clause: ∅ - ├── ensure_clause: ∅ - └── end_keyword_loc: (1,11)-(1,14) = "end" diff --git a/test/prism/snapshots/whitequark/var_and_asgn.txt b/test/prism/snapshots/whitequark/var_and_asgn.txt deleted file mode 100644 index 1fd4b042bf6dba..00000000000000 --- a/test/prism/snapshots/whitequark/var_and_asgn.txt +++ /dev/null @@ -1,17 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,7)) -├── flags: ∅ -├── locals: [:a] -└── statements: - @ StatementsNode (location: (1,0)-(1,7)) - ├── flags: ∅ - └── body: (length: 1) - └── @ LocalVariableAndWriteNode (location: (1,0)-(1,7)) - ├── flags: newline - ├── name_loc: (1,0)-(1,1) = "a" - ├── operator_loc: (1,2)-(1,5) = "&&=" - ├── value: - │ @ IntegerNode (location: (1,6)-(1,7)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── name: :a - └── depth: 0 diff --git a/test/prism/snapshots/whitequark/var_op_asgn.txt b/test/prism/snapshots/whitequark/var_op_asgn.txt deleted file mode 100644 index bc863b31c77bc2..00000000000000 --- a/test/prism/snapshots/whitequark/var_op_asgn.txt +++ /dev/null @@ -1,65 +0,0 @@ -@ ProgramNode (location: (1,0)-(7,23)) -├── flags: ∅ -├── locals: [:a] -└── statements: - @ StatementsNode (location: (1,0)-(7,23)) - ├── flags: ∅ - └── body: (length: 4) - ├── @ ClassVariableOperatorWriteNode (location: (1,0)-(1,11)) - │ ├── flags: newline - │ ├── name: :@@var - │ ├── name_loc: (1,0)-(1,5) = "@@var" - │ ├── binary_operator_loc: (1,6)-(1,8) = "|=" - │ ├── value: - │ │ @ IntegerNode (location: (1,9)-(1,11)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 10 - │ └── binary_operator: :| - ├── @ InstanceVariableOperatorWriteNode (location: (3,0)-(3,7)) - │ ├── flags: newline - │ ├── name: :@a - │ ├── name_loc: (3,0)-(3,2) = "@a" - │ ├── binary_operator_loc: (3,3)-(3,5) = "|=" - │ ├── value: - │ │ @ IntegerNode (location: (3,6)-(3,7)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ └── binary_operator: :| - ├── @ LocalVariableOperatorWriteNode (location: (5,0)-(5,6)) - │ ├── flags: newline - │ ├── name_loc: (5,0)-(5,1) = "a" - │ ├── binary_operator_loc: (5,2)-(5,4) = "+=" - │ ├── value: - │ │ @ IntegerNode (location: (5,5)-(5,6)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 1 - │ ├── name: :a - │ ├── binary_operator: :+ - │ └── depth: 0 - └── @ DefNode (location: (7,0)-(7,23)) - ├── flags: newline - ├── name: :a - ├── name_loc: (7,4)-(7,5) = "a" - ├── receiver: ∅ - ├── parameters: ∅ - ├── body: - │ @ StatementsNode (location: (7,7)-(7,18)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ ClassVariableOperatorWriteNode (location: (7,7)-(7,18)) - │ ├── flags: newline - │ ├── name: :@@var - │ ├── name_loc: (7,7)-(7,12) = "@@var" - │ ├── binary_operator_loc: (7,13)-(7,15) = "|=" - │ ├── value: - │ │ @ IntegerNode (location: (7,16)-(7,18)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 10 - │ └── binary_operator: :| - ├── locals: [] - ├── def_keyword_loc: (7,0)-(7,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: ∅ - ├── rparen_loc: ∅ - ├── equal_loc: ∅ - └── end_keyword_loc: (7,20)-(7,23) = "end" diff --git a/test/prism/snapshots/whitequark/var_op_asgn_cmd.txt b/test/prism/snapshots/whitequark/var_op_asgn_cmd.txt deleted file mode 100644 index 381c98a95a5cca..00000000000000 --- a/test/prism/snapshots/whitequark/var_op_asgn_cmd.txt +++ /dev/null @@ -1,32 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,12)) -├── flags: ∅ -├── locals: [:foo] -└── statements: - @ StatementsNode (location: (1,0)-(1,12)) - ├── flags: ∅ - └── body: (length: 1) - └── @ LocalVariableOperatorWriteNode (location: (1,0)-(1,12)) - ├── flags: newline - ├── name_loc: (1,0)-(1,3) = "foo" - ├── binary_operator_loc: (1,4)-(1,6) = "+=" - ├── value: - │ @ CallNode (location: (1,7)-(1,12)) - │ ├── flags: ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :m - │ ├── message_loc: (1,7)-(1,8) = "m" - │ ├── opening_loc: ∅ - │ ├── arguments: - │ │ @ ArgumentsNode (location: (1,9)-(1,12)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 1) - │ │ └── @ LocalVariableReadNode (location: (1,9)-(1,12)) - │ │ ├── flags: ∅ - │ │ ├── name: :foo - │ │ └── depth: 0 - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── name: :foo - ├── binary_operator: :+ - └── depth: 0 diff --git a/test/prism/snapshots/whitequark/var_or_asgn.txt b/test/prism/snapshots/whitequark/var_or_asgn.txt deleted file mode 100644 index 2d034c7f2d0730..00000000000000 --- a/test/prism/snapshots/whitequark/var_or_asgn.txt +++ /dev/null @@ -1,17 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,7)) -├── flags: ∅ -├── locals: [:a] -└── statements: - @ StatementsNode (location: (1,0)-(1,7)) - ├── flags: ∅ - └── body: (length: 1) - └── @ LocalVariableOrWriteNode (location: (1,0)-(1,7)) - ├── flags: newline - ├── name_loc: (1,0)-(1,1) = "a" - ├── operator_loc: (1,2)-(1,5) = "||=" - ├── value: - │ @ IntegerNode (location: (1,6)-(1,7)) - │ ├── flags: static_literal, decimal - │ └── value: 1 - ├── name: :a - └── depth: 0 diff --git a/test/prism/snapshots/whitequark/when_multi.txt b/test/prism/snapshots/whitequark/when_multi.txt deleted file mode 100644 index b4038b74a81146..00000000000000 --- a/test/prism/snapshots/whitequark/when_multi.txt +++ /dev/null @@ -1,55 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,37)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,37)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CaseNode (location: (1,0)-(1,37)) - ├── flags: newline - ├── predicate: - │ @ CallNode (location: (1,5)-(1,8)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (1,5)-(1,8) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── conditions: (length: 1) - │ └── @ WhenNode (location: (1,10)-(1,32)) - │ ├── flags: ∅ - │ ├── keyword_loc: (1,10)-(1,14) = "when" - │ ├── conditions: (length: 2) - │ │ ├── @ StringNode (location: (1,15)-(1,20)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: (1,15)-(1,16) = "'" - │ │ │ ├── content_loc: (1,16)-(1,19) = "bar" - │ │ │ ├── closing_loc: (1,19)-(1,20) = "'" - │ │ │ └── unescaped: "bar" - │ │ └── @ StringNode (location: (1,22)-(1,27)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: (1,22)-(1,23) = "'" - │ │ ├── content_loc: (1,23)-(1,26) = "baz" - │ │ ├── closing_loc: (1,26)-(1,27) = "'" - │ │ └── unescaped: "baz" - │ ├── then_keyword_loc: ∅ - │ └── statements: - │ @ StatementsNode (location: (1,29)-(1,32)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,29)-(1,32)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :bar - │ ├── message_loc: (1,29)-(1,32) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── else_clause: ∅ - ├── case_keyword_loc: (1,0)-(1,4) = "case" - └── end_keyword_loc: (1,34)-(1,37) = "end" diff --git a/test/prism/snapshots/whitequark/when_splat.txt b/test/prism/snapshots/whitequark/when_splat.txt deleted file mode 100644 index f5d9080539aa28..00000000000000 --- a/test/prism/snapshots/whitequark/when_splat.txt +++ /dev/null @@ -1,80 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,43)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,43)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CaseNode (location: (1,0)-(1,43)) - ├── flags: newline - ├── predicate: - │ @ CallNode (location: (1,5)-(1,8)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (1,5)-(1,8) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── conditions: (length: 2) - │ ├── @ WhenNode (location: (1,10)-(1,27)) - │ │ ├── flags: ∅ - │ │ ├── keyword_loc: (1,10)-(1,14) = "when" - │ │ ├── conditions: (length: 2) - │ │ │ ├── @ IntegerNode (location: (1,15)-(1,16)) - │ │ │ │ ├── flags: static_literal, decimal - │ │ │ │ └── value: 1 - │ │ │ └── @ SplatNode (location: (1,18)-(1,22)) - │ │ │ ├── flags: ∅ - │ │ │ ├── operator_loc: (1,18)-(1,19) = "*" - │ │ │ └── expression: - │ │ │ @ CallNode (location: (1,19)-(1,22)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :baz - │ │ │ ├── message_loc: (1,19)-(1,22) = "baz" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ ├── then_keyword_loc: ∅ - │ │ └── statements: - │ │ @ StatementsNode (location: (1,24)-(1,27)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ CallNode (location: (1,24)-(1,27)) - │ │ ├── flags: newline, variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :bar - │ │ ├── message_loc: (1,24)-(1,27) = "bar" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── @ WhenNode (location: (1,29)-(1,38)) - │ ├── flags: ∅ - │ ├── keyword_loc: (1,29)-(1,33) = "when" - │ ├── conditions: (length: 1) - │ │ └── @ SplatNode (location: (1,34)-(1,38)) - │ │ ├── flags: ∅ - │ │ ├── operator_loc: (1,34)-(1,35) = "*" - │ │ └── expression: - │ │ @ CallNode (location: (1,35)-(1,38)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (1,35)-(1,38) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ ├── then_keyword_loc: ∅ - │ └── statements: ∅ - ├── else_clause: ∅ - ├── case_keyword_loc: (1,0)-(1,4) = "case" - └── end_keyword_loc: (1,40)-(1,43) = "end" diff --git a/test/prism/snapshots/whitequark/when_then.txt b/test/prism/snapshots/whitequark/when_then.txt deleted file mode 100644 index cb964cfb53e3a1..00000000000000 --- a/test/prism/snapshots/whitequark/when_then.txt +++ /dev/null @@ -1,49 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,34)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,34)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CaseNode (location: (1,0)-(1,34)) - ├── flags: newline - ├── predicate: - │ @ CallNode (location: (1,5)-(1,8)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (1,5)-(1,8) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── conditions: (length: 1) - │ └── @ WhenNode (location: (1,10)-(1,29)) - │ ├── flags: ∅ - │ ├── keyword_loc: (1,10)-(1,14) = "when" - │ ├── conditions: (length: 1) - │ │ └── @ StringNode (location: (1,15)-(1,20)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: (1,15)-(1,16) = "'" - │ │ ├── content_loc: (1,16)-(1,19) = "bar" - │ │ ├── closing_loc: (1,19)-(1,20) = "'" - │ │ └── unescaped: "bar" - │ ├── then_keyword_loc: (1,21)-(1,25) = "then" - │ └── statements: - │ @ StatementsNode (location: (1,26)-(1,29)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,26)-(1,29)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :bar - │ ├── message_loc: (1,26)-(1,29) = "bar" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── else_clause: ∅ - ├── case_keyword_loc: (1,0)-(1,4) = "case" - └── end_keyword_loc: (1,31)-(1,34) = "end" diff --git a/test/prism/snapshots/whitequark/while.txt b/test/prism/snapshots/whitequark/while.txt deleted file mode 100644 index 949a3952d379ca..00000000000000 --- a/test/prism/snapshots/whitequark/while.txt +++ /dev/null @@ -1,65 +0,0 @@ -@ ProgramNode (location: (1,0)-(3,19)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(3,19)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ WhileNode (location: (1,0)-(1,21)) - │ ├── flags: newline - │ ├── keyword_loc: (1,0)-(1,5) = "while" - │ ├── closing_loc: (1,18)-(1,21) = "end" - │ ├── predicate: - │ │ @ CallNode (location: (1,6)-(1,9)) - │ │ ├── flags: variable_call, ignore_visibility - │ │ ├── receiver: ∅ - │ │ ├── call_operator_loc: ∅ - │ │ ├── name: :foo - │ │ ├── message_loc: (1,6)-(1,9) = "foo" - │ │ ├── opening_loc: ∅ - │ │ ├── arguments: ∅ - │ │ ├── closing_loc: ∅ - │ │ └── block: ∅ - │ └── statements: - │ @ StatementsNode (location: (1,13)-(1,17)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,13)-(1,17)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :meth - │ ├── message_loc: (1,13)-(1,17) = "meth" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── @ WhileNode (location: (3,0)-(3,19)) - ├── flags: newline - ├── keyword_loc: (3,0)-(3,5) = "while" - ├── closing_loc: (3,16)-(3,19) = "end" - ├── predicate: - │ @ CallNode (location: (3,6)-(3,9)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (3,6)-(3,9) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── statements: - @ StatementsNode (location: (3,11)-(3,15)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (3,11)-(3,15)) - ├── flags: newline, variable_call, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :meth - ├── message_loc: (3,11)-(3,15) = "meth" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/whitequark/while_mod.txt b/test/prism/snapshots/whitequark/while_mod.txt deleted file mode 100644 index 696163e4337c01..00000000000000 --- a/test/prism/snapshots/whitequark/while_mod.txt +++ /dev/null @@ -1,36 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,14)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,14)) - ├── flags: ∅ - └── body: (length: 1) - └── @ WhileNode (location: (1,0)-(1,14)) - ├── flags: newline - ├── keyword_loc: (1,5)-(1,10) = "while" - ├── closing_loc: ∅ - ├── predicate: - │ @ CallNode (location: (1,11)-(1,14)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (1,11)-(1,14) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── statements: - @ StatementsNode (location: (1,0)-(1,4)) - ├── flags: ∅ - └── body: (length: 1) - └── @ CallNode (location: (1,0)-(1,4)) - ├── flags: newline, variable_call, ignore_visibility - ├── receiver: ∅ - ├── call_operator_loc: ∅ - ├── name: :meth - ├── message_loc: (1,0)-(1,4) = "meth" - ├── opening_loc: ∅ - ├── arguments: ∅ - ├── closing_loc: ∅ - └── block: ∅ diff --git a/test/prism/snapshots/whitequark/while_post.txt b/test/prism/snapshots/whitequark/while_post.txt deleted file mode 100644 index 32cef381f14970..00000000000000 --- a/test/prism/snapshots/whitequark/while_post.txt +++ /dev/null @@ -1,47 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,24)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,24)) - ├── flags: ∅ - └── body: (length: 1) - └── @ WhileNode (location: (1,0)-(1,24)) - ├── flags: newline, begin_modifier - ├── keyword_loc: (1,15)-(1,20) = "while" - ├── closing_loc: ∅ - ├── predicate: - │ @ CallNode (location: (1,21)-(1,24)) - │ ├── flags: variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :foo - │ ├── message_loc: (1,21)-(1,24) = "foo" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - └── statements: - @ StatementsNode (location: (1,0)-(1,14)) - ├── flags: ∅ - └── body: (length: 1) - └── @ BeginNode (location: (1,0)-(1,14)) - ├── flags: newline - ├── begin_keyword_loc: (1,0)-(1,5) = "begin" - ├── statements: - │ @ StatementsNode (location: (1,6)-(1,10)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ CallNode (location: (1,6)-(1,10)) - │ ├── flags: newline, variable_call, ignore_visibility - │ ├── receiver: ∅ - │ ├── call_operator_loc: ∅ - │ ├── name: :meth - │ ├── message_loc: (1,6)-(1,10) = "meth" - │ ├── opening_loc: ∅ - │ ├── arguments: ∅ - │ ├── closing_loc: ∅ - │ └── block: ∅ - ├── rescue_clause: ∅ - ├── else_clause: ∅ - ├── ensure_clause: ∅ - └── end_keyword_loc: (1,11)-(1,14) = "end" diff --git a/test/prism/snapshots/whitequark/xstring_interp.txt b/test/prism/snapshots/whitequark/xstring_interp.txt deleted file mode 100644 index 7808b932500a3f..00000000000000 --- a/test/prism/snapshots/whitequark/xstring_interp.txt +++ /dev/null @@ -1,42 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,14)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,14)) - ├── flags: ∅ - └── body: (length: 1) - └── @ InterpolatedXStringNode (location: (1,0)-(1,14)) - ├── flags: newline - ├── opening_loc: (1,0)-(1,1) = "`" - ├── parts: (length: 3) - │ ├── @ StringNode (location: (1,1)-(1,4)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (1,1)-(1,4) = "foo" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: "foo" - │ ├── @ EmbeddedStatementsNode (location: (1,4)-(1,10)) - │ │ ├── flags: ∅ - │ │ ├── opening_loc: (1,4)-(1,6) = "\#{" - │ │ ├── statements: - │ │ │ @ StatementsNode (location: (1,6)-(1,9)) - │ │ │ ├── flags: ∅ - │ │ │ └── body: (length: 1) - │ │ │ └── @ CallNode (location: (1,6)-(1,9)) - │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ ├── receiver: ∅ - │ │ │ ├── call_operator_loc: ∅ - │ │ │ ├── name: :bar - │ │ │ ├── message_loc: (1,6)-(1,9) = "bar" - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── arguments: ∅ - │ │ │ ├── closing_loc: ∅ - │ │ │ └── block: ∅ - │ │ └── closing_loc: (1,9)-(1,10) = "}" - │ └── @ StringNode (location: (1,10)-(1,13)) - │ ├── flags: static_literal, frozen - │ ├── opening_loc: ∅ - │ ├── content_loc: (1,10)-(1,13) = "baz" - │ ├── closing_loc: ∅ - │ └── unescaped: "baz" - └── closing_loc: (1,13)-(1,14) = "`" diff --git a/test/prism/snapshots/whitequark/xstring_plain.txt b/test/prism/snapshots/whitequark/xstring_plain.txt deleted file mode 100644 index dae47ddcffbd36..00000000000000 --- a/test/prism/snapshots/whitequark/xstring_plain.txt +++ /dev/null @@ -1,13 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,8)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,8)) - ├── flags: ∅ - └── body: (length: 1) - └── @ XStringNode (location: (1,0)-(1,8)) - ├── flags: newline - ├── opening_loc: (1,0)-(1,1) = "`" - ├── content_loc: (1,1)-(1,7) = "foobar" - ├── closing_loc: (1,7)-(1,8) = "`" - └── unescaped: "foobar" diff --git a/test/prism/snapshots/whitequark/zsuper.txt b/test/prism/snapshots/whitequark/zsuper.txt deleted file mode 100644 index f64ecb359408f6..00000000000000 --- a/test/prism/snapshots/whitequark/zsuper.txt +++ /dev/null @@ -1,10 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,5)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,5)) - ├── flags: ∅ - └── body: (length: 1) - └── @ ForwardingSuperNode (location: (1,0)-(1,5)) - ├── flags: newline - └── block: ∅ diff --git a/test/prism/snapshots/xstring.txt b/test/prism/snapshots/xstring.txt deleted file mode 100644 index 837cd581a4dac5..00000000000000 --- a/test/prism/snapshots/xstring.txt +++ /dev/null @@ -1,72 +0,0 @@ -@ ProgramNode (location: (1,0)-(13,4)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(13,4)) - ├── flags: ∅ - └── body: (length: 6) - ├── @ XStringNode (location: (1,0)-(1,7)) - │ ├── flags: newline - │ ├── opening_loc: (1,0)-(1,3) = "%x[" - │ ├── content_loc: (1,3)-(1,6) = "foo" - │ ├── closing_loc: (1,6)-(1,7) = "]" - │ └── unescaped: "foo" - ├── @ InterpolatedXStringNode (location: (3,0)-(3,16)) - │ ├── flags: newline - │ ├── opening_loc: (3,0)-(3,1) = "`" - │ ├── parts: (length: 3) - │ │ ├── @ StringNode (location: (3,1)-(3,5)) - │ │ │ ├── flags: static_literal, frozen - │ │ │ ├── opening_loc: ∅ - │ │ │ ├── content_loc: (3,1)-(3,5) = "foo " - │ │ │ ├── closing_loc: ∅ - │ │ │ └── unescaped: "foo " - │ │ ├── @ EmbeddedStatementsNode (location: (3,5)-(3,11)) - │ │ │ ├── flags: ∅ - │ │ │ ├── opening_loc: (3,5)-(3,7) = "\#{" - │ │ │ ├── statements: - │ │ │ │ @ StatementsNode (location: (3,7)-(3,10)) - │ │ │ │ ├── flags: ∅ - │ │ │ │ └── body: (length: 1) - │ │ │ │ └── @ CallNode (location: (3,7)-(3,10)) - │ │ │ │ ├── flags: variable_call, ignore_visibility - │ │ │ │ ├── receiver: ∅ - │ │ │ │ ├── call_operator_loc: ∅ - │ │ │ │ ├── name: :bar - │ │ │ │ ├── message_loc: (3,7)-(3,10) = "bar" - │ │ │ │ ├── opening_loc: ∅ - │ │ │ │ ├── arguments: ∅ - │ │ │ │ ├── closing_loc: ∅ - │ │ │ │ └── block: ∅ - │ │ │ └── closing_loc: (3,10)-(3,11) = "}" - │ │ └── @ StringNode (location: (3,11)-(3,15)) - │ │ ├── flags: static_literal, frozen - │ │ ├── opening_loc: ∅ - │ │ ├── content_loc: (3,11)-(3,15) = " baz" - │ │ ├── closing_loc: ∅ - │ │ └── unescaped: " baz" - │ └── closing_loc: (3,15)-(3,16) = "`" - ├── @ XStringNode (location: (5,0)-(5,5)) - │ ├── flags: newline - │ ├── opening_loc: (5,0)-(5,1) = "`" - │ ├── content_loc: (5,1)-(5,4) = "foo" - │ ├── closing_loc: (5,4)-(5,5) = "`" - │ └── unescaped: "foo" - ├── @ XStringNode (location: (7,0)-(9,1)) - │ ├── flags: newline - │ ├── opening_loc: (7,0)-(7,3) = "%x{" - │ ├── content_loc: (7,3)-(9,0) = "\n foo\n" - │ ├── closing_loc: (9,0)-(9,1) = "}" - │ └── unescaped: "\n foo\n" - ├── @ XStringNode (location: (11,0)-(11,2)) - │ ├── flags: newline - │ ├── opening_loc: (11,0)-(11,1) = "`" - │ ├── content_loc: (11,1)-(11,1) = "" - │ ├── closing_loc: (11,1)-(11,2) = "`" - │ └── unescaped: "" - └── @ XStringNode (location: (13,0)-(13,4)) - ├── flags: newline - ├── opening_loc: (13,0)-(13,3) = "%x{" - ├── content_loc: (13,3)-(13,3) = "" - ├── closing_loc: (13,3)-(13,4) = "}" - └── unescaped: "" diff --git a/test/prism/snapshots/xstring_with_backslash.txt b/test/prism/snapshots/xstring_with_backslash.txt deleted file mode 100644 index ca58f5cd405234..00000000000000 --- a/test/prism/snapshots/xstring_with_backslash.txt +++ /dev/null @@ -1,13 +0,0 @@ -@ ProgramNode (location: (1,0)-(1,6)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(1,6)) - ├── flags: ∅ - └── body: (length: 1) - └── @ XStringNode (location: (1,0)-(1,6)) - ├── flags: newline - ├── opening_loc: (1,0)-(1,1) = "`" - ├── content_loc: (1,1)-(1,5) = "f\\oo" - ├── closing_loc: (1,5)-(1,6) = "`" - └── unescaped: "foo" diff --git a/test/prism/snapshots/yield.txt b/test/prism/snapshots/yield.txt deleted file mode 100644 index c62751b8e67834..00000000000000 --- a/test/prism/snapshots/yield.txt +++ /dev/null @@ -1,117 +0,0 @@ -@ ProgramNode (location: (1,0)-(7,28)) -├── flags: ∅ -├── locals: [] -└── statements: - @ StatementsNode (location: (1,0)-(7,28)) - ├── flags: ∅ - └── body: (length: 4) - ├── @ DefNode (location: (1,0)-(1,19)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (1,4)-(1,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (1,9)-(1,14)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ YieldNode (location: (1,9)-(1,14)) - │ │ ├── flags: newline - │ │ ├── keyword_loc: (1,9)-(1,14) = "yield" - │ │ ├── lparen_loc: ∅ - │ │ ├── arguments: ∅ - │ │ └── rparen_loc: ∅ - │ ├── locals: [] - │ ├── def_keyword_loc: (1,0)-(1,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (1,16)-(1,19) = "end" - ├── @ DefNode (location: (3,0)-(3,21)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (3,4)-(3,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (3,9)-(3,16)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ YieldNode (location: (3,9)-(3,16)) - │ │ ├── flags: newline - │ │ ├── keyword_loc: (3,9)-(3,14) = "yield" - │ │ ├── lparen_loc: (3,14)-(3,15) = "(" - │ │ ├── arguments: ∅ - │ │ └── rparen_loc: (3,15)-(3,16) = ")" - │ ├── locals: [] - │ ├── def_keyword_loc: (3,0)-(3,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (3,18)-(3,21) = "end" - ├── @ DefNode (location: (5,0)-(5,22)) - │ ├── flags: newline - │ ├── name: :foo - │ ├── name_loc: (5,4)-(5,7) = "foo" - │ ├── receiver: ∅ - │ ├── parameters: ∅ - │ ├── body: - │ │ @ StatementsNode (location: (5,9)-(5,17)) - │ │ ├── flags: ∅ - │ │ └── body: (length: 1) - │ │ └── @ YieldNode (location: (5,9)-(5,17)) - │ │ ├── flags: newline - │ │ ├── keyword_loc: (5,9)-(5,14) = "yield" - │ │ ├── lparen_loc: (5,14)-(5,15) = "(" - │ │ ├── arguments: - │ │ │ @ ArgumentsNode (location: (5,15)-(5,16)) - │ │ │ ├── flags: ∅ - │ │ │ └── arguments: (length: 1) - │ │ │ └── @ IntegerNode (location: (5,15)-(5,16)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ └── rparen_loc: (5,16)-(5,17) = ")" - │ ├── locals: [] - │ ├── def_keyword_loc: (5,0)-(5,3) = "def" - │ ├── operator_loc: ∅ - │ ├── lparen_loc: ∅ - │ ├── rparen_loc: ∅ - │ ├── equal_loc: ∅ - │ └── end_keyword_loc: (5,19)-(5,22) = "end" - └── @ DefNode (location: (7,0)-(7,28)) - ├── flags: newline - ├── name: :foo - ├── name_loc: (7,4)-(7,7) = "foo" - ├── receiver: ∅ - ├── parameters: ∅ - ├── body: - │ @ StatementsNode (location: (7,9)-(7,23)) - │ ├── flags: ∅ - │ └── body: (length: 1) - │ └── @ YieldNode (location: (7,9)-(7,23)) - │ ├── flags: newline - │ ├── keyword_loc: (7,9)-(7,14) = "yield" - │ ├── lparen_loc: (7,14)-(7,15) = "(" - │ ├── arguments: - │ │ @ ArgumentsNode (location: (7,15)-(7,22)) - │ │ ├── flags: ∅ - │ │ └── arguments: (length: 3) - │ │ ├── @ IntegerNode (location: (7,15)-(7,16)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 1 - │ │ ├── @ IntegerNode (location: (7,18)-(7,19)) - │ │ │ ├── flags: static_literal, decimal - │ │ │ └── value: 2 - │ │ └── @ IntegerNode (location: (7,21)-(7,22)) - │ │ ├── flags: static_literal, decimal - │ │ └── value: 3 - │ └── rparen_loc: (7,22)-(7,23) = ")" - ├── locals: [] - ├── def_keyword_loc: (7,0)-(7,3) = "def" - ├── operator_loc: ∅ - ├── lparen_loc: ∅ - ├── rparen_loc: ∅ - ├── equal_loc: ∅ - └── end_keyword_loc: (7,25)-(7,28) = "end" diff --git a/test/prism/snapshots_test.rb b/test/prism/snapshots_test.rb deleted file mode 100644 index 0744eafad31fed..00000000000000 --- a/test/prism/snapshots_test.rb +++ /dev/null @@ -1,73 +0,0 @@ -# frozen_string_literal: true - -require_relative "test_helper" - -module Prism - class SnapshotsTest < TestCase - # When we pretty-print the trees to compare against the snapshots, we want - # to be certain that we print with the same external encoding. This is - # because methods like Symbol#inspect take into account external encoding - # and it could change how the snapshot is generated. On machines with - # certain settings (like LANG=C or -Eascii-8bit) this could have been - # changed. So here we're going to force it to be UTF-8 to keep the snapshots - # consistent. - def setup - @previous_default_external = Encoding.default_external - ignore_warnings { Encoding.default_external = Encoding::UTF_8 } - end - - def teardown - ignore_warnings { Encoding.default_external = @previous_default_external } - end - - except = [] - - # These fail on TruffleRuby due to a difference in Symbol#inspect: - # :测试 vs :"测试" - if RUBY_ENGINE == "truffleruby" - except.push( - "emoji_method_calls.txt", - "seattlerb/bug202.txt", - "seattlerb/magic_encoding_comment.txt" - ) - end - - Fixture.each(except: except) do |fixture| - define_method(fixture.test_name) { assert_snapshot(fixture) } - end - - private - - def assert_snapshot(fixture) - source = fixture.read - - result = Prism.parse(source, filepath: fixture.path) - assert result.success? - - printed = PP.pp(result.value, +"", 79) - snapshot = fixture.snapshot_path - - if File.exist?(snapshot) - saved = File.read(snapshot) - - # If the snapshot file exists, but the printed value does not match the - # snapshot, then update the snapshot file. - if printed != saved - File.write(snapshot, printed) - warn("Updated snapshot at #{snapshot}.") - end - - # If the snapshot file exists, then assert that the printed value - # matches the snapshot. - assert_equal(saved, printed) - else - # If the snapshot file does not yet exist, then write it out now. - directory = File.dirname(snapshot) - FileUtils.mkdir_p(directory) unless File.directory?(directory) - - File.write(snapshot, printed) - warn("Created snapshot at #{snapshot}.") - end - end - end -end diff --git a/tool/sync_default_gems.rb b/tool/sync_default_gems.rb index 8c43052d561b9a..2c01106af0970e 100755 --- a/tool/sync_default_gems.rb +++ b/tool/sync_default_gems.rb @@ -383,6 +383,9 @@ def sync_default_gems(gem) rm_rf("prism/templates/rbi") rm_rf("prism/templates/sig") + rm("test/prism/snapshots_test.rb") + rm_rf("test/prism/snapshots") + rm("prism/extconf.rb") when "resolv" rm_rf(%w[lib/resolv.* ext/win32/resolv test/resolv ext/win32/lib/win32/resolv.rb]) From 2bfeedc082af7adfbbba2f4d9e40beb49f0ceaae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Thu, 12 Sep 2024 16:41:34 +0200 Subject: [PATCH 299/829] [rubygems/rubygems] Simplify handling default gem caching By the time `cached_gem` is called, default gem cache has already been handled. So no need to try redownload it again, it's enough to check the cache location directly. https://github.com/rubygems/rubygems/commit/70e10236b6 --- lib/bundler/source/rubygems.rb | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/lib/bundler/source/rubygems.rb b/lib/bundler/source/rubygems.rb index 1085fdc2d89f7b..31815ea63a37ab 100644 --- a/lib/bundler/source/rubygems.rb +++ b/lib/bundler/source/rubygems.rb @@ -223,11 +223,12 @@ def cache(spec, custom_path = nil) end def cached_built_in_gem(spec) - cached_path = cached_path(spec) + cached_path = cached_gem(spec) if cached_path.nil? remote_spec = remote_specs.search(spec).first if remote_spec cached_path = fetch_gem(remote_spec) + spec.remote = remote_spec.remote else Bundler.ui.warn "#{spec.full_name} is built in to Ruby, and can't be cached because your Gemfile doesn't have any sources that contain it." end @@ -324,14 +325,6 @@ def remotes_for_spec(spec) end def cached_gem(spec) - if spec.default_gem? - cached_built_in_gem(spec) - else - cached_path(spec) - end - end - - def cached_path(spec) global_cache_path = download_cache_path(spec) caches << global_cache_path if global_cache_path From f4f46af95818cd6015e938616afef88fd8e6351d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Thu, 12 Sep 2024 17:09:20 +0200 Subject: [PATCH 300/829] Complete spec MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Vít Ondruch --- spec/bundler/cache/gems_spec.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spec/bundler/cache/gems_spec.rb b/spec/bundler/cache/gems_spec.rb index 8f81d2d45e9e35..2bd654ef43e2f7 100644 --- a/spec/bundler/cache/gems_spec.rb +++ b/spec/bundler/cache/gems_spec.rb @@ -149,9 +149,10 @@ end context "when a remote gem is not available for caching" do - it "uses builtin gems when installing to system gems" do + it "warns, but uses builtin gems when installing to system gems" do bundle "config set path.system true" install_gemfile %(source "https://gem.repo1"; gem 'json', '#{default_json_version}'), verbose: true + expect(err).to include("json-#{default_json_version} is built in to Ruby, and can't be cached") expect(out).to include("Using json #{default_json_version}") end From c5a782dfb04a00f47dc5c80d407df9931735b3dc Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Fri, 13 Sep 2024 14:02:17 -0400 Subject: [PATCH 301/829] Replace with asan_unpoisoning_object --- gc/default.c | 269 +++++++++++++++++++++------------------------------ 1 file changed, 111 insertions(+), 158 deletions(-) diff --git a/gc/default.c b/gc/default.c index 94e5acf3d76375..38334d5edc776e 100644 --- a/gc/default.c +++ b/gc/default.c @@ -1373,13 +1373,9 @@ gc_object_moved_p(rb_objspace_t *objspace, VALUE obj) return FALSE; } else { - void *poisoned = asan_unpoison_object_temporary(obj); - - int ret = BUILTIN_TYPE(obj) == T_MOVED; - /* Re-poison slot if it's not the one we want */ - if (poisoned) { - GC_ASSERT(BUILTIN_TYPE(obj) == T_NONE); - asan_poison_object(obj); + int ret; + asan_unpoisoning_object(obj) { + ret = BUILTIN_TYPE(obj) == T_MOVED; } return ret; } @@ -3153,15 +3149,10 @@ rb_gc_impl_shutdown_call_finalizer(void *objspace_ptr) uintptr_t pend = p + page->total_slots * stride; for (; p < pend; p += stride) { VALUE vp = (VALUE)p; - void *poisoned = asan_unpoison_object_temporary(vp); - - if (rb_gc_shutdown_call_finalizer_p(vp)) { - rb_gc_obj_free(objspace, vp); - } - - if (poisoned) { - GC_ASSERT(BUILTIN_TYPE(vp) == T_NONE); - asan_poison_object(vp); + asan_unpoisoning_object(vp) { + if (rb_gc_shutdown_call_finalizer_p(vp)) { + rb_gc_obj_free(objspace, vp); + } } } } @@ -3189,13 +3180,8 @@ rb_gc_impl_each_object(void *objspace_ptr, void (*func)(VALUE obj, void *data), for (; p < pend; p += stride) { VALUE obj = (VALUE)p; - void *poisoned = asan_unpoison_object_temporary(obj); - - func(obj, data); - - if (poisoned) { - GC_ASSERT(BUILTIN_TYPE(obj) == T_NONE); - asan_poison_object(obj); + asan_unpoisoning_object(obj) { + func(obj, data); } } } @@ -4061,20 +4047,14 @@ rb_gc_impl_location(void *objspace_ptr, VALUE value) VALUE destination; if (!SPECIAL_CONST_P(value)) { - void *poisoned = asan_unpoison_object_temporary(value); - - if (BUILTIN_TYPE(value) == T_MOVED) { - destination = (VALUE)RMOVED(value)->destination; - GC_ASSERT(BUILTIN_TYPE(destination) != T_NONE); - } - else { - destination = value; - } - - /* Re-poison slot if it's not the one we want */ - if (poisoned) { - GC_ASSERT(BUILTIN_TYPE(value) == T_NONE); - asan_poison_object(value); + asan_unpoisoning_object(value) { + if (BUILTIN_TYPE(value) == T_MOVED) { + destination = (VALUE)RMOVED(value)->destination; + GC_ASSERT(BUILTIN_TYPE(destination) != T_NONE); + } + else { + destination = value; + } } } else { @@ -4583,21 +4563,16 @@ rb_gc_impl_mark_maybe(void *objspace_ptr, VALUE obj) (void)VALGRIND_MAKE_MEM_DEFINED(&obj, sizeof(obj)); if (is_pointer_to_heap(objspace, (void *)obj)) { - void *ptr = asan_unpoison_object_temporary(obj); - - /* Garbage can live on the stack, so do not mark or pin */ - switch (BUILTIN_TYPE(obj)) { - case T_ZOMBIE: - case T_NONE: - break; - default: - gc_mark_and_pin(objspace, obj); - break; - } - - if (ptr) { - GC_ASSERT(BUILTIN_TYPE(obj) == T_NONE); - asan_poison_object(obj); + asan_unpoisoning_object(obj) { + /* Garbage can live on the stack, so do not mark or pin */ + switch (BUILTIN_TYPE(obj)) { + case T_ZOMBIE: + case T_NONE: + break; + default: + gc_mark_and_pin(objspace, obj); + break; + } } } } @@ -5080,60 +5055,56 @@ verify_internal_consistency_i(void *page_start, void *page_end, size_t stride, rb_objspace_t *objspace = data->objspace; for (obj = (VALUE)page_start; obj != (VALUE)page_end; obj += stride) { - void *poisoned = asan_unpoison_object_temporary(obj); - - if (!rb_gc_impl_garbage_object_p(objspace, obj)) { - /* count objects */ - data->live_object_count++; - data->parent = obj; - - /* Normally, we don't expect T_MOVED objects to be in the heap. - * But they can stay alive on the stack, */ - if (!gc_object_moved_p(objspace, obj)) { - /* moved slots don't have children */ - rb_objspace_reachable_objects_from(obj, check_children_i, (void *)data); - } + asan_unpoisoning_object(obj) { + if (!rb_gc_impl_garbage_object_p(objspace, obj)) { + /* count objects */ + data->live_object_count++; + data->parent = obj; - /* check health of children */ - if (RVALUE_OLD_P(objspace, obj)) data->old_object_count++; - if (RVALUE_WB_UNPROTECTED(objspace, obj) && RVALUE_UNCOLLECTIBLE(objspace, obj)) data->remembered_shady_count++; + /* Normally, we don't expect T_MOVED objects to be in the heap. + * But they can stay alive on the stack, */ + if (!gc_object_moved_p(objspace, obj)) { + /* moved slots don't have children */ + rb_objspace_reachable_objects_from(obj, check_children_i, (void *)data); + } - if (!is_marking(objspace) && RVALUE_OLD_P(objspace, obj)) { - /* reachable objects from an oldgen object should be old or (young with remember) */ - data->parent = obj; - rb_objspace_reachable_objects_from(obj, check_generation_i, (void *)data); - } + /* check health of children */ + if (RVALUE_OLD_P(objspace, obj)) data->old_object_count++; + if (RVALUE_WB_UNPROTECTED(objspace, obj) && RVALUE_UNCOLLECTIBLE(objspace, obj)) data->remembered_shady_count++; - if (is_incremental_marking(objspace)) { - if (RVALUE_BLACK_P(objspace, obj)) { - /* reachable objects from black objects should be black or grey objects */ + if (!is_marking(objspace) && RVALUE_OLD_P(objspace, obj)) { + /* reachable objects from an oldgen object should be old or (young with remember) */ data->parent = obj; - rb_objspace_reachable_objects_from(obj, check_color_i, (void *)data); + rb_objspace_reachable_objects_from(obj, check_generation_i, (void *)data); } - } - } - else { - if (BUILTIN_TYPE(obj) == T_ZOMBIE) { - data->zombie_object_count++; - if ((RBASIC(obj)->flags & ~ZOMBIE_OBJ_KEPT_FLAGS) != T_ZOMBIE) { - fprintf(stderr, "verify_internal_consistency_i: T_ZOMBIE has extra flags set: %s\n", - rb_obj_info(obj)); - data->err_count++; + if (is_incremental_marking(objspace)) { + if (RVALUE_BLACK_P(objspace, obj)) { + /* reachable objects from black objects should be black or grey objects */ + data->parent = obj; + rb_objspace_reachable_objects_from(obj, check_color_i, (void *)data); + } } + } + else { + if (BUILTIN_TYPE(obj) == T_ZOMBIE) { + data->zombie_object_count++; - if (!!FL_TEST(obj, FL_FINALIZE) != !!st_is_member(finalizer_table, obj)) { - fprintf(stderr, "verify_internal_consistency_i: FL_FINALIZE %s but %s finalizer_table: %s\n", - FL_TEST(obj, FL_FINALIZE) ? "set" : "not set", st_is_member(finalizer_table, obj) ? "in" : "not in", - rb_obj_info(obj)); - data->err_count++; + if ((RBASIC(obj)->flags & ~ZOMBIE_OBJ_KEPT_FLAGS) != T_ZOMBIE) { + fprintf(stderr, "verify_internal_consistency_i: T_ZOMBIE has extra flags set: %s\n", + rb_obj_info(obj)); + data->err_count++; + } + + if (!!FL_TEST(obj, FL_FINALIZE) != !!st_is_member(finalizer_table, obj)) { + fprintf(stderr, "verify_internal_consistency_i: FL_FINALIZE %s but %s finalizer_table: %s\n", + FL_TEST(obj, FL_FINALIZE) ? "set" : "not set", st_is_member(finalizer_table, obj) ? "in" : "not in", + rb_obj_info(obj)); + data->err_count++; + } } } } - if (poisoned) { - GC_ASSERT(BUILTIN_TYPE(obj) == T_NONE); - asan_poison_object(obj); - } } return 0; @@ -5154,22 +5125,18 @@ gc_verify_heap_page(rb_objspace_t *objspace, struct heap_page *page, VALUE obj) for (uintptr_t ptr = start; ptr < end; ptr += slot_size) { VALUE val = (VALUE)ptr; - void *poisoned = asan_unpoison_object_temporary(val); - enum ruby_value_type type = BUILTIN_TYPE(val); - - if (type == T_NONE) free_objects++; - if (type == T_ZOMBIE) zombie_objects++; - if (RVALUE_PAGE_UNCOLLECTIBLE(page, val) && RVALUE_PAGE_WB_UNPROTECTED(page, val)) { - has_remembered_shady = TRUE; - } - if (RVALUE_PAGE_MARKING(page, val)) { - has_remembered_old = TRUE; - remembered_old_objects++; - } + asan_unpoisoning_object(val) { + enum ruby_value_type type = BUILTIN_TYPE(val); - if (poisoned) { - GC_ASSERT(BUILTIN_TYPE(val) == T_NONE); - asan_poison_object(val); + if (type == T_NONE) free_objects++; + if (type == T_ZOMBIE) zombie_objects++; + if (RVALUE_PAGE_UNCOLLECTIBLE(page, val) && RVALUE_PAGE_WB_UNPROTECTED(page, val)) { + has_remembered_shady = TRUE; + } + if (RVALUE_PAGE_MARKING(page, val)) { + has_remembered_old = TRUE; + remembered_old_objects++; + } } } @@ -7174,32 +7141,28 @@ gc_ref_update(void *vstart, void *vend, size_t stride, rb_objspace_t *objspace, /* For each object on the page */ for (; v != (VALUE)vend; v += stride) { - void *poisoned = asan_unpoison_object_temporary(v); - - switch (BUILTIN_TYPE(v)) { - case T_NONE: - case T_MOVED: - case T_ZOMBIE: - break; - default: - if (RVALUE_WB_UNPROTECTED(objspace, v)) { - page->flags.has_uncollectible_wb_unprotected_objects = TRUE; - } - if (RVALUE_REMEMBERED(objspace, v)) { - page->flags.has_remembered_objects = TRUE; - } - if (page->flags.before_sweep) { - if (RVALUE_MARKED(objspace, v)) { + asan_unpoisoning_object(v) { + switch (BUILTIN_TYPE(v)) { + case T_NONE: + case T_MOVED: + case T_ZOMBIE: + break; + default: + if (RVALUE_WB_UNPROTECTED(objspace, v)) { + page->flags.has_uncollectible_wb_unprotected_objects = TRUE; + } + if (RVALUE_REMEMBERED(objspace, v)) { + page->flags.has_remembered_objects = TRUE; + } + if (page->flags.before_sweep) { + if (RVALUE_MARKED(objspace, v)) { + rb_gc_update_object_references(objspace, v); + } + } + else { rb_gc_update_object_references(objspace, v); } } - else { - rb_gc_update_object_references(objspace, v); - } - } - - if (poisoned) { - asan_poison_object(v); } } @@ -7271,22 +7234,17 @@ heap_check_moved_i(void *vstart, void *vend, size_t stride, void *data) /* Moved object still on the heap, something may have a reference. */ } else { - void *poisoned = asan_unpoison_object_temporary(v); - - switch (BUILTIN_TYPE(v)) { - case T_NONE: - case T_ZOMBIE: - break; - default: - if (!rb_gc_impl_garbage_object_p(objspace, v)) { - rb_objspace_reachable_objects_from(v, reachable_object_check_moved_i, (void *)v); + asan_unpoisoning_object(v) { + switch (BUILTIN_TYPE(v)) { + case T_NONE: + case T_ZOMBIE: + break; + default: + if (!rb_gc_impl_garbage_object_p(objspace, v)) { + rb_objspace_reachable_objects_from(v, reachable_object_check_moved_i, (void *)v); + } } } - - if (poisoned) { - GC_ASSERT(BUILTIN_TYPE(v) == T_NONE); - asan_poison_object(v); - } } } @@ -7307,20 +7265,15 @@ desired_compaction_pages_i(struct heap_page *page, void *data) VALUE vstart = (VALUE)page->start; VALUE vend = vstart + (VALUE)(page->total_slots * page->size_pool->slot_size); - for (VALUE v = vstart; v != vend; v += page->size_pool->slot_size) { - /* skip T_NONEs; they won't be moved */ - void *poisoned = asan_unpoison_object_temporary(v); - if (BUILTIN_TYPE(v) == T_NONE) { - if (poisoned) { - asan_poison_object(v); + asan_unpoisoning_object(v) { + /* skip T_NONEs; they won't be moved */ + if (BUILTIN_TYPE(v) != T_NONE) { + rb_size_pool_t *dest_pool = gc_compact_destination_pool(objspace, page->size_pool, v); + size_t dest_pool_idx = dest_pool - size_pools; + tdata->required_slots[dest_pool_idx]++; } - continue; } - - rb_size_pool_t *dest_pool = gc_compact_destination_pool(objspace, page->size_pool, v); - size_t dest_pool_idx = dest_pool - size_pools; - tdata->required_slots[dest_pool_idx]++; } return 0; From 46ba3752c2c9dbf631cae602c3549e8b95a0de72 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Fri, 13 Sep 2024 14:04:12 -0400 Subject: [PATCH 302/829] Don't return inside of asan_unpoisoning_object --- gc/default.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/gc/default.c b/gc/default.c index 38334d5edc776e..cbc6ba53975b9c 100644 --- a/gc/default.c +++ b/gc/default.c @@ -1597,17 +1597,21 @@ rb_gc_impl_garbage_object_p(void *objspace_ptr, VALUE ptr) { rb_objspace_t *objspace = objspace_ptr; + bool dead = false; + asan_unpoisoning_object(ptr) { switch (BUILTIN_TYPE(ptr)) { case T_NONE: case T_MOVED: case T_ZOMBIE: - return true; + dead = true; + break; default: break; } } + if (dead) return true; return is_lazy_sweeping(objspace) && GET_HEAP_PAGE(ptr)->flags.before_sweep && !RVALUE_MARKED(objspace, ptr); } From 50564f8882922964ebbe2bfdd7cae0bd6d0f6f00 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Fri, 13 Sep 2024 14:36:50 -0400 Subject: [PATCH 303/829] ASAN unpoison whole heap page after adding to size pool --- gc/default.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gc/default.c b/gc/default.c index cbc6ba53975b9c..5a015d2685bd34 100644 --- a/gc/default.c +++ b/gc/default.c @@ -2052,6 +2052,7 @@ size_pool_add_page(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t asan_unlock_freelist(page); page->freelist = NULL; + asan_unpoison_memory_region(page->body, HEAP_PAGE_SIZE, false); for (VALUE p = (VALUE)start; p < start + (slot_count * size_pool->slot_size); p += size_pool->slot_size) { heap_page_add_freeobj(objspace, page, p); } @@ -3969,6 +3970,8 @@ gc_sweep_step(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *hea sweep_page->freelist = NULL; asan_lock_freelist(sweep_page); + asan_poison_memory_region(sweep_page->body, HEAP_PAGE_SIZE); + objspace->empty_pages_count++; sweep_page->free_next = objspace->empty_pages; objspace->empty_pages = sweep_page; From 1e52dde82af10f2a2ec648b34dce30bec4154245 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Mon, 16 Sep 2024 11:14:31 -0400 Subject: [PATCH 304/829] [PRISM] Match defined behavior for explicit block Fixes [Bug #20748] --- prism_compile.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/prism_compile.c b/prism_compile.c index b1f9b00bf624db..9ea89d64e19dc0 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -3889,6 +3889,12 @@ pm_compile_defined_expr0(rb_iseq_t *iseq, const pm_node_t *node, const pm_node_l } case PM_CALL_NODE: { const pm_call_node_t *cast = ((const pm_call_node_t *) node); + + if (cast->block != NULL && PM_NODE_TYPE_P(cast->block, PM_BLOCK_NODE)) { + dtype = DEFINED_EXPR; + break; + } + ID method_id = pm_constant_id_lookup(scope_node, cast->name); if (cast->receiver || cast->arguments) { From 4e17fa2906c51d6f5e70023c7b300b61ae378b13 Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Mon, 16 Sep 2024 07:21:21 -0500 Subject: [PATCH 305/829] Tweaks or Array#select --- array.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/array.c b/array.c index fcfe01ab87ff84..27b6f8fc716be7 100644 --- a/array.c +++ b/array.c @@ -3853,22 +3853,22 @@ rb_ary_values_at(int argc, VALUE *argv, VALUE ary) /* * call-seq: - * array.select {|element| ... } -> new_array - * array.select -> new_enumerator + * select {|element| ... } -> new_array + * select -> new_enumerator + * filter {|element| ... } -> new_array + * filter -> new_enumerator * - * Calls the block, if given, with each element of +self+; - * returns a new +Array+ containing those elements of +self+ + * With a block given, calls the block with each element of +self+; + * returns a new array containing those elements of +self+ * for which the block returns a truthy value: * * a = [:foo, 'bar', 2, :bam] - * a1 = a.select {|element| element.to_s.start_with?('b') } - * a1 # => ["bar", :bam] - * - * Returns a new Enumerator if no block given: + * a.select {|element| element.to_s.start_with?('b') } + * # => ["bar", :bam] * - * a = [:foo, 'bar', 2, :bam] - * a.select # => # + * With no block given, returns a new Enumerator. * + * Related: see {Methods for Fetching}[rdoc-ref:Array@Methods+for+Fetching]. */ static VALUE From 1c3981cb88f13a40576ddf73fc8525a277af512c Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Mon, 16 Sep 2024 07:30:44 -0500 Subject: [PATCH 306/829] [DOC] Tweaks for Array#select! --- array.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/array.c b/array.c index 27b6f8fc716be7..92481c70bb81a6 100644 --- a/array.c +++ b/array.c @@ -3934,10 +3934,12 @@ select_bang_ensure(VALUE a) /* * call-seq: - * array.select! {|element| ... } -> self or nil - * array.select! -> new_enumerator + * select! {|element| ... } -> self or nil + * select! -> new_enumerator + * filter! {|element| ... } -> self or nil + * filter! -> new_enumerator * - * Calls the block, if given with each element of +self+; + * With a block given, calls the block with each element of +self+; * removes from +self+ those elements for which the block returns +false+ or +nil+. * * Returns +self+ if any elements were removed: @@ -3947,11 +3949,9 @@ select_bang_ensure(VALUE a) * * Returns +nil+ if no elements were removed. * - * Returns a new Enumerator if no block given: - * - * a = [:foo, 'bar', 2, :bam] - * a.select! # => # + * With no block given, returns a new Enumerator. * + * Related: see {Methods for Deleting}[rdoc-ref:Array@Methods+for+Deleting]. */ static VALUE From 6c4ce72609396cff8970c0fdebbfa190ec75ece1 Mon Sep 17 00:00:00 2001 From: tomoya ishida Date: Tue, 17 Sep 2024 02:36:21 +0900 Subject: [PATCH 307/829] [ruby/irb] Use InstructionSequence#script_lines to get method source (https://github.com/ruby/irb/pull/1005) It works with both prism and parse.y https://github.com/ruby/irb/commit/bcfaa72d5a --- lib/irb/source_finder.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/irb/source_finder.rb b/lib/irb/source_finder.rb index 5d7d729d19a593..c515da5702f902 100644 --- a/lib/irb/source_finder.rb +++ b/lib/irb/source_finder.rb @@ -100,7 +100,7 @@ def find_source(signature, super_level = 0) Source.new(file, line) elsif method # Method defined with eval, probably in IRB session - source = RubyVM::AbstractSyntaxTree.of(method)&.source rescue nil + source = RubyVM::InstructionSequence.of(method)&.script_lines&.join rescue nil Source.new(file, line, source) end rescue EvaluationError From 2beb4c6e878dd519b82a96e10838e5da69e942f5 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Mon, 16 Sep 2024 11:03:38 -0400 Subject: [PATCH 308/829] [PRISM] Assume an eval context for RubyVM::ISEQ compile Fixes [Bug #20741] --- iseq.c | 1 + prism_compile.c | 10 +++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/iseq.c b/iseq.c index 60fb9080f023ef..2c02043d552ad7 100644 --- a/iseq.c +++ b/iseq.c @@ -1280,6 +1280,7 @@ pm_iseq_compile_with_option(VALUE src, VALUE file, VALUE realpath, VALUE line, V pm_parse_result_t result = { 0 }; pm_options_line_set(&result.options, NUM2INT(line)); + pm_options_scopes_init(&result.options, 1); result.node.coverage_enabled = 1; switch (option.frozen_string_literal) { diff --git a/prism_compile.c b/prism_compile.c index 9ea89d64e19dc0..03aff092599dbd 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -6705,6 +6705,14 @@ pm_compile_scope_node(rb_iseq_t *iseq, pm_scope_node_t *scope_node, const pm_nod } switch (body->type) { + case ISEQ_TYPE_PLAIN: { + RUBY_ASSERT(PM_NODE_TYPE_P(scope_node->ast_node, PM_INTERPOLATED_REGULAR_EXPRESSION_NODE)); + + const pm_interpolated_regular_expression_node_t *cast = (const pm_interpolated_regular_expression_node_t *) scope_node->ast_node; + pm_compile_regexp_dynamic(iseq, (const pm_node_t *) cast, &cast->parts, &location, ret, popped, scope_node); + + break; + } case ISEQ_TYPE_BLOCK: { LABEL *start = ISEQ_COMPILE_DATA(iseq)->start_label = NEW_LABEL(0); LABEL *end = ISEQ_COMPILE_DATA(iseq)->end_label = NEW_LABEL(0); @@ -8474,7 +8482,7 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, pm_scope_node_t next_scope_node; pm_scope_node_init(node, &next_scope_node, scope_node); - block_iseq = NEW_CHILD_ISEQ(&next_scope_node, make_name_for_block(iseq), ISEQ_TYPE_BLOCK, location.line); + block_iseq = NEW_CHILD_ISEQ(&next_scope_node, make_name_for_block(iseq), ISEQ_TYPE_PLAIN, location.line); pm_scope_node_destroy(&next_scope_node); ISEQ_COMPILE_DATA(iseq)->current_block = block_iseq; From 1e53e46275e2f49a711ff90adddc804d11a347b1 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Mon, 16 Sep 2024 12:29:24 -0400 Subject: [PATCH 309/829] Don't export unnecessary string functions These functions are not used publicly, so we don't need to export them. --- internal/string.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/internal/string.h b/internal/string.h index 3533766ffb7b5c..10879bd1d98b48 100644 --- a/internal/string.h +++ b/internal/string.h @@ -51,6 +51,12 @@ int rb_enc_str_coderange_scan(VALUE str, rb_encoding *enc); int rb_ascii8bit_appendable_encoding_index(rb_encoding *enc, unsigned int code); VALUE rb_str_include(VALUE str, VALUE arg); VALUE rb_str_byte_substr(VALUE str, VALUE beg, VALUE len); +VALUE rb_str_tmp_frozen_no_embed_acquire(VALUE str); +void rb_str_make_embedded(VALUE); +VALUE rb_str_upto_each(VALUE, VALUE, int, int (*each)(VALUE, VALUE), VALUE); +size_t rb_str_size_as_embedded(VALUE); +bool rb_str_reembeddable_p(VALUE); +VALUE rb_str_upto_endless_each(VALUE, int (*each)(VALUE, VALUE), VALUE); static inline bool STR_EMBED_P(VALUE str); static inline bool STR_SHARED_P(VALUE str); @@ -63,14 +69,8 @@ static inline VALUE rb_str_eql_internal(const VALUE str1, const VALUE str2); RUBY_SYMBOL_EXPORT_BEGIN /* string.c (export) */ VALUE rb_str_tmp_frozen_acquire(VALUE str); -VALUE rb_str_tmp_frozen_no_embed_acquire(VALUE str); void rb_str_tmp_frozen_release(VALUE str, VALUE tmp); VALUE rb_setup_fake_str(struct RString *fake_str, const char *name, long len, rb_encoding *enc); -VALUE rb_str_upto_each(VALUE, VALUE, int, int (*each)(VALUE, VALUE), VALUE); -VALUE rb_str_upto_endless_each(VALUE, int (*each)(VALUE, VALUE), VALUE); -void rb_str_make_embedded(VALUE); -size_t rb_str_size_as_embedded(VALUE); -bool rb_str_reembeddable_p(VALUE); RUBY_SYMBOL_EXPORT_END VALUE rb_fstring_new(const char *ptr, long len); From 2ea1950510003dbce5a761a712039ed69fa499f2 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Mon, 16 Sep 2024 14:40:19 -0400 Subject: [PATCH 310/829] [ruby/prism] Do not leak explicit encoding Fixes [Bug #20744] https://github.com/ruby/prism/commit/f1b8b1b2a2 --- lib/prism/translation/ruby_parser.rb | 8 +++- prism/prism.c | 1 + test/prism/fixtures/regex_escape_encoding.txt | 3 ++ test/prism/locals_test.rb | 4 ++ .../prism/snapshots/regex_escape_encoding.txt | 43 +++++++++++++++++++ test/prism/test_helper.rb | 2 +- 6 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 test/prism/fixtures/regex_escape_encoding.txt create mode 100644 test/prism/snapshots/regex_escape_encoding.txt diff --git a/lib/prism/translation/ruby_parser.rb b/lib/prism/translation/ruby_parser.rb index 9cd39075ecbf3c..4ccff0b600ec81 100644 --- a/lib/prism/translation/ruby_parser.rb +++ b/lib/prism/translation/ruby_parser.rb @@ -1428,7 +1428,13 @@ def visit_statements_node(node) # "foo" # ^^^^^ def visit_string_node(node) - s(node, :str, node.unescaped) + unescaped = node.unescaped + + if node.forced_binary_encoding? + unescaped.force_encoding(Encoding::BINARY) + end + + s(node, :str, unescaped) end # super(foo) diff --git a/prism/prism.c b/prism/prism.c index 6d4d2f819906ee..abbeb1fd3670b4 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -168,6 +168,7 @@ lex_mode_push_regexp(pm_parser_t *parser, uint8_t incrementor, uint8_t terminato breakpoints[index++] = incrementor; } + parser->explicit_encoding = NULL; return lex_mode_push(parser, lex_mode); } diff --git a/test/prism/fixtures/regex_escape_encoding.txt b/test/prism/fixtures/regex_escape_encoding.txt new file mode 100644 index 00000000000000..74e1647d675025 --- /dev/null +++ b/test/prism/fixtures/regex_escape_encoding.txt @@ -0,0 +1,3 @@ +# encoding: US-ASCII +str = "hello \xFC" +str =~ /hello \u{fc}/ diff --git a/test/prism/locals_test.rb b/test/prism/locals_test.rb index ea61fd94996ec3..2c0036289cdabf 100644 --- a/test/prism/locals_test.rb +++ b/test/prism/locals_test.rb @@ -9,6 +9,10 @@ # to test on the most recent versions. return if !defined?(RubyVM::InstructionSequence) || RUBY_VERSION < "3.4.0" +# If we're on Ruby 3.4.0 and the default parser is Prism, then there is no point +# in comparing the locals because they will be the same. +return if RubyVM::InstructionSequence.compile("").to_a[4][:parser] == :prism + # In Ruby 3.4.0, the local table for method forwarding changed. But 3.4.0 can # refer to the dev version, so while 3.4.0 still isn't released, we need to # check if we have a high enough revision. diff --git a/test/prism/snapshots/regex_escape_encoding.txt b/test/prism/snapshots/regex_escape_encoding.txt new file mode 100644 index 00000000000000..0f2dcc2c54e07c --- /dev/null +++ b/test/prism/snapshots/regex_escape_encoding.txt @@ -0,0 +1,43 @@ +@ ProgramNode (location: (2,0)-(3,21)) +├── flags: ∅ +├── locals: [:str] +└── statements: + @ StatementsNode (location: (2,0)-(3,21)) + ├── flags: ∅ + └── body: (length: 2) + ├── @ LocalVariableWriteNode (location: (2,0)-(2,18)) + │ ├── flags: newline + │ ├── name: :str + │ ├── depth: 0 + │ ├── name_loc: (2,0)-(2,3) = "str" + │ ├── value: + │ │ @ StringNode (location: (2,6)-(2,18)) + │ │ ├── flags: forced_binary_encoding + │ │ ├── opening_loc: (2,6)-(2,7) = "\"" + │ │ ├── content_loc: (2,7)-(2,17) = "hello \\xFC" + │ │ ├── closing_loc: (2,17)-(2,18) = "\"" + │ │ └── unescaped: "hello \xFC" + │ └── operator_loc: (2,4)-(2,5) = "=" + └── @ CallNode (location: (3,0)-(3,21)) + ├── flags: newline + ├── receiver: + │ @ LocalVariableReadNode (location: (3,0)-(3,3)) + │ ├── flags: ∅ + │ ├── name: :str + │ └── depth: 0 + ├── call_operator_loc: ∅ + ├── name: :=~ + ├── message_loc: (3,4)-(3,6) = "=~" + ├── opening_loc: ∅ + ├── arguments: + │ @ ArgumentsNode (location: (3,7)-(3,21)) + │ ├── flags: ∅ + │ └── arguments: (length: 1) + │ └── @ RegularExpressionNode (location: (3,7)-(3,21)) + │ ├── flags: static_literal, forced_utf8_encoding + │ ├── opening_loc: (3,7)-(3,8) = "/" + │ ├── content_loc: (3,8)-(3,20) = "hello \\u{fc}" + │ ├── closing_loc: (3,20)-(3,21) = "/" + │ └── unescaped: "hello \\u{fc}" + ├── closing_loc: ∅ + └── block: ∅ diff --git a/test/prism/test_helper.rb b/test/prism/test_helper.rb index d6d0abf5482702..b8485002831356 100644 --- a/test/prism/test_helper.rb +++ b/test/prism/test_helper.rb @@ -209,7 +209,7 @@ def self.each_encoding private - if RUBY_ENGINE == "ruby" + if RUBY_ENGINE == "ruby" && RubyVM::InstructionSequence.compile("").to_a[4][:parser] != :prism # Check that the given source is valid syntax by compiling it with RubyVM. def check_syntax(source) ignore_warnings { RubyVM::InstructionSequence.compile(source) } From 7e2ae30f8b30f9f9f7250abffc1c311115548bba Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Mon, 16 Sep 2024 15:27:26 -0400 Subject: [PATCH 311/829] [ruby/prism] Handle retry doubly nested under rescue Fixes [Bug #20747] https://github.com/ruby/prism/commit/d3194715a9 --- prism/prism.c | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/prism/prism.c b/prism/prism.c index abbeb1fd3670b4..24ddd8b94606d3 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -17620,7 +17620,12 @@ pm_parser_err_prefix(pm_parser_t *parser, pm_diagnostic_id_t diag_id) { */ static void parse_retry(pm_parser_t *parser, const pm_node_t *node) { +#define CONTEXT_NONE 0 +#define CONTEXT_THROUGH_ENSURE 1 +#define CONTEXT_THROUGH_ELSE 2 + pm_context_node_t *context_node = parser->current_context; + int context = CONTEXT_NONE; while (context_node != NULL) { switch (context_node->context) { @@ -17644,7 +17649,13 @@ parse_retry(pm_parser_t *parser, const pm_node_t *node) { case PM_CONTEXT_SCLASS: // These are the bad cases. We're not allowed to have a retry in // these contexts. - pm_parser_err_node(parser, node, PM_ERR_INVALID_RETRY_WITHOUT_RESCUE); + if (context == CONTEXT_NONE) { + pm_parser_err_node(parser, node, PM_ERR_INVALID_RETRY_WITHOUT_RESCUE); + } else if (context == CONTEXT_THROUGH_ENSURE) { + pm_parser_err_node(parser, node, PM_ERR_INVALID_RETRY_AFTER_ENSURE); + } else if (context == CONTEXT_THROUGH_ELSE) { + pm_parser_err_node(parser, node, PM_ERR_INVALID_RETRY_AFTER_ELSE); + } return; case PM_CONTEXT_BEGIN_ELSE: case PM_CONTEXT_BLOCK_ELSE: @@ -17655,8 +17666,8 @@ parse_retry(pm_parser_t *parser, const pm_node_t *node) { case PM_CONTEXT_SCLASS_ELSE: // These are also bad cases, but with a more specific error // message indicating the else. - pm_parser_err_node(parser, node, PM_ERR_INVALID_RETRY_AFTER_ELSE); - return; + context = CONTEXT_THROUGH_ELSE; + break; case PM_CONTEXT_BEGIN_ENSURE: case PM_CONTEXT_BLOCK_ENSURE: case PM_CONTEXT_CLASS_ENSURE: @@ -17666,8 +17677,8 @@ parse_retry(pm_parser_t *parser, const pm_node_t *node) { case PM_CONTEXT_SCLASS_ENSURE: // These are also bad cases, but with a more specific error // message indicating the ensure. - pm_parser_err_node(parser, node, PM_ERR_INVALID_RETRY_AFTER_ENSURE); - return; + context = CONTEXT_THROUGH_ENSURE; + break; case PM_CONTEXT_NONE: // This case should never happen. assert(false && "unreachable"); @@ -17701,6 +17712,10 @@ parse_retry(pm_parser_t *parser, const pm_node_t *node) { context_node = context_node->prev; } + +#undef CONTEXT_NONE +#undef CONTEXT_ENSURE +#undef CONTEXT_ELSE } /** From 50d4840bd975a5e187c56dc4a56795cb6d02d658 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Thu, 12 Sep 2024 11:31:57 -0400 Subject: [PATCH 312/829] Move desired_compaction_pages_i inside of GC_CAN_COMPILE_COMPACTION Fixes the following warning on WebAssembly: gc/default.c:7306:1: warning: unused function 'desired_compaction_pages_i' [-Wunused-function] desired_compaction_pages_i(struct heap_page *page, void *data) --- gc/default.c | 55 ++++++++++++++++++++++++++-------------------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/gc/default.c b/gc/default.c index 5a015d2685bd34..0c66dca8b47b49 100644 --- a/gc/default.c +++ b/gc/default.c @@ -7259,33 +7259,6 @@ heap_check_moved_i(void *vstart, void *vend, size_t stride, void *data) } #endif -struct desired_compaction_pages_i_data { - rb_objspace_t *objspace; - size_t required_slots[SIZE_POOL_COUNT]; -}; - -static int -desired_compaction_pages_i(struct heap_page *page, void *data) -{ - struct desired_compaction_pages_i_data *tdata = data; - rb_objspace_t *objspace = tdata->objspace; - VALUE vstart = (VALUE)page->start; - VALUE vend = vstart + (VALUE)(page->total_slots * page->size_pool->slot_size); - - for (VALUE v = vstart; v != vend; v += page->size_pool->slot_size) { - asan_unpoisoning_object(v) { - /* skip T_NONEs; they won't be moved */ - if (BUILTIN_TYPE(v) != T_NONE) { - rb_size_pool_t *dest_pool = gc_compact_destination_pool(objspace, page->size_pool, v); - size_t dest_pool_idx = dest_pool - size_pools; - tdata->required_slots[dest_pool_idx]++; - } - } - } - - return 0; -} - bool rb_gc_impl_during_gc_p(void *objspace_ptr) { @@ -9166,6 +9139,34 @@ gc_compact(VALUE self) #endif #if GC_CAN_COMPILE_COMPACTION +struct desired_compaction_pages_i_data { + rb_objspace_t *objspace; + size_t required_slots[SIZE_POOL_COUNT]; +}; + +static int +desired_compaction_pages_i(struct heap_page *page, void *data) +{ + struct desired_compaction_pages_i_data *tdata = data; + rb_objspace_t *objspace = tdata->objspace; + VALUE vstart = (VALUE)page->start; + VALUE vend = vstart + (VALUE)(page->total_slots * page->size_pool->slot_size); + + + for (VALUE v = vstart; v != vend; v += page->size_pool->slot_size) { + asan_unpoisoning_object(v) { + /* skip T_NONEs; they won't be moved */ + if (BUILTIN_TYPE(v) != T_NONE) { + rb_size_pool_t *dest_pool = gc_compact_destination_pool(objspace, page->size_pool, v); + size_t dest_pool_idx = dest_pool - size_pools; + tdata->required_slots[dest_pool_idx]++; + } + } + } + + return 0; +} + /* call-seq: * GC.verify_compaction_references(toward: nil, double_heap: false) -> hash * From e08d5239b68ad61a731f4938cf963e37a5e88c25 Mon Sep 17 00:00:00 2001 From: KJ Tsanaktsidis Date: Fri, 13 Sep 2024 17:40:30 +1000 Subject: [PATCH 313/829] Ensure fiber scheduler is woken up when close interrupts read If one thread is reading and another closes that socket, the close blocks waiting for the read to abort cleanly. This ensures that Ruby is totally done with the file descriptor _BEFORE_ we tell the OS to close and potentially re-use it. When the read is correctly terminated, the close should be unblocked. That currently works if closing is happening on a thread, but if it's happening on a fiber with a fiber scheduler, it does NOT work. This patch ensures that if the close happened in a fiber scheduled thread, that the scheduler is notified that the fiber is unblocked. [Bug #20723] --- internal/thread.h | 1 + test/fiber/test_io.rb | 43 +++++++++++++++++++++++++++++++++++++++++++ thread.c | 8 +++++++- 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/internal/thread.h b/internal/thread.h index a2926febc3c20b..e079ebb22b1783 100644 --- a/internal/thread.h +++ b/internal/thread.h @@ -60,6 +60,7 @@ int rb_thread_wait_for_single_fd(int fd, int events, struct timeval * timeout); struct rb_io_close_wait_list { struct ccan_list_head pending_fd_users; VALUE closing_thread; + VALUE closing_fiber; VALUE wakeup_mutex; }; int rb_notify_fd_close(int fd, struct rb_io_close_wait_list *busy); diff --git a/test/fiber/test_io.rb b/test/fiber/test_io.rb index 0e3e086d5aee52..7973399acbb719 100644 --- a/test/fiber/test_io.rb +++ b/test/fiber/test_io.rb @@ -234,4 +234,47 @@ def test_backquote assert_equal "ok\n", result end + + # Tests for https://bugs.ruby-lang.org/issues/20723 which would + # otherwise deadlock this test. + def test_close_while_reading_on_thread + # Windows has UNIXSocket, but only with VS 2019+ + omit "UNIXSocket is not defined!" unless defined?(UNIXSocket) + + i, o = Socket.pair(:UNIX, :STREAM) + if RUBY_PLATFORM=~/mswin|mingw/ + i.nonblock = true + o.nonblock = true + end + + message = nil + + reading_thread = Thread.new do + Thread.current.report_on_exception = false + i.wait_readable + end + + fs_thread = Thread.new do + # Wait until the reading thread is blocked on read: + Thread.pass until reading_thread.status == "sleep" + + scheduler = Scheduler.new + Fiber.set_scheduler scheduler + Fiber.schedule do + i.close + end + end + + assert_raise(IOError) { reading_thread.join } + refute_nil fs_thread.join(5), "expected thread to terminate within 5 seconds" + + assert_predicate(i, :closed?) + ensure + fs_thread&.kill + fs_thread&.join rescue nil + reading_thread&.kill + reading_thread&.join rescue nil + i&.close + o&.close + end end diff --git a/thread.c b/thread.c index 5a792007859096..2a937ca278fbd0 100644 --- a/thread.c +++ b/thread.c @@ -1698,7 +1698,12 @@ thread_io_wake_pending_closer(struct waiting_fd *wfd) RB_VM_LOCK_LEAVE(); if (has_waiter) { - rb_thread_wakeup(wfd->busy->closing_thread); + rb_thread_t *th = rb_thread_ptr(wfd->busy->closing_thread); + if (th->scheduler != Qnil) { + rb_fiber_scheduler_unblock(th->scheduler, wfd->busy->closing_thread, wfd->busy->closing_fiber); + } else { + rb_thread_wakeup(wfd->busy->closing_thread); + } rb_mutex_unlock(wfd->busy->wakeup_mutex); } } @@ -2625,6 +2630,7 @@ rb_notify_fd_close(int fd, struct rb_io_close_wait_list *busy) has_any = !ccan_list_empty(&busy->pending_fd_users); busy->closing_thread = rb_thread_current(); + busy->closing_fiber = rb_fiber_current(); wakeup_mutex = Qnil; if (has_any) { wakeup_mutex = rb_mutex_new(); From 76d927f88f9b64cf01912be41d5e88238a9e6ec6 Mon Sep 17 00:00:00 2001 From: Yusuke Endoh Date: Sun, 15 Sep 2024 09:50:14 +0900 Subject: [PATCH 314/829] Prevent prism warnings in syntax exhaustive tests [Bug #20736] --- test/ruby/test_literal.rb | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/test/ruby/test_literal.rb b/test/ruby/test_literal.rb index 9b294bc8eab7b5..1fdc6aa853a85e 100644 --- a/test/ruby/test_literal.rb +++ b/test/ruby/test_literal.rb @@ -39,6 +39,8 @@ def test_self end def test_string + verbose_bak, $VERBOSE = $VERBOSE, nil # prevent syntax warnings + assert_instance_of String, ?a assert_equal "a", ?a assert_instance_of String, ?A @@ -94,6 +96,9 @@ def test_string assert_equal "ab", eval("?a 'b'") assert_equal "a\nb", eval("< Date: Tue, 17 Sep 2024 12:36:19 +0900 Subject: [PATCH 315/829] Activate irb if irb is bundled gems --- prelude.rb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/prelude.rb b/prelude.rb index 2f67f528e927bd..55b42f06c4f54d 100644 --- a/prelude.rb +++ b/prelude.rb @@ -1,8 +1,12 @@ class Binding # :nodoc: def irb - force_activate 'irb' - require 'irb' + begin + require 'irb' + rescue LoadError, Gem::LoadError + force_activate 'irb' + retry + end irb end @@ -10,8 +14,6 @@ def irb alias irb irb # :nodoc: private def force_activate(gem) - return if !defined?(Bundler) || Gem.loaded_specs.key?(gem) - Bundler.reset! builder = Bundler::Dsl.new From bb2d24731e72ebb029396f1fa17201da0bce3901 Mon Sep 17 00:00:00 2001 From: Nikolay Ponomarev Date: Sun, 15 Sep 2024 23:07:17 +0300 Subject: [PATCH 316/829] [DOC] Fix autoload method formatting --- load.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/load.c b/load.c index 2c6a94b84268a0..c6fb43e9e860d5 100644 --- a/load.c +++ b/load.c @@ -1451,9 +1451,9 @@ ruby_init_ext(const char *name, void (*init)(void)) * A.autoload(:B, "b") * A::B.doit # autoloads "b" * - * If _const_ in _mod_ is defined as autoload, the file name to be - * loaded is replaced with _filename_. If _const_ is defined but not - * as autoload, does nothing. + * If _const_ in _mod_ is defined as autoload, the file name to be + * loaded is replaced with _filename_. If _const_ is defined but not + * as autoload, does nothing. */ static VALUE @@ -1515,9 +1515,9 @@ rb_mod_autoload_p(int argc, VALUE *argv, VALUE mod) * * autoload(:MyModule, "/usr/local/lib/modules/my_module.rb") * - * If _const_ is defined as autoload, the file name to be loaded is - * replaced with _filename_. If _const_ is defined but not as - * autoload, does nothing. + * If _const_ is defined as autoload, the file name to be loaded is + * replaced with _filename_. If _const_ is defined but not as + * autoload, does nothing. */ static VALUE From 4ca588eede6480bee02ed8d3440c95755743c6a4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2024 02:55:25 +0000 Subject: [PATCH 317/829] Bump github/codeql-action from 3.26.6 to 3.26.7 Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.26.6 to 3.26.7. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/4dd16135b69a43b6c8efb853346f8437d92d3c93...8214744c546c1e5c8f03dde8fab3a7353211988d) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/codeql-analysis.yml | 8 ++++---- .github/workflows/scorecards.yml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 8346f056f46fdd..b861db612c16eb 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -77,15 +77,15 @@ jobs: run: sudo rm /usr/lib/ruby/vendor_ruby/rubygems/defaults/operating_system.rb - name: Initialize CodeQL - uses: github/codeql-action/init@4dd16135b69a43b6c8efb853346f8437d92d3c93 # v3.26.6 + uses: github/codeql-action/init@8214744c546c1e5c8f03dde8fab3a7353211988d # v3.26.7 with: languages: ${{ matrix.language }} - name: Autobuild - uses: github/codeql-action/autobuild@4dd16135b69a43b6c8efb853346f8437d92d3c93 # v3.26.6 + uses: github/codeql-action/autobuild@8214744c546c1e5c8f03dde8fab3a7353211988d # v3.26.7 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@4dd16135b69a43b6c8efb853346f8437d92d3c93 # v3.26.6 + uses: github/codeql-action/analyze@8214744c546c1e5c8f03dde8fab3a7353211988d # v3.26.7 with: category: '/language:${{ matrix.language }}' upload: False @@ -115,7 +115,7 @@ jobs: continue-on-error: true - name: Upload SARIF - uses: github/codeql-action/upload-sarif@4dd16135b69a43b6c8efb853346f8437d92d3c93 # v3.26.6 + uses: github/codeql-action/upload-sarif@8214744c546c1e5c8f03dde8fab3a7353211988d # v3.26.7 with: sarif_file: sarif-results/${{ matrix.language }}.sarif continue-on-error: true diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml index 5641c4d3d49b39..912a4992fa1e74 100644 --- a/.github/workflows/scorecards.yml +++ b/.github/workflows/scorecards.yml @@ -67,6 +67,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: 'Upload to code-scanning' - uses: github/codeql-action/upload-sarif@4dd16135b69a43b6c8efb853346f8437d92d3c93 # v3.26.6 + uses: github/codeql-action/upload-sarif@8214744c546c1e5c8f03dde8fab3a7353211988d # v3.26.7 with: sarif_file: results.sarif From d84b062b635d49ad069b95c3d905f3ea92445894 Mon Sep 17 00:00:00 2001 From: Yusuke Endoh Date: Tue, 17 Sep 2024 13:56:04 +0900 Subject: [PATCH 318/829] Prevent warning: assigned but unused variable - message --- test/fiber/test_io.rb | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/fiber/test_io.rb b/test/fiber/test_io.rb index 7973399acbb719..4891c607f7224d 100644 --- a/test/fiber/test_io.rb +++ b/test/fiber/test_io.rb @@ -247,8 +247,6 @@ def test_close_while_reading_on_thread o.nonblock = true end - message = nil - reading_thread = Thread.new do Thread.current.report_on_exception = false i.wait_readable From d90da9408df5969427c6957797d5a3095f91077b Mon Sep 17 00:00:00 2001 From: Yusuke Endoh Date: Tue, 17 Sep 2024 14:10:49 +0900 Subject: [PATCH 319/829] Prevent warnings for RubyVM::AbstractSyntaxTree.parse in test_ast.rb --- test/ruby/test_ast.rb | 56 +++++++++++++++++++++++++++---------------- 1 file changed, 35 insertions(+), 21 deletions(-) diff --git a/test/ruby/test_ast.rb b/test/ruby/test_ast.rb index 7a6d1b0f172297..79077603e43e83 100644 --- a/test/ruby/test_ast.rb +++ b/test/ruby/test_ast.rb @@ -1298,7 +1298,12 @@ def test_memory_leak end def test_locations - node = RubyVM::AbstractSyntaxTree.parse("1 + 2") + begin + verbose_bak, $VERBOSE = $VERBOSE, false + node = RubyVM::AbstractSyntaxTree.parse("1 + 2") + ensure + $VERBOSE = verbose_bak + end locations = node.locations assert_equal(RubyVM::AbstractSyntaxTree::Location, locations[0].class) @@ -1326,92 +1331,101 @@ def assert_ast_eqaul(src, expected, **options) class TestLocation < Test::Unit::TestCase def test_lineno_and_column - node = RubyVM::AbstractSyntaxTree.parse("1 + 2") + node = ast_parse("1 + 2") assert_locations(node.locations, [[1, 0, 1, 5]]) end def test_alias_locations - node = RubyVM::AbstractSyntaxTree.parse("alias foo bar") + node = ast_parse("alias foo bar") assert_locations(node.children[-1].locations, [[1, 0, 1, 13], [1, 0, 1, 5]]) end def test_and_locations - node = RubyVM::AbstractSyntaxTree.parse("1 and 2") + node = ast_parse("1 and 2") assert_locations(node.children[-1].locations, [[1, 0, 1, 7], [1, 2, 1, 5]]) - node = RubyVM::AbstractSyntaxTree.parse("1 && 2") + node = ast_parse("1 && 2") assert_locations(node.children[-1].locations, [[1, 0, 1, 6], [1, 2, 1, 4]]) end def test_break_locations - node = RubyVM::AbstractSyntaxTree.parse("loop { break 1 }") + node = ast_parse("loop { break 1 }") assert_locations(node.children[-1].children[-1].children[-1].locations, [[1, 7, 1, 14], [1, 7, 1, 12]]) end def test_next_locations - node = RubyVM::AbstractSyntaxTree.parse("loop { next 1 }") + node = ast_parse("loop { next 1 }") assert_locations(node.children[-1].children[-1].children[-1].locations, [[1, 7, 1, 13], [1, 7, 1, 11]]) end def test_or_locations - node = RubyVM::AbstractSyntaxTree.parse("1 or 2") + node = ast_parse("1 or 2") assert_locations(node.children[-1].locations, [[1, 0, 1, 6], [1, 2, 1, 4]]) - node = RubyVM::AbstractSyntaxTree.parse("1 || 2") + node = ast_parse("1 || 2") assert_locations(node.children[-1].locations, [[1, 0, 1, 6], [1, 2, 1, 4]]) end def test_redo_locations - node = RubyVM::AbstractSyntaxTree.parse("loop { redo }") + node = ast_parse("loop { redo }") assert_locations(node.children[-1].children[-1].children[-1].locations, [[1, 7, 1, 11], [1, 7, 1, 11]]) end def test_unless_locations - node = RubyVM::AbstractSyntaxTree.parse("unless cond then 1 else 2 end") + node = ast_parse("unless cond then 1 else 2 end") assert_locations(node.children[-1].locations, [[1, 0, 1, 29], [1, 0, 1, 6], [1, 12, 1, 16], [1, 26, 1, 29]]) - node = RubyVM::AbstractSyntaxTree.parse("1 unless 2") + node = ast_parse("1 unless 2") assert_locations(node.children[-1].locations, [[1, 0, 1, 10], [1, 2, 1, 8], nil, nil]) end def test_undef_locations - node = RubyVM::AbstractSyntaxTree.parse("undef foo") + node = ast_parse("undef foo") assert_locations(node.children[-1].locations, [[1, 0, 1, 9], [1, 0, 1, 5]]) - node = RubyVM::AbstractSyntaxTree.parse("undef foo, bar") + node = ast_parse("undef foo, bar") assert_locations(node.children[-1].locations, [[1, 0, 1, 14], [1, 0, 1, 5]]) end def test_valias_locations - node = RubyVM::AbstractSyntaxTree.parse("alias $foo $bar") + node = ast_parse("alias $foo $bar") assert_locations(node.children[-1].locations, [[1, 0, 1, 15], [1, 0, 1, 5]]) - node = RubyVM::AbstractSyntaxTree.parse("alias $foo $&") + node = ast_parse("alias $foo $&") assert_locations(node.children[-1].locations, [[1, 0, 1, 13], [1, 0, 1, 5]]) end def test_when_locations - node = RubyVM::AbstractSyntaxTree.parse("case a; when 1 then 2; end") + node = ast_parse("case a; when 1 then 2; end") assert_locations(node.children[-1].children[1].locations, [[1, 8, 1, 22], [1, 8, 1, 12], [1, 15, 1, 19]]) end def test_while_locations - node = RubyVM::AbstractSyntaxTree.parse("while cond do 1 end") + node = ast_parse("while cond do 1 end") assert_locations(node.children[-1].locations, [[1, 0, 1, 19], [1, 0, 1, 5], [1, 16, 1, 19]]) - node = RubyVM::AbstractSyntaxTree.parse("1 while 2") + node = ast_parse("1 while 2") assert_locations(node.children[-1].locations, [[1, 0, 1, 9], [1, 2, 1, 7], nil]) end def test_until_locations - node = RubyVM::AbstractSyntaxTree.parse("until cond do 1 end") + node = ast_parse("until cond do 1 end") assert_locations(node.children[-1].locations, [[1, 0, 1, 19], [1, 0, 1, 5], [1, 16, 1, 19]]) - node = RubyVM::AbstractSyntaxTree.parse("1 until 2") + node = ast_parse("1 until 2") assert_locations(node.children[-1].locations, [[1, 0, 1, 9], [1, 2, 1, 7], nil]) end private + def ast_parse(src, **options) + begin + verbose_bak, $VERBOSE = $VERBOSE, false + RubyVM::AbstractSyntaxTree.parse(src, **options) + ensure + $VERBOSE = verbose_bak + end + end + def assert_locations(locations, expected) ary = locations.map {|loc| loc && [loc.first_lineno, loc.first_column, loc.last_lineno, loc.last_column] } From 70111fcc45b22b691aca2b522cb8eb30bf9fc34c Mon Sep 17 00:00:00 2001 From: Yusuke Endoh Date: Tue, 17 Sep 2024 14:15:44 +0900 Subject: [PATCH 320/829] Prevent a warning due to error recovery of prism --- test/ruby/test_symbol.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/ruby/test_symbol.rb b/test/ruby/test_symbol.rb index 2275de06a8e94c..c50febf5d1c6fa 100644 --- a/test/ruby/test_symbol.rb +++ b/test/ruby/test_symbol.rb @@ -90,12 +90,15 @@ def test_inspect_suboptimal end def test_inspect_dollar + verbose_bak, $VERBOSE = $VERBOSE, nil # 4) :$- always treats next character literally: assert_raise(SyntaxError) {eval ':$-'} assert_raise(SyntaxError) {eval ":$-\n"} assert_raise(SyntaxError) {eval ":$- "} assert_raise(SyntaxError) {eval ":$-#"} assert_raise(SyntaxError) {eval ':$-('} + ensure + $VERBOSE = verbose_bak end def test_inspect_number From 7e0934d33e7ce09f9d2f50eb3f31708c0d852817 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Thu, 12 Sep 2024 18:50:09 +0200 Subject: [PATCH 321/829] [rubygems/rubygems] Consistently access install options through symbol keys https://github.com/rubygems/rubygems/commit/7ddf1dc70a --- lib/bundler/installer.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/bundler/installer.rb b/lib/bundler/installer.rb index 485782d1b410de..8868fc772f22dd 100644 --- a/lib/bundler/installer.rb +++ b/lib/bundler/installer.rb @@ -194,7 +194,7 @@ def generate_standalone_bundler_executable_stubs(spec, options = {}) # that said, it's a rare situation (other than rake), and parallel # installation is SO MUCH FASTER. so we let people opt in. def install(options) - force = options["force"] + force = options[:force] jobs = installation_parallelization(options) install_in_parallel jobs, options[:standalone], force end @@ -233,9 +233,9 @@ def install_in_parallel(size, standalone, force = false) # returns whether or not a re-resolve was needed def resolve_if_needed(options) - @definition.prefer_local! if options["prefer-local"] + @definition.prefer_local! if options[:"prefer-local"] - if options["local"] || (@definition.no_resolve_needed? && !@definition.missing_specs?) + if options[:local] || (@definition.no_resolve_needed? && !@definition.missing_specs?) @definition.resolve_with_cache! false else From 7428709d204728b807db1250be43abdf3dd514e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Thu, 12 Sep 2024 18:58:01 +0200 Subject: [PATCH 322/829] [rubygems/rubygems] Inline a private method Removes an (in my opinion) excessive indirection and handles options more consistently. https://github.com/rubygems/rubygems/commit/642e6d2c0c --- lib/bundler/installer.rb | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/lib/bundler/installer.rb b/lib/bundler/installer.rb index 8868fc772f22dd..6c07d2328b00ac 100644 --- a/lib/bundler/installer.rb +++ b/lib/bundler/installer.rb @@ -194,9 +194,13 @@ def generate_standalone_bundler_executable_stubs(spec, options = {}) # that said, it's a rare situation (other than rake), and parallel # installation is SO MUCH FASTER. so we let people opt in. def install(options) + standalone = options[:standalone] force = options[:force] jobs = installation_parallelization(options) - install_in_parallel jobs, options[:standalone], force + spec_installations = ParallelInstaller.call(self, @definition.specs, jobs, standalone, force) + spec_installations.each do |installation| + post_install_messages[installation.name] = installation.post_install_message if installation.has_post_install_message? + end end def installation_parallelization(options) @@ -224,13 +228,6 @@ def ensure_specs_are_compatible! end end - def install_in_parallel(size, standalone, force = false) - spec_installations = ParallelInstaller.call(self, @definition.specs, size, standalone, force) - spec_installations.each do |installation| - post_install_messages[installation.name] = installation.post_install_message if installation.has_post_install_message? - end - end - # returns whether or not a re-resolve was needed def resolve_if_needed(options) @definition.prefer_local! if options[:"prefer-local"] From 166cde7d24ee698ee720987645bcd792f3db6e78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Thu, 12 Sep 2024 19:07:31 +0200 Subject: [PATCH 323/829] [rubygems/rubygems] Fix spec to setup a default gem correctly Looking at the description is something that used to be done a long time ago. https://github.com/rubygems/rubygems/commit/9c226f52a6 --- spec/bundler/cache/gems_spec.rb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/spec/bundler/cache/gems_spec.rb b/spec/bundler/cache/gems_spec.rb index 2bd654ef43e2f7..ff9a3c5b7f0684 100644 --- a/spec/bundler/cache/gems_spec.rb +++ b/spec/bundler/cache/gems_spec.rb @@ -134,9 +134,7 @@ end it "doesn't make remote request after caching the gem" do - build_gem "builtin_gem_2", "1.0.2", path: bundled_app("vendor/cache") do |s| - s.summary = "This builtin_gem is bundled with Ruby" - end + build_gem "builtin_gem_2", "1.0.2", path: bundled_app("vendor/cache"), default: true install_gemfile <<-G source "https://gem.repo2" From 335d630903c53c4c6665d739f620834f1b57c1de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Thu, 12 Sep 2024 19:14:15 +0200 Subject: [PATCH 324/829] [rubygems/rubygems] Improve spec The behavior it's testing is independent from the bundle path being used. https://github.com/rubygems/rubygems/commit/9a4b32ec82 --- spec/bundler/cache/gems_spec.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/spec/bundler/cache/gems_spec.rb b/spec/bundler/cache/gems_spec.rb index ff9a3c5b7f0684..31272ebec67113 100644 --- a/spec/bundler/cache/gems_spec.rb +++ b/spec/bundler/cache/gems_spec.rb @@ -103,8 +103,7 @@ end end - it "uses remote gems when installing to system gems" do - bundle "config set path.system true" + it "uses remote gems when installing" do install_gemfile %(source "https://gem.repo2"; gem 'json', '#{default_json_version}'), verbose: true expect(out).to include("Installing json #{default_json_version}") end From 80e934c29c5bd8b7955e26f8683ac6644d69a200 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Thu, 12 Sep 2024 19:24:46 +0200 Subject: [PATCH 325/829] [rubygems/rubygems] Fix `--local` hitting the network when default gems are included https://github.com/rubygems/rubygems/commit/b9a2d4d539 --- lib/bundler/installer.rb | 3 ++- lib/bundler/installer/gem_installer.rb | 6 ++++-- lib/bundler/installer/parallel_installer.rb | 5 +++-- lib/bundler/source/rubygems.rb | 6 +++--- spec/bundler/bundler/installer/gem_installer_spec.rb | 7 ++++--- spec/bundler/cache/gems_spec.rb | 5 +++++ 6 files changed, 21 insertions(+), 11 deletions(-) diff --git a/lib/bundler/installer.rb b/lib/bundler/installer.rb index 6c07d2328b00ac..b65546a10a91d7 100644 --- a/lib/bundler/installer.rb +++ b/lib/bundler/installer.rb @@ -196,8 +196,9 @@ def generate_standalone_bundler_executable_stubs(spec, options = {}) def install(options) standalone = options[:standalone] force = options[:force] + local = options[:local] jobs = installation_parallelization(options) - spec_installations = ParallelInstaller.call(self, @definition.specs, jobs, standalone, force) + spec_installations = ParallelInstaller.call(self, @definition.specs, jobs, standalone, force, local: local) spec_installations.each do |installation| post_install_messages[installation.name] = installation.post_install_message if installation.has_post_install_message? end diff --git a/lib/bundler/installer/gem_installer.rb b/lib/bundler/installer/gem_installer.rb index a7770eb7e0b688..1da91857bd57b5 100644 --- a/lib/bundler/installer/gem_installer.rb +++ b/lib/bundler/installer/gem_installer.rb @@ -2,14 +2,15 @@ module Bundler class GemInstaller - attr_reader :spec, :standalone, :worker, :force, :installer + attr_reader :spec, :standalone, :worker, :force, :local, :installer - def initialize(spec, installer, standalone = false, worker = 0, force = false) + def initialize(spec, installer, standalone = false, worker = 0, force = false, local = false) @spec = spec @installer = installer @standalone = standalone @worker = worker @force = force + @local = local end def install_from_spec @@ -54,6 +55,7 @@ def install spec.source.install( spec, force: force, + local: local, build_args: Array(spec_settings), previous_spec: previous_spec, ) diff --git a/lib/bundler/installer/parallel_installer.rb b/lib/bundler/installer/parallel_installer.rb index e745088f81ad5d..d10e5ec92403ed 100644 --- a/lib/bundler/installer/parallel_installer.rb +++ b/lib/bundler/installer/parallel_installer.rb @@ -68,11 +68,12 @@ def self.call(*args, **kwargs) attr_reader :size - def initialize(installer, all_specs, size, standalone, force, skip: nil) + def initialize(installer, all_specs, size, standalone, force, local: false, skip: nil) @installer = installer @size = size @standalone = standalone @force = force + @local = local @specs = all_specs.map {|s| SpecInstallation.new(s) } @specs.each do |spec_install| spec_install.state = :installed if skip.include?(spec_install.name) @@ -127,7 +128,7 @@ def worker_pool def do_install(spec_install, worker_num) Plugin.hook(Plugin::Events::GEM_BEFORE_INSTALL, spec_install) gem_installer = Bundler::GemInstaller.new( - spec_install.spec, @installer, @standalone, worker_num, @force + spec_install.spec, @installer, @standalone, worker_num, @force, @local ) success, message = gem_installer.install_from_spec if success diff --git a/lib/bundler/source/rubygems.rb b/lib/bundler/source/rubygems.rb index 31815ea63a37ab..3b6ef8bd580df5 100644 --- a/lib/bundler/source/rubygems.rb +++ b/lib/bundler/source/rubygems.rb @@ -148,7 +148,7 @@ def specs end def install(spec, options = {}) - if (spec.default_gem? && !cached_built_in_gem(spec)) || (installed?(spec) && !options[:force]) + if (spec.default_gem? && !cached_built_in_gem(spec, local: options[:local])) || (installed?(spec) && !options[:force]) print_using_message "Using #{version_message(spec, options[:previous_spec])}" return nil # no post-install message end @@ -222,9 +222,9 @@ def cache(spec, custom_path = nil) raise InstallError, e.message end - def cached_built_in_gem(spec) + def cached_built_in_gem(spec, local: false) cached_path = cached_gem(spec) - if cached_path.nil? + if cached_path.nil? && !local remote_spec = remote_specs.search(spec).first if remote_spec cached_path = fetch_gem(remote_spec) diff --git a/spec/bundler/bundler/installer/gem_installer_spec.rb b/spec/bundler/bundler/installer/gem_installer_spec.rb index ea506c36c8bf67..6583bd8181b143 100644 --- a/spec/bundler/bundler/installer/gem_installer_spec.rb +++ b/spec/bundler/bundler/installer/gem_installer_spec.rb @@ -7,6 +7,7 @@ let(:installer) { instance_double("Installer", definition: definition) } let(:spec_source) { instance_double("SpecSource") } let(:spec) { instance_double("Specification", name: "dummy", version: "0.0.1", loaded_from: "dummy", source: spec_source) } + let(:base_options) { { force: false, local: false, previous_spec: nil } } subject { described_class.new(spec, installer) } @@ -14,7 +15,7 @@ it "invokes install method with empty build_args" do allow(spec_source).to receive(:install).with( spec, - { force: false, build_args: [], previous_spec: nil } + base_options.merge(build_args: []) ) subject.install_from_spec end @@ -28,7 +29,7 @@ allow(Bundler.settings).to receive(:[]).with("build.dummy").and_return("--with-dummy-config=dummy") expect(spec_source).to receive(:install).with( spec, - { force: false, build_args: ["--with-dummy-config=dummy"], previous_spec: nil } + base_options.merge(build_args: ["--with-dummy-config=dummy"]) ) subject.install_from_spec end @@ -42,7 +43,7 @@ allow(Bundler.settings).to receive(:[]).with("build.dummy").and_return("--with-dummy-config=dummy --with-another-dummy-config") expect(spec_source).to receive(:install).with( spec, - { force: false, build_args: ["--with-dummy-config=dummy", "--with-another-dummy-config"], previous_spec: nil } + base_options.merge(build_args: ["--with-dummy-config=dummy", "--with-another-dummy-config"]) ) subject.install_from_spec end diff --git a/spec/bundler/cache/gems_spec.rb b/spec/bundler/cache/gems_spec.rb index 31272ebec67113..a694df27001556 100644 --- a/spec/bundler/cache/gems_spec.rb +++ b/spec/bundler/cache/gems_spec.rb @@ -108,6 +108,11 @@ expect(out).to include("Installing json #{default_json_version}") end + it "does not use remote gems when installing with --local flag" do + install_gemfile %(source "https://gem.repo2"; gem 'json', '#{default_json_version}'), verbose: true, local: true + expect(out).to include("Using json #{default_json_version}") + end + it "caches remote and builtin gems" do install_gemfile <<-G source "https://gem.repo2" From 7d80c139f777a2018a93ab8df4e57dbf4fd27572 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Fri, 6 Sep 2024 14:22:11 +0200 Subject: [PATCH 326/829] Unlock parallel_tests --- tool/bundler/dev_gems.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tool/bundler/dev_gems.rb b/tool/bundler/dev_gems.rb index 1422cfc7a5238a..9ede9e1d8e8779 100644 --- a/tool/bundler/dev_gems.rb +++ b/tool/bundler/dev_gems.rb @@ -8,7 +8,7 @@ gem "webrick", "~> 1.6" gem "turbo_tests", "~> 2.2.3" -gem "parallel_tests", "< 3.9.0" +gem "parallel_tests", "~> 4.7" gem "parallel", "~> 1.19" gem "rspec-core", "~> 3.12" gem "rspec-expectations", "~> 3.12" From d81b0588bb3c97167d1f7e2d2a74185e0c19b68c Mon Sep 17 00:00:00 2001 From: NAITOH Jun Date: Sat, 14 Sep 2024 09:32:21 +0900 Subject: [PATCH 327/829] [ruby/strscan] Accept String as a pattern at non head (https://github.com/ruby/strscan/pull/106) It supports non-head match cases such as StringScanner#scan_until. If we use a String as a pattern, we can improve match performance. Here is a result of the including benchmark. ## CRuby It shows String as a pattern is 1.18x faster than Regexp as a pattern. ``` $ benchmark-driver benchmark/check_until.yaml Warming up -------------------------------------- regexp 9.403M i/s - 9.548M times in 1.015459s (106.35ns/i) regexp_var 9.162M i/s - 9.248M times in 1.009479s (109.15ns/i) string 8.966M i/s - 9.274M times in 1.034343s (111.54ns/i) string_var 11.051M i/s - 11.190M times in 1.012538s (90.49ns/i) Calculating ------------------------------------- regexp 10.319M i/s - 28.209M times in 2.733707s (96.91ns/i) regexp_var 10.032M i/s - 27.485M times in 2.739807s (99.68ns/i) string 9.681M i/s - 26.897M times in 2.778397s (103.30ns/i) string_var 12.162M i/s - 33.154M times in 2.726046s (82.22ns/i) Comparison: string_var: 12161920.6 i/s regexp: 10318949.7 i/s - 1.18x slower regexp_var: 10031617.6 i/s - 1.21x slower string: 9680843.7 i/s - 1.26x slower ``` ## JRuby It shows String as a pattern is 2.11x faster than Regexp as a pattern. ``` $ benchmark-driver benchmark/check_until.yaml Warming up -------------------------------------- regexp 7.591M i/s - 7.544M times in 0.993780s (131.74ns/i) regexp_var 6.143M i/s - 6.125M times in 0.997038s (162.77ns/i) string 14.135M i/s - 14.079M times in 0.996067s (70.75ns/i) string_var 14.079M i/s - 14.057M times in 0.998420s (71.03ns/i) Calculating ------------------------------------- regexp 9.409M i/s - 22.773M times in 2.420268s (106.28ns/i) regexp_var 10.116M i/s - 18.430M times in 1.821820s (98.85ns/i) string 21.389M i/s - 42.404M times in 1.982519s (46.75ns/i) string_var 20.897M i/s - 42.237M times in 2.021187s (47.85ns/i) Comparison: string: 21389191.1 i/s string_var: 20897327.5 i/s - 1.02x slower regexp_var: 10116464.7 i/s - 2.11x slower regexp: 9409222.3 i/s - 2.27x slower ``` See: https://github.com/jruby/jruby/blob/be7815ec02356a58891c8727bb448f0c6a826d96/core/src/main/java/org/jruby/util/StringSupport.java#L1706-L1736 --------- https://github.com/ruby/strscan/commit/f9d96c446a Co-authored-by: Sutou Kouhei --- ext/strscan/strscan.c | 25 ++++++---- test/strscan/test_stringscanner.rb | 80 ++++++++++++++++++++++++++++-- 2 files changed, 89 insertions(+), 16 deletions(-) diff --git a/ext/strscan/strscan.c b/ext/strscan/strscan.c index 606c44bc965923..e272f9224947f6 100644 --- a/ext/strscan/strscan.c +++ b/ext/strscan/strscan.c @@ -686,14 +686,6 @@ strscan_do_scan(VALUE self, VALUE pattern, int succptr, int getstr, int headonly { struct strscanner *p; - if (headonly) { - if (!RB_TYPE_P(pattern, T_REGEXP)) { - StringValue(pattern); - } - } - else { - Check_Type(pattern, T_REGEXP); - } GET_SCANNER(self, p); CLEAR_MATCH_STATUS(p); @@ -714,14 +706,25 @@ strscan_do_scan(VALUE self, VALUE pattern, int succptr, int getstr, int headonly } } else { + StringValue(pattern); rb_enc_check(p->str, pattern); if (S_RESTLEN(p) < RSTRING_LEN(pattern)) { return Qnil; } - if (memcmp(CURPTR(p), RSTRING_PTR(pattern), RSTRING_LEN(pattern)) != 0) { - return Qnil; + + if (headonly) { + if (memcmp(CURPTR(p), RSTRING_PTR(pattern), RSTRING_LEN(pattern)) != 0) { + return Qnil; + } + set_registers(p, RSTRING_LEN(pattern)); + } else { + long pos = rb_memsearch(RSTRING_PTR(pattern), RSTRING_LEN(pattern), + CURPTR(p), S_RESTLEN(p), rb_enc_get(pattern)); + if (pos == -1) { + return Qnil; + } + set_registers(p, RSTRING_LEN(pattern) + pos); } - set_registers(p, RSTRING_LEN(pattern)); } MATCHED(p); diff --git a/test/strscan/test_stringscanner.rb b/test/strscan/test_stringscanner.rb index 143cf7197df673..9b7b7910d0db81 100644 --- a/test/strscan/test_stringscanner.rb +++ b/test/strscan/test_stringscanner.rb @@ -262,7 +262,7 @@ def test_concat end def test_scan - s = create_string_scanner('stra strb strc', true) + s = create_string_scanner("stra strb\0strc", true) tmp = s.scan(/\w+/) assert_equal 'stra', tmp @@ -270,7 +270,7 @@ def test_scan assert_equal ' ', tmp assert_equal 'strb', s.scan(/\w+/) - assert_equal ' ', s.scan(/\s+/) + assert_equal "\u0000", s.scan(/\0/) tmp = s.scan(/\w+/) assert_equal 'strc', tmp @@ -312,11 +312,14 @@ def test_scan end def test_scan_string - s = create_string_scanner('stra strb strc') + s = create_string_scanner("stra strb\0strc") assert_equal 'str', s.scan('str') assert_equal 'str', s[0] assert_equal 3, s.pos assert_equal 'a ', s.scan('a ') + assert_equal 'strb', s.scan('strb') + assert_equal "\u0000", s.scan("\0") + assert_equal 'strc', s.scan('strc') str = 'stra strb strc'.dup s = create_string_scanner(str, false) @@ -668,13 +671,47 @@ def test_exist_p assert_equal(nil, s.exist?(/e/)) end - def test_exist_p_string + def test_exist_p_invalid_argument s = create_string_scanner("test string") assert_raise(TypeError) do - s.exist?(" ") + s.exist?(1) end end + def test_exist_p_string + omit("not implemented on TruffleRuby") if RUBY_ENGINE == "truffleruby" + s = create_string_scanner("test string") + assert_equal(3, s.exist?("s")) + assert_equal(0, s.pos) + s.scan("test") + assert_equal(2, s.exist?("s")) + assert_equal(4, s.pos) + assert_equal(nil, s.exist?("e")) + end + + def test_scan_until + s = create_string_scanner("Foo Bar\0Baz") + assert_equal("Foo", s.scan_until(/Foo/)) + assert_equal(3, s.pos) + assert_equal(" Bar", s.scan_until(/Bar/)) + assert_equal(7, s.pos) + assert_equal(nil, s.skip_until(/Qux/)) + assert_equal("\u0000Baz", s.scan_until(/Baz/)) + assert_equal(11, s.pos) + end + + def test_scan_until_string + omit("not implemented on TruffleRuby") if RUBY_ENGINE == "truffleruby" + s = create_string_scanner("Foo Bar\0Baz") + assert_equal("Foo", s.scan_until("Foo")) + assert_equal(3, s.pos) + assert_equal(" Bar", s.scan_until("Bar")) + assert_equal(7, s.pos) + assert_equal(nil, s.skip_until("Qux")) + assert_equal("\u0000Baz", s.scan_until("Baz")) + assert_equal(11, s.pos) + end + def test_skip_until s = create_string_scanner("Foo Bar Baz") assert_equal(3, s.skip_until(/Foo/)) @@ -684,6 +721,16 @@ def test_skip_until assert_equal(nil, s.skip_until(/Qux/)) end + def test_skip_until_string + omit("not implemented on TruffleRuby") if RUBY_ENGINE == "truffleruby" + s = create_string_scanner("Foo Bar Baz") + assert_equal(3, s.skip_until("Foo")) + assert_equal(3, s.pos) + assert_equal(4, s.skip_until("Bar")) + assert_equal(7, s.pos) + assert_equal(nil, s.skip_until("Qux")) + end + def test_check_until s = create_string_scanner("Foo Bar Baz") assert_equal("Foo", s.check_until(/Foo/)) @@ -693,6 +740,16 @@ def test_check_until assert_equal(nil, s.check_until(/Qux/)) end + def test_check_until_string + omit("not implemented on TruffleRuby") if RUBY_ENGINE == "truffleruby" + s = create_string_scanner("Foo Bar Baz") + assert_equal("Foo", s.check_until("Foo")) + assert_equal(0, s.pos) + assert_equal("Foo Bar", s.check_until("Bar")) + assert_equal(0, s.pos) + assert_equal(nil, s.check_until("Qux")) + end + def test_search_full s = create_string_scanner("Foo Bar Baz") assert_equal(8, s.search_full(/Bar /, false, false)) @@ -705,6 +762,19 @@ def test_search_full assert_equal(11, s.pos) end + def test_search_full_string + omit("not implemented on TruffleRuby") if RUBY_ENGINE == "truffleruby" + s = create_string_scanner("Foo Bar Baz") + assert_equal(8, s.search_full("Bar ", false, false)) + assert_equal(0, s.pos) + assert_equal("Foo Bar ", s.search_full("Bar ", false, true)) + assert_equal(0, s.pos) + assert_equal(8, s.search_full("Bar ", true, false)) + assert_equal(8, s.pos) + assert_equal("Baz", s.search_full("az", true, true)) + assert_equal(11, s.pos) + end + def test_peek s = create_string_scanner("test string") assert_equal("test st", s.peek(7)) From c0116860ba2e1d3efed71de35942f0ac298bc8e6 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Tue, 17 Sep 2024 15:37:20 +0900 Subject: [PATCH 328/829] Removed accidentally commit for snapshot file of prism --- .../prism/snapshots/regex_escape_encoding.txt | 43 ------------------- 1 file changed, 43 deletions(-) delete mode 100644 test/prism/snapshots/regex_escape_encoding.txt diff --git a/test/prism/snapshots/regex_escape_encoding.txt b/test/prism/snapshots/regex_escape_encoding.txt deleted file mode 100644 index 0f2dcc2c54e07c..00000000000000 --- a/test/prism/snapshots/regex_escape_encoding.txt +++ /dev/null @@ -1,43 +0,0 @@ -@ ProgramNode (location: (2,0)-(3,21)) -├── flags: ∅ -├── locals: [:str] -└── statements: - @ StatementsNode (location: (2,0)-(3,21)) - ├── flags: ∅ - └── body: (length: 2) - ├── @ LocalVariableWriteNode (location: (2,0)-(2,18)) - │ ├── flags: newline - │ ├── name: :str - │ ├── depth: 0 - │ ├── name_loc: (2,0)-(2,3) = "str" - │ ├── value: - │ │ @ StringNode (location: (2,6)-(2,18)) - │ │ ├── flags: forced_binary_encoding - │ │ ├── opening_loc: (2,6)-(2,7) = "\"" - │ │ ├── content_loc: (2,7)-(2,17) = "hello \\xFC" - │ │ ├── closing_loc: (2,17)-(2,18) = "\"" - │ │ └── unescaped: "hello \xFC" - │ └── operator_loc: (2,4)-(2,5) = "=" - └── @ CallNode (location: (3,0)-(3,21)) - ├── flags: newline - ├── receiver: - │ @ LocalVariableReadNode (location: (3,0)-(3,3)) - │ ├── flags: ∅ - │ ├── name: :str - │ └── depth: 0 - ├── call_operator_loc: ∅ - ├── name: :=~ - ├── message_loc: (3,4)-(3,6) = "=~" - ├── opening_loc: ∅ - ├── arguments: - │ @ ArgumentsNode (location: (3,7)-(3,21)) - │ ├── flags: ∅ - │ └── arguments: (length: 1) - │ └── @ RegularExpressionNode (location: (3,7)-(3,21)) - │ ├── flags: static_literal, forced_utf8_encoding - │ ├── opening_loc: (3,7)-(3,8) = "/" - │ ├── content_loc: (3,8)-(3,20) = "hello \\u{fc}" - │ ├── closing_loc: (3,20)-(3,21) = "/" - │ └── unescaped: "hello \\u{fc}" - ├── closing_loc: ∅ - └── block: ∅ From 95f08f2b7fcbad889e4aef7aa941da3da3e8e74b Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Tue, 17 Sep 2024 15:44:18 +0900 Subject: [PATCH 329/829] Skip failing examples related with https://github.com/ruby/ruby/commit/d81b0588bb3c97167d1f7e2d2a74185e0c19b68c --- spec/ruby/library/stringscanner/check_until_spec.rb | 10 ++++++---- spec/ruby/library/stringscanner/exist_spec.rb | 10 ++++++---- spec/ruby/library/stringscanner/scan_until_spec.rb | 10 ++++++---- spec/ruby/library/stringscanner/search_full_spec.rb | 10 ++++++---- spec/ruby/library/stringscanner/skip_until_spec.rb | 10 ++++++---- 5 files changed, 30 insertions(+), 20 deletions(-) diff --git a/spec/ruby/library/stringscanner/check_until_spec.rb b/spec/ruby/library/stringscanner/check_until_spec.rb index ad222fd76b3e9d..1d89f88a25bfa1 100644 --- a/spec/ruby/library/stringscanner/check_until_spec.rb +++ b/spec/ruby/library/stringscanner/check_until_spec.rb @@ -13,9 +13,11 @@ @s.check_until(/test/).should == "This is a test" end - it "raises TypeError if given a String" do - -> { - @s.check_until('T') - }.should raise_error(TypeError, 'wrong argument type String (expected Regexp)') + ruby_version_is ""..."3.4" do + it "raises TypeError if given a String" do + -> { + @s.check_until('T') + }.should raise_error(TypeError, 'wrong argument type String (expected Regexp)') + end end end diff --git a/spec/ruby/library/stringscanner/exist_spec.rb b/spec/ruby/library/stringscanner/exist_spec.rb index ff860a0d3e35dc..a18f5ce35273a8 100644 --- a/spec/ruby/library/stringscanner/exist_spec.rb +++ b/spec/ruby/library/stringscanner/exist_spec.rb @@ -22,9 +22,11 @@ @s.exist?(/i/).should == nil end - it "raises TypeError if given a String" do - -> { - @s.exist?('T') - }.should raise_error(TypeError, 'wrong argument type String (expected Regexp)') + ruby_version_is ""..."3.4" do + it "raises TypeError if given a String" do + -> { + @s.exist?('T') + }.should raise_error(TypeError, 'wrong argument type String (expected Regexp)') + end end end diff --git a/spec/ruby/library/stringscanner/scan_until_spec.rb b/spec/ruby/library/stringscanner/scan_until_spec.rb index a8162f1f0399fb..1e318d053b923a 100644 --- a/spec/ruby/library/stringscanner/scan_until_spec.rb +++ b/spec/ruby/library/stringscanner/scan_until_spec.rb @@ -21,9 +21,11 @@ @s.scan_until(/^h/).should == "h" end - it "raises TypeError if given a String" do - -> { - @s.scan_until('T') - }.should raise_error(TypeError, 'wrong argument type String (expected Regexp)') + ruby_version_is ""..."3.4" do + it "raises TypeError if given a String" do + -> { + @s.scan_until('T') + }.should raise_error(TypeError, 'wrong argument type String (expected Regexp)') + end end end diff --git a/spec/ruby/library/stringscanner/search_full_spec.rb b/spec/ruby/library/stringscanner/search_full_spec.rb index 7d2a714fa56799..713ab00d22b2bc 100644 --- a/spec/ruby/library/stringscanner/search_full_spec.rb +++ b/spec/ruby/library/stringscanner/search_full_spec.rb @@ -28,9 +28,11 @@ @s.pos.should == 4 end - it "raises TypeError if given a String" do - -> { - @s.search_full('T', true, true) - }.should raise_error(TypeError, 'wrong argument type String (expected Regexp)') + ruby_version_is ""..."3.4" do + it "raises TypeError if given a String" do + -> { + @s.search_full('T', true, true) + }.should raise_error(TypeError, 'wrong argument type String (expected Regexp)') + end end end diff --git a/spec/ruby/library/stringscanner/skip_until_spec.rb b/spec/ruby/library/stringscanner/skip_until_spec.rb index 7b56f13e4f6ebc..b6a020f9ba8ffd 100644 --- a/spec/ruby/library/stringscanner/skip_until_spec.rb +++ b/spec/ruby/library/stringscanner/skip_until_spec.rb @@ -16,9 +16,11 @@ @s.skip_until(/d+/).should == nil end - it "raises TypeError if given a String" do - -> { - @s.skip_until('T') - }.should raise_error(TypeError, 'wrong argument type String (expected Regexp)') + ruby_version_is ""..."3.4" do + it "raises TypeError if given a String" do + -> { + @s.skip_until('T') + }.should raise_error(TypeError, 'wrong argument type String (expected Regexp)') + end end end From 1ecac5d4ed620247bdb74fa2c20e1665fae75b1a Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Tue, 17 Sep 2024 16:16:45 +0900 Subject: [PATCH 330/829] TestProcess#test_daemon_noclose is working fine with macOS 15.1 beta3 and Xcode 16 RC --- test/ruby/test_process.rb | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/ruby/test_process.rb b/test/ruby/test_process.rb index 90cb3ef027a7d1..6e8ba484a49ac9 100644 --- a/test/ruby/test_process.rb +++ b/test/ruby/test_process.rb @@ -1874,8 +1874,6 @@ def test_daemon_default end def test_daemon_noclose - pend "macOS 15 beta is not working with this test" if macos?(15) - data = IO.popen("-", "r+") do |f| break f.read if f Process.daemon(false, true) From cf063c008fd988def961fdddf7616e52345af3f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Thu, 12 Sep 2024 16:40:23 +0200 Subject: [PATCH 331/829] [rubygems/rubygems] Bump rubies in CI to 3.3.5 A spec needed changes because now loading the default `json` prints a warning about `ostruct` getting loaded although it will be removed in the future. Use a different default gem to test this. https://github.com/rubygems/rubygems/commit/7415a66906 Co-authored-by: Samuel Giddins --- spec/bundler/runtime/setup_spec.rb | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/spec/bundler/runtime/setup_spec.rb b/spec/bundler/runtime/setup_spec.rb index ededaab410a018..175e2551f199f6 100644 --- a/spec/bundler/runtime/setup_spec.rb +++ b/spec/bundler/runtime/setup_spec.rb @@ -1377,20 +1377,21 @@ def lock_with(ruby_version = nil) end it "activates default gems when they are part of the bundle, but not installed explicitly", :ruby_repo do - default_json_version = ruby "gem 'json'; require 'json'; puts JSON::VERSION" + default_delegate_version = ruby "gem 'delegate'; require 'delegate'; puts Delegator::VERSION" build_repo2 do - build_gem "json", default_json_version + build_gem "delegate", default_delegate_version end - gemfile "source \"https://gem.repo2\"; gem 'json'" + gemfile "source \"https://gem.repo2\"; gem 'delegate'" ruby <<-RUBY require "bundler/setup" - require "json" - puts defined?(::JSON) ? "JSON defined" : "JSON undefined" + require "delegate" + puts defined?(::Delegator) ? "Delegator defined" : "Delegator undefined" RUBY + expect(out).to eq("Delegator defined") expect(err).to be_empty end From fd5e583990330f2d84d05d1ae1ceea2a472b6352 Mon Sep 17 00:00:00 2001 From: Yusuke Endoh Date: Tue, 17 Sep 2024 22:32:09 +0900 Subject: [PATCH 332/829] Prevent two warnings ``` /home/chkbuild/chkbuild/tmp/build/20240917T123003Z/ruby/test/ruby/test_case.rb:73: warning: 'when' clause on line 73 duplicates 'when' clause on line 73 and is ignored /home/chkbuild/chkbuild/tmp/build/20240917T123003Z/ruby/test/ruby/test_syntax.rb:333: warning: key :k1 is duplicated and overwritten on line 333 ``` --- test/ruby/test_case.rb | 11 ++++++++--- test/ruby/test_syntax.rb | 7 ++++++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/test/ruby/test_case.rb b/test/ruby/test_case.rb index 4a0f1bf78d0f44..3725fb49bbafc3 100644 --- a/test/ruby/test_case.rb +++ b/test/ruby/test_case.rb @@ -68,10 +68,15 @@ def test_case assert(false) end - assert_raise(NameError) do - case - when false, *x, false + begin + verbose_bak, $VERBOSE = $VERBOSE, nil + assert_raise(NameError) do + case + when false, *x, false + end end + ensure + $VERBOSE = verbose_bak end end diff --git a/test/ruby/test_syntax.rb b/test/ruby/test_syntax.rb index fe6fa30e0272c5..4ed28320b380af 100644 --- a/test/ruby/test_syntax.rb +++ b/test/ruby/test_syntax.rb @@ -330,7 +330,12 @@ def test_keyword_duplicated_splat bug10315 = '[ruby-core:65368] [Bug #10315]' o = KW2.new - assert_equal([23, 2], o.kw(**{k1: 22}, **{k1: 23}), bug10315) + begin + verbose_bak, $VERBOSE = $VERBOSE, nil + assert_equal([23, 2], eval("o.kw(**{k1: 22}, **{k1: 23}"), bug10315) + ensure + $VERBOSE = verbose_bak + end h = {k3: 31} assert_raise(ArgumentError) {o.kw(**h)} From 82151a86305d79cd2301d92258462f25fc28ac80 Mon Sep 17 00:00:00 2001 From: Yusuke Endoh Date: Tue, 17 Sep 2024 23:07:44 +0900 Subject: [PATCH 333/829] Fix a typo, sorry! --- test/ruby/test_syntax.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/ruby/test_syntax.rb b/test/ruby/test_syntax.rb index 4ed28320b380af..5c341a69b70b06 100644 --- a/test/ruby/test_syntax.rb +++ b/test/ruby/test_syntax.rb @@ -332,7 +332,7 @@ def test_keyword_duplicated_splat o = KW2.new begin verbose_bak, $VERBOSE = $VERBOSE, nil - assert_equal([23, 2], eval("o.kw(**{k1: 22}, **{k1: 23}"), bug10315) + assert_equal([23, 2], eval("o.kw(**{k1: 22}, **{k1: 23})"), bug10315) ensure $VERBOSE = verbose_bak end From 0160dafc4c52b84bb1f989670b54186505649493 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Mon, 16 Sep 2024 15:29:38 -0400 Subject: [PATCH 334/829] Replace all GC.disable with EnvUtil.without_gc --- test/objspace/test_objspace.rb | 41 ++++++++++----------- test/ruby/test_gc.rb | 65 ++++++++++++++------------------- test/ruby/test_objectspace.rb | 41 ++++++++++----------- test/ruby/test_sleep.rb | 17 ++++----- test/ruby/test_string_memory.rb | 41 ++++++++++----------- 5 files changed, 95 insertions(+), 110 deletions(-) diff --git a/test/objspace/test_objspace.rb b/test/objspace/test_objspace.rb index 3f4a58e98d9c59..b54a4381325a06 100644 --- a/test/objspace/test_objspace.rb +++ b/test/objspace/test_objspace.rb @@ -244,39 +244,38 @@ def test_trace_object_allocations def test_trace_object_allocations_start_stop_clear ObjectSpace.trace_object_allocations_clear # clear object_table to get rid of erroneous detection for obj3 - GC.disable # suppress potential object reuse. see [Bug #11271] - begin - ObjectSpace.trace_object_allocations_start + EnvUtil.without_gc do # suppress potential object reuse. see [Bug #11271] begin ObjectSpace.trace_object_allocations_start begin ObjectSpace.trace_object_allocations_start - obj0 = Object.new + begin + ObjectSpace.trace_object_allocations_start + obj0 = Object.new + ensure + ObjectSpace.trace_object_allocations_stop + obj1 = Object.new + end ensure ObjectSpace.trace_object_allocations_stop - obj1 = Object.new + obj2 = Object.new end ensure ObjectSpace.trace_object_allocations_stop - obj2 = Object.new + obj3 = Object.new end - ensure - ObjectSpace.trace_object_allocations_stop - obj3 = Object.new - end - assert_equal(__FILE__, ObjectSpace.allocation_sourcefile(obj0)) - assert_equal(__FILE__, ObjectSpace.allocation_sourcefile(obj1)) - assert_equal(__FILE__, ObjectSpace.allocation_sourcefile(obj2)) - assert_equal(nil , ObjectSpace.allocation_sourcefile(obj3)) # after tracing + assert_equal(__FILE__, ObjectSpace.allocation_sourcefile(obj0)) + assert_equal(__FILE__, ObjectSpace.allocation_sourcefile(obj1)) + assert_equal(__FILE__, ObjectSpace.allocation_sourcefile(obj2)) + assert_equal(nil , ObjectSpace.allocation_sourcefile(obj3)) # after tracing - ObjectSpace.trace_object_allocations_clear - assert_equal(nil, ObjectSpace.allocation_sourcefile(obj0)) - assert_equal(nil, ObjectSpace.allocation_sourcefile(obj1)) - assert_equal(nil, ObjectSpace.allocation_sourcefile(obj2)) - assert_equal(nil, ObjectSpace.allocation_sourcefile(obj3)) - ensure - GC.enable + ObjectSpace.trace_object_allocations_clear + assert_equal(nil, ObjectSpace.allocation_sourcefile(obj0)) + assert_equal(nil, ObjectSpace.allocation_sourcefile(obj1)) + assert_equal(nil, ObjectSpace.allocation_sourcefile(obj2)) + assert_equal(nil, ObjectSpace.allocation_sourcefile(obj3)) + end end def test_trace_object_allocations_gc_stress diff --git a/test/ruby/test_gc.rb b/test/ruby/test_gc.rb index de64cbd36dcd8c..9a9796dc55ecfa 100644 --- a/test/ruby/test_gc.rb +++ b/test/ruby/test_gc.rb @@ -40,16 +40,16 @@ def use_rgengc? end def test_enable_disable - GC.enable - assert_equal(false, GC.enable) - assert_equal(false, GC.disable) - assert_equal(true, GC.disable) - assert_equal(true, GC.disable) - assert_nil(GC.start) - assert_equal(true, GC.enable) - assert_equal(false, GC.enable) - ensure - GC.enable + EnvUtil.without_gc do + GC.enable + assert_equal(false, GC.enable) + assert_equal(false, GC.disable) + assert_equal(true, GC.disable) + assert_equal(true, GC.disable) + assert_nil(GC.start) + assert_equal(true, GC.enable) + assert_equal(false, GC.enable) + end end def test_gc_config_full_mark_by_default @@ -227,12 +227,9 @@ def test_stat_heap GC.stat(stat) GC::INTERNAL_CONSTANTS[:SIZE_POOL_COUNT].times do |i| - begin - reenable_gc = !GC.disable + EnvUtil.without_gc do GC.stat_heap(i, stat_heap) GC.stat(stat) - ensure - GC.enable if reenable_gc end assert_equal (GC::INTERNAL_CONSTANTS[:BASE_SLOT_SIZE] + GC::INTERNAL_CONSTANTS[:RVALUE_OVERHEAD]) * (2**i), stat_heap[:slot_size] @@ -768,23 +765,17 @@ def test_gc_stress_at_startup end def test_gc_disabled_start - begin - disabled = GC.disable + EnvUtil.without_gc do c = GC.count GC.start assert_equal 1, GC.count - c - ensure - GC.enable unless disabled end - begin - disabled = GC.disable + EnvUtil.without_gc do c = GC.count GC.start(immediate_mark: false, immediate_sweep: false) 10_000.times { Object.new } assert_equal 1, GC.count - c - ensure - GC.enable unless disabled end end @@ -859,28 +850,26 @@ def test_ast_node_buffer end def test_old_to_young_reference - original_gc_disabled = GC.disable + EnvUtil.without_gc do + require "objspace" - require "objspace" + old_obj = Object.new + 4.times { GC.start } - old_obj = Object.new - 4.times { GC.start } + assert_include ObjectSpace.dump(old_obj), '"old":true' - assert_include ObjectSpace.dump(old_obj), '"old":true' + young_obj = Object.new + old_obj.instance_variable_set(:@test, young_obj) - young_obj = Object.new - old_obj.instance_variable_set(:@test, young_obj) + # Not immediately promoted to old generation + 3.times do + assert_not_include ObjectSpace.dump(young_obj), '"old":true' + GC.start + end - # Not immediately promoted to old generation - 3.times do - assert_not_include ObjectSpace.dump(young_obj), '"old":true' + # Takes 4 GC to promote to old generation GC.start + assert_include ObjectSpace.dump(young_obj), '"old":true' end - - # Takes 4 GC to promote to old generation - GC.start - assert_include ObjectSpace.dump(young_obj), '"old":true' - ensure - GC.enable if !original_gc_disabled end end diff --git a/test/ruby/test_objectspace.rb b/test/ruby/test_objectspace.rb index 0364cf70937155..beb66da7e216e9 100644 --- a/test/ruby/test_objectspace.rb +++ b/test/ruby/test_objectspace.rb @@ -191,30 +191,29 @@ def test_exception_in_finalizer end def test_finalizer_thread_raise - GC.disable - fzer = proc do |id| - sleep 0.2 - end - 2.times do - o = Object.new - ObjectSpace.define_finalizer(o, fzer) - end + EnvUtil.without_gc do + fzer = proc do |id| + sleep 0.2 + end + 2.times do + o = Object.new + ObjectSpace.define_finalizer(o, fzer) + end - my_error = Class.new(RuntimeError) - begin - main_th = Thread.current - Thread.new do - sleep 0.1 - main_th.raise(my_error) + my_error = Class.new(RuntimeError) + begin + main_th = Thread.current + Thread.new do + sleep 0.1 + main_th.raise(my_error) + end + GC.start + puts "After GC" + sleep(10) + assert(false) + rescue my_error end - GC.start - puts "After GC" - sleep(10) - assert(false) - rescue my_error end - ensure - GC.enable end def test_each_object diff --git a/test/ruby/test_sleep.rb b/test/ruby/test_sleep.rb index 61002b8b1872d4..991b73ebd50757 100644 --- a/test/ruby/test_sleep.rb +++ b/test/ruby/test_sleep.rb @@ -4,14 +4,13 @@ class TestSleep < Test::Unit::TestCase def test_sleep_5sec - GC.disable - start = Process.clock_gettime(Process::CLOCK_MONOTONIC) - sleep 5 - slept = Process.clock_gettime(Process::CLOCK_MONOTONIC) - start - bottom = 5.0 - assert_operator(slept, :>=, bottom) - assert_operator(slept, :<=, 6.0, "[ruby-core:18015]: longer than expected") - ensure - GC.enable + EnvUtil.without_gc do + start = Process.clock_gettime(Process::CLOCK_MONOTONIC) + sleep 5 + slept = Process.clock_gettime(Process::CLOCK_MONOTONIC) - start + bottom = 5.0 + assert_operator(slept, :>=, bottom) + assert_operator(slept, :<=, 6.0, "[ruby-core:18015]: longer than expected") + end end end diff --git a/test/ruby/test_string_memory.rb b/test/ruby/test_string_memory.rb index e264dd57050f7e..a93a3bd54afcea 100644 --- a/test/ruby/test_string_memory.rb +++ b/test/ruby/test_string_memory.rb @@ -6,32 +6,31 @@ class TestStringMemory < Test::Unit::TestCase def capture_allocations(klass) allocations = [] - GC.start - GC.disable - generation = GC.count + EnvUtil.without_gc do + GC.start + generation = GC.count - ObjectSpace.trace_object_allocations do - yield + ObjectSpace.trace_object_allocations do + yield - ObjectSpace.each_object(klass) do |instance| - allocations << instance if ObjectSpace.allocation_generation(instance) == generation + ObjectSpace.each_object(klass) do |instance| + allocations << instance if ObjectSpace.allocation_generation(instance) == generation + end end - end - return allocations.map do |instance| - [ - ObjectSpace.allocation_sourcefile(instance), - ObjectSpace.allocation_sourceline(instance), - instance.class, - instance, - ] - end.select do |path,| - # drop strings not created in this file - # (the parallel testing framework may create strings in a separate thread) - path == __FILE__ + return allocations.map do |instance| + [ + ObjectSpace.allocation_sourcefile(instance), + ObjectSpace.allocation_sourceline(instance), + instance.class, + instance, + ] + end.select do |path,| + # drop strings not created in this file + # (the parallel testing framework may create strings in a separate thread) + path == __FILE__ + end end - ensure - GC.enable end def test_byteslice_prefix From 748933aa1b9f6067dbb24fad99aa66bf1f93b4cd Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Tue, 17 Sep 2024 14:37:03 -0400 Subject: [PATCH 335/829] [ruby/prism] Accept "do" blocks in some parameter default values https://github.com/ruby/prism/commit/6d7b734dbe --- prism/prism.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/prism/prism.c b/prism/prism.c index 24ddd8b94606d3..73f33a4ebfc8b4 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -14432,7 +14432,8 @@ parse_parameters( pm_binding_power_t binding_power, bool uses_parentheses, bool allows_trailing_comma, - bool allows_forwarding_parameters + bool allows_forwarding_parameters, + bool accepts_blocks_in_defaults ) { pm_parameters_node_t *params = pm_parameters_node_create(parser); bool looping = true; @@ -14550,11 +14551,14 @@ parse_parameters( pm_constant_id_t name_id = pm_parser_constant_id_token(parser, &name); uint32_t reads = parser->version == PM_OPTIONS_VERSION_CRUBY_3_3 ? pm_locals_reads(&parser->current_scope->locals, name_id) : 0; + if (accepts_blocks_in_defaults) pm_accepts_block_stack_push(parser, true); pm_node_t *value = parse_value_expression(parser, binding_power, false, PM_ERR_PARAMETER_NO_DEFAULT); + if (accepts_blocks_in_defaults) pm_accepts_block_stack_pop(parser); + pm_optional_parameter_node_t *param = pm_optional_parameter_node_create(parser, &name, &operator, value); if (repeated) { - pm_node_flag_set_repeated_parameter((pm_node_t *)param); + pm_node_flag_set_repeated_parameter((pm_node_t *) param); } pm_parameters_node_optionals_append(params, param); @@ -14641,7 +14645,10 @@ parse_parameters( pm_constant_id_t name_id = pm_parser_constant_id_token(parser, &local); uint32_t reads = parser->version == PM_OPTIONS_VERSION_CRUBY_3_3 ? pm_locals_reads(&parser->current_scope->locals, name_id) : 0; + + if (accepts_blocks_in_defaults) pm_accepts_block_stack_push(parser, true); pm_node_t *value = parse_value_expression(parser, binding_power, false, PM_ERR_PARAMETER_NO_DEFAULT_KW); + if (accepts_blocks_in_defaults) pm_accepts_block_stack_pop(parser); if (parser->version == PM_OPTIONS_VERSION_CRUBY_3_3 && (pm_locals_reads(&parser->current_scope->locals, name_id) != reads)) { PM_PARSER_ERR_TOKEN_FORMAT_CONTENT(parser, local, PM_ERR_PARAMETER_CIRCULAR); @@ -15115,7 +15122,8 @@ parse_block_parameters( pm_parser_t *parser, bool allows_trailing_comma, const pm_token_t *opening, - bool is_lambda_literal + bool is_lambda_literal, + bool accepts_blocks_in_defaults ) { pm_parameters_node_t *parameters = NULL; if (!match1(parser, PM_TOKEN_SEMICOLON)) { @@ -15124,7 +15132,8 @@ parse_block_parameters( is_lambda_literal ? PM_BINDING_POWER_DEFINED : PM_BINDING_POWER_INDEX, false, allows_trailing_comma, - false + false, + accepts_blocks_in_defaults ); } @@ -15294,7 +15303,7 @@ parse_block(pm_parser_t *parser) { parser->command_start = true; parser_lex(parser); } else { - block_parameters = parse_block_parameters(parser, true, &block_parameters_opening, false); + block_parameters = parse_block_parameters(parser, true, &block_parameters_opening, false, true); accept1(parser, PM_TOKEN_NEWLINE); parser->command_start = true; expect1(parser, PM_TOKEN_PIPE, PM_ERR_BLOCK_PARAM_PIPE_TERM); @@ -19167,7 +19176,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b if (match1(parser, PM_TOKEN_PARENTHESIS_RIGHT)) { params = NULL; } else { - params = parse_parameters(parser, PM_BINDING_POWER_DEFINED, true, false, true); + params = parse_parameters(parser, PM_BINDING_POWER_DEFINED, true, false, true, true); } lex_state_set(parser, PM_LEX_STATE_BEG); @@ -19191,7 +19200,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b lparen = not_provided(parser); rparen = not_provided(parser); - params = parse_parameters(parser, PM_BINDING_POWER_DEFINED, false, false, true); + params = parse_parameters(parser, PM_BINDING_POWER_DEFINED, false, false, true, true); break; } default: { @@ -20294,7 +20303,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b if (match1(parser, PM_TOKEN_PARENTHESIS_RIGHT)) { block_parameters = pm_block_parameters_node_create(parser, NULL, &opening); } else { - block_parameters = parse_block_parameters(parser, false, &opening, true); + block_parameters = parse_block_parameters(parser, false, &opening, true, true); } accept1(parser, PM_TOKEN_NEWLINE); @@ -20306,7 +20315,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b case PM_CASE_PARAMETER: { pm_accepts_block_stack_push(parser, false); pm_token_t opening = not_provided(parser); - block_parameters = parse_block_parameters(parser, false, &opening, true); + block_parameters = parse_block_parameters(parser, false, &opening, true, false); pm_accepts_block_stack_pop(parser); break; } From 5de7517bcb735b9d9c0daddaf7f519f63b033a9e Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Tue, 17 Sep 2024 11:10:58 -0400 Subject: [PATCH 336/829] Use unsigned long long for marking and sweeping time --- gc/default.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/gc/default.c b/gc/default.c index 0c66dca8b47b49..d959e108abc250 100644 --- a/gc/default.c +++ b/gc/default.c @@ -563,9 +563,9 @@ typedef struct rb_objspace { /* basic statistics */ size_t count; - uint64_t marking_time_ns; + unsigned long long marking_time_ns; struct timespec marking_start_time; - uint64_t sweeping_time_ns; + unsigned long long sweeping_time_ns; struct timespec sweeping_start_time; /* Weak references */ @@ -1527,8 +1527,8 @@ rb_gc_impl_get_profile_total_time(void *objspace_ptr) { rb_objspace_t *objspace = objspace_ptr; - uint64_t marking_time = objspace->profile.marking_time_ns; - uint64_t sweeping_time = objspace->profile.sweeping_time_ns; + unsigned long long marking_time = objspace->profile.marking_time_ns; + unsigned long long sweeping_time = objspace->profile.sweeping_time_ns; return ULL2NUM(marking_time + sweeping_time); } @@ -6671,7 +6671,7 @@ gc_clock_start(struct timespec *ts) } } -static uint64_t +static unsigned long long gc_clock_end(struct timespec *ts) { struct timespec end_time; @@ -6679,7 +6679,7 @@ gc_clock_end(struct timespec *ts) if ((ts->tv_sec > 0 || ts->tv_nsec > 0) && current_process_time(&end_time) && end_time.tv_sec >= ts->tv_sec) { - return (uint64_t)(end_time.tv_sec - ts->tv_sec) * (1000 * 1000 * 1000) + + return (unsigned long long)(end_time.tv_sec - ts->tv_sec) * (1000 * 1000 * 1000) + (end_time.tv_nsec - ts->tv_nsec); } From 2af080bd3031cc4ea37c985f5782355df151ab1c Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Tue, 17 Sep 2024 11:39:43 -0400 Subject: [PATCH 337/829] Change rb_gc_impl_get_profile_total_time to return unsigned long long --- gc.c | 2 +- gc.rb | 2 +- gc/default.c | 4 ++-- gc/gc_impl.h | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/gc.c b/gc.c index ee8b7bc3764c89..f47f82e26bd997 100644 --- a/gc.c +++ b/gc.c @@ -636,7 +636,7 @@ typedef struct gc_function_map { // Statistics VALUE (*set_measure_total_time)(void *objspace_ptr, VALUE flag); VALUE (*get_measure_total_time)(void *objspace_ptr); - VALUE (*get_profile_total_time)(void *objspace_ptr); + unsigned long long (*get_profile_total_time)(void *objspace_ptr); size_t (*gc_count)(void *objspace_ptr); VALUE (*latest_gc_info)(void *objspace_ptr, VALUE key); size_t (*stat)(void *objspace_ptr, VALUE hash_or_sym); diff --git a/gc.rb b/gc.rb index f714fba749090a..7b943f1d80ce05 100644 --- a/gc.rb +++ b/gc.rb @@ -352,7 +352,7 @@ def self.measure_total_time # Return measured \GC total time in nano seconds. def self.total_time Primitive.cexpr! %{ - rb_gc_impl_get_profile_total_time(rb_gc_get_objspace()) + ULL2NUM(rb_gc_impl_get_profile_total_time(rb_gc_get_objspace())) } end end diff --git a/gc/default.c b/gc/default.c index d959e108abc250..149eae5971073a 100644 --- a/gc/default.c +++ b/gc/default.c @@ -1522,7 +1522,7 @@ rb_gc_impl_set_event_hook(void *objspace_ptr, const rb_event_flag_t event) objspace->flags.has_newobj_hook = !!(objspace->hook_events & RUBY_INTERNAL_EVENT_NEWOBJ); } -VALUE +unsigned long long rb_gc_impl_get_profile_total_time(void *objspace_ptr) { rb_objspace_t *objspace = objspace_ptr; @@ -1530,7 +1530,7 @@ rb_gc_impl_get_profile_total_time(void *objspace_ptr) unsigned long long marking_time = objspace->profile.marking_time_ns; unsigned long long sweeping_time = objspace->profile.sweeping_time_ns; - return ULL2NUM(marking_time + sweeping_time); + return marking_time + sweeping_time; } VALUE diff --git a/gc/gc_impl.h b/gc/gc_impl.h index 12527845f7a2f9..ec47c9fe7e3b9d 100644 --- a/gc/gc_impl.h +++ b/gc/gc_impl.h @@ -87,7 +87,7 @@ GC_IMPL_FN VALUE rb_gc_impl_object_id_to_ref(void *objspace_ptr, VALUE object_id // Statistics GC_IMPL_FN VALUE rb_gc_impl_set_measure_total_time(void *objspace_ptr, VALUE flag); GC_IMPL_FN VALUE rb_gc_impl_get_measure_total_time(void *objspace_ptr); -GC_IMPL_FN VALUE rb_gc_impl_get_profile_total_time(void *objspace_ptr); +GC_IMPL_FN unsigned long long rb_gc_impl_get_profile_total_time(void *objspace_ptr); GC_IMPL_FN size_t rb_gc_impl_gc_count(void *objspace_ptr); GC_IMPL_FN VALUE rb_gc_impl_latest_gc_info(void *objspace_ptr, VALUE key); GC_IMPL_FN size_t rb_gc_impl_stat(void *objspace_ptr, VALUE hash_or_sym); From dc61c7fc7d64e9ad75f7e0ce0239d04a807f78d7 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Tue, 17 Sep 2024 11:41:01 -0400 Subject: [PATCH 338/829] Rename rb_gc_impl_get_profile_total_time to rb_gc_impl_get_total_time --- gc.c | 6 +++--- gc.rb | 2 +- gc/default.c | 2 +- gc/gc_impl.h | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/gc.c b/gc.c index f47f82e26bd997..87c613395da1c2 100644 --- a/gc.c +++ b/gc.c @@ -636,7 +636,7 @@ typedef struct gc_function_map { // Statistics VALUE (*set_measure_total_time)(void *objspace_ptr, VALUE flag); VALUE (*get_measure_total_time)(void *objspace_ptr); - unsigned long long (*get_profile_total_time)(void *objspace_ptr); + unsigned long long (*get_total_time)(void *objspace_ptr); size_t (*gc_count)(void *objspace_ptr); VALUE (*latest_gc_info)(void *objspace_ptr, VALUE key); size_t (*stat)(void *objspace_ptr, VALUE hash_or_sym); @@ -766,7 +766,7 @@ ruby_external_gc_init(void) // Statistics load_external_gc_func(set_measure_total_time); load_external_gc_func(get_measure_total_time); - load_external_gc_func(get_profile_total_time); + load_external_gc_func(get_total_time); load_external_gc_func(gc_count); load_external_gc_func(latest_gc_info); load_external_gc_func(stat); @@ -844,7 +844,7 @@ ruby_external_gc_init(void) // Statistics # define rb_gc_impl_set_measure_total_time rb_gc_functions.set_measure_total_time # define rb_gc_impl_get_measure_total_time rb_gc_functions.get_measure_total_time -# define rb_gc_impl_get_profile_total_time rb_gc_functions.get_profile_total_time +# define rb_gc_impl_get_total_time rb_gc_functions.get_total_time # define rb_gc_impl_gc_count rb_gc_functions.gc_count # define rb_gc_impl_latest_gc_info rb_gc_functions.latest_gc_info # define rb_gc_impl_stat rb_gc_functions.stat diff --git a/gc.rb b/gc.rb index 7b943f1d80ce05..4db1a178f9e8a7 100644 --- a/gc.rb +++ b/gc.rb @@ -352,7 +352,7 @@ def self.measure_total_time # Return measured \GC total time in nano seconds. def self.total_time Primitive.cexpr! %{ - ULL2NUM(rb_gc_impl_get_profile_total_time(rb_gc_get_objspace())) + ULL2NUM(rb_gc_impl_get_total_time(rb_gc_get_objspace())) } end end diff --git a/gc/default.c b/gc/default.c index 149eae5971073a..51bfb4b5e58fc7 100644 --- a/gc/default.c +++ b/gc/default.c @@ -1523,7 +1523,7 @@ rb_gc_impl_set_event_hook(void *objspace_ptr, const rb_event_flag_t event) } unsigned long long -rb_gc_impl_get_profile_total_time(void *objspace_ptr) +rb_gc_impl_get_total_time(void *objspace_ptr) { rb_objspace_t *objspace = objspace_ptr; diff --git a/gc/gc_impl.h b/gc/gc_impl.h index ec47c9fe7e3b9d..9f205976020ae2 100644 --- a/gc/gc_impl.h +++ b/gc/gc_impl.h @@ -87,7 +87,7 @@ GC_IMPL_FN VALUE rb_gc_impl_object_id_to_ref(void *objspace_ptr, VALUE object_id // Statistics GC_IMPL_FN VALUE rb_gc_impl_set_measure_total_time(void *objspace_ptr, VALUE flag); GC_IMPL_FN VALUE rb_gc_impl_get_measure_total_time(void *objspace_ptr); -GC_IMPL_FN unsigned long long rb_gc_impl_get_profile_total_time(void *objspace_ptr); +GC_IMPL_FN unsigned long long rb_gc_impl_get_total_time(void *objspace_ptr); GC_IMPL_FN size_t rb_gc_impl_gc_count(void *objspace_ptr); GC_IMPL_FN VALUE rb_gc_impl_latest_gc_info(void *objspace_ptr, VALUE key); GC_IMPL_FN size_t rb_gc_impl_stat(void *objspace_ptr, VALUE hash_or_sym); From b203e667c91960b732269b3dd182c422e1a0a74b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Tue, 17 Sep 2024 19:00:54 +0200 Subject: [PATCH 339/829] [rubygems/rubygems] Fix spelling, it's "cannot" rather than "can not" https://github.com/rubygems/rubygems/commit/3434f094a2 --- lib/bundler/cli/add.rb | 2 +- lib/rubygems/specification_policy.rb | 2 +- spec/bundler/commands/add_spec.rb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/bundler/cli/add.rb b/lib/bundler/cli/add.rb index 002d9e1d33bd69..2b300e178395a0 100644 --- a/lib/bundler/cli/add.rb +++ b/lib/bundler/cli/add.rb @@ -34,7 +34,7 @@ def inject_dependencies end def validate_options! - raise InvalidOption, "You can not specify `--strict` and `--optimistic` at the same time." if options[:strict] && options[:optimistic] + raise InvalidOption, "You cannot specify `--strict` and `--optimistic` at the same time." if options[:strict] && options[:optimistic] # raise error when no gems are specified raise InvalidOption, "Please specify gems to add." if gems.empty? diff --git a/lib/rubygems/specification_policy.rb b/lib/rubygems/specification_policy.rb index d7568ddde95006..d79ee7df9252ae 100644 --- a/lib/rubygems/specification_policy.rb +++ b/lib/rubygems/specification_policy.rb @@ -307,7 +307,7 @@ def validate_name elsif !VALID_NAME_PATTERN.match?(name) error "invalid value for attribute name: #{name.dump} can only include letters, numbers, dashes, and underscores" elsif SPECIAL_CHARACTERS.match?(name) - error "invalid value for attribute name: #{name.dump} can not begin with a period, dash, or underscore" + error "invalid value for attribute name: #{name.dump} cannot begin with a period, dash, or underscore" end end diff --git a/spec/bundler/commands/add_spec.rb b/spec/bundler/commands/add_spec.rb index 9eb9c876ca79b8..0a0d4c004653bd 100644 --- a/spec/bundler/commands/add_spec.rb +++ b/spec/bundler/commands/add_spec.rb @@ -304,7 +304,7 @@ it "throws error" do bundle "add 'foo' --strict --optimistic", raise_on_error: false - expect(err).to include("You can not specify `--strict` and `--optimistic` at the same time") + expect(err).to include("You cannot specify `--strict` and `--optimistic` at the same time") end end From 5307c65c76774f8a5964ccdb8ed94412962b5eaa Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Tue, 17 Sep 2024 10:41:47 -0400 Subject: [PATCH 340/829] Make rb_gc_impl_set_measure_total_time return void --- gc.c | 2 +- gc.rb | 3 ++- gc/default.c | 4 +--- gc/gc_impl.h | 2 +- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/gc.c b/gc.c index 87c613395da1c2..df3c263fc5c775 100644 --- a/gc.c +++ b/gc.c @@ -634,7 +634,7 @@ typedef struct gc_function_map { VALUE (*object_id)(void *objspace_ptr, VALUE obj); VALUE (*object_id_to_ref)(void *objspace_ptr, VALUE object_id); // Statistics - VALUE (*set_measure_total_time)(void *objspace_ptr, VALUE flag); + void (*set_measure_total_time)(void *objspace_ptr, VALUE flag); VALUE (*get_measure_total_time)(void *objspace_ptr); unsigned long long (*get_total_time)(void *objspace_ptr); size_t (*gc_count)(void *objspace_ptr); diff --git a/gc.rb b/gc.rb index 4db1a178f9e8a7..1482a6bd72af52 100644 --- a/gc.rb +++ b/gc.rb @@ -331,7 +331,8 @@ def self.latest_gc_info hash_or_key = nil # Note that \GC time measurement can cause some performance overhead. def self.measure_total_time=(flag) Primitive.cstmt! %{ - return rb_gc_impl_set_measure_total_time(rb_gc_get_objspace(), flag); + rb_gc_impl_set_measure_total_time(rb_gc_get_objspace(), flag); + return flag; } end diff --git a/gc/default.c b/gc/default.c index 51bfb4b5e58fc7..5eddeff0cf4bb7 100644 --- a/gc/default.c +++ b/gc/default.c @@ -1533,14 +1533,12 @@ rb_gc_impl_get_total_time(void *objspace_ptr) return marking_time + sweeping_time; } -VALUE +void rb_gc_impl_set_measure_total_time(void *objspace_ptr, VALUE flag) { rb_objspace_t *objspace = objspace_ptr; objspace->flags.measure_gc = RTEST(flag) ? TRUE : FALSE; - - return flag; } VALUE diff --git a/gc/gc_impl.h b/gc/gc_impl.h index 9f205976020ae2..5e6d29547704e2 100644 --- a/gc/gc_impl.h +++ b/gc/gc_impl.h @@ -85,7 +85,7 @@ GC_IMPL_FN void rb_gc_impl_shutdown_call_finalizer(void *objspace_ptr); GC_IMPL_FN VALUE rb_gc_impl_object_id(void *objspace_ptr, VALUE obj); GC_IMPL_FN VALUE rb_gc_impl_object_id_to_ref(void *objspace_ptr, VALUE object_id); // Statistics -GC_IMPL_FN VALUE rb_gc_impl_set_measure_total_time(void *objspace_ptr, VALUE flag); +GC_IMPL_FN void rb_gc_impl_set_measure_total_time(void *objspace_ptr, VALUE flag); GC_IMPL_FN VALUE rb_gc_impl_get_measure_total_time(void *objspace_ptr); GC_IMPL_FN unsigned long long rb_gc_impl_get_total_time(void *objspace_ptr); GC_IMPL_FN size_t rb_gc_impl_gc_count(void *objspace_ptr); From 39679d7fabca7fe0918b538e746d5d4381862bce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Tue, 17 Sep 2024 19:06:40 +0200 Subject: [PATCH 341/829] [ruby/uri] Fix spelling of "cannot" https://github.com/ruby/uri/commit/77241d6508 --- lib/uri/file.rb | 6 +++--- lib/uri/generic.rb | 20 ++++++++++---------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/lib/uri/file.rb b/lib/uri/file.rb index 4ff0bc097e7c96..940d361af89f1d 100644 --- a/lib/uri/file.rb +++ b/lib/uri/file.rb @@ -70,17 +70,17 @@ def set_port(v) # raise InvalidURIError def check_userinfo(user) - raise URI::InvalidURIError, "can not set userinfo for file URI" + raise URI::InvalidURIError, "cannot set userinfo for file URI" end # raise InvalidURIError def check_user(user) - raise URI::InvalidURIError, "can not set user for file URI" + raise URI::InvalidURIError, "cannot set user for file URI" end # raise InvalidURIError def check_password(user) - raise URI::InvalidURIError, "can not set password for file URI" + raise URI::InvalidURIError, "cannot set password for file URI" end # do nothing diff --git a/lib/uri/generic.rb b/lib/uri/generic.rb index 7b48c9b9b8fd98..d4bfa3b91963ae 100644 --- a/lib/uri/generic.rb +++ b/lib/uri/generic.rb @@ -393,7 +393,7 @@ def check_userinfo(user, password = nil) def check_user(v) if @opaque raise InvalidURIError, - "can not set user with opaque" + "cannot set user with opaque" end return v unless v @@ -417,7 +417,7 @@ def check_user(v) def check_password(v, user = @user) if @opaque raise InvalidURIError, - "can not set password with opaque" + "cannot set password with opaque" end return v unless v @@ -596,7 +596,7 @@ def check_host(v) if @opaque raise InvalidURIError, - "can not set host with registry or opaque" + "cannot set host with registry or opaque" elsif parser.regexp[:HOST] !~ v raise InvalidComponentError, "bad component(expected host component): #{v}" @@ -685,7 +685,7 @@ def check_port(v) if @opaque raise InvalidURIError, - "can not set port with registry or opaque" + "cannot set port with registry or opaque" elsif !v.kind_of?(Integer) && parser.regexp[:PORT] !~ v raise InvalidComponentError, "bad component(expected port component): #{v.inspect}" @@ -733,17 +733,17 @@ def port=(v) end def check_registry(v) # :nodoc: - raise InvalidURIError, "can not set registry" + raise InvalidURIError, "cannot set registry" end private :check_registry def set_registry(v) #:nodoc: - raise InvalidURIError, "can not set registry" + raise InvalidURIError, "cannot set registry" end protected :set_registry def registry=(v) - raise InvalidURIError, "can not set registry" + raise InvalidURIError, "cannot set registry" end # @@ -866,7 +866,7 @@ def check_opaque(v) # hier_part = ( net_path | abs_path ) [ "?" query ] if @host || @port || @user || @path # userinfo = @user + ':' + @password raise InvalidURIError, - "can not set opaque with host, port, userinfo or path" + "cannot set opaque with host, port, userinfo or path" elsif v && parser.regexp[:OPAQUE] !~ v raise InvalidComponentError, "bad component(expected opaque component): #{v}" @@ -1235,7 +1235,7 @@ def route_from0(oth) return rel, rel end - # you can modify `rel', but can not `oth'. + # you can modify `rel', but cannot `oth'. return oth, rel end private :route_from0 @@ -1260,7 +1260,7 @@ def route_from0(oth) # #=> # # def route_from(oth) - # you can modify `rel', but can not `oth'. + # you can modify `rel', but cannot `oth'. begin oth, rel = route_from0(oth) rescue From 7c4b028435aa83ee42f3db2ecf47f53a1c2247cf Mon Sep 17 00:00:00 2001 From: Randy Stauner Date: Tue, 17 Sep 2024 17:06:27 -0700 Subject: [PATCH 342/829] YJIT: Accept key for runtime_stats to return only that stat (#11536) --- test/ruby/test_yjit.rb | 35 +++++++++++++ yjit.c | 2 +- yjit.rb | 8 ++- yjit/src/stats.rs | 114 +++++++++++++++++++++++------------------ 4 files changed, 106 insertions(+), 53 deletions(-) diff --git a/test/ruby/test_yjit.rb b/test/ruby/test_yjit.rb index 96a6100717d039..c91d6312560ec6 100644 --- a/test/ruby/test_yjit.rb +++ b/test/ruby/test_yjit.rb @@ -1638,6 +1638,41 @@ def test = :ok RUBY end + def test_runtime_stats_key_arg + assert_compiles(<<~'RUBY', exits: :any, result: true) + def test = :ok + 3.times { test } + + # Collect single stat. + stat = RubyVM::YJIT.runtime_stats(:ratio_in_yjit) + + # Ensure this invocation had stats. + return true unless RubyVM::YJIT.runtime_stats[:all_stats] + + stat > 0.0 + RUBY + end + + def test_runtime_stats_arg_error + assert_compiles(<<~'RUBY', exits: :any, result: true) + begin + RubyVM::YJIT.runtime_stats(Object.new) + :no_error + rescue TypeError => e + e.message == "non-symbol given" + end + RUBY + end + + def test_runtime_stats_unknown_key + assert_compiles(<<~'RUBY', exits: :any, result: true) + def test = :ok + 3.times { test } + + RubyVM::YJIT.runtime_stats(:some_key_unlikely_to_exist).nil? + RUBY + end + private def code_gc_helpers diff --git a/yjit.c b/yjit.c index fe2301a1a6720f..dedd06dd2ddf19 100644 --- a/yjit.c +++ b/yjit.c @@ -1227,7 +1227,7 @@ rb_yjit_set_exception_return(rb_control_frame_t *cfp, void *leave_exit, void *le VALUE rb_yjit_stats_enabled_p(rb_execution_context_t *ec, VALUE self); VALUE rb_yjit_print_stats_p(rb_execution_context_t *ec, VALUE self); VALUE rb_yjit_trace_exit_locations_enabled_p(rb_execution_context_t *ec, VALUE self); -VALUE rb_yjit_get_stats(rb_execution_context_t *ec, VALUE self); +VALUE rb_yjit_get_stats(rb_execution_context_t *ec, VALUE self, VALUE key); VALUE rb_yjit_reset_stats_bang(rb_execution_context_t *ec, VALUE self); VALUE rb_yjit_disasm_iseq(rb_execution_context_t *ec, VALUE self, VALUE iseq); VALUE rb_yjit_insns_compiled(rb_execution_context_t *ec, VALUE self, VALUE iseq); diff --git a/yjit.rb b/yjit.rb index 7630db30165160..5483e39bf3e7cf 100644 --- a/yjit.rb +++ b/yjit.rb @@ -155,8 +155,12 @@ def self.dump_exit_locations(filename) # Return a hash for statistics generated for the `--yjit-stats` command line option. # Return `nil` when option is not passed or unavailable. - def self.runtime_stats() - Primitive.rb_yjit_get_stats + # If a symbol argument is provided, return only the value for the named stat. + # If any other type is provided, raises TypeError. + def self.runtime_stats(key = nil) + raise TypeError, "non-symbol given" unless key.nil? || Symbol === key + + Primitive.rb_yjit_get_stats(key) end # Format and print out counters as a String. This returns a non-empty diff --git a/yjit/src/stats.rs b/yjit/src/stats.rs index 37ef02b440e201..7cfb4e5ae1ea5d 100644 --- a/yjit/src/stats.rs +++ b/yjit/src/stats.rs @@ -650,8 +650,8 @@ pub extern "C" fn rb_yjit_print_stats_p(_ec: EcPtr, _ruby_self: VALUE) -> VALUE /// Primitive called in yjit.rb. /// Export all YJIT statistics as a Ruby hash. #[no_mangle] -pub extern "C" fn rb_yjit_get_stats(_ec: EcPtr, _ruby_self: VALUE) -> VALUE { - with_vm_lock(src_loc!(), || rb_yjit_gen_stats_dict()) +pub extern "C" fn rb_yjit_get_stats(_ec: EcPtr, _ruby_self: VALUE, key: VALUE) -> VALUE { + with_vm_lock(src_loc!(), || rb_yjit_gen_stats_dict(key)) } /// Primitive called in yjit.rb @@ -709,25 +709,41 @@ pub extern "C" fn rb_yjit_incr_counter(counter_name: *const std::os::raw::c_char unsafe { *counter_ptr += 1 }; } -fn hash_aset_usize(hash: VALUE, key: &str, value: usize) { - let rb_key = rust_str_to_sym(key); - let rb_value = VALUE::fixnum_from_usize(value); - unsafe { rb_hash_aset(hash, rb_key, rb_value); } -} - -fn hash_aset_double(hash: VALUE, key: &str, value: f64) { - let rb_key = rust_str_to_sym(key); - unsafe { rb_hash_aset(hash, rb_key, rb_float_new(value)); } -} - /// Export all YJIT statistics as a Ruby hash. -fn rb_yjit_gen_stats_dict() -> VALUE { +fn rb_yjit_gen_stats_dict(key: VALUE) -> VALUE { // If YJIT is not enabled, return Qnil if !yjit_enabled_p() { return Qnil; } - let hash = unsafe { rb_hash_new() }; + let hash = if key == Qnil { + unsafe { rb_hash_new() } + } else { + Qnil + }; + + macro_rules! set_stat { + ($hash:ident, $name:expr, $value:expr) => { + let rb_key = rust_str_to_sym($name); + if key == rb_key { + return $value; + } else if hash != Qnil { + rb_hash_aset($hash, rb_key, $value); + } + } + } + + macro_rules! set_stat_usize { + ($hash:ident, $name:expr, $value:expr) => { + set_stat!($hash, $name, VALUE::fixnum_from_usize($value)); + } + } + + macro_rules! set_stat_double { + ($hash:ident, $name:expr, $value:expr) => { + set_stat!($hash, $name, rb_float_new($value)); + } + } unsafe { // Get the inline and outlined code blocks @@ -735,39 +751,39 @@ fn rb_yjit_gen_stats_dict() -> VALUE { let ocb = CodegenGlobals::get_outlined_cb(); // Inline code size - hash_aset_usize(hash, "inline_code_size", cb.code_size()); + set_stat_usize!(hash, "inline_code_size", cb.code_size()); // Outlined code size - hash_aset_usize(hash, "outlined_code_size", ocb.unwrap().code_size()); + set_stat_usize!(hash, "outlined_code_size", ocb.unwrap().code_size()); // GCed pages let freed_page_count = cb.num_freed_pages(); - hash_aset_usize(hash, "freed_page_count", freed_page_count); + set_stat_usize!(hash, "freed_page_count", freed_page_count); // GCed code size - hash_aset_usize(hash, "freed_code_size", freed_page_count * cb.page_size()); + set_stat_usize!(hash, "freed_code_size", freed_page_count * cb.page_size()); // Live pages - hash_aset_usize(hash, "live_page_count", cb.num_mapped_pages() - freed_page_count); + set_stat_usize!(hash, "live_page_count", cb.num_mapped_pages() - freed_page_count); // Size of memory region allocated for JIT code - hash_aset_usize(hash, "code_region_size", cb.mapped_region_size()); + set_stat_usize!(hash, "code_region_size", cb.mapped_region_size()); // Rust global allocations in bytes - hash_aset_usize(hash, "yjit_alloc_size", GLOBAL_ALLOCATOR.alloc_size.load(Ordering::SeqCst)); + set_stat_usize!(hash, "yjit_alloc_size", GLOBAL_ALLOCATOR.alloc_size.load(Ordering::SeqCst)); // How many bytes we are using to store context data let context_data = CodegenGlobals::get_context_data(); - hash_aset_usize(hash, "context_data_bytes", context_data.num_bytes()); - hash_aset_usize(hash, "context_cache_bytes", crate::core::CTX_CACHE_BYTES); + set_stat_usize!(hash, "context_data_bytes", context_data.num_bytes()); + set_stat_usize!(hash, "context_cache_bytes", crate::core::CTX_CACHE_BYTES); // VM instructions count - hash_aset_usize(hash, "vm_insns_count", rb_vm_insns_count as usize); + set_stat_usize!(hash, "vm_insns_count", rb_vm_insns_count as usize); - hash_aset_usize(hash, "live_iseq_count", rb_yjit_live_iseq_count as usize); - hash_aset_usize(hash, "iseq_alloc_count", rb_yjit_iseq_alloc_count as usize); + set_stat_usize!(hash, "live_iseq_count", rb_yjit_live_iseq_count as usize); + set_stat_usize!(hash, "iseq_alloc_count", rb_yjit_iseq_alloc_count as usize); - rb_hash_aset(hash, rust_str_to_sym("object_shape_count"), rb_object_shape_count()); + set_stat!(hash, "object_shape_count", rb_object_shape_count()); } // If we're not generating stats, put only default counters @@ -778,9 +794,9 @@ fn rb_yjit_gen_stats_dict() -> VALUE { let counter_val = unsafe { *counter_ptr }; // Put counter into hash - let key = rust_str_to_sym(&counter.get_name()); + let key = &counter.get_name(); let value = VALUE::fixnum_from_usize(counter_val as usize); - unsafe { rb_hash_aset(hash, key, value); } + unsafe { set_stat!(hash, key, value); } } return hash; @@ -788,18 +804,14 @@ fn rb_yjit_gen_stats_dict() -> VALUE { unsafe { // Indicate that the complete set of stats is available - rb_hash_aset(hash, rust_str_to_sym("all_stats"), Qtrue); + set_stat!(hash, "all_stats", Qtrue); // For each counter we track for counter_name in COUNTER_NAMES { // Get the counter value let counter_ptr = get_counter_ptr(counter_name); let counter_val = *counter_ptr; - - // Put counter into hash - let key = rust_str_to_sym(counter_name); - let value = VALUE::fixnum_from_usize(counter_val as usize); - rb_hash_aset(hash, key, value); + set_stat_usize!(hash, counter_name, counter_val as usize); } let mut side_exits = 0; @@ -809,17 +821,15 @@ fn rb_yjit_gen_stats_dict() -> VALUE { for op_idx in 0..VM_INSTRUCTION_SIZE_USIZE { let op_name = insn_name(op_idx); let key_string = "exit_".to_owned() + &op_name; - let key = rust_str_to_sym(&key_string); let count = EXIT_OP_COUNT[op_idx]; side_exits += count; - let value = VALUE::fixnum_from_usize(count as usize); - rb_hash_aset(hash, key, value); + set_stat_usize!(hash, &key_string, count as usize); } - hash_aset_usize(hash, "side_exit_count", side_exits as usize); + set_stat_usize!(hash, "side_exit_count", side_exits as usize); let total_exits = side_exits + *get_counter_ptr(&Counter::leave_interp_return.get_name()); - hash_aset_usize(hash, "total_exit_count", total_exits as usize); + set_stat_usize!(hash, "total_exit_count", total_exits as usize); // Number of instructions that finish executing in YJIT. // See :count-placement: about the subtraction. @@ -831,14 +841,14 @@ fn rb_yjit_gen_stats_dict() -> VALUE { } else { 0_f64 }; - hash_aset_double(hash, "avg_len_in_yjit", avg_len_in_yjit); + set_stat_double!(hash, "avg_len_in_yjit", avg_len_in_yjit); // Proportion of instructions that retire in YJIT let total_insns_count = retired_in_yjit + rb_vm_insns_count; - hash_aset_usize(hash, "total_insns_count", total_insns_count as usize); + set_stat_usize!(hash, "total_insns_count", total_insns_count as usize); let ratio_in_yjit: f64 = 100.0 * retired_in_yjit as f64 / total_insns_count as f64; - hash_aset_double(hash, "ratio_in_yjit", ratio_in_yjit); + set_stat_double!(hash, "ratio_in_yjit", ratio_in_yjit); // Set method call counts in a Ruby dict fn set_call_counts( @@ -871,14 +881,18 @@ fn rb_yjit_gen_stats_dict() -> VALUE { } // Create a hash for the cfunc call counts - let cfunc_calls = rb_hash_new(); - rb_hash_aset(hash, rust_str_to_sym("cfunc_calls"), cfunc_calls); - set_call_counts(cfunc_calls, &mut *addr_of_mut!(CFUNC_NAME_TO_IDX), &mut *addr_of_mut!(CFUNC_CALL_COUNT)); + set_stat!(hash, "cfunc_calls", { + let cfunc_calls = rb_hash_new(); + set_call_counts(cfunc_calls, &mut *addr_of_mut!(CFUNC_NAME_TO_IDX), &mut *addr_of_mut!(CFUNC_CALL_COUNT)); + cfunc_calls + }); // Create a hash for the ISEQ call counts - let iseq_calls = rb_hash_new(); - rb_hash_aset(hash, rust_str_to_sym("iseq_calls"), iseq_calls); - set_call_counts(iseq_calls, &mut *addr_of_mut!(ISEQ_NAME_TO_IDX), &mut *addr_of_mut!(ISEQ_CALL_COUNT)); + set_stat!(hash, "iseq_calls", { + let iseq_calls = rb_hash_new(); + set_call_counts(iseq_calls, &mut *addr_of_mut!(ISEQ_NAME_TO_IDX), &mut *addr_of_mut!(ISEQ_CALL_COUNT)); + iseq_calls + }); } hash From 94a17f32796955750b6ccd63f3a6bbdaec8997e6 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Tue, 17 Sep 2024 13:53:41 +0900 Subject: [PATCH 343/829] Detect existing Visual Studio instances using `vswhere.exe` https://learn.microsoft.com/en-us/visualstudio/install/tools-for-managing-visual-studio-instances?view=vs-2022#using-vswhereexe > `vswhere.exe` is automatically included in Visual Studio 2017 and > later --- .github/workflows/windows.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 190710d745bf82..88ea2a183e7c26 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -117,9 +117,12 @@ jobs: # %TEMP% is inconsistent with %TMP% and test-all expects they are consistent. # https://github.com/actions/virtual-environments/issues/712#issuecomment-613004302 run: | - set VS=${{ matrix.vs }} - set VCVARS="C:\Program Files (x86)\Microsoft Visual Studio\%VS%\Enterprise\VC\Auxiliary\Build\vcvars64.bat" - if not exist %VCVARS% set VCVARS="C:\Program Files\Microsoft Visual Studio\%VS%\Enterprise\VC\Auxiliary\Build\vcvars64.bat" + ::- Set up VC ${{ matrix.vc || matrix.vs }} + set vswhere="%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" + for /f "delims=;" %%I in ('%vswhere% -latest -property installationPath') do ( + set VCVARS="%%I\VC\Auxiliary\Build\vcvars64.bat" + ) + set VCVARS set | C:\msys64\usr\bin\sort > old.env call %VCVARS% ${{ matrix.vcvars || '' }} nmake -f nul From 4797b0704ae49fb42c8ad9a45028efbe2298b5f5 Mon Sep 17 00:00:00 2001 From: Yusuke Endoh Date: Wed, 18 Sep 2024 11:16:22 +0900 Subject: [PATCH 344/829] Prevent a warning (retry) ``` test/ruby/test_case.rb:75: warning: 'when' clause on line 75 duplicates 'when' clause on line 75 and is ignored ``` --- test/ruby/test_case.rb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/test/ruby/test_case.rb b/test/ruby/test_case.rb index 3725fb49bbafc3..9e8502fb275ab5 100644 --- a/test/ruby/test_case.rb +++ b/test/ruby/test_case.rb @@ -71,9 +71,7 @@ def test_case begin verbose_bak, $VERBOSE = $VERBOSE, nil assert_raise(NameError) do - case - when false, *x, false - end + eval("case; when false, *x, false; end") end ensure $VERBOSE = verbose_bak From f82618578666ee720bdc0ec8e4aeace541f2d953 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Wed, 18 Sep 2024 21:03:48 +0900 Subject: [PATCH 345/829] [Bug #20754] Document in hash.rb --- .document | 1 + 1 file changed, 1 insertion(+) diff --git a/.document b/.document index 0665d415b9ba89..b6dfcdeee055f8 100644 --- a/.document +++ b/.document @@ -15,6 +15,7 @@ array.rb ast.rb dir.rb gc.rb +hash.rb io.rb kernel.rb marshal.rb From 5df5eba465762880e50fb17bffb5ab8030fd5557 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Tue, 17 Sep 2024 10:55:42 -0400 Subject: [PATCH 346/829] Change rb_gc_impl_get_measure_total_time to return a bool --- gc.c | 2 +- gc.rb | 2 +- gc/default.c | 4 ++-- gc/gc_impl.h | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/gc.c b/gc.c index df3c263fc5c775..e02f9b136fca18 100644 --- a/gc.c +++ b/gc.c @@ -635,7 +635,7 @@ typedef struct gc_function_map { VALUE (*object_id_to_ref)(void *objspace_ptr, VALUE object_id); // Statistics void (*set_measure_total_time)(void *objspace_ptr, VALUE flag); - VALUE (*get_measure_total_time)(void *objspace_ptr); + bool (*get_measure_total_time)(void *objspace_ptr); unsigned long long (*get_total_time)(void *objspace_ptr); size_t (*gc_count)(void *objspace_ptr); VALUE (*latest_gc_info)(void *objspace_ptr, VALUE key); diff --git a/gc.rb b/gc.rb index 1482a6bd72af52..f2790ef85d893d 100644 --- a/gc.rb +++ b/gc.rb @@ -343,7 +343,7 @@ def self.measure_total_time=(flag) # Note that measurement can affect the application performance. def self.measure_total_time Primitive.cexpr! %{ - rb_gc_impl_get_measure_total_time(rb_gc_get_objspace()) + RBOOL(rb_gc_impl_get_measure_total_time(rb_gc_get_objspace())) } end diff --git a/gc/default.c b/gc/default.c index 5eddeff0cf4bb7..f5893a81194ef6 100644 --- a/gc/default.c +++ b/gc/default.c @@ -1541,12 +1541,12 @@ rb_gc_impl_set_measure_total_time(void *objspace_ptr, VALUE flag) objspace->flags.measure_gc = RTEST(flag) ? TRUE : FALSE; } -VALUE +bool rb_gc_impl_get_measure_total_time(void *objspace_ptr) { rb_objspace_t *objspace = objspace_ptr; - return objspace->flags.measure_gc ? Qtrue : Qfalse; + return objspace->flags.measure_gc; } static size_t diff --git a/gc/gc_impl.h b/gc/gc_impl.h index 5e6d29547704e2..c83e8ce28de23c 100644 --- a/gc/gc_impl.h +++ b/gc/gc_impl.h @@ -86,7 +86,7 @@ GC_IMPL_FN VALUE rb_gc_impl_object_id(void *objspace_ptr, VALUE obj); GC_IMPL_FN VALUE rb_gc_impl_object_id_to_ref(void *objspace_ptr, VALUE object_id); // Statistics GC_IMPL_FN void rb_gc_impl_set_measure_total_time(void *objspace_ptr, VALUE flag); -GC_IMPL_FN VALUE rb_gc_impl_get_measure_total_time(void *objspace_ptr); +GC_IMPL_FN bool rb_gc_impl_get_measure_total_time(void *objspace_ptr); GC_IMPL_FN unsigned long long rb_gc_impl_get_total_time(void *objspace_ptr); GC_IMPL_FN size_t rb_gc_impl_gc_count(void *objspace_ptr); GC_IMPL_FN VALUE rb_gc_impl_latest_gc_info(void *objspace_ptr, VALUE key); From 96da3f16a0e4ad9c14197d5ed794cecf1abf9546 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Tue, 17 Sep 2024 14:10:10 -0400 Subject: [PATCH 347/829] [ruby/prism] Allow returns in default parameter values https://github.com/ruby/prism/commit/e98ea15596 --- prism/prism.c | 2 +- test/prism/fixtures/methods.txt | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/prism/prism.c b/prism/prism.c index 73f33a4ebfc8b4..54061d157d494d 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -15446,7 +15446,6 @@ parse_return(pm_parser_t *parser, pm_node_t *node) { case PM_CONTEXT_CASE_IN: case PM_CONTEXT_CASE_WHEN: case PM_CONTEXT_DEFAULT_PARAMS: - case PM_CONTEXT_DEF_PARAMS: case PM_CONTEXT_DEFINED: case PM_CONTEXT_ELSE: case PM_CONTEXT_ELSIF: @@ -15492,6 +15491,7 @@ parse_return(pm_parser_t *parser, pm_node_t *node) { case PM_CONTEXT_BLOCK_RESCUE: case PM_CONTEXT_DEF_ELSE: case PM_CONTEXT_DEF_ENSURE: + case PM_CONTEXT_DEF_PARAMS: case PM_CONTEXT_DEF_RESCUE: case PM_CONTEXT_DEF: case PM_CONTEXT_LAMBDA_BRACES: diff --git a/test/prism/fixtures/methods.txt b/test/prism/fixtures/methods.txt index 4bfd976edaa741..d59196bdfdf6f5 100644 --- a/test/prism/fixtures/methods.txt +++ b/test/prism/fixtures/methods.txt @@ -181,3 +181,8 @@ end def foo(bar = (def baz(bar) = bar; 1)) = 2 def (class Foo; end).foo(bar = 1) = 2 + +module Foo + def clone(opts = nil || (return self)) + end +end From c14b60630d680addd5b4ef9c9b159a26a5446483 Mon Sep 17 00:00:00 2001 From: Luke Gruber Date: Fri, 13 Sep 2024 12:42:56 -0400 Subject: [PATCH 348/829] Fix coding issue in prism_compile.c Make sure to set back `ISEQ_COMPILE_DATA(iseq)->current_block` for forwarding super nodes with a block. Fixes [Bug #20740] --- prism_compile.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/prism_compile.c b/prism_compile.c index 03aff092599dbd..044ef5083d624c 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -8057,6 +8057,9 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, PUSH_GETLOCAL(ret, location, mult_local.index, mult_local.level); PUSH_INSN2(ret, location, invokesuperforward, new_callinfo(iseq, 0, 0, flag, NULL, block != NULL), block); if (popped) PUSH_INSN(ret, location, pop); + if (cast->block) { + ISEQ_COMPILE_DATA(iseq)->current_block = previous_block; + } return; } From 47db8bc01cac3b0008de62a0f6300ec00acef9b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Fri, 13 Sep 2024 11:14:00 +0200 Subject: [PATCH 349/829] [rubygems/rubygems] Stop fighting with ourselves https://github.com/rubygems/rubygems/commit/7cf2fdcfa1 --- lib/bundler/rubygems_ext.rb | 5 ----- lib/rubygems/specification.rb | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/lib/bundler/rubygems_ext.rb b/lib/bundler/rubygems_ext.rb index d4cc4f62167116..0f0680560a00d6 100644 --- a/lib/bundler/rubygems_ext.rb +++ b/lib/bundler/rubygems_ext.rb @@ -123,11 +123,6 @@ def extension_dir end end - remove_method :gem_dir - def gem_dir - full_gem_path - end - unless const_defined?(:LATEST_RUBY_WITHOUT_PATCH_VERSIONS) LATEST_RUBY_WITHOUT_PATCH_VERSIONS = Gem::Version.new("2.1") diff --git a/lib/rubygems/specification.rb b/lib/rubygems/specification.rb index 594d882c6b6c05..96e05a54b6857f 100644 --- a/lib/rubygems/specification.rb +++ b/lib/rubygems/specification.rb @@ -1913,7 +1913,7 @@ def full_name end ## - # Work around bundler removing my methods + # Work around old bundler versions removing my methods def gem_dir # :nodoc: super From ae214be9d678756c5af26fd9161f03ee8340e1c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Fri, 13 Sep 2024 11:14:53 +0200 Subject: [PATCH 350/829] [rubygems/rubygems] Fix TODO https://github.com/rubygems/rubygems/commit/2cd13005f6 --- lib/rubygems/basic_specification.rb | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/lib/rubygems/basic_specification.rb b/lib/rubygems/basic_specification.rb index 0eee52492f08e7..b76716acf5456e 100644 --- a/lib/rubygems/basic_specification.rb +++ b/lib/rubygems/basic_specification.rb @@ -139,11 +139,11 @@ def find_full_gem_path # :nodoc: # The full path to the gem (install path + full name). def full_gem_path - # TODO: This is a heavily used method by gems, so we'll need - # to aleast just alias it to #gem_dir rather than remove it. @full_gem_path ||= find_full_gem_path end + alias_method :gem_dir, :full_gem_path + ## # Returns the full name (name-version) of this Gem. Platform information # is included (name-version-platform) if it is specified and not the @@ -213,14 +213,6 @@ def to_fullpath(path) end end - ## - # Returns the full path to this spec's gem directory. - # eg: /usr/local/lib/ruby/1.8/gems/mygem-1.0 - - def gem_dir - @gem_dir ||= File.expand_path File.join(gems_dir, full_name) - end - ## # Returns the full path to the gems directory containing this spec's # gem directory. eg: /usr/local/lib/ruby/1.8/gems From 461c48960da24fbc47735b47814a6b175c107209 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Fri, 13 Sep 2024 19:22:58 +0200 Subject: [PATCH 351/829] [rubygems/rubygems] Add a note about when hack can be removed https://github.com/rubygems/rubygems/commit/058b29fe98 --- lib/rubygems/specification.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/rubygems/specification.rb b/lib/rubygems/specification.rb index 96e05a54b6857f..38986d56330f83 100644 --- a/lib/rubygems/specification.rb +++ b/lib/rubygems/specification.rb @@ -1914,6 +1914,7 @@ def full_name ## # Work around old bundler versions removing my methods + # Can be removed once RubyGems can no longer install Bundler 2.5 def gem_dir # :nodoc: super From f8e1c93fe1433b039caa48f87440a938781c00fc Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Tue, 17 Sep 2024 10:33:47 -0400 Subject: [PATCH 352/829] Move more of GC.latest_gc_info into Ruby --- gc.c | 13 ------------- gc.rb | 10 +++++++++- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/gc.c b/gc.c index e02f9b136fca18..9d59163ee0b728 100644 --- a/gc.c +++ b/gc.c @@ -3375,19 +3375,6 @@ rb_gc_latest_gc_info(VALUE key) return rb_gc_impl_latest_gc_info(rb_gc_get_objspace(), key); } -static VALUE -gc_latest_gc_info(rb_execution_context_t *ec, VALUE self, VALUE arg) -{ - if (NIL_P(arg)) { - arg = rb_hash_new(); - } - else if (!SYMBOL_P(arg) && !RB_TYPE_P(arg, T_HASH)) { - rb_raise(rb_eTypeError, "non-hash or symbol given"); - } - - return rb_gc_latest_gc_info(arg); -} - static VALUE gc_stat(rb_execution_context_t *ec, VALUE self, VALUE arg) // arg is (nil || hash || symbol) { diff --git a/gc.rb b/gc.rb index f2790ef85d893d..ce5f3ffff6ca1a 100644 --- a/gc.rb +++ b/gc.rb @@ -320,7 +320,15 @@ def self.config hash = nil # it is overwritten and returned. # This is intended to avoid probe effect. def self.latest_gc_info hash_or_key = nil - Primitive.gc_latest_gc_info hash_or_key + if hash_or_key == nil + hash_or_key = {} + elsif Primitive.cexpr!("RBOOL(!SYMBOL_P(hash_or_key) && !RB_TYPE_P(hash_or_key, T_HASH))") + raise TypeError, "non-hash or symbol given" + end + + Primitive.cstmt! %{ + return rb_gc_latest_gc_info(hash_or_key); + } end # call-seq: From 07d3bf4832532ae7446c9a6924d79aed60a7a9a5 Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Wed, 18 Sep 2024 11:18:29 -0700 Subject: [PATCH 353/829] Fix evaluation order issue in f(**h, &h.delete(key)) Previously, this would delete the key in h before keyword splatting h. This goes against how ruby handles f(*a, &a.pop) and similar expressions. Fix this by having the compiler check whether the block pass expression is safe. If it is not safe, then dup the keyword splatted hash before evaluating the block pass expression. For expression: `h=nil; f(**h, &h.delete(:key))` VM instructions before: ``` 0000 putnil ( 1)[Li] 0001 setlocal_WC_0 h@0 0003 putself 0004 getlocal_WC_0 h@0 0006 getlocal_WC_0 h@0 0008 putobject :key 0010 opt_send_without_block 0012 splatkw 0013 send , nil 0016 leave ``` VM instructions after: ``` 0000 putnil ( 1)[Li] 0001 setlocal_WC_0 h@0 0003 putself 0004 putspecialobject 1 0006 newhash 0 0008 getlocal_WC_0 h@0 0010 opt_send_without_block 0012 getlocal_WC_0 h@0 0014 putobject :key 0016 opt_send_without_block 0018 send , nil 0021 leave ``` Fixes [Bug #20640] --- compile.c | 54 +++++++++++++++++++++++++++++++----------- prism_compile.c | 40 ++++++++++++++++++++++--------- test/ruby/test_call.rb | 15 ++++++++++++ 3 files changed, 84 insertions(+), 25 deletions(-) diff --git a/compile.c b/compile.c index 3be7808a8d311e..a0754306c9f5e1 100644 --- a/compile.c +++ b/compile.c @@ -6284,6 +6284,21 @@ keyword_node_single_splat_p(NODE *kwnode) RNODE_LIST(RNODE_LIST(node)->nd_next)->nd_next == NULL; } +static void +compile_single_keyword_splat_mutable(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn, + NODE *kwnode, unsigned int *flag_ptr) +{ + *flag_ptr |= VM_CALL_KW_SPLAT_MUT; + ADD_INSN1(args, argn, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); + ADD_INSN1(args, argn, newhash, INT2FIX(0)); + compile_hash(iseq, args, kwnode, TRUE, FALSE); + ADD_SEND(args, argn, id_core_hash_merge_kwd, INT2FIX(2)); +} + +#define SPLATARRAY_FALSE 0 +#define SPLATARRAY_TRUE 1 +#define DUP_SINGLE_KW_SPLAT 2 + static int setup_args_core(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn, unsigned int *dup_rest, unsigned int *flag_ptr, struct rb_callinfo_kwarg **kwarg_ptr) @@ -6303,7 +6318,12 @@ setup_args_core(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn, len -= 1; } else { - compile_hash(iseq, args, kwnode, TRUE, FALSE); + if (keyword_node_single_splat_p(kwnode) && (*dup_rest & DUP_SINGLE_KW_SPLAT)) { + compile_single_keyword_splat_mutable(iseq, args, argn, kwnode, flag_ptr); + } + else { + compile_hash(iseq, args, kwnode, TRUE, FALSE); + } } } @@ -6312,8 +6332,8 @@ setup_args_core(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn, case NODE_SPLAT: { // f(*a) NO_CHECK(COMPILE(args, "args (splat)", RNODE_SPLAT(argn)->nd_head)); - ADD_INSN1(args, argn, splatarray, RBOOL(*dup_rest)); - if (*dup_rest) *dup_rest = 0; + ADD_INSN1(args, argn, splatarray, RBOOL(*dup_rest & SPLATARRAY_TRUE)); + if (*dup_rest & SPLATARRAY_TRUE) *dup_rest &= ~SPLATARRAY_TRUE; if (flag_ptr) *flag_ptr |= VM_CALL_ARGS_SPLAT; RUBY_ASSERT(flag_ptr == NULL || (*flag_ptr & VM_CALL_KW_SPLAT) == 0); return 1; @@ -6335,8 +6355,8 @@ setup_args_core(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn, } if (nd_type_p(RNODE_ARGSCAT(argn)->nd_head, NODE_LIST)) { - ADD_INSN1(args, argn, splatarray, RBOOL(*dup_rest)); - if (*dup_rest) *dup_rest = 0; + ADD_INSN1(args, argn, splatarray, RBOOL(*dup_rest & SPLATARRAY_TRUE)); + if (*dup_rest & SPLATARRAY_TRUE) *dup_rest &= ~SPLATARRAY_TRUE; argc += 1; } else if (!args_pushed) { @@ -6378,8 +6398,14 @@ setup_args_core(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn, *flag_ptr |= VM_CALL_KW_SPLAT; if (!keyword_node_single_splat_p(kwnode)) { *flag_ptr |= VM_CALL_KW_SPLAT_MUT; + compile_hash(iseq, args, kwnode, TRUE, FALSE); + } + else if (*dup_rest & DUP_SINGLE_KW_SPLAT) { + compile_single_keyword_splat_mutable(iseq, args, argn, kwnode, flag_ptr); + } + else { + compile_hash(iseq, args, kwnode, TRUE, FALSE); } - compile_hash(iseq, args, kwnode, TRUE, FALSE); argc += 1; } @@ -6437,7 +6463,7 @@ setup_args(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn, unsigned int *flag, struct rb_callinfo_kwarg **keywords) { VALUE ret; - unsigned int dup_rest = 1, initial_dup_rest; + unsigned int dup_rest = SPLATARRAY_TRUE, initial_dup_rest; if (argn) { const NODE *check_arg = nd_type_p(argn, NODE_BLOCK_PASS) ? @@ -6447,7 +6473,7 @@ setup_args(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn, switch(nd_type(check_arg)) { case(NODE_SPLAT): // avoid caller side array allocation for f(*arg) - dup_rest = 0; + dup_rest = SPLATARRAY_FALSE; break; case(NODE_ARGSCAT): // avoid caller side array allocation for f(1, *arg) @@ -6461,20 +6487,20 @@ setup_args(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn, nd_type_p(RNODE_ARGSPUSH(check_arg)->nd_body, NODE_HASH) && !RNODE_HASH(RNODE_ARGSPUSH(check_arg)->nd_body)->nd_brace); - if (!dup_rest) { + if (dup_rest == SPLATARRAY_FALSE) { // require allocation for keyword key/value/splat that may modify splatted argument NODE *node = RNODE_HASH(RNODE_ARGSPUSH(check_arg)->nd_body)->nd_head; while (node) { NODE *key_node = RNODE_LIST(node)->nd_head; if (key_node && setup_args_dup_rest_p(key_node)) { - dup_rest = 1; + dup_rest = SPLATARRAY_TRUE; break; } node = RNODE_LIST(node)->nd_next; NODE *value_node = RNODE_LIST(node)->nd_head; if (setup_args_dup_rest_p(value_node)) { - dup_rest = 1; + dup_rest = SPLATARRAY_TRUE; break; } @@ -6487,9 +6513,9 @@ setup_args(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn, } } - if (!dup_rest && (check_arg != argn) && setup_args_dup_rest_p(RNODE_BLOCK_PASS(argn)->nd_body)) { - // require allocation for block pass that may modify splatted argument - dup_rest = 1; + if (check_arg != argn && setup_args_dup_rest_p(RNODE_BLOCK_PASS(argn)->nd_body)) { + // for block pass that may modify splatted argument, dup rest and kwrest if given + dup_rest = SPLATARRAY_TRUE | DUP_SINGLE_KW_SPLAT; } } initial_dup_rest = dup_rest; diff --git a/prism_compile.c b/prism_compile.c index 044ef5083d624c..f2a469a39861e9 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -1536,9 +1536,13 @@ pm_compile_hash_elements(rb_iseq_t *iseq, const pm_node_t *node, const pm_node_l #undef FLUSH_CHUNK } +#define SPLATARRAY_FALSE 0 +#define SPLATARRAY_TRUE 1 +#define DUP_SINGLE_KW_SPLAT 2 + // This is details. Users should call pm_setup_args() instead. static int -pm_setup_args_core(const pm_arguments_node_t *arguments_node, const pm_node_t *block, int *flags, const bool has_regular_blockarg, struct rb_callinfo_kwarg **kw_arg, VALUE *dup_rest, rb_iseq_t *iseq, LINK_ANCHOR *const ret, pm_scope_node_t *scope_node, const pm_node_location_t *node_location) +pm_setup_args_core(const pm_arguments_node_t *arguments_node, const pm_node_t *block, int *flags, const bool has_regular_blockarg, struct rb_callinfo_kwarg **kw_arg, int *dup_rest, rb_iseq_t *iseq, LINK_ANCHOR *const ret, pm_scope_node_t *scope_node, const pm_node_location_t *node_location) { const pm_node_location_t location = *node_location; @@ -1576,9 +1580,18 @@ pm_setup_args_core(const pm_arguments_node_t *arguments_node, const pm_node_t *b // in this case, so mark the method as passing mutable // keyword splat. *flags |= VM_CALL_KW_SPLAT_MUT; + pm_compile_hash_elements(iseq, argument, elements, true, ret, scope_node); + } + else if (*dup_rest & DUP_SINGLE_KW_SPLAT) { + *flags |= VM_CALL_KW_SPLAT_MUT; + PUSH_INSN1(ret, location, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); + PUSH_INSN1(ret, location, newhash, INT2FIX(0)); + pm_compile_hash_elements(iseq, argument, elements, true, ret, scope_node); + PUSH_SEND(ret, location, id_core_hash_merge_kwd, INT2FIX(2)); + } + else { + pm_compile_hash_elements(iseq, argument, elements, true, ret, scope_node); } - - pm_compile_hash_elements(iseq, argument, elements, true, ret, scope_node); } else { // We need to first figure out if all elements of the @@ -1684,8 +1697,8 @@ pm_setup_args_core(const pm_arguments_node_t *arguments_node, const pm_node_t *b // foo(a, *b, c) // ^^ if (index + 1 < arguments->size || has_regular_blockarg) { - PUSH_INSN1(ret, location, splatarray, *dup_rest); - if (*dup_rest == Qtrue) *dup_rest = Qfalse; + PUSH_INSN1(ret, location, splatarray, (*dup_rest & SPLATARRAY_TRUE) ? Qtrue : Qfalse); + if (*dup_rest & SPLATARRAY_TRUE) *dup_rest &= ~SPLATARRAY_TRUE; } // If this is the first spalt array seen and it's the last // parameter, we don't want splatarray to dup it. @@ -1846,7 +1859,7 @@ pm_setup_args_dup_rest_p(const pm_node_t *node) static int pm_setup_args(const pm_arguments_node_t *arguments_node, const pm_node_t *block, int *flags, struct rb_callinfo_kwarg **kw_arg, rb_iseq_t *iseq, LINK_ANCHOR *const ret, pm_scope_node_t *scope_node, const pm_node_location_t *node_location) { - VALUE dup_rest = Qtrue; + int dup_rest = SPLATARRAY_TRUE; const pm_node_list_t *arguments; size_t arguments_size; @@ -1863,23 +1876,23 @@ pm_setup_args(const pm_arguments_node_t *arguments_node, const pm_node_t *block, // Start by assuming that dup_rest=false, then check each element of the // hash to ensure we don't need to flip it back to true (in case one of // the elements could potentially mutate the array). - dup_rest = Qfalse; + dup_rest = SPLATARRAY_FALSE; const pm_keyword_hash_node_t *keyword_hash = (const pm_keyword_hash_node_t *) arguments->nodes[arguments_size - 1]; const pm_node_list_t *elements = &keyword_hash->elements; - for (size_t index = 0; dup_rest == Qfalse && index < elements->size; index++) { + for (size_t index = 0; dup_rest == SPLATARRAY_FALSE && index < elements->size; index++) { const pm_node_t *element = elements->nodes[index]; switch (PM_NODE_TYPE(element)) { case PM_ASSOC_NODE: { const pm_assoc_node_t *assoc = (const pm_assoc_node_t *) element; - if (pm_setup_args_dup_rest_p(assoc->key) || pm_setup_args_dup_rest_p(assoc->value)) dup_rest = Qtrue; + if (pm_setup_args_dup_rest_p(assoc->key) || pm_setup_args_dup_rest_p(assoc->value)) dup_rest = SPLATARRAY_TRUE; break; } case PM_ASSOC_SPLAT_NODE: { const pm_assoc_splat_node_t *assoc = (const pm_assoc_splat_node_t *) element; - if (assoc->value != NULL && pm_setup_args_dup_rest_p(assoc->value)) dup_rest = Qtrue; + if (assoc->value != NULL && pm_setup_args_dup_rest_p(assoc->value)) dup_rest = SPLATARRAY_TRUE; break; } default: @@ -1888,7 +1901,7 @@ pm_setup_args(const pm_arguments_node_t *arguments_node, const pm_node_t *block, } } - VALUE initial_dup_rest = dup_rest; + int initial_dup_rest = dup_rest; int argc; if (block && PM_NODE_TYPE_P(block, PM_BLOCK_ARGUMENT_NODE)) { @@ -1897,6 +1910,11 @@ pm_setup_args(const pm_arguments_node_t *arguments_node, const pm_node_t *block, // duplicate the array. bool regular_block_arg = true; + if (pm_setup_args_dup_rest_p(block)) { + dup_rest = SPLATARRAY_TRUE | DUP_SINGLE_KW_SPLAT; + initial_dup_rest = dup_rest; + } + DECL_ANCHOR(block_arg); INIT_ANCHOR(block_arg); pm_compile_node(iseq, block, block_arg, false, scope_node); diff --git a/test/ruby/test_call.rb b/test/ruby/test_call.rb index b7d62ae1113ef1..ffbda1fdb96e79 100644 --- a/test/ruby/test_call.rb +++ b/test/ruby/test_call.rb @@ -374,6 +374,21 @@ def o.foo(a, **h)= h[:splat_modified] = true assert_equal({splat_modified: false}, b) end + def test_kwsplat_block_eval_order + def self.t(**kw, &b) [kw, b] end + + pr = ->{} + h = {a: pr} + a = [] + + ary = t(**h, &h.delete(:a)) + assert_equal([{a: pr}, pr], ary) + + h = {a: pr} + ary = t(*a, **h, &h.delete(:a)) + assert_equal([{a: pr}, pr], ary) + end + def test_kwsplat_block_order o = Object.new ary = [] From 9c12c39ed175c634dfa0e56619cb30a49e292043 Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Wed, 18 Sep 2024 11:26:10 -0700 Subject: [PATCH 354/829] Revert "Fix evaluation order issue in f(**h, &h.delete(key))" This reverts commit 07d3bf4832532ae7446c9a6924d79aed60a7a9a5. No failures in the pull request CI, but there are now allocation test failures. --- compile.c | 54 +++++++++++------------------------------- prism_compile.c | 40 +++++++++---------------------- test/ruby/test_call.rb | 15 ------------ 3 files changed, 25 insertions(+), 84 deletions(-) diff --git a/compile.c b/compile.c index a0754306c9f5e1..3be7808a8d311e 100644 --- a/compile.c +++ b/compile.c @@ -6284,21 +6284,6 @@ keyword_node_single_splat_p(NODE *kwnode) RNODE_LIST(RNODE_LIST(node)->nd_next)->nd_next == NULL; } -static void -compile_single_keyword_splat_mutable(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn, - NODE *kwnode, unsigned int *flag_ptr) -{ - *flag_ptr |= VM_CALL_KW_SPLAT_MUT; - ADD_INSN1(args, argn, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); - ADD_INSN1(args, argn, newhash, INT2FIX(0)); - compile_hash(iseq, args, kwnode, TRUE, FALSE); - ADD_SEND(args, argn, id_core_hash_merge_kwd, INT2FIX(2)); -} - -#define SPLATARRAY_FALSE 0 -#define SPLATARRAY_TRUE 1 -#define DUP_SINGLE_KW_SPLAT 2 - static int setup_args_core(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn, unsigned int *dup_rest, unsigned int *flag_ptr, struct rb_callinfo_kwarg **kwarg_ptr) @@ -6318,12 +6303,7 @@ setup_args_core(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn, len -= 1; } else { - if (keyword_node_single_splat_p(kwnode) && (*dup_rest & DUP_SINGLE_KW_SPLAT)) { - compile_single_keyword_splat_mutable(iseq, args, argn, kwnode, flag_ptr); - } - else { - compile_hash(iseq, args, kwnode, TRUE, FALSE); - } + compile_hash(iseq, args, kwnode, TRUE, FALSE); } } @@ -6332,8 +6312,8 @@ setup_args_core(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn, case NODE_SPLAT: { // f(*a) NO_CHECK(COMPILE(args, "args (splat)", RNODE_SPLAT(argn)->nd_head)); - ADD_INSN1(args, argn, splatarray, RBOOL(*dup_rest & SPLATARRAY_TRUE)); - if (*dup_rest & SPLATARRAY_TRUE) *dup_rest &= ~SPLATARRAY_TRUE; + ADD_INSN1(args, argn, splatarray, RBOOL(*dup_rest)); + if (*dup_rest) *dup_rest = 0; if (flag_ptr) *flag_ptr |= VM_CALL_ARGS_SPLAT; RUBY_ASSERT(flag_ptr == NULL || (*flag_ptr & VM_CALL_KW_SPLAT) == 0); return 1; @@ -6355,8 +6335,8 @@ setup_args_core(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn, } if (nd_type_p(RNODE_ARGSCAT(argn)->nd_head, NODE_LIST)) { - ADD_INSN1(args, argn, splatarray, RBOOL(*dup_rest & SPLATARRAY_TRUE)); - if (*dup_rest & SPLATARRAY_TRUE) *dup_rest &= ~SPLATARRAY_TRUE; + ADD_INSN1(args, argn, splatarray, RBOOL(*dup_rest)); + if (*dup_rest) *dup_rest = 0; argc += 1; } else if (!args_pushed) { @@ -6398,14 +6378,8 @@ setup_args_core(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn, *flag_ptr |= VM_CALL_KW_SPLAT; if (!keyword_node_single_splat_p(kwnode)) { *flag_ptr |= VM_CALL_KW_SPLAT_MUT; - compile_hash(iseq, args, kwnode, TRUE, FALSE); - } - else if (*dup_rest & DUP_SINGLE_KW_SPLAT) { - compile_single_keyword_splat_mutable(iseq, args, argn, kwnode, flag_ptr); - } - else { - compile_hash(iseq, args, kwnode, TRUE, FALSE); } + compile_hash(iseq, args, kwnode, TRUE, FALSE); argc += 1; } @@ -6463,7 +6437,7 @@ setup_args(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn, unsigned int *flag, struct rb_callinfo_kwarg **keywords) { VALUE ret; - unsigned int dup_rest = SPLATARRAY_TRUE, initial_dup_rest; + unsigned int dup_rest = 1, initial_dup_rest; if (argn) { const NODE *check_arg = nd_type_p(argn, NODE_BLOCK_PASS) ? @@ -6473,7 +6447,7 @@ setup_args(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn, switch(nd_type(check_arg)) { case(NODE_SPLAT): // avoid caller side array allocation for f(*arg) - dup_rest = SPLATARRAY_FALSE; + dup_rest = 0; break; case(NODE_ARGSCAT): // avoid caller side array allocation for f(1, *arg) @@ -6487,20 +6461,20 @@ setup_args(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn, nd_type_p(RNODE_ARGSPUSH(check_arg)->nd_body, NODE_HASH) && !RNODE_HASH(RNODE_ARGSPUSH(check_arg)->nd_body)->nd_brace); - if (dup_rest == SPLATARRAY_FALSE) { + if (!dup_rest) { // require allocation for keyword key/value/splat that may modify splatted argument NODE *node = RNODE_HASH(RNODE_ARGSPUSH(check_arg)->nd_body)->nd_head; while (node) { NODE *key_node = RNODE_LIST(node)->nd_head; if (key_node && setup_args_dup_rest_p(key_node)) { - dup_rest = SPLATARRAY_TRUE; + dup_rest = 1; break; } node = RNODE_LIST(node)->nd_next; NODE *value_node = RNODE_LIST(node)->nd_head; if (setup_args_dup_rest_p(value_node)) { - dup_rest = SPLATARRAY_TRUE; + dup_rest = 1; break; } @@ -6513,9 +6487,9 @@ setup_args(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn, } } - if (check_arg != argn && setup_args_dup_rest_p(RNODE_BLOCK_PASS(argn)->nd_body)) { - // for block pass that may modify splatted argument, dup rest and kwrest if given - dup_rest = SPLATARRAY_TRUE | DUP_SINGLE_KW_SPLAT; + if (!dup_rest && (check_arg != argn) && setup_args_dup_rest_p(RNODE_BLOCK_PASS(argn)->nd_body)) { + // require allocation for block pass that may modify splatted argument + dup_rest = 1; } } initial_dup_rest = dup_rest; diff --git a/prism_compile.c b/prism_compile.c index f2a469a39861e9..044ef5083d624c 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -1536,13 +1536,9 @@ pm_compile_hash_elements(rb_iseq_t *iseq, const pm_node_t *node, const pm_node_l #undef FLUSH_CHUNK } -#define SPLATARRAY_FALSE 0 -#define SPLATARRAY_TRUE 1 -#define DUP_SINGLE_KW_SPLAT 2 - // This is details. Users should call pm_setup_args() instead. static int -pm_setup_args_core(const pm_arguments_node_t *arguments_node, const pm_node_t *block, int *flags, const bool has_regular_blockarg, struct rb_callinfo_kwarg **kw_arg, int *dup_rest, rb_iseq_t *iseq, LINK_ANCHOR *const ret, pm_scope_node_t *scope_node, const pm_node_location_t *node_location) +pm_setup_args_core(const pm_arguments_node_t *arguments_node, const pm_node_t *block, int *flags, const bool has_regular_blockarg, struct rb_callinfo_kwarg **kw_arg, VALUE *dup_rest, rb_iseq_t *iseq, LINK_ANCHOR *const ret, pm_scope_node_t *scope_node, const pm_node_location_t *node_location) { const pm_node_location_t location = *node_location; @@ -1580,18 +1576,9 @@ pm_setup_args_core(const pm_arguments_node_t *arguments_node, const pm_node_t *b // in this case, so mark the method as passing mutable // keyword splat. *flags |= VM_CALL_KW_SPLAT_MUT; - pm_compile_hash_elements(iseq, argument, elements, true, ret, scope_node); - } - else if (*dup_rest & DUP_SINGLE_KW_SPLAT) { - *flags |= VM_CALL_KW_SPLAT_MUT; - PUSH_INSN1(ret, location, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); - PUSH_INSN1(ret, location, newhash, INT2FIX(0)); - pm_compile_hash_elements(iseq, argument, elements, true, ret, scope_node); - PUSH_SEND(ret, location, id_core_hash_merge_kwd, INT2FIX(2)); - } - else { - pm_compile_hash_elements(iseq, argument, elements, true, ret, scope_node); } + + pm_compile_hash_elements(iseq, argument, elements, true, ret, scope_node); } else { // We need to first figure out if all elements of the @@ -1697,8 +1684,8 @@ pm_setup_args_core(const pm_arguments_node_t *arguments_node, const pm_node_t *b // foo(a, *b, c) // ^^ if (index + 1 < arguments->size || has_regular_blockarg) { - PUSH_INSN1(ret, location, splatarray, (*dup_rest & SPLATARRAY_TRUE) ? Qtrue : Qfalse); - if (*dup_rest & SPLATARRAY_TRUE) *dup_rest &= ~SPLATARRAY_TRUE; + PUSH_INSN1(ret, location, splatarray, *dup_rest); + if (*dup_rest == Qtrue) *dup_rest = Qfalse; } // If this is the first spalt array seen and it's the last // parameter, we don't want splatarray to dup it. @@ -1859,7 +1846,7 @@ pm_setup_args_dup_rest_p(const pm_node_t *node) static int pm_setup_args(const pm_arguments_node_t *arguments_node, const pm_node_t *block, int *flags, struct rb_callinfo_kwarg **kw_arg, rb_iseq_t *iseq, LINK_ANCHOR *const ret, pm_scope_node_t *scope_node, const pm_node_location_t *node_location) { - int dup_rest = SPLATARRAY_TRUE; + VALUE dup_rest = Qtrue; const pm_node_list_t *arguments; size_t arguments_size; @@ -1876,23 +1863,23 @@ pm_setup_args(const pm_arguments_node_t *arguments_node, const pm_node_t *block, // Start by assuming that dup_rest=false, then check each element of the // hash to ensure we don't need to flip it back to true (in case one of // the elements could potentially mutate the array). - dup_rest = SPLATARRAY_FALSE; + dup_rest = Qfalse; const pm_keyword_hash_node_t *keyword_hash = (const pm_keyword_hash_node_t *) arguments->nodes[arguments_size - 1]; const pm_node_list_t *elements = &keyword_hash->elements; - for (size_t index = 0; dup_rest == SPLATARRAY_FALSE && index < elements->size; index++) { + for (size_t index = 0; dup_rest == Qfalse && index < elements->size; index++) { const pm_node_t *element = elements->nodes[index]; switch (PM_NODE_TYPE(element)) { case PM_ASSOC_NODE: { const pm_assoc_node_t *assoc = (const pm_assoc_node_t *) element; - if (pm_setup_args_dup_rest_p(assoc->key) || pm_setup_args_dup_rest_p(assoc->value)) dup_rest = SPLATARRAY_TRUE; + if (pm_setup_args_dup_rest_p(assoc->key) || pm_setup_args_dup_rest_p(assoc->value)) dup_rest = Qtrue; break; } case PM_ASSOC_SPLAT_NODE: { const pm_assoc_splat_node_t *assoc = (const pm_assoc_splat_node_t *) element; - if (assoc->value != NULL && pm_setup_args_dup_rest_p(assoc->value)) dup_rest = SPLATARRAY_TRUE; + if (assoc->value != NULL && pm_setup_args_dup_rest_p(assoc->value)) dup_rest = Qtrue; break; } default: @@ -1901,7 +1888,7 @@ pm_setup_args(const pm_arguments_node_t *arguments_node, const pm_node_t *block, } } - int initial_dup_rest = dup_rest; + VALUE initial_dup_rest = dup_rest; int argc; if (block && PM_NODE_TYPE_P(block, PM_BLOCK_ARGUMENT_NODE)) { @@ -1910,11 +1897,6 @@ pm_setup_args(const pm_arguments_node_t *arguments_node, const pm_node_t *block, // duplicate the array. bool regular_block_arg = true; - if (pm_setup_args_dup_rest_p(block)) { - dup_rest = SPLATARRAY_TRUE | DUP_SINGLE_KW_SPLAT; - initial_dup_rest = dup_rest; - } - DECL_ANCHOR(block_arg); INIT_ANCHOR(block_arg); pm_compile_node(iseq, block, block_arg, false, scope_node); diff --git a/test/ruby/test_call.rb b/test/ruby/test_call.rb index ffbda1fdb96e79..b7d62ae1113ef1 100644 --- a/test/ruby/test_call.rb +++ b/test/ruby/test_call.rb @@ -374,21 +374,6 @@ def o.foo(a, **h)= h[:splat_modified] = true assert_equal({splat_modified: false}, b) end - def test_kwsplat_block_eval_order - def self.t(**kw, &b) [kw, b] end - - pr = ->{} - h = {a: pr} - a = [] - - ary = t(**h, &h.delete(:a)) - assert_equal([{a: pr}, pr], ary) - - h = {a: pr} - ary = t(*a, **h, &h.delete(:a)) - assert_equal([{a: pr}, pr], ary) - end - def test_kwsplat_block_order o = Object.new ary = [] From e358104e6ef57abaa51bb4c0f2ae9fe1bda18a4e Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Wed, 18 Sep 2024 10:34:01 -0400 Subject: [PATCH 355/829] [DOC] Fix formatting for ways to create Range objects --- range.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/range.c b/range.c index e4e73bd85de1a7..49c34aa8cbefd4 100644 --- a/range.c +++ b/range.c @@ -2502,7 +2502,7 @@ range_overlap(VALUE range, VALUE other) * (1...4).to_a # => [1, 2, 3] * ('a'...'d').to_a # => ["a", "b", "c"] * - * A range may be created using method Range.new: + * - Method Range.new: * * # Ranges that by default include the given end value. * Range.new(1, 4).to_a # => [1, 2, 3, 4] From 29f2cb83fb72d970ee07004b2fc019fd31efd823 Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Wed, 18 Sep 2024 12:46:07 -0700 Subject: [PATCH 356/829] Fix evaluation order issue in f(**h, &h.delete(key)) Previously, this would delete the key in `h` before keyword splatting `h`. This goes against how ruby handles `f(*a, &a.pop)` and similar expressions. Fix this by having the compiler check whether the block pass expression is safe. If it is not safe, then dup the keyword splatted hash before evaluating the block pass expression. For expression: `h=nil; f(**h, &h.delete(:key))` VM instructions before: ``` 0000 putnil ( 1)[Li] 0001 setlocal_WC_0 h@0 0003 putself 0004 getlocal_WC_0 h@0 0006 getlocal_WC_0 h@0 0008 putobject :key 0010 opt_send_without_block 0012 splatkw 0013 send , nil 0016 leave ``` VM instructions after: ``` 0000 putnil ( 1)[Li] 0001 setlocal_WC_0 h@0 0003 putself 0004 putspecialobject 1 0006 newhash 0 0008 getlocal_WC_0 h@0 0010 opt_send_without_block 0012 getlocal_WC_0 h@0 0014 putobject :key 0016 opt_send_without_block 0018 send , nil 0021 leave ``` This is the same as 07d3bf4832532ae7446c9a6924d79aed60a7a9a5, except that it removes unnecessary hash allocations when using the prism compiler. Fixes [Bug #20640] --- compile.c | 54 +++++++++++++++++++++++++++++++----------- prism_compile.c | 41 +++++++++++++++++++++++--------- test/ruby/test_call.rb | 15 ++++++++++++ 3 files changed, 85 insertions(+), 25 deletions(-) diff --git a/compile.c b/compile.c index 3be7808a8d311e..a0754306c9f5e1 100644 --- a/compile.c +++ b/compile.c @@ -6284,6 +6284,21 @@ keyword_node_single_splat_p(NODE *kwnode) RNODE_LIST(RNODE_LIST(node)->nd_next)->nd_next == NULL; } +static void +compile_single_keyword_splat_mutable(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn, + NODE *kwnode, unsigned int *flag_ptr) +{ + *flag_ptr |= VM_CALL_KW_SPLAT_MUT; + ADD_INSN1(args, argn, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); + ADD_INSN1(args, argn, newhash, INT2FIX(0)); + compile_hash(iseq, args, kwnode, TRUE, FALSE); + ADD_SEND(args, argn, id_core_hash_merge_kwd, INT2FIX(2)); +} + +#define SPLATARRAY_FALSE 0 +#define SPLATARRAY_TRUE 1 +#define DUP_SINGLE_KW_SPLAT 2 + static int setup_args_core(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn, unsigned int *dup_rest, unsigned int *flag_ptr, struct rb_callinfo_kwarg **kwarg_ptr) @@ -6303,7 +6318,12 @@ setup_args_core(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn, len -= 1; } else { - compile_hash(iseq, args, kwnode, TRUE, FALSE); + if (keyword_node_single_splat_p(kwnode) && (*dup_rest & DUP_SINGLE_KW_SPLAT)) { + compile_single_keyword_splat_mutable(iseq, args, argn, kwnode, flag_ptr); + } + else { + compile_hash(iseq, args, kwnode, TRUE, FALSE); + } } } @@ -6312,8 +6332,8 @@ setup_args_core(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn, case NODE_SPLAT: { // f(*a) NO_CHECK(COMPILE(args, "args (splat)", RNODE_SPLAT(argn)->nd_head)); - ADD_INSN1(args, argn, splatarray, RBOOL(*dup_rest)); - if (*dup_rest) *dup_rest = 0; + ADD_INSN1(args, argn, splatarray, RBOOL(*dup_rest & SPLATARRAY_TRUE)); + if (*dup_rest & SPLATARRAY_TRUE) *dup_rest &= ~SPLATARRAY_TRUE; if (flag_ptr) *flag_ptr |= VM_CALL_ARGS_SPLAT; RUBY_ASSERT(flag_ptr == NULL || (*flag_ptr & VM_CALL_KW_SPLAT) == 0); return 1; @@ -6335,8 +6355,8 @@ setup_args_core(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn, } if (nd_type_p(RNODE_ARGSCAT(argn)->nd_head, NODE_LIST)) { - ADD_INSN1(args, argn, splatarray, RBOOL(*dup_rest)); - if (*dup_rest) *dup_rest = 0; + ADD_INSN1(args, argn, splatarray, RBOOL(*dup_rest & SPLATARRAY_TRUE)); + if (*dup_rest & SPLATARRAY_TRUE) *dup_rest &= ~SPLATARRAY_TRUE; argc += 1; } else if (!args_pushed) { @@ -6378,8 +6398,14 @@ setup_args_core(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn, *flag_ptr |= VM_CALL_KW_SPLAT; if (!keyword_node_single_splat_p(kwnode)) { *flag_ptr |= VM_CALL_KW_SPLAT_MUT; + compile_hash(iseq, args, kwnode, TRUE, FALSE); + } + else if (*dup_rest & DUP_SINGLE_KW_SPLAT) { + compile_single_keyword_splat_mutable(iseq, args, argn, kwnode, flag_ptr); + } + else { + compile_hash(iseq, args, kwnode, TRUE, FALSE); } - compile_hash(iseq, args, kwnode, TRUE, FALSE); argc += 1; } @@ -6437,7 +6463,7 @@ setup_args(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn, unsigned int *flag, struct rb_callinfo_kwarg **keywords) { VALUE ret; - unsigned int dup_rest = 1, initial_dup_rest; + unsigned int dup_rest = SPLATARRAY_TRUE, initial_dup_rest; if (argn) { const NODE *check_arg = nd_type_p(argn, NODE_BLOCK_PASS) ? @@ -6447,7 +6473,7 @@ setup_args(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn, switch(nd_type(check_arg)) { case(NODE_SPLAT): // avoid caller side array allocation for f(*arg) - dup_rest = 0; + dup_rest = SPLATARRAY_FALSE; break; case(NODE_ARGSCAT): // avoid caller side array allocation for f(1, *arg) @@ -6461,20 +6487,20 @@ setup_args(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn, nd_type_p(RNODE_ARGSPUSH(check_arg)->nd_body, NODE_HASH) && !RNODE_HASH(RNODE_ARGSPUSH(check_arg)->nd_body)->nd_brace); - if (!dup_rest) { + if (dup_rest == SPLATARRAY_FALSE) { // require allocation for keyword key/value/splat that may modify splatted argument NODE *node = RNODE_HASH(RNODE_ARGSPUSH(check_arg)->nd_body)->nd_head; while (node) { NODE *key_node = RNODE_LIST(node)->nd_head; if (key_node && setup_args_dup_rest_p(key_node)) { - dup_rest = 1; + dup_rest = SPLATARRAY_TRUE; break; } node = RNODE_LIST(node)->nd_next; NODE *value_node = RNODE_LIST(node)->nd_head; if (setup_args_dup_rest_p(value_node)) { - dup_rest = 1; + dup_rest = SPLATARRAY_TRUE; break; } @@ -6487,9 +6513,9 @@ setup_args(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn, } } - if (!dup_rest && (check_arg != argn) && setup_args_dup_rest_p(RNODE_BLOCK_PASS(argn)->nd_body)) { - // require allocation for block pass that may modify splatted argument - dup_rest = 1; + if (check_arg != argn && setup_args_dup_rest_p(RNODE_BLOCK_PASS(argn)->nd_body)) { + // for block pass that may modify splatted argument, dup rest and kwrest if given + dup_rest = SPLATARRAY_TRUE | DUP_SINGLE_KW_SPLAT; } } initial_dup_rest = dup_rest; diff --git a/prism_compile.c b/prism_compile.c index 044ef5083d624c..435737cb66e7ce 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -1536,9 +1536,13 @@ pm_compile_hash_elements(rb_iseq_t *iseq, const pm_node_t *node, const pm_node_l #undef FLUSH_CHUNK } +#define SPLATARRAY_FALSE 0 +#define SPLATARRAY_TRUE 1 +#define DUP_SINGLE_KW_SPLAT 2 + // This is details. Users should call pm_setup_args() instead. static int -pm_setup_args_core(const pm_arguments_node_t *arguments_node, const pm_node_t *block, int *flags, const bool has_regular_blockarg, struct rb_callinfo_kwarg **kw_arg, VALUE *dup_rest, rb_iseq_t *iseq, LINK_ANCHOR *const ret, pm_scope_node_t *scope_node, const pm_node_location_t *node_location) +pm_setup_args_core(const pm_arguments_node_t *arguments_node, const pm_node_t *block, int *flags, const bool has_regular_blockarg, struct rb_callinfo_kwarg **kw_arg, int *dup_rest, rb_iseq_t *iseq, LINK_ANCHOR *const ret, pm_scope_node_t *scope_node, const pm_node_location_t *node_location) { const pm_node_location_t location = *node_location; @@ -1576,9 +1580,18 @@ pm_setup_args_core(const pm_arguments_node_t *arguments_node, const pm_node_t *b // in this case, so mark the method as passing mutable // keyword splat. *flags |= VM_CALL_KW_SPLAT_MUT; + pm_compile_hash_elements(iseq, argument, elements, true, ret, scope_node); + } + else if (*dup_rest & DUP_SINGLE_KW_SPLAT) { + *flags |= VM_CALL_KW_SPLAT_MUT; + PUSH_INSN1(ret, location, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); + PUSH_INSN1(ret, location, newhash, INT2FIX(0)); + pm_compile_hash_elements(iseq, argument, elements, true, ret, scope_node); + PUSH_SEND(ret, location, id_core_hash_merge_kwd, INT2FIX(2)); + } + else { + pm_compile_hash_elements(iseq, argument, elements, true, ret, scope_node); } - - pm_compile_hash_elements(iseq, argument, elements, true, ret, scope_node); } else { // We need to first figure out if all elements of the @@ -1684,8 +1697,8 @@ pm_setup_args_core(const pm_arguments_node_t *arguments_node, const pm_node_t *b // foo(a, *b, c) // ^^ if (index + 1 < arguments->size || has_regular_blockarg) { - PUSH_INSN1(ret, location, splatarray, *dup_rest); - if (*dup_rest == Qtrue) *dup_rest = Qfalse; + PUSH_INSN1(ret, location, splatarray, (*dup_rest & SPLATARRAY_TRUE) ? Qtrue : Qfalse); + if (*dup_rest & SPLATARRAY_TRUE) *dup_rest &= ~SPLATARRAY_TRUE; } // If this is the first spalt array seen and it's the last // parameter, we don't want splatarray to dup it. @@ -1846,7 +1859,7 @@ pm_setup_args_dup_rest_p(const pm_node_t *node) static int pm_setup_args(const pm_arguments_node_t *arguments_node, const pm_node_t *block, int *flags, struct rb_callinfo_kwarg **kw_arg, rb_iseq_t *iseq, LINK_ANCHOR *const ret, pm_scope_node_t *scope_node, const pm_node_location_t *node_location) { - VALUE dup_rest = Qtrue; + int dup_rest = SPLATARRAY_TRUE; const pm_node_list_t *arguments; size_t arguments_size; @@ -1863,23 +1876,23 @@ pm_setup_args(const pm_arguments_node_t *arguments_node, const pm_node_t *block, // Start by assuming that dup_rest=false, then check each element of the // hash to ensure we don't need to flip it back to true (in case one of // the elements could potentially mutate the array). - dup_rest = Qfalse; + dup_rest = SPLATARRAY_FALSE; const pm_keyword_hash_node_t *keyword_hash = (const pm_keyword_hash_node_t *) arguments->nodes[arguments_size - 1]; const pm_node_list_t *elements = &keyword_hash->elements; - for (size_t index = 0; dup_rest == Qfalse && index < elements->size; index++) { + for (size_t index = 0; dup_rest == SPLATARRAY_FALSE && index < elements->size; index++) { const pm_node_t *element = elements->nodes[index]; switch (PM_NODE_TYPE(element)) { case PM_ASSOC_NODE: { const pm_assoc_node_t *assoc = (const pm_assoc_node_t *) element; - if (pm_setup_args_dup_rest_p(assoc->key) || pm_setup_args_dup_rest_p(assoc->value)) dup_rest = Qtrue; + if (pm_setup_args_dup_rest_p(assoc->key) || pm_setup_args_dup_rest_p(assoc->value)) dup_rest = SPLATARRAY_TRUE; break; } case PM_ASSOC_SPLAT_NODE: { const pm_assoc_splat_node_t *assoc = (const pm_assoc_splat_node_t *) element; - if (assoc->value != NULL && pm_setup_args_dup_rest_p(assoc->value)) dup_rest = Qtrue; + if (assoc->value != NULL && pm_setup_args_dup_rest_p(assoc->value)) dup_rest = SPLATARRAY_TRUE; break; } default: @@ -1888,7 +1901,7 @@ pm_setup_args(const pm_arguments_node_t *arguments_node, const pm_node_t *block, } } - VALUE initial_dup_rest = dup_rest; + int initial_dup_rest = dup_rest; int argc; if (block && PM_NODE_TYPE_P(block, PM_BLOCK_ARGUMENT_NODE)) { @@ -1896,6 +1909,12 @@ pm_setup_args(const pm_arguments_node_t *arguments_node, const pm_node_t *block, // since the nature of the expression influences whether splat should // duplicate the array. bool regular_block_arg = true; + const pm_node_t *block_expr = ((const pm_block_argument_node_t *)block)->expression; + + if (block_expr && pm_setup_args_dup_rest_p(block_expr)) { + dup_rest = SPLATARRAY_TRUE | DUP_SINGLE_KW_SPLAT; + initial_dup_rest = dup_rest; + } DECL_ANCHOR(block_arg); INIT_ANCHOR(block_arg); diff --git a/test/ruby/test_call.rb b/test/ruby/test_call.rb index b7d62ae1113ef1..ffbda1fdb96e79 100644 --- a/test/ruby/test_call.rb +++ b/test/ruby/test_call.rb @@ -374,6 +374,21 @@ def o.foo(a, **h)= h[:splat_modified] = true assert_equal({splat_modified: false}, b) end + def test_kwsplat_block_eval_order + def self.t(**kw, &b) [kw, b] end + + pr = ->{} + h = {a: pr} + a = [] + + ary = t(**h, &h.delete(:a)) + assert_equal([{a: pr}, pr], ary) + + h = {a: pr} + ary = t(*a, **h, &h.delete(:a)) + assert_equal([{a: pr}, pr], ary) + end + def test_kwsplat_block_order o = Object.new ary = [] From 984a791d58ec4350d62714a2d063c1bb54707bb6 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Wed, 18 Sep 2024 10:40:47 -0400 Subject: [PATCH 357/829] [DOC] Escape the word GC in GC.config --- gc.rb | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/gc.rb b/gc.rb index ce5f3ffff6ca1a..32e68c690eb501 100644 --- a/gc.rb +++ b/gc.rb @@ -257,9 +257,9 @@ def self.stat_heap heap_name = nil, hash_or_key = nil # GC.config -> hash # GC.config(hash) -> hash # - # Sets or gets information about the current GC config. + # Sets or gets information about the current \GC config. # - # Configuration parameters are GC implementation specific and may change + # Configuration parameters are \GC implementation specific and may change # without notice. # # This method can be called without parameters to retrieve the current config. @@ -269,26 +269,26 @@ def self.stat_heap heap_name = nil, hash_or_key = nil # unmodified. # # If a key/value pair is passed to this function that does not correspond to - # a valid config key for the GC implementation being used, no config will be + # a valid config key for the \GC implementation being used, no config will be # updated, the key will be present in the returned Hash, and it's value will - # be +nil+. This is to facilitate easy migration between GC implementations. + # be +nil+. This is to facilitate easy migration between \GC implementations. # # In both call-seqs the return value of GC.config will be a +Hash+ # containing the most recent full configuration. ie. All keys and values - # defined by the specific GC implementation being used. In the case of a + # defined by the specific \GC implementation being used. In the case of a # config update, the return value will include the new values being updated. # # This method is only expected to work on CRuby. # - # Valid config keys for Ruby's default GC implementation are: + # Valid config keys for Ruby's default \GC implementation are: # # [rgengc_allow_full_mark] - # Control whether the GC is allowed to run a full mark (young & old objects). + # Control whether the \GC is allowed to run a full mark (young & old objects). # - # When +true+ GC interleaves major and minor collections. This is default. GC + # When +true+ \GC interleaves major and minor collections. This is default. \GC # will function as intended. # - # When +false+, the GC will never trigger a full marking cycle unless + # When +false+, the \GC will never trigger a full marking cycle unless # explicitly requested by user code. Instead only a minor mark will run - # only young objects will be marked. When the heap space is exhausted, new # pages will be allocated immediately instead of running a full mark. From 268c72377b06b7d84a0998ca241340d0f58768f6 Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Wed, 18 Sep 2024 16:54:56 -0700 Subject: [PATCH 358/829] Raise a compile error for break/next/redo inside eval in cases where it is optimized away In cases where break/next/redo are not valid syntax, they should raise a SyntaxError even if inside a conditional block that is optimized away. Fixes [Bug #20597] Co-authored-by: Kevin Newton --- bootstraptest/test_eval.rb | 2 +- parse.y | 2 +- prism/prism.c | 6 +++--- prism_compile.c | 6 +++--- test/ruby/test_eval.rb | 6 ++++++ 5 files changed, 14 insertions(+), 8 deletions(-) diff --git a/bootstraptest/test_eval.rb b/bootstraptest/test_eval.rb index d923a957bcbd27..20bd9615f4561c 100644 --- a/bootstraptest/test_eval.rb +++ b/bootstraptest/test_eval.rb @@ -217,7 +217,7 @@ def initialize &b } %w[break next redo].each do |keyword| - assert_match %r"Can't escape from eval with #{keyword}\b", %{ + assert_match %r"Invalid #{keyword}\b", %{ $stderr = STDOUT begin eval "0 rescue #{keyword}" diff --git a/parse.y b/parse.y index 134c80cdd27de6..435741a6087295 100644 --- a/parse.y +++ b/parse.y @@ -1836,7 +1836,7 @@ clear_block_exit(struct parser_params *p, bool error) { rb_node_exits_t *exits = p->exits; if (!exits) return; - if (error && !compile_for_eval) { + if (error) { for (NODE *e = RNODE(exits); (e = RNODE_EXITS(e)->nd_chain) != 0; ) { switch (nd_type(e)) { case NODE_BREAK: diff --git a/prism/prism.c b/prism/prism.c index 54061d157d494d..1cbacf00d3ef2e 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -18852,12 +18852,12 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b switch (keyword.type) { case PM_TOKEN_KEYWORD_BREAK: { pm_node_t *node = (pm_node_t *) pm_break_node_create(parser, &keyword, arguments.arguments); - if (!parser->parsing_eval) parse_block_exit(parser, node); + parse_block_exit(parser, node); return node; } case PM_TOKEN_KEYWORD_NEXT: { pm_node_t *node = (pm_node_t *) pm_next_node_create(parser, &keyword, arguments.arguments); - if (!parser->parsing_eval) parse_block_exit(parser, node); + parse_block_exit(parser, node); return node; } case PM_TOKEN_KEYWORD_RETURN: { @@ -19574,7 +19574,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b parser_lex(parser); pm_node_t *node = (pm_node_t *) pm_redo_node_create(parser, &parser->previous); - if (!parser->parsing_eval) parse_block_exit(parser, node); + parse_block_exit(parser, node); return node; } diff --git a/prism_compile.c b/prism_compile.c index 435737cb66e7ce..76d4e05fbec9cb 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -7275,7 +7275,7 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, throw_flag = 0; } else if (ISEQ_BODY(ip)->type == ISEQ_TYPE_EVAL) { - COMPILE_ERROR(iseq, location.line, "Can't escape from eval with break"); + COMPILE_ERROR(iseq, location.line, "Invalid break"); return; } else { @@ -9047,7 +9047,7 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, break; } else if (ISEQ_BODY(ip)->type == ISEQ_TYPE_EVAL) { - COMPILE_ERROR(iseq, location.line, "Can't escape from eval with next"); + COMPILE_ERROR(iseq, location.line, "Invalid next"); return; } @@ -9300,7 +9300,7 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, break; } else if (ISEQ_BODY(ip)->type == ISEQ_TYPE_EVAL) { - COMPILE_ERROR(iseq, location.line, "Can't escape from eval with redo"); + COMPILE_ERROR(iseq, location.line, "Invalid redo"); return; } diff --git a/test/ruby/test_eval.rb b/test/ruby/test_eval.rb index 082d1dc03c9315..cf1c2bb2f61bf9 100644 --- a/test/ruby/test_eval.rb +++ b/test/ruby/test_eval.rb @@ -535,6 +535,12 @@ def test_file_encoding assert_equal(fname, eval("__FILE__", nil, fname, 1)) end + def test_eval_invalid_block_exit_bug_20597 + assert_raise(SyntaxError){eval("break if false")} + assert_raise(SyntaxError){eval("next if false")} + assert_raise(SyntaxError){eval("redo if false")} + end + def test_eval_location_fstring o = Object.new o.instance_eval "def foo() end", "generated code" From 8dc0d2904a7d859b463a3f44ac73e5d4540a1cc1 Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Wed, 3 Jul 2024 12:17:12 -0700 Subject: [PATCH 359/829] Update exception message in string_for_symbol This is a static function only called in two places (rb_to_id and rb_to_symbol), and in both places, both symbols and strings are allowed. This makes the error message consistent with rb_check_id and rb_check_symbol. Fixes [Bug #20607] --- spec/ruby/core/thread/thread_variable_get_spec.rb | 6 +++--- spec/ruby/core/thread/thread_variable_set_spec.rb | 4 ++-- spec/ruby/core/thread/thread_variable_spec.rb | 6 +++--- string.c | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/spec/ruby/core/thread/thread_variable_get_spec.rb b/spec/ruby/core/thread/thread_variable_get_spec.rb index e8e03e3d18008e..1ea34cf2b31917 100644 --- a/spec/ruby/core/thread/thread_variable_get_spec.rb +++ b/spec/ruby/core/thread/thread_variable_get_spec.rb @@ -43,18 +43,18 @@ it "raises a TypeError if the key is neither Symbol nor String when thread variables are already set" do @t.thread_variable_set(:a, 49) - -> { @t.thread_variable_get(123) }.should raise_error(TypeError, "123 is not a symbol") + -> { @t.thread_variable_get(123) }.should raise_error(TypeError, /123 is not a symbol/) end ruby_version_is '3.4' do it "raises a TypeError if the key is neither Symbol nor String when no thread variables are set" do - -> { @t.thread_variable_get(123) }.should raise_error(TypeError, "123 is not a symbol") + -> { @t.thread_variable_get(123) }.should raise_error(TypeError, /123 is not a symbol/) end it "raises a TypeError if the key is neither Symbol nor String without calling #to_sym" do key = mock('key') key.should_not_receive(:to_sym) - -> { @t.thread_variable_get(key) }.should raise_error(TypeError, "#{key.inspect} is not a symbol") + -> { @t.thread_variable_get(key) }.should raise_error(TypeError, /#{Regexp.escape(key.inspect)} is not a symbol/) end end end diff --git a/spec/ruby/core/thread/thread_variable_set_spec.rb b/spec/ruby/core/thread/thread_variable_set_spec.rb index c262a6614eff7e..eadee76afba00d 100644 --- a/spec/ruby/core/thread/thread_variable_set_spec.rb +++ b/spec/ruby/core/thread/thread_variable_set_spec.rb @@ -51,12 +51,12 @@ end it "raises a TypeError if the key is neither Symbol nor String, nor responds to #to_str" do - -> { @t.thread_variable_set(123, 1) }.should raise_error(TypeError, '123 is not a symbol') + -> { @t.thread_variable_set(123, 1) }.should raise_error(TypeError, /123 is not a symbol/) end it "does not try to convert the key with #to_sym" do key = mock('key') key.should_not_receive(:to_sym) - -> { @t.thread_variable_set(key, 42) }.should raise_error(TypeError, "#{key.inspect} is not a symbol") + -> { @t.thread_variable_set(key, 42) }.should raise_error(TypeError, /#{Regexp.quote(key.inspect)} is not a symbol/) end end diff --git a/spec/ruby/core/thread/thread_variable_spec.rb b/spec/ruby/core/thread/thread_variable_spec.rb index 465b985365c722..1b021e94044d52 100644 --- a/spec/ruby/core/thread/thread_variable_spec.rb +++ b/spec/ruby/core/thread/thread_variable_spec.rb @@ -43,18 +43,18 @@ it "raises a TypeError if the key is neither Symbol nor String when thread variables are already set" do @t.thread_variable_set(:a, 49) - -> { @t.thread_variable?(123) }.should raise_error(TypeError, "123 is not a symbol") + -> { @t.thread_variable?(123) }.should raise_error(TypeError, /123 is not a symbol/) end ruby_version_is '3.4' do it "raises a TypeError if the key is neither Symbol nor String when no thread variables are set" do - -> { @t.thread_variable?(123) }.should raise_error(TypeError, "123 is not a symbol") + -> { @t.thread_variable?(123) }.should raise_error(TypeError, /123 is not a symbol/) end it "raises a TypeError if the key is neither Symbol nor String without calling #to_sym" do key = mock('key') key.should_not_receive(:to_sym) - -> { @t.thread_variable?(key) }.should raise_error(TypeError, "#{key.inspect} is not a symbol") + -> { @t.thread_variable?(key) }.should raise_error(TypeError, /#{Regexp.escape(key.inspect)} is not a symbol/) end end end diff --git a/string.c b/string.c index de39e84cb131b2..608d5cf7dcc741 100644 --- a/string.c +++ b/string.c @@ -12398,7 +12398,7 @@ string_for_symbol(VALUE name) if (!RB_TYPE_P(name, T_STRING)) { VALUE tmp = rb_check_string_type(name); if (NIL_P(tmp)) { - rb_raise(rb_eTypeError, "%+"PRIsVALUE" is not a symbol", + rb_raise(rb_eTypeError, "%+"PRIsVALUE" is not a symbol nor a string", name); } name = tmp; From c193ca52180360a3cb24648ffedd1b2181989e9d Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Thu, 19 Sep 2024 14:33:32 +0900 Subject: [PATCH 360/829] Adjust indent [ci skip] --- process.c | 2 +- thread_pthread.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/process.c b/process.c index 8570f577b30d5b..1bfa12ba9185cc 100644 --- a/process.c +++ b/process.c @@ -4236,7 +4236,7 @@ rb_fork_ruby(int *status) disable_child_handler_fork_parent(&old); /* yes, bad name */ rb_thread_release_fork_lock(); if (pid == 0) { - rb_thread_reset_fork_lock(); + rb_thread_reset_fork_lock(); } after_fork_ruby(pid); diff --git a/thread_pthread.c b/thread_pthread.c index 3c7fba42d249cf..6c8ec356711e4b 100644 --- a/thread_pthread.c +++ b/thread_pthread.c @@ -3367,7 +3367,7 @@ rb_thread_reset_fork_lock(void) } if ((r = pthread_rwlock_init(&rb_thread_fork_rw_lock, NULL))) { - rb_bug_errno("pthread_rwlock_init", r); + rb_bug_errno("pthread_rwlock_init", r); } } From c362206a48cb34eb207ecf3df9ca53b487951caa Mon Sep 17 00:00:00 2001 From: Piotr Kubaj Date: Mon, 22 Apr 2024 09:42:40 +0200 Subject: [PATCH 361/829] Use ppc64le coroutines on powerpc64le-freebsd* Only one ractor-related test fails, but it also fails with ucontext. --- configure.ac | 3 +++ 1 file changed, 3 insertions(+) diff --git a/configure.ac b/configure.ac index 9ccbd53f172f27..f906dd73cd231e 100644 --- a/configure.ac +++ b/configure.ac @@ -2751,6 +2751,9 @@ AS_CASE([$coroutine_type], [yes|''], [ [aarch64-freebsd*], [ coroutine_type=arm64 ], + [powerpc64le-freebsd*], [ + coroutine_type=ppc64le + ], [x86_64-netbsd*], [ coroutine_type=amd64 ], From 24b587e7ba08e9347d4b4f02c6442eac7ccba54c Mon Sep 17 00:00:00 2001 From: Piotr Kubaj Date: Wed, 24 Apr 2024 14:38:26 +0200 Subject: [PATCH 362/829] Use ppc64le coroutines for powerpc64-freebsd* There is nothing endianness-related in ppc64le and all the tests pass on both ucontext and ppc64le coroutines on powerpc64-freebsd14.0 --- configure.ac | 3 +++ 1 file changed, 3 insertions(+) diff --git a/configure.ac b/configure.ac index f906dd73cd231e..45a181c1eb6433 100644 --- a/configure.ac +++ b/configure.ac @@ -2751,6 +2751,9 @@ AS_CASE([$coroutine_type], [yes|''], [ [aarch64-freebsd*], [ coroutine_type=arm64 ], + [powerpc64-freebsd*], [ + coroutine_type=ppc64le + ], [powerpc64le-freebsd*], [ coroutine_type=ppc64le ], From e53d2f2092111828d692c85b5f0d0d57be1d095f Mon Sep 17 00:00:00 2001 From: Akinori MUSHA Date: Thu, 19 Sep 2024 16:09:21 +0900 Subject: [PATCH 363/829] [ruby/set] Reword the document for to_a and clarify the implementation notes ref. https://github.com/ruby/ruby/pull/11453 https://github.com/ruby/set/commit/3cf6d11bd2 --- lib/set.rb | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/set.rb b/lib/set.rb index a0954a31d1c419..374c45b19a4695 100644 --- a/lib/set.rb +++ b/lib/set.rb @@ -335,7 +335,7 @@ def replace(enum) end end - # Converts the set to an array. The order of elements is uncertain. + # Returns an array containing all elements in the set. # # Set[1, 2].to_a #=> [1, 2] # Set[1, 'c', :s].to_a #=> [1, "c", :s] @@ -540,11 +540,11 @@ def delete?(o) # Deletes every element of the set for which block evaluates to # true, and returns self. Returns an enumerator if no block is # given. - def delete_if + def delete_if(&block) block_given? or return enum_for(__method__) { size } - # @hash.delete_if should be faster, but using it breaks the order - # of enumeration in subclasses. - select { |o| yield o }.each { |o| @hash.delete(o) } + # Instead of directly using @hash.delete_if, perform enumeration + # using self.each that subclasses may override. + select(&block).each { |o| @hash.delete(o) } self end @@ -553,9 +553,9 @@ def delete_if # given. def keep_if block_given? or return enum_for(__method__) { size } - # @hash.keep_if should be faster, but using it breaks the order of - # enumeration in subclasses. - reject { |o| yield o }.each { |o| @hash.delete(o) } + # Instead of directly using @hash.keep_if, perform enumeration + # using self.each that subclasses may override. + reject(&block).each { |o| @hash.delete(o) } self end From 59db92a1a18992d1b95af3cac14855c9f4900649 Mon Sep 17 00:00:00 2001 From: Akinori MUSHA Date: Thu, 19 Sep 2024 16:11:33 +0900 Subject: [PATCH 364/829] [ruby/set] 2024 https://github.com/ruby/set/commit/ea95c5a3d2 --- lib/set.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/set.rb b/lib/set.rb index 374c45b19a4695..46c212beaeddaf 100644 --- a/lib/set.rb +++ b/lib/set.rb @@ -3,7 +3,7 @@ # # set.rb - defines the Set class # -# Copyright (c) 2002-2023 Akinori MUSHA +# Copyright (c) 2002-2024 Akinori MUSHA # # Documentation by Akinori MUSHA and Gavin Sinclair. # From 46ee05f05a01b528ba3fc1cb13b265f2dc9ef749 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Thu, 19 Sep 2024 16:23:08 +0900 Subject: [PATCH 365/829] Added missing block arg --- lib/set.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/set.rb b/lib/set.rb index 46c212beaeddaf..8ac9ce45b16d82 100644 --- a/lib/set.rb +++ b/lib/set.rb @@ -551,7 +551,7 @@ def delete_if(&block) # Deletes every element of the set for which block evaluates to # false, and returns self. Returns an enumerator if no block is # given. - def keep_if + def keep_if(&block) block_given? or return enum_for(__method__) { size } # Instead of directly using @hash.keep_if, perform enumeration # using self.each that subclasses may override. From d9f6e326ad2f8c72282b691547bf6c0c2e3a26ce Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Thu, 19 Sep 2024 18:06:28 +0900 Subject: [PATCH 366/829] Don't update lockfile with bundler/inline --- tool/test_for_warn_bundled_gems/test_no_warn_dash_gem.rb | 3 +++ tool/test_for_warn_bundled_gems/test_no_warn_dependency.rb | 3 +++ tool/test_for_warn_bundled_gems/test_no_warn_sub_feature.rb | 3 +++ tool/test_for_warn_bundled_gems/test_warn_bootsnap.rb | 3 +++ tool/test_for_warn_bundled_gems/test_warn_bootsnap_and_gem.rb | 3 +++ .../test_warn_bootsnap_rubyarchdir_gem.rb | 3 +++ tool/test_for_warn_bundled_gems/test_warn_bundled_gems.rb | 3 +++ tool/test_for_warn_bundled_gems/test_warn_dash_gem.rb | 3 +++ tool/test_for_warn_bundled_gems/test_warn_dependency.rb | 3 +++ tool/test_for_warn_bundled_gems/test_warn_redefined.rb | 3 +++ tool/test_for_warn_bundled_gems/test_warn_sub_feature.rb | 3 +++ tool/test_for_warn_bundled_gems/test_warn_zeitwerk.rb | 3 +++ 12 files changed, 36 insertions(+) diff --git a/tool/test_for_warn_bundled_gems/test_no_warn_dash_gem.rb b/tool/test_for_warn_bundled_gems/test_no_warn_dash_gem.rb index 72ae23b040b0f4..0c6e1c9354bf45 100644 --- a/tool/test_for_warn_bundled_gems/test_no_warn_dash_gem.rb +++ b/tool/test_for_warn_bundled_gems/test_no_warn_dash_gem.rb @@ -1,3 +1,6 @@ +require "bundler" +Bundler::Definition.no_lock = true + require "bundler/inline" gemfile do diff --git a/tool/test_for_warn_bundled_gems/test_no_warn_dependency.rb b/tool/test_for_warn_bundled_gems/test_no_warn_dependency.rb index 94a32a910881b7..11178b5bd18cdb 100644 --- a/tool/test_for_warn_bundled_gems/test_no_warn_dependency.rb +++ b/tool/test_for_warn_bundled_gems/test_no_warn_dependency.rb @@ -1,3 +1,6 @@ +require "bundler" +Bundler::Definition.no_lock = true + require "bundler/inline" gemfile do diff --git a/tool/test_for_warn_bundled_gems/test_no_warn_sub_feature.rb b/tool/test_for_warn_bundled_gems/test_no_warn_sub_feature.rb index 7d62a2f9d041f8..d2b96615cf9285 100644 --- a/tool/test_for_warn_bundled_gems/test_no_warn_sub_feature.rb +++ b/tool/test_for_warn_bundled_gems/test_no_warn_sub_feature.rb @@ -1,3 +1,6 @@ +require "bundler" +Bundler::Definition.no_lock = true + require "bundler/inline" gemfile do diff --git a/tool/test_for_warn_bundled_gems/test_warn_bootsnap.rb b/tool/test_for_warn_bundled_gems/test_warn_bootsnap.rb index eac58de97479c3..230ed3ece9424f 100644 --- a/tool/test_for_warn_bundled_gems/test_warn_bootsnap.rb +++ b/tool/test_for_warn_bundled_gems/test_warn_bootsnap.rb @@ -1,3 +1,6 @@ +require "bundler" +Bundler::Definition.no_lock = true + require "bundler/inline" gemfile do diff --git a/tool/test_for_warn_bundled_gems/test_warn_bootsnap_and_gem.rb b/tool/test_for_warn_bundled_gems/test_warn_bootsnap_and_gem.rb index d154b460224c7e..00fd7709e9709f 100644 --- a/tool/test_for_warn_bundled_gems/test_warn_bootsnap_and_gem.rb +++ b/tool/test_for_warn_bundled_gems/test_warn_bootsnap_and_gem.rb @@ -1,3 +1,6 @@ +require "bundler" +Bundler::Definition.no_lock = true + require "bundler/inline" gemfile do diff --git a/tool/test_for_warn_bundled_gems/test_warn_bootsnap_rubyarchdir_gem.rb b/tool/test_for_warn_bundled_gems/test_warn_bootsnap_rubyarchdir_gem.rb index 477933f6f21a47..866da9c0653e8d 100644 --- a/tool/test_for_warn_bundled_gems/test_warn_bootsnap_rubyarchdir_gem.rb +++ b/tool/test_for_warn_bundled_gems/test_warn_bootsnap_rubyarchdir_gem.rb @@ -1,3 +1,6 @@ +require "bundler" +Bundler::Definition.no_lock = true + require "bundler/inline" gemfile do diff --git a/tool/test_for_warn_bundled_gems/test_warn_bundled_gems.rb b/tool/test_for_warn_bundled_gems/test_warn_bundled_gems.rb index 13168292e39031..bd0e184f7fd127 100644 --- a/tool/test_for_warn_bundled_gems/test_warn_bundled_gems.rb +++ b/tool/test_for_warn_bundled_gems/test_warn_bundled_gems.rb @@ -1,3 +1,6 @@ +require "bundler" +Bundler::Definition.no_lock = true + require "bundler/inline" gemfile do diff --git a/tool/test_for_warn_bundled_gems/test_warn_dash_gem.rb b/tool/test_for_warn_bundled_gems/test_warn_dash_gem.rb index 04ef2a52c02391..49c7d9be464d2f 100644 --- a/tool/test_for_warn_bundled_gems/test_warn_dash_gem.rb +++ b/tool/test_for_warn_bundled_gems/test_warn_dash_gem.rb @@ -1,3 +1,6 @@ +require "bundler" +Bundler::Definition.no_lock = true + require "bundler/inline" gemfile do diff --git a/tool/test_for_warn_bundled_gems/test_warn_dependency.rb b/tool/test_for_warn_bundled_gems/test_warn_dependency.rb index 9be3a2f6d91642..31e416624c502d 100644 --- a/tool/test_for_warn_bundled_gems/test_warn_dependency.rb +++ b/tool/test_for_warn_bundled_gems/test_warn_dependency.rb @@ -1,3 +1,6 @@ +require "bundler" +Bundler::Definition.no_lock = true + require "bundler/inline" gemfile do diff --git a/tool/test_for_warn_bundled_gems/test_warn_redefined.rb b/tool/test_for_warn_bundled_gems/test_warn_redefined.rb index a898a8c07cfe0f..3aee2b0991c922 100644 --- a/tool/test_for_warn_bundled_gems/test_warn_redefined.rb +++ b/tool/test_for_warn_bundled_gems/test_warn_redefined.rb @@ -1,3 +1,6 @@ +require "bundler" +Bundler::Definition.no_lock = true + module My def warn(msg) end diff --git a/tool/test_for_warn_bundled_gems/test_warn_sub_feature.rb b/tool/test_for_warn_bundled_gems/test_warn_sub_feature.rb index bf7eb3572d5222..586a8a13be3c01 100644 --- a/tool/test_for_warn_bundled_gems/test_warn_sub_feature.rb +++ b/tool/test_for_warn_bundled_gems/test_warn_sub_feature.rb @@ -1,3 +1,6 @@ +require "bundler" +Bundler::Definition.no_lock = true + require "bundler/inline" gemfile do diff --git a/tool/test_for_warn_bundled_gems/test_warn_zeitwerk.rb b/tool/test_for_warn_bundled_gems/test_warn_zeitwerk.rb index d554a0e6756845..2076af040808bd 100644 --- a/tool/test_for_warn_bundled_gems/test_warn_zeitwerk.rb +++ b/tool/test_for_warn_bundled_gems/test_warn_zeitwerk.rb @@ -1,3 +1,6 @@ +require "bundler" +Bundler::Definition.no_lock = true + require "bundler/inline" gemfile do From dc8c382266b056fa51408806478218f5230fbce2 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Thu, 19 Sep 2024 17:23:19 +0900 Subject: [PATCH 367/829] Fix bug at fork on FreeBSD The main thread in a forked process appears not to own the read-write lock. --- process.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/process.c b/process.c index 1bfa12ba9185cc..ef4757ab23cd62 100644 --- a/process.c +++ b/process.c @@ -4234,7 +4234,13 @@ rb_fork_ruby(int *status) child.error = err = errno; disable_child_handler_fork_parent(&old); /* yes, bad name */ - rb_thread_release_fork_lock(); + if ( +#if defined(__FreeBSD__) + pid != 0 && +#endif + true) { + rb_thread_release_fork_lock(); + } if (pid == 0) { rb_thread_reset_fork_lock(); } From 167fba52f0fa233e930a0f2b70cc8b368b7e23f9 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Wed, 18 Sep 2024 14:54:52 -0400 Subject: [PATCH 368/829] Remove rb_gc_impl_initial_stress_set --- gc.c | 8 ++++---- gc/default.c | 11 ----------- gc/gc_impl.h | 1 - 3 files changed, 4 insertions(+), 16 deletions(-) diff --git a/gc.c b/gc.c index 9d59163ee0b728..10ab04fb8178c6 100644 --- a/gc.c +++ b/gc.c @@ -581,7 +581,6 @@ typedef struct gc_function_map { void (*ractor_cache_free)(void *objspace_ptr, void *cache); void (*set_params)(void *objspace_ptr); void (*init)(void); - void (*initial_stress_set)(VALUE flag); size_t *(*size_pool_sizes)(void *objspace_ptr); // Shutdown void (*shutdown_free_objects)(void *objspace_ptr); @@ -711,7 +710,6 @@ ruby_external_gc_init(void) load_external_gc_func(ractor_cache_free); load_external_gc_func(set_params); load_external_gc_func(init); - load_external_gc_func(initial_stress_set); load_external_gc_func(size_pool_sizes); // Shutdown load_external_gc_func(shutdown_free_objects); @@ -789,7 +787,6 @@ ruby_external_gc_init(void) # define rb_gc_impl_ractor_cache_free rb_gc_functions.ractor_cache_free # define rb_gc_impl_set_params rb_gc_functions.set_params # define rb_gc_impl_init rb_gc_functions.init -# define rb_gc_impl_initial_stress_set rb_gc_functions.initial_stress_set # define rb_gc_impl_size_pool_sizes rb_gc_functions.size_pool_sizes // Shutdown # define rb_gc_impl_shutdown_free_objects rb_gc_functions.shutdown_free_objects @@ -857,6 +854,8 @@ ruby_external_gc_init(void) # define rb_gc_impl_copy_attributes rb_gc_functions.copy_attributes #endif +static VALUE initial_stress = Qfalse; + void * rb_objspace_alloc(void) { @@ -868,6 +867,7 @@ rb_objspace_alloc(void) ruby_current_vm_ptr->gc.objspace = objspace; rb_gc_impl_objspace_init(objspace); + rb_gc_impl_stress_set(objspace, initial_stress); return objspace; } @@ -3450,7 +3450,7 @@ gc_stress_set_m(rb_execution_context_t *ec, VALUE self, VALUE flag) void rb_gc_initial_stress_set(VALUE flag) { - rb_gc_impl_initial_stress_set(flag); + initial_stress = flag; } size_t * diff --git a/gc/default.c b/gc/default.c index f5893a81194ef6..4ea56c4120aac0 100644 --- a/gc/default.c +++ b/gc/default.c @@ -1556,14 +1556,6 @@ minimum_slots_for_size_pool(rb_objspace_t *objspace, rb_size_pool_t *size_pool) return gc_params.size_pool_init_slots[size_pool_idx]; } -static VALUE initial_stress = Qfalse; - -void -rb_gc_impl_initial_stress_set(VALUE flag) -{ - initial_stress = flag; -} - static int object_id_cmp(st_data_t x, st_data_t y) { @@ -9360,9 +9352,6 @@ rb_gc_impl_objspace_init(void *objspace_ptr) gc_config_full_mark_set(TRUE); - objspace->flags.gc_stressful = RTEST(initial_stress); - objspace->gc_stress_mode = initial_stress; - objspace->flags.measure_gc = true; malloc_limit = gc_params.malloc_limit_min; objspace->finalize_deferred_pjob = rb_postponed_job_preregister(0, gc_finalize_deferred, objspace); diff --git a/gc/gc_impl.h b/gc/gc_impl.h index c83e8ce28de23c..925c336f95689f 100644 --- a/gc/gc_impl.h +++ b/gc/gc_impl.h @@ -32,7 +32,6 @@ GC_IMPL_FN void *rb_gc_impl_ractor_cache_alloc(void *objspace_ptr); GC_IMPL_FN void rb_gc_impl_ractor_cache_free(void *objspace_ptr, void *cache); GC_IMPL_FN void rb_gc_impl_set_params(void *objspace_ptr); GC_IMPL_FN void rb_gc_impl_init(void); -GC_IMPL_FN void rb_gc_impl_initial_stress_set(VALUE flag); GC_IMPL_FN size_t *rb_gc_impl_size_pool_sizes(void *objspace_ptr); // Shutdown GC_IMPL_FN void rb_gc_impl_shutdown_free_objects(void *objspace_ptr); From 6118e8a47394409b53164b60e79fadf348b97db3 Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Mon, 9 Sep 2024 20:48:32 -0700 Subject: [PATCH 369/829] Fix method caching bug when including/prepend module A that prepends module B Fix by always adding the generated iclass to the subclasses list, otherwise the method cache for the iclass is not cleared when the method in the module is overwritten. Fixes [Bug #20716] --- class.c | 10 +++------- test/ruby/test_super.rb | 29 +++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/class.c b/class.c index 5cce99e334d8b1..20086d15d576e8 100644 --- a/class.c +++ b/class.c @@ -1336,7 +1336,6 @@ do_include_modules_at(const VALUE klass, VALUE c, VALUE module, int search_super iclass = rb_include_class_new(module, super_class); c = RCLASS_SET_SUPER(c, iclass); RCLASS_SET_INCLUDER(iclass, klass); - add_subclass = TRUE; if (module != RCLASS_ORIGIN(module)) { if (!origin_stack) origin_stack = rb_ary_hidden_new(2); VALUE origin[2] = {iclass, RCLASS_ORIGIN(module)}; @@ -1347,14 +1346,11 @@ do_include_modules_at(const VALUE klass, VALUE c, VALUE module, int search_super RCLASS_SET_ORIGIN(RARRAY_AREF(origin_stack, (origin_len -= 2)), iclass); RICLASS_SET_ORIGIN_SHARED_MTBL(iclass); rb_ary_resize(origin_stack, origin_len); - add_subclass = FALSE; } - if (add_subclass) { - VALUE m = module; - if (BUILTIN_TYPE(m) == T_ICLASS) m = METACLASS_OF(m); - rb_module_add_to_subclasses_list(m, iclass); - } + VALUE m = module; + if (BUILTIN_TYPE(m) == T_ICLASS) m = METACLASS_OF(m); + rb_module_add_to_subclasses_list(m, iclass); if (BUILTIN_TYPE(klass) == T_MODULE && FL_TEST(klass, RMODULE_IS_REFINEMENT)) { VALUE refined_class = diff --git a/test/ruby/test_super.rb b/test/ruby/test_super.rb index aa09f9e1b9f2a2..418f293f661cfa 100644 --- a/test/ruby/test_super.rb +++ b/test/ruby/test_super.rb @@ -633,6 +633,35 @@ def test_public_zsuper_with_prepend } end + def test_super_with_included_prepended_module_method_caching_bug_20716 + a = Module.new do + def test(*args) + super + end + end + + b = Module.new do + def test(a) + a + end + end + + c = Class.new + + b.prepend(a) + c.include(b) + + assert_equal(1, c.new.test(1)) + + b.class_eval do + def test + :test + end + end + + assert_equal(:test, c.new.test) + end + class TestFor_super_with_modified_rest_parameter_base def foo *args args From d9981beb40ae9ed4fdce788ed629b94a75f2761b Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Wed, 18 Sep 2024 11:40:01 -0400 Subject: [PATCH 370/829] [DOC] Improve docs for GC.latest_gc_info --- gc.rb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/gc.rb b/gc.rb index 32e68c690eb501..2a75e166ce98f9 100644 --- a/gc.rb +++ b/gc.rb @@ -312,13 +312,17 @@ def self.config hash = nil # call-seq: # GC.latest_gc_info -> hash # GC.latest_gc_info(hash) -> hash - # GC.latest_gc_info(:major_by) -> :malloc + # GC.latest_gc_info(key) -> value # # Returns information about the most recent garbage collection. # - # If the optional argument, hash, is given, + # If the argument +hash+ is given and is a Hash object, # it is overwritten and returned. # This is intended to avoid probe effect. + # + # If the argument +key+ is given and is a Symbol object, + # it returns the value associated with the key. + # This is equivalent to GC.latest_gc_info[key]. def self.latest_gc_info hash_or_key = nil if hash_or_key == nil hash_or_key = {} From dc64448202299633a235f310b8bf2192263f274f Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Thu, 19 Sep 2024 10:14:17 -0700 Subject: [PATCH 371/829] Remove an unused variable --- class.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/class.c b/class.c index 20086d15d576e8..c0920e111de64a 100644 --- a/class.c +++ b/class.c @@ -1272,7 +1272,7 @@ static int do_include_modules_at(const VALUE klass, VALUE c, VALUE module, int search_super, bool check_cyclic) { VALUE p, iclass, origin_stack = 0; - int method_changed = 0, add_subclass; + int method_changed = 0; long origin_len; VALUE klass_origin = RCLASS_ORIGIN(klass); VALUE original_klass = klass; From 7a2b5ed5ee10c627f5b47c7dab1f7d0681277162 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Wed, 18 Sep 2024 16:40:18 -0400 Subject: [PATCH 372/829] Replace RB_OBJ_WRITTEN with RB_OBJ_WRITE in pm_compile_scope_node --- prism_compile.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/prism_compile.c b/prism_compile.c index 76d4e05fbec9cb..1fbae42cf8616b 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -6391,10 +6391,7 @@ pm_compile_scope_node(rb_iseq_t *iseq, pm_scope_node_t *scope_node, const pm_nod for (int i = 0; i < RARRAY_LEN(default_values); i++) { VALUE dv = RARRAY_AREF(default_values, i); if (dv == complex_mark) dv = Qundef; - if (!SPECIAL_CONST_P(dv)) { - RB_OBJ_WRITTEN(iseq, Qundef, dv); - } - dvs[i] = dv; + RB_OBJ_WRITE(iseq, &dvs[i], dv); } keyword->default_values = dvs; From ead280fe8b12bfe074cb43abb8a831932f4f2335 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Wed, 18 Sep 2024 16:40:30 -0400 Subject: [PATCH 373/829] Replace RB_OBJ_WRITTEN with RB_OBJ_WRITE in iseq_set_arguments_keywords --- compile.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/compile.c b/compile.c index a0754306c9f5e1..6a471c2d2cd9f7 100644 --- a/compile.c +++ b/compile.c @@ -1991,10 +1991,7 @@ iseq_set_arguments_keywords(rb_iseq_t *iseq, LINK_ANCHOR *const optargs, for (i = 0; i < RARRAY_LEN(default_values); i++) { VALUE dv = RARRAY_AREF(default_values, i); if (dv == complex_mark) dv = Qundef; - if (!SPECIAL_CONST_P(dv)) { - RB_OBJ_WRITTEN(iseq, Qundef, dv); - } - dvs[i] = dv; + RB_OBJ_WRITE(iseq, &dvs[i], dv); } keyword->default_values = dvs; From 2230ac4a28a727bbc621fb085d2d5ed0b6771ca5 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Wed, 18 Sep 2024 16:43:05 -0400 Subject: [PATCH 374/829] Fix potentially missing write barrier in iseq_build_kw We're writing objects to the iseq but not firing the write barrier. --- compile.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compile.c b/compile.c index 6a471c2d2cd9f7..b726a03d5953eb 100644 --- a/compile.c +++ b/compile.c @@ -11954,7 +11954,7 @@ iseq_build_kw(rb_iseq_t *iseq, VALUE params, VALUE keywords) rb_raise(rb_eTypeError, "keyword default has unsupported len %+"PRIsVALUE, key); } ids[i] = SYM2ID(sym); - dvs[j] = default_val; + RB_OBJ_WRITE(iseq, &dvs[j], default_val); } keyword->table = ids; From 26a3de0dfde2399fdda42b41602906cae622d3a5 Mon Sep 17 00:00:00 2001 From: Silvio Traversaro Date: Tue, 10 Nov 2020 23:02:43 +0100 Subject: [PATCH 375/829] Define HAVE_ISINF for Visual Studio >= 2013 isinf is defined in Visual Studio since version 2013. --- win32/Makefile.sub | 3 +++ 1 file changed, 3 insertions(+) diff --git a/win32/Makefile.sub b/win32/Makefile.sub index cd519eb8ed67fa..2598c798d1b8ec 100644 --- a/win32/Makefile.sub +++ b/win32/Makefile.sub @@ -863,6 +863,9 @@ $(CONFIG_H): $(MKFILES) $(srcdir)/win32/Makefile.sub $(win_srcdir)/Makefile.sub #define HAVE_STRCHR 1 #define HAVE_STRSTR 1 #define HAVE_FLOCK 1 +!if $(MSC_VER) >= 1800 +#define HAVE_ISINF 1 +!endif #define HAVE_ISNAN 1 #define HAVE_FINITE 1 !if $(RT_VER) >= 120 From a8d600edff913e5e35d74f563f1f21eb8f7ab367 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Thu, 24 Mar 2022 01:34:02 +0900 Subject: [PATCH 376/829] Extract `iso2022jp_put_state` --- enc/trans/iso2022.trans | 95 +++++++++++++++-------------------------- 1 file changed, 35 insertions(+), 60 deletions(-) diff --git a/enc/trans/iso2022.trans b/enc/trans/iso2022.trans index a441f1596dc6ca..38026eebe71a49 100644 --- a/enc/trans/iso2022.trans +++ b/enc/trans/iso2022.trans @@ -79,6 +79,34 @@ iso2022jp_init(void *statep) return 0; } +static unsigned char * +iso2022jp_put_state(unsigned char *sp, unsigned char *o, int oldstate, int newstate) +{ + if (oldstate != newstate) { + *o++ = 0x1b; + switch (newstate) { + case G0_ASCII: + *o++ = '('; + *o++ = 'B'; + break; + case G0_JISX0201_KATAKANA: + *o++ = '('; + *o++ = 'I'; + break; + case G0_JISX0208_1978: + *o++ = '$'; + *o++ = '@'; + break; + default: + *o++ = '$'; + *o++ = 'B'; + break; + } + *sp = newstate; + } + return o; +} + static VALUE fun_si_iso2022jp_decoder(void *statep, const unsigned char *s, size_t l) { @@ -154,24 +182,7 @@ fun_so_iso2022jp_encoder(void *statep, const unsigned char *s, size_t l, unsigne else newstate = G0_JISX0208_1983; - if (*sp != newstate) { - if (newstate == G0_ASCII) { - *o++ = 0x1b; - *o++ = '('; - *o++ = 'B'; - } - else if (newstate == G0_JISX0208_1978) { - *o++ = 0x1b; - *o++ = '$'; - *o++ = '@'; - } - else { - *o++ = 0x1b; - *o++ = '$'; - *o++ = 'B'; - } - *sp = newstate; - } + o = iso2022jp_put_state(sp, o, *sp, newstate); if (l == 1) { *o++ = s[0] & 0x7f; @@ -202,10 +213,7 @@ finish_iso2022jp_encoder(void *statep, unsigned char *o, size_t osize) if (*sp == G0_ASCII) return 0; - *o++ = 0x1b; - *o++ = '('; - *o++ = 'B'; - *sp = G0_ASCII; + o = iso2022jp_put_state(sp, o, *sp, G0_ASCII); return o - output0; } @@ -399,24 +407,7 @@ fun_so_cp5022x_encoder(void *statep, const unsigned char *s, size_t l, else newstate = G0_JISX0208_1983; - if (*sp != newstate) { - if (newstate == G0_ASCII) { - *o++ = 0x1b; - *o++ = '('; - *o++ = 'B'; - } - else if (newstate == G0_JISX0201_KATAKANA) { - *o++ = 0x1b; - *o++ = '('; - *o++ = 'I'; - } - else { - *o++ = 0x1b; - *o++ = '$'; - *o++ = 'B'; - } - *sp = newstate; - } + o = iso2022jp_put_state(sp, o, sp[0], newstate); if (l == 1) { *o++ = s[0] & 0x7f; @@ -463,11 +454,7 @@ fun_so_cp50220_encoder(void *statep, const unsigned char *s, size_t l, if (sp[0] == G0_JISX0201_KATAKANA) { int c = sp[2] & 0x7F; const char *p = tbl0208 + (c - 0x21) * 2; - if (sp[1] != G0_JISX0208_1983) { - *o++ = 0x1b; - *o++ = '$'; - *o++ = 'B'; - } + o = iso2022jp_put_state(sp, o, sp[1], G0_JISX0208_1983); sp[0] = G0_JISX0208_1983; *o++ = *p++; if (l == 2 && s[0] == 0x8E) { @@ -488,12 +475,7 @@ fun_so_cp50220_encoder(void *statep, const unsigned char *s, size_t l, if ((0xA1 <= s[1] && s[1] <= 0xB5) || (0xC5 <= s[1] && s[1] <= 0xC9) || (0xCF <= s[1] && s[1] <= 0xDF)) { - if (*sp != G0_JISX0208_1983) { - *o++ = 0x1b; - *o++ = '$'; - *o++ = 'B'; - *sp = G0_JISX0208_1983; - } + o = iso2022jp_put_state(sp, o, *sp, G0_JISX0208_1983); *o++ = *p++; *o++ = *p; return o - output0; @@ -521,20 +503,13 @@ finish_cp50220_encoder(void *statep, unsigned char *o, size_t osize) if (sp[0] == G0_JISX0201_KATAKANA) { int c = sp[2] & 0x7F; const char *p = tbl0208 + (c - 0x21) * 2; - if (sp[1] != G0_JISX0208_1983) { - *o++ = 0x1b; - *o++ = '$'; - *o++ = 'B'; - } + o = iso2022jp_put_state(sp, o, sp[1], G0_JISX0208_1983); sp[0] = G0_JISX0208_1983; *o++ = *p++; *o++ = *p; } - *o++ = 0x1b; - *o++ = '('; - *o++ = 'B'; - *sp = G0_ASCII; + o = iso2022jp_put_state(sp, o, sp[0], G0_ASCII); return o - output0; } From 546f13fded6481e89c8e1f8a9f85d2ccd167f4d7 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Thu, 24 Mar 2022 01:37:15 +0900 Subject: [PATCH 377/829] Define `tbl0208` as a static array --- enc/trans/iso2022.trans | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/enc/trans/iso2022.trans b/enc/trans/iso2022.trans index 38026eebe71a49..c2e65b329ac37c 100644 --- a/enc/trans/iso2022.trans +++ b/enc/trans/iso2022.trans @@ -434,7 +434,9 @@ rb_cp50221_encoder = { iso2022jp_encoder_reset_sequence_size, finish_iso2022jp_encoder }; -static const char *tbl0208 = +/* JIS0201 to JIS0208 conversion table */ +enum {tbl0208_num = 0xDF - 0xA1 + 1}; +static const char tbl0208[2 * tbl0208_num] = "\x21\x23\x21\x56\x21\x57\x21\x22\x21\x26\x25\x72\x25\x21\x25\x23" \ "\x25\x25\x25\x27\x25\x29\x25\x63\x25\x65\x25\x67\x25\x43\x21\x3C" \ "\x25\x22\x25\x24\x25\x26\x25\x28\x25\x2A\x25\x2B\x25\x2D\x25\x2F" \ From 75a8c937e75a0b57fbdbc3d72a2429f5799a42e4 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Thu, 24 Mar 2022 01:42:06 +0900 Subject: [PATCH 378/829] [Bug #18651] Pass undefined region in CP51932 as is to CP50220 --- enc/trans/iso2022.trans | 14 +++++++++++--- test/ruby/test_transcode.rb | 2 ++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/enc/trans/iso2022.trans b/enc/trans/iso2022.trans index c2e65b329ac37c..e77cf0fc307ed1 100644 --- a/enc/trans/iso2022.trans +++ b/enc/trans/iso2022.trans @@ -453,9 +453,10 @@ fun_so_cp50220_encoder(void *statep, const unsigned char *s, size_t l, unsigned char *output0 = o; unsigned char *sp = statep; - if (sp[0] == G0_JISX0201_KATAKANA) { + if (sp[0] == G0_JISX0201_KATAKANA && sp[2]) { int c = sp[2] & 0x7F; const char *p = tbl0208 + (c - 0x21) * 2; + sp[2] = 0; o = iso2022jp_put_state(sp, o, sp[1], G0_JISX0208_1983); sp[0] = G0_JISX0208_1983; *o++ = *p++; @@ -473,16 +474,23 @@ fun_so_cp50220_encoder(void *statep, const unsigned char *s, size_t l, } if (l == 2 && s[0] == 0x8E) { - const char *p = tbl0208 + (s[1] - 0xA1) * 2; if ((0xA1 <= s[1] && s[1] <= 0xB5) || (0xC5 <= s[1] && s[1] <= 0xC9) || (0xCF <= s[1] && s[1] <= 0xDF)) { + const char *p = tbl0208 + (s[1] - 0xA1) * 2; o = iso2022jp_put_state(sp, o, *sp, G0_JISX0208_1983); *o++ = *p++; *o++ = *p; return o - output0; } + if (s[1] > 0xDF) { /* undef */ + o = iso2022jp_put_state(sp, o, *sp, G0_JISX0201_KATAKANA); + *o++ = s[1] & 0x7F; + sp[2] = 0; + return o - output0; + } + sp[2] = s[1]; sp[1] = sp[0]; sp[0] = G0_JISX0201_KATAKANA; @@ -502,7 +510,7 @@ finish_cp50220_encoder(void *statep, unsigned char *o, size_t osize) if (*sp == G0_ASCII) return 0; - if (sp[0] == G0_JISX0201_KATAKANA) { + if (sp[0] == G0_JISX0201_KATAKANA && sp[2]) { int c = sp[2] & 0x7F; const char *p = tbl0208 + (c - 0x21) * 2; o = iso2022jp_put_state(sp, o, sp[1], G0_JISX0208_1983); diff --git a/test/ruby/test_transcode.rb b/test/ruby/test_transcode.rb index 144f4d83a1ba92..63d37f4ba4ff90 100644 --- a/test/ruby/test_transcode.rb +++ b/test/ruby/test_transcode.rb @@ -1634,6 +1634,8 @@ def test_to_cp50221 assert_equal("\e$B%*!+%,%I%J!+%N!+%P%\\%^!+%Q%]%\"\e(B".force_encoding("cp50220"), "\xB5\xDE\xB6\xDE\xC4\xDE\xC5\xDE\xC9\xDE\xCA\xDE\xCE\xDE\xCF\xDE\xCA\xDF\xCE\xDF\xB1". encode("cp50220", "sjis")) + assert_equal("\e$B\x21\x23\e(I\x7E\e(B".force_encoding("cp50220"), + "\x8E\xA1\x8E\xFE".encode("cp50220", "cp51932")) end def test_iso_2022_jp_1 From aa2662d5906cb3d7b55b42539b39976f5a32856a Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Fri, 20 Sep 2024 16:14:07 +0900 Subject: [PATCH 379/829] Simplify offset calculations of `tbl0208` --- enc/trans/iso2022.trans | 38 +++++++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/enc/trans/iso2022.trans b/enc/trans/iso2022.trans index e77cf0fc307ed1..a25a4a12a14ad5 100644 --- a/enc/trans/iso2022.trans +++ b/enc/trans/iso2022.trans @@ -436,15 +436,24 @@ rb_cp50221_encoder = { /* JIS0201 to JIS0208 conversion table */ enum {tbl0208_num = 0xDF - 0xA1 + 1}; -static const char tbl0208[2 * tbl0208_num] = - "\x21\x23\x21\x56\x21\x57\x21\x22\x21\x26\x25\x72\x25\x21\x25\x23" \ - "\x25\x25\x25\x27\x25\x29\x25\x63\x25\x65\x25\x67\x25\x43\x21\x3C" \ - "\x25\x22\x25\x24\x25\x26\x25\x28\x25\x2A\x25\x2B\x25\x2D\x25\x2F" \ - "\x25\x31\x25\x33\x25\x35\x25\x37\x25\x39\x25\x3B\x25\x3D\x25\x3F" \ - "\x25\x41\x25\x44\x25\x46\x25\x48\x25\x4A\x25\x4B\x25\x4C\x25\x4D" \ - "\x25\x4E\x25\x4F\x25\x52\x25\x55\x25\x58\x25\x5B\x25\x5E\x25\x5F" \ - "\x25\x60\x25\x61\x25\x62\x25\x64\x25\x66\x25\x68\x25\x69\x25\x6A" \ - "\x25\x6B\x25\x6C\x25\x6D\x25\x6F\x25\x73\x21\x2B\x21\x2C"; +static const char tbl0208[tbl0208_num][2] = { + "\x21\x23", "\x21\x56", "\x21\x57", "\x21\x22", + "\x21\x26", "\x25\x72", "\x25\x21", "\x25\x23", + "\x25\x25", "\x25\x27", "\x25\x29", "\x25\x63", + "\x25\x65", "\x25\x67", "\x25\x43", "\x21\x3C", + "\x25\x22", "\x25\x24", "\x25\x26", "\x25\x28", + "\x25\x2A", "\x25\x2B", "\x25\x2D", "\x25\x2F", + "\x25\x31", "\x25\x33", "\x25\x35", "\x25\x37", + "\x25\x39", "\x25\x3B", "\x25\x3D", "\x25\x3F", + "\x25\x41", "\x25\x44", "\x25\x46", "\x25\x48", + "\x25\x4A", "\x25\x4B", "\x25\x4C", "\x25\x4D", + "\x25\x4E", "\x25\x4F", "\x25\x52", "\x25\x55", + "\x25\x58", "\x25\x5B", "\x25\x5E", "\x25\x5F", + "\x25\x60", "\x25\x61", "\x25\x62", "\x25\x64", + "\x25\x66", "\x25\x68", "\x25\x69", "\x25\x6A", + "\x25\x6B", "\x25\x6C", "\x25\x6D", "\x25\x6F", + "\x25\x73", "\x21\x2B", "\x21\x2C" +}; static ssize_t fun_so_cp50220_encoder(void *statep, const unsigned char *s, size_t l, @@ -455,17 +464,19 @@ fun_so_cp50220_encoder(void *statep, const unsigned char *s, size_t l, if (sp[0] == G0_JISX0201_KATAKANA && sp[2]) { int c = sp[2] & 0x7F; - const char *p = tbl0208 + (c - 0x21) * 2; + const char *p = tbl0208[c - 0x21]; sp[2] = 0; o = iso2022jp_put_state(sp, o, sp[1], G0_JISX0208_1983); sp[0] = G0_JISX0208_1983; *o++ = *p++; if (l == 2 && s[0] == 0x8E) { if (s[1] == 0xDE) { + /* VOICED SOUND MARK */ *o++ = *p + 1; return o - output0; } else if (s[1] == 0xDF && (0x4A <= c && c <= 0x4E)) { + /* SEMI-VOICED SOUND MARK */ *o++ = *p + 2; return o - output0; } @@ -477,7 +488,8 @@ fun_so_cp50220_encoder(void *statep, const unsigned char *s, size_t l, if ((0xA1 <= s[1] && s[1] <= 0xB5) || (0xC5 <= s[1] && s[1] <= 0xC9) || (0xCF <= s[1] && s[1] <= 0xDF)) { - const char *p = tbl0208 + (s[1] - 0xA1) * 2; + /* May not be followed by a sound mark */ + const char *p = tbl0208[s[1] - 0xA1]; o = iso2022jp_put_state(sp, o, *sp, G0_JISX0208_1983); *o++ = *p++; *o++ = *p; @@ -491,6 +503,7 @@ fun_so_cp50220_encoder(void *statep, const unsigned char *s, size_t l, return o - output0; } + /* Katakana that may be followed by a sound mark */ sp[2] = s[1]; sp[1] = sp[0]; sp[0] = G0_JISX0201_KATAKANA; @@ -512,7 +525,7 @@ finish_cp50220_encoder(void *statep, unsigned char *o, size_t osize) if (sp[0] == G0_JISX0201_KATAKANA && sp[2]) { int c = sp[2] & 0x7F; - const char *p = tbl0208 + (c - 0x21) * 2; + const char *p = tbl0208[c - 0x21]; o = iso2022jp_put_state(sp, o, sp[1], G0_JISX0208_1983); sp[0] = G0_JISX0208_1983; *o++ = *p++; @@ -549,4 +562,3 @@ TRANS_INIT(iso2022) rb_register_transcoder(&rb_cp50220_encoder); rb_register_transcoder(&rb_cp50221_encoder); } - From cf29594c03f7d3d4200ab346d81008b66301be36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Wed, 18 Sep 2024 16:57:02 +0200 Subject: [PATCH 380/829] [rubygems/rubygems] Don't try to install locked bundler when `--local` is passed https://github.com/rubygems/rubygems/commit/907d46964d --- lib/bundler/cli/install.rb | 6 +++++- spec/bundler/runtime/self_management_spec.rb | 11 +++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/lib/bundler/cli/install.rb b/lib/bundler/cli/install.rb index 038ea246fb8aac..b0b354cf107698 100644 --- a/lib/bundler/cli/install.rb +++ b/lib/bundler/cli/install.rb @@ -12,7 +12,11 @@ def run warn_if_root - Bundler.self_manager.install_locked_bundler_and_restart_with_it_if_needed + if options[:local] + Bundler.self_manager.restart_with_locked_bundler_if_needed + else + Bundler.self_manager.install_locked_bundler_and_restart_with_it_if_needed + end Bundler::SharedHelpers.set_env "RB_USER_INSTALL", "1" if Gem.freebsd_platform? diff --git a/spec/bundler/runtime/self_management_spec.rb b/spec/bundler/runtime/self_management_spec.rb index d2472dece295d7..320b7062e89278 100644 --- a/spec/bundler/runtime/self_management_spec.rb +++ b/spec/bundler/runtime/self_management_spec.rb @@ -131,6 +131,17 @@ expect(out).to eq(Bundler::VERSION[0] == "2" ? "Bundler version #{Bundler::VERSION}" : Bundler::VERSION) end + it "does not try to install when --local is passed" do + lockfile_bundled_with(previous_minor) + system_gems "myrack-1.0.0", path: default_bundle_path + + bundle "install --local" + expect(out).not_to match(/Installing Bundler/) + + bundle "-v" + expect(out).to eq(Bundler::VERSION[0] == "2" ? "Bundler version #{Bundler::VERSION}" : Bundler::VERSION) + end + it "shows a discrete message if locked bundler does not exist" do missing_minor = "#{Bundler::VERSION[0]}.999.999" From 34e008d0756a355e0658f9b52f7d66b4b8eee388 Mon Sep 17 00:00:00 2001 From: tomoya ishida Date: Fri, 20 Sep 2024 19:13:34 +0900 Subject: [PATCH 381/829] [ruby/irb] Fix debug command in nomultiline mode (https://github.com/ruby/irb/pull/1006) * Fix debug command in nomultiline mode * context.colorize_code -> context.colorize_input https://github.com/ruby/irb/commit/71f4d6bfb5 --- lib/irb/context.rb | 15 +++++++++++++++ lib/irb/debug.rb | 16 ++++++---------- lib/irb/input-method.rb | 21 +++------------------ test/irb/yamatanooroti/test_rendering.rb | 22 ++++++++++++++++++++++ 4 files changed, 46 insertions(+), 28 deletions(-) diff --git a/lib/irb/context.rb b/lib/irb/context.rb index fafe99d57be4e3..668a823f5cb4cf 100644 --- a/lib/irb/context.rb +++ b/lib/irb/context.rb @@ -649,6 +649,21 @@ def parse_command(code) end end + def colorize_input(input, complete:) + if IRB.conf[:USE_COLORIZE] && IRB::Color.colorable? + lvars = local_variables || [] + if parse_command(input) + name, sep, arg = input.split(/(\s+)/, 2) + arg = IRB::Color.colorize_code(arg, complete: complete, local_variables: lvars) + "#{IRB::Color.colorize(name, [:BOLD])}\e[m#{sep}#{arg}" + else + IRB::Color.colorize_code(input, complete: complete, local_variables: lvars) + end + else + Reline::Unicode.escape_for_print(input) + end + end + def inspect_last_value # :nodoc: @inspect_method.inspect_value(@last_value) end diff --git a/lib/irb/debug.rb b/lib/irb/debug.rb index 1ec2335a8e9705..cd64b77ad72a72 100644 --- a/lib/irb/debug.rb +++ b/lib/irb/debug.rb @@ -57,22 +57,18 @@ def DEBUGGER__.capture_frames(*args) DEBUGGER__::ThreadClient.prepend(SkipPathHelperForIRB) end - if !@output_modifier_defined && !DEBUGGER__::CONFIG[:no_hint] - irb_output_modifier_proc = Reline.output_modifier_proc - - Reline.output_modifier_proc = proc do |output, complete:| - unless output.strip.empty? - cmd = output.split(/\s/, 2).first + if !DEBUGGER__::CONFIG[:no_hint] && irb.context.io.is_a?(RelineInputMethod) + Reline.output_modifier_proc = proc do |input, complete:| + unless input.strip.empty? + cmd = input.split(/\s/, 2).first if !complete && DEBUGGER__.commands.key?(cmd) - output = output.sub(/\n$/, " # debug command\n") + input = input.sub(/\n$/, " # debug command\n") end end - irb_output_modifier_proc.call(output, complete: complete) + irb.context.colorize_input(input, complete: complete) end - - @output_modifier_defined = true end true diff --git a/lib/irb/input-method.rb b/lib/irb/input-method.rb index 82c1e7329765ba..210d3da78955f6 100644 --- a/lib/irb/input-method.rb +++ b/lib/irb/input-method.rb @@ -265,24 +265,9 @@ def initialize(completor) @completion_params = [preposing, target, postposing, bind] @completor.completion_candidates(preposing, target, postposing, bind: bind) } - Reline.output_modifier_proc = - if IRB.conf[:USE_COLORIZE] - proc do |output, complete: | - next unless IRB::Color.colorable? - lvars = IRB.CurrentContext&.local_variables || [] - if IRB.CurrentContext&.parse_command(output) - name, sep, arg = output.split(/(\s+)/, 2) - arg = IRB::Color.colorize_code(arg, complete: complete, local_variables: lvars) - "#{IRB::Color.colorize(name, [:BOLD])}\e[m#{sep}#{arg}" - else - IRB::Color.colorize_code(output, complete: complete, local_variables: lvars) - end - end - else - proc do |output| - Reline::Unicode.escape_for_print(output) - end - end + Reline.output_modifier_proc = proc do |input, complete:| + IRB.CurrentContext.colorize_input(input, complete: complete) + end Reline.dig_perfect_match_proc = ->(matched) { display_document(matched) } Reline.autocompletion = IRB.conf[:USE_AUTOCOMPLETE] diff --git a/test/irb/yamatanooroti/test_rendering.rb b/test/irb/yamatanooroti/test_rendering.rb index 44e07a3a1232c1..834c501d5c6035 100644 --- a/test/irb/yamatanooroti/test_rendering.rb +++ b/test/irb/yamatanooroti/test_rendering.rb @@ -507,6 +507,28 @@ def test_debug_integration_doesnt_hint_non_debugger_commands File.unlink(script) if script end + def test_debug_integration_doesnt_hint_debugger_commands_in_nomultiline_mode + write_irbrc <<~'LINES' + IRB.conf[:USE_SINGLELINE] = true + LINES + script = Tempfile.create(["debug", ".rb"]) + script.write <<~RUBY + puts 'start IRB' + binding.irb + RUBY + script.close + start_terminal(40, 80, %W{ruby -I#{@pwd}/lib #{script.to_path}}, startup_message: 'start IRB') + write("debug\n") + write("pp 1") + close + + screen = result.join("\n").sub(/\n*\z/, "\n") + # submitted input shouldn't contain hint + assert_include(screen, "irb:rdbg(main):002> pp 1\n") + ensure + File.unlink(script) if script + end + private def write_irbrc(content) From 511925f99b4fc87b5461c42f3fd4de05670bea6f Mon Sep 17 00:00:00 2001 From: OKURA Masafumi Date: Fri, 15 Dec 2023 10:26:10 +0800 Subject: [PATCH 382/829] [ci-skip] Fix doc for `refinements` The current doc is partially wrong since `refinements` method returns an array of `Refinement` class, not `Module`. I'm not sure if it's right to link to `Refinement`, but it has some documentation so it should be useful. https://docs.ruby-lang.org/en/3.2/Refinement.html --- eval.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eval.c b/eval.c index f7d3033834919a..7fb9d35903ffd4 100644 --- a/eval.c +++ b/eval.c @@ -1547,7 +1547,7 @@ mod_using(VALUE self, VALUE module) * call-seq: * refinements -> array * - * Returns an array of modules defined within the receiver. + * Returns an array of +Refinement+ defined within the receiver. * * module A * refine Integer do From 276bb584570eef4565a11d0dbb246b2b4aed8390 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Fri, 20 Sep 2024 19:39:27 +0900 Subject: [PATCH 383/829] Update parsey.yml as others --- .github/workflows/parsey.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/parsey.yml b/.github/workflows/parsey.yml index 73e0f4847c5e0b..1280276c88ec28 100644 --- a/.github/workflows/parsey.yml +++ b/.github/workflows/parsey.yml @@ -3,20 +3,18 @@ on: push: paths-ignore: - 'doc/**' + - '**/man/*' - '**.md' - '**.rdoc' - '**/.document' - - '**.[1-8]' - - '**.ronn' - '.*.yml' pull_request: paths-ignore: - 'doc/**' + - '**/man/*' - '**.md' - '**.rdoc' - '**/.document' - - '**.[1-8]' - - '**.ronn' - '.*.yml' merge_group: @@ -92,6 +90,8 @@ jobs: srcdir: src builddir: build makeup: true + clean: true + dummy-files: ${{ matrix.test_task == 'check' }} - name: Run configure run: ../src/configure -C --disable-install-doc cppflags=-DRUBY_DEBUG From 7836626f92be77c02da633077863f84435acee5d Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Fri, 20 Sep 2024 22:50:27 +0900 Subject: [PATCH 384/829] Add c-style for prism [ci skip] --- misc/ruby-style.el | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/misc/ruby-style.el b/misc/ruby-style.el index 13aad77b3d734b..45fdccc6f2457c 100644 --- a/misc/ruby-style.el +++ b/misc/ruby-style.el @@ -66,6 +66,17 @@ (access-label /) ))) +(c-add-style + "prism" + '("bsd" + (c-basic-offset . 4) + (tab-width . 8) + (indent-tabs-mode . nil) + (setq show-trailing-whitespace t) + (c-offsets-alist + (case-label . +) + ))) + ;;;###autoload (defun ruby-style-c-mode () (interactive) From 43e3416b700e421ffdff3a9c534e1de620bb7ad6 Mon Sep 17 00:00:00 2001 From: Samuel Giddins Date: Thu, 19 Sep 2024 15:10:40 -0700 Subject: [PATCH 385/829] [rubygems/rubygems] Unconditionally set installed_by_version It has been supported since RubyGems 2.2.0 via https://github.com/rubygems/rubygems/commit/4525e45a4d45 Signed-off-by: Samuel Giddins https://github.com/rubygems/rubygems/commit/bf39c583e8 --- lib/bundler/plugin/api/source.rb | 2 +- lib/bundler/rubygems_integration.rb | 5 ----- lib/bundler/source/git.rb | 2 +- lib/bundler/source/path.rb | 2 +- lib/rubygems/specification.rb | 2 +- test/rubygems/test_gem_specification.rb | 2 +- 6 files changed, 5 insertions(+), 10 deletions(-) diff --git a/lib/bundler/plugin/api/source.rb b/lib/bundler/plugin/api/source.rb index f91b2638755646..690f37938947dd 100644 --- a/lib/bundler/plugin/api/source.rb +++ b/lib/bundler/plugin/api/source.rb @@ -131,7 +131,7 @@ def specs Bundler::Index.build do |index| files.each do |file| next unless spec = Bundler.load_gemspec(file) - Bundler.rubygems.set_installed_by_version(spec) + spec.installed_by_version = Gem::VERSION spec.source = self Bundler.rubygems.validate(spec) diff --git a/lib/bundler/rubygems_integration.rb b/lib/bundler/rubygems_integration.rb index 72dead88f2741a..b98d3b7b8cc746 100644 --- a/lib/bundler/rubygems_integration.rb +++ b/lib/bundler/rubygems_integration.rb @@ -61,11 +61,6 @@ def validate(spec) nil end - def set_installed_by_version(spec, installed_by_version = Gem::VERSION) - return unless spec.respond_to?(:installed_by_version=) - spec.installed_by_version = Gem::Version.create(installed_by_version) - end - def spec_missing_extensions?(spec, default = true) return spec.missing_extensions? if spec.respond_to?(:missing_extensions?) diff --git a/lib/bundler/source/git.rb b/lib/bundler/source/git.rb index 2a327e5fb670f7..c52ce046389e9e 100644 --- a/lib/bundler/source/git.rb +++ b/lib/bundler/source/git.rb @@ -299,7 +299,7 @@ def serialize_gemspecs_in(destination) # The gemspecs we cache should already be evaluated. spec = Bundler.load_gemspec(spec_path) next unless spec - Bundler.rubygems.set_installed_by_version(spec) + spec.installed_by_version = Gem::VERSION Bundler.rubygems.validate(spec) File.open(spec_path, "wb") {|file| file.write(spec.to_ruby) } end diff --git a/lib/bundler/source/path.rb b/lib/bundler/source/path.rb index 754eaa39c46bda..6a99f8e977ec67 100644 --- a/lib/bundler/source/path.rb +++ b/lib/bundler/source/path.rb @@ -148,7 +148,7 @@ def has_app_cache? def load_gemspec(file) return unless spec = Bundler.load_gemspec(file) - Bundler.rubygems.set_installed_by_version(spec) + spec.installed_by_version = Gem::VERSION spec end diff --git a/lib/rubygems/specification.rb b/lib/rubygems/specification.rb index 38986d56330f83..5735038ad30e71 100644 --- a/lib/rubygems/specification.rb +++ b/lib/rubygems/specification.rb @@ -2472,7 +2472,7 @@ def to_ruby if @installed_by_version result << nil - result << " s.installed_by_version = #{ruby_code Gem::VERSION} if s.respond_to? :installed_by_version" + result << " s.installed_by_version = #{ruby_code Gem::VERSION}" end unless dependencies.empty? diff --git a/test/rubygems/test_gem_specification.rb b/test/rubygems/test_gem_specification.rb index 81c601f0076f37..0a009cbd7bcb9a 100644 --- a/test/rubygems/test_gem_specification.rb +++ b/test/rubygems/test_gem_specification.rb @@ -2368,7 +2368,7 @@ def test_to_ruby_for_cache s.rubygems_version = "#{Gem::VERSION}".freeze s.summary = "this is a summary".freeze - s.installed_by_version = "#{Gem::VERSION}".freeze if s.respond_to? :installed_by_version + s.installed_by_version = "#{Gem::VERSION}".freeze s.specification_version = #{Gem::Specification::CURRENT_SPECIFICATION_VERSION} From 2882408dcb2b30a2f0041d8712e75d614149c6d7 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Fri, 20 Sep 2024 10:58:19 -0400 Subject: [PATCH 386/829] Remove unneeded function prototype for rb_gc_impl_mark --- gc/default.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/gc/default.c b/gc/default.c index 4ea56c4120aac0..d60fba3ff08849 100644 --- a/gc/default.c +++ b/gc/default.c @@ -9303,8 +9303,6 @@ rb_gc_impl_objspace_free(void *objspace_ptr) free(objspace); } -void rb_gc_impl_mark(void *objspace_ptr, VALUE obj); - #if MALLOC_ALLOCATED_SIZE /* * call-seq: From f515a1ab4b04ae79e02194e1f25a400b9f3f8f66 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Fri, 20 Sep 2024 11:20:04 -0400 Subject: [PATCH 387/829] [ruby/prism] Introduce partial_script option https://github.com/ruby/prism/commit/b28877fa4f --- lib/prism/ffi.rb | 3 +++ prism/extension.c | 10 ++++++++++ prism/options.c | 9 +++++++++ prism/options.h | 25 +++++++++++++++++++++++-- prism/parser.h | 7 +++++++ prism/prism.c | 12 ++++++++---- test/prism/api/parse_test.rb | 14 ++++++++++++++ 7 files changed, 74 insertions(+), 6 deletions(-) diff --git a/lib/prism/ffi.rb b/lib/prism/ffi.rb index 40a4b32621d22a..95206680f9b205 100644 --- a/lib/prism/ffi.rb +++ b/lib/prism/ffi.rb @@ -451,6 +451,9 @@ def dump_options(options) template << "C" values << (options.fetch(:main_script, false) ? 1 : 0) + template << "C" + values << (options.fetch(:partial_script, false) ? 1 : 0) + template << "L" if (scopes = options[:scopes]) values << scopes.length diff --git a/prism/extension.c b/prism/extension.c index f08682e0f3e95b..ea83f768fe894c 100644 --- a/prism/extension.c +++ b/prism/extension.c @@ -32,6 +32,7 @@ ID rb_id_option_filepath; ID rb_id_option_frozen_string_literal; ID rb_id_option_line; ID rb_id_option_main_script; +ID rb_id_option_partial_script; ID rb_id_option_scopes; ID rb_id_option_version; ID rb_id_source_for; @@ -182,6 +183,8 @@ build_options_i(VALUE key, VALUE value, VALUE argument) { } } else if (key_id == rb_id_option_main_script) { if (!NIL_P(value)) pm_options_main_script_set(options, RTEST(value)); + } else if (key_id == rb_id_option_partial_script) { + if (!NIL_P(value)) pm_options_partial_script_set(options, RTEST(value)); } else { rb_raise(rb_eArgError, "unknown keyword: %" PRIsVALUE, key); } @@ -761,6 +764,12 @@ parse_input(pm_string_t *input, const pm_options_t *options) { * or not shebangs are parsed for additional flags and whether or not the * parser will attempt to find a matching shebang if the first one does * not contain the word "ruby". + * * `partial_script` - when the file being parsed is considered a "partial" + * script, jumps will not be marked as errors if they are not contained + * within loops/blocks. This is used in the case that you're parsing a + * script that you know will be embedded inside another script later, but + * you do not have that context yet. For example, when parsing an ERB + * template that will be evaluated inside another script. * * `scopes` - the locals that are in scope surrounding the code that is being * parsed. This should be an array of arrays of symbols or nil. Scopes are * ordered from the outermost scope to the innermost one. @@ -1174,6 +1183,7 @@ Init_prism(void) { rb_id_option_frozen_string_literal = rb_intern_const("frozen_string_literal"); rb_id_option_line = rb_intern_const("line"); rb_id_option_main_script = rb_intern_const("main_script"); + rb_id_option_partial_script = rb_intern_const("partial_script"); rb_id_option_scopes = rb_intern_const("scopes"); rb_id_option_version = rb_intern_const("version"); rb_id_source_for = rb_intern("for"); diff --git a/prism/options.c b/prism/options.c index 67b257138cbce3..3004fcef2c452d 100644 --- a/prism/options.c +++ b/prism/options.c @@ -108,6 +108,14 @@ pm_options_main_script_set(pm_options_t *options, bool main_script) { options->main_script = main_script; } +/** + * Set the partial script option on the given options struct. + */ +PRISM_EXPORTED_FUNCTION void +pm_options_partial_script_set(pm_options_t *options, bool partial_script) { + options->partial_script = partial_script; +} + // For some reason, GCC analyzer thinks we're leaking allocated scopes and // locals here, even though we definitely aren't. This is a false positive. // Ideally we wouldn't need to suppress this. @@ -242,6 +250,7 @@ pm_options_read(pm_options_t *options, const char *data) { options->version = (pm_options_version_t) *data++; options->encoding_locked = ((uint8_t) *data++) > 0; options->main_script = ((uint8_t) *data++) > 0; + options->partial_script = ((uint8_t) *data++) > 0; uint32_t scopes_count = pm_options_read_u32(data); data += 4; diff --git a/prism/options.h b/prism/options.h index 3cb73049516f07..efc0748894878b 100644 --- a/prism/options.h +++ b/prism/options.h @@ -146,6 +146,16 @@ typedef struct pm_options { * to pass this information to the parser so that it can behave correctly. */ bool main_script; + + /** + * When the file being parsed is considered a "partial" script, jumps will + * not be marked as errors if they are not contained within loops/blocks. + * This is used in the case that you're parsing a script that you know will + * be embedded inside another script later, but you do not have that context + * yet. For example, when parsing an ERB template that will be evaluated + * inside another script. + */ + bool partial_script; } pm_options_t; /** @@ -263,6 +273,14 @@ PRISM_EXPORTED_FUNCTION bool pm_options_version_set(pm_options_t *options, const */ PRISM_EXPORTED_FUNCTION void pm_options_main_script_set(pm_options_t *options, bool main_script); +/** + * Set the partial script option on the given options struct. + * + * @param options The options struct to set the partial script value on. + * @param partial_script The partial script value to set. + */ +PRISM_EXPORTED_FUNCTION void pm_options_partial_script_set(pm_options_t *options, bool partial_script); + /** * Allocate and zero out the scopes array on the given options struct. * @@ -330,6 +348,9 @@ PRISM_EXPORTED_FUNCTION void pm_options_free(pm_options_t *options); * | `1` | -l command line option | * | `1` | -a command line option | * | `1` | the version | + * | `1` | encoding locked | + * | `1` | main script | + * | `1` | partial script | * | `4` | the number of scopes | * | ... | the scopes | * @@ -362,8 +383,8 @@ PRISM_EXPORTED_FUNCTION void pm_options_free(pm_options_t *options); * * The encoding can have a length of 0, in which case we'll use the default * encoding (UTF-8). If it's not 0, it should correspond to a name of an * encoding that can be passed to `Encoding.find` in Ruby. - * * The frozen string literal and suppress warnings fields are booleans, so - * their values should be either 0 or 1. + * * The frozen string literal, encoding locked, main script, and partial script + * fields are booleans, so their values should be either 0 or 1. * * The number of scopes can be 0. * * @param options The options struct to deserialize into. diff --git a/prism/parser.h b/prism/parser.h index ea40fc910a23b2..bdff8ad2996819 100644 --- a/prism/parser.h +++ b/prism/parser.h @@ -861,6 +861,13 @@ struct pm_parser { */ bool parsing_eval; + /** + * Whether or not we are parsing a "partial" script, which is a script that + * will be evaluated in the context of another script, so we should not + * check jumps (next/break/etc.) for validity. + */ + bool partial_script; + /** Whether or not we're at the beginning of a command. */ bool command_start; diff --git a/prism/prism.c b/prism/prism.c index 1cbacf00d3ef2e..6020f108a4d131 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -18852,12 +18852,12 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b switch (keyword.type) { case PM_TOKEN_KEYWORD_BREAK: { pm_node_t *node = (pm_node_t *) pm_break_node_create(parser, &keyword, arguments.arguments); - parse_block_exit(parser, node); + if (!parser->partial_script) parse_block_exit(parser, node); return node; } case PM_TOKEN_KEYWORD_NEXT: { pm_node_t *node = (pm_node_t *) pm_next_node_create(parser, &keyword, arguments.arguments); - parse_block_exit(parser, node); + if (!parser->partial_script) parse_block_exit(parser, node); return node; } case PM_TOKEN_KEYWORD_RETURN: { @@ -18905,7 +18905,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b } pm_node_t *node = (pm_node_t *) pm_yield_node_create(parser, &keyword, &arguments.opening_loc, arguments.arguments, &arguments.closing_loc); - if (!parser->parsing_eval) parse_yield(parser, node); + if (!parser->parsing_eval && !parser->partial_script) parse_yield(parser, node); return node; } @@ -19574,7 +19574,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b parser_lex(parser); pm_node_t *node = (pm_node_t *) pm_redo_node_create(parser, &parser->previous); - parse_block_exit(parser, node); + if (!parser->partial_script) parse_block_exit(parser, node); return node; } @@ -21899,6 +21899,7 @@ pm_parser_init(pm_parser_t *parser, const uint8_t *source, size_t size, const pm .explicit_encoding = NULL, .command_line = 0, .parsing_eval = false, + .partial_script = false, .command_start = true, .recovering = false, .encoding_locked = false, @@ -21962,6 +21963,9 @@ pm_parser_init(pm_parser_t *parser, const uint8_t *source, size_t size, const pm // version option parser->version = options->version; + // partial_script + parser->partial_script = options->partial_script; + // scopes option parser->parsing_eval = options->scopes_count > 0; if (parser->parsing_eval) parser->warn_mismatched_indentation = false; diff --git a/test/prism/api/parse_test.rb b/test/prism/api/parse_test.rb index 19c1feabb13ff1..ac8f8c30dcac18 100644 --- a/test/prism/api/parse_test.rb +++ b/test/prism/api/parse_test.rb @@ -90,6 +90,20 @@ def test_parse_directory assert_kind_of Errno::EISDIR, error end + def test_partial_script + assert Prism.parse_failure?("break") + assert Prism.parse_success?("break", partial_script: true) + + assert Prism.parse_failure?("next") + assert Prism.parse_success?("next", partial_script: true) + + assert Prism.parse_failure?("redo") + assert Prism.parse_success?("redo", partial_script: true) + + assert Prism.parse_failure?("yield") + assert Prism.parse_success?("yield", partial_script: true) + end + private def find_source_file_node(program) From 42a6916a3c120afcce76910059e09408ace3c24b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Fri, 20 Sep 2024 13:12:43 +0200 Subject: [PATCH 388/829] [rubygems/rubygems] Fix RubyGems warnings about minimum required Ruby https://github.com/rubygems/rubygems/commit/8f262f3a47 --- spec/bundler/support/builders.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/spec/bundler/support/builders.rb b/spec/bundler/support/builders.rb index a0b94004f25764..b493ab8d60001d 100644 --- a/spec/bundler/support/builders.rb +++ b/spec/bundler/support/builders.rb @@ -456,6 +456,7 @@ def initialize(context, name, version) s.email = "foo@bar.baz" s.homepage = "http://example.com" s.license = "MIT" + s.required_ruby_version = ">= 3.0" end @files = {} end From c30297b3d19283ec27b1d0248bed9fca6092038b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Fri, 20 Sep 2024 13:13:02 +0200 Subject: [PATCH 389/829] [rubygems/rubygems] Fix RubyGems warnings about incorrect executable permissions https://github.com/rubygems/rubygems/commit/92dcf60fc1 --- spec/bundler/support/builders.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spec/bundler/support/builders.rb b/spec/bundler/support/builders.rb index b493ab8d60001d..18cd6fe1efc5eb 100644 --- a/spec/bundler/support/builders.rb +++ b/spec/bundler/support/builders.rb @@ -538,10 +538,10 @@ def @spec.validate(*); end end @files.each do |file, source| - file = Pathname.new(path).join(file) - FileUtils.mkdir_p(file.dirname) - File.open(file, "w") {|f| f.puts source } - File.chmod("+x", file) if @spec.executables.map {|exe| "#{@spec.bindir}/#{exe}" }.include?(file) + full_path = Pathname.new(path).join(file) + FileUtils.mkdir_p(full_path.dirname) + File.open(full_path, "w") {|f| f.puts source } + FileUtils.chmod("+x", full_path) if @spec.executables.map {|exe| "#{@spec.bindir}/#{exe}" }.include?(file) end path end From c262861e5c999e080eba29a12b789724db178303 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Fri, 20 Sep 2024 13:22:09 +0200 Subject: [PATCH 390/829] [rubygems/rubygems] Fix RubyGems warnings about pre-release dependencies Nothing here relies on the dependency being on a pre-release, and Bundler does not use prereleases in the realworld. https://github.com/rubygems/rubygems/commit/96f5742ff1 --- spec/bundler/commands/update_spec.rb | 6 +++--- spec/bundler/install/bundler_spec.rb | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/spec/bundler/commands/update_spec.rb b/spec/bundler/commands/update_spec.rb index e87fecaa6d8004..1683827636bda2 100644 --- a/spec/bundler/commands/update_spec.rb +++ b/spec/bundler/commands/update_spec.rb @@ -1202,10 +1202,10 @@ before do build_repo2 do build_gem "rails", "3.0.1" do |s| - s.add_dependency "bundler", Bundler::VERSION.succ + s.add_dependency "bundler", "9.9.9" end - build_gem "bundler", Bundler::VERSION.succ + build_gem "bundler", "9.9.9" end gemfile <<-G @@ -1218,7 +1218,7 @@ bundle "update", all: true, raise_on_error: false expect(last_command.stdboth).not_to match(/in snapshot/i) expect(err).to match(/current Bundler version/i). - and match(/Install the necessary version with `gem install bundler:#{Bundler::VERSION.succ}`/i) + and match(/Install the necessary version with `gem install bundler:9\.9\.9`/i) end end diff --git a/spec/bundler/install/bundler_spec.rb b/spec/bundler/install/bundler_spec.rb index 95edf7859d27ef..56f843118166ac 100644 --- a/spec/bundler/install/bundler_spec.rb +++ b/spec/bundler/install/bundler_spec.rb @@ -5,7 +5,7 @@ before(:each) do build_repo2 do build_gem "rails", "3.0" do |s| - s.add_dependency "bundler", ">= 0.9.0.pre" + s.add_dependency "bundler", ">= 0.9.0" end build_gem "bundler", "0.9.1" build_gem "bundler", Bundler::VERSION @@ -59,8 +59,8 @@ nice_error = <<~E.strip Could not find compatible versions - Because rails >= 3.0 depends on bundler >= 0.9.0.pre - and the current Bundler version (#{Bundler::VERSION}) does not satisfy bundler >= 0.9.0.pre, < 1.A, + Because rails >= 3.0 depends on bundler >= 0.9.0 + and the current Bundler version (#{Bundler::VERSION}) does not satisfy bundler >= 0.9.0, < 1.A, rails >= 3.0 requires bundler >= 1.A. So, because Gemfile depends on rails = 3.0 and Gemfile depends on bundler ~> 0.8, From 9bf3210adba9129f429ddf2489515f67a43c640d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Fri, 20 Sep 2024 13:59:13 +0200 Subject: [PATCH 391/829] [rubygems/rubygems] Fix RubyGems warnings about missing shebang https://github.com/rubygems/rubygems/commit/362c960497 --- spec/bundler/commands/binstubs_spec.rb | 3 ++- spec/bundler/support/builders.rb | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/spec/bundler/commands/binstubs_spec.rb b/spec/bundler/commands/binstubs_spec.rb index 74582226f8890a..87a68a9cf17ee3 100644 --- a/spec/bundler/commands/binstubs_spec.rb +++ b/spec/bundler/commands/binstubs_spec.rb @@ -115,7 +115,8 @@ build_gem "prints_loaded_gems", "1.0" do |s| s.executables = "print_loaded_gems" s.bindir = "exe" - s.write "exe/print_loaded_gems", <<-R + s.write "exe/print_loaded_gems", <<~R + #!/usr/bin/env ruby specs = Gem.loaded_specs.values.reject {|s| s.default_gem? } puts specs.map(&:full_name).sort.inspect R diff --git a/spec/bundler/support/builders.rb b/spec/bundler/support/builders.rb index 18cd6fe1efc5eb..d71ac5190dacb8 100644 --- a/spec/bundler/support/builders.rb +++ b/spec/bundler/support/builders.rb @@ -153,7 +153,7 @@ def build_repo1 build_gem "bundler", "0.9" do |s| s.executables = "bundle" - s.write "bin/bundle", "puts 'FAIL'" + s.write "bin/bundle", "#!/usr/bin/env ruby\nputs 'FAIL'" end # The bundler 0.8 gem has a rubygems plugin that always loads :( From 8dd87a66f58dcc35fea871c9b120e230043e9051 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Fri, 20 Sep 2024 14:21:46 +0200 Subject: [PATCH 392/829] [rubygems/rubygems] I don't think we need a conditional shebang https://github.com/rubygems/rubygems/commit/7ba7073a35 --- spec/bundler/support/builders.rb | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/spec/bundler/support/builders.rb b/spec/bundler/support/builders.rb index d71ac5190dacb8..a187d2ae4841c8 100644 --- a/spec/bundler/support/builders.rb +++ b/spec/bundler/support/builders.rb @@ -473,11 +473,7 @@ def executables=(val) @spec.executables = Array(val) @spec.executables.each do |file| executable = "#{@spec.bindir}/#{file}" - shebang = if Bundler.current_ruby.jruby? - "#!/usr/bin/env jruby\n" - else - "#!/usr/bin/env ruby\n" - end + shebang = "#!/usr/bin/env ruby\n" @spec.files << executable write executable, "#{shebang}require_relative '../lib/#{@name}' ; puts #{Builders.constantize(@name)}" end From 54a21851fef85563940dffbb2fe19e1da69d44bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Fri, 20 Sep 2024 14:24:06 +0200 Subject: [PATCH 393/829] [rubygems/rubygems] Disallow RubyGems warnings during Bundler test suite https://github.com/rubygems/rubygems/commit/472371ee1e --- spec/bundler/support/helpers.rb | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/spec/bundler/support/helpers.rb b/spec/bundler/support/helpers.rb index ef52e88eed6565..145008ab42a5db 100644 --- a/spec/bundler/support/helpers.rb +++ b/spec/bundler/support/helpers.rb @@ -186,7 +186,10 @@ def gem_command(command, options = {}) env = options[:env] || {} env["RUBYOPT"] = opt_add(opt_add("-r#{spec_dir}/support/hax.rb", env["RUBYOPT"]), ENV["RUBYOPT"]) options[:env] = env - sys_exec("#{Path.gem_bin} #{command}", options) + output = sys_exec("#{Path.gem_bin} #{command}", options) + stderr = last_command.stderr + raise stderr if stderr.include?("WARNING") && !allowed_rubygems_warning?(stderr) + output end def rake @@ -542,6 +545,10 @@ def exit_status_for_signal(signal_number) private + def allowed_rubygems_warning?(text) + text.include?("open-ended") || text.include?("is a symlink") || text.include?("rake based") || text.include?("expected RubyGems version") + end + def match_source(contents) match = /source ["']?(?http[^"']+)["']?/.match(contents) return unless match From 69f28ab715a02692fb2a9128bed46044963cbb50 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Fri, 20 Sep 2024 12:34:28 -0400 Subject: [PATCH 394/829] GC guard current_string in the putobject instruction This is a band-aid solution for #11655 that only applies the fix for the putobject instruction before the objtostring instruction. This should help fix the use-after-poison in the ASAN CI. http://ci.rvm.jp/logfiles/brlog.trunk_asan.20240920-082802 --- prism_compile.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/prism_compile.c b/prism_compile.c index 1fbae42cf8616b..e88b24e5cf2ee2 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -646,7 +646,9 @@ pm_interpolated_node_compile(rb_iseq_t *iseq, const pm_node_list_t *parts, const current_string = rb_enc_str_new(NULL, 0, encoding); } - PUSH_INSN1(ret, current_location, putobject, rb_fstring(current_string)); + current_string = rb_fstring(current_string); + PUSH_INSN1(ret, current_location, putobject, current_string); + RB_GC_GUARD(current_string); PM_COMPILE_NOT_POPPED(part); const pm_node_location_t current_location = PM_NODE_START_LOCATION(scope_node->parser, part); From 75ed086348da66e4cfe9488ae9ece5462dd2aef9 Mon Sep 17 00:00:00 2001 From: Koichi ITO Date: Tue, 10 Sep 2024 12:22:13 +0900 Subject: [PATCH 395/829] [ruby/prism] Fix `kDO_LAMBDA` token incompatibility for `Prism::Translation::Parser::Lexer` ## Summary This PR fixes `kDO_LAMBDA` token incompatibility between Parser gem and `Prism::Translation::Parser` for lambda `do` block. ### Parser gem (Expected) Returns `kDO_LAMBDA` token: ```console $ bundle exec ruby -Ilib -rparser/ruby33 -ve \ 'buf = Parser::Source::Buffer.new("example.rb"); buf.source = "-> do end"; p Parser::Ruby33.new.tokenize(buf)[2]' ruby 3.4.0dev (2024-09-01T11:00:13Z master https://github.com/ruby/prism/commit/eb144ef91e) [x86_64-darwin23] [[:tLAMBDA, ["->", #]], [:kDO_LAMBDA, ["do", #]], [:kEND, ["end", #]]] ``` ### `Prism::Translation::Parser` (Actual) Previously, the parser returned `kDO` token when parsing the following: ```console $ bundle exec ruby -Ilib -rprism -rprism/translation/parser33 -ve \ 'buf = Parser::Source::Buffer.new("example.rb"); buf.source = "-> do end"; p Prism::Translation::Parser33.new.tokenize(buf)[2]' ruby 3.4.0dev (2024-09-01T11:00:13Z master https://github.com/ruby/prism/commit/eb144ef91e) [x86_64-darwin23] [[:tLAMBDA, ["->", #]], [:kDO, ["do", #]], [:kEND, ["end", #]]] ``` After the update, the parser now returns `kDO_LAMBDA` token for the same input: ```console $ bundle exec ruby -Ilib -rprism -rprism/translation/parser33 -ve \ 'buf = Parser::Source::Buffer.new("example.rb"); buf.source = "-> do end"; p Prism::Translation::Parser33.new.tokenize(buf)[2]' ruby 3.4.0dev (2024-09-01T11:00:13Z master https://github.com/ruby/prism/commit/eb144ef91e) [x86_64-darwin23] [[:tLAMBDA, ["->", #]], [:kDO_LAMBDA, ["do", #]], [:kEND, ["end", #]]] ``` ## Additional Information Unfortunately, this kind of edge case doesn't work as expected; `kDO` is returned instead of `kDO_LAMBDA`. However, since `kDO` is already being returned in this case, there is no change in behavior. ### Parser gem Returns `tLAMBDA` token: ```console $ bundle exec ruby -Ilib -rparser/ruby33 -ve \ 'buf = Parser::Source::Buffer.new("example.rb"); buf.source = "-> (foo = -> (bar) {}) do end"; p Parser::Ruby33.new.tokenize(buf)[2]' ruby 3.3.5 (2024-09-03 revision https://github.com/ruby/prism/commit/ef084cc8f4) [x86_64-darwin23] [[:tLAMBDA, ["->", #]], [:tLPAREN2, ["(", #]], [:tIDENTIFIER, ["foo", #]], [:tEQL, ["=", #]], [:tLAMBDA, ["->", #]], [:tLPAREN2, ["(", #]], [:tIDENTIFIER, ["bar", #]], [:tRPAREN, [")", #]], [:tLAMBEG, ["{", #]], [:tRCURLY, ["}", #]], [:tRPAREN, [")", #]], [:kDO_LAMBDA, ["do", #]], [:kEND, ["end", #]]] ``` ### `Prism::Translation::Parser` Returns `kDO` token: ```console $ bundle exec ruby -Ilib -rprism -rprism/translation/parser33 -ve \ 'buf = Parser::Source::Buffer.new("example.rb"); buf.source = "-> (foo = -> (bar) {}) do end"; p Prism::Translation::Parser33.new.tokenize(buf)[2]' ruby 3.3.5 (2024-09-03 revision https://github.com/ruby/prism/commit/ef084cc8f4) [x86_64-darwin23] [[:tLAMBDA, ["->", #]], [:tLPAREN2, ["(", #]], [:tIDENTIFIER, ["foo", #]], [:tEQL, ["=", #]], [:tLAMBDA, ["->", #]], [:tLPAREN2, ["(", #]], [:tIDENTIFIER, ["bar", #]], [:tRPAREN, [")", #]], [:tLAMBEG, ["{", #]], [:tRCURLY, ["}", #]], [:tRPAREN, [")", #]], [:kDO, ["do", #]], [:kEND, ["end", #]]] ``` As the intention is not to address such special cases at this point, a comment has been left indicating that this case still returns `kDO`. In other words, `kDO_LAMBDA` will now be returned except for edge cases after this PR. https://github.com/ruby/prism/commit/2ee480654c --- lib/prism/translation/parser/lexer.rb | 15 ++++++++++++++- test/prism/ruby/parser_test.rb | 2 +- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/prism/translation/parser/lexer.rb b/lib/prism/translation/parser/lexer.rb index 5ca507f7e7ab73..db7dbb1c8768ed 100644 --- a/lib/prism/translation/parser/lexer.rb +++ b/lib/prism/translation/parser/lexer.rb @@ -187,6 +187,12 @@ class Lexer EXPR_BEG = 0x1 # :nodoc: EXPR_LABEL = 0x400 # :nodoc: + # It is used to determine whether `do` is of the token type `kDO` or `kDO_LAMBDA`. + # + # NOTE: In edge cases like `-> (foo = -> (bar) {}) do end`, please note that `kDO` is still returned + # instead of `kDO_LAMBDA`, which is expected: https://github.com/ruby/prism/pull/3046 + LAMBDA_TOKEN_TYPES = [:kDO_LAMBDA, :tLAMBDA, :tLAMBEG] + # The `PARENTHESIS_LEFT` token in Prism is classified as either `tLPAREN` or `tLPAREN2` in the Parser gem. # The following token types are listed as those classified as `tLPAREN`. LPAREN_CONVERSION_TOKEN_TYPES = [ @@ -194,7 +200,7 @@ class Lexer :tEQL, :tLPAREN, :tLPAREN2, :tLSHFT, :tNL, :tOP_ASGN, :tOROP, :tPIPE, :tSEMI, :tSTRING_DBEG, :tUMINUS, :tUPLUS ] - private_constant :TYPES, :EXPR_BEG, :EXPR_LABEL, :LPAREN_CONVERSION_TOKEN_TYPES + private_constant :TYPES, :EXPR_BEG, :EXPR_LABEL, :LAMBDA_TOKEN_TYPES, :LPAREN_CONVERSION_TOKEN_TYPES # The Parser::Source::Buffer that the tokens were lexed from. attr_reader :source_buffer @@ -236,6 +242,13 @@ def to_a location = Range.new(source_buffer, offset_cache[token.location.start_offset], offset_cache[token.location.end_offset]) case type + when :kDO + types = tokens.map(&:first) + nearest_lambda_token_type = types.reverse.find { |type| LAMBDA_TOKEN_TYPES.include?(type) } + + if nearest_lambda_token_type == :tLAMBDA + type = :kDO_LAMBDA + end when :tCHARACTER value.delete_prefix!("?") when :tCOMMENT diff --git a/test/prism/ruby/parser_test.rb b/test/prism/ruby/parser_test.rb index 87749efdda71ce..606a0e54f64c03 100644 --- a/test/prism/ruby/parser_test.rb +++ b/test/prism/ruby/parser_test.rb @@ -268,7 +268,7 @@ def assert_equal_tokens(expected_tokens, actual_tokens) # There are a lot of tokens that have very specific meaning according # to the context of the parser. We don't expose that information in # prism, so we need to normalize these tokens a bit. - if actual_token[0] == :kDO && %i[kDO_BLOCK kDO_LAMBDA].include?(expected_token[0]) + if expected_token[0] == :kDO_BLOCK && actual_token[0] == :kDO actual_token[0] = expected_token[0] end From 9f574fa12f0cbe9d7aa4a11a6c7055ed32f02822 Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Fri, 20 Sep 2024 14:57:56 -0700 Subject: [PATCH 396/829] Make Complex#{inspect,to_s} work correctly if real part #inspect returns frozen string Make static f_format function take a non-frozen string to append to. This does not result in an additional allocation for #inspect, but it does result in an additional allocation for #to_s. Fixes [Bug #20337] --- complex.c | 9 ++++----- test/ruby/test_complex.rb | 11 +++++++++++ 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/complex.c b/complex.c index f562ed316123c7..b89c6f1f930916 100644 --- a/complex.c +++ b/complex.c @@ -1593,16 +1593,15 @@ f_tpositive_p(VALUE x) } static VALUE -f_format(VALUE self, VALUE (*func)(VALUE)) +f_format(VALUE self, VALUE s, VALUE (*func)(VALUE)) { - VALUE s; int impos; get_dat1(self); impos = f_tpositive_p(dat->imag); - s = (*func)(dat->real); + rb_str_concat(s, (*func)(dat->real)); rb_str_cat2(s, !impos ? "-" : "+"); rb_str_concat(s, (*func)(f_abs(dat->imag))); @@ -1629,7 +1628,7 @@ f_format(VALUE self, VALUE (*func)(VALUE)) static VALUE nucomp_to_s(VALUE self) { - return f_format(self, rb_String); + return f_format(self, rb_usascii_str_new2(""), rb_String); } /* @@ -1651,7 +1650,7 @@ nucomp_inspect(VALUE self) VALUE s; s = rb_usascii_str_new2("("); - rb_str_concat(s, f_format(self, rb_inspect)); + f_format(self, s, rb_inspect); rb_str_cat2(s, ")"); return s; diff --git a/test/ruby/test_complex.rb b/test/ruby/test_complex.rb index c0cfb732357e4d..bb131cee911e9a 100644 --- a/test/ruby/test_complex.rb +++ b/test/ruby/test_complex.rb @@ -741,6 +741,17 @@ def test_inspect assert_equal('(1+2i)', c.inspect) end + def test_inspect_to_s_frozen_bug_20337 + assert_separately([], <<~'RUBY') + class Numeric + def inspect = super.freeze + end + c = Complex(Numeric.new, 1) + assert_match(/\A\(# Date: Sat, 21 Sep 2024 08:39:42 +0900 Subject: [PATCH 397/829] Reuse dedent_string function in rb_ruby_ripper_dedent_string function This change is reduce Ruby C API dependency for Universal Parser. Reuse dedent_string functions in rb_ruby_ripper_dedent_string functions and remove dependencies on rb_str_modify and rb_str_set_len from the parser. --- ext/ripper/ripper_init.c.tmpl | 15 +++++++++++++-- internal/parse.h | 2 +- parse.y | 18 ++---------------- ruby_parser.c | 2 -- rubyparser.h | 2 -- universal_parser.c | 6 ------ 6 files changed, 16 insertions(+), 29 deletions(-) diff --git a/ext/ripper/ripper_init.c.tmpl b/ext/ripper/ripper_init.c.tmpl index fc98c067b87f21..d73ac263a62d1b 100644 --- a/ext/ripper/ripper_init.c.tmpl +++ b/ext/ripper/ripper_init.c.tmpl @@ -252,6 +252,17 @@ ripper_parser_set_debug_output(VALUE self, VALUE output) return output; } +static int +ripper_parser_dedent_string(struct parser_params *p, VALUE string, int width) +{ + int col; + rb_parser_string_t *str; + str = rb_str_to_parser_string(p, string); + col = rb_ruby_ripper_dedent_string(p, str, width); + rb_str_replace(string, rb_str_new_parser_string(str)); + return col; +} + #ifdef UNIVERSAL_PARSER struct dedent_string_arg { struct parser_params *p; @@ -267,7 +278,7 @@ parser_dedent_string0(VALUE a) StringValue(arg->input); wid = NUM2UINT(arg->width); - col = rb_ruby_ripper_dedent_string(arg->p, arg->input, wid); + col = ripper_parser_dedent_string(arg->p, arg->input, wid); return INT2NUM(col); } @@ -312,7 +323,7 @@ parser_dedent_string(VALUE self, VALUE input, VALUE width) StringValue(input); wid = NUM2UINT(width); - col = rb_ruby_ripper_dedent_string(0, input, wid); + col = ripper_parser_dedent_string(0, input, wid); return INT2NUM(col); } #endif diff --git a/internal/parse.h b/internal/parse.h index 88230fd177df98..29accaa7ff9476 100644 --- a/internal/parse.h +++ b/internal/parse.h @@ -104,7 +104,7 @@ VALUE rb_ruby_parser_ruby_sourcefile_string(rb_parser_t *p); int rb_ruby_parser_ruby_sourceline(rb_parser_t *p); int rb_ruby_parser_lex_state(rb_parser_t *p); void rb_ruby_ripper_parse0(rb_parser_t *p); -int rb_ruby_ripper_dedent_string(rb_parser_t *p, VALUE string, int width); +int rb_ruby_ripper_dedent_string(rb_parser_t *p, rb_parser_string_t *string, int width); int rb_ruby_ripper_initialized_p(rb_parser_t *p); void rb_ruby_ripper_parser_initialize(rb_parser_t *p); long rb_ruby_ripper_column(rb_parser_t *p); diff --git a/parse.y b/parse.y index 435741a6087295..09a786ccdd746c 100644 --- a/parse.y +++ b/parse.y @@ -15868,23 +15868,9 @@ rb_ruby_ripper_parse0(rb_parser_t *p) } int -rb_ruby_ripper_dedent_string(rb_parser_t *p, VALUE string, int width) +rb_ruby_ripper_dedent_string(rb_parser_t *p, rb_parser_string_t *string, int width) { - char *str; - long len; - int i; - - RSTRING_GETMEM(string, str, len); - i = dedent_string_column(str, len, width); - if (!i) return 0; - - rb_str_modify(string); - str = RSTRING_PTR(string); - if (RSTRING_LEN(string) != len) - rb_fatal("literal string changed: %+"PRIsVALUE, string); - MEMMOVE(str, str + i, char, len - i); - rb_str_set_len(string, len - i); - return i; + return dedent_string(p, string, width); } int diff --git a/ruby_parser.c b/ruby_parser.c index 8e68493de1f35c..28e63886af7504 100644 --- a/ruby_parser.c +++ b/ruby_parser.c @@ -371,8 +371,6 @@ static const rb_parser_config_t rb_global_parser_config = { .str_catf = rb_str_catf, .str_cat_cstr = rb_str_cat_cstr, - .str_modify = rb_str_modify, - .str_set_len = rb_str_set_len, .str_cat = rb_str_cat, .str_resize = rb_str_resize, .str_new = rb_str_new, diff --git a/rubyparser.h b/rubyparser.h index 8168c356e9619c..c38266324bca24 100644 --- a/rubyparser.h +++ b/rubyparser.h @@ -1205,8 +1205,6 @@ typedef struct rb_parser_config_struct { RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT, 2, 3) VALUE (*str_catf)(VALUE str, const char *format, ...); VALUE (*str_cat_cstr)(VALUE str, const char *ptr); - void (*str_modify)(VALUE str); - void (*str_set_len)(VALUE str, long len); VALUE (*str_cat)(VALUE str, const char *ptr, long len); VALUE (*str_resize)(VALUE str, long len); VALUE (*str_new)(const char *ptr, long len); diff --git a/universal_parser.c b/universal_parser.c index d2105a946509cd..ee3be70edcafc8 100644 --- a/universal_parser.c +++ b/universal_parser.c @@ -26,10 +26,6 @@ #define rb_strlen_lit(str) (sizeof(str "") - 1) #undef FIXNUM_MAX #define FIXNUM_MAX (LONG_MAX / 2) -#undef RSTRING_GETMEM -#define RSTRING_GETMEM(str, ptrvar, lenvar) \ - ((ptrvar) = RSTRING_PTR(str), \ - (lenvar) = RSTRING_LEN(str)) /* parser_st */ #define st_table parser_st_table @@ -119,8 +115,6 @@ #define rb_str_catf p->config->str_catf #undef rb_str_cat_cstr #define rb_str_cat_cstr p->config->str_cat_cstr -#define rb_str_modify p->config->str_modify -#define rb_str_set_len p->config->str_set_len #define rb_str_cat p->config->str_cat #define rb_str_resize p->config->str_resize #undef rb_str_new From 02b36f75721aa61d48e3031c71695837d7a8a410 Mon Sep 17 00:00:00 2001 From: KJ Tsanaktsidis Date: Sat, 21 Sep 2024 21:11:27 +1000 Subject: [PATCH 398/829] Unpoison page->freelist before trying to assert on it Otherwise trying to deref the pointer can cause an ASAN crash, even though the only reason we're dereferencing it is so that we can assert on it. --- gc/default.c | 10 +++------- internal/sanitizers.h | 29 +++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/gc/default.c b/gc/default.c index d60fba3ff08849..addaf01fc29f69 100644 --- a/gc/default.c +++ b/gc/default.c @@ -788,7 +788,9 @@ heap_page_in_global_empty_pages_pool(rb_objspace_t *objspace, struct heap_page * GC_ASSERT(page->slot_size == 0); GC_ASSERT(page->size_pool == NULL); GC_ASSERT(page->free_slots == 0); - GC_ASSERT(page->freelist == NULL); + asan_unpoisoning_memory_region(&page->freelist, sizeof(&page->freelist)) { + GC_ASSERT(page->freelist == NULL); + } return true; } @@ -1177,12 +1179,6 @@ tick(void) #define MEASURE_LINE(expr) expr #endif /* USE_TICK_T */ -#define asan_unpoisoning_object(obj) \ - for (void *poisoned = asan_unpoison_object_temporary(obj), \ - *unpoisoning = &poisoned; /* flag to loop just once */ \ - unpoisoning; \ - unpoisoning = asan_poison_object_restore(obj, poisoned)) - #define FL_CHECK2(name, x, pred) \ ((RGENGC_CHECK_MODE && SPECIAL_CONST_P(x)) ? \ (rb_bug(name": SPECIAL_CONST (%p)", (void *)(x)), 0) : (pred)) diff --git a/internal/sanitizers.h b/internal/sanitizers.h index b0eb1fc851b415..94f4e4165a6a0c 100644 --- a/internal/sanitizers.h +++ b/internal/sanitizers.h @@ -206,6 +206,35 @@ asan_poison_object_restore(VALUE obj, void *ptr) return NULL; } +#define asan_unpoisoning_object(obj) \ + for (void *poisoned = asan_unpoison_object_temporary(obj), \ + *unpoisoning = &poisoned; /* flag to loop just once */ \ + unpoisoning; \ + unpoisoning = asan_poison_object_restore(obj, poisoned)) + + +static inline void * +asan_unpoison_memory_region_temporary(void *ptr, size_t len) +{ + void *poisoned_ptr = __asan_region_is_poisoned(ptr, len); + asan_unpoison_memory_region(ptr, len, false); + return poisoned_ptr; +} + +static inline void * +asan_poison_memory_region_restore(void *ptr, size_t len, void *poisoned_ptr) +{ + if (poisoned_ptr) { + asan_poison_memory_region(ptr, len); + } + return NULL; +} + +#define asan_unpoisoning_memory_region(ptr, len) \ + for (void *poisoned = asan_unpoison_memory_region_temporary(ptr, len), \ + *unpoisoning = &poisoned; /* flag to loop just once */ \ + unpoisoning; \ + unpoisoning = asan_poison_memory_region_restore(ptr, len, poisoned)) /** * Checks if the given pointer is on an ASAN fake stack. If so, it returns the From feac2b4b77b337a637d80793c53b680e5697cab6 Mon Sep 17 00:00:00 2001 From: ydah Date: Sun, 22 Sep 2024 00:13:16 +0900 Subject: [PATCH 399/829] Implement CASE NODE keyword locations --- ast.c | 5 +++++ node_dump.c | 4 +++- parse.y | 10 ++++++---- rubyparser.h | 2 ++ test/ruby/test_ast.rb | 5 +++++ 5 files changed, 21 insertions(+), 5 deletions(-) diff --git a/ast.c b/ast.c index 47e7cf595ec319..e5565ae00af3bc 100644 --- a/ast.c +++ b/ast.c @@ -787,6 +787,11 @@ node_locations(VALUE ast_value, const NODE *node) return rb_ary_new_from_args(2, location_new(nd_code_loc(node)), location_new(&RNODE_BREAK(node)->keyword_loc)); + case NODE_CASE: + return rb_ary_new_from_args(3, + location_new(nd_code_loc(node)), + location_new(&RNODE_CASE(node)->case_keyword_loc), + location_new(&RNODE_CASE(node)->end_keyword_loc)); case NODE_NEXT: return rb_ary_new_from_args(2, location_new(nd_code_loc(node)), diff --git a/node_dump.c b/node_dump.c index 882bf15486a4d0..3e92c87bf0b7a5 100644 --- a/node_dump.c +++ b/node_dump.c @@ -261,8 +261,10 @@ dump_node(VALUE buf, VALUE indent, int comment, const NODE * node) ANN("format: case [nd_head]; [nd_body]; end"); ANN("example: case x; when 1; foo; when 2; bar; else baz; end"); F_NODE(nd_head, RNODE_CASE, "case expr"); - LAST_NODE; F_NODE(nd_body, RNODE_CASE, "when clauses"); + F_LOC(case_keyword_loc, RNODE_CASE); + LAST_NODE; + F_LOC(end_keyword_loc, RNODE_CASE); return; case NODE_CASE2: ANN("case statement with no head"); diff --git a/parse.y b/parse.y index 09a786ccdd746c..550f00d56b9250 100644 --- a/parse.y +++ b/parse.y @@ -1063,7 +1063,7 @@ static rb_node_scope_t *rb_node_scope_new2(struct parser_params *p, rb_ast_id_ta static rb_node_block_t *rb_node_block_new(struct parser_params *p, NODE *nd_head, const YYLTYPE *loc); static rb_node_if_t *rb_node_if_new(struct parser_params *p, NODE *nd_cond, NODE *nd_body, NODE *nd_else, const YYLTYPE *loc); static rb_node_unless_t *rb_node_unless_new(struct parser_params *p, NODE *nd_cond, NODE *nd_body, NODE *nd_else, const YYLTYPE *loc, const YYLTYPE *keyword_loc, const YYLTYPE *then_keyword_loc, const YYLTYPE *end_keyword_loc); -static rb_node_case_t *rb_node_case_new(struct parser_params *p, NODE *nd_head, NODE *nd_body, const YYLTYPE *loc); +static rb_node_case_t *rb_node_case_new(struct parser_params *p, NODE *nd_head, NODE *nd_body, const YYLTYPE *loc, const YYLTYPE *case_keyword_loc, const YYLTYPE *end_keyword_loc); static rb_node_case2_t *rb_node_case2_new(struct parser_params *p, NODE *nd_body, const YYLTYPE *loc); static rb_node_case3_t *rb_node_case3_new(struct parser_params *p, NODE *nd_head, NODE *nd_body, const YYLTYPE *loc); static rb_node_when_t *rb_node_when_new(struct parser_params *p, NODE *nd_head, NODE *nd_body, NODE *nd_next, const YYLTYPE *loc, const YYLTYPE *keyword_loc, const YYLTYPE *then_keyword_loc); @@ -1171,7 +1171,7 @@ static rb_node_error_t *rb_node_error_new(struct parser_params *p, const YYLTYPE #define NEW_BLOCK(a,loc) (NODE *)rb_node_block_new(p,a,loc) #define NEW_IF(c,t,e,loc) (NODE *)rb_node_if_new(p,c,t,e,loc) #define NEW_UNLESS(c,t,e,loc,k_loc,t_loc,e_loc) (NODE *)rb_node_unless_new(p,c,t,e,loc,k_loc,t_loc,e_loc) -#define NEW_CASE(h,b,loc) (NODE *)rb_node_case_new(p,h,b,loc) +#define NEW_CASE(h,b,loc,ck_loc,ek_loc) (NODE *)rb_node_case_new(p,h,b,loc,ck_loc,ek_loc) #define NEW_CASE2(b,loc) (NODE *)rb_node_case2_new(p,b,loc) #define NEW_CASE3(h,b,loc) (NODE *)rb_node_case3_new(p,h,b,loc) #define NEW_WHEN(c,t,e,loc,k_loc,t_loc) (NODE *)rb_node_when_new(p,c,t,e,loc,k_loc,t_loc) @@ -4550,7 +4550,7 @@ primary : literal { if (CASE_LABELS_ENABLED_P(p->case_labels)) st_free_table(p->case_labels); p->case_labels = $4; - $$ = NEW_CASE($2, $5, &@$); + $$ = NEW_CASE($2, $5, &@$, &@1, &@6); fixpos($$, $2); /*% ripper: case!($:2, $:5) %*/ } @@ -11613,11 +11613,13 @@ rb_node_lambda_new(struct parser_params *p, rb_node_args_t *nd_args, NODE *nd_bo } static rb_node_case_t * -rb_node_case_new(struct parser_params *p, NODE *nd_head, NODE *nd_body, const YYLTYPE *loc) +rb_node_case_new(struct parser_params *p, NODE *nd_head, NODE *nd_body, const YYLTYPE *loc, const YYLTYPE *case_keyword_loc, const YYLTYPE *end_keyword_loc) { rb_node_case_t *n = NODE_NEWNODE(NODE_CASE, rb_node_case_t, loc); n->nd_head = nd_head; n->nd_body = nd_body; + n->case_keyword_loc = *case_keyword_loc; + n->end_keyword_loc = *end_keyword_loc; return n; } diff --git a/rubyparser.h b/rubyparser.h index c38266324bca24..81f45386fc40dc 100644 --- a/rubyparser.h +++ b/rubyparser.h @@ -283,6 +283,8 @@ typedef struct RNode_CASE { struct RNode *nd_head; struct RNode *nd_body; + rb_code_location_t case_keyword_loc; + rb_code_location_t end_keyword_loc; } rb_node_case_t; typedef struct RNode_CASE2 { diff --git a/test/ruby/test_ast.rb b/test/ruby/test_ast.rb index 79077603e43e83..068b372ff923c5 100644 --- a/test/ruby/test_ast.rb +++ b/test/ruby/test_ast.rb @@ -1353,6 +1353,11 @@ def test_break_locations assert_locations(node.children[-1].children[-1].children[-1].locations, [[1, 7, 1, 14], [1, 7, 1, 12]]) end + def test_case_locations + node = ast_parse("case a; when 1; end") + assert_locations(node.children[-1].locations, [[1, 0, 1, 19], [1, 0, 1, 4], [1, 16, 1, 19]]) + end + def test_next_locations node = ast_parse("loop { next 1 }") assert_locations(node.children[-1].children[-1].children[-1].locations, [[1, 7, 1, 13], [1, 7, 1, 11]]) From 5334766bebcb471549b300c6e6e9cf0d08575116 Mon Sep 17 00:00:00 2001 From: ydah Date: Sun, 22 Sep 2024 00:17:52 +0900 Subject: [PATCH 400/829] Implement CASE2 NODE keyword locations --- ast.c | 5 +++++ node_dump.c | 4 +++- parse.y | 10 ++++++---- rubyparser.h | 2 ++ test/ruby/test_ast.rb | 5 +++++ 5 files changed, 21 insertions(+), 5 deletions(-) diff --git a/ast.c b/ast.c index e5565ae00af3bc..4936ccc91d166a 100644 --- a/ast.c +++ b/ast.c @@ -792,6 +792,11 @@ node_locations(VALUE ast_value, const NODE *node) location_new(nd_code_loc(node)), location_new(&RNODE_CASE(node)->case_keyword_loc), location_new(&RNODE_CASE(node)->end_keyword_loc)); + case NODE_CASE2: + return rb_ary_new_from_args(3, + location_new(nd_code_loc(node)), + location_new(&RNODE_CASE2(node)->case_keyword_loc), + location_new(&RNODE_CASE2(node)->end_keyword_loc)); case NODE_NEXT: return rb_ary_new_from_args(2, location_new(nd_code_loc(node)), diff --git a/node_dump.c b/node_dump.c index 3e92c87bf0b7a5..9a92762e10960f 100644 --- a/node_dump.c +++ b/node_dump.c @@ -271,8 +271,10 @@ dump_node(VALUE buf, VALUE indent, int comment, const NODE * node) ANN("format: case; [nd_body]; end"); ANN("example: case; when 1; foo; when 2; bar; else baz; end"); F_NODE(nd_head, RNODE_CASE2, "case expr"); - LAST_NODE; F_NODE(nd_body, RNODE_CASE2, "when clauses"); + F_LOC(case_keyword_loc, RNODE_CASE2); + LAST_NODE; + F_LOC(end_keyword_loc, RNODE_CASE2); return; case NODE_CASE3: ANN("case statement (pattern matching)"); diff --git a/parse.y b/parse.y index 550f00d56b9250..cd5c76f4692411 100644 --- a/parse.y +++ b/parse.y @@ -1064,7 +1064,7 @@ static rb_node_block_t *rb_node_block_new(struct parser_params *p, NODE *nd_head static rb_node_if_t *rb_node_if_new(struct parser_params *p, NODE *nd_cond, NODE *nd_body, NODE *nd_else, const YYLTYPE *loc); static rb_node_unless_t *rb_node_unless_new(struct parser_params *p, NODE *nd_cond, NODE *nd_body, NODE *nd_else, const YYLTYPE *loc, const YYLTYPE *keyword_loc, const YYLTYPE *then_keyword_loc, const YYLTYPE *end_keyword_loc); static rb_node_case_t *rb_node_case_new(struct parser_params *p, NODE *nd_head, NODE *nd_body, const YYLTYPE *loc, const YYLTYPE *case_keyword_loc, const YYLTYPE *end_keyword_loc); -static rb_node_case2_t *rb_node_case2_new(struct parser_params *p, NODE *nd_body, const YYLTYPE *loc); +static rb_node_case2_t *rb_node_case2_new(struct parser_params *p, NODE *nd_body, const YYLTYPE *loc, const YYLTYPE *case_keyword_loc, const YYLTYPE *end_keyword_loc); static rb_node_case3_t *rb_node_case3_new(struct parser_params *p, NODE *nd_head, NODE *nd_body, const YYLTYPE *loc); static rb_node_when_t *rb_node_when_new(struct parser_params *p, NODE *nd_head, NODE *nd_body, NODE *nd_next, const YYLTYPE *loc, const YYLTYPE *keyword_loc, const YYLTYPE *then_keyword_loc); static rb_node_in_t *rb_node_in_new(struct parser_params *p, NODE *nd_head, NODE *nd_body, NODE *nd_next, const YYLTYPE *loc); @@ -1172,7 +1172,7 @@ static rb_node_error_t *rb_node_error_new(struct parser_params *p, const YYLTYPE #define NEW_IF(c,t,e,loc) (NODE *)rb_node_if_new(p,c,t,e,loc) #define NEW_UNLESS(c,t,e,loc,k_loc,t_loc,e_loc) (NODE *)rb_node_unless_new(p,c,t,e,loc,k_loc,t_loc,e_loc) #define NEW_CASE(h,b,loc,ck_loc,ek_loc) (NODE *)rb_node_case_new(p,h,b,loc,ck_loc,ek_loc) -#define NEW_CASE2(b,loc) (NODE *)rb_node_case2_new(p,b,loc) +#define NEW_CASE2(b,loc,ck_loc,ek_loc) (NODE *)rb_node_case2_new(p,b,loc,ck_loc,ek_loc) #define NEW_CASE3(h,b,loc) (NODE *)rb_node_case3_new(p,h,b,loc) #define NEW_WHEN(c,t,e,loc,k_loc,t_loc) (NODE *)rb_node_when_new(p,c,t,e,loc,k_loc,t_loc) #define NEW_IN(c,t,e,loc) (NODE *)rb_node_in_new(p,c,t,e,loc) @@ -4564,7 +4564,7 @@ primary : literal { if (p->case_labels) st_free_table(p->case_labels); p->case_labels = $3; - $$ = NEW_CASE2($4, &@$); + $$ = NEW_CASE2($4, &@$, &@1, &@5); /*% ripper: case!(Qnil, $:4) %*/ } | k_case expr_value terms? @@ -11625,11 +11625,13 @@ rb_node_case_new(struct parser_params *p, NODE *nd_head, NODE *nd_body, const YY } static rb_node_case2_t * -rb_node_case2_new(struct parser_params *p, NODE *nd_body, const YYLTYPE *loc) +rb_node_case2_new(struct parser_params *p, NODE *nd_body, const YYLTYPE *loc, const YYLTYPE *case_keyword_loc, const YYLTYPE *end_keyword_loc) { rb_node_case2_t *n = NODE_NEWNODE(NODE_CASE2, rb_node_case2_t, loc); n->nd_head = 0; n->nd_body = nd_body; + n->case_keyword_loc = *case_keyword_loc; + n->end_keyword_loc = *end_keyword_loc; return n; } diff --git a/rubyparser.h b/rubyparser.h index 81f45386fc40dc..dbef455998c8c4 100644 --- a/rubyparser.h +++ b/rubyparser.h @@ -292,6 +292,8 @@ typedef struct RNode_CASE2 { struct RNode *nd_head; struct RNode *nd_body; + rb_code_location_t case_keyword_loc; + rb_code_location_t end_keyword_loc; } rb_node_case2_t; typedef struct RNode_CASE3 { diff --git a/test/ruby/test_ast.rb b/test/ruby/test_ast.rb index 068b372ff923c5..f2024b29000af8 100644 --- a/test/ruby/test_ast.rb +++ b/test/ruby/test_ast.rb @@ -1358,6 +1358,11 @@ def test_case_locations assert_locations(node.children[-1].locations, [[1, 0, 1, 19], [1, 0, 1, 4], [1, 16, 1, 19]]) end + def test_case2_locations + node = ast_parse("case; when 1; end") + assert_locations(node.children[-1].locations, [[1, 0, 1, 17], [1, 0, 1, 4], [1, 14, 1, 17]]) + end + def test_next_locations node = ast_parse("loop { next 1 }") assert_locations(node.children[-1].children[-1].children[-1].locations, [[1, 7, 1, 13], [1, 7, 1, 11]]) From b811a9a097f2ce9ed9b200be84523698bc693e54 Mon Sep 17 00:00:00 2001 From: ydah Date: Sun, 22 Sep 2024 00:22:59 +0900 Subject: [PATCH 401/829] Implement CASE3 NODE keyword locations --- ast.c | 5 +++++ node_dump.c | 4 +++- parse.y | 14 ++++++++------ rubyparser.h | 2 ++ test/ruby/test_ast.rb | 5 +++++ 5 files changed, 23 insertions(+), 7 deletions(-) diff --git a/ast.c b/ast.c index 4936ccc91d166a..ae28db4414c143 100644 --- a/ast.c +++ b/ast.c @@ -797,6 +797,11 @@ node_locations(VALUE ast_value, const NODE *node) location_new(nd_code_loc(node)), location_new(&RNODE_CASE2(node)->case_keyword_loc), location_new(&RNODE_CASE2(node)->end_keyword_loc)); + case NODE_CASE3: + return rb_ary_new_from_args(3, + location_new(nd_code_loc(node)), + location_new(&RNODE_CASE3(node)->case_keyword_loc), + location_new(&RNODE_CASE3(node)->end_keyword_loc)); case NODE_NEXT: return rb_ary_new_from_args(2, location_new(nd_code_loc(node)), diff --git a/node_dump.c b/node_dump.c index 9a92762e10960f..8f30ed2dce00e8 100644 --- a/node_dump.c +++ b/node_dump.c @@ -281,8 +281,10 @@ dump_node(VALUE buf, VALUE indent, int comment, const NODE * node) ANN("format: case [nd_head]; [nd_body]; end"); ANN("example: case x; in 1; foo; in 2; bar; else baz; end"); F_NODE(nd_head, RNODE_CASE3, "case expr"); - LAST_NODE; F_NODE(nd_body, RNODE_CASE3, "in clauses"); + F_LOC(case_keyword_loc, RNODE_CASE3); + LAST_NODE; + F_LOC(end_keyword_loc, RNODE_CASE3); return; case NODE_WHEN: diff --git a/parse.y b/parse.y index cd5c76f4692411..17d5749004d45e 100644 --- a/parse.y +++ b/parse.y @@ -1065,7 +1065,7 @@ static rb_node_if_t *rb_node_if_new(struct parser_params *p, NODE *nd_cond, NODE static rb_node_unless_t *rb_node_unless_new(struct parser_params *p, NODE *nd_cond, NODE *nd_body, NODE *nd_else, const YYLTYPE *loc, const YYLTYPE *keyword_loc, const YYLTYPE *then_keyword_loc, const YYLTYPE *end_keyword_loc); static rb_node_case_t *rb_node_case_new(struct parser_params *p, NODE *nd_head, NODE *nd_body, const YYLTYPE *loc, const YYLTYPE *case_keyword_loc, const YYLTYPE *end_keyword_loc); static rb_node_case2_t *rb_node_case2_new(struct parser_params *p, NODE *nd_body, const YYLTYPE *loc, const YYLTYPE *case_keyword_loc, const YYLTYPE *end_keyword_loc); -static rb_node_case3_t *rb_node_case3_new(struct parser_params *p, NODE *nd_head, NODE *nd_body, const YYLTYPE *loc); +static rb_node_case3_t *rb_node_case3_new(struct parser_params *p, NODE *nd_head, NODE *nd_body, const YYLTYPE *loc, const YYLTYPE *case_keyword_loc, const YYLTYPE *end_keyword_loc); static rb_node_when_t *rb_node_when_new(struct parser_params *p, NODE *nd_head, NODE *nd_body, NODE *nd_next, const YYLTYPE *loc, const YYLTYPE *keyword_loc, const YYLTYPE *then_keyword_loc); static rb_node_in_t *rb_node_in_new(struct parser_params *p, NODE *nd_head, NODE *nd_body, NODE *nd_next, const YYLTYPE *loc); static rb_node_while_t *rb_node_while_new(struct parser_params *p, NODE *nd_cond, NODE *nd_body, long nd_state, const YYLTYPE *loc, const YYLTYPE *keyword_loc, const YYLTYPE *closing_loc); @@ -1173,7 +1173,7 @@ static rb_node_error_t *rb_node_error_new(struct parser_params *p, const YYLTYPE #define NEW_UNLESS(c,t,e,loc,k_loc,t_loc,e_loc) (NODE *)rb_node_unless_new(p,c,t,e,loc,k_loc,t_loc,e_loc) #define NEW_CASE(h,b,loc,ck_loc,ek_loc) (NODE *)rb_node_case_new(p,h,b,loc,ck_loc,ek_loc) #define NEW_CASE2(b,loc,ck_loc,ek_loc) (NODE *)rb_node_case2_new(p,b,loc,ck_loc,ek_loc) -#define NEW_CASE3(h,b,loc) (NODE *)rb_node_case3_new(p,h,b,loc) +#define NEW_CASE3(h,b,loc,ck_loc,ek_loc) (NODE *)rb_node_case3_new(p,h,b,loc,ck_loc,ek_loc) #define NEW_WHEN(c,t,e,loc,k_loc,t_loc) (NODE *)rb_node_when_new(p,c,t,e,loc,k_loc,t_loc) #define NEW_IN(c,t,e,loc) (NODE *)rb_node_in_new(p,c,t,e,loc) #define NEW_WHILE(c,b,n,loc,k_loc,c_loc) (NODE *)rb_node_while_new(p,c,b,n,loc,k_loc,c_loc) @@ -3375,7 +3375,7 @@ expr : command_call pop_pktbl(p, $p_pktbl); pop_pvtbl(p, $p_pvtbl); p->ctxt.in_kwarg = $ctxt.in_kwarg; - $$ = NEW_CASE3($arg, NEW_IN($body, 0, 0, &@body), &@$); + $$ = NEW_CASE3($arg, NEW_IN($body, 0, 0, &@body), &@$, &NULL_LOC, &NULL_LOC); /*% ripper: case!($:arg, in!($:body, Qnil, Qnil)) %*/ } | arg keyword_in @@ -3388,7 +3388,7 @@ expr : command_call pop_pktbl(p, $p_pktbl); pop_pvtbl(p, $p_pvtbl); p->ctxt.in_kwarg = $ctxt.in_kwarg; - $$ = NEW_CASE3($arg, NEW_IN($body, NEW_TRUE(&@body), NEW_FALSE(&@body), &@body), &@$); + $$ = NEW_CASE3($arg, NEW_IN($body, NEW_TRUE(&@body), NEW_FALSE(&@body), &@body), &@$, &NULL_LOC, &NULL_LOC); /*% ripper: case!($:arg, in!($:body, Qnil, Qnil)) %*/ } | arg %prec tLBRACE_ARG @@ -4571,7 +4571,7 @@ primary : literal p_case_body k_end { - $$ = NEW_CASE3($2, $4, &@$); + $$ = NEW_CASE3($2, $4, &@$, &@1, &@5); /*% ripper: case!($:2, $:4) %*/ } | k_for for_var keyword_in expr_value_do @@ -11637,11 +11637,13 @@ rb_node_case2_new(struct parser_params *p, NODE *nd_body, const YYLTYPE *loc, co } static rb_node_case3_t * -rb_node_case3_new(struct parser_params *p, NODE *nd_head, NODE *nd_body, const YYLTYPE *loc) +rb_node_case3_new(struct parser_params *p, NODE *nd_head, NODE *nd_body, const YYLTYPE *loc, const YYLTYPE *case_keyword_loc, const YYLTYPE *end_keyword_loc) { rb_node_case3_t *n = NODE_NEWNODE(NODE_CASE3, rb_node_case3_t, loc); n->nd_head = nd_head; n->nd_body = nd_body; + n->case_keyword_loc = *case_keyword_loc; + n->end_keyword_loc = *end_keyword_loc; return n; } diff --git a/rubyparser.h b/rubyparser.h index dbef455998c8c4..6a016155bce1c4 100644 --- a/rubyparser.h +++ b/rubyparser.h @@ -301,6 +301,8 @@ typedef struct RNode_CASE3 { struct RNode *nd_head; struct RNode *nd_body; + rb_code_location_t case_keyword_loc; + rb_code_location_t end_keyword_loc; } rb_node_case3_t; typedef struct RNode_WHEN { diff --git a/test/ruby/test_ast.rb b/test/ruby/test_ast.rb index f2024b29000af8..06fb3c56c0a8b6 100644 --- a/test/ruby/test_ast.rb +++ b/test/ruby/test_ast.rb @@ -1363,6 +1363,11 @@ def test_case2_locations assert_locations(node.children[-1].locations, [[1, 0, 1, 17], [1, 0, 1, 4], [1, 14, 1, 17]]) end + def test_case3_locations + node = ast_parse("case a; in 1; end") + assert_locations(node.children[-1].locations, [[1, 0, 1, 17], [1, 0, 1, 4], [1, 14, 1, 17]]) + end + def test_next_locations node = ast_parse("loop { next 1 }") assert_locations(node.children[-1].children[-1].children[-1].locations, [[1, 7, 1, 13], [1, 7, 1, 11]]) From 7be1fafe58e2baaa1da4dcd6f4854e674f9d3100 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sun, 22 Sep 2024 12:14:56 +0900 Subject: [PATCH 402/829] Refactor `Time#xmlschema` And refine uncommon date cases. # Iteration per second (i/s) | |compare-ruby|built-ruby| |:---------------------------|-----------:|---------:| |time.xmlschema | 5.020M| 14.192M| | | -| 2.83x| |utc_time.xmlschema | 6.454M| 15.331M| | | -| 2.38x| |time.xmlschema(6) | 4.216M| 10.043M| | | -| 2.38x| |utc_time.xmlschema(6) | 5.486M| 10.592M| | | -| 1.93x| |time.xmlschema(9) | 4.294M| 10.340M| | | -| 2.41x| |utc_time.xmlschema(9) | 4.784M| 10.909M| | | -| 2.28x| |fraction_sec.xmlschema(10) | 366.982k| 3.406M| | | -| 9.28x| |future_time.xmlschema | 994.595k| 15.853M| | | -| 15.94x| --- benchmark/time_xmlschema.yml | 4 ++ common.mk | 1 + time.c | 129 +++++++++++++++++++++-------------- 3 files changed, 83 insertions(+), 51 deletions(-) diff --git a/benchmark/time_xmlschema.yml b/benchmark/time_xmlschema.yml index f746d9c6c8d1da..654e5cfcbc3bcd 100644 --- a/benchmark/time_xmlschema.yml +++ b/benchmark/time_xmlschema.yml @@ -14,6 +14,8 @@ prelude: | end time = Time.now utc_time = Time.now.utc + fraction_sec = Time.at(123456789.quo(9999999999)).getlocal("+09:00") + future_time = Time.utc(10000) benchmark: - time.xmlschema - utc_time.xmlschema @@ -21,3 +23,5 @@ benchmark: - utc_time.xmlschema(6) - time.xmlschema(9) - utc_time.xmlschema(9) + - fraction_sec.xmlschema(10) + - future_time.xmlschema diff --git a/common.mk b/common.mk index c625dd304655be..9759b359e8f4ad 100644 --- a/common.mk +++ b/common.mk @@ -18927,6 +18927,7 @@ time.$(OBJEXT): {$(VPATH)}thread_native.h time.$(OBJEXT): {$(VPATH)}time.c time.$(OBJEXT): {$(VPATH)}timev.h time.$(OBJEXT): {$(VPATH)}timev.rbinc +time.$(OBJEXT): {$(VPATH)}util.h time.$(OBJEXT): {$(VPATH)}vm_core.h time.$(OBJEXT): {$(VPATH)}vm_opts.h transcode.$(OBJEXT): $(hdrdir)/ruby/ruby.h diff --git a/time.c b/time.c index 51d39ff293bd3f..1f8cb3bf0be2ef 100644 --- a/time.c +++ b/time.c @@ -42,6 +42,7 @@ #include "internal/time.h" #include "internal/variable.h" #include "ruby/encoding.h" +#include "ruby/util.h" #include "timev.h" #include "builtin.h" @@ -570,6 +571,9 @@ num_exact(VALUE v) /* time_t */ +/* TIME_SCALE should be 10000... */ +static const int TIME_SCALE_NUMDIGITS = rb_strlen_lit(STRINGIZE(TIME_SCALE)) - 1; + static wideval_t rb_time_magnify(wideval_t w) { @@ -2643,10 +2647,6 @@ time_init_parse(rb_execution_context_t *ec, VALUE time, VALUE str, VALUE zone, V } if (!NIL_P(subsec)) { /* subseconds is the last using ndigits */ - static const size_t TIME_SCALE_NUMDIGITS = - /* TIME_SCALE should be 10000... */ - rb_strlen_lit(STRINGIZE(TIME_SCALE)) - 1; - if (ndigits < TIME_SCALE_NUMDIGITS) { VALUE mul = rb_int_positive_pow(10, TIME_SCALE_NUMDIGITS - ndigits); subsec = rb_int_mul(subsec, mul); @@ -5232,51 +5232,79 @@ time_xmlschema(int argc, VALUE *argv, VALUE time) GetTimeval(time, tobj); MAKE_TM(time, tobj); - long year = -1; + const long size_after_year = sizeof("-MM-DDTHH:MM:SS+ZH:ZM") + fraction_digits + + (fraction_digits > 0); + VALUE str; + char *ptr; + +# define fill_digits_long(len, prec, n) \ + for (int fill_it = 1, written = snprintf(ptr, len, "%0*ld", prec, n); \ + fill_it; ptr += written, fill_it = 0) + if (FIXNUM_P(tobj->vtm.year)) { - year = FIX2LONG(tobj->vtm.year); - } - if (RB_UNLIKELY(year > 9999 || year < 0 || fraction_digits > 9)) { - // Slow path for uncommon dates. - VALUE format = rb_utf8_str_new_cstr("%FT%T"); - if (fraction_digits > 0) { - rb_str_catf(format, ".%%#%ldN", fraction_digits); + long year = FIX2LONG(tobj->vtm.year); + int year_width = (year < 0) + rb_strlen_lit("YYYY"); + int w = (year >= -9999 && year <= 9999 ? year_width : (year < 0) + DECIMAL_SIZE_OF(year)); + str = rb_usascii_str_new(0, w + size_after_year); + ptr = RSTRING_PTR(str); + fill_digits_long(w + 1, year_width, year) { + if (year >= -9999 && year <= 9999) { + RUBY_ASSERT(written == year_width); + } + else { + RUBY_ASSERT(written >= year_width); + RUBY_ASSERT(written <= w); + } } - rb_str_cat_cstr(format, TZMODE_UTC_P(tobj) ? "Z" : "%:z"); - return rb_funcallv(time, rb_intern("strftime"), 1, &format); - } - - long buf_size = sizeof("YYYY-MM-DDTHH:MM:SS+ZH:ZM") + fraction_digits + (fraction_digits > 0 ? 1 : 0); - - VALUE str = rb_str_buf_new(buf_size); - rb_enc_associate_index(str, rb_utf8_encindex()); - - char *ptr = RSTRING_PTR(str); - char *start = ptr; - int written = snprintf( - ptr, - sizeof("YYYY-MM-DDTHH:MM:SS"), - "%04ld-%02d-%02dT%02d:%02d:%02d", - year, - tobj->vtm.mon, - tobj->vtm.mday, - tobj->vtm.hour, - tobj->vtm.min, - tobj->vtm.sec - ); - RUBY_ASSERT(written == sizeof("YYYY-MM-DDTHH:MM:SS") - 1); - ptr += written; + } + else { + str = rb_int2str(tobj->vtm.year, 10); + rb_str_modify_expand(str, size_after_year); + ptr = RSTRING_END(str); + } - if (fraction_digits > 0) { - long nsec = NUM2LONG(mulquov(tobj->vtm.subsecx, INT2FIX(1000000000), INT2FIX(TIME_SCALE))); - long subsec = nsec / (long)pow(10, 9 - fraction_digits); +# define fill_2(c, n) (*ptr++ = c, *ptr++ = '0' + (n) / 10, *ptr++ = '0' + (n) % 10) + fill_2('-', tobj->vtm.mon); + fill_2('-', tobj->vtm.mday); + fill_2('T', tobj->vtm.hour); + fill_2(':', tobj->vtm.min); + fill_2(':', tobj->vtm.sec); - *ptr = '.'; - ptr++; - - written = snprintf(ptr, fraction_digits + 1, "%0*ld", (int)fraction_digits, subsec); // Always allow to write \0 - RUBY_ASSERT(written > 0); - ptr += written; + if (fraction_digits > 0) { + VALUE subsecx = tobj->vtm.subsecx; + long subsec; + int digits = -1; + *ptr++ = '.'; + if (fraction_digits <= TIME_SCALE_NUMDIGITS) { + digits = TIME_SCALE_NUMDIGITS - (int)fraction_digits; + } + else { + long w = fraction_digits - TIME_SCALE_NUMDIGITS; /* > 0 */ + subsecx = mulv(subsecx, rb_int_positive_pow(10, (unsigned long)w)); + if (!RB_INTEGER_TYPE_P(subsecx)) { /* maybe Rational */ + subsecx = rb_Integer(subsecx); + } + if (FIXNUM_P(subsecx)) digits = 0; + } + if (digits >= 0 && fraction_digits < INT_MAX) { + subsec = NUM2LONG(subsecx); + if (digits > 0) subsec /= (long)pow(10, digits); + fill_digits_long(fraction_digits + 1, (int)fraction_digits, subsec) { + RUBY_ASSERT(written == (int)fraction_digits); + } + } + else { + subsecx = rb_int2str(subsecx, 10); + long len = RSTRING_LEN(subsecx); + if (fraction_digits > len) { + memset(ptr, '0', fraction_digits - len); + } + else { + len = fraction_digits; + } + ptr += fraction_digits; + memcpy(ptr - len, RSTRING_PTR(subsecx), len); + } } if (TZMODE_UTC_P(tobj)) { @@ -5285,14 +5313,13 @@ time_xmlschema(int argc, VALUE *argv, VALUE time) } else { long offset = NUM2LONG(rb_time_utc_offset(time)); - *ptr++ = offset < 0 ? '-' : '+'; + char sign = offset < 0 ? '-' : '+'; if (offset < 0) offset = -offset; - int offset_hours = (int)(offset / 3600); - int offset_minutes = (int)(offset % 3600 / 60); - written = snprintf(ptr, sizeof("ZH:ZM"), "%02d:%02d", offset_hours, offset_minutes); - RUBY_ASSERT(written == sizeof("ZH:ZM") - 1, "%d[%.*s]", written, written, ptr); - ptr += written; + offset /= 60; + fill_2(sign, offset / 60); + fill_2(':', offset % 60); } + const char *const start = RSTRING_PTR(str); rb_str_set_len(str, ptr - start); // We could skip coderange scanning as we know it's full ASCII. return str; } From c071fedb320d8e7c9edc3087a3386895d59c6100 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Fri, 20 Sep 2024 15:37:52 +0200 Subject: [PATCH 403/829] [rubygems/rubygems] Fix `bundle outdated` with `--group` option It was printing incorrect output and returning incorrect status. https://github.com/rubygems/rubygems/commit/96f5979c7d --- lib/bundler/cli/outdated.rb | 32 ++++++++++++-------------- spec/bundler/commands/outdated_spec.rb | 8 +++++++ 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/lib/bundler/cli/outdated.rb b/lib/bundler/cli/outdated.rb index 64a83fd57e4ed0..75fcdca6412c0d 100644 --- a/lib/bundler/cli/outdated.rb +++ b/lib/bundler/cli/outdated.rb @@ -97,28 +97,26 @@ def run } end - if outdated_gems.empty? + relevant_outdated_gems = if options_include_groups + outdated_gems.group_by {|g| g[:groups] }.sort.flat_map do |groups, gems| + contains_group = groups.split(", ").include?(options[:group]) + next unless options[:groups] || contains_group + + gems + end.compact + else + outdated_gems + end + + if relevant_outdated_gems.empty? unless options[:parseable] Bundler.ui.info(nothing_outdated_message) end else - if options_include_groups - relevant_outdated_gems = outdated_gems.group_by {|g| g[:groups] }.sort.flat_map do |groups, gems| - contains_group = groups.split(", ").include?(options[:group]) - next unless options[:groups] || contains_group - - gems - end.compact - - if options[:parseable] - print_gems(relevant_outdated_gems) - else - print_gems_table(relevant_outdated_gems) - end - elsif options[:parseable] - print_gems(outdated_gems) + if options[:parseable] + print_gems(relevant_outdated_gems) else - print_gems_table(outdated_gems) + print_gems_table(relevant_outdated_gems) end exit 1 diff --git a/spec/bundler/commands/outdated_spec.rb b/spec/bundler/commands/outdated_spec.rb index 8bf3a468b4a821..449fba5935ff37 100644 --- a/spec/bundler/commands/outdated_spec.rb +++ b/spec/bundler/commands/outdated_spec.rb @@ -251,6 +251,14 @@ def test_group_option(group) expect(out).to end_with("Bundle up to date!") end + it "works when only out of date gems are not in given group" do + update_repo2 do + build_gem "terranova", "9" + end + bundle "outdated --group development" + expect(out).to end_with("Bundle up to date!") + end + it "returns a sorted list of outdated gems from one group => 'default'" do test_group_option("default") From d0925c075b5c9de9702adf1949f77faf8fbfc3b8 Mon Sep 17 00:00:00 2001 From: Daniel Colson Date: Thu, 19 Sep 2024 14:48:57 -0400 Subject: [PATCH 404/829] [rubygems/rubygems] Ensure refs directory in cached git source See https://github.com/rubygems/rubygems/issues/8046 for details Prior to this commit a cached git source without a specific ref wouldn't survive pushing to a remote and then pulling on a different machine. We'd end up without a refs directory in the cache, at which point git won't recognize it as a repo. This commit fixes the problem by adding a refs directory if it's not already there. This needs to be done as early as possible, so any git commands will work as expected, so this commit adds it before creating the app cached git proxy. https://github.com/rubygems/rubygems/commit/8c89f0b065 --- lib/bundler/source/git.rb | 7 ++++++- spec/bundler/cache/git_spec.rb | 28 ++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/lib/bundler/source/git.rb b/lib/bundler/source/git.rb index c52ce046389e9e..78f9ff0560b2ae 100644 --- a/lib/bundler/source/git.rb +++ b/lib/bundler/source/git.rb @@ -188,7 +188,7 @@ def local_override!(path) end def specs(*) - set_cache_path!(app_cache_path) if use_app_cache? + set_up_app_cache!(app_cache_path) if use_app_cache? if requires_checkout? && !@copied FileUtils.rm_rf(app_cache_path) if use_app_cache? && git_proxy.not_a_bare_repository? @@ -320,6 +320,11 @@ def set_install_path!(path) @install_path = path end + def set_up_app_cache!(path) + FileUtils.mkdir_p(path.join("refs")) + set_cache_path!(path) + end + def has_app_cache? cached_revision && super end diff --git a/spec/bundler/cache/git_spec.rb b/spec/bundler/cache/git_spec.rb index 7c577b105e47a9..88436c79aade08 100644 --- a/spec/bundler/cache/git_spec.rb +++ b/spec/bundler/cache/git_spec.rb @@ -212,6 +212,34 @@ expect(the_bundle).to include_gem "foo 1.0" end + it "can install after bundle cache without cloning remote repositories with only git tracked files" do + build_git "foo" + + gemfile <<-G + source "https://gem.repo1" + gem "foo", :git => '#{lib_path("foo-1.0")}' + G + bundle "config set cache_all true" + bundle :cache, "all-platforms" => true + FileUtils.rm_rf Dir.glob(default_bundle_path("bundler/gems/extensions/**/foo-1.0-*")).first.to_s + FileUtils.rm_rf Dir.glob(default_bundle_path("bundler/gems/foo-1.0-*")).first.to_s + + simulate_new_machine + bundle "config set frozen true" + FileUtils.rm_rf "#{default_bundle_path}/cache/bundler/git/foo-1.0-*" + + # Remove untracked files (including the empty refs dir in the cache) + Dir.chdir(bundled_app) do + system(*%W[git init --quiet]) + system(*%W[git add --all]) + system(*%W[git clean -d --force --quiet]) + end + + bundle "install --local --verbose" + expect(out).to_not include("Fetching") + expect(the_bundle).to include_gem "foo 1.0" + end + it "copies repository to vendor cache" do # CVE-2022-39253: https://lore.kernel.org/lkml/xmqq4jw1uku5.fsf@gitster.g/ system(*%W[git config --global protocol.file.allow always]) From 5d53993a3773e4299277807a8bbcb63aa552bf68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Thu, 19 Sep 2024 16:25:49 +0200 Subject: [PATCH 405/829] [rubygems/rubygems] Don't try to auto-install dev versions of Bundler not available remotely https://github.com/rubygems/rubygems/commit/1a7a3fdeb9 --- lib/bundler/self_manager.rb | 8 ++++---- spec/bundler/runtime/self_management_spec.rb | 11 +++++++++++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/lib/bundler/self_manager.rb b/lib/bundler/self_manager.rb index ea7c014f3ca9e5..a6d93f20ffb579 100644 --- a/lib/bundler/self_manager.rb +++ b/lib/bundler/self_manager.rb @@ -98,10 +98,10 @@ def restart_with(version) def needs_switching? autoswitching_applies? && - released?(lockfile_version) && - !running?(lockfile_version) && - !updating? && - Bundler.settings[:version] != "system" + Bundler.settings[:version] != "system" && + released?(restart_version) && + !running?(restart_version) && + !updating? end def autoswitching_applies? diff --git a/spec/bundler/runtime/self_management_spec.rb b/spec/bundler/runtime/self_management_spec.rb index 320b7062e89278..c6910e95c005ba 100644 --- a/spec/bundler/runtime/self_management_spec.rb +++ b/spec/bundler/runtime/self_management_spec.rb @@ -176,6 +176,17 @@ expect(out).to eq(Bundler::VERSION[0] == "2" ? "Bundler version #{Bundler::VERSION}" : Bundler::VERSION) end + it "does not try to install when using bundle config version " do + lockfile_bundled_with(previous_minor) + + bundle "config set version #{previous_minor}.dev" + bundle "install" + expect(out).not_to match(/restarting using that version/) + + bundle "-v" + expect(out).to eq(Bundler::VERSION[0] == "2" ? "Bundler version #{Bundler::VERSION}" : Bundler::VERSION) + end + it "ignores malformed lockfile version" do lockfile_bundled_with("2.3.") From 4c3727c6ace506d00e2e869243b7812ea7d31bc2 Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Thu, 22 Jun 2023 07:49:58 +0900 Subject: [PATCH 406/829] Add anonymous module name spec. --- spec/ruby/core/module/new_spec.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/spec/ruby/core/module/new_spec.rb b/spec/ruby/core/module/new_spec.rb index da7f3b87207435..ec521360bd7f84 100644 --- a/spec/ruby/core/module/new_spec.rb +++ b/spec/ruby/core/module/new_spec.rb @@ -6,6 +6,10 @@ Module.new.is_a?(Module).should == true end + it "creates a module without a name" do + Module.new.name.should be_nil + end + it "creates a new Module and passes it to the provided block" do test_mod = nil m = Module.new do |mod| From f6dcab5f50bc3ab00b17d3ce84bd906b176baa7a Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Fri, 20 Sep 2024 10:52:43 -0400 Subject: [PATCH 407/829] Assert that objects in write barrier are not dead --- gc/default.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/gc/default.c b/gc/default.c index addaf01fc29f69..65aacb70a36148 100644 --- a/gc/default.c +++ b/gc/default.c @@ -6126,6 +6126,13 @@ rb_gc_impl_writebarrier(void *objspace_ptr, VALUE a, VALUE b) if (SPECIAL_CONST_P(b)) rb_bug("rb_gc_writebarrier: b is special const: %"PRIxVALUE, b); } + GC_ASSERT(RB_BUILTIN_TYPE(a) != T_NONE); + GC_ASSERT(RB_BUILTIN_TYPE(a) != T_MOVED); + GC_ASSERT(RB_BUILTIN_TYPE(a) != T_ZOMBIE); + GC_ASSERT(RB_BUILTIN_TYPE(b) != T_NONE); + GC_ASSERT(RB_BUILTIN_TYPE(b) != T_MOVED); + GC_ASSERT(RB_BUILTIN_TYPE(b) != T_ZOMBIE); + retry: if (!is_incremental_marking(objspace)) { if (!RVALUE_OLD_P(objspace, a) || RVALUE_OLD_P(objspace, b)) { From 19c617b51de7f8fc73baa1c404bed3b4e6dbbf69 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Mon, 23 Sep 2024 11:45:21 -0400 Subject: [PATCH 408/829] Revert "GC guard current_string in the putobject instruction" This reverts commit 69f28ab715a02692fb2a9128bed46044963cbb50. This commit is being reverted because it does not fix the ASAN issue in the objtostring instruction. --- prism_compile.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/prism_compile.c b/prism_compile.c index e88b24e5cf2ee2..1fbae42cf8616b 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -646,9 +646,7 @@ pm_interpolated_node_compile(rb_iseq_t *iseq, const pm_node_list_t *parts, const current_string = rb_enc_str_new(NULL, 0, encoding); } - current_string = rb_fstring(current_string); - PUSH_INSN1(ret, current_location, putobject, current_string); - RB_GC_GUARD(current_string); + PUSH_INSN1(ret, current_location, putobject, rb_fstring(current_string)); PM_COMPILE_NOT_POPPED(part); const pm_node_location_t current_location = PM_NODE_START_LOCATION(scope_node->parser, part); From fc043a2e61fac23159a92f581bf9f0dbf8e843f7 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Mon, 23 Sep 2024 14:58:55 -0400 Subject: [PATCH 409/829] Remove write barrier for non-Ruby object enumerator's meth attribute is an ID, which is not a Ruby object, so we should not apply the write barrier on it. --- enumerator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/enumerator.c b/enumerator.c index 8fa7bb8a36aa3d..faaa77cb49784d 100644 --- a/enumerator.c +++ b/enumerator.c @@ -506,7 +506,7 @@ enumerator_init_copy(VALUE obj, VALUE orig) } RB_OBJ_WRITE(obj, &ptr1->obj, ptr0->obj); - RB_OBJ_WRITE(obj, &ptr1->meth, ptr0->meth); + ptr1->meth = ptr0->meth; RB_OBJ_WRITE(obj, &ptr1->args, ptr0->args); ptr1->fib = 0; ptr1->lookahead = Qundef; From 798a115a15f872654916e0a3d3ae58efe4f64e42 Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Mon, 23 Sep 2024 16:39:24 -0700 Subject: [PATCH 410/829] Fix a -Wsign-compare warning MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ../time.c:5247:50: warning: operand of ‘?:’ changes signedness from ‘int’ to ‘long unsigned int’ due to unsignedness of other operand [-Wsign-compare] 5247 | int w = (year >= -9999 && year <= 9999 ? year_width : (int)(year < 0) + DECIMAL_SIZE_OF(year)); | ^~~~~~~~~~ --- time.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/time.c b/time.c index 1f8cb3bf0be2ef..e3f58e36454ea1 100644 --- a/time.c +++ b/time.c @@ -5244,7 +5244,7 @@ time_xmlschema(int argc, VALUE *argv, VALUE time) if (FIXNUM_P(tobj->vtm.year)) { long year = FIX2LONG(tobj->vtm.year); int year_width = (year < 0) + rb_strlen_lit("YYYY"); - int w = (year >= -9999 && year <= 9999 ? year_width : (year < 0) + DECIMAL_SIZE_OF(year)); + int w = (year >= -9999 && year <= 9999 ? year_width : (year < 0) + (int)DECIMAL_SIZE_OF(year)); str = rb_usascii_str_new(0, w + size_after_year); ptr = RSTRING_PTR(str); fill_digits_long(w + 1, year_width, year) { From 48b3386f6a63f6ae3944441c428aeb6baf5612ba Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Mon, 23 Sep 2024 16:40:20 -0700 Subject: [PATCH 411/829] Fix a typo --- yjit/src/core.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yjit/src/core.rs b/yjit/src/core.rs index 1f96dd453f8a33..b29b3f1d1bc388 100644 --- a/yjit/src/core.rs +++ b/yjit/src/core.rs @@ -969,7 +969,7 @@ impl Context { let cache = CTX_CACHE.as_mut().unwrap(); - // Check that the context for this cache entry mmatches + // Check that the context for this cache entry matches let cache_entry = &cache[ctx_hash % CTX_CACHE_SIZE]; if cache_entry.0 == *ctx { debug_assert!(cache_entry.1 != 0); From 79e79afee4fffcf211dca11d9bcf10829a7f3eda Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Tue, 24 Sep 2024 13:32:52 +0900 Subject: [PATCH 412/829] Show volume details at Windows platform of GHA --- .github/workflows/windows.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 88ea2a183e7c26..cca5da1243ce96 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -140,6 +140,10 @@ jobs: - name: compiler version run: cl + - name: volume info + run: Get-Volume + shell: pwsh + - name: Install libraries with vcpkg run: | vcpkg install From 0641845a4bcbbeec6f0bc8191c866ac62c370eb3 Mon Sep 17 00:00:00 2001 From: Lars Kanis Date: Fri, 27 Oct 2023 12:30:51 +0200 Subject: [PATCH 413/829] Windows: Remove compatibility to ancient MSVCRT API Using _wputenv_s simplifies the code and we can avoid code duplication by using rb_w32_home_dir() to initialize ENV['HOME']. --- win32/file.c | 6 +++--- win32/win32.c | 60 ++++++++++++--------------------------------------- 2 files changed, 17 insertions(+), 49 deletions(-) diff --git a/win32/file.c b/win32/file.c index 5f5590d3c8d084..f137f04c43db94 100644 --- a/win32/file.c +++ b/win32/file.c @@ -332,7 +332,7 @@ rb_file_expand_path_internal(VALUE fname, VALUE dname, int abs_mode, int long_na if (!IS_ABSOLUTE_PATH_P(whome, whome_len)) { free(wpath); - xfree(whome); + free(whome); rb_raise(rb_eArgError, "non-absolute home"); } @@ -411,7 +411,7 @@ rb_file_expand_path_internal(VALUE fname, VALUE dname, int abs_mode, int long_na if (!IS_ABSOLUTE_PATH_P(whome, whome_len)) { free(wpath); free(wdir); - xfree(whome); + free(whome); rb_raise(rb_eArgError, "non-absolute home"); } @@ -572,7 +572,7 @@ rb_file_expand_path_internal(VALUE fname, VALUE dname, int abs_mode, int long_na xfree(buffer); free(wpath); free(wdir); - xfree(whome); + free(whome); if (wfullpath != wfullpath_buffer) xfree(wfullpath); diff --git a/win32/win32.c b/win32/win32.c index 4c51b381f2899f..897f3fc0874887 100644 --- a/win32/win32.c +++ b/win32/win32.c @@ -559,8 +559,9 @@ rb_w32_home_dir(void) } } - /* allocate buffer */ - buffer = ALLOC_N(WCHAR, buffer_len); + /* can't use xmalloc here, since it's called too early from init_env() */ + buffer = malloc(sizeof(WCHAR) * buffer_len); + if (buffer == NULL) return NULL; switch (home_type) { case ENV_HOME: @@ -576,10 +577,10 @@ rb_w32_home_dir(void) default: if (!get_special_folder(CSIDL_PROFILE, buffer, buffer_len) && !get_special_folder(CSIDL_PERSONAL, buffer, buffer_len)) { - xfree(buffer); + free(buffer); return NULL; } - REALLOC_N(buffer, WCHAR, lstrlenW(buffer) + 1); + buffer = realloc(buffer, sizeof(WCHAR) * (lstrlenW(buffer) + 1)); break; } @@ -593,54 +594,24 @@ rb_w32_home_dir(void) static void init_env(void) { - static const WCHAR TMPDIR[] = L"TMPDIR"; - struct {WCHAR name[6], eq, val[ENV_MAX];} wk; - DWORD len; - BOOL f; -#define env wk.val -#define set_env_val(vname) do { \ - typedef char wk_name_offset[(numberof(wk.name) - (numberof(vname) - 1)) * 2 + 1]; \ - WCHAR *const buf = wk.name + sizeof(wk_name_offset) / 2; \ - MEMCPY(buf, vname, WCHAR, numberof(vname) - 1); \ - _wputenv(buf); \ - } while (0) - - wk.eq = L'='; + WCHAR env[ENV_MAX]; if (!GetEnvironmentVariableW(L"HOME", env, numberof(env))) { - f = FALSE; - if (GetEnvironmentVariableW(L"USERPROFILE", env, numberof(env))) { - f = TRUE; - } - else { - if (GetEnvironmentVariableW(L"HOMEDRIVE", env, numberof(env))) - len = lstrlenW(env); - else - len = 0; - - if (GetEnvironmentVariableW(L"HOMEPATH", env + len, numberof(env) - len) || len) { - f = TRUE; - } - else if (get_special_folder(CSIDL_PROFILE, env, numberof(env))) { - f = TRUE; - } - else if (get_special_folder(CSIDL_PERSONAL, env, numberof(env))) { - f = TRUE; - } - } - if (f) { - regulate_path(env); - set_env_val(L"HOME"); + WCHAR *whome = rb_w32_home_dir(); + if (whome) { + _wputenv_s(L"HOME", whome); + free(whome); } } if (!GetEnvironmentVariableW(L"USER", env, numberof(env))) { + DWORD len; if (!GetEnvironmentVariableW(L"USERNAME", env, numberof(env)) && !GetUserNameW(env, (len = numberof(env), &len))) { NTLoginName = ""; } else { - set_env_val(L"USER"); + _wputenv_s(L"USER", env); NTLoginName = rb_w32_wstr_to_mbstr(CP_UTF8, env, -1, NULL); } } @@ -648,15 +619,12 @@ init_env(void) NTLoginName = rb_w32_wstr_to_mbstr(CP_UTF8, env, -1, NULL); } - if (!GetEnvironmentVariableW(TMPDIR, env, numberof(env)) && + if (!GetEnvironmentVariableW(L"TMPDIR", env, numberof(env)) && !GetEnvironmentVariableW(L"TMP", env, numberof(env)) && !GetEnvironmentVariableW(L"TEMP", env, numberof(env)) && rb_w32_system_tmpdir(env, numberof(env))) { - set_env_val(TMPDIR); + _wputenv_s(L"TMPDIR", env); } - -#undef env -#undef set_env_val } static void init_stdhandle(void); From 7627a95e414cec5753bae514fd5490777d9afd7f Mon Sep 17 00:00:00 2001 From: Lars Kanis Date: Fri, 27 Oct 2023 12:27:07 +0200 Subject: [PATCH 414/829] Windows: Remove ENV code targeting Windows before Vista Windows Vista removed the limit to 32768 bytes environment block. Also MINGW supports _wputenv_s() for years. --- hash.c | 54 ------------------------------------------------------ 1 file changed, 54 deletions(-) diff --git a/hash.c b/hash.c index 14086bcb6454e8..7dc885480352aa 100644 --- a/hash.c +++ b/hash.c @@ -5053,44 +5053,6 @@ envix(const char *nam) } #endif -#if defined(_WIN32) -static size_t -getenvsize(const WCHAR* p) -{ - const WCHAR* porg = p; - while (*p++) p += lstrlenW(p) + 1; - return p - porg + 1; -} - -static size_t -getenvblocksize(void) -{ -#ifdef _MAX_ENV - return _MAX_ENV; -#else - return 32767; -#endif -} - -static int -check_envsize(size_t n) -{ - if (_WIN32_WINNT < 0x0600 && rb_w32_osver() < 6) { - /* https://msdn.microsoft.com/en-us/library/windows/desktop/ms682653(v=vs.85).aspx */ - /* Windows Server 2003 and Windows XP: The maximum size of the - * environment block for the process is 32,767 characters. */ - WCHAR* p = GetEnvironmentStringsW(); - if (!p) return -1; /* never happen */ - n += getenvsize(p); - FreeEnvironmentStringsW(p); - if (n >= getenvblocksize()) { - return -1; - } - } - return 0; -} -#endif - #if defined(_WIN32) || \ (defined(__sun) && !(defined(HAVE_SETENV) && defined(HAVE_UNSETENV))) @@ -5116,9 +5078,6 @@ void ruby_setenv(const char *name, const char *value) { #if defined(_WIN32) -# if defined(MINGW_HAS_SECURE_API) || RUBY_MSVCRT_VERSION >= 80 -# define HAVE__WPUTENV_S 1 -# endif VALUE buf; WCHAR *wname; WCHAR *wvalue = 0; @@ -5129,34 +5088,21 @@ ruby_setenv(const char *name, const char *value) if (value) { int len2; len2 = MultiByteToWideChar(CP_UTF8, 0, value, -1, NULL, 0); - if (check_envsize((size_t)len + len2)) { /* len and len2 include '\0' */ - goto fail; /* 2 for '=' & '\0' */ - } wname = ALLOCV_N(WCHAR, buf, len + len2); wvalue = wname + len; MultiByteToWideChar(CP_UTF8, 0, name, -1, wname, len); MultiByteToWideChar(CP_UTF8, 0, value, -1, wvalue, len2); -#ifndef HAVE__WPUTENV_S - wname[len-1] = L'='; -#endif } else { wname = ALLOCV_N(WCHAR, buf, len + 1); MultiByteToWideChar(CP_UTF8, 0, name, -1, wname, len); wvalue = wname + len; *wvalue = L'\0'; -#ifndef HAVE__WPUTENV_S - wname[len-1] = L'='; -#endif } ENV_LOCK(); { -#ifndef HAVE__WPUTENV_S - failed = _wputenv(wname); -#else failed = _wputenv_s(wname, wvalue); -#endif } ENV_UNLOCK(); From acf28e835fc649c2a8597ef6244af5a8f61fa24a Mon Sep 17 00:00:00 2001 From: Lars Kanis Date: Fri, 27 Oct 2023 13:50:07 +0200 Subject: [PATCH 415/829] Windows: Use Unicode aware WinAPI function for ENV[]= This only makes a difference when setting an empty value to a Unicode key. --- hash.c | 4 +++- test/ruby/test_env.rb | 10 ++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/hash.c b/hash.c index 7dc885480352aa..13a63f6e9c6e19 100644 --- a/hash.c +++ b/hash.c @@ -5102,6 +5102,8 @@ ruby_setenv(const char *name, const char *value) ENV_LOCK(); { + /* Use _wputenv_s() instead of SetEnvironmentVariableW() to make sure + * special variables like "TZ" are interpret by libc. */ failed = _wputenv_s(wname, wvalue); } ENV_UNLOCK(); @@ -5111,7 +5113,7 @@ ruby_setenv(const char *name, const char *value) * variable from the system area. */ if (!value || !*value) { /* putenv() doesn't handle empty value */ - if (!SetEnvironmentVariable(name, value) && + if (!SetEnvironmentVariableW(wname, value ? wvalue : NULL) && GetLastError() != ERROR_ENVVAR_NOT_FOUND) goto fail; } if (failed) { diff --git a/test/ruby/test_env.rb b/test/ruby/test_env.rb index 4b5f18e7bb5534..74f4750b134357 100644 --- a/test/ruby/test_env.rb +++ b/test/ruby/test_env.rb @@ -1485,5 +1485,15 @@ def test_utf8 ensure ENV["test"] = test end + + def test_utf8_empty + key = "VAR\u{e5 e1 e2 e4 e3 101 3042}" + ENV[key] = "x" + assert_equal "x", ENV[key] + ENV[key] = "" + assert_equal "", ENV[key] + ENV[key] = nil + assert_nil ENV[key] + end end end From fac5aa05ae3409aae090b0c04b18157f92824a52 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 Sep 2024 02:57:25 +0000 Subject: [PATCH 416/829] Bump github/codeql-action from 3.26.7 to 3.26.8 Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.26.7 to 3.26.8. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/8214744c546c1e5c8f03dde8fab3a7353211988d...294a9d92911152fe08befb9ec03e240add280cb3) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/codeql-analysis.yml | 8 ++++---- .github/workflows/scorecards.yml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index b861db612c16eb..c81ed1fc2941a6 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -77,15 +77,15 @@ jobs: run: sudo rm /usr/lib/ruby/vendor_ruby/rubygems/defaults/operating_system.rb - name: Initialize CodeQL - uses: github/codeql-action/init@8214744c546c1e5c8f03dde8fab3a7353211988d # v3.26.7 + uses: github/codeql-action/init@294a9d92911152fe08befb9ec03e240add280cb3 # v3.26.8 with: languages: ${{ matrix.language }} - name: Autobuild - uses: github/codeql-action/autobuild@8214744c546c1e5c8f03dde8fab3a7353211988d # v3.26.7 + uses: github/codeql-action/autobuild@294a9d92911152fe08befb9ec03e240add280cb3 # v3.26.8 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@8214744c546c1e5c8f03dde8fab3a7353211988d # v3.26.7 + uses: github/codeql-action/analyze@294a9d92911152fe08befb9ec03e240add280cb3 # v3.26.8 with: category: '/language:${{ matrix.language }}' upload: False @@ -115,7 +115,7 @@ jobs: continue-on-error: true - name: Upload SARIF - uses: github/codeql-action/upload-sarif@8214744c546c1e5c8f03dde8fab3a7353211988d # v3.26.7 + uses: github/codeql-action/upload-sarif@294a9d92911152fe08befb9ec03e240add280cb3 # v3.26.8 with: sarif_file: sarif-results/${{ matrix.language }}.sarif continue-on-error: true diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml index 912a4992fa1e74..89b12dd87e8838 100644 --- a/.github/workflows/scorecards.yml +++ b/.github/workflows/scorecards.yml @@ -67,6 +67,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: 'Upload to code-scanning' - uses: github/codeql-action/upload-sarif@8214744c546c1e5c8f03dde8fab3a7353211988d # v3.26.7 + uses: github/codeql-action/upload-sarif@294a9d92911152fe08befb9ec03e240add280cb3 # v3.26.8 with: sarif_file: results.sarif From 4956324af3ef3b3f706a863e3ba5239ad77f73c4 Mon Sep 17 00:00:00 2001 From: MSP-Greg Date: Tue, 18 Jun 2024 11:32:16 -0500 Subject: [PATCH 417/829] mingw.yml - fixup to use ucrt, logging --- .github/workflows/mingw.yml | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/.github/workflows/mingw.yml b/.github/workflows/mingw.yml index b3bacb24163b66..cc6c72511e5005 100644 --- a/.github/workflows/mingw.yml +++ b/.github/workflows/mingw.yml @@ -48,8 +48,9 @@ jobs: matrix: include: # To mitigate flakiness of MinGW CI, we test only one runtime that newer MSYS2 uses. + # Ruby 3.2 is the first Windows Ruby to use OpenSSL 3.x - msystem: 'UCRT64' - baseruby: '3.0' + baseruby: '3.2' test_task: 'check' test-all-opts: '--name=!/TestObjSpace#test_reachable_objects_during_iteration/' fail-fast: false @@ -70,32 +71,28 @@ jobs: with: ruby-version: ${{ matrix.baseruby }} - - name: where check + - name: Misc system & package info + working-directory: run: | # show where - mv /c/Windows/System32/libcrypto-1_1-x64.dll /c/Windows/System32/libcrypto-1_1-x64.dll_ - mv /c/Windows/System32/libssl-1_1-x64.dll /c/Windows/System32/libssl-1_1-x64.dll_ result=true - for e in gcc.exe ragel.exe make.exe libcrypto-1_1-x64.dll libssl-1_1-x64.dll; do + for e in gcc.exe ragel.exe make.exe libcrypto-3-x64.dll libssl-3-x64.dll; do echo ::group::$'\033[93m'$e$'\033[m' where $e || result=false echo ::endgroup:: done - $result - working-directory: - - - name: version check - run: | # show version - result=true for e in gcc ragel make "openssl version"; do case "$e" in *" "*) ;; *) e="$e --version";; esac echo ::group::$'\033[93m'$e$'\033[m' $e || result=false echo ::endgroup:: done + # show packages + echo ::group::$'\033[93m'Packages$'\033[m' + pacman -Qs mingw-w64-ucrt-x86_64-* | sed -n "s,local/mingw-w64-ucrt-x86_64-,,p" + echo ::endgroup:: $result - working-directory: - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: From 373f679e48068ebead61a029922a48879c39bef5 Mon Sep 17 00:00:00 2001 From: NAITOH Jun Date: Sat, 14 Sep 2024 06:36:11 +0900 Subject: [PATCH 418/829] fix rb_memsearch() document ## Why? The explanation of x and y is reversed. https://github.com/ruby/ruby/blob/ddbd64400199fd408d23c85f9fb0d7f742ecf9e1/re.c#L251-L256 ``` long rb_memsearch(const void *x0, long m, const void *y0, long n, rb_encoding *enc) { const unsigned char *x = x0, *y = y0; if (m > n) return -1; ``` --- include/ruby/internal/encoding/string.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/ruby/internal/encoding/string.h b/include/ruby/internal/encoding/string.h index 2b9dfe4f318621..2cfa91c01e1e81 100644 --- a/include/ruby/internal/encoding/string.h +++ b/include/ruby/internal/encoding/string.h @@ -307,13 +307,13 @@ RBIMPL_ATTR_NONNULL(()) /** * Looks for the passed string in the passed buffer. * - * @param[in] x Buffer that potentially includes `y`. + * @param[in] x Query string. * @param[in] m Number of bytes of `x`. - * @param[in] y Query string. + * @param[in] y Buffer that potentially includes `x`. * @param[in] n Number of bytes of `y`. * @param[in] enc Encoding of both `x` and `y`. * @retval -1 Not found. - * @retval otherwise Found index in `x`. + * @retval otherwise Found index in `y`. * @note This API can match at a non-character-boundary. */ long rb_memsearch(const void *x, long m, const void *y, long n, rb_encoding *enc); From 4b1e852d3ee79037e1b3963cc00c1407a7b3dda8 Mon Sep 17 00:00:00 2001 From: Adam Hess Date: Wed, 18 Sep 2024 16:02:11 -0700 Subject: [PATCH 419/829] [ruby/error_highlight] Prism added node_id and Node#breadth_first_search in the 1.0 release. These methods are required for Prism to be able to find the method from the backtrace. https://github.com/ruby/prism/blob/main/CHANGELOG.md#100---2024-08-28 In practice you will likely only end up in this situation if you previously had pre-1.0 prism installed and upgrade Ruby to a version with Prism as the default parser. https://github.com/ruby/error_highlight/commit/cb574daf62 --- lib/error_highlight/base.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/error_highlight/base.rb b/lib/error_highlight/base.rb index 1a29ee476c118a..4669727c652a7c 100644 --- a/lib/error_highlight/base.rb +++ b/lib/error_highlight/base.rb @@ -85,7 +85,7 @@ def self.spot(obj, **opts) # corresponding to the backtrace location in the source code. def self.prism_find(location) require "prism" - return nil if Prism::VERSION < "0.29.0" + return nil if Prism::VERSION < "1.0.0" absolute_path = location.absolute_path return unless absolute_path From 5f47f0f759ebac7b4ce6e8d3d68cabba81f7ffbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Wed, 18 Sep 2024 18:57:53 +0200 Subject: [PATCH 420/829] [rubygems/rubygems] Remove TODO I can't make much sense of https://github.com/rubygems/rubygems/commit/6d627e0671 --- lib/rubygems/basic_specification.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/rubygems/basic_specification.rb b/lib/rubygems/basic_specification.rb index b76716acf5456e..f7eee88ef5b2b7 100644 --- a/lib/rubygems/basic_specification.rb +++ b/lib/rubygems/basic_specification.rb @@ -129,7 +129,6 @@ def extensions_dir end def find_full_gem_path # :nodoc: - # TODO: also, shouldn't it default to full_name if it hasn't been written? File.expand_path File.join(gems_dir, full_name) end From 5228d349d98a2cac91503b73710c31125e62c244 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Wed, 18 Sep 2024 19:00:18 +0200 Subject: [PATCH 421/829] [rubygems/rubygems] Restore `gem_dir` as an instance variable accessor I suspect someone could be setting this instance variable, and the previous changes made that no longer effective. Also I implemented a previous TOOD in `full_gem_path` the other way around: > # TODO: This is a heavily used method by gems, so we'll need > # to aleast just alias it to #gem_dir rather than remove it. I made `gem_dir` an alias of `full_gem_path` rather than the opposite. This alternative change keeps both methods symmetric without deprecating either of them for now. https://github.com/rubygems/rubygems/commit/28983973a3 --- lib/rubygems/basic_specification.rb | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/rubygems/basic_specification.rb b/lib/rubygems/basic_specification.rb index f7eee88ef5b2b7..204231e95e26e4 100644 --- a/lib/rubygems/basic_specification.rb +++ b/lib/rubygems/basic_specification.rb @@ -136,13 +136,13 @@ def find_full_gem_path # :nodoc: ## # The full path to the gem (install path + full name). + # + # TODO: This is duplicated with #gem_dir. Eventually either of them should be deprecated. def full_gem_path @full_gem_path ||= find_full_gem_path end - alias_method :gem_dir, :full_gem_path - ## # Returns the full name (name-version) of this Gem. Platform information # is included (name-version-platform) if it is specified and not the @@ -212,6 +212,16 @@ def to_fullpath(path) end end + ## + # Returns the full path to this spec's gem directory. + # eg: /usr/local/lib/ruby/1.8/gems/mygem-1.0 + # + # TODO: This is duplicated with #full_gem_path. Eventually either of them should be deprecated. + + def gem_dir + @gem_dir ||= find_full_gem_path + end + ## # Returns the full path to the gems directory containing this spec's # gem directory. eg: /usr/local/lib/ruby/1.8/gems From b8baf3f3ee7727682cddafb6e7a589ac2a220a38 Mon Sep 17 00:00:00 2001 From: Benoit Daloze Date: Fri, 20 Sep 2024 22:20:43 +0200 Subject: [PATCH 422/829] [ruby/prism] check_string() should always return a valid C string * Otherwise it is invalid e.g. to call strlen() to the result, or to assume the argument was a string. * All callers are already checking for nil before. https://github.com/ruby/prism/commit/8197be883e --- prism/extension.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/prism/extension.c b/prism/extension.c index ea83f768fe894c..d8b35b72136c4b 100644 --- a/prism/extension.c +++ b/prism/extension.c @@ -42,17 +42,11 @@ ID rb_id_source_for; /******************************************************************************/ /** - * Check if the given VALUE is a string. If it's nil, then return NULL. If it's - * not a string, then raise a type error. Otherwise return the VALUE as a C - * string. + * Check if the given VALUE is a string. If it's not a string, then raise a + * TypeError. Otherwise return the VALUE as a C string. */ static const char * check_string(VALUE value) { - // If the value is nil, then we don't need to do anything. - if (NIL_P(value)) { - return NULL; - } - // Check if the value is a string. If it's not, then raise a type error. if (!RB_TYPE_P(value, T_STRING)) { rb_raise(rb_eTypeError, "wrong argument type %" PRIsVALUE " (expected String)", rb_obj_class(value)); From ed4a55fc4d7dc5f9f95983f4713cbd0c733601a3 Mon Sep 17 00:00:00 2001 From: Benoit Daloze Date: Tue, 17 Sep 2024 22:44:07 +0200 Subject: [PATCH 423/829] [ruby/prism] Accept all 3.3.x and 3.4.x Ruby versions for Prism.parse https://github.com/ruby/prism/commit/a4fcd5339a --- lib/prism/ffi.rb | 16 ++++++++++- prism/extension.c | 6 ++-- prism/options.c | 56 ++++++++++++++++++-------------------- test/prism/version_test.rb | 40 ++++++++++++++++++++++++++- 4 files changed, 84 insertions(+), 34 deletions(-) diff --git a/lib/prism/ffi.rb b/lib/prism/ffi.rb index 95206680f9b205..572807e8057f3d 100644 --- a/lib/prism/ffi.rb +++ b/lib/prism/ffi.rb @@ -411,6 +411,20 @@ def dump_options_command_line(options) end end + # Return the value that should be dumped for the version option. + def dump_options_version(version) + case version + when nil, "latest" + 0 + when /\A3\.3\.\d+\z/ + 1 + when /\A3\.4\.\d+\z/ + 0 + else + raise ArgumentError, "invalid version: #{version}" + end + end + # Convert the given options into a serialized options string. def dump_options(options) template = +"" @@ -443,7 +457,7 @@ def dump_options(options) values << dump_options_command_line(options) template << "C" - values << { nil => 0, "3.3.0" => 1, "3.3.1" => 1, "3.4.0" => 0, "latest" => 0 }.fetch(options[:version]) + values << dump_options_version(options[:version]) template << "C" values << (options[:encoding] == false ? 1 : 0) diff --git a/prism/extension.c b/prism/extension.c index d8b35b72136c4b..93fa7b09897747 100644 --- a/prism/extension.c +++ b/prism/extension.c @@ -770,8 +770,10 @@ parse_input(pm_string_t *input, const pm_options_t *options) { * * `version` - the version of Ruby syntax that prism should used to parse Ruby * code. By default prism assumes you want to parse with the latest version * of Ruby syntax (which you can trigger with `nil` or `"latest"`). You - * may also restrict the syntax to a specific version of Ruby. The - * supported values are `"3.3.0"` and `"3.4.0"`. + * may also restrict the syntax to a specific version of Ruby, e.g., with `"3.3.0"`. + * To parse with the same syntax version that the current Ruby is running + * use `version: RUBY_VERSION`. Raises ArgumentError if the version is not + * currently supported by Prism. */ static VALUE parse(int argc, VALUE *argv, VALUE self) { diff --git a/prism/options.c b/prism/options.c index 3004fcef2c452d..7c775a4edd63c8 100644 --- a/prism/options.c +++ b/prism/options.c @@ -1,4 +1,5 @@ #include "prism/options.h" +#include "prism/util/pm_char.h" /** * Set the shebang callback option on the given options struct. @@ -57,6 +58,10 @@ pm_options_command_line_set(pm_options_t *options, uint8_t command_line) { options->command_line = command_line; } +static bool is_number(const char *string, size_t length) { + return pm_strspn_decimal_digit((const uint8_t *) string, (ptrdiff_t) length) == length; +} + /** * Set the version option on the given options struct by parsing the given * string. If the string contains an invalid option, this returns false. @@ -64,40 +69,31 @@ pm_options_command_line_set(pm_options_t *options, uint8_t command_line) { */ PRISM_EXPORTED_FUNCTION bool pm_options_version_set(pm_options_t *options, const char *version, size_t length) { - switch (length) { - case 0: - if (version == NULL) { - options->version = PM_OPTIONS_VERSION_LATEST; - return true; - } - - return false; - case 5: - assert(version != NULL); - - if ((strncmp(version, "3.3.0", length) == 0) || (strncmp(version, "3.3.1", length) == 0)) { - options->version = PM_OPTIONS_VERSION_CRUBY_3_3; - return true; - } - - if (strncmp(version, "3.4.0", length) == 0) { - options->version = PM_OPTIONS_VERSION_LATEST; - return true; - } + if (version == NULL) { + options->version = PM_OPTIONS_VERSION_LATEST; + return true; + } - return false; - case 6: - assert(version != NULL); + if (length >= 4) { + if (strncmp(version, "3.3.", 4) == 0 && is_number(version + 4, length - 4)) { + options->version = PM_OPTIONS_VERSION_CRUBY_3_3; + return true; + } - if (strncmp(version, "latest", length) == 0) { - options->version = PM_OPTIONS_VERSION_LATEST; - return true; - } + if (strncmp(version, "3.4.", 4) == 0 && is_number(version + 4, length - 4)) { + options->version = PM_OPTIONS_VERSION_LATEST; + return true; + } + } - return false; - default: - return false; + if (length >= 6) { + if (strncmp(version, "latest", 7) == 0) { // 7 to compare the \0 as well + options->version = PM_OPTIONS_VERSION_LATEST; + return true; + } } + + return false; } /** diff --git a/test/prism/version_test.rb b/test/prism/version_test.rb index 29ee6b224cc735..843e3b70365d5e 100644 --- a/test/prism/version_test.rb +++ b/test/prism/version_test.rb @@ -4,8 +4,46 @@ module Prism class VersionTest < TestCase - def test_version_is_set + def test_prism_version_is_set refute_nil VERSION end + + def test_syntax_versions + assert Prism.parse("1 + 1", version: "3.3.0").success? + assert Prism.parse("1 + 1", version: "3.3.1").success? + assert Prism.parse("1 + 1", version: "3.3.9").success? + assert Prism.parse("1 + 1", version: "3.3.10").success? + + assert Prism.parse("1 + 1", version: "3.4.0").success? + assert Prism.parse("1 + 1", version: "3.4.9").success? + assert Prism.parse("1 + 1", version: "3.4.10").success? + + assert Prism.parse("1 + 1", version: "latest").success? + + # Test edge case + error = assert_raise ArgumentError do + Prism.parse("1 + 1", version: "latest2") + end + assert_equal "invalid version: latest2", error.message + + assert_raise ArgumentError do + Prism.parse("1 + 1", version: "3.3.a") + end + + # Not supported version syntax + assert_raise ArgumentError do + Prism.parse("1 + 1", version: "3.3") + end + + # Not supported version (too old) + assert_raise ArgumentError do + Prism.parse("1 + 1", version: "3.2.0") + end + + # Not supported version (too new) + assert_raise ArgumentError do + Prism.parse("1 + 1", version: "3.5.0") + end + end end end From 8edd6e606f77e5cac764c00f0645d222ec80f711 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Tue, 24 Sep 2024 08:37:19 -0400 Subject: [PATCH 424/829] Update deps for prism/options.c --- common.mk | 2 ++ 1 file changed, 2 insertions(+) diff --git a/common.mk b/common.mk index 9759b359e8f4ad..de3852eef7ecc0 100644 --- a/common.mk +++ b/common.mk @@ -12621,6 +12621,8 @@ prism/node.$(OBJEXT): {$(VPATH)}prism/node.c prism/options.$(OBJEXT): $(top_srcdir)/prism/defines.h prism/options.$(OBJEXT): $(top_srcdir)/prism/options.c prism/options.$(OBJEXT): $(top_srcdir)/prism/options.h +prism/options.$(OBJEXT): $(top_srcdir)/prism/util/pm_char.h +prism/options.$(OBJEXT): $(top_srcdir)/prism/util/pm_newline_list.h prism/options.$(OBJEXT): $(top_srcdir)/prism/util/pm_string.h prism/pack.$(OBJEXT): $(top_srcdir)/prism/defines.h prism/pack.$(OBJEXT): $(top_srcdir)/prism/pack.c From e02a6097e690f9c3dc22e5ed469304a54cafd7b8 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Mon, 23 Sep 2024 13:53:57 -0400 Subject: [PATCH 425/829] Set node_id to -1 in add_adjust_info add_adjust_info will increment the insns_info_index, so we need to set the node_id to -1 to prevent a "Conditional jump or move depends on uninitialised value" in Valgrind. --- compile.c | 1 + 1 file changed, 1 insertion(+) diff --git a/compile.c b/compile.c index b726a03d5953eb..a044a30abdc528 100644 --- a/compile.c +++ b/compile.c @@ -2465,6 +2465,7 @@ add_adjust_info(struct iseq_insn_info_entry *insns_info, unsigned int *positions int insns_info_index, int code_index, const ADJUST *adjust) { insns_info[insns_info_index].line_no = adjust->line_no; + insns_info[insns_info_index].node_id = -1; insns_info[insns_info_index].events = 0; positions[insns_info_index] = code_index; return TRUE; From 414a848cc6697067a988e056a787a0a7689c344b Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Tue, 24 Sep 2024 08:41:03 -0400 Subject: [PATCH 426/829] [ruby/prism] Accept version shorthand like 3.4 https://github.com/ruby/prism/commit/098f1c4607 --- lib/prism/ffi.rb | 4 ++-- prism/options.c | 21 ++++++++++++++++++-- prism/options.h | 1 + test/prism/api/parse_test.rb | 33 +++++++++++++++++++++++++++++++ test/prism/version_test.rb | 38 ------------------------------------ 5 files changed, 55 insertions(+), 42 deletions(-) diff --git a/lib/prism/ffi.rb b/lib/prism/ffi.rb index 572807e8057f3d..0520f7cdd24810 100644 --- a/lib/prism/ffi.rb +++ b/lib/prism/ffi.rb @@ -416,9 +416,9 @@ def dump_options_version(version) case version when nil, "latest" 0 - when /\A3\.3\.\d+\z/ + when /\A3\.3(\.\d+)?\z/ 1 - when /\A3\.4\.\d+\z/ + when /\A3\.4(\.\d+)?\z/ 0 else raise ArgumentError, "invalid version: #{version}" diff --git a/prism/options.c b/prism/options.c index 7c775a4edd63c8..6b52b2f296034c 100644 --- a/prism/options.c +++ b/prism/options.c @@ -1,5 +1,4 @@ #include "prism/options.h" -#include "prism/util/pm_char.h" /** * Set the shebang callback option on the given options struct. @@ -58,7 +57,11 @@ pm_options_command_line_set(pm_options_t *options, uint8_t command_line) { options->command_line = command_line; } -static bool is_number(const char *string, size_t length) { +/** + * Checks if the given slice represents a number. + */ +static inline bool +is_number(const char *string, size_t length) { return pm_strspn_decimal_digit((const uint8_t *) string, (ptrdiff_t) length) == length; } @@ -74,6 +77,20 @@ pm_options_version_set(pm_options_t *options, const char *version, size_t length return true; } + if (length == 3) { + if (strncmp(version, "3.3", 3) == 0) { + options->version = PM_OPTIONS_VERSION_CRUBY_3_3; + return true; + } + + if (strncmp(version, "3.4", 3) == 0) { + options->version = PM_OPTIONS_VERSION_LATEST; + return true; + } + + return false; + } + if (length >= 4) { if (strncmp(version, "3.3.", 4) == 0 && is_number(version + 4, length - 4)) { options->version = PM_OPTIONS_VERSION_CRUBY_3_3; diff --git a/prism/options.h b/prism/options.h index efc0748894878b..c96fa684ac666d 100644 --- a/prism/options.h +++ b/prism/options.h @@ -7,6 +7,7 @@ #define PRISM_OPTIONS_H #include "prism/defines.h" +#include "prism/util/pm_char.h" #include "prism/util/pm_string.h" #include diff --git a/test/prism/api/parse_test.rb b/test/prism/api/parse_test.rb index ac8f8c30dcac18..ee8061c98c5dc3 100644 --- a/test/prism/api/parse_test.rb +++ b/test/prism/api/parse_test.rb @@ -104,6 +104,39 @@ def test_partial_script assert Prism.parse_success?("yield", partial_script: true) end + def test_version + assert Prism.parse_success?("1 + 1", version: "3.3") + assert Prism.parse_success?("1 + 1", version: "3.3.0") + assert Prism.parse_success?("1 + 1", version: "3.3.1") + assert Prism.parse_success?("1 + 1", version: "3.3.9") + assert Prism.parse_success?("1 + 1", version: "3.3.10") + + assert Prism.parse_success?("1 + 1", version: "3.4") + assert Prism.parse_success?("1 + 1", version: "3.4.0") + assert Prism.parse_success?("1 + 1", version: "3.4.9") + assert Prism.parse_success?("1 + 1", version: "3.4.10") + + assert Prism.parse_success?("1 + 1", version: "latest") + + # Test edge case + error = assert_raise(ArgumentError) { Prism.parse("1 + 1", version: "latest2") } + assert_equal "invalid version: latest2", error.message + + assert_raise ArgumentError do + Prism.parse("1 + 1", version: "3.3.a") + end + + # Not supported version (too old) + assert_raise ArgumentError do + Prism.parse("1 + 1", version: "3.2.0") + end + + # Not supported version (too new) + assert_raise ArgumentError do + Prism.parse("1 + 1", version: "3.5.0") + end + end + private def find_source_file_node(program) diff --git a/test/prism/version_test.rb b/test/prism/version_test.rb index 843e3b70365d5e..149cfd62b49a8b 100644 --- a/test/prism/version_test.rb +++ b/test/prism/version_test.rb @@ -7,43 +7,5 @@ class VersionTest < TestCase def test_prism_version_is_set refute_nil VERSION end - - def test_syntax_versions - assert Prism.parse("1 + 1", version: "3.3.0").success? - assert Prism.parse("1 + 1", version: "3.3.1").success? - assert Prism.parse("1 + 1", version: "3.3.9").success? - assert Prism.parse("1 + 1", version: "3.3.10").success? - - assert Prism.parse("1 + 1", version: "3.4.0").success? - assert Prism.parse("1 + 1", version: "3.4.9").success? - assert Prism.parse("1 + 1", version: "3.4.10").success? - - assert Prism.parse("1 + 1", version: "latest").success? - - # Test edge case - error = assert_raise ArgumentError do - Prism.parse("1 + 1", version: "latest2") - end - assert_equal "invalid version: latest2", error.message - - assert_raise ArgumentError do - Prism.parse("1 + 1", version: "3.3.a") - end - - # Not supported version syntax - assert_raise ArgumentError do - Prism.parse("1 + 1", version: "3.3") - end - - # Not supported version (too old) - assert_raise ArgumentError do - Prism.parse("1 + 1", version: "3.2.0") - end - - # Not supported version (too new) - assert_raise ArgumentError do - Prism.parse("1 + 1", version: "3.5.0") - end - end end end From 2a0ee408afeeae0f1a0d354ac36c400a361f6767 Mon Sep 17 00:00:00 2001 From: Luke Gruber Date: Tue, 17 Sep 2024 08:34:29 -0400 Subject: [PATCH 427/829] [ruby/error_highlight] Fix error with prism when method given no arguments such as: p = Proc.new This now matches the RubyVM::AbstractSyntaxTree behavior, which is not to highlight anything. https://github.com/ruby/error_highlight/commit/d5c592a1ba --- lib/error_highlight/base.rb | 3 +++ test/error_highlight/test_error_highlight.rb | 9 +++++++++ 2 files changed, 12 insertions(+) diff --git a/lib/error_highlight/base.rb b/lib/error_highlight/base.rb index 4669727c652a7c..e2077fa5a69fd0 100644 --- a/lib/error_highlight/base.rb +++ b/lib/error_highlight/base.rb @@ -700,6 +700,9 @@ def prism_spot_call_for_name # foo 42 # ^^ def prism_spot_call_for_args + # Disallow highlighting arguments if there are no arguments. + return if @node.arguments.nil? + # Explicitly turn off foo.() syntax because error_highlight expects this # to not work. return nil if @node.name == :call && @node.message_loc.nil? diff --git a/test/error_highlight/test_error_highlight.rb b/test/error_highlight/test_error_highlight.rb index 5f4c386990c76d..63e7032eda440f 100644 --- a/test/error_highlight/test_error_highlight.rb +++ b/test/error_highlight/test_error_highlight.rb @@ -197,6 +197,15 @@ def test_CALL_arg_6 end end + def test_CALL_arg_7 + assert_error_message(ArgumentError, <<~END) do +tried to create Proc object without a block (ArgumentError) + END + + Proc.new + end + end + def test_QCALL_1 assert_error_message(NoMethodError, <<~END) do undefined method `foo' for #{ ONE_RECV_MESSAGE } From 07842491c539bf5d0abe29d63380ee5aaf121934 Mon Sep 17 00:00:00 2001 From: tomoya ishida Date: Tue, 24 Sep 2024 23:07:43 +0900 Subject: [PATCH 428/829] [ruby/irb] Use proper locale in history encoding test (https://github.com/ruby/irb/pull/1008) https://github.com/ruby/irb/commit/f6b06a9a40 --- test/irb/test_history.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/irb/test_history.rb b/test/irb/test_history.rb index 84f043892969d0..7a17491d891711 100644 --- a/test/irb/test_history.rb +++ b/test/irb/test_history.rb @@ -149,7 +149,7 @@ def test_history_concurrent_use_not_present def test_history_different_encodings IRB.conf[:SAVE_HISTORY] = 2 Encoding.default_external = Encoding::US_ASCII - locale = IRB::Locale.new("C") + locale = IRB::Locale.new("en_US.ASCII") assert_history(<<~EXPECTED_HISTORY.encode(Encoding::US_ASCII), <<~INITIAL_HISTORY.encode(Encoding::UTF_8), <<~INPUT, locale: locale) ???? exit From b48add3c65c394b2314eb699441f1a1c27b3c2c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Fri, 20 Sep 2024 20:01:13 +0200 Subject: [PATCH 429/829] [rubygems/rubygems] Fix `bundler/inline` overwriting lockfiles This was introduced by https://github.com/rubygems/rubygems/commit/0b7be7bb7705, because the original patch was not adapted to some recent refactorings. https://github.com/rubygems/rubygems/commit/0bca60d6e5 Co-authored-by: Hiroshi SHIBATA --- lib/bundler/definition.rb | 2 +- spec/bundler/runtime/inline_spec.rb | 35 +++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/lib/bundler/definition.rb b/lib/bundler/definition.rb index 75eb5ffa1ba624..e7e6c49e6c9f84 100644 --- a/lib/bundler/definition.rb +++ b/lib/bundler/definition.rb @@ -317,7 +317,7 @@ def groups def lock(file_or_preserve_unknown_sections = false, preserve_unknown_sections_or_unused = false) if [true, false, nil].include?(file_or_preserve_unknown_sections) - target_lockfile = lockfile || Bundler.default_lockfile + target_lockfile = lockfile preserve_unknown_sections = file_or_preserve_unknown_sections else target_lockfile = file_or_preserve_unknown_sections diff --git a/spec/bundler/runtime/inline_spec.rb b/spec/bundler/runtime/inline_spec.rb index 2deda75509e8a4..5ff555ab0ddcca 100644 --- a/spec/bundler/runtime/inline_spec.rb +++ b/spec/bundler/runtime/inline_spec.rb @@ -656,6 +656,20 @@ def confirm(msg, newline = nil) expect(out).to include("after: [\"Test_Variable\"]") end + it "does not create a lockfile" do + script <<-RUBY + require 'bundler/inline' + + gemfile do + source "https://gem.repo1" + end + + puts Dir.glob("Gemfile.lock") + RUBY + + expect(out).to be_empty + end + it "does not load specified version of psych and stringio", :ruby_repo do build_repo4 do build_gem "psych", "999" @@ -678,4 +692,25 @@ def confirm(msg, newline = nil) expect(out).to include("The psych gem was resolved to 999") expect(out).to include("The stringio gem was resolved to 999") end + + it "leaves a lockfile in the same directory as the inline script alone" do + install_gemfile <<~G + source "https://gem.repo1" + gem "foo" + G + + original_lockfile = lockfile + + script <<-RUBY, env: { "BUNDLER_SPEC_GEM_REPO" => gem_repo1.to_s } + require "bundler/inline" + + gemfile(true) do + source "https://gem.repo1" + + gem "myrack" + end + RUBY + + expect(lockfile).to eq(original_lockfile) + end end From 4113dcc4aec8943edcb0d48e596a61b815a18310 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Mon, 23 Sep 2024 13:58:47 -0400 Subject: [PATCH 430/829] Fix memory leak in constant ID list in prism --- vm_eval.c | 1 + 1 file changed, 1 insertion(+) diff --git a/vm_eval.c b/vm_eval.c index 807f3228546cac..b0cdc7aefe3458 100644 --- a/vm_eval.c +++ b/vm_eval.c @@ -1771,6 +1771,7 @@ pm_eval_make_iseq(VALUE src, VALUE fname, int line, pm_scope_node_t *prev = result.node.previous; while (prev) { pm_scope_node_t *next = prev->previous; + pm_constant_id_list_free(&prev->locals); ruby_xfree(prev); prev = next; } From 4f0fe97995cef41a36a229b0ace89263c4e3224f Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Mon, 23 Sep 2024 13:59:42 -0400 Subject: [PATCH 431/829] Free scope node in prism --- vm_eval.c | 1 + 1 file changed, 1 insertion(+) diff --git a/vm_eval.c b/vm_eval.c index b0cdc7aefe3458..baddb88b706f34 100644 --- a/vm_eval.c +++ b/vm_eval.c @@ -1772,6 +1772,7 @@ pm_eval_make_iseq(VALUE src, VALUE fname, int line, while (prev) { pm_scope_node_t *next = prev->previous; pm_constant_id_list_free(&prev->locals); + pm_scope_node_destroy(prev); ruby_xfree(prev); prev = next; } From c51d8ff458e00b34e03b1fd5ac9bb0665c5a516a Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Tue, 24 Sep 2024 13:20:35 -0400 Subject: [PATCH 432/829] Fix undefined behavior in String#append_as_bytes The UNREACHABLE macro calls __builtin_unreachable, which according to the [GCC docs](https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html#index-_005f_005fbuiltin_005funreachable): > If control flow reaches the point of the __builtin_unreachable, the > program is undefined. But it can reach this point with the following script: "123".append_as_bytes("123") This can crash on some platforms with a `Trace/BPT trap: 5`. --- string.c | 1 + 1 file changed, 1 insertion(+) diff --git a/string.c b/string.c index 608d5cf7dcc741..dee17c86a66d05 100644 --- a/string.c +++ b/string.c @@ -3790,6 +3790,7 @@ rb_str_append_as_bytes(int argc, VALUE *argv, VALUE str) if (ENC_CODERANGE(obj) != ENC_CODERANGE_7BIT) { goto clear_cr; } + break; } default: UNREACHABLE; From e956ce32c8f7d1b1c57ed109f91979173ff22c36 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Tue, 24 Sep 2024 13:45:12 -0400 Subject: [PATCH 433/829] Use rb_bug instead of UNREACHABLE for assertions UNREACHABLE uses __builtin_unreachable which is not intended to be used as an assertion. --- string.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/string.c b/string.c index dee17c86a66d05..0b3878b9b15649 100644 --- a/string.c +++ b/string.c @@ -3763,9 +3763,7 @@ rb_str_append_as_bytes(int argc, VALUE *argv, VALUE str) break; } default: - UNREACHABLE; - RUBY_ASSERT("append_as_bytes arguments should have been validated"); - break; + rb_bug("append_as_bytes arguments should have been validated"); } } @@ -3793,9 +3791,7 @@ rb_str_append_as_bytes(int argc, VALUE *argv, VALUE str) break; } default: - UNREACHABLE; - RUBY_ASSERT("append_as_bytes arguments should have been validated"); - break; + rb_bug("append_as_bytes arguments should have been validated"); } } break; From d31378dc919cd3f39ee194f452b9dbc5942bb89d Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Tue, 24 Sep 2024 15:20:08 -0400 Subject: [PATCH 434/829] [ruby/psych] Use `String#match?` over `String#=~` when applicable Save on allocating useless `MatchData` instances. https://github.com/ruby/psych/commit/b2d9f16e58 --- ext/psych/lib/psych/visitors/to_ruby.rb | 2 +- ext/psych/lib/psych/visitors/yaml_tree.rb | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ext/psych/lib/psych/visitors/to_ruby.rb b/ext/psych/lib/psych/visitors/to_ruby.rb index f0fda9bdbcc4a0..9e4da5ef0dcc2b 100644 --- a/ext/psych/lib/psych/visitors/to_ruby.rb +++ b/ext/psych/lib/psych/visitors/to_ruby.rb @@ -36,7 +36,7 @@ def accept target unless @domain_types.empty? || !target.tag key = target.tag.sub(/^[!\/]*/, '').sub(/(,\d+)\//, '\1:') - key = "tag:#{key}" unless key =~ /^(?:tag:|x-private)/ + key = "tag:#{key}" unless key.match?(/^(?:tag:|x-private)/) if @domain_types.key? key value, block = @domain_types[key] diff --git a/ext/psych/lib/psych/visitors/yaml_tree.rb b/ext/psych/lib/psych/visitors/yaml_tree.rb index a2ebc4d78189b3..e27c927996b7b2 100644 --- a/ext/psych/lib/psych/visitors/yaml_tree.rb +++ b/ext/psych/lib/psych/visitors/yaml_tree.rb @@ -261,7 +261,7 @@ def visit_String o style = Nodes::Scalar::LITERAL plain = false quote = false - elsif o =~ /\n(?!\Z)/ # match \n except blank line at the end of string + elsif o.match?(/\n(?!\Z)/) # match \n except blank line at the end of string style = Nodes::Scalar::LITERAL elsif o == '<<' style = Nodes::Scalar::SINGLE_QUOTED @@ -272,9 +272,9 @@ def visit_String o style = Nodes::Scalar::DOUBLE_QUOTED elsif @line_width && o.length > @line_width style = Nodes::Scalar::FOLDED - elsif o =~ /^[^[:word:]][^"]*$/ + elsif o.match?(/^[^[:word:]][^"]*$/) style = Nodes::Scalar::DOUBLE_QUOTED - elsif not String === @ss.tokenize(o) or /\A0[0-7]*[89]/ =~ o + elsif not String === @ss.tokenize(o) or /\A0[0-7]*[89]/.match?(o) style = Nodes::Scalar::SINGLE_QUOTED end From d5241414c551598ff1389fa7ec07179d46d3db7e Mon Sep 17 00:00:00 2001 From: Burdette Lamar Date: Tue, 24 Sep 2024 15:35:43 -0500 Subject: [PATCH 435/829] [DOC] More on Array#fill (#11610) --- array.c | 262 ++++++++++++++++++++++++++------------------------------ 1 file changed, 123 insertions(+), 139 deletions(-) diff --git a/array.c b/array.c index 92481c70bb81a6..f81978f15c8f6b 100644 --- a/array.c +++ b/array.c @@ -4688,198 +4688,182 @@ rb_ary_clear(VALUE ary) /* * call-seq: - * array.fill(obj) -> self - * array.fill(obj, start) -> self - * array.fill(obj, start, length) -> self - * array.fill(obj, range) -> self - * array.fill {|index| ... } -> self - * array.fill(start) {|index| ... } -> self - * array.fill(start, length) {|index| ... } -> self - * array.fill(range) {|index| ... } -> self + * fill(object, start = nil, count = nil) -> new_array + * fill(object, range) -> new_array + * fill(start = nil, count = nil) {|element| ... } -> new_array + * fill(range) {|element| ... } -> new_array * - * Replaces specified elements in +self+ with specified objects; returns +self+. + * Replaces selected elements in +self+; + * may add elements to +self+; + * always returns +self+ (never a new array). * - * With argument +obj+ and no block given, replaces all elements with that one object: - * - * a = ['a', 'b', 'c', 'd'] - * a # => ["a", "b", "c", "d"] - * a.fill(:X) # => [:X, :X, :X, :X] - * - * With arguments +obj+ and Integer +start+, and no block given, - * replaces elements based on the given start. - * - * If +start+ is in range (0 <= start < array.size), - * replaces all elements from offset +start+ through the end: - * - * a = ['a', 'b', 'c', 'd'] - * a.fill(:X, 2) # => ["a", "b", :X, :X] - * - * If +start+ is too large (start >= array.size), does nothing: - * - * a = ['a', 'b', 'c', 'd'] - * a.fill(:X, 4) # => ["a", "b", "c", "d"] - * a = ['a', 'b', 'c', 'd'] - * a.fill(:X, 5) # => ["a", "b", "c", "d"] + * In brief: * - * If +start+ is negative, counts from the end (starting index is start + array.size): + * # Non-negative start. + * ['a', 'b', 'c', 'd'].fill('-', 1, 2) # => ["a", "-", "-", "d"] + * ['a', 'b', 'c', 'd'].fill(1, 2) {|e| e.to_s } # => ["a", "1", "2", "d"] * - * a = ['a', 'b', 'c', 'd'] - * a.fill(:X, -2) # => ["a", "b", :X, :X] + * # Extends with specified values if necessary. + * ['a', 'b', 'c', 'd'].fill('-', 3, 2) # => ["a", "b", "c", "-", "-"] + * ['a', 'b', 'c', 'd'].fill(3, 2) {|e| e.to_s } # => ["a", "b", "c", "3", "4"] * - * If +start+ is too small (less than and far from zero), replaces all elements: + * # Fills with nils if necessary. + * ['a', 'b', 'c', 'd'].fill('-', 6, 2) # => ["a", "b", "c", "d", nil, nil, "-", "-"] + * ['a', 'b', 'c', 'd'].fill(6, 2) {|e| e.to_s } # => ["a", "b", "c", "d", nil, nil, "6", "7"] * - * a = ['a', 'b', 'c', 'd'] - * a.fill(:X, -6) # => [:X, :X, :X, :X] - * a = ['a', 'b', 'c', 'd'] - * a.fill(:X, -50) # => [:X, :X, :X, :X] + * # For negative start, counts backwards from the end. + * ['a', 'b', 'c', 'd'].fill('-', -3, 3) # => ["a", "-", "-", "-"] + * ['a', 'b', 'c', 'd'].fill(-3, 3) {|e| e.to_s } # => ["a", "1", "2", "3"] * - * With arguments +obj+, Integer +start+, and Integer +length+, and no block given, - * replaces elements based on the given +start+ and +length+. + * # Range. + * ['a', 'b', 'c', 'd'].fill('-', 1..2) # => ["a", "-", "-", "d"] + * ['a', 'b', 'c', 'd'].fill(1..2) {|e| e.to_s } # => ["a", "1", "2", "d"] * - * If +start+ is in range, replaces +length+ elements beginning at offset +start+: + * When arguments +start+ and +count+ are given, + * they select the elements of +self+ to be replaced; + * each must be an + * {integer-convertible object}[rdoc-ref:implicit_conversion.rdoc@Integer-Convertible+Objects] + * (or +nil+): * - * a = ['a', 'b', 'c', 'd'] - * a.fill(:X, 1, 1) # => ["a", :X, "c", "d"] + * - +start+ specifies the zero-based offset of the first element to be replaced; + * +nil+ means zero. + * - +count+ is the number of consecutive elements to be replaced; + * +nil+ means "all the rest." * - * If +start+ is negative, counts from the end: + * With argument +object+ given, + * that one object is used for all replacements: * - * a = ['a', 'b', 'c', 'd'] - * a.fill(:X, -2, 1) # => ["a", "b", :X, "d"] + * o = Object.new # => # + * a = ['a', 'b', 'c', 'd'] # => ["a", "b", "c", "d"] + * a.fill(o, 1, 2) + * # => ["a", #, #, "d"] * - * If +start+ is large (start >= array.size), extends +self+ with +nil+: + * With a block given, the block is called once for each element to be replaced; + * the value passed to the block is the _index_ of the element to be replaced + * (not the element itself); + * the block's return value replaces the element: * - * a = ['a', 'b', 'c', 'd'] - * a.fill(:X, 5, 0) # => ["a", "b", "c", "d", nil] - * a = ['a', 'b', 'c', 'd'] - * a.fill(:X, 5, 2) # => ["a", "b", "c", "d", nil, :X, :X] + * a = ['a', 'b', 'c', 'd'] # => ["a", "b", "c", "d"] + * a.fill(1, 2) {|element| element.to_s } # => ["a", "1", "2", "d"] * - * If +length+ is zero or negative, replaces no elements: + * For arguments +start+ and +count+: * - * a = ['a', 'b', 'c', 'd'] - * a.fill(:X, 1, 0) # => ["a", "b", "c", "d"] - * a.fill(:X, 1, -1) # => ["a", "b", "c", "d"] + * - If +start+ is non-negative, + * replaces +count+ elements beginning at offset +start+: * - * With arguments +obj+ and Range +range+, and no block given, - * replaces elements based on the given range. + * ['a', 'b', 'c', 'd'].fill('-', 0, 2) # => ["-", "-", "c", "d"] + * ['a', 'b', 'c', 'd'].fill('-', 1, 2) # => ["a", "-", "-", "d"] + * ['a', 'b', 'c', 'd'].fill('-', 2, 2) # => ["a", "b", "-", "-"] * - * If the range is positive and ascending (0 < range.begin <= range.end), - * replaces elements from range.begin to range.end: + * ['a', 'b', 'c', 'd'].fill(0, 2) {|e| e.to_s } # => ["0", "1", "c", "d"] + * ['a', 'b', 'c', 'd'].fill(1, 2) {|e| e.to_s } # => ["a", "1", "2", "d"] + * ['a', 'b', 'c', 'd'].fill(2, 2) {|e| e.to_s } # => ["a", "b", "2", "3"] * - * a = ['a', 'b', 'c', 'd'] - * a.fill(:X, (1..1)) # => ["a", :X, "c", "d"] + * Extends +self+ if necessary: * - * If range.first is negative, replaces no elements: + * ['a', 'b', 'c', 'd'].fill('-', 3, 2) # => ["a", "b", "c", "-", "-"] + * ['a', 'b', 'c', 'd'].fill('-', 4, 2) # => ["a", "b", "c", "d", "-", "-"] * - * a = ['a', 'b', 'c', 'd'] - * a.fill(:X, (-1..1)) # => ["a", "b", "c", "d"] + * ['a', 'b', 'c', 'd'].fill(3, 2) {|e| e.to_s } # => ["a", "b", "c", "3", "4"] + * ['a', 'b', 'c', 'd'].fill(4, 2) {|e| e.to_s } # => ["a", "b", "c", "d", "4", "5"] * - * If range.last is negative, counts from the end: + * Fills with +nil+ if necessary: * - * a = ['a', 'b', 'c', 'd'] - * a.fill(:X, (0..-2)) # => [:X, :X, :X, "d"] - * a = ['a', 'b', 'c', 'd'] - * a.fill(:X, (1..-2)) # => ["a", :X, :X, "d"] + * ['a', 'b', 'c', 'd'].fill('-', 5, 2) # => ["a", "b", "c", "d", nil, "-", "-"] + * ['a', 'b', 'c', 'd'].fill('-', 6, 2) # => ["a", "b", "c", "d", nil, nil, "-", "-"] * - * If range.last and range.last are both negative, - * both count from the end of the array: + * ['a', 'b', 'c', 'd'].fill(5, 2) {|e| e.to_s } # => ["a", "b", "c", "d", nil, "5", "6"] + * ['a', 'b', 'c', 'd'].fill(6, 2) {|e| e.to_s } # => ["a", "b", "c", "d", nil, nil, "6", "7"] * - * a = ['a', 'b', 'c', 'd'] - * a.fill(:X, (-1..-1)) # => ["a", "b", "c", :X] - * a = ['a', 'b', 'c', 'd'] - * a.fill(:X, (-2..-2)) # => ["a", "b", :X, "d"] + * Does nothing if +count+ is non-positive: * - * With no arguments and a block given, calls the block with each index; - * replaces the corresponding element with the block's return value: + * ['a', 'b', 'c', 'd'].fill('-', 2, 0) # => ["a", "b", "c", "d"] + * ['a', 'b', 'c', 'd'].fill('-', 2, -100) # => ["a", "b", "c", "d"] + * ['a', 'b', 'c', 'd'].fill('-', 6, -100) # => ["a", "b", "c", "d"] * - * a = ['a', 'b', 'c', 'd'] - * a.fill { |index| "new_#{index}" } # => ["new_0", "new_1", "new_2", "new_3"] + * ['a', 'b', 'c', 'd'].fill(2, 0) {|e| fail 'Cannot happen' } # => ["a", "b", "c", "d"] + * ['a', 'b', 'c', 'd'].fill(2, -100) {|e| fail 'Cannot happen' } # => ["a", "b", "c", "d"] + * ['a', 'b', 'c', 'd'].fill(6, -100) {|e| fail 'Cannot happen' } # => ["a", "b", "c", "d"] * - * With argument +start+ and a block given, calls the block with each index - * from offset +start+ to the end; replaces the corresponding element - * with the block's return value. + * - If +start+ is negative, counts backwards from the end of +self+: * - * If start is in range (0 <= start < array.size), - * replaces from offset +start+ to the end: + * ['a', 'b', 'c', 'd'].fill('-', -4, 3) # => ["-", "-", "-", "d"] + * ['a', 'b', 'c', 'd'].fill('-', -3, 3) # => ["a", "-", "-", "-"] * - * a = ['a', 'b', 'c', 'd'] - * a.fill(1) { |index| "new_#{index}" } # => ["a", "new_1", "new_2", "new_3"] + * ['a', 'b', 'c', 'd'].fill(-4, 3) {|e| e.to_s } # => ["0", "1", "2", "d"] + * ['a', 'b', 'c', 'd'].fill(-3, 3) {|e| e.to_s } # => ["a", "1", "2", "3"] * - * If +start+ is too large(start >= array.size), does nothing: + * Extends +self+ if necessary: * - * a = ['a', 'b', 'c', 'd'] - * a.fill(4) { |index| fail 'Cannot happen' } # => ["a", "b", "c", "d"] - * a = ['a', 'b', 'c', 'd'] - * a.fill(4) { |index| fail 'Cannot happen' } # => ["a", "b", "c", "d"] + * ['a', 'b', 'c', 'd'].fill('-', -2, 3) # => ["a", "b", "-", "-", "-"] + * ['a', 'b', 'c', 'd'].fill('-', -1, 3) # => ["a", "b", "c", "-", "-", "-"] * - * If +start+ is negative, counts from the end: + * ['a', 'b', 'c', 'd'].fill(-2, 3) {|e| e.to_s } # => ["a", "b", "2", "3", "4"] + * ['a', 'b', 'c', 'd'].fill(-1, 3) {|e| e.to_s } # => ["a", "b", "c", "3", "4", "5"] * - * a = ['a', 'b', 'c', 'd'] - * a.fill(-2) { |index| "new_#{index}" } # => ["a", "b", "new_2", "new_3"] + * Starts at the beginning of +self+ if +start+ is negative and out-of-range: * - * If start is too small (start <= -array.size, replaces all elements: + * ['a', 'b', 'c', 'd'].fill('-', -5, 2) # => ["-", "-", "c", "d"] + * ['a', 'b', 'c', 'd'].fill('-', -6, 2) # => ["-", "-", "c", "d"] * - * a = ['a', 'b', 'c', 'd'] - * a.fill(-6) { |index| "new_#{index}" } # => ["new_0", "new_1", "new_2", "new_3"] - * a = ['a', 'b', 'c', 'd'] - * a.fill(-50) { |index| "new_#{index}" } # => ["new_0", "new_1", "new_2", "new_3"] + * ['a', 'b', 'c', 'd'].fill(-5, 2) {|e| e.to_s } # => ["0", "1", "c", "d"] + * ['a', 'b', 'c', 'd'].fill(-6, 2) {|e| e.to_s } # => ["0", "1", "c", "d"] * - * With arguments +start+ and +length+, and a block given, - * calls the block for each index specified by start length; - * replaces the corresponding element with the block's return value. + * Does nothing if +count+ is non-positive: * - * If +start+ is in range, replaces +length+ elements beginning at offset +start+: + * ['a', 'b', 'c', 'd'].fill('-', -2, 0) # => ["a", "b", "c", "d"] + * ['a', 'b', 'c', 'd'].fill('-', -2, -1) # => ["a", "b", "c", "d"] * - * a = ['a', 'b', 'c', 'd'] - * a.fill(1, 1) { |index| "new_#{index}" } # => ["a", "new_1", "c", "d"] + * ['a', 'b', 'c', 'd'].fill(-2, 0) {|e| fail 'Cannot happen' } # => ["a", "b", "c", "d"] + * ['a', 'b', 'c', 'd'].fill(-2, -1) {|e| fail 'Cannot happen' } # => ["a", "b", "c", "d"] * - * If start is negative, counts from the end: + * When argument +range+ is given, + * it must be a Range object whose members are numeric; + * its +begin+ and +end+ values determine the elements of +self+ + * to be replaced: * - * a = ['a', 'b', 'c', 'd'] - * a.fill(-2, 1) { |index| "new_#{index}" } # => ["a", "b", "new_2", "d"] + * - If both +begin+ and +end+ are positive, they specify the first and last elements + * to be replaced: * - * If +start+ is large (start >= array.size), extends +self+ with +nil+: + * ['a', 'b', 'c', 'd'].fill('-', 1..2) # => ["a", "-", "-", "d"] + * ['a', 'b', 'c', 'd'].fill(1..2) {|e| e.to_s } # => ["a", "1", "2", "d"] * - * a = ['a', 'b', 'c', 'd'] - * a.fill(5, 0) { |index| "new_#{index}" } # => ["a", "b", "c", "d", nil] - * a = ['a', 'b', 'c', 'd'] - * a.fill(5, 2) { |index| "new_#{index}" } # => ["a", "b", "c", "d", nil, "new_5", "new_6"] + * If +end+ is smaller than +begin+, replaces no elements: * - * If +length+ is zero or less, replaces no elements: + * ['a', 'b', 'c', 'd'].fill('-', 2..1) # => ["a", "b", "c", "d"] + * ['a', 'b', 'c', 'd'].fill(2..1) {|e| e.to_s } # => ["a", "b", "c", "d"] * - * a = ['a', 'b', 'c', 'd'] - * a.fill(1, 0) { |index| "new_#{index}" } # => ["a", "b", "c", "d"] - * a.fill(1, -1) { |index| "new_#{index}" } # => ["a", "b", "c", "d"] + * - If either is negative (or both are negative), counts backwards from the end of +self+: * - * With arguments +obj+ and +range+, and a block given, - * calls the block with each index in the given range; - * replaces the corresponding element with the block's return value. + * ['a', 'b', 'c', 'd'].fill('-', -3..2) # => ["a", "-", "-", "d"] + * ['a', 'b', 'c', 'd'].fill('-', 1..-2) # => ["a", "-", "-", "d"] + * ['a', 'b', 'c', 'd'].fill('-', -3..-2) # => ["a", "-", "-", "d"] * - * If the range is positive and ascending (range 0 < range.begin <= range.end, - * replaces elements from range.begin to range.end: + * ['a', 'b', 'c', 'd'].fill(-3..2) {|e| e.to_s } # => ["a", "1", "2", "d"] + * ['a', 'b', 'c', 'd'].fill(1..-2) {|e| e.to_s } # => ["a", "1", "2", "d"] + * ['a', 'b', 'c', 'd'].fill(-3..-2) {|e| e.to_s } # => ["a", "1", "2", "d"] * - * a = ['a', 'b', 'c', 'd'] - * a.fill(1..1) { |index| "new_#{index}" } # => ["a", "new_1", "c", "d"] + * - If the +end+ value is excluded (see Range#exclude_end?), omits the last replacement: * - * If +range.first+ is negative, does nothing: + * ['a', 'b', 'c', 'd'].fill('-', 1...2) # => ["a", "-", "c", "d"] + * ['a', 'b', 'c', 'd'].fill('-', 1...-2) # => ["a", "-", "c", "d"] * - * a = ['a', 'b', 'c', 'd'] - * a.fill(-1..1) { |index| fail 'Cannot happen' } # => ["a", "b", "c", "d"] + * ['a', 'b', 'c', 'd'].fill(1...2) {|e| e.to_s } # => ["a", "1", "c", "d"] + * ['a', 'b', 'c', 'd'].fill(1...-2) {|e| e.to_s } # => ["a", "1", "c", "d"] * - * If range.last is negative, counts from the end: + * - If the range is endless (see {Endless Ranges}[rdoc-ref:Range@Endless+Ranges]), + * replaces elements to the end of +self+: * - * a = ['a', 'b', 'c', 'd'] - * a.fill(0..-2) { |index| "new_#{index}" } # => ["new_0", "new_1", "new_2", "d"] - * a = ['a', 'b', 'c', 'd'] - * a.fill(1..-2) { |index| "new_#{index}" } # => ["a", "new_1", "new_2", "d"] + * ['a', 'b', 'c', 'd'].fill('-', 1..) # => ["a", "-", "-", "-"] + * ['a', 'b', 'c', 'd'].fill(1..) {|e| e.to_s } # => ["a", "1", "2", "3"] * - * If range.first and range.last are both negative, - * both count from the end: + * - If the range is beginless (see {Beginless Ranges}[rdoc-ref:Range@Beginless+Ranges]), + * replaces elements from the beginning of +self+: * - * a = ['a', 'b', 'c', 'd'] - * a.fill(-1..-1) { |index| "new_#{index}" } # => ["a", "b", "c", "new_3"] - * a = ['a', 'b', 'c', 'd'] - * a.fill(-2..-2) { |index| "new_#{index}" } # => ["a", "b", "new_2", "d"] + * ['a', 'b', 'c', 'd'].fill('-', ..2) # => ["-", "-", "-", "d"] + * ['a', 'b', 'c', 'd'].fill(..2) {|e| e.to_s } # => ["0", "1", "2", "d"] * + * Related: see {Methods for Assigning}[rdoc-ref:Array@Methods+for+Assigning]. */ static VALUE @@ -5040,7 +5024,7 @@ rb_ary_concat(VALUE x, VALUE y) * a * 3 # => ["x", "y", "x", "y", "x", "y"] * * When string argument +string_separator+ is given, - * equivalent to array.join(string_separator): + * equivalent to self.join(string_separator): * * [0, [0, 1], {foo: 0}] * ', ' # => "0, 0, 1, {:foo=>0}" * From a80a9cf9ef268d6df44097535cae690636255c8a Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Tue, 24 Sep 2024 15:28:02 -0400 Subject: [PATCH 436/829] Further split up pm_compile_node to work on -O0 builds --- prism_compile.c | 4216 ++++++++++++++++++++++++----------------------- 1 file changed, 2133 insertions(+), 2083 deletions(-) diff --git a/prism_compile.c b/prism_compile.c index 1fbae42cf8616b..f04268c370eaa1 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -5611,6 +5611,1356 @@ pm_compile_constant_path_operator_write_node(rb_iseq_t *iseq, const pm_constant_ PUSH_INSN1(ret, location, setconstant, name); } +/** + * Many nodes in Prism can be marked as a static literal, which means slightly + * different things depending on which node it is. Occasionally we need to omit + * container nodes from static literal checks, which is where this macro comes + * in. + */ +#define PM_CONTAINER_P(node) (PM_NODE_TYPE_P(node, PM_ARRAY_NODE) || PM_NODE_TYPE_P(node, PM_HASH_NODE) || PM_NODE_TYPE_P(node, PM_RANGE_NODE)) + +/** + * Compile a scope node, which is a special kind of node that represents a new + * lexical scope, attached to a node in the AST. + */ +static inline void +pm_compile_scope_node(rb_iseq_t *iseq, pm_scope_node_t *scope_node, const pm_node_location_t *node_location, LINK_ANCHOR *const ret, bool popped) +{ + const pm_node_location_t location = *node_location; + struct rb_iseq_constant_body *body = ISEQ_BODY(iseq); + + pm_constant_id_list_t *locals = &scope_node->locals; + pm_parameters_node_t *parameters_node = NULL; + pm_node_list_t *keywords_list = NULL; + pm_node_list_t *optionals_list = NULL; + pm_node_list_t *posts_list = NULL; + pm_node_list_t *requireds_list = NULL; + pm_node_list_t *block_locals = NULL; + bool trailing_comma = false; + + if (PM_NODE_TYPE_P(scope_node->ast_node, PM_CLASS_NODE) || PM_NODE_TYPE_P(scope_node->ast_node, PM_MODULE_NODE)) { + PUSH_TRACE(ret, RUBY_EVENT_CLASS); + } + + if (scope_node->parameters != NULL) { + switch (PM_NODE_TYPE(scope_node->parameters)) { + case PM_BLOCK_PARAMETERS_NODE: { + pm_block_parameters_node_t *cast = (pm_block_parameters_node_t *) scope_node->parameters; + parameters_node = cast->parameters; + block_locals = &cast->locals; + + if (parameters_node) { + if (parameters_node->rest && PM_NODE_TYPE_P(parameters_node->rest, PM_IMPLICIT_REST_NODE)) { + trailing_comma = true; + } + } + break; + } + case PM_PARAMETERS_NODE: { + parameters_node = (pm_parameters_node_t *) scope_node->parameters; + break; + } + case PM_NUMBERED_PARAMETERS_NODE: { + uint32_t maximum = ((const pm_numbered_parameters_node_t *) scope_node->parameters)->maximum; + body->param.lead_num = maximum; + body->param.flags.ambiguous_param0 = maximum == 1; + break; + } + case PM_IT_PARAMETERS_NODE: + body->param.lead_num = 1; + body->param.flags.ambiguous_param0 = true; + break; + default: + rb_bug("Unexpected node type for parameters: %s", pm_node_type_to_str(PM_NODE_TYPE(scope_node->parameters))); + } + } + + struct rb_iseq_param_keyword *keyword = NULL; + + if (parameters_node) { + optionals_list = ¶meters_node->optionals; + requireds_list = ¶meters_node->requireds; + keywords_list = ¶meters_node->keywords; + posts_list = ¶meters_node->posts; + } + else if (scope_node->parameters && (PM_NODE_TYPE_P(scope_node->parameters, PM_NUMBERED_PARAMETERS_NODE) || PM_NODE_TYPE_P(scope_node->parameters, PM_IT_PARAMETERS_NODE))) { + body->param.opt_num = 0; + } + else { + body->param.lead_num = 0; + body->param.opt_num = 0; + } + + //********STEP 1********** + // Goal: calculate the table size for the locals, accounting for + // hidden variables and multi target nodes + size_t locals_size = locals->size; + + // Index lookup table buffer size is only the number of the locals + st_table *index_lookup_table = st_init_numtable(); + + int table_size = (int) locals_size; + + // For nodes have a hidden iteration variable. We add that to the local + // table size here. + if (PM_NODE_TYPE_P(scope_node->ast_node, PM_FOR_NODE)) table_size++; + + if (keywords_list && keywords_list->size) { + table_size++; + } + + if (requireds_list) { + for (size_t i = 0; i < requireds_list->size; i++) { + // For each MultiTargetNode, we're going to have one + // additional anonymous local not represented in the locals table + // We want to account for this in our table size + pm_node_t *required = requireds_list->nodes[i]; + if (PM_NODE_TYPE_P(required, PM_MULTI_TARGET_NODE)) { + table_size++; + } + else if (PM_NODE_TYPE_P(required, PM_REQUIRED_PARAMETER_NODE)) { + if (PM_NODE_FLAG_P(required, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { + table_size++; + } + } + } + } + + // If we have the `it` implicit local variable, we need to account for + // it in the local table size. + if (scope_node->parameters != NULL && PM_NODE_TYPE_P(scope_node->parameters, PM_IT_PARAMETERS_NODE)) { + table_size++; + } + + // Ensure there is enough room in the local table for any + // parameters that have been repeated + // ex: def underscore_parameters(_, _ = 1, _ = 2); _; end + // ^^^^^^^^^^^^ + if (optionals_list && optionals_list->size) { + for (size_t i = 0; i < optionals_list->size; i++) { + pm_node_t * node = optionals_list->nodes[i]; + if (PM_NODE_FLAG_P(node, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { + table_size++; + } + } + } + + // If we have an anonymous "rest" node, we'll need to increase the local + // table size to take it in to account. + // def m(foo, *, bar) + // ^ + if (parameters_node) { + if (parameters_node->rest) { + if (!(PM_NODE_TYPE_P(parameters_node->rest, PM_IMPLICIT_REST_NODE))) { + if (!((const pm_rest_parameter_node_t *) parameters_node->rest)->name || PM_NODE_FLAG_P(parameters_node->rest, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { + table_size++; + } + } + } + + // def foo(_, **_); _; end + // ^^^ + if (parameters_node->keyword_rest) { + // def foo(...); end + // ^^^ + // When we have a `...` as the keyword_rest, it's a forwarding_parameter_node and + // we need to leave space for 4 locals: *, **, &, ... + if (PM_NODE_TYPE_P(parameters_node->keyword_rest, PM_FORWARDING_PARAMETER_NODE)) { + // Only optimize specifically methods like this: `foo(...)` + if (requireds_list->size == 0 && optionals_list->size == 0 && keywords_list->size == 0) { + ISEQ_BODY(iseq)->param.flags.use_block = TRUE; + ISEQ_BODY(iseq)->param.flags.forwardable = TRUE; + table_size += 1; + } + else { + table_size += 4; + } + } + else { + const pm_keyword_rest_parameter_node_t *kw_rest = (const pm_keyword_rest_parameter_node_t *) parameters_node->keyword_rest; + + // If it's anonymous or repeated, then we need to allocate stack space + if (!kw_rest->name || PM_NODE_FLAG_P(kw_rest, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { + table_size++; + } + } + } + } + + if (posts_list) { + for (size_t i = 0; i < posts_list->size; i++) { + // For each MultiTargetNode, we're going to have one + // additional anonymous local not represented in the locals table + // We want to account for this in our table size + pm_node_t *required = posts_list->nodes[i]; + if (PM_NODE_TYPE_P(required, PM_MULTI_TARGET_NODE) || PM_NODE_FLAG_P(required, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { + table_size++; + } + } + } + + if (keywords_list && keywords_list->size) { + for (size_t i = 0; i < keywords_list->size; i++) { + pm_node_t *keyword_parameter_node = keywords_list->nodes[i]; + if (PM_NODE_FLAG_P(keyword_parameter_node, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { + table_size++; + } + } + } + + if (parameters_node && parameters_node->block) { + const pm_block_parameter_node_t *block_node = (const pm_block_parameter_node_t *) parameters_node->block; + + if (PM_NODE_FLAG_P(block_node, PM_PARAMETER_FLAGS_REPEATED_PARAMETER) || !block_node->name) { + table_size++; + } + } + + // We can create local_table_for_iseq with the correct size + VALUE idtmp = 0; + rb_ast_id_table_t *local_table_for_iseq = ALLOCV(idtmp, sizeof(rb_ast_id_table_t) + table_size * sizeof(ID)); + local_table_for_iseq->size = table_size; + + //********END OF STEP 1********** + + //********STEP 2********** + // Goal: populate iv index table as well as local table, keeping the + // layout of the local table consistent with the layout of the + // stack when calling the method + // + // Do a first pass on all of the parameters, setting their values in + // the local_table_for_iseq, _except_ for Multis who get a hidden + // variable in this step, and will get their names inserted in step 3 + + // local_index is a cursor that keeps track of the current + // index into local_table_for_iseq. The local table is actually a list, + // and the order of that list must match the order of the items pushed + // on the stack. We need to take in to account things pushed on the + // stack that _might not have a name_ (for example array destructuring). + // This index helps us know which item we're dealing with and also give + // those anonymous items temporary names (as below) + int local_index = 0; + + // Here we figure out local table indices and insert them in to the + // index lookup table and local tables. + // + // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) + // ^^^^^^^^^^^^^ + if (requireds_list && requireds_list->size) { + for (size_t i = 0; i < requireds_list->size; i++, local_index++) { + ID local; + + // For each MultiTargetNode, we're going to have one additional + // anonymous local not represented in the locals table. We want + // to account for this in our table size. + pm_node_t *required = requireds_list->nodes[i]; + + switch (PM_NODE_TYPE(required)) { + case PM_MULTI_TARGET_NODE: { + // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) + // ^^^^^^^^^^ + local = rb_make_temporary_id(local_index); + local_table_for_iseq->ids[local_index] = local; + break; + } + case PM_REQUIRED_PARAMETER_NODE: { + // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) + // ^ + const pm_required_parameter_node_t *param = (const pm_required_parameter_node_t *) required; + + if (PM_NODE_FLAG_P(required, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { + ID local = pm_constant_id_lookup(scope_node, param->name); + local_table_for_iseq->ids[local_index] = local; + } + else { + pm_insert_local_index(param->name, local_index, index_lookup_table, local_table_for_iseq, scope_node); + } + + break; + } + default: + rb_bug("Unsupported node in requireds in parameters %s", pm_node_type_to_str(PM_NODE_TYPE(required))); + } + } + + body->param.lead_num = (int) requireds_list->size; + body->param.flags.has_lead = true; + } + + if (scope_node->parameters != NULL && PM_NODE_TYPE_P(scope_node->parameters, PM_IT_PARAMETERS_NODE)) { + ID local = rb_make_temporary_id(local_index); + local_table_for_iseq->ids[local_index++] = local; + } + + // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) + // ^^^^^ + if (optionals_list && optionals_list->size) { + body->param.opt_num = (int) optionals_list->size; + body->param.flags.has_opt = true; + + for (size_t i = 0; i < optionals_list->size; i++, local_index++) { + pm_node_t * node = optionals_list->nodes[i]; + pm_constant_id_t name = ((const pm_optional_parameter_node_t *) node)->name; + + if (PM_NODE_FLAG_P(node, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { + ID local = pm_constant_id_lookup(scope_node, name); + local_table_for_iseq->ids[local_index] = local; + } + else { + pm_insert_local_index(name, local_index, index_lookup_table, local_table_for_iseq, scope_node); + } + } + } + + // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) + // ^^ + if (parameters_node && parameters_node->rest) { + body->param.rest_start = local_index; + + // If there's a trailing comma, we'll have an implicit rest node, + // and we don't want it to impact the rest variables on param + if (!(PM_NODE_TYPE_P(parameters_node->rest, PM_IMPLICIT_REST_NODE))) { + body->param.flags.has_rest = true; + RUBY_ASSERT(body->param.rest_start != -1); + + pm_constant_id_t name = ((const pm_rest_parameter_node_t *) parameters_node->rest)->name; + + if (name) { + // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) + // ^^ + if (PM_NODE_FLAG_P(parameters_node->rest, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { + ID local = pm_constant_id_lookup(scope_node, name); + local_table_for_iseq->ids[local_index] = local; + } + else { + pm_insert_local_index(name, local_index, index_lookup_table, local_table_for_iseq, scope_node); + } + } + else { + // def foo(a, (b, *c, d), e = 1, *, g, (h, *i, j), k:, l: 1, **m, &n) + // ^ + body->param.flags.anon_rest = true; + pm_insert_local_special(idMULT, local_index, index_lookup_table, local_table_for_iseq); + } + + local_index++; + } + } + + // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) + // ^^^^^^^^^^^^^ + if (posts_list && posts_list->size) { + body->param.post_num = (int) posts_list->size; + body->param.post_start = local_index; + body->param.flags.has_post = true; + + for (size_t i = 0; i < posts_list->size; i++, local_index++) { + ID local; + + // For each MultiTargetNode, we're going to have one additional + // anonymous local not represented in the locals table. We want + // to account for this in our table size. + const pm_node_t *post_node = posts_list->nodes[i]; + + switch (PM_NODE_TYPE(post_node)) { + case PM_MULTI_TARGET_NODE: { + // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) + // ^^^^^^^^^^ + local = rb_make_temporary_id(local_index); + local_table_for_iseq->ids[local_index] = local; + break; + } + case PM_REQUIRED_PARAMETER_NODE: { + // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) + // ^ + const pm_required_parameter_node_t *param = (const pm_required_parameter_node_t *) post_node; + + if (PM_NODE_FLAG_P(param, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { + ID local = pm_constant_id_lookup(scope_node, param->name); + local_table_for_iseq->ids[local_index] = local; + } + else { + pm_insert_local_index(param->name, local_index, index_lookup_table, local_table_for_iseq, scope_node); + } + break; + } + default: + rb_bug("Unsupported node in posts in parameters %s", pm_node_type_to_str(PM_NODE_TYPE(post_node))); + } + } + } + + // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) + // ^^^^^^^^ + // Keywords create an internal variable on the parse tree + if (keywords_list && keywords_list->size) { + body->param.keyword = keyword = ZALLOC_N(struct rb_iseq_param_keyword, 1); + keyword->num = (int) keywords_list->size; + + body->param.flags.has_kw = true; + const VALUE default_values = rb_ary_hidden_new(1); + const VALUE complex_mark = rb_str_tmp_new(0); + + ID *ids = xcalloc(keywords_list->size, sizeof(ID)); + + size_t kw_index = 0; + + for (size_t i = 0; i < keywords_list->size; i++) { + pm_node_t *keyword_parameter_node = keywords_list->nodes[i]; + pm_constant_id_t name; + + // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) + // ^^ + if (PM_NODE_TYPE_P(keyword_parameter_node, PM_REQUIRED_KEYWORD_PARAMETER_NODE)) { + name = ((const pm_required_keyword_parameter_node_t *) keyword_parameter_node)->name; + keyword->required_num++; + ID local = pm_constant_id_lookup(scope_node, name); + + if (PM_NODE_FLAG_P(keyword_parameter_node, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { + local_table_for_iseq->ids[local_index] = local; + } + else { + pm_insert_local_index(name, local_index, index_lookup_table, local_table_for_iseq, scope_node); + } + local_index++; + ids[kw_index++] = local; + } + } + + for (size_t i = 0; i < keywords_list->size; i++) { + pm_node_t *keyword_parameter_node = keywords_list->nodes[i]; + pm_constant_id_t name; + + // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) + // ^^^^ + if (PM_NODE_TYPE_P(keyword_parameter_node, PM_OPTIONAL_KEYWORD_PARAMETER_NODE)) { + const pm_optional_keyword_parameter_node_t *cast = ((const pm_optional_keyword_parameter_node_t *) keyword_parameter_node); + + pm_node_t *value = cast->value; + name = cast->name; + + if (PM_NODE_FLAG_P(value, PM_NODE_FLAG_STATIC_LITERAL) && !PM_CONTAINER_P(value)) { + rb_ary_push(default_values, pm_static_literal_value(iseq, value, scope_node)); + } + else { + rb_ary_push(default_values, complex_mark); + } + + ID local = pm_constant_id_lookup(scope_node, name); + if (PM_NODE_FLAG_P(keyword_parameter_node, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { + local_table_for_iseq->ids[local_index] = local; + } + else { + pm_insert_local_index(name, local_index, index_lookup_table, local_table_for_iseq, scope_node); + } + ids[kw_index++] = local; + local_index++; + } + + } + + keyword->bits_start = local_index; + keyword->table = ids; + + if (RARRAY_LEN(default_values)) { + VALUE *dvs = ALLOC_N(VALUE, RARRAY_LEN(default_values)); + + for (int i = 0; i < RARRAY_LEN(default_values); i++) { + VALUE dv = RARRAY_AREF(default_values, i); + if (dv == complex_mark) dv = Qundef; + RB_OBJ_WRITE(iseq, &dvs[i], dv); + } + + keyword->default_values = dvs; + } + + // Hidden local for keyword arguments + ID local = rb_make_temporary_id(local_index); + local_table_for_iseq->ids[local_index] = local; + local_index++; + } + + if (body->type == ISEQ_TYPE_BLOCK && local_index == 1 && requireds_list && requireds_list->size == 1 && !trailing_comma) { + body->param.flags.ambiguous_param0 = true; + } + + if (parameters_node) { + // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) + // ^^^ + if (parameters_node->keyword_rest) { + switch (PM_NODE_TYPE(parameters_node->keyword_rest)) { + case PM_NO_KEYWORDS_PARAMETER_NODE: { + // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **nil, &n) + // ^^^^^ + body->param.flags.accepts_no_kwarg = true; + break; + } + case PM_KEYWORD_REST_PARAMETER_NODE: { + // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) + // ^^^ + const pm_keyword_rest_parameter_node_t *kw_rest_node = (const pm_keyword_rest_parameter_node_t *) parameters_node->keyword_rest; + if (!body->param.flags.has_kw) { + body->param.keyword = keyword = ZALLOC_N(struct rb_iseq_param_keyword, 1); + } + + keyword->rest_start = local_index; + body->param.flags.has_kwrest = true; + + pm_constant_id_t constant_id = kw_rest_node->name; + if (constant_id) { + if (PM_NODE_FLAG_P(kw_rest_node, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { + ID local = pm_constant_id_lookup(scope_node, constant_id); + local_table_for_iseq->ids[local_index] = local; + } + else { + pm_insert_local_index(constant_id, local_index, index_lookup_table, local_table_for_iseq, scope_node); + } + } + else { + body->param.flags.anon_kwrest = true; + pm_insert_local_special(idPow, local_index, index_lookup_table, local_table_for_iseq); + } + + local_index++; + break; + } + case PM_FORWARDING_PARAMETER_NODE: { + // def foo(...) + // ^^^ + if (!ISEQ_BODY(iseq)->param.flags.forwardable) { + // Add the anonymous * + body->param.rest_start = local_index; + body->param.flags.has_rest = true; + body->param.flags.anon_rest = true; + pm_insert_local_special(idMULT, local_index++, index_lookup_table, local_table_for_iseq); + + // Add the anonymous ** + RUBY_ASSERT(!body->param.flags.has_kw); + body->param.flags.has_kw = false; + body->param.flags.has_kwrest = true; + body->param.flags.anon_kwrest = true; + body->param.keyword = keyword = ZALLOC_N(struct rb_iseq_param_keyword, 1); + keyword->rest_start = local_index; + pm_insert_local_special(idPow, local_index++, index_lookup_table, local_table_for_iseq); + + // Add the anonymous & + body->param.block_start = local_index; + body->param.flags.has_block = true; + pm_insert_local_special(idAnd, local_index++, index_lookup_table, local_table_for_iseq); + } + + // Add the ... + pm_insert_local_special(idDot3, local_index++, index_lookup_table, local_table_for_iseq); + break; + } + default: + rb_bug("node type %s not expected as keyword_rest", pm_node_type_to_str(PM_NODE_TYPE(parameters_node->keyword_rest))); + } + } + + // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) + // ^^ + if (parameters_node->block) { + body->param.block_start = local_index; + body->param.flags.has_block = true; + iseq_set_use_block(iseq); + + pm_constant_id_t name = ((const pm_block_parameter_node_t *) parameters_node->block)->name; + + if (name) { + if (PM_NODE_FLAG_P(parameters_node->block, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { + ID local = pm_constant_id_lookup(scope_node, name); + local_table_for_iseq->ids[local_index] = local; + } + else { + pm_insert_local_index(name, local_index, index_lookup_table, local_table_for_iseq, scope_node); + } + } + else { + pm_insert_local_special(idAnd, local_index, index_lookup_table, local_table_for_iseq); + } + + local_index++; + } + } + + //********END OF STEP 2********** + // The local table is now consistent with expected + // stack layout + + // If there's only one required element in the parameters + // CRuby needs to recognize it as an ambiguous parameter + + //********STEP 3********** + // Goal: fill in the names of the parameters in MultiTargetNodes + // + // Go through requireds again to set the multis + + if (requireds_list && requireds_list->size) { + for (size_t i = 0; i < requireds_list->size; i++) { + // For each MultiTargetNode, we're going to have one + // additional anonymous local not represented in the locals table + // We want to account for this in our table size + const pm_node_t *required = requireds_list->nodes[i]; + + if (PM_NODE_TYPE_P(required, PM_MULTI_TARGET_NODE)) { + local_index = pm_compile_destructured_param_locals((const pm_multi_target_node_t *) required, index_lookup_table, local_table_for_iseq, scope_node, local_index); + } + } + } + + // Go through posts again to set the multis + if (posts_list && posts_list->size) { + for (size_t i = 0; i < posts_list->size; i++) { + // For each MultiTargetNode, we're going to have one + // additional anonymous local not represented in the locals table + // We want to account for this in our table size + const pm_node_t *post = posts_list->nodes[i]; + + if (PM_NODE_TYPE_P(post, PM_MULTI_TARGET_NODE)) { + local_index = pm_compile_destructured_param_locals((const pm_multi_target_node_t *) post, index_lookup_table, local_table_for_iseq, scope_node, local_index); + } + } + } + + // Set any anonymous locals for the for node + if (PM_NODE_TYPE_P(scope_node->ast_node, PM_FOR_NODE)) { + if (PM_NODE_TYPE_P(((const pm_for_node_t *) scope_node->ast_node)->index, PM_LOCAL_VARIABLE_TARGET_NODE)) { + body->param.lead_num++; + } + else { + body->param.rest_start = local_index; + body->param.flags.has_rest = true; + } + + ID local = rb_make_temporary_id(local_index); + local_table_for_iseq->ids[local_index] = local; + local_index++; + } + + // Fill in any NumberedParameters, if they exist + if (scope_node->parameters && PM_NODE_TYPE_P(scope_node->parameters, PM_NUMBERED_PARAMETERS_NODE)) { + int maximum = ((const pm_numbered_parameters_node_t *) scope_node->parameters)->maximum; + RUBY_ASSERT(0 < maximum && maximum <= 9); + for (int i = 0; i < maximum; i++, local_index++) { + const uint8_t param_name[] = { '_', '1' + i }; + pm_constant_id_t constant_id = pm_constant_pool_find(&scope_node->parser->constant_pool, param_name, 2); + RUBY_ASSERT(constant_id && "parser should fill in any gaps in numbered parameters"); + pm_insert_local_index(constant_id, local_index, index_lookup_table, local_table_for_iseq, scope_node); + } + body->param.lead_num = maximum; + body->param.flags.has_lead = true; + } + + //********END OF STEP 3********** + + //********STEP 4********** + // Goal: fill in the method body locals + // To be explicit, these are the non-parameter locals + // We fill in the block_locals, if they exist + // lambda { |x; y| y } + // ^ + if (block_locals && block_locals->size) { + for (size_t i = 0; i < block_locals->size; i++, local_index++) { + pm_constant_id_t constant_id = ((const pm_block_local_variable_node_t *) block_locals->nodes[i])->name; + pm_insert_local_index(constant_id, local_index, index_lookup_table, local_table_for_iseq, scope_node); + } + } + + // Fill in any locals we missed + if (scope_node->locals.size) { + for (size_t i = 0; i < scope_node->locals.size; i++) { + pm_constant_id_t constant_id = locals->ids[i]; + if (constant_id) { + struct pm_local_table_insert_ctx ctx; + ctx.scope_node = scope_node; + ctx.local_table_for_iseq = local_table_for_iseq; + ctx.local_index = local_index; + + st_update(index_lookup_table, (st_data_t)constant_id, pm_local_table_insert_func, (st_data_t)&ctx); + + local_index = ctx.local_index; + } + } + } + + //********END OF STEP 4********** + + // We set the index_lookup_table on the scope node so we can + // refer to the parameters correctly + if (scope_node->index_lookup_table) { + st_free_table(scope_node->index_lookup_table); + } + scope_node->index_lookup_table = index_lookup_table; + iseq_calc_param_size(iseq); + + if (ISEQ_BODY(iseq)->param.flags.forwardable) { + // We're treating `...` as a parameter so that frame + // pushing won't clobber it. + ISEQ_BODY(iseq)->param.size += 1; + } + + // FIXME: args? + iseq_set_local_table(iseq, local_table_for_iseq, 0); + scope_node->local_table_for_iseq_size = local_table_for_iseq->size; + + //********STEP 5************ + // Goal: compile anything that needed to be compiled + if (optionals_list && optionals_list->size) { + LABEL **opt_table = (LABEL **) ALLOC_N(VALUE, optionals_list->size + 1); + LABEL *label; + + // TODO: Should we make an api for NEW_LABEL where you can pass + // a pointer to the label it should fill out? We already + // have a list of labels allocated above so it seems wasteful + // to do the copies. + for (size_t i = 0; i < optionals_list->size; i++) { + label = NEW_LABEL(location.line); + opt_table[i] = label; + PUSH_LABEL(ret, label); + pm_node_t *optional_node = optionals_list->nodes[i]; + PM_COMPILE_NOT_POPPED(optional_node); + } + + // Set the last label + label = NEW_LABEL(location.line); + opt_table[optionals_list->size] = label; + PUSH_LABEL(ret, label); + + body->param.opt_table = (const VALUE *) opt_table; + } + + if (keywords_list && keywords_list->size) { + size_t optional_index = 0; + for (size_t i = 0; i < keywords_list->size; i++) { + pm_node_t *keyword_parameter_node = keywords_list->nodes[i]; + pm_constant_id_t name; + + switch (PM_NODE_TYPE(keyword_parameter_node)) { + case PM_OPTIONAL_KEYWORD_PARAMETER_NODE: { + // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) + // ^^^^ + const pm_optional_keyword_parameter_node_t *cast = ((const pm_optional_keyword_parameter_node_t *) keyword_parameter_node); + + pm_node_t *value = cast->value; + name = cast->name; + + if (!PM_NODE_FLAG_P(value, PM_NODE_FLAG_STATIC_LITERAL) || PM_CONTAINER_P(value)) { + LABEL *end_label = NEW_LABEL(location.line); + + pm_local_index_t index = pm_lookup_local_index(iseq, scope_node, name, 0); + int kw_bits_idx = table_size - body->param.keyword->bits_start; + PUSH_INSN2(ret, location, checkkeyword, INT2FIX(kw_bits_idx + VM_ENV_DATA_SIZE - 1), INT2FIX(optional_index)); + PUSH_INSNL(ret, location, branchif, end_label); + PM_COMPILE(value); + PUSH_SETLOCAL(ret, location, index.index, index.level); + PUSH_LABEL(ret, end_label); + } + optional_index++; + break; + } + case PM_REQUIRED_KEYWORD_PARAMETER_NODE: + // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) + // ^^ + break; + default: + rb_bug("Unexpected keyword parameter node type %s", pm_node_type_to_str(PM_NODE_TYPE(keyword_parameter_node))); + } + } + } + + if (requireds_list && requireds_list->size) { + for (size_t i = 0; i < requireds_list->size; i++) { + // For each MultiTargetNode, we're going to have one additional + // anonymous local not represented in the locals table. We want + // to account for this in our table size. + const pm_node_t *required = requireds_list->nodes[i]; + + if (PM_NODE_TYPE_P(required, PM_MULTI_TARGET_NODE)) { + PUSH_GETLOCAL(ret, location, table_size - (int)i, 0); + pm_compile_destructured_param_writes(iseq, (const pm_multi_target_node_t *) required, ret, scope_node); + } + } + } + + if (posts_list && posts_list->size) { + for (size_t i = 0; i < posts_list->size; i++) { + // For each MultiTargetNode, we're going to have one additional + // anonymous local not represented in the locals table. We want + // to account for this in our table size. + const pm_node_t *post = posts_list->nodes[i]; + + if (PM_NODE_TYPE_P(post, PM_MULTI_TARGET_NODE)) { + PUSH_GETLOCAL(ret, location, table_size - body->param.post_start - (int) i, 0); + pm_compile_destructured_param_writes(iseq, (const pm_multi_target_node_t *) post, ret, scope_node); + } + } + } + + switch (body->type) { + case ISEQ_TYPE_PLAIN: { + RUBY_ASSERT(PM_NODE_TYPE_P(scope_node->ast_node, PM_INTERPOLATED_REGULAR_EXPRESSION_NODE)); + + const pm_interpolated_regular_expression_node_t *cast = (const pm_interpolated_regular_expression_node_t *) scope_node->ast_node; + pm_compile_regexp_dynamic(iseq, (const pm_node_t *) cast, &cast->parts, &location, ret, popped, scope_node); + + break; + } + case ISEQ_TYPE_BLOCK: { + LABEL *start = ISEQ_COMPILE_DATA(iseq)->start_label = NEW_LABEL(0); + LABEL *end = ISEQ_COMPILE_DATA(iseq)->end_label = NEW_LABEL(0); + const pm_node_location_t block_location = { .line = body->location.first_lineno, .node_id = -1 }; + + start->rescued = LABEL_RESCUE_BEG; + end->rescued = LABEL_RESCUE_END; + + // For nodes automatically assign the iteration variable to whatever + // index variable. We need to handle that write here because it has + // to happen in the context of the block. Note that this happens + // before the B_CALL tracepoint event. + if (PM_NODE_TYPE_P(scope_node->ast_node, PM_FOR_NODE)) { + pm_compile_for_node_index(iseq, ((const pm_for_node_t *) scope_node->ast_node)->index, ret, scope_node); + } + + PUSH_TRACE(ret, RUBY_EVENT_B_CALL); + PUSH_INSN(ret, block_location, nop); + PUSH_LABEL(ret, start); + + if (scope_node->body != NULL) { + switch (PM_NODE_TYPE(scope_node->ast_node)) { + case PM_POST_EXECUTION_NODE: { + const pm_post_execution_node_t *cast = (const pm_post_execution_node_t *) scope_node->ast_node; + PUSH_INSN1(ret, block_location, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); + + // We create another ScopeNode from the statements within the PostExecutionNode + pm_scope_node_t next_scope_node; + pm_scope_node_init((const pm_node_t *) cast->statements, &next_scope_node, scope_node); + + const rb_iseq_t *block = NEW_CHILD_ISEQ(&next_scope_node, make_name_for_block(body->parent_iseq), ISEQ_TYPE_BLOCK, location.line); + pm_scope_node_destroy(&next_scope_node); + + PUSH_CALL_WITH_BLOCK(ret, block_location, id_core_set_postexe, INT2FIX(0), block); + break; + } + case PM_INTERPOLATED_REGULAR_EXPRESSION_NODE: { + const pm_interpolated_regular_expression_node_t *cast = (const pm_interpolated_regular_expression_node_t *) scope_node->ast_node; + pm_compile_regexp_dynamic(iseq, (const pm_node_t *) cast, &cast->parts, &location, ret, popped, scope_node); + break; + } + default: + pm_compile_node(iseq, scope_node->body, ret, popped, scope_node); + break; + } + } + else { + PUSH_INSN(ret, block_location, putnil); + } + + PUSH_LABEL(ret, end); + PUSH_TRACE(ret, RUBY_EVENT_B_RETURN); + ISEQ_COMPILE_DATA(iseq)->last_line = body->location.code_location.end_pos.lineno; + + /* wide range catch handler must put at last */ + PUSH_CATCH_ENTRY(CATCH_TYPE_REDO, start, end, NULL, start); + PUSH_CATCH_ENTRY(CATCH_TYPE_NEXT, start, end, NULL, end); + break; + } + case ISEQ_TYPE_ENSURE: { + const pm_node_location_t statements_location = (scope_node->body != NULL ? PM_NODE_START_LOCATION(scope_node->parser, scope_node->body) : location); + iseq_set_exception_local_table(iseq); + + if (scope_node->body != NULL) { + PM_COMPILE_POPPED((const pm_node_t *) scope_node->body); + } + + PUSH_GETLOCAL(ret, statements_location, 1, 0); + PUSH_INSN1(ret, statements_location, throw, INT2FIX(0)); + return; + } + case ISEQ_TYPE_METHOD: { + ISEQ_COMPILE_DATA(iseq)->root_node = (const void *) scope_node->body; + PUSH_TRACE(ret, RUBY_EVENT_CALL); + + if (scope_node->body) { + PM_COMPILE((const pm_node_t *) scope_node->body); + } + else { + PUSH_INSN(ret, location, putnil); + } + + ISEQ_COMPILE_DATA(iseq)->root_node = (const void *) scope_node->body; + PUSH_TRACE(ret, RUBY_EVENT_RETURN); + + ISEQ_COMPILE_DATA(iseq)->last_line = body->location.code_location.end_pos.lineno; + break; + } + case ISEQ_TYPE_RESCUE: { + iseq_set_exception_local_table(iseq); + if (PM_NODE_TYPE_P(scope_node->ast_node, PM_RESCUE_MODIFIER_NODE)) { + LABEL *lab = NEW_LABEL(location.line); + LABEL *rescue_end = NEW_LABEL(location.line); + PUSH_GETLOCAL(ret, location, LVAR_ERRINFO, 0); + PUSH_INSN1(ret, location, putobject, rb_eStandardError); + PUSH_INSN1(ret, location, checkmatch, INT2FIX(VM_CHECKMATCH_TYPE_RESCUE)); + PUSH_INSNL(ret, location, branchif, lab); + PUSH_INSNL(ret, location, jump, rescue_end); + PUSH_LABEL(ret, lab); + PUSH_TRACE(ret, RUBY_EVENT_RESCUE); + PM_COMPILE((const pm_node_t *) scope_node->body); + PUSH_INSN(ret, location, leave); + PUSH_LABEL(ret, rescue_end); + PUSH_GETLOCAL(ret, location, LVAR_ERRINFO, 0); + } + else { + PM_COMPILE((const pm_node_t *) scope_node->ast_node); + } + PUSH_INSN1(ret, location, throw, INT2FIX(0)); + + return; + } + default: + if (scope_node->body) { + PM_COMPILE((const pm_node_t *) scope_node->body); + } + else { + PUSH_INSN(ret, location, putnil); + } + break; + } + + if (PM_NODE_TYPE_P(scope_node->ast_node, PM_CLASS_NODE) || PM_NODE_TYPE_P(scope_node->ast_node, PM_MODULE_NODE)) { + const pm_node_location_t end_location = PM_NODE_END_LOCATION(scope_node->parser, scope_node->ast_node); + PUSH_TRACE(ret, RUBY_EVENT_END); + ISEQ_COMPILE_DATA(iseq)->last_line = end_location.line; + } + + if (!PM_NODE_TYPE_P(scope_node->ast_node, PM_ENSURE_NODE)) { + const pm_node_location_t location = { .line = ISEQ_COMPILE_DATA(iseq)->last_line, .node_id = -1 }; + PUSH_INSN(ret, location, leave); + } +} + +static inline void +pm_compile_alias_global_variable_node(rb_iseq_t *iseq, const pm_alias_global_variable_node_t *node, const pm_node_location_t *location, LINK_ANCHOR *const ret, bool popped, pm_scope_node_t *scope_node) +{ + // alias $foo $bar + // ^^^^^^^^^^^^^^^ + PUSH_INSN1(ret, *location, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); + + const pm_location_t *new_name_loc = &node->new_name->location; + PUSH_INSN1(ret, *location, putobject, ID2SYM(rb_intern3((const char *) new_name_loc->start, new_name_loc->end - new_name_loc->start, scope_node->encoding))); + + const pm_location_t *old_name_loc = &node->old_name->location; + PUSH_INSN1(ret, *location, putobject, ID2SYM(rb_intern3((const char *) old_name_loc->start, old_name_loc->end - old_name_loc->start, scope_node->encoding))); + + PUSH_SEND(ret, *location, id_core_set_variable_alias, INT2FIX(2)); + if (popped) PUSH_INSN(ret, *location, pop); +} + +static inline void +pm_compile_alias_method_node(rb_iseq_t *iseq, const pm_alias_method_node_t *node, const pm_node_location_t *location, LINK_ANCHOR *const ret, bool popped, pm_scope_node_t *scope_node) +{ + PUSH_INSN1(ret, *location, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); + PUSH_INSN1(ret, *location, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_CBASE)); + PM_COMPILE_NOT_POPPED(node->new_name); + PM_COMPILE_NOT_POPPED(node->old_name); + + PUSH_SEND(ret, *location, id_core_set_method_alias, INT2FIX(3)); + if (popped) PUSH_INSN(ret, *location, pop); +} + +static inline void +pm_compile_and_node(rb_iseq_t *iseq, const pm_and_node_t *node, const pm_node_location_t *location, LINK_ANCHOR *const ret, bool popped, pm_scope_node_t *scope_node) +{ + LABEL *end_label = NEW_LABEL(location->line); + + PM_COMPILE_NOT_POPPED(node->left); + if (!popped) PUSH_INSN(ret, *location, dup); + PUSH_INSNL(ret, *location, branchunless, end_label); + + if (!popped) PUSH_INSN(ret, *location, pop); + PM_COMPILE(node->right); + PUSH_LABEL(ret, end_label); +} + +static inline void +pm_compile_array_node(rb_iseq_t *iseq, const pm_node_t *node, const pm_node_list_t *elements, const pm_node_location_t *location, LINK_ANCHOR *const ret, bool popped, pm_scope_node_t *scope_node) +{ + // If every node in the array is static, then we can compile the entire + // array now instead of later. + if (PM_NODE_FLAG_P(node, PM_NODE_FLAG_STATIC_LITERAL)) { + // We're only going to compile this node if it's not popped. If it + // is popped, then we know we don't need to do anything since it's + // statically known. + if (!popped) { + if (elements->size) { + VALUE value = pm_static_literal_value(iseq, node, scope_node); + PUSH_INSN1(ret, *location, duparray, value); + } + else { + PUSH_INSN1(ret, *location, newarray, INT2FIX(0)); + } + } + return; + } + + // Here since we know there are possible side-effects inside the + // array contents, we're going to build it entirely at runtime. + // We'll do this by pushing all of the elements onto the stack and + // then combining them with newarray. + // + // If this array is popped, then this serves only to ensure we enact + // all side-effects (like method calls) that are contained within + // the array contents. + // + // We treat all sequences of non-splat elements as their + // own arrays, followed by a newarray, and then continually + // concat the arrays with the SplatNode nodes. + const int max_new_array_size = 0x100; + const unsigned int min_tmp_array_size = 0x40; + + int new_array_size = 0; + bool first_chunk = true; + + // This is an optimization wherein we keep track of whether or not + // the previous element was a static literal. If it was, then we do + // not attempt to check if we have a subarray that can be optimized. + // If it was not, then we do check. + bool static_literal = false; + + // Either create a new array, or push to the existing array. +#define FLUSH_CHUNK \ + if (new_array_size) { \ + if (first_chunk) PUSH_INSN1(ret, *location, newarray, INT2FIX(new_array_size)); \ + else PUSH_INSN1(ret, *location, pushtoarray, INT2FIX(new_array_size)); \ + first_chunk = false; \ + new_array_size = 0; \ + } + + for (size_t index = 0; index < elements->size; index++) { + const pm_node_t *element = elements->nodes[index]; + + if (PM_NODE_TYPE_P(element, PM_SPLAT_NODE)) { + FLUSH_CHUNK; + + const pm_splat_node_t *splat_element = (const pm_splat_node_t *) element; + if (splat_element->expression) { + PM_COMPILE_NOT_POPPED(splat_element->expression); + } + else { + pm_local_index_t index = pm_lookup_local_index(iseq, scope_node, PM_CONSTANT_MULT, 0); + PUSH_GETLOCAL(ret, *location, index.index, index.level); + } + + if (first_chunk) { + // If this is the first element of the array then we + // need to splatarray the elements into the list. + PUSH_INSN1(ret, *location, splatarray, Qtrue); + first_chunk = false; + } + else { + PUSH_INSN(ret, *location, concattoarray); + } + + static_literal = false; + } + else if (PM_NODE_TYPE_P(element, PM_KEYWORD_HASH_NODE)) { + if (new_array_size == 0 && first_chunk) { + PUSH_INSN1(ret, *location, newarray, INT2FIX(0)); + first_chunk = false; + } + else { + FLUSH_CHUNK; + } + + // If we get here, then this is the last element of the + // array/arguments, because it cannot be followed by + // anything else without a syntax error. This looks like: + // + // [foo, bar, baz: qux] + // ^^^^^^^^ + // + // [foo, bar, **baz] + // ^^^^^ + // + const pm_keyword_hash_node_t *keyword_hash = (const pm_keyword_hash_node_t *) element; + pm_compile_hash_elements(iseq, element, &keyword_hash->elements, false, ret, scope_node); + + // This boolean controls the manner in which we push the + // hash onto the array. If it's all keyword splats, then we + // can use the very specialized pushtoarraykwsplat + // instruction to check if it's empty before we push it. + size_t splats = 0; + while (splats < keyword_hash->elements.size && PM_NODE_TYPE_P(keyword_hash->elements.nodes[splats], PM_ASSOC_SPLAT_NODE)) splats++; + + if (keyword_hash->elements.size == splats) { + PUSH_INSN(ret, *location, pushtoarraykwsplat); + } + else { + new_array_size++; + } + } + else if ( + PM_NODE_FLAG_P(element, PM_NODE_FLAG_STATIC_LITERAL) && + !PM_CONTAINER_P(element) && + !static_literal && + ((index + min_tmp_array_size) < elements->size) + ) { + // If we have a static literal, then there's the potential + // to group a bunch of them together with a literal array + // and then concat them together. + size_t right_index = index + 1; + while ( + right_index < elements->size && + PM_NODE_FLAG_P(elements->nodes[right_index], PM_NODE_FLAG_STATIC_LITERAL) && + !PM_CONTAINER_P(elements->nodes[right_index]) + ) right_index++; + + size_t tmp_array_size = right_index - index; + if (tmp_array_size >= min_tmp_array_size) { + VALUE tmp_array = rb_ary_hidden_new(tmp_array_size); + + // Create the temporary array. + for (; tmp_array_size; tmp_array_size--) + rb_ary_push(tmp_array, pm_static_literal_value(iseq, elements->nodes[index++], scope_node)); + OBJ_FREEZE(tmp_array); + + // Emit the optimized code. + FLUSH_CHUNK; + if (first_chunk) { + PUSH_INSN1(ret, *location, duparray, tmp_array); + first_chunk = false; + } + else { + PUSH_INSN1(ret, *location, putobject, tmp_array); + PUSH_INSN(ret, *location, concattoarray); + } + } + else { + PM_COMPILE_NOT_POPPED(element); + if (++new_array_size >= max_new_array_size) FLUSH_CHUNK; + static_literal = true; + } + } else { + PM_COMPILE_NOT_POPPED(element); + if (++new_array_size >= max_new_array_size) FLUSH_CHUNK; + static_literal = false; + } + } + + FLUSH_CHUNK; + if (popped) PUSH_INSN(ret, *location, pop); + +#undef FLUSH_CHUNK +} + +static inline void +pm_compile_break_node(rb_iseq_t *iseq, const pm_break_node_t *node, const pm_node_location_t *location, LINK_ANCHOR *const ret, bool popped, pm_scope_node_t *scope_node) +{ + unsigned long throw_flag = 0; + + if (ISEQ_COMPILE_DATA(iseq)->redo_label != 0 && can_add_ensure_iseq(iseq)) { + /* while/until */ + LABEL *splabel = NEW_LABEL(0); + PUSH_LABEL(ret, splabel); + PUSH_ADJUST(ret, *location, ISEQ_COMPILE_DATA(iseq)->redo_label); + + if (node->arguments != NULL) { + PM_COMPILE_NOT_POPPED((const pm_node_t *) node->arguments); + } + else { + PUSH_INSN(ret, *location, putnil); + } + + pm_add_ensure_iseq(ret, iseq, 0, scope_node); + PUSH_INSNL(ret, *location, jump, ISEQ_COMPILE_DATA(iseq)->end_label); + PUSH_ADJUST_RESTORE(ret, splabel); + if (!popped) PUSH_INSN(ret, *location, putnil); + } + else { + const rb_iseq_t *ip = iseq; + + while (ip) { + if (!ISEQ_COMPILE_DATA(ip)) { + ip = 0; + break; + } + + if (ISEQ_COMPILE_DATA(ip)->redo_label != 0) { + throw_flag = VM_THROW_NO_ESCAPE_FLAG; + } + else if (ISEQ_BODY(ip)->type == ISEQ_TYPE_BLOCK) { + throw_flag = 0; + } + else if (ISEQ_BODY(ip)->type == ISEQ_TYPE_EVAL) { + COMPILE_ERROR(iseq, location->line, "Invalid break"); + return; + } + else { + ip = ISEQ_BODY(ip)->parent_iseq; + continue; + } + + /* escape from block */ + if (node->arguments != NULL) { + PM_COMPILE_NOT_POPPED((const pm_node_t *) node->arguments); + } + else { + PUSH_INSN(ret, *location, putnil); + } + + PUSH_INSN1(ret, *location, throw, INT2FIX(throw_flag | TAG_BREAK)); + if (popped) PUSH_INSN(ret, *location, pop); + + return; + } + + COMPILE_ERROR(iseq, location->line, "Invalid break"); + } +} + +static inline void +pm_compile_call_node(rb_iseq_t *iseq, const pm_call_node_t *node, LINK_ANCHOR *const ret, bool popped, pm_scope_node_t *scope_node) +{ + ID method_id = pm_constant_id_lookup(scope_node, node->name); + + const pm_location_t *message_loc = &node->message_loc; + if (message_loc->start == NULL) message_loc = &node->base.location; + + const pm_node_location_t location = PM_LOCATION_START_LOCATION(scope_node->parser, message_loc, node->base.node_id); + const char *builtin_func; + + if (UNLIKELY(iseq_has_builtin_function_table(iseq)) && (builtin_func = pm_iseq_builtin_function_name(scope_node, node->receiver, method_id)) != NULL) { + pm_compile_builtin_function_call(iseq, ret, scope_node, node, &location, popped, ISEQ_COMPILE_DATA(iseq)->current_block, builtin_func); + return; + } + + LABEL *start = NEW_LABEL(location.line); + if (node->block) PUSH_LABEL(ret, start); + + switch (method_id) { + case idUMinus: { + if (pm_opt_str_freeze_p(iseq, node)) { + VALUE value = parse_static_literal_string(iseq, scope_node, node->receiver, &((const pm_string_node_t * ) node->receiver)->unescaped); + PUSH_INSN2(ret, location, opt_str_uminus, value, new_callinfo(iseq, idUMinus, 0, 0, NULL, FALSE)); + return; + } + break; + } + case idFreeze: { + if (pm_opt_str_freeze_p(iseq, node)) { + VALUE value = parse_static_literal_string(iseq, scope_node, node->receiver, &((const pm_string_node_t * ) node->receiver)->unescaped); + PUSH_INSN2(ret, location, opt_str_freeze, value, new_callinfo(iseq, idFreeze, 0, 0, NULL, FALSE)); + return; + } + break; + } + case idAREF: { + if (pm_opt_aref_with_p(iseq, node)) { + const pm_string_node_t *string = (const pm_string_node_t *) ((const pm_arguments_node_t *) node->arguments)->arguments.nodes[0]; + VALUE value = parse_static_literal_string(iseq, scope_node, (const pm_node_t *) string, &string->unescaped); + + PM_COMPILE_NOT_POPPED(node->receiver); + PUSH_INSN2(ret, location, opt_aref_with, value, new_callinfo(iseq, idAREF, 1, 0, NULL, FALSE)); + + if (popped) { + PUSH_INSN(ret, location, pop); + } + + return; + } + break; + } + case idASET: { + if (pm_opt_aset_with_p(iseq, node)) { + const pm_string_node_t *string = (const pm_string_node_t *) ((const pm_arguments_node_t *) node->arguments)->arguments.nodes[0]; + VALUE value = parse_static_literal_string(iseq, scope_node, (const pm_node_t *) string, &string->unescaped); + + PM_COMPILE_NOT_POPPED(node->receiver); + PM_COMPILE_NOT_POPPED(((const pm_arguments_node_t *) node->arguments)->arguments.nodes[1]); + + if (!popped) { + PUSH_INSN(ret, location, swap); + PUSH_INSN1(ret, location, topn, INT2FIX(1)); + } + + PUSH_INSN2(ret, location, opt_aset_with, value, new_callinfo(iseq, idASET, 2, 0, NULL, FALSE)); + PUSH_INSN(ret, location, pop); + return; + } + break; + } + } + + if (PM_NODE_FLAG_P(node, PM_CALL_NODE_FLAGS_ATTRIBUTE_WRITE) && !popped) { + PUSH_INSN(ret, location, putnil); + } + + if (node->receiver == NULL) { + PUSH_INSN(ret, location, putself); + } + else { + if (method_id == idCall && PM_NODE_TYPE_P(node->receiver, PM_LOCAL_VARIABLE_READ_NODE)) { + const pm_local_variable_read_node_t *read_node_cast = (const pm_local_variable_read_node_t *) node->receiver; + uint32_t node_id = node->receiver->node_id; + int idx, level; + + if (iseq_block_param_id_p(iseq, pm_constant_id_lookup(scope_node, read_node_cast->name), &idx, &level)) { + ADD_ELEM(ret, (LINK_ELEMENT *) new_insn_body(iseq, location.line, node_id, BIN(getblockparamproxy), 2, INT2FIX((idx) + VM_ENV_DATA_SIZE - 1), INT2FIX(level))); + } + else { + PM_COMPILE_NOT_POPPED(node->receiver); + } + } + else { + PM_COMPILE_NOT_POPPED(node->receiver); + } + } + + pm_compile_call(iseq, node, ret, popped, scope_node, method_id, start); + return; +} + +static inline void +pm_compile_call_operator_write_node(rb_iseq_t *iseq, const pm_call_operator_write_node_t *node, const pm_node_location_t *location, LINK_ANCHOR *const ret, bool popped, pm_scope_node_t *scope_node) +{ + int flag = 0; + + if (PM_NODE_FLAG_P(node, PM_CALL_NODE_FLAGS_IGNORE_VISIBILITY)) { + flag = VM_CALL_FCALL; + } + + PM_COMPILE_NOT_POPPED(node->receiver); + + LABEL *safe_label = NULL; + if (PM_NODE_FLAG_P(node, PM_CALL_NODE_FLAGS_SAFE_NAVIGATION)) { + safe_label = NEW_LABEL(location->line); + PUSH_INSN(ret, *location, dup); + PUSH_INSNL(ret, *location, branchnil, safe_label); + } + + PUSH_INSN(ret, *location, dup); + + ID id_read_name = pm_constant_id_lookup(scope_node, node->read_name); + PUSH_SEND_WITH_FLAG(ret, *location, id_read_name, INT2FIX(0), INT2FIX(flag)); + + PM_COMPILE_NOT_POPPED(node->value); + ID id_operator = pm_constant_id_lookup(scope_node, node->binary_operator); + PUSH_SEND(ret, *location, id_operator, INT2FIX(1)); + + if (!popped) { + PUSH_INSN(ret, *location, swap); + PUSH_INSN1(ret, *location, topn, INT2FIX(1)); + } + + ID id_write_name = pm_constant_id_lookup(scope_node, node->write_name); + PUSH_SEND_WITH_FLAG(ret, *location, id_write_name, INT2FIX(1), INT2FIX(flag)); + + if (safe_label != NULL && popped) PUSH_LABEL(ret, safe_label); + PUSH_INSN(ret, *location, pop); + if (safe_label != NULL && !popped) PUSH_LABEL(ret, safe_label); +} + /** * When we're compiling a case node, it's possible that we can speed it up using * a dispatch hash, which will allow us to jump directly to the correct when @@ -5856,1011 +7206,880 @@ pm_compile_case_node(rb_iseq_t *iseq, const pm_case_node_t *cast, const pm_node_ PUSH_INSN1(cond_seq, condition_location, topn, INT2FIX(1)); PUSH_SEND_WITH_FLAG(cond_seq, condition_location, idEqq, INT2NUM(1), INT2FIX(VM_CALL_FCALL | VM_CALL_ARGS_SIMPLE)); - } - - PUSH_INSNL(cond_seq, condition_location, branchif, label); - } - - // Now, add the label to the body and compile the body of the - // when clause. This involves popping the predicate, compiling - // the statements to be executed, and then compiling a jump to - // the end of the case node. - PUSH_LABEL(body_seq, label); - PUSH_INSN(body_seq, clause_location, pop); - - // Establish branch coverage for the when clause. - if (PM_BRANCH_COVERAGE_P(iseq)) { - rb_code_location_t branch_location = pm_code_location(scope_node, clause->statements != NULL ? ((const pm_node_t *) clause->statements) : ((const pm_node_t *) clause)); - add_trace_branch_coverage(iseq, body_seq, &branch_location, branch_location.beg_pos.column, branch_id++, "when", branches); - } - - if (clause->statements != NULL) { - pm_compile_node(iseq, (const pm_node_t *) clause->statements, body_seq, popped, scope_node); - } - else if (!popped) { - PUSH_SYNTHETIC_PUTNIL(body_seq, iseq); - } - - PUSH_INSNL(body_seq, clause_location, jump, end_label); - } - - // Now that we have compiled the conditions and the bodies of the - // various when clauses, we can compile the predicate, lay out the - // conditions, compile the fallback subsequent if there is one, and - // finally put in the bodies of the when clauses. - PM_COMPILE_NOT_POPPED(cast->predicate); - - // If we have a dispatch hash, then we'll use it here to create the - // optimization. - if (dispatch != Qundef) { - PUSH_INSN(ret, location, dup); - PUSH_INSN2(ret, location, opt_case_dispatch, dispatch, else_label); - LABEL_REF(else_label); - } - - PUSH_SEQ(ret, cond_seq); - - // Compile either the explicit else clause or an implicit else - // clause. - PUSH_LABEL(ret, else_label); - - if (cast->else_clause != NULL) { - pm_node_location_t else_location = PM_NODE_START_LOCATION(parser, cast->else_clause->statements != NULL ? ((const pm_node_t *) cast->else_clause->statements) : ((const pm_node_t *) cast->else_clause)); - PUSH_INSN(ret, else_location, pop); - - // Establish branch coverage for the else clause. - if (PM_BRANCH_COVERAGE_P(iseq)) { - rb_code_location_t branch_location = pm_code_location(scope_node, cast->else_clause->statements != NULL ? ((const pm_node_t *) cast->else_clause->statements) : ((const pm_node_t *) cast->else_clause)); - add_trace_branch_coverage(iseq, ret, &branch_location, branch_location.beg_pos.column, branch_id, "else", branches); - } - - PM_COMPILE((const pm_node_t *) cast->else_clause); - PUSH_INSNL(ret, else_location, jump, end_label); - } - else { - PUSH_INSN(ret, location, pop); - - // Establish branch coverage for the implicit else clause. - if (PM_BRANCH_COVERAGE_P(iseq)) { - add_trace_branch_coverage(iseq, ret, &case_location, case_location.beg_pos.column, branch_id, "else", branches); - } - - if (!popped) PUSH_INSN(ret, location, putnil); - PUSH_INSNL(ret, location, jump, end_label); - } - } - - PUSH_SEQ(ret, body_seq); - PUSH_LABEL(ret, end_label); -} - -/** - * Many nodes in Prism can be marked as a static literal, which means slightly - * different things depending on which node it is. Occasionally we need to omit - * container nodes from static literal checks, which is where this macro comes - * in. - */ -#define PM_CONTAINER_P(node) (PM_NODE_TYPE_P(node, PM_ARRAY_NODE) || PM_NODE_TYPE_P(node, PM_HASH_NODE) || PM_NODE_TYPE_P(node, PM_RANGE_NODE)) - -/** - * Compile a scope node, which is a special kind of node that represents a new - * lexical scope, attached to a node in the AST. - */ -static inline void -pm_compile_scope_node(rb_iseq_t *iseq, pm_scope_node_t *scope_node, const pm_node_location_t *node_location, LINK_ANCHOR *const ret, bool popped) -{ - const pm_node_location_t location = *node_location; - struct rb_iseq_constant_body *body = ISEQ_BODY(iseq); - - pm_constant_id_list_t *locals = &scope_node->locals; - pm_parameters_node_t *parameters_node = NULL; - pm_node_list_t *keywords_list = NULL; - pm_node_list_t *optionals_list = NULL; - pm_node_list_t *posts_list = NULL; - pm_node_list_t *requireds_list = NULL; - pm_node_list_t *block_locals = NULL; - bool trailing_comma = false; - - if (PM_NODE_TYPE_P(scope_node->ast_node, PM_CLASS_NODE) || PM_NODE_TYPE_P(scope_node->ast_node, PM_MODULE_NODE)) { - PUSH_TRACE(ret, RUBY_EVENT_CLASS); - } - - if (scope_node->parameters != NULL) { - switch (PM_NODE_TYPE(scope_node->parameters)) { - case PM_BLOCK_PARAMETERS_NODE: { - pm_block_parameters_node_t *cast = (pm_block_parameters_node_t *) scope_node->parameters; - parameters_node = cast->parameters; - block_locals = &cast->locals; - - if (parameters_node) { - if (parameters_node->rest && PM_NODE_TYPE_P(parameters_node->rest, PM_IMPLICIT_REST_NODE)) { - trailing_comma = true; - } - } - break; - } - case PM_PARAMETERS_NODE: { - parameters_node = (pm_parameters_node_t *) scope_node->parameters; - break; - } - case PM_NUMBERED_PARAMETERS_NODE: { - uint32_t maximum = ((const pm_numbered_parameters_node_t *) scope_node->parameters)->maximum; - body->param.lead_num = maximum; - body->param.flags.ambiguous_param0 = maximum == 1; - break; - } - case PM_IT_PARAMETERS_NODE: - body->param.lead_num = 1; - body->param.flags.ambiguous_param0 = true; - break; - default: - rb_bug("Unexpected node type for parameters: %s", pm_node_type_to_str(PM_NODE_TYPE(scope_node->parameters))); - } - } - - struct rb_iseq_param_keyword *keyword = NULL; - - if (parameters_node) { - optionals_list = ¶meters_node->optionals; - requireds_list = ¶meters_node->requireds; - keywords_list = ¶meters_node->keywords; - posts_list = ¶meters_node->posts; - } - else if (scope_node->parameters && (PM_NODE_TYPE_P(scope_node->parameters, PM_NUMBERED_PARAMETERS_NODE) || PM_NODE_TYPE_P(scope_node->parameters, PM_IT_PARAMETERS_NODE))) { - body->param.opt_num = 0; - } - else { - body->param.lead_num = 0; - body->param.opt_num = 0; - } - - //********STEP 1********** - // Goal: calculate the table size for the locals, accounting for - // hidden variables and multi target nodes - size_t locals_size = locals->size; - - // Index lookup table buffer size is only the number of the locals - st_table *index_lookup_table = st_init_numtable(); + } - int table_size = (int) locals_size; + PUSH_INSNL(cond_seq, condition_location, branchif, label); + } - // For nodes have a hidden iteration variable. We add that to the local - // table size here. - if (PM_NODE_TYPE_P(scope_node->ast_node, PM_FOR_NODE)) table_size++; + // Now, add the label to the body and compile the body of the + // when clause. This involves popping the predicate, compiling + // the statements to be executed, and then compiling a jump to + // the end of the case node. + PUSH_LABEL(body_seq, label); + PUSH_INSN(body_seq, clause_location, pop); - if (keywords_list && keywords_list->size) { - table_size++; - } + // Establish branch coverage for the when clause. + if (PM_BRANCH_COVERAGE_P(iseq)) { + rb_code_location_t branch_location = pm_code_location(scope_node, clause->statements != NULL ? ((const pm_node_t *) clause->statements) : ((const pm_node_t *) clause)); + add_trace_branch_coverage(iseq, body_seq, &branch_location, branch_location.beg_pos.column, branch_id++, "when", branches); + } - if (requireds_list) { - for (size_t i = 0; i < requireds_list->size; i++) { - // For each MultiTargetNode, we're going to have one - // additional anonymous local not represented in the locals table - // We want to account for this in our table size - pm_node_t *required = requireds_list->nodes[i]; - if (PM_NODE_TYPE_P(required, PM_MULTI_TARGET_NODE)) { - table_size++; + if (clause->statements != NULL) { + pm_compile_node(iseq, (const pm_node_t *) clause->statements, body_seq, popped, scope_node); } - else if (PM_NODE_TYPE_P(required, PM_REQUIRED_PARAMETER_NODE)) { - if (PM_NODE_FLAG_P(required, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { - table_size++; - } + else if (!popped) { + PUSH_SYNTHETIC_PUTNIL(body_seq, iseq); } + + PUSH_INSNL(body_seq, clause_location, jump, end_label); } - } - // If we have the `it` implicit local variable, we need to account for - // it in the local table size. - if (scope_node->parameters != NULL && PM_NODE_TYPE_P(scope_node->parameters, PM_IT_PARAMETERS_NODE)) { - table_size++; - } + // Now that we have compiled the conditions and the bodies of the + // various when clauses, we can compile the predicate, lay out the + // conditions, compile the fallback subsequent if there is one, and + // finally put in the bodies of the when clauses. + PM_COMPILE_NOT_POPPED(cast->predicate); - // Ensure there is enough room in the local table for any - // parameters that have been repeated - // ex: def underscore_parameters(_, _ = 1, _ = 2); _; end - // ^^^^^^^^^^^^ - if (optionals_list && optionals_list->size) { - for (size_t i = 0; i < optionals_list->size; i++) { - pm_node_t * node = optionals_list->nodes[i]; - if (PM_NODE_FLAG_P(node, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { - table_size++; - } + // If we have a dispatch hash, then we'll use it here to create the + // optimization. + if (dispatch != Qundef) { + PUSH_INSN(ret, location, dup); + PUSH_INSN2(ret, location, opt_case_dispatch, dispatch, else_label); + LABEL_REF(else_label); } - } - // If we have an anonymous "rest" node, we'll need to increase the local - // table size to take it in to account. - // def m(foo, *, bar) - // ^ - if (parameters_node) { - if (parameters_node->rest) { - if (!(PM_NODE_TYPE_P(parameters_node->rest, PM_IMPLICIT_REST_NODE))) { - if (!((const pm_rest_parameter_node_t *) parameters_node->rest)->name || PM_NODE_FLAG_P(parameters_node->rest, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { - table_size++; - } - } - } + PUSH_SEQ(ret, cond_seq); - // def foo(_, **_); _; end - // ^^^ - if (parameters_node->keyword_rest) { - // def foo(...); end - // ^^^ - // When we have a `...` as the keyword_rest, it's a forwarding_parameter_node and - // we need to leave space for 4 locals: *, **, &, ... - if (PM_NODE_TYPE_P(parameters_node->keyword_rest, PM_FORWARDING_PARAMETER_NODE)) { - // Only optimize specifically methods like this: `foo(...)` - if (requireds_list->size == 0 && optionals_list->size == 0 && keywords_list->size == 0) { - ISEQ_BODY(iseq)->param.flags.use_block = TRUE; - ISEQ_BODY(iseq)->param.flags.forwardable = TRUE; - table_size += 1; - } - else { - table_size += 4; - } - } - else { - const pm_keyword_rest_parameter_node_t *kw_rest = (const pm_keyword_rest_parameter_node_t *) parameters_node->keyword_rest; + // Compile either the explicit else clause or an implicit else + // clause. + PUSH_LABEL(ret, else_label); - // If it's anonymous or repeated, then we need to allocate stack space - if (!kw_rest->name || PM_NODE_FLAG_P(kw_rest, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { - table_size++; - } - } - } - } + if (cast->else_clause != NULL) { + pm_node_location_t else_location = PM_NODE_START_LOCATION(parser, cast->else_clause->statements != NULL ? ((const pm_node_t *) cast->else_clause->statements) : ((const pm_node_t *) cast->else_clause)); + PUSH_INSN(ret, else_location, pop); - if (posts_list) { - for (size_t i = 0; i < posts_list->size; i++) { - // For each MultiTargetNode, we're going to have one - // additional anonymous local not represented in the locals table - // We want to account for this in our table size - pm_node_t *required = posts_list->nodes[i]; - if (PM_NODE_TYPE_P(required, PM_MULTI_TARGET_NODE) || PM_NODE_FLAG_P(required, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { - table_size++; + // Establish branch coverage for the else clause. + if (PM_BRANCH_COVERAGE_P(iseq)) { + rb_code_location_t branch_location = pm_code_location(scope_node, cast->else_clause->statements != NULL ? ((const pm_node_t *) cast->else_clause->statements) : ((const pm_node_t *) cast->else_clause)); + add_trace_branch_coverage(iseq, ret, &branch_location, branch_location.beg_pos.column, branch_id, "else", branches); } + + PM_COMPILE((const pm_node_t *) cast->else_clause); + PUSH_INSNL(ret, else_location, jump, end_label); } - } + else { + PUSH_INSN(ret, location, pop); - if (keywords_list && keywords_list->size) { - for (size_t i = 0; i < keywords_list->size; i++) { - pm_node_t *keyword_parameter_node = keywords_list->nodes[i]; - if (PM_NODE_FLAG_P(keyword_parameter_node, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { - table_size++; + // Establish branch coverage for the implicit else clause. + if (PM_BRANCH_COVERAGE_P(iseq)) { + add_trace_branch_coverage(iseq, ret, &case_location, case_location.beg_pos.column, branch_id, "else", branches); } + + if (!popped) PUSH_INSN(ret, location, putnil); + PUSH_INSNL(ret, location, jump, end_label); } } - if (parameters_node && parameters_node->block) { - const pm_block_parameter_node_t *block_node = (const pm_block_parameter_node_t *) parameters_node->block; + PUSH_SEQ(ret, body_seq); + PUSH_LABEL(ret, end_label); +} - if (PM_NODE_FLAG_P(block_node, PM_PARAMETER_FLAGS_REPEATED_PARAMETER) || !block_node->name) { - table_size++; - } - } +static inline void +pm_compile_case_match_node(rb_iseq_t *iseq, const pm_case_match_node_t *node, const pm_node_location_t *location, LINK_ANCHOR *const ret, bool popped, pm_scope_node_t *scope_node) +{ + // This is the anchor that we will compile the bodies of the various + // `in` nodes into. We'll make sure that the patterns that are compiled + // jump into the correct spots within this anchor. + DECL_ANCHOR(body_seq); + INIT_ANCHOR(body_seq); - // We can create local_table_for_iseq with the correct size - VALUE idtmp = 0; - rb_ast_id_table_t *local_table_for_iseq = ALLOCV(idtmp, sizeof(rb_ast_id_table_t) + table_size * sizeof(ID)); - local_table_for_iseq->size = table_size; + // This is the anchor that we will compile the patterns of the various + // `in` nodes into. If a match is found, they will need to jump into the + // body_seq anchor to the correct spot. + DECL_ANCHOR(cond_seq); + INIT_ANCHOR(cond_seq); - //********END OF STEP 1********** + // This label is used to indicate the end of the entire node. It is + // jumped to after the entire stack is cleaned up. + LABEL *end_label = NEW_LABEL(location->line); - //********STEP 2********** - // Goal: populate iv index table as well as local table, keeping the - // layout of the local table consistent with the layout of the - // stack when calling the method - // - // Do a first pass on all of the parameters, setting their values in - // the local_table_for_iseq, _except_ for Multis who get a hidden - // variable in this step, and will get their names inserted in step 3 + // This label is used as the fallback for the case match. If no match is + // found, then we jump to this label. This is either an `else` clause or + // an error handler. + LABEL *else_label = NEW_LABEL(location->line); - // local_index is a cursor that keeps track of the current - // index into local_table_for_iseq. The local table is actually a list, - // and the order of that list must match the order of the items pushed - // on the stack. We need to take in to account things pushed on the - // stack that _might not have a name_ (for example array destructuring). - // This index helps us know which item we're dealing with and also give - // those anonymous items temporary names (as below) - int local_index = 0; + // We're going to use this to uniquely identify each branch so that we + // can track coverage information. + rb_code_location_t case_location = { 0 }; + VALUE branches = Qfalse; + int branch_id = 0; - // Here we figure out local table indices and insert them in to the - // index lookup table and local tables. - // - // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) - // ^^^^^^^^^^^^^ - if (requireds_list && requireds_list->size) { - for (size_t i = 0; i < requireds_list->size; i++, local_index++) { - ID local; + if (PM_BRANCH_COVERAGE_P(iseq)) { + case_location = pm_code_location(scope_node, (const pm_node_t *) node); + branches = decl_branch_base(iseq, PTR2NUM(node), &case_location, "case"); + } - // For each MultiTargetNode, we're going to have one additional - // anonymous local not represented in the locals table. We want - // to account for this in our table size. - pm_node_t *required = requireds_list->nodes[i]; + // If there is only one pattern, then the behavior changes a bit. It + // effectively gets treated as a match required node (this is how it is + // represented in the other parser). + bool in_single_pattern = node->else_clause == NULL && node->conditions.size == 1; - switch (PM_NODE_TYPE(required)) { - case PM_MULTI_TARGET_NODE: { - // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) - // ^^^^^^^^^^ - local = rb_make_temporary_id(local_index); - local_table_for_iseq->ids[local_index] = local; - break; - } - case PM_REQUIRED_PARAMETER_NODE: { - // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) - // ^ - const pm_required_parameter_node_t *param = (const pm_required_parameter_node_t *) required; + // First, we're going to push a bunch of stuff onto the stack that is + // going to serve as our scratch space. + if (in_single_pattern) { + PUSH_INSN(ret, *location, putnil); // key error key + PUSH_INSN(ret, *location, putnil); // key error matchee + PUSH_INSN1(ret, *location, putobject, Qfalse); // key error? + PUSH_INSN(ret, *location, putnil); // error string + } - if (PM_NODE_FLAG_P(required, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { - ID local = pm_constant_id_lookup(scope_node, param->name); - local_table_for_iseq->ids[local_index] = local; - } - else { - pm_insert_local_index(param->name, local_index, index_lookup_table, local_table_for_iseq, scope_node); - } + // Now we're going to compile the value to match against. + PUSH_INSN(ret, *location, putnil); // deconstruct cache + PM_COMPILE_NOT_POPPED(node->predicate); - break; - } - default: - rb_bug("Unsupported node in requireds in parameters %s", pm_node_type_to_str(PM_NODE_TYPE(required))); - } - } + // Next, we'll loop through every in clause and compile its body into + // the body_seq anchor and its pattern into the cond_seq anchor. We'll + // make sure the pattern knows how to jump correctly into the body if it + // finds a match. + for (size_t index = 0; index < node->conditions.size; index++) { + const pm_node_t *condition = node->conditions.nodes[index]; + RUBY_ASSERT(PM_NODE_TYPE_P(condition, PM_IN_NODE)); - body->param.lead_num = (int) requireds_list->size; - body->param.flags.has_lead = true; - } + const pm_in_node_t *in_node = (const pm_in_node_t *) condition; + const pm_node_location_t in_location = PM_NODE_START_LOCATION(scope_node->parser, in_node); + const pm_node_location_t pattern_location = PM_NODE_START_LOCATION(scope_node->parser, in_node->pattern); - if (scope_node->parameters != NULL && PM_NODE_TYPE_P(scope_node->parameters, PM_IT_PARAMETERS_NODE)) { - ID local = rb_make_temporary_id(local_index); - local_table_for_iseq->ids[local_index++] = local; - } + if (branch_id) { + PUSH_INSN(body_seq, in_location, putnil); + } - // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) - // ^^^^^ - if (optionals_list && optionals_list->size) { - body->param.opt_num = (int) optionals_list->size; - body->param.flags.has_opt = true; + LABEL *body_label = NEW_LABEL(in_location.line); + PUSH_LABEL(body_seq, body_label); + PUSH_INSN1(body_seq, in_location, adjuststack, INT2FIX(in_single_pattern ? 6 : 2)); - for (size_t i = 0; i < optionals_list->size; i++, local_index++) { - pm_node_t * node = optionals_list->nodes[i]; - pm_constant_id_t name = ((const pm_optional_parameter_node_t *) node)->name; + // Establish branch coverage for the in clause. + if (PM_BRANCH_COVERAGE_P(iseq)) { + rb_code_location_t branch_location = pm_code_location(scope_node, in_node->statements != NULL ? ((const pm_node_t *) in_node->statements) : ((const pm_node_t *) in_node)); + add_trace_branch_coverage(iseq, body_seq, &branch_location, branch_location.beg_pos.column, branch_id++, "in", branches); + } - if (PM_NODE_FLAG_P(node, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { - ID local = pm_constant_id_lookup(scope_node, name); - local_table_for_iseq->ids[local_index] = local; - } - else { - pm_insert_local_index(name, local_index, index_lookup_table, local_table_for_iseq, scope_node); - } + if (in_node->statements != NULL) { + PM_COMPILE_INTO_ANCHOR(body_seq, (const pm_node_t *) in_node->statements); + } + else if (!popped) { + PUSH_SYNTHETIC_PUTNIL(body_seq, iseq); } + + PUSH_INSNL(body_seq, in_location, jump, end_label); + LABEL *next_pattern_label = NEW_LABEL(pattern_location.line); + + PUSH_INSN(cond_seq, pattern_location, dup); + pm_compile_pattern(iseq, scope_node, in_node->pattern, cond_seq, body_label, next_pattern_label, in_single_pattern, false, true, 2); + PUSH_LABEL(cond_seq, next_pattern_label); + LABEL_UNREMOVABLE(next_pattern_label); } - // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) - // ^^ - if (parameters_node && parameters_node->rest) { - body->param.rest_start = local_index; + if (node->else_clause != NULL) { + // If we have an `else` clause, then this becomes our fallback (and + // there is no need to compile in code to potentially raise an + // error). + const pm_else_node_t *else_node = node->else_clause; + + PUSH_LABEL(cond_seq, else_label); + PUSH_INSN(cond_seq, *location, pop); + PUSH_INSN(cond_seq, *location, pop); - // If there's a trailing comma, we'll have an implicit rest node, - // and we don't want it to impact the rest variables on param - if (!(PM_NODE_TYPE_P(parameters_node->rest, PM_IMPLICIT_REST_NODE))) { - body->param.flags.has_rest = true; - RUBY_ASSERT(body->param.rest_start != -1); + // Establish branch coverage for the else clause. + if (PM_BRANCH_COVERAGE_P(iseq)) { + rb_code_location_t branch_location = pm_code_location(scope_node, else_node->statements != NULL ? ((const pm_node_t *) else_node->statements) : ((const pm_node_t *) else_node)); + add_trace_branch_coverage(iseq, cond_seq, &branch_location, branch_location.beg_pos.column, branch_id, "else", branches); + } - pm_constant_id_t name = ((const pm_rest_parameter_node_t *) parameters_node->rest)->name; + PM_COMPILE_INTO_ANCHOR(cond_seq, (const pm_node_t *) else_node); + PUSH_INSNL(cond_seq, *location, jump, end_label); + PUSH_INSN(cond_seq, *location, putnil); + if (popped) PUSH_INSN(cond_seq, *location, putnil); + } + else { + // Otherwise, if we do not have an `else` clause, we will compile in + // the code to handle raising an appropriate error. + PUSH_LABEL(cond_seq, else_label); - if (name) { - // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) - // ^^ - if (PM_NODE_FLAG_P(parameters_node->rest, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { - ID local = pm_constant_id_lookup(scope_node, name); - local_table_for_iseq->ids[local_index] = local; - } - else { - pm_insert_local_index(name, local_index, index_lookup_table, local_table_for_iseq, scope_node); - } - } - else { - // def foo(a, (b, *c, d), e = 1, *, g, (h, *i, j), k:, l: 1, **m, &n) - // ^ - body->param.flags.anon_rest = true; - pm_insert_local_special(idMULT, local_index, index_lookup_table, local_table_for_iseq); - } + // Establish branch coverage for the implicit else clause. + add_trace_branch_coverage(iseq, cond_seq, &case_location, case_location.beg_pos.column, branch_id, "else", branches); - local_index++; + if (in_single_pattern) { + pm_compile_pattern_error_handler(iseq, scope_node, (const pm_node_t *) node, cond_seq, end_label, popped); + } + else { + PUSH_INSN1(cond_seq, *location, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); + PUSH_INSN1(cond_seq, *location, putobject, rb_eNoMatchingPatternError); + PUSH_INSN1(cond_seq, *location, topn, INT2FIX(2)); + PUSH_SEND(cond_seq, *location, id_core_raise, INT2FIX(2)); + + PUSH_INSN1(cond_seq, *location, adjuststack, INT2FIX(3)); + if (!popped) PUSH_INSN(cond_seq, *location, putnil); + PUSH_INSNL(cond_seq, *location, jump, end_label); + PUSH_INSN1(cond_seq, *location, dupn, INT2FIX(1)); + if (popped) PUSH_INSN(cond_seq, *location, putnil); } } - // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) - // ^^^^^^^^^^^^^ - if (posts_list && posts_list->size) { - body->param.post_num = (int) posts_list->size; - body->param.post_start = local_index; - body->param.flags.has_post = true; + // At the end of all of this compilation, we will add the code for the + // conditions first, then the various bodies, then mark the end of the + // entire sequence with the end label. + PUSH_SEQ(ret, cond_seq); + PUSH_SEQ(ret, body_seq); + PUSH_LABEL(ret, end_label); +} - for (size_t i = 0; i < posts_list->size; i++, local_index++) { - ID local; +static inline void +pm_compile_forwarding_super_node(rb_iseq_t *iseq, const pm_forwarding_super_node_t *node, const pm_node_location_t *location, LINK_ANCHOR *const ret, bool popped, pm_scope_node_t *scope_node) +{ + const rb_iseq_t *block = NULL; + const rb_iseq_t *previous_block = NULL; + LABEL *retry_label = NULL; + LABEL *retry_end_l = NULL; - // For each MultiTargetNode, we're going to have one additional - // anonymous local not represented in the locals table. We want - // to account for this in our table size. - const pm_node_t *post_node = posts_list->nodes[i]; + if (node->block != NULL) { + previous_block = ISEQ_COMPILE_DATA(iseq)->current_block; + ISEQ_COMPILE_DATA(iseq)->current_block = NULL; - switch (PM_NODE_TYPE(post_node)) { - case PM_MULTI_TARGET_NODE: { - // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) - // ^^^^^^^^^^ - local = rb_make_temporary_id(local_index); - local_table_for_iseq->ids[local_index] = local; - break; - } - case PM_REQUIRED_PARAMETER_NODE: { - // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) - // ^ - const pm_required_parameter_node_t *param = (const pm_required_parameter_node_t *) post_node; + retry_label = NEW_LABEL(location->line); + retry_end_l = NEW_LABEL(location->line); - if (PM_NODE_FLAG_P(param, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { - ID local = pm_constant_id_lookup(scope_node, param->name); - local_table_for_iseq->ids[local_index] = local; - } - else { - pm_insert_local_index(param->name, local_index, index_lookup_table, local_table_for_iseq, scope_node); - } - break; - } - default: - rb_bug("Unsupported node in posts in parameters %s", pm_node_type_to_str(PM_NODE_TYPE(post_node))); - } - } + PUSH_LABEL(ret, retry_label); + } + else { + iseq_set_use_block(ISEQ_BODY(iseq)->local_iseq); } - // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) - // ^^^^^^^^ - // Keywords create an internal variable on the parse tree - if (keywords_list && keywords_list->size) { - body->param.keyword = keyword = ZALLOC_N(struct rb_iseq_param_keyword, 1); - keyword->num = (int) keywords_list->size; + PUSH_INSN(ret, *location, putself); + int flag = VM_CALL_ZSUPER | VM_CALL_SUPER | VM_CALL_FCALL; - body->param.flags.has_kw = true; - const VALUE default_values = rb_ary_hidden_new(1); - const VALUE complex_mark = rb_str_tmp_new(0); + if (node->block != NULL) { + pm_scope_node_t next_scope_node; + pm_scope_node_init((const pm_node_t *) node->block, &next_scope_node, scope_node); - ID *ids = xcalloc(keywords_list->size, sizeof(ID)); + ISEQ_COMPILE_DATA(iseq)->current_block = block = NEW_CHILD_ISEQ(&next_scope_node, make_name_for_block(iseq), ISEQ_TYPE_BLOCK, location->line); + pm_scope_node_destroy(&next_scope_node); + RB_OBJ_WRITTEN(iseq, Qundef, (VALUE) block); + } - size_t kw_index = 0; + DECL_ANCHOR(args); + INIT_ANCHOR(args); - for (size_t i = 0; i < keywords_list->size; i++) { - pm_node_t *keyword_parameter_node = keywords_list->nodes[i]; - pm_constant_id_t name; + struct rb_iseq_constant_body *const body = ISEQ_BODY(iseq); + const rb_iseq_t *local_iseq = body->local_iseq; + const struct rb_iseq_constant_body *const local_body = ISEQ_BODY(local_iseq); - // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) - // ^^ - if (PM_NODE_TYPE_P(keyword_parameter_node, PM_REQUIRED_KEYWORD_PARAMETER_NODE)) { - name = ((const pm_required_keyword_parameter_node_t *) keyword_parameter_node)->name; - keyword->required_num++; - ID local = pm_constant_id_lookup(scope_node, name); + int argc = 0; + int depth = get_lvar_level(iseq); - if (PM_NODE_FLAG_P(keyword_parameter_node, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { - local_table_for_iseq->ids[local_index] = local; - } - else { - pm_insert_local_index(name, local_index, index_lookup_table, local_table_for_iseq, scope_node); - } - local_index++; - ids[kw_index++] = local; - } + if (ISEQ_BODY(ISEQ_BODY(iseq)->local_iseq)->param.flags.forwardable) { + flag |= VM_CALL_FORWARDING; + pm_local_index_t mult_local = pm_lookup_local_index(iseq, scope_node, PM_CONSTANT_DOT3, 0); + PUSH_GETLOCAL(ret, *location, mult_local.index, mult_local.level); + PUSH_INSN2(ret, *location, invokesuperforward, new_callinfo(iseq, 0, 0, flag, NULL, block != NULL), block); + if (popped) PUSH_INSN(ret, *location, pop); + if (node->block) { + ISEQ_COMPILE_DATA(iseq)->current_block = previous_block; } + return; + } - for (size_t i = 0; i < keywords_list->size; i++) { - pm_node_t *keyword_parameter_node = keywords_list->nodes[i]; - pm_constant_id_t name; + if (local_body->param.flags.has_lead) { + /* required arguments */ + for (int i = 0; i < local_body->param.lead_num; i++) { + int idx = local_body->local_table_size - i; + PUSH_GETLOCAL(args, *location, idx, depth); + } + argc += local_body->param.lead_num; + } - // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) - // ^^^^ - if (PM_NODE_TYPE_P(keyword_parameter_node, PM_OPTIONAL_KEYWORD_PARAMETER_NODE)) { - const pm_optional_keyword_parameter_node_t *cast = ((const pm_optional_keyword_parameter_node_t *) keyword_parameter_node); + if (local_body->param.flags.has_opt) { + /* optional arguments */ + for (int j = 0; j < local_body->param.opt_num; j++) { + int idx = local_body->local_table_size - (argc + j); + PUSH_GETLOCAL(args, *location, idx, depth); + } + argc += local_body->param.opt_num; + } - pm_node_t *value = cast->value; - name = cast->name; + if (local_body->param.flags.has_rest) { + /* rest argument */ + int idx = local_body->local_table_size - local_body->param.rest_start; + PUSH_GETLOCAL(args, *location, idx, depth); + PUSH_INSN1(args, *location, splatarray, Qfalse); - if (PM_NODE_FLAG_P(value, PM_NODE_FLAG_STATIC_LITERAL) && !PM_CONTAINER_P(value)) { - rb_ary_push(default_values, pm_static_literal_value(iseq, value, scope_node)); - } - else { - rb_ary_push(default_values, complex_mark); - } + argc = local_body->param.rest_start + 1; + flag |= VM_CALL_ARGS_SPLAT; + } - ID local = pm_constant_id_lookup(scope_node, name); - if (PM_NODE_FLAG_P(keyword_parameter_node, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { - local_table_for_iseq->ids[local_index] = local; - } - else { - pm_insert_local_index(name, local_index, index_lookup_table, local_table_for_iseq, scope_node); - } - ids[kw_index++] = local; - local_index++; - } + if (local_body->param.flags.has_post) { + /* post arguments */ + int post_len = local_body->param.post_num; + int post_start = local_body->param.post_start; + int j = 0; + for (; j < post_len; j++) { + int idx = local_body->local_table_size - (post_start + j); + PUSH_GETLOCAL(args, *location, idx, depth); } - keyword->bits_start = local_index; - keyword->table = ids; + if (local_body->param.flags.has_rest) { + // argc remains unchanged from rest branch + PUSH_INSN1(args, *location, newarray, INT2FIX(j)); + PUSH_INSN(args, *location, concatarray); + } + else { + argc = post_len + post_start; + } + } - if (RARRAY_LEN(default_values)) { - VALUE *dvs = ALLOC_N(VALUE, RARRAY_LEN(default_values)); + const struct rb_iseq_param_keyword *const local_keyword = local_body->param.keyword; + if (local_body->param.flags.has_kw) { + int local_size = local_body->local_table_size; + argc++; - for (int i = 0; i < RARRAY_LEN(default_values); i++) { - VALUE dv = RARRAY_AREF(default_values, i); - if (dv == complex_mark) dv = Qundef; - RB_OBJ_WRITE(iseq, &dvs[i], dv); - } + PUSH_INSN1(args, *location, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); - keyword->default_values = dvs; + if (local_body->param.flags.has_kwrest) { + int idx = local_body->local_table_size - local_keyword->rest_start; + PUSH_GETLOCAL(args, *location, idx, depth); + RUBY_ASSERT(local_keyword->num > 0); + PUSH_SEND(args, *location, rb_intern("dup"), INT2FIX(0)); + } + else { + PUSH_INSN1(args, *location, newhash, INT2FIX(0)); + } + int i = 0; + for (; i < local_keyword->num; ++i) { + ID id = local_keyword->table[i]; + int idx = local_size - get_local_var_idx(local_iseq, id); + PUSH_INSN1(args, *location, putobject, ID2SYM(id)); + PUSH_GETLOCAL(args, *location, idx, depth); } - // Hidden local for keyword arguments - ID local = rb_make_temporary_id(local_index); - local_table_for_iseq->ids[local_index] = local; - local_index++; + PUSH_SEND(args, *location, id_core_hash_merge_ptr, INT2FIX(i * 2 + 1)); + flag |= VM_CALL_KW_SPLAT| VM_CALL_KW_SPLAT_MUT; } - - if (body->type == ISEQ_TYPE_BLOCK && local_index == 1 && requireds_list && requireds_list->size == 1 && !trailing_comma) { - body->param.flags.ambiguous_param0 = true; + else if (local_body->param.flags.has_kwrest) { + int idx = local_body->local_table_size - local_keyword->rest_start; + PUSH_GETLOCAL(args, *location, idx, depth); + argc++; + flag |= VM_CALL_KW_SPLAT; } - if (parameters_node) { - // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) - // ^^^ - if (parameters_node->keyword_rest) { - switch (PM_NODE_TYPE(parameters_node->keyword_rest)) { - case PM_NO_KEYWORDS_PARAMETER_NODE: { - // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **nil, &n) - // ^^^^^ - body->param.flags.accepts_no_kwarg = true; - break; - } - case PM_KEYWORD_REST_PARAMETER_NODE: { - // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) - // ^^^ - const pm_keyword_rest_parameter_node_t *kw_rest_node = (const pm_keyword_rest_parameter_node_t *) parameters_node->keyword_rest; - if (!body->param.flags.has_kw) { - body->param.keyword = keyword = ZALLOC_N(struct rb_iseq_param_keyword, 1); - } + PUSH_SEQ(ret, args); + PUSH_INSN2(ret, *location, invokesuper, new_callinfo(iseq, 0, argc, flag, NULL, block != NULL), block); - keyword->rest_start = local_index; - body->param.flags.has_kwrest = true; + if (node->block != NULL) { + pm_compile_retry_end_label(iseq, ret, retry_end_l); + PUSH_CATCH_ENTRY(CATCH_TYPE_BREAK, retry_label, retry_end_l, block, retry_end_l); + ISEQ_COMPILE_DATA(iseq)->current_block = previous_block; + } - pm_constant_id_t constant_id = kw_rest_node->name; - if (constant_id) { - if (PM_NODE_FLAG_P(kw_rest_node, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { - ID local = pm_constant_id_lookup(scope_node, constant_id); - local_table_for_iseq->ids[local_index] = local; - } - else { - pm_insert_local_index(constant_id, local_index, index_lookup_table, local_table_for_iseq, scope_node); - } - } - else { - body->param.flags.anon_kwrest = true; - pm_insert_local_special(idPow, local_index, index_lookup_table, local_table_for_iseq); - } + if (popped) PUSH_INSN(ret, *location, pop); +} - local_index++; - break; - } - case PM_FORWARDING_PARAMETER_NODE: { - // def foo(...) - // ^^^ - if (!ISEQ_BODY(iseq)->param.flags.forwardable) { - // Add the anonymous * - body->param.rest_start = local_index; - body->param.flags.has_rest = true; - body->param.flags.anon_rest = true; - pm_insert_local_special(idMULT, local_index++, index_lookup_table, local_table_for_iseq); +static inline void +pm_compile_match_required_node(rb_iseq_t *iseq, const pm_match_required_node_t *node, const pm_node_location_t *location, LINK_ANCHOR *const ret, bool popped, pm_scope_node_t *scope_node) +{ + LABEL *matched_label = NEW_LABEL(location->line); + LABEL *unmatched_label = NEW_LABEL(location->line); + LABEL *done_label = NEW_LABEL(location->line); + + // First, we're going to push a bunch of stuff onto the stack that is + // going to serve as our scratch space. + PUSH_INSN(ret, *location, putnil); // key error key + PUSH_INSN(ret, *location, putnil); // key error matchee + PUSH_INSN1(ret, *location, putobject, Qfalse); // key error? + PUSH_INSN(ret, *location, putnil); // error string + PUSH_INSN(ret, *location, putnil); // deconstruct cache + + // Next we're going to compile the value expression such that it's on + // the stack. + PM_COMPILE_NOT_POPPED(node->value); - // Add the anonymous ** - RUBY_ASSERT(!body->param.flags.has_kw); - body->param.flags.has_kw = false; - body->param.flags.has_kwrest = true; - body->param.flags.anon_kwrest = true; - body->param.keyword = keyword = ZALLOC_N(struct rb_iseq_param_keyword, 1); - keyword->rest_start = local_index; - pm_insert_local_special(idPow, local_index++, index_lookup_table, local_table_for_iseq); + // Here we'll dup it so that it can be used for comparison, but also be + // used for error handling. + PUSH_INSN(ret, *location, dup); + + // Next we'll compile the pattern. We indicate to the pm_compile_pattern + // function that this is the only pattern that will be matched against + // through the in_single_pattern parameter. We also indicate that the + // value to compare against is 2 slots from the top of the stack (the + // base_index parameter). + pm_compile_pattern(iseq, scope_node, node->pattern, ret, matched_label, unmatched_label, true, false, true, 2); + + // If the pattern did not match the value, then we're going to compile + // in our error handler code. This will determine which error to raise + // and raise it. + PUSH_LABEL(ret, unmatched_label); + pm_compile_pattern_error_handler(iseq, scope_node, (const pm_node_t *) node, ret, done_label, popped); + + // If the pattern did match, we'll clean up the values we've pushed onto + // the stack and then push nil onto the stack if it's not popped. + PUSH_LABEL(ret, matched_label); + PUSH_INSN1(ret, *location, adjuststack, INT2FIX(6)); + if (!popped) PUSH_INSN(ret, *location, putnil); + PUSH_INSNL(ret, *location, jump, done_label); - // Add the anonymous & - body->param.block_start = local_index; - body->param.flags.has_block = true; - pm_insert_local_special(idAnd, local_index++, index_lookup_table, local_table_for_iseq); - } + PUSH_LABEL(ret, done_label); +} - // Add the ... - pm_insert_local_special(idDot3, local_index++, index_lookup_table, local_table_for_iseq); - break; - } - default: - rb_bug("node type %s not expected as keyword_rest", pm_node_type_to_str(PM_NODE_TYPE(parameters_node->keyword_rest))); - } - } +static inline void +pm_compile_match_write_node(rb_iseq_t *iseq, const pm_match_write_node_t *node, const pm_node_location_t *location, LINK_ANCHOR *const ret, bool popped, pm_scope_node_t *scope_node) +{ + LABEL *fail_label = NEW_LABEL(location->line); + LABEL *end_label = NEW_LABEL(location->line); - // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) - // ^^ - if (parameters_node->block) { - body->param.block_start = local_index; - body->param.flags.has_block = true; - iseq_set_use_block(iseq); + // First, we'll compile the call so that all of its instructions are + // present. Then we'll compile all of the local variable targets. + PM_COMPILE_NOT_POPPED((const pm_node_t *) node->call); - pm_constant_id_t name = ((const pm_block_parameter_node_t *) parameters_node->block)->name; + // Now, check if the match was successful. If it was, then we'll + // continue on and assign local variables. Otherwise we'll skip over the + // assignment code. + PUSH_INSN1(ret, *location, getglobal, rb_id2sym(idBACKREF)); + PUSH_INSN(ret, *location, dup); + PUSH_INSNL(ret, *location, branchunless, fail_label); - if (name) { - if (PM_NODE_FLAG_P(parameters_node->block, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { - ID local = pm_constant_id_lookup(scope_node, name); - local_table_for_iseq->ids[local_index] = local; - } - else { - pm_insert_local_index(name, local_index, index_lookup_table, local_table_for_iseq, scope_node); - } - } - else { - pm_insert_local_special(idAnd, local_index, index_lookup_table, local_table_for_iseq); - } + // If there's only a single local variable target, we can skip some of + // the bookkeeping, so we'll put a special branch here. + size_t targets_count = node->targets.size; - local_index++; - } - } + if (targets_count == 1) { + const pm_node_t *target = node->targets.nodes[0]; + RUBY_ASSERT(PM_NODE_TYPE_P(target, PM_LOCAL_VARIABLE_TARGET_NODE)); - //********END OF STEP 2********** - // The local table is now consistent with expected - // stack layout + const pm_local_variable_target_node_t *local_target = (const pm_local_variable_target_node_t *) target; + pm_local_index_t index = pm_lookup_local_index(iseq, scope_node, local_target->name, local_target->depth); - // If there's only one required element in the parameters - // CRuby needs to recognize it as an ambiguous parameter + PUSH_INSN1(ret, *location, putobject, rb_id2sym(pm_constant_id_lookup(scope_node, local_target->name))); + PUSH_SEND(ret, *location, idAREF, INT2FIX(1)); + PUSH_LABEL(ret, fail_label); + PUSH_SETLOCAL(ret, *location, index.index, index.level); + if (popped) PUSH_INSN(ret, *location, pop); + return; + } - //********STEP 3********** - // Goal: fill in the names of the parameters in MultiTargetNodes - // - // Go through requireds again to set the multis + DECL_ANCHOR(fail_anchor); + INIT_ANCHOR(fail_anchor); - if (requireds_list && requireds_list->size) { - for (size_t i = 0; i < requireds_list->size; i++) { - // For each MultiTargetNode, we're going to have one - // additional anonymous local not represented in the locals table - // We want to account for this in our table size - const pm_node_t *required = requireds_list->nodes[i]; + // Otherwise there is more than one local variable target, so we'll need + // to do some bookkeeping. + for (size_t targets_index = 0; targets_index < targets_count; targets_index++) { + const pm_node_t *target = node->targets.nodes[targets_index]; + RUBY_ASSERT(PM_NODE_TYPE_P(target, PM_LOCAL_VARIABLE_TARGET_NODE)); - if (PM_NODE_TYPE_P(required, PM_MULTI_TARGET_NODE)) { - local_index = pm_compile_destructured_param_locals((const pm_multi_target_node_t *) required, index_lookup_table, local_table_for_iseq, scope_node, local_index); - } + const pm_local_variable_target_node_t *local_target = (const pm_local_variable_target_node_t *) target; + pm_local_index_t index = pm_lookup_local_index(iseq, scope_node, local_target->name, local_target->depth); + + if (((size_t) targets_index) < (targets_count - 1)) { + PUSH_INSN(ret, *location, dup); } + PUSH_INSN1(ret, *location, putobject, rb_id2sym(pm_constant_id_lookup(scope_node, local_target->name))); + PUSH_SEND(ret, *location, idAREF, INT2FIX(1)); + PUSH_SETLOCAL(ret, *location, index.index, index.level); + + PUSH_INSN(fail_anchor, *location, putnil); + PUSH_SETLOCAL(fail_anchor, *location, index.index, index.level); } - // Go through posts again to set the multis - if (posts_list && posts_list->size) { - for (size_t i = 0; i < posts_list->size; i++) { - // For each MultiTargetNode, we're going to have one - // additional anonymous local not represented in the locals table - // We want to account for this in our table size - const pm_node_t *post = posts_list->nodes[i]; + // Since we matched successfully, now we'll jump to the end. + PUSH_INSNL(ret, *location, jump, end_label); - if (PM_NODE_TYPE_P(post, PM_MULTI_TARGET_NODE)) { - local_index = pm_compile_destructured_param_locals((const pm_multi_target_node_t *) post, index_lookup_table, local_table_for_iseq, scope_node, local_index); - } - } - } + // In the case that the match failed, we'll loop through each local + // variable target and set all of them to `nil`. + PUSH_LABEL(ret, fail_label); + PUSH_INSN(ret, *location, pop); + PUSH_SEQ(ret, fail_anchor); - // Set any anonymous locals for the for node - if (PM_NODE_TYPE_P(scope_node->ast_node, PM_FOR_NODE)) { - if (PM_NODE_TYPE_P(((const pm_for_node_t *) scope_node->ast_node)->index, PM_LOCAL_VARIABLE_TARGET_NODE)) { - body->param.lead_num++; + // Finally, we can push the end label for either case. + PUSH_LABEL(ret, end_label); + if (popped) PUSH_INSN(ret, *location, pop); +} + +static inline void +pm_compile_next_node(rb_iseq_t *iseq, const pm_next_node_t *node, const pm_node_location_t *location, LINK_ANCHOR *const ret, bool popped, pm_scope_node_t *scope_node) +{ + if (ISEQ_COMPILE_DATA(iseq)->redo_label != 0 && can_add_ensure_iseq(iseq)) { + LABEL *splabel = NEW_LABEL(0); + PUSH_LABEL(ret, splabel); + + if (node->arguments) { + PM_COMPILE_NOT_POPPED((const pm_node_t *) node->arguments); } else { - body->param.rest_start = local_index; - body->param.flags.has_rest = true; + PUSH_INSN(ret, *location, putnil); } + pm_add_ensure_iseq(ret, iseq, 0, scope_node); - ID local = rb_make_temporary_id(local_index); - local_table_for_iseq->ids[local_index] = local; - local_index++; - } + PUSH_ADJUST(ret, *location, ISEQ_COMPILE_DATA(iseq)->redo_label); + PUSH_INSNL(ret, *location, jump, ISEQ_COMPILE_DATA(iseq)->start_label); - // Fill in any NumberedParameters, if they exist - if (scope_node->parameters && PM_NODE_TYPE_P(scope_node->parameters, PM_NUMBERED_PARAMETERS_NODE)) { - int maximum = ((const pm_numbered_parameters_node_t *) scope_node->parameters)->maximum; - RUBY_ASSERT(0 < maximum && maximum <= 9); - for (int i = 0; i < maximum; i++, local_index++) { - const uint8_t param_name[] = { '_', '1' + i }; - pm_constant_id_t constant_id = pm_constant_pool_find(&scope_node->parser->constant_pool, param_name, 2); - RUBY_ASSERT(constant_id && "parser should fill in any gaps in numbered parameters"); - pm_insert_local_index(constant_id, local_index, index_lookup_table, local_table_for_iseq, scope_node); - } - body->param.lead_num = maximum; - body->param.flags.has_lead = true; + PUSH_ADJUST_RESTORE(ret, splabel); + if (!popped) PUSH_INSN(ret, *location, putnil); } + else if (ISEQ_COMPILE_DATA(iseq)->end_label && can_add_ensure_iseq(iseq)) { + LABEL *splabel = NEW_LABEL(0); - //********END OF STEP 3********** + PUSH_LABEL(ret, splabel); + PUSH_ADJUST(ret, *location, ISEQ_COMPILE_DATA(iseq)->start_label); - //********STEP 4********** - // Goal: fill in the method body locals - // To be explicit, these are the non-parameter locals - // We fill in the block_locals, if they exist - // lambda { |x; y| y } - // ^ - if (block_locals && block_locals->size) { - for (size_t i = 0; i < block_locals->size; i++, local_index++) { - pm_constant_id_t constant_id = ((const pm_block_local_variable_node_t *) block_locals->nodes[i])->name; - pm_insert_local_index(constant_id, local_index, index_lookup_table, local_table_for_iseq, scope_node); + if (node->arguments != NULL) { + PM_COMPILE_NOT_POPPED((const pm_node_t *) node->arguments); + } + else { + PUSH_INSN(ret, *location, putnil); } + + pm_add_ensure_iseq(ret, iseq, 0, scope_node); + PUSH_INSNL(ret, *location, jump, ISEQ_COMPILE_DATA(iseq)->end_label); + PUSH_ADJUST_RESTORE(ret, splabel); + splabel->unremovable = FALSE; + + if (!popped) PUSH_INSN(ret, *location, putnil); } + else { + const rb_iseq_t *ip = iseq; + unsigned long throw_flag = 0; - // Fill in any locals we missed - if (scope_node->locals.size) { - for (size_t i = 0; i < scope_node->locals.size; i++) { - pm_constant_id_t constant_id = locals->ids[i]; - if (constant_id) { - struct pm_local_table_insert_ctx ctx; - ctx.scope_node = scope_node; - ctx.local_table_for_iseq = local_table_for_iseq; - ctx.local_index = local_index; + while (ip) { + if (!ISEQ_COMPILE_DATA(ip)) { + ip = 0; + break; + } - st_update(index_lookup_table, (st_data_t)constant_id, pm_local_table_insert_func, (st_data_t)&ctx); + throw_flag = VM_THROW_NO_ESCAPE_FLAG; + if (ISEQ_COMPILE_DATA(ip)->redo_label != 0) { + /* while loop */ + break; + } + else if (ISEQ_BODY(ip)->type == ISEQ_TYPE_BLOCK) { + break; + } + else if (ISEQ_BODY(ip)->type == ISEQ_TYPE_EVAL) { + COMPILE_ERROR(iseq, location->line, "Invalid next"); + return; + } - local_index = ctx.local_index; + ip = ISEQ_BODY(ip)->parent_iseq; + } + + if (ip != 0) { + if (node->arguments) { + PM_COMPILE_NOT_POPPED((const pm_node_t *) node->arguments); + } + else { + PUSH_INSN(ret, *location, putnil); } + + PUSH_INSN1(ret, *location, throw, INT2FIX(throw_flag | TAG_NEXT)); + if (popped) PUSH_INSN(ret, *location, pop); + } + else { + COMPILE_ERROR(iseq, location->line, "Invalid next"); } } +} - //********END OF STEP 4********** +static inline void +pm_compile_redo_node(rb_iseq_t *iseq, const pm_node_location_t *location, LINK_ANCHOR *const ret, bool popped, pm_scope_node_t *scope_node) +{ + if (ISEQ_COMPILE_DATA(iseq)->redo_label && can_add_ensure_iseq(iseq)) { + LABEL *splabel = NEW_LABEL(0); - // We set the index_lookup_table on the scope node so we can - // refer to the parameters correctly - if (scope_node->index_lookup_table) { - st_free_table(scope_node->index_lookup_table); + PUSH_LABEL(ret, splabel); + PUSH_ADJUST(ret, *location, ISEQ_COMPILE_DATA(iseq)->redo_label); + pm_add_ensure_iseq(ret, iseq, 0, scope_node); + + PUSH_INSNL(ret, *location, jump, ISEQ_COMPILE_DATA(iseq)->redo_label); + PUSH_ADJUST_RESTORE(ret, splabel); + if (!popped) PUSH_INSN(ret, *location, putnil); } - scope_node->index_lookup_table = index_lookup_table; - iseq_calc_param_size(iseq); + else if (ISEQ_BODY(iseq)->type != ISEQ_TYPE_EVAL && ISEQ_COMPILE_DATA(iseq)->start_label && can_add_ensure_iseq(iseq)) { + LABEL *splabel = NEW_LABEL(0); - if (ISEQ_BODY(iseq)->param.flags.forwardable) { - // We're treating `...` as a parameter so that frame - // pushing won't clobber it. - ISEQ_BODY(iseq)->param.size += 1; + PUSH_LABEL(ret, splabel); + pm_add_ensure_iseq(ret, iseq, 0, scope_node); + PUSH_ADJUST(ret, *location, ISEQ_COMPILE_DATA(iseq)->start_label); + + PUSH_INSNL(ret, *location, jump, ISEQ_COMPILE_DATA(iseq)->start_label); + PUSH_ADJUST_RESTORE(ret, splabel); + if (!popped) PUSH_INSN(ret, *location, putnil); } + else { + const rb_iseq_t *ip = iseq; - // FIXME: args? - iseq_set_local_table(iseq, local_table_for_iseq, 0); - scope_node->local_table_for_iseq_size = local_table_for_iseq->size; + while (ip) { + if (!ISEQ_COMPILE_DATA(ip)) { + ip = 0; + break; + } - //********STEP 5************ - // Goal: compile anything that needed to be compiled - if (optionals_list && optionals_list->size) { - LABEL **opt_table = (LABEL **) ALLOC_N(VALUE, optionals_list->size + 1); - LABEL *label; + if (ISEQ_COMPILE_DATA(ip)->redo_label != 0) { + break; + } + else if (ISEQ_BODY(ip)->type == ISEQ_TYPE_BLOCK) { + break; + } + else if (ISEQ_BODY(ip)->type == ISEQ_TYPE_EVAL) { + COMPILE_ERROR(iseq, location->line, "Invalid redo"); + return; + } - // TODO: Should we make an api for NEW_LABEL where you can pass - // a pointer to the label it should fill out? We already - // have a list of labels allocated above so it seems wasteful - // to do the copies. - for (size_t i = 0; i < optionals_list->size; i++) { - label = NEW_LABEL(location.line); - opt_table[i] = label; - PUSH_LABEL(ret, label); - pm_node_t *optional_node = optionals_list->nodes[i]; - PM_COMPILE_NOT_POPPED(optional_node); + ip = ISEQ_BODY(ip)->parent_iseq; } - // Set the last label - label = NEW_LABEL(location.line); - opt_table[optionals_list->size] = label; - PUSH_LABEL(ret, label); - - body->param.opt_table = (const VALUE *) opt_table; + if (ip != 0) { + PUSH_INSN(ret, *location, putnil); + PUSH_INSN1(ret, *location, throw, INT2FIX(VM_THROW_NO_ESCAPE_FLAG | TAG_REDO)); + if (popped) PUSH_INSN(ret, *location, pop); + } + else { + COMPILE_ERROR(iseq, location->line, "Invalid redo"); + } } +} - if (keywords_list && keywords_list->size) { - size_t optional_index = 0; - for (size_t i = 0; i < keywords_list->size; i++) { - pm_node_t *keyword_parameter_node = keywords_list->nodes[i]; - pm_constant_id_t name; - - switch (PM_NODE_TYPE(keyword_parameter_node)) { - case PM_OPTIONAL_KEYWORD_PARAMETER_NODE: { - // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) - // ^^^^ - const pm_optional_keyword_parameter_node_t *cast = ((const pm_optional_keyword_parameter_node_t *) keyword_parameter_node); +static inline void +pm_compile_rescue_node(rb_iseq_t *iseq, const pm_rescue_node_t *node, const pm_node_location_t *location, LINK_ANCHOR *const ret, bool popped, pm_scope_node_t *scope_node) +{ + iseq_set_exception_local_table(iseq); - pm_node_t *value = cast->value; - name = cast->name; + // First, establish the labels that we need to be able to jump to within + // this compilation block. + LABEL *exception_match_label = NEW_LABEL(location->line); + LABEL *rescue_end_label = NEW_LABEL(location->line); - if (!PM_NODE_FLAG_P(value, PM_NODE_FLAG_STATIC_LITERAL) || PM_CONTAINER_P(value)) { - LABEL *end_label = NEW_LABEL(location.line); + // Next, compile each of the exceptions that we're going to be + // handling. For each one, we'll add instructions to check if the + // exception matches the raised one, and if it does then jump to the + // exception_match_label label. Otherwise it will fall through to the + // subsequent check. If there are no exceptions, we'll only check + // StandardError. + const pm_node_list_t *exceptions = &node->exceptions; - pm_local_index_t index = pm_lookup_local_index(iseq, scope_node, name, 0); - int kw_bits_idx = table_size - body->param.keyword->bits_start; - PUSH_INSN2(ret, location, checkkeyword, INT2FIX(kw_bits_idx + VM_ENV_DATA_SIZE - 1), INT2FIX(optional_index)); - PUSH_INSNL(ret, location, branchif, end_label); - PM_COMPILE(value); - PUSH_SETLOCAL(ret, location, index.index, index.level); - PUSH_LABEL(ret, end_label); - } - optional_index++; - break; - } - case PM_REQUIRED_KEYWORD_PARAMETER_NODE: - // def foo(a, (b, *c, d), e = 1, *f, g, (h, *i, j), k:, l: 1, **m, &n) - // ^^ - break; - default: - rb_bug("Unexpected keyword parameter node type %s", pm_node_type_to_str(PM_NODE_TYPE(keyword_parameter_node))); + if (exceptions->size > 0) { + for (size_t index = 0; index < exceptions->size; index++) { + PUSH_GETLOCAL(ret, *location, LVAR_ERRINFO, 0); + PM_COMPILE(exceptions->nodes[index]); + int checkmatch_flags = VM_CHECKMATCH_TYPE_RESCUE; + if (PM_NODE_TYPE_P(exceptions->nodes[index], PM_SPLAT_NODE)) { + checkmatch_flags |= VM_CHECKMATCH_ARRAY; } + PUSH_INSN1(ret, *location, checkmatch, INT2FIX(checkmatch_flags)); + PUSH_INSNL(ret, *location, branchif, exception_match_label); } } + else { + PUSH_GETLOCAL(ret, *location, LVAR_ERRINFO, 0); + PUSH_INSN1(ret, *location, putobject, rb_eStandardError); + PUSH_INSN1(ret, *location, checkmatch, INT2FIX(VM_CHECKMATCH_TYPE_RESCUE)); + PUSH_INSNL(ret, *location, branchif, exception_match_label); + } + + // If none of the exceptions that we are matching against matched, then + // we'll jump straight to the rescue_end_label label. + PUSH_INSNL(ret, *location, jump, rescue_end_label); + + // Here we have the exception_match_label, which is where the + // control-flow goes in the case that one of the exceptions matched. + // Here we will compile the instructions to handle the exception. + PUSH_LABEL(ret, exception_match_label); + PUSH_TRACE(ret, RUBY_EVENT_RESCUE); + + // If we have a reference to the exception, then we'll compile the write + // into the instruction sequence. This can look quite different + // depending on the kind of write being performed. + if (node->reference) { + DECL_ANCHOR(writes); + INIT_ANCHOR(writes); - if (requireds_list && requireds_list->size) { - for (size_t i = 0; i < requireds_list->size; i++) { - // For each MultiTargetNode, we're going to have one additional - // anonymous local not represented in the locals table. We want - // to account for this in our table size. - const pm_node_t *required = requireds_list->nodes[i]; + DECL_ANCHOR(cleanup); + INIT_ANCHOR(cleanup); - if (PM_NODE_TYPE_P(required, PM_MULTI_TARGET_NODE)) { - PUSH_GETLOCAL(ret, location, table_size - (int)i, 0); - pm_compile_destructured_param_writes(iseq, (const pm_multi_target_node_t *) required, ret, scope_node); - } - } + pm_compile_target_node(iseq, node->reference, ret, writes, cleanup, scope_node, NULL); + PUSH_GETLOCAL(ret, *location, LVAR_ERRINFO, 0); + + PUSH_SEQ(ret, writes); + PUSH_SEQ(ret, cleanup); } - if (posts_list && posts_list->size) { - for (size_t i = 0; i < posts_list->size; i++) { - // For each MultiTargetNode, we're going to have one additional - // anonymous local not represented in the locals table. We want - // to account for this in our table size. - const pm_node_t *post = posts_list->nodes[i]; + // If we have statements to execute, we'll compile them here. Otherwise + // we'll push nil onto the stack. + if (node->statements != NULL) { + // We'll temporarily remove the end_label location from the iseq + // when compiling the statements so that next/redo statements + // inside the body will throw to the correct place instead of + // jumping straight to the end of this iseq + LABEL *prev_end = ISEQ_COMPILE_DATA(iseq)->end_label; + ISEQ_COMPILE_DATA(iseq)->end_label = NULL; - if (PM_NODE_TYPE_P(post, PM_MULTI_TARGET_NODE)) { - PUSH_GETLOCAL(ret, location, table_size - body->param.post_start - (int) i, 0); - pm_compile_destructured_param_writes(iseq, (const pm_multi_target_node_t *) post, ret, scope_node); - } - } + PM_COMPILE((const pm_node_t *) node->statements); + + // Now restore the end_label + ISEQ_COMPILE_DATA(iseq)->end_label = prev_end; + } + else { + PUSH_INSN(ret, *location, putnil); } - switch (body->type) { - case ISEQ_TYPE_PLAIN: { - RUBY_ASSERT(PM_NODE_TYPE_P(scope_node->ast_node, PM_INTERPOLATED_REGULAR_EXPRESSION_NODE)); + PUSH_INSN(ret, *location, leave); - const pm_interpolated_regular_expression_node_t *cast = (const pm_interpolated_regular_expression_node_t *) scope_node->ast_node; - pm_compile_regexp_dynamic(iseq, (const pm_node_t *) cast, &cast->parts, &location, ret, popped, scope_node); + // Here we'll insert the rescue_end_label label, which is jumped to if + // none of the exceptions matched. It will cause the control-flow to + // either jump to the next rescue clause or it will fall through to the + // subsequent instruction returning the raised error. + PUSH_LABEL(ret, rescue_end_label); + if (node->subsequent != NULL) { + PM_COMPILE((const pm_node_t *) node->subsequent); + } + else { + PUSH_GETLOCAL(ret, *location, 1, 0); + } +} + +static inline void +pm_compile_return_node(rb_iseq_t *iseq, const pm_return_node_t *node, const pm_node_location_t *location, LINK_ANCHOR *const ret, bool popped, pm_scope_node_t *scope_node) +{ + const pm_arguments_node_t *arguments = node->arguments; + enum rb_iseq_type type = ISEQ_BODY(iseq)->type; + LABEL *splabel = 0; + + const rb_iseq_t *parent_iseq = iseq; + enum rb_iseq_type parent_type = ISEQ_BODY(parent_iseq)->type; + while (parent_type == ISEQ_TYPE_RESCUE || parent_type == ISEQ_TYPE_ENSURE) { + if (!(parent_iseq = ISEQ_BODY(parent_iseq)->parent_iseq)) break; + parent_type = ISEQ_BODY(parent_iseq)->type; + } + switch (parent_type) { + case ISEQ_TYPE_TOP: + case ISEQ_TYPE_MAIN: + if (arguments) { + rb_warn("argument of top-level return is ignored"); + } + if (parent_iseq == iseq) { + type = ISEQ_TYPE_METHOD; + } break; - } - case ISEQ_TYPE_BLOCK: { - LABEL *start = ISEQ_COMPILE_DATA(iseq)->start_label = NEW_LABEL(0); - LABEL *end = ISEQ_COMPILE_DATA(iseq)->end_label = NEW_LABEL(0); - const pm_node_location_t block_location = { .line = body->location.first_lineno, .node_id = -1 }; + default: + break; + } - start->rescued = LABEL_RESCUE_BEG; - end->rescued = LABEL_RESCUE_END; + if (type == ISEQ_TYPE_METHOD) { + splabel = NEW_LABEL(0); + PUSH_LABEL(ret, splabel); + PUSH_ADJUST(ret, *location, 0); + } - // For nodes automatically assign the iteration variable to whatever - // index variable. We need to handle that write here because it has - // to happen in the context of the block. Note that this happens - // before the B_CALL tracepoint event. - if (PM_NODE_TYPE_P(scope_node->ast_node, PM_FOR_NODE)) { - pm_compile_for_node_index(iseq, ((const pm_for_node_t *) scope_node->ast_node)->index, ret, scope_node); - } + if (arguments != NULL) { + PM_COMPILE_NOT_POPPED((const pm_node_t *) arguments); + } + else { + PUSH_INSN(ret, *location, putnil); + } - PUSH_TRACE(ret, RUBY_EVENT_B_CALL); - PUSH_INSN(ret, block_location, nop); - PUSH_LABEL(ret, start); + if (type == ISEQ_TYPE_METHOD && can_add_ensure_iseq(iseq)) { + pm_add_ensure_iseq(ret, iseq, 1, scope_node); + PUSH_TRACE(ret, RUBY_EVENT_RETURN); + PUSH_INSN(ret, *location, leave); + PUSH_ADJUST_RESTORE(ret, splabel); + if (!popped) PUSH_INSN(ret, *location, putnil); + } + else { + PUSH_INSN1(ret, *location, throw, INT2FIX(TAG_RETURN)); + if (popped) PUSH_INSN(ret, *location, pop); + } +} - if (scope_node->body != NULL) { - switch (PM_NODE_TYPE(scope_node->ast_node)) { - case PM_POST_EXECUTION_NODE: { - const pm_post_execution_node_t *cast = (const pm_post_execution_node_t *) scope_node->ast_node; - PUSH_INSN1(ret, block_location, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); +static inline void +pm_compile_super_node(rb_iseq_t *iseq, const pm_super_node_t *node, const pm_node_location_t *location, LINK_ANCHOR *const ret, bool popped, pm_scope_node_t *scope_node) +{ + DECL_ANCHOR(args); + INIT_ANCHOR(args); - // We create another ScopeNode from the statements within the PostExecutionNode - pm_scope_node_t next_scope_node; - pm_scope_node_init((const pm_node_t *) cast->statements, &next_scope_node, scope_node); + LABEL *retry_label = NEW_LABEL(location->line); + LABEL *retry_end_l = NEW_LABEL(location->line); - const rb_iseq_t *block = NEW_CHILD_ISEQ(&next_scope_node, make_name_for_block(body->parent_iseq), ISEQ_TYPE_BLOCK, location.line); - pm_scope_node_destroy(&next_scope_node); + const rb_iseq_t *previous_block = ISEQ_COMPILE_DATA(iseq)->current_block; + const rb_iseq_t *current_block; + ISEQ_COMPILE_DATA(iseq)->current_block = current_block = NULL; - PUSH_CALL_WITH_BLOCK(ret, block_location, id_core_set_postexe, INT2FIX(0), block); - break; - } - case PM_INTERPOLATED_REGULAR_EXPRESSION_NODE: { - const pm_interpolated_regular_expression_node_t *cast = (const pm_interpolated_regular_expression_node_t *) scope_node->ast_node; - pm_compile_regexp_dynamic(iseq, (const pm_node_t *) cast, &cast->parts, &location, ret, popped, scope_node); - break; - } - default: - pm_compile_node(iseq, scope_node->body, ret, popped, scope_node); - break; - } - } - else { - PUSH_INSN(ret, block_location, putnil); - } + PUSH_LABEL(ret, retry_label); + PUSH_INSN(ret, *location, putself); - PUSH_LABEL(ret, end); - PUSH_TRACE(ret, RUBY_EVENT_B_RETURN); - ISEQ_COMPILE_DATA(iseq)->last_line = body->location.code_location.end_pos.lineno; + int flags = 0; + struct rb_callinfo_kwarg *keywords = NULL; + int argc = pm_setup_args(node->arguments, node->block, &flags, &keywords, iseq, ret, scope_node, location); + bool is_forwardable = (node->arguments != NULL) && PM_NODE_FLAG_P(node->arguments, PM_ARGUMENTS_NODE_FLAGS_CONTAINS_FORWARDING); + flags |= VM_CALL_SUPER | VM_CALL_FCALL; - /* wide range catch handler must put at last */ - PUSH_CATCH_ENTRY(CATCH_TYPE_REDO, start, end, NULL, start); - PUSH_CATCH_ENTRY(CATCH_TYPE_NEXT, start, end, NULL, end); - break; - } - case ISEQ_TYPE_ENSURE: { - const pm_node_location_t statements_location = (scope_node->body != NULL ? PM_NODE_START_LOCATION(scope_node->parser, scope_node->body) : location); - iseq_set_exception_local_table(iseq); + if (node->block && PM_NODE_TYPE_P(node->block, PM_BLOCK_NODE)) { + pm_scope_node_t next_scope_node; + pm_scope_node_init(node->block, &next_scope_node, scope_node); - if (scope_node->body != NULL) { - PM_COMPILE_POPPED((const pm_node_t *) scope_node->body); - } + ISEQ_COMPILE_DATA(iseq)->current_block = current_block = NEW_CHILD_ISEQ(&next_scope_node, make_name_for_block(iseq), ISEQ_TYPE_BLOCK, location->line); + pm_scope_node_destroy(&next_scope_node); + } - PUSH_GETLOCAL(ret, statements_location, 1, 0); - PUSH_INSN1(ret, statements_location, throw, INT2FIX(0)); - return; - } - case ISEQ_TYPE_METHOD: { - ISEQ_COMPILE_DATA(iseq)->root_node = (const void *) scope_node->body; - PUSH_TRACE(ret, RUBY_EVENT_CALL); + if (!node->block) { + iseq_set_use_block(ISEQ_BODY(iseq)->local_iseq); + } - if (scope_node->body) { - PM_COMPILE((const pm_node_t *) scope_node->body); - } - else { - PUSH_INSN(ret, location, putnil); - } + if ((flags & VM_CALL_ARGS_BLOCKARG) && (flags & VM_CALL_KW_SPLAT) && !(flags & VM_CALL_KW_SPLAT_MUT)) { + PUSH_INSN(args, *location, splatkw); + } - ISEQ_COMPILE_DATA(iseq)->root_node = (const void *) scope_node->body; - PUSH_TRACE(ret, RUBY_EVENT_RETURN); + PUSH_SEQ(ret, args); + if (is_forwardable && ISEQ_BODY(ISEQ_BODY(iseq)->local_iseq)->param.flags.forwardable) { + flags |= VM_CALL_FORWARDING; + PUSH_INSN2(ret, *location, invokesuperforward, new_callinfo(iseq, 0, argc, flags, keywords, current_block != NULL), current_block); + } + else { + PUSH_INSN2(ret, *location, invokesuper, new_callinfo(iseq, 0, argc, flags, keywords, current_block != NULL), current_block); + pm_compile_retry_end_label(iseq, ret, retry_end_l); + } - ISEQ_COMPILE_DATA(iseq)->last_line = body->location.code_location.end_pos.lineno; - break; - } - case ISEQ_TYPE_RESCUE: { - iseq_set_exception_local_table(iseq); - if (PM_NODE_TYPE_P(scope_node->ast_node, PM_RESCUE_MODIFIER_NODE)) { - LABEL *lab = NEW_LABEL(location.line); - LABEL *rescue_end = NEW_LABEL(location.line); - PUSH_GETLOCAL(ret, location, LVAR_ERRINFO, 0); - PUSH_INSN1(ret, location, putobject, rb_eStandardError); - PUSH_INSN1(ret, location, checkmatch, INT2FIX(VM_CHECKMATCH_TYPE_RESCUE)); - PUSH_INSNL(ret, location, branchif, lab); - PUSH_INSNL(ret, location, jump, rescue_end); - PUSH_LABEL(ret, lab); - PUSH_TRACE(ret, RUBY_EVENT_RESCUE); - PM_COMPILE((const pm_node_t *) scope_node->body); - PUSH_INSN(ret, location, leave); - PUSH_LABEL(ret, rescue_end); - PUSH_GETLOCAL(ret, location, LVAR_ERRINFO, 0); - } - else { - PM_COMPILE((const pm_node_t *) scope_node->ast_node); - } - PUSH_INSN1(ret, location, throw, INT2FIX(0)); + if (popped) PUSH_INSN(ret, *location, pop); + ISEQ_COMPILE_DATA(iseq)->current_block = previous_block; + PUSH_CATCH_ENTRY(CATCH_TYPE_BREAK, retry_label, retry_end_l, current_block, retry_end_l); +} +static inline void +pm_compile_yield_node(rb_iseq_t *iseq, const pm_yield_node_t *node, const pm_node_location_t *location, LINK_ANCHOR *const ret, bool popped, pm_scope_node_t *scope_node) +{ + switch (ISEQ_BODY(ISEQ_BODY(iseq)->local_iseq)->type) { + case ISEQ_TYPE_TOP: + case ISEQ_TYPE_MAIN: + case ISEQ_TYPE_CLASS: + COMPILE_ERROR(iseq, location->line, "Invalid yield"); return; - } - default: - if (scope_node->body) { - PM_COMPILE((const pm_node_t *) scope_node->body); - } - else { - PUSH_INSN(ret, location, putnil); - } - break; + default: /* valid */; } - if (PM_NODE_TYPE_P(scope_node->ast_node, PM_CLASS_NODE) || PM_NODE_TYPE_P(scope_node->ast_node, PM_MODULE_NODE)) { - const pm_node_location_t end_location = PM_NODE_END_LOCATION(scope_node->parser, scope_node->ast_node); - PUSH_TRACE(ret, RUBY_EVENT_END); - ISEQ_COMPILE_DATA(iseq)->last_line = end_location.line; + int argc = 0; + int flags = 0; + struct rb_callinfo_kwarg *keywords = NULL; + + if (node->arguments) { + argc = pm_setup_args(node->arguments, NULL, &flags, &keywords, iseq, ret, scope_node, location); } - if (!PM_NODE_TYPE_P(scope_node->ast_node, PM_ENSURE_NODE)) { - const pm_node_location_t location = { .line = ISEQ_COMPILE_DATA(iseq)->last_line, .node_id = -1 }; - PUSH_INSN(ret, location, leave); + PUSH_INSN1(ret, *location, invokeblock, new_callinfo(iseq, 0, argc, flags, keywords, FALSE)); + iseq_set_use_block(ISEQ_BODY(iseq)->local_iseq); + if (popped) PUSH_INSN(ret, *location, pop); + + int level = 0; + for (const rb_iseq_t *tmp_iseq = iseq; tmp_iseq != ISEQ_BODY(iseq)->local_iseq; level++) { + tmp_iseq = ISEQ_BODY(tmp_iseq)->parent_iseq; } + + if (level > 0) access_outer_variables(iseq, level, rb_intern("yield"), true); } /** @@ -6902,247 +8121,46 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, } switch (PM_NODE_TYPE(node)) { - case PM_ALIAS_GLOBAL_VARIABLE_NODE: { + case PM_ALIAS_GLOBAL_VARIABLE_NODE: // alias $foo $bar // ^^^^^^^^^^^^^^^ - const pm_alias_global_variable_node_t *cast = (const pm_alias_global_variable_node_t *) node; - PUSH_INSN1(ret, location, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); - - const pm_location_t *new_name_loc = &cast->new_name->location; - PUSH_INSN1(ret, location, putobject, ID2SYM(rb_intern3((const char *) new_name_loc->start, new_name_loc->end - new_name_loc->start, scope_node->encoding))); - - const pm_location_t *old_name_loc = &cast->old_name->location; - PUSH_INSN1(ret, location, putobject, ID2SYM(rb_intern3((const char *) old_name_loc->start, old_name_loc->end - old_name_loc->start, scope_node->encoding))); - - PUSH_SEND(ret, location, id_core_set_variable_alias, INT2FIX(2)); - if (popped) PUSH_INSN(ret, location, pop); - + pm_compile_alias_global_variable_node(iseq, (const pm_alias_global_variable_node_t *) node, &location, ret, popped, scope_node); return; - } - case PM_ALIAS_METHOD_NODE: { + case PM_ALIAS_METHOD_NODE: // alias foo bar // ^^^^^^^^^^^^^ - const pm_alias_method_node_t *cast = (const pm_alias_method_node_t *) node; - - PUSH_INSN1(ret, location, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); - PUSH_INSN1(ret, location, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_CBASE)); - PM_COMPILE_NOT_POPPED(cast->new_name); - PM_COMPILE_NOT_POPPED(cast->old_name); - - PUSH_SEND(ret, location, id_core_set_method_alias, INT2FIX(3)); - if (popped) PUSH_INSN(ret, location, pop); - + pm_compile_alias_method_node(iseq, (const pm_alias_method_node_t *) node, &location, ret, popped, scope_node); return; - } - case PM_AND_NODE: { + case PM_AND_NODE: // a and b // ^^^^^^^ - const pm_and_node_t *cast = (const pm_and_node_t *) node; - LABEL *end_label = NEW_LABEL(lineno); - - PM_COMPILE_NOT_POPPED(cast->left); - if (!popped) PUSH_INSN(ret, location, dup); - PUSH_INSNL(ret, location, branchunless, end_label); - - if (!popped) PUSH_INSN(ret, location, pop); - PM_COMPILE(cast->right); - PUSH_LABEL(ret, end_label); - + pm_compile_and_node(iseq, (const pm_and_node_t *) node, &location, ret, popped, scope_node); return; - } - case PM_ARGUMENTS_NODE: + case PM_ARGUMENTS_NODE: { + // break foo + // ^^^ + // // These are ArgumentsNodes that are not compiled directly by their // parent call nodes, used in the cases of NextNodes, ReturnNodes, and // BreakNodes. They can create an array like ArrayNode. - case PM_ARRAY_NODE: { - const pm_node_list_t *elements; - - if (PM_NODE_TYPE(node) == PM_ARGUMENTS_NODE) { - // break foo - // ^^^ - const pm_arguments_node_t *cast = (const pm_arguments_node_t *) node; - elements = &cast->arguments; - - // If we are only returning a single element through one of the jump - // nodes, then we will only compile that node directly. - if (elements->size == 1) { - PM_COMPILE(elements->nodes[0]); - return; - } - } - else { - // [foo, bar, baz] - // ^^^^^^^^^^^^^^^ - const pm_array_node_t *cast = (const pm_array_node_t *) node; - elements = &cast->elements; - } - - // If every node in the array is static, then we can compile the entire - // array now instead of later. - if (PM_NODE_FLAG_P(node, PM_NODE_FLAG_STATIC_LITERAL)) { - // We're only going to compile this node if it's not popped. If it - // is popped, then we know we don't need to do anything since it's - // statically known. - if (!popped) { - if (elements->size) { - VALUE value = pm_static_literal_value(iseq, node, scope_node); - PUSH_INSN1(ret, location, duparray, value); - } - else { - PUSH_INSN1(ret, location, newarray, INT2FIX(0)); - } - } - } - else { - // Here since we know there are possible side-effects inside the - // array contents, we're going to build it entirely at runtime. - // We'll do this by pushing all of the elements onto the stack and - // then combining them with newarray. - // - // If this array is popped, then this serves only to ensure we enact - // all side-effects (like method calls) that are contained within - // the array contents. - // - // We treat all sequences of non-splat elements as their - // own arrays, followed by a newarray, and then continually - // concat the arrays with the SplatNode nodes. - const int max_new_array_size = 0x100; - const unsigned int min_tmp_array_size = 0x40; - - int new_array_size = 0; - bool first_chunk = true; - - // This is an optimization wherein we keep track of whether or not - // the previous element was a static literal. If it was, then we do - // not attempt to check if we have a subarray that can be optimized. - // If it was not, then we do check. - bool static_literal = false; - - // Either create a new array, or push to the existing array. -#define FLUSH_CHUNK \ - if (new_array_size) { \ - if (first_chunk) PUSH_INSN1(ret, location, newarray, INT2FIX(new_array_size)); \ - else PUSH_INSN1(ret, location, pushtoarray, INT2FIX(new_array_size)); \ - first_chunk = false; \ - new_array_size = 0; \ - } - - for (size_t index = 0; index < elements->size; index++) { - const pm_node_t *element = elements->nodes[index]; - - if (PM_NODE_TYPE_P(element, PM_SPLAT_NODE)) { - FLUSH_CHUNK; - - const pm_splat_node_t *splat_element = (const pm_splat_node_t *) element; - if (splat_element->expression) { - PM_COMPILE_NOT_POPPED(splat_element->expression); - } - else { - pm_local_index_t index = pm_lookup_local_index(iseq, scope_node, PM_CONSTANT_MULT, 0); - PUSH_GETLOCAL(ret, location, index.index, index.level); - } - - if (first_chunk) { - // If this is the first element of the array then we - // need to splatarray the elements into the list. - PUSH_INSN1(ret, location, splatarray, Qtrue); - first_chunk = false; - } - else { - PUSH_INSN(ret, location, concattoarray); - } - - static_literal = false; - } - else if (PM_NODE_TYPE_P(element, PM_KEYWORD_HASH_NODE)) { - if (new_array_size == 0 && first_chunk) { - PUSH_INSN1(ret, location, newarray, INT2FIX(0)); - first_chunk = false; - } - else { - FLUSH_CHUNK; - } - - // If we get here, then this is the last element of the - // array/arguments, because it cannot be followed by - // anything else without a syntax error. This looks like: - // - // [foo, bar, baz: qux] - // ^^^^^^^^ - // - // [foo, bar, **baz] - // ^^^^^ - // - const pm_keyword_hash_node_t *keyword_hash = (const pm_keyword_hash_node_t *) element; - pm_compile_hash_elements(iseq, element, &keyword_hash->elements, false, ret, scope_node); - - // This boolean controls the manner in which we push the - // hash onto the array. If it's all keyword splats, then we - // can use the very specialized pushtoarraykwsplat - // instruction to check if it's empty before we push it. - size_t splats = 0; - while (splats < keyword_hash->elements.size && PM_NODE_TYPE_P(keyword_hash->elements.nodes[splats], PM_ASSOC_SPLAT_NODE)) splats++; - - if (keyword_hash->elements.size == splats) { - PUSH_INSN(ret, location, pushtoarraykwsplat); - } - else { - new_array_size++; - } - } - else if ( - PM_NODE_FLAG_P(element, PM_NODE_FLAG_STATIC_LITERAL) && - !PM_CONTAINER_P(element) && - !static_literal && - ((index + min_tmp_array_size) < elements->size) - ) { - // If we have a static literal, then there's the potential - // to group a bunch of them together with a literal array - // and then concat them together. - size_t right_index = index + 1; - while ( - right_index < elements->size && - PM_NODE_FLAG_P(elements->nodes[right_index], PM_NODE_FLAG_STATIC_LITERAL) && - !PM_CONTAINER_P(elements->nodes[right_index]) - ) right_index++; - - size_t tmp_array_size = right_index - index; - if (tmp_array_size >= min_tmp_array_size) { - VALUE tmp_array = rb_ary_hidden_new(tmp_array_size); - - // Create the temporary array. - for (; tmp_array_size; tmp_array_size--) - rb_ary_push(tmp_array, pm_static_literal_value(iseq, elements->nodes[index++], scope_node)); - OBJ_FREEZE(tmp_array); - - // Emit the optimized code. - FLUSH_CHUNK; - if (first_chunk) { - PUSH_INSN1(ret, location, duparray, tmp_array); - first_chunk = false; - } - else { - PUSH_INSN1(ret, location, putobject, tmp_array); - PUSH_INSN(ret, location, concattoarray); - } - } - else { - PM_COMPILE_NOT_POPPED(element); - if (++new_array_size >= max_new_array_size) FLUSH_CHUNK; - static_literal = true; - } - } else { - PM_COMPILE_NOT_POPPED(element); - if (++new_array_size >= max_new_array_size) FLUSH_CHUNK; - static_literal = false; - } - } - - FLUSH_CHUNK; - if (popped) PUSH_INSN(ret, location, pop); - } + const pm_arguments_node_t *cast = (const pm_arguments_node_t *) node; + const pm_node_list_t *elements = &cast->arguments; -#undef FLUSH_CHUNK + if (elements->size == 1) { + // If we are only returning a single element through one of the jump + // nodes, then we will only compile that node directly. + PM_COMPILE(elements->nodes[0]); + } + else { + pm_compile_array_node(iseq, (const pm_node_t *) cast, elements, &location, ret, popped, scope_node); + } + return; + } + case PM_ARRAY_NODE: { + // [foo, bar, baz] + // ^^^^^^^^^^^^^^^ + const pm_array_node_t *cast = (const pm_array_node_t *) node; + pm_compile_array_node(iseq, (const pm_node_t *) cast, &cast->elements, &location, ret, popped, scope_node); return; } case PM_ASSOC_NODE: { @@ -7229,76 +8247,15 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, } return; } - case PM_BREAK_NODE: { + case PM_BREAK_NODE: // break // ^^^^^ // // break foo // ^^^^^^^^^ - const pm_break_node_t *cast = (const pm_break_node_t *) node; - unsigned long throw_flag = 0; - - if (ISEQ_COMPILE_DATA(iseq)->redo_label != 0 && can_add_ensure_iseq(iseq)) { - /* while/until */ - LABEL *splabel = NEW_LABEL(0); - PUSH_LABEL(ret, splabel); - PUSH_ADJUST(ret, location, ISEQ_COMPILE_DATA(iseq)->redo_label); - - if (cast->arguments != NULL) { - PM_COMPILE_NOT_POPPED((const pm_node_t *) cast->arguments); - } - else { - PUSH_INSN(ret, location, putnil); - } - - pm_add_ensure_iseq(ret, iseq, 0, scope_node); - PUSH_INSNL(ret, location, jump, ISEQ_COMPILE_DATA(iseq)->end_label); - PUSH_ADJUST_RESTORE(ret, splabel); - if (!popped) PUSH_INSN(ret, location, putnil); - } - else { - const rb_iseq_t *ip = iseq; - - while (ip) { - if (!ISEQ_COMPILE_DATA(ip)) { - ip = 0; - break; - } - - if (ISEQ_COMPILE_DATA(ip)->redo_label != 0) { - throw_flag = VM_THROW_NO_ESCAPE_FLAG; - } - else if (ISEQ_BODY(ip)->type == ISEQ_TYPE_BLOCK) { - throw_flag = 0; - } - else if (ISEQ_BODY(ip)->type == ISEQ_TYPE_EVAL) { - COMPILE_ERROR(iseq, location.line, "Invalid break"); - return; - } - else { - ip = ISEQ_BODY(ip)->parent_iseq; - continue; - } - - /* escape from block */ - if (cast->arguments != NULL) { - PM_COMPILE_NOT_POPPED((const pm_node_t *) cast->arguments); - } - else { - PUSH_INSN(ret, location, putnil); - } - - PUSH_INSN1(ret, location, throw, INT2FIX(throw_flag | TAG_BREAK)); - if (popped) PUSH_INSN(ret, location, pop); - - return; - } - - COMPILE_ERROR(iseq, location.line, "Invalid break"); - } + pm_compile_break_node(iseq, (const pm_break_node_t *) node, &location, ret, popped, scope_node); return; - } - case PM_CALL_NODE: { + case PM_CALL_NODE: // foo // ^^^ // @@ -7307,105 +8264,8 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, // // foo.bar() {} // ^^^^^^^^^^^^ - const pm_call_node_t *cast = (const pm_call_node_t *) node; - ID method_id = pm_constant_id_lookup(scope_node, cast->name); - - const pm_location_t *message_loc = &cast->message_loc; - if (message_loc->start == NULL) message_loc = &cast->base.location; - - const pm_node_location_t location = PM_LOCATION_START_LOCATION(scope_node->parser, message_loc, cast->base.node_id); - const char *builtin_func; - - if (UNLIKELY(iseq_has_builtin_function_table(iseq)) && (builtin_func = pm_iseq_builtin_function_name(scope_node, cast->receiver, method_id)) != NULL) { - pm_compile_builtin_function_call(iseq, ret, scope_node, cast, &location, popped, ISEQ_COMPILE_DATA(iseq)->current_block, builtin_func); - return; - } - - LABEL *start = NEW_LABEL(location.line); - if (cast->block) PUSH_LABEL(ret, start); - - switch (method_id) { - case idUMinus: { - if (pm_opt_str_freeze_p(iseq, cast)) { - VALUE value = parse_static_literal_string(iseq, scope_node, cast->receiver, &((const pm_string_node_t * ) cast->receiver)->unescaped); - PUSH_INSN2(ret, location, opt_str_uminus, value, new_callinfo(iseq, idUMinus, 0, 0, NULL, FALSE)); - return; - } - break; - } - case idFreeze: { - if (pm_opt_str_freeze_p(iseq, cast)) { - VALUE value = parse_static_literal_string(iseq, scope_node, cast->receiver, &((const pm_string_node_t * ) cast->receiver)->unescaped); - PUSH_INSN2(ret, location, opt_str_freeze, value, new_callinfo(iseq, idFreeze, 0, 0, NULL, FALSE)); - return; - } - break; - } - case idAREF: { - if (pm_opt_aref_with_p(iseq, cast)) { - const pm_string_node_t *string = (const pm_string_node_t *) ((const pm_arguments_node_t *) cast->arguments)->arguments.nodes[0]; - VALUE value = parse_static_literal_string(iseq, scope_node, (const pm_node_t *) string, &string->unescaped); - - PM_COMPILE_NOT_POPPED(cast->receiver); - PUSH_INSN2(ret, location, opt_aref_with, value, new_callinfo(iseq, idAREF, 1, 0, NULL, FALSE)); - - if (popped) { - PUSH_INSN(ret, location, pop); - } - - return; - } - break; - } - case idASET: { - if (pm_opt_aset_with_p(iseq, cast)) { - const pm_string_node_t *string = (const pm_string_node_t *) ((const pm_arguments_node_t *) cast->arguments)->arguments.nodes[0]; - VALUE value = parse_static_literal_string(iseq, scope_node, (const pm_node_t *) string, &string->unescaped); - - PM_COMPILE_NOT_POPPED(cast->receiver); - PM_COMPILE_NOT_POPPED(((const pm_arguments_node_t *) cast->arguments)->arguments.nodes[1]); - - if (!popped) { - PUSH_INSN(ret, location, swap); - PUSH_INSN1(ret, location, topn, INT2FIX(1)); - } - - PUSH_INSN2(ret, location, opt_aset_with, value, new_callinfo(iseq, idASET, 2, 0, NULL, FALSE)); - PUSH_INSN(ret, location, pop); - return; - } - break; - } - } - - if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_ATTRIBUTE_WRITE) && !popped) { - PUSH_INSN(ret, location, putnil); - } - - if (cast->receiver == NULL) { - PUSH_INSN(ret, location, putself); - } - else { - if (method_id == idCall && PM_NODE_TYPE_P(cast->receiver, PM_LOCAL_VARIABLE_READ_NODE)) { - const pm_local_variable_read_node_t *read_node_cast = (const pm_local_variable_read_node_t *) cast->receiver; - uint32_t node_id = cast->receiver->node_id; - int idx, level; - - if (iseq_block_param_id_p(iseq, pm_constant_id_lookup(scope_node, read_node_cast->name), &idx, &level)) { - ADD_ELEM(ret, (LINK_ELEMENT *) new_insn_body(iseq, location.line, node_id, BIN(getblockparamproxy), 2, INT2FIX((idx) + VM_ENV_DATA_SIZE - 1), INT2FIX(level))); - } - else { - PM_COMPILE_NOT_POPPED(cast->receiver); - } - } - else { - PM_COMPILE_NOT_POPPED(cast->receiver); - } - } - - pm_compile_call(iseq, cast, ret, popped, scope_node, method_id, start); + pm_compile_call_node(iseq, (const pm_call_node_t *) node, ret, popped, scope_node); return; - } case PM_CALL_AND_WRITE_NODE: { // foo.bar &&= baz // ^^^^^^^^^^^^^^^ @@ -7420,7 +8280,7 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, pm_compile_call_and_or_write_node(iseq, false, cast->receiver, cast->value, cast->write_name, cast->read_name, PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_SAFE_NAVIGATION), &location, ret, popped, scope_node); return; } - case PM_CALL_OPERATOR_WRITE_NODE: { + case PM_CALL_OPERATOR_WRITE_NODE: // foo.bar += baz // ^^^^^^^^^^^^^^^ // @@ -7430,51 +8290,14 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, // stack and then performing three method calls, one to read the value, // one to compute the result, and one to write the result back to the // receiver. - const pm_call_operator_write_node_t *cast = (const pm_call_operator_write_node_t *) node; - int flag = 0; - - if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_IGNORE_VISIBILITY)) { - flag = VM_CALL_FCALL; - } - - PM_COMPILE_NOT_POPPED(cast->receiver); - - LABEL *safe_label = NULL; - if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_SAFE_NAVIGATION)) { - safe_label = NEW_LABEL(location.line); - PUSH_INSN(ret, location, dup); - PUSH_INSNL(ret, location, branchnil, safe_label); - } - - PUSH_INSN(ret, location, dup); - - ID id_read_name = pm_constant_id_lookup(scope_node, cast->read_name); - PUSH_SEND_WITH_FLAG(ret, location, id_read_name, INT2FIX(0), INT2FIX(flag)); - - PM_COMPILE_NOT_POPPED(cast->value); - ID id_operator = pm_constant_id_lookup(scope_node, cast->binary_operator); - PUSH_SEND(ret, location, id_operator, INT2FIX(1)); - - if (!popped) { - PUSH_INSN(ret, location, swap); - PUSH_INSN1(ret, location, topn, INT2FIX(1)); - } - - ID id_write_name = pm_constant_id_lookup(scope_node, cast->write_name); - PUSH_SEND_WITH_FLAG(ret, location, id_write_name, INT2FIX(1), INT2FIX(flag)); - - if (safe_label != NULL && popped) PUSH_LABEL(ret, safe_label); - PUSH_INSN(ret, location, pop); - if (safe_label != NULL && !popped) PUSH_LABEL(ret, safe_label); - + pm_compile_call_operator_write_node(iseq, (const pm_call_operator_write_node_t *) node, &location, ret, popped, scope_node); return; - } case PM_CASE_NODE: // case foo; when bar; end // ^^^^^^^^^^^^^^^^^^^^^^^ pm_compile_case_node(iseq, (const pm_case_node_t *) node, &location, ret, popped, scope_node); return; - case PM_CASE_MATCH_NODE: { + case PM_CASE_MATCH_NODE: // case foo; in bar; end // ^^^^^^^^^^^^^^^^^^^^^ // @@ -7483,155 +8306,8 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, // matches. If it doesn't find one, it can optionally fall back to an // `else` clause. If none is present and a match wasn't found, it will // raise an appropriate error. - const pm_case_match_node_t *cast = (const pm_case_match_node_t *) node; - - // This is the anchor that we will compile the bodies of the various - // `in` nodes into. We'll make sure that the patterns that are compiled - // jump into the correct spots within this anchor. - DECL_ANCHOR(body_seq); - INIT_ANCHOR(body_seq); - - // This is the anchor that we will compile the patterns of the various - // `in` nodes into. If a match is found, they will need to jump into the - // body_seq anchor to the correct spot. - DECL_ANCHOR(cond_seq); - INIT_ANCHOR(cond_seq); - - // This label is used to indicate the end of the entire node. It is - // jumped to after the entire stack is cleaned up. - LABEL *end_label = NEW_LABEL(location.line); - - // This label is used as the fallback for the case match. If no match is - // found, then we jump to this label. This is either an `else` clause or - // an error handler. - LABEL *else_label = NEW_LABEL(location.line); - - // We're going to use this to uniquely identify each branch so that we - // can track coverage information. - rb_code_location_t case_location = { 0 }; - VALUE branches = Qfalse; - int branch_id = 0; - - if (PM_BRANCH_COVERAGE_P(iseq)) { - case_location = pm_code_location(scope_node, (const pm_node_t *) cast); - branches = decl_branch_base(iseq, PTR2NUM(cast), &case_location, "case"); - } - - // If there is only one pattern, then the behavior changes a bit. It - // effectively gets treated as a match required node (this is how it is - // represented in the other parser). - bool in_single_pattern = cast->else_clause == NULL && cast->conditions.size == 1; - - // First, we're going to push a bunch of stuff onto the stack that is - // going to serve as our scratch space. - if (in_single_pattern) { - PUSH_INSN(ret, location, putnil); // key error key - PUSH_INSN(ret, location, putnil); // key error matchee - PUSH_INSN1(ret, location, putobject, Qfalse); // key error? - PUSH_INSN(ret, location, putnil); // error string - } - - // Now we're going to compile the value to match against. - PUSH_INSN(ret, location, putnil); // deconstruct cache - PM_COMPILE_NOT_POPPED(cast->predicate); - - // Next, we'll loop through every in clause and compile its body into - // the body_seq anchor and its pattern into the cond_seq anchor. We'll - // make sure the pattern knows how to jump correctly into the body if it - // finds a match. - for (size_t index = 0; index < cast->conditions.size; index++) { - const pm_node_t *condition = cast->conditions.nodes[index]; - RUBY_ASSERT(PM_NODE_TYPE_P(condition, PM_IN_NODE)); - - const pm_in_node_t *in_node = (const pm_in_node_t *) condition; - const pm_node_location_t in_location = PM_NODE_START_LOCATION(parser, in_node); - const pm_node_location_t pattern_location = PM_NODE_START_LOCATION(parser, in_node->pattern); - - if (branch_id) { - PUSH_INSN(body_seq, in_location, putnil); - } - - LABEL *body_label = NEW_LABEL(in_location.line); - PUSH_LABEL(body_seq, body_label); - PUSH_INSN1(body_seq, in_location, adjuststack, INT2FIX(in_single_pattern ? 6 : 2)); - - // Establish branch coverage for the in clause. - if (PM_BRANCH_COVERAGE_P(iseq)) { - rb_code_location_t branch_location = pm_code_location(scope_node, in_node->statements != NULL ? ((const pm_node_t *) in_node->statements) : ((const pm_node_t *) in_node)); - add_trace_branch_coverage(iseq, body_seq, &branch_location, branch_location.beg_pos.column, branch_id++, "in", branches); - } - - if (in_node->statements != NULL) { - PM_COMPILE_INTO_ANCHOR(body_seq, (const pm_node_t *) in_node->statements); - } - else if (!popped) { - PUSH_SYNTHETIC_PUTNIL(body_seq, iseq); - } - - PUSH_INSNL(body_seq, in_location, jump, end_label); - LABEL *next_pattern_label = NEW_LABEL(pattern_location.line); - - PUSH_INSN(cond_seq, pattern_location, dup); - pm_compile_pattern(iseq, scope_node, in_node->pattern, cond_seq, body_label, next_pattern_label, in_single_pattern, false, true, 2); - PUSH_LABEL(cond_seq, next_pattern_label); - LABEL_UNREMOVABLE(next_pattern_label); - } - - if (cast->else_clause != NULL) { - // If we have an `else` clause, then this becomes our fallback (and - // there is no need to compile in code to potentially raise an - // error). - const pm_else_node_t *else_node = cast->else_clause; - - PUSH_LABEL(cond_seq, else_label); - PUSH_INSN(cond_seq, location, pop); - PUSH_INSN(cond_seq, location, pop); - - // Establish branch coverage for the else clause. - if (PM_BRANCH_COVERAGE_P(iseq)) { - rb_code_location_t branch_location = pm_code_location(scope_node, else_node->statements != NULL ? ((const pm_node_t *) else_node->statements) : ((const pm_node_t *) else_node)); - add_trace_branch_coverage(iseq, cond_seq, &branch_location, branch_location.beg_pos.column, branch_id, "else", branches); - } - - PM_COMPILE_INTO_ANCHOR(cond_seq, (const pm_node_t *) else_node); - PUSH_INSNL(cond_seq, location, jump, end_label); - PUSH_INSN(cond_seq, location, putnil); - if (popped) PUSH_INSN(cond_seq, location, putnil); - } - else { - // Otherwise, if we do not have an `else` clause, we will compile in - // the code to handle raising an appropriate error. - PUSH_LABEL(cond_seq, else_label); - - // Establish branch coverage for the implicit else clause. - add_trace_branch_coverage(iseq, cond_seq, &case_location, case_location.beg_pos.column, branch_id, "else", branches); - - if (in_single_pattern) { - pm_compile_pattern_error_handler(iseq, scope_node, node, cond_seq, end_label, popped); - } - else { - PUSH_INSN1(cond_seq, location, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); - PUSH_INSN1(cond_seq, location, putobject, rb_eNoMatchingPatternError); - PUSH_INSN1(cond_seq, location, topn, INT2FIX(2)); - PUSH_SEND(cond_seq, location, id_core_raise, INT2FIX(2)); - - PUSH_INSN1(cond_seq, location, adjuststack, INT2FIX(3)); - if (!popped) PUSH_INSN(cond_seq, location, putnil); - PUSH_INSNL(cond_seq, location, jump, end_label); - PUSH_INSN1(cond_seq, location, dupn, INT2FIX(1)); - if (popped) PUSH_INSN(cond_seq, location, putnil); - } - } - - // At the end of all of this compilation, we will add the code for the - // conditions first, then the various bodies, then mark the end of the - // entire sequence with the end label. - PUSH_SEQ(ret, cond_seq); - PUSH_SEQ(ret, body_seq); - PUSH_LABEL(ret, end_label); - + pm_compile_case_match_node(iseq, (const pm_case_match_node_t *) node, &location, ret, popped, scope_node); return; - } case PM_CLASS_NODE: { // class Foo; end // ^^^^^^^^^^^^^^ @@ -8006,174 +8682,26 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, ISEQ_COMPILE_DATA(iseq)->current_block = child_iseq; // Now, create the method call to each that will be used to iterate over - // the collection, and pass the newly created iseq as the block. - PUSH_SEND_WITH_BLOCK(ret, location, idEach, INT2FIX(0), child_iseq); - pm_compile_retry_end_label(iseq, ret, retry_end_l); - - if (popped) PUSH_INSN(ret, location, pop); - ISEQ_COMPILE_DATA(iseq)->current_block = prev_block; - PUSH_CATCH_ENTRY(CATCH_TYPE_BREAK, retry_label, retry_end_l, child_iseq, retry_end_l); - return; - } - case PM_FORWARDING_ARGUMENTS_NODE: { - rb_bug("Cannot compile a ForwardingArgumentsNode directly\n"); - return; - } - case PM_FORWARDING_SUPER_NODE: { - // super - // ^^^^^ - // - // super {} - // ^^^^^^^^ - const pm_forwarding_super_node_t *cast = (const pm_forwarding_super_node_t *) node; - const rb_iseq_t *block = NULL; - - const rb_iseq_t *previous_block = NULL; - LABEL *retry_label = NULL; - LABEL *retry_end_l = NULL; - - if (cast->block != NULL) { - previous_block = ISEQ_COMPILE_DATA(iseq)->current_block; - ISEQ_COMPILE_DATA(iseq)->current_block = NULL; - - retry_label = NEW_LABEL(location.line); - retry_end_l = NEW_LABEL(location.line); - - PUSH_LABEL(ret, retry_label); - } - else { - iseq_set_use_block(ISEQ_BODY(iseq)->local_iseq); - } - - PUSH_INSN(ret, location, putself); - int flag = VM_CALL_ZSUPER | VM_CALL_SUPER | VM_CALL_FCALL; - - if (cast->block != NULL) { - pm_scope_node_t next_scope_node; - pm_scope_node_init((const pm_node_t *) cast->block, &next_scope_node, scope_node); - - ISEQ_COMPILE_DATA(iseq)->current_block = block = NEW_CHILD_ISEQ(&next_scope_node, make_name_for_block(iseq), ISEQ_TYPE_BLOCK, location.line); - pm_scope_node_destroy(&next_scope_node); - RB_OBJ_WRITTEN(iseq, Qundef, (VALUE) block); - } - - DECL_ANCHOR(args); - INIT_ANCHOR(args); - - struct rb_iseq_constant_body *const body = ISEQ_BODY(iseq); - const rb_iseq_t *local_iseq = body->local_iseq; - const struct rb_iseq_constant_body *const local_body = ISEQ_BODY(local_iseq); - - int argc = 0; - int depth = get_lvar_level(iseq); - - if (ISEQ_BODY(ISEQ_BODY(iseq)->local_iseq)->param.flags.forwardable) { - flag |= VM_CALL_FORWARDING; - pm_local_index_t mult_local = pm_lookup_local_index(iseq, scope_node, PM_CONSTANT_DOT3, 0); - PUSH_GETLOCAL(ret, location, mult_local.index, mult_local.level); - PUSH_INSN2(ret, location, invokesuperforward, new_callinfo(iseq, 0, 0, flag, NULL, block != NULL), block); - if (popped) PUSH_INSN(ret, location, pop); - if (cast->block) { - ISEQ_COMPILE_DATA(iseq)->current_block = previous_block; - } - return; - } - - if (local_body->param.flags.has_lead) { - /* required arguments */ - for (int i = 0; i < local_body->param.lead_num; i++) { - int idx = local_body->local_table_size - i; - PUSH_GETLOCAL(args, location, idx, depth); - } - argc += local_body->param.lead_num; - } - - if (local_body->param.flags.has_opt) { - /* optional arguments */ - for (int j = 0; j < local_body->param.opt_num; j++) { - int idx = local_body->local_table_size - (argc + j); - PUSH_GETLOCAL(args, location, idx, depth); - } - argc += local_body->param.opt_num; - } - - if (local_body->param.flags.has_rest) { - /* rest argument */ - int idx = local_body->local_table_size - local_body->param.rest_start; - PUSH_GETLOCAL(args, location, idx, depth); - PUSH_INSN1(args, location, splatarray, Qfalse); - - argc = local_body->param.rest_start + 1; - flag |= VM_CALL_ARGS_SPLAT; - } - - if (local_body->param.flags.has_post) { - /* post arguments */ - int post_len = local_body->param.post_num; - int post_start = local_body->param.post_start; - - int j = 0; - for (; j < post_len; j++) { - int idx = local_body->local_table_size - (post_start + j); - PUSH_GETLOCAL(args, location, idx, depth); - } - - if (local_body->param.flags.has_rest) { - // argc remains unchanged from rest branch - PUSH_INSN1(args, location, newarray, INT2FIX(j)); - PUSH_INSN(args, location, concatarray); - } - else { - argc = post_len + post_start; - } - } - - const struct rb_iseq_param_keyword *const local_keyword = local_body->param.keyword; - if (local_body->param.flags.has_kw) { - int local_size = local_body->local_table_size; - argc++; - - PUSH_INSN1(args, location, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); - - if (local_body->param.flags.has_kwrest) { - int idx = local_body->local_table_size - local_keyword->rest_start; - PUSH_GETLOCAL(args, location, idx, depth); - RUBY_ASSERT(local_keyword->num > 0); - PUSH_SEND(args, location, rb_intern("dup"), INT2FIX(0)); - } - else { - PUSH_INSN1(args, location, newhash, INT2FIX(0)); - } - int i = 0; - for (; i < local_keyword->num; ++i) { - ID id = local_keyword->table[i]; - int idx = local_size - get_local_var_idx(local_iseq, id); - PUSH_INSN1(args, location, putobject, ID2SYM(id)); - PUSH_GETLOCAL(args, location, idx, depth); - } - - PUSH_SEND(args, location, id_core_hash_merge_ptr, INT2FIX(i * 2 + 1)); - flag |= VM_CALL_KW_SPLAT| VM_CALL_KW_SPLAT_MUT; - } - else if (local_body->param.flags.has_kwrest) { - int idx = local_body->local_table_size - local_keyword->rest_start; - PUSH_GETLOCAL(args, location, idx, depth); - argc++; - flag |= VM_CALL_KW_SPLAT; - } - - PUSH_SEQ(ret, args); - PUSH_INSN2(ret, location, invokesuper, new_callinfo(iseq, 0, argc, flag, NULL, block != NULL), block); - - if (cast->block != NULL) { - pm_compile_retry_end_label(iseq, ret, retry_end_l); - PUSH_CATCH_ENTRY(CATCH_TYPE_BREAK, retry_label, retry_end_l, block, retry_end_l); - ISEQ_COMPILE_DATA(iseq)->current_block = previous_block; - } + // the collection, and pass the newly created iseq as the block. + PUSH_SEND_WITH_BLOCK(ret, location, idEach, INT2FIX(0), child_iseq); + pm_compile_retry_end_label(iseq, ret, retry_end_l); if (popped) PUSH_INSN(ret, location, pop); + ISEQ_COMPILE_DATA(iseq)->current_block = prev_block; + PUSH_CATCH_ENTRY(CATCH_TYPE_BREAK, retry_label, retry_end_l, child_iseq, retry_end_l); return; } + case PM_FORWARDING_ARGUMENTS_NODE: + rb_bug("Cannot compile a ForwardingArgumentsNode directly\n"); + return; + case PM_FORWARDING_SUPER_NODE: + // super + // ^^^^^ + // + // super {} + // ^^^^^^^^ + pm_compile_forwarding_super_node(iseq, (const pm_forwarding_super_node_t *) node, &location, ret, popped, scope_node); + return; case PM_GLOBAL_VARIABLE_AND_WRITE_NODE: { // $foo &&= bar // ^^^^^^^^^^^^ @@ -8769,7 +9297,7 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, PUSH_LABEL(ret, done_label); return; } - case PM_MATCH_REQUIRED_NODE: { + case PM_MATCH_REQUIRED_NODE: // foo => bar // ^^^^^^^^^^ // @@ -8781,52 +9309,9 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, // This is somewhat analogous to compiling a case match statement with a // single pattern. In both cases, if the pattern fails it should // immediately raise an error. - const pm_match_required_node_t *cast = (const pm_match_required_node_t *) node; - - LABEL *matched_label = NEW_LABEL(location.line); - LABEL *unmatched_label = NEW_LABEL(location.line); - LABEL *done_label = NEW_LABEL(location.line); - - // First, we're going to push a bunch of stuff onto the stack that is - // going to serve as our scratch space. - PUSH_INSN(ret, location, putnil); // key error key - PUSH_INSN(ret, location, putnil); // key error matchee - PUSH_INSN1(ret, location, putobject, Qfalse); // key error? - PUSH_INSN(ret, location, putnil); // error string - PUSH_INSN(ret, location, putnil); // deconstruct cache - - // Next we're going to compile the value expression such that it's on - // the stack. - PM_COMPILE_NOT_POPPED(cast->value); - - // Here we'll dup it so that it can be used for comparison, but also be - // used for error handling. - PUSH_INSN(ret, location, dup); - - // Next we'll compile the pattern. We indicate to the pm_compile_pattern - // function that this is the only pattern that will be matched against - // through the in_single_pattern parameter. We also indicate that the - // value to compare against is 2 slots from the top of the stack (the - // base_index parameter). - pm_compile_pattern(iseq, scope_node, cast->pattern, ret, matched_label, unmatched_label, true, false, true, 2); - - // If the pattern did not match the value, then we're going to compile - // in our error handler code. This will determine which error to raise - // and raise it. - PUSH_LABEL(ret, unmatched_label); - pm_compile_pattern_error_handler(iseq, scope_node, node, ret, done_label, popped); - - // If the pattern did match, we'll clean up the values we've pushed onto - // the stack and then push nil onto the stack if it's not popped. - PUSH_LABEL(ret, matched_label); - PUSH_INSN1(ret, location, adjuststack, INT2FIX(6)); - if (!popped) PUSH_INSN(ret, location, putnil); - PUSH_INSNL(ret, location, jump, done_label); - - PUSH_LABEL(ret, done_label); + pm_compile_match_required_node(iseq, (const pm_match_required_node_t *) node, &location, ret, popped, scope_node); return; - } - case PM_MATCH_WRITE_NODE: { + case PM_MATCH_WRITE_NODE: // /(?foo)/ =~ bar // ^^^^^^^^^^^^^^^^^^^^ // @@ -8835,81 +9320,11 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, // operator, and some value on the right. The nodes themselves simply // wrap the call with the local variable targets that will be written // when the call is executed. - const pm_match_write_node_t *cast = (const pm_match_write_node_t *) node; - LABEL *fail_label = NEW_LABEL(location.line); - LABEL *end_label = NEW_LABEL(location.line); - - // First, we'll compile the call so that all of its instructions are - // present. Then we'll compile all of the local variable targets. - PM_COMPILE_NOT_POPPED((const pm_node_t *) cast->call); - - // Now, check if the match was successful. If it was, then we'll - // continue on and assign local variables. Otherwise we'll skip over the - // assignment code. - PUSH_INSN1(ret, location, getglobal, rb_id2sym(idBACKREF)); - PUSH_INSN(ret, location, dup); - PUSH_INSNL(ret, location, branchunless, fail_label); - - // If there's only a single local variable target, we can skip some of - // the bookkeeping, so we'll put a special branch here. - size_t targets_count = cast->targets.size; - - if (targets_count == 1) { - const pm_node_t *target = cast->targets.nodes[0]; - RUBY_ASSERT(PM_NODE_TYPE_P(target, PM_LOCAL_VARIABLE_TARGET_NODE)); - - const pm_local_variable_target_node_t *local_target = (const pm_local_variable_target_node_t *) target; - pm_local_index_t index = pm_lookup_local_index(iseq, scope_node, local_target->name, local_target->depth); - - PUSH_INSN1(ret, location, putobject, rb_id2sym(pm_constant_id_lookup(scope_node, local_target->name))); - PUSH_SEND(ret, location, idAREF, INT2FIX(1)); - PUSH_LABEL(ret, fail_label); - PUSH_SETLOCAL(ret, location, index.index, index.level); - if (popped) PUSH_INSN(ret, location, pop); - return; - } - - DECL_ANCHOR(fail_anchor); - INIT_ANCHOR(fail_anchor); - - // Otherwise there is more than one local variable target, so we'll need - // to do some bookkeeping. - for (size_t targets_index = 0; targets_index < targets_count; targets_index++) { - const pm_node_t *target = cast->targets.nodes[targets_index]; - RUBY_ASSERT(PM_NODE_TYPE_P(target, PM_LOCAL_VARIABLE_TARGET_NODE)); - - const pm_local_variable_target_node_t *local_target = (const pm_local_variable_target_node_t *) target; - pm_local_index_t index = pm_lookup_local_index(iseq, scope_node, local_target->name, local_target->depth); - - if (((size_t) targets_index) < (targets_count - 1)) { - PUSH_INSN(ret, location, dup); - } - PUSH_INSN1(ret, location, putobject, rb_id2sym(pm_constant_id_lookup(scope_node, local_target->name))); - PUSH_SEND(ret, location, idAREF, INT2FIX(1)); - PUSH_SETLOCAL(ret, location, index.index, index.level); - - PUSH_INSN(fail_anchor, location, putnil); - PUSH_SETLOCAL(fail_anchor, location, index.index, index.level); - } - - // Since we matched successfully, now we'll jump to the end. - PUSH_INSNL(ret, location, jump, end_label); - - // In the case that the match failed, we'll loop through each local - // variable target and set all of them to `nil`. - PUSH_LABEL(ret, fail_label); - PUSH_INSN(ret, location, pop); - PUSH_SEQ(ret, fail_anchor); - - // Finally, we can push the end label for either case. - PUSH_LABEL(ret, end_label); - if (popped) PUSH_INSN(ret, location, pop); + pm_compile_match_write_node(iseq, (const pm_match_write_node_t *) node, &location, ret, popped, scope_node); return; - } - case PM_MISSING_NODE: { + case PM_MISSING_NODE: rb_bug("A pm_missing_node_t should not exist in prism's AST."); return; - } case PM_MODULE_NODE: { // module Foo; end // ^^^^^^^^^^^^^^^ @@ -8979,96 +9394,14 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, PUSH_SEQ(ret, cleanup); return; } - case PM_NEXT_NODE: { + case PM_NEXT_NODE: // next // ^^^^ // // next foo // ^^^^^^^^ - const pm_next_node_t *cast = (const pm_next_node_t *) node; - - if (ISEQ_COMPILE_DATA(iseq)->redo_label != 0 && can_add_ensure_iseq(iseq)) { - LABEL *splabel = NEW_LABEL(0); - PUSH_LABEL(ret, splabel); - - if (cast->arguments) { - PM_COMPILE_NOT_POPPED((const pm_node_t *) cast->arguments); - } - else { - PUSH_INSN(ret, location, putnil); - } - pm_add_ensure_iseq(ret, iseq, 0, scope_node); - - PUSH_ADJUST(ret, location, ISEQ_COMPILE_DATA(iseq)->redo_label); - PUSH_INSNL(ret, location, jump, ISEQ_COMPILE_DATA(iseq)->start_label); - - PUSH_ADJUST_RESTORE(ret, splabel); - if (!popped) PUSH_INSN(ret, location, putnil); - } - else if (ISEQ_COMPILE_DATA(iseq)->end_label && can_add_ensure_iseq(iseq)) { - LABEL *splabel = NEW_LABEL(0); - - PUSH_LABEL(ret, splabel); - PUSH_ADJUST(ret, location, ISEQ_COMPILE_DATA(iseq)->start_label); - - if (cast->arguments != NULL) { - PM_COMPILE_NOT_POPPED((const pm_node_t *) cast->arguments); - } - else { - PUSH_INSN(ret, location, putnil); - } - - pm_add_ensure_iseq(ret, iseq, 0, scope_node); - PUSH_INSNL(ret, location, jump, ISEQ_COMPILE_DATA(iseq)->end_label); - PUSH_ADJUST_RESTORE(ret, splabel); - splabel->unremovable = FALSE; - - if (!popped) PUSH_INSN(ret, location, putnil); - } - else { - const rb_iseq_t *ip = iseq; - unsigned long throw_flag = 0; - - while (ip) { - if (!ISEQ_COMPILE_DATA(ip)) { - ip = 0; - break; - } - - throw_flag = VM_THROW_NO_ESCAPE_FLAG; - if (ISEQ_COMPILE_DATA(ip)->redo_label != 0) { - /* while loop */ - break; - } - else if (ISEQ_BODY(ip)->type == ISEQ_TYPE_BLOCK) { - break; - } - else if (ISEQ_BODY(ip)->type == ISEQ_TYPE_EVAL) { - COMPILE_ERROR(iseq, location.line, "Invalid next"); - return; - } - - ip = ISEQ_BODY(ip)->parent_iseq; - } - if (ip != 0) { - if (cast->arguments) { - PM_COMPILE_NOT_POPPED((const pm_node_t *) cast->arguments); - } - else { - PUSH_INSN(ret, location, putnil); - } - - PUSH_INSN1(ret, location, throw, INT2FIX(throw_flag | TAG_NEXT)); - if (popped) PUSH_INSN(ret, location, pop); - } - else { - COMPILE_ERROR(iseq, location.line, "Invalid next"); - return; - } - } - + pm_compile_next_node(iseq, (const pm_next_node_t *) node, &location, ret, popped, scope_node); return; - } case PM_NIL_NODE: { // nil // ^^^ @@ -9256,66 +9589,11 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, } return; } - case PM_REDO_NODE: { + case PM_REDO_NODE: // redo // ^^^^ - if (ISEQ_COMPILE_DATA(iseq)->redo_label && can_add_ensure_iseq(iseq)) { - LABEL *splabel = NEW_LABEL(0); - - PUSH_LABEL(ret, splabel); - PUSH_ADJUST(ret, location, ISEQ_COMPILE_DATA(iseq)->redo_label); - pm_add_ensure_iseq(ret, iseq, 0, scope_node); - - PUSH_INSNL(ret, location, jump, ISEQ_COMPILE_DATA(iseq)->redo_label); - PUSH_ADJUST_RESTORE(ret, splabel); - if (!popped) PUSH_INSN(ret, location, putnil); - } - else if (ISEQ_BODY(iseq)->type != ISEQ_TYPE_EVAL && ISEQ_COMPILE_DATA(iseq)->start_label && can_add_ensure_iseq(iseq)) { - LABEL *splabel = NEW_LABEL(0); - - PUSH_LABEL(ret, splabel); - pm_add_ensure_iseq(ret, iseq, 0, scope_node); - PUSH_ADJUST(ret, location, ISEQ_COMPILE_DATA(iseq)->start_label); - - PUSH_INSNL(ret, location, jump, ISEQ_COMPILE_DATA(iseq)->start_label); - PUSH_ADJUST_RESTORE(ret, splabel); - if (!popped) PUSH_INSN(ret, location, putnil); - } - else { - const rb_iseq_t *ip = iseq; - - while (ip) { - if (!ISEQ_COMPILE_DATA(ip)) { - ip = 0; - break; - } - - if (ISEQ_COMPILE_DATA(ip)->redo_label != 0) { - break; - } - else if (ISEQ_BODY(ip)->type == ISEQ_TYPE_BLOCK) { - break; - } - else if (ISEQ_BODY(ip)->type == ISEQ_TYPE_EVAL) { - COMPILE_ERROR(iseq, location.line, "Invalid redo"); - return; - } - - ip = ISEQ_BODY(ip)->parent_iseq; - } - - if (ip != 0) { - PUSH_INSN(ret, location, putnil); - PUSH_INSN1(ret, location, throw, INT2FIX(VM_THROW_NO_ESCAPE_FLAG | TAG_REDO)); - if (popped) PUSH_INSN(ret, location, pop); - } - else { - COMPILE_ERROR(iseq, location.line, "Invalid redo"); - return; - } - } + pm_compile_redo_node(iseq, &location, ret, popped, scope_node); return; - } case PM_REGULAR_EXPRESSION_NODE: { // /foo/ // ^^^^^ @@ -9325,106 +9603,11 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, } return; } - case PM_RESCUE_NODE: { + case PM_RESCUE_NODE: // begin; rescue; end // ^^^^^^^ - const pm_rescue_node_t *cast = (const pm_rescue_node_t *) node; - iseq_set_exception_local_table(iseq); - - // First, establish the labels that we need to be able to jump to within - // this compilation block. - LABEL *exception_match_label = NEW_LABEL(location.line); - LABEL *rescue_end_label = NEW_LABEL(location.line); - - // Next, compile each of the exceptions that we're going to be - // handling. For each one, we'll add instructions to check if the - // exception matches the raised one, and if it does then jump to the - // exception_match_label label. Otherwise it will fall through to the - // subsequent check. If there are no exceptions, we'll only check - // StandardError. - const pm_node_list_t *exceptions = &cast->exceptions; - - if (exceptions->size > 0) { - for (size_t index = 0; index < exceptions->size; index++) { - PUSH_GETLOCAL(ret, location, LVAR_ERRINFO, 0); - PM_COMPILE(exceptions->nodes[index]); - int checkmatch_flags = VM_CHECKMATCH_TYPE_RESCUE; - if (PM_NODE_TYPE_P(exceptions->nodes[index], PM_SPLAT_NODE)) { - checkmatch_flags |= VM_CHECKMATCH_ARRAY; - } - PUSH_INSN1(ret, location, checkmatch, INT2FIX(checkmatch_flags)); - PUSH_INSNL(ret, location, branchif, exception_match_label); - } - } - else { - PUSH_GETLOCAL(ret, location, LVAR_ERRINFO, 0); - PUSH_INSN1(ret, location, putobject, rb_eStandardError); - PUSH_INSN1(ret, location, checkmatch, INT2FIX(VM_CHECKMATCH_TYPE_RESCUE)); - PUSH_INSNL(ret, location, branchif, exception_match_label); - } - - // If none of the exceptions that we are matching against matched, then - // we'll jump straight to the rescue_end_label label. - PUSH_INSNL(ret, location, jump, rescue_end_label); - - // Here we have the exception_match_label, which is where the - // control-flow goes in the case that one of the exceptions matched. - // Here we will compile the instructions to handle the exception. - PUSH_LABEL(ret, exception_match_label); - PUSH_TRACE(ret, RUBY_EVENT_RESCUE); - - // If we have a reference to the exception, then we'll compile the write - // into the instruction sequence. This can look quite different - // depending on the kind of write being performed. - if (cast->reference) { - DECL_ANCHOR(writes); - INIT_ANCHOR(writes); - - DECL_ANCHOR(cleanup); - INIT_ANCHOR(cleanup); - - pm_compile_target_node(iseq, cast->reference, ret, writes, cleanup, scope_node, NULL); - PUSH_GETLOCAL(ret, location, LVAR_ERRINFO, 0); - - PUSH_SEQ(ret, writes); - PUSH_SEQ(ret, cleanup); - } - - // If we have statements to execute, we'll compile them here. Otherwise - // we'll push nil onto the stack. - if (cast->statements) { - // We'll temporarily remove the end_label location from the iseq - // when compiling the statements so that next/redo statements - // inside the body will throw to the correct place instead of - // jumping straight to the end of this iseq - LABEL *prev_end = ISEQ_COMPILE_DATA(iseq)->end_label; - ISEQ_COMPILE_DATA(iseq)->end_label = NULL; - - PM_COMPILE((const pm_node_t *) cast->statements); - - // Now restore the end_label - ISEQ_COMPILE_DATA(iseq)->end_label = prev_end; - } - else { - PUSH_INSN(ret, location, putnil); - } - - PUSH_INSN(ret, location, leave); - - // Here we'll insert the rescue_end_label label, which is jumped to if - // none of the exceptions matched. It will cause the control-flow to - // either jump to the next rescue clause or it will fall through to the - // subsequent instruction returning the raised error. - PUSH_LABEL(ret, rescue_end_label); - if (cast->subsequent) { - PM_COMPILE((const pm_node_t *) cast->subsequent); - } - else { - PUSH_GETLOCAL(ret, location, 1, 0); - } - + pm_compile_rescue_node(iseq, (const pm_rescue_node_t *) node, &location, ret, popped, scope_node); return; - } case PM_RESCUE_MODIFIER_NODE: { // foo rescue bar // ^^^^^^^^^^^^^^ @@ -9461,66 +9644,14 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, PUSH_CATCH_ENTRY(CATCH_TYPE_RETRY, lend, lcont, NULL, lstart); return; } - case PM_RETURN_NODE: { + case PM_RETURN_NODE: // return // ^^^^^^ // // return 1 // ^^^^^^^^ - const pm_return_node_t *cast = (const pm_return_node_t *) node; - const pm_arguments_node_t *arguments = cast->arguments; - - enum rb_iseq_type type = ISEQ_BODY(iseq)->type; - LABEL *splabel = 0; - - const rb_iseq_t *parent_iseq = iseq; - enum rb_iseq_type parent_type = ISEQ_BODY(parent_iseq)->type; - while (parent_type == ISEQ_TYPE_RESCUE || parent_type == ISEQ_TYPE_ENSURE) { - if (!(parent_iseq = ISEQ_BODY(parent_iseq)->parent_iseq)) break; - parent_type = ISEQ_BODY(parent_iseq)->type; - } - - switch (parent_type) { - case ISEQ_TYPE_TOP: - case ISEQ_TYPE_MAIN: - if (arguments) { - rb_warn("argument of top-level return is ignored"); - } - if (parent_iseq == iseq) { - type = ISEQ_TYPE_METHOD; - } - break; - default: - break; - } - - if (type == ISEQ_TYPE_METHOD) { - splabel = NEW_LABEL(0); - PUSH_LABEL(ret, splabel); - PUSH_ADJUST(ret, location, 0); - } - - if (arguments) { - PM_COMPILE_NOT_POPPED((const pm_node_t *) arguments); - } - else { - PUSH_INSN(ret, location, putnil); - } - - if (type == ISEQ_TYPE_METHOD && can_add_ensure_iseq(iseq)) { - pm_add_ensure_iseq(ret, iseq, 1, scope_node); - PUSH_TRACE(ret, RUBY_EVENT_RETURN); - PUSH_INSN(ret, location, leave); - PUSH_ADJUST_RESTORE(ret, splabel); - if (!popped) PUSH_INSN(ret, location, putnil); - } - else { - PUSH_INSN1(ret, location, throw, INT2FIX(TAG_RETURN)); - if (popped) PUSH_INSN(ret, location, pop); - } - + pm_compile_return_node(iseq, (const pm_return_node_t *) node, &location, ret, popped, scope_node); return; - } case PM_RETRY_NODE: { // retry // ^^^^^ @@ -9691,63 +9822,12 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, } return; } - case PM_SUPER_NODE: { // any super with arguments or `super()` + case PM_SUPER_NODE: // super() // super(foo) // super(...) - const pm_super_node_t *cast = (const pm_super_node_t *) node; - - DECL_ANCHOR(args); - INIT_ANCHOR(args); - - LABEL *retry_label = NEW_LABEL(location.line); - LABEL *retry_end_l = NEW_LABEL(location.line); - - const rb_iseq_t *previous_block = ISEQ_COMPILE_DATA(iseq)->current_block; - const rb_iseq_t *current_block; - ISEQ_COMPILE_DATA(iseq)->current_block = current_block = NULL; - - PUSH_LABEL(ret, retry_label); - PUSH_INSN(ret, location, putself); - - int flags = 0; - struct rb_callinfo_kwarg *keywords = NULL; - int argc = pm_setup_args(cast->arguments, cast->block, &flags, &keywords, iseq, ret, scope_node, &location); - bool is_forwardable = (cast->arguments != NULL) && PM_NODE_FLAG_P(cast->arguments, PM_ARGUMENTS_NODE_FLAGS_CONTAINS_FORWARDING); - flags |= VM_CALL_SUPER | VM_CALL_FCALL; - - if (cast->block && PM_NODE_TYPE_P(cast->block, PM_BLOCK_NODE)) { - pm_scope_node_t next_scope_node; - pm_scope_node_init(cast->block, &next_scope_node, scope_node); - - ISEQ_COMPILE_DATA(iseq)->current_block = current_block = NEW_CHILD_ISEQ(&next_scope_node, make_name_for_block(iseq), ISEQ_TYPE_BLOCK, lineno); - pm_scope_node_destroy(&next_scope_node); - } - - if (!cast->block) { - iseq_set_use_block(ISEQ_BODY(iseq)->local_iseq); - } - - if ((flags & VM_CALL_ARGS_BLOCKARG) && (flags & VM_CALL_KW_SPLAT) && !(flags & VM_CALL_KW_SPLAT_MUT)) { - PUSH_INSN(args, location, splatkw); - } - - PUSH_SEQ(ret, args); - if (is_forwardable && ISEQ_BODY(ISEQ_BODY(iseq)->local_iseq)->param.flags.forwardable) { - flags |= VM_CALL_FORWARDING; - PUSH_INSN2(ret, location, invokesuperforward, new_callinfo(iseq, 0, argc, flags, keywords, current_block != NULL), current_block); - } - else { - PUSH_INSN2(ret, location, invokesuper, new_callinfo(iseq, 0, argc, flags, keywords, current_block != NULL), current_block); - pm_compile_retry_end_label(iseq, ret, retry_end_l); - } - - if (popped) PUSH_INSN(ret, location, pop); - ISEQ_COMPILE_DATA(iseq)->current_block = previous_block; - PUSH_CATCH_ENTRY(CATCH_TYPE_BREAK, retry_label, retry_end_l, current_block, retry_end_l); - + pm_compile_super_node(iseq, (const pm_super_node_t *) node, &location, ret, popped, scope_node); return; - } case PM_SYMBOL_NODE: { // :foo // ^^^^ @@ -9834,47 +9914,17 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, return; } - case PM_YIELD_NODE: { + case PM_YIELD_NODE: // yield // ^^^^^ // // yield 1 // ^^^^^^^ - const pm_yield_node_t *cast = (const pm_yield_node_t *) node; - - switch (ISEQ_BODY(ISEQ_BODY(iseq)->local_iseq)->type) { - case ISEQ_TYPE_TOP: - case ISEQ_TYPE_MAIN: - case ISEQ_TYPE_CLASS: - COMPILE_ERROR(iseq, location.line, "Invalid yield"); - return; - default: /* valid */; - } - - int argc = 0; - int flags = 0; - struct rb_callinfo_kwarg *keywords = NULL; - - if (cast->arguments) { - argc = pm_setup_args(cast->arguments, NULL, &flags, &keywords, iseq, ret, scope_node, &location); - } - - PUSH_INSN1(ret, location, invokeblock, new_callinfo(iseq, 0, argc, flags, keywords, FALSE)); - iseq_set_use_block(ISEQ_BODY(iseq)->local_iseq); - if (popped) PUSH_INSN(ret, location, pop); - - int level = 0; - for (const rb_iseq_t *tmp_iseq = iseq; tmp_iseq != ISEQ_BODY(iseq)->local_iseq; level++) { - tmp_iseq = ISEQ_BODY(tmp_iseq)->parent_iseq; - } - - if (level > 0) access_outer_variables(iseq, level, rb_intern("yield"), true); + pm_compile_yield_node(iseq, (const pm_yield_node_t *) node, &location, ret, popped, scope_node); return; - } - default: { + default: rb_raise(rb_eNotImpError, "node type %s not implemented", pm_node_type_to_str(PM_NODE_TYPE(node))); return; - } } } From 6b46060fc29055b1e1d38da83959f4f2c98edfb1 Mon Sep 17 00:00:00 2001 From: masatoshi_moritsuka Date: Sun, 1 Jan 2023 19:15:12 +0900 Subject: [PATCH 437/829] doc: Remove description of experimental warnings related pattern matching from documentation Ruby 3.2.0 has been released and all experimental warnings about pattern matching have been removed. Experimental warnings about pattern matching are no longer output, so I remove description about it from documentation as well. cf. https://bugs.ruby-lang.org/issues/18585 cf. db6b23c76cbc7888cd9a9912790c2068703afdd0 cf. https://twitter.com/k_tsj/status/1606956336037900289?s=20&t=-_PSYLhYPtYsB9FZhtXl5A --- doc/syntax.rdoc | 2 +- doc/syntax/control_expressions.rdoc | 2 +- error.c | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/doc/syntax.rdoc b/doc/syntax.rdoc index 6ca58435126e4c..cb427b6f0f03a2 100644 --- a/doc/syntax.rdoc +++ b/doc/syntax.rdoc @@ -12,7 +12,7 @@ Assignment[rdoc-ref:syntax/assignment.rdoc] :: +if+, +unless+, +while+, +until+, +for+, +break+, +next+, +redo+ {Pattern matching}[rdoc-ref:syntax/pattern_matching.rdoc] :: - Experimental structural pattern matching and variable binding syntax + Structural pattern matching and variable binding syntax Methods[rdoc-ref:syntax/methods.rdoc] :: Method and method argument syntax diff --git a/doc/syntax/control_expressions.rdoc b/doc/syntax/control_expressions.rdoc index 9126289389e0b7..3de6cd293f55c8 100644 --- a/doc/syntax/control_expressions.rdoc +++ b/doc/syntax/control_expressions.rdoc @@ -255,7 +255,7 @@ Again, the +then+ and +else+ are optional. The result value of a +case+ expression is the last value executed in the expression. -Since Ruby 2.7, +case+ expressions also provide a more powerful experimental +Since Ruby 2.7, +case+ expressions also provide a more powerful pattern matching feature via the +in+ keyword: case {a: 1, b: 2, c: 3} diff --git a/error.c b/error.c index ef646c55c7f996..acd92c893db4f9 100644 --- a/error.c +++ b/error.c @@ -217,7 +217,6 @@ rb_warning_category_enabled_p(rb_warning_category_t category) * * +:experimental+ :: * experimental features - * * Pattern matching * * +:performance+ :: * performance hints From 31a88d1554550a7c70fd63991051890c4fd71ac7 Mon Sep 17 00:00:00 2001 From: ydah Date: Wed, 11 Sep 2024 16:17:15 +0900 Subject: [PATCH 438/829] Implement RETURN NODE keyword locations --- ast.c | 4 ++++ node_dump.c | 3 ++- parse.y | 11 ++++++----- rubyparser.h | 1 + test/ruby/test_ast.rb | 8 ++++++++ 5 files changed, 21 insertions(+), 6 deletions(-) diff --git a/ast.c b/ast.c index ae28db4414c143..a3490823ae396a 100644 --- a/ast.c +++ b/ast.c @@ -814,6 +814,10 @@ node_locations(VALUE ast_value, const NODE *node) return rb_ary_new_from_args(2, location_new(nd_code_loc(node)), location_new(&RNODE_REDO(node)->keyword_loc)); + case NODE_RETURN: + return rb_ary_new_from_args(2, + location_new(nd_code_loc(node)), + location_new(&RNODE_RETURN(node)->keyword_loc)); case NODE_UNDEF: return rb_ary_new_from_args(2, location_new(nd_code_loc(node)), diff --git a/node_dump.c b/node_dump.c index 8f30ed2dce00e8..0555d11cdc0042 100644 --- a/node_dump.c +++ b/node_dump.c @@ -374,8 +374,9 @@ dump_node(VALUE buf, VALUE indent, int comment, const NODE * node) ANN("return statement"); ANN("format: return [nd_stts]"); ANN("example: return 1"); - LAST_NODE; F_NODE(nd_stts, RNODE_RETURN, "value"); + LAST_NODE; + F_LOC(keyword_loc, RNODE_RETURN); return; case NODE_REDO: diff --git a/parse.y b/parse.y index 17d5749004d45e..aa87d16a09d77f 100644 --- a/parse.y +++ b/parse.y @@ -1103,7 +1103,7 @@ static rb_node_list_t *rb_node_list_new(struct parser_params *p, NODE *nd_head, static rb_node_list_t *rb_node_list_new2(struct parser_params *p, NODE *nd_head, long nd_alen, NODE *nd_next, const YYLTYPE *loc); static rb_node_zlist_t *rb_node_zlist_new(struct parser_params *p, const YYLTYPE *loc); static rb_node_hash_t *rb_node_hash_new(struct parser_params *p, NODE *nd_head, const YYLTYPE *loc); -static rb_node_return_t *rb_node_return_new(struct parser_params *p, NODE *nd_stts, const YYLTYPE *loc); +static rb_node_return_t *rb_node_return_new(struct parser_params *p, NODE *nd_stts, const YYLTYPE *loc, const YYLTYPE *keyword_loc); static rb_node_yield_t *rb_node_yield_new(struct parser_params *p, NODE *nd_head, const YYLTYPE *loc); static rb_node_lvar_t *rb_node_lvar_new(struct parser_params *p, ID nd_vid, const YYLTYPE *loc); static rb_node_dvar_t *rb_node_dvar_new(struct parser_params *p, ID nd_vid, const YYLTYPE *loc); @@ -1211,7 +1211,7 @@ static rb_node_error_t *rb_node_error_new(struct parser_params *p, const YYLTYPE #define NEW_LIST2(h,l,n,loc) (NODE *)rb_node_list_new2(p,h,l,n,loc) #define NEW_ZLIST(loc) (NODE *)rb_node_zlist_new(p,loc) #define NEW_HASH(a,loc) (NODE *)rb_node_hash_new(p,a,loc) -#define NEW_RETURN(s,loc) (NODE *)rb_node_return_new(p,s,loc) +#define NEW_RETURN(s,loc,k_loc) (NODE *)rb_node_return_new(p,s,loc,k_loc) #define NEW_YIELD(a,loc) (NODE *)rb_node_yield_new(p,a,loc) #define NEW_LVAR(v,loc) (NODE *)rb_node_lvar_new(p,v,loc) #define NEW_DVAR(v,loc) (NODE *)rb_node_dvar_new(p,v,loc) @@ -3531,7 +3531,7 @@ command : fcall command_args %prec tLOWEST } | k_return call_args { - $$ = NEW_RETURN(ret_args(p, $2), &@$); + $$ = NEW_RETURN(ret_args(p, $2), &@$, &@1); /*% ripper: return!($:2) %*/ } | keyword_break call_args @@ -4457,7 +4457,7 @@ primary : literal } | k_return { - $$ = NEW_RETURN(0, &@$); + $$ = NEW_RETURN(0, &@$, &@1); /*% ripper: return0! %*/ } | k_yield '(' call_args rparen @@ -11511,10 +11511,11 @@ rb_node_or_new(struct parser_params *p, NODE *nd_1st, NODE *nd_2nd, const YYLTYP } static rb_node_return_t * -rb_node_return_new(struct parser_params *p, NODE *nd_stts, const YYLTYPE *loc) +rb_node_return_new(struct parser_params *p, NODE *nd_stts, const YYLTYPE *loc, const YYLTYPE *keyword_loc) { rb_node_return_t *n = NODE_NEWNODE(NODE_RETURN, rb_node_return_t, loc); n->nd_stts = nd_stts; + n->keyword_loc = *keyword_loc; return n; } diff --git a/rubyparser.h b/rubyparser.h index 6a016155bce1c4..cfa881ac4161a1 100644 --- a/rubyparser.h +++ b/rubyparser.h @@ -573,6 +573,7 @@ typedef struct RNode_RETURN { NODE node; struct RNode *nd_stts; + rb_code_location_t keyword_loc; } rb_node_return_t; typedef struct RNode_YIELD { diff --git a/test/ruby/test_ast.rb b/test/ruby/test_ast.rb index 06fb3c56c0a8b6..38c0d56a0f8d98 100644 --- a/test/ruby/test_ast.rb +++ b/test/ruby/test_ast.rb @@ -1386,6 +1386,14 @@ def test_redo_locations assert_locations(node.children[-1].children[-1].children[-1].locations, [[1, 7, 1, 11], [1, 7, 1, 11]]) end + def test_return_locations + node = ast_parse("return 1") + assert_locations(node.children[-1].locations, [[1, 0, 1, 8], [1, 0, 1, 6]]) + + node = ast_parse("return") + assert_locations(node.children[-1].locations, [[1, 0, 1, 6], [1, 0, 1, 6]]) + end + def test_unless_locations node = ast_parse("unless cond then 1 else 2 end") assert_locations(node.children[-1].locations, [[1, 0, 1, 29], [1, 0, 1, 6], [1, 12, 1, 16], [1, 26, 1, 29]]) From 509b577e0126d92f37ae45d83863c449f8666be1 Mon Sep 17 00:00:00 2001 From: ydah Date: Tue, 24 Sep 2024 14:49:00 +0900 Subject: [PATCH 439/829] Implement BLOCK_PASS NODE keyword locations --- ast.c | 5 +++++ node_dump.c | 3 ++- parse.y | 13 +++++++------ rubyparser.h | 1 + test/ruby/test_ast.rb | 8 ++++++++ 5 files changed, 23 insertions(+), 7 deletions(-) diff --git a/ast.c b/ast.c index a3490823ae396a..d2bc60c3e1c21a 100644 --- a/ast.c +++ b/ast.c @@ -783,6 +783,11 @@ node_locations(VALUE ast_value, const NODE *node) return rb_ary_new_from_args(2, location_new(nd_code_loc(node)), location_new(&RNODE_AND(node)->operator_loc)); + case NODE_BLOCK_PASS: + return rb_ary_new_from_args(2, + location_new(nd_code_loc(node)), + location_new(&RNODE_BLOCK_PASS(node)->operator_loc)); + case NODE_BREAK: return rb_ary_new_from_args(2, location_new(nd_code_loc(node)), diff --git a/node_dump.c b/node_dump.c index 0555d11cdc0042..ad248aea740085 100644 --- a/node_dump.c +++ b/node_dump.c @@ -910,8 +910,9 @@ dump_node(VALUE buf, VALUE indent, int comment, const NODE * node) } } F_NODE(nd_head, RNODE_BLOCK_PASS, "other arguments"); - LAST_NODE; F_NODE(nd_body, RNODE_BLOCK_PASS, "block argument"); + LAST_NODE; + F_LOC(operator_loc, RNODE_BLOCK_PASS); return; case NODE_DEFN: diff --git a/parse.y b/parse.y index aa87d16a09d77f..4fad1cd812cf23 100644 --- a/parse.y +++ b/parse.y @@ -1135,7 +1135,7 @@ static rb_node_postarg_t *rb_node_postarg_new(struct parser_params *p, NODE *nd_ static rb_node_argscat_t *rb_node_argscat_new(struct parser_params *p, NODE *nd_head, NODE *nd_body, const YYLTYPE *loc); static rb_node_argspush_t *rb_node_argspush_new(struct parser_params *p, NODE *nd_head, NODE *nd_body, const YYLTYPE *loc); static rb_node_splat_t *rb_node_splat_new(struct parser_params *p, NODE *nd_head, const YYLTYPE *loc); -static rb_node_block_pass_t *rb_node_block_pass_new(struct parser_params *p, NODE *nd_body, const YYLTYPE *loc); +static rb_node_block_pass_t *rb_node_block_pass_new(struct parser_params *p, NODE *nd_body, const YYLTYPE *loc, const YYLTYPE *operator_loc); static rb_node_defn_t *rb_node_defn_new(struct parser_params *p, ID nd_mid, NODE *nd_defn, const YYLTYPE *loc); static rb_node_defs_t *rb_node_defs_new(struct parser_params *p, NODE *nd_recv, ID nd_mid, NODE *nd_defn, const YYLTYPE *loc); static rb_node_alias_t *rb_node_alias_new(struct parser_params *p, NODE *nd_1st, NODE *nd_2nd, const YYLTYPE *loc, const YYLTYPE *keyword_loc); @@ -1243,7 +1243,7 @@ static rb_node_error_t *rb_node_error_new(struct parser_params *p, const YYLTYPE #define NEW_ARGSCAT(a,b,loc) (NODE *)rb_node_argscat_new(p,a,b,loc) #define NEW_ARGSPUSH(a,b,loc) (NODE *)rb_node_argspush_new(p,a,b,loc) #define NEW_SPLAT(a,loc) (NODE *)rb_node_splat_new(p,a,loc) -#define NEW_BLOCK_PASS(b,loc) rb_node_block_pass_new(p,b,loc) +#define NEW_BLOCK_PASS(b,loc,o_loc) rb_node_block_pass_new(p,b,loc,o_loc) #define NEW_DEFN(i,s,loc) (NODE *)rb_node_defn_new(p,i,s,loc) #define NEW_DEFS(r,i,s,loc) (NODE *)rb_node_defs_new(p,r,i,s,loc) #define NEW_ALIAS(n,o,loc,k_loc) (NODE *)rb_node_alias_new(p,n,o,loc,k_loc) @@ -4311,13 +4311,13 @@ command_args : { block_arg : tAMPER arg_value { - $$ = NEW_BLOCK_PASS($2, &@$); + $$ = NEW_BLOCK_PASS($2, &@$, &@1); /*% ripper: $:2 %*/ } | tAMPER { forwarding_arg_check(p, idFWD_BLOCK, idFWD_ALL, "block"); - $$ = NEW_BLOCK_PASS(NEW_LVAR(idFWD_BLOCK, &@1), &@$); + $$ = NEW_BLOCK_PASS(NEW_LVAR(idFWD_BLOCK, &@1), &@$, &@1); /*% ripper: Qnil %*/ } ; @@ -12301,12 +12301,13 @@ rb_node_splat_new(struct parser_params *p, NODE *nd_head, const YYLTYPE *loc) } static rb_node_block_pass_t * -rb_node_block_pass_new(struct parser_params *p, NODE *nd_body, const YYLTYPE *loc) +rb_node_block_pass_new(struct parser_params *p, NODE *nd_body, const YYLTYPE *loc, const YYLTYPE *operator_loc) { rb_node_block_pass_t *n = NODE_NEWNODE(NODE_BLOCK_PASS, rb_node_block_pass_t, loc); n->forwarding = 0; n->nd_head = 0; n->nd_body = nd_body; + n->operator_loc = *operator_loc; return n; } @@ -15139,7 +15140,7 @@ new_args_forward_call(struct parser_params *p, NODE *leading, const YYLTYPE *loc #ifndef FORWARD_ARGS_WITH_RUBY2_KEYWORDS NODE *kwrest = list_append(p, NEW_LIST(0, loc), NEW_LVAR(idFWD_KWREST, loc)); #endif - rb_node_block_pass_t *block = NEW_BLOCK_PASS(NEW_LVAR(idFWD_BLOCK, loc), argsloc); + rb_node_block_pass_t *block = NEW_BLOCK_PASS(NEW_LVAR(idFWD_BLOCK, loc), argsloc, &NULL_LOC); NODE *args = leading ? rest_arg_append(p, leading, rest, argsloc) : NEW_SPLAT(rest, loc); block->forwarding = TRUE; #ifndef FORWARD_ARGS_WITH_RUBY2_KEYWORDS diff --git a/rubyparser.h b/rubyparser.h index cfa881ac4161a1..e856f69a5fded2 100644 --- a/rubyparser.h +++ b/rubyparser.h @@ -811,6 +811,7 @@ typedef struct RNode_BLOCK_PASS { struct RNode *nd_head; struct RNode *nd_body; unsigned int forwarding: 1; + rb_code_location_t operator_loc; } rb_node_block_pass_t; typedef struct RNode_DEFN { diff --git a/test/ruby/test_ast.rb b/test/ruby/test_ast.rb index 38c0d56a0f8d98..940c4de9d7fcac 100644 --- a/test/ruby/test_ast.rb +++ b/test/ruby/test_ast.rb @@ -1348,6 +1348,14 @@ def test_and_locations assert_locations(node.children[-1].locations, [[1, 0, 1, 6], [1, 2, 1, 4]]) end + def test_block_pass_locations + node = ast_parse("foo(&bar)") + assert_locations(node.children[-1].children[-1].locations, [[1, 4, 1, 8], [1, 4, 1, 5]]) + + node = ast_parse("def a(&); b(&) end") + assert_locations(node.children[-1].children[-1].children[-1].children[-1].children[-1].locations, [[1, 12, 1, 13], [1, 12, 1, 13]]) + end + def test_break_locations node = ast_parse("loop { break 1 }") assert_locations(node.children[-1].children[-1].children[-1].locations, [[1, 7, 1, 14], [1, 7, 1, 12]]) From c94ea1cccb24a41a5cd5c7e90aec04cb477b367e Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Wed, 25 Sep 2024 10:40:14 +0900 Subject: [PATCH 440/829] Fix size modifier for `size_t` --- regexec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regexec.c b/regexec.c index cd3f5daff5e039..8c6bccf546b66a 100644 --- a/regexec.c +++ b/regexec.c @@ -4158,7 +4158,7 @@ match_at(regex_t* reg, const UChar* str, const UChar* end, size_t length = (end - str) + 1; size_t num_match_cache_points = (size_t)msa->num_cache_points * length; #ifdef ONIG_DEBUG_MATCH_CACHE - fprintf(stderr, "MATCH CACHE: #match cache points = %ld (length = %zu)\n", num_match_cache_points, length); + fprintf(stderr, "MATCH CACHE: #match cache points = %zu (length = %zu)\n", num_match_cache_points, length); #endif /* Overflow check */ if (num_match_cache_points / length != (size_t)msa->num_cache_points) { From 0d16c36d0ab2afa2ec79b72b229e69c141ebdaba Mon Sep 17 00:00:00 2001 From: Josh Cooper Date: Thu, 23 Feb 2023 13:15:36 -0800 Subject: [PATCH 441/829] [win32/registry] Fallback to UTF-8 for unknown codepages There are some codepages like cp708 for which no ruby encoding exists: $ ruby -e "Encoding.find('cp708')" Traceback (most recent call last): 1: from -e:1:in `
' -e:1:in `find': unknown encoding name - cp708 (ArgumentError) win32/registry uses ENCODING to transcode error messages and expand environment variables from UTF-16LE, so using UTF-8 seems like the best choice and is better than a hard failure. This should resolve [Bug #13831] --- ext/win32/lib/win32/registry.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ext/win32/lib/win32/registry.rb b/ext/win32/lib/win32/registry.rb index 92b95d1bf720a0..c801b1327b3886 100644 --- a/ext/win32/lib/win32/registry.rb +++ b/ext/win32/lib/win32/registry.rb @@ -69,7 +69,11 @@ module Win32 WCHAR_NUL = "\0".encode(WCHAR).freeze WCHAR_CR = "\r".encode(WCHAR).freeze WCHAR_SIZE = WCHAR_NUL.bytesize - LOCALE = Encoding.find(Encoding.locale_charmap) + begin + LOCALE = Encoding.find(Encoding.locale_charmap) + rescue ArgumentError + LOCALE = Encoding::UTF_8 + end class Registry From 0283b5ddb4f3b90ceb1bde9cf76ae57d72ea80bb Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sat, 10 Feb 2024 15:11:16 +0900 Subject: [PATCH 442/829] Check syntax warnings in built-in scripts --- tool/mk_builtin_loader.rb | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/tool/mk_builtin_loader.rb b/tool/mk_builtin_loader.rb index 5afef655f4c536..c45b89c05de699 100644 --- a/tool/mk_builtin_loader.rb +++ b/tool/mk_builtin_loader.rb @@ -8,6 +8,22 @@ REQUIRED = {} BUILTIN_ATTRS = %w[leaf inline_block use_block] +module CompileWarning + @@warnings = 0 + + def warn(message) + @@warnings += 1 + super + end + + def self.reset + w, @@warnings = @@warnings, 0 + w.nonzero? + end +end + +Warning.extend CompileWarning + def string_literal(lit, str = []) while lit case lit.first @@ -300,7 +316,15 @@ def mk_builtin_header file # bs = { func_name => argc } code = File.read(file) - collect_iseq RubyVM::InstructionSequence.compile(code).to_a + begin + verbose, $VERBOSE = $VERBOSE, true + collect_iseq RubyVM::InstructionSequence.compile(code, base).to_a + ensure + $VERBOSE = verbose + end + if warnings = CompileWarning.reset + raise "#{warnings} warnings in #{file}" + end collect_builtin(base, Ripper.sexp(code), 'top', bs = {}, inlines = {}) StringIO.open do |f| From 76543a34ab8af125f7a04fa487afacf8f27f4a2b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Sep 2024 02:10:20 +0000 Subject: [PATCH 443/829] Bump github/codeql-action from 3.26.8 to 3.26.9 Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.26.8 to 3.26.9. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/294a9d92911152fe08befb9ec03e240add280cb3...461ef6c76dfe95d5c364de2f431ddbd31a417628) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/codeql-analysis.yml | 8 ++++---- .github/workflows/scorecards.yml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index c81ed1fc2941a6..1e92e509b14469 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -77,15 +77,15 @@ jobs: run: sudo rm /usr/lib/ruby/vendor_ruby/rubygems/defaults/operating_system.rb - name: Initialize CodeQL - uses: github/codeql-action/init@294a9d92911152fe08befb9ec03e240add280cb3 # v3.26.8 + uses: github/codeql-action/init@461ef6c76dfe95d5c364de2f431ddbd31a417628 # v3.26.9 with: languages: ${{ matrix.language }} - name: Autobuild - uses: github/codeql-action/autobuild@294a9d92911152fe08befb9ec03e240add280cb3 # v3.26.8 + uses: github/codeql-action/autobuild@461ef6c76dfe95d5c364de2f431ddbd31a417628 # v3.26.9 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@294a9d92911152fe08befb9ec03e240add280cb3 # v3.26.8 + uses: github/codeql-action/analyze@461ef6c76dfe95d5c364de2f431ddbd31a417628 # v3.26.9 with: category: '/language:${{ matrix.language }}' upload: False @@ -115,7 +115,7 @@ jobs: continue-on-error: true - name: Upload SARIF - uses: github/codeql-action/upload-sarif@294a9d92911152fe08befb9ec03e240add280cb3 # v3.26.8 + uses: github/codeql-action/upload-sarif@461ef6c76dfe95d5c364de2f431ddbd31a417628 # v3.26.9 with: sarif_file: sarif-results/${{ matrix.language }}.sarif continue-on-error: true diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml index 89b12dd87e8838..24ea6543534eb0 100644 --- a/.github/workflows/scorecards.yml +++ b/.github/workflows/scorecards.yml @@ -67,6 +67,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: 'Upload to code-scanning' - uses: github/codeql-action/upload-sarif@294a9d92911152fe08befb9ec03e240add280cb3 # v3.26.8 + uses: github/codeql-action/upload-sarif@461ef6c76dfe95d5c364de2f431ddbd31a417628 # v3.26.9 with: sarif_file: results.sarif From 3830bca5edd6964131971866c80107c89fac5362 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Wed, 25 Sep 2024 17:36:03 +0900 Subject: [PATCH 444/829] TestProcess#test_daemon_noclose is only working with macOS 15.1 beta, we should skip with macOS 15.0 --- test/ruby/test_process.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/ruby/test_process.rb b/test/ruby/test_process.rb index 6e8ba484a49ac9..e055cb9db88428 100644 --- a/test/ruby/test_process.rb +++ b/test/ruby/test_process.rb @@ -1874,6 +1874,8 @@ def test_daemon_default end def test_daemon_noclose + pend "macOS 15.0 is not working with this test" if macos?(15, 0) + data = IO.popen("-", "r+") do |f| break f.read if f Process.daemon(false, true) From 407f8b871668b257f28303a74cf38cc2b53ca965 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Mon, 23 Sep 2024 13:55:37 -0400 Subject: [PATCH 445/829] Fix memory leak in Ripper for indented heredocs The allocated parser string is never freed, which causes a memory leak. The following code leaks memory: Ripper.sexp_raw(DATA.read) __END__ <<~EOF a #{1} a EOF --- ext/ripper/ripper_init.c.tmpl | 1 + internal/parse.h | 1 + parse.y | 6 ++---- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ext/ripper/ripper_init.c.tmpl b/ext/ripper/ripper_init.c.tmpl index d73ac263a62d1b..11e432423db208 100644 --- a/ext/ripper/ripper_init.c.tmpl +++ b/ext/ripper/ripper_init.c.tmpl @@ -260,6 +260,7 @@ ripper_parser_dedent_string(struct parser_params *p, VALUE string, int width) str = rb_str_to_parser_string(p, string); col = rb_ruby_ripper_dedent_string(p, str, width); rb_str_replace(string, rb_str_new_parser_string(str)); + rb_parser_string_free(p, str); return col; } diff --git a/internal/parse.h b/internal/parse.h index 29accaa7ff9476..e0c81f4f96e4c2 100644 --- a/internal/parse.h +++ b/internal/parse.h @@ -70,6 +70,7 @@ rb_encoding *rb_ruby_parser_encoding(rb_parser_t *p); int rb_ruby_parser_end_seen_p(rb_parser_t *p); int rb_ruby_parser_set_yydebug(rb_parser_t *p, int flag); rb_parser_string_t *rb_str_to_parser_string(rb_parser_t *p, VALUE str); +void rb_parser_string_free(rb_parser_t *p, rb_parser_string_t *str); int rb_parser_dvar_defined_ref(struct parser_params*, ID, ID**); ID rb_parser_internal_id(struct parser_params*); diff --git a/parse.y b/parse.y index 4fad1cd812cf23..fb0139a8b9fb28 100644 --- a/parse.y +++ b/parse.y @@ -764,8 +764,6 @@ string_buffer_append(struct parser_params *p, rb_parser_string_t *str) buf->last->buf[buf->last->used++] = str; } -static void rb_parser_string_free(rb_parser_t *p, rb_parser_string_t *str); - static void string_buffer_free(struct parser_params *p) { @@ -2048,15 +2046,15 @@ rb_str_to_parser_string(rb_parser_t *p, VALUE str) RB_GC_GUARD(str); return ret; } -#endif -static void +void rb_parser_string_free(rb_parser_t *p, rb_parser_string_t *str) { if (!str) return; xfree(PARSER_STRING_PTR(str)); xfree(str); } +#endif static st_index_t rb_parser_str_hash(rb_parser_string_t *str) From cafd666adfddf5e623ffc468306610aadb7e294c Mon Sep 17 00:00:00 2001 From: Benoit Daloze Date: Wed, 28 Aug 2024 22:32:30 +0200 Subject: [PATCH 446/829] [ruby/prism] Type every node field and mark on-error-only types explicitly * For Loader.java, do not deserialize the AST if there are errors, so then Java nodes only have non-error types for fields. https://github.com/ruby/prism/commit/ae78e3c605 --- prism/config.yml | 220 ++++++++++++++++++++++-- prism/prism.c | 33 +++- prism/templates/include/prism/ast.h.erb | 2 +- prism/templates/lib/prism/dsl.rb.erb | 4 +- prism/templates/lib/prism/node.rb.erb | 2 +- prism/templates/template.rb | 42 ++++- 6 files changed, 270 insertions(+), 33 deletions(-) diff --git a/prism/config.yml b/prism/config.yml index 1c00ef145b7fbb..13b81a2f16aabf 100644 --- a/prism/config.yml +++ b/prism/config.yml @@ -793,8 +793,8 @@ nodes: - GlobalVariableReadNode - BackReferenceReadNode - NumberedReferenceReadNode - - SymbolNode # On parsing error of `alias $a b` - - MissingNode # On parsing error of `alias $a 42` + - on error: SymbolNode # alias $a b + - on error: MissingNode # alias $a 42 comment: | Represents the old name of the global variable that can be used before aliasing. @@ -824,8 +824,8 @@ nodes: kind: - SymbolNode - InterpolatedSymbolNode - - GlobalVariableReadNode # On parsing error of `alias a $b` - - MissingNode # On parsing error of `alias a 42` + - on error: GlobalVariableReadNode # alias a $b + - on error: MissingNode # alias a 42 - name: keyword_loc type: location comment: | @@ -837,8 +837,10 @@ nodes: fields: - name: left type: node + kind: pattern expression - name: right type: node + kind: pattern expression - name: operator_loc type: location comment: | @@ -850,6 +852,7 @@ nodes: fields: - name: left type: node + kind: non-void expression comment: | Represents the left side of the expression. It can be any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression). @@ -860,8 +863,9 @@ nodes: ^ - name: right type: node + kind: Node comment: | - Represents the right side of the expression. It can be any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression). + Represents the right side of the expression. left && right ^^^^^ @@ -885,6 +889,7 @@ nodes: fields: - name: arguments type: node[] + kind: non-void expression comment: | Represents a set of arguments to a method or a keyword. @@ -895,6 +900,7 @@ nodes: fields: - name: elements type: node[] + kind: non-void expression comment: Represent the list of zero or more [non-void expressions](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression) within the array. - name: opening_loc type: location? @@ -923,12 +929,18 @@ nodes: fields: - name: constant type: node? + kind: + - ConstantReadNode + - ConstantPathNode - name: requireds type: node[] + kind: pattern expression - name: rest type: node? + kind: pattern expression - name: posts type: node[] + kind: pattern expression - name: opening_loc type: location? - name: closing_loc @@ -954,6 +966,7 @@ nodes: fields: - name: key type: node + kind: non-void expression comment: | The key of the association. This can be any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression). @@ -967,6 +980,7 @@ nodes: ^^^^^^^^^^ - name: value type: node + kind: non-void expression comment: | The value of the association, if present. This can be any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression). @@ -991,6 +1005,7 @@ nodes: fields: - name: value type: node? + kind: non-void expression comment: | The value to be splatted, if present. Will be missing when keyword rest argument forwarding is used. @@ -1053,6 +1068,7 @@ nodes: fields: - name: expression type: node? + kind: non-void expression - name: operator_loc type: location comment: | @@ -1157,6 +1173,7 @@ nodes: fields: - name: receiver type: node? + kind: non-void expression - name: call_operator_loc type: location? - name: message_loc @@ -1169,6 +1186,7 @@ nodes: type: location - name: value type: node + kind: non-void expression comment: | Represents the use of the `&&=` operator on a call. @@ -1179,6 +1197,7 @@ nodes: fields: - name: receiver type: node? + kind: non-void expression comment: | The object that the method is being called on. This can be either `nil` or any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression). @@ -1205,6 +1224,9 @@ nodes: type: location? - name: block type: node? + kind: + - BlockNode + - BlockArgumentNode comment: | Represents a method call, in all of the various forms that can take. @@ -1230,6 +1252,7 @@ nodes: fields: - name: receiver type: node? + kind: non-void expression - name: call_operator_loc type: location? - name: message_loc @@ -1244,6 +1267,7 @@ nodes: type: location - name: value type: node + kind: non-void expression comment: | Represents the use of an assignment operator on a call. @@ -1254,6 +1278,7 @@ nodes: fields: - name: receiver type: node? + kind: non-void expression - name: call_operator_loc type: location? - name: message_loc @@ -1266,6 +1291,7 @@ nodes: type: location - name: value type: node + kind: non-void expression comment: | Represents the use of the `||=` operator on a call. @@ -1276,6 +1302,7 @@ nodes: fields: - name: receiver type: node + kind: non-void expression - name: call_operator_loc type: location - name: name @@ -1299,8 +1326,10 @@ nodes: fields: - name: value type: node + kind: pattern expression - name: target type: node + kind: LocalVariableTargetNode - name: operator_loc type: location comment: | @@ -1312,8 +1341,10 @@ nodes: fields: - name: predicate type: node? + kind: non-void expression - name: conditions type: node[] + kind: InNode - name: else_clause type: node? kind: ElseNode @@ -1332,8 +1363,10 @@ nodes: fields: - name: predicate type: node? + kind: non-void expression - name: conditions type: node[] + kind: WhenNode - name: else_clause type: node? kind: ElseNode @@ -1356,12 +1389,20 @@ nodes: type: location - name: constant_path type: node + kind: + - ConstantReadNode + - ConstantPathNode + - on error: CallNode # class 0.X end - name: inheritance_operator_loc type: location? - name: superclass type: node? + kind: non-void expression - name: body type: node? + kind: + - StatementsNode + - BeginNode - name: end_keyword_loc type: location - name: name @@ -1381,6 +1422,7 @@ nodes: type: location - name: value type: node + kind: non-void expression comment: | Represents the use of the `&&=` operator for assignment to a class variable. @@ -1396,6 +1438,7 @@ nodes: type: location - name: value type: node + kind: non-void expression - name: binary_operator type: constant comment: | @@ -1413,6 +1456,7 @@ nodes: type: location - name: value type: node + kind: non-void expression comment: | Represents the use of the `||=` operator for assignment to a class variable. @@ -1461,6 +1505,7 @@ nodes: ^^^^^ - name: value type: node + kind: non-void expression comment: | The value to write to the class variable. This can be any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression). @@ -1491,6 +1536,7 @@ nodes: type: location - name: value type: node + kind: non-void expression comment: | Represents the use of the `&&=` operator for assignment to a constant. @@ -1506,6 +1552,7 @@ nodes: type: location - name: value type: node + kind: non-void expression - name: binary_operator type: constant comment: | @@ -1523,6 +1570,7 @@ nodes: type: location - name: value type: node + kind: non-void expression comment: | Represents the use of the `||=` operator for assignment to a constant. @@ -1537,6 +1585,7 @@ nodes: type: location - name: value type: node + kind: non-void expression comment: | Represents the use of the `&&=` operator for assignment to a constant path. @@ -1546,6 +1595,7 @@ nodes: fields: - name: parent type: node? + kind: non-void expression comment: | The left-hand node of the path, if present. It can be `nil` or any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression). It will be `nil` when the constant lookup is at the root of the module tree. @@ -1594,6 +1644,7 @@ nodes: type: location - name: value type: node + kind: non-void expression - name: binary_operator type: constant comment: | @@ -1610,6 +1661,7 @@ nodes: type: location - name: value type: node + kind: non-void expression comment: | Represents the use of the `||=` operator for assignment to a constant path. @@ -1619,6 +1671,7 @@ nodes: fields: - name: parent type: node? + kind: non-void expression - name: name type: constant? - name: delimiter_loc @@ -1652,6 +1705,7 @@ nodes: ^ - name: value type: node + kind: non-void expression comment: | The value to write to the constant path. It can be any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression). @@ -1711,6 +1765,7 @@ nodes: ^^^ - name: value type: node + kind: non-void expression comment: | The value to write to the constant. It can be any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression). @@ -1739,11 +1794,15 @@ nodes: type: location - name: receiver type: node? + kind: non-void expression - name: parameters type: node? kind: ParametersNode - name: body type: node? + kind: + - StatementsNode + - BeginNode - name: locals type: constant[] - name: def_keyword_loc @@ -1770,6 +1829,7 @@ nodes: type: location? - name: value type: node + kind: Node # More than non-void expression as defined?(return) is allowed, yet defined?(BEGIN{}) is SyntaxError - name: rparen_loc type: location? - name: keyword_loc @@ -1813,6 +1873,12 @@ nodes: type: location - name: variable type: node + kind: + - InstanceVariableReadNode + - ClassVariableReadNode + - GlobalVariableReadNode + - BackReferenceReadNode + - NumberedReferenceReadNode comment: | Represents an interpolated variable. @@ -1846,12 +1912,20 @@ nodes: fields: - name: constant type: node? + kind: + - ConstantReadNode + - ConstantPathNode - name: left type: node + kind: SplatNode - name: requireds type: node[] + kind: pattern expression - name: right type: node + kind: + - SplatNode + - on error: MissingNode - name: opening_loc type: location? - name: closing_loc @@ -1872,8 +1946,10 @@ nodes: fields: - name: left type: node? + kind: non-void expression - name: right type: node? + kind: non-void expression - name: operator_loc type: location comment: | @@ -1895,6 +1971,19 @@ nodes: fields: - name: index type: node + kind: + - LocalVariableTargetNode + - InstanceVariableTargetNode + - ClassVariableTargetNode + - GlobalVariableTargetNode + - ConstantTargetNode + - ConstantPathTargetNode + - CallTargetNode + - IndexTargetNode + - MultiTargetNode + - on error: BackReferenceReadNode # for $& in a end + - on error: NumberedReferenceReadNode # for $1 in a end + - on error: MissingNode # for in 1..10; end comment: | The index expression for `for` loops. @@ -1902,6 +1991,7 @@ nodes: ^ - name: collection type: node + kind: non-void expression comment: | The collection to iterate over. @@ -1985,6 +2075,7 @@ nodes: type: location - name: value type: node + kind: non-void expression comment: | Represents the use of the `&&=` operator for assignment to a global variable. @@ -2000,6 +2091,7 @@ nodes: type: location - name: value type: node + kind: non-void expression - name: binary_operator type: constant comment: | @@ -2017,6 +2109,7 @@ nodes: type: location - name: value type: node + kind: non-void expression comment: | Represents the use of the `||=` operator for assignment to a global variable. @@ -2065,6 +2158,7 @@ nodes: ^^^^ - name: value type: node + kind: non-void expression comment: | The value to write to the global variable. It can be any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression). @@ -2123,6 +2217,9 @@ nodes: fields: - name: constant type: node? + kind: + - ConstantReadNode + - ConstantPathNode - name: elements type: node[] kind: AssocNode @@ -2156,6 +2253,7 @@ nodes: The `if_keyword_loc` field will be `nil` when the `IfNode` represents a ternary expression. - name: predicate type: node + kind: non-void expression comment: | The node for the condition the `IfNode` is testing. @@ -2248,6 +2346,11 @@ nodes: fields: - name: value type: node + kind: + - LocalVariableReadNode + - CallNode + - ConstantReadNode + - LocalVariableTargetNode comment: | Represents a node that is implicitly being added to the tree but doesn't correspond directly to a node in the source. @@ -2278,6 +2381,7 @@ nodes: fields: - name: pattern type: node + kind: pattern expression - name: statements type: node? kind: StatementsNode @@ -2295,6 +2399,7 @@ nodes: fields: - name: receiver type: node? + kind: non-void expression - name: call_operator_loc type: location? - name: opening_loc @@ -2306,10 +2411,12 @@ nodes: type: location - name: block type: node? + kind: BlockArgumentNode # foo[&b] &&= value, only valid on Ruby < 3.4 - name: operator_loc type: location - name: value type: node + kind: non-void expression comment: | Represents the use of the `&&=` operator on a call to the `[]` method. @@ -2320,6 +2427,7 @@ nodes: fields: - name: receiver type: node? + kind: non-void expression - name: call_operator_loc type: location? - name: opening_loc @@ -2331,12 +2439,14 @@ nodes: type: location - name: block type: node? + kind: BlockArgumentNode # foo[&b] += value, only valid on Ruby < 3.4 - name: binary_operator type: constant - name: binary_operator_loc type: location - name: value type: node + kind: non-void expression comment: | Represents the use of an assignment operator on a call to `[]`. @@ -2347,6 +2457,7 @@ nodes: fields: - name: receiver type: node? + kind: non-void expression - name: call_operator_loc type: location? - name: opening_loc @@ -2358,10 +2469,12 @@ nodes: type: location - name: block type: node? + kind: BlockArgumentNode # foo[&b] ||= value, only valid on Ruby < 3.4 - name: operator_loc type: location - name: value type: node + kind: non-void expression comment: | Represents the use of the `||=` operator on a call to `[]`. @@ -2372,6 +2485,7 @@ nodes: fields: - name: receiver type: node + kind: non-void expression - name: opening_loc type: location - name: arguments @@ -2381,6 +2495,7 @@ nodes: type: location - name: block type: node? + kind: BlockArgumentNode # foo[&b], = 1, only valid on Ruby < 3.4 comment: | Represents assigning to an index. @@ -2404,6 +2519,7 @@ nodes: type: location - name: value type: node + kind: non-void expression comment: | Represents the use of the `&&=` operator for assignment to an instance variable. @@ -2419,6 +2535,7 @@ nodes: type: location - name: value type: node + kind: non-void expression - name: binary_operator type: constant comment: | @@ -2436,6 +2553,7 @@ nodes: type: location - name: value type: node + kind: non-void expression comment: | Represents the use of the `||=` operator for assignment to an instance variable. @@ -2484,6 +2602,7 @@ nodes: ^^^ - name: value type: node + kind: non-void expression comment: | The value to write to the instance variable. It can be any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression). @@ -2661,8 +2780,15 @@ nodes: type: location - name: parameters type: node? + kind: + - BlockParametersNode + - NumberedParametersNode + - ItParametersNode - name: body type: node? + kind: + - StatementsNode + - BeginNode comment: | Represents using a lambda literal (not the lambda method call). @@ -2676,6 +2802,7 @@ nodes: type: location - name: value type: node + kind: non-void expression - name: name type: constant - name: depth @@ -2693,6 +2820,7 @@ nodes: type: location - name: value type: node + kind: non-void expression - name: name type: constant - name: binary_operator @@ -2712,6 +2840,7 @@ nodes: type: location - name: value type: node + kind: non-void expression - name: name type: constant - name: depth @@ -2791,6 +2920,7 @@ nodes: ^^^ - name: value type: node + kind: non-void expression comment: | The value to write to the local variable. It can be any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression). @@ -2835,8 +2965,10 @@ nodes: fields: - name: value type: node + kind: non-void expression - name: pattern type: node + kind: pattern expression - name: operator_loc type: location comment: | @@ -2848,8 +2980,10 @@ nodes: fields: - name: value type: node + kind: non-void expression - name: pattern type: node + kind: pattern expression - name: operator_loc type: location comment: | @@ -2881,8 +3015,15 @@ nodes: type: location - name: constant_path type: node + kind: + - ConstantReadNode + - ConstantPathNode + - on error: MissingNode # module Parent module end - name: body type: node? + kind: + - StatementsNode + - BeginNode - name: end_keyword_loc type: location - name: name @@ -2906,9 +3047,9 @@ nodes: - CallTargetNode - IndexTargetNode - MultiTargetNode - - RequiredParameterNode - - BackReferenceReadNode # On parsing error of `$',` - - NumberedReferenceReadNode # On parsing error of `$1,` + - RequiredParameterNode # def m((a,b)); end + - on error: BackReferenceReadNode # a, (b, $&) = z + - on error: NumberedReferenceReadNode # a, (b, $1) = z comment: | Represents the targets expressions before a splat node. @@ -2951,8 +3092,9 @@ nodes: - CallTargetNode - IndexTargetNode - MultiTargetNode - - RequiredParameterNode - - BackReferenceReadNode # On parsing error of `*,$'` + - RequiredParameterNode # def m((*,b)); end + - on error: BackReferenceReadNode # a, (*, $&) = z + - on error: NumberedReferenceReadNode # a, (*, $1) = z comment: | Represents the targets expressions after a splat node. @@ -2996,6 +3138,8 @@ nodes: - CallTargetNode - IndexTargetNode - MultiTargetNode + - on error: BackReferenceReadNode # $&, = z + - on error: NumberedReferenceReadNode # $1, = z comment: | Represents the targets expressions before a splat node. @@ -3038,6 +3182,8 @@ nodes: - CallTargetNode - IndexTargetNode - MultiTargetNode + - on error: BackReferenceReadNode # *, $& = z + - on error: NumberedReferenceReadNode # *, $1 = z comment: | Represents the targets expressions after a splat node. @@ -3066,6 +3212,7 @@ nodes: ^ - name: value type: node + kind: non-void expression comment: | The value to write to the targets. It can be any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression). @@ -3141,6 +3288,7 @@ nodes: type: location - name: value type: node + kind: non-void expression comment: | Represents an optional keyword parameter to a method, block, or lambda definition. @@ -3158,6 +3306,7 @@ nodes: type: location - name: value type: node + kind: non-void expression comment: | Represents an optional parameter to a method, block, or lambda definition. @@ -3168,6 +3317,7 @@ nodes: fields: - name: left type: node + kind: non-void expression comment: | Represents the left side of the expression. It can be any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression). @@ -3178,8 +3328,9 @@ nodes: ^ - name: right type: node + kind: Node comment: | - Represents the right side of the expression. It can be any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression). + Represents the right side of the expression. left || right ^^^^^ @@ -3219,10 +3370,10 @@ nodes: - RequiredParameterNode - MultiTargetNode # On parsing error of `f(**kwargs, ...)` or `f(**nil, ...)`, the keyword_rest value is moved here: - - KeywordRestParameterNode - - NoKeywordsParameterNode + - on error: KeywordRestParameterNode + - on error: NoKeywordsParameterNode # On parsing error of `f(..., ...)`, the first forwarding parameter is moved here: - - ForwardingParameterNode + - on error: ForwardingParameterNode - name: keywords type: node[] kind: @@ -3247,6 +3398,7 @@ nodes: fields: - name: body type: node? + kind: non-void expression # Usually a StatementsNode but not always e.g. `1 in (..10)` - name: opening_loc type: location - name: closing_loc @@ -3261,6 +3413,7 @@ nodes: fields: - name: expression type: node + kind: non-void expression - name: operator_loc type: location - name: lparen_loc @@ -3276,6 +3429,15 @@ nodes: fields: - name: variable type: node + kind: + - LocalVariableReadNode + - InstanceVariableReadNode + - ClassVariableReadNode + - GlobalVariableReadNode # foo in ^$a + - BackReferenceReadNode # foo in ^$& + - NumberedReferenceReadNode # foo in ^$1 + - ItLocalVariableReadNode # proc { 1 in ^it } + - on error: MissingNode # foo in ^Bar - name: operator_loc type: location comment: | @@ -3328,6 +3490,7 @@ nodes: fields: - name: left type: node? + kind: non-void expression comment: | The left-hand side of the range, if present. It can be either `nil` or any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression). @@ -3338,6 +3501,7 @@ nodes: ^^^^^ - name: right type: node? + kind: non-void expression comment: | The right-hand side of the range, if present. It can be either `nil` or any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression). @@ -3429,10 +3593,12 @@ nodes: fields: - name: expression type: node + kind: Node - name: keyword_loc type: location - name: rescue_expression type: node + kind: Node newline: expression comment: | Represents an expression modified with a rescue. @@ -3445,10 +3611,23 @@ nodes: type: location - name: exceptions type: node[] + kind: non-void expression - name: operator_loc type: location? - name: reference type: node? + kind: + - LocalVariableTargetNode + - InstanceVariableTargetNode + - ClassVariableTargetNode + - GlobalVariableTargetNode + - ConstantTargetNode + - ConstantPathTargetNode + - CallTargetNode + - IndexTargetNode + - on error: BackReferenceReadNode # => begin; rescue => $&; end + - on error: NumberedReferenceReadNode # => begin; rescue => $1; end + - on error: MissingNode # begin; rescue =>; end - name: statements type: node? kind: StatementsNode @@ -3535,8 +3714,12 @@ nodes: type: location - name: expression type: node + kind: non-void expression - name: body type: node? + kind: + - StatementsNode + - BeginNode - name: end_keyword_loc type: location comment: | @@ -3573,6 +3756,7 @@ nodes: type: location - name: expression type: node? + kind: non-void expression comment: | Represents the use of the splat operator. @@ -3582,6 +3766,7 @@ nodes: fields: - name: body type: node[] + kind: Node comment: | Represents a set of statements contained within some scope. @@ -3622,6 +3807,9 @@ nodes: type: location? - name: block type: node? + kind: + - BlockNode + - BlockArgumentNode comment: | Represents the use of the `super` keyword with parentheses or arguments. @@ -3683,6 +3871,7 @@ nodes: ^^^^^^ - name: predicate type: node + kind: non-void expression comment: | The condition to be evaluated for the unless expression. It can be any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression). @@ -3740,6 +3929,7 @@ nodes: type: location? - name: predicate type: node + kind: non-void expression - name: statements type: node? kind: StatementsNode @@ -3758,6 +3948,7 @@ nodes: type: location - name: conditions type: node[] + kind: non-void expression - name: then_keyword_loc type: location? - name: statements @@ -3779,6 +3970,7 @@ nodes: type: location? - name: predicate type: node + kind: non-void expression - name: statements type: node? kind: StatementsNode diff --git a/prism/prism.c b/prism/prism.c index 6020f108a4d131..c80b0db41f6a20 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -2990,6 +2990,7 @@ pm_index_and_write_node_create(pm_parser_t *parser, pm_call_node_t *target, cons pm_index_arguments_check(parser, target->arguments, target->block); + assert(!target->block || PM_NODE_TYPE_P(target->block, PM_BLOCK_ARGUMENT_NODE)); *node = (pm_index_and_write_node_t) { { .type = PM_INDEX_AND_WRITE_NODE, @@ -3005,7 +3006,7 @@ pm_index_and_write_node_create(pm_parser_t *parser, pm_call_node_t *target, cons .opening_loc = target->opening_loc, .arguments = target->arguments, .closing_loc = target->closing_loc, - .block = target->block, + .block = (pm_block_argument_node_t *) target->block, .operator_loc = PM_LOCATION_TOKEN_VALUE(operator), .value = value }; @@ -3065,6 +3066,7 @@ pm_index_operator_write_node_create(pm_parser_t *parser, pm_call_node_t *target, pm_index_arguments_check(parser, target->arguments, target->block); + assert(!target->block || PM_NODE_TYPE_P(target->block, PM_BLOCK_ARGUMENT_NODE)); *node = (pm_index_operator_write_node_t) { { .type = PM_INDEX_OPERATOR_WRITE_NODE, @@ -3080,7 +3082,7 @@ pm_index_operator_write_node_create(pm_parser_t *parser, pm_call_node_t *target, .opening_loc = target->opening_loc, .arguments = target->arguments, .closing_loc = target->closing_loc, - .block = target->block, + .block = (pm_block_argument_node_t *) target->block, .binary_operator = pm_parser_constant_id_location(parser, operator->start, operator->end - 1), .binary_operator_loc = PM_LOCATION_TOKEN_VALUE(operator), .value = value @@ -3142,6 +3144,7 @@ pm_index_or_write_node_create(pm_parser_t *parser, pm_call_node_t *target, const pm_index_arguments_check(parser, target->arguments, target->block); + assert(!target->block || PM_NODE_TYPE_P(target->block, PM_BLOCK_ARGUMENT_NODE)); *node = (pm_index_or_write_node_t) { { .type = PM_INDEX_OR_WRITE_NODE, @@ -3157,7 +3160,7 @@ pm_index_or_write_node_create(pm_parser_t *parser, pm_call_node_t *target, const .opening_loc = target->opening_loc, .arguments = target->arguments, .closing_loc = target->closing_loc, - .block = target->block, + .block = (pm_block_argument_node_t *) target->block, .operator_loc = PM_LOCATION_TOKEN_VALUE(operator), .value = value }; @@ -3210,6 +3213,7 @@ pm_index_target_node_create(pm_parser_t *parser, pm_call_node_t *target) { pm_index_arguments_check(parser, target->arguments, target->block); + assert(!target->block || PM_NODE_TYPE_P(target->block, PM_BLOCK_ARGUMENT_NODE)); *node = (pm_index_target_node_t) { { .type = PM_INDEX_TARGET_NODE, @@ -3221,7 +3225,7 @@ pm_index_target_node_create(pm_parser_t *parser, pm_call_node_t *target) { .opening_loc = target->opening_loc, .arguments = target->arguments, .closing_loc = target->closing_loc, - .block = target->block + .block = (pm_block_argument_node_t *) target->block, }; // Here we're going to free the target, since it is no longer necessary. @@ -3236,7 +3240,7 @@ pm_index_target_node_create(pm_parser_t *parser, pm_call_node_t *target) { * Allocate and initialize a new CapturePatternNode node. */ static pm_capture_pattern_node_t * -pm_capture_pattern_node_create(pm_parser_t *parser, pm_node_t *value, pm_node_t *target, const pm_token_t *operator) { +pm_capture_pattern_node_create(pm_parser_t *parser, pm_node_t *value, pm_local_variable_target_node_t *target, const pm_token_t *operator) { pm_capture_pattern_node_t *node = PM_NODE_ALLOC(parser, pm_capture_pattern_node_t); *node = (pm_capture_pattern_node_t) { @@ -3245,7 +3249,7 @@ pm_capture_pattern_node_create(pm_parser_t *parser, pm_node_t *value, pm_node_t .node_id = PM_NODE_IDENTIFY(parser), .location = { .start = value->location.start, - .end = target->location.end + .end = target->base.location.end }, }, .value = value, @@ -4037,14 +4041,25 @@ pm_find_pattern_node_create(pm_parser_t *parser, pm_node_list_t *nodes) { pm_find_pattern_node_t *node = PM_NODE_ALLOC(parser, pm_find_pattern_node_t); pm_node_t *left = nodes->nodes[0]; + assert(PM_NODE_TYPE_P(left, PM_SPLAT_NODE)); + pm_splat_node_t *left_splat_node = (pm_splat_node_t *) left; + pm_node_t *right; if (nodes->size == 1) { right = (pm_node_t *) pm_missing_node_create(parser, left->location.end, left->location.end); } else { right = nodes->nodes[nodes->size - 1]; + assert(PM_NODE_TYPE_P(right, PM_SPLAT_NODE)); } +#if PRISM_SERIALIZE_ONLY_SEMANTICS_FIELDS + // FindPatternNode#right is typed as SplatNode in this case, so replace the potential MissingNode with a SplatNode. + // The resulting AST will anyway be ignored, but this file still needs to compile. + pm_splat_node_t *right_splat_node = PM_NODE_TYPE_P(right, PM_SPLAT_NODE) ? (pm_splat_node_t *) right : left_splat_node; +#else + pm_node_t *right_splat_node = right; +#endif *node = (pm_find_pattern_node_t) { { .type = PM_FIND_PATTERN_NODE, @@ -4055,8 +4070,8 @@ pm_find_pattern_node_create(pm_parser_t *parser, pm_node_list_t *nodes) { }, }, .constant = NULL, - .left = left, - .right = right, + .left = left_splat_node, + .right = right_splat_node, .requireds = { 0 }, .opening_loc = PM_OPTIONAL_LOCATION_NOT_PROVIDED_VALUE, .closing_loc = PM_OPTIONAL_LOCATION_NOT_PROVIDED_VALUE @@ -17429,7 +17444,7 @@ parse_pattern_primitives(pm_parser_t *parser, pm_constant_id_list_t *captures, p } parse_pattern_capture(parser, captures, constant_id, &PM_LOCATION_TOKEN_VALUE(&parser->previous)); - pm_node_t *target = (pm_node_t *) pm_local_variable_target_node_create( + pm_local_variable_target_node_t *target = pm_local_variable_target_node_create( parser, &PM_LOCATION_TOKEN_VALUE(&parser->previous), constant_id, diff --git a/prism/templates/include/prism/ast.h.erb b/prism/templates/include/prism/ast.h.erb index 1e0568f8150883..7cce34f54e361e 100644 --- a/prism/templates/include/prism/ast.h.erb +++ b/prism/templates/include/prism/ast.h.erb @@ -218,6 +218,6 @@ typedef enum pm_<%= flag.human %> { * to specify that through the environment. It will never be true except for in * those build systems. */ -#define PRISM_SERIALIZE_ONLY_SEMANTICS_FIELDS <%= Prism::Template::SERIALIZE_ONLY_SEMANTICS_FIELDS %> +#define PRISM_SERIALIZE_ONLY_SEMANTICS_FIELDS <%= Prism::Template::SERIALIZE_ONLY_SEMANTICS_FIELDS ? 1 : 0 %> #endif diff --git a/prism/templates/lib/prism/dsl.rb.erb b/prism/templates/lib/prism/dsl.rb.erb index f0dac2a4f0daec..e16ebb71101921 100644 --- a/prism/templates/lib/prism/dsl.rb.erb +++ b/prism/templates/lib/prism/dsl.rb.erb @@ -70,10 +70,10 @@ module Prism def <%= node.human %>(<%= ["source: default_source", "node_id: 0", "location: default_location", "flags: 0", *node.fields.map { |field| case field when Prism::Template::NodeField - if !field.kind? + kind = field.specific_kind || field.union_kind&.first + if kind.nil? "#{field.name}: default_node(source, location)" else - kind = field.specific_kind || field.union_kind.first "#{field.name}: #{kind.gsub(/(?<=.)[A-Z]/, "_\\0").downcase}(source: source)" end when Prism::Template::ConstantField diff --git a/prism/templates/lib/prism/node.rb.erb b/prism/templates/lib/prism/node.rb.erb index a7ea747de50246..f033cdea9b16e4 100644 --- a/prism/templates/lib/prism/node.rb.erb +++ b/prism/templates/lib/prism/node.rb.erb @@ -225,7 +225,7 @@ module Prism @flags = flags <%- node.fields.each do |field| -%> <%- if Prism::Template::CHECK_FIELD_KIND && field.respond_to?(:check_field_kind) -%> - raise <%= field.name %>.inspect unless <%= field.check_field_kind %> + raise "<%= node.name %>#<%= field.name %> was of unexpected type:\n#{<%= field.name %>.inspect}" unless <%= field.check_field_kind %> <%- end -%> @<%= field.name %> = <%= field.name %> <%- end -%> diff --git a/prism/templates/template.rb b/prism/templates/template.rb index 7d1d4c0d16b4da..7068c098d311eb 100755 --- a/prism/templates/template.rb +++ b/prism/templates/template.rb @@ -1,5 +1,5 @@ #!/usr/bin/env ruby -# typed: false +# typed: ignore require "erb" require "fileutils" @@ -8,6 +8,7 @@ module Prism module Template SERIALIZE_ONLY_SEMANTICS_FIELDS = ENV.fetch("PRISM_SERIALIZE_ONLY_SEMANTICS_FIELDS", false) + REMOVE_ON_ERROR_TYPES = SERIALIZE_ONLY_SEMANTICS_FIELDS CHECK_FIELD_KIND = ENV.fetch("CHECK_FIELD_KIND", false) JAVA_BACKEND = ENV["PRISM_JAVA_BACKEND"] || "truffleruby" @@ -95,8 +96,9 @@ def should_be_serialized? # Some node fields can be specialized if they point to a specific kind of # node and not just a generic node. class NodeKindField < Field - def kind? - options.key?(:kind) + def initialize(kind:, **options) + @kind = kind + super(**options) end def c_type @@ -117,18 +119,18 @@ def java_type def java_cast if specific_kind - "(Nodes.#{options[:kind]}) " + "(Nodes.#{@kind}) " else "" end end def specific_kind - options[:kind] unless options[:kind].is_a?(Array) + @kind unless @kind.is_a?(Array) end def union_kind - options[:kind] if options[:kind].is_a?(Array) + @kind if @kind.is_a?(Array) end end @@ -419,6 +421,34 @@ def initialize(config, flags) # changed to use fetch instead of delete. comment = options.delete(:comment) + if kinds = options[:kind] + kinds = [kinds] unless kinds.is_a?(Array) + kinds = kinds.map do |kind| + case kind + when "non-void expression" + # the actual list of types would be way too long + "Node" + when "pattern expression" + # the list of all possible types is too long with 37+ different classes + "Node" + when Hash + kind = kind.fetch("on error") + REMOVE_ON_ERROR_TYPES ? nil : kind + else + kind + end + end.compact + if kinds.size == 1 + kinds = kinds.first + kinds = nil if kinds == "Node" + end + options[:kind] = kinds + else + if type < NodeKindField + raise "Missing kind in config.yml for field #{@name}##{options.fetch(:name)}" + end + end + type.new(comment: comment, **options) end From ecbc4a67c973f512a5876c44efc2ec03ad92b1b6 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Wed, 25 Sep 2024 09:52:47 -0400 Subject: [PATCH 447/829] Fix up new types for block arguments and splats in prism compiler --- prism_compile.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/prism_compile.c b/prism_compile.c index f04268c370eaa1..e230587faafb44 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -1977,7 +1977,7 @@ pm_compile_index_operator_write_node(rb_iseq_t *iseq, const pm_index_operator_wr int boff = (node->block == NULL ? 0 : 1); int flag = PM_NODE_TYPE_P(node->receiver, PM_SELF_NODE) ? VM_CALL_FCALL : 0; struct rb_callinfo_kwarg *keywords = NULL; - int argc = pm_setup_args(node->arguments, node->block, &flag, &keywords, iseq, ret, scope_node, node_location); + int argc = pm_setup_args(node->arguments, (const pm_node_t *) node->block, &flag, &keywords, iseq, ret, scope_node, node_location); if ((argc > 0 || boff) && (flag & VM_CALL_KW_SPLAT)) { if (boff) { @@ -2084,7 +2084,7 @@ pm_compile_index_operator_write_node(rb_iseq_t *iseq, const pm_index_operator_wr * []= method. */ static void -pm_compile_index_control_flow_write_node(rb_iseq_t *iseq, const pm_node_t *node, const pm_node_t *receiver, const pm_arguments_node_t *arguments, const pm_node_t *block, const pm_node_t *value, const pm_node_location_t *node_location, LINK_ANCHOR *const ret, bool popped, pm_scope_node_t *scope_node) +pm_compile_index_control_flow_write_node(rb_iseq_t *iseq, const pm_node_t *node, const pm_node_t *receiver, const pm_arguments_node_t *arguments, const pm_block_argument_node_t *block, const pm_node_t *value, const pm_node_location_t *node_location, LINK_ANCHOR *const ret, bool popped, pm_scope_node_t *scope_node) { const pm_node_location_t location = *node_location; if (!popped) PUSH_INSN(ret, location, putnil); @@ -2093,7 +2093,7 @@ pm_compile_index_control_flow_write_node(rb_iseq_t *iseq, const pm_node_t *node, int boff = (block == NULL ? 0 : 1); int flag = PM_NODE_TYPE_P(receiver, PM_SELF_NODE) ? VM_CALL_FCALL : 0; struct rb_callinfo_kwarg *keywords = NULL; - int argc = pm_setup_args(arguments, block, &flag, &keywords, iseq, ret, scope_node, node_location); + int argc = pm_setup_args(arguments, (const pm_node_t *) block, &flag, &keywords, iseq, ret, scope_node, node_location); if ((argc > 0 || boff) && (flag & VM_CALL_KW_SPLAT)) { if (boff) { @@ -2648,8 +2648,7 @@ pm_compile_pattern(rb_iseq_t *iseq, pm_scope_node_t *scope_node, const pm_node_t CHECK(pm_compile_pattern_match(iseq, scope_node, cast->requireds.nodes[index], ret, next_loop_label, in_single_pattern, in_alternation_pattern, false, base_index + 4)); } - RUBY_ASSERT(PM_NODE_TYPE_P(cast->left, PM_SPLAT_NODE)); - const pm_splat_node_t *left = (const pm_splat_node_t *) cast->left; + const pm_splat_node_t *left = cast->left; if (left->expression != NULL) { PUSH_INSN1(ret, location, topn, INT2FIX(3)); @@ -2896,7 +2895,7 @@ pm_compile_pattern(rb_iseq_t *iseq, pm_scope_node_t *scope_node, const pm_node_t PUSH_INSN(ret, location, dup); CHECK(pm_compile_pattern_match(iseq, scope_node, cast->value, ret, match_failed_label, in_single_pattern, in_alternation_pattern, use_deconstructed_cache, base_index + 1)); - CHECK(pm_compile_pattern(iseq, scope_node, cast->target, ret, matched_label, match_failed_label, in_single_pattern, in_alternation_pattern, false, base_index)); + CHECK(pm_compile_pattern(iseq, scope_node, (const pm_node_t *) cast->target, ret, matched_label, match_failed_label, in_single_pattern, in_alternation_pattern, false, base_index)); PUSH_INSN(ret, location, putnil); PUSH_LABEL(ret, match_failed_label); @@ -4595,7 +4594,7 @@ pm_compile_target_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *cons int flags = 0; struct rb_callinfo_kwarg *kwargs = NULL; - int argc = pm_setup_args(cast->arguments, cast->block, &flags, &kwargs, iseq, parents, scope_node, &location); + int argc = pm_setup_args(cast->arguments, (const pm_node_t *) cast->block, &flags, &kwargs, iseq, parents, scope_node, &location); if (state != NULL) { PUSH_INSN1(writes, location, topn, INT2FIX(argc + 1)); From c32fd1b5ed6709dfbed3d19cac881886576e231b Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Mon, 23 Sep 2024 11:56:29 -0400 Subject: [PATCH 448/829] Add debugging code to vm_objtostring in ASAN To debug this issue on CI: http://ci.rvm.jp/logfiles/brlog.trunk_asan.20240922-002945 --- vm_insnhelper.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/vm_insnhelper.c b/vm_insnhelper.c index 543f31a3b1f56e..8174d7ee9a5d8a 100644 --- a/vm_insnhelper.c +++ b/vm_insnhelper.c @@ -6056,6 +6056,13 @@ VALUE rb_mod_name(VALUE); static VALUE vm_objtostring(const rb_iseq_t *iseq, VALUE recv, CALL_DATA cd) { + // Debugging code for ASAN issues such as: + // http://ci.rvm.jp/logfiles/brlog.trunk_asan.20240922-002945 + if (asan_poisoned_object_p(recv)) { + asan_unpoison_object(recv, false); + rb_bug("vm_objtostring: recv is poisoned (type %d)", TYPE(recv)); + } + int type = TYPE(recv); if (type == T_STRING) { return recv; From b77772496a9e2598366554086e6611fd37b85ec8 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Wed, 25 Sep 2024 11:14:14 -0400 Subject: [PATCH 449/829] Don't check poisoned for immediates --- vm_insnhelper.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vm_insnhelper.c b/vm_insnhelper.c index 8174d7ee9a5d8a..bd616b2422ca56 100644 --- a/vm_insnhelper.c +++ b/vm_insnhelper.c @@ -6058,7 +6058,7 @@ vm_objtostring(const rb_iseq_t *iseq, VALUE recv, CALL_DATA cd) { // Debugging code for ASAN issues such as: // http://ci.rvm.jp/logfiles/brlog.trunk_asan.20240922-002945 - if (asan_poisoned_object_p(recv)) { + if (!RB_IMMEDIATE_P(recv) && asan_poisoned_object_p(recv)) { asan_unpoison_object(recv, false); rb_bug("vm_objtostring: recv is poisoned (type %d)", TYPE(recv)); } From 57688cd62589d5c6021a0299c036d7785e64aad5 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Tue, 24 Sep 2024 12:52:39 -0400 Subject: [PATCH 450/829] [ruby/prism] Support a max depth to protect against malicious payloads https://github.com/ruby/prism/commit/a474017bbe --- prism/config.yml | 1 + prism/defines.h | 33 ++ prism/prism.c | 544 ++++++++++++++------------- prism/templates/src/diagnostic.c.erb | 3 +- 4 files changed, 312 insertions(+), 269 deletions(-) diff --git a/prism/config.yml b/prism/config.yml index 13b81a2f16aabf..fc86c9b3ed6dc6 100644 --- a/prism/config.yml +++ b/prism/config.yml @@ -185,6 +185,7 @@ errors: - MODULE_TERM - MULTI_ASSIGN_MULTI_SPLATS - MULTI_ASSIGN_UNEXPECTED_REST + - NESTING_TOO_DEEP - NO_LOCAL_VARIABLE - NOT_EXPRESSION - NUMBER_LITERAL_UNDERSCORE diff --git a/prism/defines.h b/prism/defines.h index a4246e67c8a0be..50962e060b0a52 100644 --- a/prism/defines.h +++ b/prism/defines.h @@ -25,6 +25,15 @@ #define __STDC_FORMAT_MACROS #include +/** + * When we are parsing using recursive descent, we want to protect against + * malicious payloads that could attempt to crash our parser. We do this by + * specifying a maximum depth to which we are allowed to recurse. + */ +#ifndef PRISM_DEPTH_MAXIMUM + #define PRISM_DEPTH_MAXIMUM 1000 +#endif + /** * By default, we compile with -fvisibility=hidden. When this is enabled, we * need to mark certain functions as being publically-visible. This macro does @@ -212,4 +221,28 @@ #define PRISM_ENCODING_EXCLUDE_FULL #endif +/** + * Support PRISM_LIKELY and PRISM_UNLIKELY to help the compiler optimize its + * branch predication. + */ +#if defined(__GNUC__) || defined(__clang__) + /** The compiler should predicate that this branch will be taken. */ + #define PRISM_LIKELY(x) __builtin_expect(!!(x), 1) + + /** The compiler should predicate that this branch will not be taken. */ + #define PRISM_UNLIKELY(x) __builtin_expect(!!(x), 0) +#elif defined(_MSC_VER) && (_MSC_VER >= 1400) + /** The compiler should predicate that this branch will be taken. */ + #define PRISM_LIKELY(x) __assume((x)) + + /** The compiler should predicate that this branch will not be taken. */ + #define PRISM_UNLIKELY(x) __assume(!(x)) +#else + /** Void because this platform does not support branch prediction hints. */ + #define PRISM_LIKELY(x) (x) + + /** Void because this platform does not support branch prediction hints. */ + #define PRISM_UNLIKELY(x) (x) +#endif + #endif diff --git a/prism/prism.c b/prism/prism.c index c80b0db41f6a20..99fb91115fd448 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -13167,15 +13167,15 @@ expect1_heredoc_term(pm_parser_t *parser, pm_lex_mode_t *lex_mode) { } static pm_node_t * -parse_expression(pm_parser_t *parser, pm_binding_power_t binding_power, bool accepts_command_call, pm_diagnostic_id_t diag_id); +parse_expression(pm_parser_t *parser, pm_binding_power_t binding_power, bool accepts_command_call, pm_diagnostic_id_t diag_id, uint16_t depth); /** * This is a wrapper of parse_expression, which also checks whether the * resulting node is a value expression. */ static pm_node_t * -parse_value_expression(pm_parser_t *parser, pm_binding_power_t binding_power, bool accepts_command_call, pm_diagnostic_id_t diag_id) { - pm_node_t *node = parse_expression(parser, binding_power, accepts_command_call, diag_id); +parse_value_expression(pm_parser_t *parser, pm_binding_power_t binding_power, bool accepts_command_call, pm_diagnostic_id_t diag_id, uint16_t depth) { + pm_node_t *node = parse_expression(parser, binding_power, accepts_command_call, diag_id, depth); pm_assert_value_expression(parser, node); return node; } @@ -13259,14 +13259,14 @@ token_begins_expression_p(pm_token_type_t type) { * prefixed by the * operator. */ static pm_node_t * -parse_starred_expression(pm_parser_t *parser, pm_binding_power_t binding_power, bool accepts_command_call, pm_diagnostic_id_t diag_id) { +parse_starred_expression(pm_parser_t *parser, pm_binding_power_t binding_power, bool accepts_command_call, pm_diagnostic_id_t diag_id, uint16_t depth) { if (accept1(parser, PM_TOKEN_USTAR)) { pm_token_t operator = parser->previous; - pm_node_t *expression = parse_value_expression(parser, binding_power, false, PM_ERR_EXPECT_EXPRESSION_AFTER_STAR); + pm_node_t *expression = parse_value_expression(parser, binding_power, false, PM_ERR_EXPECT_EXPRESSION_AFTER_STAR, (uint16_t) (depth + 1)); return (pm_node_t *) pm_splat_node_create(parser, &operator, expression); } - return parse_value_expression(parser, binding_power, accepts_command_call, diag_id); + return parse_value_expression(parser, binding_power, accepts_command_call, diag_id, depth); } /** @@ -13760,7 +13760,7 @@ parse_unwriteable_write(pm_parser_t *parser, pm_node_t *target, const pm_token_t * target node or a multi-target node. */ static pm_node_t * -parse_targets(pm_parser_t *parser, pm_node_t *first_target, pm_binding_power_t binding_power) { +parse_targets(pm_parser_t *parser, pm_node_t *first_target, pm_binding_power_t binding_power, uint16_t depth) { bool has_rest = PM_NODE_TYPE_P(first_target, PM_SPLAT_NODE); pm_multi_target_node_t *result = pm_multi_target_node_create(parser); @@ -13779,7 +13779,7 @@ parse_targets(pm_parser_t *parser, pm_node_t *first_target, pm_binding_power_t b pm_node_t *name = NULL; if (token_begins_expression_p(parser->current.type)) { - name = parse_expression(parser, binding_power, false, PM_ERR_EXPECT_EXPRESSION_AFTER_STAR); + name = parse_expression(parser, binding_power, false, PM_ERR_EXPECT_EXPRESSION_AFTER_STAR, (uint16_t) (depth + 1)); name = parse_target(parser, name, true, true); } @@ -13787,7 +13787,7 @@ parse_targets(pm_parser_t *parser, pm_node_t *first_target, pm_binding_power_t b pm_multi_target_node_targets_append(parser, result, splat); has_rest = true; } else if (token_begins_expression_p(parser->current.type)) { - pm_node_t *target = parse_expression(parser, binding_power, false, PM_ERR_EXPECT_EXPRESSION_AFTER_COMMA); + pm_node_t *target = parse_expression(parser, binding_power, false, PM_ERR_EXPECT_EXPRESSION_AFTER_COMMA, (uint16_t) (depth + 1)); target = parse_target(parser, target, true, false); pm_multi_target_node_targets_append(parser, result, target); @@ -13808,8 +13808,8 @@ parse_targets(pm_parser_t *parser, pm_node_t *first_target, pm_binding_power_t b * assignment. */ static pm_node_t * -parse_targets_validate(pm_parser_t *parser, pm_node_t *first_target, pm_binding_power_t binding_power) { - pm_node_t *result = parse_targets(parser, first_target, binding_power); +parse_targets_validate(pm_parser_t *parser, pm_node_t *first_target, pm_binding_power_t binding_power, uint16_t depth) { + pm_node_t *result = parse_targets(parser, first_target, binding_power, depth); accept1(parser, PM_TOKEN_NEWLINE); // Ensure that we have either an = or a ) after the targets. @@ -13824,7 +13824,7 @@ parse_targets_validate(pm_parser_t *parser, pm_node_t *first_target, pm_binding_ * Parse a list of statements separated by newlines or semicolons. */ static pm_statements_node_t * -parse_statements(pm_parser_t *parser, pm_context_t context) { +parse_statements(pm_parser_t *parser, pm_context_t context, uint16_t depth) { // First, skip past any optional terminators that might be at the beginning // of the statements. while (accept2(parser, PM_TOKEN_SEMICOLON, PM_TOKEN_NEWLINE)); @@ -13839,7 +13839,7 @@ parse_statements(pm_parser_t *parser, pm_context_t context) { context_push(parser, context); while (true) { - pm_node_t *node = parse_expression(parser, PM_BINDING_POWER_STATEMENT, true, PM_ERR_CANNOT_PARSE_EXPRESSION); + pm_node_t *node = parse_expression(parser, PM_BINDING_POWER_STATEMENT, true, PM_ERR_CANNOT_PARSE_EXPRESSION, (uint16_t) (depth + 1)); pm_statements_node_body_append(parser, statements, node, true); // If we're recovering from a syntax error, then we need to stop parsing @@ -13959,7 +13959,7 @@ pm_when_clause_static_literals_add(pm_parser_t *parser, pm_static_literals_t *li * Parse all of the elements of a hash. Return true if a double splat was found. */ static bool -parse_assocs(pm_parser_t *parser, pm_static_literals_t *literals, pm_node_t *node) { +parse_assocs(pm_parser_t *parser, pm_static_literals_t *literals, pm_node_t *node, uint16_t depth) { assert(PM_NODE_TYPE_P(node, PM_HASH_NODE) || PM_NODE_TYPE_P(node, PM_KEYWORD_HASH_NODE)); bool contains_keyword_splat = false; @@ -13978,9 +13978,9 @@ parse_assocs(pm_parser_t *parser, pm_static_literals_t *literals, pm_node_t *nod // inner hash to share the static literals with the outer // hash. parser->current_hash_keys = literals; - value = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_EXPECT_EXPRESSION_AFTER_SPLAT_HASH); + value = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_EXPECT_EXPRESSION_AFTER_SPLAT_HASH, (uint16_t) (depth + 1)); } else if (token_begins_expression_p(parser->current.type)) { - value = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_EXPECT_EXPRESSION_AFTER_SPLAT_HASH); + value = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_EXPECT_EXPRESSION_AFTER_SPLAT_HASH, (uint16_t) (depth + 1)); } else { pm_parser_scope_forwarding_keywords_check(parser, &operator); } @@ -14000,7 +14000,7 @@ parse_assocs(pm_parser_t *parser, pm_static_literals_t *literals, pm_node_t *nod pm_node_t *value = NULL; if (token_begins_expression_p(parser->current.type)) { - value = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_HASH_EXPRESSION_AFTER_LABEL); + value = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_HASH_EXPRESSION_AFTER_LABEL, (uint16_t) (depth + 1)); } else { if (parser->encoding->isupper_char(label.start, (label.end - 1) - label.start)) { pm_token_t constant = { .type = PM_TOKEN_CONSTANT, .start = label.start, .end = label.end - 1 }; @@ -14030,7 +14030,7 @@ parse_assocs(pm_parser_t *parser, pm_static_literals_t *literals, pm_node_t *nod break; } default: { - pm_node_t *key = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_HASH_KEY); + pm_node_t *key = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_HASH_KEY, (uint16_t) (depth + 1)); // Hash keys that are strings are automatically frozen. We will // mark that here. @@ -14048,7 +14048,7 @@ parse_assocs(pm_parser_t *parser, pm_static_literals_t *literals, pm_node_t *nod operator = parser->previous; } - pm_node_t *value = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_HASH_VALUE); + pm_node_t *value = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_HASH_VALUE, (uint16_t) (depth + 1)); element = (pm_node_t *) pm_assoc_node_create(parser, key, &operator, value); break; } @@ -14094,7 +14094,7 @@ parse_arguments_append(pm_parser_t *parser, pm_arguments_t *arguments, pm_node_t * Parse a list of arguments. */ static void -parse_arguments(pm_parser_t *parser, pm_arguments_t *arguments, bool accepts_forwarding, pm_token_type_t terminator) { +parse_arguments(pm_parser_t *parser, pm_arguments_t *arguments, bool accepts_forwarding, pm_token_type_t terminator, uint16_t depth) { pm_binding_power_t binding_power = pm_binding_powers[parser->current.type].left; // First we need to check if the next token is one that could be the start of @@ -14133,7 +14133,7 @@ parse_arguments(pm_parser_t *parser, pm_arguments_t *arguments, bool accepts_for argument = (pm_node_t *) hash; pm_static_literals_t hash_keys = { 0 }; - bool contains_keyword_splat = parse_assocs(parser, &hash_keys, (pm_node_t *) hash); + bool contains_keyword_splat = parse_assocs(parser, &hash_keys, (pm_node_t *) hash, (uint16_t) (depth + 1)); parse_arguments_append(parser, arguments, argument); @@ -14152,7 +14152,7 @@ parse_arguments(pm_parser_t *parser, pm_arguments_t *arguments, bool accepts_for pm_node_t *expression = NULL; if (token_begins_expression_p(parser->current.type)) { - expression = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_EXPECT_ARGUMENT); + expression = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_EXPECT_ARGUMENT, (uint16_t) (depth + 1)); } else { pm_parser_scope_forwarding_block_check(parser, &operator); } @@ -14175,7 +14175,7 @@ parse_arguments(pm_parser_t *parser, pm_arguments_t *arguments, bool accepts_for pm_parser_scope_forwarding_positionals_check(parser, &operator); argument = (pm_node_t *) pm_splat_node_create(parser, &operator, NULL); } else { - pm_node_t *expression = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_EXPECT_EXPRESSION_AFTER_SPLAT); + pm_node_t *expression = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_EXPECT_EXPRESSION_AFTER_SPLAT, (uint16_t) (depth + 1)); if (parsed_bare_hash) { pm_parser_err(parser, operator.start, expression->location.end, PM_ERR_ARGUMENT_SPLAT_AFTER_ASSOC_SPLAT); @@ -14195,7 +14195,7 @@ parse_arguments(pm_parser_t *parser, pm_arguments_t *arguments, bool accepts_for // If the token begins an expression then this ... was not actually // argument forwarding but was instead a range. pm_token_t operator = parser->previous; - pm_node_t *right = parse_expression(parser, PM_BINDING_POWER_RANGE, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR); + pm_node_t *right = parse_expression(parser, PM_BINDING_POWER_RANGE, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1)); argument = (pm_node_t *) pm_range_node_create(parser, NULL, &operator, right); } else { pm_parser_scope_forwarding_all_check(parser, &parser->previous); @@ -14215,7 +14215,7 @@ parse_arguments(pm_parser_t *parser, pm_arguments_t *arguments, bool accepts_for /* fallthrough */ default: { if (argument == NULL) { - argument = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, !parsed_first_argument, PM_ERR_EXPECT_ARGUMENT); + argument = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, !parsed_first_argument, PM_ERR_EXPECT_ARGUMENT, (uint16_t) (depth + 1)); } bool contains_keywords = false; @@ -14241,7 +14241,7 @@ parse_arguments(pm_parser_t *parser, pm_arguments_t *arguments, bool accepts_for pm_hash_key_static_literals_add(parser, &hash_keys, argument); // Finish parsing the one we are part way through. - pm_node_t *value = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_HASH_VALUE); + pm_node_t *value = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_HASH_VALUE, (uint16_t) (depth + 1)); argument = (pm_node_t *) pm_assoc_node_create(parser, argument, &operator, value); pm_keyword_hash_node_elements_append(bare_hash, argument); @@ -14252,7 +14252,7 @@ parse_arguments(pm_parser_t *parser, pm_arguments_t *arguments, bool accepts_for token_begins_expression_p(parser->current.type) || match2(parser, PM_TOKEN_USTAR_STAR, PM_TOKEN_LABEL) )) { - contains_keyword_splat = parse_assocs(parser, &hash_keys, (pm_node_t *) bare_hash); + contains_keyword_splat = parse_assocs(parser, &hash_keys, (pm_node_t *) bare_hash, (uint16_t) (depth + 1)); } pm_static_literals_free(&hash_keys); @@ -14448,7 +14448,8 @@ parse_parameters( bool uses_parentheses, bool allows_trailing_comma, bool allows_forwarding_parameters, - bool accepts_blocks_in_defaults + bool accepts_blocks_in_defaults, + uint16_t depth ) { pm_parameters_node_t *params = pm_parameters_node_create(parser); bool looping = true; @@ -14567,7 +14568,7 @@ parse_parameters( uint32_t reads = parser->version == PM_OPTIONS_VERSION_CRUBY_3_3 ? pm_locals_reads(&parser->current_scope->locals, name_id) : 0; if (accepts_blocks_in_defaults) pm_accepts_block_stack_push(parser, true); - pm_node_t *value = parse_value_expression(parser, binding_power, false, PM_ERR_PARAMETER_NO_DEFAULT); + pm_node_t *value = parse_value_expression(parser, binding_power, false, PM_ERR_PARAMETER_NO_DEFAULT, (uint16_t) (depth + 1)); if (accepts_blocks_in_defaults) pm_accepts_block_stack_pop(parser); pm_optional_parameter_node_t *param = pm_optional_parameter_node_create(parser, &name, &operator, value); @@ -14662,7 +14663,7 @@ parse_parameters( uint32_t reads = parser->version == PM_OPTIONS_VERSION_CRUBY_3_3 ? pm_locals_reads(&parser->current_scope->locals, name_id) : 0; if (accepts_blocks_in_defaults) pm_accepts_block_stack_push(parser, true); - pm_node_t *value = parse_value_expression(parser, binding_power, false, PM_ERR_PARAMETER_NO_DEFAULT_KW); + pm_node_t *value = parse_value_expression(parser, binding_power, false, PM_ERR_PARAMETER_NO_DEFAULT_KW, (uint16_t) (depth + 1)); if (accepts_blocks_in_defaults) pm_accepts_block_stack_pop(parser); if (parser->version == PM_OPTIONS_VERSION_CRUBY_3_3 && (pm_locals_reads(&parser->current_scope->locals, name_id) != reads)) { @@ -14923,7 +14924,7 @@ typedef enum { * nodes pointing to each other from the top. */ static inline void -parse_rescues(pm_parser_t *parser, size_t opening_newline_index, const pm_token_t *opening, pm_begin_node_t *parent_node, pm_rescues_type_t type) { +parse_rescues(pm_parser_t *parser, size_t opening_newline_index, const pm_token_t *opening, pm_begin_node_t *parent_node, pm_rescues_type_t type, uint16_t depth) { pm_rescue_node_t *current = NULL; while (match1(parser, PM_TOKEN_KEYWORD_RESCUE)) { @@ -14940,7 +14941,7 @@ parse_rescues(pm_parser_t *parser, size_t opening_newline_index, const pm_token_ parser_lex(parser); pm_rescue_node_operator_set(rescue, &parser->previous); - pm_node_t *reference = parse_expression(parser, PM_BINDING_POWER_INDEX, false, PM_ERR_RESCUE_VARIABLE); + pm_node_t *reference = parse_expression(parser, PM_BINDING_POWER_INDEX, false, PM_ERR_RESCUE_VARIABLE, (uint16_t) (depth + 1)); reference = parse_target(parser, reference, false, false); pm_rescue_node_reference_set(rescue, reference); @@ -14958,7 +14959,7 @@ parse_rescues(pm_parser_t *parser, size_t opening_newline_index, const pm_token_ // we'll attempt to parse it here and any others delimited by commas. do { - pm_node_t *expression = parse_starred_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_RESCUE_EXPRESSION); + pm_node_t *expression = parse_starred_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_RESCUE_EXPRESSION, (uint16_t) (depth + 1)); pm_rescue_node_exceptions_append(rescue, expression); // If we hit a newline, then this is the end of the rescue expression. We @@ -14970,7 +14971,7 @@ parse_rescues(pm_parser_t *parser, size_t opening_newline_index, const pm_token_ if (accept1(parser, PM_TOKEN_EQUAL_GREATER)) { pm_rescue_node_operator_set(rescue, &parser->previous); - pm_node_t *reference = parse_expression(parser, PM_BINDING_POWER_INDEX, false, PM_ERR_RESCUE_VARIABLE); + pm_node_t *reference = parse_expression(parser, PM_BINDING_POWER_INDEX, false, PM_ERR_RESCUE_VARIABLE, (uint16_t) (depth + 1)); reference = parse_target(parser, reference, false, false); pm_rescue_node_reference_set(rescue, reference); @@ -15002,7 +15003,7 @@ parse_rescues(pm_parser_t *parser, size_t opening_newline_index, const pm_token_ default: assert(false && "unreachable"); context = PM_CONTEXT_BEGIN_RESCUE; break; } - pm_statements_node_t *statements = parse_statements(parser, context); + pm_statements_node_t *statements = parse_statements(parser, context, (uint16_t) (depth + 1)); if (statements != NULL) pm_rescue_node_statements_set(rescue, statements); pm_accepts_block_stack_pop(parser); @@ -15058,7 +15059,7 @@ parse_rescues(pm_parser_t *parser, size_t opening_newline_index, const pm_token_ default: assert(false && "unreachable"); context = PM_CONTEXT_BEGIN_RESCUE; break; } - else_statements = parse_statements(parser, context); + else_statements = parse_statements(parser, context, (uint16_t) (depth + 1)); pm_accepts_block_stack_pop(parser); accept2(parser, PM_TOKEN_NEWLINE, PM_TOKEN_SEMICOLON); @@ -15095,7 +15096,7 @@ parse_rescues(pm_parser_t *parser, size_t opening_newline_index, const pm_token_ default: assert(false && "unreachable"); context = PM_CONTEXT_BEGIN_RESCUE; break; } - ensure_statements = parse_statements(parser, context); + ensure_statements = parse_statements(parser, context, (uint16_t) (depth + 1)); pm_accepts_block_stack_pop(parser); accept2(parser, PM_TOKEN_NEWLINE, PM_TOKEN_SEMICOLON); @@ -15119,11 +15120,11 @@ parse_rescues(pm_parser_t *parser, size_t opening_newline_index, const pm_token_ * class, module, def, etc.). */ static pm_begin_node_t * -parse_rescues_implicit_begin(pm_parser_t *parser, size_t opening_newline_index, const pm_token_t *opening, const uint8_t *start, pm_statements_node_t *statements, pm_rescues_type_t type) { +parse_rescues_implicit_begin(pm_parser_t *parser, size_t opening_newline_index, const pm_token_t *opening, const uint8_t *start, pm_statements_node_t *statements, pm_rescues_type_t type, uint16_t depth) { pm_token_t begin_keyword = not_provided(parser); pm_begin_node_t *node = pm_begin_node_create(parser, &begin_keyword, statements); - parse_rescues(parser, opening_newline_index, opening, node, type); + parse_rescues(parser, opening_newline_index, opening, node, type, (uint16_t) (depth + 1)); node->base.location.start = start; return node; @@ -15138,7 +15139,8 @@ parse_block_parameters( bool allows_trailing_comma, const pm_token_t *opening, bool is_lambda_literal, - bool accepts_blocks_in_defaults + bool accepts_blocks_in_defaults, + uint16_t depth ) { pm_parameters_node_t *parameters = NULL; if (!match1(parser, PM_TOKEN_SEMICOLON)) { @@ -15148,7 +15150,8 @@ parse_block_parameters( false, allows_trailing_comma, false, - accepts_blocks_in_defaults + accepts_blocks_in_defaults, + (uint16_t) (depth + 1) ); } @@ -15302,7 +15305,7 @@ parse_blocklike_parameters(pm_parser_t *parser, pm_node_t *parameters, const pm_ * Parse a block. */ static pm_block_node_t * -parse_block(pm_parser_t *parser) { +parse_block(pm_parser_t *parser, uint16_t depth) { pm_token_t opening = parser->previous; accept1(parser, PM_TOKEN_NEWLINE); @@ -15318,7 +15321,7 @@ parse_block(pm_parser_t *parser) { parser->command_start = true; parser_lex(parser); } else { - block_parameters = parse_block_parameters(parser, true, &block_parameters_opening, false, true); + block_parameters = parse_block_parameters(parser, true, &block_parameters_opening, false, true, (uint16_t) (depth + 1)); accept1(parser, PM_TOKEN_NEWLINE); parser->command_start = true; expect1(parser, PM_TOKEN_PIPE, PM_ERR_BLOCK_PARAM_PIPE_TERM); @@ -15332,7 +15335,7 @@ parse_block(pm_parser_t *parser) { if (opening.type == PM_TOKEN_BRACE_LEFT) { if (!match1(parser, PM_TOKEN_BRACE_RIGHT)) { - statements = (pm_node_t *) parse_statements(parser, PM_CONTEXT_BLOCK_BRACES); + statements = (pm_node_t *) parse_statements(parser, PM_CONTEXT_BLOCK_BRACES, (uint16_t) (depth + 1)); } expect1(parser, PM_TOKEN_BRACE_RIGHT, PM_ERR_BLOCK_TERM_BRACE); @@ -15340,13 +15343,13 @@ parse_block(pm_parser_t *parser) { if (!match1(parser, PM_TOKEN_KEYWORD_END)) { if (!match3(parser, PM_TOKEN_KEYWORD_RESCUE, PM_TOKEN_KEYWORD_ELSE, PM_TOKEN_KEYWORD_ENSURE)) { pm_accepts_block_stack_push(parser, true); - statements = (pm_node_t *) parse_statements(parser, PM_CONTEXT_BLOCK_KEYWORDS); + statements = (pm_node_t *) parse_statements(parser, PM_CONTEXT_BLOCK_KEYWORDS, (uint16_t) (depth + 1)); pm_accepts_block_stack_pop(parser); } if (match2(parser, PM_TOKEN_KEYWORD_RESCUE, PM_TOKEN_KEYWORD_ENSURE)) { assert(statements == NULL || PM_NODE_TYPE_P(statements, PM_STATEMENTS_NODE)); - statements = (pm_node_t *) parse_rescues_implicit_begin(parser, 0, NULL, opening.start, (pm_statements_node_t *) statements, PM_RESCUES_BLOCK); + statements = (pm_node_t *) parse_rescues_implicit_begin(parser, 0, NULL, opening.start, (pm_statements_node_t *) statements, PM_RESCUES_BLOCK, (uint16_t) (depth + 1)); } } @@ -15369,7 +15372,7 @@ parse_block(pm_parser_t *parser) { * arguments, or blocks). */ static bool -parse_arguments_list(pm_parser_t *parser, pm_arguments_t *arguments, bool accepts_block, bool accepts_command_call) { +parse_arguments_list(pm_parser_t *parser, pm_arguments_t *arguments, bool accepts_block, bool accepts_command_call, uint16_t depth) { bool found = false; if (accept1(parser, PM_TOKEN_PARENTHESIS_LEFT)) { @@ -15380,7 +15383,7 @@ parse_arguments_list(pm_parser_t *parser, pm_arguments_t *arguments, bool accept arguments->closing_loc = PM_LOCATION_TOKEN_VALUE(&parser->previous); } else { pm_accepts_block_stack_push(parser, true); - parse_arguments(parser, arguments, accepts_block, PM_TOKEN_PARENTHESIS_RIGHT); + parse_arguments(parser, arguments, accepts_block, PM_TOKEN_PARENTHESIS_RIGHT, (uint16_t) (depth + 1)); if (!accept1(parser, PM_TOKEN_PARENTHESIS_RIGHT)) { PM_PARSER_ERR_TOKEN_FORMAT(parser, parser->current, PM_ERR_ARGUMENT_TERM_PAREN, pm_token_type_human(parser->current.type)); @@ -15398,7 +15401,7 @@ parse_arguments_list(pm_parser_t *parser, pm_arguments_t *arguments, bool accept // If we get here, then the subsequent token cannot be used as an infix // operator. In this case we assume the subsequent token is part of an // argument to this method call. - parse_arguments(parser, arguments, accepts_block, PM_TOKEN_EOF); + parse_arguments(parser, arguments, accepts_block, PM_TOKEN_EOF, (uint16_t) (depth + 1)); // If we have done with the arguments and still not consumed the comma, // then we have a trailing comma where we need to check whether it is @@ -15418,11 +15421,11 @@ parse_arguments_list(pm_parser_t *parser, pm_arguments_t *arguments, bool accept if (accept1(parser, PM_TOKEN_BRACE_LEFT)) { found |= true; - block = parse_block(parser); + block = parse_block(parser, (uint16_t) (depth + 1)); pm_arguments_validate_block(parser, arguments, block); } else if (pm_accepts_block_stack_p(parser) && accept1(parser, PM_TOKEN_KEYWORD_DO)) { found |= true; - block = parse_block(parser); + block = parse_block(parser, (uint16_t) (depth + 1)); } if (block != NULL) { @@ -15677,10 +15680,10 @@ pop_block_exits(pm_parser_t *parser, pm_node_list_t *previous_block_exits) { } static inline pm_node_t * -parse_predicate(pm_parser_t *parser, pm_binding_power_t binding_power, pm_context_t context, pm_token_t *then_keyword) { +parse_predicate(pm_parser_t *parser, pm_binding_power_t binding_power, pm_context_t context, pm_token_t *then_keyword, uint16_t depth) { context_push(parser, PM_CONTEXT_PREDICATE); pm_diagnostic_id_t error_id = context == PM_CONTEXT_IF ? PM_ERR_CONDITIONAL_IF_PREDICATE : PM_ERR_CONDITIONAL_UNLESS_PREDICATE; - pm_node_t *predicate = parse_value_expression(parser, binding_power, true, error_id); + pm_node_t *predicate = parse_value_expression(parser, binding_power, true, error_id, (uint16_t) (depth + 1)); // Predicates are closed by a term, a "then", or a term and then a "then". bool predicate_closed = accept2(parser, PM_TOKEN_NEWLINE, PM_TOKEN_SEMICOLON); @@ -15699,19 +15702,19 @@ parse_predicate(pm_parser_t *parser, pm_binding_power_t binding_power, pm_contex } static inline pm_node_t * -parse_conditional(pm_parser_t *parser, pm_context_t context, size_t opening_newline_index, bool if_after_else) { +parse_conditional(pm_parser_t *parser, pm_context_t context, size_t opening_newline_index, bool if_after_else, uint16_t depth) { pm_node_list_t current_block_exits = { 0 }; pm_node_list_t *previous_block_exits = push_block_exits(parser, ¤t_block_exits); pm_token_t keyword = parser->previous; pm_token_t then_keyword = not_provided(parser); - pm_node_t *predicate = parse_predicate(parser, PM_BINDING_POWER_MODIFIER, context, &then_keyword); + pm_node_t *predicate = parse_predicate(parser, PM_BINDING_POWER_MODIFIER, context, &then_keyword, (uint16_t) (depth + 1)); pm_statements_node_t *statements = NULL; if (!match3(parser, PM_TOKEN_KEYWORD_ELSIF, PM_TOKEN_KEYWORD_ELSE, PM_TOKEN_KEYWORD_END)) { pm_accepts_block_stack_push(parser, true); - statements = parse_statements(parser, context); + statements = parse_statements(parser, context, (uint16_t) (depth + 1)); pm_accepts_block_stack_pop(parser); accept2(parser, PM_TOKEN_NEWLINE, PM_TOKEN_SEMICOLON); } @@ -15745,10 +15748,10 @@ parse_conditional(pm_parser_t *parser, pm_context_t context, size_t opening_newl pm_token_t elsif_keyword = parser->current; parser_lex(parser); - pm_node_t *predicate = parse_predicate(parser, PM_BINDING_POWER_MODIFIER, PM_CONTEXT_ELSIF, &then_keyword); + pm_node_t *predicate = parse_predicate(parser, PM_BINDING_POWER_MODIFIER, PM_CONTEXT_ELSIF, &then_keyword, (uint16_t) (depth + 1)); pm_accepts_block_stack_push(parser, true); - pm_statements_node_t *statements = parse_statements(parser, PM_CONTEXT_ELSIF); + pm_statements_node_t *statements = parse_statements(parser, PM_CONTEXT_ELSIF, (uint16_t) (depth + 1)); pm_accepts_block_stack_pop(parser); accept2(parser, PM_TOKEN_NEWLINE, PM_TOKEN_SEMICOLON); @@ -15766,7 +15769,7 @@ parse_conditional(pm_parser_t *parser, pm_context_t context, size_t opening_newl pm_token_t else_keyword = parser->previous; pm_accepts_block_stack_push(parser, true); - pm_statements_node_t *else_statements = parse_statements(parser, PM_CONTEXT_ELSE); + pm_statements_node_t *else_statements = parse_statements(parser, PM_CONTEXT_ELSE, (uint16_t) (depth + 1)); pm_accepts_block_stack_pop(parser); accept2(parser, PM_TOKEN_NEWLINE, PM_TOKEN_SEMICOLON); @@ -15923,7 +15926,7 @@ parse_unescaped_encoding(const pm_parser_t *parser) { * parsed as a string part, then NULL is returned. */ static pm_node_t * -parse_string_part(pm_parser_t *parser) { +parse_string_part(pm_parser_t *parser, uint16_t depth) { switch (parser->current.type) { // Here the lexer has returned to us plain string content. In this case // we'll create a string node that has no opening or closing and return that @@ -15964,7 +15967,7 @@ parse_string_part(pm_parser_t *parser) { if (!match1(parser, PM_TOKEN_EMBEXPR_END)) { pm_accepts_block_stack_push(parser, true); - statements = parse_statements(parser, PM_CONTEXT_EMBEXPR); + statements = parse_statements(parser, PM_CONTEXT_EMBEXPR, (uint16_t) (depth + 1)); pm_accepts_block_stack_pop(parser); } @@ -16089,7 +16092,7 @@ parse_operator_symbol(pm_parser_t *parser, const pm_token_t *opening, pm_lex_sta * symbols. */ static pm_node_t * -parse_symbol(pm_parser_t *parser, pm_lex_mode_t *lex_mode, pm_lex_state_t next_state) { +parse_symbol(pm_parser_t *parser, pm_lex_mode_t *lex_mode, pm_lex_state_t next_state, uint16_t depth) { const pm_token_t opening = parser->previous; if (lex_mode->mode != PM_LEX_STRING) { @@ -16135,7 +16138,7 @@ parse_symbol(pm_parser_t *parser, pm_lex_mode_t *lex_mode, pm_lex_state_t next_s } // Now we can parse the first part of the symbol. - pm_node_t *part = parse_string_part(parser); + pm_node_t *part = parse_string_part(parser, (uint16_t) (depth + 1)); // If we got a string part, then it's possible that we could transform // what looks like an interpolated symbol into a regular symbol. @@ -16150,7 +16153,7 @@ parse_symbol(pm_parser_t *parser, pm_lex_mode_t *lex_mode, pm_lex_state_t next_s if (part) pm_interpolated_symbol_node_append(symbol, part); while (!match2(parser, PM_TOKEN_STRING_END, PM_TOKEN_EOF)) { - if ((part = parse_string_part(parser)) != NULL) { + if ((part = parse_string_part(parser, (uint16_t) (depth + 1))) != NULL) { pm_interpolated_symbol_node_append(symbol, part); } } @@ -16226,7 +16229,7 @@ parse_symbol(pm_parser_t *parser, pm_lex_mode_t *lex_mode, pm_lex_state_t next_s * constant, or an interpolated symbol. */ static inline pm_node_t * -parse_undef_argument(pm_parser_t *parser) { +parse_undef_argument(pm_parser_t *parser, uint16_t depth) { switch (parser->current.type) { case PM_CASE_OPERATOR: { const pm_token_t opening = not_provided(parser); @@ -16251,7 +16254,7 @@ parse_undef_argument(pm_parser_t *parser) { pm_lex_mode_t lex_mode = *parser->lex_modes.current; parser_lex(parser); - return parse_symbol(parser, &lex_mode, PM_LEX_STATE_NONE); + return parse_symbol(parser, &lex_mode, PM_LEX_STATE_NONE, (uint16_t) (depth + 1)); } default: pm_parser_err_current(parser, PM_ERR_UNDEF_ARGUMENT); @@ -16266,7 +16269,7 @@ parse_undef_argument(pm_parser_t *parser) { * between the first and second arguments. */ static inline pm_node_t * -parse_alias_argument(pm_parser_t *parser, bool first) { +parse_alias_argument(pm_parser_t *parser, bool first, uint16_t depth) { switch (parser->current.type) { case PM_CASE_OPERATOR: { const pm_token_t opening = not_provided(parser); @@ -16292,7 +16295,7 @@ parse_alias_argument(pm_parser_t *parser, bool first) { pm_lex_mode_t lex_mode = *parser->lex_modes.current; parser_lex(parser); - return parse_symbol(parser, &lex_mode, first ? PM_LEX_STATE_FNAME | PM_LEX_STATE_FITEM : PM_LEX_STATE_NONE); + return parse_symbol(parser, &lex_mode, first ? PM_LEX_STATE_FNAME | PM_LEX_STATE_FITEM : PM_LEX_STATE_NONE, (uint16_t) (depth + 1)); } case PM_TOKEN_BACK_REFERENCE: parser_lex(parser); @@ -16492,7 +16495,7 @@ parse_strings_empty_content(const uint8_t *location) { * Parse a set of strings that could be concatenated together. */ static inline pm_node_t * -parse_strings(pm_parser_t *parser, pm_node_t *current) { +parse_strings(pm_parser_t *parser, pm_node_t *current, uint16_t depth) { assert(parser->current.type == PM_TOKEN_STRING_BEGIN); bool concating = false; @@ -16624,7 +16627,7 @@ parse_strings(pm_parser_t *parser, pm_node_t *current) { pm_node_list_append(&parts, part); while (!match3(parser, PM_TOKEN_STRING_END, PM_TOKEN_LABEL_END, PM_TOKEN_EOF)) { - if ((part = parse_string_part(parser)) != NULL) { + if ((part = parse_string_part(parser, (uint16_t) (depth + 1))) != NULL) { pm_node_list_append(&parts, part); } } @@ -16649,7 +16652,7 @@ parse_strings(pm_parser_t *parser, pm_node_t *current) { pm_node_t *part; while (!match3(parser, PM_TOKEN_STRING_END, PM_TOKEN_LABEL_END, PM_TOKEN_EOF)) { - if ((part = parse_string_part(parser)) != NULL) { + if ((part = parse_string_part(parser, (uint16_t) (depth + 1))) != NULL) { pm_node_list_append(&parts, part); } } @@ -16709,7 +16712,7 @@ parse_strings(pm_parser_t *parser, pm_node_t *current) { #define PM_PARSE_PATTERN_MULTI 2 static pm_node_t * -parse_pattern(pm_parser_t *parser, pm_constant_id_list_t *captures, uint8_t flags, pm_diagnostic_id_t diag_id); +parse_pattern(pm_parser_t *parser, pm_constant_id_list_t *captures, uint8_t flags, pm_diagnostic_id_t diag_id, uint16_t depth); /** * Add the newly created local to the list of captures for this pattern matching @@ -16732,7 +16735,7 @@ parse_pattern_capture(pm_parser_t *parser, pm_constant_id_list_t *captures, pm_c * Accept any number of constants joined by :: delimiters. */ static pm_node_t * -parse_pattern_constant_path(pm_parser_t *parser, pm_constant_id_list_t *captures, pm_node_t *node) { +parse_pattern_constant_path(pm_parser_t *parser, pm_constant_id_list_t *captures, pm_node_t *node, uint16_t depth) { // Now, if there are any :: operators that follow, parse them as constant // path nodes. while (accept1(parser, PM_TOKEN_COLON_COLON)) { @@ -16757,7 +16760,7 @@ parse_pattern_constant_path(pm_parser_t *parser, pm_constant_id_list_t *captures accept1(parser, PM_TOKEN_NEWLINE); if (!accept1(parser, PM_TOKEN_BRACKET_RIGHT)) { - inner = parse_pattern(parser, captures, PM_PARSE_PATTERN_TOP | PM_PARSE_PATTERN_MULTI, PM_ERR_PATTERN_EXPRESSION_AFTER_BRACKET); + inner = parse_pattern(parser, captures, PM_PARSE_PATTERN_TOP | PM_PARSE_PATTERN_MULTI, PM_ERR_PATTERN_EXPRESSION_AFTER_BRACKET, (uint16_t) (depth + 1)); accept1(parser, PM_TOKEN_NEWLINE); expect1(parser, PM_TOKEN_BRACKET_RIGHT, PM_ERR_PATTERN_TERM_BRACKET); } @@ -16769,7 +16772,7 @@ parse_pattern_constant_path(pm_parser_t *parser, pm_constant_id_list_t *captures accept1(parser, PM_TOKEN_NEWLINE); if (!accept1(parser, PM_TOKEN_PARENTHESIS_RIGHT)) { - inner = parse_pattern(parser, captures, PM_PARSE_PATTERN_TOP | PM_PARSE_PATTERN_MULTI, PM_ERR_PATTERN_EXPRESSION_AFTER_PAREN); + inner = parse_pattern(parser, captures, PM_PARSE_PATTERN_TOP | PM_PARSE_PATTERN_MULTI, PM_ERR_PATTERN_EXPRESSION_AFTER_PAREN, (uint16_t) (depth + 1)); accept1(parser, PM_TOKEN_NEWLINE); expect1(parser, PM_TOKEN_PARENTHESIS_RIGHT, PM_ERR_PATTERN_TERM_PAREN); } @@ -16995,7 +16998,7 @@ parse_pattern_hash_key(pm_parser_t *parser, pm_static_literals_t *keys, pm_node_ * Parse a hash pattern. */ static pm_hash_pattern_node_t * -parse_pattern_hash(pm_parser_t *parser, pm_constant_id_list_t *captures, pm_node_t *first_node) { +parse_pattern_hash(pm_parser_t *parser, pm_constant_id_list_t *captures, pm_node_t *first_node, uint16_t depth) { pm_node_list_t assocs = { 0 }; pm_static_literals_t keys = { 0 }; pm_node_t *rest = NULL; @@ -17017,7 +17020,7 @@ parse_pattern_hash(pm_parser_t *parser, pm_constant_id_list_t *captures, pm_node } else { // Here we have a value for the first assoc in the list, so // we will parse it now. - value = parse_pattern(parser, captures, PM_PARSE_PATTERN_SINGLE, PM_ERR_PATTERN_EXPRESSION_AFTER_KEY); + value = parse_pattern(parser, captures, PM_PARSE_PATTERN_SINGLE, PM_ERR_PATTERN_EXPRESSION_AFTER_KEY, (uint16_t) (depth + 1)); } pm_token_t operator = not_provided(parser); @@ -17064,7 +17067,7 @@ parse_pattern_hash(pm_parser_t *parser, pm_constant_id_list_t *captures, pm_node pm_node_t *key; if (match1(parser, PM_TOKEN_STRING_BEGIN)) { - key = parse_strings(parser, NULL); + key = parse_strings(parser, NULL, (uint16_t) (depth + 1)); if (PM_NODE_TYPE_P(key, PM_INTERPOLATED_SYMBOL_NODE)) { pm_parser_err_node(parser, key, PM_ERR_PATTERN_HASH_KEY_INTERPOLATED); @@ -17082,7 +17085,7 @@ parse_pattern_hash(pm_parser_t *parser, pm_constant_id_list_t *captures, pm_node if (match7(parser, PM_TOKEN_COMMA, PM_TOKEN_KEYWORD_THEN, PM_TOKEN_BRACE_RIGHT, PM_TOKEN_BRACKET_RIGHT, PM_TOKEN_PARENTHESIS_RIGHT, PM_TOKEN_NEWLINE, PM_TOKEN_SEMICOLON)) { value = parse_pattern_hash_implicit_value(parser, captures, (pm_symbol_node_t *) key); } else { - value = parse_pattern(parser, captures, PM_PARSE_PATTERN_SINGLE, PM_ERR_PATTERN_EXPRESSION_AFTER_KEY); + value = parse_pattern(parser, captures, PM_PARSE_PATTERN_SINGLE, PM_ERR_PATTERN_EXPRESSION_AFTER_KEY, (uint16_t) (depth + 1)); } pm_token_t operator = not_provided(parser); @@ -17107,7 +17110,7 @@ parse_pattern_hash(pm_parser_t *parser, pm_constant_id_list_t *captures, pm_node * Parse a pattern expression primitive. */ static pm_node_t * -parse_pattern_primitive(pm_parser_t *parser, pm_constant_id_list_t *captures, pm_diagnostic_id_t diag_id) { +parse_pattern_primitive(pm_parser_t *parser, pm_constant_id_list_t *captures, pm_diagnostic_id_t diag_id, uint16_t depth) { switch (parser->current.type) { case PM_TOKEN_IDENTIFIER: case PM_TOKEN_METHOD_NAME: { @@ -17139,7 +17142,7 @@ parse_pattern_primitive(pm_parser_t *parser, pm_constant_id_list_t *captures, pm // Otherwise, we'll parse the inner pattern, then deal with it depending // on the type it returns. - pm_node_t *inner = parse_pattern(parser, captures, PM_PARSE_PATTERN_MULTI, PM_ERR_PATTERN_EXPRESSION_AFTER_BRACKET); + pm_node_t *inner = parse_pattern(parser, captures, PM_PARSE_PATTERN_MULTI, PM_ERR_PATTERN_EXPRESSION_AFTER_BRACKET, (uint16_t) (depth + 1)); accept1(parser, PM_TOKEN_NEWLINE); expect1(parser, PM_TOKEN_BRACKET_RIGHT, PM_ERR_PATTERN_TERM_BRACKET); @@ -17206,7 +17209,7 @@ parse_pattern_primitive(pm_parser_t *parser, pm_constant_id_list_t *captures, pm first_node = parse_pattern_keyword_rest(parser, captures); break; case PM_TOKEN_STRING_BEGIN: - first_node = parse_expression(parser, PM_BINDING_POWER_MAX, false, PM_ERR_PATTERN_HASH_KEY_LABEL); + first_node = parse_expression(parser, PM_BINDING_POWER_MAX, false, PM_ERR_PATTERN_HASH_KEY_LABEL, (uint16_t) (depth + 1)); break; default: { PM_PARSER_ERR_TOKEN_FORMAT(parser, parser->current, PM_ERR_PATTERN_HASH_KEY, pm_token_type_human(parser->current.type)); @@ -17217,7 +17220,7 @@ parse_pattern_primitive(pm_parser_t *parser, pm_constant_id_list_t *captures, pm } } - node = parse_pattern_hash(parser, captures, first_node); + node = parse_pattern_hash(parser, captures, first_node, (uint16_t) (depth + 1)); accept1(parser, PM_TOKEN_NEWLINE); expect1(parser, PM_TOKEN_BRACE_RIGHT, PM_ERR_PATTERN_TERM_BRACE); @@ -17242,7 +17245,7 @@ parse_pattern_primitive(pm_parser_t *parser, pm_constant_id_list_t *captures, pm // expression as the right side of the range. switch (parser->current.type) { case PM_CASE_PRIMITIVE: { - pm_node_t *right = parse_expression(parser, PM_BINDING_POWER_MAX, false, PM_ERR_PATTERN_EXPRESSION_AFTER_RANGE); + pm_node_t *right = parse_expression(parser, PM_BINDING_POWER_MAX, false, PM_ERR_PATTERN_EXPRESSION_AFTER_RANGE, (uint16_t) (depth + 1)); return (pm_node_t *) pm_range_node_create(parser, NULL, &operator, right); } default: { @@ -17253,7 +17256,7 @@ parse_pattern_primitive(pm_parser_t *parser, pm_constant_id_list_t *captures, pm } } case PM_CASE_PRIMITIVE: { - pm_node_t *node = parse_expression(parser, PM_BINDING_POWER_MAX, false, diag_id); + pm_node_t *node = parse_expression(parser, PM_BINDING_POWER_MAX, false, diag_id, (uint16_t) (depth + 1)); // Now that we have a primitive, we need to check if it's part of a range. if (accept2(parser, PM_TOKEN_DOT_DOT, PM_TOKEN_DOT_DOT_DOT)) { @@ -17264,7 +17267,7 @@ parse_pattern_primitive(pm_parser_t *parser, pm_constant_id_list_t *captures, pm // node. Otherwise, we'll create an endless range. switch (parser->current.type) { case PM_CASE_PRIMITIVE: { - pm_node_t *right = parse_expression(parser, PM_BINDING_POWER_MAX, false, PM_ERR_PATTERN_EXPRESSION_AFTER_RANGE); + pm_node_t *right = parse_expression(parser, PM_BINDING_POWER_MAX, false, PM_ERR_PATTERN_EXPRESSION_AFTER_RANGE, (uint16_t) (depth + 1)); return (pm_node_t *) pm_range_node_create(parser, node, &operator, right); } default: @@ -17329,7 +17332,7 @@ parse_pattern_primitive(pm_parser_t *parser, pm_constant_id_list_t *captures, pm pm_token_t lparen = parser->current; parser_lex(parser); - pm_node_t *expression = parse_value_expression(parser, PM_BINDING_POWER_STATEMENT, true, PM_ERR_PATTERN_EXPRESSION_AFTER_PIN); + pm_node_t *expression = parse_value_expression(parser, PM_BINDING_POWER_STATEMENT, true, PM_ERR_PATTERN_EXPRESSION_AFTER_PIN, (uint16_t) (depth + 1)); parser->pattern_matching_newlines = previous_pattern_matching_newlines; accept1(parser, PM_TOKEN_NEWLINE); @@ -17352,14 +17355,14 @@ parse_pattern_primitive(pm_parser_t *parser, pm_constant_id_list_t *captures, pm expect1(parser, PM_TOKEN_CONSTANT, PM_ERR_CONSTANT_PATH_COLON_COLON_CONSTANT); pm_constant_path_node_t *node = pm_constant_path_node_create(parser, NULL, &delimiter, &parser->previous); - return parse_pattern_constant_path(parser, captures, (pm_node_t *) node); + return parse_pattern_constant_path(parser, captures, (pm_node_t *) node, (uint16_t) (depth + 1)); } case PM_TOKEN_CONSTANT: { pm_token_t constant = parser->current; parser_lex(parser); pm_node_t *node = (pm_node_t *) pm_constant_read_node_create(parser, &constant); - return parse_pattern_constant_path(parser, captures, node); + return parse_pattern_constant_path(parser, captures, node, (uint16_t) (depth + 1)); } default: pm_parser_err_current(parser, diag_id); @@ -17372,7 +17375,7 @@ parse_pattern_primitive(pm_parser_t *parser, pm_constant_id_list_t *captures, pm * assignment. */ static pm_node_t * -parse_pattern_primitives(pm_parser_t *parser, pm_constant_id_list_t *captures, pm_diagnostic_id_t diag_id) { +parse_pattern_primitives(pm_parser_t *parser, pm_constant_id_list_t *captures, pm_diagnostic_id_t diag_id, uint16_t depth) { pm_node_t *node = NULL; do { @@ -17389,9 +17392,9 @@ parse_pattern_primitives(pm_parser_t *parser, pm_constant_id_list_t *captures, p case PM_TOKEN_UDOT_DOT_DOT: case PM_CASE_PRIMITIVE: { if (node == NULL) { - node = parse_pattern_primitive(parser, captures, diag_id); + node = parse_pattern_primitive(parser, captures, diag_id, (uint16_t) (depth + 1)); } else { - pm_node_t *right = parse_pattern_primitive(parser, captures, PM_ERR_PATTERN_EXPRESSION_AFTER_PIPE); + pm_node_t *right = parse_pattern_primitive(parser, captures, PM_ERR_PATTERN_EXPRESSION_AFTER_PIPE, (uint16_t) (depth + 1)); node = (pm_node_t *) pm_alternation_pattern_node_create(parser, node, right, &operator); } @@ -17402,7 +17405,7 @@ parse_pattern_primitives(pm_parser_t *parser, pm_constant_id_list_t *captures, p pm_token_t opening = parser->current; parser_lex(parser); - pm_node_t *body = parse_pattern(parser, captures, PM_PARSE_PATTERN_SINGLE, PM_ERR_PATTERN_EXPRESSION_AFTER_PAREN); + pm_node_t *body = parse_pattern(parser, captures, PM_PARSE_PATTERN_SINGLE, PM_ERR_PATTERN_EXPRESSION_AFTER_PAREN, (uint16_t) (depth + 1)); accept1(parser, PM_TOKEN_NEWLINE); expect1(parser, PM_TOKEN_PARENTHESIS_RIGHT, PM_ERR_PATTERN_TERM_PAREN); pm_node_t *right = (pm_node_t *) pm_parentheses_node_create(parser, &opening, body, &parser->previous); @@ -17461,7 +17464,7 @@ parse_pattern_primitives(pm_parser_t *parser, pm_constant_id_list_t *captures, p * Parse a pattern matching expression. */ static pm_node_t * -parse_pattern(pm_parser_t *parser, pm_constant_id_list_t *captures, uint8_t flags, pm_diagnostic_id_t diag_id) { +parse_pattern(pm_parser_t *parser, pm_constant_id_list_t *captures, uint8_t flags, pm_diagnostic_id_t diag_id, uint16_t depth) { pm_node_t *node = NULL; bool leading_rest = false; @@ -17471,7 +17474,7 @@ parse_pattern(pm_parser_t *parser, pm_constant_id_list_t *captures, uint8_t flag case PM_TOKEN_LABEL: { parser_lex(parser); pm_node_t *key = (pm_node_t *) pm_symbol_node_label_create(parser, &parser->previous); - node = (pm_node_t *) parse_pattern_hash(parser, captures, key); + node = (pm_node_t *) parse_pattern_hash(parser, captures, key, (uint16_t) (depth + 1)); if (!(flags & PM_PARSE_PATTERN_TOP)) { pm_parser_err_node(parser, node, PM_ERR_PATTERN_HASH_IMPLICIT); @@ -17481,7 +17484,7 @@ parse_pattern(pm_parser_t *parser, pm_constant_id_list_t *captures, uint8_t flag } case PM_TOKEN_USTAR_STAR: { node = parse_pattern_keyword_rest(parser, captures); - node = (pm_node_t *) parse_pattern_hash(parser, captures, node); + node = (pm_node_t *) parse_pattern_hash(parser, captures, node, (uint16_t) (depth + 1)); if (!(flags & PM_PARSE_PATTERN_TOP)) { pm_parser_err_node(parser, node, PM_ERR_PATTERN_HASH_IMPLICIT); @@ -17499,14 +17502,14 @@ parse_pattern(pm_parser_t *parser, pm_constant_id_list_t *captures, uint8_t flag } /* fallthrough */ default: - node = parse_pattern_primitives(parser, captures, diag_id); + node = parse_pattern_primitives(parser, captures, diag_id, (uint16_t) (depth + 1)); break; } // If we got a dynamic label symbol, then we need to treat it like the // beginning of a hash pattern. if (pm_symbol_node_label_p(node)) { - return (pm_node_t *) parse_pattern_hash(parser, captures, node); + return (pm_node_t *) parse_pattern_hash(parser, captures, node, (uint16_t) (depth + 1)); } if ((flags & PM_PARSE_PATTERN_MULTI) && match1(parser, PM_TOKEN_COMMA)) { @@ -17537,7 +17540,7 @@ parse_pattern(pm_parser_t *parser, pm_constant_id_list_t *captures, uint8_t flag trailing_rest = true; } else { - node = parse_pattern_primitives(parser, captures, PM_ERR_PATTERN_EXPRESSION_AFTER_COMMA); + node = parse_pattern_primitives(parser, captures, PM_ERR_PATTERN_EXPRESSION_AFTER_COMMA, (uint16_t) (depth + 1)); } pm_node_list_append(&nodes, node); @@ -17884,7 +17887,7 @@ parse_regular_expression_errors(pm_parser_t *parser, pm_regular_expression_node_ * Parse an expression that begins with the previous node that we just lexed. */ static inline pm_node_t * -parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, bool accepts_command_call, pm_diagnostic_id_t diag_id) { +parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, bool accepts_command_call, pm_diagnostic_id_t diag_id, uint16_t depth) { switch (parser->current.type) { case PM_TOKEN_BRACKET_LEFT_ARRAY: { parser_lex(parser); @@ -17923,7 +17926,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b if (match3(parser, PM_TOKEN_BRACKET_RIGHT, PM_TOKEN_COMMA, PM_TOKEN_EOF)) { pm_parser_scope_forwarding_positionals_check(parser, &operator); } else { - expression = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_ARRAY_EXPRESSION_AFTER_STAR); + expression = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_ARRAY_EXPRESSION_AFTER_STAR, (uint16_t) (depth + 1)); } element = (pm_node_t *) pm_splat_node_create(parser, &operator, expression); @@ -17936,13 +17939,13 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b pm_static_literals_t hash_keys = { 0 }; if (!match8(parser, PM_TOKEN_EOF, PM_TOKEN_NEWLINE, PM_TOKEN_SEMICOLON, PM_TOKEN_EOF, PM_TOKEN_BRACE_RIGHT, PM_TOKEN_BRACKET_RIGHT, PM_TOKEN_KEYWORD_DO, PM_TOKEN_PARENTHESIS_RIGHT)) { - parse_assocs(parser, &hash_keys, element); + parse_assocs(parser, &hash_keys, element, (uint16_t) (depth + 1)); } pm_static_literals_free(&hash_keys); parsed_bare_hash = true; } else { - element = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_ARRAY_EXPRESSION); + element = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_ARRAY_EXPRESSION, (uint16_t) (depth + 1)); if (pm_symbol_node_label_p(element) || accept1(parser, PM_TOKEN_EQUAL_GREATER)) { if (parsed_bare_hash) { @@ -17960,13 +17963,13 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b operator = not_provided(parser); } - pm_node_t *value = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_HASH_VALUE); + pm_node_t *value = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_HASH_VALUE, (uint16_t) (depth + 1)); pm_node_t *assoc = (pm_node_t *) pm_assoc_node_create(parser, element, &operator, value); pm_keyword_hash_node_elements_append(hash, assoc); element = (pm_node_t *) hash; if (accept1(parser, PM_TOKEN_COMMA) && !match1(parser, PM_TOKEN_BRACKET_RIGHT)) { - parse_assocs(parser, &hash_keys, element); + parse_assocs(parser, &hash_keys, element, (uint16_t) (depth + 1)); } pm_static_literals_free(&hash_keys); @@ -18010,7 +18013,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b // of statements within the parentheses. pm_accepts_block_stack_push(parser, true); context_push(parser, PM_CONTEXT_PARENS); - pm_node_t *statement = parse_expression(parser, PM_BINDING_POWER_STATEMENT, true, PM_ERR_CANNOT_PARSE_EXPRESSION); + pm_node_t *statement = parse_expression(parser, PM_BINDING_POWER_STATEMENT, true, PM_ERR_CANNOT_PARSE_EXPRESSION, (uint16_t) (depth + 1)); context_pop(parser); // Determine if this statement is followed by a terminator. In the @@ -18058,7 +18061,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b if (match1(parser, PM_TOKEN_COMMA)) { if (binding_power == PM_BINDING_POWER_STATEMENT) { - return parse_targets_validate(parser, (pm_node_t *) multi_target, PM_BINDING_POWER_INDEX); + return parse_targets_validate(parser, (pm_node_t *) multi_target, PM_BINDING_POWER_INDEX, (uint16_t) (depth + 1)); } return (pm_node_t *) multi_target; } @@ -18090,7 +18093,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b // Parse each statement within the parentheses. while (true) { - pm_node_t *node = parse_expression(parser, PM_BINDING_POWER_STATEMENT, true, PM_ERR_CANNOT_PARSE_EXPRESSION); + pm_node_t *node = parse_expression(parser, PM_BINDING_POWER_STATEMENT, true, PM_ERR_CANNOT_PARSE_EXPRESSION, (uint16_t) (depth + 1)); pm_statements_node_body_append(parser, statements, node, true); // If we're recovering from a syntax error, then we need to stop @@ -18148,10 +18151,10 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b if (!match2(parser, PM_TOKEN_BRACE_RIGHT, PM_TOKEN_EOF)) { if (current_hash_keys != NULL) { - parse_assocs(parser, current_hash_keys, (pm_node_t *) node); + parse_assocs(parser, current_hash_keys, (pm_node_t *) node, (uint16_t) (depth + 1)); } else { pm_static_literals_t hash_keys = { 0 }; - parse_assocs(parser, &hash_keys, (pm_node_t *) node); + parse_assocs(parser, &hash_keys, (pm_node_t *) node, (uint16_t) (depth + 1)); pm_static_literals_free(&hash_keys); } @@ -18182,7 +18185,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b // Characters can be followed by strings in which case they are // automatically concatenated. if (match1(parser, PM_TOKEN_STRING_BEGIN)) { - return parse_strings(parser, node); + return parse_strings(parser, node, (uint16_t) (depth + 1)); } return node; @@ -18192,7 +18195,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b pm_node_t *node = (pm_node_t *) pm_class_variable_read_node_create(parser, &parser->previous); if (binding_power == PM_BINDING_POWER_STATEMENT && match1(parser, PM_TOKEN_COMMA)) { - node = parse_targets_validate(parser, node, PM_BINDING_POWER_INDEX); + node = parse_targets_validate(parser, node, PM_BINDING_POWER_INDEX, (uint16_t) (depth + 1)); } return node; @@ -18210,7 +18213,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b match1(parser, PM_TOKEN_BRACE_LEFT) ) { pm_arguments_t arguments = { 0 }; - parse_arguments_list(parser, &arguments, true, accepts_command_call); + parse_arguments_list(parser, &arguments, true, accepts_command_call, (uint16_t) (depth + 1)); return (pm_node_t *) pm_call_node_fcall_create(parser, &constant, &arguments); } @@ -18219,7 +18222,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b if ((binding_power == PM_BINDING_POWER_STATEMENT) && match1(parser, PM_TOKEN_COMMA)) { // If we get here, then we have a comma immediately following a // constant, so we're going to parse this as a multiple assignment. - node = parse_targets_validate(parser, node, PM_BINDING_POWER_INDEX); + node = parse_targets_validate(parser, node, PM_BINDING_POWER_INDEX, (uint16_t) (depth + 1)); } return node; @@ -18232,7 +18235,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b pm_node_t *node = (pm_node_t *) pm_constant_path_node_create(parser, NULL, &delimiter, &parser->previous); if ((binding_power == PM_BINDING_POWER_STATEMENT) && match1(parser, PM_TOKEN_COMMA)) { - node = parse_targets_validate(parser, node, PM_BINDING_POWER_INDEX); + node = parse_targets_validate(parser, node, PM_BINDING_POWER_INDEX, (uint16_t) (depth + 1)); } return node; @@ -18242,7 +18245,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b pm_token_t operator = parser->current; parser_lex(parser); - pm_node_t *right = parse_expression(parser, pm_binding_powers[operator.type].left, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR); + pm_node_t *right = parse_expression(parser, pm_binding_powers[operator.type].left, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1)); // Unary .. and ... are special because these are non-associative // operators that can also be unary operators. In this case we need @@ -18271,7 +18274,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b pm_node_t *node = (pm_node_t *) pm_numbered_reference_read_node_create(parser, &parser->previous); if (binding_power == PM_BINDING_POWER_STATEMENT && match1(parser, PM_TOKEN_COMMA)) { - node = parse_targets_validate(parser, node, PM_BINDING_POWER_INDEX); + node = parse_targets_validate(parser, node, PM_BINDING_POWER_INDEX, (uint16_t) (depth + 1)); } return node; @@ -18281,7 +18284,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b pm_node_t *node = (pm_node_t *) pm_global_variable_read_node_create(parser, &parser->previous); if (binding_power == PM_BINDING_POWER_STATEMENT && match1(parser, PM_TOKEN_COMMA)) { - node = parse_targets_validate(parser, node, PM_BINDING_POWER_INDEX); + node = parse_targets_validate(parser, node, PM_BINDING_POWER_INDEX, (uint16_t) (depth + 1)); } return node; @@ -18291,7 +18294,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b pm_node_t *node = (pm_node_t *) pm_back_reference_read_node_create(parser, &parser->previous); if (binding_power == PM_BINDING_POWER_STATEMENT && match1(parser, PM_TOKEN_COMMA)) { - node = parse_targets_validate(parser, node, PM_BINDING_POWER_INDEX); + node = parse_targets_validate(parser, node, PM_BINDING_POWER_INDEX, (uint16_t) (depth + 1)); } return node; @@ -18310,7 +18313,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b pm_call_node_t *call = (pm_call_node_t *) node; pm_arguments_t arguments = { 0 }; - if (parse_arguments_list(parser, &arguments, true, accepts_command_call)) { + if (parse_arguments_list(parser, &arguments, true, accepts_command_call, (uint16_t) (depth + 1))) { // Since we found arguments, we need to turn off the // variable call bit in the flags. pm_node_flag_unset((pm_node_t *)call, PM_CALL_NODE_FLAGS_VARIABLE_CALL); @@ -18342,7 +18345,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b match1(parser, PM_TOKEN_BRACE_LEFT) ) { pm_arguments_t arguments = { 0 }; - parse_arguments_list(parser, &arguments, true, accepts_command_call); + parse_arguments_list(parser, &arguments, true, accepts_command_call, (uint16_t) (depth + 1)); pm_call_node_t *fcall = pm_call_node_fcall_create(parser, &identifier, &arguments); if (PM_NODE_TYPE_P(node, PM_IT_LOCAL_VARIABLE_READ_NODE)) { @@ -18371,7 +18374,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b } if ((binding_power == PM_BINDING_POWER_STATEMENT) && match1(parser, PM_TOKEN_COMMA)) { - node = parse_targets_validate(parser, node, PM_BINDING_POWER_INDEX); + node = parse_targets_validate(parser, node, PM_BINDING_POWER_INDEX, (uint16_t) (depth + 1)); } return node; @@ -18403,7 +18406,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b } node->location.end = opening.end; - } else if ((part = parse_string_part(parser)) == NULL) { + } else if ((part = parse_string_part(parser, (uint16_t) (depth + 1))) == NULL) { // If we get here, then we tried to find something in the // heredoc but couldn't actually parse anything, so we'll just // return a missing node. @@ -18443,7 +18446,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b pm_node_list_append(&parts, part); while (!match2(parser, PM_TOKEN_HEREDOC_END, PM_TOKEN_EOF)) { - if ((part = parse_string_part(parser)) != NULL) { + if ((part = parse_string_part(parser, (uint16_t) (depth + 1))) != NULL) { pm_node_list_append(&parts, part); } } @@ -18487,7 +18490,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b } if (match1(parser, PM_TOKEN_STRING_BEGIN)) { - return parse_strings(parser, node); + return parse_strings(parser, node, (uint16_t) (depth + 1)); } return node; @@ -18497,7 +18500,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b pm_node_t *node = (pm_node_t *) pm_instance_variable_read_node_create(parser, &parser->previous); if (binding_power == PM_BINDING_POWER_STATEMENT && match1(parser, PM_TOKEN_COMMA)) { - node = parse_targets_validate(parser, node, PM_BINDING_POWER_INDEX); + node = parse_targets_validate(parser, node, PM_BINDING_POWER_INDEX, (uint16_t) (depth + 1)); } return node; @@ -18539,8 +18542,8 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b parser_lex(parser); pm_token_t keyword = parser->previous; - pm_node_t *new_name = parse_alias_argument(parser, true); - pm_node_t *old_name = parse_alias_argument(parser, false); + pm_node_t *new_name = parse_alias_argument(parser, true, (uint16_t) (depth + 1)); + pm_node_t *old_name = parse_alias_argument(parser, false, (uint16_t) (depth + 1)); switch (PM_NODE_TYPE(new_name)) { case PM_BACK_REFERENCE_READ_NODE: @@ -18585,7 +18588,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b } else if (!token_begins_expression_p(parser->current.type)) { predicate = NULL; } else { - predicate = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_CASE_EXPRESSION_AFTER_CASE); + predicate = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_CASE_EXPRESSION_AFTER_CASE, (uint16_t) (depth + 1)); while (accept2(parser, PM_TOKEN_NEWLINE, PM_TOKEN_SEMICOLON)); } @@ -18622,14 +18625,14 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b do { if (accept1(parser, PM_TOKEN_USTAR)) { pm_token_t operator = parser->previous; - pm_node_t *expression = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_EXPECT_EXPRESSION_AFTER_STAR); + pm_node_t *expression = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_EXPECT_EXPRESSION_AFTER_STAR, (uint16_t) (depth + 1)); pm_splat_node_t *splat_node = pm_splat_node_create(parser, &operator, expression); pm_when_node_conditions_append(when_node, (pm_node_t *) splat_node); if (PM_NODE_TYPE_P(expression, PM_MISSING_NODE)) break; } else { - pm_node_t *condition = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_CASE_EXPRESSION_AFTER_WHEN); + pm_node_t *condition = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_CASE_EXPRESSION_AFTER_WHEN, (uint16_t) (depth + 1)); pm_when_node_conditions_append(when_node, condition); // If we found a missing node, then this is a syntax @@ -18658,7 +18661,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b } if (!match3(parser, PM_TOKEN_KEYWORD_WHEN, PM_TOKEN_KEYWORD_ELSE, PM_TOKEN_KEYWORD_END)) { - pm_statements_node_t *statements = parse_statements(parser, PM_CONTEXT_CASE_WHEN); + pm_statements_node_t *statements = parse_statements(parser, PM_CONTEXT_CASE_WHEN, (uint16_t) (depth + 1)); if (statements != NULL) { pm_when_node_statements_set(when_node, statements); } @@ -18700,7 +18703,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b pm_token_t in_keyword = parser->previous; pm_constant_id_list_t captures = { 0 }; - pm_node_t *pattern = parse_pattern(parser, &captures, PM_PARSE_PATTERN_TOP | PM_PARSE_PATTERN_MULTI, PM_ERR_PATTERN_EXPRESSION_AFTER_IN); + pm_node_t *pattern = parse_pattern(parser, &captures, PM_PARSE_PATTERN_TOP | PM_PARSE_PATTERN_MULTI, PM_ERR_PATTERN_EXPRESSION_AFTER_IN, (uint16_t) (depth + 1)); parser->pattern_matching_newlines = previous_pattern_matching_newlines; pm_constant_id_list_free(&captures); @@ -18710,11 +18713,11 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b // `unless` statements. if (accept1(parser, PM_TOKEN_KEYWORD_IF_MODIFIER)) { pm_token_t keyword = parser->previous; - pm_node_t *predicate = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_CONDITIONAL_IF_PREDICATE); + pm_node_t *predicate = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_CONDITIONAL_IF_PREDICATE, (uint16_t) (depth + 1)); pattern = (pm_node_t *) pm_if_node_modifier_create(parser, pattern, &keyword, predicate); } else if (accept1(parser, PM_TOKEN_KEYWORD_UNLESS_MODIFIER)) { pm_token_t keyword = parser->previous; - pm_node_t *predicate = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_CONDITIONAL_UNLESS_PREDICATE); + pm_node_t *predicate = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_CONDITIONAL_UNLESS_PREDICATE, (uint16_t) (depth + 1)); pattern = (pm_node_t *) pm_unless_node_modifier_create(parser, pattern, &keyword, predicate); } @@ -18739,7 +18742,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b if (match3(parser, PM_TOKEN_KEYWORD_IN, PM_TOKEN_KEYWORD_ELSE, PM_TOKEN_KEYWORD_END)) { statements = NULL; } else { - statements = parse_statements(parser, PM_CONTEXT_CASE_IN); + statements = parse_statements(parser, PM_CONTEXT_CASE_IN, (uint16_t) (depth + 1)); } // Now that we have the full pattern and statements, we can @@ -18763,7 +18766,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b pm_else_node_t *else_node; if (!match1(parser, PM_TOKEN_KEYWORD_END)) { - else_node = pm_else_node_create(parser, &else_keyword, parse_statements(parser, PM_CONTEXT_ELSE), &parser->current); + else_node = pm_else_node_create(parser, &else_keyword, parse_statements(parser, PM_CONTEXT_ELSE, (uint16_t) (depth + 1)), &parser->current); } else { else_node = pm_else_node_create(parser, &else_keyword, NULL, &parser->current); } @@ -18802,13 +18805,13 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b if (!match4(parser, PM_TOKEN_KEYWORD_RESCUE, PM_TOKEN_KEYWORD_ENSURE, PM_TOKEN_KEYWORD_ELSE, PM_TOKEN_KEYWORD_END)) { pm_accepts_block_stack_push(parser, true); - begin_statements = parse_statements(parser, PM_CONTEXT_BEGIN); + begin_statements = parse_statements(parser, PM_CONTEXT_BEGIN, (uint16_t) (depth + 1)); pm_accepts_block_stack_pop(parser); accept2(parser, PM_TOKEN_NEWLINE, PM_TOKEN_SEMICOLON); } pm_begin_node_t *begin_node = pm_begin_node_create(parser, &begin_keyword, begin_statements); - parse_rescues(parser, opening_newline_index, &begin_keyword, begin_node, PM_RESCUES_BEGIN); + parse_rescues(parser, opening_newline_index, &begin_keyword, begin_node, PM_RESCUES_BEGIN, (uint16_t) (depth + 1)); expect1(parser, PM_TOKEN_KEYWORD_END, PM_ERR_BEGIN_TERM); begin_node->base.location.end = parser->previous.end; @@ -18832,7 +18835,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b expect1(parser, PM_TOKEN_BRACE_LEFT, PM_ERR_BEGIN_UPCASE_BRACE); pm_token_t opening = parser->previous; - pm_statements_node_t *statements = parse_statements(parser, PM_CONTEXT_PREEXE); + pm_statements_node_t *statements = parse_statements(parser, PM_CONTEXT_PREEXE, (uint16_t) (depth + 1)); expect1(parser, PM_TOKEN_BRACE_RIGHT, PM_ERR_BEGIN_UPCASE_TERM); pm_context_t context = parser->current_context->context; @@ -18860,7 +18863,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b pm_binding_power_t binding_power = pm_binding_powers[parser->current.type].left; if (binding_power == PM_BINDING_POWER_UNSET || binding_power >= PM_BINDING_POWER_RANGE) { - parse_arguments(parser, &arguments, false, PM_TOKEN_EOF); + parse_arguments(parser, &arguments, false, PM_TOKEN_EOF, (uint16_t) (depth + 1)); } } @@ -18890,7 +18893,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b pm_token_t keyword = parser->previous; pm_arguments_t arguments = { 0 }; - parse_arguments_list(parser, &arguments, true, accepts_command_call); + parse_arguments_list(parser, &arguments, true, accepts_command_call, (uint16_t) (depth + 1)); if ( arguments.opening_loc.start == NULL && @@ -18907,7 +18910,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b pm_token_t keyword = parser->previous; pm_arguments_t arguments = { 0 }; - parse_arguments_list(parser, &arguments, false, accepts_command_call); + parse_arguments_list(parser, &arguments, false, accepts_command_call, (uint16_t) (depth + 1)); // It's possible that we've parsed a block argument through our // call to parse_arguments_list. If we found one, we should mark it @@ -18936,7 +18939,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b if (accept1(parser, PM_TOKEN_LESS_LESS)) { pm_token_t operator = parser->previous; - pm_node_t *expression = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_EXPECT_EXPRESSION_AFTER_LESS_LESS); + pm_node_t *expression = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_EXPECT_EXPRESSION_AFTER_LESS_LESS, (uint16_t) (depth + 1)); pm_parser_scope_push(parser, true); accept2(parser, PM_TOKEN_NEWLINE, PM_TOKEN_SEMICOLON); @@ -18944,13 +18947,13 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b pm_node_t *statements = NULL; if (!match4(parser, PM_TOKEN_KEYWORD_RESCUE, PM_TOKEN_KEYWORD_ENSURE, PM_TOKEN_KEYWORD_ELSE, PM_TOKEN_KEYWORD_END)) { pm_accepts_block_stack_push(parser, true); - statements = (pm_node_t *) parse_statements(parser, PM_CONTEXT_SCLASS); + statements = (pm_node_t *) parse_statements(parser, PM_CONTEXT_SCLASS, (uint16_t) (depth + 1)); pm_accepts_block_stack_pop(parser); } if (match2(parser, PM_TOKEN_KEYWORD_RESCUE, PM_TOKEN_KEYWORD_ENSURE)) { assert(statements == NULL || PM_NODE_TYPE_P(statements, PM_STATEMENTS_NODE)); - statements = (pm_node_t *) parse_rescues_implicit_begin(parser, opening_newline_index, &class_keyword, class_keyword.start, (pm_statements_node_t *) statements, PM_RESCUES_SCLASS); + statements = (pm_node_t *) parse_rescues_implicit_begin(parser, opening_newline_index, &class_keyword, class_keyword.start, (pm_statements_node_t *) statements, PM_RESCUES_SCLASS, (uint16_t) (depth + 1)); } else { parser_warn_indentation_mismatch(parser, opening_newline_index, &class_keyword, false, false); } @@ -18969,7 +18972,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b return (pm_node_t *) pm_singleton_class_node_create(parser, &locals, &class_keyword, &operator, expression, statements, &parser->previous); } - pm_node_t *constant_path = parse_expression(parser, PM_BINDING_POWER_INDEX, false, PM_ERR_CLASS_NAME); + pm_node_t *constant_path = parse_expression(parser, PM_BINDING_POWER_INDEX, false, PM_ERR_CLASS_NAME, (uint16_t) (depth + 1)); pm_token_t name = parser->previous; if (name.type != PM_TOKEN_CONSTANT) { pm_parser_err_token(parser, &name, PM_ERR_CLASS_NAME); @@ -18985,7 +18988,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b parser->command_start = true; parser_lex(parser); - superclass = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_CLASS_SUPERCLASS); + superclass = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_CLASS_SUPERCLASS, (uint16_t) (depth + 1)); } else { inheritance_operator = not_provided(parser); superclass = NULL; @@ -19002,13 +19005,13 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b if (!match4(parser, PM_TOKEN_KEYWORD_RESCUE, PM_TOKEN_KEYWORD_ENSURE, PM_TOKEN_KEYWORD_ELSE, PM_TOKEN_KEYWORD_END)) { pm_accepts_block_stack_push(parser, true); - statements = (pm_node_t *) parse_statements(parser, PM_CONTEXT_CLASS); + statements = (pm_node_t *) parse_statements(parser, PM_CONTEXT_CLASS, (uint16_t) (depth + 1)); pm_accepts_block_stack_pop(parser); } if (match2(parser, PM_TOKEN_KEYWORD_RESCUE, PM_TOKEN_KEYWORD_ENSURE)) { assert(statements == NULL || PM_NODE_TYPE_P(statements, PM_STATEMENTS_NODE)); - statements = (pm_node_t *) parse_rescues_implicit_begin(parser, opening_newline_index, &class_keyword, class_keyword.start, (pm_statements_node_t *) statements, PM_RESCUES_CLASS); + statements = (pm_node_t *) parse_rescues_implicit_begin(parser, opening_newline_index, &class_keyword, class_keyword.start, (pm_statements_node_t *) statements, PM_RESCUES_CLASS, (uint16_t) (depth + 1)); } else { parser_warn_indentation_mismatch(parser, opening_newline_index, &class_keyword, false, false); } @@ -19154,7 +19157,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b parser_lex(parser); pm_token_t lparen = parser->previous; - pm_node_t *expression = parse_value_expression(parser, PM_BINDING_POWER_STATEMENT, true, PM_ERR_DEF_RECEIVER); + pm_node_t *expression = parse_value_expression(parser, PM_BINDING_POWER_STATEMENT, true, PM_ERR_DEF_RECEIVER, (uint16_t) (depth + 1)); accept1(parser, PM_TOKEN_NEWLINE); expect1(parser, PM_TOKEN_PARENTHESIS_RIGHT, PM_ERR_EXPECT_RPAREN); @@ -19191,7 +19194,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b if (match1(parser, PM_TOKEN_PARENTHESIS_RIGHT)) { params = NULL; } else { - params = parse_parameters(parser, PM_BINDING_POWER_DEFINED, true, false, true, true); + params = parse_parameters(parser, PM_BINDING_POWER_DEFINED, true, false, true, true, (uint16_t) (depth + 1)); } lex_state_set(parser, PM_LEX_STATE_BEG); @@ -19215,7 +19218,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b lparen = not_provided(parser); rparen = not_provided(parser); - params = parse_parameters(parser, PM_BINDING_POWER_DEFINED, false, false, true, true); + params = parse_parameters(parser, PM_BINDING_POWER_DEFINED, false, false, true, true, (uint16_t) (depth + 1)); break; } default: { @@ -19241,13 +19244,13 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b pm_do_loop_stack_push(parser, false); statements = (pm_node_t *) pm_statements_node_create(parser); - pm_node_t *statement = parse_expression(parser, PM_BINDING_POWER_DEFINED + 1, binding_power < PM_BINDING_POWER_COMPOSITION, PM_ERR_DEF_ENDLESS); + pm_node_t *statement = parse_expression(parser, PM_BINDING_POWER_DEFINED + 1, binding_power < PM_BINDING_POWER_COMPOSITION, PM_ERR_DEF_ENDLESS, (uint16_t) (depth + 1)); if (accept1(parser, PM_TOKEN_KEYWORD_RESCUE_MODIFIER)) { context_push(parser, PM_CONTEXT_RESCUE_MODIFIER); pm_token_t rescue_keyword = parser->previous; - pm_node_t *value = parse_expression(parser, binding_power, false, PM_ERR_RESCUE_MODIFIER_VALUE); + pm_node_t *value = parse_expression(parser, binding_power, false, PM_ERR_RESCUE_MODIFIER_VALUE, (uint16_t) (depth + 1)); context_pop(parser); statement = (pm_node_t *) pm_rescue_modifier_node_create(parser, statement, &rescue_keyword, value); @@ -19273,13 +19276,13 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b if (!match4(parser, PM_TOKEN_KEYWORD_RESCUE, PM_TOKEN_KEYWORD_ENSURE, PM_TOKEN_KEYWORD_ELSE, PM_TOKEN_KEYWORD_END)) { pm_accepts_block_stack_push(parser, true); - statements = (pm_node_t *) parse_statements(parser, PM_CONTEXT_DEF); + statements = (pm_node_t *) parse_statements(parser, PM_CONTEXT_DEF, (uint16_t) (depth + 1)); pm_accepts_block_stack_pop(parser); } if (match3(parser, PM_TOKEN_KEYWORD_RESCUE, PM_TOKEN_KEYWORD_ENSURE, PM_TOKEN_KEYWORD_ELSE)) { assert(statements == NULL || PM_NODE_TYPE_P(statements, PM_STATEMENTS_NODE)); - statements = (pm_node_t *) parse_rescues_implicit_begin(parser, opening_newline_index, &def_keyword, def_keyword.start, (pm_statements_node_t *) statements, PM_RESCUES_DEF); + statements = (pm_node_t *) parse_rescues_implicit_begin(parser, opening_newline_index, &def_keyword, def_keyword.start, (pm_statements_node_t *) statements, PM_RESCUES_DEF, (uint16_t) (depth + 1)); } else { parser_warn_indentation_mismatch(parser, opening_newline_index, &def_keyword, false, false); } @@ -19332,7 +19335,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b if (accept1(parser, PM_TOKEN_PARENTHESIS_LEFT)) { lparen = parser->previous; - expression = parse_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_DEFINED_EXPRESSION); + expression = parse_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_DEFINED_EXPRESSION, (uint16_t) (depth + 1)); if (parser->recovering) { rparen = not_provided(parser); @@ -19344,7 +19347,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b } else { lparen = not_provided(parser); rparen = not_provided(parser); - expression = parse_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_DEFINED_EXPRESSION); + expression = parse_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_DEFINED_EXPRESSION, (uint16_t) (depth + 1)); } context_pop(parser); @@ -19370,7 +19373,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b expect1(parser, PM_TOKEN_BRACE_LEFT, PM_ERR_END_UPCASE_BRACE); pm_token_t opening = parser->previous; - pm_statements_node_t *statements = parse_statements(parser, PM_CONTEXT_POSTEXE); + pm_statements_node_t *statements = parse_statements(parser, PM_CONTEXT_POSTEXE, (uint16_t) (depth + 1)); expect1(parser, PM_TOKEN_BRACE_RIGHT, PM_ERR_END_UPCASE_TERM); return (pm_node_t *) pm_post_execution_node_create(parser, &keyword, &opening, statements, &parser->previous); @@ -19393,12 +19396,12 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b pm_node_t *name = NULL; if (token_begins_expression_p(parser->current.type)) { - name = parse_expression(parser, PM_BINDING_POWER_INDEX, false, PM_ERR_EXPECT_EXPRESSION_AFTER_STAR); + name = parse_expression(parser, PM_BINDING_POWER_INDEX, false, PM_ERR_EXPECT_EXPRESSION_AFTER_STAR, (uint16_t) (depth + 1)); } index = (pm_node_t *) pm_splat_node_create(parser, &star_operator, name); } else if (token_begins_expression_p(parser->current.type)) { - index = parse_expression(parser, PM_BINDING_POWER_INDEX, false, PM_ERR_EXPECT_EXPRESSION_AFTER_COMMA); + index = parse_expression(parser, PM_BINDING_POWER_INDEX, false, PM_ERR_EXPECT_EXPRESSION_AFTER_COMMA, (uint16_t) (depth + 1)); } else { pm_parser_err_token(parser, &for_keyword, PM_ERR_FOR_INDEX); index = (pm_node_t *) pm_missing_node_create(parser, for_keyword.start, for_keyword.end); @@ -19406,7 +19409,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b // Now, if there are multiple index expressions, parse them out. if (match1(parser, PM_TOKEN_COMMA)) { - index = parse_targets(parser, index, PM_BINDING_POWER_INDEX); + index = parse_targets(parser, index, PM_BINDING_POWER_INDEX, (uint16_t) (depth + 1)); } else { index = parse_target(parser, index, false, false); } @@ -19417,7 +19420,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b expect1(parser, PM_TOKEN_KEYWORD_IN, PM_ERR_FOR_IN); pm_token_t in_keyword = parser->previous; - pm_node_t *collection = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_FOR_COLLECTION); + pm_node_t *collection = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_FOR_COLLECTION, (uint16_t) (depth + 1)); pm_do_loop_stack_pop(parser); pm_token_t do_keyword; @@ -19431,7 +19434,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b pm_statements_node_t *statements = NULL; if (!match1(parser, PM_TOKEN_KEYWORD_END)) { - statements = parse_statements(parser, PM_CONTEXT_FOR); + statements = parse_statements(parser, PM_CONTEXT_FOR, (uint16_t) (depth + 1)); } parser_warn_indentation_mismatch(parser, opening_newline_index, &for_keyword, false, false); @@ -19448,7 +19451,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b bool if_after_else = parser->previous.type == PM_TOKEN_KEYWORD_ELSE; parser_lex(parser); - return parse_conditional(parser, PM_CONTEXT_IF, opening_newline_index, if_after_else); + return parse_conditional(parser, PM_CONTEXT_IF, opening_newline_index, if_after_else, (uint16_t) (depth + 1)); case PM_TOKEN_KEYWORD_UNDEF: { if (binding_power != PM_BINDING_POWER_STATEMENT) { pm_parser_err_current(parser, PM_ERR_STATEMENT_UNDEF); @@ -19456,7 +19459,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b parser_lex(parser); pm_undef_node_t *undef = pm_undef_node_create(parser, &parser->previous); - pm_node_t *name = parse_undef_argument(parser); + pm_node_t *name = parse_undef_argument(parser, (uint16_t) (depth + 1)); if (PM_NODE_TYPE_P(name, PM_MISSING_NODE)) { pm_node_destroy(parser, name); @@ -19466,7 +19469,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b while (match1(parser, PM_TOKEN_COMMA)) { lex_state_set(parser, PM_LEX_STATE_FNAME | PM_LEX_STATE_FITEM); parser_lex(parser); - name = parse_undef_argument(parser); + name = parse_undef_argument(parser, (uint16_t) (depth + 1)); if (PM_NODE_TYPE_P(name, PM_MISSING_NODE)) { pm_node_destroy(parser, name); @@ -19494,7 +19497,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b if (accept1(parser, PM_TOKEN_PARENTHESIS_RIGHT)) { arguments.closing_loc = PM_LOCATION_TOKEN_VALUE(&parser->previous); } else { - receiver = parse_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_NOT_EXPRESSION); + receiver = parse_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_NOT_EXPRESSION, (uint16_t) (depth + 1)); if (!parser->recovering) { accept1(parser, PM_TOKEN_NEWLINE); @@ -19503,7 +19506,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b } } } else { - receiver = parse_expression(parser, PM_BINDING_POWER_NOT, true, PM_ERR_NOT_EXPRESSION); + receiver = parse_expression(parser, PM_BINDING_POWER_NOT, true, PM_ERR_NOT_EXPRESSION, (uint16_t) (depth + 1)); } return (pm_node_t *) pm_call_node_not_create(parser, receiver, &message, &arguments); @@ -19512,7 +19515,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b size_t opening_newline_index = token_newline_index(parser); parser_lex(parser); - return parse_conditional(parser, PM_CONTEXT_UNLESS, opening_newline_index, false); + return parse_conditional(parser, PM_CONTEXT_UNLESS, opening_newline_index, false, (uint16_t) (depth + 1)); } case PM_TOKEN_KEYWORD_MODULE: { pm_node_list_t current_block_exits = { 0 }; @@ -19522,7 +19525,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b parser_lex(parser); pm_token_t module_keyword = parser->previous; - pm_node_t *constant_path = parse_expression(parser, PM_BINDING_POWER_INDEX, false, PM_ERR_MODULE_NAME); + pm_node_t *constant_path = parse_expression(parser, PM_BINDING_POWER_INDEX, false, PM_ERR_MODULE_NAME, (uint16_t) (depth + 1)); pm_token_t name; // If we can recover from a syntax error that occurred while parsing @@ -19556,13 +19559,13 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b if (!match4(parser, PM_TOKEN_KEYWORD_RESCUE, PM_TOKEN_KEYWORD_ENSURE, PM_TOKEN_KEYWORD_ELSE, PM_TOKEN_KEYWORD_END)) { pm_accepts_block_stack_push(parser, true); - statements = (pm_node_t *) parse_statements(parser, PM_CONTEXT_MODULE); + statements = (pm_node_t *) parse_statements(parser, PM_CONTEXT_MODULE, (uint16_t) (depth + 1)); pm_accepts_block_stack_pop(parser); } if (match3(parser, PM_TOKEN_KEYWORD_RESCUE, PM_TOKEN_KEYWORD_ENSURE, PM_TOKEN_KEYWORD_ELSE)) { assert(statements == NULL || PM_NODE_TYPE_P(statements, PM_STATEMENTS_NODE)); - statements = (pm_node_t *) parse_rescues_implicit_begin(parser, opening_newline_index, &module_keyword, module_keyword.start, (pm_statements_node_t *) statements, PM_RESCUES_MODULE); + statements = (pm_node_t *) parse_rescues_implicit_begin(parser, opening_newline_index, &module_keyword, module_keyword.start, (pm_statements_node_t *) statements, PM_RESCUES_MODULE, (uint16_t) (depth + 1)); } else { parser_warn_indentation_mismatch(parser, opening_newline_index, &module_keyword, false, false); } @@ -19615,7 +19618,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b parser_lex(parser); pm_token_t keyword = parser->previous; - pm_node_t *predicate = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_CONDITIONAL_UNTIL_PREDICATE); + pm_node_t *predicate = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_CONDITIONAL_UNTIL_PREDICATE, (uint16_t) (depth + 1)); pm_do_loop_stack_pop(parser); context_pop(parser); @@ -19625,7 +19628,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b if (!match1(parser, PM_TOKEN_KEYWORD_END)) { pm_accepts_block_stack_push(parser, true); - statements = parse_statements(parser, PM_CONTEXT_UNTIL); + statements = parse_statements(parser, PM_CONTEXT_UNTIL, (uint16_t) (depth + 1)); pm_accepts_block_stack_pop(parser); accept2(parser, PM_TOKEN_NEWLINE, PM_TOKEN_SEMICOLON); } @@ -19643,7 +19646,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b parser_lex(parser); pm_token_t keyword = parser->previous; - pm_node_t *predicate = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_CONDITIONAL_WHILE_PREDICATE); + pm_node_t *predicate = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_CONDITIONAL_WHILE_PREDICATE, (uint16_t) (depth + 1)); pm_do_loop_stack_pop(parser); context_pop(parser); @@ -19653,7 +19656,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b if (!match1(parser, PM_TOKEN_KEYWORD_END)) { pm_accepts_block_stack_push(parser, true); - statements = parse_statements(parser, PM_CONTEXT_WHILE); + statements = parse_statements(parser, PM_CONTEXT_WHILE, (uint16_t) (depth + 1)); pm_accepts_block_stack_pop(parser); accept2(parser, PM_TOKEN_NEWLINE, PM_TOKEN_SEMICOLON); } @@ -19786,7 +19789,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b // interpolated string, then we'll just add the embedded variable. } - pm_node_t *part = parse_string_part(parser); + pm_node_t *part = parse_string_part(parser, (uint16_t) (depth + 1)); pm_interpolated_symbol_node_append((pm_interpolated_symbol_node_t *) current, part); if (!start_location_set) { current->location.start = part->location.start; @@ -19823,7 +19826,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b assert(false && "unreachable"); } - pm_node_t *part = parse_string_part(parser); + pm_node_t *part = parse_string_part(parser, (uint16_t) (depth + 1)); pm_interpolated_symbol_node_append((pm_interpolated_symbol_node_t *) current, part); if (!start_location_set) { current->location.start = part->location.start; @@ -19976,7 +19979,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b // add the embedded variable. } - pm_node_t *part = parse_string_part(parser); + pm_node_t *part = parse_string_part(parser, (uint16_t) (depth + 1)); pm_interpolated_string_node_append((pm_interpolated_string_node_t *) current, part); break; } @@ -20007,7 +20010,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b assert(false && "unreachable"); } - pm_node_t *part = parse_string_part(parser); + pm_node_t *part = parse_string_part(parser, (uint16_t) (depth + 1)); pm_interpolated_string_node_append((pm_interpolated_string_node_t *) current, part); break; } @@ -20113,7 +20116,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b // parts into the list. pm_node_t *part; while (!match2(parser, PM_TOKEN_REGEXP_END, PM_TOKEN_EOF)) { - if ((part = parse_string_part(parser)) != NULL) { + if ((part = parse_string_part(parser, (uint16_t) (depth + 1))) != NULL) { pm_interpolated_regular_expression_node_append(interpolated, part); } } @@ -20190,7 +20193,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b pm_node_t *part; while (!match2(parser, PM_TOKEN_STRING_END, PM_TOKEN_EOF)) { - if ((part = parse_string_part(parser)) != NULL) { + if ((part = parse_string_part(parser, (uint16_t) (depth + 1))) != NULL) { pm_interpolated_xstring_node_append(node, part); } } @@ -20221,13 +20224,13 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b pm_node_t *name = NULL; if (token_begins_expression_p(parser->current.type)) { - name = parse_expression(parser, PM_BINDING_POWER_INDEX, false, PM_ERR_EXPECT_EXPRESSION_AFTER_STAR); + name = parse_expression(parser, PM_BINDING_POWER_INDEX, false, PM_ERR_EXPECT_EXPRESSION_AFTER_STAR, (uint16_t) (depth + 1)); } pm_node_t *splat = (pm_node_t *) pm_splat_node_create(parser, &operator, name); if (match1(parser, PM_TOKEN_COMMA)) { - return parse_targets_validate(parser, splat, PM_BINDING_POWER_INDEX); + return parse_targets_validate(parser, splat, PM_BINDING_POWER_INDEX, (uint16_t) (depth + 1)); } else { return parse_target_validate(parser, splat, true); } @@ -20240,7 +20243,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b parser_lex(parser); pm_token_t operator = parser->previous; - pm_node_t *receiver = parse_expression(parser, pm_binding_powers[parser->previous.type].right, binding_power < PM_BINDING_POWER_MATCH, PM_ERR_UNARY_RECEIVER); + pm_node_t *receiver = parse_expression(parser, pm_binding_powers[parser->previous.type].right, binding_power < PM_BINDING_POWER_MATCH, PM_ERR_UNARY_RECEIVER, (uint16_t) (depth + 1)); pm_call_node_t *node = pm_call_node_unary_create(parser, &operator, receiver, "!"); pm_conditional_predicate(parser, receiver, PM_CONDITIONAL_PREDICATE_TYPE_NOT); @@ -20253,7 +20256,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b parser_lex(parser); pm_token_t operator = parser->previous; - pm_node_t *receiver = parse_expression(parser, pm_binding_powers[parser->previous.type].right, false, PM_ERR_UNARY_RECEIVER); + pm_node_t *receiver = parse_expression(parser, pm_binding_powers[parser->previous.type].right, false, PM_ERR_UNARY_RECEIVER, (uint16_t) (depth + 1)); pm_call_node_t *node = pm_call_node_unary_create(parser, &operator, receiver, "~"); return (pm_node_t *) node; @@ -20265,7 +20268,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b parser_lex(parser); pm_token_t operator = parser->previous; - pm_node_t *receiver = parse_expression(parser, pm_binding_powers[parser->previous.type].right, false, PM_ERR_UNARY_RECEIVER); + pm_node_t *receiver = parse_expression(parser, pm_binding_powers[parser->previous.type].right, false, PM_ERR_UNARY_RECEIVER, (uint16_t) (depth + 1)); pm_call_node_t *node = pm_call_node_unary_create(parser, &operator, receiver, "-@"); return (pm_node_t *) node; @@ -20274,11 +20277,11 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b parser_lex(parser); pm_token_t operator = parser->previous; - pm_node_t *node = parse_expression(parser, pm_binding_powers[parser->previous.type].right, false, PM_ERR_UNARY_RECEIVER); + pm_node_t *node = parse_expression(parser, pm_binding_powers[parser->previous.type].right, false, PM_ERR_UNARY_RECEIVER, (uint16_t) (depth + 1)); if (accept1(parser, PM_TOKEN_STAR_STAR)) { pm_token_t exponent_operator = parser->previous; - pm_node_t *exponent = parse_expression(parser, pm_binding_powers[exponent_operator.type].right, false, PM_ERR_EXPECT_ARGUMENT); + pm_node_t *exponent = parse_expression(parser, pm_binding_powers[exponent_operator.type].right, false, PM_ERR_EXPECT_ARGUMENT, (uint16_t) (depth + 1)); node = (pm_node_t *) pm_call_node_binary_create(parser, node, &exponent_operator, exponent, 0); node = (pm_node_t *) pm_call_node_unary_create(parser, &operator, node, "-@"); } else { @@ -20318,7 +20321,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b if (match1(parser, PM_TOKEN_PARENTHESIS_RIGHT)) { block_parameters = pm_block_parameters_node_create(parser, NULL, &opening); } else { - block_parameters = parse_block_parameters(parser, false, &opening, true, true); + block_parameters = parse_block_parameters(parser, false, &opening, true, true, (uint16_t) (depth + 1)); } accept1(parser, PM_TOKEN_NEWLINE); @@ -20330,7 +20333,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b case PM_CASE_PARAMETER: { pm_accepts_block_stack_push(parser, false); pm_token_t opening = not_provided(parser); - block_parameters = parse_block_parameters(parser, false, &opening, true, false); + block_parameters = parse_block_parameters(parser, false, &opening, true, false, (uint16_t) (depth + 1)); pm_accepts_block_stack_pop(parser); break; } @@ -20348,7 +20351,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b opening = parser->previous; if (!match1(parser, PM_TOKEN_BRACE_RIGHT)) { - body = (pm_node_t *) parse_statements(parser, PM_CONTEXT_LAMBDA_BRACES); + body = (pm_node_t *) parse_statements(parser, PM_CONTEXT_LAMBDA_BRACES, (uint16_t) (depth + 1)); } parser_warn_indentation_mismatch(parser, opening_newline_index, &operator, false, false); @@ -20359,13 +20362,13 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b if (!match3(parser, PM_TOKEN_KEYWORD_END, PM_TOKEN_KEYWORD_RESCUE, PM_TOKEN_KEYWORD_ENSURE)) { pm_accepts_block_stack_push(parser, true); - body = (pm_node_t *) parse_statements(parser, PM_CONTEXT_LAMBDA_DO_END); + body = (pm_node_t *) parse_statements(parser, PM_CONTEXT_LAMBDA_DO_END, (uint16_t) (depth + 1)); pm_accepts_block_stack_pop(parser); } if (match2(parser, PM_TOKEN_KEYWORD_RESCUE, PM_TOKEN_KEYWORD_ENSURE)) { assert(body == NULL || PM_NODE_TYPE_P(body, PM_STATEMENTS_NODE)); - body = (pm_node_t *) parse_rescues_implicit_begin(parser, opening_newline_index, &operator, opening.start, (pm_statements_node_t *) body, PM_RESCUES_LAMBDA); + body = (pm_node_t *) parse_rescues_implicit_begin(parser, opening_newline_index, &operator, opening.start, (pm_statements_node_t *) body, PM_RESCUES_LAMBDA, (uint16_t) (depth + 1)); } else { parser_warn_indentation_mismatch(parser, opening_newline_index, &operator, false, false); } @@ -20389,18 +20392,18 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b parser_lex(parser); pm_token_t operator = parser->previous; - pm_node_t *receiver = parse_expression(parser, pm_binding_powers[parser->previous.type].right, false, PM_ERR_UNARY_RECEIVER); + pm_node_t *receiver = parse_expression(parser, pm_binding_powers[parser->previous.type].right, false, PM_ERR_UNARY_RECEIVER, (uint16_t) (depth + 1)); pm_call_node_t *node = pm_call_node_unary_create(parser, &operator, receiver, "+@"); return (pm_node_t *) node; } case PM_TOKEN_STRING_BEGIN: - return parse_strings(parser, NULL); + return parse_strings(parser, NULL, (uint16_t) (depth + 1)); case PM_TOKEN_SYMBOL_BEGIN: { pm_lex_mode_t lex_mode = *parser->lex_modes.current; parser_lex(parser); - return parse_symbol(parser, &lex_mode, PM_LEX_STATE_END); + return parse_symbol(parser, &lex_mode, PM_LEX_STATE_END, (uint16_t) (depth + 1)); } default: { pm_context_t recoverable = context_recoverable(parser, &parser->current); @@ -20443,8 +20446,8 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b * or any of the binary operators that can be written to a variable. */ static pm_node_t * -parse_assignment_value(pm_parser_t *parser, pm_binding_power_t previous_binding_power, pm_binding_power_t binding_power, bool accepts_command_call, pm_diagnostic_id_t diag_id) { - pm_node_t *value = parse_value_expression(parser, binding_power, previous_binding_power == PM_BINDING_POWER_ASSIGNMENT ? accepts_command_call : previous_binding_power < PM_BINDING_POWER_MATCH, diag_id); +parse_assignment_value(pm_parser_t *parser, pm_binding_power_t previous_binding_power, pm_binding_power_t binding_power, bool accepts_command_call, pm_diagnostic_id_t diag_id, uint16_t depth) { + pm_node_t *value = parse_value_expression(parser, binding_power, previous_binding_power == PM_BINDING_POWER_ASSIGNMENT ? accepts_command_call : previous_binding_power < PM_BINDING_POWER_MATCH, diag_id, (uint16_t) (depth + 1)); // Contradicting binding powers, the right-hand-side value of the assignment // allows the `rescue` modifier. @@ -20454,7 +20457,7 @@ parse_assignment_value(pm_parser_t *parser, pm_binding_power_t previous_binding_ pm_token_t rescue = parser->current; parser_lex(parser); - pm_node_t *right = parse_expression(parser, binding_power, false, PM_ERR_RESCUE_MODIFIER_VALUE); + pm_node_t *right = parse_expression(parser, binding_power, false, PM_ERR_RESCUE_MODIFIER_VALUE, (uint16_t) (depth + 1)); context_pop(parser); return (pm_node_t *) pm_rescue_modifier_node_create(parser, value, &rescue, right); @@ -20512,11 +20515,11 @@ parse_assignment_value_local(pm_parser_t *parser, const pm_node_t *node) { * operator that allows multiple values after it. */ static pm_node_t * -parse_assignment_values(pm_parser_t *parser, pm_binding_power_t previous_binding_power, pm_binding_power_t binding_power, bool accepts_command_call, pm_diagnostic_id_t diag_id) { +parse_assignment_values(pm_parser_t *parser, pm_binding_power_t previous_binding_power, pm_binding_power_t binding_power, bool accepts_command_call, pm_diagnostic_id_t diag_id, uint16_t depth) { bool permitted = true; if (previous_binding_power != PM_BINDING_POWER_STATEMENT && match1(parser, PM_TOKEN_USTAR)) permitted = false; - pm_node_t *value = parse_starred_expression(parser, binding_power, previous_binding_power == PM_BINDING_POWER_ASSIGNMENT ? accepts_command_call : previous_binding_power < PM_BINDING_POWER_MATCH, diag_id); + pm_node_t *value = parse_starred_expression(parser, binding_power, previous_binding_power == PM_BINDING_POWER_ASSIGNMENT ? accepts_command_call : previous_binding_power < PM_BINDING_POWER_MATCH, diag_id, (uint16_t) (depth + 1)); if (!permitted) pm_parser_err_node(parser, value, PM_ERR_UNEXPECTED_MULTI_WRITE); parse_assignment_value_local(parser, value); @@ -20532,7 +20535,7 @@ parse_assignment_values(pm_parser_t *parser, pm_binding_power_t previous_binding value = (pm_node_t *) array; while (accept1(parser, PM_TOKEN_COMMA)) { - pm_node_t *element = parse_starred_expression(parser, binding_power, false, PM_ERR_ARRAY_ELEMENT); + pm_node_t *element = parse_starred_expression(parser, binding_power, false, PM_ERR_ARRAY_ELEMENT, (uint16_t) (depth + 1)); pm_array_node_elements_append(array, element); if (PM_NODE_TYPE_P(element, PM_MISSING_NODE)) break; @@ -20560,7 +20563,7 @@ parse_assignment_values(pm_parser_t *parser, pm_binding_power_t previous_binding } } - pm_node_t *right = parse_expression(parser, binding_power, accepts_command_call_inner, PM_ERR_RESCUE_MODIFIER_VALUE); + pm_node_t *right = parse_expression(parser, binding_power, accepts_command_call_inner, PM_ERR_RESCUE_MODIFIER_VALUE, (uint16_t) (depth + 1)); context_pop(parser); return (pm_node_t *) pm_rescue_modifier_node_create(parser, value, &rescue, right); @@ -20715,7 +20718,7 @@ parse_regular_expression_named_captures(pm_parser_t *parser, const pm_string_t * } static inline pm_node_t * -parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t previous_binding_power, pm_binding_power_t binding_power, bool accepts_command_call) { +parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t previous_binding_power, pm_binding_power_t binding_power, bool accepts_command_call, uint16_t depth) { pm_token_t token = parser->current; switch (token.type) { @@ -20734,7 +20737,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t /* fallthrough */ case PM_CASE_WRITABLE: { parser_lex(parser); - pm_node_t *value = parse_assignment_values(parser, previous_binding_power, PM_NODE_TYPE_P(node, PM_MULTI_TARGET_NODE) ? PM_BINDING_POWER_MULTI_ASSIGNMENT + 1 : binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_EQUAL); + pm_node_t *value = parse_assignment_values(parser, previous_binding_power, PM_NODE_TYPE_P(node, PM_MULTI_TARGET_NODE) ? PM_BINDING_POWER_MULTI_ASSIGNMENT + 1 : binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_EQUAL, (uint16_t) (depth + 1)); if (PM_NODE_TYPE_P(node, PM_MULTI_TARGET_NODE) && previous_binding_power != PM_BINDING_POWER_STATEMENT) { pm_parser_err_node(parser, node, PM_ERR_UNEXPECTED_MULTI_WRITE); @@ -20747,7 +20750,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t pm_multi_target_node_targets_append(parser, multi_target, node); parser_lex(parser); - pm_node_t *value = parse_assignment_values(parser, previous_binding_power, PM_BINDING_POWER_MULTI_ASSIGNMENT + 1, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_EQUAL); + pm_node_t *value = parse_assignment_values(parser, previous_binding_power, PM_BINDING_POWER_MULTI_ASSIGNMENT + 1, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_EQUAL, (uint16_t) (depth + 1)); return parse_write(parser, (pm_node_t *) multi_target, &token, value); } case PM_SOURCE_ENCODING_NODE: @@ -20760,7 +20763,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t // In these special cases, we have specific error messages // and we will replace them with local variable writes. parser_lex(parser); - pm_node_t *value = parse_assignment_values(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_EQUAL); + pm_node_t *value = parse_assignment_values(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_EQUAL, (uint16_t) (depth + 1)); return parse_unwriteable_write(parser, node, &token, value); } default: @@ -20781,7 +20784,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t case PM_GLOBAL_VARIABLE_READ_NODE: { parser_lex(parser); - pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_AMPAMPEQ); + pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_AMPAMPEQ, (uint16_t) (depth + 1)); pm_node_t *result = (pm_node_t *) pm_global_variable_and_write_node_create(parser, node, &token, value); pm_node_destroy(parser, node); @@ -20790,7 +20793,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t case PM_CLASS_VARIABLE_READ_NODE: { parser_lex(parser); - pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_AMPAMPEQ); + pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_AMPAMPEQ, (uint16_t) (depth + 1)); pm_node_t *result = (pm_node_t *) pm_class_variable_and_write_node_create(parser, (pm_class_variable_read_node_t *) node, &token, value); pm_node_destroy(parser, node); @@ -20799,7 +20802,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t case PM_CONSTANT_PATH_NODE: { parser_lex(parser); - pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_AMPAMPEQ); + pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_AMPAMPEQ, (uint16_t) (depth + 1)); pm_node_t *write = (pm_node_t *) pm_constant_path_and_write_node_create(parser, (pm_constant_path_node_t *) node, &token, value); return parse_shareable_constant_write(parser, write); @@ -20807,7 +20810,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t case PM_CONSTANT_READ_NODE: { parser_lex(parser); - pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_AMPAMPEQ); + pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_AMPAMPEQ, (uint16_t) (depth + 1)); pm_node_t *write = (pm_node_t *) pm_constant_and_write_node_create(parser, (pm_constant_read_node_t *) node, &token, value); pm_node_destroy(parser, node); @@ -20816,7 +20819,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t case PM_INSTANCE_VARIABLE_READ_NODE: { parser_lex(parser); - pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_AMPAMPEQ); + pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_AMPAMPEQ, (uint16_t) (depth + 1)); pm_node_t *result = (pm_node_t *) pm_instance_variable_and_write_node_create(parser, (pm_instance_variable_read_node_t *) node, &token, value); pm_node_destroy(parser, node); @@ -20826,7 +20829,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t pm_local_variable_read_node_t *cast = (pm_local_variable_read_node_t *) node; parser_lex(parser); - pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_AMPAMPEQ); + pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_AMPAMPEQ, (uint16_t) (depth + 1)); pm_node_t *result = (pm_node_t *) pm_local_variable_and_write_node_create(parser, node, &token, value, cast->name, cast->depth); pm_node_destroy(parser, node); @@ -20845,7 +20848,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t pm_constant_id_t constant_id = pm_parser_local_add_location(parser, message_loc->start, message_loc->end, 1); parser_lex(parser); - pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_AMPAMPEQ); + pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_AMPAMPEQ, (uint16_t) (depth + 1)); pm_node_t *result = (pm_node_t *) pm_local_variable_and_write_node_create(parser, (pm_node_t *) cast, &token, value, constant_id, 0); pm_node_destroy(parser, (pm_node_t *) cast); @@ -20860,7 +20863,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t // this is an aref expression, and we can transform it into // an aset expression. if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_INDEX)) { - pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_AMPAMPEQ); + pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_AMPAMPEQ, (uint16_t) (depth + 1)); return (pm_node_t *) pm_index_and_write_node_create(parser, cast, &token, value); } @@ -20872,7 +20875,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t } parse_call_operator_write(parser, cast, &token); - pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_AMPAMPEQ); + pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_AMPAMPEQ, (uint16_t) (depth + 1)); return (pm_node_t *) pm_call_and_write_node_create(parser, cast, &token, value); } case PM_MULTI_WRITE_NODE: { @@ -20899,7 +20902,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t case PM_GLOBAL_VARIABLE_READ_NODE: { parser_lex(parser); - pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_PIPEPIPEEQ); + pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_PIPEPIPEEQ, (uint16_t) (depth + 1)); pm_node_t *result = (pm_node_t *) pm_global_variable_or_write_node_create(parser, node, &token, value); pm_node_destroy(parser, node); @@ -20908,7 +20911,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t case PM_CLASS_VARIABLE_READ_NODE: { parser_lex(parser); - pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_PIPEPIPEEQ); + pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_PIPEPIPEEQ, (uint16_t) (depth + 1)); pm_node_t *result = (pm_node_t *) pm_class_variable_or_write_node_create(parser, (pm_class_variable_read_node_t *) node, &token, value); pm_node_destroy(parser, node); @@ -20917,7 +20920,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t case PM_CONSTANT_PATH_NODE: { parser_lex(parser); - pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_PIPEPIPEEQ); + pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_PIPEPIPEEQ, (uint16_t) (depth + 1)); pm_node_t *write = (pm_node_t *) pm_constant_path_or_write_node_create(parser, (pm_constant_path_node_t *) node, &token, value); return parse_shareable_constant_write(parser, write); @@ -20925,7 +20928,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t case PM_CONSTANT_READ_NODE: { parser_lex(parser); - pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_PIPEPIPEEQ); + pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_PIPEPIPEEQ, (uint16_t) (depth + 1)); pm_node_t *write = (pm_node_t *) pm_constant_or_write_node_create(parser, (pm_constant_read_node_t *) node, &token, value); pm_node_destroy(parser, node); @@ -20934,7 +20937,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t case PM_INSTANCE_VARIABLE_READ_NODE: { parser_lex(parser); - pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_PIPEPIPEEQ); + pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_PIPEPIPEEQ, (uint16_t) (depth + 1)); pm_node_t *result = (pm_node_t *) pm_instance_variable_or_write_node_create(parser, (pm_instance_variable_read_node_t *) node, &token, value); pm_node_destroy(parser, node); @@ -20944,7 +20947,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t pm_local_variable_read_node_t *cast = (pm_local_variable_read_node_t *) node; parser_lex(parser); - pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_PIPEPIPEEQ); + pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_PIPEPIPEEQ, (uint16_t) (depth + 1)); pm_node_t *result = (pm_node_t *) pm_local_variable_or_write_node_create(parser, node, &token, value, cast->name, cast->depth); pm_node_destroy(parser, node); @@ -20963,7 +20966,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t pm_constant_id_t constant_id = pm_parser_local_add_location(parser, message_loc->start, message_loc->end, 1); parser_lex(parser); - pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_PIPEPIPEEQ); + pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_PIPEPIPEEQ, (uint16_t) (depth + 1)); pm_node_t *result = (pm_node_t *) pm_local_variable_or_write_node_create(parser, (pm_node_t *) cast, &token, value, constant_id, 0); pm_node_destroy(parser, (pm_node_t *) cast); @@ -20978,7 +20981,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t // this is an aref expression, and we can transform it into // an aset expression. if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_INDEX)) { - pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_PIPEPIPEEQ); + pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_PIPEPIPEEQ, (uint16_t) (depth + 1)); return (pm_node_t *) pm_index_or_write_node_create(parser, cast, &token, value); } @@ -20990,7 +20993,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t } parse_call_operator_write(parser, cast, &token); - pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_PIPEPIPEEQ); + pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_PIPEPIPEEQ, (uint16_t) (depth + 1)); return (pm_node_t *) pm_call_or_write_node_create(parser, cast, &token, value); } case PM_MULTI_WRITE_NODE: { @@ -21027,7 +21030,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t case PM_GLOBAL_VARIABLE_READ_NODE: { parser_lex(parser); - pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR); + pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1)); pm_node_t *result = (pm_node_t *) pm_global_variable_operator_write_node_create(parser, node, &token, value); pm_node_destroy(parser, node); @@ -21036,7 +21039,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t case PM_CLASS_VARIABLE_READ_NODE: { parser_lex(parser); - pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR); + pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1)); pm_node_t *result = (pm_node_t *) pm_class_variable_operator_write_node_create(parser, (pm_class_variable_read_node_t *) node, &token, value); pm_node_destroy(parser, node); @@ -21045,7 +21048,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t case PM_CONSTANT_PATH_NODE: { parser_lex(parser); - pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR); + pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1)); pm_node_t *write = (pm_node_t *) pm_constant_path_operator_write_node_create(parser, (pm_constant_path_node_t *) node, &token, value); return parse_shareable_constant_write(parser, write); @@ -21053,7 +21056,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t case PM_CONSTANT_READ_NODE: { parser_lex(parser); - pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR); + pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1)); pm_node_t *write = (pm_node_t *) pm_constant_operator_write_node_create(parser, (pm_constant_read_node_t *) node, &token, value); pm_node_destroy(parser, node); @@ -21062,7 +21065,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t case PM_INSTANCE_VARIABLE_READ_NODE: { parser_lex(parser); - pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR); + pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1)); pm_node_t *result = (pm_node_t *) pm_instance_variable_operator_write_node_create(parser, (pm_instance_variable_read_node_t *) node, &token, value); pm_node_destroy(parser, node); @@ -21072,7 +21075,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t pm_local_variable_read_node_t *cast = (pm_local_variable_read_node_t *) node; parser_lex(parser); - pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR); + pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1)); pm_node_t *result = (pm_node_t *) pm_local_variable_operator_write_node_create(parser, node, &token, value, cast->name, cast->depth); pm_node_destroy(parser, node); @@ -21090,7 +21093,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t pm_refute_numbered_parameter(parser, message_loc->start, message_loc->end); pm_constant_id_t constant_id = pm_parser_local_add_location(parser, message_loc->start, message_loc->end, 1); - pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR); + pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1)); pm_node_t *result = (pm_node_t *) pm_local_variable_operator_write_node_create(parser, (pm_node_t *) cast, &token, value, constant_id, 0); pm_node_destroy(parser, (pm_node_t *) cast); @@ -21101,7 +21104,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t // this is an aref expression, and we can transform it into // an aset expression. if (PM_NODE_FLAG_P(cast, PM_CALL_NODE_FLAGS_INDEX)) { - pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR); + pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1)); return (pm_node_t *) pm_index_operator_write_node_create(parser, cast, &token, value); } @@ -21113,7 +21116,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t } parse_call_operator_write(parser, cast, &token); - pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR); + pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, accepts_command_call, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1)); return (pm_node_t *) pm_call_operator_write_node_create(parser, cast, &token, value); } case PM_MULTI_WRITE_NODE: { @@ -21135,14 +21138,14 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t case PM_TOKEN_KEYWORD_AND: { parser_lex(parser); - pm_node_t *right = parse_expression(parser, binding_power, parser->previous.type == PM_TOKEN_KEYWORD_AND, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR); + pm_node_t *right = parse_expression(parser, binding_power, parser->previous.type == PM_TOKEN_KEYWORD_AND, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1)); return (pm_node_t *) pm_and_node_create(parser, node, &token, right); } case PM_TOKEN_KEYWORD_OR: case PM_TOKEN_PIPE_PIPE: { parser_lex(parser); - pm_node_t *right = parse_expression(parser, binding_power, parser->previous.type == PM_TOKEN_KEYWORD_OR, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR); + pm_node_t *right = parse_expression(parser, binding_power, parser->previous.type == PM_TOKEN_KEYWORD_OR, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1)); return (pm_node_t *) pm_or_node_create(parser, node, &token, right); } case PM_TOKEN_EQUAL_TILDE: { @@ -21154,7 +21157,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t // // In this case, `foo` should be a method call and not a local yet. parser_lex(parser); - pm_node_t *argument = parse_expression(parser, binding_power, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR); + pm_node_t *argument = parse_expression(parser, binding_power, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1)); // By default, we're going to create a call node and then return it. pm_call_node_t *call = pm_call_node_binary_create(parser, node, &token, argument, 0); @@ -21233,7 +21236,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t case PM_TOKEN_STAR: case PM_TOKEN_STAR_STAR: { parser_lex(parser); - pm_node_t *argument = parse_expression(parser, binding_power, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR); + pm_node_t *argument = parse_expression(parser, binding_power, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1)); return (pm_node_t *) pm_call_node_binary_create(parser, node, &token, argument, 0); } case PM_TOKEN_GREATER: @@ -21245,7 +21248,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t } parser_lex(parser); - pm_node_t *argument = parse_expression(parser, binding_power, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR); + pm_node_t *argument = parse_expression(parser, binding_power, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1)); return (pm_node_t *) pm_call_node_binary_create(parser, node, &token, argument, PM_CALL_NODE_FLAGS_COMPARISON); } case PM_TOKEN_AMPERSAND_DOT: @@ -21256,7 +21259,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t // This if statement handles the foo.() syntax. if (match1(parser, PM_TOKEN_PARENTHESIS_LEFT)) { - parse_arguments_list(parser, &arguments, true, false); + parse_arguments_list(parser, &arguments, true, false, (uint16_t) (depth + 1)); return (pm_node_t *) pm_call_node_shorthand_create(parser, node, &operator, &arguments); } @@ -21278,7 +21281,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t } } - parse_arguments_list(parser, &arguments, true, accepts_command_call); + parse_arguments_list(parser, &arguments, true, accepts_command_call, (uint16_t) (depth + 1)); pm_call_node_t *call = pm_call_node_call_create(parser, node, &operator, &message, &arguments); if ( @@ -21287,7 +21290,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t arguments.opening_loc.start == NULL && match1(parser, PM_TOKEN_COMMA) ) { - return parse_targets_validate(parser, (pm_node_t *) call, PM_BINDING_POWER_INDEX); + return parse_targets_validate(parser, (pm_node_t *) call, PM_BINDING_POWER_INDEX, (uint16_t) (depth + 1)); } else { return (pm_node_t *) call; } @@ -21298,7 +21301,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t pm_node_t *right = NULL; if (token_begins_expression_p(parser->current.type)) { - right = parse_expression(parser, binding_power, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR); + right = parse_expression(parser, binding_power, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1)); } return (pm_node_t *) pm_range_node_create(parser, node, &token, right); @@ -21307,14 +21310,14 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t pm_token_t keyword = parser->current; parser_lex(parser); - pm_node_t *predicate = parse_value_expression(parser, binding_power, true, PM_ERR_CONDITIONAL_IF_PREDICATE); + pm_node_t *predicate = parse_value_expression(parser, binding_power, true, PM_ERR_CONDITIONAL_IF_PREDICATE, (uint16_t) (depth + 1)); return (pm_node_t *) pm_if_node_modifier_create(parser, node, &keyword, predicate); } case PM_TOKEN_KEYWORD_UNLESS_MODIFIER: { pm_token_t keyword = parser->current; parser_lex(parser); - pm_node_t *predicate = parse_value_expression(parser, binding_power, true, PM_ERR_CONDITIONAL_UNLESS_PREDICATE); + pm_node_t *predicate = parse_value_expression(parser, binding_power, true, PM_ERR_CONDITIONAL_UNLESS_PREDICATE, (uint16_t) (depth + 1)); return (pm_node_t *) pm_unless_node_modifier_create(parser, node, &keyword, predicate); } case PM_TOKEN_KEYWORD_UNTIL_MODIFIER: { @@ -21322,7 +21325,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t pm_statements_node_t *statements = pm_statements_node_create(parser); pm_statements_node_body_append(parser, statements, node, true); - pm_node_t *predicate = parse_value_expression(parser, binding_power, true, PM_ERR_CONDITIONAL_UNTIL_PREDICATE); + pm_node_t *predicate = parse_value_expression(parser, binding_power, true, PM_ERR_CONDITIONAL_UNTIL_PREDICATE, (uint16_t) (depth + 1)); return (pm_node_t *) pm_until_node_modifier_create(parser, &token, predicate, statements, PM_NODE_TYPE_P(node, PM_BEGIN_NODE) ? PM_LOOP_FLAGS_BEGIN_MODIFIER : 0); } case PM_TOKEN_KEYWORD_WHILE_MODIFIER: { @@ -21330,7 +21333,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t pm_statements_node_t *statements = pm_statements_node_create(parser); pm_statements_node_body_append(parser, statements, node, true); - pm_node_t *predicate = parse_value_expression(parser, binding_power, true, PM_ERR_CONDITIONAL_WHILE_PREDICATE); + pm_node_t *predicate = parse_value_expression(parser, binding_power, true, PM_ERR_CONDITIONAL_WHILE_PREDICATE, (uint16_t) (depth + 1)); return (pm_node_t *) pm_while_node_modifier_create(parser, &token, predicate, statements, PM_NODE_TYPE_P(node, PM_BEGIN_NODE) ? PM_LOOP_FLAGS_BEGIN_MODIFIER : 0); } case PM_TOKEN_QUESTION_MARK: { @@ -21341,7 +21344,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t pm_token_t qmark = parser->current; parser_lex(parser); - pm_node_t *true_expression = parse_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_TERNARY_EXPRESSION_TRUE); + pm_node_t *true_expression = parse_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_TERNARY_EXPRESSION_TRUE, (uint16_t) (depth + 1)); if (parser->recovering) { // If parsing the true expression of this ternary resulted in a syntax @@ -21364,7 +21367,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t expect1(parser, PM_TOKEN_COLON, PM_ERR_TERNARY_COLON); pm_token_t colon = parser->previous; - pm_node_t *false_expression = parse_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_TERNARY_EXPRESSION_FALSE); + pm_node_t *false_expression = parse_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_TERNARY_EXPRESSION_FALSE, (uint16_t) (depth + 1)); context_pop(parser); pop_block_exits(parser, previous_block_exits); @@ -21394,7 +21397,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t pm_token_t message = parser->previous; pm_arguments_t arguments = { 0 }; - parse_arguments_list(parser, &arguments, true, accepts_command_call); + parse_arguments_list(parser, &arguments, true, accepts_command_call, (uint16_t) (depth + 1)); path = (pm_node_t *) pm_call_node_call_create(parser, node, &delimiter, &message, &arguments); } else { // Otherwise, this is a constant path. That would look like Foo::Bar. @@ -21403,7 +21406,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t // If this is followed by a comma then it is a multiple assignment. if (previous_binding_power == PM_BINDING_POWER_STATEMENT && match1(parser, PM_TOKEN_COMMA)) { - return parse_targets_validate(parser, path, PM_BINDING_POWER_INDEX); + return parse_targets_validate(parser, path, PM_BINDING_POWER_INDEX, (uint16_t) (depth + 1)); } return path; @@ -21418,12 +21421,12 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t // If we have an identifier following a '::' operator, then it is for // sure a method call. pm_arguments_t arguments = { 0 }; - parse_arguments_list(parser, &arguments, true, accepts_command_call); + parse_arguments_list(parser, &arguments, true, accepts_command_call, (uint16_t) (depth + 1)); pm_call_node_t *call = pm_call_node_call_create(parser, node, &delimiter, &message, &arguments); // If this is followed by a comma then it is a multiple assignment. if (previous_binding_power == PM_BINDING_POWER_STATEMENT && match1(parser, PM_TOKEN_COMMA)) { - return parse_targets_validate(parser, (pm_node_t *) call, PM_BINDING_POWER_INDEX); + return parse_targets_validate(parser, (pm_node_t *) call, PM_BINDING_POWER_INDEX, (uint16_t) (depth + 1)); } return (pm_node_t *) call; @@ -21432,7 +21435,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t // If we have a parenthesis following a '::' operator, then it is the // method call shorthand. That would look like Foo::(bar). pm_arguments_t arguments = { 0 }; - parse_arguments_list(parser, &arguments, true, false); + parse_arguments_list(parser, &arguments, true, false, (uint16_t) (depth + 1)); return (pm_node_t *) pm_call_node_shorthand_create(parser, node, &delimiter, &arguments); } @@ -21447,7 +21450,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t parser_lex(parser); accept1(parser, PM_TOKEN_NEWLINE); - pm_node_t *value = parse_expression(parser, binding_power, true, PM_ERR_RESCUE_MODIFIER_VALUE); + pm_node_t *value = parse_expression(parser, binding_power, true, PM_ERR_RESCUE_MODIFIER_VALUE, (uint16_t) (depth + 1)); context_pop(parser); return (pm_node_t *) pm_rescue_modifier_node_create(parser, node, &token, value); @@ -21460,7 +21463,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t if (!accept1(parser, PM_TOKEN_BRACKET_RIGHT)) { pm_accepts_block_stack_push(parser, true); - parse_arguments(parser, &arguments, false, PM_TOKEN_BRACKET_RIGHT); + parse_arguments(parser, &arguments, false, PM_TOKEN_BRACKET_RIGHT, (uint16_t) (depth + 1)); pm_accepts_block_stack_pop(parser); expect1(parser, PM_TOKEN_BRACKET_RIGHT, PM_ERR_EXPECT_RBRACKET); } @@ -21471,7 +21474,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t // assignment and we should parse the targets. if (previous_binding_power == PM_BINDING_POWER_STATEMENT && match1(parser, PM_TOKEN_COMMA)) { pm_call_node_t *aref = pm_call_node_aref_create(parser, node, &arguments); - return parse_targets_validate(parser, (pm_node_t *) aref, PM_BINDING_POWER_INDEX); + return parse_targets_validate(parser, (pm_node_t *) aref, PM_BINDING_POWER_INDEX, (uint16_t) (depth + 1)); } // If we're at the end of the arguments, we can now check if there is a @@ -21479,10 +21482,10 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t // add it to the arguments. pm_block_node_t *block = NULL; if (accept1(parser, PM_TOKEN_BRACE_LEFT)) { - block = parse_block(parser); + block = parse_block(parser, (uint16_t) (depth + 1)); pm_arguments_validate_block(parser, &arguments, block); } else if (pm_accepts_block_stack_p(parser) && accept1(parser, PM_TOKEN_KEYWORD_DO)) { - block = parse_block(parser); + block = parse_block(parser, (uint16_t) (depth + 1)); } if (block != NULL) { @@ -21509,7 +21512,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t parser_lex(parser); pm_constant_id_list_t captures = { 0 }; - pm_node_t *pattern = parse_pattern(parser, &captures, PM_PARSE_PATTERN_TOP | PM_PARSE_PATTERN_MULTI, PM_ERR_PATTERN_EXPRESSION_AFTER_IN); + pm_node_t *pattern = parse_pattern(parser, &captures, PM_PARSE_PATTERN_TOP | PM_PARSE_PATTERN_MULTI, PM_ERR_PATTERN_EXPRESSION_AFTER_IN, (uint16_t) (depth + 1)); parser->pattern_matching_newlines = previous_pattern_matching_newlines; pm_constant_id_list_free(&captures); @@ -21526,7 +21529,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t parser_lex(parser); pm_constant_id_list_t captures = { 0 }; - pm_node_t *pattern = parse_pattern(parser, &captures, PM_PARSE_PATTERN_TOP | PM_PARSE_PATTERN_MULTI, PM_ERR_PATTERN_EXPRESSION_AFTER_HROCKET); + pm_node_t *pattern = parse_pattern(parser, &captures, PM_PARSE_PATTERN_TOP | PM_PARSE_PATTERN_MULTI, PM_ERR_PATTERN_EXPRESSION_AFTER_HROCKET, (uint16_t) (depth + 1)); parser->pattern_matching_newlines = previous_pattern_matching_newlines; pm_constant_id_list_free(&captures); @@ -21552,8 +21555,13 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t * determine if they need to perform additional cleanup. */ static pm_node_t * -parse_expression(pm_parser_t *parser, pm_binding_power_t binding_power, bool accepts_command_call, pm_diagnostic_id_t diag_id) { - pm_node_t *node = parse_expression_prefix(parser, binding_power, accepts_command_call, diag_id); +parse_expression(pm_parser_t *parser, pm_binding_power_t binding_power, bool accepts_command_call, pm_diagnostic_id_t diag_id, uint16_t depth) { + if (PRISM_UNLIKELY(depth >= PRISM_DEPTH_MAXIMUM)) { + pm_parser_err_current(parser, PM_ERR_NESTING_TOO_DEEP); + return (pm_node_t *) pm_missing_node_create(parser, parser->current.start, parser->current.end); + } + + pm_node_t *node = parse_expression_prefix(parser, binding_power, accepts_command_call, diag_id, depth); switch (PM_NODE_TYPE(node)) { case PM_MISSING_NODE: @@ -21584,7 +21592,7 @@ parse_expression(pm_parser_t *parser, pm_binding_power_t binding_power, bool acc binding_power <= current_binding_powers.left && current_binding_powers.binary ) { - node = parse_expression_infix(parser, node, binding_power, current_binding_powers.right, accepts_command_call); + node = parse_expression_infix(parser, node, binding_power, current_binding_powers.right, accepts_command_call, (uint16_t) (depth + 1)); switch (PM_NODE_TYPE(node)) { case PM_CLASS_VARIABLE_WRITE_NODE: @@ -21766,7 +21774,7 @@ parse_program(pm_parser_t *parser) { pm_node_list_t *previous_block_exits = push_block_exits(parser, ¤t_block_exits); parser_lex(parser); - pm_statements_node_t *statements = parse_statements(parser, PM_CONTEXT_MAIN); + pm_statements_node_t *statements = parse_statements(parser, PM_CONTEXT_MAIN, 0); if (statements == NULL) { statements = pm_statements_node_create(parser); diff --git a/prism/templates/src/diagnostic.c.erb b/prism/templates/src/diagnostic.c.erb index 7b63d2dd0f602e..1ff207c5ffda2b 100644 --- a/prism/templates/src/diagnostic.c.erb +++ b/prism/templates/src/diagnostic.c.erb @@ -267,8 +267,9 @@ static const pm_diagnostic_data_t diagnostic_messages[PM_DIAGNOSTIC_ID_MAX] = { [PM_ERR_MODULE_TERM] = { "expected an `end` to close the `module` statement", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_MULTI_ASSIGN_MULTI_SPLATS] = { "multiple splats in multiple assignment", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_MULTI_ASSIGN_UNEXPECTED_REST] = { "unexpected '%.*s' resulting in multiple splats in multiple assignment", PM_ERROR_LEVEL_SYNTAX }, - [PM_ERR_NOT_EXPRESSION] = { "expected an expression after `not`", PM_ERROR_LEVEL_SYNTAX }, + [PM_ERR_NESTING_TOO_DEEP] = { "nesting too deep", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_NO_LOCAL_VARIABLE] = { "%.*s: no such local variable", PM_ERROR_LEVEL_SYNTAX }, + [PM_ERR_NOT_EXPRESSION] = { "expected an expression after `not`", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_NUMBER_LITERAL_UNDERSCORE] = { "number literal ending with a `_`", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_NUMBERED_PARAMETER_INNER_BLOCK] = { "numbered parameter is already used in inner block", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_NUMBERED_PARAMETER_IT] = { "numbered parameters are not allowed when 'it' is already used", PM_ERROR_LEVEL_SYNTAX }, From bf6109c8cc7ea9983ca88ae84a99d57155d847ee Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Wed, 25 Sep 2024 12:08:04 -0400 Subject: [PATCH 451/829] [ruby/prism] Fix up windows use of __assume https://github.com/ruby/prism/commit/9fd0c0901e --- prism/defines.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prism/defines.h b/prism/defines.h index 50962e060b0a52..630eff72188005 100644 --- a/prism/defines.h +++ b/prism/defines.h @@ -233,7 +233,7 @@ #define PRISM_UNLIKELY(x) __builtin_expect(!!(x), 0) #elif defined(_MSC_VER) && (_MSC_VER >= 1400) /** The compiler should predicate that this branch will be taken. */ - #define PRISM_LIKELY(x) __assume((x)) + #define PRISM_LIKELY(x) __assume(!!(x)) /** The compiler should predicate that this branch will not be taken. */ #define PRISM_UNLIKELY(x) __assume(!(x)) From a6ea4ddb4e992e11a016f22a7c93eece0eca6e92 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Wed, 25 Sep 2024 12:17:03 -0400 Subject: [PATCH 452/829] [ruby/prism] Remove use of __assume to simplify https://github.com/ruby/prism/commit/4daf58f7a0 --- prism/defines.h | 6 ------ 1 file changed, 6 deletions(-) diff --git a/prism/defines.h b/prism/defines.h index 630eff72188005..e78c7dd75cee1e 100644 --- a/prism/defines.h +++ b/prism/defines.h @@ -231,12 +231,6 @@ /** The compiler should predicate that this branch will not be taken. */ #define PRISM_UNLIKELY(x) __builtin_expect(!!(x), 0) -#elif defined(_MSC_VER) && (_MSC_VER >= 1400) - /** The compiler should predicate that this branch will be taken. */ - #define PRISM_LIKELY(x) __assume(!!(x)) - - /** The compiler should predicate that this branch will not be taken. */ - #define PRISM_UNLIKELY(x) __assume(!(x)) #else /** Void because this platform does not support branch prediction hints. */ #define PRISM_LIKELY(x) (x) From 505206b8acff856f3829be1e16167e74ea5900dc Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Wed, 25 Sep 2024 09:18:13 -0700 Subject: [PATCH 453/829] YJIT: Cache Context decoding (#11680) --- yjit/src/core.rs | 91 ++++++++++++++++++++++++++++++++++++----------- yjit/src/stats.rs | 2 +- 2 files changed, 71 insertions(+), 22 deletions(-) diff --git a/yjit/src/core.rs b/yjit/src/core.rs index b29b3f1d1bc388..732c5cbe2f1fc2 100644 --- a/yjit/src/core.rs +++ b/yjit/src/core.rs @@ -870,16 +870,23 @@ enum CtxOp { } // Number of entries in the context cache -const CTX_CACHE_SIZE: usize = 1024; +const CTX_ENCODE_CACHE_SIZE: usize = 1024; +const CTX_DECODE_CACHE_SIZE: usize = 1024; -// Cache of the last contexts encoded -// Empirically this saves a few percent of memory +// Cache of the last contexts encoded/decoded +// Empirically this saves a few percent of memory and speeds up compilation // We can experiment with varying the size of this cache -pub type CtxCacheTbl = [(Context, u32); CTX_CACHE_SIZE]; -static mut CTX_CACHE: Option> = None; +pub type CtxEncodeCache = [(Context, u32); CTX_ENCODE_CACHE_SIZE]; +static mut CTX_ENCODE_CACHE: Option> = None; + +// Cache of the last contexts encoded/decoded +// This speeds up compilation +pub type CtxDecodeCache = [(Context, u32); CTX_DECODE_CACHE_SIZE]; +static mut CTX_DECODE_CACHE: Option> = None; // Size of the context cache in bytes -pub const CTX_CACHE_BYTES: usize = std::mem::size_of::(); +pub const CTX_ENCODE_CACHE_BYTES: usize = std::mem::size_of::(); +pub const CTX_DECODE_CACHE_BYTES: usize = std::mem::size_of::(); impl Context { // Encode a context into the global context data, or return @@ -892,7 +899,7 @@ impl Context { return 0; } - if let Some(idx) = Self::cache_get(self) { + if let Some(idx) = Self::encode_cache_get(self) { incr_counter!(context_cache_hits); debug_assert!(Self::decode(idx) == *self); return idx; @@ -910,7 +917,8 @@ impl Context { let idx: u32 = idx.try_into().unwrap(); // Save this offset into the cache - Self::cache_set(self, idx); + Self::encode_cache_set(self, idx); + Self::decode_cache_set(self, idx); // In debug mode, check that the round-trip decoding always matches debug_assert!(Self::decode(idx) == *self); @@ -923,16 +931,21 @@ impl Context { return Context::default(); }; + if let Some(ctx) = Self::decode_cache_get(start_idx) { + return ctx; + } + let context_data = CodegenGlobals::get_context_data(); let ctx = Self::decode_from(context_data, start_idx as usize); - Self::cache_set(&ctx, start_idx); + Self::encode_cache_set(&ctx, start_idx); + Self::decode_cache_set(&ctx, start_idx); ctx } - // Store an entry in a cache of recently encoded/decoded contexts - fn cache_set(ctx: &Context, idx: u32) + // Store an entry in a cache of recently encoded/decoded contexts for encoding + fn encode_cache_set(ctx: &Context, idx: u32) { // Compute the hash for this context let mut hasher = DefaultHasher::new(); @@ -941,21 +954,38 @@ impl Context { unsafe { // Lazily initialize the context cache - if CTX_CACHE == None { + if CTX_ENCODE_CACHE == None { + // Here we use the vec syntax to avoid allocating the large table on the stack, + // as this can cause a stack overflow + let tbl = vec![(Context::default(), 0); CTX_ENCODE_CACHE_SIZE].into_boxed_slice().try_into().unwrap(); + CTX_ENCODE_CACHE = Some(tbl); + } + + // Write a cache entry for this context + let cache = CTX_ENCODE_CACHE.as_mut().unwrap(); + cache[ctx_hash % CTX_ENCODE_CACHE_SIZE] = (*ctx, idx); + } + } + + // Store an entry in a cache of recently encoded/decoded contexts for decoding + fn decode_cache_set(ctx: &Context, idx: u32) { + unsafe { + // Lazily initialize the context cache + if CTX_DECODE_CACHE == None { // Here we use the vec syntax to avoid allocating the large table on the stack, // as this can cause a stack overflow - let tbl = vec![(Context::default(), 0); CTX_CACHE_SIZE].into_boxed_slice().try_into().unwrap(); - CTX_CACHE = Some(tbl); + let tbl = vec![(Context::default(), 0); CTX_ENCODE_CACHE_SIZE].into_boxed_slice().try_into().unwrap(); + CTX_DECODE_CACHE = Some(tbl); } // Write a cache entry for this context - let cache = CTX_CACHE.as_mut().unwrap(); - cache[ctx_hash % CTX_CACHE_SIZE] = (*ctx, idx); + let cache = CTX_DECODE_CACHE.as_mut().unwrap(); + cache[idx as usize % CTX_ENCODE_CACHE_SIZE] = (*ctx, idx); } } - // Lookup the context in a cache of recently encoded/decoded contexts - fn cache_get(ctx: &Context) -> Option + // Lookup the context in a cache of recently encoded/decoded contexts for encoding + fn encode_cache_get(ctx: &Context) -> Option { // Compute the hash for this context let mut hasher = DefaultHasher::new(); @@ -963,14 +993,14 @@ impl Context { let ctx_hash = hasher.finish() as usize; unsafe { - if CTX_CACHE == None { + if CTX_ENCODE_CACHE == None { return None; } - let cache = CTX_CACHE.as_mut().unwrap(); + let cache = CTX_ENCODE_CACHE.as_mut().unwrap(); // Check that the context for this cache entry matches - let cache_entry = &cache[ctx_hash % CTX_CACHE_SIZE]; + let cache_entry = &cache[ctx_hash % CTX_ENCODE_CACHE_SIZE]; if cache_entry.0 == *ctx { debug_assert!(cache_entry.1 != 0); return Some(cache_entry.1); @@ -980,6 +1010,25 @@ impl Context { } } + // Lookup the context in a cache of recently encoded/decoded contexts for decoding + fn decode_cache_get(start_idx: u32) -> Option { + unsafe { + if CTX_DECODE_CACHE == None { + return None; + } + + let cache = CTX_DECODE_CACHE.as_mut().unwrap(); + + // Check that the start_idx for this cache entry matches + let cache_entry = &cache[start_idx as usize % CTX_DECODE_CACHE_SIZE]; + if cache_entry.1 == start_idx { + return Some(cache_entry.0); + } + + return None; + } + } + // Encode into a compressed context representation in a bit vector fn encode_into(&self, bits: &mut BitVector) -> usize { let start_idx = bits.num_bits(); diff --git a/yjit/src/stats.rs b/yjit/src/stats.rs index 7cfb4e5ae1ea5d..c49f8af553a095 100644 --- a/yjit/src/stats.rs +++ b/yjit/src/stats.rs @@ -775,7 +775,7 @@ fn rb_yjit_gen_stats_dict(key: VALUE) -> VALUE { // How many bytes we are using to store context data let context_data = CodegenGlobals::get_context_data(); set_stat_usize!(hash, "context_data_bytes", context_data.num_bytes()); - set_stat_usize!(hash, "context_cache_bytes", crate::core::CTX_CACHE_BYTES); + set_stat_usize!(hash, "context_cache_bytes", crate::core::CTX_ENCODE_CACHE_BYTES + crate::core::CTX_DECODE_CACHE_BYTES); // VM instructions count set_stat_usize!(hash, "vm_insns_count", rb_vm_insns_count as usize); From 6a168fbf41589820018a58e9a55b75103486d99a Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Wed, 25 Sep 2024 11:35:25 -0400 Subject: [PATCH 454/829] Potentially fix ASAN checks for GC-ing operand --- prism_compile.c | 202 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 160 insertions(+), 42 deletions(-) diff --git a/prism_compile.c b/prism_compile.c index e230587faafb44..22956fa5e3b459 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -646,12 +646,21 @@ pm_interpolated_node_compile(rb_iseq_t *iseq, const pm_node_list_t *parts, const current_string = rb_enc_str_new(NULL, 0, encoding); } - PUSH_INSN1(ret, current_location, putobject, rb_fstring(current_string)); + { + VALUE operand = rb_fstring(current_string); + PUSH_INSN1(ret, current_location, putobject, operand); + } + PM_COMPILE_NOT_POPPED(part); const pm_node_location_t current_location = PM_NODE_START_LOCATION(scope_node->parser, part); PUSH_INSN(ret, current_location, dup); - PUSH_INSN1(ret, current_location, objtostring, new_callinfo(iseq, idTo_s, 0, VM_CALL_FCALL | VM_CALL_ARGS_SIMPLE, NULL, FALSE)); + + { + const struct rb_callinfo *callinfo = new_callinfo(iseq, idTo_s, 0, VM_CALL_FCALL | VM_CALL_ARGS_SIMPLE, NULL, FALSE); + PUSH_INSN1(ret, current_location, objtostring, callinfo); + } + PUSH_INSN(ret, current_location, anytostring); current_string = Qnil; @@ -891,7 +900,10 @@ pm_compile_flip_flop_bound(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR * if (PM_NODE_TYPE_P(node, PM_INTEGER_NODE)) { PM_COMPILE_NOT_POPPED(node); - PUSH_INSN1(ret, location, getglobal, ID2SYM(rb_intern("$."))); + + VALUE operand = ID2SYM(rb_intern("$.")); + PUSH_INSN1(ret, location, getglobal, operand); + PUSH_SEND(ret, location, idEq, INT2FIX(1)); if (popped) PUSH_INSN(ret, location, pop); } @@ -2295,9 +2307,11 @@ pm_compile_pattern_eqq_error(rb_iseq_t *iseq, pm_scope_node_t *scope_node, const PUSH_INSN(ret, location, dup); PUSH_INSNL(ret, location, branchif, match_succeeded_label); - PUSH_INSN1(ret, location, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); - PUSH_INSN1(ret, location, putobject, rb_fstring_lit("%p === %p does not return true")); + + VALUE operand = rb_fstring_lit("%p === %p does not return true"); + PUSH_INSN1(ret, location, putobject, operand); + PUSH_INSN1(ret, location, topn, INT2FIX(3)); PUSH_INSN1(ret, location, topn, INT2FIX(5)); PUSH_SEND(ret, location, id_core_sprintf, INT2FIX(3)); @@ -2357,7 +2371,9 @@ pm_compile_pattern_deconstruct(rb_iseq_t *iseq, pm_scope_node_t *scope_node, con PUSH_LABEL(ret, deconstruct_label); PUSH_INSN(ret, location, dup); - PUSH_INSN1(ret, location, putobject, ID2SYM(rb_intern("deconstruct"))); + + VALUE operand = ID2SYM(rb_intern("deconstruct")); + PUSH_INSN1(ret, location, putobject, operand); PUSH_SEND(ret, location, idRespond_to, INT2FIX(1)); if (use_deconstructed_cache) { @@ -2429,7 +2445,12 @@ pm_compile_pattern_error_handler(rb_iseq_t *iseq, const pm_scope_node_t *scope_n PUSH_INSN1(ret, location, putobject, rb_eNoMatchingPatternError); PUSH_INSN1(ret, location, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); - PUSH_INSN1(ret, location, putobject, rb_fstring_lit("%p: %s")); + + { + VALUE operand = rb_fstring_lit("%p: %s"); + PUSH_INSN1(ret, location, putobject, operand); + } + PUSH_INSN1(ret, location, topn, INT2FIX(4)); PUSH_INSN1(ret, location, topn, INT2FIX(PM_PATTERN_BASE_INDEX_OFFSET_ERROR_STRING + 6)); PUSH_SEND(ret, location, id_core_sprintf, INT2FIX(3)); @@ -2439,7 +2460,12 @@ pm_compile_pattern_error_handler(rb_iseq_t *iseq, const pm_scope_node_t *scope_n PUSH_LABEL(ret, key_error_label); PUSH_INSN1(ret, location, putobject, rb_eNoMatchingPatternKeyError); PUSH_INSN1(ret, location, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); - PUSH_INSN1(ret, location, putobject, rb_fstring_lit("%p: %s")); + + { + VALUE operand = rb_fstring_lit("%p: %s"); + PUSH_INSN1(ret, location, putobject, operand); + } + PUSH_INSN1(ret, location, topn, INT2FIX(4)); PUSH_INSN1(ret, location, topn, INT2FIX(PM_PATTERN_BASE_INDEX_OFFSET_ERROR_STRING + 6)); PUSH_SEND(ret, location, id_core_sprintf, INT2FIX(3)); @@ -2570,7 +2596,12 @@ pm_compile_pattern(rb_iseq_t *iseq, pm_scope_node_t *scope_node, const pm_node_t PUSH_LABEL(ret, type_error_label); PUSH_INSN1(ret, location, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); PUSH_INSN1(ret, location, putobject, rb_eTypeError); - PUSH_INSN1(ret, location, putobject, rb_fstring_lit("deconstruct must return Array")); + + { + VALUE operand = rb_fstring_lit("deconstruct must return Array"); + PUSH_INSN1(ret, location, putobject, operand); + } + PUSH_SEND(ret, location, id_core_raise, INT2FIX(2)); PUSH_INSN(ret, location, pop); @@ -2682,7 +2713,12 @@ pm_compile_pattern(rb_iseq_t *iseq, pm_scope_node_t *scope_node, const pm_node_t PUSH_INSN1(ret, location, adjuststack, INT2FIX(3)); if (in_single_pattern) { PUSH_INSN1(ret, location, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); - PUSH_INSN1(ret, location, putobject, rb_fstring_lit("%p does not match to find pattern")); + + { + VALUE operand = rb_fstring_lit("%p does not match to find pattern"); + PUSH_INSN1(ret, location, putobject, operand); + } + PUSH_INSN1(ret, location, topn, INT2FIX(2)); PUSH_SEND(ret, location, id_core_sprintf, INT2FIX(2)); PUSH_INSN1(ret, location, setn, INT2FIX(base_index + PM_PATTERN_BASE_INDEX_OFFSET_ERROR_STRING + 1)); @@ -2707,7 +2743,12 @@ pm_compile_pattern(rb_iseq_t *iseq, pm_scope_node_t *scope_node, const pm_node_t PUSH_LABEL(ret, type_error_label); PUSH_INSN1(ret, location, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); PUSH_INSN1(ret, location, putobject, rb_eTypeError); - PUSH_INSN1(ret, location, putobject, rb_fstring_lit("deconstruct must return Array")); + + { + VALUE operand = rb_fstring_lit("deconstruct must return Array"); + PUSH_INSN1(ret, location, putobject, operand); + } + PUSH_SEND(ret, location, id_core_raise, INT2FIX(2)); PUSH_INSN(ret, location, pop); @@ -2756,7 +2797,12 @@ pm_compile_pattern(rb_iseq_t *iseq, pm_scope_node_t *scope_node, const pm_node_t } PUSH_INSN(ret, location, dup); - PUSH_INSN1(ret, location, putobject, ID2SYM(rb_intern("deconstruct_keys"))); + + { + VALUE operand = ID2SYM(rb_intern("deconstruct_keys")); + PUSH_INSN1(ret, location, putobject, operand); + } + PUSH_SEND(ret, location, idRespond_to, INT2FIX(1)); if (in_single_pattern) { CHECK(pm_compile_pattern_generic_error(iseq, scope_node, node, ret, rb_fstring_lit("%p does not respond to #deconstruct_keys"), base_index + 1)); @@ -2803,7 +2849,11 @@ pm_compile_pattern(rb_iseq_t *iseq, pm_scope_node_t *scope_node, const pm_node_t PUSH_INSN(ret, location, dup); PUSH_INSNL(ret, location, branchif, match_succeeded_label); - PUSH_INSN1(ret, location, putobject, rb_str_freeze(rb_sprintf("key not found: %+"PRIsVALUE, symbol))); + { + VALUE operand = rb_str_freeze(rb_sprintf("key not found: %+"PRIsVALUE, symbol)); + PUSH_INSN1(ret, location, putobject, operand); + } + PUSH_INSN1(ret, location, setn, INT2FIX(base_index + PM_PATTERN_BASE_INDEX_OFFSET_ERROR_STRING + 2)); PUSH_INSN1(ret, location, putobject, Qtrue); PUSH_INSN1(ret, location, setn, INT2FIX(base_index + PM_PATTERN_BASE_INDEX_OFFSET_KEY_ERROR_P + 3)); @@ -2870,7 +2920,12 @@ pm_compile_pattern(rb_iseq_t *iseq, pm_scope_node_t *scope_node, const pm_node_t PUSH_LABEL(ret, type_error_label); PUSH_INSN1(ret, location, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); PUSH_INSN1(ret, location, putobject, rb_eTypeError); - PUSH_INSN1(ret, location, putobject, rb_fstring_lit("deconstruct_keys must return Hash")); + + { + VALUE operand = rb_fstring_lit("deconstruct_keys must return Hash"); + PUSH_INSN1(ret, location, putobject, operand); + } + PUSH_SEND(ret, location, id_core_raise, INT2FIX(2)); PUSH_INSN(ret, location, pop); @@ -3069,7 +3124,11 @@ pm_compile_pattern(rb_iseq_t *iseq, pm_scope_node_t *scope_node, const pm_node_t PUSH_INSNL(ret, location, branchunless, match_succeeded_label); } - PUSH_INSN1(ret, location, putobject, rb_fstring_lit("guard clause does not return true")); + { + VALUE operand = rb_fstring_lit("guard clause does not return true"); + PUSH_INSN1(ret, location, putobject, operand); + } + PUSH_INSN1(ret, location, setn, INT2FIX(base_index + PM_PATTERN_BASE_INDEX_OFFSET_ERROR_STRING + 1)); PUSH_INSN1(ret, location, putobject, Qfalse); PUSH_INSN1(ret, location, setn, INT2FIX(base_index + PM_PATTERN_BASE_INDEX_OFFSET_KEY_ERROR_P + 2)); @@ -4462,7 +4521,8 @@ pm_compile_target_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *cons const pm_class_variable_target_node_t *cast = (const pm_class_variable_target_node_t *) node; ID name = pm_constant_id_lookup(scope_node, cast->name); - PUSH_INSN2(writes, location, setclassvariable, ID2SYM(name), get_cvar_ic_value(iseq, name)); + VALUE operand = ID2SYM(name); + PUSH_INSN2(writes, location, setclassvariable, operand, get_cvar_ic_value(iseq, name)); break; } case PM_CONSTANT_TARGET_NODE: { @@ -4474,8 +4534,9 @@ pm_compile_target_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *cons const pm_constant_target_node_t *cast = (const pm_constant_target_node_t *) node; ID name = pm_constant_id_lookup(scope_node, cast->name); + VALUE operand = ID2SYM(name); PUSH_INSN1(writes, location, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_CONST_BASE)); - PUSH_INSN1(writes, location, setconstant, ID2SYM(name)); + PUSH_INSN1(writes, location, setconstant, operand); break; } case PM_GLOBAL_VARIABLE_TARGET_NODE: { @@ -4487,7 +4548,8 @@ pm_compile_target_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *cons const pm_global_variable_target_node_t *cast = (const pm_global_variable_target_node_t *) node; ID name = pm_constant_id_lookup(scope_node, cast->name); - PUSH_INSN1(writes, location, setglobal, ID2SYM(name)); + VALUE operand = ID2SYM(name); + PUSH_INSN1(writes, location, setglobal, operand); break; } case PM_INSTANCE_VARIABLE_TARGET_NODE: { @@ -4499,7 +4561,8 @@ pm_compile_target_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *cons const pm_instance_variable_target_node_t *cast = (const pm_instance_variable_target_node_t *) node; ID name = pm_constant_id_lookup(scope_node, cast->name); - PUSH_INSN2(writes, location, setinstancevariable, ID2SYM(name), get_ivar_ic_value(iseq, name)); + VALUE operand = ID2SYM(name); + PUSH_INSN2(writes, location, setinstancevariable, operand, get_ivar_ic_value(iseq, name)); break; } case PM_CONSTANT_PATH_TARGET_NODE: { @@ -4529,7 +4592,8 @@ pm_compile_target_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *cons pm_multi_target_state_push(state, (INSN *) LAST_ELEMENT(writes), 1); } - PUSH_INSN1(writes, location, setconstant, ID2SYM(name)); + VALUE operand = ID2SYM(name); + PUSH_INSN1(writes, location, setconstant, operand); if (state != NULL) { PUSH_INSN(cleanup, location, pop); @@ -5297,7 +5361,9 @@ pm_compile_constant_write_node(rb_iseq_t *iseq, const pm_constant_write_node_t * if (!popped) PUSH_INSN(ret, location, dup); PUSH_INSN1(ret, location, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_CONST_BASE)); - PUSH_INSN1(ret, location, setconstant, ID2SYM(name_id)); + + VALUE operand = ID2SYM(name_id); + PUSH_INSN1(ret, location, setconstant, operand); } /** @@ -6546,11 +6612,17 @@ pm_compile_alias_global_variable_node(rb_iseq_t *iseq, const pm_alias_global_var // ^^^^^^^^^^^^^^^ PUSH_INSN1(ret, *location, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); - const pm_location_t *new_name_loc = &node->new_name->location; - PUSH_INSN1(ret, *location, putobject, ID2SYM(rb_intern3((const char *) new_name_loc->start, new_name_loc->end - new_name_loc->start, scope_node->encoding))); + { + const pm_location_t *name_loc = &node->new_name->location; + VALUE operand = ID2SYM(rb_intern3((const char *) name_loc->start, name_loc->end - name_loc->start, scope_node->encoding)); + PUSH_INSN1(ret, *location, putobject, operand); + } - const pm_location_t *old_name_loc = &node->old_name->location; - PUSH_INSN1(ret, *location, putobject, ID2SYM(rb_intern3((const char *) old_name_loc->start, old_name_loc->end - old_name_loc->start, scope_node->encoding))); + { + const pm_location_t *name_loc = &node->old_name->location; + VALUE operand = ID2SYM(rb_intern3((const char *) name_loc->start, name_loc->end - name_loc->start, scope_node->encoding)); + PUSH_INSN1(ret, *location, putobject, operand); + } PUSH_SEND(ret, *location, id_core_set_variable_alias, INT2FIX(2)); if (popped) PUSH_INSN(ret, *location, pop); @@ -6841,7 +6913,8 @@ pm_compile_call_node(rb_iseq_t *iseq, const pm_call_node_t *node, LINK_ANCHOR *c case idUMinus: { if (pm_opt_str_freeze_p(iseq, node)) { VALUE value = parse_static_literal_string(iseq, scope_node, node->receiver, &((const pm_string_node_t * ) node->receiver)->unescaped); - PUSH_INSN2(ret, location, opt_str_uminus, value, new_callinfo(iseq, idUMinus, 0, 0, NULL, FALSE)); + const struct rb_callinfo *callinfo = new_callinfo(iseq, idUMinus, 0, 0, NULL, FALSE); + PUSH_INSN2(ret, location, opt_str_uminus, value, callinfo); return; } break; @@ -6849,7 +6922,8 @@ pm_compile_call_node(rb_iseq_t *iseq, const pm_call_node_t *node, LINK_ANCHOR *c case idFreeze: { if (pm_opt_str_freeze_p(iseq, node)) { VALUE value = parse_static_literal_string(iseq, scope_node, node->receiver, &((const pm_string_node_t * ) node->receiver)->unescaped); - PUSH_INSN2(ret, location, opt_str_freeze, value, new_callinfo(iseq, idFreeze, 0, 0, NULL, FALSE)); + const struct rb_callinfo *callinfo = new_callinfo(iseq, idFreeze, 0, 0, NULL, FALSE); + PUSH_INSN2(ret, location, opt_str_freeze, value, callinfo); return; } break; @@ -6860,7 +6934,9 @@ pm_compile_call_node(rb_iseq_t *iseq, const pm_call_node_t *node, LINK_ANCHOR *c VALUE value = parse_static_literal_string(iseq, scope_node, (const pm_node_t *) string, &string->unescaped); PM_COMPILE_NOT_POPPED(node->receiver); - PUSH_INSN2(ret, location, opt_aref_with, value, new_callinfo(iseq, idAREF, 1, 0, NULL, FALSE)); + + const struct rb_callinfo *callinfo = new_callinfo(iseq, idAREF, 1, 0, NULL, FALSE); + PUSH_INSN2(ret, location, opt_aref_with, value, callinfo); if (popped) { PUSH_INSN(ret, location, pop); @@ -6883,7 +6959,8 @@ pm_compile_call_node(rb_iseq_t *iseq, const pm_call_node_t *node, LINK_ANCHOR *c PUSH_INSN1(ret, location, topn, INT2FIX(1)); } - PUSH_INSN2(ret, location, opt_aset_with, value, new_callinfo(iseq, idASET, 2, 0, NULL, FALSE)); + const struct rb_callinfo *callinfo = new_callinfo(iseq, idASET, 2, 0, NULL, FALSE); + PUSH_INSN2(ret, location, opt_aset_with, value, callinfo); PUSH_INSN(ret, location, pop); return; } @@ -7479,7 +7556,10 @@ pm_compile_forwarding_super_node(rb_iseq_t *iseq, const pm_forwarding_super_node flag |= VM_CALL_FORWARDING; pm_local_index_t mult_local = pm_lookup_local_index(iseq, scope_node, PM_CONSTANT_DOT3, 0); PUSH_GETLOCAL(ret, *location, mult_local.index, mult_local.level); - PUSH_INSN2(ret, *location, invokesuperforward, new_callinfo(iseq, 0, 0, flag, NULL, block != NULL), block); + + const struct rb_callinfo *callinfo = new_callinfo(iseq, 0, 0, flag, NULL, block != NULL); + PUSH_INSN2(ret, *location, invokesuperforward, callinfo, block); + if (popped) PUSH_INSN(ret, *location, pop); if (node->block) { ISEQ_COMPILE_DATA(iseq)->current_block = previous_block; @@ -7556,7 +7636,12 @@ pm_compile_forwarding_super_node(rb_iseq_t *iseq, const pm_forwarding_super_node for (; i < local_keyword->num; ++i) { ID id = local_keyword->table[i]; int idx = local_size - get_local_var_idx(local_iseq, id); - PUSH_INSN1(args, *location, putobject, ID2SYM(id)); + + { + VALUE operand = ID2SYM(id); + PUSH_INSN1(args, *location, putobject, operand); + } + PUSH_GETLOCAL(args, *location, idx, depth); } @@ -7571,7 +7656,11 @@ pm_compile_forwarding_super_node(rb_iseq_t *iseq, const pm_forwarding_super_node } PUSH_SEQ(ret, args); - PUSH_INSN2(ret, *location, invokesuper, new_callinfo(iseq, 0, argc, flag, NULL, block != NULL), block); + + { + const struct rb_callinfo *callinfo = new_callinfo(iseq, 0, argc, flag, NULL, block != NULL); + PUSH_INSN2(ret, *location, invokesuper, callinfo, block); + } if (node->block != NULL) { pm_compile_retry_end_label(iseq, ret, retry_end_l); @@ -7641,7 +7730,11 @@ pm_compile_match_write_node(rb_iseq_t *iseq, const pm_match_write_node_t *node, // Now, check if the match was successful. If it was, then we'll // continue on and assign local variables. Otherwise we'll skip over the // assignment code. - PUSH_INSN1(ret, *location, getglobal, rb_id2sym(idBACKREF)); + { + VALUE operand = rb_id2sym(idBACKREF); + PUSH_INSN1(ret, *location, getglobal, operand); + } + PUSH_INSN(ret, *location, dup); PUSH_INSNL(ret, *location, branchunless, fail_label); @@ -7656,7 +7749,11 @@ pm_compile_match_write_node(rb_iseq_t *iseq, const pm_match_write_node_t *node, const pm_local_variable_target_node_t *local_target = (const pm_local_variable_target_node_t *) target; pm_local_index_t index = pm_lookup_local_index(iseq, scope_node, local_target->name, local_target->depth); - PUSH_INSN1(ret, *location, putobject, rb_id2sym(pm_constant_id_lookup(scope_node, local_target->name))); + { + VALUE operand = rb_id2sym(pm_constant_id_lookup(scope_node, local_target->name)); + PUSH_INSN1(ret, *location, putobject, operand); + } + PUSH_SEND(ret, *location, idAREF, INT2FIX(1)); PUSH_LABEL(ret, fail_label); PUSH_SETLOCAL(ret, *location, index.index, index.level); @@ -7679,7 +7776,12 @@ pm_compile_match_write_node(rb_iseq_t *iseq, const pm_match_write_node_t *node, if (((size_t) targets_index) < (targets_count - 1)) { PUSH_INSN(ret, *location, dup); } - PUSH_INSN1(ret, *location, putobject, rb_id2sym(pm_constant_id_lookup(scope_node, local_target->name))); + + { + VALUE operand = rb_id2sym(pm_constant_id_lookup(scope_node, local_target->name)); + PUSH_INSN1(ret, *location, putobject, operand); + } + PUSH_SEND(ret, *location, idAREF, INT2FIX(1)); PUSH_SETLOCAL(ret, *location, index.index, index.level); @@ -8037,10 +8139,18 @@ pm_compile_super_node(rb_iseq_t *iseq, const pm_super_node_t *node, const pm_nod PUSH_SEQ(ret, args); if (is_forwardable && ISEQ_BODY(ISEQ_BODY(iseq)->local_iseq)->param.flags.forwardable) { flags |= VM_CALL_FORWARDING; - PUSH_INSN2(ret, *location, invokesuperforward, new_callinfo(iseq, 0, argc, flags, keywords, current_block != NULL), current_block); + + { + const struct rb_callinfo *callinfo = new_callinfo(iseq, 0, argc, flags, keywords, current_block != NULL); + PUSH_INSN2(ret, *location, invokesuperforward, callinfo, current_block); + } } else { - PUSH_INSN2(ret, *location, invokesuper, new_callinfo(iseq, 0, argc, flags, keywords, current_block != NULL), current_block); + { + const struct rb_callinfo *callinfo = new_callinfo(iseq, 0, argc, flags, keywords, current_block != NULL); + PUSH_INSN2(ret, *location, invokesuper, callinfo, current_block); + } + pm_compile_retry_end_label(iseq, ret, retry_end_l); } @@ -8069,7 +8179,9 @@ pm_compile_yield_node(rb_iseq_t *iseq, const pm_yield_node_t *node, const pm_nod argc = pm_setup_args(node->arguments, NULL, &flags, &keywords, iseq, ret, scope_node, location); } - PUSH_INSN1(ret, *location, invokeblock, new_callinfo(iseq, 0, argc, flags, keywords, FALSE)); + const struct rb_callinfo *callinfo = new_callinfo(iseq, 0, argc, flags, keywords, FALSE); + PUSH_INSN1(ret, *location, invokeblock, callinfo); + iseq_set_use_block(ISEQ_BODY(iseq)->local_iseq); if (popped) PUSH_INSN(ret, *location, pop); @@ -8333,7 +8445,10 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, PUSH_INSN(ret, location, putnil); } - PUSH_INSN3(ret, location, defineclass, ID2SYM(class_id), class_iseq, INT2FIX(flags)); + { + VALUE operand = ID2SYM(class_id); + PUSH_INSN3(ret, location, defineclass, operand, class_iseq, INT2FIX(flags)); + } RB_OBJ_WRITTEN(iseq, Qundef, (VALUE)class_iseq); if (popped) PUSH_INSN(ret, location, pop); @@ -8653,7 +8768,8 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, // 1.0 // ^^^ if (!popped) { - PUSH_INSN1(ret, location, putobject, parse_float((const pm_float_node_t *) node)); + VALUE operand = parse_float((const pm_float_node_t *) node); + PUSH_INSN1(ret, location, putobject, operand); } return; } @@ -8858,7 +8974,8 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, // 1i // ^^ if (!popped) { - PUSH_INSN1(ret, location, putobject, parse_imaginary((const pm_imaginary_node_t *) node)); + VALUE operand = parse_imaginary((const pm_imaginary_node_t *) node); + PUSH_INSN1(ret, location, putobject, operand); } return; } @@ -8994,7 +9111,8 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, // 1 // ^ if (!popped) { - PUSH_INSN1(ret, location, putobject, parse_integer((const pm_integer_node_t *) node)); + VALUE operand = parse_integer((const pm_integer_node_t *) node); + PUSH_INSN1(ret, location, putobject, operand); } return; } From 768ceceb12c7947030132007b91d5bdb97a8839c Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Wed, 25 Sep 2024 13:23:42 -0400 Subject: [PATCH 455/829] [ruby/prism] Disallow label in parentheses https://github.com/ruby/prism/commit/b624e09cc6 --- prism/config.yml | 1 + prism/prism.c | 188 +++++++++--------- prism/templates/src/diagnostic.c.erb | 3 +- test/prism/errors/label_in_parentheses.txt | 3 + test/prism/errors/symbol_in_hash.txt | 2 +- .../errors/symbol_in_keyword_parameter.txt | 2 +- 6 files changed, 101 insertions(+), 98 deletions(-) create mode 100644 test/prism/errors/label_in_parentheses.txt diff --git a/prism/config.yml b/prism/config.yml index fc86c9b3ed6dc6..876008311f3eb9 100644 --- a/prism/config.yml +++ b/prism/config.yml @@ -272,6 +272,7 @@ errors: - UNEXPECTED_BLOCK_ARGUMENT - UNEXPECTED_INDEX_BLOCK - UNEXPECTED_INDEX_KEYWORDS + - UNEXPECTED_LABEL - UNEXPECTED_MULTI_WRITE - UNEXPECTED_RANGE_OPERATOR - UNEXPECTED_SAFE_NAVIGATION diff --git a/prism/prism.c b/prism/prism.c index 99fb91115fd448..6732e9ef2b2fa1 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -278,11 +278,6 @@ lex_state_beg_p(pm_parser_t *parser) { return lex_state_p(parser, PM_LEX_STATE_BEG_ANY) || ((parser->lex_state & (PM_LEX_STATE_ARG | PM_LEX_STATE_LABELED)) == (PM_LEX_STATE_ARG | PM_LEX_STATE_LABELED)); } -static inline bool -lex_state_arg_labeled_p(pm_parser_t *parser) { - return (parser->lex_state & (PM_LEX_STATE_ARG | PM_LEX_STATE_LABELED)) == (PM_LEX_STATE_ARG | PM_LEX_STATE_LABELED); -} - static inline bool lex_state_arg_p(pm_parser_t *parser) { return lex_state_p(parser, PM_LEX_STATE_ARG_ANY); @@ -13167,15 +13162,15 @@ expect1_heredoc_term(pm_parser_t *parser, pm_lex_mode_t *lex_mode) { } static pm_node_t * -parse_expression(pm_parser_t *parser, pm_binding_power_t binding_power, bool accepts_command_call, pm_diagnostic_id_t diag_id, uint16_t depth); +parse_expression(pm_parser_t *parser, pm_binding_power_t binding_power, bool accepts_command_call, bool accepts_label, pm_diagnostic_id_t diag_id, uint16_t depth); /** * This is a wrapper of parse_expression, which also checks whether the * resulting node is a value expression. */ static pm_node_t * -parse_value_expression(pm_parser_t *parser, pm_binding_power_t binding_power, bool accepts_command_call, pm_diagnostic_id_t diag_id, uint16_t depth) { - pm_node_t *node = parse_expression(parser, binding_power, accepts_command_call, diag_id, depth); +parse_value_expression(pm_parser_t *parser, pm_binding_power_t binding_power, bool accepts_command_call, bool accepts_label, pm_diagnostic_id_t diag_id, uint16_t depth) { + pm_node_t *node = parse_expression(parser, binding_power, accepts_command_call, accepts_label, diag_id, depth); pm_assert_value_expression(parser, node); return node; } @@ -13262,11 +13257,11 @@ static pm_node_t * parse_starred_expression(pm_parser_t *parser, pm_binding_power_t binding_power, bool accepts_command_call, pm_diagnostic_id_t diag_id, uint16_t depth) { if (accept1(parser, PM_TOKEN_USTAR)) { pm_token_t operator = parser->previous; - pm_node_t *expression = parse_value_expression(parser, binding_power, false, PM_ERR_EXPECT_EXPRESSION_AFTER_STAR, (uint16_t) (depth + 1)); + pm_node_t *expression = parse_value_expression(parser, binding_power, false, false, PM_ERR_EXPECT_EXPRESSION_AFTER_STAR, (uint16_t) (depth + 1)); return (pm_node_t *) pm_splat_node_create(parser, &operator, expression); } - return parse_value_expression(parser, binding_power, accepts_command_call, diag_id, depth); + return parse_value_expression(parser, binding_power, accepts_command_call, false, diag_id, depth); } /** @@ -13779,7 +13774,7 @@ parse_targets(pm_parser_t *parser, pm_node_t *first_target, pm_binding_power_t b pm_node_t *name = NULL; if (token_begins_expression_p(parser->current.type)) { - name = parse_expression(parser, binding_power, false, PM_ERR_EXPECT_EXPRESSION_AFTER_STAR, (uint16_t) (depth + 1)); + name = parse_expression(parser, binding_power, false, false, PM_ERR_EXPECT_EXPRESSION_AFTER_STAR, (uint16_t) (depth + 1)); name = parse_target(parser, name, true, true); } @@ -13787,7 +13782,7 @@ parse_targets(pm_parser_t *parser, pm_node_t *first_target, pm_binding_power_t b pm_multi_target_node_targets_append(parser, result, splat); has_rest = true; } else if (token_begins_expression_p(parser->current.type)) { - pm_node_t *target = parse_expression(parser, binding_power, false, PM_ERR_EXPECT_EXPRESSION_AFTER_COMMA, (uint16_t) (depth + 1)); + pm_node_t *target = parse_expression(parser, binding_power, false, false, PM_ERR_EXPECT_EXPRESSION_AFTER_COMMA, (uint16_t) (depth + 1)); target = parse_target(parser, target, true, false); pm_multi_target_node_targets_append(parser, result, target); @@ -13839,7 +13834,7 @@ parse_statements(pm_parser_t *parser, pm_context_t context, uint16_t depth) { context_push(parser, context); while (true) { - pm_node_t *node = parse_expression(parser, PM_BINDING_POWER_STATEMENT, true, PM_ERR_CANNOT_PARSE_EXPRESSION, (uint16_t) (depth + 1)); + pm_node_t *node = parse_expression(parser, PM_BINDING_POWER_STATEMENT, true, false, PM_ERR_CANNOT_PARSE_EXPRESSION, (uint16_t) (depth + 1)); pm_statements_node_body_append(parser, statements, node, true); // If we're recovering from a syntax error, then we need to stop parsing @@ -13978,9 +13973,9 @@ parse_assocs(pm_parser_t *parser, pm_static_literals_t *literals, pm_node_t *nod // inner hash to share the static literals with the outer // hash. parser->current_hash_keys = literals; - value = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_EXPECT_EXPRESSION_AFTER_SPLAT_HASH, (uint16_t) (depth + 1)); + value = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, false, PM_ERR_EXPECT_EXPRESSION_AFTER_SPLAT_HASH, (uint16_t) (depth + 1)); } else if (token_begins_expression_p(parser->current.type)) { - value = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_EXPECT_EXPRESSION_AFTER_SPLAT_HASH, (uint16_t) (depth + 1)); + value = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, false, PM_ERR_EXPECT_EXPRESSION_AFTER_SPLAT_HASH, (uint16_t) (depth + 1)); } else { pm_parser_scope_forwarding_keywords_check(parser, &operator); } @@ -14000,7 +13995,7 @@ parse_assocs(pm_parser_t *parser, pm_static_literals_t *literals, pm_node_t *nod pm_node_t *value = NULL; if (token_begins_expression_p(parser->current.type)) { - value = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_HASH_EXPRESSION_AFTER_LABEL, (uint16_t) (depth + 1)); + value = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, false, PM_ERR_HASH_EXPRESSION_AFTER_LABEL, (uint16_t) (depth + 1)); } else { if (parser->encoding->isupper_char(label.start, (label.end - 1) - label.start)) { pm_token_t constant = { .type = PM_TOKEN_CONSTANT, .start = label.start, .end = label.end - 1 }; @@ -14030,7 +14025,7 @@ parse_assocs(pm_parser_t *parser, pm_static_literals_t *literals, pm_node_t *nod break; } default: { - pm_node_t *key = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_HASH_KEY, (uint16_t) (depth + 1)); + pm_node_t *key = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, true, PM_ERR_HASH_KEY, (uint16_t) (depth + 1)); // Hash keys that are strings are automatically frozen. We will // mark that here. @@ -14048,7 +14043,7 @@ parse_assocs(pm_parser_t *parser, pm_static_literals_t *literals, pm_node_t *nod operator = parser->previous; } - pm_node_t *value = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_HASH_VALUE, (uint16_t) (depth + 1)); + pm_node_t *value = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, false, PM_ERR_HASH_VALUE, (uint16_t) (depth + 1)); element = (pm_node_t *) pm_assoc_node_create(parser, key, &operator, value); break; } @@ -14152,7 +14147,7 @@ parse_arguments(pm_parser_t *parser, pm_arguments_t *arguments, bool accepts_for pm_node_t *expression = NULL; if (token_begins_expression_p(parser->current.type)) { - expression = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_EXPECT_ARGUMENT, (uint16_t) (depth + 1)); + expression = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, false, PM_ERR_EXPECT_ARGUMENT, (uint16_t) (depth + 1)); } else { pm_parser_scope_forwarding_block_check(parser, &operator); } @@ -14175,7 +14170,7 @@ parse_arguments(pm_parser_t *parser, pm_arguments_t *arguments, bool accepts_for pm_parser_scope_forwarding_positionals_check(parser, &operator); argument = (pm_node_t *) pm_splat_node_create(parser, &operator, NULL); } else { - pm_node_t *expression = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_EXPECT_EXPRESSION_AFTER_SPLAT, (uint16_t) (depth + 1)); + pm_node_t *expression = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, false, PM_ERR_EXPECT_EXPRESSION_AFTER_SPLAT, (uint16_t) (depth + 1)); if (parsed_bare_hash) { pm_parser_err(parser, operator.start, expression->location.end, PM_ERR_ARGUMENT_SPLAT_AFTER_ASSOC_SPLAT); @@ -14195,7 +14190,7 @@ parse_arguments(pm_parser_t *parser, pm_arguments_t *arguments, bool accepts_for // If the token begins an expression then this ... was not actually // argument forwarding but was instead a range. pm_token_t operator = parser->previous; - pm_node_t *right = parse_expression(parser, PM_BINDING_POWER_RANGE, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1)); + pm_node_t *right = parse_expression(parser, PM_BINDING_POWER_RANGE, false, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1)); argument = (pm_node_t *) pm_range_node_create(parser, NULL, &operator, right); } else { pm_parser_scope_forwarding_all_check(parser, &parser->previous); @@ -14215,7 +14210,7 @@ parse_arguments(pm_parser_t *parser, pm_arguments_t *arguments, bool accepts_for /* fallthrough */ default: { if (argument == NULL) { - argument = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, !parsed_first_argument, PM_ERR_EXPECT_ARGUMENT, (uint16_t) (depth + 1)); + argument = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, !parsed_first_argument, true, PM_ERR_EXPECT_ARGUMENT, (uint16_t) (depth + 1)); } bool contains_keywords = false; @@ -14241,7 +14236,7 @@ parse_arguments(pm_parser_t *parser, pm_arguments_t *arguments, bool accepts_for pm_hash_key_static_literals_add(parser, &hash_keys, argument); // Finish parsing the one we are part way through. - pm_node_t *value = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_HASH_VALUE, (uint16_t) (depth + 1)); + pm_node_t *value = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, false, PM_ERR_HASH_VALUE, (uint16_t) (depth + 1)); argument = (pm_node_t *) pm_assoc_node_create(parser, argument, &operator, value); pm_keyword_hash_node_elements_append(bare_hash, argument); @@ -14568,7 +14563,7 @@ parse_parameters( uint32_t reads = parser->version == PM_OPTIONS_VERSION_CRUBY_3_3 ? pm_locals_reads(&parser->current_scope->locals, name_id) : 0; if (accepts_blocks_in_defaults) pm_accepts_block_stack_push(parser, true); - pm_node_t *value = parse_value_expression(parser, binding_power, false, PM_ERR_PARAMETER_NO_DEFAULT, (uint16_t) (depth + 1)); + pm_node_t *value = parse_value_expression(parser, binding_power, false, false, PM_ERR_PARAMETER_NO_DEFAULT, (uint16_t) (depth + 1)); if (accepts_blocks_in_defaults) pm_accepts_block_stack_pop(parser); pm_optional_parameter_node_t *param = pm_optional_parameter_node_create(parser, &name, &operator, value); @@ -14663,7 +14658,7 @@ parse_parameters( uint32_t reads = parser->version == PM_OPTIONS_VERSION_CRUBY_3_3 ? pm_locals_reads(&parser->current_scope->locals, name_id) : 0; if (accepts_blocks_in_defaults) pm_accepts_block_stack_push(parser, true); - pm_node_t *value = parse_value_expression(parser, binding_power, false, PM_ERR_PARAMETER_NO_DEFAULT_KW, (uint16_t) (depth + 1)); + pm_node_t *value = parse_value_expression(parser, binding_power, false, false, PM_ERR_PARAMETER_NO_DEFAULT_KW, (uint16_t) (depth + 1)); if (accepts_blocks_in_defaults) pm_accepts_block_stack_pop(parser); if (parser->version == PM_OPTIONS_VERSION_CRUBY_3_3 && (pm_locals_reads(&parser->current_scope->locals, name_id) != reads)) { @@ -14941,7 +14936,7 @@ parse_rescues(pm_parser_t *parser, size_t opening_newline_index, const pm_token_ parser_lex(parser); pm_rescue_node_operator_set(rescue, &parser->previous); - pm_node_t *reference = parse_expression(parser, PM_BINDING_POWER_INDEX, false, PM_ERR_RESCUE_VARIABLE, (uint16_t) (depth + 1)); + pm_node_t *reference = parse_expression(parser, PM_BINDING_POWER_INDEX, false, false, PM_ERR_RESCUE_VARIABLE, (uint16_t) (depth + 1)); reference = parse_target(parser, reference, false, false); pm_rescue_node_reference_set(rescue, reference); @@ -14971,7 +14966,7 @@ parse_rescues(pm_parser_t *parser, size_t opening_newline_index, const pm_token_ if (accept1(parser, PM_TOKEN_EQUAL_GREATER)) { pm_rescue_node_operator_set(rescue, &parser->previous); - pm_node_t *reference = parse_expression(parser, PM_BINDING_POWER_INDEX, false, PM_ERR_RESCUE_VARIABLE, (uint16_t) (depth + 1)); + pm_node_t *reference = parse_expression(parser, PM_BINDING_POWER_INDEX, false, false, PM_ERR_RESCUE_VARIABLE, (uint16_t) (depth + 1)); reference = parse_target(parser, reference, false, false); pm_rescue_node_reference_set(rescue, reference); @@ -15683,7 +15678,7 @@ static inline pm_node_t * parse_predicate(pm_parser_t *parser, pm_binding_power_t binding_power, pm_context_t context, pm_token_t *then_keyword, uint16_t depth) { context_push(parser, PM_CONTEXT_PREDICATE); pm_diagnostic_id_t error_id = context == PM_CONTEXT_IF ? PM_ERR_CONDITIONAL_IF_PREDICATE : PM_ERR_CONDITIONAL_UNLESS_PREDICATE; - pm_node_t *predicate = parse_value_expression(parser, binding_power, true, error_id, (uint16_t) (depth + 1)); + pm_node_t *predicate = parse_value_expression(parser, binding_power, true, false, error_id, (uint16_t) (depth + 1)); // Predicates are closed by a term, a "then", or a term and then a "then". bool predicate_closed = accept2(parser, PM_TOKEN_NEWLINE, PM_TOKEN_SEMICOLON); @@ -16495,11 +16490,9 @@ parse_strings_empty_content(const uint8_t *location) { * Parse a set of strings that could be concatenated together. */ static inline pm_node_t * -parse_strings(pm_parser_t *parser, pm_node_t *current, uint16_t depth) { +parse_strings(pm_parser_t *parser, pm_node_t *current, bool accepts_label, uint16_t depth) { assert(parser->current.type == PM_TOKEN_STRING_BEGIN); - bool concating = false; - bool state_is_arg_labeled = lex_state_arg_labeled_p(parser); while (match1(parser, PM_TOKEN_STRING_BEGIN)) { pm_node_t *node = NULL; @@ -16509,6 +16502,7 @@ parse_strings(pm_parser_t *parser, pm_node_t *current, uint16_t depth) { const pm_lex_mode_t *lex_mode = parser->lex_modes.current; assert(lex_mode->mode == PM_LEX_STRING); bool lex_interpolation = lex_mode->as.string.interpolation; + bool label_allowed = lex_mode->as.string.label_allowed && accepts_label; pm_token_t opening = parser->current; parser_lex(parser); @@ -16575,8 +16569,9 @@ parse_strings(pm_parser_t *parser, pm_node_t *current, uint16_t depth) { node = (pm_node_t *) pm_interpolated_string_node_create(parser, &opening, &parts, &parser->previous); pm_node_list_free(&parts); - } else if (accept1(parser, PM_TOKEN_LABEL_END) && !state_is_arg_labeled) { + } else if (accept1(parser, PM_TOKEN_LABEL_END)) { node = (pm_node_t *) pm_symbol_node_create_unescaped(parser, &opening, &content, &parser->previous, &unescaped, parse_symbol_encoding(parser, &content, &unescaped, true)); + if (!label_allowed) pm_parser_err_node(parser, node, PM_ERR_UNEXPECTED_LABEL); } else if (match1(parser, PM_TOKEN_EOF)) { pm_parser_err_token(parser, &opening, PM_ERR_STRING_LITERAL_EOF); node = (pm_node_t *) pm_string_node_create_unescaped(parser, &opening, &content, &parser->current, &unescaped); @@ -16615,6 +16610,7 @@ parse_strings(pm_parser_t *parser, pm_node_t *current, uint16_t depth) { } } else if (accept1(parser, PM_TOKEN_LABEL_END)) { node = (pm_node_t *) pm_symbol_node_create_unescaped(parser, &opening, &content, &parser->previous, &unescaped, parse_symbol_encoding(parser, &content, &unescaped, true)); + if (!label_allowed) pm_parser_err_node(parser, node, PM_ERR_UNEXPECTED_LABEL); } else { // If we get here, then we have interpolation so we'll need // to create a string or symbol node with interpolation. @@ -16632,8 +16628,9 @@ parse_strings(pm_parser_t *parser, pm_node_t *current, uint16_t depth) { } } - if (accept1(parser, PM_TOKEN_LABEL_END) && !state_is_arg_labeled) { + if (accept1(parser, PM_TOKEN_LABEL_END)) { node = (pm_node_t *) pm_interpolated_symbol_node_create(parser, &opening, &parts, &parser->previous); + if (!label_allowed) pm_parser_err_node(parser, node, PM_ERR_UNEXPECTED_LABEL); } else if (match1(parser, PM_TOKEN_EOF)) { pm_parser_err_token(parser, &opening, PM_ERR_STRING_INTERPOLATED_TERM); node = (pm_node_t *) pm_interpolated_string_node_create(parser, &opening, &parts, &parser->current); @@ -16659,6 +16656,7 @@ parse_strings(pm_parser_t *parser, pm_node_t *current, uint16_t depth) { if (accept1(parser, PM_TOKEN_LABEL_END)) { node = (pm_node_t *) pm_interpolated_symbol_node_create(parser, &opening, &parts, &parser->previous); + if (!label_allowed) pm_parser_err_node(parser, node, PM_ERR_UNEXPECTED_LABEL); } else if (match1(parser, PM_TOKEN_EOF)) { pm_parser_err_token(parser, &opening, PM_ERR_STRING_INTERPOLATED_TERM); node = (pm_node_t *) pm_interpolated_string_node_create(parser, &opening, &parts, &parser->current); @@ -17067,7 +17065,7 @@ parse_pattern_hash(pm_parser_t *parser, pm_constant_id_list_t *captures, pm_node pm_node_t *key; if (match1(parser, PM_TOKEN_STRING_BEGIN)) { - key = parse_strings(parser, NULL, (uint16_t) (depth + 1)); + key = parse_strings(parser, NULL, true, (uint16_t) (depth + 1)); if (PM_NODE_TYPE_P(key, PM_INTERPOLATED_SYMBOL_NODE)) { pm_parser_err_node(parser, key, PM_ERR_PATTERN_HASH_KEY_INTERPOLATED); @@ -17209,7 +17207,7 @@ parse_pattern_primitive(pm_parser_t *parser, pm_constant_id_list_t *captures, pm first_node = parse_pattern_keyword_rest(parser, captures); break; case PM_TOKEN_STRING_BEGIN: - first_node = parse_expression(parser, PM_BINDING_POWER_MAX, false, PM_ERR_PATTERN_HASH_KEY_LABEL, (uint16_t) (depth + 1)); + first_node = parse_expression(parser, PM_BINDING_POWER_MAX, false, true, PM_ERR_PATTERN_HASH_KEY_LABEL, (uint16_t) (depth + 1)); break; default: { PM_PARSER_ERR_TOKEN_FORMAT(parser, parser->current, PM_ERR_PATTERN_HASH_KEY, pm_token_type_human(parser->current.type)); @@ -17245,7 +17243,7 @@ parse_pattern_primitive(pm_parser_t *parser, pm_constant_id_list_t *captures, pm // expression as the right side of the range. switch (parser->current.type) { case PM_CASE_PRIMITIVE: { - pm_node_t *right = parse_expression(parser, PM_BINDING_POWER_MAX, false, PM_ERR_PATTERN_EXPRESSION_AFTER_RANGE, (uint16_t) (depth + 1)); + pm_node_t *right = parse_expression(parser, PM_BINDING_POWER_MAX, false, false, PM_ERR_PATTERN_EXPRESSION_AFTER_RANGE, (uint16_t) (depth + 1)); return (pm_node_t *) pm_range_node_create(parser, NULL, &operator, right); } default: { @@ -17256,7 +17254,7 @@ parse_pattern_primitive(pm_parser_t *parser, pm_constant_id_list_t *captures, pm } } case PM_CASE_PRIMITIVE: { - pm_node_t *node = parse_expression(parser, PM_BINDING_POWER_MAX, false, diag_id, (uint16_t) (depth + 1)); + pm_node_t *node = parse_expression(parser, PM_BINDING_POWER_MAX, false, true, diag_id, (uint16_t) (depth + 1)); // Now that we have a primitive, we need to check if it's part of a range. if (accept2(parser, PM_TOKEN_DOT_DOT, PM_TOKEN_DOT_DOT_DOT)) { @@ -17267,7 +17265,7 @@ parse_pattern_primitive(pm_parser_t *parser, pm_constant_id_list_t *captures, pm // node. Otherwise, we'll create an endless range. switch (parser->current.type) { case PM_CASE_PRIMITIVE: { - pm_node_t *right = parse_expression(parser, PM_BINDING_POWER_MAX, false, PM_ERR_PATTERN_EXPRESSION_AFTER_RANGE, (uint16_t) (depth + 1)); + pm_node_t *right = parse_expression(parser, PM_BINDING_POWER_MAX, false, false, PM_ERR_PATTERN_EXPRESSION_AFTER_RANGE, (uint16_t) (depth + 1)); return (pm_node_t *) pm_range_node_create(parser, node, &operator, right); } default: @@ -17332,7 +17330,7 @@ parse_pattern_primitive(pm_parser_t *parser, pm_constant_id_list_t *captures, pm pm_token_t lparen = parser->current; parser_lex(parser); - pm_node_t *expression = parse_value_expression(parser, PM_BINDING_POWER_STATEMENT, true, PM_ERR_PATTERN_EXPRESSION_AFTER_PIN, (uint16_t) (depth + 1)); + pm_node_t *expression = parse_value_expression(parser, PM_BINDING_POWER_STATEMENT, true, false, PM_ERR_PATTERN_EXPRESSION_AFTER_PIN, (uint16_t) (depth + 1)); parser->pattern_matching_newlines = previous_pattern_matching_newlines; accept1(parser, PM_TOKEN_NEWLINE); @@ -17887,7 +17885,7 @@ parse_regular_expression_errors(pm_parser_t *parser, pm_regular_expression_node_ * Parse an expression that begins with the previous node that we just lexed. */ static inline pm_node_t * -parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, bool accepts_command_call, pm_diagnostic_id_t diag_id, uint16_t depth) { +parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, bool accepts_command_call, bool accepts_label, pm_diagnostic_id_t diag_id, uint16_t depth) { switch (parser->current.type) { case PM_TOKEN_BRACKET_LEFT_ARRAY: { parser_lex(parser); @@ -17926,7 +17924,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b if (match3(parser, PM_TOKEN_BRACKET_RIGHT, PM_TOKEN_COMMA, PM_TOKEN_EOF)) { pm_parser_scope_forwarding_positionals_check(parser, &operator); } else { - expression = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_ARRAY_EXPRESSION_AFTER_STAR, (uint16_t) (depth + 1)); + expression = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, false, PM_ERR_ARRAY_EXPRESSION_AFTER_STAR, (uint16_t) (depth + 1)); } element = (pm_node_t *) pm_splat_node_create(parser, &operator, expression); @@ -17945,7 +17943,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b pm_static_literals_free(&hash_keys); parsed_bare_hash = true; } else { - element = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_ARRAY_EXPRESSION, (uint16_t) (depth + 1)); + element = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, true, PM_ERR_ARRAY_EXPRESSION, (uint16_t) (depth + 1)); if (pm_symbol_node_label_p(element) || accept1(parser, PM_TOKEN_EQUAL_GREATER)) { if (parsed_bare_hash) { @@ -17963,7 +17961,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b operator = not_provided(parser); } - pm_node_t *value = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_HASH_VALUE, (uint16_t) (depth + 1)); + pm_node_t *value = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, false, PM_ERR_HASH_VALUE, (uint16_t) (depth + 1)); pm_node_t *assoc = (pm_node_t *) pm_assoc_node_create(parser, element, &operator, value); pm_keyword_hash_node_elements_append(hash, assoc); @@ -18013,7 +18011,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b // of statements within the parentheses. pm_accepts_block_stack_push(parser, true); context_push(parser, PM_CONTEXT_PARENS); - pm_node_t *statement = parse_expression(parser, PM_BINDING_POWER_STATEMENT, true, PM_ERR_CANNOT_PARSE_EXPRESSION, (uint16_t) (depth + 1)); + pm_node_t *statement = parse_expression(parser, PM_BINDING_POWER_STATEMENT, true, false, PM_ERR_CANNOT_PARSE_EXPRESSION, (uint16_t) (depth + 1)); context_pop(parser); // Determine if this statement is followed by a terminator. In the @@ -18093,7 +18091,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b // Parse each statement within the parentheses. while (true) { - pm_node_t *node = parse_expression(parser, PM_BINDING_POWER_STATEMENT, true, PM_ERR_CANNOT_PARSE_EXPRESSION, (uint16_t) (depth + 1)); + pm_node_t *node = parse_expression(parser, PM_BINDING_POWER_STATEMENT, true, false, PM_ERR_CANNOT_PARSE_EXPRESSION, (uint16_t) (depth + 1)); pm_statements_node_body_append(parser, statements, node, true); // If we're recovering from a syntax error, then we need to stop @@ -18185,7 +18183,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b // Characters can be followed by strings in which case they are // automatically concatenated. if (match1(parser, PM_TOKEN_STRING_BEGIN)) { - return parse_strings(parser, node, (uint16_t) (depth + 1)); + return parse_strings(parser, node, false, (uint16_t) (depth + 1)); } return node; @@ -18245,7 +18243,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b pm_token_t operator = parser->current; parser_lex(parser); - pm_node_t *right = parse_expression(parser, pm_binding_powers[operator.type].left, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1)); + pm_node_t *right = parse_expression(parser, pm_binding_powers[operator.type].left, false, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1)); // Unary .. and ... are special because these are non-associative // operators that can also be unary operators. In this case we need @@ -18490,7 +18488,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b } if (match1(parser, PM_TOKEN_STRING_BEGIN)) { - return parse_strings(parser, node, (uint16_t) (depth + 1)); + return parse_strings(parser, node, false, (uint16_t) (depth + 1)); } return node; @@ -18588,7 +18586,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b } else if (!token_begins_expression_p(parser->current.type)) { predicate = NULL; } else { - predicate = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_CASE_EXPRESSION_AFTER_CASE, (uint16_t) (depth + 1)); + predicate = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, false, PM_ERR_CASE_EXPRESSION_AFTER_CASE, (uint16_t) (depth + 1)); while (accept2(parser, PM_TOKEN_NEWLINE, PM_TOKEN_SEMICOLON)); } @@ -18625,14 +18623,14 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b do { if (accept1(parser, PM_TOKEN_USTAR)) { pm_token_t operator = parser->previous; - pm_node_t *expression = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_EXPECT_EXPRESSION_AFTER_STAR, (uint16_t) (depth + 1)); + pm_node_t *expression = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, false, PM_ERR_EXPECT_EXPRESSION_AFTER_STAR, (uint16_t) (depth + 1)); pm_splat_node_t *splat_node = pm_splat_node_create(parser, &operator, expression); pm_when_node_conditions_append(when_node, (pm_node_t *) splat_node); if (PM_NODE_TYPE_P(expression, PM_MISSING_NODE)) break; } else { - pm_node_t *condition = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_CASE_EXPRESSION_AFTER_WHEN, (uint16_t) (depth + 1)); + pm_node_t *condition = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, false, PM_ERR_CASE_EXPRESSION_AFTER_WHEN, (uint16_t) (depth + 1)); pm_when_node_conditions_append(when_node, condition); // If we found a missing node, then this is a syntax @@ -18713,11 +18711,11 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b // `unless` statements. if (accept1(parser, PM_TOKEN_KEYWORD_IF_MODIFIER)) { pm_token_t keyword = parser->previous; - pm_node_t *predicate = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_CONDITIONAL_IF_PREDICATE, (uint16_t) (depth + 1)); + pm_node_t *predicate = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, false, PM_ERR_CONDITIONAL_IF_PREDICATE, (uint16_t) (depth + 1)); pattern = (pm_node_t *) pm_if_node_modifier_create(parser, pattern, &keyword, predicate); } else if (accept1(parser, PM_TOKEN_KEYWORD_UNLESS_MODIFIER)) { pm_token_t keyword = parser->previous; - pm_node_t *predicate = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_CONDITIONAL_UNLESS_PREDICATE, (uint16_t) (depth + 1)); + pm_node_t *predicate = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, false, PM_ERR_CONDITIONAL_UNLESS_PREDICATE, (uint16_t) (depth + 1)); pattern = (pm_node_t *) pm_unless_node_modifier_create(parser, pattern, &keyword, predicate); } @@ -18939,7 +18937,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b if (accept1(parser, PM_TOKEN_LESS_LESS)) { pm_token_t operator = parser->previous; - pm_node_t *expression = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_EXPECT_EXPRESSION_AFTER_LESS_LESS, (uint16_t) (depth + 1)); + pm_node_t *expression = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, false, PM_ERR_EXPECT_EXPRESSION_AFTER_LESS_LESS, (uint16_t) (depth + 1)); pm_parser_scope_push(parser, true); accept2(parser, PM_TOKEN_NEWLINE, PM_TOKEN_SEMICOLON); @@ -18972,7 +18970,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b return (pm_node_t *) pm_singleton_class_node_create(parser, &locals, &class_keyword, &operator, expression, statements, &parser->previous); } - pm_node_t *constant_path = parse_expression(parser, PM_BINDING_POWER_INDEX, false, PM_ERR_CLASS_NAME, (uint16_t) (depth + 1)); + pm_node_t *constant_path = parse_expression(parser, PM_BINDING_POWER_INDEX, false, false, PM_ERR_CLASS_NAME, (uint16_t) (depth + 1)); pm_token_t name = parser->previous; if (name.type != PM_TOKEN_CONSTANT) { pm_parser_err_token(parser, &name, PM_ERR_CLASS_NAME); @@ -18988,7 +18986,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b parser->command_start = true; parser_lex(parser); - superclass = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_CLASS_SUPERCLASS, (uint16_t) (depth + 1)); + superclass = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, false, PM_ERR_CLASS_SUPERCLASS, (uint16_t) (depth + 1)); } else { inheritance_operator = not_provided(parser); superclass = NULL; @@ -19157,7 +19155,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b parser_lex(parser); pm_token_t lparen = parser->previous; - pm_node_t *expression = parse_value_expression(parser, PM_BINDING_POWER_STATEMENT, true, PM_ERR_DEF_RECEIVER, (uint16_t) (depth + 1)); + pm_node_t *expression = parse_value_expression(parser, PM_BINDING_POWER_STATEMENT, true, false, PM_ERR_DEF_RECEIVER, (uint16_t) (depth + 1)); accept1(parser, PM_TOKEN_NEWLINE); expect1(parser, PM_TOKEN_PARENTHESIS_RIGHT, PM_ERR_EXPECT_RPAREN); @@ -19244,13 +19242,13 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b pm_do_loop_stack_push(parser, false); statements = (pm_node_t *) pm_statements_node_create(parser); - pm_node_t *statement = parse_expression(parser, PM_BINDING_POWER_DEFINED + 1, binding_power < PM_BINDING_POWER_COMPOSITION, PM_ERR_DEF_ENDLESS, (uint16_t) (depth + 1)); + pm_node_t *statement = parse_expression(parser, PM_BINDING_POWER_DEFINED + 1, binding_power < PM_BINDING_POWER_COMPOSITION, false, PM_ERR_DEF_ENDLESS, (uint16_t) (depth + 1)); if (accept1(parser, PM_TOKEN_KEYWORD_RESCUE_MODIFIER)) { context_push(parser, PM_CONTEXT_RESCUE_MODIFIER); pm_token_t rescue_keyword = parser->previous; - pm_node_t *value = parse_expression(parser, binding_power, false, PM_ERR_RESCUE_MODIFIER_VALUE, (uint16_t) (depth + 1)); + pm_node_t *value = parse_expression(parser, binding_power, false, false, PM_ERR_RESCUE_MODIFIER_VALUE, (uint16_t) (depth + 1)); context_pop(parser); statement = (pm_node_t *) pm_rescue_modifier_node_create(parser, statement, &rescue_keyword, value); @@ -19335,7 +19333,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b if (accept1(parser, PM_TOKEN_PARENTHESIS_LEFT)) { lparen = parser->previous; - expression = parse_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_DEFINED_EXPRESSION, (uint16_t) (depth + 1)); + expression = parse_expression(parser, PM_BINDING_POWER_COMPOSITION, true, false, PM_ERR_DEFINED_EXPRESSION, (uint16_t) (depth + 1)); if (parser->recovering) { rparen = not_provided(parser); @@ -19347,7 +19345,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b } else { lparen = not_provided(parser); rparen = not_provided(parser); - expression = parse_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_DEFINED_EXPRESSION, (uint16_t) (depth + 1)); + expression = parse_expression(parser, PM_BINDING_POWER_DEFINED, false, false, PM_ERR_DEFINED_EXPRESSION, (uint16_t) (depth + 1)); } context_pop(parser); @@ -19396,12 +19394,12 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b pm_node_t *name = NULL; if (token_begins_expression_p(parser->current.type)) { - name = parse_expression(parser, PM_BINDING_POWER_INDEX, false, PM_ERR_EXPECT_EXPRESSION_AFTER_STAR, (uint16_t) (depth + 1)); + name = parse_expression(parser, PM_BINDING_POWER_INDEX, false, false, PM_ERR_EXPECT_EXPRESSION_AFTER_STAR, (uint16_t) (depth + 1)); } index = (pm_node_t *) pm_splat_node_create(parser, &star_operator, name); } else if (token_begins_expression_p(parser->current.type)) { - index = parse_expression(parser, PM_BINDING_POWER_INDEX, false, PM_ERR_EXPECT_EXPRESSION_AFTER_COMMA, (uint16_t) (depth + 1)); + index = parse_expression(parser, PM_BINDING_POWER_INDEX, false, false, PM_ERR_EXPECT_EXPRESSION_AFTER_COMMA, (uint16_t) (depth + 1)); } else { pm_parser_err_token(parser, &for_keyword, PM_ERR_FOR_INDEX); index = (pm_node_t *) pm_missing_node_create(parser, for_keyword.start, for_keyword.end); @@ -19420,7 +19418,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b expect1(parser, PM_TOKEN_KEYWORD_IN, PM_ERR_FOR_IN); pm_token_t in_keyword = parser->previous; - pm_node_t *collection = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_FOR_COLLECTION, (uint16_t) (depth + 1)); + pm_node_t *collection = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, false, PM_ERR_FOR_COLLECTION, (uint16_t) (depth + 1)); pm_do_loop_stack_pop(parser); pm_token_t do_keyword; @@ -19497,7 +19495,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b if (accept1(parser, PM_TOKEN_PARENTHESIS_RIGHT)) { arguments.closing_loc = PM_LOCATION_TOKEN_VALUE(&parser->previous); } else { - receiver = parse_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_NOT_EXPRESSION, (uint16_t) (depth + 1)); + receiver = parse_expression(parser, PM_BINDING_POWER_COMPOSITION, true, false, PM_ERR_NOT_EXPRESSION, (uint16_t) (depth + 1)); if (!parser->recovering) { accept1(parser, PM_TOKEN_NEWLINE); @@ -19506,7 +19504,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b } } } else { - receiver = parse_expression(parser, PM_BINDING_POWER_NOT, true, PM_ERR_NOT_EXPRESSION, (uint16_t) (depth + 1)); + receiver = parse_expression(parser, PM_BINDING_POWER_NOT, true, false, PM_ERR_NOT_EXPRESSION, (uint16_t) (depth + 1)); } return (pm_node_t *) pm_call_node_not_create(parser, receiver, &message, &arguments); @@ -19525,7 +19523,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b parser_lex(parser); pm_token_t module_keyword = parser->previous; - pm_node_t *constant_path = parse_expression(parser, PM_BINDING_POWER_INDEX, false, PM_ERR_MODULE_NAME, (uint16_t) (depth + 1)); + pm_node_t *constant_path = parse_expression(parser, PM_BINDING_POWER_INDEX, false, false, PM_ERR_MODULE_NAME, (uint16_t) (depth + 1)); pm_token_t name; // If we can recover from a syntax error that occurred while parsing @@ -19618,7 +19616,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b parser_lex(parser); pm_token_t keyword = parser->previous; - pm_node_t *predicate = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_CONDITIONAL_UNTIL_PREDICATE, (uint16_t) (depth + 1)); + pm_node_t *predicate = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, false, PM_ERR_CONDITIONAL_UNTIL_PREDICATE, (uint16_t) (depth + 1)); pm_do_loop_stack_pop(parser); context_pop(parser); @@ -19646,7 +19644,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b parser_lex(parser); pm_token_t keyword = parser->previous; - pm_node_t *predicate = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_CONDITIONAL_WHILE_PREDICATE, (uint16_t) (depth + 1)); + pm_node_t *predicate = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, false, PM_ERR_CONDITIONAL_WHILE_PREDICATE, (uint16_t) (depth + 1)); pm_do_loop_stack_pop(parser); context_pop(parser); @@ -20224,7 +20222,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b pm_node_t *name = NULL; if (token_begins_expression_p(parser->current.type)) { - name = parse_expression(parser, PM_BINDING_POWER_INDEX, false, PM_ERR_EXPECT_EXPRESSION_AFTER_STAR, (uint16_t) (depth + 1)); + name = parse_expression(parser, PM_BINDING_POWER_INDEX, false, false, PM_ERR_EXPECT_EXPRESSION_AFTER_STAR, (uint16_t) (depth + 1)); } pm_node_t *splat = (pm_node_t *) pm_splat_node_create(parser, &operator, name); @@ -20243,7 +20241,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b parser_lex(parser); pm_token_t operator = parser->previous; - pm_node_t *receiver = parse_expression(parser, pm_binding_powers[parser->previous.type].right, binding_power < PM_BINDING_POWER_MATCH, PM_ERR_UNARY_RECEIVER, (uint16_t) (depth + 1)); + pm_node_t *receiver = parse_expression(parser, pm_binding_powers[parser->previous.type].right, binding_power < PM_BINDING_POWER_MATCH, false, PM_ERR_UNARY_RECEIVER, (uint16_t) (depth + 1)); pm_call_node_t *node = pm_call_node_unary_create(parser, &operator, receiver, "!"); pm_conditional_predicate(parser, receiver, PM_CONDITIONAL_PREDICATE_TYPE_NOT); @@ -20256,7 +20254,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b parser_lex(parser); pm_token_t operator = parser->previous; - pm_node_t *receiver = parse_expression(parser, pm_binding_powers[parser->previous.type].right, false, PM_ERR_UNARY_RECEIVER, (uint16_t) (depth + 1)); + pm_node_t *receiver = parse_expression(parser, pm_binding_powers[parser->previous.type].right, false, false, PM_ERR_UNARY_RECEIVER, (uint16_t) (depth + 1)); pm_call_node_t *node = pm_call_node_unary_create(parser, &operator, receiver, "~"); return (pm_node_t *) node; @@ -20268,7 +20266,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b parser_lex(parser); pm_token_t operator = parser->previous; - pm_node_t *receiver = parse_expression(parser, pm_binding_powers[parser->previous.type].right, false, PM_ERR_UNARY_RECEIVER, (uint16_t) (depth + 1)); + pm_node_t *receiver = parse_expression(parser, pm_binding_powers[parser->previous.type].right, false, false, PM_ERR_UNARY_RECEIVER, (uint16_t) (depth + 1)); pm_call_node_t *node = pm_call_node_unary_create(parser, &operator, receiver, "-@"); return (pm_node_t *) node; @@ -20277,11 +20275,11 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b parser_lex(parser); pm_token_t operator = parser->previous; - pm_node_t *node = parse_expression(parser, pm_binding_powers[parser->previous.type].right, false, PM_ERR_UNARY_RECEIVER, (uint16_t) (depth + 1)); + pm_node_t *node = parse_expression(parser, pm_binding_powers[parser->previous.type].right, false, false, PM_ERR_UNARY_RECEIVER, (uint16_t) (depth + 1)); if (accept1(parser, PM_TOKEN_STAR_STAR)) { pm_token_t exponent_operator = parser->previous; - pm_node_t *exponent = parse_expression(parser, pm_binding_powers[exponent_operator.type].right, false, PM_ERR_EXPECT_ARGUMENT, (uint16_t) (depth + 1)); + pm_node_t *exponent = parse_expression(parser, pm_binding_powers[exponent_operator.type].right, false, false, PM_ERR_EXPECT_ARGUMENT, (uint16_t) (depth + 1)); node = (pm_node_t *) pm_call_node_binary_create(parser, node, &exponent_operator, exponent, 0); node = (pm_node_t *) pm_call_node_unary_create(parser, &operator, node, "-@"); } else { @@ -20392,13 +20390,13 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b parser_lex(parser); pm_token_t operator = parser->previous; - pm_node_t *receiver = parse_expression(parser, pm_binding_powers[parser->previous.type].right, false, PM_ERR_UNARY_RECEIVER, (uint16_t) (depth + 1)); + pm_node_t *receiver = parse_expression(parser, pm_binding_powers[parser->previous.type].right, false, false, PM_ERR_UNARY_RECEIVER, (uint16_t) (depth + 1)); pm_call_node_t *node = pm_call_node_unary_create(parser, &operator, receiver, "+@"); return (pm_node_t *) node; } case PM_TOKEN_STRING_BEGIN: - return parse_strings(parser, NULL, (uint16_t) (depth + 1)); + return parse_strings(parser, NULL, accepts_label, (uint16_t) (depth + 1)); case PM_TOKEN_SYMBOL_BEGIN: { pm_lex_mode_t lex_mode = *parser->lex_modes.current; parser_lex(parser); @@ -20447,7 +20445,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b */ static pm_node_t * parse_assignment_value(pm_parser_t *parser, pm_binding_power_t previous_binding_power, pm_binding_power_t binding_power, bool accepts_command_call, pm_diagnostic_id_t diag_id, uint16_t depth) { - pm_node_t *value = parse_value_expression(parser, binding_power, previous_binding_power == PM_BINDING_POWER_ASSIGNMENT ? accepts_command_call : previous_binding_power < PM_BINDING_POWER_MATCH, diag_id, (uint16_t) (depth + 1)); + pm_node_t *value = parse_value_expression(parser, binding_power, previous_binding_power == PM_BINDING_POWER_ASSIGNMENT ? accepts_command_call : previous_binding_power < PM_BINDING_POWER_MATCH, false, diag_id, (uint16_t) (depth + 1)); // Contradicting binding powers, the right-hand-side value of the assignment // allows the `rescue` modifier. @@ -20457,7 +20455,7 @@ parse_assignment_value(pm_parser_t *parser, pm_binding_power_t previous_binding_ pm_token_t rescue = parser->current; parser_lex(parser); - pm_node_t *right = parse_expression(parser, binding_power, false, PM_ERR_RESCUE_MODIFIER_VALUE, (uint16_t) (depth + 1)); + pm_node_t *right = parse_expression(parser, binding_power, false, false, PM_ERR_RESCUE_MODIFIER_VALUE, (uint16_t) (depth + 1)); context_pop(parser); return (pm_node_t *) pm_rescue_modifier_node_create(parser, value, &rescue, right); @@ -20563,7 +20561,7 @@ parse_assignment_values(pm_parser_t *parser, pm_binding_power_t previous_binding } } - pm_node_t *right = parse_expression(parser, binding_power, accepts_command_call_inner, PM_ERR_RESCUE_MODIFIER_VALUE, (uint16_t) (depth + 1)); + pm_node_t *right = parse_expression(parser, binding_power, accepts_command_call_inner, false, PM_ERR_RESCUE_MODIFIER_VALUE, (uint16_t) (depth + 1)); context_pop(parser); return (pm_node_t *) pm_rescue_modifier_node_create(parser, value, &rescue, right); @@ -21138,14 +21136,14 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t case PM_TOKEN_KEYWORD_AND: { parser_lex(parser); - pm_node_t *right = parse_expression(parser, binding_power, parser->previous.type == PM_TOKEN_KEYWORD_AND, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1)); + pm_node_t *right = parse_expression(parser, binding_power, parser->previous.type == PM_TOKEN_KEYWORD_AND, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1)); return (pm_node_t *) pm_and_node_create(parser, node, &token, right); } case PM_TOKEN_KEYWORD_OR: case PM_TOKEN_PIPE_PIPE: { parser_lex(parser); - pm_node_t *right = parse_expression(parser, binding_power, parser->previous.type == PM_TOKEN_KEYWORD_OR, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1)); + pm_node_t *right = parse_expression(parser, binding_power, parser->previous.type == PM_TOKEN_KEYWORD_OR, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1)); return (pm_node_t *) pm_or_node_create(parser, node, &token, right); } case PM_TOKEN_EQUAL_TILDE: { @@ -21157,7 +21155,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t // // In this case, `foo` should be a method call and not a local yet. parser_lex(parser); - pm_node_t *argument = parse_expression(parser, binding_power, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1)); + pm_node_t *argument = parse_expression(parser, binding_power, false, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1)); // By default, we're going to create a call node and then return it. pm_call_node_t *call = pm_call_node_binary_create(parser, node, &token, argument, 0); @@ -21236,7 +21234,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t case PM_TOKEN_STAR: case PM_TOKEN_STAR_STAR: { parser_lex(parser); - pm_node_t *argument = parse_expression(parser, binding_power, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1)); + pm_node_t *argument = parse_expression(parser, binding_power, false, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1)); return (pm_node_t *) pm_call_node_binary_create(parser, node, &token, argument, 0); } case PM_TOKEN_GREATER: @@ -21248,7 +21246,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t } parser_lex(parser); - pm_node_t *argument = parse_expression(parser, binding_power, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1)); + pm_node_t *argument = parse_expression(parser, binding_power, false, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1)); return (pm_node_t *) pm_call_node_binary_create(parser, node, &token, argument, PM_CALL_NODE_FLAGS_COMPARISON); } case PM_TOKEN_AMPERSAND_DOT: @@ -21301,7 +21299,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t pm_node_t *right = NULL; if (token_begins_expression_p(parser->current.type)) { - right = parse_expression(parser, binding_power, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1)); + right = parse_expression(parser, binding_power, false, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1)); } return (pm_node_t *) pm_range_node_create(parser, node, &token, right); @@ -21310,14 +21308,14 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t pm_token_t keyword = parser->current; parser_lex(parser); - pm_node_t *predicate = parse_value_expression(parser, binding_power, true, PM_ERR_CONDITIONAL_IF_PREDICATE, (uint16_t) (depth + 1)); + pm_node_t *predicate = parse_value_expression(parser, binding_power, true, false, PM_ERR_CONDITIONAL_IF_PREDICATE, (uint16_t) (depth + 1)); return (pm_node_t *) pm_if_node_modifier_create(parser, node, &keyword, predicate); } case PM_TOKEN_KEYWORD_UNLESS_MODIFIER: { pm_token_t keyword = parser->current; parser_lex(parser); - pm_node_t *predicate = parse_value_expression(parser, binding_power, true, PM_ERR_CONDITIONAL_UNLESS_PREDICATE, (uint16_t) (depth + 1)); + pm_node_t *predicate = parse_value_expression(parser, binding_power, true, false, PM_ERR_CONDITIONAL_UNLESS_PREDICATE, (uint16_t) (depth + 1)); return (pm_node_t *) pm_unless_node_modifier_create(parser, node, &keyword, predicate); } case PM_TOKEN_KEYWORD_UNTIL_MODIFIER: { @@ -21325,7 +21323,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t pm_statements_node_t *statements = pm_statements_node_create(parser); pm_statements_node_body_append(parser, statements, node, true); - pm_node_t *predicate = parse_value_expression(parser, binding_power, true, PM_ERR_CONDITIONAL_UNTIL_PREDICATE, (uint16_t) (depth + 1)); + pm_node_t *predicate = parse_value_expression(parser, binding_power, true, false, PM_ERR_CONDITIONAL_UNTIL_PREDICATE, (uint16_t) (depth + 1)); return (pm_node_t *) pm_until_node_modifier_create(parser, &token, predicate, statements, PM_NODE_TYPE_P(node, PM_BEGIN_NODE) ? PM_LOOP_FLAGS_BEGIN_MODIFIER : 0); } case PM_TOKEN_KEYWORD_WHILE_MODIFIER: { @@ -21333,7 +21331,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t pm_statements_node_t *statements = pm_statements_node_create(parser); pm_statements_node_body_append(parser, statements, node, true); - pm_node_t *predicate = parse_value_expression(parser, binding_power, true, PM_ERR_CONDITIONAL_WHILE_PREDICATE, (uint16_t) (depth + 1)); + pm_node_t *predicate = parse_value_expression(parser, binding_power, true, false, PM_ERR_CONDITIONAL_WHILE_PREDICATE, (uint16_t) (depth + 1)); return (pm_node_t *) pm_while_node_modifier_create(parser, &token, predicate, statements, PM_NODE_TYPE_P(node, PM_BEGIN_NODE) ? PM_LOOP_FLAGS_BEGIN_MODIFIER : 0); } case PM_TOKEN_QUESTION_MARK: { @@ -21344,7 +21342,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t pm_token_t qmark = parser->current; parser_lex(parser); - pm_node_t *true_expression = parse_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_TERNARY_EXPRESSION_TRUE, (uint16_t) (depth + 1)); + pm_node_t *true_expression = parse_expression(parser, PM_BINDING_POWER_DEFINED, false, false, PM_ERR_TERNARY_EXPRESSION_TRUE, (uint16_t) (depth + 1)); if (parser->recovering) { // If parsing the true expression of this ternary resulted in a syntax @@ -21367,7 +21365,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t expect1(parser, PM_TOKEN_COLON, PM_ERR_TERNARY_COLON); pm_token_t colon = parser->previous; - pm_node_t *false_expression = parse_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_TERNARY_EXPRESSION_FALSE, (uint16_t) (depth + 1)); + pm_node_t *false_expression = parse_expression(parser, PM_BINDING_POWER_DEFINED, false, false, PM_ERR_TERNARY_EXPRESSION_FALSE, (uint16_t) (depth + 1)); context_pop(parser); pop_block_exits(parser, previous_block_exits); @@ -21450,7 +21448,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t parser_lex(parser); accept1(parser, PM_TOKEN_NEWLINE); - pm_node_t *value = parse_expression(parser, binding_power, true, PM_ERR_RESCUE_MODIFIER_VALUE, (uint16_t) (depth + 1)); + pm_node_t *value = parse_expression(parser, binding_power, true, false, PM_ERR_RESCUE_MODIFIER_VALUE, (uint16_t) (depth + 1)); context_pop(parser); return (pm_node_t *) pm_rescue_modifier_node_create(parser, node, &token, value); @@ -21555,13 +21553,13 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t * determine if they need to perform additional cleanup. */ static pm_node_t * -parse_expression(pm_parser_t *parser, pm_binding_power_t binding_power, bool accepts_command_call, pm_diagnostic_id_t diag_id, uint16_t depth) { +parse_expression(pm_parser_t *parser, pm_binding_power_t binding_power, bool accepts_command_call, bool accepts_label, pm_diagnostic_id_t diag_id, uint16_t depth) { if (PRISM_UNLIKELY(depth >= PRISM_DEPTH_MAXIMUM)) { pm_parser_err_current(parser, PM_ERR_NESTING_TOO_DEEP); return (pm_node_t *) pm_missing_node_create(parser, parser->current.start, parser->current.end); } - pm_node_t *node = parse_expression_prefix(parser, binding_power, accepts_command_call, diag_id, depth); + pm_node_t *node = parse_expression_prefix(parser, binding_power, accepts_command_call, accepts_label, diag_id, depth); switch (PM_NODE_TYPE(node)) { case PM_MISSING_NODE: diff --git a/prism/templates/src/diagnostic.c.erb b/prism/templates/src/diagnostic.c.erb index 1ff207c5ffda2b..ff4e28a99b78a5 100644 --- a/prism/templates/src/diagnostic.c.erb +++ b/prism/templates/src/diagnostic.c.erb @@ -347,12 +347,13 @@ static const pm_diagnostic_data_t diagnostic_messages[PM_DIAGNOSTIC_ID_MAX] = { [PM_ERR_TERNARY_COLON] = { "expected a `:` after the true expression of a ternary operator", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_TERNARY_EXPRESSION_FALSE] = { "expected an expression after `:` in the ternary operator", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_TERNARY_EXPRESSION_TRUE] = { "expected an expression after `?` in the ternary operator", PM_ERROR_LEVEL_SYNTAX }, - [PM_ERR_UNDEF_ARGUMENT] = { "invalid argument being passed to `undef`; expected a bare word, constant, or symbol argument", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_UNARY_RECEIVER] = { "unexpected %s, expected a receiver for unary `%c`", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_UNARY_DISALLOWED] = { "unexpected %s; unary calls are not allowed in this context", PM_ERROR_LEVEL_SYNTAX }, + [PM_ERR_UNDEF_ARGUMENT] = { "invalid argument being passed to `undef`; expected a bare word, constant, or symbol argument", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_UNEXPECTED_BLOCK_ARGUMENT] = { "block argument should not be given", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_UNEXPECTED_INDEX_BLOCK] = { "unexpected block arg given in index assignment; blocks are not allowed in index assignment expressions", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_UNEXPECTED_INDEX_KEYWORDS] = { "unexpected keyword arg given in index assignment; keywords are not allowed in index assignment expressions", PM_ERROR_LEVEL_SYNTAX }, + [PM_ERR_UNEXPECTED_LABEL] = { "unexpected label", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_UNEXPECTED_MULTI_WRITE] = { "unexpected multiple assignment; multiple assignment is not allowed in this context", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_UNEXPECTED_RANGE_OPERATOR] = { "unexpected range operator; .. and ... are non-associative and cannot be chained", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_UNEXPECTED_SAFE_NAVIGATION] = { "&. inside multiple assignment destination", PM_ERROR_LEVEL_SYNTAX }, diff --git a/test/prism/errors/label_in_parentheses.txt b/test/prism/errors/label_in_parentheses.txt new file mode 100644 index 00000000000000..4f6e3e9e36ddf2 --- /dev/null +++ b/test/prism/errors/label_in_parentheses.txt @@ -0,0 +1,3 @@ +("a":) + ^~~~ unexpected label + diff --git a/test/prism/errors/symbol_in_hash.txt b/test/prism/errors/symbol_in_hash.txt index 148040aa61070c..9e687583e5badc 100644 --- a/test/prism/errors/symbol_in_hash.txt +++ b/test/prism/errors/symbol_in_hash.txt @@ -1,3 +1,3 @@ {x:'y':} - ^~ unexpected label terminator, expected a string literal terminator + ^~~~ unexpected label diff --git a/test/prism/errors/symbol_in_keyword_parameter.txt b/test/prism/errors/symbol_in_keyword_parameter.txt index 22d03cccb212d7..9df43d8c5a6e3b 100644 --- a/test/prism/errors/symbol_in_keyword_parameter.txt +++ b/test/prism/errors/symbol_in_keyword_parameter.txt @@ -1,3 +1,3 @@ def foo(x:'y':); end - ^~ unexpected label terminator, expected a string literal terminator + ^~~~ unexpected label From 12cf9f2ae57f84278cbee8bc20d2af697efc66f1 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Wed, 25 Sep 2024 14:16:58 -0400 Subject: [PATCH 456/829] [ruby/prism] Fix up void value expression checking for rescue https://github.com/ruby/prism/commit/509ff88e92 --- prism/prism.c | 47 +++++++++++++------ ...id_value_expression_in_begin_statement.txt | 2 +- 2 files changed, 34 insertions(+), 15 deletions(-) diff --git a/prism/prism.c b/prism/prism.c index 6732e9ef2b2fa1..443a15a11ca427 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -1034,7 +1034,7 @@ pm_parser_optional_constant_id_token(pm_parser_t *parser, const pm_token_t *toke */ static pm_node_t * pm_check_value_expression(pm_parser_t *parser, pm_node_t *node) { - pm_node_t* void_node = NULL; + pm_node_t *void_node = NULL; while (node != NULL) { switch (PM_NODE_TYPE(node)) { @@ -1050,24 +1050,43 @@ pm_check_value_expression(pm_parser_t *parser, pm_node_t *node) { case PM_BEGIN_NODE: { pm_begin_node_t *cast = (pm_begin_node_t *) node; - if (cast->statements == NULL && cast->ensure_clause != NULL) { - node = (pm_node_t *) cast->ensure_clause; - } - else { + if (cast->ensure_clause != NULL) { if (cast->rescue_clause != NULL) { - if (cast->rescue_clause->statements == NULL) { - return NULL; - } - else if (cast->else_clause != NULL) { - node = (pm_node_t *) cast->else_clause; + pm_node_t *vn = pm_check_value_expression(parser, (pm_node_t *) cast->rescue_clause); + if (vn != NULL) return vn; + } + + if (cast->statements != NULL) { + pm_node_t *vn = pm_check_value_expression(parser, (pm_node_t *) cast->statements); + if (vn != NULL) return vn; + } + + node = (pm_node_t *) cast->ensure_clause; + } else if (cast->rescue_clause != NULL) { + if (cast->statements == NULL) return NULL; + + pm_node_t *vn = pm_check_value_expression(parser, (pm_node_t *) cast->statements); + if (vn == NULL) return NULL; + if (void_node == NULL) void_node = vn; + + for (pm_rescue_node_t *rescue_clause = cast->rescue_clause; rescue_clause != NULL; rescue_clause = rescue_clause->subsequent) { + pm_node_t *vn = pm_check_value_expression(parser, (pm_node_t *) rescue_clause->statements); + if (vn == NULL) { + void_node = NULL; + break; } - else { - node = (pm_node_t *) cast->statements; + if (void_node == NULL) { + void_node = vn; } } - else { - node = (pm_node_t *) cast->statements; + + if (cast->else_clause != NULL) { + node = (pm_node_t *) cast->else_clause; + } else { + return void_node; } + } else { + node = (pm_node_t *) cast->statements; } break; diff --git a/test/prism/errors/void_value_expression_in_begin_statement.txt b/test/prism/errors/void_value_expression_in_begin_statement.txt index 4ad40b684dc22f..aa8f1ded964c66 100644 --- a/test/prism/errors/void_value_expression_in_begin_statement.txt +++ b/test/prism/errors/void_value_expression_in_begin_statement.txt @@ -15,7 +15,7 @@ x = begin return ensure return end x = begin return; rescue; return end ^~~~~~ unexpected void value expression x = begin return; rescue; return; else return end - ^~~~~~ unexpected void value expression + ^~~~~~ unexpected void value expression x = begin; return; rescue; retry; end ^~~~~~ unexpected void value expression From b97ff7dfdae59e688609c008a459cf264362490f Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Wed, 25 Sep 2024 14:23:29 -0400 Subject: [PATCH 457/829] [ruby/prism] Fix up lex difference when ~ heredoc with 0 dedent and line continuation https://github.com/ruby/prism/commit/84a9251915 --- lib/prism/lex_compat.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/prism/lex_compat.rb b/lib/prism/lex_compat.rb index 4f8e443a3ba755..a83c24cb416df3 100644 --- a/lib/prism/lex_compat.rb +++ b/lib/prism/lex_compat.rb @@ -481,7 +481,7 @@ def to_a embexpr_balance -= 1 when :on_tstring_content if embexpr_balance == 0 - while index < max_index && tokens[index].event == :on_tstring_content + while index < max_index && tokens[index].event == :on_tstring_content && !token.value.match?(/\\\r?\n\z/) token.value << tokens[index].value index += 1 end From 8bf55328da72b1512b41496e6085a607b04a0d05 Mon Sep 17 00:00:00 2001 From: Burdette Lamar Date: Wed, 25 Sep 2024 13:42:40 -0500 Subject: [PATCH 458/829] [DOC] Tweaks for Array#find_index (#11686) --- array.c | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/array.c b/array.c index f81978f15c8f6b..dd3f99064f7b68 100644 --- a/array.c +++ b/array.c @@ -2063,13 +2063,16 @@ rb_ary_fetch(int argc, VALUE *argv, VALUE ary) /* * call-seq: - * array.index(object) -> integer or nil - * array.index {|element| ... } -> integer or nil - * array.index -> new_enumerator + * find_index(object) -> integer or nil + * find_index {|element| ... } -> integer or nil + * find_index -> new_enumerator + * index(object) -> integer or nil + * index {|element| ... } -> integer or nil + * index -> new_enumerator * - * Returns the index of a specified element. + * Returns the zero-based integer index of a specified element, or +nil+. * - * When argument +object+ is given but no block, + * With only argument +object+ given, * returns the index of the first element +element+ * for which object == element: * @@ -2078,7 +2081,7 @@ rb_ary_fetch(int argc, VALUE *argv, VALUE ary) * * Returns +nil+ if no such element found. * - * When both argument +object+ and a block are given, + * With only a block given, * calls the block with each successive element; * returns the index of the first element for which the block returns a truthy value: * @@ -2087,14 +2090,9 @@ rb_ary_fetch(int argc, VALUE *argv, VALUE ary) * * Returns +nil+ if the block never returns a truthy value. * - * When neither an argument nor a block is given, returns a new Enumerator: - * - * a = [:foo, 'bar', 2] - * e = a.index - * e # => # - * e.each {|element| element == 'bar' } # => 1 + * With neither an argument nor a block given, returns a new Enumerator. * - * Related: #rindex. + * Related: see {Methods for Querying}[rdoc-ref:Array@Methods+for+Querying]. */ static VALUE From be331c0eeb5bbc39aa9fe28c8f26357f454e2e2c Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Wed, 25 Sep 2024 15:06:09 -0400 Subject: [PATCH 459/829] [ruby/prism] Fix up more error messages to more closely match parse.y https://github.com/ruby/prism/commit/988ac82187 --- prism/prism.c | 13 ++++++++++--- prism/templates/src/diagnostic.c.erb | 4 ++-- test/prism/errors/break_1.txt | 2 +- test/prism/errors/next_1.txt | 2 +- test/prism/errors/return_1.txt | 2 +- test/prism/errors/trailing_comma_in_calls.txt | 2 +- 6 files changed, 16 insertions(+), 9 deletions(-) diff --git a/prism/prism.c b/prism/prism.c index 443a15a11ca427..6e3f9bce597d2d 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -15421,7 +15421,7 @@ parse_arguments_list(pm_parser_t *parser, pm_arguments_t *arguments, bool accept // then we have a trailing comma where we need to check whether it is // allowed or not. if (parser->previous.type == PM_TOKEN_COMMA && !match1(parser, PM_TOKEN_SEMICOLON)) { - pm_parser_err_previous(parser, PM_ERR_EXPECT_ARGUMENT); + PM_PARSER_ERR_TOKEN_FORMAT(parser, parser->previous, PM_ERR_EXPECT_ARGUMENT, pm_token_type_human(parser->current.type)); } pm_accepts_block_stack_pop(parser); @@ -17649,7 +17649,8 @@ pm_parser_err_prefix(pm_parser_t *parser, pm_diagnostic_id_t diag_id) { PM_PARSER_ERR_TOKEN_FORMAT(parser, parser->previous, diag_id, human, parser->previous.start[0]); break; } - case PM_ERR_UNARY_DISALLOWED: { + case PM_ERR_UNARY_DISALLOWED: + case PM_ERR_EXPECT_ARGUMENT: { PM_PARSER_ERR_TOKEN_FORMAT(parser, parser->current, diag_id, pm_token_type_human(parser->current.type)); break; } @@ -17999,7 +18000,13 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b } accept1(parser, PM_TOKEN_NEWLINE); - expect1(parser, PM_TOKEN_BRACKET_RIGHT, PM_ERR_ARRAY_TERM); + + if (!accept1(parser, PM_TOKEN_BRACKET_RIGHT)) { + PM_PARSER_ERR_TOKEN_FORMAT(parser, parser->current, PM_ERR_ARRAY_TERM, pm_token_type_human(parser->current.type)); + parser->previous.start = parser->previous.end; + parser->previous.type = PM_TOKEN_MISSING; + } + pm_array_node_close_set(array, &parser->previous); pm_accepts_block_stack_pop(parser); diff --git a/prism/templates/src/diagnostic.c.erb b/prism/templates/src/diagnostic.c.erb index ff4e28a99b78a5..d3b9cd516d8b57 100644 --- a/prism/templates/src/diagnostic.c.erb +++ b/prism/templates/src/diagnostic.c.erb @@ -113,7 +113,7 @@ static const pm_diagnostic_data_t diagnostic_messages[PM_DIAGNOSTIC_ID_MAX] = { [PM_ERR_ARRAY_EXPRESSION] = { "expected an expression for the array element", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_ARRAY_EXPRESSION_AFTER_STAR] = { "expected an expression after `*` in the array", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_ARRAY_SEPARATOR] = { "unexpected %s; expected a `,` separator for the array elements", PM_ERROR_LEVEL_SYNTAX }, - [PM_ERR_ARRAY_TERM] = { "expected a `]` to close the array", PM_ERROR_LEVEL_SYNTAX }, + [PM_ERR_ARRAY_TERM] = { "unexpected %s; expected a `]` to close the array", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_BEGIN_LONELY_ELSE] = { "unexpected `else` in `begin` block; else without rescue is useless", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_BEGIN_TERM] = { "expected an `end` to close the `begin` statement", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_BEGIN_UPCASE_BRACE] = { "expected a `{` after `BEGIN`", PM_ERROR_LEVEL_SYNTAX }, @@ -170,7 +170,7 @@ static const pm_diagnostic_data_t diagnostic_messages[PM_DIAGNOSTIC_ID_MAX] = { [PM_ERR_ESCAPE_INVALID_UNICODE_LONG] = { "invalid Unicode escape sequence; maximum length is 6 digits", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_ESCAPE_INVALID_UNICODE_SHORT] = { "too short escape sequence: %.*s", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_ESCAPE_INVALID_UNICODE_TERM] = { "unterminated Unicode escape", PM_ERROR_LEVEL_SYNTAX }, - [PM_ERR_EXPECT_ARGUMENT] = { "expected an argument", PM_ERROR_LEVEL_SYNTAX }, + [PM_ERR_EXPECT_ARGUMENT] = { "unexpected %s; expected an argument", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_EXPECT_EOL_AFTER_STATEMENT] = { "unexpected %s, expecting end-of-input", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_EXPECT_EXPRESSION_AFTER_AMPAMPEQ] = { "expected an expression after `&&=`", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_EXPECT_EXPRESSION_AFTER_PIPEPIPEEQ] = { "expected an expression after `||=`", PM_ERROR_LEVEL_SYNTAX }, diff --git a/test/prism/errors/break_1.txt b/test/prism/errors/break_1.txt index e7b26ad3a01ee9..5d74e7bde0f1af 100644 --- a/test/prism/errors/break_1.txt +++ b/test/prism/errors/break_1.txt @@ -1,4 +1,4 @@ break 1,; - ^ expected an argument + ^ unexpected ';'; expected an argument ^~~~~~~~ Invalid break diff --git a/test/prism/errors/next_1.txt b/test/prism/errors/next_1.txt index b56b7f6ae634b3..83ce038ebbde36 100644 --- a/test/prism/errors/next_1.txt +++ b/test/prism/errors/next_1.txt @@ -1,4 +1,4 @@ next 1,; - ^ expected an argument + ^ unexpected ';'; expected an argument ^~~~~~~ Invalid next diff --git a/test/prism/errors/return_1.txt b/test/prism/errors/return_1.txt index b4ce8f1f2a66bd..ca3c3494d23a01 100644 --- a/test/prism/errors/return_1.txt +++ b/test/prism/errors/return_1.txt @@ -1,3 +1,3 @@ return 1,; - ^ expected an argument + ^ unexpected ';'; expected an argument diff --git a/test/prism/errors/trailing_comma_in_calls.txt b/test/prism/errors/trailing_comma_in_calls.txt index 44e8a1f0b3bf72..966d911087f408 100644 --- a/test/prism/errors/trailing_comma_in_calls.txt +++ b/test/prism/errors/trailing_comma_in_calls.txt @@ -1,3 +1,3 @@ foo 1, - ^ expected an argument + ^ unexpected end-of-input; expected an argument From fa7fef270df8b406970711ea5bddcb2e8e85001e Mon Sep 17 00:00:00 2001 From: Alexander Momchilov Date: Fri, 30 Aug 2024 15:31:39 -0400 Subject: [PATCH 460/829] [ruby/prism] Fix rendering of type overview docs https://github.com/ruby/prism/commit/d42bc309cc --- prism/templates/include/prism/ast.h.erb | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/prism/templates/include/prism/ast.h.erb b/prism/templates/include/prism/ast.h.erb index 7cce34f54e361e..b63ce31fb57a09 100644 --- a/prism/templates/include/prism/ast.h.erb +++ b/prism/templates/include/prism/ast.h.erb @@ -157,11 +157,11 @@ typedef struct pm_node { *<%= line %> <%- end -%> * - * Type: <%= node.type %> -<%- if (node_flags = node.flags) -%> - * Flags: + * Type: ::<%= node.type %> +<% if (node_flags = node.flags) %> + * Applicable flags (#pm_<%= node_flags.human %>): <%- node_flags.values.each do |value| -%> - * PM_<%= node_flags.human.upcase %>_<%= value.name %> + * * ::PM_<%= node_flags.human.upcase %>_<%= value.name %> <%- end -%> <%- end -%> * @@ -170,6 +170,7 @@ typedef struct pm_node { typedef struct pm_<%= node.human %> { /** The embedded base node. */ pm_node_t base; + <%- node.fields.each do |field| -%> /** From cab81d1bbaa459f686b9da76cbe9822caadc6393 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Wed, 25 Sep 2024 15:37:38 -0400 Subject: [PATCH 461/829] [ruby/prism] Update templates/include/prism/ast.h.erb https://github.com/ruby/prism/commit/dc7164e21c --- prism/templates/include/prism/ast.h.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prism/templates/include/prism/ast.h.erb b/prism/templates/include/prism/ast.h.erb index b63ce31fb57a09..751c0b43c2cb09 100644 --- a/prism/templates/include/prism/ast.h.erb +++ b/prism/templates/include/prism/ast.h.erb @@ -159,7 +159,7 @@ typedef struct pm_node { * * Type: ::<%= node.type %> <% if (node_flags = node.flags) %> - * Applicable flags (#pm_<%= node_flags.human %>): + * Flags (#pm_<%= node_flags.human %>): <%- node_flags.values.each do |value| -%> * * ::PM_<%= node_flags.human.upcase %>_<%= value.name %> <%- end -%> From 80e483afac93cf148080c9f7409aaa4fe5e32d9a Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Thu, 26 Sep 2024 04:07:14 +0900 Subject: [PATCH 462/829] Fold rules [ci skip] --- parse.y | 112 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 59 insertions(+), 53 deletions(-) diff --git a/parse.y b/parse.y index fb0139a8b9fb28..60fce58699b963 100644 --- a/parse.y +++ b/parse.y @@ -2916,63 +2916,69 @@ rb_parser_ary_free(rb_parser_t *p, rb_parser_ary_t *ary) /* * inlining rules */ -%rule %inline ident_or_const: tIDENTIFIER - | tCONSTANT - ; +%rule %inline ident_or_const + : tIDENTIFIER + | tCONSTANT + ; /* * parameterizing rules */ -%rule f_opt(value) : f_arg_asgn f_eq value - { - p->ctxt.in_argdef = 1; - $$ = NEW_OPT_ARG(assignable(p, $1, $3, &@$), &@$); - /*% ripper: [$:$, $:3] %*/ - } - ; - -%rule f_optarg(value) : f_opt(value) - { - $$ = $1; - /*% ripper: rb_ary_new3(1, $:1) %*/ - } - | f_optarg(value) ',' f_opt(value) - { - $$ = opt_arg_append($1, $3); - /*% ripper: rb_ary_push($:1, $:3) %*/ - } - ; - -%rule f_kwarg(kw) : kw - { - $$ = $1; - /*% ripper: rb_ary_new3(1, $:1) %*/ - } - | f_kwarg(kw) ',' kw - { - $$ = kwd_append($1, $3); - /*% ripper: rb_ary_push($:1, $:3) %*/ - } - ; - -%rule opt_args_tail(tail) : ',' tail - { - $$ = $2; - /*% ripper: $:2 %*/ - } - | /* none */ - { - $$ = new_args_tail(p, 0, 0, 0, &@0); - /*% ripper: [Qnil, Qnil, Qnil] %*/ - } - ; - -%rule words(begin, word_list): begin ' '+ word_list tSTRING_END - { - $$ = make_list($3, &@$); - /*% ripper: array!($:3) %*/ - } - ; +%rule f_opt(value) + : f_arg_asgn f_eq value + { + p->ctxt.in_argdef = 1; + $$ = NEW_OPT_ARG(assignable(p, $1, $3, &@$), &@$); + /*% ripper: [$:$, $:3] %*/ + } + ; + +%rule f_optarg(value) + : f_opt(value) + { + $$ = $1; + /*% ripper: rb_ary_new3(1, $:1) %*/ + } + | f_optarg(value) ',' f_opt(value) + { + $$ = opt_arg_append($1, $3); + /*% ripper: rb_ary_push($:1, $:3) %*/ + } + ; + +%rule f_kwarg(kw) + : kw + { + $$ = $1; + /*% ripper: rb_ary_new3(1, $:1) %*/ + } + | f_kwarg(kw) ',' kw + { + $$ = kwd_append($1, $3); + /*% ripper: rb_ary_push($:1, $:3) %*/ + } + ; + +%rule opt_args_tail(tail) + : ',' tail + { + $$ = $2; + /*% ripper: $:2 %*/ + } + | /* none */ + { + $$ = new_args_tail(p, 0, 0, 0, &@0); + /*% ripper: [Qnil, Qnil, Qnil] %*/ + } + ; + +%rule words(begin, word_list) + : begin ' '+ word_list tSTRING_END + { + $$ = make_list($3, &@$); + /*% ripper: array!($:3) %*/ + } + ; %% program : { From 8350b48cfa7d344d9e2dc9748c26607c1b89d7df Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Thu, 26 Sep 2024 10:32:30 +0900 Subject: [PATCH 463/829] Import patches for old macOS from MacPorts --- .gdbinit | 5 +++-- file.c | 14 +++++++++++++- io.c | 10 ++++++++++ signal.c | 3 ++- vm_dump.c | 6 ++++-- 5 files changed, 32 insertions(+), 6 deletions(-) diff --git a/.gdbinit b/.gdbinit index 1b5b6cb5621ff5..911624d8c9b737 100644 --- a/.gdbinit +++ b/.gdbinit @@ -1,5 +1,3 @@ -set startup-with-shell off - define hook-run set $color_type = 0 set $color_highlite = 0 @@ -1345,3 +1343,6 @@ define print_flags end source -s misc/gdb.py + +# Moved from beginning, since it fails on older gdbs +set startup-with-shell off diff --git a/file.c b/file.c index 9b89f36fbef2f8..64fc470c1c4878 100644 --- a/file.c +++ b/file.c @@ -4533,6 +4533,11 @@ rb_check_realpath_emulate_rescue(VALUE arg, VALUE exc) { return Qnil; } +#elif !defined(NEEDS_REALPATH_BUFFER) && defined(__APPLE__) && \ + (!defined(MAC_OS_X_VERSION_10_6) || (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_6)) +/* realpath() on OSX < 10.6 doesn't implement automatic allocation */ +# include +# define NEEDS_REALPATH_BUFFER 1 #endif /* HAVE_REALPATH */ static VALUE @@ -4542,6 +4547,11 @@ rb_check_realpath_internal(VALUE basedir, VALUE path, rb_encoding *origenc, enum VALUE unresolved_path; char *resolved_ptr = NULL; VALUE resolved; +# if defined(NEEDS_REALPATH_BUFFER) && NEEDS_REALPATH_BUFFER + char resolved_buffer[PATH_MAX]; +# else + char *const resolved_buffer = NULL; +# endif if (mode == RB_REALPATH_DIR) { return rb_check_realpath_emulate(basedir, path, origenc, mode); @@ -4553,7 +4563,7 @@ rb_check_realpath_internal(VALUE basedir, VALUE path, rb_encoding *origenc, enum } if (origenc) unresolved_path = TO_OSPATH(unresolved_path); - if ((resolved_ptr = realpath(RSTRING_PTR(unresolved_path), NULL)) == NULL) { + if ((resolved_ptr = realpath(RSTRING_PTR(unresolved_path), resolved_buffer)) == NULL) { /* glibc realpath(3) does not allow /path/to/file.rb/../other_file.rb, returning ENOTDIR in that case. glibc realpath(3) can also return ENOENT for paths that exist, @@ -4570,7 +4580,9 @@ rb_check_realpath_internal(VALUE basedir, VALUE path, rb_encoding *origenc, enum rb_sys_fail_path(unresolved_path); } resolved = ospath_new(resolved_ptr, strlen(resolved_ptr), rb_filesystem_encoding()); +# if defined(NEEDS_REALPATH_BUFFER) && NEEDS_REALPATH_BUFFER free(resolved_ptr); +# endif # if !defined(__LINUX__) && !defined(__APPLE__) /* As `resolved` is a String in the filesystem encoding, no diff --git a/io.c b/io.c index 590e8d11d74093..3c990439162d01 100644 --- a/io.c +++ b/io.c @@ -104,6 +104,16 @@ #ifdef HAVE_COPYFILE_H # include + +# ifndef COPYFILE_STATE_COPIED +/* + * Some OSes (e.g., OSX < 10.6) implement fcopyfile() but not + * COPYFILE_STATE_COPIED. Since the only use of the former here + * requires the latter, we disable the former when the latter is undefined. + */ +# undef HAVE_FCOPYFILE +# endif + #endif #include "ruby/internal/stdbool.h" diff --git a/signal.c b/signal.c index 1c8f8c112b73ba..2f7796c127712d 100644 --- a/signal.c +++ b/signal.c @@ -803,7 +803,8 @@ check_stack_overflow(int sig, const uintptr_t addr, const ucontext_t *ctx) const greg_t bp = mctx->gregs[REG_EBP]; # endif # elif defined __APPLE__ -# if __DARWIN_UNIX03 +# include +# if defined(MAC_OS_X_VERSION_10_5) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 # define MCTX_SS_REG(reg) __ss.__##reg # else # define MCTX_SS_REG(reg) ss.reg diff --git a/vm_dump.c b/vm_dump.c index 444be4a4f3c300..dcf0ec4c6e84c0 100644 --- a/vm_dump.c +++ b/vm_dump.c @@ -490,7 +490,8 @@ rb_vmdebug_thread_dump_state(FILE *errout, VALUE self) } #if defined __APPLE__ -# if __DARWIN_UNIX03 +# include +# if defined(MAC_OS_X_VERSION_10_5) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 # define MCTX_SS_REG(reg) __ss.__##reg # else # define MCTX_SS_REG(reg) ss.reg @@ -502,7 +503,8 @@ rb_vmdebug_thread_dump_state(FILE *errout, VALUE self) # ifdef HAVE_LIBUNWIND # undef backtrace # define backtrace unw_backtrace -# elif defined(__APPLE__) && defined(HAVE_LIBUNWIND_H) +# elif defined(__APPLE__) && defined(HAVE_LIBUNWIND_H) \ + && defined(MAC_OS_X_VERSION_10_6) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 # define UNW_LOCAL_ONLY # include # include From 7340c1ac71637e0cbe0d4905662aa7df40798d06 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Sep 2024 02:21:56 +0000 Subject: [PATCH 464/829] Bump actions/checkout in /.github/actions/setup/directories Bumps [actions/checkout](https://github.com/actions/checkout) from 4.1.7 to 4.2.0. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/692973e3d937129bcbf40652eb9f2f61becf3332...d632683dd7b4114ad314bca15554477dd762a938) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/actions/setup/directories/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/setup/directories/action.yml b/.github/actions/setup/directories/action.yml index 46691778bf3616..a4ac4a1d2fa4f3 100644 --- a/.github/actions/setup/directories/action.yml +++ b/.github/actions/setup/directories/action.yml @@ -88,7 +88,7 @@ runs: git config --global init.defaultBranch garbage - if: inputs.checkout - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: path: ${{ inputs.srcdir }} fetch-depth: ${{ inputs.fetch-depth }} From a3fd24e22e4f7c38db891e1ddf8ea3461d28659f Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Thu, 26 Sep 2024 05:24:20 +0900 Subject: [PATCH 465/829] [ruby/digest] Import patches for old macOS from MacPorts https://github.com/ruby/digest/commit/07a5db2f77 --- ext/digest/md5/md5cc.h | 8 ++++++++ ext/digest/sha1/sha1cc.h | 8 ++++++++ ext/digest/sha2/sha2cc.h | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+) diff --git a/ext/digest/md5/md5cc.h b/ext/digest/md5/md5cc.h index 0e7a58d2e0a483..657f573f85ddcf 100644 --- a/ext/digest/md5/md5cc.h +++ b/ext/digest/md5/md5cc.h @@ -25,3 +25,11 @@ static DEFINE_FINISH_FUNC_FROM_FINAL(MD5) #undef MD5_Finish #define MD5_Update rb_digest_MD5_update #define MD5_Finish rb_digest_MD5_finish + +/* + * Pre-10.6 defines are with args, which don't match the argless use in + * the function pointer inits. Thus, we redefine MD5_Init as well. + * This is a NOP on 10.6+. + */ +#undef MD5_Init +#define MD5_Init CC_MD5_Init diff --git a/ext/digest/sha1/sha1cc.h b/ext/digest/sha1/sha1cc.h index 2ed8d646ab3fa1..f39ecc623405c3 100644 --- a/ext/digest/sha1/sha1cc.h +++ b/ext/digest/sha1/sha1cc.h @@ -12,3 +12,11 @@ static DEFINE_FINISH_FUNC_FROM_FINAL(SHA1) #undef SHA1_Finish #define SHA1_Update rb_digest_SHA1_update #define SHA1_Finish rb_digest_SHA1_finish + +/* + * Pre-10.6 defines are with args, which don't match the argless use in + * the function pointer inits. Thus, we redefine SHA1_Init as well. + * This is a NOP on 10.6+. + */ +#undef SHA1_Init +#define SHA1_Init CC_SHA1_Init diff --git a/ext/digest/sha2/sha2cc.h b/ext/digest/sha2/sha2cc.h index 3f99604465b6e0..1245a2e2c7d6b4 100644 --- a/ext/digest/sha2/sha2cc.h +++ b/ext/digest/sha2/sha2cc.h @@ -1,6 +1,33 @@ #define COMMON_DIGEST_FOR_OPENSSL 1 #include +/* + * Prior to 10.5, OpenSSL-compatible definitions are missing for + * SHA2 macros, though the CC_ versions are present. + * Add the missing definitions we actually use here if needed. + * Note that the definitions are the argless 10.6+-style. + * The weird CTX mismatch is copied from the 10.6 header. + */ +#ifndef SHA256_DIGEST_LENGTH +#define SHA256_DIGEST_LENGTH CC_SHA256_DIGEST_LENGTH +#define SHA256_CTX CC_SHA256_CTX +#define SHA256_Update CC_SHA256_Update +#define SHA256_Final CC_SHA256_Final +#endif /* !defined SHA256_DIGEST_LENGTH */ + +#ifndef SHA384_DIGEST_LENGTH +#define SHA384_DIGEST_LENGTH CC_SHA384_DIGEST_LENGTH +#define SHA512_CTX CC_SHA512_CTX +#define SHA384_Update CC_SHA384_Update +#define SHA384_Final CC_SHA384_Final +#endif /* !defined SHA384_DIGEST_LENGTH */ + +#ifndef SHA512_DIGEST_LENGTH +#define SHA512_DIGEST_LENGTH CC_SHA512_DIGEST_LENGTH +#define SHA512_Update CC_SHA512_Update +#define SHA512_Final CC_SHA512_Final +#endif /* !defined SHA512_DIGEST_LENGTH */ + #define SHA256_BLOCK_LENGTH CC_SHA256_BLOCK_BYTES #define SHA384_BLOCK_LENGTH CC_SHA384_BLOCK_BYTES #define SHA512_BLOCK_LENGTH CC_SHA512_BLOCK_BYTES @@ -29,3 +56,15 @@ static DEFINE_FINISH_FUNC_FROM_FINAL(SHA512) #undef SHA512_Finish #define SHA512_Update rb_digest_SHA512_update #define SHA512_Finish rb_digest_SHA512_finish + +/* + * Pre-10.6 defines are with args, which don't match the argless use in + * the function pointer inits. Thus, we redefine SHA*_Init as well. + * This is a NOP on 10.6+. + */ +#undef SHA256_Init +#define SHA256_Init CC_SHA256_Init +#undef SHA384_Init +#define SHA384_Init CC_SHA384_Init +#undef SHA512_Init +#define SHA512_Init CC_SHA512_Init From 8cd295ecf09e9419de0e3f3d4eecabfb430f9df1 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Wed, 23 Mar 2022 21:47:46 +0000 Subject: [PATCH 466/829] regparse possible memory leak fix proposal --- regparse.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/regparse.c b/regparse.c index 33815f24456f7a..6f1fbf81911f92 100644 --- a/regparse.c +++ b/regparse.c @@ -6682,7 +6682,10 @@ parse_subexp(Node** top, OnigToken* tok, int term, headp = &(NCDR(*top)); while (r == TK_ALT) { r = fetch_token(tok, src, end, env); - if (r < 0) return r; + if (r < 0) { + onig_node_free(node); + return r; + } r = parse_branch(&node, tok, term, src, end, env); if (r < 0) { onig_node_free(node); From b7674a128541dcc5a304bf255e0442aea5dd2d67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Wed, 25 Sep 2024 17:26:24 +0200 Subject: [PATCH 467/829] [rubygems/rubygems] Get specs to run on JRuby and make them pass Turns out we were not running specs on JRuby, so we introduced a failure. Seems fine to skip. https://github.com/rubygems/rubygems/commit/4e2d6affb3 --- spec/bundler/install/gemfile/force_ruby_platform_spec.rb | 2 ++ spec/bundler/realworld/fixtures/warbler/Gemfile | 2 +- spec/bundler/realworld/fixtures/warbler/Gemfile.lock | 6 +++--- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/spec/bundler/install/gemfile/force_ruby_platform_spec.rb b/spec/bundler/install/gemfile/force_ruby_platform_spec.rb index f5d993adacaf1e..926e7527e667ef 100644 --- a/spec/bundler/install/gemfile/force_ruby_platform_spec.rb +++ b/spec/bundler/install/gemfile/force_ruby_platform_spec.rb @@ -102,6 +102,8 @@ end it "reinstalls the ruby variant when a platform specific variant is already installed, the lockile has only ruby platform, and :force_ruby_platform is used in the Gemfile" do + skip "Can't simulate platform reliably on JRuby, installing a platform specific gem fails to activate io-wait because only the -java version is present, and we're simulating a different platform" if RUBY_ENGINE == "jruby" + lockfile <<-L GEM remote: https://gem.repo4 diff --git a/spec/bundler/realworld/fixtures/warbler/Gemfile b/spec/bundler/realworld/fixtures/warbler/Gemfile index a8dbb4911cf2f6..e4d3e8ea963cf7 100644 --- a/spec/bundler/realworld/fixtures/warbler/Gemfile +++ b/spec/bundler/realworld/fixtures/warbler/Gemfile @@ -3,5 +3,5 @@ source "https://rubygems.org" gem "demo", path: "./demo" -gem "jruby-jars", "~> 9.2" +gem "jruby-jars", "~> 9.4" gem "warbler", "~> 2.0" diff --git a/spec/bundler/realworld/fixtures/warbler/Gemfile.lock b/spec/bundler/realworld/fixtures/warbler/Gemfile.lock index 5b476f8df27e8a..b8171d28cef528 100644 --- a/spec/bundler/realworld/fixtures/warbler/Gemfile.lock +++ b/spec/bundler/realworld/fixtures/warbler/Gemfile.lock @@ -6,7 +6,7 @@ PATH GEM remote: https://rubygems.org/ specs: - jruby-jars (9.2.16.0) + jruby-jars (9.4.8.0) jruby-rack (1.1.21) rake (13.0.1) rubyzip (1.3.0) @@ -23,8 +23,8 @@ PLATFORMS DEPENDENCIES demo! - jruby-jars (~> 9.2) + jruby-jars (~> 9.4) warbler (~> 2.0) BUNDLED WITH - 2.5.0.dev + 2.6.0.dev From b2ee760f306a24419d8ae0f4927d731bebbd76ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Tue, 24 Sep 2024 15:08:41 +0200 Subject: [PATCH 468/829] Update test dependencies --- .../install/gems/dependency_api_fallback_spec.rb | 14 ++++++++------ .../realworld/gemfile_source_header_spec.rb | 14 ++++++++------ spec/bundler/realworld/mirror_probe_spec.rb | 14 ++++++++------ tool/bundler/test_gems.rb | 9 +++++---- 4 files changed, 29 insertions(+), 22 deletions(-) diff --git a/spec/bundler/install/gems/dependency_api_fallback_spec.rb b/spec/bundler/install/gems/dependency_api_fallback_spec.rb index 5e700ea9760953..107da15d671a8e 100644 --- a/spec/bundler/install/gems/dependency_api_fallback_spec.rb +++ b/spec/bundler/install/gems/dependency_api_fallback_spec.rb @@ -15,13 +15,15 @@ # mustermann depends on URI::RFC2396_PARSER behavior URI.parser = URI::RFC2396_PARSER if URI.respond_to?(:parser=) + require "rackup/server" + @t = Thread.new do - server = Rack::Server.start(app: EndpointTimeout, - Host: "0.0.0.0", - Port: port, - server: "webrick", - AccessLog: [], - Logger: Spec::SilentLogger.new) + server = Rackup::Server.start(app: EndpointTimeout, + Host: "0.0.0.0", + Port: port, + server: "webrick", + AccessLog: [], + Logger: Spec::SilentLogger.new) server.start end @t.run diff --git a/spec/bundler/realworld/gemfile_source_header_spec.rb b/spec/bundler/realworld/gemfile_source_header_spec.rb index 45f5d0fd227da6..f47ba3a855a430 100644 --- a/spec/bundler/realworld/gemfile_source_header_spec.rb +++ b/spec/bundler/realworld/gemfile_source_header_spec.rb @@ -39,13 +39,15 @@ def setup_server require_relative "../support/artifice/endpoint_mirror_source" + require "rackup/server" + @t = Thread.new do - Rack::Server.start(app: EndpointMirrorSource, - Host: "0.0.0.0", - Port: @port, - server: "webrick", - AccessLog: [], - Logger: Spec::SilentLogger.new) + Rackup::Server.start(app: EndpointMirrorSource, + Host: "0.0.0.0", + Port: @port, + server: "webrick", + AccessLog: [], + Logger: Spec::SilentLogger.new) end.run wait_for_server("127.0.0.1", @port) diff --git a/spec/bundler/realworld/mirror_probe_spec.rb b/spec/bundler/realworld/mirror_probe_spec.rb index fc97f92375d45e..61312860d18b27 100644 --- a/spec/bundler/realworld/mirror_probe_spec.rb +++ b/spec/bundler/realworld/mirror_probe_spec.rb @@ -112,13 +112,15 @@ def setup_server require_relative "../support/artifice/endpoint" + require "rackup/server" + @server_thread = Thread.new do - Rack::Server.start(app: Endpoint, - Host: host, - Port: @server_port, - server: "webrick", - AccessLog: [], - Logger: Spec::SilentLogger.new) + Rackup::Server.start(app: Endpoint, + Host: host, + Port: @server_port, + server: "webrick", + AccessLog: [], + Logger: Spec::SilentLogger.new) end.run wait_for_server(host, @server_port) diff --git a/tool/bundler/test_gems.rb b/tool/bundler/test_gems.rb index 32cb6b34eef43d..bb7d4edb9a2bd9 100644 --- a/tool/bundler/test_gems.rb +++ b/tool/bundler/test_gems.rb @@ -2,12 +2,13 @@ source "https://rubygems.org" -gem "rack", "~> 2.0" +gem "rack", "~> 3.0" +gem "rackup", "~> 2.1" gem "base64" -gem "webrick", "1.7.0" -gem "rack-test", "~> 1.1" +gem "webrick", "~> 1.8" +gem "rack-test", "~> 2.1" gem "compact_index", "~> 0.15.0" -gem "sinatra", "~> 3.0" +gem "sinatra", "~> 4.0" gem "rake", "~> 13.1" gem "builder", "~> 3.2" gem "rb_sys" From bdee1772b28127b07c603bd17605f0f2fb67a9ff Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Thu, 26 Sep 2024 17:08:06 +0900 Subject: [PATCH 469/829] Removed duplicated dumps --- vm_dump.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/vm_dump.c b/vm_dump.c index dcf0ec4c6e84c0..5dd302e4230db5 100644 --- a/vm_dump.c +++ b/vm_dump.c @@ -999,8 +999,6 @@ rb_dump_machine_register(FILE *errout, const ucontext_t *ctx) dump_machine_register(mctx->__gregs[REG_S2+9], "s11"); # elif defined __loongarch64 dump_machine_register(mctx->__gregs[LARCH_REG_SP], "sp"); - dump_machine_register(mctx->__gregs[LARCH_REG_S0], "s0"); - dump_machine_register(mctx->__gregs[LARCH_REG_S1], "s1"); dump_machine_register(mctx->__gregs[LARCH_REG_A0], "a0"); dump_machine_register(mctx->__gregs[LARCH_REG_A0+1], "a1"); dump_machine_register(mctx->__gregs[LARCH_REG_A0+2], "a2"); @@ -1009,9 +1007,8 @@ rb_dump_machine_register(FILE *errout, const ucontext_t *ctx) dump_machine_register(mctx->__gregs[LARCH_REG_A0+5], "a5"); dump_machine_register(mctx->__gregs[LARCH_REG_A0+6], "a6"); dump_machine_register(mctx->__gregs[LARCH_REG_A0+7], "a7"); - dump_machine_register(mctx->__gregs[LARCH_REG_A0+7], "a7"); dump_machine_register(mctx->__gregs[LARCH_REG_S0], "s0"); - dump_machine_register(mctx->__gregs[LARCH_REG_S0+1], "s1"); + dump_machine_register(mctx->__gregs[LARCH_REG_S1], "s1"); dump_machine_register(mctx->__gregs[LARCH_REG_S0+2], "s2"); dump_machine_register(mctx->__gregs[LARCH_REG_S0+3], "s3"); dump_machine_register(mctx->__gregs[LARCH_REG_S0+4], "s4"); From a07bf6d5ffddff95eb2f83d5950b759fb4285d2e Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Thu, 26 Sep 2024 17:09:54 +0900 Subject: [PATCH 470/829] Use constants for register numbers --- vm_dump.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/vm_dump.c b/vm_dump.c index 5dd302e4230db5..594295e9b13d1c 100644 --- a/vm_dump.c +++ b/vm_dump.c @@ -1000,22 +1000,22 @@ rb_dump_machine_register(FILE *errout, const ucontext_t *ctx) # elif defined __loongarch64 dump_machine_register(mctx->__gregs[LARCH_REG_SP], "sp"); dump_machine_register(mctx->__gregs[LARCH_REG_A0], "a0"); - dump_machine_register(mctx->__gregs[LARCH_REG_A0+1], "a1"); - dump_machine_register(mctx->__gregs[LARCH_REG_A0+2], "a2"); - dump_machine_register(mctx->__gregs[LARCH_REG_A0+3], "a3"); - dump_machine_register(mctx->__gregs[LARCH_REG_A0+4], "a4"); - dump_machine_register(mctx->__gregs[LARCH_REG_A0+5], "a5"); - dump_machine_register(mctx->__gregs[LARCH_REG_A0+6], "a6"); - dump_machine_register(mctx->__gregs[LARCH_REG_A0+7], "a7"); + dump_machine_register(mctx->__gregs[LARCH_REG_A1], "a1"); + dump_machine_register(mctx->__gregs[LARCH_REG_A2], "a2"); + dump_machine_register(mctx->__gregs[LARCH_REG_A3], "a3"); + dump_machine_register(mctx->__gregs[LARCH_REG_A4], "a4"); + dump_machine_register(mctx->__gregs[LARCH_REG_A5], "a5"); + dump_machine_register(mctx->__gregs[LARCH_REG_A6], "a6"); + dump_machine_register(mctx->__gregs[LARCH_REG_A7], "a7"); dump_machine_register(mctx->__gregs[LARCH_REG_S0], "s0"); dump_machine_register(mctx->__gregs[LARCH_REG_S1], "s1"); - dump_machine_register(mctx->__gregs[LARCH_REG_S0+2], "s2"); - dump_machine_register(mctx->__gregs[LARCH_REG_S0+3], "s3"); - dump_machine_register(mctx->__gregs[LARCH_REG_S0+4], "s4"); - dump_machine_register(mctx->__gregs[LARCH_REG_S0+5], "s5"); - dump_machine_register(mctx->__gregs[LARCH_REG_S0+6], "s6"); - dump_machine_register(mctx->__gregs[LARCH_REG_S0+7], "s7"); - dump_machine_register(mctx->__gregs[LARCH_REG_S0+8], "s8"); + dump_machine_register(mctx->__gregs[LARCH_REG_S2], "s2"); + dump_machine_register(mctx->__gregs[LARCH_REG_S3], "s3"); + dump_machine_register(mctx->__gregs[LARCH_REG_S4], "s4"); + dump_machine_register(mctx->__gregs[LARCH_REG_S5], "s5"); + dump_machine_register(mctx->__gregs[LARCH_REG_S6], "s6"); + dump_machine_register(mctx->__gregs[LARCH_REG_S7], "s7"); + dump_machine_register(mctx->__gregs[LARCH_REG_S8], "s8"); # endif } # elif defined __APPLE__ From 71b253cdf377acf04fb8bd98221f48d7087946de Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Thu, 26 Sep 2024 17:10:40 +0900 Subject: [PATCH 471/829] Added LARCH_REG_FP to dump results --- vm_dump.c | 1 + 1 file changed, 1 insertion(+) diff --git a/vm_dump.c b/vm_dump.c index 594295e9b13d1c..3a5b96edcd66b3 100644 --- a/vm_dump.c +++ b/vm_dump.c @@ -1007,6 +1007,7 @@ rb_dump_machine_register(FILE *errout, const ucontext_t *ctx) dump_machine_register(mctx->__gregs[LARCH_REG_A5], "a5"); dump_machine_register(mctx->__gregs[LARCH_REG_A6], "a6"); dump_machine_register(mctx->__gregs[LARCH_REG_A7], "a7"); + dump_machine_register(mctx->__gregs[LARCH_REG_FP], "fp"); dump_machine_register(mctx->__gregs[LARCH_REG_S0], "s0"); dump_machine_register(mctx->__gregs[LARCH_REG_S1], "s1"); dump_machine_register(mctx->__gregs[LARCH_REG_S2], "s2"); From 2a65f4c90713c3738993aba34b03eeed02ac7a87 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Thu, 26 Sep 2024 18:17:13 +0900 Subject: [PATCH 472/829] Extract `mutable_CFString_new` From duplicate code in `rb_CFString_class_initialize_before_fork` and `rb_str_append_normalized_ospath`. --- file.c | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/file.c b/file.c index 64fc470c1c4878..e8db1069f77c65 100644 --- a/file.c +++ b/file.c @@ -271,6 +271,18 @@ rb_str_encode_ospath(VALUE path) # define NORMALIZE_UTF8PATH 1 # ifdef HAVE_WORKING_FORK +static CFMutableStringRef +mutable_CFString_new(CFStringRef *s, const char *ptr, long len) +{ + const CFAllocatorRef alloc = kCFAllocatorDefault; + *s = CFStringCreateWithBytesNoCopy(alloc, (const UInt8 *)ptr, len, + kCFStringEncodingUTF8, FALSE, + kCFAllocatorNull); + return CFStringCreateMutableCopy(alloc, len, *s); +} + +# define mutable_CFString_release(m, s) (CFRelease(m), CFRelease(s)) + static void rb_CFString_class_initialize_before_fork(void) { @@ -297,15 +309,9 @@ rb_CFString_class_initialize_before_fork(void) /* Enough small but non-empty ASCII string to fit in NSTaggedPointerString. */ const char small_str[] = "/"; long len = sizeof(small_str) - 1; - - const CFAllocatorRef alloc = kCFAllocatorDefault; - CFStringRef s = CFStringCreateWithBytesNoCopy(alloc, - (const UInt8 *)small_str, - len, kCFStringEncodingUTF8, - FALSE, kCFAllocatorNull); - CFMutableStringRef m = CFStringCreateMutableCopy(alloc, len, s); - CFRelease(m); - CFRelease(s); + CFStringRef s; + CFMutableStringRef m = mutable_CFString_new(&s, small_str, len); + mutable_CFString_release(m, s); } # endif /* HAVE_WORKING_FORK */ @@ -314,11 +320,8 @@ rb_str_append_normalized_ospath(VALUE str, const char *ptr, long len) { CFIndex buflen = 0; CFRange all; - CFStringRef s = CFStringCreateWithBytesNoCopy(kCFAllocatorDefault, - (const UInt8 *)ptr, len, - kCFStringEncodingUTF8, FALSE, - kCFAllocatorNull); - CFMutableStringRef m = CFStringCreateMutableCopy(kCFAllocatorDefault, len, s); + CFStringRef s; + CFMutableStringRef m = mutable_CFString_new(&s, ptr, len); long oldlen = RSTRING_LEN(str); CFStringNormalize(m, kCFStringNormalizationFormC); @@ -328,8 +331,7 @@ rb_str_append_normalized_ospath(VALUE str, const char *ptr, long len) CFStringGetBytes(m, all, kCFStringEncodingUTF8, '?', FALSE, (UInt8 *)(RSTRING_PTR(str) + oldlen), buflen, &buflen); rb_str_set_len(str, oldlen + buflen); - CFRelease(m); - CFRelease(s); + mutable_CFString_release(m, s); return str; } From 3e742579bb5626e1d48c2c2e65cd448399deae9b Mon Sep 17 00:00:00 2001 From: S-H-GAMELINKS Date: Tue, 24 Sep 2024 12:21:15 +0900 Subject: [PATCH 473/829] Remove rb_str_cat for parser --- ruby_parser.c | 1 - rubyparser.h | 1 - universal_parser.c | 1 - 3 files changed, 3 deletions(-) diff --git a/ruby_parser.c b/ruby_parser.c index 28e63886af7504..a965fc44dc2760 100644 --- a/ruby_parser.c +++ b/ruby_parser.c @@ -371,7 +371,6 @@ static const rb_parser_config_t rb_global_parser_config = { .str_catf = rb_str_catf, .str_cat_cstr = rb_str_cat_cstr, - .str_cat = rb_str_cat, .str_resize = rb_str_resize, .str_new = rb_str_new, .str_new_cstr = rb_str_new_cstr, diff --git a/rubyparser.h b/rubyparser.h index e856f69a5fded2..4ba34fff1642b7 100644 --- a/rubyparser.h +++ b/rubyparser.h @@ -1213,7 +1213,6 @@ typedef struct rb_parser_config_struct { RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT, 2, 3) VALUE (*str_catf)(VALUE str, const char *format, ...); VALUE (*str_cat_cstr)(VALUE str, const char *ptr); - VALUE (*str_cat)(VALUE str, const char *ptr, long len); VALUE (*str_resize)(VALUE str, long len); VALUE (*str_new)(const char *ptr, long len); VALUE (*str_new_cstr)(const char *ptr); diff --git a/universal_parser.c b/universal_parser.c index ee3be70edcafc8..9ba7bef4a785e1 100644 --- a/universal_parser.c +++ b/universal_parser.c @@ -115,7 +115,6 @@ #define rb_str_catf p->config->str_catf #undef rb_str_cat_cstr #define rb_str_cat_cstr p->config->str_cat_cstr -#define rb_str_cat p->config->str_cat #define rb_str_resize p->config->str_resize #undef rb_str_new #define rb_str_new p->config->str_new From cc1e1e77d50833aa5a64f6c399e3def637294f43 Mon Sep 17 00:00:00 2001 From: ydah Date: Thu, 26 Sep 2024 18:54:15 +0900 Subject: [PATCH 474/829] s/useable/usable/ --- hash.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hash.c b/hash.c index 13a63f6e9c6e19..3a8dfd59171e0c 100644 --- a/hash.c +++ b/hash.c @@ -6792,7 +6792,7 @@ static const rb_data_type_t env_data_type = { * * ==== User-Defined +Hash+ Keys * - * To be useable as a +Hash+ key, objects must implement the methods hash and eql?. + * To be usable as a +Hash+ key, objects must implement the methods hash and eql?. * Note: this requirement does not apply if the +Hash+ uses #compare_by_identity since comparison will then * rely on the keys' object id instead of hash and eql?. * From 87f4999b4f838cdbede34d76d85fb046969ad888 Mon Sep 17 00:00:00 2001 From: ydah Date: Thu, 26 Sep 2024 18:54:29 +0900 Subject: [PATCH 475/829] s/accomodate/accommodate/ --- hash.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hash.rb b/hash.rb index 3103c6260bf632..08edb745a4496a 100644 --- a/hash.rb +++ b/hash.rb @@ -33,7 +33,7 @@ class Hash # If both a block and a default_value are given, raises an +ArgumentError+ # # If the optional keyword argument +capacity+ is given, the hash will be allocated - # with enough capacity to accomodate this many keys without having to be resized. + # with enough capacity to accommodate this many keys without having to be resized. def initialize(ifnone = (ifnone_unset = true), capacity: 0, &block) Primitive.rb_hash_init(capacity, ifnone_unset, ifnone, block) end From 49057f36efd894663cc879be08ada042b287e93a Mon Sep 17 00:00:00 2001 From: Stan Lo Date: Thu, 26 Sep 2024 15:38:00 +0200 Subject: [PATCH 476/829] [ruby/irb] Bump version to v1.14.1 (https://github.com/ruby/irb/pull/1009) https://github.com/ruby/irb/commit/04cd2317ef --- lib/irb/version.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/irb/version.rb b/lib/irb/version.rb index e935a1d7f73ba4..955a3a81da9b8c 100644 --- a/lib/irb/version.rb +++ b/lib/irb/version.rb @@ -5,7 +5,7 @@ # module IRB # :nodoc: - VERSION = "1.14.0" + VERSION = "1.14.1" @RELEASE_VERSION = VERSION - @LAST_UPDATE_DATE = "2024-07-06" + @LAST_UPDATE_DATE = "2024-09-25" end From e71f8905c464227dcc3c9e440c180345a2d93f4b Mon Sep 17 00:00:00 2001 From: git Date: Thu, 26 Sep 2024 13:39:23 +0000 Subject: [PATCH 477/829] Update default gems list at 49057f36efd894663cc879be08ada0 [ci skip] --- NEWS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index 0bef0df4a2ae1f..c804f41de494b5 100644 --- a/NEWS.md +++ b/NEWS.md @@ -73,7 +73,7 @@ The following default gems are updated. * erb 4.0.4 * fiddle 1.1.3.dev * io-console 0.7.2 -* irb 1.14.0 +* irb 1.14.1 * json 2.7.2 * logger 1.6.1 * net-http 0.4.1 From 1f431b63a2aa4b5c3827de8fbdc6001f6d4ab252 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Thu, 26 Sep 2024 10:28:35 -0400 Subject: [PATCH 478/829] [ruby/prism] Reject non-assoc ranges with subsequent operators https://github.com/ruby/prism/commit/976a3cd0a5 --- prism/config.yml | 1 + prism/prism.c | 28 ++++++++++++++++-------- prism/templates/src/diagnostic.c.erb | 1 + test/prism/errors/non_assoc_range.txt | 1 + test/prism/errors/range_and_bin_op_4.txt | 1 + test/prism/errors/range_and_bin_op_5.txt | 1 + 6 files changed, 24 insertions(+), 9 deletions(-) diff --git a/prism/config.yml b/prism/config.yml index 876008311f3eb9..cc07b386a181fd 100644 --- a/prism/config.yml +++ b/prism/config.yml @@ -187,6 +187,7 @@ errors: - MULTI_ASSIGN_UNEXPECTED_REST - NESTING_TOO_DEEP - NO_LOCAL_VARIABLE + - NON_ASSOCIATIVE_OPERATOR - NOT_EXPRESSION - NUMBER_LITERAL_UNDERSCORE - NUMBERED_PARAMETER_INNER_BLOCK diff --git a/prism/prism.c b/prism/prism.c index 6e3f9bce597d2d..808915858adfc1 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -21643,16 +21643,26 @@ parse_expression(pm_parser_t *parser, pm_binding_power_t binding_power, bool acc break; } + // If the operator is nonassoc and we should not be able to parse the + // upcoming infix operator, break. if (current_binding_powers.nonassoc) { - bool endless_range_p = PM_NODE_TYPE_P(node, PM_RANGE_NODE) && ((pm_range_node_t *) node)->right == NULL; - pm_binding_power_t left = endless_range_p ? PM_BINDING_POWER_TERM : current_binding_powers.left; - if ( - left <= pm_binding_powers[parser->current.type].left || - // Exceptionally to operator precedences, '1.. & 2' is rejected. - // '1.. || 2' is also an exception, but it is handled by the lexer. - // (Here, parser->current is PM_TOKEN_PIPE, not PM_TOKEN_PIPE_PIPE). - (endless_range_p && match1(parser, PM_TOKEN_AMPERSAND)) - ) { + // If this is an endless range, then we need to reject a couple of + // additional operators because it violates the normal operator + // precedence rules. Those patterns are: + // + // 1.. & 2 + // 1.. * 2 + // + if (PM_NODE_TYPE_P(node, PM_RANGE_NODE) && ((pm_range_node_t *) node)->right == NULL) { + if (match3(parser, PM_TOKEN_UAMPERSAND, PM_TOKEN_USTAR, PM_TOKEN_DOT)) { + PM_PARSER_ERR_TOKEN_FORMAT(parser, parser->current, PM_ERR_NON_ASSOCIATIVE_OPERATOR, pm_token_type_human(parser->current.type), pm_token_type_human(parser->previous.type)); + break; + } + + if (PM_BINDING_POWER_TERM <= pm_binding_powers[parser->current.type].left) { + break; + } + } else if (current_binding_powers.left <= pm_binding_powers[parser->current.type].left) { break; } } diff --git a/prism/templates/src/diagnostic.c.erb b/prism/templates/src/diagnostic.c.erb index d3b9cd516d8b57..7768c7f5edcd88 100644 --- a/prism/templates/src/diagnostic.c.erb +++ b/prism/templates/src/diagnostic.c.erb @@ -269,6 +269,7 @@ static const pm_diagnostic_data_t diagnostic_messages[PM_DIAGNOSTIC_ID_MAX] = { [PM_ERR_MULTI_ASSIGN_UNEXPECTED_REST] = { "unexpected '%.*s' resulting in multiple splats in multiple assignment", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_NESTING_TOO_DEEP] = { "nesting too deep", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_NO_LOCAL_VARIABLE] = { "%.*s: no such local variable", PM_ERROR_LEVEL_SYNTAX }, + [PM_ERR_NON_ASSOCIATIVE_OPERATOR] = { "unexpected %s; %s is a non-associative operator", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_NOT_EXPRESSION] = { "expected an expression after `not`", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_NUMBER_LITERAL_UNDERSCORE] = { "number literal ending with a `_`", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_NUMBERED_PARAMETER_INNER_BLOCK] = { "numbered parameter is already used in inner block", PM_ERROR_LEVEL_SYNTAX }, diff --git a/test/prism/errors/non_assoc_range.txt b/test/prism/errors/non_assoc_range.txt index 072cf6d3c6e19e..12eec105940a71 100644 --- a/test/prism/errors/non_assoc_range.txt +++ b/test/prism/errors/non_assoc_range.txt @@ -1,4 +1,5 @@ 1....2 + ^ unexpected '.'; ... is a non-associative operator ^ unexpected '.', expecting end-of-input ^ unexpected '.', ignoring it diff --git a/test/prism/errors/range_and_bin_op_4.txt b/test/prism/errors/range_and_bin_op_4.txt index 56226480cfcfe0..ce6e79e5ff59cc 100644 --- a/test/prism/errors/range_and_bin_op_4.txt +++ b/test/prism/errors/range_and_bin_op_4.txt @@ -1,4 +1,5 @@ 1.. & 2 + ^ unexpected '&'; .. is a non-associative operator ^ unexpected '&', expecting end-of-input ^ unexpected '&', ignoring it diff --git a/test/prism/errors/range_and_bin_op_5.txt b/test/prism/errors/range_and_bin_op_5.txt index bc8b46791474b5..4ed91e1052031c 100644 --- a/test/prism/errors/range_and_bin_op_5.txt +++ b/test/prism/errors/range_and_bin_op_5.txt @@ -1,4 +1,5 @@ 1.. * 2 + ^ unexpected *; .. is a non-associative operator ^ unexpected *, expecting end-of-input ^ unexpected write target ^~~ unexpected write target From a73d80db41ca3681bf316cb7741a254f6ba5a505 Mon Sep 17 00:00:00 2001 From: Daniel Insley Date: Wed, 25 Sep 2024 17:40:06 -0700 Subject: [PATCH 479/829] [ruby/prism] Add fields documentation for AliasMethodNode and AlternationPatternNode https://github.com/ruby/prism/commit/6953daebde --- prism/config.yml | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/prism/config.yml b/prism/config.yml index cc07b386a181fd..31ce8c20154502 100644 --- a/prism/config.yml +++ b/prism/config.yml @@ -822,6 +822,17 @@ nodes: kind: - SymbolNode - InterpolatedSymbolNode + comment: | + Represents the new name of the method that will be aliased. + + alias foo bar + ^^^ + + alias :foo :bar + ^^^^ + + alias :"#{foo}" :"#{bar}" + ^^^^^^^^^ - name: old_name type: node kind: @@ -829,6 +840,17 @@ nodes: - InterpolatedSymbolNode - on error: GlobalVariableReadNode # alias a $b - on error: MissingNode # alias a 42 + comment: | + Represents the old name of the method that will be aliased. + + alias foo bar + ^^^ + + alias :foo :bar + ^^^^ + + alias :"#{foo}" :"#{bar}" + ^^^^^^^^^ - name: keyword_loc type: location comment: | @@ -841,11 +863,26 @@ nodes: - name: left type: node kind: pattern expression + comment: | + Represents the left side of the expression. It can be any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression). + + foo => bar | baz + ^^^ - name: right type: node kind: pattern expression + comment: | + Represents the right side of the expression. It can be any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression). + + foo => bar | baz + ^^^ - name: operator_loc type: location + comment: | + Represents the alternation operator location. + + foo => bar | baz + ^ comment: | Represents an alternation pattern in pattern matching. From 9a966a09cb553991b33a642a5583c821ac99dcc5 Mon Sep 17 00:00:00 2001 From: Daniel Insley Date: Thu, 26 Sep 2024 08:18:35 -0700 Subject: [PATCH 480/829] [ruby/prism] Fix incorrect reference to AlternationPatternNode as non-void expressions https://github.com/ruby/prism/commit/68de31919e --- prism/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/prism/config.yml b/prism/config.yml index 31ce8c20154502..f8a6a711b98a6a 100644 --- a/prism/config.yml +++ b/prism/config.yml @@ -864,7 +864,7 @@ nodes: type: node kind: pattern expression comment: | - Represents the left side of the expression. It can be any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression). + Represents the left side of the expression. foo => bar | baz ^^^ @@ -872,7 +872,7 @@ nodes: type: node kind: pattern expression comment: | - Represents the right side of the expression. It can be any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression). + Represents the right side of the expression. foo => bar | baz ^^^ From 1172d65926236e866ff1eb330e510ac2113ddc17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Thu, 26 Sep 2024 18:00:34 +0200 Subject: [PATCH 481/829] [DOC] Improve description of `LoadError#path` and `SyntaxError#path` --- error.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/error.c b/error.c index acd92c893db4f9..5256521acdc950 100644 --- a/error.c +++ b/error.c @@ -3507,11 +3507,11 @@ Init_Exception(void) * and will render `idPath` as an attribute name without this trick */ ID path = idPath; - /* the path failed to parse */ + /* the path that failed to parse */ rb_attr(rb_eSyntaxError, path, TRUE, FALSE, FALSE); rb_eLoadError = rb_define_class("LoadError", rb_eScriptError); - /* the path failed to load */ + /* the path that failed to load */ rb_attr(rb_eLoadError, path, TRUE, FALSE, FALSE); rb_eNotImpError = rb_define_class("NotImplementedError", rb_eScriptError); From 0209b9554dc86b95018b454d81ad48d1a9c6af27 Mon Sep 17 00:00:00 2001 From: Yudai Takada Date: Fri, 27 Sep 2024 01:03:40 +0900 Subject: [PATCH 482/829] Extract `setup_branch` From duplicate code in `decl_branch_base` and `add_trace_branch_coverage`. --- compile.c | 40 +++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/compile.c b/compile.c index a044a30abdc528..53aabc6d4f63aa 100644 --- a/compile.c +++ b/compile.c @@ -612,12 +612,25 @@ branch_coverage_valid_p(rb_iseq_t *iseq, int first_line) #define PTR2NUM(x) (rb_int2inum((intptr_t)(void *)(x))) static VALUE -decl_branch_base(rb_iseq_t *iseq, VALUE key, const rb_code_location_t *loc, const char *type) +setup_branch(const rb_code_location_t *loc, const char *type, VALUE structure, VALUE key) { const int first_lineno = loc->beg_pos.lineno, first_column = loc->beg_pos.column; const int last_lineno = loc->end_pos.lineno, last_column = loc->end_pos.column; + VALUE branch = rb_ary_hidden_new(6); - if (!branch_coverage_valid_p(iseq, first_lineno)) return Qundef; + rb_hash_aset(structure, key, branch); + rb_ary_push(branch, ID2SYM(rb_intern(type))); + rb_ary_push(branch, INT2FIX(first_lineno)); + rb_ary_push(branch, INT2FIX(first_column)); + rb_ary_push(branch, INT2FIX(last_lineno)); + rb_ary_push(branch, INT2FIX(last_column)); + return branch; +} + +static VALUE +decl_branch_base(rb_iseq_t *iseq, VALUE key, const rb_code_location_t *loc, const char *type) +{ + if (!branch_coverage_valid_p(iseq, loc->beg_pos.lineno)) return Qundef; /* * if !structure[node] @@ -632,13 +645,7 @@ decl_branch_base(rb_iseq_t *iseq, VALUE key, const rb_code_location_t *loc, cons VALUE branches; if (NIL_P(branch_base)) { - branch_base = rb_ary_hidden_new(6); - rb_hash_aset(structure, key, branch_base); - rb_ary_push(branch_base, ID2SYM(rb_intern(type))); - rb_ary_push(branch_base, INT2FIX(first_lineno)); - rb_ary_push(branch_base, INT2FIX(first_column)); - rb_ary_push(branch_base, INT2FIX(last_lineno)); - rb_ary_push(branch_base, INT2FIX(last_column)); + branch_base = setup_branch(loc, type, structure, key); branches = rb_hash_new(); rb_obj_hide(branches); rb_ary_push(branch_base, branches); @@ -662,10 +669,7 @@ generate_dummy_line_node(int lineno, int node_id) static void add_trace_branch_coverage(rb_iseq_t *iseq, LINK_ANCHOR *const seq, const rb_code_location_t *loc, int node_id, int branch_id, const char *type, VALUE branches) { - const int first_lineno = loc->beg_pos.lineno, first_column = loc->beg_pos.column; - const int last_lineno = loc->end_pos.lineno, last_column = loc->end_pos.column; - - if (!branch_coverage_valid_p(iseq, first_lineno)) return; + if (!branch_coverage_valid_p(iseq, loc->beg_pos.lineno)) return; /* * if !branches[branch_id] @@ -680,13 +684,7 @@ add_trace_branch_coverage(rb_iseq_t *iseq, LINK_ANCHOR *const seq, const rb_code long counter_idx; if (NIL_P(branch)) { - branch = rb_ary_hidden_new(6); - rb_hash_aset(branches, key, branch); - rb_ary_push(branch, ID2SYM(rb_intern(type))); - rb_ary_push(branch, INT2FIX(first_lineno)); - rb_ary_push(branch, INT2FIX(first_column)); - rb_ary_push(branch, INT2FIX(last_lineno)); - rb_ary_push(branch, INT2FIX(last_column)); + branch = setup_branch(loc, type, branches, key); VALUE counters = RARRAY_AREF(ISEQ_BRANCH_COVERAGE(iseq), 1); counter_idx = RARRAY_LEN(counters); rb_ary_push(branch, LONG2FIX(counter_idx)); @@ -697,7 +695,7 @@ add_trace_branch_coverage(rb_iseq_t *iseq, LINK_ANCHOR *const seq, const rb_code } ADD_TRACE_WITH_DATA(seq, RUBY_EVENT_COVERAGE_BRANCH, counter_idx); - ADD_SYNTHETIC_INSN(seq, last_lineno, node_id, nop); + ADD_SYNTHETIC_INSN(seq, loc->end_pos.lineno, node_id, nop); } #define ISEQ_LAST_LINE(iseq) (ISEQ_COMPILE_DATA(iseq)->last_line) From a50a7c70702c51cca9058b1f070a8e32c64b9774 Mon Sep 17 00:00:00 2001 From: ydah Date: Thu, 26 Sep 2024 21:13:45 +0900 Subject: [PATCH 483/829] s/erorr/error/ --- proc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proc.c b/proc.c index fd1edb2bdc3d0a..b1956bb3468826 100644 --- a/proc.c +++ b/proc.c @@ -840,7 +840,7 @@ f_lambda_filter_non_literal(void) VALUE block_handler = rb_vm_frame_block_handler(cfp); if (block_handler == VM_BLOCK_HANDLER_NONE) { - // no block erorr raised else where + // no block error raised else where return; } From 0c25eb4ffe50d6628dbed0a20e310afeb5993825 Mon Sep 17 00:00:00 2001 From: ydah Date: Thu, 26 Sep 2024 21:12:00 +0900 Subject: [PATCH 484/829] s/interation/iteration/ --- hash.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hash.c b/hash.c index 3a8dfd59171e0c..36be9efcb6638f 100644 --- a/hash.c +++ b/hash.c @@ -64,7 +64,7 @@ * The bounds of the AR table. * 13-19: RHASH_LEV_MASK * The iterational level of the hash. Used to prevent modifications - * to the hash during interation. + * to the hash during iteration. */ #ifndef HASH_DEBUG From dc8fa59fb0f1844bb6c44ccba5982b9253f56da0 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Fri, 27 Sep 2024 13:14:01 +0900 Subject: [PATCH 485/829] Skip non-existent directories in PATH --- .github/actions/setup/directories/action.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/actions/setup/directories/action.yml b/.github/actions/setup/directories/action.yml index a4ac4a1d2fa4f3..dcc83d9dd3bb0d 100644 --- a/.github/actions/setup/directories/action.yml +++ b/.github/actions/setup/directories/action.yml @@ -138,7 +138,9 @@ runs: run: | sudo chmod -R go-w /usr/share chmod -v go-w $HOME $HOME/.config || : - sudo bash -c 'IFS=:; for d in '"$PATH"'; do chmod -v go-w $d; done' || : + SAVE_IFS="$IFS" IFS=:; set $PATH; dirs=() IFS="$SAVE_IFS" + for d do [ ! -d "$d" ] || dirs+=("$d"); done + sudo chmod -v go-w "${dirs[@]}" || : - if: inputs.dummy-files == 'true' shell: bash From 3209bb950b07e80a5c32f68e445718be03eb44f0 Mon Sep 17 00:00:00 2001 From: Nithin Bekal Date: Thu, 26 Sep 2024 23:37:36 -0400 Subject: [PATCH 486/829] [ruby/benchmark] Specify unit of time for Benchmark.realtime https://github.com/ruby/benchmark/commit/388236685c --- lib/benchmark.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/benchmark.rb b/lib/benchmark.rb index 9f43255e42e98b..b2c8df0347d4bc 100644 --- a/lib/benchmark.rb +++ b/lib/benchmark.rb @@ -307,6 +307,7 @@ def measure(label = "") # :yield: # # Returns the elapsed real time used to execute the given block. + # The unit of time is seconds. # def realtime # :yield: r0 = Process.clock_gettime(Process::CLOCK_MONOTONIC) From d7e5133d6d9ae882a5f8e1ae85d75104a1e36ec8 Mon Sep 17 00:00:00 2001 From: Nithin Bekal Date: Thu, 26 Sep 2024 23:39:21 -0400 Subject: [PATCH 487/829] [ruby/benchmark] Add example for Benchmark.realtime https://github.com/ruby/benchmark/commit/0f278be6c1 --- lib/benchmark.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/benchmark.rb b/lib/benchmark.rb index b2c8df0347d4bc..5072bdc2f383ed 100644 --- a/lib/benchmark.rb +++ b/lib/benchmark.rb @@ -309,6 +309,9 @@ def measure(label = "") # :yield: # Returns the elapsed real time used to execute the given block. # The unit of time is seconds. # + # Benchmark.realtime { "a" * 1_000_000_000 } + # #=> 0.5098029999935534 + # def realtime # :yield: r0 = Process.clock_gettime(Process::CLOCK_MONOTONIC) yield From 52bb90f92d9ebc8c06d1adf364b0e55c746c46b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=9C=E9=83=A8=E6=98=8C=E5=B9=B3?= Date: Fri, 12 Jul 2024 05:02:59 +0200 Subject: [PATCH 488/829] sequential execution of some CI tasks reduced parallelism from some 50-ish to 10-ish so that other jobs can run. --- .github/actions/compilers/action.yml | 94 +++ .github/actions/compilers/entrypoint.sh | 90 +++ .github/actions/setup/directories/action.yml | 2 +- .github/workflows/compilers.yml | 591 +++++++++++-------- 4 files changed, 521 insertions(+), 256 deletions(-) create mode 100644 .github/actions/compilers/action.yml create mode 100755 .github/actions/compilers/entrypoint.sh diff --git a/.github/actions/compilers/action.yml b/.github/actions/compilers/action.yml new file mode 100644 index 00000000000000..ecb8e4f485168b --- /dev/null +++ b/.github/actions/compilers/action.yml @@ -0,0 +1,94 @@ +name: Compiles ruby in a container +description: >- + Makes ruby using a dedicated container + +inputs: + tag: + required: false + default: clang-18 + description: >- + container image tag to use in this run. + + with_gcc: + required: false + description: >- + override compiler path & flags. + + CFLAGS: + required: false + description: >- + C compiler flags to override. + + CXXFLAGS: + required: false + description: >- + C++ compiler flags to override. + + optflags: + required: false + # -O1 is faster than -O3 in our tests... Majority of time are consumed trying + # to optimize binaries. Also GitHub Actions run on relatively modern CPUs + # compared to, say, GCC 4 or Clang 3. We don't specify `-march=native` + # because compilers tend not understand what the CPU is. + default: '-O1' + description: >- + Compiler flags for optimisations. + + cppflags: + required: false + description: >- + Additional preprocessor flags. + + append_configure: + required: false + default: >- + --without-valgrind + --without-jemalloc + --without-gmp + description: >- + flags to append to configure. + + enable_shared: + required: false + default: true + description: >- + Whether to build libruby.so. + + check: + required: false + default: '' + description: >- + Whether to run `make check` + + static_exts: + required: false + description: >- + whitespace separated list of extensions that need be linked statically. + +runs: + using: composite + steps: + - shell: bash + run: docker pull --quiet 'ghcr.io/ruby/ruby-ci-image:${{ inputs.tag }}' + + - name: compile + shell: bash + run: >- + docker run + --rm + --user=root + --volume '${{ github.workspace }}:/github/workspace:ro' + --workdir=/github/workspace + --entrypoint=/github/workspace/.github/actions/compilers/entrypoint.sh + --env CI + --env GITHUB_ACTION + --env INPUT_WITH_GCC='${{ inputs.with_gcc || inputs.tag }}' + --env INPUT_CFLAGS='${{ inputs.CFLAGS }}' + --env INPUT_CXXFLAGS='${{ inputs.CXXFLAGS }}' + --env INPUT_OPTFLAGS='${{ inputs.OPTFLAGS }}' + --env INPUT_CPPFLAGS='${{ inputs.cppflags }}' + --env INPUT_APPEND_CONFIGURE='${{ inputs.append_configure }}' + --env INPUT_CHECK='${{ inputs.check }}' + --env INPUT_ENABLE_SHARED='${{ inputs.enable_shared }}' + --env INPUT_STATIC_EXTS='${{ inputs.static_exts }}' + 'ghcr.io/ruby/ruby-ci-image:${{ inputs.tag }}' diff --git a/.github/actions/compilers/entrypoint.sh b/.github/actions/compilers/entrypoint.sh new file mode 100755 index 00000000000000..8e5b93f3997c85 --- /dev/null +++ b/.github/actions/compilers/entrypoint.sh @@ -0,0 +1,90 @@ +#! /bin/bash + +# Copyright (c) 2024 Ruby developers. All rights reserved. +# +# This file is a part of the programming language Ruby. Permission is hereby +# granted, to either redistribute and/or modify this file, provided that the +# conditions mentioned in the file COPYING are met. Consult the file for +# details. + +grouped() +{ + echo "::group::${@}" + "${@}" + echo "::endgroup::" +} + +set -e +set -u +set -o pipefail + +srcdir="/github/workspace/src" +builddir="$(mktemp -dt)" + +export GITHUB_WORKFLOW='Compilations' +export CONFIGURE_TTY='never' +export RUBY_DEBUG='ci rgengc' +export RUBY_TESTOPTS='-q --color=always --tty=no' +export RUBY_DEBUG_COUNTER_DISABLE='1' +export GNUMAKEFLAGS="-j$((1 + $(nproc --all)))" + +case "x${INPUT_ENABLE_SHARED}" in +x | xno | xfalse ) + enable_shared='--disable-shared' + ;; +*) + enable_shared='--enable-shared' + ;; +esac + +pushd ${builddir} + +grouped ${srcdir}/configure \ + -C \ + --with-gcc="${INPUT_WITH_GCC}" \ + --enable-debug-env \ + --disable-install-doc \ + --with-ext=-test-/cxxanyargs,+ \ + ${enable_shared} \ + ${INPUT_APPEND_CONFIGURE} \ + CFLAGS="${INPUT_CFLAGS}" \ + CXXFLAGS="${INPUT_CXXFLAGS}" \ + optflags="${INPUT_OPTFLAGS}" \ + cppflags="${INPUT_CPPFLAGS}" \ + debugflags='-ggdb3' # -g0 disables backtraces when SEGV. Do not set that. + +popd + +if [[ -n "${INPUT_STATIC_EXTS}" ]]; then + echo "::group::ext/Setup" + set -x + mkdir ${builddir}/ext + ( + for ext in ${INPUT_STATIC_EXTS}; do + echo "${ext}" + done + ) >> ${builddir}/ext/Setup + set +x + echo "::endgroup::" +fi + +pushd ${builddir} + +case "${INPUT_APPEND_CONFIGURE}" in +*--with-shared-gc*) + export RUBY_GC_LIBRARY='librubygc.default.so' + mkdir -p /home/runner/shared-gc + grouped make shared-gc SHARED_GC=default + ;; +esac + +grouped make showflags +grouped make all +grouped make test + +[[ -z "${INPUT_CHECK}" ]] && exit 0 + +grouped make install +grouped make test-tool +grouped make test-all TESTS='-- ruby -ext-' +grouped env CHECK_LEAKS=true make test-spec diff --git a/.github/actions/setup/directories/action.yml b/.github/actions/setup/directories/action.yml index dcc83d9dd3bb0d..d54c0f93f8aa8d 100644 --- a/.github/actions/setup/directories/action.yml +++ b/.github/actions/setup/directories/action.yml @@ -101,7 +101,7 @@ runs: - if: steps.which.outputs.autoreconf shell: bash working-directory: ${{ inputs.srcdir }} - run: ./autogen.sh + run: ./autogen.sh --install # This is for MinGW. - if: runner.os == 'Windows' diff --git a/.github/workflows/compilers.yml b/.github/workflows/compilers.yml index 8dee2420c2ef6c..8b543d25749ce2 100644 --- a/.github/workflows/compilers.yml +++ b/.github/workflows/compilers.yml @@ -24,200 +24,14 @@ concurrency: group: ${{ github.workflow }} / ${{ startsWith(github.event_name, 'pull') && github.ref_name || github.sha }} cancel-in-progress: ${{ startsWith(github.event_name, 'pull') }} -# GitHub actions does not support YAML anchors. This creative use of -# environment variables (plus the "echo $GITHUB_ENV" hack) is to reroute that -# restriction. -env: - default_cc: clang-18 - append_cc: '' - - # -O1 is faster than -O3 in our tests... Majority of time are consumed trying - # to optimize binaries. Also GitHub Actions run on relatively modern CPUs - # compared to, say, GCC 4 or Clang 3. We don't specify `-march=native` - # because compilers tend not understand what the CPU is. - optflags: '-O1' - - # -g0 disables backtraces when SEGV. Do not set that. - debugflags: '-ggdb3' - - default_configure: >- - --enable-debug-env - --disable-install-doc - --with-ext=-test-/cxxanyargs,+ - append_configure: >- - --without-valgrind - --without-jemalloc - --without-gmp - - CONFIGURE_TTY: never - GITPULLOPTIONS: --no-tags origin ${{ github.ref }} - RUBY_DEBUG: ci rgengc - RUBY_TESTOPTS: >- - -q - --color=always - --tty=no - permissions: contents: read +# Each job is split so that they roughly take 30min to run through. jobs: - compile: - strategy: - fail-fast: false - matrix: - env: - - {} - entry: - - { name: gcc-13, env: { default_cc: gcc-13 } } - - { name: gcc-12, env: { default_cc: gcc-12 } } - - { name: gcc-11, env: { default_cc: gcc-11 } } - - { name: gcc-10, env: { default_cc: gcc-10 } } - - { name: gcc-9, env: { default_cc: gcc-9 } } - - { name: gcc-8, env: { default_cc: gcc-8 } } - - { name: gcc-7, env: { default_cc: gcc-7 } } - - name: 'gcc-13 LTO' - container: gcc-13 - env: - default_cc: 'gcc-13 -flto=auto -ffat-lto-objects -Werror=lto-type-mismatch' - optflags: '-O2' - shared: disable - # check: true - - { name: clang-19, env: { default_cc: clang-19 } } - - { name: clang-18, env: { default_cc: clang-18 } } - - { name: clang-17, env: { default_cc: clang-17 } } - - { name: clang-16, env: { default_cc: clang-16 } } - - { name: clang-15, env: { default_cc: clang-15 } } - - { name: clang-14, env: { default_cc: clang-14 } } - - { name: clang-13, env: { default_cc: clang-13 } } - - { name: clang-12, env: { default_cc: clang-12 } } - - { name: clang-11, env: { default_cc: clang-11 } } - - { name: clang-10, env: { default_cc: clang-10 } } - # llvm-objcopy<=9 doesn't have --wildcard. It compiles, but leaves Rust symbols in libyjit.o. - - { name: clang-9, env: { default_cc: clang-9, append_configure: '--disable-yjit' } } - - { name: clang-8, env: { default_cc: clang-8, append_configure: '--disable-yjit' } } - - { name: clang-7, env: { default_cc: clang-7, append_configure: '--disable-yjit' } } - - { name: clang-6.0, env: { default_cc: clang-6.0, append_configure: '--disable-yjit' } } - - name: 'clang-18 LTO' - container: clang-18 - env: - default_cc: 'clang-18 -flto=auto' - optflags: '-O2' - shared: disable - # check: true - - - { name: ext/Setup, static-exts: 'etc,json/*,*/escape' } - -# - { name: aarch64-linux-gnu, crosshost: aarch64-linux-gnu, container: crossbuild-essential-arm64 } -# - { name: arm-linux-gnueabi, crosshost: arm-linux-gnueabi } -# - { name: arm-linux-gnueabihf, crosshost: arm-linux-gnueabihf } -# - { name: i686-w64-mingw32, crosshost: i686-w64-mingw32 } -# - { name: powerpc-linux-gnu, crosshost: powerpc-linux-gnu } -# - { name: powerpc64le-linux-gnu, crosshost: powerpc64le-linux-gnu, container: crossbuild-essential-ppc64el } -# - { name: s390x-linux-gnu, crosshost: s390x-linux-gnu, container: crossbuild-essential-s390x } -# - { name: x86_64-w64-mingw32, crosshost: x86_64-w64-mingw32, container: mingw-w64 } - - # -Wno-strict-prototypes is necessary with current clang-15 since - # older autoconf generate functions without prototype and -pedantic - # now implies strict-prototypes. Disabling the error but leaving the - # warning generates a lot of noise from use of ANYARGS in - # rb_define_method() and friends. - # See: https://github.com/llvm/llvm-project/commit/11da1b53d8cd3507959022cd790d5a7ad4573d94 - - { name: c99, env: { CFLAGS: '-std=c99 -Werror=pedantic -pedantic-errors -Wno-strict-prototypes' } } -# - { name: c11, env: { CFLAGS: '-std=c11 -Werror=pedantic -pedantic-errors -Wno-strict-prototypes' } } -# - { name: c17, env: { CFLAGS: '-std=c17 -Werror=pedantic -pedantic-errors -Wno-strict-prototypes' } } - - { name: c23, env: { CFLAGS: '-std=c2x -Werror=pedantic -pedantic-errors -Wno-strict-prototypes' } } - - { name: c++98, env: { CXXFLAGS: '-std=c++98 -Werror=pedantic -pedantic-errors -Wno-c++11-long-long' } } -# - { name: c++11, env: { CXXFLAGS: '-std=c++11 -Werror=pedantic -pedantic-errors -Wno-c++11-long-long' } } -# - { name: c++14, env: { CXXFLAGS: '-std=c++14 -Werror=pedantic -pedantic-errors -Wno-c++11-long-long' } } -# - { name: c++17, env: { CXXFLAGS: '-std=c++17 -Werror=pedantic -pedantic-errors -Wno-c++11-long-long' } } -# - { name: c++20, env: { CXXFLAGS: '-std=c++20 -Werror=pedantic -pedantic-errors -Wno-c++11-long-long' } } -# - { name: c++23, env: { CXXFLAGS: '-std=c++23 -Werror=pedantic -pedantic-errors -Wno-c++11-long-long' } } - - { name: c++26, env: { CXXFLAGS: '-std=c++26 -Werror=pedantic -pedantic-errors -Wno-c++11-long-long' } } - - - { name: '-O0', env: { optflags: '-O0 -march=x86-64 -mtune=generic' } } -# - { name: '-O3', env: { optflags: '-O3 -march=x86-64 -mtune=generic' }, check: true } - - - { name: gmp, env: { append_configure: '--with-gmp' }, check: 'ruby/test_bignum.rb' } - - { name: jemalloc, env: { append_configure: '--with-jemalloc' } } - - { name: valgrind, env: { append_configure: '--with-valgrind' } } - - { name: 'coroutine=ucontext', env: { append_configure: '--with-coroutine=ucontext' } } - - { name: 'coroutine=pthread', env: { append_configure: '--with-coroutine=pthread' } } - - { name: disable-jit, env: { append_configure: '--disable-yjit --disable-rjit' } } - - { name: disable-dln, env: { append_configure: '--disable-dln' } } - - { name: enable-mkmf-verbose, env: { append_configure: '--enable-mkmf-verbose' } } - - { name: disable-rubygems, env: { append_configure: '--disable-rubygems' } } - - { name: RUBY_DEVEL, env: { append_configure: '--enable-devel' } } - - - { name: OPT_THREADED_CODE=0, env: { cppflags: '-DOPT_THREADED_CODE=0' } } - - { name: OPT_THREADED_CODE=1, env: { cppflags: '-DOPT_THREADED_CODE=1' } } - - { name: OPT_THREADED_CODE=2, env: { cppflags: '-DOPT_THREADED_CODE=2' } } - - - { name: NDEBUG, env: { cppflags: '-DNDEBUG' } } - - { name: RUBY_DEBUG, env: { cppflags: '-DRUBY_DEBUG' } } -# - { name: ARRAY_DEBUG, env: { cppflags: '-DARRAY_DEBUG' } } -# - { name: BIGNUM_DEBUG, env: { cppflags: '-DBIGNUM_DEBUG' } } -# - { name: CCAN_LIST_DEBUG, env: { cppflags: '-DCCAN_LIST_DEBUG' } } -# - { name: CPDEBUG=-1, env: { cppflags: '-DCPDEBUG=-1' } } -# - { name: ENC_DEBUG, env: { cppflags: '-DENC_DEBUG' } } -# - { name: GC_DEBUG, env: { cppflags: '-DGC_DEBUG' } } -# - { name: HASH_DEBUG, env: { cppflags: '-DHASH_DEBUG' } } -# - { name: ID_TABLE_DEBUG, env: { cppflags: '-DID_TABLE_DEBUG' } } -# - { name: RGENGC_DEBUG=-1, env: { cppflags: '-DRGENGC_DEBUG=-1' } } -# - { name: SYMBOL_DEBUG, env: { cppflags: '-DSYMBOL_DEBUG' } } - -# - { name: RGENGC_CHECK_MODE, env: { cppflags: '-DRGENGC_CHECK_MODE' } } -# - { name: VM_CHECK_MODE, env: { cppflags: '-DVM_CHECK_MODE' } } - -# - { name: USE_EMBED_CI=0, env: { cppflags: '-DUSE_EMBED_CI=0' } } - - name: USE_FLONUM=0 - env: - cppflags: '-DUSE_FLONUM=0' - # yjit requires FLONUM for the pointer tagging scheme - append_configure: '--disable-yjit' -# - { name: USE_GC_MALLOC_OBJ_INFO_DETAILS, env: { cppflags: '-DUSE_GC_MALLOC_OBJ_INFO_DETAILS' } } -# - { name: USE_LAZY_LOAD, env: { cppflags: '-DUSE_LAZY_LOAD' } } -# - { name: USE_SYMBOL_GC=0, env: { cppflags: '-DUSE_SYMBOL_GC=0' } } -# - { name: USE_THREAD_CACHE=0, env: { cppflags: '-DUSE_THREAD_CACHE=0' } } - - { name: USE_RUBY_DEBUG_LOG=1, env: { cppflags: '-DUSE_RUBY_DEBUG_LOG=1' } } -# - { name: USE_DEBUG_COUNTER, env: { cppflags: '-DUSE_DEBUG_COUNTER=1', RUBY_DEBUG_COUNTER_DISABLE: '1' } } - - { name: SHARABLE_MIDDLE_SUBSTRING, env: { cppflags: '-DSHARABLE_MIDDLE_SUBSTRING=1' } } - -# - { name: DEBUG_FIND_TIME_NUMGUESS, env: { cppflags: '-DDEBUG_FIND_TIME_NUMGUESS' } } -# - { name: DEBUG_INTEGER_PACK, env: { cppflags: '-DDEBUG_INTEGER_PACK' } } -# - { name: ENABLE_PATH_CHECK, env: { cppflags: '-DENABLE_PATH_CHECK' } } - -# - { name: GC_DEBUG_STRESS_TO_CLASS, env: { cppflags: '-DGC_DEBUG_STRESS_TO_CLASS' } } -# - { name: GC_ENABLE_LAZY_SWEEP=0, env: { cppflags: '-DGC_ENABLE_LAZY_SWEEP=0' } } -# - { name: GC_PROFILE_DETAIL_MEMOTY, env: { cppflags: '-DGC_PROFILE_DETAIL_MEMOTY' } } -# - { name: GC_PROFILE_MORE_DETAIL, env: { cppflags: '-DGC_PROFILE_MORE_DETAIL' } } - -# - { name: CALC_EXACT_MALLOC_SIZE, env: { cppflags: '-DCALC_EXACT_MALLOC_SIZE' } } -# - { name: MALLOC_ALLOCATED_SIZE_CHECK, env: { cppflags: '-DMALLOC_ALLOCATED_SIZE_CHECK' } } - -# - { name: IBF_ISEQ_ENABLE_LOCAL_BUFFER, env: { cppflags: '-DIBF_ISEQ_ENABLE_LOCAL_BUFFER' } } - -# - { name: RGENGC_ESTIMATE_OLDMALLOC, env: { cppflags: '-DRGENGC_ESTIMATE_OLDMALLOC' } } -# - { name: RGENGC_FORCE_MAJOR_GC, env: { cppflags: '-DRGENGC_FORCE_MAJOR_GC' } } -# - { name: RGENGC_OBJ_INFO, env: { cppflags: '-DRGENGC_OBJ_INFO' } } -# - { name: RGENGC_PROFILE, env: { cppflags: '-DRGENGC_PROFILE' } } - -# - { name: VM_DEBUG_BP_CHECK, env: { cppflags: '-DVM_DEBUG_BP_CHECK' } } -# - { name: VM_DEBUG_VERIFY_METHOD_CACHE, env: { cppflags: '-DVM_DEBUG_VERIFY_METHOD_CACHE' } } - - - { name: enable-yjit, env: { append_configure: '--enable-yjit --disable-rjit' } } - - { name: enable-rjit, env: { append_configure: '--enable-rjit --disable-yjit' } } - - { name: YJIT_FORCE_ENABLE, env: { cppflags: '-DYJIT_FORCE_ENABLE' } } -# - { name: RJIT_FORCE_ENABLE, env: { cppflags: '-DRJIT_FORCE_ENABLE' } } - - { name: UNIVERSAL_PARSER, env: { cppflags: '-DUNIVERSAL_PARSER' } } - - name: ${{ matrix.entry.name }} - + compile1: + name: 'omnibus compilations, #1' runs-on: ubuntu-latest - - container: - image: ghcr.io/ruby/ruby-ci-image:${{ matrix.entry.container || matrix.entry.env.default_cc || 'clang-18' }} - options: --user root - if: >- ${{!(false || contains(github.event.head_commit.message, '[DOC]') @@ -227,80 +41,347 @@ jobs: || contains(github.event.pull_request.labels.*.name, 'Document') || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} - - env: ${{ matrix.entry.env || matrix.env }} - + services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } steps: - - run: id - working-directory: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + with: { sparse-checkout-cone-mode: false, sparse-checkout: /.github } + - { uses: './.github/actions/setup/directories', with: { srcdir: 'src', builddir: 'build', makeup: true } } + - name: 'clang 18 LTO' + uses: './.github/actions/compilers' with: - sparse-checkout-cone-mode: false - sparse-checkout: /.github - - - uses: ./.github/actions/setup/directories + tag: clang-18 + with_gcc: 'clang-18 -flto=auto' + optflags: '-O2' + enable_shared: false + - name: 'GCC 13 LTO' + uses: './.github/actions/compilers' with: - srcdir: src - builddir: build - makeup: true - clean: true - - - name: Run configure - run: > - ../src/configure -C ${default_configure} ${append_configure} - --${{ - matrix.entry.crosshost && 'host' || 'with-gcc' - }}=${{ - matrix.entry.crosshost || '"${default_cc}${append_cc:+ $append_cc}"' - }} - --${{ matrix.entry.shared || 'enable' }}-shared - - - name: Add to ext/Setup - id: ext-setup - run: | - mkdir ext - cd ext - for ext in {${{ matrix.entry.static-exts }}}; do - echo "${ext}" - done >> Setup - if: ${{ (matrix.entry.static-exts || '') != '' }} - - - name: Clean up ext/Setup - uses: gacts/run-and-post-run@4683764dd706df847f57b9bed39d08164bcd2690 # v1.4.1 - with: - shell: bash - working-directory: build - post: rm ext/Setup - if: ${{ steps.ext-setup.outcome == 'success' }} - - - run: make showflags - - - run: make - - - run: make test - - - run: make install - if: ${{ matrix.entry.check }} - - - run: make test-tool - if: ${{ matrix.entry.check }} - - - run: make test-all TESTS="-- $tests" - if: ${{ matrix.entry.check }} - env: - tests: ${{ matrix.entry.check == true && 'ruby -ext-' || matrix.entry.check }} - - - run: make test-spec - env: - CHECK_LEAKS: true - if: ${{ matrix.entry.check }} + tag: gcc-13 + with_gcc: 'gcc-13 -flto=auto -ffat-lto-objects -Werror=lto-type-mismatch' + optflags: '-O2' + enable_shared: false + compile2: + name: 'omnibus compilations, #2' + runs-on: ubuntu-latest + if: >- + ${{!(false + || contains(github.event.head_commit.message, '[DOC]') + || contains(github.event.head_commit.message, 'Document') + || contains(github.event.pull_request.title, '[DOC]') + || contains(github.event.pull_request.title, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Document') + || (github.event_name == 'push' && github.actor == 'dependabot[bot]') + )}} + services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } + steps: + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + with: { sparse-checkout-cone-mode: false, sparse-checkout: /.github } + - { uses: './.github/actions/setup/directories', with: { srcdir: 'src', builddir: 'build', makeup: true } } + - { uses: './.github/actions/compilers', name: 'GCC 13', with: { tag: 'gcc-13' } } + - { uses: './.github/actions/compilers', name: 'GCC 12', with: { tag: 'gcc-12' } } + - { uses: './.github/actions/compilers', name: 'GCC 11', with: { tag: 'gcc-11' } } + - { uses: './.github/actions/compilers', name: 'GCC 10', with: { tag: 'gcc-10' } } + - { uses: './.github/actions/compilers', name: 'GCC 9', with: { tag: 'gcc-9' } } + - { uses: './.github/actions/compilers', name: 'GCC 8', with: { tag: 'gcc-8' } } + - { uses: './.github/actions/compilers', name: 'GCC 7', with: { tag: 'gcc-7' } } + + compile3: + name: 'omnibus compilations, #3' + runs-on: ubuntu-latest + if: >- + ${{!(false + || contains(github.event.head_commit.message, '[DOC]') + || contains(github.event.head_commit.message, 'Document') + || contains(github.event.pull_request.title, '[DOC]') + || contains(github.event.pull_request.title, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Document') + || (github.event_name == 'push' && github.actor == 'dependabot[bot]') + )}} + services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } + steps: + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + with: { sparse-checkout-cone-mode: false, sparse-checkout: /.github } + - { uses: './.github/actions/setup/directories', with: { srcdir: 'src', builddir: 'build', makeup: true } } + - { uses: './.github/actions/compilers', name: 'clang 19', with: { tag: 'clang-19' } } + - { uses: './.github/actions/compilers', name: 'clang 18', with: { tag: 'clang-18' } } + - { uses: './.github/actions/compilers', name: 'clang 17', with: { tag: 'clang-17' } } + - { uses: './.github/actions/compilers', name: 'clang 16', with: { tag: 'clang-16' } } + - { uses: './.github/actions/compilers', name: 'clang 15', with: { tag: 'clang-15' } } + - { uses: './.github/actions/compilers', name: 'clang 14', with: { tag: 'clang-14' } } + - { uses: './.github/actions/compilers', name: 'clang 13', with: { tag: 'clang-13' } } + - { uses: './.github/actions/compilers', name: 'clang 12', with: { tag: 'clang-12' } } + + compile4: + name: 'omnibus compilations, #4' + runs-on: ubuntu-latest + if: >- + ${{!(false + || contains(github.event.head_commit.message, '[DOC]') + || contains(github.event.head_commit.message, 'Document') + || contains(github.event.pull_request.title, '[DOC]') + || contains(github.event.pull_request.title, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Document') + || (github.event_name == 'push' && github.actor == 'dependabot[bot]') + )}} + services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } + steps: + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + with: { sparse-checkout-cone-mode: false, sparse-checkout: /.github } + - { uses: './.github/actions/setup/directories', with: { srcdir: 'src', builddir: 'build', makeup: true } } + - { uses: './.github/actions/compilers', name: 'clang 11', with: { tag: 'clang-11' } } + - { uses: './.github/actions/compilers', name: 'clang 10', with: { tag: 'clang-10' } } + # llvm-objcopy<=9 doesn't have --wildcard. It compiles, but leaves Rust symbols in libyjit.o. + - { uses: './.github/actions/compilers', name: 'clang 9', with: { tag: 'clang-9', append_configure: '--disable-yjit' } } + - { uses: './.github/actions/compilers', name: 'clang 8', with: { tag: 'clang-8', append_configure: '--disable-yjit' } } + - { uses: './.github/actions/compilers', name: 'clang 7', with: { tag: 'clang-7', append_configure: '--disable-yjit' } } + - { uses: './.github/actions/compilers', name: 'clang 6', with: { tag: 'clang-6.0', append_configure: '--disable-yjit' } } + - { uses: './.github/actions/compilers', name: 'ext/Setup', with: { static_exts: 'etc json/* */escape' } } + + compile5: + name: 'omnibus compilations, #5' + runs-on: ubuntu-latest + if: >- + ${{!(false + || contains(github.event.head_commit.message, '[DOC]') + || contains(github.event.head_commit.message, 'Document') + || contains(github.event.pull_request.title, '[DOC]') + || contains(github.event.pull_request.title, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Document') + || (github.event_name == 'push' && github.actor == 'dependabot[bot]') + )}} + services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } + steps: + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + with: { sparse-checkout-cone-mode: false, sparse-checkout: /.github } + - { uses: './.github/actions/setup/directories', with: { srcdir: 'src', builddir: 'build', makeup: true } } + # -Wno-strict-prototypes is necessary with current clang-15 since + # older autoconf generate functions without prototype and -pedantic + # now implies strict-prototypes. Disabling the error but leaving the + # warning generates a lot of noise from use of ANYARGS in + # rb_define_method() and friends. + # See: https://github.com/llvm/llvm-project/commit/11da1b53d8cd3507959022cd790d5a7ad4573d94 + - { uses: './.github/actions/compilers', name: 'C99', with: { CFLAGS: '-std=c99 -Werror=pedantic -pedantic-errors -Wno-strict-prototypes' } } + - { uses: './.github/actions/compilers', name: 'C11', with: { CFLAGS: '-std=c11 -Werror=pedantic -pedantic-errors -Wno-strict-prototypes' } } + - { uses: './.github/actions/compilers', name: 'C17', with: { CFLAGS: '-std=c17 -Werror=pedantic -pedantic-errors -Wno-strict-prototypes' } } + - { uses: './.github/actions/compilers', name: 'C23', with: { CFLAGS: '-std=c2x -Werror=pedantic -pedantic-errors -Wno-strict-prototypes' } } + - { uses: './.github/actions/compilers', name: 'C++98', with: { CXXFLAGS: '-std=c++98 -Werror=pedantic -pedantic-errors -Wno-c++11-long-long' } } + - { uses: './.github/actions/compilers', name: 'C++11', with: { CXXFLAGS: '-std=c++11 -Werror=pedantic -pedantic-errors -Wno-c++11-long-long' } } + - { uses: './.github/actions/compilers', name: 'C++14', with: { CXXFLAGS: '-std=c++14 -Werror=pedantic -pedantic-errors -Wno-c++11-long-long' } } + - { uses: './.github/actions/compilers', name: 'C++17', with: { CXXFLAGS: '-std=c++17 -Werror=pedantic -pedantic-errors -Wno-c++11-long-long' } } + - { uses: './.github/actions/compilers', name: 'C++20', with: { CXXFLAGS: '-std=c++20 -Werror=pedantic -pedantic-errors -Wno-c++11-long-long' } } + - { uses: './.github/actions/compilers', name: 'C++23', with: { CXXFLAGS: '-std=c++23 -Werror=pedantic -pedantic-errors -Wno-c++11-long-long' } } + - { uses: './.github/actions/compilers', name: 'C++26', with: { CXXFLAGS: '-std=c++26 -Werror=pedantic -pedantic-errors -Wno-c++11-long-long' } } + + compile6: + name: 'omnibus compilations, #6' + runs-on: ubuntu-latest + if: >- + ${{!(false + || contains(github.event.head_commit.message, '[DOC]') + || contains(github.event.head_commit.message, 'Document') + || contains(github.event.pull_request.title, '[DOC]') + || contains(github.event.pull_request.title, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Document') + || (github.event_name == 'push' && github.actor == 'dependabot[bot]') + )}} + services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } + steps: + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + with: { sparse-checkout-cone-mode: false, sparse-checkout: /.github } + - { uses: './.github/actions/setup/directories', with: { srcdir: 'src', builddir: 'build', makeup: true } } + - { uses: './.github/actions/compilers', name: '-O0', with: { optflags: '-O0 -march=x86-64 -mtune=generic' } } + - { uses: './.github/actions/compilers', name: '-O3', with: { optflags: '-O3 -march=x86-64 -mtune=generic', check: true } } + - { uses: './.github/actions/compilers', name: 'gmp', with: { append_configure: '--with-gmp', check: 'ruby/test_bignum.rb' } } + - { uses: './.github/actions/compilers', name: 'jemalloc', with: { append_configure: '--with-jemalloc' } } + - { uses: './.github/actions/compilers', name: 'valgrind', with: { append_configure: '--with-valgrind' } } + - { uses: './.github/actions/compilers', name: 'coroutine=ucontext', with: { append_configure: '--with-coroutine=ucontext' } } + - { uses: './.github/actions/compilers', name: 'coroutine=pthread', with: { append_configure: '--with-coroutine=pthread' } } + + compile7: + name: 'omnibus compilations, #7' + runs-on: ubuntu-latest + if: >- + ${{!(false + || contains(github.event.head_commit.message, '[DOC]') + || contains(github.event.head_commit.message, 'Document') + || contains(github.event.pull_request.title, '[DOC]') + || contains(github.event.pull_request.title, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Document') + || (github.event_name == 'push' && github.actor == 'dependabot[bot]') + )}} + services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } + steps: + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + with: { sparse-checkout-cone-mode: false, sparse-checkout: /.github } + - { uses: './.github/actions/setup/directories', with: { srcdir: 'src', builddir: 'build', makeup: true } } + - { uses: './.github/actions/compilers', name: 'disable-jit', with: { append_configure: '--disable-yjit --disable-rjit' } } + - { uses: './.github/actions/compilers', name: 'disable-dln', with: { append_configure: '--disable-dln' } } + - { uses: './.github/actions/compilers', name: 'enable-mkmf-verbose', with: { append_configure: '--enable-mkmf-verbose' } } + - { uses: './.github/actions/compilers', name: 'disable-rubygems', with: { append_configure: '--disable-rubygems' } } + - { uses: './.github/actions/compilers', name: 'RUBY_DEVEL', with: { append_configure: '--enable-devel' } } + - { uses: './.github/actions/compilers', name: 'SHARED_GC', with: { append_configure: '--with-shared-gc=/home/runner/shared-gc' } } + - { uses: './.github/actions/compilers', name: 'OPT_THREADED_CODE=0', with: { cppflags: '-DOPT_THREADED_CODE=0' } } + - { uses: './.github/actions/compilers', name: 'OPT_THREADED_CODE=1', with: { cppflags: '-DOPT_THREADED_CODE=1' } } + - { uses: './.github/actions/compilers', name: 'OPT_THREADED_CODE=2', with: { cppflags: '-DOPT_THREADED_CODE=2' } } + + compile8: + name: 'omnibus compilations, #8' + runs-on: ubuntu-latest + if: >- + ${{!(false + || contains(github.event.head_commit.message, '[DOC]') + || contains(github.event.head_commit.message, 'Document') + || contains(github.event.pull_request.title, '[DOC]') + || contains(github.event.pull_request.title, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Document') + || (github.event_name == 'push' && github.actor == 'dependabot[bot]') + )}} + services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } + steps: + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + with: { sparse-checkout-cone-mode: false, sparse-checkout: /.github } + - { uses: './.github/actions/setup/directories', with: { srcdir: 'src', builddir: 'build', makeup: true } } + - { uses: './.github/actions/compilers', name: 'NDEBUG', with: { cppflags: '-DNDEBUG' } } + - { uses: './.github/actions/compilers', name: 'RUBY_DEBUG', with: { cppflags: '-DRUBY_DEBUG' } } + - { uses: './.github/actions/compilers', name: 'ARRAY_DEBUG', with: { cppflags: '-DARRAY_DEBUG' } } + - { uses: './.github/actions/compilers', name: 'BIGNUM_DEBUG', with: { cppflags: '-DBIGNUM_DEBUG' } } + - { uses: './.github/actions/compilers', name: 'CCAN_LIST_DEBUG', with: { cppflags: '-DCCAN_LIST_DEBUG' } } + - { uses: './.github/actions/compilers', name: 'CPDEBUG=-1', with: { cppflags: '-DCPDEBUG=-1' } } + - { uses: './.github/actions/compilers', name: 'ENC_DEBUG', with: { cppflags: '-DENC_DEBUG' } } + - { uses: './.github/actions/compilers', name: 'GC_DEBUG', with: { cppflags: '-DGC_DEBUG' } } + - { uses: './.github/actions/compilers', name: 'HASH_DEBUG', with: { cppflags: '-DHASH_DEBUG' } } + - { uses: './.github/actions/compilers', name: 'ID_TABLE_DEBUG', with: { cppflags: '-DID_TABLE_DEBUG' } } + + compile9: + name: 'omnibus compilations, #9' + runs-on: ubuntu-latest + if: >- + ${{!(false + || contains(github.event.head_commit.message, '[DOC]') + || contains(github.event.head_commit.message, 'Document') + || contains(github.event.pull_request.title, '[DOC]') + || contains(github.event.pull_request.title, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Document') + || (github.event_name == 'push' && github.actor == 'dependabot[bot]') + )}} + services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } + steps: + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + with: { sparse-checkout-cone-mode: false, sparse-checkout: /.github } + - { uses: './.github/actions/setup/directories', with: { srcdir: 'src', builddir: 'build', makeup: true } } + - { uses: './.github/actions/compilers', name: 'RGENGC_DEBUG=-1', with: { cppflags: '-DRGENGC_DEBUG=-1' } } + - { uses: './.github/actions/compilers', name: 'SYMBOL_DEBUG', with: { cppflags: '-DSYMBOL_DEBUG' } } + - { uses: './.github/actions/compilers', name: 'RGENGC_CHECK_MODE', with: { cppflags: '-DRGENGC_CHECK_MODE' } } + - { uses: './.github/actions/compilers', name: 'VM_CHECK_MODE', with: { cppflags: '-DVM_CHECK_MODE' } } + - { uses: './.github/actions/compilers', name: 'USE_EMBED_CI=0', with: { cppflags: '-DUSE_EMBED_CI=0' } } + - { uses: './.github/actions/compilers', name: 'USE_FLONUM=0', with: { cppflags: '-DUSE_FLONUM=0', append_configure: '--disable-yjit' } } + - { uses: './.github/actions/compilers', name: 'USE_LAZY_LOAD', with: { cppflags: '-DUSE_LAZY_LOAD' } } + - { uses: './.github/actions/compilers', name: 'USE_SYMBOL_GC=0', with: { cppflags: '-DUSE_SYMBOL_GC=0' } } + - { uses: './.github/actions/compilers', name: 'USE_THREAD_CACHE=0', with: { cppflags: '-DUSE_THREAD_CACHE=0' } } + + compileX: + name: 'omnibus compilations, #10' + runs-on: ubuntu-latest + if: >- + ${{!(false + || contains(github.event.head_commit.message, '[DOC]') + || contains(github.event.head_commit.message, 'Document') + || contains(github.event.pull_request.title, '[DOC]') + || contains(github.event.pull_request.title, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Document') + || (github.event_name == 'push' && github.actor == 'dependabot[bot]') + )}} + services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } + steps: + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + with: { sparse-checkout-cone-mode: false, sparse-checkout: /.github } + - { uses: './.github/actions/setup/directories', with: { srcdir: 'src', builddir: 'build', makeup: true } } + - { uses: './.github/actions/compilers', name: 'USE_RUBY_DEBUG_LOG=1', with: { cppflags: '-DUSE_RUBY_DEBUG_LOG=1' } } + - { uses: './.github/actions/compilers', name: 'USE_DEBUG_COUNTER', with: { cppflags: '-DUSE_DEBUG_COUNTER=1' } } + - { uses: './.github/actions/compilers', name: 'SHARABLE_MIDDLE_SUBSTRING', with: { cppflags: '-DSHARABLE_MIDDLE_SUBSTRING=1' } } + - { uses: './.github/actions/compilers', name: 'DEBUG_FIND_TIME_NUMGUESS', with: { cppflags: '-DDEBUG_FIND_TIME_NUMGUESS' } } + - { uses: './.github/actions/compilers', name: 'DEBUG_INTEGER_PACK', with: { cppflags: '-DDEBUG_INTEGER_PACK' } } + - { uses: './.github/actions/compilers', name: 'ENABLE_PATH_CHECK', with: { cppflags: '-DENABLE_PATH_CHECK' } } + - { uses: './.github/actions/compilers', name: 'GC_DEBUG_STRESS_TO_CLASS', with: { cppflags: '-DGC_DEBUG_STRESS_TO_CLASS' } } + - { uses: './.github/actions/compilers', name: 'GC_ENABLE_LAZY_SWEEP=0', with: { cppflags: '-DGC_ENABLE_LAZY_SWEEP=0' } } + - { uses: './.github/actions/compilers', name: 'GC_PROFILE_DETAIL_MEMORY', with: { cppflags: '-DGC_PROFILE_DETAIL_MEMORY' } } + + compileB: + name: 'omnibus compilations, #11' + runs-on: ubuntu-latest + if: >- + ${{!(false + || contains(github.event.head_commit.message, '[DOC]') + || contains(github.event.head_commit.message, 'Document') + || contains(github.event.pull_request.title, '[DOC]') + || contains(github.event.pull_request.title, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Document') + || (github.event_name == 'push' && github.actor == 'dependabot[bot]') + )}} + services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } + steps: + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + with: { sparse-checkout-cone-mode: false, sparse-checkout: /.github } + - { uses: './.github/actions/setup/directories', with: { srcdir: 'src', builddir: 'build', makeup: true } } + - { uses: './.github/actions/compilers', name: 'GC_PROFILE_MORE_DETAIL', with: { cppflags: '-DGC_PROFILE_MORE_DETAIL' } } + - { uses: './.github/actions/compilers', name: 'MALLOC_ALLOCATED_SIZE_CHECK', with: { cppflags: '-DMALLOC_ALLOCATED_SIZE_CHECK' } } + - { uses: './.github/actions/compilers', name: 'RGENGC_ESTIMATE_OLDMALLOC', with: { cppflags: '-DRGENGC_ESTIMATE_OLDMALLOC' } } + - { uses: './.github/actions/compilers', name: 'RGENGC_FORCE_MAJOR_GC', with: { cppflags: '-DRGENGC_FORCE_MAJOR_GC' } } + - { uses: './.github/actions/compilers', name: 'RGENGC_OBJ_INFO', with: { cppflags: '-DRGENGC_OBJ_INFO' } } + - { uses: './.github/actions/compilers', name: 'RGENGC_PROFILE', with: { cppflags: '-DRGENGC_PROFILE' } } + - { uses: './.github/actions/compilers', name: 'VM_DEBUG_BP_CHECK', with: { cppflags: '-DVM_DEBUG_BP_CHECK' } } + - { uses: './.github/actions/compilers', name: 'VM_DEBUG_VERIFY_METHOD_CACHE', with: { cppflags: '-DVM_DEBUG_VERIFY_METHOD_CACHE' } } + + compileC: + name: 'omnibus compilations, #12' + runs-on: ubuntu-latest + if: >- + ${{!(false + || contains(github.event.head_commit.message, '[DOC]') + || contains(github.event.head_commit.message, 'Document') + || contains(github.event.pull_request.title, '[DOC]') + || contains(github.event.pull_request.title, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Document') + || (github.event_name == 'push' && github.actor == 'dependabot[bot]') + )}} + services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } + steps: + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + with: { sparse-checkout-cone-mode: false, sparse-checkout: /.github } + - { uses: './.github/actions/setup/directories', with: { srcdir: 'src', builddir: 'build', makeup: true } } + - { uses: './.github/actions/compilers', name: 'enable-yjit', with: { append_configure: '--enable-yjit --disable-rjit' } } + - { uses: './.github/actions/compilers', name: 'enable-rjit', with: { append_configure: '--enable-rjit --disable-yjit' } } + - { uses: './.github/actions/compilers', name: 'YJIT_FORCE_ENABLE', with: { cppflags: '-DYJIT_FORCE_ENABLE' } } + - { uses: './.github/actions/compilers', name: 'RJIT_FORCE_ENABLE', with: { cppflags: '-DRJIT_FORCE_ENABLE' } } + - { uses: './.github/actions/compilers', name: 'UNIVERSAL_PARSER', with: { cppflags: '-DUNIVERSAL_PARSER' } } + + compilemax: + name: 'omnibus compilations, result' + runs-on: ubuntu-latest + if: ${{ always() }} + needs: + - 'compile1' + - 'compile2' + - 'compile3' + - 'compile4' + - 'compile5' + - 'compile6' + - 'compile7' + - 'compile8' + - 'compile9' + - 'compileX' + - 'compileB' + - 'compileC' + steps: - uses: ./.github/actions/slack with: - label: ${{ matrix.entry.name }} + label: 'omnibus' SLACK_WEBHOOK_URL: ${{ secrets.SIMPLER_ALERTS_URL }} # ruby-lang slack: ruby/simpler-alerts-bot - if: ${{ failure() }} + if: ${{ contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') }} + - run: false + working-directory: + if: ${{ contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') }} defaults: run: From e58c7a9330e90df3e94352d7fa9c33533a989eaf Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Fri, 27 Sep 2024 11:59:29 +0900 Subject: [PATCH 489/829] Applied https://github.com/ruby/ruby/pull/11574 --- .github/actions/compilers/entrypoint.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/actions/compilers/entrypoint.sh b/.github/actions/compilers/entrypoint.sh index 8e5b93f3997c85..0a11ef9cc11376 100755 --- a/.github/actions/compilers/entrypoint.sh +++ b/.github/actions/compilers/entrypoint.sh @@ -84,7 +84,13 @@ grouped make test [[ -z "${INPUT_CHECK}" ]] && exit 0 +if [ "$INPUT_CHECK" = "true" ]; then + tests="ruby -ext-" +else + tests="$INPUT_CHECK" +fi + grouped make install grouped make test-tool -grouped make test-all TESTS='-- ruby -ext-' +grouped make test-all TESTS="-- $tests" grouped env CHECK_LEAKS=true make test-spec From b63f3c9d9edef09c0b6ad821dadc03cd94b1b978 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Fri, 27 Sep 2024 12:12:52 +0900 Subject: [PATCH 490/829] Use user.login instead of actor --- .github/workflows/compilers.yml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/compilers.yml b/.github/workflows/compilers.yml index 8b543d25749ce2..4b7db40d9c6b1b 100644 --- a/.github/workflows/compilers.yml +++ b/.github/workflows/compilers.yml @@ -71,7 +71,7 @@ jobs: || contains(github.event.pull_request.title, '[DOC]') || contains(github.event.pull_request.title, 'Document') || contains(github.event.pull_request.labels.*.name, 'Document') - || (github.event_name == 'push' && github.actor == 'dependabot[bot]') + || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } steps: @@ -96,7 +96,7 @@ jobs: || contains(github.event.pull_request.title, '[DOC]') || contains(github.event.pull_request.title, 'Document') || contains(github.event.pull_request.labels.*.name, 'Document') - || (github.event_name == 'push' && github.actor == 'dependabot[bot]') + || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } steps: @@ -122,7 +122,7 @@ jobs: || contains(github.event.pull_request.title, '[DOC]') || contains(github.event.pull_request.title, 'Document') || contains(github.event.pull_request.labels.*.name, 'Document') - || (github.event_name == 'push' && github.actor == 'dependabot[bot]') + || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } steps: @@ -148,7 +148,7 @@ jobs: || contains(github.event.pull_request.title, '[DOC]') || contains(github.event.pull_request.title, 'Document') || contains(github.event.pull_request.labels.*.name, 'Document') - || (github.event_name == 'push' && github.actor == 'dependabot[bot]') + || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } steps: @@ -183,7 +183,7 @@ jobs: || contains(github.event.pull_request.title, '[DOC]') || contains(github.event.pull_request.title, 'Document') || contains(github.event.pull_request.labels.*.name, 'Document') - || (github.event_name == 'push' && github.actor == 'dependabot[bot]') + || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } steps: @@ -208,7 +208,7 @@ jobs: || contains(github.event.pull_request.title, '[DOC]') || contains(github.event.pull_request.title, 'Document') || contains(github.event.pull_request.labels.*.name, 'Document') - || (github.event_name == 'push' && github.actor == 'dependabot[bot]') + || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } steps: @@ -235,7 +235,7 @@ jobs: || contains(github.event.pull_request.title, '[DOC]') || contains(github.event.pull_request.title, 'Document') || contains(github.event.pull_request.labels.*.name, 'Document') - || (github.event_name == 'push' && github.actor == 'dependabot[bot]') + || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } steps: @@ -263,7 +263,7 @@ jobs: || contains(github.event.pull_request.title, '[DOC]') || contains(github.event.pull_request.title, 'Document') || contains(github.event.pull_request.labels.*.name, 'Document') - || (github.event_name == 'push' && github.actor == 'dependabot[bot]') + || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } steps: @@ -290,7 +290,7 @@ jobs: || contains(github.event.pull_request.title, '[DOC]') || contains(github.event.pull_request.title, 'Document') || contains(github.event.pull_request.labels.*.name, 'Document') - || (github.event_name == 'push' && github.actor == 'dependabot[bot]') + || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } steps: @@ -317,7 +317,7 @@ jobs: || contains(github.event.pull_request.title, '[DOC]') || contains(github.event.pull_request.title, 'Document') || contains(github.event.pull_request.labels.*.name, 'Document') - || (github.event_name == 'push' && github.actor == 'dependabot[bot]') + || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } steps: @@ -343,7 +343,7 @@ jobs: || contains(github.event.pull_request.title, '[DOC]') || contains(github.event.pull_request.title, 'Document') || contains(github.event.pull_request.labels.*.name, 'Document') - || (github.event_name == 'push' && github.actor == 'dependabot[bot]') + || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } steps: From a896c4cc532b9192732af02ac5cb84d3b5e7f82d Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Fri, 27 Sep 2024 13:25:01 +0900 Subject: [PATCH 491/829] RGENGC_FORCE_MAJOR_GC is disabled same as current HEAD --- .github/workflows/compilers.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/compilers.yml b/.github/workflows/compilers.yml index 4b7db40d9c6b1b..dfd92b07c341d7 100644 --- a/.github/workflows/compilers.yml +++ b/.github/workflows/compilers.yml @@ -327,7 +327,7 @@ jobs: - { uses: './.github/actions/compilers', name: 'GC_PROFILE_MORE_DETAIL', with: { cppflags: '-DGC_PROFILE_MORE_DETAIL' } } - { uses: './.github/actions/compilers', name: 'MALLOC_ALLOCATED_SIZE_CHECK', with: { cppflags: '-DMALLOC_ALLOCATED_SIZE_CHECK' } } - { uses: './.github/actions/compilers', name: 'RGENGC_ESTIMATE_OLDMALLOC', with: { cppflags: '-DRGENGC_ESTIMATE_OLDMALLOC' } } - - { uses: './.github/actions/compilers', name: 'RGENGC_FORCE_MAJOR_GC', with: { cppflags: '-DRGENGC_FORCE_MAJOR_GC' } } + # - { uses: './.github/actions/compilers', name: 'RGENGC_FORCE_MAJOR_GC', with: { cppflags: '-DRGENGC_FORCE_MAJOR_GC' } } - { uses: './.github/actions/compilers', name: 'RGENGC_OBJ_INFO', with: { cppflags: '-DRGENGC_OBJ_INFO' } } - { uses: './.github/actions/compilers', name: 'RGENGC_PROFILE', with: { cppflags: '-DRGENGC_PROFILE' } } - { uses: './.github/actions/compilers', name: 'VM_DEBUG_BP_CHECK', with: { cppflags: '-DVM_DEBUG_BP_CHECK' } } From a70adce1ce5fae8eaae385214ac0d2e7d17c1103 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Wed, 4 Sep 2024 22:01:03 +0200 Subject: [PATCH 492/829] Only `warn` about bundled gems when require succeeds --- lib/bundled_gems.rb | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/bundled_gems.rb b/lib/bundled_gems.rb index a0e2c4ef8cbf15..f819134c968f6a 100644 --- a/lib/bundled_gems.rb +++ b/lib/bundled_gems.rb @@ -69,14 +69,17 @@ def self.replace_require(specs) [::Kernel.singleton_class, ::Kernel].each do |kernel_class| kernel_class.send(:alias_method, :no_warning_require, :require) kernel_class.send(:define_method, :require) do |name| - if message = ::Gem::BUNDLED_GEMS.warning?(name, specs: spec_names) + result = kernel_class.send(:no_warning_require, name) + + if result && message = ::Gem::BUNDLED_GEMS.warning?(name, specs: spec_names) if ::Gem::BUNDLED_GEMS.uplevel > 0 Kernel.warn message, uplevel: ::Gem::BUNDLED_GEMS.uplevel else Kernel.warn message end end - kernel_class.send(:no_warning_require, name) + + result end if kernel_class == ::Kernel kernel_class.send(:private, :require) From eff16d93025d354de08cb40a11a51acffdf26e57 Mon Sep 17 00:00:00 2001 From: ydah Date: Fri, 27 Sep 2024 02:01:08 +0900 Subject: [PATCH 493/829] Implement OP_ASGN1 NODE locations --- ast.c | 7 +++++++ node_dump.c | 6 +++++- parse.y | 21 +++++++++++++-------- rubyparser.h | 4 ++++ test/ruby/test_ast.rb | 8 ++++++++ 5 files changed, 37 insertions(+), 9 deletions(-) diff --git a/ast.c b/ast.c index d2bc60c3e1c21a..c32a22e7b5805e 100644 --- a/ast.c +++ b/ast.c @@ -815,6 +815,13 @@ node_locations(VALUE ast_value, const NODE *node) return rb_ary_new_from_args(2, location_new(nd_code_loc(node)), location_new(&RNODE_OR(node)->operator_loc)); + case NODE_OP_ASGN1: + return rb_ary_new_from_args(5, + location_new(nd_code_loc(node)), + location_new(&RNODE_OP_ASGN1(node)->call_operator_loc), + location_new(&RNODE_OP_ASGN1(node)->opening_loc), + location_new(&RNODE_OP_ASGN1(node)->closing_loc), + location_new(&RNODE_OP_ASGN1(node)->binary_operator_loc)); case NODE_REDO: return rb_ary_new_from_args(2, location_new(nd_code_loc(node)), diff --git a/node_dump.c b/node_dump.c index ad248aea740085..f9d8f006131951 100644 --- a/node_dump.c +++ b/node_dump.c @@ -542,8 +542,12 @@ dump_node(VALUE buf, VALUE indent, int comment, const NODE * node) F_NODE(nd_recv, RNODE_OP_ASGN1, "receiver"); F_ID(nd_mid, RNODE_OP_ASGN1, "operator"); F_NODE(nd_index, RNODE_OP_ASGN1, "index"); - LAST_NODE; F_NODE(nd_rvalue, RNODE_OP_ASGN1, "rvalue"); + F_LOC(call_operator_loc, RNODE_OP_ASGN1); + F_LOC(opening_loc, RNODE_OP_ASGN1); + F_LOC(closing_loc, RNODE_OP_ASGN1); + LAST_NODE; + F_LOC(binary_operator_loc, RNODE_OP_ASGN1); return; case NODE_OP_ASGN2: diff --git a/parse.y b/parse.y index 60fce58699b963..94c4c5da4d670d 100644 --- a/parse.y +++ b/parse.y @@ -1085,7 +1085,7 @@ static rb_node_gasgn_t *rb_node_gasgn_new(struct parser_params *p, ID nd_vid, NO static rb_node_iasgn_t *rb_node_iasgn_new(struct parser_params *p, ID nd_vid, NODE *nd_value, const YYLTYPE *loc); static rb_node_cdecl_t *rb_node_cdecl_new(struct parser_params *p, ID nd_vid, NODE *nd_value, NODE *nd_else, enum rb_parser_shareability shareability, const YYLTYPE *loc); static rb_node_cvasgn_t *rb_node_cvasgn_new(struct parser_params *p, ID nd_vid, NODE *nd_value, const YYLTYPE *loc); -static rb_node_op_asgn1_t *rb_node_op_asgn1_new(struct parser_params *p, NODE *nd_recv, ID nd_mid, NODE *index, NODE *rvalue, const YYLTYPE *loc); +static rb_node_op_asgn1_t *rb_node_op_asgn1_new(struct parser_params *p, NODE *nd_recv, ID nd_mid, NODE *index, NODE *rvalue, const YYLTYPE *loc, const YYLTYPE *call_operator_loc, const YYLTYPE *opening_loc, const YYLTYPE *closing_loc, const YYLTYPE *binary_operator_loc); static rb_node_op_asgn2_t *rb_node_op_asgn2_new(struct parser_params *p, NODE *nd_recv, NODE *nd_value, ID nd_vid, ID nd_mid, bool nd_aid, const YYLTYPE *loc); static rb_node_op_asgn_or_t *rb_node_op_asgn_or_new(struct parser_params *p, NODE *nd_head, NODE *nd_value, const YYLTYPE *loc); static rb_node_op_asgn_and_t *rb_node_op_asgn_and_new(struct parser_params *p, NODE *nd_head, NODE *nd_value, const YYLTYPE *loc); @@ -1193,7 +1193,7 @@ static rb_node_error_t *rb_node_error_new(struct parser_params *p, const YYLTYPE #define NEW_IASGN(v,val,loc) (NODE *)rb_node_iasgn_new(p,v,val,loc) #define NEW_CDECL(v,val,path,share,loc) (NODE *)rb_node_cdecl_new(p,v,val,path,share,loc) #define NEW_CVASGN(v,val,loc) (NODE *)rb_node_cvasgn_new(p,v,val,loc) -#define NEW_OP_ASGN1(r,id,idx,rval,loc) (NODE *)rb_node_op_asgn1_new(p,r,id,idx,rval,loc) +#define NEW_OP_ASGN1(r,id,idx,rval,loc,c_op_loc,o_loc,c_loc,b_op_loc) (NODE *)rb_node_op_asgn1_new(p,r,id,idx,rval,loc,c_op_loc,o_loc,c_loc,b_op_loc) #define NEW_OP_ASGN2(r,t,i,o,val,loc) (NODE *)rb_node_op_asgn2_new(p,r,val,i,o,t,loc) #define NEW_OP_ASGN_OR(i,val,loc) (NODE *)rb_node_op_asgn_or_new(p,i,val,loc) #define NEW_OP_ASGN_AND(i,val,loc) (NODE *)rb_node_op_asgn_and_new(p,i,val,loc) @@ -1452,7 +1452,7 @@ static VALUE rb_backref_error(struct parser_params*,NODE*); static NODE *node_assign(struct parser_params*,NODE*,NODE*,struct lex_context,const YYLTYPE*); static NODE *new_op_assign(struct parser_params *p, NODE *lhs, ID op, NODE *rhs, struct lex_context, const YYLTYPE *loc); -static NODE *new_ary_op_assign(struct parser_params *p, NODE *ary, NODE *args, ID op, NODE *rhs, const YYLTYPE *args_loc, const YYLTYPE *loc); +static NODE *new_ary_op_assign(struct parser_params *p, NODE *ary, NODE *args, ID op, NODE *rhs, const YYLTYPE *args_loc, const YYLTYPE *loc, const YYLTYPE *call_operator_loc, const YYLTYPE *opening_loc, const YYLTYPE *closing_loc, const YYLTYPE *binary_operator_loc); static NODE *new_attr_op_assign(struct parser_params *p, NODE *lhs, ID atype, ID attr, ID op, NODE *rhs, const YYLTYPE *loc); static NODE *new_const_op_assign(struct parser_params *p, NODE *lhs, ID op, NODE *rhs, struct lex_context, const YYLTYPE *loc); static NODE *new_bodystmt(struct parser_params *p, NODE *head, NODE *rescue, NODE *rescue_else, NODE *ensure, const YYLTYPE *loc); @@ -3268,7 +3268,7 @@ command_asgn : lhs '=' lex_ctxt command_rhs } | primary_value '[' opt_call_args rbracket tOP_ASGN lex_ctxt command_rhs { - $$ = new_ary_op_assign(p, $1, $3, $5, $7, &@3, &@$); + $$ = new_ary_op_assign(p, $1, $3, $5, $7, &@3, &@$, &NULL_LOC, &@2, &@4, &@5); /*% ripper: opassign!(aref_field!($:1, $:3), $:5, $:7) %*/ } @@ -3869,7 +3869,7 @@ arg : lhs '=' lex_ctxt arg_rhs } | primary_value '[' opt_call_args rbracket tOP_ASGN lex_ctxt arg_rhs { - $$ = new_ary_op_assign(p, $1, $3, $5, $7, &@3, &@$); + $$ = new_ary_op_assign(p, $1, $3, $5, $7, &@3, &@$, &NULL_LOC, &@2, &@4, &@5); /*% ripper: opassign!(aref_field!($:1, $:3), $:5, $:7) %*/ } | primary_value call_op tIDENTIFIER tOP_ASGN lex_ctxt arg_rhs @@ -11916,13 +11916,17 @@ rb_node_cvasgn_new(struct parser_params *p, ID nd_vid, NODE *nd_value, const YYL } static rb_node_op_asgn1_t * -rb_node_op_asgn1_new(struct parser_params *p, NODE *nd_recv, ID nd_mid, NODE *index, NODE *rvalue, const YYLTYPE *loc) +rb_node_op_asgn1_new(struct parser_params *p, NODE *nd_recv, ID nd_mid, NODE *index, NODE *rvalue, const YYLTYPE *loc, const YYLTYPE *call_operator_loc, const YYLTYPE *opening_loc, const YYLTYPE *closing_loc, const YYLTYPE *binary_operator_loc) { rb_node_op_asgn1_t *n = NODE_NEWNODE(NODE_OP_ASGN1, rb_node_op_asgn1_t, loc); n->nd_recv = nd_recv; n->nd_mid = nd_mid; n->nd_index = index; n->nd_rvalue = rvalue; + n->call_operator_loc = *call_operator_loc; + n->opening_loc = *opening_loc; + n->closing_loc = *closing_loc; + n->binary_operator_loc = *binary_operator_loc; return n; } @@ -14823,13 +14827,14 @@ new_op_assign(struct parser_params *p, NODE *lhs, ID op, NODE *rhs, struct lex_c static NODE * new_ary_op_assign(struct parser_params *p, NODE *ary, - NODE *args, ID op, NODE *rhs, const YYLTYPE *args_loc, const YYLTYPE *loc) + NODE *args, ID op, NODE *rhs, const YYLTYPE *args_loc, const YYLTYPE *loc, + const YYLTYPE *call_operator_loc, const YYLTYPE *opening_loc, const YYLTYPE *closing_loc, const YYLTYPE *binary_operator_loc) { NODE *asgn; aryset_check(p, args); args = make_list(args, args_loc); - asgn = NEW_OP_ASGN1(ary, op, args, rhs, loc); + asgn = NEW_OP_ASGN1(ary, op, args, rhs, loc, call_operator_loc, opening_loc, closing_loc, binary_operator_loc); fixpos(asgn, ary); return asgn; } diff --git a/rubyparser.h b/rubyparser.h index 4ba34fff1642b7..2e7e6b63cb8b5a 100644 --- a/rubyparser.h +++ b/rubyparser.h @@ -455,6 +455,10 @@ typedef struct RNode_OP_ASGN1 { ID nd_mid; struct RNode *nd_index; struct RNode *nd_rvalue; + rb_code_location_t call_operator_loc; + rb_code_location_t opening_loc; + rb_code_location_t closing_loc; + rb_code_location_t binary_operator_loc; } rb_node_op_asgn1_t; typedef struct RNode_OP_ASGN2 { diff --git a/test/ruby/test_ast.rb b/test/ruby/test_ast.rb index 940c4de9d7fcac..f1328b15ed0cf3 100644 --- a/test/ruby/test_ast.rb +++ b/test/ruby/test_ast.rb @@ -1381,6 +1381,14 @@ def test_next_locations assert_locations(node.children[-1].children[-1].children[-1].locations, [[1, 7, 1, 13], [1, 7, 1, 11]]) end + def test_op_asgn1_locations + node = ast_parse("ary[1] += foo") + assert_locations(node.children[-1].locations, [[1, 0, 1, 13], nil, [1, 3, 1, 4], [1, 5, 1, 6], [1, 7, 1, 9]]) + + node = ast_parse("ary[1, 2] += foo") + assert_locations(node.children[-1].locations, [[1, 0, 1, 16], nil, [1, 3, 1, 4], [1, 8, 1, 9], [1, 10, 1, 12]]) + end + def test_or_locations node = ast_parse("1 or 2") assert_locations(node.children[-1].locations, [[1, 0, 1, 6], [1, 2, 1, 4]]) From ff3f61556fb62d12d57d017f4c54f1a8fd5208be Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Fri, 27 Sep 2024 17:51:56 +0900 Subject: [PATCH 494/829] Only warn fiddle as optional dependency --- lib/bundled_gems.rb | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/lib/bundled_gems.rb b/lib/bundled_gems.rb index f819134c968f6a..087f94a9acc69b 100644 --- a/lib/bundled_gems.rb +++ b/lib/bundled_gems.rb @@ -52,6 +52,10 @@ module Gem::BUNDLED_GEMS "syslog" => true, }.freeze + OPTIONAL = { + "fiddle" => true, + }.freeze + WARNED = {} # unfrozen conf = ::RbConfig::CONFIG @@ -69,9 +73,15 @@ def self.replace_require(specs) [::Kernel.singleton_class, ::Kernel].each do |kernel_class| kernel_class.send(:alias_method, :no_warning_require, :require) kernel_class.send(:define_method, :require) do |name| - result = kernel_class.send(:no_warning_require, name) - if result && message = ::Gem::BUNDLED_GEMS.warning?(name, specs: spec_names) + message = ::Gem::BUNDLED_GEMS.warning?(name, specs: spec_names) + begin + result = kernel_class.send(:no_warning_require, name) + rescue LoadError => e + result = e + end + + if (result || !OPTIONAL[name]) && message if ::Gem::BUNDLED_GEMS.uplevel > 0 Kernel.warn message, uplevel: ::Gem::BUNDLED_GEMS.uplevel else @@ -79,8 +89,13 @@ def self.replace_require(specs) end end - result + if result.is_a?(LoadError) + raise result + else + result + end end + if kernel_class == ::Kernel kernel_class.send(:private, :require) else From c1ee5ea28f1684250b1386d8ac9d1e754f54a79e Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Fri, 27 Sep 2024 18:36:47 +0900 Subject: [PATCH 495/829] Avoid to unintentional Bundler definition by Bundler::Definition.no_lock --- tool/test_for_warn_bundled_gems/test_warn_bundled_gems.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tool/test_for_warn_bundled_gems/test_warn_bundled_gems.rb b/tool/test_for_warn_bundled_gems/test_warn_bundled_gems.rb index bd0e184f7fd127..a8f065a6b08ded 100644 --- a/tool/test_for_warn_bundled_gems/test_warn_bundled_gems.rb +++ b/tool/test_for_warn_bundled_gems/test_warn_bundled_gems.rb @@ -7,5 +7,7 @@ source "https://rubygems.org" end +Object.send(:remove_const, :Bundler) + require "mutex_m" require "rss" From 7f83bd3732b9ecb66655416a58b4c2bf329afa20 Mon Sep 17 00:00:00 2001 From: S-H-GAMELINKS Date: Thu, 26 Sep 2024 22:04:49 +0900 Subject: [PATCH 496/829] Reduce `is_ascii_string` function dependency for parser Changed to use `rb_parser_is_ascii_string` function instead of `is_ascii_string` function --- parse.y | 9 +++++++-- ruby_parser.c | 7 ------- rubyparser.h | 1 - universal_parser.c | 1 - 4 files changed, 7 insertions(+), 11 deletions(-) diff --git a/parse.y b/parse.y index 94c4c5da4d670d..3e0a903b774e32 100644 --- a/parse.y +++ b/parse.y @@ -7694,16 +7694,21 @@ static VALUE parser_str_new(struct parser_params *p, const char *ptr, long len, rb_encoding *enc, int func, rb_encoding *enc0) { VALUE str; + rb_parser_string_t *pstr; + + pstr = rb_parser_encoding_string_new(p, ptr, len, enc); + str = rb_str_new_mutable_parser_string(pstr); - str = rb_enc_str_new(ptr, len, enc); if (!(func & STR_FUNC_REGEXP) && rb_enc_asciicompat(enc)) { - if (is_ascii_string(str)) { + if (rb_parser_is_ascii_string(p, pstr)) { } else if (rb_is_usascii_enc((void *)enc0) && enc != rb_utf8_encoding()) { rb_enc_associate(str, rb_ascii8bit_encoding()); } } + rb_parser_string_free(p, pstr); + return str; } diff --git a/ruby_parser.c b/ruby_parser.c index a965fc44dc2760..8a87b3ae64b486 100644 --- a/ruby_parser.c +++ b/ruby_parser.c @@ -34,12 +34,6 @@ #define parser_encoding const void -static int -is_ascii_string2(VALUE str) -{ - return is_ascii_string(str); -} - RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT, 6, 0) static VALUE syntax_error_append(VALUE exc, VALUE file, int line, int column, @@ -375,7 +369,6 @@ static const rb_parser_config_t rb_global_parser_config = { .str_new = rb_str_new, .str_new_cstr = rb_str_new_cstr, .str_to_interned_str = rb_str_to_interned_str, - .is_ascii_string = is_ascii_string2, .enc_str_new = enc_str_new, .str_vcatf = rb_str_vcatf, .rb_sprintf = rb_sprintf, diff --git a/rubyparser.h b/rubyparser.h index 2e7e6b63cb8b5a..99e8b27bfd11e2 100644 --- a/rubyparser.h +++ b/rubyparser.h @@ -1221,7 +1221,6 @@ typedef struct rb_parser_config_struct { VALUE (*str_new)(const char *ptr, long len); VALUE (*str_new_cstr)(const char *ptr); VALUE (*str_to_interned_str)(VALUE); - int (*is_ascii_string)(VALUE str); VALUE (*enc_str_new)(const char *ptr, long len, rb_encoding *enc); RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT, 2, 0) VALUE (*str_vcatf)(VALUE str, const char *fmt, va_list ap); diff --git a/universal_parser.c b/universal_parser.c index 9ba7bef4a785e1..afe5e471f5c53f 100644 --- a/universal_parser.c +++ b/universal_parser.c @@ -121,7 +121,6 @@ #undef rb_str_new_cstr #define rb_str_new_cstr p->config->str_new_cstr #define rb_str_to_interned_str p->config->str_to_interned_str -#define is_ascii_string p->config->is_ascii_string #define rb_enc_str_new p->config->enc_str_new #define rb_str_vcatf p->config->str_vcatf #define rb_sprintf p->config->rb_sprintf From 098649bc59af5ece0b947416cfd3185be3e9a462 Mon Sep 17 00:00:00 2001 From: Stan Lo Date: Fri, 27 Sep 2024 09:58:29 -0400 Subject: [PATCH 497/829] [ruby/rdoc] Add home page link to output message (https://github.com/ruby/rdoc/pull/1165) The link is clickable in the terminal and opens the home page in the browser https://github.com/ruby/rdoc/commit/b7d580afab --- lib/rdoc/rdoc.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/rdoc/rdoc.rb b/lib/rdoc/rdoc.rb index 47108ceee3e0b5..88ae55b4093f53 100644 --- a/lib/rdoc/rdoc.rb +++ b/lib/rdoc/rdoc.rb @@ -520,6 +520,7 @@ def generate Dir.chdir @options.op_dir do unless @options.quiet then $stderr.puts "\nGenerating #{@generator.class.name.sub(/^.*::/, '')} format into #{Dir.pwd}..." + $stderr.puts "\nYou can visit the home page at: \e]8;;file://#{Dir.pwd}/index.html\e\\file://#{Dir.pwd}/index.html\e]8;;\e\\" end @generator.generate From 710d916c32bea6c2c91a0a052ad4b19027f1f6b7 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Fri, 27 Sep 2024 21:15:12 +0900 Subject: [PATCH 498/829] Add wrapper macros of `rb_parser_str_buf_cat` --- parse.y | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/parse.y b/parse.y index 3e0a903b774e32..1cea897925a4bf 100644 --- a/parse.y +++ b/parse.y @@ -2342,6 +2342,9 @@ rb_parser_str_buf_cat(struct parser_params *p, rb_parser_string_t *str, const ch return str; } +#define parser_str_cat(str, ptr, len) rb_parser_str_buf_cat(p, str, ptr, len) +#define parser_str_cat_cstr(str, lit) rb_parser_str_buf_cat(p, str, lit, strlen(lit)) + static rb_parser_string_t * rb_parser_enc_cr_str_buf_cat(struct parser_params *p, rb_parser_string_t *str, const char *ptr, long len, rb_encoding *ptr_enc, int ptr_cr, int *ptr_cr_ret) @@ -2407,7 +2410,7 @@ rb_parser_enc_cr_str_buf_cat(struct parser_params *p, rb_parser_string_t *str, c if (len < 0) { compile_error(p, "negative string size (or size too big)"); } - rb_parser_str_buf_cat(p, str, ptr, len); + parser_str_cat(str, ptr, len); PARSER_ENCODING_CODERANGE_SET(str, res_enc, res_cr); return str; @@ -6992,7 +6995,7 @@ rb_parser_str_escape(struct parser_params *p, rb_parser_string_t *str) const char *cc; int n = rb_enc_precise_mbclen(ptr, pend, enc); if (!MBCLEN_CHARFOUND_P(n)) { - if (ptr > prev) rb_parser_str_buf_cat(p, result, prev, ptr - prev); + if (ptr > prev) parser_str_cat(result, prev, ptr - prev); n = rb_enc_mbminlen(enc); if (pend < ptr + n) n = (int)(pend - ptr); @@ -7001,7 +7004,7 @@ rb_parser_str_escape(struct parser_params *p, rb_parser_string_t *str) charbuf[2] = (c < 10) ? '0' + c : 'A' + c - 10; c = *ptr & 0x0f; charbuf[3] = (c < 10) ? '0' + c : 'A' + c - 10; - rb_parser_str_buf_cat(p, result, charbuf, 4); + parser_str_cat(result, charbuf, 4); prev = ++ptr; } continue; @@ -7011,22 +7014,22 @@ rb_parser_str_escape(struct parser_params *p, rb_parser_string_t *str) ptr += n; cc = escaped_char(c); if (cc) { - if (ptr - n > prev) rb_parser_str_buf_cat(p, result, prev, ptr - n - prev); - rb_parser_str_buf_cat(p, result, cc, strlen(cc)); + if (ptr - n > prev) parser_str_cat(result, prev, ptr - n - prev); + parser_str_cat_cstr(result, cc); prev = ptr; } else if (asciicompat && rb_enc_isascii(c, enc) && ISPRINT(c)) { } else { if (ptr - n > prev) { - rb_parser_str_buf_cat(p, result, prev, ptr - n - prev); + parser_str_cat(result, prev, ptr - n - prev); prev = ptr - n; } - rb_parser_str_buf_cat(p, result, prev, ptr - prev); + parser_str_cat(result, prev, ptr - prev); prev = ptr; } } - if (ptr > prev) rb_parser_str_buf_cat(p, result, prev, ptr - prev); + if (ptr > prev) parser_str_cat(result, prev, ptr - prev); return result; } @@ -7762,7 +7765,7 @@ parser_add_delayed_token(struct parser_params *p, const char *tok, const char *e p->delayed.beg_line = p->ruby_sourceline; p->delayed.beg_col = rb_long2int(tok - p->lex.pbeg); } - rb_parser_str_buf_cat(p, p->delayed.token, tok, end - tok); + parser_str_cat(p->delayed.token, tok, end - tok); p->delayed.end_line = p->ruby_sourceline; p->delayed.end_col = rb_long2int(end - p->lex.pbeg); p->lex.ptok = end; From 94ad2c3fe9e75f08972f5952c5ba8307172692c2 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Fri, 27 Sep 2024 21:16:52 +0900 Subject: [PATCH 499/829] Reduce creating `rb_parser_string_t` repeatedly for literals. Since #11698, `parser_str_new` makes `rb_parser_string_t` and `VALUE` but discards the former, and then `STR_NEW3` makes the same thing again. --- parse.y | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/parse.y b/parse.y index 1cea897925a4bf..f8a9a3dc5133d9 100644 --- a/parse.y +++ b/parse.y @@ -6926,8 +6926,8 @@ static enum yytokentype here_document(struct parser_params*,rb_strterm_heredoc_t } # define set_yylval_str(x) \ do { \ - set_yylval_node(NEW_STR(rb_str_to_parser_string(p, x), &_cur_loc)); \ - set_parser_s_value(x); \ + set_yylval_node(NEW_STR(x, &_cur_loc)); \ + set_parser_s_value(rb_str_new_mutable_parser_string(x)); \ } while(0) # define set_yylval_num(x) { \ yylval.num = (x); \ @@ -7693,26 +7693,24 @@ enum string_type { str_dsym = (STR_FUNC_SYMBOL|STR_FUNC_EXPAND) }; -static VALUE +static rb_parser_string_t * parser_str_new(struct parser_params *p, const char *ptr, long len, rb_encoding *enc, int func, rb_encoding *enc0) { - VALUE str; rb_parser_string_t *pstr; pstr = rb_parser_encoding_string_new(p, ptr, len, enc); - str = rb_str_new_mutable_parser_string(pstr); if (!(func & STR_FUNC_REGEXP) && rb_enc_asciicompat(enc)) { if (rb_parser_is_ascii_string(p, pstr)) { } else if (rb_is_usascii_enc((void *)enc0) && enc != rb_utf8_encoding()) { - rb_enc_associate(str, rb_ascii8bit_encoding()); + /* everything is valid in ASCII-8BIT */ + enc = rb_ascii8bit_encoding(); + PARSER_ENCODING_CODERANGE_SET(pstr, enc, RB_PARSER_ENC_CODERANGE_VALID); } } - rb_parser_string_free(p, pstr); - - return str; + return pstr; } static int @@ -8761,7 +8759,7 @@ parse_string(struct parser_params *p, rb_strterm_literal_t *quote) int c, space = 0; rb_encoding *enc = p->enc; rb_encoding *base_enc = 0; - VALUE lit; + rb_parser_string_t *lit; if (func & STR_FUNC_TERM) { if (func & STR_FUNC_QWORDS) nextc(p); /* delayed term */ @@ -9166,7 +9164,7 @@ here_document(struct parser_params *p, rb_strterm_heredoc_t *here) int c, func, indent = 0; const char *eos, *ptr, *ptr_end; long len; - VALUE str = 0; + rb_parser_string_t *str = 0; rb_encoding *enc = p->enc; rb_encoding *base_enc = 0; int bol; @@ -9252,16 +9250,17 @@ here_document(struct parser_params *p, rb_strterm_heredoc_t *here) } if (str) - rb_str_cat(str, ptr, ptr_end - ptr); + parser_str_cat(str, ptr, ptr_end - ptr); else - str = STR_NEW(ptr, ptr_end - ptr); - if (!lex_eol_ptr_p(p, ptr_end)) rb_str_cat(str, "\n", 1); + str = rb_parser_encoding_string_new(p, ptr, ptr_end - ptr, enc); + if (!lex_eol_ptr_p(p, ptr_end)) parser_str_cat_cstr(str, "\n"); lex_goto_eol(p); if (p->heredoc_indent > 0) { goto flush_str; } if (nextc(p) == -1) { if (str) { + rb_parser_string_free(p, str); str = 0; } goto error; @@ -10067,7 +10066,7 @@ parse_qmark(struct parser_params *p, int space_seen) { rb_encoding *enc; register int c; - VALUE lit; + rb_parser_string_t *lit; if (IS_END()) { SET_LEX_STATE(EXPR_VALUE); From b873787a42e4ec23dab3dbc5dded95c4804472d2 Mon Sep 17 00:00:00 2001 From: Benoit Daloze Date: Fri, 27 Sep 2024 16:45:36 +0200 Subject: [PATCH 500/829] Update recommendations regarding parsing Ruby code now that Prism is stable --- ast.rb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ast.rb b/ast.rb index aae68fd9a7c947..3265292f7d08b8 100644 --- a/ast.rb +++ b/ast.rb @@ -13,9 +13,8 @@ # access children nodes by name, etc. # # If you are looking for a stable API or an API working under multiple Ruby -# implementations, consider using the _parser_ gem or Ripper. If you would -# like to make RubyVM::AbstractSyntaxTree stable, please join the discussion -# at https://bugs.ruby-lang.org/issues/14844. +# implementations, consider using the _prism_ gem, which is the official +# Ruby API to parse Ruby code. # module RubyVM::AbstractSyntaxTree From d1324170b6c25e893b0dec4d7829e6d561b15cf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Wed, 25 Sep 2024 16:59:57 +0200 Subject: [PATCH 501/829] [rubygems/rubygems] Warning about PATH in `--user-install` mode is only necessary for gems with executables https://github.com/rubygems/rubygems/commit/2fe0f452a2 --- lib/rubygems/installer.rb | 37 +++++++++++----------------- test/rubygems/installer_test_case.rb | 6 ----- test/rubygems/test_gem_installer.rb | 13 +++++----- 3 files changed, 20 insertions(+), 36 deletions(-) diff --git a/lib/rubygems/installer.rb b/lib/rubygems/installer.rb index 735d30ab9ed667..21b72973cc7b48 100644 --- a/lib/rubygems/installer.rb +++ b/lib/rubygems/installer.rb @@ -66,8 +66,6 @@ class Gem::Installer attr_reader :package - @path_warning = false - class << self # # Changes in rubygems to lazily loading `rubygems/command` (in order to @@ -86,11 +84,6 @@ def inherited(klass) super(klass) end - ## - # True if we've warned about PATH not including Gem.bindir - - attr_accessor :path_warning - ## # Overrides the executable format. # @@ -188,15 +181,6 @@ def initialize(package, options={}) @package.dir_mode = options[:dir_mode] @package.prog_mode = options[:prog_mode] @package.data_mode = options[:data_mode] - - if @gem_home == Gem.user_dir - # If we get here, then one of the following likely happened: - # - `--user-install` was specified - # - `Gem::PathSupport#home` fell back to `Gem.user_dir` - # - GEM_HOME was manually set to `Gem.user_dir` - - check_that_user_bin_dir_is_in_path - end end ## @@ -488,11 +472,21 @@ def generate_windows_script(filename, bindir) end def generate_bin # :nodoc: - return if spec.executables.nil? || spec.executables.empty? + executables = spec.executables + return if executables.nil? || executables.empty? + + if @gem_home == Gem.user_dir + # If we get here, then one of the following likely happened: + # - `--user-install` was specified + # - `Gem::PathSupport#home` fell back to `Gem.user_dir` + # - GEM_HOME was manually set to `Gem.user_dir` + + check_that_user_bin_dir_is_in_path(executables) + end ensure_writable_dir @bin_dir - spec.executables.each do |filename| + executables.each do |filename| bin_path = File.join gem_dir, spec.bindir, filename next unless File.exist? bin_path @@ -694,9 +688,7 @@ def process_options # :nodoc: end end - def check_that_user_bin_dir_is_in_path # :nodoc: - return if self.class.path_warning - + def check_that_user_bin_dir_is_in_path(executables) # :nodoc: user_bin_dir = @bin_dir || Gem.bindir(gem_home) user_bin_dir = user_bin_dir.tr(File::ALT_SEPARATOR, File::SEPARATOR) if File::ALT_SEPARATOR @@ -712,8 +704,7 @@ def check_that_user_bin_dir_is_in_path # :nodoc: unless path.include? user_bin_dir unless !Gem.win_platform? && (path.include? user_bin_dir.sub(ENV["HOME"], "~")) - alert_warning "You don't have #{user_bin_dir} in your PATH,\n\t gem executables will not run." - self.class.path_warning = true + alert_warning "You don't have #{user_bin_dir} in your PATH,\n\t gem executables (#{executables.join(", ")}) will not run." end end end diff --git a/test/rubygems/installer_test_case.rb b/test/rubygems/installer_test_case.rb index abddcbe8483917..8a34d28db86ec0 100644 --- a/test/rubygems/installer_test_case.rb +++ b/test/rubygems/installer_test_case.rb @@ -64,12 +64,6 @@ class Gem::Installer # A test case for Gem::Installer. class Gem::InstallerTestCase < Gem::TestCase - def setup - super - - Gem::Installer.path_warning = false - end - ## # The path where installed executables live diff --git a/test/rubygems/test_gem_installer.rb b/test/rubygems/test_gem_installer.rb index b83a01c73be330..12149b9f912c29 100644 --- a/test/rubygems/test_gem_installer.rb +++ b/test/rubygems/test_gem_installer.rb @@ -208,7 +208,7 @@ def test_check_that_user_bin_dir_is_in_path ENV["PATH"] = [ENV["PATH"], bin_dir].join(File::PATH_SEPARATOR) use_ui @ui do - installer.check_that_user_bin_dir_is_in_path + installer.check_that_user_bin_dir_is_in_path(["executable"]) end assert_empty @ui.error @@ -218,7 +218,7 @@ def test_check_that_user_bin_dir_is_in_path ENV["PATH"] = [orig_path, bin_dir.tr(File::SEPARATOR, File::ALT_SEPARATOR)].join(File::PATH_SEPARATOR) use_ui @ui do - installer.check_that_user_bin_dir_is_in_path + installer.check_that_user_bin_dir_is_in_path(["executable"]) end assert_empty @ui.error @@ -236,7 +236,7 @@ def test_check_that_user_bin_dir_is_in_path_tilde installer.bin_dir.replace File.join @userhome, "bin" use_ui @ui do - installer.check_that_user_bin_dir_is_in_path + installer.check_that_user_bin_dir_is_in_path(["executable"]) end assert_empty @ui.error @@ -248,7 +248,7 @@ def test_check_that_user_bin_dir_is_in_path_not_in_path installer = setup_base_installer use_ui @ui do - installer.check_that_user_bin_dir_is_in_path + installer.check_that_user_bin_dir_is_in_path(["executable"]) end expected = installer.bin_dir @@ -258,6 +258,7 @@ def test_check_that_user_bin_dir_is_in_path_not_in_path end assert_match expected, @ui.error + assert_match "(executable)", @ui.error end def test_ensure_dependency @@ -358,10 +359,8 @@ def test_generate_bin_bindir_with_user_install_warning inst = Gem::Installer.at "", options - Gem::Installer.path_warning = false - use_ui @ui do - inst.check_that_user_bin_dir_is_in_path + inst.check_that_user_bin_dir_is_in_path(["executable"]) end assert_equal "", @ui.error From 7e19904c88fde024051333dfbd534b9fd3b26bf9 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sat, 28 Sep 2024 00:20:09 +0900 Subject: [PATCH 502/829] Remove on `RSTRING_END` dependency from parser --- parse.y | 19 ++++++++++--------- ruby_parser.c | 1 - rubyparser.h | 1 - universal_parser.c | 2 -- 4 files changed, 10 insertions(+), 13 deletions(-) diff --git a/parse.y b/parse.y index f8a9a3dc5133d9..6c0da9ce687c23 100644 --- a/parse.y +++ b/parse.y @@ -709,10 +709,11 @@ after_pop_stack(int len, struct parser_params *p) #define VALID_SYMNAME_P(s, l, enc, type) (rb_enc_symname_type(s, l, enc, (1U<<(type))) == (int)(type)) #ifndef RIPPER -static inline bool -end_with_newline_p(struct parser_params *p, VALUE str) +static inline int +char_at_end(struct parser_params *p, VALUE str, int when_empty) { - return RSTRING_LEN(str) > 0 && RSTRING_END(str)[-1] == '\n'; + long len = RSTRING_LEN(str); + return len > 0 ? (unsigned char)RSTRING_PTR(str)[len-1] : when_empty; } #endif @@ -2002,10 +2003,10 @@ parser_memhash(const void *ptr, long len) ((ptrvar) = str->ptr, \ (lenvar) = str->len) -static inline bool -parser_string_end_with_newline_p(struct parser_params *p, rb_parser_string_t *str) +static inline int +parser_string_char_at_end(struct parser_params *p, rb_parser_string_t *str, int when_empty) { - return PARSER_STRING_LEN(str) > 0 && PARSER_STRING_END(str)[-1] == '\n'; + return PARSER_STRING_LEN(str) > 0 ? (unsigned char)PARSER_STRING_END(str)[-1] : when_empty; } static rb_parser_string_t * @@ -7354,7 +7355,7 @@ ruby_show_error_line(struct parser_params *p, VALUE errbuf, const YYLTYPE *yyllo } if (RTEST(errbuf)) { mesg = rb_attr_get(errbuf, idMesg); - if (RSTRING_LEN(mesg) > 0 && *(RSTRING_END(mesg)-1) != '\n') + if (char_at_end(p, mesg, '\n') != '\n') rb_str_cat_cstr(mesg, "\n"); } else { @@ -7750,7 +7751,7 @@ parser_add_delayed_token(struct parser_params *p, const char *tok, const char *e if (tok < end) { if (has_delayed_token(p)) { - bool next_line = parser_string_end_with_newline_p(p, p->delayed.token); + bool next_line = parser_string_char_at_end(p, p->delayed.token, 0) == '\n'; int end_line = (next_line ? 1 : 0) + p->delayed.end_line; int end_col = (next_line ? 0 : p->delayed.end_col); if (end_line != p->ruby_sourceline || end_col != tok - p->lex.pbeg) { @@ -15961,7 +15962,7 @@ rb_parser_printf(struct parser_params *p, const char *fmt, ...) va_start(ap, fmt); rb_str_vcatf(mesg, fmt, ap); va_end(ap); - if (end_with_newline_p(p, mesg)) { + if (char_at_end(p, mesg, 0) == '\n') { rb_io_write(p->debug_output, mesg); p->debug_buffer = Qnil; } diff --git a/ruby_parser.c b/ruby_parser.c index 8a87b3ae64b486..314890c0af9a17 100644 --- a/ruby_parser.c +++ b/ruby_parser.c @@ -373,7 +373,6 @@ static const rb_parser_config_t rb_global_parser_config = { .str_vcatf = rb_str_vcatf, .rb_sprintf = rb_sprintf, .rstring_ptr = RSTRING_PTR, - .rstring_end = RSTRING_END, .rstring_len = RSTRING_LEN, .obj_as_string = rb_obj_as_string, diff --git a/rubyparser.h b/rubyparser.h index 99e8b27bfd11e2..e1a29b5661c11a 100644 --- a/rubyparser.h +++ b/rubyparser.h @@ -1227,7 +1227,6 @@ typedef struct rb_parser_config_struct { RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT, 1, 2) VALUE (*rb_sprintf)(const char *format, ...); char *(*rstring_ptr)(VALUE str); - char *(*rstring_end)(VALUE str); long (*rstring_len)(VALUE str); VALUE (*obj_as_string)(VALUE); diff --git a/universal_parser.c b/universal_parser.c index afe5e471f5c53f..4a85d8b55fec49 100644 --- a/universal_parser.c +++ b/universal_parser.c @@ -126,8 +126,6 @@ #define rb_sprintf p->config->rb_sprintf #undef RSTRING_PTR #define RSTRING_PTR p->config->rstring_ptr -#undef RSTRING_END -#define RSTRING_END p->config->rstring_end #undef RSTRING_LEN #define RSTRING_LEN p->config->rstring_len #define rb_obj_as_string p->config->obj_as_string From addb5fea94ea4011fe7d593ee3c59d6d07803839 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Fri, 27 Sep 2024 13:06:27 -0400 Subject: [PATCH 503/829] Fix up compiling popped ranges with non-optimizable bounds Fixes [Bug #20763] --- prism_compile.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/prism_compile.c b/prism_compile.c index 22956fa5e3b459..a159267da3fc8e 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -9678,19 +9678,19 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, } } else { - if (cast->left == NULL) { - PUSH_INSN(ret, location, putnil); - } - else { + if (cast->left != NULL) { PM_COMPILE(cast->left); } - - if (cast->right == NULL) { + else if (!popped) { PUSH_INSN(ret, location, putnil); } - else { + + if (cast->right != NULL) { PM_COMPILE(cast->right); } + else if (!popped) { + PUSH_INSN(ret, location, putnil); + } if (!popped) { PUSH_INSN1(ret, location, newrange, INT2FIX(exclude_end ? 1 : 0)); From 027ef60500c43fecbd4784cf24a99f6955606567 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sat, 28 Sep 2024 02:35:05 +0900 Subject: [PATCH 504/829] [Bug #20763] Add tests --- test/ruby/test_compile_prism.rb | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/test/ruby/test_compile_prism.rb b/test/ruby/test_compile_prism.rb index 66986af82797ad..afe39f9aef11d8 100644 --- a/test/ruby/test_compile_prism.rb +++ b/test/ruby/test_compile_prism.rb @@ -842,6 +842,24 @@ def test_RangeNode assert_prism_eval("...2") assert_prism_eval("1..") assert_prism_eval("1...") + assert_prism_eval("a1 = 1; a2 = 2; a1..a2") + assert_prism_eval("a1 = 1; a2 = 2; a1...a2") + assert_prism_eval("a2 = 2; ..a2") + assert_prism_eval("a2 = 2; ...a2") + assert_prism_eval("a1 = 1; a1..") + assert_prism_eval("a1 = 1; a1...") + assert_prism_eval("1..2; nil") + assert_prism_eval("1...2; nil") + assert_prism_eval("..2; nil") + assert_prism_eval("...2; nil") + assert_prism_eval("1..; nil") + assert_prism_eval("1...; nil") + assert_prism_eval("a1 = 1; a2 = 2; a1..a2; nil") + assert_prism_eval("a1 = 1; a2 = 2; a1...a2; nil") + assert_prism_eval("a2 = 2; ..a2; nil") + assert_prism_eval("a2 = 2; ...a2; nil") + assert_prism_eval("a1 = 1; a1..; nil") + assert_prism_eval("a1 = 1; a1...; nil") end def test_SplatNode From 8f678d69895d8b0562a52925a1840b698e021f56 Mon Sep 17 00:00:00 2001 From: ydah Date: Fri, 27 Sep 2024 02:32:27 +0900 Subject: [PATCH 505/829] Implement OP_ASGN2 NODE locations --- ast.c | 6 ++++++ node_dump.c | 5 ++++- parse.y | 26 +++++++++++++++----------- rubyparser.h | 3 +++ test/ruby/test_ast.rb | 14 ++++++++++++++ 5 files changed, 42 insertions(+), 12 deletions(-) diff --git a/ast.c b/ast.c index c32a22e7b5805e..5c7aa7b14e94f4 100644 --- a/ast.c +++ b/ast.c @@ -822,6 +822,12 @@ node_locations(VALUE ast_value, const NODE *node) location_new(&RNODE_OP_ASGN1(node)->opening_loc), location_new(&RNODE_OP_ASGN1(node)->closing_loc), location_new(&RNODE_OP_ASGN1(node)->binary_operator_loc)); + case NODE_OP_ASGN2: + return rb_ary_new_from_args(4, + location_new(nd_code_loc(node)), + location_new(&RNODE_OP_ASGN2(node)->call_operator_loc), + location_new(&RNODE_OP_ASGN2(node)->message_loc), + location_new(&RNODE_OP_ASGN2(node)->binary_operator_loc)); case NODE_REDO: return rb_ary_new_from_args(2, location_new(nd_code_loc(node)), diff --git a/node_dump.c b/node_dump.c index f9d8f006131951..9e4dd5158ca36e 100644 --- a/node_dump.c +++ b/node_dump.c @@ -560,8 +560,11 @@ dump_node(VALUE buf, VALUE indent, int comment, const NODE * node) A_ID(RNODE_OP_ASGN2(node)->nd_vid); } F_ID(nd_mid, RNODE_OP_ASGN2, "operator"); - LAST_NODE; F_NODE(nd_value, RNODE_OP_ASGN2, "rvalue"); + F_LOC(call_operator_loc, RNODE_OP_ASGN2); + F_LOC(message_loc, RNODE_OP_ASGN2); + LAST_NODE; + F_LOC(binary_operator_loc, RNODE_OP_ASGN2); return; case NODE_OP_ASGN_AND: diff --git a/parse.y b/parse.y index 6c0da9ce687c23..a60ab68afe6322 100644 --- a/parse.y +++ b/parse.y @@ -1087,7 +1087,7 @@ static rb_node_iasgn_t *rb_node_iasgn_new(struct parser_params *p, ID nd_vid, NO static rb_node_cdecl_t *rb_node_cdecl_new(struct parser_params *p, ID nd_vid, NODE *nd_value, NODE *nd_else, enum rb_parser_shareability shareability, const YYLTYPE *loc); static rb_node_cvasgn_t *rb_node_cvasgn_new(struct parser_params *p, ID nd_vid, NODE *nd_value, const YYLTYPE *loc); static rb_node_op_asgn1_t *rb_node_op_asgn1_new(struct parser_params *p, NODE *nd_recv, ID nd_mid, NODE *index, NODE *rvalue, const YYLTYPE *loc, const YYLTYPE *call_operator_loc, const YYLTYPE *opening_loc, const YYLTYPE *closing_loc, const YYLTYPE *binary_operator_loc); -static rb_node_op_asgn2_t *rb_node_op_asgn2_new(struct parser_params *p, NODE *nd_recv, NODE *nd_value, ID nd_vid, ID nd_mid, bool nd_aid, const YYLTYPE *loc); +static rb_node_op_asgn2_t *rb_node_op_asgn2_new(struct parser_params *p, NODE *nd_recv, NODE *nd_value, ID nd_vid, ID nd_mid, bool nd_aid, const YYLTYPE *loc, const YYLTYPE *call_operator_loc, const YYLTYPE *message_loc, const YYLTYPE *binary_operator_loc); static rb_node_op_asgn_or_t *rb_node_op_asgn_or_new(struct parser_params *p, NODE *nd_head, NODE *nd_value, const YYLTYPE *loc); static rb_node_op_asgn_and_t *rb_node_op_asgn_and_new(struct parser_params *p, NODE *nd_head, NODE *nd_value, const YYLTYPE *loc); static rb_node_op_cdecl_t *rb_node_op_cdecl_new(struct parser_params *p, NODE *nd_head, NODE *nd_value, ID nd_aid, enum rb_parser_shareability shareability, const YYLTYPE *loc); @@ -1195,7 +1195,7 @@ static rb_node_error_t *rb_node_error_new(struct parser_params *p, const YYLTYPE #define NEW_CDECL(v,val,path,share,loc) (NODE *)rb_node_cdecl_new(p,v,val,path,share,loc) #define NEW_CVASGN(v,val,loc) (NODE *)rb_node_cvasgn_new(p,v,val,loc) #define NEW_OP_ASGN1(r,id,idx,rval,loc,c_op_loc,o_loc,c_loc,b_op_loc) (NODE *)rb_node_op_asgn1_new(p,r,id,idx,rval,loc,c_op_loc,o_loc,c_loc,b_op_loc) -#define NEW_OP_ASGN2(r,t,i,o,val,loc) (NODE *)rb_node_op_asgn2_new(p,r,val,i,o,t,loc) +#define NEW_OP_ASGN2(r,t,i,o,val,loc,c_op_loc,m_loc,b_op_loc) (NODE *)rb_node_op_asgn2_new(p,r,val,i,o,t,loc,c_op_loc,m_loc,b_op_loc) #define NEW_OP_ASGN_OR(i,val,loc) (NODE *)rb_node_op_asgn_or_new(p,i,val,loc) #define NEW_OP_ASGN_AND(i,val,loc) (NODE *)rb_node_op_asgn_and_new(p,i,val,loc) #define NEW_OP_CDECL(v,op,val,share,loc) (NODE *)rb_node_op_cdecl_new(p,v,val,op,share,loc) @@ -1454,7 +1454,7 @@ static NODE *node_assign(struct parser_params*,NODE*,NODE*,struct lex_context,co static NODE *new_op_assign(struct parser_params *p, NODE *lhs, ID op, NODE *rhs, struct lex_context, const YYLTYPE *loc); static NODE *new_ary_op_assign(struct parser_params *p, NODE *ary, NODE *args, ID op, NODE *rhs, const YYLTYPE *args_loc, const YYLTYPE *loc, const YYLTYPE *call_operator_loc, const YYLTYPE *opening_loc, const YYLTYPE *closing_loc, const YYLTYPE *binary_operator_loc); -static NODE *new_attr_op_assign(struct parser_params *p, NODE *lhs, ID atype, ID attr, ID op, NODE *rhs, const YYLTYPE *loc); +static NODE *new_attr_op_assign(struct parser_params *p, NODE *lhs, ID atype, ID attr, ID op, NODE *rhs, const YYLTYPE *loc, const YYLTYPE *call_operator_loc, const YYLTYPE *message_loc, const YYLTYPE *binary_operator_loc); static NODE *new_const_op_assign(struct parser_params *p, NODE *lhs, ID op, NODE *rhs, struct lex_context, const YYLTYPE *loc); static NODE *new_bodystmt(struct parser_params *p, NODE *head, NODE *rescue, NODE *rescue_else, NODE *ensure, const YYLTYPE *loc); @@ -3278,7 +3278,7 @@ command_asgn : lhs '=' lex_ctxt command_rhs } | primary_value call_op ident_or_const tOP_ASGN lex_ctxt command_rhs { - $$ = new_attr_op_assign(p, $1, $2, $3, $4, $6, &@$); + $$ = new_attr_op_assign(p, $1, $2, $3, $4, $6, &@$, &@2, &@3, &@4); /*% ripper: opassign!(field!($:1, $:2, $:3), $:4, $:6) %*/ } | primary_value tCOLON2 tCONSTANT tOP_ASGN lex_ctxt command_rhs @@ -3289,7 +3289,7 @@ command_asgn : lhs '=' lex_ctxt command_rhs } | primary_value tCOLON2 tIDENTIFIER tOP_ASGN lex_ctxt command_rhs { - $$ = new_attr_op_assign(p, $1, idCOLON2, $3, $4, $6, &@$); + $$ = new_attr_op_assign(p, $1, idCOLON2, $3, $4, $6, &@$, &@2, &@3, &@4); /*% ripper: opassign!(field!($:1, $:2, $:3), $:4, $:6) %*/ } | defn_head[head] f_opt_paren_args[args] '=' endless_command[bodystmt] @@ -3878,17 +3878,17 @@ arg : lhs '=' lex_ctxt arg_rhs } | primary_value call_op tIDENTIFIER tOP_ASGN lex_ctxt arg_rhs { - $$ = new_attr_op_assign(p, $1, $2, $3, $4, $6, &@$); + $$ = new_attr_op_assign(p, $1, $2, $3, $4, $6, &@$, &@2, &@3, &@4); /*% ripper: opassign!(field!($:1, $:2, $:3), $:4, $:6) %*/ } | primary_value call_op tCONSTANT tOP_ASGN lex_ctxt arg_rhs { - $$ = new_attr_op_assign(p, $1, $2, $3, $4, $6, &@$); + $$ = new_attr_op_assign(p, $1, $2, $3, $4, $6, &@$, &@2, &@3, &@4); /*% ripper: opassign!(field!($:1, $:2, $:3), $:4, $:6) %*/ } | primary_value tCOLON2 tIDENTIFIER tOP_ASGN lex_ctxt arg_rhs { - $$ = new_attr_op_assign(p, $1, idCOLON2, $3, $4, $6, &@$); + $$ = new_attr_op_assign(p, $1, idCOLON2, $3, $4, $6, &@$, &@2, &@3, &@4); /*% ripper: opassign!(field!($:1, $:2, $:3), $:4, $:6) %*/ } | primary_value tCOLON2 tCONSTANT tOP_ASGN lex_ctxt arg_rhs @@ -11940,7 +11940,7 @@ rb_node_op_asgn1_new(struct parser_params *p, NODE *nd_recv, ID nd_mid, NODE *in } static rb_node_op_asgn2_t * -rb_node_op_asgn2_new(struct parser_params *p, NODE *nd_recv, NODE *nd_value, ID nd_vid, ID nd_mid, bool nd_aid, const YYLTYPE *loc) +rb_node_op_asgn2_new(struct parser_params *p, NODE *nd_recv, NODE *nd_value, ID nd_vid, ID nd_mid, bool nd_aid, const YYLTYPE *loc, const YYLTYPE *call_operator_loc, const YYLTYPE *message_loc, const YYLTYPE *binary_operator_loc) { rb_node_op_asgn2_t *n = NODE_NEWNODE(NODE_OP_ASGN2, rb_node_op_asgn2_t, loc); n->nd_recv = nd_recv; @@ -11948,6 +11948,9 @@ rb_node_op_asgn2_new(struct parser_params *p, NODE *nd_recv, NODE *nd_value, ID n->nd_vid = nd_vid; n->nd_mid = nd_mid; n->nd_aid = nd_aid; + n->call_operator_loc = *call_operator_loc; + n->message_loc = *message_loc; + n->binary_operator_loc = *binary_operator_loc; return n; } @@ -14849,11 +14852,12 @@ new_ary_op_assign(struct parser_params *p, NODE *ary, static NODE * new_attr_op_assign(struct parser_params *p, NODE *lhs, - ID atype, ID attr, ID op, NODE *rhs, const YYLTYPE *loc) + ID atype, ID attr, ID op, NODE *rhs, const YYLTYPE *loc, + const YYLTYPE *call_operator_loc, const YYLTYPE *message_loc, const YYLTYPE *binary_operator_loc) { NODE *asgn; - asgn = NEW_OP_ASGN2(lhs, CALL_Q_P(atype), attr, op, rhs, loc); + asgn = NEW_OP_ASGN2(lhs, CALL_Q_P(atype), attr, op, rhs, loc, call_operator_loc, message_loc, binary_operator_loc); fixpos(asgn, lhs); return asgn; } diff --git a/rubyparser.h b/rubyparser.h index e1a29b5661c11a..9ed7f356220d3a 100644 --- a/rubyparser.h +++ b/rubyparser.h @@ -469,6 +469,9 @@ typedef struct RNode_OP_ASGN2 { ID nd_vid; ID nd_mid; bool nd_aid; + rb_code_location_t call_operator_loc; + rb_code_location_t message_loc; + rb_code_location_t binary_operator_loc; } rb_node_op_asgn2_t; typedef struct RNode_OP_ASGN_AND { diff --git a/test/ruby/test_ast.rb b/test/ruby/test_ast.rb index f1328b15ed0cf3..8de4a5bfe2bb02 100644 --- a/test/ruby/test_ast.rb +++ b/test/ruby/test_ast.rb @@ -1397,6 +1397,20 @@ def test_or_locations assert_locations(node.children[-1].locations, [[1, 0, 1, 6], [1, 2, 1, 4]]) end + def test_op_asgn2_locations + node = ast_parse("a.b += 1") + assert_locations(node.children[-1].locations, [[1, 0, 1, 8], [1, 1, 1, 2], [1, 2, 1, 3], [1, 4, 1, 6]]) + + node = ast_parse("A::B.c += d") + assert_locations(node.children[-1].locations, [[1, 0, 1, 11], [1, 4, 1, 5], [1, 5, 1, 6], [1, 7, 1, 9]]) + + node = ast_parse("a = b.c += d") + assert_locations(node.children[-1].children[-1].locations, [[1, 4, 1, 12], [1, 5, 1, 6], [1, 6, 1, 7], [1, 8, 1, 10]]) + + node = ast_parse("a = A::B.c += d") + assert_locations(node.children[-1].children[-1].locations, [[1, 4, 1, 15], [1, 8, 1, 9], [1, 9, 1, 10], [1, 11, 1, 13]]) + end + def test_redo_locations node = ast_parse("loop { redo }") assert_locations(node.children[-1].children[-1].children[-1].locations, [[1, 7, 1, 11], [1, 7, 1, 11]]) From b9e225fcbfd045e65f1a95bcef16d97cbfb97287 Mon Sep 17 00:00:00 2001 From: tompng Date: Sat, 28 Sep 2024 13:15:29 +0900 Subject: [PATCH 506/829] Allow dot3 in defs singleton --- parse.y | 9 +++++++-- test/ruby/test_syntax.rb | 2 ++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/parse.y b/parse.y index a60ab68afe6322..16a687b5948ebe 100644 --- a/parse.y +++ b/parse.y @@ -3426,7 +3426,6 @@ defn_head : k_def def_name defs_head : k_def singleton dot_or_colon { SET_LEX_STATE(EXPR_FNAME); - p->ctxt.in_argdef = 1; } def_name { @@ -6746,8 +6745,14 @@ singleton : var_ref value_expr($1); $$ = $1; } - | '(' {SET_LEX_STATE(EXPR_BEG);} expr rparen + | '(' + { + SET_LEX_STATE(EXPR_BEG); + p->ctxt.in_argdef = 0; + } + expr rparen { + p->ctxt.in_argdef = 1; NODE *expr = last_expr_node($3); switch (nd_type(expr)) { case NODE_STR: diff --git a/test/ruby/test_syntax.rb b/test/ruby/test_syntax.rb index 5c341a69b70b06..3ea6932b9c83c2 100644 --- a/test/ruby/test_syntax.rb +++ b/test/ruby/test_syntax.rb @@ -1968,6 +1968,8 @@ def test_argument_forwarding assert_valid_syntax("def foo b = 1, ...; bar(...); end") assert_valid_syntax("(def foo ...\n bar(...)\nend)") assert_valid_syntax("(def foo ...; bar(...); end)") + assert_valid_syntax("def (1...).foo ...; bar(...); end") + assert_valid_syntax("def (tap{1...}).foo ...; bar(...); end") assert_valid_syntax('def ==(...) end') assert_valid_syntax('def [](...) end') assert_valid_syntax('def nil(...) end') From 47a3482a414013bdbbcb9da4bc3bea7451977009 Mon Sep 17 00:00:00 2001 From: Ellen Marie Dash Date: Fri, 27 Sep 2024 21:13:00 -0400 Subject: [PATCH 507/829] [rubygems/rubygems] Remove code that makes suggest_gems_from_name give worse results. https://github.com/rubygems/rubygems/commit/09ec67ffdf --- lib/rubygems/spec_fetcher.rb | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/lib/rubygems/spec_fetcher.rb b/lib/rubygems/spec_fetcher.rb index 610edf25c92155..9c0399f19653dc 100644 --- a/lib/rubygems/spec_fetcher.rb +++ b/lib/rubygems/spec_fetcher.rb @@ -176,19 +176,12 @@ def suggest_gems_from_name(gem_name, type = :latest, num_results = 5) matches = names.map do |n| next unless n.match_platform? - [n.name, 0] if n.name.downcase.tr("_-", "").include?(gem_name) + distance = levenshtein_distance gem_name, n.name.downcase.tr("_-", "") + next if distance >= max + return [n.name] if distance == 0 + [n.name, distance] end.compact - if matches.length < num_results - matches += names.map do |n| - next unless n.match_platform? - distance = levenshtein_distance gem_name, n.name.downcase.tr("_-", "") - next if distance >= max - return [n.name] if distance == 0 - [n.name, distance] - end.compact - end - matches = if matches.empty? && type != :prerelease suggest_gems_from_name gem_name, :prerelease else From 5c18b63d0058d3d4acfce3588c3b47f3ae6c46bd Mon Sep 17 00:00:00 2001 From: Ellen Marie Dash Date: Sat, 28 Sep 2024 14:57:59 -0400 Subject: [PATCH 508/829] [rubygems/rubygems] [tests] Don't expect suggestions that aren't actually helpful. https://github.com/rubygems/rubygems/commit/e7d6b92e31 --- test/rubygems/test_gem_commands_exec_command.rb | 5 +---- test/rubygems/test_gem_spec_fetcher.rb | 10 +++++----- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/test/rubygems/test_gem_commands_exec_command.rb b/test/rubygems/test_gem_commands_exec_command.rb index fd48ce73ca3365..c632ce62b2d524 100644 --- a/test/rubygems/test_gem_commands_exec_command.rb +++ b/test/rubygems/test_gem_commands_exec_command.rb @@ -493,7 +493,6 @@ def test_version_mismatch assert_equal 2, e.exit_code assert_equal <<~ERR, @ui.error ERROR: Could not find a valid gem 'a' (= 2) in any repository - ERROR: Possible alternatives: a ERR end end @@ -574,7 +573,6 @@ def test_conservative_missing_gem assert_include @ui.output, "a (= 2) not available locally" assert_equal <<~ERROR, @ui.error ERROR: Could not find a valid gem 'a' (= 2) in any repository - ERROR: Possible alternatives: a ERROR end end @@ -769,8 +767,7 @@ def test_only_prerelease_available assert_raise Gem::MockGemUi::TermError do invoke "a" end - assert_equal "ERROR: Could not find a valid gem 'a' (>= 0) in any repository\n" \ - "ERROR: Possible alternatives: a\n", @ui.error + assert_equal "ERROR: Could not find a valid gem 'a' (>= 0) in any repository\n", @ui.error assert_empty @ui.output assert_empty @installed_specs end diff --git a/test/rubygems/test_gem_spec_fetcher.rb b/test/rubygems/test_gem_spec_fetcher.rb index cb4a4f7204778e..b7c88b22f9268a 100644 --- a/test/rubygems/test_gem_spec_fetcher.rb +++ b/test/rubygems/test_gem_spec_fetcher.rb @@ -168,20 +168,20 @@ def src.fetch_spec(name) def test_suggest_gems_from_name_latest spec_fetcher do|fetcher| fetcher.spec "example", 1 - fetcher.spec "other-example", 1 + fetcher.spec "an-example", 1 fetcher.spec "examp", 1 end suggestions = @sf.suggest_gems_from_name("examplw", :latest, 1) assert_equal ["example"], suggestions - suggestions = @sf.suggest_gems_from_name("other") - assert_equal ["other-example"], suggestions + suggestions = @sf.suggest_gems_from_name("anexample") + assert_equal ["an-example"], suggestions - suggestions = @sf.suggest_gems_from_name("exam") + suggestions = @sf.suggest_gems_from_name("xample") assert suggestions.any? { ["examp"] } assert suggestions.any? { ["example"] } - assert suggestions.any? { ["other-example"] } + assert suggestions.any? { ["an-example"] } end def test_suggest_gems_from_name_prerelease From 87212a54862e86f1fa224e68bd3bdb1f81b7da5d Mon Sep 17 00:00:00 2001 From: Ellen Marie Dash Date: Sat, 28 Sep 2024 15:34:52 -0400 Subject: [PATCH 509/829] [rubygems/rubygems] Improve Gem::SpecFetcher tests. https://github.com/rubygems/rubygems/commit/6e0456583b --- test/rubygems/test_gem_spec_fetcher.rb | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/test/rubygems/test_gem_spec_fetcher.rb b/test/rubygems/test_gem_spec_fetcher.rb index b7c88b22f9268a..fac107b576bae8 100644 --- a/test/rubygems/test_gem_spec_fetcher.rb +++ b/test/rubygems/test_gem_spec_fetcher.rb @@ -170,6 +170,7 @@ def test_suggest_gems_from_name_latest fetcher.spec "example", 1 fetcher.spec "an-example", 1 fetcher.spec "examp", 1 + fetcher.spec "other-example", 1 end suggestions = @sf.suggest_gems_from_name("examplw", :latest, 1) @@ -179,9 +180,10 @@ def test_suggest_gems_from_name_latest assert_equal ["an-example"], suggestions suggestions = @sf.suggest_gems_from_name("xample") - assert suggestions.any? { ["examp"] } - assert suggestions.any? { ["example"] } - assert suggestions.any? { ["an-example"] } + assert_equal ["example"], suggestions + + suggestions = @sf.suggest_gems_from_name("other-apple") + assert_equal ["other-example"], suggestions end def test_suggest_gems_from_name_prerelease From 5a7b66fa97d0a7eee4c9a2e9ce8196f91539986f Mon Sep 17 00:00:00 2001 From: Burdette Lamar Date: Sat, 28 Sep 2024 19:58:14 -0500 Subject: [PATCH 510/829] [DOC] Tweaks for Array#flatten (#11688) --- array.c | 48 +++++++++++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/array.c b/array.c index dd3f99064f7b68..c94d2cb1975acb 100644 --- a/array.c +++ b/array.c @@ -6546,35 +6546,37 @@ rb_ary_flatten_bang(int argc, VALUE *argv, VALUE ary) /* * call-seq: - * array.flatten -> new_array - * array.flatten(level) -> new_array + * flatten(depth = nil) -> new_array * - * Returns a new +Array+ that is a recursive flattening of +self+: - * - Each non-Array element is unchanged. - * - Each +Array+ is replaced by its individual elements. + * Returns a new array that is a recursive flattening of +self+ + * to +depth+ levels of recursion; + * +depth+ must be an + * {integer-convertible object}[rdoc-ref:implicit_conversion.rdoc@Integer-Convertible+Objects] + * or +nil+. + * At each level of recursion: * - * With non-negative Integer argument +level+, flattens recursively through +level+ levels: + * - Each element that is an array is "flattened" + * (that is, replaced by its individual array elements). + * - Each element that is not an array is unchanged + * (even if the element is an object that has instance method +flatten+). * - * a = [ 0, [ 1, [2, 3], 4 ], 5 ] - * a.flatten(0) # => [0, [1, [2, 3], 4], 5] - * a = [ 0, [ 1, [2, 3], 4 ], 5 ] - * a.flatten(1) # => [0, 1, [2, 3], 4, 5] - * a = [ 0, [ 1, [2, 3], 4 ], 5 ] - * a.flatten(2) # => [0, 1, 2, 3, 4, 5] - * a = [ 0, [ 1, [2, 3], 4 ], 5 ] - * a.flatten(3) # => [0, 1, 2, 3, 4, 5] + * With non-negative integer argument +depth+, flattens recursively through +depth+ levels: * - * With no argument, a +nil+ argument, or with negative argument +level+, flattens all levels: + * a = [ 0, [ 1, [2, 3], 4 ], 5, {foo: 0}, Set.new([6, 7]) ] + * a # => [0, [1, [2, 3], 4], 5, {:foo=>0}, #] + * a.flatten(0) # => [0, [1, [2, 3], 4], 5, {:foo=>0}, #] + * a.flatten(1 ) # => [0, 1, [2, 3], 4, 5, {:foo=>0}, #] + * a.flatten(1.1) # => [0, 1, [2, 3], 4, 5, {:foo=>0}, #] + * a.flatten(2) # => [0, 1, 2, 3, 4, 5, {:foo=>0}, #] + * a.flatten(3) # => [0, 1, 2, 3, 4, 5, {:foo=>0}, #] * - * a = [ 0, [ 1, [2, 3], 4 ], 5 ] - * a.flatten # => [0, 1, 2, 3, 4, 5] - * [0, 1, 2].flatten # => [0, 1, 2] - * a = [ 0, [ 1, [2, 3], 4 ], 5 ] - * a.flatten(-1) # => [0, 1, 2, 3, 4, 5] - * a = [ 0, [ 1, [2, 3], 4 ], 5 ] - * a.flatten(-2) # => [0, 1, 2, 3, 4, 5] - * [0, 1, 2].flatten(-1) # => [0, 1, 2] + * With +nil+ or negative +depth+, flattens all levels. + * + * a.flatten # => [0, 1, 2, 3, 4, 5, {:foo=>0}, #] + * a.flatten(-1) # => [0, 1, 2, 3, 4, 5, {:foo=>0}, #] * + * Related: Array#flatten!; + * see also {Methods for Converting}[rdoc-ref:Array@Methods+for+Converting]. */ static VALUE From d64528c69564989a9a72e398ba05a4c2a2eefff1 Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Thu, 26 Sep 2024 14:40:28 -0500 Subject: [PATCH 511/829] [DOC] Tweaks for Array#freeze --- array.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/array.c b/array.c index c94d2cb1975acb..276646fc0ddb04 100644 --- a/array.c +++ b/array.c @@ -629,16 +629,19 @@ ary_ensure_room_for_push(VALUE ary, long add_len) /* * call-seq: - * array.freeze -> self + * freeze -> self * - * Freezes +self+; returns +self+: + * Freezes +self+ (if not already frozen); returns +self+: * * a = [] * a.frozen? # => false * a.freeze * a.frozen? # => true * - * An attempt to modify a frozen +Array+ raises FrozenError. + * No further changes may be made to +self+; + * raises FrozenError if a change is attempted. + * + * Related: Kernel#frozen?. */ VALUE From 3986b5fef5f813573f8b60b0ab6644b445e338eb Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Thu, 26 Sep 2024 16:27:50 -0500 Subject: [PATCH 512/829] [DOC] Tweaks for Array#include? --- array.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/array.c b/array.c index 276646fc0ddb04..fdd77759176efc 100644 --- a/array.c +++ b/array.c @@ -5290,13 +5290,16 @@ rb_ary_hash(VALUE ary) /* * call-seq: - * array.include?(obj) -> true or false + * include?(object) -> true or false * - * Returns +true+ if for some index +i+ in +self+, obj == self[i]; - * otherwise +false+: + * Returns whether for some element +element+ in +self+, + * object == element: * - * [0, 1, 2].include?(2) # => true - * [0, 1, 2].include?(3) # => false + * [0, 1, 2].include?(2) # => true + * [0, 1, 2].include?(2.0) # => true + * [0, 1, 2].include?(2.1) # => false + * + * Related: see {Methods for Querying}[rdoc-ref:Array@Methods+for+Querying]. */ VALUE From 01ff65af32a57fda3e9c993bad7761788260e2e5 Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Fri, 27 Sep 2024 07:02:17 -0500 Subject: [PATCH 513/829] [DOC] Tweaks for Array#replace --- array.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/array.c b/array.c index fdd77759176efc..52b0fe6b99d712 100644 --- a/array.c +++ b/array.c @@ -4604,13 +4604,17 @@ rb_ary_transpose(VALUE ary) /* * call-seq: - * array.replace(other_array) -> self + * initialize_copy(other_array) -> self + * replace(other_array) -> self * - * Replaces the content of +self+ with the content of +other_array+; returns +self+: + * Replaces the elements of +self+ with the elements of +other_array+, which must be an + * {array-convertible object}[rdoc-ref:implicit_conversion.rdoc@Array-Convertible+Objects]; + * returns +self+: * - * a = [:foo, 'bar', 2] - * a.replace(['foo', :bar, 3]) # => ["foo", :bar, 3] + * a = ['a', 'b', 'c'] # => ["a", "b", "c"] + * a.replace(['d', 'e']) # => ["d", "e"] * + * Related: see {Methods for Assigning}[rdoc-ref:Array@Methods+for+Assigning]. */ VALUE From e1889dd7dedb8afc8571de01f363366b1f8f1a24 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sun, 29 Sep 2024 11:42:10 +0900 Subject: [PATCH 514/829] Assertions should not have side effects --- thread_pthread.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/thread_pthread.c b/thread_pthread.c index 6c8ec356711e4b..c9a5c60bd56725 100644 --- a/thread_pthread.c +++ b/thread_pthread.c @@ -2360,7 +2360,8 @@ rb_threadptr_sched_free(rb_thread_t *th) } ruby_xfree(th->sched.context); - VM_ASSERT((th->sched.context = NULL) == NULL); + th->sched.context = NULL; + // VM_ASSERT(th->sched.context == NULL); #else ruby_xfree(th->sched.context_stack); native_thread_destroy(th->nt); From 3b43585a84978e9ca9b474ba55087edfd0863147 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sun, 29 Sep 2024 18:07:33 +0900 Subject: [PATCH 515/829] Extract common code from `pack_pack` and `pack_unpack_internal` --- pack.c | 145 +++++++++++++++++++++++---------------------------------- 1 file changed, 57 insertions(+), 88 deletions(-) diff --git a/pack.c b/pack.c index 1b0d66f9900995..4ea768919e3510 100644 --- a/pack.c +++ b/pack.c @@ -193,6 +193,53 @@ VALUE_to_float(VALUE obj) } } +static char * +skip_to_eol(const char *p, const char *pend) +{ + p = memchr(p, '\n', pend - p); + return (char *)(p ? p + 1 : pend); +} + +#define skip_blank(p, type) \ + (ISSPACE(type) || (type == '#' && (p = skip_to_eol(p, pend), 1))) + +#ifndef NATINT_PACK +# define pack_modifiers(p, t, n, e) pack_modifiers(p, t, e) +#endif +static char * +pack_modifiers(const char *p, char type, int *natint, int *explicit_endian) +{ + while (1) { + switch (*p) { + case '_': + case '!': + if (strchr(natstr, type)) { +#ifdef NATINT_PACK + *natint = 1; +#endif + p++; + } + else { + rb_raise(rb_eArgError, "'%c' allowed only after types %s", *p, natstr); + } + break; + + case '<': + case '>': + if (!strchr(endstr, type)) { + rb_raise(rb_eArgError, "'%c' allowed only after types %s", *p, endstr); + } + if (*explicit_endian) { + rb_raise(rb_eRangeError, "Can't use both '<' and '>'"); + } + *explicit_endian = *p++; + break; + default: + return (char *)p; + } + } +} + static VALUE pack_pack(rb_execution_context_t *ec, VALUE ary, VALUE fmt, VALUE buffer) { @@ -200,13 +247,9 @@ pack_pack(rb_execution_context_t *ec, VALUE ary, VALUE fmt, VALUE buffer) static const char spc10[] = " "; const char *p, *pend; VALUE res, from, associates = 0; - char type; long len, idx, plen; const char *ptr; int enc_info = 1; /* 0 - BINARY, 1 - US-ASCII, 2 - UTF-8 */ -#ifdef NATINT_PACK - int natint; /* native integer */ -#endif int integer_size, bigendian_p; StringValue(fmt); @@ -233,50 +276,16 @@ pack_pack(rb_execution_context_t *ec, VALUE ary, VALUE fmt, VALUE buffer) while (p < pend) { int explicit_endian = 0; - if (RSTRING_PTR(fmt) + RSTRING_LEN(fmt) != pend) { + if (RSTRING_END(fmt) != pend) { rb_raise(rb_eRuntimeError, "format string modified"); } - type = *p++; /* get data type */ -#ifdef NATINT_PACK - natint = 0; -#endif - - if (ISSPACE(type)) continue; - if (type == '#') { - while ((p < pend) && (*p != '\n')) { - p++; - } - continue; - } - - { - modifiers: - switch (*p) { - case '_': - case '!': - if (strchr(natstr, type)) { + const char type = *p++; /* get data type */ #ifdef NATINT_PACK - natint = 1; + int natint = 0; /* native integer */ #endif - p++; - } - else { - rb_raise(rb_eArgError, "'%c' allowed only after types %s", *p, natstr); - } - goto modifiers; - case '<': - case '>': - if (!strchr(endstr, type)) { - rb_raise(rb_eArgError, "'%c' allowed only after types %s", *p, endstr); - } - if (explicit_endian) { - rb_raise(rb_eRangeError, "Can't use both '<' and '>'"); - } - explicit_endian = *p++; - goto modifiers; - } - } + if (skip_blank(p, type)) continue; + p = pack_modifiers(p, type, &natint, &explicit_endian); if (*p == '*') { /* set data length */ len = strchr("@Xxu", type) ? 0 @@ -945,13 +954,8 @@ pack_unpack_internal(VALUE str, VALUE fmt, enum unpack_mode mode, long offset) char *s, *send; char *p, *pend; VALUE ary, associates = Qfalse; - char type; long len; AVOID_CC_BUG long tmp_len; - int star; -#ifdef NATINT_PACK - int natint; /* native integer */ -#endif int signed_p, integer_size, bigendian_p; #define UNPACK_PUSH(item) do {\ VALUE item_val = (item);\ @@ -986,49 +990,14 @@ pack_unpack_internal(VALUE str, VALUE fmt, enum unpack_mode mode, long offset) ary = mode == UNPACK_ARRAY ? rb_ary_new() : Qnil; while (p < pend) { int explicit_endian = 0; - type = *p++; + const char type = *p++; #ifdef NATINT_PACK - natint = 0; + int natint = 0; /* native integer */ #endif + int star = 0; - if (ISSPACE(type)) continue; - if (type == '#') { - while ((p < pend) && (*p != '\n')) { - p++; - } - continue; - } - - star = 0; - { - modifiers: - switch (*p) { - case '_': - case '!': - - if (strchr(natstr, type)) { -#ifdef NATINT_PACK - natint = 1; -#endif - p++; - } - else { - rb_raise(rb_eArgError, "'%c' allowed only after types %s", *p, natstr); - } - goto modifiers; - - case '<': - case '>': - if (!strchr(endstr, type)) { - rb_raise(rb_eArgError, "'%c' allowed only after types %s", *p, endstr); - } - if (explicit_endian) { - rb_raise(rb_eRangeError, "Can't use both '<' and '>'"); - } - explicit_endian = *p++; - goto modifiers; - } - } + if (skip_blank(p, type)) continue; + p = pack_modifiers(p, type, &natint, &explicit_endian); if (p >= pend) len = 1; From 066ac0fdc2703ef627dab19cbb275d9aa28857a3 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sun, 29 Sep 2024 18:53:55 +0900 Subject: [PATCH 516/829] Expand buffer at once then fill it at once --- pack.c | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/pack.c b/pack.c index 4ea768919e3510..3a5c1bfb9677cf 100644 --- a/pack.c +++ b/pack.c @@ -193,6 +193,14 @@ VALUE_to_float(VALUE obj) } } +static void +str_expand_fill(VALUE res, int c, long len) +{ + long olen = RSTRING_LEN(res); + memset(RSTRING_PTR(res) + olen, c, len); + rb_str_set_len(res, olen + len); +} + static char * skip_to_eol(const char *p, const char *pend) { @@ -243,8 +251,6 @@ pack_modifiers(const char *p, char type, int *natint, int *explicit_endian) static VALUE pack_pack(rb_execution_context_t *ec, VALUE ary, VALUE fmt, VALUE buffer) { - static const char nul10[] = "\0\0\0\0\0\0\0\0\0\0"; - static const char spc10[] = " "; const char *p, *pend; VALUE res, from, associates = 0; long len, idx, plen; @@ -342,16 +348,12 @@ pack_pack(rb_execution_context_t *ec, VALUE ary, VALUE fmt, VALUE buffer) if (plen >= len) { rb_str_buf_cat(res, ptr, len); if (p[-1] == '*' && type == 'Z') - rb_str_buf_cat(res, nul10, 1); + rb_str_buf_cat(res, "", 1); } else { + rb_str_modify_expand(res, len); rb_str_buf_cat(res, ptr, plen); - len -= plen; - while (len >= 10) { - rb_str_buf_cat(res, (type == 'A')?spc10:nul10, 10); - len -= 10; - } - rb_str_buf_cat(res, (type == 'A')?spc10:nul10, len); + str_expand_fill(res, (type == 'A' ? ' ' : '\0'), len - plen); } break; @@ -625,11 +627,8 @@ pack_pack(rb_execution_context_t *ec, VALUE ary, VALUE fmt, VALUE buffer) case 'x': /* null byte */ grow: - while (len >= 10) { - rb_str_buf_cat(res, nul10, 10); - len -= 10; - } - rb_str_buf_cat(res, nul10, len); + rb_str_modify_expand(res, len); + str_expand_fill(res, '\0', len); break; case 'X': /* back up byte */ From e7144af7504aca614b8f9e04aba848afd3e70945 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sun, 29 Sep 2024 19:07:16 +0900 Subject: [PATCH 517/829] [DOC] Refine about offset directives --- doc/packed_data.rdoc | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/doc/packed_data.rdoc b/doc/packed_data.rdoc index 17bbf92023d7a5..fa95db9106eca6 100644 --- a/doc/packed_data.rdoc +++ b/doc/packed_data.rdoc @@ -564,26 +564,42 @@ for one byte in the input or output string. == Offset Directives - '@' - Begin packing at the given byte offset; - for packing, null fill if necessary: + for packing, null fill or shrink if necessary: + + [1, 2].pack("C@0C") # => "\x02" + [1, 2].pack("C@1C") # => "\x01\x02" + [1, 2].pack("C@5C") # => "\x01\x00\x00\x00\x00\x02" + [*1..5].pack("CCCC@2C") # => "\x01\x02\x05" - [1, 2].pack("C@0C") # => "\x02" - [1, 2].pack("C@1C") # => "\x01\x02" - [1, 2].pack("C@5C") # => "\x01\x00\x00\x00\x00\x02" + For unpacking, cannot to move to outside the string: "\x01\x00\x00\x02".unpack("C@3C") # => [1, 2] "\x00".unpack("@1C") # => [nil] + "\x00".unpack("@2C") # Raises ArgumentError. -- 'X' - Back up a byte: +- 'X' - For packing, shrink for the given byte offset: [0, 1, 2].pack("CCXC") # => "\x00\x02" [0, 1, 2].pack("CCX2C") # => "\x02" + + For unpacking; rewind unpacking position for the given byte offset: + "\x00\x02".unpack("CCXC") # => [0, 2, 2] -== Null Byte Directive + Cannot to move to outside the string: -- 'x' - Null byte: + [0, 1, 2].pack("CCX3C") # Raises ArgumentError. + "\x00\x02".unpack("CX3C") # Raises ArgumentError. + +- 'x' - Begin packing at after the given byte offset; + for packing, null fill if necessary: [].pack("x0") # => "" [].pack("x") # => "\x00" [].pack("x8") # => "\x00\x00\x00\x00\x00\x00\x00\x00" + + For unpacking, cannot to move to outside the string: + "\x00\x00\x02".unpack("CxC") # => [0, 2] + "\x00\x00\x02".unpack("x3C") # => [nil] + "\x00\x00\x02".unpack("x4C") # Raises ArgumentError From 65a0795c3f92be5bff27211600cf3a832ab43b2f Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sun, 29 Sep 2024 19:09:59 +0900 Subject: [PATCH 518/829] [DOC] Mention block mode of `String#unpack` --- pack.rb | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/pack.rb b/pack.rb index b6e29c3eab4f12..e70c6c7dc8b77d 100644 --- a/pack.rb +++ b/pack.rb @@ -11,10 +11,14 @@ def pack(fmt, buffer: nil) class String # call-seq: - # unpack(template, offset: 0) -> array + # unpack(template, offset: 0, &block) -> array + # + # Extracts data from +self+. + # + # If +block+ is not given, forming objects that become the elements + # of a new array, and returns that array. Otherwise, yields each + # object. # - # Extracts data from +self+, forming objects that become the elements of a new array; - # returns that array. # See {Packed Data}[rdoc-ref:packed_data.rdoc]. def unpack(fmt, offset: 0) Primitive.attr! :use_block From 1179c86384bb6211d45bf721651b100dca1fb53e Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Fri, 3 May 2024 22:22:19 +0900 Subject: [PATCH 519/829] win32/sspi: Already Fixnum has been removed years ago --- ext/win32/lib/win32/sspi.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/win32/lib/win32/sspi.rb b/ext/win32/lib/win32/sspi.rb index 20205fd4d6e4f8..9dbd4377a429bf 100644 --- a/ext/win32/lib/win32/sspi.rb +++ b/ext/win32/lib/win32/sspi.rb @@ -204,7 +204,7 @@ def ok? def ==(other) if other.is_a?(SSPIResult) @value == other.value - elsif other.is_a?(Fixnum) + elsif other.is_a?(Integer) @value == @@map[other] else false From b7bca0ebdc5a48c487bc4fa42e749bb23f66bca0 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Fri, 3 May 2024 22:24:44 +0900 Subject: [PATCH 520/829] win32/sspi: Fix Win32::SSPI::SSPIResult#== with Integer The values of `@@map` are `Symbol`s and `@value` should be an `Integer` since unpacked as unsigned long, so this comparison should be false always. Probably comparison with `Symbol` was intended. --- ext/win32/lib/win32/sspi.rb | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/ext/win32/lib/win32/sspi.rb b/ext/win32/lib/win32/sspi.rb index 9dbd4377a429bf..9407237b344ecd 100644 --- a/ext/win32/lib/win32/sspi.rb +++ b/ext/win32/lib/win32/sspi.rb @@ -202,10 +202,13 @@ def ok? end def ==(other) - if other.is_a?(SSPIResult) + case other + when SSPIResult @value == other.value - elsif other.is_a?(Integer) - @value == @@map[other] + when Integer + @value == other + when Symbol + @@map[@value] == other else false end From fc2f196cb8542a81bf271cdb90e0189c54321103 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Fri, 3 May 2024 22:30:22 +0900 Subject: [PATCH 521/829] win32/sspi: Fix missing A suffix in an API constant name --- ext/win32/lib/win32/sspi.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/win32/lib/win32/sspi.rb b/ext/win32/lib/win32/sspi.rb index 9407237b344ecd..90b15038054f52 100644 --- a/ext/win32/lib/win32/sspi.rb +++ b/ext/win32/lib/win32/sspi.rb @@ -295,7 +295,7 @@ def complete_authentication(token) end outputBuffer = SecurityBuffer.new - result = SSPIResult.new(API::InitializeSecurityContext.call(@credentials.to_p, @context.to_p, nil, + result = SSPIResult.new(API::InitializeSecurityContextA.call(@credentials.to_p, @context.to_p, nil, REQUEST_FLAGS, 0, SECURITY_NETWORK_DREP, SecurityBuffer.new(token).to_p, 0, @context.to_p, outputBuffer.to_p, @contextAttributes, TimeStamp.new.to_p)) From 30230ed9e66cfbb97f8ba6859c8313061de7d58b Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Fri, 3 May 2024 22:31:44 +0900 Subject: [PATCH 522/829] win32/sspi: For Ractor use a constant instead of a class variable --- ext/win32/lib/win32/sspi.rb | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/ext/win32/lib/win32/sspi.rb b/ext/win32/lib/win32/sspi.rb index 90b15038054f52..cbd9e899ee7e82 100644 --- a/ext/win32/lib/win32/sspi.rb +++ b/ext/win32/lib/win32/sspi.rb @@ -181,20 +181,19 @@ class SSPIResult SEC_E_SECPKG_NOT_FOUND = 0x80090305 SEC_E_UNKNOWN_CREDENTIALS = 0x8009030D - @@map = {} - constants.each { |v| @@map[self.const_get(v.to_s)] = v } + RESULT_MAP = constants.to_h {|v| [const_get(v), v]}.freeze attr_reader :value def initialize(value) # convert to unsigned long value = [value].pack("L").unpack("L").first - raise "#{value.to_s(16)} is not a recognized result" unless @@map.has_key? value + raise "#{value.to_s(16)} is not a recognized result" unless RESULT_MAP.key? value @value = value end def to_s - @@map[@value].to_s + RESULT_MAP[@value].to_s end def ok? @@ -208,7 +207,7 @@ def ==(other) when Integer @value == other when Symbol - @@map[@value] == other + RESULT_MAP[@value] == other else false end From 25eb9bded8bd60dcf186f393acf84a4e623b60e1 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Fri, 3 May 2024 22:33:28 +0900 Subject: [PATCH 523/829] win32/sspi: Rafactor pack/unpack --- ext/win32/lib/win32/sspi.rb | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/ext/win32/lib/win32/sspi.rb b/ext/win32/lib/win32/sspi.rb index cbd9e899ee7e82..b4bddc67b31fa8 100644 --- a/ext/win32/lib/win32/sspi.rb +++ b/ext/win32/lib/win32/sspi.rb @@ -56,11 +56,11 @@ module API # SecHandle struct class SecurityHandle def upper - @struct.unpack("LL")[1] + @struct.unpack1("x4L") end def lower - @struct.unpack("LL")[0] + @struct.unpack1("L") end def to_p @@ -129,7 +129,7 @@ def to_p def unpack if ! @unpacked && @sec_buffer && @struct @bufferSize, @type = @sec_buffer.unpack("LL") - @buffer = @sec_buffer.unpack("LLP#{@bufferSize}")[2] + @buffer = @sec_buffer.unpack1("x8P#{@bufferSize}") @struct = nil @sec_buffer = nil @unpacked = true @@ -187,7 +187,7 @@ class SSPIResult def initialize(value) # convert to unsigned long - value = [value].pack("L").unpack("L").first + value &= 0xffffffff raise "#{value.to_s(16)} is not a recognized result" unless RESULT_MAP.key? value @value = value end @@ -290,7 +290,7 @@ def complete_authentication(token) if token.include? B64_TOKEN_PREFIX # indicates base64 encoded token - token = token.strip.unpack("m")[0] + token = token.strip.unpack1("m") end outputBuffer = SecurityBuffer.new @@ -332,8 +332,7 @@ def get_credentials end def encode_token(t) - # encode64 will add newlines every 60 characters so we need to remove those. - [t].pack("m").delete("\n") + [t].pack("m0") end end end From f5d9d9b5f8bce3c1f7003221e02877fcf7e9b727 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Fri, 3 May 2024 22:48:41 +0900 Subject: [PATCH 524/829] win32/sspi: Use `start_with?` to see prefix --- ext/win32/lib/win32/sspi.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ext/win32/lib/win32/sspi.rb b/ext/win32/lib/win32/sspi.rb index b4bddc67b31fa8..f382f3cf506928 100644 --- a/ext/win32/lib/win32/sspi.rb +++ b/ext/win32/lib/win32/sspi.rb @@ -283,12 +283,12 @@ def complete_authentication(token) # Nil token OK, just set it to empty string token = "" if token.nil? - if token.include? "Negotiate" + if token.start_with? "Negotiate" # If the Negotiate prefix is passed in, assume we are seeing "Negotiate " and get the token. - token = token.split(" ").last + token = token.split(" ", 2).last end - if token.include? B64_TOKEN_PREFIX + if token.start_with? B64_TOKEN_PREFIX # indicates base64 encoded token token = token.strip.unpack1("m") end @@ -309,7 +309,7 @@ def complete_authentication(token) clean_up unless @cleaned_up end - private + private def clean_up # free structures allocated From 52e40aeab60e46bc59e34e20b80c5c7f4abb889f Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sun, 29 Sep 2024 21:38:14 +0900 Subject: [PATCH 525/829] Bump actions/checkout --- .github/workflows/annocheck.yml | 2 +- .github/workflows/baseruby.yml | 2 +- .github/workflows/bundled_gems.yml | 2 +- .github/workflows/check_dependencies.yml | 2 +- .github/workflows/check_misc.yml | 2 +- .github/workflows/codeql-analysis.yml | 2 +- .github/workflows/compilers.yml | 24 ++++++++++++------------ .github/workflows/macos.yml | 2 +- .github/workflows/mingw.yml | 2 +- .github/workflows/parsey.yml | 2 +- .github/workflows/rjit-bindgen.yml | 2 +- .github/workflows/rjit.yml | 2 +- .github/workflows/scorecards.yml | 2 +- .github/workflows/spec_guards.yml | 2 +- .github/workflows/ubuntu.yml | 2 +- .github/workflows/wasm.yml | 2 +- .github/workflows/windows.yml | 2 +- .github/workflows/yjit-macos.yml | 4 ++-- .github/workflows/yjit-ubuntu.yml | 6 +++--- 19 files changed, 33 insertions(+), 33 deletions(-) diff --git a/.github/workflows/annocheck.yml b/.github/workflows/annocheck.yml index 848695db24df15..c9fefbb022b7af 100644 --- a/.github/workflows/annocheck.yml +++ b/.github/workflows/annocheck.yml @@ -63,7 +63,7 @@ jobs: - run: id working-directory: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: sparse-checkout-cone-mode: false sparse-checkout: /.github diff --git a/.github/workflows/baseruby.yml b/.github/workflows/baseruby.yml index 933df34f080e4c..3894c85d97569e 100644 --- a/.github/workflows/baseruby.yml +++ b/.github/workflows/baseruby.yml @@ -56,7 +56,7 @@ jobs: ruby-version: ${{ matrix.ruby }} bundler: none - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 - uses: ./.github/actions/setup/ubuntu diff --git a/.github/workflows/bundled_gems.yml b/.github/workflows/bundled_gems.yml index 3a1f6b70f468e9..7d452ea8761e87 100644 --- a/.github/workflows/bundled_gems.yml +++ b/.github/workflows/bundled_gems.yml @@ -31,7 +31,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: token: ${{ (github.repository == 'ruby/ruby' && !startsWith(github.event_name, 'pull')) && secrets.MATZBOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/check_dependencies.yml b/.github/workflows/check_dependencies.yml index fe8a108a46c6dd..b416b365977d6d 100644 --- a/.github/workflows/check_dependencies.yml +++ b/.github/workflows/check_dependencies.yml @@ -45,7 +45,7 @@ jobs: )}} steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 - uses: ./.github/actions/setup/ubuntu if: ${{ contains(matrix.os, 'ubuntu') }} diff --git a/.github/workflows/check_misc.yml b/.github/workflows/check_misc.yml index a4317595f45a6d..7da7dd0af7496e 100644 --- a/.github/workflows/check_misc.yml +++ b/.github/workflows/check_misc.yml @@ -18,7 +18,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: token: ${{ (github.repository == 'ruby/ruby' && !startsWith(github.event_name, 'pull')) && secrets.MATZBOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 1e92e509b14469..604d38c162c3d0 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -60,7 +60,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 - name: Install libraries if: ${{ contains(matrix.os, 'macos') }} diff --git a/.github/workflows/compilers.yml b/.github/workflows/compilers.yml index dfd92b07c341d7..6eeb88247f9858 100644 --- a/.github/workflows/compilers.yml +++ b/.github/workflows/compilers.yml @@ -43,7 +43,7 @@ jobs: )}} services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: { sparse-checkout-cone-mode: false, sparse-checkout: /.github } - { uses: './.github/actions/setup/directories', with: { srcdir: 'src', builddir: 'build', makeup: true } } - name: 'clang 18 LTO' @@ -75,7 +75,7 @@ jobs: )}} services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: { sparse-checkout-cone-mode: false, sparse-checkout: /.github } - { uses: './.github/actions/setup/directories', with: { srcdir: 'src', builddir: 'build', makeup: true } } - { uses: './.github/actions/compilers', name: 'GCC 13', with: { tag: 'gcc-13' } } @@ -100,7 +100,7 @@ jobs: )}} services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: { sparse-checkout-cone-mode: false, sparse-checkout: /.github } - { uses: './.github/actions/setup/directories', with: { srcdir: 'src', builddir: 'build', makeup: true } } - { uses: './.github/actions/compilers', name: 'clang 19', with: { tag: 'clang-19' } } @@ -126,7 +126,7 @@ jobs: )}} services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: { sparse-checkout-cone-mode: false, sparse-checkout: /.github } - { uses: './.github/actions/setup/directories', with: { srcdir: 'src', builddir: 'build', makeup: true } } - { uses: './.github/actions/compilers', name: 'clang 11', with: { tag: 'clang-11' } } @@ -152,7 +152,7 @@ jobs: )}} services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: { sparse-checkout-cone-mode: false, sparse-checkout: /.github } - { uses: './.github/actions/setup/directories', with: { srcdir: 'src', builddir: 'build', makeup: true } } # -Wno-strict-prototypes is necessary with current clang-15 since @@ -187,7 +187,7 @@ jobs: )}} services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: { sparse-checkout-cone-mode: false, sparse-checkout: /.github } - { uses: './.github/actions/setup/directories', with: { srcdir: 'src', builddir: 'build', makeup: true } } - { uses: './.github/actions/compilers', name: '-O0', with: { optflags: '-O0 -march=x86-64 -mtune=generic' } } @@ -212,7 +212,7 @@ jobs: )}} services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: { sparse-checkout-cone-mode: false, sparse-checkout: /.github } - { uses: './.github/actions/setup/directories', with: { srcdir: 'src', builddir: 'build', makeup: true } } - { uses: './.github/actions/compilers', name: 'disable-jit', with: { append_configure: '--disable-yjit --disable-rjit' } } @@ -239,7 +239,7 @@ jobs: )}} services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: { sparse-checkout-cone-mode: false, sparse-checkout: /.github } - { uses: './.github/actions/setup/directories', with: { srcdir: 'src', builddir: 'build', makeup: true } } - { uses: './.github/actions/compilers', name: 'NDEBUG', with: { cppflags: '-DNDEBUG' } } @@ -267,7 +267,7 @@ jobs: )}} services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: { sparse-checkout-cone-mode: false, sparse-checkout: /.github } - { uses: './.github/actions/setup/directories', with: { srcdir: 'src', builddir: 'build', makeup: true } } - { uses: './.github/actions/compilers', name: 'RGENGC_DEBUG=-1', with: { cppflags: '-DRGENGC_DEBUG=-1' } } @@ -294,7 +294,7 @@ jobs: )}} services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: { sparse-checkout-cone-mode: false, sparse-checkout: /.github } - { uses: './.github/actions/setup/directories', with: { srcdir: 'src', builddir: 'build', makeup: true } } - { uses: './.github/actions/compilers', name: 'USE_RUBY_DEBUG_LOG=1', with: { cppflags: '-DUSE_RUBY_DEBUG_LOG=1' } } @@ -321,7 +321,7 @@ jobs: )}} services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: { sparse-checkout-cone-mode: false, sparse-checkout: /.github } - { uses: './.github/actions/setup/directories', with: { srcdir: 'src', builddir: 'build', makeup: true } } - { uses: './.github/actions/compilers', name: 'GC_PROFILE_MORE_DETAIL', with: { cppflags: '-DGC_PROFILE_MORE_DETAIL' } } @@ -347,7 +347,7 @@ jobs: )}} services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: { sparse-checkout-cone-mode: false, sparse-checkout: /.github } - { uses: './.github/actions/setup/directories', with: { srcdir: 'src', builddir: 'build', makeup: true } } - { uses: './.github/actions/compilers', name: 'enable-yjit', with: { append_configure: '--enable-yjit --disable-rjit' } } diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index fee998c70e7fcc..dfdfa3c0110e90 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -56,7 +56,7 @@ jobs: )}} steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: sparse-checkout-cone-mode: false sparse-checkout: /.github diff --git a/.github/workflows/mingw.yml b/.github/workflows/mingw.yml index cc6c72511e5005..149f9fbe83f6b5 100644 --- a/.github/workflows/mingw.yml +++ b/.github/workflows/mingw.yml @@ -94,7 +94,7 @@ jobs: echo ::endgroup:: $result - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: sparse-checkout-cone-mode: false sparse-checkout: /.github diff --git a/.github/workflows/parsey.yml b/.github/workflows/parsey.yml index 1280276c88ec28..8d4e738f29ec0d 100644 --- a/.github/workflows/parsey.yml +++ b/.github/workflows/parsey.yml @@ -78,7 +78,7 @@ jobs: )}} steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: sparse-checkout-cone-mode: false sparse-checkout: /.github diff --git a/.github/workflows/rjit-bindgen.yml b/.github/workflows/rjit-bindgen.yml index 0782981f96c5b9..65ef44ee8da624 100644 --- a/.github/workflows/rjit-bindgen.yml +++ b/.github/workflows/rjit-bindgen.yml @@ -51,7 +51,7 @@ jobs: with: ruby-version: '3.1' - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: sparse-checkout-cone-mode: false sparse-checkout: /.github diff --git a/.github/workflows/rjit.yml b/.github/workflows/rjit.yml index 2d5a3a758293c8..9cec3bcd86979d 100644 --- a/.github/workflows/rjit.yml +++ b/.github/workflows/rjit.yml @@ -55,7 +55,7 @@ jobs: )}} steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: sparse-checkout-cone-mode: false sparse-checkout: /.github diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml index 24ea6543534eb0..60f6f50c8cbf40 100644 --- a/.github/workflows/scorecards.yml +++ b/.github/workflows/scorecards.yml @@ -32,7 +32,7 @@ jobs: steps: - name: 'Checkout code' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: persist-credentials: false diff --git a/.github/workflows/spec_guards.yml b/.github/workflows/spec_guards.yml index be70a51672a2cb..86abe44034ca94 100644 --- a/.github/workflows/spec_guards.yml +++ b/.github/workflows/spec_guards.yml @@ -45,7 +45,7 @@ jobs: - ruby-3.3 steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 - uses: ruby/setup-ruby@a6e6f86333f0a2523ece813039b8b4be04560854 # v1.190.0 with: diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu.yml index 6b58d071107e17..24465628fb6bf5 100644 --- a/.github/workflows/ubuntu.yml +++ b/.github/workflows/ubuntu.yml @@ -63,7 +63,7 @@ jobs: )}} steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: sparse-checkout-cone-mode: false sparse-checkout: /.github diff --git a/.github/workflows/wasm.yml b/.github/workflows/wasm.yml index 3a5a5923928a39..dac107c57b1a4e 100644 --- a/.github/workflows/wasm.yml +++ b/.github/workflows/wasm.yml @@ -61,7 +61,7 @@ jobs: )}} steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: sparse-checkout-cone-mode: false sparse-checkout: /.github diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index cca5da1243ce96..e821883157cad0 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -102,7 +102,7 @@ jobs: Join-Path (Resolve-Path ~).Path "scoop\shims" >> $Env:GITHUB_PATH shell: pwsh - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: sparse-checkout-cone-mode: false sparse-checkout: /.github diff --git a/.github/workflows/yjit-macos.yml b/.github/workflows/yjit-macos.yml index 601e25e9d08a82..9c1e75a95da6aa 100644 --- a/.github/workflows/yjit-macos.yml +++ b/.github/workflows/yjit-macos.yml @@ -37,7 +37,7 @@ jobs: )}} steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 - run: RUST_BACKTRACE=1 cargo test working-directory: yjit @@ -81,7 +81,7 @@ jobs: )}} steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: sparse-checkout-cone-mode: false sparse-checkout: /.github diff --git a/.github/workflows/yjit-ubuntu.yml b/.github/workflows/yjit-ubuntu.yml index b1f8bcc77a50a9..d67ea8d49e69b0 100644 --- a/.github/workflows/yjit-ubuntu.yml +++ b/.github/workflows/yjit-ubuntu.yml @@ -36,7 +36,7 @@ jobs: )}} steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 # For now we can't run cargo test --offline because it complains about the # capstone dependency, even though the dependency is optional @@ -68,7 +68,7 @@ jobs: )}} steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 # Check that we don't have linting errors in release mode, too - run: cargo clippy --all-targets --all-features @@ -127,7 +127,7 @@ jobs: )}} steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: sparse-checkout-cone-mode: false sparse-checkout: /.github From 9138b388eea48e6f1c005a9a3071aed72799f0cc Mon Sep 17 00:00:00 2001 From: git Date: Sun, 29 Sep 2024 13:24:09 +0000 Subject: [PATCH 526/829] Update bundled gems list as of 2024-09-29 --- NEWS.md | 2 +- gems/bundled_gems | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/NEWS.md b/NEWS.md index c804f41de494b5..ab45e87d74cf14 100644 --- a/NEWS.md +++ b/NEWS.md @@ -94,7 +94,7 @@ The following bundled gems are updated. * minitest 5.25.1 * rake 13.2.1 * test-unit 3.6.2 -* rexml 3.3.7 +* rexml 3.3.8 * rss 0.3.1 * net-ftp 0.3.7 * net-imap 0.4.16 diff --git a/gems/bundled_gems b/gems/bundled_gems index 853e6bd2dbc342..d2e70973612f61 100644 --- a/gems/bundled_gems +++ b/gems/bundled_gems @@ -10,7 +10,7 @@ minitest 5.25.1 https://github.com/minitest/minitest power_assert 2.0.3 https://github.com/ruby/power_assert 84e85124c5014a139af39161d484156cfe87a9ed rake 13.2.1 https://github.com/ruby/rake test-unit 3.6.2 https://github.com/test-unit/test-unit -rexml 3.3.7 https://github.com/ruby/rexml +rexml 3.3.8 https://github.com/ruby/rexml rss 0.3.1 https://github.com/ruby/rss net-ftp 0.3.7 https://github.com/ruby/net-ftp net-imap 0.4.16 https://github.com/ruby/net-imap From 1f6d2e77d9be9a5a829e60908d21d621f4e1ceb0 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sun, 29 Sep 2024 23:07:16 +0900 Subject: [PATCH 527/829] Remove leading spaces from `LIBPATHFLAG` and `RPATHFLAG` Join with a space in `MakeMakefile#libpathflag` instead. --- configure.ac | 4 ++-- lib/mkmf.rb | 7 ++++--- template/Makefile.in | 2 +- win32/Makefile.sub | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/configure.ac b/configure.ac index 45a181c1eb6433..9db4f0c7a8337a 100644 --- a/configure.ac +++ b/configure.ac @@ -662,9 +662,9 @@ RUBY_WERROR_FLAG([ [enable_rpath=$enableval], [enable_rpath="$rb_cv_binary_elf"]) AS_IF([test "$enable_rpath:${RPATHFLAG}" = yes:], [ - RPATHFLAG="${rpathflag:+ ${rpathflag}%1\$-s}" + RPATHFLAG="${rpathflag:+${rpathflag}%1\$-s}" ]) - AS_CASE([${RPATHFLAG}],[*'%1$'*],[: ${LIBPATHFLAG=' -L%1$-s'}],[: ${LIBPATHFLAG=' -L%s'}]) + AS_CASE([${RPATHFLAG}],[*'%1$'*],[: ${LIBPATHFLAG='-L%1$-s'}],[: ${LIBPATHFLAG='-L%s'}]) } RUBY_TRY_LDFLAGS(-fdeclspec, [fdeclspec=yes], [fdeclspec=no]) diff --git a/lib/mkmf.rb b/lib/mkmf.rb index 73459ffeb95176..d970e9a6ad6dc9 100644 --- a/lib/mkmf.rb +++ b/lib/mkmf.rb @@ -583,14 +583,15 @@ def cpp_command(outfile, opt="") end def libpathflag(libpath=$DEFLIBPATH|$LIBPATH) + libpathflags = nil libpath.map{|x| case x when "$(topdir)", /\A\./ LIBPATHFLAG else - LIBPATHFLAG+RPATHFLAG + libpathflags ||= [LIBPATHFLAG, RPATHFLAG].grep(/\S/).join(" ") end % x.quote - }.join + }.join(" ") end def werror_flag(opt = nil) @@ -2906,7 +2907,7 @@ def MAIN_DOES_NOTHING(*refs) ## # Argument which will add a library path to the linker - LIBPATHFLAG = config_string('LIBPATHFLAG') || ' -L%s' + LIBPATHFLAG = config_string('LIBPATHFLAG') || '-L%s' ## # Argument which will add a runtime library path to the linker diff --git a/template/Makefile.in b/template/Makefile.in index 7e0a02b9094cb8..4cc0865ddcd56b 100644 --- a/template/Makefile.in +++ b/template/Makefile.in @@ -360,7 +360,7 @@ install-cross: $(arch)-fake.rb $(RBCONFIG) rbconfig.rb $(arch_hdrdir)/ruby/confi $(Q) sed '/^\$$:\.unshift/q' $(arch)-fake.rb > fake.rb $(Q) $(BASERUBY) -p \ -e '~/^\s*CONFIG\["LDFLAGS"\]/ and' \ - -e '$$_[/(?=\s*"$$)/] = %q[ #{(CONFIG["LIBPATHFLAG"]%File.dirname(__FILE__)).strip}]' \ + -e '$$_[/(?=\s*"$$)/] = %q[ #{CONFIG["LIBPATHFLAG"]%File.dirname(__FILE__)}]' \ rbconfig.rb > fake-rbconfig.rb $(INSTALL_SCRIPT) fake.rb $(XRUBY_RUBYLIBDIR)/$(arch)/fake.rb $(INSTALL_SCRIPT) fake-rbconfig.rb $(XRUBY_RUBYLIBDIR)/$(arch)/rbconfig.rb diff --git a/win32/Makefile.sub b/win32/Makefile.sub index 2598c798d1b8ec..6ca909f61bad2b 100644 --- a/win32/Makefile.sub +++ b/win32/Makefile.sub @@ -1095,7 +1095,7 @@ s,@CSRCFLAG@,$(CSRCFLAG),;t t s,@CPPOUTFILE@,-P,;t t s,@PRELOADENV@,,;t t s,@LIBPATHENV@,PATH,;t t -s,@LIBPATHFLAG@, -libpath:%s,;t t +s,@LIBPATHFLAG@,-libpath:%s,;t t s,@RPATHFLAG@,,;t t s,@LIBARG@,%s.lib,;t t s,@LINK_SO@,$$(LDSHARED) -Fe$$(@) $$(OBJS) $$(LIBS) $$(LOCAL_LIBS) -link $$(DLDFLAGS) -implib:$$(*F:.so=)-$$(arch).lib -pdb:$$(*F:.so=)-$$(arch).pdb -def:$$(DEFFILE),;t t From 5e466ad3f74dd8dbfd9e5ae772bb42d61b0fd0e3 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sun, 29 Sep 2024 23:13:11 +0900 Subject: [PATCH 528/829] CI: Remove `ENABLE_PATH_CHECK` compilation As `ENABLE_PATH_CHECK` is defaulted to 1 on other than DOSISH and Cygwin, setting this macro to 1 on Ubuntu changes nothing from the default. As for `ENABLE_PATH_CHECK=0` tests, we have real CI platforms already. --- .github/workflows/compilers.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/compilers.yml b/.github/workflows/compilers.yml index 6eeb88247f9858..b118fe7b94c944 100644 --- a/.github/workflows/compilers.yml +++ b/.github/workflows/compilers.yml @@ -302,7 +302,6 @@ jobs: - { uses: './.github/actions/compilers', name: 'SHARABLE_MIDDLE_SUBSTRING', with: { cppflags: '-DSHARABLE_MIDDLE_SUBSTRING=1' } } - { uses: './.github/actions/compilers', name: 'DEBUG_FIND_TIME_NUMGUESS', with: { cppflags: '-DDEBUG_FIND_TIME_NUMGUESS' } } - { uses: './.github/actions/compilers', name: 'DEBUG_INTEGER_PACK', with: { cppflags: '-DDEBUG_INTEGER_PACK' } } - - { uses: './.github/actions/compilers', name: 'ENABLE_PATH_CHECK', with: { cppflags: '-DENABLE_PATH_CHECK' } } - { uses: './.github/actions/compilers', name: 'GC_DEBUG_STRESS_TO_CLASS', with: { cppflags: '-DGC_DEBUG_STRESS_TO_CLASS' } } - { uses: './.github/actions/compilers', name: 'GC_ENABLE_LAZY_SWEEP=0', with: { cppflags: '-DGC_ENABLE_LAZY_SWEEP=0' } } - { uses: './.github/actions/compilers', name: 'GC_PROFILE_DETAIL_MEMORY', with: { cppflags: '-DGC_PROFILE_DETAIL_MEMORY' } } From 9d60480094b076e2697248238787b589e3f69ab7 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Mon, 30 Sep 2024 00:01:34 +0900 Subject: [PATCH 529/829] CI: Remove `SHARED_GC` compilation It is checked in ubuntu.yml. --- .github/workflows/compilers.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/compilers.yml b/.github/workflows/compilers.yml index b118fe7b94c944..363539f5a6a86f 100644 --- a/.github/workflows/compilers.yml +++ b/.github/workflows/compilers.yml @@ -220,7 +220,6 @@ jobs: - { uses: './.github/actions/compilers', name: 'enable-mkmf-verbose', with: { append_configure: '--enable-mkmf-verbose' } } - { uses: './.github/actions/compilers', name: 'disable-rubygems', with: { append_configure: '--disable-rubygems' } } - { uses: './.github/actions/compilers', name: 'RUBY_DEVEL', with: { append_configure: '--enable-devel' } } - - { uses: './.github/actions/compilers', name: 'SHARED_GC', with: { append_configure: '--with-shared-gc=/home/runner/shared-gc' } } - { uses: './.github/actions/compilers', name: 'OPT_THREADED_CODE=0', with: { cppflags: '-DOPT_THREADED_CODE=0' } } - { uses: './.github/actions/compilers', name: 'OPT_THREADED_CODE=1', with: { cppflags: '-DOPT_THREADED_CODE=1' } } - { uses: './.github/actions/compilers', name: 'OPT_THREADED_CODE=2', with: { cppflags: '-DOPT_THREADED_CODE=2' } } From 5139a574aa00e034bfb1dbdc9d97aca207916817 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Mon, 30 Sep 2024 00:19:16 +0900 Subject: [PATCH 530/829] Make directory for shared-GC libraries at build --- .github/workflows/ubuntu.yml | 6 ++---- common.mk | 3 ++- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu.yml index 24465628fb6bf5..e8295961658731 100644 --- a/.github/workflows/ubuntu.yml +++ b/.github/workflows/ubuntu.yml @@ -35,7 +35,6 @@ jobs: configure: '--enable-shared --enable-load-relative' - test_task: check shared_gc: true - shared_gc_dir: '/home/runner/ruby_gc' configure: '--with-shared-gc=/home/runner/ruby_gc' - test_task: test-bundler-parallel timeout: 50 @@ -99,9 +98,8 @@ jobs: if: ${{ matrix.test_task == 'test-bundled-gems' }} - name: Build shared GC - run: > - echo "RUBY_GC_LIBRARY=librubygc.default.so" >> $GITHUB_ENV && - mkdir ${{ matrix.shared_gc_dir }} && + run: | + echo "RUBY_GC_LIBRARY=librubygc.default.so" >> $GITHUB_ENV make shared-gc SHARED_GC=default if: ${{ matrix.shared_gc }} diff --git a/common.mk b/common.mk index de3852eef7ecc0..4f3c0a9a08c9ca 100644 --- a/common.mk +++ b/common.mk @@ -1914,8 +1914,9 @@ shared-gc: probes.h exit 1; \ else \ echo generating $(shared_gc_dir)librubygc.$(SHARED_GC).$(SOEXT); \ - $(LDSHARED) -I$(srcdir)/include -I$(srcdir) -I$(arch_hdrdir) $(XDLDFLAGS) $(cflags) -DBUILDING_SHARED_GC -fPIC -o $(shared_gc_dir)librubygc.$(SHARED_GC).$(SOEXT) $(srcdir)/gc/$(SHARED_GC).c; \ fi + $(Q) $(MAKEDIRS) $(shared_gc_dir) + $(Q) $(LDSHARED) -I$(srcdir)/include -I$(srcdir) -I$(arch_hdrdir) $(XDLDFLAGS) $(cflags) -DBUILDING_SHARED_GC -fPIC -o $(shared_gc_dir)librubygc.$(SHARED_GC).$(SOEXT) $(srcdir)/gc/$(SHARED_GC).c help: PHONY $(MESSAGE_BEGIN) \ From a0838a39021ccb0d38d69c2c3e6793290b979747 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Mon, 30 Sep 2024 00:20:35 +0900 Subject: [PATCH 531/829] Raise fatal error instead of BUG Failures due to the external setting is not a bug of ruby itself. --- gc.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/gc.c b/gc.c index 10ab04fb8178c6..9e85906d65a843 100644 --- a/gc.c +++ b/gc.c @@ -674,31 +674,31 @@ ruby_external_gc_init(void) case '.': break; default: - rb_bug("Only alphanumeric, dash, underscore, and period is allowed in "RUBY_GC_LIBRARY""); + rb_fatal("Only alphanumeric, dash, underscore, and period is allowed in "RUBY_GC_LIBRARY""); } } gc_so_path = alloca(strlen(SHARED_GC_DIR) + strlen(gc_so_file) + 1); strcpy(gc_so_path, SHARED_GC_DIR); strcpy(gc_so_path + strlen(SHARED_GC_DIR), gc_so_file); - gc_so_path[strlen(SHARED_GC_DIR) + strlen(gc_so_file)] = '\0'; handle = dlopen(gc_so_path, RTLD_LAZY | RTLD_GLOBAL); if (!handle) { - fprintf(stderr, "%s\n", dlerror()); - rb_bug("ruby_external_gc_init: Shared library %s cannot be opened", gc_so_path); + rb_fatal("ruby_external_gc_init: Shared library %s cannot be opened: %s", gc_so_path, dlerror()); } } + rb_gc_function_map_t gc_functions; + # define load_external_gc_func(name) do { \ if (handle) { \ - rb_gc_functions.name = dlsym(handle, "rb_gc_impl_" #name); \ - if (!rb_gc_functions.name) { \ - rb_bug("ruby_external_gc_init: " #name " func not exported by library %s", gc_so_path); \ + gc_functions.name = dlsym(handle, "rb_gc_impl_" #name); \ + if (!gc_functions.name) { \ + rb_fatal("ruby_external_gc_init: " #name " func not exported by library %s", gc_so_path); \ } \ } \ else { \ - rb_gc_functions.name = rb_gc_impl_##name; \ + gc_functions.name = rb_gc_impl_##name; \ } \ } while (0) @@ -777,6 +777,8 @@ ruby_external_gc_init(void) load_external_gc_func(copy_attributes); # undef load_external_gc_func + + rb_gc_functions = gc_functions; } // Bootup From 9b4a497456b3f538c4d3237f941f634f97e0e30e Mon Sep 17 00:00:00 2001 From: Lars Kanis Date: Sat, 28 Sep 2024 20:59:02 +0200 Subject: [PATCH 532/829] Fix loading of nonascii script name on Windows MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Since the prism parser was enabled by default, loading scripts with nonascii characters somewhere in the script path is no longer working. It only works when the codepage was switched to 65001 (UTF-8). This patch doesn't change the encoding of __FILE__. It is still in locale encoding. That's why pm_load_file() is called with UTF-8 script name and pm_parse_file() with locale encoding. The loading of nonascii script names is part of the test-all, but it doesn't trigger the failure on GHA, since it is using cp 65001. On other codepages it fails with: [53/71] TestRubyOptions#test_command_line_progname_nonascii = 0.04 s 1) Failure: TestRubyOptions#test_command_line_progname_nonascii [C:/Users/Administrator/ruby/test/ruby/test_rubyoptions.rb:1086]: [ruby-dev:48752] [Bug #10555] pid 1736 exit 1 | C:\Users\Administrator\ruby\ruby.exe: No such file or directory -- �.rb (LoadError) . 1. [1/2] Assertion for "stdout" | <["\xFF.rb"]> expected but was | <[]>. 2. [2/2] Assertion for "stderr" | <[]> expected but was | <["C:\\Users\\Administrator\\ruby\\ruby.exe: No such file or directory -- \xFF.rb (LoadError)"]>. --- ruby.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ruby.c b/ruby.c index 093df77ba2211a..b3ddf5d3b03287 100644 --- a/ruby.c +++ b/ruby.c @@ -2193,10 +2193,12 @@ prism_script(ruby_cmdline_options_t *opt, pm_parse_result_t *result) error = pm_parse_string(result, opt->e_script, rb_str_new2("-e"), NULL); } else { + VALUE script_name = rb_str_encode_ospath(opt->script_name); + pm_options_command_line_set(options, command_line); pm_options_shebang_callback_set(options, prism_script_shebang_callback, (void *) opt); - error = pm_load_file(result, opt->script_name, true); + error = pm_load_file(result, script_name, true); // If reading the file did not error, at that point we load the command // line options. We do it in this order so that if the main script fails @@ -2217,7 +2219,7 @@ prism_script(ruby_cmdline_options_t *opt, pm_parse_result_t *result) // contents after the marker. if (NIL_P(error) && result->parser.data_loc.start != NULL) { int xflag = opt->xflag; - VALUE file = open_load_file(opt->script_name, &xflag); + VALUE file = open_load_file(script_name, &xflag); const pm_parser_t *parser = &result->parser; size_t offset = parser->data_loc.start - parser->start + 7; From 154ec2d242c9f3063d810598d401ed297e4777fd Mon Sep 17 00:00:00 2001 From: Burdette Lamar Date: Sun, 29 Sep 2024 20:21:11 -0500 Subject: [PATCH 533/829] [DOC] Tweaks for Array#insert (#11709) --- array.c | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/array.c b/array.c index 52b0fe6b99d712..11d68361b0f146 100644 --- a/array.c +++ b/array.c @@ -2522,38 +2522,38 @@ rb_ary_aset(int argc, VALUE *argv, VALUE ary) /* * call-seq: - * array.insert(index, *objects) -> self + * insert(index, *objects) -> self * - * Inserts given +objects+ before or after the element at Integer index +offset+; + * Inserts the given +objects+ as elements of +self+; * returns +self+. * - * When +index+ is non-negative, inserts all given +objects+ - * before the element at offset +index+: + * When +index+ is non-negative, inserts +objects+ + * _before_ the element at offset +index+: * - * a = [:foo, 'bar', 2] - * a.insert(1, :bat, :bam) # => [:foo, :bat, :bam, "bar", 2] + * a = ['a', 'b', 'c'] # => ["a", "b", "c"] + * a.insert(1, :x, :y, :z) # => ["a", :x, :y, :z, "b", "c"] * * Extends the array if +index+ is beyond the array (index >= self.size): * - * a = [:foo, 'bar', 2] - * a.insert(5, :bat, :bam) - * a # => [:foo, "bar", 2, nil, nil, :bat, :bam] + * a = ['a', 'b', 'c'] # => ["a", "b", "c"] + * a.insert(5, :x, :y, :z) # => ["a", "b", "c", nil, nil, :x, :y, :z] * - * Does nothing if no objects given: + * When +index+ is negative, inserts +objects+ + * _after_ the element at offset index + self.size: * - * a = [:foo, 'bar', 2] - * a.insert(1) - * a.insert(50) - * a.insert(-50) - * a # => [:foo, "bar", 2] + * a = ['a', 'b', 'c'] # => ["a", "b", "c"] + * a.insert(-2, :x, :y, :z) # => ["a", "b", :x, :y, :z, "c"] * - * When +index+ is negative, inserts all given +objects+ - * _after_ the element at offset index+self.size: + * With no +objects+ given, does nothing: * - * a = [:foo, 'bar', 2] - * a.insert(-2, :bat, :bam) - * a # => [:foo, "bar", :bat, :bam, 2] + * a = ['a', 'b', 'c'] # => ["a", "b", "c"] + * a.insert(1) # => ["a", "b", "c"] + * a.insert(50) # => ["a", "b", "c"] + * a.insert(-50) # => ["a", "b", "c"] + * + * Raises IndexError if +objects+ are given and +index+ is negative and out of range. * + * Related: see {Methods for Assigning}[rdoc-ref:Array@Methods+for+Assigning]. */ static VALUE From 116395d31522886fdac52543bfb391ce3a84a34a Mon Sep 17 00:00:00 2001 From: Burdette Lamar Date: Sun, 29 Sep 2024 20:21:26 -0500 Subject: [PATCH 534/829] [DOC] Tweaks for Array#flatten! (#11689) --- array.c | 48 ++++++++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/array.c b/array.c index 11d68361b0f146..c096782bd61f5e 100644 --- a/array.c +++ b/array.c @@ -6503,33 +6503,37 @@ flatten(VALUE ary, int level) /* * call-seq: - * array.flatten! -> self or nil - * array.flatten!(level) -> self or nil + * flatten!(depth = nil) -> self or nil * - * Replaces each nested +Array+ in +self+ with the elements from that +Array+; - * returns +self+ if any changes, +nil+ otherwise. + * Returns +self+ as a recursively flattening of +self+ to +depth+ levels of recursion; + * +depth+ must be an + * {integer-convertible object}[rdoc-ref:implicit_conversion.rdoc@Integer-Convertible+Objects], + * or +nil+. + * At each level of recursion: + * + * - Each element that is an array is "flattened" + * (that is, replaced by its individual array elements). + * - Each element that is not an array is unchanged + * (even if the element is an object that has instance method +flatten+). * - * With non-negative Integer argument +level+, flattens recursively through +level+ levels: + * Returns +nil+ if no elements were flattened. * - * a = [ 0, [ 1, [2, 3], 4 ], 5 ] - * a.flatten!(1) # => [0, 1, [2, 3], 4, 5] - * a = [ 0, [ 1, [2, 3], 4 ], 5 ] - * a.flatten!(2) # => [0, 1, 2, 3, 4, 5] - * a = [ 0, [ 1, [2, 3], 4 ], 5 ] - * a.flatten!(3) # => [0, 1, 2, 3, 4, 5] - * [0, 1, 2].flatten!(1) # => nil + * With non-negative integer argument +depth+, flattens recursively through +depth+ levels: * - * With no argument, a +nil+ argument, or with negative argument +level+, flattens all levels: + * a = [ 0, [ 1, [2, 3], 4 ], 5, {foo: 0}, Set.new([6, 7]) ] + * a # => [0, [1, [2, 3], 4], 5, {:foo=>0}, #] + * a.dup.flatten!(1) # => [0, 1, [2, 3], 4, 5, {:foo=>0}, #] + * a.dup.flatten!(1.1) # => [0, 1, [2, 3], 4, 5, {:foo=>0}, #] + * a.dup.flatten!(2) # => [0, 1, 2, 3, 4, 5, {:foo=>0}, #] + * a.dup.flatten!(3) # => [0, 1, 2, 3, 4, 5, {:foo=>0}, #] * - * a = [ 0, [ 1, [2, 3], 4 ], 5 ] - * a.flatten! # => [0, 1, 2, 3, 4, 5] - * [0, 1, 2].flatten! # => nil - * a = [ 0, [ 1, [2, 3], 4 ], 5 ] - * a.flatten!(-1) # => [0, 1, 2, 3, 4, 5] - * a = [ 0, [ 1, [2, 3], 4 ], 5 ] - * a.flatten!(-2) # => [0, 1, 2, 3, 4, 5] - * [0, 1, 2].flatten!(-1) # => nil + * With +nil+ or negative argument +depth+, flattens all levels: * + * a.dup.flatten! # => [0, 1, 2, 3, 4, 5, {:foo=>0}, #] + * a.dup.flatten!(-1) # => [0, 1, 2, 3, 4, 5, {:foo=>0}, #] + * + * Related: Array#flatten; + * see also {Methods for Assigning}[rdoc-ref:Array@Methods+for+Assigning]. */ static VALUE @@ -8639,6 +8643,7 @@ rb_ary_deconstruct(VALUE ary) * - #insert: Inserts given objects at a given offset; does not replace elements. * - #concat: Appends all elements from given arrays. * - #fill: Replaces specified elements with specified objects. + * - #flatten!: Replaces each nested array in +self+ with the elements from that array. * - #initialize_copy (aliased as #replace): Replaces the content of +self+ with the content of a given array. * - #reverse!: Replaces +self+ with its elements reversed. * - #rotate!: Replaces +self+ with its elements rotated. @@ -8700,7 +8705,6 @@ rb_ary_deconstruct(VALUE ary) * - #collect (aliased as #map): Returns an array containing the block return-value for each element. * - #collect! (aliased as #map!): Replaces each element with a block return-value. * - #flatten: Returns an array that is a recursive flattening of +self+. - * - #flatten!: Replaces each nested array in +self+ with the elements from that array. * - #inspect (aliased as #to_s): Returns a new String containing the elements. * - #join: Returns a newsString containing the elements joined by the field separator. * - #to_a: Returns +self+ or a new array containing all elements. From 5be11c1d1b712db4f77d5acea3d2fd493a6853ff Mon Sep 17 00:00:00 2001 From: Burdette Lamar Date: Sun, 29 Sep 2024 20:21:55 -0500 Subject: [PATCH 535/829] [DOC] Tweaks for Array#first (#11687) --- array.rb | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/array.rb b/array.rb index 745032233623c3..cf97f5b8503083 100644 --- a/array.rb +++ b/array.rb @@ -113,12 +113,12 @@ def sample(n = (ary = false), random: Random) end # call-seq: - # array.first -> object or nil - # array.first(n) -> new_array + # first -> object or nil + # first(count) -> new_array # - # Returns elements from +self+; does not modify +self+. + # Returns elements from +self+, or +nil+; does not modify +self+. # - # When no argument is given, returns the first element: + # With no argument given, returns the first element (if available): # # a = [:foo, 'bar', 2] # a.first # => :foo @@ -126,23 +126,16 @@ def sample(n = (ary = false), random: Random) # # If +self+ is empty, returns +nil+. # - # When non-negative Integer argument +n+ is given, - # returns the first +n+ elements in a new +Array+: - # - # a = [:foo, 'bar', 2] - # a.first(2) # => [:foo, "bar"] + # [].first # => nil # - # If n >= array.size, returns all elements: + # With non-negative integer argument +count+ given, + # returns the first +count+ elements (as available) in a new array: # - # a = [:foo, 'bar', 2] + # a.first(0) # => [] + # a.first(2) # => [:foo, "bar"] # a.first(50) # => [:foo, "bar", 2] # - # If n == 0 returns an new empty +Array+: - # - # a = [:foo, 'bar', 2] - # a.first(0) # [] - # - # Related: #last. + # Related: see {Methods for Querying}[rdoc-ref:Array@Methods+for+Querying]. def first n = unspecified = true if Primitive.mandatory_only? Primitive.attr! :leaf From 03ca99c93beece993c607a01dc99425d70eba619 Mon Sep 17 00:00:00 2001 From: Burdette Lamar Date: Sun, 29 Sep 2024 20:22:43 -0500 Subject: [PATCH 536/829] [DOC] Tweaks for Array#hash (#11704) --- array.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/array.c b/array.c index c096782bd61f5e..5f707b0a5f4568 100644 --- a/array.c +++ b/array.c @@ -5275,14 +5275,16 @@ rb_ary_hash_values(long len, const VALUE *elements) /* * call-seq: - * array.hash -> integer + * hash -> integer * * Returns the integer hash value for +self+. * - * Two arrays with the same content will have the same hash code (and will compare using #eql?): + * Two arrays with the same content will have the same hash value + * (and will compare using eql?): * - * [0, 1, 2].hash == [0, 1, 2].hash # => true - * [0, 1, 2].hash == [0, 1, 3].hash # => false + * ['a', 'b'].hash == ['a', 'b'].hash # => true + * ['a', 'b'].hash == ['a', 'c'].hash # => false + * ['a', 'b'].hash == ['a'].hash # => false * */ From 28a01e306abbafce2b5586a7d9aacc8e795f0f02 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Mon, 30 Sep 2024 09:40:34 +0900 Subject: [PATCH 537/829] Ruby exception cannot work here Just show error messages then ignore the invalid library. --- gc.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/gc.c b/gc.c index 9e85906d65a843..c1a9b600448d7e 100644 --- a/gc.c +++ b/gc.c @@ -652,6 +652,8 @@ static rb_gc_function_map_t rb_gc_functions; # define RUBY_GC_LIBRARY "RUBY_GC_LIBRARY" +# define fatal(...) do {fprintf(stderr, "" __VA_ARGS__); return;} while (0) + static void ruby_external_gc_init(void) { @@ -674,7 +676,7 @@ ruby_external_gc_init(void) case '.': break; default: - rb_fatal("Only alphanumeric, dash, underscore, and period is allowed in "RUBY_GC_LIBRARY""); + fatal("Only alphanumeric, dash, underscore, and period is allowed in "RUBY_GC_LIBRARY""); } } @@ -684,7 +686,7 @@ ruby_external_gc_init(void) handle = dlopen(gc_so_path, RTLD_LAZY | RTLD_GLOBAL); if (!handle) { - rb_fatal("ruby_external_gc_init: Shared library %s cannot be opened: %s", gc_so_path, dlerror()); + fatal("ruby_external_gc_init: Shared library %s cannot be opened: %s", gc_so_path, dlerror()); } } @@ -694,7 +696,7 @@ ruby_external_gc_init(void) if (handle) { \ gc_functions.name = dlsym(handle, "rb_gc_impl_" #name); \ if (!gc_functions.name) { \ - rb_fatal("ruby_external_gc_init: " #name " func not exported by library %s", gc_so_path); \ + fatal("ruby_external_gc_init: " #name " func not exported by library %s", gc_so_path); \ } \ } \ else { \ From 3a9e48b9a4860022f43d8101c0f3249299437886 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Mon, 30 Sep 2024 11:35:59 +0900 Subject: [PATCH 538/829] Fixed warning condition with LoadError --- lib/bundled_gems.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/bundled_gems.rb b/lib/bundled_gems.rb index 087f94a9acc69b..b5f73a775040e0 100644 --- a/lib/bundled_gems.rb +++ b/lib/bundled_gems.rb @@ -81,7 +81,8 @@ def self.replace_require(specs) result = e end - if (result || !OPTIONAL[name]) && message + # Don't warn if the gem is optional dependency and not found in the Bundler environment. + if !(result.is_a?(LoadError) && OPTIONAL[name]) && message if ::Gem::BUNDLED_GEMS.uplevel > 0 Kernel.warn message, uplevel: ::Gem::BUNDLED_GEMS.uplevel else From 3fe59b04d6ed099c92d749a948f452f562cdae51 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Mon, 30 Sep 2024 12:03:02 +0900 Subject: [PATCH 539/829] -l option of 7z is unknown switch with the `ubuntu-latest`. https://github.com/ruby/actions/actions/runs/11095032727/job/30823174026#step:3:349 --- tool/make-snapshot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tool/make-snapshot b/tool/make-snapshot index 7446f18578da83..3479e2ac85f10b 100755 --- a/tool/make-snapshot +++ b/tool/make-snapshot @@ -56,7 +56,7 @@ PACKAGES = { DEFAULT_PACKAGES = PACKAGES.keys - ["tar"] if !$no7z and system("7z", out: IO::NULL) PACKAGES["gzip"] = %w".tar.gz 7z a dummy -tgzip -mx -so" - PACKAGES["zip"] = %w".zip 7z a -tzip -l -mx -mtc=off" << {out: IO::NULL} + PACKAGES["zip"] = %w".zip 7z a -tzip -mx -mtc=off" << {out: IO::NULL} elsif gzip = ENV.delete("GZIP") PACKAGES["gzip"].concat(gzip.shellsplit) end From 1b6c234fec2addd74a4fe2349edd853adde91df8 Mon Sep 17 00:00:00 2001 From: ydah Date: Sat, 28 Sep 2024 17:25:41 +0900 Subject: [PATCH 540/829] s/reproducable/reproducible/ --- prism_compile.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prism_compile.c b/prism_compile.c index a159267da3fc8e..ff487ddb23888d 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -3,7 +3,7 @@ /** * This compiler defines its own concept of the location of a node. We do this * because we want to pair line information with node identifier so that we can - * have reproducable parses. + * have reproducible parses. */ typedef struct { /** This is the line number of a node. */ From 73d60df6e015d20b418d6307965251cbaec18e68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Thu, 26 Sep 2024 11:35:02 +0200 Subject: [PATCH 541/829] [rubygems/rubygems] Don't list duplicated version in `Gem::Specification.reset` warning https://github.com/rubygems/rubygems/commit/e6e3db821f --- lib/rubygems/specification.rb | 2 +- test/rubygems/test_gem_specification.rb | 34 +++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/lib/rubygems/specification.rb b/lib/rubygems/specification.rb index 5735038ad30e71..d05df9cf0438e5 100644 --- a/lib/rubygems/specification.rb +++ b/lib/rubygems/specification.rb @@ -1208,7 +1208,7 @@ def self.reset unresolved.values.each do |dep| warn " #{dep}" - versions = find_all_by_name(dep.name) + versions = find_all_by_name(dep.name).uniq(&:full_name) unless versions.empty? warn " Available/installed versions of this gem:" versions.each {|s| warn " - #{s.version}" } diff --git a/test/rubygems/test_gem_specification.rb b/test/rubygems/test_gem_specification.rb index 0a009cbd7bcb9a..d434ea96f31396 100644 --- a/test/rubygems/test_gem_specification.rb +++ b/test/rubygems/test_gem_specification.rb @@ -3087,6 +3087,40 @@ def test_unresolved_specs_with_versions assert_equal(expected, actual_stderr) end + def test_unresolved_specs_with_duplicated_versions + specification = Gem::Specification.clone + + set_orig specification + + specification.define_singleton_method(:unresolved_deps) do + { b: Gem::Dependency.new("x","1") } + end + + specification.define_singleton_method(:find_all_by_name) do |_dep_name| + [ + specification.new {|s| s.name = "z", s.version = Gem::Version.new("1") }, # default copy + specification.new {|s| s.name = "z", s.version = Gem::Version.new("1") }, # regular copy + specification.new {|s| s.name = "z", s.version = Gem::Version.new("2") }, # regular copy + ] + end + + expected = <<-EXPECTED +WARN: Unresolved or ambiguous specs during Gem::Specification.reset: + x (= 1) + Available/installed versions of this gem: + - 1 + - 2 +WARN: Clearing out unresolved specs. Try 'gem cleanup ' +Please report a bug if this causes problems. + EXPECTED + + actual_stdout, actual_stderr = capture_output do + specification.reset + end + assert_empty actual_stdout + assert_equal(expected, actual_stderr) + end + def test_duplicate_runtime_dependency expected = "WARNING: duplicated b dependency [\"~> 3.0\", \"~> 3.0\"]\n" out, err = capture_output do From d4ac5c573b3b57dc4e62b684be297269defceba2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Thu, 26 Sep 2024 11:22:19 +0200 Subject: [PATCH 542/829] [rubygems/rubygems] Don't add duplicated specs to unresolved specs This could happen when a regular gem shadows a default gem. https://github.com/rubygems/rubygems/commit/9ef70dd1f7 --- lib/rubygems/specification.rb | 2 +- test/rubygems/test_require.rb | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/lib/rubygems/specification.rb b/lib/rubygems/specification.rb index d05df9cf0438e5..e5541e57b12d24 100644 --- a/lib/rubygems/specification.rb +++ b/lib/rubygems/specification.rb @@ -1412,7 +1412,7 @@ def activate_dependencies end begin - specs = spec_dep.to_specs + specs = spec_dep.to_specs.uniq(&:full_name) rescue Gem::MissingSpecError => e raise Gem::MissingSpecError.new(e.name, e.requirement, "at: #{spec_file}") end diff --git a/test/rubygems/test_require.rb b/test/rubygems/test_require.rb index b915a861970bf8..48d66736fd82f2 100644 --- a/test/rubygems/test_require.rb +++ b/test/rubygems/test_require.rb @@ -182,6 +182,22 @@ def test_require_is_not_lazy_with_exact_req assert_equal %w[a-1 b-1], loaded_spec_names end + def test_require_is_not_lazy_with_shadowed_default_gem + b1_default = new_default_spec("b", "1", nil, "foo.rb") + install_default_gems b1_default + + a1 = util_spec "a", "1", { "b" => ">= 1" }, "lib/test_gem_require_a.rb" + b1 = util_spec("b", "1", nil, "lib/foo.rb") + install_specs b1, a1 + + # Load default ruby gems fresh as if we've just started a ruby script. + Gem::Specification.reset + + assert_require "test_gem_require_a" + assert_equal %w[a-1 b-1], loaded_spec_names + assert_equal unresolved_names, [] + end + def test_require_is_lazy_with_inexact_req a1 = util_spec "a", "1", { "b" => ">= 1" }, "lib/test_gem_require_a.rb" b1 = util_spec "b", "1", nil, "lib/b/c.rb" From 82f250af45f676b3d0a22f00d01cd29bfaa2761c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Thu, 26 Sep 2024 11:24:23 +0200 Subject: [PATCH 543/829] [rubygems/rubygems] `gem cleanup` no longer needs to reset paths Since `Gem::Uninstaller` no longer changes paths either. https://github.com/rubygems/rubygems/commit/427059d45f --- lib/rubygems/commands/cleanup_command.rb | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/lib/rubygems/commands/cleanup_command.rb b/lib/rubygems/commands/cleanup_command.rb index 08fb598cea54f1..bc24aaf753bf09 100644 --- a/lib/rubygems/commands/cleanup_command.rb +++ b/lib/rubygems/commands/cleanup_command.rb @@ -38,8 +38,6 @@ def initialize @default_gems = [] @full = nil @gems_to_cleanup = nil - @original_home = nil - @original_path = nil @primary_gems = nil end @@ -95,9 +93,6 @@ def execute end def clean_gems - @original_home = Gem.dir - @original_path = Gem.path - get_primary_gems get_candidate_gems get_gems_to_cleanup @@ -112,8 +107,6 @@ def clean_gems deps.reverse_each do |spec| uninstall_dep spec end - - Gem::Specification.reset end def get_candidate_gems @@ -133,7 +126,7 @@ def get_gems_to_cleanup default_gems, gems_to_cleanup = gems_to_cleanup.partition(&:default_gem?) - uninstall_from = options[:user_install] ? Gem.user_dir : @original_home + uninstall_from = options[:user_install] ? Gem.user_dir : Gem.dir gems_to_cleanup = gems_to_cleanup.select do |spec| spec.base_dir == uninstall_from @@ -181,8 +174,5 @@ def uninstall_dep(spec) say "Unable to uninstall #{spec.full_name}:" say "\t#{e.class}: #{e.message}" end - ensure - # Restore path Gem::Uninstaller may have changed - Gem.use_paths @original_home, *@original_path end end From 060932af989831f31c562781385100f196d63d4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Thu, 26 Sep 2024 17:12:33 +0200 Subject: [PATCH 544/829] [rubygems/rubygems] Fix old cache format detection when application is not source controlled https://github.com/rubygems/rubygems/commit/b2adcc0173 --- lib/bundler/source/git.rb | 2 +- lib/bundler/source/git/git_proxy.rb | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/bundler/source/git.rb b/lib/bundler/source/git.rb index 78f9ff0560b2ae..3b934adbb299cd 100644 --- a/lib/bundler/source/git.rb +++ b/lib/bundler/source/git.rb @@ -191,7 +191,7 @@ def specs(*) set_up_app_cache!(app_cache_path) if use_app_cache? if requires_checkout? && !@copied - FileUtils.rm_rf(app_cache_path) if use_app_cache? && git_proxy.not_a_bare_repository? + FileUtils.rm_rf(app_cache_path) if use_app_cache? && git_proxy.not_a_repository? fetch checkout diff --git a/lib/bundler/source/git/git_proxy.rb b/lib/bundler/source/git/git_proxy.rb index 768d40392fcfc3..744235bc046d7e 100644 --- a/lib/bundler/source/git/git_proxy.rb +++ b/lib/bundler/source/git/git_proxy.rb @@ -84,8 +84,10 @@ def current_branch end end - def not_a_bare_repository? - git_local("rev-parse", "--is-bare-repository", dir: path).strip == "false" + def not_a_repository? + _, status = git_null("rev-parse", "--resolve-git-dir", path.to_s, dir: path) + + !status.success? end def contains?(commit) From dbe69a466f71b5f0e4057d48e13686914ffcec32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Thu, 26 Sep 2024 18:44:03 +0200 Subject: [PATCH 545/829] [rubygems/rubygems] I _think_ this workaround is no longer necessary https://github.com/rubygems/rubygems/commit/6a76fedfd0 --- spec/bundler/cache/git_spec.rb | 2 -- 1 file changed, 2 deletions(-) diff --git a/spec/bundler/cache/git_spec.rb b/spec/bundler/cache/git_spec.rb index 88436c79aade08..ea91829003320c 100644 --- a/spec/bundler/cache/git_spec.rb +++ b/spec/bundler/cache/git_spec.rb @@ -323,8 +323,6 @@ FileUtils.mkdir_p bundled_app("vendor/cache") FileUtils.cp_r git_path, bundled_app("vendor/cache/foo-1.0-#{path_revision}") FileUtils.rm_rf bundled_app("vendor/cache/foo-1.0-#{path_revision}/.git") - # bundle install with git repo needs to be run under the git environment. - Dir.chdir(bundled_app) { system(*%W[git init --quiet]) } bundle :install, env: { "BUNDLE_DEPLOYMENT" => "true", "BUNDLE_CACHE_ALL" => "true" } end From 7d318c2cb267fcf7e1f475e37dff473f5e74f1a8 Mon Sep 17 00:00:00 2001 From: Earlopain <14981592+Earlopain@users.noreply.github.com> Date: Thu, 26 Sep 2024 17:24:00 +0200 Subject: [PATCH 546/829] [rubygems/rubygems] Fix `stub.activated?` sometimes returning false after activation under bundler Closes https://github.com/rubygems/rubygems/pull/8068 This issue only occurs if the underlying stub is a gem stub: https://github.com/Earlopain/rubygems/blob/f56098d8a193dcb94584d721e82b8cff397e5265/bundler/lib/bundler/stub_specification.rb#L109-L112 https://github.com/rubygems/rubygems/commit/9b0152b3d5 --- lib/bundler/stub_specification.rb | 4 ++-- .../bundler/stub_specification_spec.rb | 20 +++++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/lib/bundler/stub_specification.rb b/lib/bundler/stub_specification.rb index 1cbb506ef99f54..dc5d38580a8551 100644 --- a/lib/bundler/stub_specification.rb +++ b/lib/bundler/stub_specification.rb @@ -45,8 +45,8 @@ def missing_extensions? true end - def activated - stub.activated + def activated? + stub.activated? end def activated=(activated) diff --git a/spec/bundler/bundler/stub_specification_spec.rb b/spec/bundler/bundler/stub_specification_spec.rb index dae9f3cfba9f40..beb966b3ce8b56 100644 --- a/spec/bundler/bundler/stub_specification_spec.rb +++ b/spec/bundler/bundler/stub_specification_spec.rb @@ -55,4 +55,24 @@ expect(stub.missing_extensions?).to be true end end + + describe "#activated?" do + it "returns true after activation" do + stub = described_class.from_stub(with_bundler_stub_spec) + + expect(stub.activated?).to be_falsey + stub.activated = true + expect(stub.activated?).to be true + end + + it "returns true after activation if the underlying stub is a `Gem::StubSpecification`" do + spec_path = File.join(File.dirname(__FILE__), "specifications", "foo.gemspec") + gem_stub = Gem::StubSpecification.new(spec_path, File.dirname(__FILE__),"","") + stub = described_class.from_stub(gem_stub) + + expect(stub.activated?).to be_falsey + stub.activated = true + expect(stub.activated?).to be true + end + end end From 1e0076368832129016814604918013d70383fde9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Fri, 27 Sep 2024 07:26:56 +0200 Subject: [PATCH 547/829] [rubygems/rubygems] Fix duplicated spec names https://github.com/rubygems/rubygems/commit/26f6600197 --- spec/bundler/install/deploy_spec.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/bundler/install/deploy_spec.rb b/spec/bundler/install/deploy_spec.rb index 7b6e775b4cd6b8..4b2b0325c8f2e4 100644 --- a/spec/bundler/install/deploy_spec.rb +++ b/spec/bundler/install/deploy_spec.rb @@ -438,7 +438,7 @@ expect(err).to include("You have changed in the Gemfile:\n* myrack from `no specified source` to `git://hubz.com`") end - it "explodes if you change a source" do + it "explodes if you change a source from git to the default" do build_git "myrack" install_gemfile <<-G @@ -459,7 +459,7 @@ expect(err).to include("You have changed in the Gemfile:\n* myrack from `#{lib_path("myrack-1.0")}` to `no specified source`") end - it "explodes if you change a source" do + it "explodes if you change a source from git to the default, in presence of other git sources" do build_lib "foo", path: lib_path("myrack/foo") build_git "myrack", path: lib_path("myrack") From 3a273c4742e9bf04bc690523fb485860ae4d59e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Fri, 27 Sep 2024 07:27:12 +0200 Subject: [PATCH 548/829] [rubygems/rubygems] Fix error when changing a path source to a git source if frozen mode https://github.com/rubygems/rubygems/commit/4c79ab9b2e --- lib/bundler/source/path.rb | 2 ++ spec/bundler/install/deploy_spec.rb | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/lib/bundler/source/path.rb b/lib/bundler/source/path.rb index 6a99f8e977ec67..d4c530e922b0d6 100644 --- a/lib/bundler/source/path.rb +++ b/lib/bundler/source/path.rb @@ -53,6 +53,8 @@ def to_s "source at `#{@path}`" end + alias_method :to_gemfile, :path + def hash [self.class, expanded_path, version].hash end diff --git a/spec/bundler/install/deploy_spec.rb b/spec/bundler/install/deploy_spec.rb index 4b2b0325c8f2e4..bd39ac5cc1d4ae 100644 --- a/spec/bundler/install/deploy_spec.rb +++ b/spec/bundler/install/deploy_spec.rb @@ -483,6 +483,27 @@ expect(err).not_to include("You have deleted from the Gemfile") end + it "explodes if you change a source from path to git" do + build_git "myrack", path: lib_path("myrack") + + install_gemfile <<-G + source "https://gem.repo1" + gem "myrack", :path => "#{lib_path("myrack")}" + G + + gemfile <<-G + source "https://gem.repo1" + gem "myrack", :git => "https:/my-git-repo-for-myrack" + G + + bundle "config set --local frozen true" + bundle :install, raise_on_error: false + expect(err).to include("frozen mode") + expect(err).to include("You have changed in the Gemfile:\n* myrack from `#{lib_path("myrack")}` to `https:/my-git-repo-for-myrack`") + expect(err).not_to include("You have added to the Gemfile") + expect(err).not_to include("You have deleted from the Gemfile") + end + it "remembers that the bundle is frozen at runtime" do bundle :lock From 6abed7eae993ca3a7f17dab3fc4f0adedf90a4af Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Mon, 30 Sep 2024 15:47:06 +0900 Subject: [PATCH 549/829] Test with -O3 is flaky now. I disabled it same as before. --- .github/workflows/compilers.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/compilers.yml b/.github/workflows/compilers.yml index 363539f5a6a86f..0f3e6c740baf1a 100644 --- a/.github/workflows/compilers.yml +++ b/.github/workflows/compilers.yml @@ -191,7 +191,7 @@ jobs: with: { sparse-checkout-cone-mode: false, sparse-checkout: /.github } - { uses: './.github/actions/setup/directories', with: { srcdir: 'src', builddir: 'build', makeup: true } } - { uses: './.github/actions/compilers', name: '-O0', with: { optflags: '-O0 -march=x86-64 -mtune=generic' } } - - { uses: './.github/actions/compilers', name: '-O3', with: { optflags: '-O3 -march=x86-64 -mtune=generic', check: true } } + # - { uses: './.github/actions/compilers', name: '-O3', with: { optflags: '-O3 -march=x86-64 -mtune=generic', check: true } } - { uses: './.github/actions/compilers', name: 'gmp', with: { append_configure: '--with-gmp', check: 'ruby/test_bignum.rb' } } - { uses: './.github/actions/compilers', name: 'jemalloc', with: { append_configure: '--with-jemalloc' } } - { uses: './.github/actions/compilers', name: 'valgrind', with: { append_configure: '--with-valgrind' } } From 239c1c621e92f519498e421cf825f44667c0e56c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=9C=E9=83=A8=E6=98=8C=E5=B9=B3?= Date: Mon, 30 Sep 2024 08:59:32 +0200 Subject: [PATCH 550/829] LLVM 20 begun see also https://github.com/llvm/llvm-project/commit/10c6d6349e51bb245b9deec4aafca9885971135b --- .github/workflows/compilers.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/compilers.yml b/.github/workflows/compilers.yml index 0f3e6c740baf1a..692c15cc42f2be 100644 --- a/.github/workflows/compilers.yml +++ b/.github/workflows/compilers.yml @@ -103,6 +103,7 @@ jobs: - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: { sparse-checkout-cone-mode: false, sparse-checkout: /.github } - { uses: './.github/actions/setup/directories', with: { srcdir: 'src', builddir: 'build', makeup: true } } + - { uses: './.github/actions/compilers', name: 'clang 20', with: { tag: 'clang-20' } } - { uses: './.github/actions/compilers', name: 'clang 19', with: { tag: 'clang-19' } } - { uses: './.github/actions/compilers', name: 'clang 18', with: { tag: 'clang-18' } } - { uses: './.github/actions/compilers', name: 'clang 17', with: { tag: 'clang-17' } } From 044e57ed7c34bfe2cea6e7dcc685cc0a4050c86f Mon Sep 17 00:00:00 2001 From: ydah Date: Tue, 24 Sep 2024 20:05:12 +0900 Subject: [PATCH 551/829] Implement SPLAT NODE keyword locations --- ast.c | 4 ++++ node_dump.c | 3 ++- parse.y | 21 +++++++++++---------- rubyparser.h | 1 + test/ruby/test_ast.rb | 14 ++++++++++++++ 5 files changed, 32 insertions(+), 11 deletions(-) diff --git a/ast.c b/ast.c index 5c7aa7b14e94f4..a0c1801de197d2 100644 --- a/ast.c +++ b/ast.c @@ -836,6 +836,10 @@ node_locations(VALUE ast_value, const NODE *node) return rb_ary_new_from_args(2, location_new(nd_code_loc(node)), location_new(&RNODE_RETURN(node)->keyword_loc)); + case NODE_SPLAT: + return rb_ary_new_from_args(2, + location_new(nd_code_loc(node)), + location_new(&RNODE_SPLAT(node)->operator_loc)); case NODE_UNDEF: return rb_ary_new_from_args(2, location_new(nd_code_loc(node)), diff --git a/node_dump.c b/node_dump.c index 9e4dd5158ca36e..d346ba9a7e7129 100644 --- a/node_dump.c +++ b/node_dump.c @@ -902,8 +902,9 @@ dump_node(VALUE buf, VALUE indent, int comment, const NODE * node) ANN("splat argument"); ANN("format: *[nd_head]"); ANN("example: foo(*ary)"); - LAST_NODE; F_NODE(nd_head, RNODE_SPLAT, "splat'ed array"); + LAST_NODE; + F_LOC(operator_loc, RNODE_SPLAT); return; case NODE_BLOCK_PASS: diff --git a/parse.y b/parse.y index 16a687b5948ebe..ff7129a8ca8ce0 100644 --- a/parse.y +++ b/parse.y @@ -1133,7 +1133,7 @@ static rb_node_kw_arg_t *rb_node_kw_arg_new(struct parser_params *p, NODE *nd_bo static rb_node_postarg_t *rb_node_postarg_new(struct parser_params *p, NODE *nd_1st, NODE *nd_2nd, const YYLTYPE *loc); static rb_node_argscat_t *rb_node_argscat_new(struct parser_params *p, NODE *nd_head, NODE *nd_body, const YYLTYPE *loc); static rb_node_argspush_t *rb_node_argspush_new(struct parser_params *p, NODE *nd_head, NODE *nd_body, const YYLTYPE *loc); -static rb_node_splat_t *rb_node_splat_new(struct parser_params *p, NODE *nd_head, const YYLTYPE *loc); +static rb_node_splat_t *rb_node_splat_new(struct parser_params *p, NODE *nd_head, const YYLTYPE *loc, const YYLTYPE *operator_loc); static rb_node_block_pass_t *rb_node_block_pass_new(struct parser_params *p, NODE *nd_body, const YYLTYPE *loc, const YYLTYPE *operator_loc); static rb_node_defn_t *rb_node_defn_new(struct parser_params *p, ID nd_mid, NODE *nd_defn, const YYLTYPE *loc); static rb_node_defs_t *rb_node_defs_new(struct parser_params *p, NODE *nd_recv, ID nd_mid, NODE *nd_defn, const YYLTYPE *loc); @@ -1241,7 +1241,7 @@ static rb_node_error_t *rb_node_error_new(struct parser_params *p, const YYLTYPE #define NEW_POSTARG(i,v,loc) (NODE *)rb_node_postarg_new(p,i,v,loc) #define NEW_ARGSCAT(a,b,loc) (NODE *)rb_node_argscat_new(p,a,b,loc) #define NEW_ARGSPUSH(a,b,loc) (NODE *)rb_node_argspush_new(p,a,b,loc) -#define NEW_SPLAT(a,loc) (NODE *)rb_node_splat_new(p,a,loc) +#define NEW_SPLAT(a,loc,op_loc) (NODE *)rb_node_splat_new(p,a,loc,op_loc) #define NEW_BLOCK_PASS(b,loc,o_loc) rb_node_block_pass_new(p,b,loc,o_loc) #define NEW_DEFN(i,s,loc) (NODE *)rb_node_defn_new(p,i,s,loc) #define NEW_DEFS(r,i,s,loc) (NODE *)rb_node_defs_new(p,r,i,s,loc) @@ -4349,7 +4349,7 @@ args : arg_value } | arg_splat { - $$ = NEW_SPLAT($arg_splat, &@$); + $$ = $arg_splat; /*% ripper: args_add_star!(args_new!, $:arg_splat) %*/ } | args ',' arg_value @@ -4359,7 +4359,7 @@ args : arg_value } | args ',' arg_splat { - $$ = rest_arg_append(p, $1, $3, &@$); + $$ = rest_arg_append(p, $1, RNODE_SPLAT($arg_splat)->nd_head, &@$); /*% ripper: args_add_star!($:1, $:3) %*/ } ; @@ -4367,13 +4367,13 @@ args : arg_value /* value */ arg_splat : tSTAR arg_value { - $$ = $2; + $$ = NEW_SPLAT($2, &@$, &@1); /*% ripper: $:2 %*/ } | tSTAR /* none */ { forwarding_arg_check(p, idFWD_REST, idFWD_ALL, "rest"); - $$ = NEW_LVAR(idFWD_REST, &@1); + $$ = NEW_SPLAT(NEW_LVAR(idFWD_REST, &@1), &@$, &@1); /*% ripper: Qnil %*/ } ; @@ -4396,7 +4396,7 @@ mrhs : args ',' arg_value } | tSTAR arg_value { - $$ = NEW_SPLAT($2, &@$); + $$ = NEW_SPLAT($2, &@$, &@1); /*% ripper: mrhs_add_star!(mrhs_new!, $:2) %*/ } ; @@ -5430,7 +5430,7 @@ case_args : arg_value } | tSTAR arg_value { - $$ = NEW_SPLAT($2, &@$); + $$ = NEW_SPLAT($2, &@$, &@1); /*% ripper: args_add_star!(args_new!, $:2) %*/ } | case_args ',' arg_value @@ -12316,10 +12316,11 @@ rb_node_argspush_new(struct parser_params *p, NODE *nd_head, NODE *nd_body, cons } static rb_node_splat_t * -rb_node_splat_new(struct parser_params *p, NODE *nd_head, const YYLTYPE *loc) +rb_node_splat_new(struct parser_params *p, NODE *nd_head, const YYLTYPE *loc, const YYLTYPE *operator_loc) { rb_node_splat_t *n = NODE_NEWNODE(NODE_SPLAT, rb_node_splat_t, loc); n->nd_head = nd_head; + n->operator_loc = *operator_loc; return n; } @@ -15167,7 +15168,7 @@ new_args_forward_call(struct parser_params *p, NODE *leading, const YYLTYPE *loc NODE *kwrest = list_append(p, NEW_LIST(0, loc), NEW_LVAR(idFWD_KWREST, loc)); #endif rb_node_block_pass_t *block = NEW_BLOCK_PASS(NEW_LVAR(idFWD_BLOCK, loc), argsloc, &NULL_LOC); - NODE *args = leading ? rest_arg_append(p, leading, rest, argsloc) : NEW_SPLAT(rest, loc); + NODE *args = leading ? rest_arg_append(p, leading, rest, argsloc) : NEW_SPLAT(rest, loc, &NULL_LOC); block->forwarding = TRUE; #ifndef FORWARD_ARGS_WITH_RUBY2_KEYWORDS args = arg_append(p, args, new_hash(p, kwrest, loc), argsloc); diff --git a/rubyparser.h b/rubyparser.h index 9ed7f356220d3a..08111a88980aca 100644 --- a/rubyparser.h +++ b/rubyparser.h @@ -810,6 +810,7 @@ typedef struct RNode_SPLAT { NODE node; struct RNode *nd_head; + rb_code_location_t operator_loc; } rb_node_splat_t; typedef struct RNode_BLOCK_PASS { diff --git a/test/ruby/test_ast.rb b/test/ruby/test_ast.rb index 8de4a5bfe2bb02..91f4250cfc607c 100644 --- a/test/ruby/test_ast.rb +++ b/test/ruby/test_ast.rb @@ -1424,6 +1424,20 @@ def test_return_locations assert_locations(node.children[-1].locations, [[1, 0, 1, 6], [1, 0, 1, 6]]) end + def test_splat_locations + node = ast_parse("a = *1") + assert_locations(node.children[-1].children[1].locations, [[1, 4, 1, 6], [1, 4, 1, 5]]) + + node = ast_parse("a = *1, 2") + assert_locations(node.children[-1].children[1].children[0].locations, [[1, 4, 1, 6], [1, 4, 1, 5]]) + + node = ast_parse("case a; when *1; end") + assert_locations(node.children[-1].children[1].children[0].locations, [[1, 13, 1, 15], [1, 13, 1, 14]]) + + node = ast_parse("case a; when *1, 2; end") + assert_locations(node.children[-1].children[1].children[0].children[0].locations, [[1, 13, 1, 15], [1, 13, 1, 14]]) + end + def test_unless_locations node = ast_parse("unless cond then 1 else 2 end") assert_locations(node.children[-1].locations, [[1, 0, 1, 29], [1, 0, 1, 6], [1, 12, 1, 16], [1, 26, 1, 29]]) From ac2786757e1920fb2366a7331650acf6e328b2d6 Mon Sep 17 00:00:00 2001 From: ydah Date: Tue, 24 Sep 2024 20:17:49 +0900 Subject: [PATCH 552/829] Use Named Reference --- parse.y | 58 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/parse.y b/parse.y index ff7129a8ca8ce0..1104697b19ab95 100644 --- a/parse.y +++ b/parse.y @@ -4344,36 +4344,36 @@ opt_block_arg : ',' block_arg /* value */ args : arg_value { - $$ = NEW_LIST($1, &@$); - /*% ripper: args_add!(args_new!, $:1) %*/ + $$ = NEW_LIST($arg_value, &@$); + /*% ripper: args_add!(args_new!, $:arg_value) %*/ } | arg_splat { $$ = $arg_splat; /*% ripper: args_add_star!(args_new!, $:arg_splat) %*/ } - | args ',' arg_value + | args[non_last_args] ',' arg_value { - $$ = last_arg_append(p, $1, $3, &@$); - /*% ripper: args_add!($:1, $:3) %*/ + $$ = last_arg_append(p, $non_last_args, $arg_value, &@$); + /*% ripper: args_add!($:non_last_args, $:arg_value) %*/ } - | args ',' arg_splat + | args[non_last_args] ',' arg_splat { - $$ = rest_arg_append(p, $1, RNODE_SPLAT($arg_splat)->nd_head, &@$); - /*% ripper: args_add_star!($:1, $:3) %*/ + $$ = rest_arg_append(p, $non_last_args, RNODE_SPLAT($arg_splat)->nd_head, &@$); + /*% ripper: args_add_star!($:non_last_args, $:arg_splat) %*/ } ; /* value */ arg_splat : tSTAR arg_value { - $$ = NEW_SPLAT($2, &@$, &@1); - /*% ripper: $:2 %*/ + $$ = NEW_SPLAT($arg_value, &@$, &@tSTAR); + /*% ripper: $:arg_value %*/ } | tSTAR /* none */ { forwarding_arg_check(p, idFWD_REST, idFWD_ALL, "rest"); - $$ = NEW_SPLAT(NEW_LVAR(idFWD_REST, &@1), &@$, &@1); + $$ = NEW_SPLAT(NEW_LVAR(idFWD_REST, &@tSTAR), &@$, &@tSTAR); /*% ripper: Qnil %*/ } ; @@ -4386,18 +4386,18 @@ mrhs_arg : mrhs /* value */ mrhs : args ',' arg_value { - $$ = last_arg_append(p, $1, $3, &@$); - /*% ripper: mrhs_add!(mrhs_new_from_args!($:1), $:3) %*/ + $$ = last_arg_append(p, $args, $arg_value, &@$); + /*% ripper: mrhs_add!(mrhs_new_from_args!($:args), $:arg_value) %*/ } | args ',' tSTAR arg_value { - $$ = rest_arg_append(p, $1, $4, &@$); - /*% ripper: mrhs_add_star!(mrhs_new_from_args!($:1), $:4) %*/ + $$ = rest_arg_append(p, $args, $arg_value, &@$); + /*% ripper: mrhs_add_star!(mrhs_new_from_args!($:args), $:arg_value) %*/ } | tSTAR arg_value { - $$ = NEW_SPLAT($2, &@$, &@1); - /*% ripper: mrhs_add_star!(mrhs_new!, $:2) %*/ + $$ = NEW_SPLAT($arg_value, &@$, &@tSTAR); + /*% ripper: mrhs_add_star!(mrhs_new!, $:arg_value) %*/ } ; @@ -5424,25 +5424,25 @@ do_body : { case_args : arg_value { - check_literal_when(p, $1, &@1); - $$ = NEW_LIST($1, &@$); - /*% ripper: args_add!(args_new!, $:1) %*/ + check_literal_when(p, $arg_value, &@arg_value); + $$ = NEW_LIST($arg_value, &@$); + /*% ripper: args_add!(args_new!, $:arg_value) %*/ } | tSTAR arg_value { - $$ = NEW_SPLAT($2, &@$, &@1); - /*% ripper: args_add_star!(args_new!, $:2) %*/ + $$ = NEW_SPLAT($arg_value, &@$, &@tSTAR); + /*% ripper: args_add_star!(args_new!, $:arg_value) %*/ } - | case_args ',' arg_value + | case_args[non_last_args] ',' arg_value { - check_literal_when(p, $3, &@3); - $$ = last_arg_append(p, $1, $3, &@$); - /*% ripper: args_add!($:1, $:3) %*/ + check_literal_when(p, $arg_value, &@arg_value); + $$ = last_arg_append(p, $non_last_args, $arg_value, &@$); + /*% ripper: args_add!($:non_last_args, $:arg_value) %*/ } - | case_args ',' tSTAR arg_value + | case_args[non_last_args] ',' tSTAR arg_value { - $$ = rest_arg_append(p, $1, $4, &@$); - /*% ripper: args_add_star!($:1, $:4) %*/ + $$ = rest_arg_append(p, $non_last_args, $arg_value, &@$); + /*% ripper: args_add_star!($:non_last_args, $:arg_value) %*/ } ; From c30a3ed027f2ea03d98aedf677368542ee6ca873 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Mon, 30 Sep 2024 18:17:42 +0900 Subject: [PATCH 553/829] Fix the last character index in an assertion Also, when `RUBY_DEBUG` is enabled, objects allocated in shared-gc fail at `rb_ractor_confirm_belonging`, so assert it always. --- gc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gc.c b/gc.c index c1a9b600448d7e..ba7007da39da8c 100644 --- a/gc.c +++ b/gc.c @@ -658,7 +658,7 @@ static void ruby_external_gc_init(void) { // Assert that the directory path ends with a / - GC_ASSERT(SHARED_GC_DIR[strlen(SHARED_GC_DIR) - 2] == '/'); + RUBY_ASSERT_ALWAYS(SHARED_GC_DIR[sizeof(SHARED_GC_DIR) - 2] == '/'); char *gc_so_file = getenv(RUBY_GC_LIBRARY); From 8cd36a6dab170f4127c58c07b1a388dd3813fb7a Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Mon, 30 Sep 2024 18:39:36 +0900 Subject: [PATCH 554/829] Don't warn the bundled gems that are migrated at Ruby 3.0. We should stop warnings at some point. I decided to that period EOL-ed versions. ex. In 2024, Ruby 3.0 is EOL. we removed webrick, rexml, rss from warning targets. --- lib/bundled_gems.rb | 3 --- 1 file changed, 3 deletions(-) diff --git a/lib/bundled_gems.rb b/lib/bundled_gems.rb index b5f73a775040e0..38057cf6c53931 100644 --- a/lib/bundled_gems.rb +++ b/lib/bundled_gems.rb @@ -4,9 +4,6 @@ module Gem::BUNDLED_GEMS SINCE = { - "rexml" => "3.0.0", - "rss" => "3.0.0", - "webrick" => "3.0.0", "matrix" => "3.1.0", "net-ftp" => "3.1.0", "net-imap" => "3.1.0", From 81d26814be036a7b15c587d1e1832d9ddd24601e Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Mon, 30 Sep 2024 19:10:16 +0900 Subject: [PATCH 555/829] Update test args with bundled gems. webrick has been removed that targets --- test/test_bundled_gems.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/test_bundled_gems.rb b/test/test_bundled_gems.rb index 36f73243361bd7..19546dd29606af 100644 --- a/test/test_bundled_gems.rb +++ b/test/test_bundled_gems.rb @@ -12,8 +12,8 @@ def teardown end def test_warning - assert Gem::BUNDLED_GEMS.warning?("rss", specs: {}) - assert_nil Gem::BUNDLED_GEMS.warning?("rss", specs: {}) + assert Gem::BUNDLED_GEMS.warning?("csv", specs: {}) + assert_nil Gem::BUNDLED_GEMS.warning?("csv", specs: {}) end def test_no_warning_warning @@ -22,7 +22,7 @@ def test_no_warning_warning end def test_warning_libdir - path = File.join(::RbConfig::CONFIG.fetch("rubylibdir"), "rss.rb") + path = File.join(::RbConfig::CONFIG.fetch("rubylibdir"), "csv.rb") assert Gem::BUNDLED_GEMS.warning?(path, specs: {}) assert_nil Gem::BUNDLED_GEMS.warning?(path, specs: {}) end From 5ed67f48261ee0d50f12115908dfb9d3463e5fab Mon Sep 17 00:00:00 2001 From: Earlopain <14981592+Earlopain@users.noreply.github.com> Date: Mon, 30 Sep 2024 13:32:39 +0200 Subject: [PATCH 556/829] [ruby/rdoc] Only let browser search through source code until it's expanded (https://github.com/ruby/rdoc/pull/1181) Something that's been bothering me is that while the source code is not visible by default, the browser still jump to it when searching. Adding the `visible` property prevents this. Test it out yourself: * `bundle exec rdoc` * open `_site/index.html` * Search for `NameError` Before, you will get a match from `load_yaml` source code, after you only get the match when that methods source code is expanded. https://github.com/ruby/rdoc/commit/003126cc23 --- lib/rdoc/generator/template/darkfish/css/rdoc.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/rdoc/generator/template/darkfish/css/rdoc.css b/lib/rdoc/generator/template/darkfish/css/rdoc.css index 169a6331e9e120..7a42e625223ac7 100644 --- a/lib/rdoc/generator/template/darkfish/css/rdoc.css +++ b/lib/rdoc/generator/template/darkfish/css/rdoc.css @@ -585,6 +585,9 @@ main header h3 { /* @group Method Details */ main .method-source-code { + /* While this is already invisible through the rule below, this will inform the browser to + not consider source code during text searching until it is actually expanded. */ + visibility: hidden; max-height: 0; overflow: auto; transition-duration: 200ms; @@ -594,6 +597,7 @@ main .method-source-code { } main .method-source-code.active-menu { + visibility: visible; max-height: 100vh; } From b93c51c114c2b3c8f9845f3a7bd2c936baf0996d Mon Sep 17 00:00:00 2001 From: Yusuke Endoh Date: Mon, 30 Sep 2024 19:40:23 +0900 Subject: [PATCH 557/829] Free a buffer allocated by realpath 8350b48cfa7d344d9e2dc9748c26607c1b89d7df introduced a memory leak bug. Will fix [Bug #20773] `loop { File.realpath("foo") }` caused memory leak. --- file.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/file.c b/file.c index e8db1069f77c65..f94bef04aacdc4 100644 --- a/file.c +++ b/file.c @@ -4582,7 +4582,7 @@ rb_check_realpath_internal(VALUE basedir, VALUE path, rb_encoding *origenc, enum rb_sys_fail_path(unresolved_path); } resolved = ospath_new(resolved_ptr, strlen(resolved_ptr), rb_filesystem_encoding()); -# if defined(NEEDS_REALPATH_BUFFER) && NEEDS_REALPATH_BUFFER +# if !(defined(NEEDS_REALPATH_BUFFER) && NEEDS_REALPATH_BUFFER) free(resolved_ptr); # endif From 637067440f74043c6d79fc649ab8acf1afea25a5 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Mon, 30 Sep 2024 16:24:03 +0900 Subject: [PATCH 558/829] [Bug #20752] Slice of readonly `IO::Buffer` also should be readonly --- io_buffer.c | 1 + test/ruby/test_io_buffer.rb | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/io_buffer.c b/io_buffer.c index e6ca61bdae0136..2e789abe0faf7d 100644 --- a/io_buffer.c +++ b/io_buffer.c @@ -1532,6 +1532,7 @@ rb_io_buffer_slice(struct rb_io_buffer *buffer, VALUE self, size_t offset, size_ struct rb_io_buffer *slice = NULL; TypedData_Get_Struct(instance, struct rb_io_buffer, &rb_io_buffer_type, slice); + slice->flags |= (buffer->flags & RB_IO_BUFFER_READONLY); slice->base = (char*)buffer->base + offset; slice->size = length; diff --git a/test/ruby/test_io_buffer.rb b/test/ruby/test_io_buffer.rb index 7a58ec0c5a86cf..7087a2b957d734 100644 --- a/test/ruby/test_io_buffer.rb +++ b/test/ruby/test_io_buffer.rb @@ -236,6 +236,18 @@ def test_slice_bounds_error end end + def test_slice_readonly + hello = %w"Hello World".join(" ").freeze + buffer = IO::Buffer.for(hello) + slice = buffer.slice + assert_predicate slice, :readonly? + assert_raise IO::Buffer::AccessError do + # This breaks the literal in string pool and many other tests in this file. + slice.set_string("Adios", 0, 5) + end + assert_equal "Hello World", hello + end + def test_locked buffer = IO::Buffer.new(128, IO::Buffer::INTERNAL|IO::Buffer::LOCKED) From 6b8078cc038e926969ec351bceda26182c04654d Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Sun, 29 Sep 2024 21:03:08 -0400 Subject: [PATCH 559/829] Don't create empty string for interpolation We don't need to create an empty string for interpolation unless it is the only element. For example: "#{hello} world" Before: 0000 putobject "" ( 1)[Li] 0002 putself 0003 opt_send_without_block 0005 dup 0006 objtostring 0008 anytostring 0009 putobject " world" 0011 concatstrings 3 0013 leave After: 0000 putself ( 1)[Li] 0001 opt_send_without_block 0003 dup 0004 objtostring 0006 anytostring 0007 putobject " world" 0009 concatstrings 2 0011 leave --- prism_compile.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/prism_compile.c b/prism_compile.c index ff487ddb23888d..3e4de89f22b64c 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -643,12 +643,15 @@ pm_interpolated_node_compile(rb_iseq_t *iseq, const pm_node_list_t *parts, const encoding = scope_node->encoding; } - current_string = rb_enc_str_new(NULL, 0, encoding); + if (parts_size == 1) { + current_string = rb_enc_str_new(NULL, 0, encoding); + } } - { + if (RTEST(current_string)) { VALUE operand = rb_fstring(current_string); PUSH_INSN1(ret, current_location, putobject, operand); + stack_size++; } PM_COMPILE_NOT_POPPED(part); @@ -664,7 +667,7 @@ pm_interpolated_node_compile(rb_iseq_t *iseq, const pm_node_list_t *parts, const PUSH_INSN(ret, current_location, anytostring); current_string = Qnil; - stack_size += 2; + stack_size++; } } } From c1c9ba77caf7edc6e57252a26afffa849cbe1277 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Mon, 30 Sep 2024 10:15:21 -0400 Subject: [PATCH 560/829] [ruby/prism] Require a delimiter for singleton classes https://github.com/ruby/prism/commit/fd58d6a9ea --- prism/config.yml | 1 + prism/prism.c | 4 +++- prism/templates/src/diagnostic.c.erb | 1 + test/prism/errors/singleton_class_delimiter.txt | 3 +++ 4 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 test/prism/errors/singleton_class_delimiter.txt diff --git a/prism/config.yml b/prism/config.yml index f8a6a711b98a6a..99a0e16cb1664d 100644 --- a/prism/config.yml +++ b/prism/config.yml @@ -107,6 +107,7 @@ errors: - EXPECT_RPAREN - EXPECT_RPAREN_AFTER_MULTI - EXPECT_RPAREN_REQ_PARAMETER + - EXPECT_SINGLETON_CLASS_DELIMITER - EXPECT_STRING_CONTENT - EXPECT_WHEN_DELIMITER - EXPRESSION_BARE_HASH diff --git a/prism/prism.c b/prism/prism.c index 808915858adfc1..0b0a55e818c0a7 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -18966,7 +18966,9 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b pm_node_t *expression = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, false, PM_ERR_EXPECT_EXPRESSION_AFTER_LESS_LESS, (uint16_t) (depth + 1)); pm_parser_scope_push(parser, true); - accept2(parser, PM_TOKEN_NEWLINE, PM_TOKEN_SEMICOLON); + if (!match2(parser, PM_TOKEN_NEWLINE, PM_TOKEN_SEMICOLON)) { + PM_PARSER_ERR_TOKEN_FORMAT(parser, parser->current, PM_ERR_EXPECT_SINGLETON_CLASS_DELIMITER, pm_token_type_human(parser->current.type)); + } pm_node_t *statements = NULL; if (!match4(parser, PM_TOKEN_KEYWORD_RESCUE, PM_TOKEN_KEYWORD_ENSURE, PM_TOKEN_KEYWORD_ELSE, PM_TOKEN_KEYWORD_END)) { diff --git a/prism/templates/src/diagnostic.c.erb b/prism/templates/src/diagnostic.c.erb index 7768c7f5edcd88..1f8217417e848d 100644 --- a/prism/templates/src/diagnostic.c.erb +++ b/prism/templates/src/diagnostic.c.erb @@ -190,6 +190,7 @@ static const pm_diagnostic_data_t diagnostic_messages[PM_DIAGNOSTIC_ID_MAX] = { [PM_ERR_EXPECT_RPAREN] = { "expected a matching `)`", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_EXPECT_RPAREN_AFTER_MULTI] = { "expected a `)` after multiple assignment", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_EXPECT_RPAREN_REQ_PARAMETER] = { "expected a `)` to end a required parameter", PM_ERROR_LEVEL_SYNTAX }, + [PM_ERR_EXPECT_SINGLETON_CLASS_DELIMITER] = { "unexpected %s; expected a newline or a ';' after the singleton class", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_EXPECT_STRING_CONTENT] = { "expected string content after opening string delimiter", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_EXPECT_WHEN_DELIMITER] = { "expected a delimiter after the predicates of a `when` clause", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_EXPRESSION_BARE_HASH] = { "unexpected bare hash in expression", PM_ERROR_LEVEL_SYNTAX }, diff --git a/test/prism/errors/singleton_class_delimiter.txt b/test/prism/errors/singleton_class_delimiter.txt new file mode 100644 index 00000000000000..6a0232cb400665 --- /dev/null +++ b/test/prism/errors/singleton_class_delimiter.txt @@ -0,0 +1,3 @@ +class < Date: Mon, 30 Sep 2024 10:51:01 -0400 Subject: [PATCH 561/829] Sync Prism with latest main branch --- prism/config.yml | 1 + prism/prism.c | 7 ++++--- prism/templates/src/diagnostic.c.erb | 1 + test/prism/errors/for_loop_delimiter.txt | 3 +++ test/prism/errors/for_loops_only_end.txt | 1 + test/prism/fixtures/patterns.txt | 10 ++-------- 6 files changed, 12 insertions(+), 11 deletions(-) create mode 100644 test/prism/errors/for_loop_delimiter.txt diff --git a/prism/config.yml b/prism/config.yml index 99a0e16cb1664d..b5de4d2b4afced 100644 --- a/prism/config.yml +++ b/prism/config.yml @@ -99,6 +99,7 @@ errors: - EXPECT_EXPRESSION_AFTER_SPLAT - EXPECT_EXPRESSION_AFTER_SPLAT_HASH - EXPECT_EXPRESSION_AFTER_STAR + - EXPECT_FOR_DELIMITER - EXPECT_IDENT_REQ_PARAMETER - EXPECT_IN_DELIMITER - EXPECT_LPAREN_REQ_PARAMETER diff --git a/prism/prism.c b/prism/prism.c index 0b0a55e818c0a7..3c6863ab1bfa82 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -17539,7 +17539,7 @@ parse_pattern(pm_parser_t *parser, pm_constant_id_list_t *captures, uint8_t flag // Gather up all of the patterns into the list. while (accept1(parser, PM_TOKEN_COMMA)) { // Break early here in case we have a trailing comma. - if (match6(parser, PM_TOKEN_KEYWORD_THEN, PM_TOKEN_BRACE_RIGHT, PM_TOKEN_BRACKET_RIGHT, PM_TOKEN_NEWLINE, PM_TOKEN_SEMICOLON, PM_TOKEN_EOF)) { + if (match4(parser, PM_TOKEN_KEYWORD_THEN, PM_TOKEN_BRACE_RIGHT, PM_TOKEN_BRACKET_RIGHT, PM_TOKEN_SEMICOLON)) { node = (pm_node_t *) pm_implicit_rest_node_create(parser, &parser->previous); pm_node_list_append(&nodes, node); break; @@ -19454,10 +19454,11 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b do_keyword = parser->previous; } else { do_keyword = not_provided(parser); + if (!match2(parser, PM_TOKEN_SEMICOLON, PM_TOKEN_NEWLINE)) { + PM_PARSER_ERR_TOKEN_FORMAT(parser, parser->current, PM_ERR_EXPECT_FOR_DELIMITER, pm_token_type_human(parser->current.type)); + } } - accept2(parser, PM_TOKEN_SEMICOLON, PM_TOKEN_NEWLINE); - pm_statements_node_t *statements = NULL; if (!match1(parser, PM_TOKEN_KEYWORD_END)) { statements = parse_statements(parser, PM_CONTEXT_FOR, (uint16_t) (depth + 1)); diff --git a/prism/templates/src/diagnostic.c.erb b/prism/templates/src/diagnostic.c.erb index 1f8217417e848d..b2381db57fab2c 100644 --- a/prism/templates/src/diagnostic.c.erb +++ b/prism/templates/src/diagnostic.c.erb @@ -182,6 +182,7 @@ static const pm_diagnostic_data_t diagnostic_messages[PM_DIAGNOSTIC_ID_MAX] = { [PM_ERR_EXPECT_EXPRESSION_AFTER_SPLAT] = { "expected an expression after `*` splat in an argument", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_EXPECT_EXPRESSION_AFTER_SPLAT_HASH] = { "expected an expression after `**` in a hash", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_EXPECT_EXPRESSION_AFTER_STAR] = { "expected an expression after `*`", PM_ERROR_LEVEL_SYNTAX }, + [PM_ERR_EXPECT_FOR_DELIMITER] = { "unexpected %s; expected a 'do', newline, or ';' after the 'for' loop collection", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_EXPECT_IDENT_REQ_PARAMETER] = { "expected an identifier for the required parameter", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_EXPECT_IN_DELIMITER] = { "expected a delimiter after the patterns of an `in` clause", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_EXPECT_LPAREN_REQ_PARAMETER] = { "expected a `(` to start a required parameter", PM_ERROR_LEVEL_SYNTAX }, diff --git a/test/prism/errors/for_loop_delimiter.txt b/test/prism/errors/for_loop_delimiter.txt new file mode 100644 index 00000000000000..07002d9d0645a2 --- /dev/null +++ b/test/prism/errors/for_loop_delimiter.txt @@ -0,0 +1,3 @@ +for a in b end + ^~~ unexpected 'end'; expected a 'do', newline, or ';' after the 'for' loop collection + diff --git a/test/prism/errors/for_loops_only_end.txt b/test/prism/errors/for_loops_only_end.txt index 94cc5270b56dd7..a8eaf0b8ab32d9 100644 --- a/test/prism/errors/for_loops_only_end.txt +++ b/test/prism/errors/for_loops_only_end.txt @@ -2,4 +2,5 @@ for end ^~~ expected an index after `for` ^ expected an `in` after the index in a `for` statement ^ expected a collection after the `in` in a `for` statement + ^~~ unexpected 'end'; expected a 'do', newline, or ';' after the 'for' loop collection diff --git a/test/prism/fixtures/patterns.txt b/test/prism/fixtures/patterns.txt index 29f8b4cf808332..5b3bc496522e7d 100644 --- a/test/prism/fixtures/patterns.txt +++ b/test/prism/fixtures/patterns.txt @@ -87,10 +87,7 @@ foo => *bar, baz, qux foo => bar, *baz, qux foo => bar, baz, *qux foo => *bar, baz, *qux - -foo => bar, - -; # end the previous pattern for ParseTest#test_filepath_patterns.txt which parses the whole file at once +foo => bar,; foo => [] foo => [[[[[]]]]] @@ -127,10 +124,7 @@ foo in __FILE__ foo in __LINE__ foo in __ENCODING__ foo in -> { bar } - -foo in bar, - -; # end the previous pattern for ParseTest#test_filepath_patterns.txt which parses the whole file at once +foo in bar,; case foo; in bar then end case foo; in 1 then end From 2a58092360c70caf7544544c95549b4c83e81237 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Mon, 30 Sep 2024 10:03:01 -0400 Subject: [PATCH 562/829] Remove unneeded prototype for objspace_available_slots --- gc/default.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/gc/default.c b/gc/default.c index 65aacb70a36148..4df9a8b9fd47e0 100644 --- a/gc/default.c +++ b/gc/default.c @@ -1683,9 +1683,6 @@ heap_page_add_freeobj(rb_objspace_t *objspace, struct heap_page *page, VALUE obj gc_report(3, objspace, "heap_page_add_freeobj: add %p to freelist\n", (void *)obj); } -static size_t -objspace_available_slots(rb_objspace_t *objspace); - static void size_pool_allocatable_slots_expand(rb_objspace_t *objspace, rb_size_pool_t *size_pool, size_t free_slots, size_t total_slots) From d592ddd5e619ffe1691b8050de2ccc3e1bd6e080 Mon Sep 17 00:00:00 2001 From: Luke Gruber Date: Sun, 29 Sep 2024 12:39:23 -0400 Subject: [PATCH 563/829] Fix compile issue with a short-circuited if/unless condition and `defined?` This caused an issue when `defined?` was in the `if` condition. Its instructions weren't appended to the instruction sequence even though it was compiled if a compile-time known logical short-circuit happened before the `defined?`. The catch table entry (`defined?` compilation produces a catch table entry) was still on the iseq even though the instructions weren't there. This caused faulty exception handling in the method. The solution is to no add the catch table entry for `defined?` after a compile-time known logical short circuit. This shouldn't touch much code, it's only for cases like the following, which can occur during debugging: if false && defined?(Some::CONSTANT) "more code..." end Fixes [Bug #20501] --- compile.c | 39 ++++++++++++++++++++++++++------------- prism_compile.c | 5 +++-- test/ruby/test_syntax.rb | 37 +++++++++++++++++++++++++++++++++++++ tool/lib/envutil.rb | 5 +++++ 4 files changed, 71 insertions(+), 15 deletions(-) diff --git a/compile.c b/compile.c index 53aabc6d4f63aa..5434a0cf05c019 100644 --- a/compile.c +++ b/compile.c @@ -495,7 +495,7 @@ static int iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *const anchor); static int iseq_set_exception_table(rb_iseq_t *iseq); static int iseq_set_optargs_table(rb_iseq_t *iseq); -static int compile_defined_expr(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node, VALUE needstr); +static int compile_defined_expr(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node, VALUE needstr, bool ignore); static int compile_hash(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, int method_call_keywords, int popped); /* @@ -1353,6 +1353,7 @@ new_label_body(rb_iseq_t *iseq, long line) labelobj->set = 0; labelobj->rescued = LABEL_RESCUE_NONE; labelobj->unremovable = 0; + labelobj->position = -1; return labelobj; } @@ -2878,11 +2879,16 @@ iseq_set_exception_table(rb_iseq_t *iseq) table->size = tlen; for (i = 0; i < table->size; i++) { + int pos; ptr = RARRAY_CONST_PTR(tptr[i]); entry = UNALIGNED_MEMBER_PTR(table, entries[i]); entry->type = (enum rb_catch_type)(ptr[0] & 0xffff); - entry->start = label_get_position((LABEL *)(ptr[1] & ~1)); - entry->end = label_get_position((LABEL *)(ptr[2] & ~1)); + pos = label_get_position((LABEL *)(ptr[1] & ~1)); + RUBY_ASSERT(pos >= 0); + entry->start = (unsigned int)pos; + pos = label_get_position((LABEL *)(ptr[2] & ~1)); + RUBY_ASSERT(pos >= 0); + entry->end = (unsigned int)pos; entry->iseq = (rb_iseq_t *)ptr[3]; RB_OBJ_WRITTEN(iseq, Qundef, entry->iseq); @@ -4640,7 +4646,7 @@ compile_branch_condition(rb_iseq_t *iseq, LINK_ANCHOR *ret, const NODE *cond, CHECK(compile_flip_flop(iseq, ret, cond, FALSE, then_label, else_label)); return COMPILE_OK; case NODE_DEFINED: - CHECK(compile_defined_expr(iseq, ret, cond, Qfalse)); + CHECK(compile_defined_expr(iseq, ret, cond, Qfalse, ret == ignore)); break; default: { @@ -5857,7 +5863,7 @@ private_recv_p(const NODE *node) static void defined_expr(rb_iseq_t *iseq, LINK_ANCHOR *const ret, - const NODE *const node, LABEL **lfinish, VALUE needstr); + const NODE *const node, LABEL **lfinish, VALUE needstr, bool ignore); static int compile_call(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node, const enum node_type type, const NODE *const line_node, int popped, bool assume_receiver); @@ -6098,7 +6104,7 @@ build_defined_rescue_iseq(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const void *u static void defined_expr(rb_iseq_t *iseq, LINK_ANCHOR *const ret, - const NODE *const node, LABEL **lfinish, VALUE needstr) + const NODE *const node, LABEL **lfinish, VALUE needstr, bool ignore) { LINK_ELEMENT *lcur = ret->last; defined_expr0(iseq, ret, node, lfinish, needstr, false); @@ -6117,12 +6123,14 @@ defined_expr(rb_iseq_t *iseq, LINK_ANCHOR *const ret, lend->rescued = LABEL_RESCUE_END; APPEND_LABEL(ret, lcur, lstart); ADD_LABEL(ret, lend); - ADD_CATCH_ENTRY(CATCH_TYPE_RESCUE, lstart, lend, rescue, lfinish[1]); + if (!ignore) { + ADD_CATCH_ENTRY(CATCH_TYPE_RESCUE, lstart, lend, rescue, lfinish[1]); + } } } static int -compile_defined_expr(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node, VALUE needstr) +compile_defined_expr(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node, VALUE needstr, bool ignore) { const int line = nd_line(node); const NODE *line_node = node; @@ -6136,7 +6144,7 @@ compile_defined_expr(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const lfinish[0] = NEW_LABEL(line); lfinish[1] = 0; lfinish[2] = 0; - defined_expr(iseq, ret, RNODE_DEFINED(node)->nd_head, lfinish, needstr); + defined_expr(iseq, ret, RNODE_DEFINED(node)->nd_head, lfinish, needstr, ignore); if (lfinish[1]) { ELEM_INSERT_NEXT(last, &new_insn_body(iseq, nd_line(line_node), nd_node_id(line_node), BIN(putnil), 0)->link); ADD_INSN(ret, line_node, swap); @@ -6695,7 +6703,12 @@ compile_if(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node, int else_label = NEW_LABEL(line); end_label = 0; - CHECK(compile_branch_condition(iseq, cond_seq, RNODE_IF(node)->nd_cond, then_label, else_label)); + NODE *cond = RNODE_IF(node)->nd_cond; + if (nd_type(cond) == NODE_BLOCK) { + cond = RNODE_BLOCK(cond)->nd_head; + } + + CHECK(compile_branch_condition(iseq, cond_seq, cond, then_label, else_label)); ADD_SEQ(ret, cond_seq); if (then_label->refcnt && else_label->refcnt) { @@ -8179,7 +8192,7 @@ compile_iter(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node, in // Normally, "send" instruction is at the last. // However, qcall under branch coverage measurement adds some instructions after the "send". // - // Note that "invokesuper" appears instead of "send". + // Note that "invokesuper", "invokesuperforward" appears instead of "send". INSN *iobj; LINK_ELEMENT *last_elem = LAST_ELEMENT(ret); iobj = IS_INSN(last_elem) ? (INSN*) last_elem : (INSN*) get_prev_insn((INSN*) last_elem); @@ -9638,7 +9651,7 @@ compile_op_log(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node, LABEL *lfinish[2]; lfinish[0] = lfin; lfinish[1] = 0; - defined_expr(iseq, ret, RNODE_OP_ASGN_OR(node)->nd_head, lfinish, Qfalse); + defined_expr(iseq, ret, RNODE_OP_ASGN_OR(node)->nd_head, lfinish, Qfalse, false); lassign = lfinish[1]; if (!lassign) { lassign = NEW_LABEL(line); @@ -11233,7 +11246,7 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const no break; case NODE_DEFINED: if (!popped) { - CHECK(compile_defined_expr(iseq, ret, node, Qtrue)); + CHECK(compile_defined_expr(iseq, ret, node, Qtrue, false)); } break; case NODE_POSTEXE:{ diff --git a/prism_compile.c b/prism_compile.c index 3e4de89f22b64c..a9c8aea4b4e8dd 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -3310,7 +3310,7 @@ pm_scope_node_destroy(pm_scope_node_t *scope_node) * Normally, "send" instruction is at the last. However, qcall under branch * coverage measurement adds some instructions after the "send". * - * Note that "invokesuper" appears instead of "send". + * Note that "invokesuper", "invokesuperforward" appears instead of "send". */ static void pm_compile_retry_end_label(rb_iseq_t *iseq, LINK_ANCHOR *const ret, LABEL *retry_end_l) @@ -8154,9 +8154,10 @@ pm_compile_super_node(rb_iseq_t *iseq, const pm_super_node_t *node, const pm_nod PUSH_INSN2(ret, *location, invokesuper, callinfo, current_block); } - pm_compile_retry_end_label(iseq, ret, retry_end_l); } + pm_compile_retry_end_label(iseq, ret, retry_end_l); + if (popped) PUSH_INSN(ret, *location, pop); ISEQ_COMPILE_DATA(iseq)->current_block = previous_block; PUSH_CATCH_ENTRY(CATCH_TYPE_BREAK, retry_label, retry_end_l, current_block, retry_end_l); diff --git a/test/ruby/test_syntax.rb b/test/ruby/test_syntax.rb index 3ea6932b9c83c2..08b4a7ee1c3e4d 100644 --- a/test/ruby/test_syntax.rb +++ b/test/ruby/test_syntax.rb @@ -2229,6 +2229,43 @@ def test_cdhash RUBY end + def test_defined_in_short_circuit_if_condition + bug = '[ruby-core:20501]' + conds = [ + "false && defined?(Some::CONSTANT)", + "true || defined?(Some::CONSTANT)", + "(false && defined?(Some::CONSTANT))", # parens exercise different code path + "(true || defined?(Some::CONSTANT))", + "@val && false && defined?(Some::CONSTANT)", + "@val || true || defined?(Some::CONSTANT)" + ] + + conds.each do |cond| + code = %Q{ + def my_method + var = nil + if #{cond} + "here" + end + raise + end + begin + my_method + rescue + print 'ok' + else + print 'ng' + end + } + # Invoke in a subprocess because the bug caused a segfault using the parse.y compiler. + # Don't use assert_separately because the bug was best reproducible in a clean slate, + # without test env loaded. + out, _err, status = EnvUtil.invoke_ruby(["--disable-gems"], code, true, false) + assert_predicate(status, :success?, bug) + assert_equal 'ok', out + end + end + private def not_label(x) @result = x; @not_label ||= nil end diff --git a/tool/lib/envutil.rb b/tool/lib/envutil.rb index 642965047f7c32..952614b8cf0e12 100644 --- a/tool/lib/envutil.rb +++ b/tool/lib/envutil.rb @@ -165,6 +165,11 @@ def invoke_ruby(args, stdin_data = "", capture_stdout = false, capture_stderr = } args = [args] if args.kind_of?(String) + # use the same parser as current ruby + if args.none? { |arg| arg.start_with?("--parser=") } + current_parser = RUBY_DESCRIPTION =~ /prism/i ? "prism" : "parse.y" + args = ["--parser=#{current_parser}"] + args + end pid = spawn(child_env, *precommand, rubybin, *args, opt) in_c.close out_c&.close From 292c9793abb20242b12973c5fb9db5c612e2a90a Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Tue, 1 Oct 2024 02:55:16 +0900 Subject: [PATCH 564/829] Remove no longer needed excludes files --- test/.excludes-parsey/TestBugReporter.rb | 1 - test/.excludes-parsey/TestRubyOptions.rb | 10 ---------- 2 files changed, 11 deletions(-) delete mode 100644 test/.excludes-parsey/TestBugReporter.rb delete mode 100644 test/.excludes-parsey/TestRubyOptions.rb diff --git a/test/.excludes-parsey/TestBugReporter.rb b/test/.excludes-parsey/TestBugReporter.rb deleted file mode 100644 index 72357760a67b8c..00000000000000 --- a/test/.excludes-parsey/TestBugReporter.rb +++ /dev/null @@ -1 +0,0 @@ -exclude(:test_bug_reporter_add, "unexpected +PRISM in the Ruby description") diff --git a/test/.excludes-parsey/TestRubyOptions.rb b/test/.excludes-parsey/TestRubyOptions.rb deleted file mode 100644 index f6ac8c744a1361..00000000000000 --- a/test/.excludes-parsey/TestRubyOptions.rb +++ /dev/null @@ -1,10 +0,0 @@ -exclude(:test_crash_report_executable_path, "unexpected +PRISM in the Ruby description") -exclude(:test_crash_report_script_path, "unexpected +PRISM in the Ruby description") -exclude(:test_crash_report_script, "unexpected +PRISM in the Ruby description") -exclude(:test_crash_report, "unexpected +PRISM in the Ruby description") -exclude(:test_rjit_disabled_version, "unexpected +PRISM in the Ruby description") -exclude(:test_segv_loaded_features, "unexpected +PRISM in the Ruby description") -exclude(:test_segv_setproctitle, "unexpected +PRISM in the Ruby description") -exclude(:test_segv_test, "unexpected +PRISM in the Ruby description") -exclude(:test_verbose, "unexpected +PRISM in the Ruby description") -exclude(:test_version, "unexpected +PRISM in the Ruby description") From 30507a4aed83ee0712fbe84875b1d9bec1f1dd70 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Mon, 30 Sep 2024 13:37:28 -0400 Subject: [PATCH 565/829] Move RUBY_INTERNAL_EVENT_FREEOBJ into GC implementation Instead of calling rb_gc_event_hook inside of rb_gc_obj_free, it should be up to the GC implementation to call the event. --- gc.c | 2 -- gc/default.c | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gc.c b/gc.c index ba7007da39da8c..f4d4e137ae41e3 100644 --- a/gc.c +++ b/gc.c @@ -1087,8 +1087,6 @@ rb_gc_obj_free(void *objspace, VALUE obj) { RB_DEBUG_COUNTER_INC(obj_free); - rb_gc_event_hook(obj, RUBY_INTERNAL_EVENT_FREEOBJ); - switch (BUILTIN_TYPE(obj)) { case T_NIL: case T_FIXNUM: diff --git a/gc/default.c b/gc/default.c index 4df9a8b9fd47e0..09acad161871b1 100644 --- a/gc/default.c +++ b/gc/default.c @@ -3565,6 +3565,8 @@ gc_sweep_plane(rb_objspace_t *objspace, rb_heap_t *heap, uintptr_t p, bits_t bit #undef CHECK #endif + rb_gc_event_hook(vp, RUBY_INTERNAL_EVENT_FREEOBJ); + bool has_object_id = FL_TEST(vp, FL_SEEN_OBJ_ID); if (rb_gc_obj_free(objspace, vp)) { if (has_object_id) { From af63b4f8b7a659ab78a75af97416c042ca357a3b Mon Sep 17 00:00:00 2001 From: whtsht <85547207+whtsht@users.noreply.github.com> Date: Tue, 1 Oct 2024 08:00:54 +0900 Subject: [PATCH 566/829] Return an Iterator Instead of a Vector in `addrs_to_pages` Method (#11725) * Returning an iterator instead of a vec * Avoid changing the meaning of end_page --------- Co-authored-by: Takashi Kokubun --- yjit/src/asm/mod.rs | 6 +++--- yjit/src/codegen.rs | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/yjit/src/asm/mod.rs b/yjit/src/asm/mod.rs index bd56074b96e7f7..a113a41c739949 100644 --- a/yjit/src/asm/mod.rs +++ b/yjit/src/asm/mod.rs @@ -432,7 +432,7 @@ impl CodeBlock { } /// Convert an address range to memory page indexes against a num_pages()-sized array. - pub fn addrs_to_pages(&self, start_addr: CodePtr, end_addr: CodePtr) -> Vec { + pub fn addrs_to_pages(&self, start_addr: CodePtr, end_addr: CodePtr) -> impl Iterator { let mem_start = self.mem_block.borrow().start_ptr().raw_addr(self); let mem_end = self.mem_block.borrow().mapped_end_ptr().raw_addr(self); assert!(mem_start <= start_addr.raw_addr(self)); @@ -441,12 +441,12 @@ impl CodeBlock { // Ignore empty code ranges if start_addr == end_addr { - return vec![]; + return (0..0).into_iter(); } let start_page = (start_addr.raw_addr(self) - mem_start) / self.page_size; let end_page = (end_addr.raw_addr(self) - mem_start - 1) / self.page_size; - (start_page..=end_page).collect() // TODO: consider returning an iterator + (start_page..end_page + 1).into_iter() } /// Get a (possibly dangling) direct pointer to the current write position diff --git a/yjit/src/codegen.rs b/yjit/src/codegen.rs index a105ab97916b97..d3aac992aa5c41 100644 --- a/yjit/src/codegen.rs +++ b/yjit/src/codegen.rs @@ -10563,7 +10563,7 @@ impl CodegenGlobals { let cfunc_exit_code = gen_full_cfunc_return(&mut ocb).unwrap(); let ocb_end_addr = ocb.unwrap().get_write_ptr(); - let ocb_pages = ocb.unwrap().addrs_to_pages(ocb_start_addr, ocb_end_addr); + let ocb_pages = ocb.unwrap().addrs_to_pages(ocb_start_addr, ocb_end_addr).collect(); // Mark all code memory as executable cb.mark_all_executable(); From 522614a3775a5eb3058aed9169b3504b4b9d9347 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Oct 2024 02:58:56 +0000 Subject: [PATCH 567/829] Bump github/codeql-action from 3.26.9 to 3.26.10 Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.26.9 to 3.26.10. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/461ef6c76dfe95d5c364de2f431ddbd31a417628...e2b3eafc8d227b0241d48be5f425d47c2d750a13) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/codeql-analysis.yml | 8 ++++---- .github/workflows/scorecards.yml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 604d38c162c3d0..f7f315d56f476a 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -77,15 +77,15 @@ jobs: run: sudo rm /usr/lib/ruby/vendor_ruby/rubygems/defaults/operating_system.rb - name: Initialize CodeQL - uses: github/codeql-action/init@461ef6c76dfe95d5c364de2f431ddbd31a417628 # v3.26.9 + uses: github/codeql-action/init@e2b3eafc8d227b0241d48be5f425d47c2d750a13 # v3.26.10 with: languages: ${{ matrix.language }} - name: Autobuild - uses: github/codeql-action/autobuild@461ef6c76dfe95d5c364de2f431ddbd31a417628 # v3.26.9 + uses: github/codeql-action/autobuild@e2b3eafc8d227b0241d48be5f425d47c2d750a13 # v3.26.10 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@461ef6c76dfe95d5c364de2f431ddbd31a417628 # v3.26.9 + uses: github/codeql-action/analyze@e2b3eafc8d227b0241d48be5f425d47c2d750a13 # v3.26.10 with: category: '/language:${{ matrix.language }}' upload: False @@ -115,7 +115,7 @@ jobs: continue-on-error: true - name: Upload SARIF - uses: github/codeql-action/upload-sarif@461ef6c76dfe95d5c364de2f431ddbd31a417628 # v3.26.9 + uses: github/codeql-action/upload-sarif@e2b3eafc8d227b0241d48be5f425d47c2d750a13 # v3.26.10 with: sarif_file: sarif-results/${{ matrix.language }}.sarif continue-on-error: true diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml index 60f6f50c8cbf40..6597fe3061ec2a 100644 --- a/.github/workflows/scorecards.yml +++ b/.github/workflows/scorecards.yml @@ -67,6 +67,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: 'Upload to code-scanning' - uses: github/codeql-action/upload-sarif@461ef6c76dfe95d5c364de2f431ddbd31a417628 # v3.26.9 + uses: github/codeql-action/upload-sarif@e2b3eafc8d227b0241d48be5f425d47c2d750a13 # v3.26.10 with: sarif_file: results.sarif From 4822220e6bab0991a9acc7fc7731d08b67fde8ad Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Tue, 1 Oct 2024 16:52:34 +0900 Subject: [PATCH 568/829] Pass MSPECOPT from compilers.yml --- .github/actions/compilers/action.yml | 7 +++++++ .github/actions/compilers/entrypoint.sh | 2 +- .github/workflows/compilers.yml | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/actions/compilers/action.yml b/.github/actions/compilers/action.yml index ecb8e4f485168b..aa23365e49e99c 100644 --- a/.github/actions/compilers/action.yml +++ b/.github/actions/compilers/action.yml @@ -60,6 +60,12 @@ inputs: description: >- Whether to run `make check` + mspecopt: + required: false + default: '' + description: >- + Additional options for mspec. + static_exts: required: false description: >- @@ -89,6 +95,7 @@ runs: --env INPUT_CPPFLAGS='${{ inputs.cppflags }}' --env INPUT_APPEND_CONFIGURE='${{ inputs.append_configure }}' --env INPUT_CHECK='${{ inputs.check }}' + --env INPUT_MSPECOPT='${{ inputs.mspecopt }}' --env INPUT_ENABLE_SHARED='${{ inputs.enable_shared }}' --env INPUT_STATIC_EXTS='${{ inputs.static_exts }}' 'ghcr.io/ruby/ruby-ci-image:${{ inputs.tag }}' diff --git a/.github/actions/compilers/entrypoint.sh b/.github/actions/compilers/entrypoint.sh index 0a11ef9cc11376..198ac0e1746da6 100755 --- a/.github/actions/compilers/entrypoint.sh +++ b/.github/actions/compilers/entrypoint.sh @@ -93,4 +93,4 @@ fi grouped make install grouped make test-tool grouped make test-all TESTS="-- $tests" -grouped env CHECK_LEAKS=true make test-spec +grouped env CHECK_LEAKS=true make test-spec MSPECOPT="$INPUT_MSPECOPT" diff --git a/.github/workflows/compilers.yml b/.github/workflows/compilers.yml index 692c15cc42f2be..a3b3322591210a 100644 --- a/.github/workflows/compilers.yml +++ b/.github/workflows/compilers.yml @@ -193,7 +193,7 @@ jobs: - { uses: './.github/actions/setup/directories', with: { srcdir: 'src', builddir: 'build', makeup: true } } - { uses: './.github/actions/compilers', name: '-O0', with: { optflags: '-O0 -march=x86-64 -mtune=generic' } } # - { uses: './.github/actions/compilers', name: '-O3', with: { optflags: '-O3 -march=x86-64 -mtune=generic', check: true } } - - { uses: './.github/actions/compilers', name: 'gmp', with: { append_configure: '--with-gmp', check: 'ruby/test_bignum.rb' } } + - { uses: './.github/actions/compilers', name: 'gmp', with: { append_configure: '--with-gmp', check: 'ruby/test_bignum.rb', mspecopt: "spec/ruby/core/integer" } } - { uses: './.github/actions/compilers', name: 'jemalloc', with: { append_configure: '--with-jemalloc' } } - { uses: './.github/actions/compilers', name: 'valgrind', with: { append_configure: '--with-valgrind' } } - { uses: './.github/actions/compilers', name: 'coroutine=ucontext', with: { append_configure: '--with-coroutine=ucontext' } } From 76111af632a0689cbe56787b0fb1ba4c8bbbe2e0 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Tue, 1 Oct 2024 17:08:27 +0900 Subject: [PATCH 569/829] expand relative path --- .github/workflows/compilers.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/compilers.yml b/.github/workflows/compilers.yml index a3b3322591210a..3fb3813d0cf792 100644 --- a/.github/workflows/compilers.yml +++ b/.github/workflows/compilers.yml @@ -193,7 +193,7 @@ jobs: - { uses: './.github/actions/setup/directories', with: { srcdir: 'src', builddir: 'build', makeup: true } } - { uses: './.github/actions/compilers', name: '-O0', with: { optflags: '-O0 -march=x86-64 -mtune=generic' } } # - { uses: './.github/actions/compilers', name: '-O3', with: { optflags: '-O3 -march=x86-64 -mtune=generic', check: true } } - - { uses: './.github/actions/compilers', name: 'gmp', with: { append_configure: '--with-gmp', check: 'ruby/test_bignum.rb', mspecopt: "spec/ruby/core/integer" } } + - { uses: './.github/actions/compilers', name: 'gmp', with: { append_configure: '--with-gmp', check: 'ruby/test_bignum.rb', mspecopt: "/github/workspace/src/spec/ruby/core/integer" } } - { uses: './.github/actions/compilers', name: 'jemalloc', with: { append_configure: '--with-jemalloc' } } - { uses: './.github/actions/compilers', name: 'valgrind', with: { append_configure: '--with-valgrind' } } - { uses: './.github/actions/compilers', name: 'coroutine=ucontext', with: { append_configure: '--with-coroutine=ucontext' } } From 136b30b414b3fcaddf0505d5a72fed8b08b2da3c Mon Sep 17 00:00:00 2001 From: rm155 Date: Fri, 30 Jul 2021 15:45:34 -0400 Subject: [PATCH 570/829] [ruby/singleton] Improve Ractor-compliance; Create PerRactorSingleton https://github.com/ruby/singleton/commit/ec4f66d9c1 --- lib/singleton.rb | 104 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 85 insertions(+), 19 deletions(-) diff --git a/lib/singleton.rb b/lib/singleton.rb index 6da939124ee064..577a7b8894df1e 100644 --- a/lib/singleton.rb +++ b/lib/singleton.rb @@ -93,21 +93,25 @@ # module Singleton VERSION = "0.2.0" + VERSION.freeze - # Raises a TypeError to prevent cloning. - def clone - raise TypeError, "can't clone instance of singleton #{self.class}" - end + module SingletonInstanceMethods + # Raises a TypeError to prevent cloning. + def clone + raise TypeError, "can't clone instance of singleton #{self.class}" + end - # Raises a TypeError to prevent duping. - def dup - raise TypeError, "can't dup instance of singleton #{self.class}" - end + # Raises a TypeError to prevent duping. + def dup + raise TypeError, "can't dup instance of singleton #{self.class}" + end - # By default, do not retain any state when marshalling. - def _dump(depth = -1) - '' + # By default, do not retain any state when marshalling. + def _dump(depth = -1) + '' + end end + include SingletonInstanceMethods module SingletonClassMethods # :nodoc: @@ -121,7 +125,7 @@ def _load(str) end def instance # :nodoc: - @singleton__instance__ || @singleton__mutex__.synchronize { @singleton__instance__ ||= new } + @singleton__instance__ || @singleton__mutex__.synchronize { @singleton__instance__ ||= set_instance(new) } end private @@ -130,22 +134,42 @@ def inherited(sub_klass) super Singleton.__init__(sub_klass) end + + def set_instance(val) + @singleton__instance__ = val + end + + def set_mutex(val) + @singleton__mutex__ = val + end end - class << Singleton # :nodoc: + def self.module_with_class_methods + SingletonClassMethods + end + + module SingletonClassProperties + + def self.included(c) + # extending an object with Singleton is a bad idea + c.undef_method :extend_object + end + + def self.extended(c) + # extending an object with Singleton is a bad idea + c.singleton_class.undef_method :extend_object + end + def __init__(klass) # :nodoc: klass.instance_eval { - @singleton__instance__ = nil - @singleton__mutex__ = Thread::Mutex.new + set_instance(nil) + set_mutex(Thread::Mutex.new) } klass end private - # extending an object with Singleton is a bad idea - undef_method :extend_object - def append_features(mod) # help out people counting on transitive mixins unless mod.instance_of?(Class) @@ -157,10 +181,11 @@ def append_features(mod) def included(klass) super klass.private_class_method :new, :allocate - klass.extend SingletonClassMethods + klass.extend module_with_class_methods Singleton.__init__(klass) end end + extend SingletonClassProperties ## # :singleton-method: _load @@ -170,3 +195,44 @@ def included(klass) # :singleton-method: instance # Returns the singleton instance. end + +module PerRactorSingleton + include Singleton::SingletonInstanceMethods + + module PerRactorSingletonClassMethods + include Singleton::SingletonClassMethods + def instance + set_mutex(Thread::Mutex.new) if Ractor.current[mutex_key].nil? + return Ractor.current[instance_key] if Ractor.current[instance_key] + Ractor.current[mutex_key].synchronize { + return Ractor.current[instance_key] if Ractor.current[instance_key] + set_instance(new()) + } + Ractor.current[instance_key] + end + + private + + def instance_key + :"__PerRactorSingleton_instance_with_class_id_#{object_id}__" + end + + def mutex_key + :"__PerRactorSingleton_mutex_with_class_id_#{object_id}__" + end + + def set_instance(val) + Ractor.current[instance_key] = val + end + + def set_mutex(val) + Ractor.current[mutex_key] = val + end + end + + def self.module_with_class_methods + PerRactorSingletonClassMethods + end + + extend Singleton::SingletonClassProperties +end From a6e96df573b8180568d7365a258dddc36a246fd1 Mon Sep 17 00:00:00 2001 From: rm155 Date: Sat, 31 Jul 2021 16:17:55 -0400 Subject: [PATCH 571/829] [ruby/singleton] Change PerRactorSingleton to RactorLocalSingleton https://github.com/ruby/singleton/commit/1216a86303 --- lib/singleton.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/singleton.rb b/lib/singleton.rb index 577a7b8894df1e..4a47190e2b579e 100644 --- a/lib/singleton.rb +++ b/lib/singleton.rb @@ -196,10 +196,10 @@ def included(klass) # Returns the singleton instance. end -module PerRactorSingleton +module RactorLocalSingleton include Singleton::SingletonInstanceMethods - module PerRactorSingletonClassMethods + module RactorLocalSingletonClassMethods include Singleton::SingletonClassMethods def instance set_mutex(Thread::Mutex.new) if Ractor.current[mutex_key].nil? @@ -214,11 +214,11 @@ def instance private def instance_key - :"__PerRactorSingleton_instance_with_class_id_#{object_id}__" + :"__RactorLocalSingleton_instance_with_class_id_#{object_id}__" end def mutex_key - :"__PerRactorSingleton_mutex_with_class_id_#{object_id}__" + :"__RactorLocalSingleton_mutex_with_class_id_#{object_id}__" end def set_instance(val) @@ -231,7 +231,7 @@ def set_mutex(val) end def self.module_with_class_methods - PerRactorSingletonClassMethods + RactorLocalSingletonClassMethods end extend Singleton::SingletonClassProperties From d0c1eef51174701889767e1fed584d2d56d9f9c9 Mon Sep 17 00:00:00 2001 From: rm155 Date: Wed, 18 Aug 2021 16:51:13 -0400 Subject: [PATCH 572/829] [ruby/singleton] Only use RactorLocalSingleton if Ractor is defined https://github.com/ruby/singleton/commit/f684d36a47 --- lib/singleton.rb | 60 +++++++++++++++++++++++++----------------------- 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/lib/singleton.rb b/lib/singleton.rb index 4a47190e2b579e..924cbf1ae84879 100644 --- a/lib/singleton.rb +++ b/lib/singleton.rb @@ -196,43 +196,45 @@ def included(klass) # Returns the singleton instance. end -module RactorLocalSingleton - include Singleton::SingletonInstanceMethods - - module RactorLocalSingletonClassMethods - include Singleton::SingletonClassMethods - def instance - set_mutex(Thread::Mutex.new) if Ractor.current[mutex_key].nil? - return Ractor.current[instance_key] if Ractor.current[instance_key] - Ractor.current[mutex_key].synchronize { +if defined?(Ractor) + module RactorLocalSingleton + include Singleton::SingletonInstanceMethods + + module RactorLocalSingletonClassMethods + include Singleton::SingletonClassMethods + def instance + set_mutex(Thread::Mutex.new) if Ractor.current[mutex_key].nil? return Ractor.current[instance_key] if Ractor.current[instance_key] - set_instance(new()) - } - Ractor.current[instance_key] - end + Ractor.current[mutex_key].synchronize { + return Ractor.current[instance_key] if Ractor.current[instance_key] + set_instance(new()) + } + Ractor.current[instance_key] + end - private + private - def instance_key - :"__RactorLocalSingleton_instance_with_class_id_#{object_id}__" - end + def instance_key + :"__RactorLocalSingleton_instance_with_class_id_#{object_id}__" + end - def mutex_key - :"__RactorLocalSingleton_mutex_with_class_id_#{object_id}__" - end + def mutex_key + :"__RactorLocalSingleton_mutex_with_class_id_#{object_id}__" + end - def set_instance(val) - Ractor.current[instance_key] = val + def set_instance(val) + Ractor.current[instance_key] = val + end + + def set_mutex(val) + Ractor.current[mutex_key] = val + end end - def set_mutex(val) - Ractor.current[mutex_key] = val + def self.module_with_class_methods + RactorLocalSingletonClassMethods end - end - def self.module_with_class_methods - RactorLocalSingletonClassMethods + extend Singleton::SingletonClassProperties end - - extend Singleton::SingletonClassProperties end From 2f53c9fc62e48d31101ab3072085a1ace336c938 Mon Sep 17 00:00:00 2001 From: rm155 Date: Thu, 16 Sep 2021 22:42:45 -0400 Subject: [PATCH 573/829] [ruby/singleton] Clean VERSION freezing https://github.com/ruby/singleton/commit/f31334a736 --- lib/singleton.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/singleton.rb b/lib/singleton.rb index 924cbf1ae84879..0120f059576f1f 100644 --- a/lib/singleton.rb +++ b/lib/singleton.rb @@ -1,4 +1,4 @@ -# frozen_string_literal: false +# frozen_string_literal: true # The Singleton module implements the Singleton pattern. # @@ -93,7 +93,6 @@ # module Singleton VERSION = "0.2.0" - VERSION.freeze module SingletonInstanceMethods # Raises a TypeError to prevent cloning. From 0f00544984f0b2b7fefc7d9039b206f9415fd371 Mon Sep 17 00:00:00 2001 From: rm155 Date: Mon, 8 Nov 2021 13:59:38 -0500 Subject: [PATCH 574/829] [ruby/singleton] Make compatible with Ruby 2.4 https://github.com/ruby/singleton/commit/0a77bb492d --- lib/singleton.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/singleton.rb b/lib/singleton.rb index 0120f059576f1f..afe669e06d7e50 100644 --- a/lib/singleton.rb +++ b/lib/singleton.rb @@ -156,7 +156,7 @@ def self.included(c) def self.extended(c) # extending an object with Singleton is a bad idea - c.singleton_class.undef_method :extend_object + c.singleton_class.send(:undef_method, :extend_object) end def __init__(klass) # :nodoc: From d109c7c620a9f426b9aa60f9ff3a227fd9794933 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Tue, 1 Oct 2024 18:32:40 +0900 Subject: [PATCH 575/829] Temporary disabled RactorLocalSingleton from constant leak check. --- spec/ruby/default.mspec | 1 + 1 file changed, 1 insertion(+) diff --git a/spec/ruby/default.mspec b/spec/ruby/default.mspec index 1e8f8893aa1f9c..2ebd455fd0d987 100644 --- a/spec/ruby/default.mspec +++ b/spec/ruby/default.mspec @@ -47,5 +47,6 @@ class MSpecScript /\wSpecs?$/, /^CS_CONST/, /^CSL_CONST/, + /^RactorLocalSingleton/, ] end From 3ebc85e240c64849e8645ae9b6242abbd1a2b63a Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Tue, 1 Oct 2024 18:41:38 +0900 Subject: [PATCH 576/829] Define RactorLocalSingleton on .mspec.constants --- spec/ruby/.mspec.constants | 1 + spec/ruby/default.mspec | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/ruby/.mspec.constants b/spec/ruby/.mspec.constants index 6e09a44362df22..4da36337152b0e 100644 --- a/spec/ruby/.mspec.constants +++ b/spec/ruby/.mspec.constants @@ -146,6 +146,7 @@ Prime Private ProcFromMethod Psych +RactorLocalSingleton REXML RUBY_SIGNALS RbReadline diff --git a/spec/ruby/default.mspec b/spec/ruby/default.mspec index 2ebd455fd0d987..1e8f8893aa1f9c 100644 --- a/spec/ruby/default.mspec +++ b/spec/ruby/default.mspec @@ -47,6 +47,5 @@ class MSpecScript /\wSpecs?$/, /^CS_CONST/, /^CSL_CONST/, - /^RactorLocalSingleton/, ] end From 35e124832e29b65c84d4e0e4e434616859f9bdf5 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Mon, 30 Sep 2024 22:49:09 +0900 Subject: [PATCH 577/829] [Bug #20755] Frozen string should not be writable via IO::Buffer --- io_buffer.c | 3 ++- test/ruby/test_io_buffer.rb | 25 +++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/io_buffer.c b/io_buffer.c index 2e789abe0faf7d..cc76f12ecc070a 100644 --- a/io_buffer.c +++ b/io_buffer.c @@ -843,7 +843,8 @@ rb_io_buffer_get_bytes(VALUE self, void **base, size_t *size) static inline void io_buffer_get_bytes_for_writing(struct rb_io_buffer *buffer, void **base, size_t *size) { - if (buffer->flags & RB_IO_BUFFER_READONLY) { + if (buffer->flags & RB_IO_BUFFER_READONLY || + (!NIL_P(buffer->source) && OBJ_FROZEN(buffer->source))) { rb_raise(rb_eIOBufferAccessError, "Buffer is not writable!"); } diff --git a/test/ruby/test_io_buffer.rb b/test/ruby/test_io_buffer.rb index 7087a2b957d734..98cf45d0c3da07 100644 --- a/test/ruby/test_io_buffer.rb +++ b/test/ruby/test_io_buffer.rb @@ -248,6 +248,31 @@ def test_slice_readonly assert_equal "Hello World", hello end + def test_transfer + hello = %w"Hello World".join(" ") + buffer = IO::Buffer.for(hello) + transferred = buffer.transfer + assert_equal "Hello World", transferred.get_string + assert_predicate buffer, :null? + assert_raise IO::Buffer::AccessError do + transferred.set_string("Goodbye") + end + assert_equal "Hello World", hello + end + + def test_transfer_in_block + hello = %w"Hello World".join(" ") + buffer = IO::Buffer.for(hello, &:transfer) + assert_equal "Hello World", buffer.get_string + buffer.set_string("Ciao!") + assert_equal "Ciao! World", hello + hello.freeze + assert_raise IO::Buffer::AccessError do + buffer.set_string("Hola") + end + assert_equal "Ciao! World", hello + end + def test_locked buffer = IO::Buffer.new(128, IO::Buffer::INTERNAL|IO::Buffer::LOCKED) From 86ae409467e3674c142f012ee3b2288b0305d87c Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Tue, 1 Oct 2024 01:03:40 +0900 Subject: [PATCH 578/829] [Bug #20764] Refactor argument forwarding in lambda Reject argument forwarding in lambda: - without parentheses - after optional argument(s) --- parse.y | 24 ++++++++++++++---------- test/ruby/test_syntax.rb | 4 ++++ 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/parse.y b/parse.y index 1104697b19ab95..63471895c8ed0b 100644 --- a/parse.y +++ b/parse.y @@ -5202,7 +5202,6 @@ lambda : tLAMBDA[lpar] { token_info_push(p, "->", &@1); $$ = dyna_push(p); - p->lex.lpar_beg = p->lex.paren_nest; }[dyna] max_numparam numparam it_id allow_exits f_larglist[args] @@ -5235,7 +5234,7 @@ lambda : tLAMBDA[lpar] f_larglist : '(' f_args opt_bv_decl ')' { p->ctxt.in_argdef = 0; - $$ = $2; + $$ = $f_args; p->max_numparam = ORDINAL_PARAM; /*% ripper: paren!($:2) %*/ } @@ -5244,7 +5243,7 @@ f_larglist : '(' f_args opt_bv_decl ')' p->ctxt.in_argdef = 0; if (!args_info_empty_p(&$1->nd_ainfo)) p->max_numparam = ORDINAL_PARAM; - $$ = $1; + $$ = $f_args; } ; @@ -6430,8 +6429,16 @@ args_tail : f_kwarg(f_kw) ',' f_kwrest opt_f_block_arg } | args_forward { - add_forwarding_args(p); - $$ = new_args_tail(p, 0, $1, arg_FWD_BLOCK, &@1); + ID fwd = $args_forward; + if (lambda_beginning_p() || + (p->lex.lpar_beg >= 0 && p->lex.lpar_beg+1 == p->lex.paren_nest)) { + yyerror0("unexpected ... in lambda argument"); + fwd = 0; + } + else { + add_forwarding_args(p); + } + $$ = new_args_tail(p, 0, fwd, arg_FWD_BLOCK, &@1); $$->nd_ainfo.forwarding = 1; /*% ripper: [Qnil, $:1, Qnil] %*/ } @@ -11049,6 +11056,7 @@ parser_yylex(struct parser_params *p) if (c == '>') { SET_LEX_STATE(EXPR_ENDFN); yylval.num = p->lex.lpar_beg; + p->lex.lpar_beg = p->lex.paren_nest; return tLAMBDA; } if (IS_BEG() || (IS_SPCARG(c) && arg_ambiguous(p, '-'))) { @@ -11068,17 +11076,13 @@ parser_yylex(struct parser_params *p) SET_LEX_STATE(EXPR_BEG); if ((c = nextc(p)) == '.') { if ((c = nextc(p)) == '.') { - if (p->ctxt.in_argdef) { + if (p->ctxt.in_argdef || IS_LABEL_POSSIBLE() || lambda_beginning_p()) { SET_LEX_STATE(EXPR_ENDARG); return tBDOT3; } if (p->lex.paren_nest == 0 && looking_at_eol_p(p)) { rb_warn0("... at EOL, should be parenthesized?"); } - else if (p->lex.lpar_beg >= 0 && p->lex.lpar_beg+1 == p->lex.paren_nest) { - if (IS_lex_state_for(last_state, EXPR_LABEL)) - return tDOT3; - } return is_beg ? tBDOT3 : tDOT3; } pushback(p, c); diff --git a/test/ruby/test_syntax.rb b/test/ruby/test_syntax.rb index 08b4a7ee1c3e4d..16bb914e3f452b 100644 --- a/test/ruby/test_syntax.rb +++ b/test/ruby/test_syntax.rb @@ -1980,6 +1980,10 @@ def test_argument_forwarding assert_syntax_error('iter {|...|}', /unexpected/) assert_syntax_error('->... {}', unexpected) assert_syntax_error('->(...) {}', unexpected) + assert_syntax_error('->a,... {}', unexpected) + assert_syntax_error('->(a,...) {}', unexpected) + assert_syntax_error('->a=1,... {}', unexpected) + assert_syntax_error('->(a=1,...) {}', unexpected) assert_syntax_error('def foo(x, y, z) bar(...); end', /unexpected/) assert_syntax_error('def foo(x, y, z) super(...); end', /unexpected/) assert_syntax_error('def foo(...) yield(...); end', /unexpected/) From 3932d8a87ad1a9468bb8954dfe117f9bfb54505d Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Mon, 30 Sep 2024 10:14:51 -0400 Subject: [PATCH 579/829] Replace heap_eden_total_slots with objspace_available_slots --- gc/default.c | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/gc/default.c b/gc/default.c index 09acad161871b1..01021b72776ee4 100644 --- a/gc/default.c +++ b/gc/default.c @@ -939,16 +939,6 @@ heap_eden_total_pages(rb_objspace_t *objspace) return count; } -static inline size_t -heap_eden_total_slots(rb_objspace_t *objspace) -{ - size_t count = 0; - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - count += SIZE_POOL_EDEN_HEAP(&size_pools[i])->total_slots; - } - return count; -} - static inline size_t total_allocated_objects(rb_objspace_t *objspace) { @@ -5461,7 +5451,7 @@ gc_marks_finish(rb_objspace_t *objspace) { const unsigned long r_mul = objspace->live_ractor_cache_count > 8 ? 8 : objspace->live_ractor_cache_count; // upto 8 - size_t total_slots = heap_eden_total_slots(objspace); + size_t total_slots = objspace_available_slots(objspace); size_t sweep_slots = total_slots - objspace->marked_slots; /* will be swept slots */ size_t max_free_slots = (size_t)(total_slots * gc_params.heap_free_slots_max_ratio); size_t min_free_slots = (size_t)(total_slots * gc_params.heap_free_slots_min_ratio); @@ -5471,7 +5461,7 @@ gc_marks_finish(rb_objspace_t *objspace) int full_marking = is_full_marking(objspace); - GC_ASSERT(heap_eden_total_slots(objspace) >= objspace->marked_slots); + GC_ASSERT(objspace_available_slots(objspace) >= objspace->marked_slots); /* Setup freeable slots. */ size_t total_init_slots = 0; @@ -5525,7 +5515,7 @@ gc_marks_finish(rb_objspace_t *objspace) gc_report(1, objspace, "gc_marks_finish (marks %"PRIdSIZE" objects, " "old %"PRIdSIZE" objects, total %"PRIdSIZE" slots, " "sweep %"PRIdSIZE" slots, allocatable %"PRIdSIZE" slots, next GC: %s)\n", - objspace->marked_slots, objspace->rgengc.old_objects, heap_eden_total_slots(objspace), sweep_slots, objspace->heap_pages.allocatable_slots, + objspace->marked_slots, objspace->rgengc.old_objects, objspace_available_slots(objspace), sweep_slots, objspace->heap_pages.allocatable_slots, gc_needs_major_flags ? "major" : "minor"); } @@ -6861,7 +6851,7 @@ rb_gc_impl_prepare_heap(void *objspace_ptr) { rb_objspace_t *objspace = objspace_ptr; - size_t orig_total_slots = heap_eden_total_slots(objspace); + size_t orig_total_slots = objspace_available_slots(objspace); size_t orig_allocatable_slots = objspace->heap_pages.allocatable_slots; rb_gc_impl_each_objects(objspace, gc_set_candidate_object_i, objspace_ptr); @@ -6877,7 +6867,7 @@ rb_gc_impl_prepare_heap(void *objspace_ptr) GC_ASSERT(objspace->empty_pages_count == 0); objspace->heap_pages.allocatable_slots = orig_allocatable_slots; - size_t total_slots = heap_eden_total_slots(objspace); + size_t total_slots = objspace_available_slots(objspace); if (orig_total_slots > total_slots) { objspace->heap_pages.allocatable_slots += orig_total_slots - total_slots; } From 75568d23e90148490208e3ac5b719406b3e9f75f Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Tue, 1 Oct 2024 08:42:07 -0400 Subject: [PATCH 580/829] [ruby/prism] Disallow &. after endless range https://github.com/ruby/prism/commit/498dd922d4 --- prism/prism.c | 2 +- test/prism/errors/amperand_dot_after_endless_range.txt | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 test/prism/errors/amperand_dot_after_endless_range.txt diff --git a/prism/prism.c b/prism/prism.c index 3c6863ab1bfa82..4bbcf0ea9ddaf4 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -21657,7 +21657,7 @@ parse_expression(pm_parser_t *parser, pm_binding_power_t binding_power, bool acc // 1.. * 2 // if (PM_NODE_TYPE_P(node, PM_RANGE_NODE) && ((pm_range_node_t *) node)->right == NULL) { - if (match3(parser, PM_TOKEN_UAMPERSAND, PM_TOKEN_USTAR, PM_TOKEN_DOT)) { + if (match4(parser, PM_TOKEN_UAMPERSAND, PM_TOKEN_USTAR, PM_TOKEN_DOT, PM_TOKEN_AMPERSAND_DOT)) { PM_PARSER_ERR_TOKEN_FORMAT(parser, parser->current, PM_ERR_NON_ASSOCIATIVE_OPERATOR, pm_token_type_human(parser->current.type), pm_token_type_human(parser->previous.type)); break; } diff --git a/test/prism/errors/amperand_dot_after_endless_range.txt b/test/prism/errors/amperand_dot_after_endless_range.txt new file mode 100644 index 00000000000000..ab8c8ccc4d4d10 --- /dev/null +++ b/test/prism/errors/amperand_dot_after_endless_range.txt @@ -0,0 +1,3 @@ +0 if true...&.abs + ^~ unexpected '&.'; ... is a non-associative operator + From d86b4041b5eca43eea581e4af874e3fd46faaaa2 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Tue, 1 Oct 2024 09:45:09 -0400 Subject: [PATCH 581/829] [ruby/prism] Disallow empty labels when not allowed https://github.com/ruby/prism/commit/399ee28dc1 --- prism/prism.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/prism/prism.c b/prism/prism.c index 4bbcf0ea9ddaf4..a99fb712e35297 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -16545,6 +16545,8 @@ parse_strings(pm_parser_t *parser, pm_node_t *current, bool accepts_label, uint1 pm_string_shared_init(&symbol->unescaped, content.start, content.end); node = (pm_node_t *) symbol; + + if (!label_allowed) pm_parser_err_node(parser, node, PM_ERR_UNEXPECTED_LABEL); } else if (!lex_interpolation) { // If we don't accept interpolation then we expect the string to // start with a single string content node. From 169a5ee99e1e8742e6821f8b846d39e90c3c9ea8 Mon Sep 17 00:00:00 2001 From: ydah Date: Tue, 1 Oct 2024 21:25:09 +0900 Subject: [PATCH 582/829] Use user defined inline rules `user_or_keyword_variable` --- parse.y | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/parse.y b/parse.y index 63471895c8ed0b..e3391d64eed975 100644 --- a/parse.y +++ b/parse.y @@ -2925,6 +2925,11 @@ rb_parser_ary_free(rb_parser_t *p, rb_parser_ary_t *ary) | tCONSTANT ; +%rule %inline user_or_keyword_variable + : user_variable + | keyword_variable + ; + /* * parameterizing rules */ @@ -3657,12 +3662,7 @@ mlhs_post : mlhs_item } ; -mlhs_node : user_variable - { - /*% ripper: var_field!($:1) %*/ - $$ = assignable(p, $1, 0, &@$); - } - | keyword_variable +mlhs_node : user_or_keyword_variable { /*% ripper: var_field!($:1) %*/ $$ = assignable(p, $1, 0, &@$); @@ -3707,12 +3707,7 @@ mlhs_node : user_variable } ; -lhs : user_variable - { - /*% ripper: var_field!($:1) %*/ - $$ = assignable(p, $1, 0, &@$); - } - | keyword_variable +lhs : user_or_keyword_variable { /*% ripper: var_field!($:1) %*/ $$ = assignable(p, $1, 0, &@$); @@ -6336,12 +6331,7 @@ var_ref : user_variable } ; -var_lhs : user_variable - { - /*% ripper: var_field!($:1) %*/ - $$ = assignable(p, $1, 0, &@$); - } - | keyword_variable +var_lhs : user_or_keyword_variable { /*% ripper: var_field!($:1) %*/ $$ = assignable(p, $1, 0, &@$); From ec230ac6432ea89f1ee53d82a62337d4883dc83a Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Tue, 1 Oct 2024 10:22:07 -0400 Subject: [PATCH 583/829] Resync to latest Prism --- prism/config.yml | 1 - prism/prism.c | 42 +++++++++++++++++-- prism/templates/src/diagnostic.c.erb | 1 - test/prism/errors/command_call_in.txt | 6 +-- test/prism/errors/infix_after_label.txt | 6 +++ .../errors/trailing_comma_after_block.txt | 3 ++ 6 files changed, 49 insertions(+), 10 deletions(-) create mode 100644 test/prism/errors/infix_after_label.txt create mode 100644 test/prism/errors/trailing_comma_after_block.txt diff --git a/prism/config.yml b/prism/config.yml index b5de4d2b4afced..972f1e8e69a52f 100644 --- a/prism/config.yml +++ b/prism/config.yml @@ -15,7 +15,6 @@ errors: - ARGUMENT_FORMAL_GLOBAL - ARGUMENT_FORMAL_IVAR - ARGUMENT_FORWARDING_UNBOUND - - ARGUMENT_IN - ARGUMENT_NO_FORWARDING_AMPERSAND - ARGUMENT_NO_FORWARDING_ELLIPSES - ARGUMENT_NO_FORWARDING_STAR diff --git a/prism/prism.c b/prism/prism.c index a99fb712e35297..2e98702d9b5cd4 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -14271,9 +14271,6 @@ parse_arguments(pm_parser_t *parser, pm_arguments_t *arguments, bool accepts_for pm_static_literals_free(&hash_keys); parsed_bare_hash = true; - } else if (accept1(parser, PM_TOKEN_KEYWORD_IN)) { - // TODO: Could we solve this with binding powers instead? - pm_parser_err_current(parser, PM_ERR_ARGUMENT_IN); } parse_arguments_append(parser, arguments, argument); @@ -14786,7 +14783,7 @@ parse_parameters( } default: if (parser->previous.type == PM_TOKEN_COMMA) { - if (allows_trailing_comma) { + if (allows_trailing_comma && order >= PM_PARAMETERS_ORDER_NAMED) { // If we get here, then we have a trailing comma in a // block parameter list. pm_node_t *param = (pm_node_t *) pm_implicit_rest_node_create(parser, &parser->previous); @@ -21575,6 +21572,19 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t #undef PM_PARSE_PATTERN_TOP #undef PM_PARSE_PATTERN_MULTI +/** + * Determine if a given call node looks like a "command", which means it has + * arguments but does not have parentheses. + */ +static inline bool +pm_call_node_command_p(const pm_call_node_t *node) { + return ( + (node->opening_loc.start == NULL) && + (node->block == NULL || PM_NODE_TYPE_P(node->block, PM_BLOCK_ARGUMENT_NODE)) && + (node->arguments != NULL || node->block != NULL) + ); +} + /** * Parse an expression at the given point of the parser using the given binding * power to parse subsequent chains. If this function finds a syntax error, it @@ -21609,6 +21619,23 @@ parse_expression(pm_parser_t *parser, pm_binding_power_t binding_power, bool acc return node; } break; + case PM_CALL_NODE: + // If we have a call node, then we need to check if it looks like a + // method call without parentheses that contains arguments. If it + // does, then it has different rules for parsing infix operators, + // namely that it only accepts composition (and/or) and modifiers + // (if/unless/etc.). + if ((pm_binding_powers[parser->current.type].left > PM_BINDING_POWER_COMPOSITION) && pm_call_node_command_p((pm_call_node_t *) node)) { + return node; + } + break; + case PM_SYMBOL_NODE: + // If we have a symbol node that is being parsed as a label, then we + // need to immediately return, because there should never be an + // infix operator following this node. + if (pm_symbol_node_label_p(node)) { + return node; + } default: break; } @@ -21624,6 +21651,13 @@ parse_expression(pm_parser_t *parser, pm_binding_power_t binding_power, bool acc node = parse_expression_infix(parser, node, binding_power, current_binding_powers.right, accepts_command_call, (uint16_t) (depth + 1)); switch (PM_NODE_TYPE(node)) { + case PM_MULTI_WRITE_NODE: + // Multi-write nodes are statements, and cannot be followed by + // operators except modifiers. + if (pm_binding_powers[parser->current.type].left > PM_BINDING_POWER_MODIFIER) { + return node; + } + break; case PM_CLASS_VARIABLE_WRITE_NODE: case PM_CONSTANT_PATH_WRITE_NODE: case PM_CONSTANT_WRITE_NODE: diff --git a/prism/templates/src/diagnostic.c.erb b/prism/templates/src/diagnostic.c.erb index b2381db57fab2c..d2b7b4f691ec9a 100644 --- a/prism/templates/src/diagnostic.c.erb +++ b/prism/templates/src/diagnostic.c.erb @@ -100,7 +100,6 @@ static const pm_diagnostic_data_t diagnostic_messages[PM_DIAGNOSTIC_ID_MAX] = { [PM_ERR_ARGUMENT_FORMAL_GLOBAL] = { "invalid formal argument; formal argument cannot be a global variable", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_ARGUMENT_FORMAL_IVAR] = { "invalid formal argument; formal argument cannot be an instance variable", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_ARGUMENT_FORWARDING_UNBOUND] = { "unexpected `...` in an non-parenthesized call", PM_ERROR_LEVEL_SYNTAX }, - [PM_ERR_ARGUMENT_IN] = { "unexpected `in` keyword in arguments", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_ARGUMENT_NO_FORWARDING_AMPERSAND] = { "unexpected `&`; no anonymous block parameter", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_ARGUMENT_NO_FORWARDING_ELLIPSES] = { "unexpected ... when the parent method is not forwarding", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_ARGUMENT_NO_FORWARDING_STAR] = { "unexpected `*`; no anonymous rest parameter", PM_ERROR_LEVEL_SYNTAX }, diff --git a/test/prism/errors/command_call_in.txt b/test/prism/errors/command_call_in.txt index a4357028c67768..2fdcf0973897b7 100644 --- a/test/prism/errors/command_call_in.txt +++ b/test/prism/errors/command_call_in.txt @@ -1,7 +1,5 @@ foo 1 in a - ^ unexpected `in` keyword in arguments - ^ unexpected local variable or method, expecting end-of-input + ^~ unexpected 'in', expecting end-of-input + ^~ unexpected 'in', ignoring it a = foo 2 in b - ^ unexpected `in` keyword in arguments - ^ unexpected local variable or method, expecting end-of-input diff --git a/test/prism/errors/infix_after_label.txt b/test/prism/errors/infix_after_label.txt new file mode 100644 index 00000000000000..c3bcfaecebd928 --- /dev/null +++ b/test/prism/errors/infix_after_label.txt @@ -0,0 +1,6 @@ +{ 'a':.upcase => 1 } + ^ unexpected '.'; expected a value in the hash literal + ^ expected a `}` to close the hash literal + ^ unexpected '}', expecting end-of-input + ^ unexpected '}', ignoring it + diff --git a/test/prism/errors/trailing_comma_after_block.txt b/test/prism/errors/trailing_comma_after_block.txt new file mode 100644 index 00000000000000..d25db0efbeca3b --- /dev/null +++ b/test/prism/errors/trailing_comma_after_block.txt @@ -0,0 +1,3 @@ +p{|&,|} + ^ unexpected `,` in parameters + From e320da60976f6818c8667afb98fe88142c3073d2 Mon Sep 17 00:00:00 2001 From: tomoya ishida Date: Wed, 2 Oct 2024 02:01:31 +0900 Subject: [PATCH 584/829] [ruby/reline] Fix Reline crash with invalid encoding history (https://github.com/ruby/reline/pull/751) https://github.com/ruby/reline/commit/e9d4b37e34 --- lib/reline/history.rb | 6 +++--- lib/reline/line_editor.rb | 2 +- lib/reline/unicode.rb | 16 ++++++++++++++++ test/reline/test_history.rb | 9 +++++++++ test/reline/test_unicode.rb | 28 ++++++++++++++++++++++++++++ 5 files changed, 57 insertions(+), 4 deletions(-) diff --git a/lib/reline/history.rb b/lib/reline/history.rb index 3f3b65fea64aeb..47c68ba7745e10 100644 --- a/lib/reline/history.rb +++ b/lib/reline/history.rb @@ -19,7 +19,7 @@ def [](index) def []=(index, val) index = check_index(index) - super(index, String.new(val, encoding: Reline.encoding_system_needs)) + super(index, Reline::Unicode.safe_encode(val, Reline.encoding_system_needs)) end def concat(*val) @@ -45,7 +45,7 @@ def push(*val) end end super(*(val.map{ |v| - String.new(v, encoding: Reline.encoding_system_needs) + Reline::Unicode.safe_encode(v, Reline.encoding_system_needs) })) end @@ -56,7 +56,7 @@ def <<(val) if @config.history_size.positive? shift if size + 1 > @config.history_size end - super(String.new(val, encoding: Reline.encoding_system_needs)) + super(Reline::Unicode.safe_encode(val, Reline.encoding_system_needs)) end private def check_index(index) diff --git a/lib/reline/line_editor.rb b/lib/reline/line_editor.rb index c71a5f79eef9c5..56dc235c030362 100644 --- a/lib/reline/line_editor.rb +++ b/lib/reline/line_editor.rb @@ -1325,7 +1325,7 @@ def insert_multiline_text(text) save_old_buffer pre = @buffer_of_lines[@line_index].byteslice(0, @byte_pointer) post = @buffer_of_lines[@line_index].byteslice(@byte_pointer..) - lines = (pre + text.gsub(/\r\n?/, "\n") + post).split("\n", -1) + lines = (pre + Reline::Unicode.safe_encode(text, @encoding).gsub(/\r\n?/, "\n") + post).split("\n", -1) lines << '' if lines.empty? @buffer_of_lines[@line_index, 1] = lines @line_index += lines.size - 1 diff --git a/lib/reline/unicode.rb b/lib/reline/unicode.rb index ef239d5e9ee947..0ec815aeea6f3d 100644 --- a/lib/reline/unicode.rb +++ b/lib/reline/unicode.rb @@ -54,6 +54,22 @@ def self.escape_for_print(str) }.join end + def self.safe_encode(str, encoding) + # Reline only supports utf-8 convertible string. + converted = str.encode(encoding, invalid: :replace, undef: :replace) + return converted if str.encoding == Encoding::UTF_8 || converted.encoding == Encoding::UTF_8 || converted.ascii_only? + + # This code is essentially doing the same thing as + # `str.encode(utf8, **replace_options).encode(encoding, **replace_options)` + # but also avoids unneccesary irreversible encoding conversion. + converted.gsub(/\X/) do |c| + c.encode(Encoding::UTF_8) + c + rescue Encoding::UndefinedConversionError + '?' + end + end + require 'reline/unicode/east_asian_width' def self.get_mbchar_width(mbchar) diff --git a/test/reline/test_history.rb b/test/reline/test_history.rb index ddf8fb14726b3b..ea902b065394ce 100644 --- a/test/reline/test_history.rb +++ b/test/reline/test_history.rb @@ -266,6 +266,15 @@ def test_history_size_negative_unlimited assert_equal 5, history.size end + def test_history_encoding_conversion + history = history_new + text1 = String.new("a\u{65535}b\xFFc", encoding: Encoding::UTF_8) + text2 = String.new("d\xFFe", encoding: Encoding::Shift_JIS) + history.push(text1.dup, text2.dup) + expected = [text1, text2].map { |s| s.encode(Reline.encoding_system_needs, invalid: :replace, undef: :replace) } + assert_equal(expected, history.to_a) + end + private def history_new(history_size: 10) diff --git a/test/reline/test_unicode.rb b/test/reline/test_unicode.rb index deba4d4681173c..688d25e2387780 100644 --- a/test/reline/test_unicode.rb +++ b/test/reline/test_unicode.rb @@ -89,4 +89,32 @@ def test_take_mbchar_range assert_equal ["\e[31mc\1ABC\2d\e[0mef", 2, 4], Reline::Unicode.take_mbchar_range("\e[31mabc\1ABC\2d\e[0mefghi", 2, 4) assert_equal ["\e[41m \e[42mい\e[43m ", 1, 4], Reline::Unicode.take_mbchar_range("\e[41mあ\e[42mい\e[43mう", 1, 4, padding: true) end + + def test_encoding_conversion + texts = [ + String.new("invalid\xFFutf8", encoding: 'utf-8'), + String.new("invalid\xFFsjis", encoding: 'sjis'), + "utf8#{33111.chr('sjis')}convertible", + "utf8#{33222.chr('sjis')}inconvertible", + "sjis->utf8->sjis#{60777.chr('sjis')}irreversible" + ] + utf8_texts = [ + 'invalid�utf8', + 'invalid�sjis', + 'utf8仝convertible', + 'utf8�inconvertible', + 'sjis->utf8->sjis劦irreversible' + ] + sjis_texts = [ + 'invalid?utf8', + 'invalid?sjis', + "utf8#{33111.chr('sjis')}convertible", + 'utf8?inconvertible', + "sjis->utf8->sjis#{60777.chr('sjis')}irreversible" + ] + assert_equal(utf8_texts, texts.map { |s| Reline::Unicode.safe_encode(s, 'utf-8') }) + assert_equal(utf8_texts, texts.map { |s| Reline::Unicode.safe_encode(s, Encoding::UTF_8) }) + assert_equal(sjis_texts, texts.map { |s| Reline::Unicode.safe_encode(s, 'sjis') }) + assert_equal(sjis_texts, texts.map { |s| Reline::Unicode.safe_encode(s, Encoding::Windows_31J) }) + end end From 467ebbebd9b5a6a950bc2c52eb393ba9401ed826 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Tue, 1 Oct 2024 14:21:32 -0400 Subject: [PATCH 585/829] [ruby/prism] Disallow dynamic patterns in labels at top level followed by pipes https://github.com/ruby/prism/commit/ccc746f918 --- prism/prism.c | 33 +++++++++++++++++---- test/prism/errors/dynamic_label_pattern.txt | 3 ++ 2 files changed, 30 insertions(+), 6 deletions(-) create mode 100644 test/prism/errors/dynamic_label_pattern.txt diff --git a/prism/prism.c b/prism/prism.c index 2e98702d9b5cd4..3549b59286400b 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -17274,6 +17274,9 @@ parse_pattern_primitive(pm_parser_t *parser, pm_constant_id_list_t *captures, pm case PM_CASE_PRIMITIVE: { pm_node_t *node = parse_expression(parser, PM_BINDING_POWER_MAX, false, true, diag_id, (uint16_t) (depth + 1)); + // If we found a label, we need to immediately return to the caller. + if (pm_symbol_node_label_p(node)) return node; + // Now that we have a primitive, we need to check if it's part of a range. if (accept2(parser, PM_TOKEN_DOT_DOT, PM_TOKEN_DOT_DOT_DOT)) { pm_token_t operator = parser->previous; @@ -17391,10 +17394,10 @@ parse_pattern_primitive(pm_parser_t *parser, pm_constant_id_list_t *captures, pm * assignment. */ static pm_node_t * -parse_pattern_primitives(pm_parser_t *parser, pm_constant_id_list_t *captures, pm_diagnostic_id_t diag_id, uint16_t depth) { - pm_node_t *node = NULL; +parse_pattern_primitives(pm_parser_t *parser, pm_constant_id_list_t *captures, pm_node_t *first_node, pm_diagnostic_id_t diag_id, uint16_t depth) { + pm_node_t *node = first_node; - do { + while ((node == NULL) || accept1(parser, PM_TOKEN_PIPE)) { pm_token_t operator = parser->previous; switch (parser->current.type) { @@ -17447,7 +17450,7 @@ parse_pattern_primitives(pm_parser_t *parser, pm_constant_id_list_t *captures, p break; } } - } while (accept1(parser, PM_TOKEN_PIPE)); + } // If we have an =>, then we are assigning this pattern to a variable. // In this case we should create an assignment node. @@ -17508,6 +17511,24 @@ parse_pattern(pm_parser_t *parser, pm_constant_id_list_t *captures, uint8_t flag return node; } + case PM_TOKEN_STRING_BEGIN: { + // We need special handling for string beginnings because they could + // be dynamic symbols leading to hash patterns. + node = parse_pattern_primitive(parser, captures, diag_id, (uint16_t) (depth + 1)); + + if (pm_symbol_node_label_p(node)) { + node = (pm_node_t *) parse_pattern_hash(parser, captures, node, (uint16_t) (depth + 1)); + + if (!(flags & PM_PARSE_PATTERN_TOP)) { + pm_parser_err_node(parser, node, PM_ERR_PATTERN_HASH_IMPLICIT); + } + + return node; + } + + node = parse_pattern_primitives(parser, captures, node, diag_id, (uint16_t) (depth + 1)); + break; + } case PM_TOKEN_USTAR: { if (flags & (PM_PARSE_PATTERN_TOP | PM_PARSE_PATTERN_MULTI)) { parser_lex(parser); @@ -17518,7 +17539,7 @@ parse_pattern(pm_parser_t *parser, pm_constant_id_list_t *captures, uint8_t flag } /* fallthrough */ default: - node = parse_pattern_primitives(parser, captures, diag_id, (uint16_t) (depth + 1)); + node = parse_pattern_primitives(parser, captures, NULL, diag_id, (uint16_t) (depth + 1)); break; } @@ -17556,7 +17577,7 @@ parse_pattern(pm_parser_t *parser, pm_constant_id_list_t *captures, uint8_t flag trailing_rest = true; } else { - node = parse_pattern_primitives(parser, captures, PM_ERR_PATTERN_EXPRESSION_AFTER_COMMA, (uint16_t) (depth + 1)); + node = parse_pattern_primitives(parser, captures, NULL, PM_ERR_PATTERN_EXPRESSION_AFTER_COMMA, (uint16_t) (depth + 1)); } pm_node_list_append(&nodes, node); diff --git a/test/prism/errors/dynamic_label_pattern.txt b/test/prism/errors/dynamic_label_pattern.txt new file mode 100644 index 00000000000000..b8d1012e45bc55 --- /dev/null +++ b/test/prism/errors/dynamic_label_pattern.txt @@ -0,0 +1,3 @@ +:a => 'a': | 1 + ^ expected a pattern expression after the key + From e72e18b31d79b16b307c0bdf5b07416ff3ab595e Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Mon, 30 Sep 2024 16:31:42 -0500 Subject: [PATCH 586/829] [DOC] Tweaks for Array#join --- array.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/array.c b/array.c index 5f707b0a5f4568..72a1a4f13549ba 100644 --- a/array.c +++ b/array.c @@ -2908,31 +2908,32 @@ rb_ary_join(VALUE ary, VALUE sep) /* * call-seq: - * array.join ->new_string * array.join(separator = $,) -> new_string * - * Returns the new String formed by joining the array elements after conversion. - * For each element +element+: + * Returns the new string formed by joining the converted elements of +self+; + * for each element +element+: * - * - Uses element.to_s if +element+ is not a kind_of?(Array). - * - Uses recursive element.join(separator) if +element+ is a kind_of?(Array). + * - Converts recursively using element.join(separator) + * if +element+ is a kind_of?(Array). + * - Otherwise, converts using element.to_s. * - * With no argument, joins using the output field separator, $,: + * With no argument given, joins using the output field separator, $,: * * a = [:foo, 'bar', 2] * $, # => nil * a.join # => "foobar2" * - * With \string argument +separator+, joins using that separator: + * With string argument +separator+ given, joins using that separator: * * a = [:foo, 'bar', 2] * a.join("\n") # => "foo\nbar\n2" * - * Joins recursively for nested Arrays: + * Joins recursively for nested arrays: * * a = [:foo, [:bar, [:baz, :bat]]] * a.join # => "foobarbazbat" * + * Related: see {Methods for Converting}[rdoc-ref:Array@Methods+for+Converting]. */ static VALUE rb_ary_join_m(int argc, VALUE *argv, VALUE ary) From 5edc32198895c02f014a778963eaa1297e5d618c Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Mon, 30 Sep 2024 16:41:17 -0500 Subject: [PATCH 587/829] [DOC] Tweaks for Array#keep_if --- array.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/array.c b/array.c index 72a1a4f13549ba..6d5762837b7f22 100644 --- a/array.c +++ b/array.c @@ -3971,20 +3971,18 @@ rb_ary_select_bang(VALUE ary) /* * call-seq: - * array.keep_if {|element| ... } -> self - * array.keep_if -> new_enumeration + * keep_if {|element| ... } -> self + * keep_if -> new_enumerator * - * Retains those elements for which the block returns a truthy value; - * deletes all other elements; returns +self+: + * With a block given, calls the block with each element of +self+; + * removes the element from +self+ if the block does not return a truthy value: * * a = [:foo, 'bar', 2, :bam] * a.keep_if {|element| element.to_s.start_with?('b') } # => ["bar", :bam] * - * Returns a new Enumerator if no block given: - * - * a = [:foo, 'bar', 2, :bam] - * a.keep_if # => # + * With no block given, returns a new Enumerator. * + * Related: see {Methods for Deleting}[rdoc-ref:Array@Methods+for+Deleting]. */ static VALUE From a8a921aef3e3f5a91425e53e4faf44d032a32a97 Mon Sep 17 00:00:00 2001 From: tomoya ishida Date: Wed, 2 Oct 2024 12:18:29 +0900 Subject: [PATCH 588/829] [ruby/irb] Use correct binding in debug mode (https://github.com/ruby/irb/pull/1007) In debug command, IRB's context was using wrong binding. Some code colorization, command detection failed because binding.local_variable returned wrong value. https://github.com/ruby/irb/commit/68f718de21 --- lib/irb/debug/ui.rb | 2 +- test/irb/test_debugger_integration.rb | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/lib/irb/debug/ui.rb b/lib/irb/debug/ui.rb index 307097b8c95bd5..7a1cd6dd164954 100644 --- a/lib/irb/debug/ui.rb +++ b/lib/irb/debug/ui.rb @@ -56,7 +56,7 @@ def puts str = nil def readline _ setup_interrupt do tc = DEBUGGER__::SESSION.instance_variable_get(:@tc) - cmd = @irb.debug_readline(tc.current_frame.binding || TOPLEVEL_BINDING) + cmd = @irb.debug_readline(tc.current_frame.eval_binding || TOPLEVEL_BINDING) case cmd when nil # when user types C-d diff --git a/test/irb/test_debugger_integration.rb b/test/irb/test_debugger_integration.rb index 8b1bddea179e97..45ffb2a52e6d85 100644 --- a/test/irb/test_debugger_integration.rb +++ b/test/irb/test_debugger_integration.rb @@ -365,6 +365,23 @@ def bar assert_include(output, "InputMethod: RelineInputMethod") end + def test_irb_command_can_check_local_variables + write_ruby <<~'ruby' + binding.irb + ruby + + output = run_ruby_file do + type "debug" + type 'foobar = IRB' + type "show_source foobar.start" + type "show_source = 'Foo'" + type "show_source + 'Bar'" + type "continue" + end + assert_include(output, "def start(ap_path = nil)") + assert_include(output, '"FooBar"') + end + def test_help_command_is_delegated_to_the_debugger write_ruby <<~'ruby' binding.irb From 30775d0b085284a6e0a54bc71025622ecabd8591 Mon Sep 17 00:00:00 2001 From: Nithin Bekal Date: Tue, 1 Oct 2024 22:57:21 -0400 Subject: [PATCH 589/829] [DOC] Fix typo in Forwardable docs --- doc/forwardable.rd.ja | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/forwardable.rd.ja b/doc/forwardable.rd.ja index 171724b2e50d26..53e82025133425 100644 --- a/doc/forwardable.rd.ja +++ b/doc/forwardable.rd.ja @@ -1,4 +1,4 @@ - -- forwatable.rb + -- forwardable.rb $Release Version: 1.1 $ $Revision$ From 63f31a9ed5e668b609ca5f46510e30e8b20739d0 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Tue, 1 Oct 2024 18:08:22 +0900 Subject: [PATCH 590/829] [ruby/singleton] Fixed double assignment https://github.com/ruby/singleton/commit/9d3c77a868 --- lib/singleton.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/singleton.rb b/lib/singleton.rb index afe669e06d7e50..1011335adfa1de 100644 --- a/lib/singleton.rb +++ b/lib/singleton.rb @@ -124,7 +124,7 @@ def _load(str) end def instance # :nodoc: - @singleton__instance__ || @singleton__mutex__.synchronize { @singleton__instance__ ||= set_instance(new) } + @singleton__instance__ || @singleton__mutex__.synchronize { @singleton__instance__ ||= new } end private From 8e73609c7b4c7fdc35e47cefd8f696777c0da5e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Thu, 26 Sep 2024 12:58:10 +0200 Subject: [PATCH 591/829] [rubygems/rubygems] Fix weirdness of "interrupt" test command https://github.com/rubygems/rubygems/commit/0a75590ac9 --- .../rubygems/commands/interrupt_command.rb | 11 +++++++++++ test/rubygems/rubygems_plugin.rb | 19 ------------------- test/rubygems/test_gem.rb | 11 ----------- .../test_gem_commands_help_command.rb | 2 -- 4 files changed, 11 insertions(+), 32 deletions(-) create mode 100644 test/rubygems/rubygems/commands/interrupt_command.rb diff --git a/test/rubygems/rubygems/commands/interrupt_command.rb b/test/rubygems/rubygems/commands/interrupt_command.rb new file mode 100644 index 00000000000000..88d2ef22e73f5c --- /dev/null +++ b/test/rubygems/rubygems/commands/interrupt_command.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +class Gem::Commands::InterruptCommand < Gem::Command + def initialize + super("interrupt", "Raises an Interrupt Exception", {}) + end + + def execute + raise Interrupt, "Interrupt exception" + end +end diff --git a/test/rubygems/rubygems_plugin.rb b/test/rubygems/rubygems_plugin.rb index 949580f9043faa..f9f2a7d91182b3 100644 --- a/test/rubygems/rubygems_plugin.rb +++ b/test/rubygems/rubygems_plugin.rb @@ -2,23 +2,4 @@ require "rubygems/command_manager" -## -# This is an example of exactly what NOT to do. -# -# DO NOT include code like this in your rubygems_plugin.rb - -module Gem::Commands - remove_const(:InterruptCommand) if defined?(InterruptCommand) -end - -class Gem::Commands::InterruptCommand < Gem::Command - def initialize - super("interrupt", "Raises an Interrupt Exception", {}) - end - - def execute - raise Interrupt, "Interrupt exception" - end -end - Gem::CommandManager.instance.register_command :interrupt diff --git a/test/rubygems/test_gem.rb b/test/rubygems/test_gem.rb index e8a294d65cfeef..0d048b08b7f01f 100644 --- a/test/rubygems/test_gem.rb +++ b/test/rubygems/test_gem.rb @@ -21,8 +21,6 @@ def setup common_installer_setup @additional = %w[a b].map {|d| File.join @tempdir, d } - - util_remove_interrupt_command end def test_self_finish_resolve @@ -1524,8 +1522,6 @@ def test_load_env_plugins nil end - util_remove_interrupt_command - # Should attempt to cause a StandardError with_plugin("standarderror") { Gem.load_env_plugins } begin @@ -1534,8 +1530,6 @@ def test_load_env_plugins nil end - util_remove_interrupt_command - # Should attempt to cause an Exception with_plugin("scripterror") { Gem.load_env_plugins } begin @@ -1791,11 +1785,6 @@ def util_exec_gem spec end - def util_remove_interrupt_command - Gem::Commands.send :remove_const, :InterruptCommand if - Gem::Commands.const_defined? :InterruptCommand - end - def util_cache_dir File.join Gem.dir, "cache" end diff --git a/test/rubygems/test_gem_commands_help_command.rb b/test/rubygems/test_gem_commands_help_command.rb index 359da0a6d01146..01ab4aab2fe46d 100644 --- a/test/rubygems/test_gem_commands_help_command.rb +++ b/test/rubygems/test_gem_commands_help_command.rb @@ -11,8 +11,6 @@ def setup super @cmd = Gem::Commands::HelpCommand.new - - load File.expand_path("rubygems_plugin.rb", __dir__) unless Gem::Commands.const_defined? :InterruptCommand end def test_gem_help_bad From 3d1eb62bf38e6d6691213018ef29a5680f9d2161 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Thu, 26 Sep 2024 13:09:22 +0200 Subject: [PATCH 592/829] [rubygems/rubygems] Standarize "ins" test command too https://github.com/rubygems/rubygems/commit/517e9a8669 --- test/rubygems/rubygems/commands/ins_command.rb | 7 +++++++ test/rubygems/test_gem_command_manager.rb | 9 +++++---- 2 files changed, 12 insertions(+), 4 deletions(-) create mode 100644 test/rubygems/rubygems/commands/ins_command.rb diff --git a/test/rubygems/rubygems/commands/ins_command.rb b/test/rubygems/rubygems/commands/ins_command.rb new file mode 100644 index 00000000000000..8e2ac16f22e5a4 --- /dev/null +++ b/test/rubygems/rubygems/commands/ins_command.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class Gem::Commands::InsCommand < Gem::Command + def initialize + super("ins", "Does something different from install", {}) + end +end diff --git a/test/rubygems/test_gem_command_manager.rb b/test/rubygems/test_gem_command_manager.rb index f04ec0cafafab4..f3848e498db8de 100644 --- a/test/rubygems/test_gem_command_manager.rb +++ b/test/rubygems/test_gem_command_manager.rb @@ -50,16 +50,17 @@ def test_find_logout_alias_comamnd end def test_find_command_ambiguous_exact - ins_command = Class.new - Gem::Commands.send :const_set, :InsCommand, ins_command + old_load_path = $:.dup + $: << File.expand_path("test/rubygems", PROJECT_DIR) @command_manager.register_command :ins command = @command_manager.find_command "ins" - assert_kind_of ins_command, command + assert_kind_of Gem::Commands::InsCommand, command ensure - Gem::Commands.send :remove_const, :InsCommand + $:.replace old_load_path + @command_manager.unregister_command :ins end def test_find_command_unknown From 02d50d9cb17e8daccf788347593e97cae354ba4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Thu, 26 Sep 2024 15:52:04 +0200 Subject: [PATCH 593/829] [rubygems/rubygems] Simplify command loading https://github.com/rubygems/rubygems/commit/95f60f0e60 --- lib/rubygems/command_manager.rb | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/lib/rubygems/command_manager.rb b/lib/rubygems/command_manager.rb index 8e578dc1966172..4d54d1d49d5633 100644 --- a/lib/rubygems/command_manager.rb +++ b/lib/rubygems/command_manager.rb @@ -230,18 +230,11 @@ def find_command_possibilities(cmd_name) def load_and_instantiate(command_name) command_name = command_name.to_s const_name = command_name.capitalize.gsub(/_(.)/) { $1.upcase } << "Command" - load_error = nil begin - begin - require "rubygems/commands/#{command_name}_command" - rescue LoadError => e - load_error = e - end + require "rubygems/commands/#{command_name}_command" Gem::Commands.const_get(const_name).new - rescue StandardError => e - e = load_error if load_error - + rescue StandardError, LoadError => e alert_error clean_text("Loading command: #{command_name} (#{e.class})\n\t#{e}") ui.backtrace e end From 49483904d8fcac3bd5ef9e897279563235583f4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Thu, 26 Sep 2024 15:53:39 +0200 Subject: [PATCH 594/829] [rubygems/rubygems] Make sure MissingSpecVersionError#to_s prints exception message Gem command loading errors rely on `#to_s` on the raised exception, but in the case of `MissingSpecVersionError` that was only the exception name, making it printed twice and no message at all. Before: ``` ERROR: Loading command: install (Gem::MissingSpecVersionError) Gem::MissingSpecVersionError ``` After: ``` ERROR: Loading command: install (Gem::MissingSpecVersionError) Could not find 'io-wait' (>= 0.a) - did find: [io-wait-0.3.0-java] Checked in 'GEM_PATH=/Users/deivid/Code/rubygems/rubygems/bundler/tmp/1.1/gems/system' , execute `gem env` for more information ``` https://github.com/rubygems/rubygems/commit/d06944bb2f --- lib/rubygems/errors.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/rubygems/errors.rb b/lib/rubygems/errors.rb index be6c34dc8520b3..57fb3eb12008a1 100644 --- a/lib/rubygems/errors.rb +++ b/lib/rubygems/errors.rb @@ -30,6 +30,7 @@ def initialize(name, requirement, extra_message=nil) @name = name @requirement = requirement @extra_message = extra_message + super(message) end def message # :nodoc: @@ -53,8 +54,8 @@ class MissingSpecVersionError < MissingSpecError attr_reader :specs def initialize(name, requirement, specs) - super(name, requirement) @specs = specs + super(name, requirement) end private From a3929a9ca19d69f6ab2f26d4d8ed59c2612ac733 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Tue, 24 Sep 2024 15:29:53 +0200 Subject: [PATCH 595/829] [rubygems/rubygems] The `BUNDLER_SETUP` env should also be cleaned up https://github.com/rubygems/rubygems/commit/47b7e50f64 --- lib/bundler.rb | 1 + spec/bundler/runtime/with_unbundled_env_spec.rb | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/lib/bundler.rb b/lib/bundler.rb index 9b00610ff0881a..d6613e2e52693d 100644 --- a/lib/bundler.rb +++ b/lib/bundler.rb @@ -391,6 +391,7 @@ def unbundled_env end env.delete_if {|k, _| k[0, 7] == "BUNDLE_" } + env.delete("BUNDLER_SETUP) if env.key?("RUBYOPT") rubyopt = env["RUBYOPT"].split(" ") diff --git a/spec/bundler/runtime/with_unbundled_env_spec.rb b/spec/bundler/runtime/with_unbundled_env_spec.rb index 8c3582f7acb156..4662fdad5ac46a 100644 --- a/spec/bundler/runtime/with_unbundled_env_spec.rb +++ b/spec/bundler/runtime/with_unbundled_env_spec.rb @@ -103,6 +103,15 @@ def run_bundler_script(env, script) expect(last_command.stdboth).not_to include("-rbundler/setup") end + it "should delete BUNDLER_SETUP even if it was present in original env" do + create_file("source.rb", <<-RUBY) + print #{modified_env}.has_key?('BUNDLER_SETUP') + RUBY + ENV["BUNDLER_ORIG_BUNDLER_SETUP"] = system_gem_path("gems/bundler-#{Bundler::VERSION}/lib/bundler/setup").to_s + bundle_exec_ruby bundled_app("source.rb") + expect(last_command.stdboth).to include "false" + end + it "should restore RUBYLIB", :ruby_repo do create_file("source.rb", <<-RUBY) print #{modified_env}['RUBYLIB'] From 50001380846c7a3a5648005b80ac8cae7fbec8f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Tue, 24 Sep 2024 12:51:20 +0200 Subject: [PATCH 596/829] [rubygems/rubygems] Fix `bundler/inline` resetting ENV https://github.com/rubygems/rubygems/commit/72d8d4dbba --- lib/bundler.rb | 51 ++++++++++++++++------------- lib/bundler/inline.rb | 16 ++++++--- spec/bundler/runtime/inline_spec.rb | 16 +++++++++ 3 files changed, 56 insertions(+), 27 deletions(-) diff --git a/lib/bundler.rb b/lib/bundler.rb index d6613e2e52693d..72cbbe140de529 100644 --- a/lib/bundler.rb +++ b/lib/bundler.rb @@ -384,29 +384,12 @@ def clean_env # @return [Hash] Environment with all bundler-related variables removed def unbundled_env - env = original_env - - if env.key?("BUNDLER_ORIG_MANPATH") - env["MANPATH"] = env["BUNDLER_ORIG_MANPATH"] - end - - env.delete_if {|k, _| k[0, 7] == "BUNDLE_" } - env.delete("BUNDLER_SETUP) - - if env.key?("RUBYOPT") - rubyopt = env["RUBYOPT"].split(" ") - rubyopt.delete("-r#{File.expand_path("bundler/setup", __dir__)}") - rubyopt.delete("-rbundler/setup") - env["RUBYOPT"] = rubyopt.join(" ") - end - - if env.key?("RUBYLIB") - rubylib = env["RUBYLIB"].split(File::PATH_SEPARATOR) - rubylib.delete(__dir__) - env["RUBYLIB"] = rubylib.join(File::PATH_SEPARATOR) - end + unbundle_env(original_env) + end - env + # Remove all bundler-related variables from ENV + def unbundle_env! + ENV.replace(unbundle_env(ENV)) end # Run block with environment present before Bundler was activated @@ -652,6 +635,30 @@ def self_manager private + def unbundle_env(env) + if env.key?("BUNDLER_ORIG_MANPATH") + env["MANPATH"] = env["BUNDLER_ORIG_MANPATH"] + end + + env.delete_if {|k, _| k[0, 7] == "BUNDLE_" } + env.delete("BUNDLER_SETUP") + + if env.key?("RUBYOPT") + rubyopt = env["RUBYOPT"].split(" ") + rubyopt.delete("-r#{File.expand_path("bundler/setup", __dir__)}") + rubyopt.delete("-rbundler/setup") + env["RUBYOPT"] = rubyopt.join(" ") + end + + if env.key?("RUBYLIB") + rubylib = env["RUBYLIB"].split(File::PATH_SEPARATOR) + rubylib.delete(__dir__) + env["RUBYLIB"] = rubylib.join(File::PATH_SEPARATOR) + end + + env + end + def load_marshal(data, marshal_proc: nil) Marshal.load(data, marshal_proc) rescue TypeError => e diff --git a/lib/bundler/inline.rb b/lib/bundler/inline.rb index 1b12de1d7c24a3..ca17d0233eaa9a 100644 --- a/lib/bundler/inline.rb +++ b/lib/bundler/inline.rb @@ -39,7 +39,11 @@ def gemfile(install = false, options = {}, &gemfile) Bundler.ui = ui raise ArgumentError, "Unknown options: #{opts.keys.join(", ")}" unless opts.empty? - Bundler.with_unbundled_env do + old_gemfile = ENV["BUNDLE_GEMFILE"] + + Bundler.unbundle_env! + + begin Bundler.instance_variable_set(:@bundle_path, Pathname.new(Gem.dir)) Bundler::SharedHelpers.set_env "BUNDLE_GEMFILE", "Gemfile" @@ -80,9 +84,11 @@ def gemfile(install = false, options = {}, &gemfile) runtime.require end - end - - if ENV["BUNDLE_GEMFILE"].nil? - ENV["BUNDLE_GEMFILE"] = "" + ensure + if old_gemfile + ENV["BUNDLE_GEMFILE"] = old_gemfile + else + ENV["BUNDLE_GEMFILE"] = "" + end end end diff --git a/spec/bundler/runtime/inline_spec.rb b/spec/bundler/runtime/inline_spec.rb index 5ff555ab0ddcca..5be6eef7bd8801 100644 --- a/spec/bundler/runtime/inline_spec.rb +++ b/spec/bundler/runtime/inline_spec.rb @@ -670,6 +670,22 @@ def confirm(msg, newline = nil) expect(out).to be_empty end + it "does not reset ENV" do + script <<-RUBY + require 'bundler/inline' + + gemfile do + source "https://gem.repo1" + + ENV['FOO'] = 'bar' + end + + puts ENV['FOO'] + RUBY + + expect(out).to eq("bar") + end + it "does not load specified version of psych and stringio", :ruby_repo do build_repo4 do build_gem "psych", "999" From 9d4e7b376aaeeea2676ca2691cdc52996bfb3e43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Tue, 24 Sep 2024 12:44:17 +0200 Subject: [PATCH 597/829] Make spec file for env helpers more generic --- .../runtime/{with_unbundled_env_spec.rb => env_helpers_spec.rb} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename spec/bundler/runtime/{with_unbundled_env_spec.rb => env_helpers_spec.rb} (99%) diff --git a/spec/bundler/runtime/with_unbundled_env_spec.rb b/spec/bundler/runtime/env_helpers_spec.rb similarity index 99% rename from spec/bundler/runtime/with_unbundled_env_spec.rb rename to spec/bundler/runtime/env_helpers_spec.rb index 4662fdad5ac46a..a1607cd057a751 100644 --- a/spec/bundler/runtime/with_unbundled_env_spec.rb +++ b/spec/bundler/runtime/env_helpers_spec.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -RSpec.describe "Bundler.with_env helpers" do +RSpec.describe "env helpers" do def bundle_exec_ruby(args, options = {}) build_bundler_context options.dup bundle "exec '#{Gem.ruby}' #{args}", options From c99108517655db33b45edd5d74e488e2f60dfe66 Mon Sep 17 00:00:00 2001 From: Sutou Kouhei Date: Sat, 28 Sep 2024 08:06:23 +0900 Subject: [PATCH 598/829] [ruby/fiddle] test: remove fragile memory leak tests https://github.com/ruby/fiddle/commit/0bfcd02bef --- test/fiddle/test_handle.rb | 16 ---------------- test/fiddle/test_pointer.rb | 16 ---------------- 2 files changed, 32 deletions(-) diff --git a/test/fiddle/test_handle.rb b/test/fiddle/test_handle.rb index 412c10e09d4127..042e517e354333 100644 --- a/test/fiddle/test_handle.rb +++ b/test/fiddle/test_handle.rb @@ -191,22 +191,6 @@ def test_dlerror $VERBOSE = verbose end if /freebsd/=~ RUBY_PLATFORM - def test_no_memory_leak - # https://github.com/ruby/fiddle/actions/runs/3202406059/jobs/5231356410 - omit if RUBY_VERSION >= '3.2' - - if respond_to?(:assert_nothing_leaked_memory) - n_tries = 100_000 - assert_nothing_leaked_memory(SIZEOF_VOIDP * (n_tries / 100)) do - n_tries.times do - Fiddle::Handle.allocate - end - end - else - assert_no_memory_leak(%w[-W0 -rfiddle.so], '', '100_000.times {Fiddle::Handle.allocate}; GC.start', rss: true) - end - end - if /cygwin|mingw|mswin/ =~ RUBY_PLATFORM def test_fallback_to_ansi k = Fiddle::Handle.new("kernel32.dll") diff --git a/test/fiddle/test_pointer.rb b/test/fiddle/test_pointer.rb index f2c1d285ad5b0e..30236be7f6454b 100644 --- a/test/fiddle/test_pointer.rb +++ b/test/fiddle/test_pointer.rb @@ -286,21 +286,5 @@ def test_null_pointer assert_raise(DLError) {nullpo[0]} assert_raise(DLError) {nullpo[0] = 1} end - - def test_no_memory_leak - # https://github.com/ruby/fiddle/actions/runs/3202406059/jobs/5231356410 - omit if RUBY_VERSION >= '3.2' - - if respond_to?(:assert_nothing_leaked_memory) - n_tries = 100_000 - assert_nothing_leaked_memory(SIZEOF_VOIDP * (n_tries / 100)) do - n_tries.times do - Fiddle::Pointer.allocate - end - end - else - assert_no_memory_leak(%w[-W0 -rfiddle.so], '', '100_000.times {Fiddle::Pointer.allocate}', rss: true) - end - end end end if defined?(Fiddle) From d2ec0e8039ccb24af28570d4944db39050df817c Mon Sep 17 00:00:00 2001 From: Sutou Kouhei Date: Sat, 28 Sep 2024 21:23:36 +0900 Subject: [PATCH 599/829] [ruby/fiddle] test memory-view: ensure releasing in test It's for avoiding calling release on exit via GC. If it's happen, Ruby will be crashed because Fiddle::MemoryView's finalizer may refer other Ruby object. In exit phrase, the referred Ruby object may be already freed. https://github.com/ruby/fiddle/commit/02915f13de --- test/fiddle/test_memory_view.rb | 114 +++++++++++++++++++------------- 1 file changed, 67 insertions(+), 47 deletions(-) diff --git a/test/fiddle/test_memory_view.rb b/test/fiddle/test_memory_view.rb index 240cda37df64e4..d44c42d2394528 100644 --- a/test/fiddle/test_memory_view.rb +++ b/test/fiddle/test_memory_view.rb @@ -34,18 +34,22 @@ def test_memory_view_from_pointer str = Marshal.load(Marshal.dump("hello world")) ptr = Pointer[str] mview = MemoryView.new(ptr) - assert_same(ptr, mview.obj) - assert_equal(str.bytesize, mview.byte_size) - assert_equal(true, mview.readonly?) - assert_equal(nil, mview.format) - assert_equal(1, mview.item_size) - assert_equal(1, mview.ndim) - assert_equal(nil, mview.shape) - assert_equal(nil, mview.strides) - assert_equal(nil, mview.sub_offsets) + begin + assert_same(ptr, mview.obj) + assert_equal(str.bytesize, mview.byte_size) + assert_equal(true, mview.readonly?) + assert_equal(nil, mview.format) + assert_equal(1, mview.item_size) + assert_equal(1, mview.ndim) + assert_equal(nil, mview.shape) + assert_equal(nil, mview.strides) + assert_equal(nil, mview.sub_offsets) - codes = str.codepoints - assert_equal(codes, (0...str.bytesize).map {|i| mview[i] }) + codes = str.codepoints + assert_equal(codes, (0...str.bytesize).map {|i| mview[i] }) + ensure + mview.release + end end def test_memory_view_multi_dimensional @@ -57,17 +61,21 @@ def test_memory_view_multi_dimensional shape = [3, 4] md = MemoryViewTestUtils::MultiDimensionalView.new(buf, "l!", shape, nil) mview = Fiddle::MemoryView.new(md) - assert_equal(buf.bytesize, mview.byte_size) - assert_equal("l!", mview.format) - assert_equal(Fiddle::SIZEOF_LONG, mview.item_size) - assert_equal(2, mview.ndim) - assert_equal(shape, mview.shape) - assert_equal([Fiddle::SIZEOF_LONG*4, Fiddle::SIZEOF_LONG], mview.strides) - assert_equal(nil, mview.sub_offsets) - assert_equal(1, mview[0, 0]) - assert_equal(4, mview[0, 3]) - assert_equal(6, mview[1, 1]) - assert_equal(10, mview[2, 1]) + begin + assert_equal(buf.bytesize, mview.byte_size) + assert_equal("l!", mview.format) + assert_equal(Fiddle::SIZEOF_LONG, mview.item_size) + assert_equal(2, mview.ndim) + assert_equal(shape, mview.shape) + assert_equal([Fiddle::SIZEOF_LONG*4, Fiddle::SIZEOF_LONG], mview.strides) + assert_equal(nil, mview.sub_offsets) + assert_equal(1, mview[0, 0]) + assert_equal(4, mview[0, 3]) + assert_equal(6, mview[1, 1]) + assert_equal(10, mview[2, 1]) + ensure + mview.release + end end def test_memory_view_multi_dimensional_with_strides @@ -79,17 +87,21 @@ def test_memory_view_multi_dimensional_with_strides strides = [4*Fiddle::SIZEOF_LONG*2, Fiddle::SIZEOF_LONG*2] md = MemoryViewTestUtils::MultiDimensionalView.new(buf, "l!", shape, strides) mview = Fiddle::MemoryView.new(md) - assert_equal("l!", mview.format) - assert_equal(Fiddle::SIZEOF_LONG, mview.item_size) - assert_equal(buf.bytesize, mview.byte_size) - assert_equal(2, mview.ndim) - assert_equal(shape, mview.shape) - assert_equal(strides, mview.strides) - assert_equal(nil, mview.sub_offsets) - assert_equal(1, mview[0, 0]) - assert_equal(5, mview[0, 2]) - assert_equal(9, mview[1, 0]) - assert_equal(15, mview[1, 3]) + begin + assert_equal("l!", mview.format) + assert_equal(Fiddle::SIZEOF_LONG, mview.item_size) + assert_equal(buf.bytesize, mview.byte_size) + assert_equal(2, mview.ndim) + assert_equal(shape, mview.shape) + assert_equal(strides, mview.strides) + assert_equal(nil, mview.sub_offsets) + assert_equal(1, mview[0, 0]) + assert_equal(5, mview[0, 2]) + assert_equal(9, mview[1, 0]) + assert_equal(15, mview[1, 3]) + ensure + mview.release + end end def test_memory_view_multi_dimensional_with_multiple_members @@ -101,17 +113,21 @@ def test_memory_view_multi_dimensional_with_multiple_members strides = [4*Fiddle::SIZEOF_SHORT*2, Fiddle::SIZEOF_SHORT*2] md = MemoryViewTestUtils::MultiDimensionalView.new(buf, "ss", shape, strides) mview = Fiddle::MemoryView.new(md) - assert_equal("ss", mview.format) - assert_equal(Fiddle::SIZEOF_SHORT*2, mview.item_size) - assert_equal(buf.bytesize, mview.byte_size) - assert_equal(2, mview.ndim) - assert_equal(shape, mview.shape) - assert_equal(strides, mview.strides) - assert_equal(nil, mview.sub_offsets) - assert_equal([1, 2], mview[0, 0]) - assert_equal([5, 6], mview[0, 2]) - assert_equal([-1, -2], mview[1, 0]) - assert_equal([-7, -8], mview[1, 3]) + begin + assert_equal("ss", mview.format) + assert_equal(Fiddle::SIZEOF_SHORT*2, mview.item_size) + assert_equal(buf.bytesize, mview.byte_size) + assert_equal(2, mview.ndim) + assert_equal(shape, mview.shape) + assert_equal(strides, mview.strides) + assert_equal(nil, mview.sub_offsets) + assert_equal([1, 2], mview[0, 0]) + assert_equal([5, 6], mview[0, 2]) + assert_equal([-1, -2], mview[1, 0]) + assert_equal([-7, -8], mview[1, 3]) + ensure + mview.release + end end def test_export @@ -135,9 +151,13 @@ def test_to_s data = "\u{3042}" ptr = Pointer[data] mview = MemoryView.new(ptr) - string = mview.to_s - assert_equal([data.b, true], - [string, string.frozen?]) + begin + string = mview.to_s + assert_equal([data.b, true], + [string, string.frozen?]) + ensure + mview.release + end end end end From 5eb7cbf4e3f96444ba6189ecf2d349f35747d5ce Mon Sep 17 00:00:00 2001 From: Nithin Bekal Date: Tue, 1 Oct 2024 22:43:59 -0400 Subject: [PATCH 600/829] [DOC] Alias Kernel#yield_self to #then --- kernel.rb | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/kernel.rb b/kernel.rb index 541d0cfd9d11bf..b3da289053dc6e 100644 --- a/kernel.rb +++ b/kernel.rb @@ -135,21 +135,7 @@ def then yield(self) end - # - # call-seq: - # obj.yield_self {|x| block } -> an_object - # - # Yields self to the block and returns the result of the block. - # - # "my string".yield_self {|s| s.upcase } #=> "MY STRING" - # - def yield_self - Primitive.attr! :inline_block - unless defined?(yield) - return Primitive.cexpr! 'SIZED_ENUMERATOR(self, 0, 0, rb_obj_size)' - end - yield(self) - end + alias yield_self then module_function From bae3d6813470bacbaac281616a07d9079697c882 Mon Sep 17 00:00:00 2001 From: Nithin Bekal Date: Tue, 1 Oct 2024 22:51:00 -0400 Subject: [PATCH 601/829] [DOC] Remove repeated examples for Kernel#then --- kernel.rb | 9 --------- 1 file changed, 9 deletions(-) diff --git a/kernel.rb b/kernel.rb index b3da289053dc6e..0c95ad004208bc 100644 --- a/kernel.rb +++ b/kernel.rb @@ -118,15 +118,6 @@ def tap # # does not meet condition, drop value # 2.then.detect(&:odd?) # => nil # - # Good usage for +then+ is value piping in method chains: - # - # require 'open-uri' - # require 'json' - # - # construct_url(arguments). - # then {|url| URI(url).read }. - # then {|response| JSON.parse(response) } - # def then Primitive.attr! :inline_block unless defined?(yield) From b7a33aef9eeb93fcad997ddaa0e8991b9373a32b Mon Sep 17 00:00:00 2001 From: Nithin Bekal Date: Tue, 1 Oct 2024 22:52:04 -0400 Subject: [PATCH 602/829] [DOC] Keep example styles consistent The examples of chaining for other methods, such as #tap have the dot at the start of the line, while #then has it at the end of the previous line. Updated this to have consistent style in Kernel docs. --- kernel.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/kernel.rb b/kernel.rb index 0c95ad004208bc..07878e82dc04a4 100644 --- a/kernel.rb +++ b/kernel.rb @@ -105,9 +105,9 @@ def tap # require 'open-uri' # require 'json' # - # construct_url(arguments). - # then {|url| URI(url).read }. - # then {|response| JSON.parse(response) } + # construct_url(arguments) + # .then {|url| URI(url).read } + # .then {|response| JSON.parse(response) } # # When called without block, the method returns +Enumerator+, # which can be used, for example, for conditional From fe8d7ca8538d613e454e185f1f28c9958e825241 Mon Sep 17 00:00:00 2001 From: Nithin Bekal Date: Tue, 1 Oct 2024 23:04:17 -0400 Subject: [PATCH 603/829] [DOC] Alias Float#magnitude to abs --- numeric.rb | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/numeric.rb b/numeric.rb index 4dc406fd2386a7..852385962e2d64 100644 --- a/numeric.rb +++ b/numeric.rb @@ -328,10 +328,7 @@ def abs Primitive.cexpr! 'rb_float_abs(self)' end - def magnitude - Primitive.attr! :leaf - Primitive.cexpr! 'rb_float_abs(self)' - end + alias magnitude abs # call-seq: # -float -> float From 973d470288840839bb57bc7ba01047ec7bb702cb Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Wed, 2 Oct 2024 11:37:29 +0900 Subject: [PATCH 604/829] Update bundled_gems --- gems/bundled_gems | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gems/bundled_gems b/gems/bundled_gems index d2e70973612f61..e89f54752a9db4 100644 --- a/gems/bundled_gems +++ b/gems/bundled_gems @@ -18,7 +18,7 @@ net-pop 0.1.2 https://github.com/ruby/net-pop net-smtp 0.5.0 https://github.com/ruby/net-smtp matrix 0.4.2 https://github.com/ruby/matrix prime 0.1.2 https://github.com/ruby/prime -rbs 3.5.3 https://github.com/ruby/rbs +rbs 3.6.0 https://github.com/ruby/rbs typeprof 0.21.11 https://github.com/ruby/typeprof 167263ca3a634b61df0445f1a6b3e259a5d47f94 debug 1.9.2 https://github.com/ruby/debug racc 1.8.1 https://github.com/ruby/racc From bb97061f65d620b225d7638400642e41ad9ee692 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Wed, 2 Oct 2024 17:31:27 +0900 Subject: [PATCH 605/829] SKip failing tests that are caused by unknown IOError --- tool/rbs_skip_tests | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tool/rbs_skip_tests b/tool/rbs_skip_tests index 650d1828d5b983..14e49aa4fb9396 100644 --- a/tool/rbs_skip_tests +++ b/tool/rbs_skip_tests @@ -77,3 +77,13 @@ test_merge_types(RBS::RuntimePrototypeTest) test_reflection(RBS::RuntimePrototypeTest) test_todo(RBS::RuntimePrototypeTest) test_of(RubyVM::AbstractSyntaxTreeSingletonTest) + +# rbs-3.6.0 and Ruby 3.4.0dev: IOError: closed stream + +test_spawn(PTYSingletonTest) +test_getpty(PTYSingletonTest) +test_check(PTYSingletonTest) +test_width_for(PPSingletonTest) +test_singleline_pp(PPSingletonTest) +test_singleline_pp(PPSingletonTest) +test_capture2e(Open3SingletonTest) From 7469b8308d6fb7fd21b8589a9f4ea0cedbfeb3be Mon Sep 17 00:00:00 2001 From: git Date: Wed, 2 Oct 2024 09:04:01 +0000 Subject: [PATCH 606/829] Update bundled gems list at bb97061f65d620b225d7638400642e [ci skip] --- NEWS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index ab45e87d74cf14..b6946318e3f5c0 100644 --- a/NEWS.md +++ b/NEWS.md @@ -99,7 +99,7 @@ The following bundled gems are updated. * net-ftp 0.3.7 * net-imap 0.4.16 * net-smtp 0.5.0 -* rbs 3.5.3 +* rbs 3.6.0 * typeprof 0.21.11 * debug 1.9.2 * racc 1.8.1 From acbdb309417a8436ae542cc8948121d9baaf1fed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Fri, 27 Sep 2024 09:37:01 +0200 Subject: [PATCH 607/829] [rubygems/rubygems] Fix error in one source when fetching dependency APIs clearing results from all sources https://github.com/rubygems/rubygems/commit/0549ddbcc5 --- lib/rubygems/resolver/api_set.rb | 19 ++++++++++++------- lib/rubygems/resolver/best_set.rb | 2 -- test/rubygems/test_gem_resolver_api_set.rb | 19 +++++++++++++++++++ 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/lib/rubygems/resolver/api_set.rb b/lib/rubygems/resolver/api_set.rb index 3e4dadc40f489e..9f6695a6a97455 100644 --- a/lib/rubygems/resolver/api_set.rb +++ b/lib/rubygems/resolver/api_set.rb @@ -104,16 +104,21 @@ def versions(name) # :nodoc: end uri = @dep_uri + name - str = Gem::RemoteFetcher.fetcher.fetch_path uri - lines(str).each do |ver| - number, platform, dependencies, requirements = parse_gem(ver) + begin + str = Gem::RemoteFetcher.fetcher.fetch_path uri + rescue Gem::RemoteFetcher::FetchError + @data[name] = [] + else + lines(str).each do |ver| + number, platform, dependencies, requirements = parse_gem(ver) - platform ||= "ruby" - dependencies = dependencies.map {|dep_name, reqs| [dep_name, reqs.join(", ")] } - requirements = requirements.map {|req_name, reqs| [req_name.to_sym, reqs] }.to_h + platform ||= "ruby" + dependencies = dependencies.map {|dep_name, reqs| [dep_name, reqs.join(", ")] } + requirements = requirements.map {|req_name, reqs| [req_name.to_sym, reqs] }.to_h - @data[name] << { name: name, number: number, platform: platform, dependencies: dependencies, requirements: requirements } + @data[name] << { name: name, number: number, platform: platform, dependencies: dependencies, requirements: requirements } + end end @data[name] diff --git a/lib/rubygems/resolver/best_set.rb b/lib/rubygems/resolver/best_set.rb index 57d0d0037576d5..e2307f6e026bde 100644 --- a/lib/rubygems/resolver/best_set.rb +++ b/lib/rubygems/resolver/best_set.rb @@ -29,8 +29,6 @@ def find_all(req) # :nodoc: pick_sets if @remote && @sets.empty? super - rescue Gem::RemoteFetcher::FetchError - [] end def prefetch(reqs) # :nodoc: diff --git a/test/rubygems/test_gem_resolver_api_set.rb b/test/rubygems/test_gem_resolver_api_set.rb index 5781cf37d26e13..b0b4943beafa97 100644 --- a/test/rubygems/test_gem_resolver_api_set.rb +++ b/test/rubygems/test_gem_resolver_api_set.rb @@ -136,6 +136,25 @@ def test_find_all_missing assert_empty set.find_all(a_dep) end + def test_find_all_not_found + spec_fetcher + + @fetcher.data["#{@dep_uri}/a"] = + proc do + raise Gem::RemoteFetcher::FetchError + end + + set = Gem::Resolver::APISet.new @dep_uri + + a_dep = Gem::Resolver::DependencyRequest.new dep("a"), nil + + assert_empty set.find_all(a_dep) + + @fetcher.data.delete "#{@dep_uri}a" + + assert_empty set.find_all(a_dep) + end + def test_prefetch spec_fetcher From 4e219d8f7d3e76cf60e747dc16deb3452f297442 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Wed, 2 Oct 2024 19:04:48 +0900 Subject: [PATCH 608/829] Split appending options to ruby_description It's becoming tedious to map each format specifier to an argument. --- version.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/version.c b/version.c index 48b5be1b19aa7c..86415b83d17117 100644 --- a/version.c +++ b/version.c @@ -153,20 +153,14 @@ define_ruby_description(const char *const jit_opt) + rb_strlen_lit(" +PRISM") ]; - const char *const threads_opt = ruby_mn_threads_enabled ? " +MN" : ""; - const char *const parser_opt = (*rb_ruby_prism_ptr()) ? " +PRISM" : ""; - - int n = snprintf(desc, sizeof(desc), - "%.*s" - "%s" // jit_opt - "%s" // threads_opts - "%s" // parser_opt - "%s", - ruby_description_opt_point, ruby_description, - jit_opt, - threads_opt, - parser_opt, - ruby_description + ruby_description_opt_point); + int n = ruby_description_opt_point; + memcpy(desc, ruby_description, n); +# define append(s) (n += (int)strlcpy(desc + n, s, sizeof(desc) - n), assert(n < sizeof(desc))) + if (*jit_opt) append(jit_opt); + if (ruby_mn_threads_enabled) append(" +MN"); + if (*rb_ruby_prism_ptr()) append(" +PRISM"); + append(ruby_description + ruby_description_opt_point); +# undef append VALUE description = rb_obj_freeze(rb_usascii_str_new_static(desc, n)); rb_dynamic_description = desc; From 3e1021b1448a5820d387795e065ae25b9da5abdf Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Wed, 2 Oct 2024 19:08:54 +0900 Subject: [PATCH 609/829] Make default parser enum and define getter/setter --- common.mk | 1 + internal/parse.h | 14 +++++++++----- iseq.c | 2 +- load.c | 2 +- mini_builtin.c | 2 +- prism_compile.h | 1 - ruby.c | 6 +++--- version.c | 20 ++++++++++++++++++-- vm.c | 8 -------- vm_eval.c | 2 +- 10 files changed, 35 insertions(+), 23 deletions(-) diff --git a/common.mk b/common.mk index 4f3c0a9a08c9ca..ebbaf1aa6cafc2 100644 --- a/common.mk +++ b/common.mk @@ -19522,6 +19522,7 @@ version.$(OBJEXT): $(top_srcdir)/internal/cmdlineopt.h version.$(OBJEXT): $(top_srcdir)/internal/compilers.h version.$(OBJEXT): $(top_srcdir)/internal/gc.h version.$(OBJEXT): $(top_srcdir)/internal/imemo.h +version.$(OBJEXT): $(top_srcdir)/internal/parse.h version.$(OBJEXT): $(top_srcdir)/internal/sanitizers.h version.$(OBJEXT): $(top_srcdir)/internal/serial.h version.$(OBJEXT): $(top_srcdir)/internal/static_assert.h diff --git a/internal/parse.h b/internal/parse.h index e0c81f4f96e4c2..de42acbed921b2 100644 --- a/internal/parse.h +++ b/internal/parse.h @@ -13,11 +13,15 @@ #include "internal/static_assert.h" // The default parser to use for Ruby code. -// 0: parse.y -// 1: Prism -#ifndef RB_DEFAULT_PARSER -#define RB_DEFAULT_PARSER 1 -#endif +typedef enum { + RB_DEFAULT_PARSER_PARSE_Y, + RB_DEFAULT_PARSER_PRISM, +} ruby_default_parser_enum; + +ruby_default_parser_enum rb_ruby_default_parser(void); +void rb_ruby_default_parser_set(ruby_default_parser_enum parser); + +#define rb_ruby_prism_p() (rb_ruby_default_parser() == RB_DEFAULT_PARSER_PRISM) #ifdef UNIVERSAL_PARSER #define rb_encoding const void diff --git a/iseq.c b/iseq.c index 2c02043d552ad7..d267c7e08bc4f7 100644 --- a/iseq.c +++ b/iseq.c @@ -1564,7 +1564,7 @@ iseqw_s_compile_parser(int argc, VALUE *argv, VALUE self, bool prism) static VALUE iseqw_s_compile(int argc, VALUE *argv, VALUE self) { - return iseqw_s_compile_parser(argc, argv, self, *rb_ruby_prism_ptr()); + return iseqw_s_compile_parser(argc, argv, self, rb_ruby_prism_p()); } /* diff --git a/load.c b/load.c index c6fb43e9e860d5..c1862c38fa1dbb 100644 --- a/load.c +++ b/load.c @@ -743,7 +743,7 @@ load_iseq_eval(rb_execution_context_t *ec, VALUE fname) rb_thread_t *th = rb_ec_thread_ptr(ec); VALUE realpath_map = get_loaded_features_realpath_map(th->vm); - if (*rb_ruby_prism_ptr()) { + if (rb_ruby_prism_p()) { pm_parse_result_t result = { 0 }; result.options.line = 1; result.node.coverage_enabled = 1; diff --git a/mini_builtin.c b/mini_builtin.c index b9be7c58f88d06..2fbc00234dfe9d 100644 --- a/mini_builtin.c +++ b/mini_builtin.c @@ -58,7 +58,7 @@ builtin_iseq_load(const char *feature_name, const struct rb_builtin_function *ta .debug_level = 0, }; - if (*rb_ruby_prism_ptr()) { + if (rb_ruby_prism_p()) { pm_parse_result_t result = { 0 }; pm_prelude_load(&result, name_str, code, start_line); diff --git a/prism_compile.h b/prism_compile.h index 28f32cfbe98907..4015091fc17394 100644 --- a/prism_compile.h +++ b/prism_compile.h @@ -65,7 +65,6 @@ typedef struct pm_scope_node { void pm_scope_node_init(const pm_node_t *node, pm_scope_node_t *scope, pm_scope_node_t *previous); void pm_scope_node_destroy(pm_scope_node_t *scope_node); -bool *rb_ruby_prism_ptr(void); typedef struct { /** The parser that will do the actual parsing. */ diff --git a/ruby.c b/ruby.c index b3ddf5d3b03287..accf53eec21df7 100644 --- a/ruby.c +++ b/ruby.c @@ -1430,10 +1430,10 @@ proc_long_options(ruby_cmdline_options_t *opt, const char *s, long argc, char ** } else if (is_option_with_arg("parser", Qfalse, Qtrue)) { if (strcmp("prism", s) == 0) { - *rb_ruby_prism_ptr() = true; + rb_ruby_default_parser_set(RB_DEFAULT_PARSER_PRISM); } else if (strcmp("parse.y", s) == 0) { - *rb_ruby_prism_ptr() = false; + rb_ruby_default_parser_set(RB_DEFAULT_PARSER_PARSE_Y); } else { rb_raise(rb_eRuntimeError, "unknown parser %s", s); @@ -2522,7 +2522,7 @@ process_options(int argc, char **argv, ruby_cmdline_options_t *opt) rb_enc_associate(opt->e_script, eenc); } - if (!(*rb_ruby_prism_ptr())) { + if (!rb_ruby_prism_p()) { ast_value = process_script(opt); if (!(result.ast = rb_ruby_ast_data_get(ast_value))) return Qfalse; } diff --git a/version.c b/version.c index 86415b83d17117..3bf3ff1db45215 100644 --- a/version.c +++ b/version.c @@ -10,6 +10,7 @@ **********************************************************************/ #include "internal/cmdlineopt.h" +#include "internal/parse.h" #include "ruby/ruby.h" #include "version.h" #include "vm_core.h" @@ -141,7 +142,22 @@ Init_version(void) int ruby_mn_threads_enabled; -bool * rb_ruby_prism_ptr(void); +#ifndef RB_DEFAULT_PARSER +#define RB_DEFAULT_PARSER RB_DEFAULT_PARSER_PRISM +#endif +static ruby_default_parser_enum default_parser = RB_DEFAULT_PARSER; + +ruby_default_parser_enum +rb_ruby_default_parser(void) +{ + return default_parser; +} + +void +rb_ruby_default_parser_set(ruby_default_parser_enum parser) +{ + default_parser = parser; +} static void define_ruby_description(const char *const jit_opt) @@ -158,7 +174,7 @@ define_ruby_description(const char *const jit_opt) # define append(s) (n += (int)strlcpy(desc + n, s, sizeof(desc) - n), assert(n < sizeof(desc))) if (*jit_opt) append(jit_opt); if (ruby_mn_threads_enabled) append(" +MN"); - if (*rb_ruby_prism_ptr()) append(" +PRISM"); + if (rb_ruby_prism_p()) append(" +PRISM"); append(ruby_description + ruby_description_opt_point); # undef append diff --git a/vm.c b/vm.c index 6b75a7ad5a76b2..4a31d79df7e10e 100644 --- a/vm.c +++ b/vm.c @@ -4456,14 +4456,6 @@ rb_ruby_verbose_ptr(void) return &cr->verbose; } -static bool prism = (RB_DEFAULT_PARSER == 1); - -bool * -rb_ruby_prism_ptr(void) -{ - return &prism; -} - VALUE * rb_ruby_debug_ptr(void) { diff --git a/vm_eval.c b/vm_eval.c index baddb88b706f34..ff8e2e6780ffd7 100644 --- a/vm_eval.c +++ b/vm_eval.c @@ -1787,7 +1787,7 @@ static const rb_iseq_t * eval_make_iseq(VALUE src, VALUE fname, int line, const struct rb_block *base_block) { - if (*rb_ruby_prism_ptr()) { + if (rb_ruby_prism_p()) { return pm_eval_make_iseq(src, fname, line, base_block); } const VALUE parser = rb_parser_new(); From 6acf03618a937f5302fbd3043f9c3420a49f8cb3 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Tue, 1 Oct 2024 15:35:15 -0400 Subject: [PATCH 610/829] Mark iseq keyword default values during compilation During compilation, we write keyword default values into the iseq, so we should mark it to ensure it does not get GC'd. This might fix issues on ASAN like http://ci.rvm.jp/logfiles/brlog.trunk_asan.20240927-194923 ==805257==ERROR: AddressSanitizer: use-after-poison on address 0x7b7e5e3e2828 at pc 0x5e09ac4822f8 bp 0x7ffde56b0140 sp 0x7ffde56b0138 READ of size 8 at 0x7b7e5e3e2828 thread T0 #0 0x5e09ac4822f7 in RB_BUILTIN_TYPE include/ruby/internal/value_type.h:191:30 #1 0x5e09ac4822f7 in rbimpl_RB_TYPE_P_fastpath include/ruby/internal/value_type.h:352:19 #2 0x5e09ac4822f7 in gc_mark gc/default.c:4488:9 #3 0x5e09ac51011e in rb_iseq_mark_and_move iseq.c:361:17 #4 0x5e09ac4b85c4 in rb_imemo_mark_and_move imemo.c:386:9 #5 0x5e09ac467544 in rb_gc_mark_children gc.c:2508:9 #6 0x5e09ac482c24 in gc_mark_children gc/default.c:4673:5 #7 0x5e09ac482c24 in gc_mark_stacked_objects gc/default.c:4694:9 #8 0x5e09ac482c24 in gc_mark_stacked_objects_all gc/default.c:4732:12 #9 0x5e09ac48c7f9 in gc_marks_rest gc/default.c:5755:9 #10 0x5e09ac48c7f9 in gc_marks gc/default.c:5870:9 #11 0x5e09ac48c7f9 in gc_start gc/default.c:6517:13 --- iseq.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/iseq.c b/iseq.c index d267c7e08bc4f7..3d18fb597a6a99 100644 --- a/iseq.c +++ b/iseq.c @@ -354,11 +354,13 @@ rb_iseq_mark_and_move(rb_iseq_t *iseq, bool reference_updating) } } - if (body->param.flags.has_kw && ISEQ_COMPILE_DATA(iseq) == NULL) { + if (body->param.flags.has_kw && body->param.keyword != NULL) { const struct rb_iseq_param_keyword *const keyword = body->param.keyword; - for (int j = 0, i = keyword->required_num; i < keyword->num; i++, j++) { - rb_gc_mark_and_move(&keyword->default_values[j]); + if (keyword->default_values != NULL) { + for (int j = 0, i = keyword->required_num; i < keyword->num; i++, j++) { + rb_gc_mark_and_move(&keyword->default_values[j]); + } } } From c1d6d55f5af4b06372c6a016907a351e1ed7414f Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Wed, 2 Oct 2024 22:03:32 +0900 Subject: [PATCH 611/829] Assert in only one place just after adding an argument --- version.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/version.c b/version.c index 3bf3ff1db45215..416688644ae662 100644 --- a/version.c +++ b/version.c @@ -171,8 +171,9 @@ define_ruby_description(const char *const jit_opt) int n = ruby_description_opt_point; memcpy(desc, ruby_description, n); -# define append(s) (n += (int)strlcpy(desc + n, s, sizeof(desc) - n), assert(n < sizeof(desc))) +# define append(s) (n += (int)strlcpy(desc + n, s, sizeof(desc) - n)) if (*jit_opt) append(jit_opt); + RUBY_ASSERT(n <= ruby_description_opt_point + (int)rb_strlen_lit(YJIT_DESCRIPTION)); if (ruby_mn_threads_enabled) append(" +MN"); if (rb_ruby_prism_p()) append(" +PRISM"); append(ruby_description + ruby_description_opt_point); From e41e4bacb1664e4f74e7c00f83e0bc81eee897c6 Mon Sep 17 00:00:00 2001 From: Burdette Lamar Date: Wed, 2 Oct 2024 08:15:25 -0500 Subject: [PATCH 612/829] [DOC] Tweaks for Array#inspect (#11743) --- array.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/array.c b/array.c index 6d5762837b7f22..cb6d06cc5fcecf 100644 --- a/array.c +++ b/array.c @@ -2970,14 +2970,15 @@ inspect_ary(VALUE ary, VALUE dummy, int recur) /* * call-seq: - * array.inspect -> new_string + * inspect -> new_string * - * Returns the new String formed by calling method #inspect + * Returns the new string formed by calling method #inspect * on each array element: * * a = [:foo, 'bar', 2] * a.inspect # => "[:foo, \"bar\", 2]" * + * Related: see {Methods for Querying}[rdoc-ref:Array@Methods+for+Querying]. */ static VALUE From 2e2520ef10d4cbb86123adcb75e5aab664813bec Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Wed, 2 Oct 2024 10:29:07 -0400 Subject: [PATCH 613/829] [ruby/prism] Fix up beginless ranges in method definitions https://github.com/ruby/prism/commit/ab9d80987a --- prism/prism.c | 29 ++++-- test/prism/fixtures/range_beginless.txt | 5 + test/prism/snapshots/range_beginless.txt | 114 +++++++++++++++++++++++ 3 files changed, 138 insertions(+), 10 deletions(-) create mode 100644 test/prism/fixtures/range_beginless.txt create mode 100644 test/prism/snapshots/range_beginless.txt diff --git a/prism/prism.c b/prism/prism.c index 3549b59286400b..7b4b7828fdbc65 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -11452,10 +11452,7 @@ parser_lex(pm_parser_t *parser) { if (match(parser, '.')) { if (match(parser, '.')) { // If we're _not_ inside a range within default parameters - if ( - !context_p(parser, PM_CONTEXT_DEFAULT_PARAMS) && - context_p(parser, PM_CONTEXT_DEF_PARAMS) - ) { + if (!context_p(parser, PM_CONTEXT_DEFAULT_PARAMS) && context_p(parser, PM_CONTEXT_DEF_PARAMS)) { if (lex_state_p(parser, PM_LEX_STATE_END)) { lex_state_set(parser, PM_LEX_STATE_BEG); } else { @@ -14571,9 +14568,10 @@ parse_parameters( bool repeated = pm_parser_parameter_name_check(parser, &name); pm_parser_local_add_token(parser, &name, 1); - if (accept1(parser, PM_TOKEN_EQUAL)) { - pm_token_t operator = parser->previous; + if (match1(parser, PM_TOKEN_EQUAL)) { + pm_token_t operator = parser->current; context_push(parser, PM_CONTEXT_DEFAULT_PARAMS); + parser_lex(parser); pm_constant_id_t name_id = pm_parser_constant_id_token(parser, &name); uint32_t reads = parser->version == PM_OPTIONS_VERSION_CRUBY_3_3 ? pm_locals_reads(&parser->current_scope->locals, name_id) : 0; @@ -14624,6 +14622,8 @@ parse_parameters( case PM_TOKEN_LABEL: { if (!uses_parentheses) parser->in_keyword_arg = true; update_parameter_state(parser, &parser->current, &order); + + context_push(parser, PM_CONTEXT_DEFAULT_PARAMS); parser_lex(parser); pm_token_t name = parser->previous; @@ -14643,15 +14643,20 @@ parse_parameters( case PM_TOKEN_COMMA: case PM_TOKEN_PARENTHESIS_RIGHT: case PM_TOKEN_PIPE: { + context_pop(parser); + pm_node_t *param = (pm_node_t *) pm_required_keyword_parameter_node_create(parser, &name); if (repeated) { pm_node_flag_set_repeated_parameter(param); } + pm_parameters_node_keywords_append(params, param); break; } case PM_TOKEN_SEMICOLON: case PM_TOKEN_NEWLINE: { + context_pop(parser); + if (uses_parentheses) { looping = false; break; @@ -14661,6 +14666,7 @@ parse_parameters( if (repeated) { pm_node_flag_set_repeated_parameter(param); } + pm_parameters_node_keywords_append(params, param); break; } @@ -14668,8 +14674,6 @@ parse_parameters( pm_node_t *param; if (token_begins_expression_p(parser->current.type)) { - context_push(parser, PM_CONTEXT_DEFAULT_PARAMS); - pm_constant_id_t name_id = pm_parser_constant_id_token(parser, &local); uint32_t reads = parser->version == PM_OPTIONS_VERSION_CRUBY_3_3 ? pm_locals_reads(&parser->current_scope->locals, name_id) : 0; @@ -14681,7 +14685,6 @@ parse_parameters( PM_PARSER_ERR_TOKEN_FORMAT_CONTENT(parser, local, PM_ERR_PARAMETER_CIRCULAR); } - context_pop(parser); param = (pm_node_t *) pm_optional_keyword_parameter_node_create(parser, &name, value); } else { @@ -14691,6 +14694,8 @@ parse_parameters( if (repeated) { pm_node_flag_set_repeated_parameter(param); } + + context_pop(parser); pm_parameters_node_keywords_append(params, param); // If parsing the value of the parameter resulted in error recovery, @@ -19246,6 +19251,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b lex_state_set(parser, PM_LEX_STATE_BEG); parser->command_start = true; + context_pop(parser); if (!accept1(parser, PM_TOKEN_PARENTHESIS_RIGHT)) { PM_PARSER_ERR_TOKEN_FORMAT(parser, parser->current, PM_ERR_DEF_PARAMS_TERM_PAREN, pm_token_type_human(parser->current.type)); parser->previous.start = parser->previous.end; @@ -19265,17 +19271,20 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b lparen = not_provided(parser); rparen = not_provided(parser); params = parse_parameters(parser, PM_BINDING_POWER_DEFINED, false, false, true, true, (uint16_t) (depth + 1)); + + context_pop(parser); break; } default: { lparen = not_provided(parser); rparen = not_provided(parser); params = NULL; + + context_pop(parser); break; } } - context_pop(parser); pm_node_t *statements = NULL; pm_token_t equal; pm_token_t end_keyword; diff --git a/test/prism/fixtures/range_beginless.txt b/test/prism/fixtures/range_beginless.txt new file mode 100644 index 00000000000000..a55b9b57e77b12 --- /dev/null +++ b/test/prism/fixtures/range_beginless.txt @@ -0,0 +1,5 @@ +def f(x = ...?a); end + +def f(x: ...?a); end + +def f() ...:a; end diff --git a/test/prism/snapshots/range_beginless.txt b/test/prism/snapshots/range_beginless.txt new file mode 100644 index 00000000000000..800f087dc10583 --- /dev/null +++ b/test/prism/snapshots/range_beginless.txt @@ -0,0 +1,114 @@ +@ ProgramNode (location: (1,0)-(5,18)) +├── flags: ∅ +├── locals: [] +└── statements: + @ StatementsNode (location: (1,0)-(5,18)) + ├── flags: ∅ + └── body: (length: 3) + ├── @ DefNode (location: (1,0)-(1,21)) + │ ├── flags: newline + │ ├── name: :f + │ ├── name_loc: (1,4)-(1,5) = "f" + │ ├── receiver: ∅ + │ ├── parameters: + │ │ @ ParametersNode (location: (1,6)-(1,15)) + │ │ ├── flags: ∅ + │ │ ├── requireds: (length: 0) + │ │ ├── optionals: (length: 1) + │ │ │ └── @ OptionalParameterNode (location: (1,6)-(1,15)) + │ │ │ ├── flags: ∅ + │ │ │ ├── name: :x + │ │ │ ├── name_loc: (1,6)-(1,7) = "x" + │ │ │ ├── operator_loc: (1,8)-(1,9) = "=" + │ │ │ └── value: + │ │ │ @ RangeNode (location: (1,10)-(1,15)) + │ │ │ ├── flags: exclude_end + │ │ │ ├── left: ∅ + │ │ │ ├── right: + │ │ │ │ @ StringNode (location: (1,13)-(1,15)) + │ │ │ │ ├── flags: ∅ + │ │ │ │ ├── opening_loc: (1,13)-(1,14) = "?" + │ │ │ │ ├── content_loc: (1,14)-(1,15) = "a" + │ │ │ │ ├── closing_loc: ∅ + │ │ │ │ └── unescaped: "a" + │ │ │ └── operator_loc: (1,10)-(1,13) = "..." + │ │ ├── rest: ∅ + │ │ ├── posts: (length: 0) + │ │ ├── keywords: (length: 0) + │ │ ├── keyword_rest: ∅ + │ │ └── block: ∅ + │ ├── body: ∅ + │ ├── locals: [:x] + │ ├── def_keyword_loc: (1,0)-(1,3) = "def" + │ ├── operator_loc: ∅ + │ ├── lparen_loc: (1,5)-(1,6) = "(" + │ ├── rparen_loc: (1,15)-(1,16) = ")" + │ ├── equal_loc: ∅ + │ └── end_keyword_loc: (1,18)-(1,21) = "end" + ├── @ DefNode (location: (3,0)-(3,20)) + │ ├── flags: newline + │ ├── name: :f + │ ├── name_loc: (3,4)-(3,5) = "f" + │ ├── receiver: ∅ + │ ├── parameters: + │ │ @ ParametersNode (location: (3,6)-(3,14)) + │ │ ├── flags: ∅ + │ │ ├── requireds: (length: 0) + │ │ ├── optionals: (length: 0) + │ │ ├── rest: ∅ + │ │ ├── posts: (length: 0) + │ │ ├── keywords: (length: 1) + │ │ │ └── @ OptionalKeywordParameterNode (location: (3,6)-(3,14)) + │ │ │ ├── flags: ∅ + │ │ │ ├── name: :x + │ │ │ ├── name_loc: (3,6)-(3,8) = "x:" + │ │ │ └── value: + │ │ │ @ RangeNode (location: (3,9)-(3,14)) + │ │ │ ├── flags: exclude_end + │ │ │ ├── left: ∅ + │ │ │ ├── right: + │ │ │ │ @ StringNode (location: (3,12)-(3,14)) + │ │ │ │ ├── flags: ∅ + │ │ │ │ ├── opening_loc: (3,12)-(3,13) = "?" + │ │ │ │ ├── content_loc: (3,13)-(3,14) = "a" + │ │ │ │ ├── closing_loc: ∅ + │ │ │ │ └── unescaped: "a" + │ │ │ └── operator_loc: (3,9)-(3,12) = "..." + │ │ ├── keyword_rest: ∅ + │ │ └── block: ∅ + │ ├── body: ∅ + │ ├── locals: [:x] + │ ├── def_keyword_loc: (3,0)-(3,3) = "def" + │ ├── operator_loc: ∅ + │ ├── lparen_loc: (3,5)-(3,6) = "(" + │ ├── rparen_loc: (3,14)-(3,15) = ")" + │ ├── equal_loc: ∅ + │ └── end_keyword_loc: (3,17)-(3,20) = "end" + └── @ DefNode (location: (5,0)-(5,18)) + ├── flags: newline + ├── name: :f + ├── name_loc: (5,4)-(5,5) = "f" + ├── receiver: ∅ + ├── parameters: ∅ + ├── body: + │ @ StatementsNode (location: (5,8)-(5,13)) + │ ├── flags: ∅ + │ └── body: (length: 1) + │ └── @ RangeNode (location: (5,8)-(5,13)) + │ ├── flags: newline, exclude_end + │ ├── left: ∅ + │ ├── right: + │ │ @ SymbolNode (location: (5,11)-(5,13)) + │ │ ├── flags: static_literal, forced_us_ascii_encoding + │ │ ├── opening_loc: (5,11)-(5,12) = ":" + │ │ ├── value_loc: (5,12)-(5,13) = "a" + │ │ ├── closing_loc: ∅ + │ │ └── unescaped: "a" + │ └── operator_loc: (5,8)-(5,11) = "..." + ├── locals: [] + ├── def_keyword_loc: (5,0)-(5,3) = "def" + ├── operator_loc: ∅ + ├── lparen_loc: (5,5)-(5,6) = "(" + ├── rparen_loc: (5,6)-(5,7) = ")" + ├── equal_loc: ∅ + └── end_keyword_loc: (5,15)-(5,18) = "end" From 75ab01f3b77e61091b0b47a57beeeb2db8a1ffe2 Mon Sep 17 00:00:00 2001 From: Burdette Lamar Date: Wed, 2 Oct 2024 09:55:19 -0500 Subject: [PATCH 614/829] [DOC] Tweaks for Array#last (#11748) --- array.rb | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/array.rb b/array.rb index cf97f5b8503083..866d8877c7ca9c 100644 --- a/array.rb +++ b/array.rb @@ -150,36 +150,29 @@ def first n = unspecified = true end # call-seq: - # array.last -> object or nil - # array.last(n) -> new_array + # last -> last_object or nil + # last(n) -> new_array # - # Returns elements from +self+; +self+ is not modified. + # Returns elements from +self+, or +nil+; +self+ is not modified. # - # When no argument is given, returns the last element: + # With no argument given, returns the last element, or +nil+ if +self+ is empty: # # a = [:foo, 'bar', 2] # a.last # => 2 # a # => [:foo, "bar", 2] + # [].last # => nil # - # If +self+ is empty, returns +nil+. - # - # When non-negative Integer argument +n+ is given, - # returns the last +n+ elements in a new +Array+: - # - # a = [:foo, 'bar', 2] - # a.last(2) # => ["bar", 2] # - # If n >= array.size, returns all elements: + # With non-negative integer argument +n+ is given, + # returns a new array containing the trailing +n+ elements of +self+, as available: # # a = [:foo, 'bar', 2] + # a.last(2) # => ["bar", 2] # a.last(50) # => [:foo, "bar", 2] + # a.last(0) # => [] + # [].last(3) # => [] # - # If n == 0, returns an new empty +Array+: - # - # a = [:foo, 'bar', 2] - # a.last(0) # [] - # - # Related: #first. + # Related: see {Methods for Fetching}[rdoc-ref:Array@Methods+for+Fetching]. def last n = unspecified = true if Primitive.mandatory_only? Primitive.attr! :leaf From a7c04a317f7e16dacab15f2ad9332c86edb0dd5e Mon Sep 17 00:00:00 2001 From: Burdette Lamar Date: Wed, 2 Oct 2024 10:11:29 -0500 Subject: [PATCH 615/829] [DOC] Tweaks for Array#intersection (#11745) --- array.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/array.c b/array.c index cb6d06cc5fcecf..b85069a59973a2 100644 --- a/array.c +++ b/array.c @@ -5624,23 +5624,23 @@ rb_ary_and(VALUE ary1, VALUE ary2) /* * call-seq: - * array.intersection(*other_arrays) -> new_array + * intersection(*other_arrays) -> new_array * - * Returns a new +Array+ containing each element found both in +self+ - * and in all of the given Arrays +other_arrays+; - * duplicates are omitted; items are compared using eql? - * (items must also implement +hash+ correctly): + * Returns a new array containing each element in +self+ that is +#eql?+ + * to at least one element in each of the given +other_arrays+; + * duplicates are omitted: * - * [0, 1, 2, 3].intersection([0, 1, 2], [0, 1, 3]) # => [0, 1] * [0, 0, 1, 1, 2, 3].intersection([0, 1, 2], [0, 1, 3]) # => [0, 1] * - * Preserves order from +self+: + * Each element must correctly implement method #hash. + * + * Order from +self+ is preserved: * * [0, 1, 2].intersection([2, 1, 0]) # => [0, 1, 2] * - * Returns a copy of +self+ if no arguments given. + * Returns a copy of +self+ if no arguments are given. * - * Related: Array#&. + * Related: see {Methods for Combining}[rdoc-ref:Array@Methods+for+Combining]. */ static VALUE From 609fdde2c99ad6b59a05808b96886bb6b71f3b8d Mon Sep 17 00:00:00 2001 From: Burdette Lamar Date: Wed, 2 Oct 2024 10:12:01 -0500 Subject: [PATCH 616/829] [DOC] Tweaks for Array.intersect? (#11744) --- array.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/array.c b/array.c index b85069a59973a2..103658f7830f9e 100644 --- a/array.c +++ b/array.c @@ -5767,19 +5767,16 @@ rb_ary_union_multi(int argc, VALUE *argv, VALUE ary) /* * call-seq: - * ary.intersect?(other_ary) -> true or false + * intersect?(other_array) -> true or false * - * Returns +true+ if the array and +other_ary+ have at least one element in - * common, otherwise returns +false+: + * Returns whether +other_array+ has at least one element that is +#eql?+ to some element of +self+: * - * a = [ 1, 2, 3 ] - * b = [ 3, 4, 5 ] - * c = [ 5, 6, 7 ] - * a.intersect?(b) #=> true - * a.intersect?(c) #=> false + * [1, 2, 3].intersect?([3, 4, 5]) # => true + * [1, 2, 3].intersect?([4, 5, 6]) # => false * - * +Array+ elements are compared using eql? - * (items must also implement +hash+ correctly). + * Each element must correctly implement method #hash. + * + * Related: see {Methods for Querying}[rdoc-ref:Array@Methods+for+Querying]. */ static VALUE From 2610bf01b26b437df6a3634ffb7629b83ea57e17 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Wed, 2 Oct 2024 11:16:52 -0400 Subject: [PATCH 617/829] [ruby/prism] Fix up doubled range in arguments https://github.com/ruby/prism/commit/aee2de91a3 --- prism/prism.c | 14 ++++++++++++-- test/prism/errors/range_doubled.txt | 3 +++ 2 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 test/prism/errors/range_doubled.txt diff --git a/prism/prism.c b/prism/prism.c index 7b4b7828fdbc65..03479b17b0202d 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -14203,10 +14203,20 @@ parse_arguments(pm_parser_t *parser, pm_arguments_t *arguments, bool accepts_for parser_lex(parser); if (token_begins_expression_p(parser->current.type)) { - // If the token begins an expression then this ... was not actually - // argument forwarding but was instead a range. + // If the token begins an expression then this ... was + // not actually argument forwarding but was instead a + // range. pm_token_t operator = parser->previous; pm_node_t *right = parse_expression(parser, PM_BINDING_POWER_RANGE, false, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1)); + + // If we parse a range, we need to validate that we + // didn't accidentally violate the nonassoc rules of the + // ... operator. + if (PM_NODE_TYPE_P(right, PM_RANGE_NODE)) { + pm_range_node_t *range = (pm_range_node_t *) right; + pm_parser_err(parser, range->operator_loc.start, range->operator_loc.end, PM_ERR_UNEXPECTED_RANGE_OPERATOR); + } + argument = (pm_node_t *) pm_range_node_create(parser, NULL, &operator, right); } else { pm_parser_scope_forwarding_all_check(parser, &parser->previous); diff --git a/test/prism/errors/range_doubled.txt b/test/prism/errors/range_doubled.txt new file mode 100644 index 00000000000000..ef63d1bedea27e --- /dev/null +++ b/test/prism/errors/range_doubled.txt @@ -0,0 +1,3 @@ +p(...1...) + ^~~ unexpected range operator; .. and ... are non-associative and cannot be chained + From bf8a8820baeff59d507ce7d32a2f52e46500733f Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Wed, 2 Oct 2024 09:58:58 -0400 Subject: [PATCH 618/829] Deduplicate RGENGC_CHECK_MODE into gc/gc.h --- gc.c | 4 ---- gc/default.c | 12 ------------ gc/gc.h | 12 ++++++++++++ 3 files changed, 12 insertions(+), 16 deletions(-) diff --git a/gc.c b/gc.c index f4d4e137ae41e3..0f50974017a70e 100644 --- a/gc.c +++ b/gc.c @@ -354,10 +354,6 @@ void rb_vm_update_references(void *ptr); int ruby_gc_debug_indent = 0; #endif -#ifndef RGENGC_CHECK_MODE -# define RGENGC_CHECK_MODE 0 -#endif - #ifndef RGENGC_OBJ_INFO # define RGENGC_OBJ_INFO RGENGC_CHECK_MODE #endif diff --git a/gc/default.c b/gc/default.c index 01021b72776ee4..e1f30f10674f27 100644 --- a/gc/default.c +++ b/gc/default.c @@ -236,18 +236,6 @@ static ruby_gc_params_t gc_params = { #endif int ruby_rgengc_debug; -/* RGENGC_CHECK_MODE - * 0: disable all assertions - * 1: enable assertions (to debug RGenGC) - * 2: enable internal consistency check at each GC (for debugging) - * 3: enable internal consistency check at each GC steps (for debugging) - * 4: enable liveness check - * 5: show all references - */ -#ifndef RGENGC_CHECK_MODE -# define RGENGC_CHECK_MODE 0 -#endif - /* RGENGC_PROFILE * 0: disable RGenGC profiling * 1: enable profiling for basic information diff --git a/gc/gc.h b/gc/gc.h index f0c8d8bbdd0de5..9116822e812226 100644 --- a/gc/gc.h +++ b/gc/gc.h @@ -49,6 +49,18 @@ void rb_ractor_finish_marking(void); // -------------------Private section begin------------------------ // Functions in this section are private to the default GC and gc.c +/* RGENGC_CHECK_MODE + * 0: disable all assertions + * 1: enable assertions (to debug RGenGC) + * 2: enable internal consistency check at each GC (for debugging) + * 3: enable internal consistency check at each GC steps (for debugging) + * 4: enable liveness check + * 5: show all references + */ +#ifndef RGENGC_CHECK_MODE +# define RGENGC_CHECK_MODE 0 +#endif + #ifndef GC_ASSERT # define GC_ASSERT(expr) RUBY_ASSERT_MESG_WHEN(RGENGC_CHECK_MODE > 0, expr, #expr) #endif From 99620b98ba5a9e24a4996794441e1806af66908e Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Thu, 3 Oct 2024 01:02:18 +0900 Subject: [PATCH 619/829] fake.rb: Copy options in RUBY_DESCRIPTION to the fake string The `RUBY_DESCRIPTION_WITH` macro has been removed already, so there are no more descriptions strings with rjit/yjit enabled. --- template/fake.rb.in | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/template/fake.rb.in b/template/fake.rb.in index 5e52d955948455..c4bd21af53596e 100644 --- a/template/fake.rb.in +++ b/template/fake.rb.in @@ -24,9 +24,8 @@ File.read(File.join(arg['srcdir'], 'version.c')). scan(/rb_define_global_const\("(RUBY_\w+)",[^;]*?\bMK(?:INT|(STR))\(([^()]*)\)/m) do |n, s, v| version[n] = arg[v] || src.value(v) || (s ? v : 0) end -arg['RUBY_DESCRIPTION_WITH_RJIT'] = src.value('description_with_rjit') || 'description_with_rjit' -arg['RUBY_DESCRIPTION_WITH_YJIT'] = src.value('description_with_yjit') || 'description_with_yjit' -%>baseruby="<%=arg['BASERUBY']%>" +-%> +baseruby="<%=arg['BASERUBY']%>" _\ =begin _= @@ -39,16 +38,14 @@ exec $ruby "$r" "$@" class Object remove_const :CROSS_COMPILING if defined?(CROSS_COMPILING) CROSS_COMPILING = RUBY_PLATFORM + options = remove_const(:RUBY_DESCRIPTION)[/( \+[^\[\]\+]+)*(?= \[\S+\]\z)/] constants.grep(/^RUBY_/) {|n| remove_const n} % arg['versions'].each {|n, v| - <%=n%> = <%if n=='RUBY_DESCRIPTION' %>case - when RubyVM.const_defined?(:RJIT) && RubyVM::RJIT.enabled? - <%=arg['RUBY_DESCRIPTION_WITH_RJIT'].inspect%> - when RubyVM.const_defined?(:YJIT) && RubyVM::YJIT.enabled? - <%=arg['RUBY_DESCRIPTION_WITH_YJIT'].inspect%> - else - <%=v.inspect%> - end<%else%><%=v.inspect%><%end%> + <%=n%> = <%if n=='RUBY_DESCRIPTION' + v1, v2 = v.split(/(?= \[\S+\]\z)/) + %><%=v1.dump.chomp('"')%>#{options}<%= + v2.dump[1..-1]%>.freeze<% + else%><%=v.inspect%><%end%> % } end builddir = File.dirname(File.expand_path(__FILE__)) From 9f47f0eb3cd8a67b1a5708cbd3d105b5388af485 Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Wed, 2 Oct 2024 11:12:09 -0500 Subject: [PATCH 620/829] [DOC] Tweaks for Array#length --- array.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/array.c b/array.c index 103658f7830f9e..fca9976c57aaaa 100644 --- a/array.c +++ b/array.c @@ -2725,9 +2725,15 @@ rb_ary_reverse_each(VALUE ary) /* * call-seq: - * array.length -> an_integer + * length -> integer + * size -> integer * - * Returns the count of elements in +self+. + * Returns the count of elements in +self+: + * + * [0, 1, 2].length # => 3 + * [].length # => 0 + * + * Related: see {Methods for Querying}[rdoc-ref:Array@Methods+for+Querying]. */ static VALUE From 8f4277f40594333a7dcad21fe0ef9138a909e777 Mon Sep 17 00:00:00 2001 From: tomoya ishida Date: Thu, 3 Oct 2024 02:36:30 +0900 Subject: [PATCH 621/829] [ruby/reline] Add a timeout to cursor_pos (https://github.com/ruby/reline/pull/750) https://github.com/ruby/reline/commit/dd4a654e5d --- lib/reline.rb | 4 +-- lib/reline/io/ansi.rb | 49 +++++++++++++++---------------------- lib/reline/io/dumb.rb | 2 +- test/reline/test_reline.rb | 35 ++++++++++++++++++++++++++ test/reline/test_unicode.rb | 2 +- 5 files changed, 59 insertions(+), 33 deletions(-) diff --git a/lib/reline.rb b/lib/reline.rb index ddb0224180cb1f..4ba74d2cb2965c 100644 --- a/lib/reline.rb +++ b/lib/reline.rb @@ -412,7 +412,7 @@ def ambiguous_width end private def may_req_ambiguous_char_width - @ambiguous_width = 2 if io_gate.dumb? || !STDIN.tty? || !STDOUT.tty? + @ambiguous_width = 1 if io_gate.dumb? || !STDIN.tty? || !STDOUT.tty? return if defined? @ambiguous_width io_gate.move_cursor_column(0) begin @@ -421,7 +421,7 @@ def ambiguous_width # LANG=C @ambiguous_width = 1 else - @ambiguous_width = io_gate.cursor_pos.x + @ambiguous_width = io_gate.cursor_pos.x == 2 ? 2 : 1 end io_gate.move_cursor_column(0) io_gate.erase_after_cursor diff --git a/lib/reline/io/ansi.rb b/lib/reline/io/ansi.rb index a730a953f775dd..82d2ee23717c1e 100644 --- a/lib/reline/io/ansi.rb +++ b/lib/reline/io/ansi.rb @@ -245,39 +245,30 @@ def set_screen_size(rows, columns) self end - def cursor_pos - if both_tty? - res = +'' - m = nil - @input.raw do |stdin| - @output << "\e[6n" - @output.flush - loop do - c = stdin.getc - next if c.nil? - res << c - m = res.match(/\e\[(?\d+);(?\d+)R/) - break if m - end - (m.pre_match + m.post_match).chars.reverse_each do |ch| - stdin.ungetc ch + private def cursor_pos_internal(timeout:) + match = nil + @input.raw do |stdin| + @output << "\e[6n" + @output.flush + timeout_at = Time.now + timeout + buf = +'' + while (wait = timeout_at - Time.now) > 0 && stdin.wait_readable(wait) + buf << stdin.readpartial(1024) + if (match = buf.match(/\e\[(?\d+);(?\d+)R/)) + buf = match.pre_match + match.post_match + break end end - column = m[:column].to_i - 1 - row = m[:row].to_i - 1 - else - begin - buf = @output.pread(@output.pos, 0) - row = buf.count("\n") - column = buf.rindex("\n") ? (buf.size - buf.rindex("\n")) - 1 : 0 - rescue Errno::ESPIPE, IOError - # Just returns column 1 for ambiguous width because this I/O is not - # tty and can't seek. - row = 0 - column = 1 + buf.chars.reverse_each do |ch| + stdin.ungetc ch end end - Reline::CursorPos.new(column, row) + [match[:column].to_i - 1, match[:row].to_i - 1] if match + end + + def cursor_pos + col, row = cursor_pos_internal(timeout: 0.5) if both_tty? + Reline::CursorPos.new(col || 0, row || 0) end def both_tty? diff --git a/lib/reline/io/dumb.rb b/lib/reline/io/dumb.rb index 6ed69ffdfa997e..6a10af4fef8c37 100644 --- a/lib/reline/io/dumb.rb +++ b/lib/reline/io/dumb.rb @@ -60,7 +60,7 @@ def get_screen_size end def cursor_pos - Reline::CursorPos.new(1, 1) + Reline::CursorPos.new(0, 0) end def hide_cursor diff --git a/test/reline/test_reline.rb b/test/reline/test_reline.rb index 515805467d7e00..22437eef9b5967 100644 --- a/test/reline/test_reline.rb +++ b/test/reline/test_reline.rb @@ -1,6 +1,10 @@ require_relative 'helper' require 'reline' require 'stringio' +begin + require "pty" +rescue LoadError # some platforms don't support PTY +end class Reline::Test < Reline::TestCase class DummyCallbackObject @@ -432,6 +436,37 @@ def win? /mswin|mingw/.match?(RUBY_PLATFORM) end + def test_tty_amibuous_width + omit unless defined?(PTY) + ruby_file = Tempfile.create('rubyfile') + ruby_file.write(<<~RUBY) + require 'reline' + Thread.new { sleep 2; puts 'timeout'; exit } + p [Reline.ambiguous_width, gets.chomp] + RUBY + ruby_file.close + lib = File.expand_path('../../lib', __dir__) + cmd = [{ 'TERM' => 'xterm' }, 'ruby', '-I', lib, ruby_file.to_path] + + # Calculate ambiguous width from cursor position + [1, 2].each do |ambiguous_width| + PTY.spawn(*cmd) do |r, w, pid| + loop { break if r.readpartial(1024).include?("\e[6n") } + w.puts "hello\e[10;#{ambiguous_width + 1}Rworld" + assert_include(r.gets, [ambiguous_width, 'helloworld'].inspect) + Process.waitpid pid + end + end + + # Ambiguous width = 1 when cursor pos timed out + PTY.spawn(*cmd) do |r, w, pid| + loop { break if r.readpartial(1024).include?("\e[6n") } + w.puts "hello\e[10;2Sworld" + assert_include(r.gets, [1, "hello\e[10;2Sworld"].inspect) + Process.waitpid pid + end + end + def get_reline_encoding if encoding = Reline.core.encoding encoding diff --git a/test/reline/test_unicode.rb b/test/reline/test_unicode.rb index 688d25e2387780..6aea8df9bb71c3 100644 --- a/test/reline/test_unicode.rb +++ b/test/reline/test_unicode.rb @@ -15,7 +15,7 @@ def test_get_mbchar_width end def test_ambiguous_width - assert_equal 2, Reline::Unicode.calculate_width('√', true) + assert_equal 1, Reline::Unicode.calculate_width('√', true) end def test_csi_regexp From 09761e4789d04eff1f407dcb9afcc2f5f93b541f Mon Sep 17 00:00:00 2001 From: tomoya ishida Date: Thu, 3 Oct 2024 02:46:59 +0900 Subject: [PATCH 622/829] [ruby/reline] Fix incremental search cancel bug (https://github.com/ruby/reline/pull/748) https://github.com/ruby/reline/commit/bf0f8fa333 --- lib/reline/line_editor.rb | 64 ++++++++--------------------- test/reline/test_key_actor_emacs.rb | 23 +++++++++++ 2 files changed, 41 insertions(+), 46 deletions(-) diff --git a/lib/reline/line_editor.rb b/lib/reline/line_editor.rb index 56dc235c030362..b8156597135430 100644 --- a/lib/reline/line_editor.rb +++ b/lib/reline/line_editor.rb @@ -1665,57 +1665,29 @@ def finish end private def incremental_search_history(key) - unless @history_pointer - @line_backup_in_history = whole_buffer - end + backup = @buffer_of_lines.dup, @line_index, @byte_pointer, @history_pointer, @line_backup_in_history searcher = generate_searcher(key) @searching_prompt = "(reverse-i-search)`': " termination_keys = ["\C-j".ord] - termination_keys.concat(@config.isearch_terminators&.chars&.map(&:ord)) if @config.isearch_terminators + termination_keys.concat(@config.isearch_terminators.chars.map(&:ord)) if @config.isearch_terminators @waiting_proc = ->(k) { - case k - when *termination_keys - if @history_pointer - buffer = Reline::HISTORY[@history_pointer] - else - buffer = @line_backup_in_history - end - @buffer_of_lines = buffer.split("\n") - @buffer_of_lines = [String.new(encoding: @encoding)] if @buffer_of_lines.empty? - @line_index = @buffer_of_lines.size - 1 + chr = k.is_a?(String) ? k : k.chr(Encoding::ASCII_8BIT) + if k == "\C-g".ord + # cancel search and restore buffer + @buffer_of_lines, @line_index, @byte_pointer, @history_pointer, @line_backup_in_history = backup @searching_prompt = nil @waiting_proc = nil - @byte_pointer = 0 - when "\C-g".ord - @buffer_of_lines = @line_backup_in_history.split("\n") - @buffer_of_lines = [String.new(encoding: @encoding)] if @buffer_of_lines.empty? - @line_index = @buffer_of_lines.size - 1 - move_history(nil, line: :end, cursor: :end, save_buffer: false) + elsif !termination_keys.include?(k) && (chr.match?(/[[:print:]]/) || k == "\C-h".ord || k == "\C-?".ord || k == "\C-r".ord || k == "\C-s".ord) + search_word, prompt_name, hit_pointer = searcher.call(k) + Reline.last_incremental_search = search_word + @searching_prompt = "(%s)`%s'" % [prompt_name, search_word] + @searching_prompt += ': ' unless @is_multiline + move_history(hit_pointer, line: :end, cursor: :end) if hit_pointer + else + # terminaton_keys and other keys will terminalte + move_history(@history_pointer, line: :end, cursor: :start) @searching_prompt = nil @waiting_proc = nil - @byte_pointer = 0 - else - chr = k.is_a?(String) ? k : k.chr(Encoding::ASCII_8BIT) - if chr.match?(/[[:print:]]/) or k == "\C-h".ord or k == "\C-?".ord or k == "\C-r".ord or k == "\C-s".ord - search_word, prompt_name, hit_pointer = searcher.call(k) - Reline.last_incremental_search = search_word - @searching_prompt = "(%s)`%s'" % [prompt_name, search_word] - @searching_prompt += ': ' unless @is_multiline - move_history(hit_pointer, line: :end, cursor: :end, save_buffer: false) if hit_pointer - else - if @history_pointer - line = Reline::HISTORY[@history_pointer] - else - line = @line_backup_in_history - end - @line_backup_in_history = whole_buffer - @buffer_of_lines = line.split("\n") - @buffer_of_lines = [String.new(encoding: @encoding)] if @buffer_of_lines.empty? - @line_index = @buffer_of_lines.size - 1 - @searching_prompt = nil - @waiting_proc = nil - @byte_pointer = 0 - end end } end @@ -1770,14 +1742,14 @@ def finish end alias_method :history_search_forward, :ed_search_next_history - private def move_history(history_pointer, line:, cursor:, save_buffer: true) + private def move_history(history_pointer, line:, cursor:) history_pointer ||= Reline::HISTORY.size return if history_pointer < 0 || history_pointer > Reline::HISTORY.size old_history_pointer = @history_pointer || Reline::HISTORY.size if old_history_pointer == Reline::HISTORY.size - @line_backup_in_history = save_buffer ? whole_buffer : '' + @line_backup_in_history = whole_buffer else - Reline::HISTORY[old_history_pointer] = whole_buffer if save_buffer + Reline::HISTORY[old_history_pointer] = whole_buffer end if history_pointer == Reline::HISTORY.size buf = @line_backup_in_history diff --git a/test/reline/test_key_actor_emacs.rb b/test/reline/test_key_actor_emacs.rb index 4dddf9c8907ded..dc12c803f57787 100644 --- a/test/reline/test_key_actor_emacs.rb +++ b/test/reline/test_key_actor_emacs.rb @@ -1328,6 +1328,29 @@ def test_incremental_search_history_cancel_by_symbol_key assert_line_around_cursor('abd', 'c') end + def test_incremental_search_history_saves_and_restores_last_input + Reline::HISTORY.concat(['abc', '123']) + input_keys("abcd") + # \C-j: terminate incremental search + input_keys("\C-r12\C-j") + assert_line_around_cursor('', '123') + input_key_by_symbol(:ed_next_history) + assert_line_around_cursor('abcd', '') + # Most non-printable keys also terminates incremental search + input_keys("\C-r12\C-i") + assert_line_around_cursor('', '123') + input_key_by_symbol(:ed_next_history) + assert_line_around_cursor('abcd', '') + # \C-g: cancel incremental search and restore input, cursor position and history index + input_key_by_symbol(:ed_prev_history) + input_keys("\C-b\C-b") + assert_line_around_cursor('1', '23') + input_keys("\C-rab\C-g") + assert_line_around_cursor('1', '23') + input_key_by_symbol(:ed_next_history) + assert_line_around_cursor('abcd', '') + end + # Unicode emoji test def test_ed_insert_for_include_zwj_emoji omit "This test is for UTF-8 but the locale is #{Reline.core.encoding}" if Reline.core.encoding != Encoding::UTF_8 From 2f5ab4c4b8cea493022655577f70eb5d0256c64e Mon Sep 17 00:00:00 2001 From: Alan Wu Date: Wed, 2 Oct 2024 13:47:35 -0400 Subject: [PATCH 623/829] YJIT: Merge `impl VALUE` blocks [ci skip] Reported by Kevin Menard. --- yjit/src/cruby.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/yjit/src/cruby.rs b/yjit/src/cruby.rs index 0709e2a0797913..702aaf51bc4e7c 100644 --- a/yjit/src/cruby.rs +++ b/yjit/src/cruby.rs @@ -541,9 +541,7 @@ impl VALUE { ptr } -} -impl VALUE { pub fn fixnum_from_usize(item: usize) -> Self { assert!(item <= (RUBY_FIXNUM_MAX as usize)); // An unsigned will always be greater than RUBY_FIXNUM_MIN let k: usize = item.wrapping_add(item.wrapping_add(1)); From 253b76ec0a628b1dbf7529f19a7843595e700568 Mon Sep 17 00:00:00 2001 From: Burdette Lamar Date: Wed, 2 Oct 2024 12:54:12 -0500 Subject: [PATCH 624/829] [DOC] Tweaks for Array#max (#11768) --- array.c | 47 ++++++++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/array.c b/array.c index fca9976c57aaaa..d68895827dd4dc 100644 --- a/array.c +++ b/array.c @@ -5916,42 +5916,51 @@ ary_max_opt_string(VALUE ary, long i, VALUE vmax) /* * call-seq: - * array.max -> element - * array.max {|a, b| ... } -> element - * array.max(n) -> new_array - * array.max(n) {|a, b| ... } -> new_array + * max -> element + * max(n) -> new_array + * max {|a, b| ... } -> element + * max(n) {|a, b| ... } -> new_array * * Returns one of the following: * * - The maximum-valued element from +self+. - * - A new +Array+ of maximum-valued elements selected from +self+. + * - A new array of maximum-valued elements from +self+. * - * When no block is given, each element in +self+ must respond to method <=> - * with an Integer. + * Does not modify +self+. + * + * With no block given, each element in +self+ must respond to method #<=> + * with a numeric. * * With no argument and no block, returns the element in +self+ * having the maximum value per method <=>: * - * [0, 1, 2].max # => 2 + * [1, 0, 3, 2].max # => 3 * - * With an argument Integer +n+ and no block, returns a new +Array+ with at most +n+ elements, - * in descending order per method <=>: + * With non-negative numeric argument +n+ and no block, + * returns a new array with at most +n+ elements, + * in descending order, per method <=>: * - * [0, 1, 2, 3].max(3) # => [3, 2, 1] - * [0, 1, 2, 3].max(6) # => [3, 2, 1, 0] + * [1, 0, 3, 2].max(3) # => [3, 2, 1] + * [1, 0, 3, 2].max(3.0) # => [3, 2, 1] + * [1, 0, 3, 2].max(9) # => [3, 2, 1, 0] + * [1, 0, 3, 2].max(0) # => [] * - * When a block is given, the block must return an Integer. + * With a block given, the block must return a numeric. * - * With a block and no argument, calls the block self.size-1 times to compare elements; - * returns the element having the maximum value per the block: + * With a block and no argument, calls the block self.size - 1 times to compare elements; + * returns the element having the maximum return value from the block: * - * ['0', '00', '000'].max {|a, b| a.size <=> b.size } # => "000" + * ['0', '', '000', '00'].max {|a, b| a.size <=> b.size } + * # => "000" * - * With an argument +n+ and a block, returns a new +Array+ with at most +n+ elements, - * in descending order per the block: + * With non-negative numeric argument +n+ and a block, + * returns a new array with at most +n+ elements, + * in descending order, per the block: * - * ['0', '00', '000'].max(2) {|a, b| a.size <=> b.size } # => ["000", "00"] + * ['0', '', '000', '00'].max(2) {|a, b| a.size <=> b.size } + * # => ["000", "00"] * + * Related: see {Methods for Fetching}[rdoc-ref:Array@Methods+for+Fetching]. */ static VALUE rb_ary_max(int argc, VALUE *argv, VALUE ary) From 77056674a048986257a3370862c255bc7363b610 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Wed, 2 Oct 2024 14:28:01 -0400 Subject: [PATCH 625/829] [ruby/prism] Fix up binding power for singleton method receiver https://github.com/ruby/prism/commit/f29ceae5cf --- prism/prism.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prism/prism.c b/prism/prism.c index 03479b17b0202d..ec75e9215f7835 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -19218,7 +19218,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b parser_lex(parser); pm_token_t lparen = parser->previous; - pm_node_t *expression = parse_value_expression(parser, PM_BINDING_POWER_STATEMENT, true, false, PM_ERR_DEF_RECEIVER, (uint16_t) (depth + 1)); + pm_node_t *expression = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, false, PM_ERR_DEF_RECEIVER, (uint16_t) (depth + 1)); accept1(parser, PM_TOKEN_NEWLINE); expect1(parser, PM_TOKEN_PARENTHESIS_RIGHT, PM_ERR_EXPECT_RPAREN); From e7cf2e76398fb226bf87a80ca72599e0b621f668 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Wed, 2 Oct 2024 14:44:57 -0400 Subject: [PATCH 626/829] [DOC] Fix indentation in documentation for Array#sort! --- array.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/array.c b/array.c index d68895827dd4dc..ffdae09e5252f6 100644 --- a/array.c +++ b/array.c @@ -4489,10 +4489,10 @@ take_items(VALUE obj, long n) * * If an argument is not an array, it extracts the values by calling #each: * - * a = [:a0, :a1, :a2, :a2] - * b = 1..4 - * c = a.zip(b) - * c # => [[:a0, 1], [:a1, 2], [:a2, 3], [:a2, 4]] + * a = [:a0, :a1, :a2, :a2] + * b = 1..4 + * c = a.zip(b) + * c # => [[:a0, 1], [:a1, 2], [:a2, 3], [:a2, 4]] * * When a block is given, calls the block with each of the sub-arrays (formed as above); returns +nil+: * From d3e2d23c60ce4a91ff402aaac36b1072962f632d Mon Sep 17 00:00:00 2001 From: Matt Valentine-House Date: Wed, 2 Oct 2024 19:49:16 +0100 Subject: [PATCH 627/829] Fix compilation when RGENGC_CHECK_MODE >= 4 the mark_function_data callback was moved from the ractor to the VM. --- gc/default.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/gc/default.c b/gc/default.c index e1f30f10674f27..81e49c3171b4b8 100644 --- a/gc/default.c +++ b/gc/default.c @@ -4832,10 +4832,10 @@ allrefs_roots_i(VALUE obj, void *ptr) } } #define PUSH_MARK_FUNC_DATA(v) do { \ - struct gc_mark_func_data_struct *prev_mark_func_data = GET_RACTOR()->mfd; \ - GET_RACTOR()->mfd = (v); + struct gc_mark_func_data_struct *prev_mark_func_data = GET_VM()->gc.mark_func_data; \ + GET_VM()->gc.mark_func_data = (v); -#define POP_MARK_FUNC_DATA() GET_RACTOR()->mfd = prev_mark_func_data;} while (0) +#define POP_MARK_FUNC_DATA() GET_VM()->gc.mark_func_data = prev_mark_func_data;} while (0) static st_table * objspace_allrefs(rb_objspace_t *objspace) @@ -4855,7 +4855,7 @@ objspace_allrefs(rb_objspace_t *objspace) /* traverse root objects */ PUSH_MARK_FUNC_DATA(&mfd); - GET_RACTOR()->mfd = &mfd; + GET_VM()->gc.mark_func_data = &mfd; mark_roots(objspace, &data.category); POP_MARK_FUNC_DATA(); @@ -4913,7 +4913,7 @@ gc_check_after_marks_i(st_data_t k, st_data_t v, st_data_t ptr) rb_objspace_t *objspace = (rb_objspace_t *)ptr; /* object should be marked or oldgen */ - if (!RVALUE_MARKED(obj)) { + if (!RVALUE_MARKED(objspace, obj)) { fprintf(stderr, "gc_check_after_marks_i: %s is not marked and not oldgen.\n", rb_obj_info(obj)); fprintf(stderr, "gc_check_after_marks_i: %p is referred from ", (void *)obj); reflist_dump(refs); From e77346153d68bb3846db07e213fc90567af76326 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Wed, 2 Oct 2024 12:32:33 +0200 Subject: [PATCH 628/829] [rubygems/rubygems] Remove compatibility code with old RubyGems https://github.com/rubygems/rubygems/commit/f11e42a3c5 --- lib/bundler.rb | 2 +- lib/bundler/rubygems_integration.rb | 8 -------- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/lib/bundler.rb b/lib/bundler.rb index 72cbbe140de529..a195405fd9c210 100644 --- a/lib/bundler.rb +++ b/lib/bundler.rb @@ -577,7 +577,7 @@ def load_plugins(definition = Bundler.definition) requested_path_gems = definition.requested_specs.select {|s| s.source.is_a?(Source::Path) } path_plugin_files = requested_path_gems.map do |spec| - Bundler.rubygems.spec_matches_for_glob(spec, "rubygems_plugin#{Bundler.rubygems.suffix_pattern}") + spec.matches_for_glob("rubygems_plugin#{Bundler.rubygems.suffix_pattern}") rescue TypeError error_message = "#{spec.name} #{spec.version} has an invalid gemspec" raise Gem::InvalidSpecificationException, error_message diff --git a/lib/bundler/rubygems_integration.rb b/lib/bundler/rubygems_integration.rb index b98d3b7b8cc746..7abaa236ed673d 100644 --- a/lib/bundler/rubygems_integration.rb +++ b/lib/bundler/rubygems_integration.rb @@ -70,14 +70,6 @@ def spec_missing_extensions?(spec, default = true) default end - def spec_matches_for_glob(spec, glob) - return spec.matches_for_glob(glob) if spec.respond_to?(:matches_for_glob) - - spec.load_paths.flat_map do |lp| - Dir["#{lp}/#{glob}#{suffix_pattern}"] - end - end - def stub_set_spec(stub, spec) stub.instance_variable_set(:@spec, spec) end From 8877e9d922e159a9d121d5dc7e6d324f59a8b0ad Mon Sep 17 00:00:00 2001 From: Soutaro Matsumoto Date: Wed, 2 Oct 2024 22:09:18 +0900 Subject: [PATCH 629/829] Update rbs test --- gems/bundled_gems | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gems/bundled_gems b/gems/bundled_gems index e89f54752a9db4..55696e8435b7ca 100644 --- a/gems/bundled_gems +++ b/gems/bundled_gems @@ -18,7 +18,7 @@ net-pop 0.1.2 https://github.com/ruby/net-pop net-smtp 0.5.0 https://github.com/ruby/net-smtp matrix 0.4.2 https://github.com/ruby/matrix prime 0.1.2 https://github.com/ruby/prime -rbs 3.6.0 https://github.com/ruby/rbs +rbs 3.6.0 https://github.com/ruby/rbs 1e16fcdcc9bb88a5fdcf3fc6bec8a0b566c13877 typeprof 0.21.11 https://github.com/ruby/typeprof 167263ca3a634b61df0445f1a6b3e259a5d47f94 debug 1.9.2 https://github.com/ruby/debug racc 1.8.1 https://github.com/ruby/racc From e5c26b0f3222a499ccf1b7dddb1e61fb685d1a0a Mon Sep 17 00:00:00 2001 From: Soutaro Matsumoto Date: Wed, 2 Oct 2024 22:10:39 +0900 Subject: [PATCH 630/829] Stop skipping broken tests --- tool/rbs_skip_tests | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/tool/rbs_skip_tests b/tool/rbs_skip_tests index 14e49aa4fb9396..650d1828d5b983 100644 --- a/tool/rbs_skip_tests +++ b/tool/rbs_skip_tests @@ -77,13 +77,3 @@ test_merge_types(RBS::RuntimePrototypeTest) test_reflection(RBS::RuntimePrototypeTest) test_todo(RBS::RuntimePrototypeTest) test_of(RubyVM::AbstractSyntaxTreeSingletonTest) - -# rbs-3.6.0 and Ruby 3.4.0dev: IOError: closed stream - -test_spawn(PTYSingletonTest) -test_getpty(PTYSingletonTest) -test_check(PTYSingletonTest) -test_width_for(PPSingletonTest) -test_singleline_pp(PPSingletonTest) -test_singleline_pp(PPSingletonTest) -test_capture2e(Open3SingletonTest) From 75c4ac3395f609cad55a0e30a59d61ecfd092952 Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Thu, 3 Oct 2024 15:33:48 +1300 Subject: [PATCH 631/829] Update `IO::Buffer` documentation. (#11737) Update documentation. --- io_buffer.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/io_buffer.c b/io_buffer.c index cc76f12ecc070a..211663b7b0f518 100644 --- a/io_buffer.c +++ b/io_buffer.c @@ -1568,7 +1568,7 @@ rb_io_buffer_slice(struct rb_io_buffer *buffer, VALUE self, size_t offset, size_ * buffer's bounds. * * string = 'test' - * buffer = IO::Buffer.for(string) + * buffer = IO::Buffer.for(string).dup * * slice = buffer.slice * # => @@ -1595,12 +1595,8 @@ rb_io_buffer_slice(struct rb_io_buffer *buffer, VALUE self, size_t offset, size_ * # it is also visible at position 1 of the original buffer * buffer * # => - * # # + * # # * # 0x00000000 74 6f 73 74 tost - * - * # ...and original string - * string - * # => tost */ static VALUE io_buffer_slice(int argc, VALUE *argv, VALUE self) @@ -2443,10 +2439,11 @@ rb_io_buffer_initialize_copy(VALUE self, VALUE source) * * #copy can be used to put buffer into strings associated with buffer: * - * string= "data: " + * string = "data: " * # => "data: " - * buffer = IO::Buffer.for(string) - * buffer.copy(IO::Buffer.for("test"), 5) + * buffer = IO::Buffer.for(string) do |buffer| + * buffer.copy(IO::Buffer.for("test"), 5) + * end * # => 4 * string * # => "data:test" @@ -2590,29 +2587,29 @@ rb_io_buffer_clear(VALUE self, uint8_t value, size_t offset, size_t length) * Fill buffer with +value+, starting with +offset+ and going for +length+ * bytes. * - * buffer = IO::Buffer.for('test') + * buffer = IO::Buffer.for('test').dup * # => - * # + * # * # 0x00000000 74 65 73 74 test * * buffer.clear * # => - * # + * # * # 0x00000000 00 00 00 00 .... * * buf.clear(1) # fill with 1 * # => - * # + * # * # 0x00000000 01 01 01 01 .... * * buffer.clear(2, 1, 2) # fill with 2, starting from offset 1, for 2 bytes * # => - * # + * # * # 0x00000000 01 02 02 01 .... * * buffer.clear(2, 1) # fill with 2, starting from offset 1 * # => - * # + * # * # 0x00000000 01 02 02 02 .... */ static VALUE From 9bd2f30d0a73e5fd01aa80cfb5fd1c61b9ef64ff Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Thu, 3 Oct 2024 12:16:36 +0900 Subject: [PATCH 632/829] [ruby/reline] Fix FD leaks (https://github.com/ruby/reline/pull/752) `PTY.spawn` with a block detaches the spawned process and leaves it running in background even after exiting the given block. It is the responsibility of the caller to clean up the yielded IOs and PID. https://github.com/ruby/ruby/actions/runs/11148759246/job/30986064044#step:13:950 ``` Leaked file descriptor: Reline::Test#test_tty_amibuous_width: 9 : # Leaked file descriptor: Reline::Test#test_tty_amibuous_width: 10 : # Leaked file descriptor: Reline::Test#test_tty_amibuous_width: 11 : # Leaked file descriptor: Reline::Test#test_tty_amibuous_width: 12 : # Leaked file descriptor: Reline::Test#test_tty_amibuous_width: 13 : # Leaked file descriptor: Reline::Test#test_tty_amibuous_width: 14 : # ``` https://github.com/ruby/reline/commit/f9f90da9e4 --- test/reline/test_reline.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/reline/test_reline.rb b/test/reline/test_reline.rb index 22437eef9b5967..4134beac808733 100644 --- a/test/reline/test_reline.rb +++ b/test/reline/test_reline.rb @@ -454,6 +454,9 @@ def test_tty_amibuous_width loop { break if r.readpartial(1024).include?("\e[6n") } w.puts "hello\e[10;#{ambiguous_width + 1}Rworld" assert_include(r.gets, [ambiguous_width, 'helloworld'].inspect) + ensure + r.close + w.close Process.waitpid pid end end @@ -463,6 +466,9 @@ def test_tty_amibuous_width loop { break if r.readpartial(1024).include?("\e[6n") } w.puts "hello\e[10;2Sworld" assert_include(r.gets, [1, "hello\e[10;2Sworld"].inspect) + ensure + r.close + w.close Process.waitpid pid end end From d40db5cfecba8bd4fbc4809cf67024be4d83e113 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Thu, 3 Oct 2024 12:38:01 +0900 Subject: [PATCH 633/829] [DOC] [pty] Add clean up to `PTY.spawn` --- ext/pty/pty.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/ext/pty/pty.c b/ext/pty/pty.c index 49caa0b79f8678..0e04b02d835c00 100644 --- a/ext/pty/pty.c +++ b/ext/pty/pty.c @@ -610,9 +610,17 @@ pty_detach_process(VALUE v) * +env+ is an optional hash that provides additional environment variables to the spawned pty. * * # sets FOO to "bar" - * PTY.spawn({"FOO"=>"bar"}, "printenv", "FOO") { |r,w,pid| p r.read } #=> "bar\r\n" + * PTY.spawn({"FOO"=>"bar"}, "printenv", "FOO") do |r, w, pid| + * p r.read #=> "bar\r\n" + * ensure + * r.close; w.close; Process.wait(pid) + * end * # unsets FOO - * PTY.spawn({"FOO"=>nil}, "printenv", "FOO") { |r,w,pid| p r.read } #=> "" + * PTY.spawn({"FOO"=>nil}, "printenv", "FOO") do |r, w, pid| + * p r.read #=> "" + * ensure + * r.close; w.close; Process.wait(pid) + * end * * +command+ and +command_line+ are the full commands to run, given a String. * Any additional +arguments+ will be passed to the command. @@ -628,6 +636,15 @@ pty_detach_process(VALUE v) * standard output and standard error * +w+:: A writable IO that is the command's standard input * +pid+:: The process identifier for the command. + * + * === Clean up + * + * This method does not clean up like closing IOs or waiting for child + * process, except that the process is detached in the block form to + * prevent it from becoming a zombie (see Process.detach). Any other + * cleanup is the responsibility of the caller. If waiting for +pid+, + * be sure to close both +r+ and +w+ before doing so; doing it in the + * reverse order may cause deadlock on some OSes. */ static VALUE pty_getpty(int argc, VALUE *argv, VALUE self) From a048090bd591ef874f36effb2065d66719c04d59 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Thu, 3 Oct 2024 12:41:49 +0900 Subject: [PATCH 634/829] Update bundled_gems --- gems/bundled_gems | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gems/bundled_gems b/gems/bundled_gems index 55696e8435b7ca..81f62893b5be97 100644 --- a/gems/bundled_gems +++ b/gems/bundled_gems @@ -7,7 +7,7 @@ # if `revision` is not given, "v"+`version` or `version` will be used. minitest 5.25.1 https://github.com/minitest/minitest -power_assert 2.0.3 https://github.com/ruby/power_assert 84e85124c5014a139af39161d484156cfe87a9ed +power_assert 2.0.4 https://github.com/ruby/power_assert rake 13.2.1 https://github.com/ruby/rake test-unit 3.6.2 https://github.com/test-unit/test-unit rexml 3.3.8 https://github.com/ruby/rexml @@ -18,7 +18,7 @@ net-pop 0.1.2 https://github.com/ruby/net-pop net-smtp 0.5.0 https://github.com/ruby/net-smtp matrix 0.4.2 https://github.com/ruby/matrix prime 0.1.2 https://github.com/ruby/prime -rbs 3.6.0 https://github.com/ruby/rbs 1e16fcdcc9bb88a5fdcf3fc6bec8a0b566c13877 +rbs 3.6.1 https://github.com/ruby/rbs typeprof 0.21.11 https://github.com/ruby/typeprof 167263ca3a634b61df0445f1a6b3e259a5d47f94 debug 1.9.2 https://github.com/ruby/debug racc 1.8.1 https://github.com/ruby/racc From 835ac8a4d7f01854dc45061301a1fc091f7bab3d Mon Sep 17 00:00:00 2001 From: git Date: Thu, 3 Oct 2024 04:11:01 +0000 Subject: [PATCH 635/829] Update bundled gems list at a048090bd591ef874f36effb2065d6 [ci skip] --- NEWS.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index b6946318e3f5c0..80174677411e5e 100644 --- a/NEWS.md +++ b/NEWS.md @@ -92,6 +92,7 @@ The following default gems are updated. The following bundled gems are updated. * minitest 5.25.1 +* power_assert 2.0.4 * rake 13.2.1 * test-unit 3.6.2 * rexml 3.3.8 @@ -99,7 +100,7 @@ The following bundled gems are updated. * net-ftp 0.3.7 * net-imap 0.4.16 * net-smtp 0.5.0 -* rbs 3.6.0 +* rbs 3.6.1 * typeprof 0.21.11 * debug 1.9.2 * racc 1.8.1 From 630c681321cd247a55360e52743a5d706cd46bcb Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Mon, 2 Sep 2024 09:41:01 +0200 Subject: [PATCH 636/829] [flori/json] JSON.dump: avoid redundant UTF-8 validation Given that we called `rb_enc_str_asciionly_p`, if the string encoding isn't valid UTF-8, we can't know it very cheaply by checking the encoding and coderange that was just computed by Ruby, rather than to do it ourselves. Also Ruby might have already computed that earlier. https://github.com/flori/json/commit/4b04c469d5 --- ext/json/generator/generator.c | 65 +++++++++------------------------- ext/json/generator/generator.h | 1 - 2 files changed, 16 insertions(+), 50 deletions(-) diff --git a/ext/json/generator/generator.c b/ext/json/generator/generator.c index 766e199f74fb3c..9ecbfbeaa0f9dc 100644 --- a/ext/json/generator/generator.c +++ b/ext/json/generator/generator.c @@ -66,42 +66,6 @@ static const char trailingBytesForUTF8[256] = { static const UTF32 offsetsFromUTF8[6] = { 0x00000000UL, 0x00003080UL, 0x000E2080UL, 0x03C82080UL, 0xFA082080UL, 0x82082080UL }; -/* - * Utility routine to tell whether a sequence of bytes is legal UTF-8. - * This must be called with the length pre-determined by the first byte. - * If not calling this from ConvertUTF8to*, then the length can be set by: - * length = trailingBytesForUTF8[*source]+1; - * and the sequence is illegal right away if there aren't that many bytes - * available. - * If presented with a length > 4, this returns 0. The Unicode - * definition of UTF-8 goes up to 4-byte sequences. - */ -static unsigned char isLegalUTF8(const UTF8 *source, unsigned long length) -{ - UTF8 a; - const UTF8 *srcptr = source+length; - switch (length) { - default: return 0; - /* Everything else falls through when "1"... */ - case 4: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return 0; - case 3: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return 0; - case 2: if ((a = (*--srcptr)) > 0xBF) return 0; - - switch (*source) { - /* no fall-through in this inner switch */ - case 0xE0: if (a < 0xA0) return 0; break; - case 0xED: if (a > 0x9F) return 0; break; - case 0xF0: if (a < 0x90) return 0; break; - case 0xF4: if (a > 0x8F) return 0; break; - default: if (a < 0x80) return 0; - } - - case 1: if (*source >= 0x80 && *source < 0xC2) return 0; - } - if (*source > 0xF4) return 0; - return 1; -} - /* Escapes the UTF16 character and stores the result in the buffer buf. */ static void unicode_escape(char *buf, UTF16 character) { @@ -130,17 +94,18 @@ static void convert_UTF8_to_JSON_ASCII(FBuffer *buffer, VALUE string, char scrip const UTF8 *sourceEnd = source + RSTRING_LEN(string); char buf[6] = { '\\', 'u' }; - while (source < sourceEnd) { - UTF32 ch = 0; - unsigned short extraBytesToRead = trailingBytesForUTF8[*source]; - if (source + extraBytesToRead >= sourceEnd) { - rb_raise(rb_path2class("JSON::GeneratorError"), - "partial character in source, but hit end"); - } - if (!isLegalUTF8(source, extraBytesToRead+1)) { + int ascii_only = rb_enc_str_asciionly_p(string); + + if (!ascii_only) { + if (RB_ENCODING_GET_INLINED(string) != rb_utf8_encindex() || RB_ENC_CODERANGE(string) != RUBY_ENC_CODERANGE_VALID) { rb_raise(rb_path2class("JSON::GeneratorError"), "source sequence is illegal/malformed utf-8"); } + } + + while (source < sourceEnd) { + UTF32 ch = 0; + unsigned short extraBytesToRead = trailingBytesForUTF8[*source]; /* * The cases all fall through. See "Note A" below. */ @@ -238,6 +203,13 @@ static void convert_UTF8_to_JSON(FBuffer *buffer, VALUE string, char script_safe char buf[6] = { '\\', 'u' }; int ascii_only = rb_enc_str_asciionly_p(string); + if (!ascii_only) { + if (RB_ENCODING_GET_INLINED(string) != rb_utf8_encindex() || RB_ENC_CODERANGE(string) != RUBY_ENC_CODERANGE_VALID) { + rb_raise(rb_path2class("JSON::GeneratorError"), + "source sequence is illegal/malformed utf-8"); + } + } + for (start = 0, end = 0; end < len;) { p = ptr + end; c = (unsigned char) *p; @@ -309,11 +281,6 @@ static void convert_UTF8_to_JSON(FBuffer *buffer, VALUE string, char script_safe continue; } } - - if (!isLegalUTF8((UTF8 *) p, clen)) { - rb_raise(rb_path2class("JSON::GeneratorError"), - "source sequence is illegal/malformed utf-8"); - } } end += clen; } diff --git a/ext/json/generator/generator.h b/ext/json/generator/generator.h index 98b7d833f3d4c8..8dde7be8272edc 100644 --- a/ext/json/generator/generator.h +++ b/ext/json/generator/generator.h @@ -46,7 +46,6 @@ static const int halfShift = 10; /* used for shifting by 10 bits */ static const UTF32 halfBase = 0x0010000UL; static const UTF32 halfMask = 0x3FFUL; -static unsigned char isLegalUTF8(const UTF8 *source, unsigned long length); static void unicode_escape(char *buf, UTF16 character); static void unicode_escape_to_buffer(FBuffer *buffer, char buf[6], UTF16 character); static void convert_UTF8_to_JSON_ASCII(FBuffer *buffer, VALUE string, char script_safe); From 57282c62a0df04808d24d63a48be3774f3180763 Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Mon, 2 Sep 2024 13:45:38 +0200 Subject: [PATCH 637/829] [flori/json] Optimize `fbuffer_inc_capa` On my `JSON.dump` benchmark it shows up as 6% of runtime, compared to 40% for `convert_UTF8_to_JSON`. Since the vast majority of the time this function is called we still have some buffer capacity, we might as well check that first and skip the expensive loop etc. With this change my profiler now report this function as 0.7%, so almost 10x better. https://github.com/flori/json/commit/a7206bf2db --- ext/json/fbuffer/fbuffer.h | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/ext/json/fbuffer/fbuffer.h b/ext/json/fbuffer/fbuffer.h index 7ece0cee95a7d5..1fb9d667003452 100644 --- a/ext/json/fbuffer/fbuffer.h +++ b/ext/json/fbuffer/fbuffer.h @@ -66,6 +66,10 @@ static FBuffer *fbuffer_dup(FBuffer *fb); static VALUE fbuffer_to_s(FBuffer *fb); #endif +#ifndef RB_UNLIKELY +#define RB_UNLIKELY(expr) expr +#endif + static FBuffer *fbuffer_alloc(unsigned long initial_length) { FBuffer *fb; @@ -87,20 +91,22 @@ static void fbuffer_clear(FBuffer *fb) fb->len = 0; } -static void fbuffer_inc_capa(FBuffer *fb, unsigned long requested) +static inline void fbuffer_inc_capa(FBuffer *fb, unsigned long requested) { - unsigned long required; + if (RB_UNLIKELY(requested > fb->capa - fb->len)) { + unsigned long required; - if (!fb->ptr) { - fb->ptr = ALLOC_N(char, fb->initial_length); - fb->capa = fb->initial_length; - } + if (RB_UNLIKELY(!fb->ptr)) { + fb->ptr = ALLOC_N(char, fb->initial_length); + fb->capa = fb->initial_length; + } - for (required = fb->capa; requested > required - fb->len; required <<= 1); + for (required = fb->capa; requested > required - fb->len; required <<= 1); - if (required > fb->capa) { - REALLOC_N(fb->ptr, char, required); - fb->capa = required; + if (required > fb->capa) { + REALLOC_N(fb->ptr, char, required); + fb->capa = required; + } } } From 4cd893b0487b9a853a57d1e9cdc461bd0dd6de8f Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Tue, 3 Sep 2024 10:40:23 +0200 Subject: [PATCH 638/829] [flori/json] Optimize key type check in `json_object_i` Rather than checking the class we can check the type. This is very subtly different for String subclasses, but I think it's OK. We also save on checking the type again in the fast path. https://github.com/flori/json/commit/772a0201ab --- ext/json/generator/generator.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/ext/json/generator/generator.c b/ext/json/generator/generator.c index 9ecbfbeaa0f9dc..b8734764c71e29 100644 --- a/ext/json/generator/generator.c +++ b/ext/json/generator/generator.c @@ -814,7 +814,6 @@ json_object_i(VALUE key, VALUE val, VALUE _arg) long delim2_len = FBUFFER_LEN(state->object_delim2); long depth = state->depth; int j; - VALUE klass, key_to_s; if (arg->iter > 0) fbuffer_append(buffer, delim, delim_len); if (object_nl) { @@ -826,15 +825,19 @@ json_object_i(VALUE key, VALUE val, VALUE _arg) } } - klass = CLASS_OF(key); - if (klass == rb_cString) { - key_to_s = key; - } else if (klass == rb_cSymbol) { - key_to_s = rb_sym2str(key); - } else { - key_to_s = rb_funcall(key, i_to_s, 0); + VALUE key_to_s; + switch(rb_type(key)) { + case T_STRING: + key_to_s = key; + break; + case T_SYMBOL: + key_to_s = rb_sym2str(key); + break; + default: + key_to_s = rb_convert_type(key, T_STRING, "String", "to_s"); + break; } - Check_Type(key_to_s, T_STRING); + generate_json(buffer, Vstate, state, key_to_s); fbuffer_append(buffer, delim2, delim2_len); generate_json(buffer, Vstate, state, val); From 1b3f18afce19a693921e3021f81bd1289b113036 Mon Sep 17 00:00:00 2001 From: Sadiq Saif Date: Fri, 23 Nov 2018 11:38:43 -0500 Subject: [PATCH 639/829] each_address should now resolve for AAAA first AAAA over A is standards track behaviour as per RFC 6724. --- lib/resolv.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/resolv.rb b/lib/resolv.rb index 0574ce622bf73e..47ea97deff85e7 100644 --- a/lib/resolv.rb +++ b/lib/resolv.rb @@ -396,10 +396,10 @@ def getaddresses(name) # be a Resolv::IPv4 or Resolv::IPv6 def each_address(name) - each_resource(name, Resource::IN::A) {|resource| yield resource.address} if use_ipv6? each_resource(name, Resource::IN::AAAA) {|resource| yield resource.address} end + each_resource(name, Resource::IN::A) {|resource| yield resource.address} end def use_ipv6? # :nodoc: From 7f251ce5c43d1c0c04b192b730c66b07b5f6530d Mon Sep 17 00:00:00 2001 From: git Date: Thu, 3 Oct 2024 07:00:45 +0000 Subject: [PATCH 640/829] Update bundled gems list as of 2024-10-03 --- NEWS.md | 2 +- gems/bundled_gems | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/NEWS.md b/NEWS.md index 80174677411e5e..59e940ce9958cb 100644 --- a/NEWS.md +++ b/NEWS.md @@ -97,7 +97,7 @@ The following bundled gems are updated. * test-unit 3.6.2 * rexml 3.3.8 * rss 0.3.1 -* net-ftp 0.3.7 +* net-ftp 0.3.8 * net-imap 0.4.16 * net-smtp 0.5.0 * rbs 3.6.1 diff --git a/gems/bundled_gems b/gems/bundled_gems index 81f62893b5be97..df8f1c58f4cf67 100644 --- a/gems/bundled_gems +++ b/gems/bundled_gems @@ -12,7 +12,7 @@ rake 13.2.1 https://github.com/ruby/rake test-unit 3.6.2 https://github.com/test-unit/test-unit rexml 3.3.8 https://github.com/ruby/rexml rss 0.3.1 https://github.com/ruby/rss -net-ftp 0.3.7 https://github.com/ruby/net-ftp +net-ftp 0.3.8 https://github.com/ruby/net-ftp net-imap 0.4.16 https://github.com/ruby/net-imap net-pop 0.1.2 https://github.com/ruby/net-pop net-smtp 0.5.0 https://github.com/ruby/net-smtp From 50b32a3c9206df2ec7bcb4c54a59844c27f1c144 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Thu, 3 Oct 2024 17:01:11 +0900 Subject: [PATCH 641/829] Added repl_type_completor as bundled gems --- gems/bundled_gems | 1 + 1 file changed, 1 insertion(+) diff --git a/gems/bundled_gems b/gems/bundled_gems index df8f1c58f4cf67..6b2d3edda5acc6 100644 --- a/gems/bundled_gems +++ b/gems/bundled_gems @@ -34,3 +34,4 @@ drb 2.2.1 https://github.com/ruby/drb nkf 0.2.0 https://github.com/ruby/nkf syslog 0.1.2 https://github.com/ruby/syslog csv 3.3.0 https://github.com/ruby/csv +repl_type_completor 0.1.7 https://github.com/ruby/repl_type_completor From 6435dfce5fcddd22d3570eda2c60cc772c34909c Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Thu, 3 Oct 2024 17:01:44 +0900 Subject: [PATCH 642/829] style --- gems/bundled_gems | 58 +++++++++++++++++++++++------------------------ 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/gems/bundled_gems b/gems/bundled_gems index 6b2d3edda5acc6..b00c3f4cce5aa4 100644 --- a/gems/bundled_gems +++ b/gems/bundled_gems @@ -6,32 +6,32 @@ # - revision: revision in repository-url to test # if `revision` is not given, "v"+`version` or `version` will be used. -minitest 5.25.1 https://github.com/minitest/minitest -power_assert 2.0.4 https://github.com/ruby/power_assert -rake 13.2.1 https://github.com/ruby/rake -test-unit 3.6.2 https://github.com/test-unit/test-unit -rexml 3.3.8 https://github.com/ruby/rexml -rss 0.3.1 https://github.com/ruby/rss -net-ftp 0.3.8 https://github.com/ruby/net-ftp -net-imap 0.4.16 https://github.com/ruby/net-imap -net-pop 0.1.2 https://github.com/ruby/net-pop -net-smtp 0.5.0 https://github.com/ruby/net-smtp -matrix 0.4.2 https://github.com/ruby/matrix -prime 0.1.2 https://github.com/ruby/prime -rbs 3.6.1 https://github.com/ruby/rbs -typeprof 0.21.11 https://github.com/ruby/typeprof 167263ca3a634b61df0445f1a6b3e259a5d47f94 -debug 1.9.2 https://github.com/ruby/debug -racc 1.8.1 https://github.com/ruby/racc -mutex_m 0.2.0 https://github.com/ruby/mutex_m -getoptlong 0.2.1 https://github.com/ruby/getoptlong -base64 0.2.0 https://github.com/ruby/base64 -bigdecimal 3.1.8 https://github.com/ruby/bigdecimal -observer 0.1.2 https://github.com/ruby/observer -abbrev 0.1.2 https://github.com/ruby/abbrev -resolv-replace 0.1.1 https://github.com/ruby/resolv-replace -rinda 0.2.0 https://github.com/ruby/rinda -drb 2.2.1 https://github.com/ruby/drb -nkf 0.2.0 https://github.com/ruby/nkf -syslog 0.1.2 https://github.com/ruby/syslog -csv 3.3.0 https://github.com/ruby/csv -repl_type_completor 0.1.7 https://github.com/ruby/repl_type_completor +minitest 5.25.1 https://github.com/minitest/minitest +power_assert 2.0.4 https://github.com/ruby/power_assert +rake 13.2.1 https://github.com/ruby/rake +test-unit 3.6.2 https://github.com/test-unit/test-unit +rexml 3.3.8 https://github.com/ruby/rexml +rss 0.3.1 https://github.com/ruby/rss +net-ftp 0.3.8 https://github.com/ruby/net-ftp +net-imap 0.4.16 https://github.com/ruby/net-imap +net-pop 0.1.2 https://github.com/ruby/net-pop +net-smtp 0.5.0 https://github.com/ruby/net-smtp +matrix 0.4.2 https://github.com/ruby/matrix +prime 0.1.2 https://github.com/ruby/prime +rbs 3.6.1 https://github.com/ruby/rbs +typeprof 0.21.11 https://github.com/ruby/typeprof 167263ca3a634b61df0445f1a6b3e259a5d47f94 +debug 1.9.2 https://github.com/ruby/debug +racc 1.8.1 https://github.com/ruby/racc +mutex_m 0.2.0 https://github.com/ruby/mutex_m +getoptlong 0.2.1 https://github.com/ruby/getoptlong +base64 0.2.0 https://github.com/ruby/base64 +bigdecimal 3.1.8 https://github.com/ruby/bigdecimal +observer 0.1.2 https://github.com/ruby/observer +abbrev 0.1.2 https://github.com/ruby/abbrev +resolv-replace 0.1.1 https://github.com/ruby/resolv-replace +rinda 0.2.0 https://github.com/ruby/rinda +drb 2.2.1 https://github.com/ruby/drb +nkf 0.2.0 https://github.com/ruby/nkf +syslog 0.1.2 https://github.com/ruby/syslog +csv 3.3.0 https://github.com/ruby/csv +repl_type_completor 0.1.7 https://github.com/ruby/repl_type_completor From 2c0149d330d3068272eed785d627d9f0daa95bbf Mon Sep 17 00:00:00 2001 From: git Date: Thu, 3 Oct 2024 08:41:42 +0000 Subject: [PATCH 643/829] Update bundled gems list at 6435dfce5fcddd22d3570eda2c60cc [ci skip] --- NEWS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/NEWS.md b/NEWS.md index 59e940ce9958cb..a09437fda2bbda 100644 --- a/NEWS.md +++ b/NEWS.md @@ -119,6 +119,7 @@ The following bundled gems are promoted from default gems. * nkf 0.2.0 * syslog 0.1.2 * csv 3.3.0 +* repl_type_completor 0.1.7 See GitHub releases like [GitHub Releases of Logger](https://github.com/ruby/logger/releases) or changelog for details of the default gems or bundled gems. From a8a059125314a411eaf879a9fbfdc68d6c01a667 Mon Sep 17 00:00:00 2001 From: tompng Date: Fri, 7 Jun 2024 02:05:22 +0900 Subject: [PATCH 644/829] Hash#inspect with colon style --- hash.c | 51 +++++++++++++++++++++++++++++++++++++++--- test/ruby/test_hash.rb | 27 ++++++++++++++++++++++ 2 files changed, 75 insertions(+), 3 deletions(-) diff --git a/hash.c b/hash.c index 36be9efcb6638f..d48c763cd2026d 100644 --- a/hash.c +++ b/hash.c @@ -3405,20 +3405,65 @@ rb_hash_to_a(VALUE hash) return ary; } +static bool +symbol_key_needs_quote(VALUE str) +{ + long len = RSTRING_LEN(str); + if (len == 0 || !rb_str_symname_p(str)) return true; + const char *s = RSTRING_PTR(str); + char first = s[0]; + if (first == '@' || first == '$' || first == '!') return true; + if (!at_char_boundary(s, s + len - 1, RSTRING_END(str), rb_enc_get(str))) return false; + switch (s[len - 1]) { + case '+': + case '-': + case '*': + case '/': + case '`': + case '%': + case '^': + case '&': + case '|': + case ']': + case '<': + case '=': + case '>': + case '~': + case '@': + return true; + default: + return false; + } +} + static int inspect_i(VALUE key, VALUE value, VALUE str) { VALUE str2; - str2 = rb_inspect(key); + bool is_symbol = SYMBOL_P(key); + bool quote = false; + if (is_symbol) { + str2 = rb_sym2str(key); + quote = symbol_key_needs_quote(str2); + } + else { + str2 = rb_inspect(key); + } if (RSTRING_LEN(str) > 1) { rb_str_buf_cat_ascii(str, ", "); } else { rb_enc_copy(str, str2); } - rb_str_buf_append(str, str2); - rb_str_buf_cat_ascii(str, "=>"); + if (quote) { + rb_str_buf_append(str, rb_str_inspect(str2)); + } + else { + rb_str_buf_append(str, str2); + } + + rb_str_buf_cat_ascii(str, is_symbol ? ": " : " => "); str2 = rb_inspect(value); rb_str_buf_append(str, str2); diff --git a/test/ruby/test_hash.rb b/test/ruby/test_hash.rb index f60ba0cffd2743..8219abc678ffa1 100644 --- a/test/ruby/test_hash.rb +++ b/test/ruby/test_hash.rb @@ -869,6 +869,33 @@ def test_to_s $, = nil end + def test_inspect + no_quote = '{a: 1, a!: 1, a?: 1}' + quote0 = '{"": 1}' + quote1 = '{"0": 1, "!": 1, "%": 1, "&": 1, "*": 1, "+": 1, "-": 1, "/": 1, "<": 1, ">": 1, "^": 1, "`": 1, "|": 1, "~": 1}' + quote2 = '{"@a": 1, "$a": 1, "+@": 1, "a=": 1, "[]": 1}' + quote3 = '{"a\"b": 1, "@@a": 1, "<=>": 1, "===": 1, "[]=": 1}' + assert_equal(no_quote, eval(no_quote).inspect) + assert_equal(quote0, eval(quote0).inspect) + assert_equal(quote1, eval(quote1).inspect) + assert_equal(quote2, eval(quote2).inspect) + assert_equal(quote3, eval(quote3).inspect) + begin + enc = Encoding.default_external + Encoding.default_external = Encoding::ASCII + utf8_ascii_hash = '{"\\u3042": 1}' + assert_equal(eval(utf8_ascii_hash).inspect, utf8_ascii_hash) + Encoding.default_external = Encoding::UTF_8 + utf8_hash = "{\u3042: 1}" + assert_equal(eval(utf8_hash).inspect, utf8_hash) + Encoding.default_external = Encoding::Windows_31J + sjis_hash = "{\x87]: 1}".force_encoding('sjis') + assert_equal(eval(sjis_hash).inspect, sjis_hash) + ensure + Encoding.default_external = enc + end + end + def test_update h1 = @cls[ 1 => 2, 2 => 3, 3 => 4 ] h2 = @cls[ 2 => 'two', 4 => 'four' ] From f4e548924e36c9b1d19551a943881cb57bb41471 Mon Sep 17 00:00:00 2001 From: tompng Date: Sat, 8 Jun 2024 01:20:03 +0900 Subject: [PATCH 645/829] Update bootstraptest test for colon-style hash inspect --- bootstraptest/test_literal.rb | 4 ++-- bootstraptest/test_ractor.rb | 2 +- bootstraptest/test_yjit.rb | 22 +++++++++++----------- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/bootstraptest/test_literal.rb b/bootstraptest/test_literal.rb index a30661a7960d44..7295f7a148eed3 100644 --- a/bootstraptest/test_literal.rb +++ b/bootstraptest/test_literal.rb @@ -119,14 +119,14 @@ assert_equal 'bar', '[*:foo];:bar' assert_equal '[1, 2]', 'def nil.to_a; [2]; end; [1, *nil]' assert_equal '[1, 2]', 'def nil.to_a; [1, 2]; end; [*nil]' -assert_equal '[0, 1, {2=>3}]', '[0, *[1], 2=>3]', "[ruby-dev:31592]" +assert_equal '[0, 1, {2 => 3}]', '[0, *[1], 2=>3]', "[ruby-dev:31592]" # hash assert_equal 'Hash', '{}.class' assert_equal '{}', '{}.inspect' assert_equal 'Hash', '{1=>2}.class' -assert_equal '{1=>2}', '{1=>2}.inspect' +assert_equal '{1 => 2}', '{1=>2}.inspect' assert_equal '2', 'h = {1 => 2}; h[1]' assert_equal '0', 'h = {1 => 2}; h.delete(1); h.size' assert_equal '', 'h = {1 => 2}; h.delete(1); h[1]' diff --git a/bootstraptest/test_ractor.rb b/bootstraptest/test_ractor.rb index b6a4ef605e6233..5caa903b941600 100644 --- a/bootstraptest/test_ractor.rb +++ b/bootstraptest/test_ractor.rb @@ -571,7 +571,7 @@ def test n } # threads in a ractor will killed -assert_equal '{:ok=>3}', %q{ +assert_equal '{ok: 3}', %q{ Ractor.new Ractor.current do |main| q = Thread::Queue.new Thread.new do diff --git a/bootstraptest/test_yjit.rb b/bootstraptest/test_yjit.rb index df1eba1ce1e5e0..f0192c04142ae0 100644 --- a/bootstraptest/test_yjit.rb +++ b/bootstraptest/test_yjit.rb @@ -1798,7 +1798,7 @@ def build_hash } # test building hash with values -assert_equal '{:foo=>:bar}', %q{ +assert_equal '{foo: :bar}', %q{ def build_hash(val) { foo: val } end @@ -3375,7 +3375,7 @@ def foo(required:, specified: 999, simple_default: 3, complex_default: "4".to_i) } # cfunc kwargs -assert_equal '{:foo=>123}', %q{ +assert_equal '{foo: 123}', %q{ def foo(bar) bar.store(:value, foo: 123) bar[:value] @@ -3386,7 +3386,7 @@ def foo(bar) } # cfunc kwargs -assert_equal '{:foo=>123}', %q{ +assert_equal '{foo: 123}', %q{ def foo(bar) bar.replace(foo: 123) end @@ -3396,7 +3396,7 @@ def foo(bar) } # cfunc kwargs -assert_equal '{:foo=>123, :bar=>456}', %q{ +assert_equal '{foo: 123, bar: 456}', %q{ def foo(bar) bar.replace(foo: 123, bar: 456) end @@ -3406,7 +3406,7 @@ def foo(bar) } # variadic cfunc kwargs -assert_equal '{:foo=>123}', %q{ +assert_equal '{foo: 123}', %q{ def foo(bar) bar.merge(foo: 123) end @@ -3530,7 +3530,7 @@ def initialize(title) } # duphash -assert_equal '{:foo=>123}', %q{ +assert_equal '{foo: 123}', %q{ def foo {foo: 123} end @@ -3540,7 +3540,7 @@ def foo } # newhash -assert_equal '{:foo=>2}', %q{ +assert_equal '{foo: 2}', %q{ def foo {foo: 1+1} end @@ -4349,7 +4349,7 @@ def literal_append(sql, v) # Rest with block # Simplified code from railsbench -assert_equal '[{"/a"=>"b", :as=>:c, :via=>:post}, [], nil]', %q{ +assert_equal '[{"/a" => "b", as: :c, via: :post}, [], nil]', %q{ def match(path, *rest, &block) [path, rest, block] end @@ -4610,7 +4610,7 @@ def defined_yield = defined?(yield) } # splat with ruby2_keywords into rest parameter -assert_equal '[[{:a=>1}], {}]', %q{ +assert_equal '[[{a: 1}], {}]', %q{ ruby2_keywords def foo(*args) = args def bar(*args, **kw) = [args, kw] @@ -4651,7 +4651,7 @@ def try = foo(0, &nil) } # a kwrest case -assert_equal '[1, 2, {:complete=>false}]', %q{ +assert_equal '[1, 2, {complete: false}]', %q{ def rest(foo: 1, bar: 2, **kwrest) [foo, bar, kwrest] end @@ -4710,7 +4710,7 @@ def test_cfunc_vargs_splat(sub_instance, array_class, empty_kw_hash) } # Class#new (arity=-1), splat, and ruby2_keywords -assert_equal '[0, {1=>1}]', %q{ +assert_equal '[0, {1 => 1}]', %q{ class KwInit attr_reader :init_args def initialize(x = 0, **kw) From 7237af75d2aa700454fbaba9bda7a9283413d903 Mon Sep 17 00:00:00 2001 From: tompng Date: Sat, 8 Jun 2024 00:23:12 +0900 Subject: [PATCH 646/829] Update ruby test for colon-style hash inspect --- test/coverage/test_coverage.rb | 30 +++++++++++++++--------------- test/ruby/test_ast.rb | 2 +- test/ruby/test_exception.rb | 4 ++-- test/ruby/test_hash.rb | 4 ++-- test/ruby/test_keyword.rb | 2 +- test/ruby/test_pattern_matching.rb | 10 +++++----- test/ruby/test_sprintf.rb | 2 +- 7 files changed, 27 insertions(+), 27 deletions(-) diff --git a/test/coverage/test_coverage.rb b/test/coverage/test_coverage.rb index 4773280cae0f49..2fe7f1b0b96c26 100644 --- a/test/coverage/test_coverage.rb +++ b/test/coverage/test_coverage.rb @@ -649,9 +649,9 @@ def test_clear_with_lines end exp = [ - "{:lines=>[1, 0, 0, nil, 0, nil, nil]}", - "{:lines=>[0, 1, 1, nil, 0, nil, nil]}", - "{:lines=>[0, 1, 0, nil, 1, nil, nil]}", + { lines: [1, 0, 0, nil, 0, nil, nil] }.inspect, + { lines: [0, 1, 1, nil, 0, nil, nil] }.inspect, + { lines: [0, 1, 0, nil, 1, nil, nil] }.inspect, ] assert_in_out_err(ARGV, <<-"end;", exp, []) Coverage.start(lines: true) @@ -682,10 +682,10 @@ def test_clear_with_branches end exp = [ - "{:branches=>{[:if, 0, 2, 2, 6, 5]=>{[:then, 1, 3, 4, 3, 8]=>0, [:else, 2, 5, 4, 5, 12]=>0}}}", - "{:branches=>{[:if, 0, 2, 2, 6, 5]=>{[:then, 1, 3, 4, 3, 8]=>1, [:else, 2, 5, 4, 5, 12]=>0}}}", - "{:branches=>{[:if, 0, 2, 2, 6, 5]=>{[:then, 1, 3, 4, 3, 8]=>0, [:else, 2, 5, 4, 5, 12]=>1}}}", - "{:branches=>{[:if, 0, 2, 2, 6, 5]=>{[:then, 1, 3, 4, 3, 8]=>0, [:else, 2, 5, 4, 5, 12]=>1}}}", + { branches: { [:if, 0, 2, 2, 6, 5] => { [:then, 1, 3, 4, 3, 8] => 0, [:else, 2, 5, 4, 5, 12] => 0 } } }.inspect, + { branches: { [:if, 0, 2, 2, 6, 5] => { [:then, 1, 3, 4, 3, 8] => 1, [:else, 2, 5, 4, 5, 12] => 0 } } }.inspect, + { branches: { [:if, 0, 2, 2, 6, 5] => { [:then, 1, 3, 4, 3, 8] => 0, [:else, 2, 5, 4, 5, 12] => 1 } } }.inspect, + { branches: { [:if, 0, 2, 2, 6, 5] => { [:then, 1, 3, 4, 3, 8] => 0, [:else, 2, 5, 4, 5, 12] => 1 } } }.inspect, ] assert_in_out_err(ARGV, <<-"end;", exp, []) Coverage.start(branches: true) @@ -718,10 +718,10 @@ def test_clear_with_methods end exp = [ - "{:methods=>{[Object, :foo, 1, 0, 7, 3]=>0}}", - "{:methods=>{[Object, :foo, 1, 0, 7, 3]=>1}}", - "{:methods=>{[Object, :foo, 1, 0, 7, 3]=>1}}", - "{:methods=>{[Object, :foo, 1, 0, 7, 3]=>1}}" + { methods: { [Object, :foo, 1, 0, 7, 3] => 0 } }.inspect, + { methods: { [Object, :foo, 1, 0, 7, 3] => 1 } }.inspect, + { methods: { [Object, :foo, 1, 0, 7, 3] => 1 } }.inspect, + { methods: { [Object, :foo, 1, 0, 7, 3] => 1 } }.inspect ] assert_in_out_err(ARGV, <<-"end;", exp, []) Coverage.start(methods: true) @@ -754,10 +754,10 @@ def test_clear_with_oneshot_lines end exp = [ - "{:oneshot_lines=>[1]}", - "{:oneshot_lines=>[2, 3]}", - "{:oneshot_lines=>[5]}", - "{:oneshot_lines=>[]}", + { oneshot_lines: [1] }.inspect, + { oneshot_lines: [2, 3] }.inspect, + { oneshot_lines: [5] }.inspect, + { oneshot_lines: [] }.inspect, ] assert_in_out_err(ARGV, <<-"end;", exp, []) Coverage.start(oneshot_lines: true) diff --git a/test/ruby/test_ast.rb b/test/ruby/test_ast.rb index 91f4250cfc607c..edfc25c43d91d8 100644 --- a/test/ruby/test_ast.rb +++ b/test/ruby/test_ast.rb @@ -803,7 +803,7 @@ def test_keep_script_lines_for_of_with_existing_SCRIPT_LINES__that_has__FILE__as "puts RubyVM::AbstractSyntaxTree.of(->{ 1 + 2 }, keep_script_lines: true).script_lines", "p SCRIPT_LINES__" ] - test_stdout = lines + ['{"-e"=>[]}'] + test_stdout = lines + ['{"-e" => []}'] assert_in_out_err(["-e", lines.join("\n")], "", test_stdout, []) end diff --git a/test/ruby/test_exception.rb b/test/ruby/test_exception.rb index 09df1b5dcb9240..84581180b60958 100644 --- a/test/ruby/test_exception.rb +++ b/test/ruby/test_exception.rb @@ -1128,11 +1128,11 @@ def (obj = Object.new).w(n) warn("test warning", uplevel: n) end assert_raise(ArgumentError) {warn("test warning", uplevel: -1)} assert_in_out_err(["-e", "warn 'ok', uplevel: 1"], '', [], /warning:/) warning = capture_warning_warn {warn("test warning", {uplevel: 0})} - assert_match(/test warning.*{:uplevel=>0}/m, warning[0]) + assert_match(/test warning.*{uplevel: 0}/m, warning[0]) warning = capture_warning_warn {warn("test warning", **{uplevel: 0})} assert_equal("#{__FILE__}:#{__LINE__-1}: warning: test warning\n", warning[0]) warning = capture_warning_warn {warn("test warning", {uplevel: 0}, **{})} - assert_equal("test warning\n{:uplevel=>0}\n", warning[0]) + assert_equal("test warning\n{uplevel: 0}\n", warning[0]) assert_raise(ArgumentError) {warn("test warning", foo: 1)} end diff --git a/test/ruby/test_hash.rb b/test/ruby/test_hash.rb index 8219abc678ffa1..9578e71f0093ca 100644 --- a/test/ruby/test_hash.rb +++ b/test/ruby/test_hash.rb @@ -2295,7 +2295,7 @@ def test_ar2st_insert h = obj.h h[obj] = true - assert_equal '{0=>0, 1=>1, 2=>2, 3=>3, 4=>4, 5=>5, 6=>6, 7=>7, 8=>8, 9=>9, test=>true}', h.inspect + assert_equal '{0 => 0, 1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5, 6 => 6, 7 => 7, 8 => 8, 9 => 9, test => true}', h.inspect end def test_ar2st_delete @@ -2309,7 +2309,7 @@ def obj2.hash h[obj2] = true h.delete obj - assert_equal '{0=>0, 1=>1, 2=>2, 3=>3, 4=>4, 5=>5, 6=>6, 7=>7, 8=>8, 9=>9}', h.inspect + assert_equal '{0 => 0, 1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5, 6 => 6, 7 => 7, 8 => 8, 9 => 9}', h.inspect end def test_ar2st_lookup diff --git a/test/ruby/test_keyword.rb b/test/ruby/test_keyword.rb index a214acc2327ee0..6da1b73c151d1c 100644 --- a/test/ruby/test_keyword.rb +++ b/test/ruby/test_keyword.rb @@ -2863,7 +2863,7 @@ def self.get(_, _, h, &block) end def test_top_ruby2_keywords - assert_in_out_err([], <<-INPUT, ["[1, 2, 3]", "{:k=>1}"], []) + assert_in_out_err([], <<-INPUT, ["[1, 2, 3]", "{k: 1}"], []) def bar(*a, **kw) p a, kw end diff --git a/test/ruby/test_pattern_matching.rb b/test/ruby/test_pattern_matching.rb index cfe3bd1e1939a3..92a3244fc2ae88 100644 --- a/test/ruby/test_pattern_matching.rb +++ b/test/ruby/test_pattern_matching.rb @@ -1664,7 +1664,7 @@ def test_single_pattern_error_hash_pattern raise a # suppress "unused variable: a" warning end - assert_raise_with_message(NoMatchingPatternKeyError, "{:a=>0}: key not found: :aa") do + assert_raise_with_message(NoMatchingPatternKeyError, "{a: 0}: key not found: :aa") do {a: 0} => {aa:} raise aa # suppress "unused variable: aa" warning rescue NoMatchingPatternKeyError => e @@ -1673,7 +1673,7 @@ def test_single_pattern_error_hash_pattern raise e end - assert_raise_with_message(NoMatchingPatternKeyError, "{:a=>{:b=>0}}: key not found: :bb") do + assert_raise_with_message(NoMatchingPatternKeyError, "{a: {b: 0}}: key not found: :bb") do {a: {b: 0}} => {a: {bb:}} raise bb # suppress "unused variable: bb" warning rescue NoMatchingPatternKeyError => e @@ -1682,15 +1682,15 @@ def test_single_pattern_error_hash_pattern raise e end - assert_raise_with_message(NoMatchingPatternError, "{:a=>0}: 1 === 0 does not return true") do + assert_raise_with_message(NoMatchingPatternError, "{a: 0}: 1 === 0 does not return true") do {a: 0} => {a: 1} end - assert_raise_with_message(NoMatchingPatternError, "{:a=>0}: {:a=>0} is not empty") do + assert_raise_with_message(NoMatchingPatternError, "{a: 0}: {a: 0} is not empty") do {a: 0} => {} end - assert_raise_with_message(NoMatchingPatternError, "[{:a=>0}]: rest of {:a=>0} is not empty") do + assert_raise_with_message(NoMatchingPatternError, "[{a: 0}]: rest of {a: 0} is not empty") do [{a: 0}] => [{**nil}] end end diff --git a/test/ruby/test_sprintf.rb b/test/ruby/test_sprintf.rb index 8cf2c63a203dc7..498f93aec4fa37 100644 --- a/test/ruby/test_sprintf.rb +++ b/test/ruby/test_sprintf.rb @@ -235,7 +235,7 @@ def test_rational_precision def test_hash options = {:capture=>/\d+/} - assert_equal("with options {:capture=>/\\d+/}", sprintf("with options %p" % options)) + assert_equal("with options #{options.inspect}", sprintf("with options %p" % options)) end def test_inspect From f7343b636f4d5939691adc05d9f8008e05d72038 Mon Sep 17 00:00:00 2001 From: tompng Date: Fri, 7 Jun 2024 22:17:03 +0900 Subject: [PATCH 647/829] prettyprint hash with colon style --- lib/pp.rb | 37 +++++++++++++++++++++++++++++-------- test/test_pp.rb | 22 ++++++++++++++++++---- 2 files changed, 47 insertions(+), 12 deletions(-) diff --git a/lib/pp.rb b/lib/pp.rb index 1ec5a880eb8fac..ed7e89923cfe5f 100644 --- a/lib/pp.rb +++ b/lib/pp.rb @@ -292,14 +292,35 @@ def pp_hash(obj) } end - # A pretty print for a pair of Hash - def pp_hash_pair(k, v) - pp k - text '=>' - group(1) { - breakable '' - pp v - } + if RUBY_VERSION >= '3.4.' + # A pretty print for a pair of Hash + def pp_hash_pair(k, v) + if Symbol === k + sym_s = k.inspect + if sym_s[1].match?(/["$@!]/) || sym_s[-1].match?(/[%&*+\-\/<=>@\]^`|~]/) + text "#{k.to_s.inspect}:" + else + text "#{k}:" + end + else + pp k + text ' ' + text '=>' + end + group(1) { + breakable + pp v + } + end + else + def pp_hash_pair(k, v) + pp k + text '=>' + group(1) { + breakable '' + pp v + } + end end end diff --git a/test/test_pp.rb b/test/test_pp.rb index 2fdd5df1148a83..57a38768547939 100644 --- a/test/test_pp.rb +++ b/test/test_pp.rb @@ -138,7 +138,6 @@ def test_array def test_hash a = {} a[0] = a - assert_equal("{0=>{...}}\n", PP.pp(a, ''.dup)) assert_equal("#{a.inspect}\n", PP.pp(a, ''.dup)) end @@ -194,10 +193,24 @@ def test_share_nil class PPSingleLineTest < Test::Unit::TestCase def test_hash - assert_equal("{1=>1}", PP.singleline_pp({ 1 => 1}, ''.dup)) # [ruby-core:02699] + assert_equal({1 => 1}.inspect, PP.singleline_pp({1 => 1}, ''.dup)) # [ruby-core:02699] assert_equal("[1#{', 1'*99}]", PP.singleline_pp([1]*100, ''.dup)) end + def test_hash_symbol_colon_key + omit if RUBY_VERSION < "3.4." + no_quote = "{a: 1, a!: 1, a?: 1, \u{3042}: 1}" + quote0 = '{"": 1}' + quote1 = '{"0": 1, "!": 1, "%": 1, "&": 1, "*": 1, "+": 1, "-": 1, "/": 1, "<": 1, ">": 1, "^": 1, "`": 1, "|": 1, "~": 1}' + quote2 = '{"@a": 1, "$a": 1, "+@": 1, "a=": 1, "[]": 1}' + quote3 = '{"a\"b": 1, "@@a": 1, "<=>": 1, "===": 1, "[]=": 1}' + assert_equal(no_quote, PP.singleline_pp(eval(no_quote), ''.dup)) + assert_equal(quote0, PP.singleline_pp(eval(quote0), ''.dup)) + assert_equal(quote1, PP.singleline_pp(eval(quote1), ''.dup)) + assert_equal(quote2, PP.singleline_pp(eval(quote2), ''.dup)) + assert_equal(quote3, PP.singleline_pp(eval(quote3), ''.dup)) + end + def test_hash_in_array omit if RUBY_ENGINE == "jruby" assert_equal("[{}]", PP.singleline_pp([->(*a){a.last.clear}.ruby2_keywords.call(a: 1)], ''.dup)) @@ -250,7 +263,7 @@ class PPSymbolHash < PP def pp_hash_pair(k, v) case k when Symbol - text k.inspect.delete_prefix(":") + text k.inspect.delete_prefix(":").tr('"', "'") text ":" group(1) { breakable @@ -264,8 +277,9 @@ def pp_hash_pair(k, v) def test_hash_override obj = {k: 1, "": :null, "0": :zero, 100 => :ten} + sep = RUBY_VERSION >= "3.4." ? " => " : "=>" assert_equal <<~EXPECT, PPSymbolHash.pp(obj, "".dup) - {k: 1, "": :null, "0": :zero, 100=>:ten} + {k: 1, '': :null, '0': :zero, 100#{sep}:ten} EXPECT end end From af1c356c7b318ccdb8abbcf35bd1fff2082bf91b Mon Sep 17 00:00:00 2001 From: tompng Date: Sat, 8 Jun 2024 00:23:39 +0900 Subject: [PATCH 648/829] Update default gem test for colon-style hash inspect --- spec/bundler/bundler/endpoint_specification_spec.rb | 2 +- spec/bundler/install/gems/compact_index_spec.rb | 2 +- test/error_highlight/test_error_highlight.rb | 2 +- test/rdoc/test_rdoc_ri_driver.rb | 8 ++++---- test/rubygems/test_gem_dependency.rb | 2 +- test/rubygems/test_require.rb | 4 ++-- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/spec/bundler/bundler/endpoint_specification_spec.rb b/spec/bundler/bundler/endpoint_specification_spec.rb index e7e10730cfde10..6518f125ba5e52 100644 --- a/spec/bundler/bundler/endpoint_specification_spec.rb +++ b/spec/bundler/bundler/endpoint_specification_spec.rb @@ -42,7 +42,7 @@ expect { subject }.to raise_error( Bundler::GemspecError, a_string_including("There was an error parsing the metadata for the gem foo (1.0.0)"). - and(a_string_including('The metadata was {"rubygems"=>">\n"}')) + and(a_string_including("The metadata was #{{ "rubygems" => ">\n" }.inspect}")) ) end end diff --git a/spec/bundler/install/gems/compact_index_spec.rb b/spec/bundler/install/gems/compact_index_spec.rb index 39064e3b80b219..4653ce6d871726 100644 --- a/spec/bundler/install/gems/compact_index_spec.rb +++ b/spec/bundler/install/gems/compact_index_spec.rb @@ -173,7 +173,7 @@ bundle :install, verbose: true, artifice: "compact_index_checksum_mismatch" expect(out).to include("Fetching gem metadata from #{source_uri}") expect(out).to include("The checksum of /versions does not match the checksum provided by the server!") - expect(out).to include('Calculated checksums {"sha-256"=>"8KfZiM/fszVkqhP/m5s9lvE6M9xKu4I1bU4Izddp5Ms="} did not match expected {"sha-256"=>"ungWv48Bz+pBQUDeXa4iI7ADYaOWF3qctBD/YfIAFa0="}') + expect(out).to include("Calculated checksums #{{ "sha-256" => "8KfZiM/fszVkqhP/m5s9lvE6M9xKu4I1bU4Izddp5Ms=" }.inspect} did not match expected #{{ "sha-256" => "ungWv48Bz+pBQUDeXa4iI7ADYaOWF3qctBD/YfIAFa0=" }.inspect}") expect(the_bundle).to include_gems "myrack 1.0.0" end diff --git a/test/error_highlight/test_error_highlight.rb b/test/error_highlight/test_error_highlight.rb index 63e7032eda440f..f0da5b5e62385d 100644 --- a/test/error_highlight/test_error_highlight.rb +++ b/test/error_highlight/test_error_highlight.rb @@ -1241,7 +1241,7 @@ def custom_formatter.message_for(spot) assert_error_message(NoMethodError, <<~END) do undefined method `time' for #{ ONE_RECV_MESSAGE } -{:first_lineno=>#{ __LINE__ + 3 }, :first_column=>7, :last_lineno=>#{ __LINE__ + 3 }, :last_column=>12, :snippet=>" 1.time {}\\n"} +#{{ first_lineno: __LINE__ + 3, first_column: 7, last_lineno: __LINE__ + 3, last_column: 12, snippet: " 1.time {}\n" }.inspect} END 1.time {} diff --git a/test/rdoc/test_rdoc_ri_driver.rb b/test/rdoc/test_rdoc_ri_driver.rb index 39e6e677596dbd..3263e6173ef001 100644 --- a/test/rdoc/test_rdoc_ri_driver.rb +++ b/test/rdoc/test_rdoc_ri_driver.rb @@ -54,10 +54,10 @@ def test_self_dump RDoc::RI::Driver.dump @store1.cache_path end - assert_match %r%:class_methods%, out - assert_match %r%:modules%, out - assert_match %r%:instance_methods%, out - assert_match %r%:ancestors%, out + assert_match %r%:class_methods|class_methods:%, out + assert_match %r%:modules|modules:%, out + assert_match %r%:instance_methods|instance_methods:%, out + assert_match %r%:ancestors|ancestors:%, out end def test_add_also_in_empty diff --git a/test/rubygems/test_gem_dependency.rb b/test/rubygems/test_gem_dependency.rb index 2a989a55513b99..a0bfee023936cb 100644 --- a/test/rubygems/test_gem_dependency.rb +++ b/test/rubygems/test_gem_dependency.rb @@ -22,7 +22,7 @@ def test_initialize_type_bad Gem::Dependency.new "monkey" => "1.0" end - assert_equal 'dependency name must be a String, was {"monkey"=>"1.0"}', + assert_equal "dependency name must be a String, was #{{ "monkey" => "1.0" }.inspect}", e.message end diff --git a/test/rubygems/test_require.rb b/test/rubygems/test_require.rb index 48d66736fd82f2..f15e9b624314d2 100644 --- a/test/rubygems/test_require.rb +++ b/test/rubygems/test_require.rb @@ -721,11 +721,11 @@ def test_require_bundler _, err = capture_subprocess_io do system(*ruby_with_rubygems_in_load_path, "-w", "--disable=gems", "-C", dir, "main.rb") end - assert_match(/{:x=>1}\n{:y=>2}\n$/, err) + assert_match(/#{{ x: 1 }.inspect}\n#{{ y: 2 }.inspect}\n$/, err) _, err = capture_subprocess_io do system(*ruby_with_rubygems_in_load_path, "-w", "--enable=gems", "-C", dir, "main.rb") end - assert_match(/{:x=>1}\n{:y=>2}\n$/, err) + assert_match(/#{{ x: 1 }.inspect}\n#{{ y: 2 }.inspect}\n$/, err) end end end From c94815bab720e88c76b46709a1c0b992cae5353c Mon Sep 17 00:00:00 2001 From: tompng Date: Fri, 14 Jun 2024 21:57:41 +0900 Subject: [PATCH 649/829] Update spec/ruby/ for colon-style hash inspect --- spec/ruby/core/hash/shared/to_s.rb | 46 +++++++++---------- spec/ruby/core/string/modulo_spec.rb | 2 +- spec/ruby/language/pattern_matching_spec.rb | 3 +- spec/ruby/library/net-http/http/post_spec.rb | 2 +- .../net-http/http/send_request_spec.rb | 2 +- spec/ruby/library/pp/pp_spec.rb | 2 +- spec/ruby/optional/capi/string_spec.rb | 2 +- 7 files changed, 29 insertions(+), 30 deletions(-) diff --git a/spec/ruby/core/hash/shared/to_s.rb b/spec/ruby/core/hash/shared/to_s.rb index 7864d7cd4c6985..5f0a8f97fdb5f5 100644 --- a/spec/ruby/core/hash/shared/to_s.rb +++ b/spec/ruby/core/hash/shared/to_s.rb @@ -4,14 +4,8 @@ describe :hash_to_s, shared: true do it "returns a string representation with same order as each()" do h = { a: [1, 2], b: -2, d: -6, nil => nil } - - pairs = [] - h.each do |key, value| - pairs << key.inspect + '=>' + value.inspect - end - - str = '{' + pairs.join(', ') + '}' - h.send(@method).should == str + expected = ruby_version_is("3.4") ? "{a: [1, 2], b: -2, d: -6, nil => nil}" : "{:a=>[1, 2], :b=>-2, :d=>-6, nil=>nil}" + h.send(@method).should == expected end it "calls #inspect on keys and values" do @@ -19,31 +13,31 @@ val = mock('val') key.should_receive(:inspect).and_return('key') val.should_receive(:inspect).and_return('val') - - { key => val }.send(@method).should == '{key=>val}' + expected = ruby_version_is("3.4") ? "{key => val}" : "{key=>val}" + { key => val }.send(@method).should == expected end it "does not call #to_s on a String returned from #inspect" do str = +"abc" str.should_not_receive(:to_s) - - { a: str }.send(@method).should == '{:a=>"abc"}' + expected = ruby_version_is("3.4") ? '{a: "abc"}' : '{:a=>"abc"}' + { a: str }.send(@method).should == expected end it "calls #to_s on the object returned from #inspect if the Object isn't a String" do obj = mock("Hash#inspect/to_s calls #to_s") obj.should_receive(:inspect).and_return(obj) obj.should_receive(:to_s).and_return("abc") - - { a: obj }.send(@method).should == "{:a=>abc}" + expected = ruby_version_is("3.4") ? "{a: abc}" : "{:a=>abc}" + { a: obj }.send(@method).should == expected end it "does not call #to_str on the object returned from #inspect when it is not a String" do obj = mock("Hash#inspect/to_s does not call #to_str") obj.should_receive(:inspect).and_return(obj) obj.should_not_receive(:to_str) - - { a: obj }.send(@method).should =~ /^\{:a=>#\}$/ + expected_pattern = ruby_version_is("3.4") ? /^\{a: #\}$/ : /^\{:a=>#\}$/ + { a: obj }.send(@method).should =~ expected_pattern end it "does not call #to_str on the object returned from #to_s when it is not a String" do @@ -51,8 +45,8 @@ obj.should_receive(:inspect).and_return(obj) obj.should_receive(:to_s).and_return(obj) obj.should_not_receive(:to_str) - - { a: obj }.send(@method).should =~ /^\{:a=>#\}$/ + expected_pattern = ruby_version_is("3.4") ? /^\{a: #\}$/ : /^\{:a=>#\}$/ + { a: obj }.send(@method).should =~ expected_pattern end it "does not swallow exceptions raised by #to_s" do @@ -66,24 +60,28 @@ it "handles hashes with recursive values" do x = {} x[0] = x - x.send(@method).should == '{0=>{...}}' + expected = ruby_version_is("3.4") ? '{0 => {...}}' : '{0=>{...}}' + x.send(@method).should == expected x = {} y = {} x[0] = y y[1] = x - x.send(@method).should == "{0=>{1=>{...}}}" - y.send(@method).should == "{1=>{0=>{...}}}" + expected_x = ruby_version_is("3.4") ? '{0 => {1 => {...}}}' : '{0=>{1=>{...}}}' + expected_y = ruby_version_is("3.4") ? '{1 => {0 => {...}}}' : '{1=>{0=>{...}}}' + x.send(@method).should == expected_x + y.send(@method).should == expected_y end it "does not raise if inspected result is not default external encoding" do utf_16be = mock("utf_16be") utf_16be.should_receive(:inspect).and_return(%<"utf_16be \u3042">.encode(Encoding::UTF_16BE)) - - {a: utf_16be}.send(@method).should == '{:a=>"utf_16be \u3042"}' + expected = ruby_version_is("3.4") ? '{a: "utf_16be \u3042"}' : '{:a=>"utf_16be \u3042"}' + {a: utf_16be}.send(@method).should == expected end it "works for keys and values whose #inspect return a frozen String" do - { true => false }.to_s.should == "{true=>false}" + expected = ruby_version_is("3.4") ? "{true => false}" : "{true=>false}" + { true => false }.to_s.should == expected end end diff --git a/spec/ruby/core/string/modulo_spec.rb b/spec/ruby/core/string/modulo_spec.rb index 9045afa263a63d..5d8560000c081a 100644 --- a/spec/ruby/core/string/modulo_spec.rb +++ b/spec/ruby/core/string/modulo_spec.rb @@ -570,7 +570,7 @@ def universal.to_f() 0.0 end ("%1$p" % [10, 5]).should == "10" ("%-22p" % 10).should == "10 " ("%*p" % [10, 10]).should == " 10" - ("%p" % {capture: 1}).should == "{:capture=>1}" + ("%p" % {capture: 1}).should == {capture: 1}.inspect ("%p" % "str").should == "\"str\"" end diff --git a/spec/ruby/language/pattern_matching_spec.rb b/spec/ruby/language/pattern_matching_spec.rb index 52608b48bea4a7..94432b1fa0009b 100644 --- a/spec/ruby/language/pattern_matching_spec.rb +++ b/spec/ruby/language/pattern_matching_spec.rb @@ -232,11 +232,12 @@ end }.should raise_error(NoMatchingPatternError, /\[0, 1\]/) + error_pattern = ruby_version_is("3.4") ? /\{a: 0, b: 1\}/ : /\{:a=>0, :b=>1\}/ -> { case {a: 0, b: 1} in a: 1, b: 1 end - }.should raise_error(NoMatchingPatternError, /\{:a=>0, :b=>1\}/) + }.should raise_error(NoMatchingPatternError, error_pattern) end it "raises NoMatchingPatternError if no pattern matches and evaluates the expression only once" do diff --git a/spec/ruby/library/net-http/http/post_spec.rb b/spec/ruby/library/net-http/http/post_spec.rb index d7d94fec4a70b4..ac020bd6bed869 100644 --- a/spec/ruby/library/net-http/http/post_spec.rb +++ b/spec/ruby/library/net-http/http/post_spec.rb @@ -27,7 +27,7 @@ it "sends Content-Type: application/x-www-form-urlencoded by default" do response = Net::HTTP.post(URI("http://localhost:#{NetHTTPSpecs.port}/request/header"), "test=test") - response.body.should include('"Content-Type"=>"application/x-www-form-urlencoded"') + response.body.should include({ "Content-Type" => "application/x-www-form-urlencoded" }.inspect.delete("{}")) end it "does not support HTTP Basic Auth" do diff --git a/spec/ruby/library/net-http/http/send_request_spec.rb b/spec/ruby/library/net-http/http/send_request_spec.rb index e82b2a96a1875d..af35c068ceaeaf 100644 --- a/spec/ruby/library/net-http/http/send_request_spec.rb +++ b/spec/ruby/library/net-http/http/send_request_spec.rb @@ -54,7 +54,7 @@ @methods.each do |method| response = @http.send_request(method, "/request/header", "test=test", "referer" => referer) - response.body.should include('"Referer"=>"' + referer + '"') + response.body.should include({ "Referer" => referer }.inspect.delete("{}")) end end end diff --git a/spec/ruby/library/pp/pp_spec.rb b/spec/ruby/library/pp/pp_spec.rb index 243478efd967c7..e45a6bb94f67a3 100644 --- a/spec/ruby/library/pp/pp_spec.rb +++ b/spec/ruby/library/pp/pp_spec.rb @@ -25,6 +25,6 @@ hash = { 'key' => 42 } -> { PP.pp hash - }.should output('{"key"=>42}' + "\n") + }.should output("#{hash.inspect}\n") end end diff --git a/spec/ruby/optional/capi/string_spec.rb b/spec/ruby/optional/capi/string_spec.rb index a8edf998b54b25..43b4b3f09b12d8 100644 --- a/spec/ruby/optional/capi/string_spec.rb +++ b/spec/ruby/optional/capi/string_spec.rb @@ -1096,7 +1096,7 @@ def inspect end it "tries to convert the passed argument to a string by calling #to_s" do - @s.rb_String({"bar" => "foo"}).should == '{"bar"=>"foo"}' + @s.rb_String({"bar" => "foo"}).should == {"bar" => "foo"}.to_s end end From 5bf8a53063507c17085d6fa6593d2c40277f76f8 Mon Sep 17 00:00:00 2001 From: tompng Date: Sun, 1 Sep 2024 01:37:27 +0900 Subject: [PATCH 650/829] Specify commit hash of debug in bundled_gems --- gems/bundled_gems | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gems/bundled_gems b/gems/bundled_gems index b00c3f4cce5aa4..0e88f06f21f422 100644 --- a/gems/bundled_gems +++ b/gems/bundled_gems @@ -20,7 +20,7 @@ matrix 0.4.2 https://github.com/ruby/matrix prime 0.1.2 https://github.com/ruby/prime rbs 3.6.1 https://github.com/ruby/rbs typeprof 0.21.11 https://github.com/ruby/typeprof 167263ca3a634b61df0445f1a6b3e259a5d47f94 -debug 1.9.2 https://github.com/ruby/debug +debug 1.9.2 https://github.com/ruby/debug 9c4279598e9e0376657b3813bf76a206f1f97beb racc 1.8.1 https://github.com/ruby/racc mutex_m 0.2.0 https://github.com/ruby/mutex_m getoptlong 0.2.1 https://github.com/ruby/getoptlong From 9d4af312bd7406fe648f82100ae7f597b53e4de2 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Thu, 3 Oct 2024 19:38:35 +0900 Subject: [PATCH 651/829] [ruby/reline] Rename `matches?` as `match?` (https://github.com/ruby/reline/pull/753) https://github.com/ruby/reline/commit/9230fe162d --- lib/reline/io/windows.rb | 4 ++-- test/reline/windows/test_key_event_record.rb | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/reline/io/windows.rb b/lib/reline/io/windows.rb index 40025db5046fcc..f7187431936fb1 100644 --- a/lib/reline/io/windows.rb +++ b/lib/reline/io/windows.rb @@ -252,7 +252,7 @@ def process_key_event(repeat_count, virtual_key_code, virtual_scan_code, char_co key = KeyEventRecord.new(virtual_key_code, char_code, control_key_state) - match = KEY_MAP.find { |args,| key.matches?(**args) } + match = KEY_MAP.find { |args,| key.match?(**args) } unless match.nil? @output_buf.concat(match.last) return @@ -501,7 +501,7 @@ def enhanced? # Verifies if the arguments match with this key event. # Nil arguments are ignored, but at least one must be passed as non-nil. # To verify that no control keys were pressed, pass an empty array: `control_keys: []`. - def matches?(control_keys: nil, virtual_key_code: nil, char_code: nil) + def match?(control_keys: nil, virtual_key_code: nil, char_code: nil) raise ArgumentError, 'No argument was passed to match key event' if control_keys.nil? && virtual_key_code.nil? && char_code.nil? (control_keys.nil? || [*control_keys].sort == @control_keys) && diff --git a/test/reline/windows/test_key_event_record.rb b/test/reline/windows/test_key_event_record.rb index a034d20fe44170..25c860606ac024 100644 --- a/test/reline/windows/test_key_event_record.rb +++ b/test/reline/windows/test_key_event_record.rb @@ -10,31 +10,31 @@ def setup end def test_matches__with_no_arguments_raises_error - assert_raise(ArgumentError) { @key.matches? } + assert_raise(ArgumentError) { @key.match? } end def test_matches_char_code - assert @key.matches?(char_code: 0x1) + assert @key.match?(char_code: 0x1) end def test_matches_virtual_key_code - assert @key.matches?(virtual_key_code: 0x41) + assert @key.match?(virtual_key_code: 0x41) end def test_matches_control_keys - assert @key.matches?(control_keys: :CTRL) + assert @key.match?(control_keys: :CTRL) end def test_doesnt_match_alt - refute @key.matches?(control_keys: :ALT) + refute @key.match?(control_keys: :ALT) end def test_doesnt_match_empty_control_key - refute @key.matches?(control_keys: []) + refute @key.match?(control_keys: []) end def test_matches_control_keys_and_virtual_key_code - assert @key.matches?(control_keys: :CTRL, virtual_key_code: 0x41) + assert @key.match?(control_keys: :CTRL, virtual_key_code: 0x41) end end From b421964b9d00c685f11e1bcfdb2c0d9005e4f356 Mon Sep 17 00:00:00 2001 From: Matt Valentine-House Date: Thu, 3 Oct 2024 12:19:58 +0100 Subject: [PATCH 652/829] Remove unused macros --- gc/default.c | 7 ------- 1 file changed, 7 deletions(-) diff --git a/gc/default.c b/gc/default.c index 81e49c3171b4b8..781b1986f189f8 100644 --- a/gc/default.c +++ b/gc/default.c @@ -1157,13 +1157,6 @@ tick(void) #define MEASURE_LINE(expr) expr #endif /* USE_TICK_T */ -#define FL_CHECK2(name, x, pred) \ - ((RGENGC_CHECK_MODE && SPECIAL_CONST_P(x)) ? \ - (rb_bug(name": SPECIAL_CONST (%p)", (void *)(x)), 0) : (pred)) -#define FL_TEST2(x,f) FL_CHECK2("FL_TEST2", x, FL_TEST_RAW((x),(f)) != 0) -#define FL_SET2(x,f) FL_CHECK2("FL_SET2", x, RBASIC(x)->flags |= (f)) -#define FL_UNSET2(x,f) FL_CHECK2("FL_UNSET2", x, RBASIC(x)->flags &= ~(f)) - static inline VALUE check_rvalue_consistency(rb_objspace_t *objspace, const VALUE obj); #define RVALUE_MARKED_BITMAP(obj) MARKED_IN_BITMAP(GET_HEAP_MARK_BITS(obj), (obj)) From 218445bb1fbda6b215b42e6149da672d330a7042 Mon Sep 17 00:00:00 2001 From: tomoya ishida Date: Thu, 3 Oct 2024 21:27:39 +0900 Subject: [PATCH 653/829] [ruby/rdoc] Fix ToRdoc#accept_table (https://github.com/ruby/rdoc/pull/1184) https://github.com/ruby/rdoc/commit/7b68545094 --- lib/rdoc/markup/to_rdoc.rb | 8 ++++---- test/rdoc/support/text_formatter_test_case.rb | 17 +++++++++++++++++ test/rdoc/test_rdoc_markup_to_ansi.rb | 11 +++++++++++ test/rdoc/test_rdoc_markup_to_bs.rb | 11 +++++++++++ test/rdoc/test_rdoc_markup_to_markdown.rb | 11 +++++++++++ test/rdoc/test_rdoc_markup_to_rdoc.rb | 11 +++++++++++ 6 files changed, 65 insertions(+), 4 deletions(-) diff --git a/lib/rdoc/markup/to_rdoc.rb b/lib/rdoc/markup/to_rdoc.rb index 88234f5096d122..90763ccfdb41c7 100644 --- a/lib/rdoc/markup/to_rdoc.rb +++ b/lib/rdoc/markup/to_rdoc.rb @@ -249,8 +249,8 @@ def accept_verbatim verbatim # Adds +table+ to the output def accept_table header, body, aligns - widths = header.zip(body) do |h, b| - [h.size, b.size].max + widths = header.zip(*body).map do |cols| + cols.map(&:size).max end aligns = aligns.map do |a| case a @@ -262,12 +262,12 @@ def accept_table header, body, aligns :rjust end end - @res << header.zip(widths, aligns) do |h, w, a| + @res << header.zip(widths, aligns).map do |h, w, a| h.__send__(a, w) end.join("|").rstrip << "\n" @res << widths.map {|w| "-" * w }.join("|") << "\n" body.each do |row| - @res << row.zip(widths, aligns) do |t, w, a| + @res << row.zip(widths, aligns).map do |t, w, a| t.__send__(a, w) end.join("|").rstrip << "\n" end diff --git a/test/rdoc/support/text_formatter_test_case.rb b/test/rdoc/support/text_formatter_test_case.rb index e359028a292259..9b3d7ed626c028 100644 --- a/test/rdoc/support/text_formatter_test_case.rb +++ b/test/rdoc/support/text_formatter_test_case.rb @@ -99,6 +99,23 @@ def test_accept_paragraph_wrap accept_paragraph_wrap end + ## + # Test case that calls @to.accept_table + + def test_accept_table_align + header = ['AA', 'BB', 'CCCCC'] + body = [ + ['', 'bbb', 'c'], + ['aaaa', 'b', ''], + ['a', '', 'cc'] + ] + aligns = [nil, :left, :right] + @to.start_accepting + @to.accept_table header, body, aligns + + accept_table_align + end + ## # Test case that calls @to.attributes with an escaped # cross-reference. If this test doesn't pass something may be very diff --git a/test/rdoc/test_rdoc_markup_to_ansi.rb b/test/rdoc/test_rdoc_markup_to_ansi.rb index 81372c64d284df..893040cb44dc81 100644 --- a/test/rdoc/test_rdoc_markup_to_ansi.rb +++ b/test/rdoc/test_rdoc_markup_to_ansi.rb @@ -348,6 +348,17 @@ def list_verbatim assert_equal expected, @to.end_accepting end + def accept_table_align + expected = "\e[0m" + <<-EXPECTED + AA |BB |CCCCC +----|---|----- + |bbb| c +aaaa|b | + a | | cc + EXPECTED + assert_equal expected, @to.end_accepting + end + # functional test def test_convert_list_note note_list = <<-NOTE_LIST diff --git a/test/rdoc/test_rdoc_markup_to_bs.rb b/test/rdoc/test_rdoc_markup_to_bs.rb index 7ebde481e63ba9..93baa6b59fd6e5 100644 --- a/test/rdoc/test_rdoc_markup_to_bs.rb +++ b/test/rdoc/test_rdoc_markup_to_bs.rb @@ -349,4 +349,15 @@ def list_verbatim assert_equal expected, @to.end_accepting end + def accept_table_align + expected = <<-EXPECTED + AA |BB |CCCCC +----|---|----- + |bbb| c +aaaa|b | + a | | cc + EXPECTED + assert_equal expected, @to.end_accepting + end + end diff --git a/test/rdoc/test_rdoc_markup_to_markdown.rb b/test/rdoc/test_rdoc_markup_to_markdown.rb index 92ed37bc50c602..1b24eb8ef064b0 100644 --- a/test/rdoc/test_rdoc_markup_to_markdown.rb +++ b/test/rdoc/test_rdoc_markup_to_markdown.rb @@ -346,6 +346,17 @@ def list_verbatim assert_equal expected, @to.end_accepting end + def accept_table_align + expected = <<-EXPECTED + AA |BB |CCCCC +----|---|----- + |bbb| c +aaaa|b | + a | | cc + EXPECTED + assert_equal expected, @to.end_accepting + end + def test_convert_RDOCLINK result = @to.convert 'rdoc-garbage:C' diff --git a/test/rdoc/test_rdoc_markup_to_rdoc.rb b/test/rdoc/test_rdoc_markup_to_rdoc.rb index 50f4b6dc8b1e8e..c6f1aeae10f3f4 100644 --- a/test/rdoc/test_rdoc_markup_to_rdoc.rb +++ b/test/rdoc/test_rdoc_markup_to_rdoc.rb @@ -346,6 +346,17 @@ def list_verbatim assert_equal expected, @to.end_accepting end + def accept_table_align + expected = <<-EXPECTED + AA |BB |CCCCC +----|---|----- + |bbb| c +aaaa|b | + a | | cc + EXPECTED + assert_equal expected, @to.end_accepting + end + # functional test def test_convert_list_note note_list = <<-NOTE_LIST From cd96af2cb88a0b98add14eacf0005a8bee505d5d Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Fri, 4 Oct 2024 01:29:16 +1300 Subject: [PATCH 654/829] Add `IO::Buffer` tests for read and write with length & offset. (#11779) --- test/ruby/test_io_buffer.rb | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/test/ruby/test_io_buffer.rb b/test/ruby/test_io_buffer.rb index 98cf45d0c3da07..178ed050031c56 100644 --- a/test/ruby/test_io_buffer.rb +++ b/test/ruby/test_io_buffer.rb @@ -450,9 +450,11 @@ def test_invalidation input.close end - def hello_world_tempfile + def hello_world_tempfile(repeats = 1) io = Tempfile.new - io.write("Hello World") + repeats.times do + io.write("Hello World") + end io.seek(0) yield io @@ -484,6 +486,15 @@ def test_read_with_with_offset end end + def test_read_with_length_and_offset + hello_world_tempfile(100) do |io| + buffer = IO::Buffer.new(1024) + # Only read 24 bytes from the file, as we are starting at offset 1000 in the buffer. + assert_equal 24, buffer.read(io, 0, 1000) + assert_equal "Hello World", buffer.get_string(1000, 11) + end + end + def test_write io = Tempfile.new @@ -497,6 +508,19 @@ def test_write io.close! end + def test_write_with_length_and_offset + io = Tempfile.new + + buffer = IO::Buffer.new(5) + buffer.set_string("Hello") + buffer.write(io, 4, 1) + + io.seek(0) + assert_equal "ello", io.read(4) + ensure + io.close! + end + def test_pread io = Tempfile.new io.write("Hello World") From 66124cdb17f5152e7b1b269ca62be1773b127b2b Mon Sep 17 00:00:00 2001 From: Earlopain <14981592+Earlopain@users.noreply.github.com> Date: Thu, 3 Oct 2024 13:34:57 +0200 Subject: [PATCH 655/829] [ruby/prism] Use `partial_script` for the parser translators Followup to https://github.com/ruby/prism/pull/3079 https://github.com/ruby/prism/commit/68f434e356 --- lib/prism/translation/parser.rb | 6 +++--- lib/prism/translation/ripper.rb | 6 +----- lib/prism/translation/ruby_parser.rb | 4 ++-- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/lib/prism/translation/parser.rb b/lib/prism/translation/parser.rb index 8c7eb3aa752fd8..969f2b95b0ee78 100644 --- a/lib/prism/translation/parser.rb +++ b/lib/prism/translation/parser.rb @@ -51,7 +51,7 @@ def parse(source_buffer) source = source_buffer.source offset_cache = build_offset_cache(source) - result = unwrap(Prism.parse(source, filepath: source_buffer.name, version: convert_for_prism(version), scopes: [[]], encoding: false), offset_cache) + result = unwrap(Prism.parse(source, filepath: source_buffer.name, version: convert_for_prism(version), partial_script: true, encoding: false), offset_cache) build_ast(result.value, offset_cache) ensure @@ -64,7 +64,7 @@ def parse_with_comments(source_buffer) source = source_buffer.source offset_cache = build_offset_cache(source) - result = unwrap(Prism.parse(source, filepath: source_buffer.name, version: convert_for_prism(version), scopes: [[]], encoding: false), offset_cache) + result = unwrap(Prism.parse(source, filepath: source_buffer.name, version: convert_for_prism(version), partial_script: true, encoding: false), offset_cache) [ build_ast(result.value, offset_cache), @@ -83,7 +83,7 @@ def tokenize(source_buffer, recover = false) offset_cache = build_offset_cache(source) result = begin - unwrap(Prism.parse_lex(source, filepath: source_buffer.name, version: convert_for_prism(version), scopes: [[]], encoding: false), offset_cache) + unwrap(Prism.parse_lex(source, filepath: source_buffer.name, version: convert_for_prism(version), partial_script: true, encoding: false), offset_cache) rescue ::Parser::SyntaxError raise if !recover end diff --git a/lib/prism/translation/ripper.rb b/lib/prism/translation/ripper.rb index cafe8c3f633dec..018842715b0be0 100644 --- a/lib/prism/translation/ripper.rb +++ b/lib/prism/translation/ripper.rb @@ -3269,11 +3269,7 @@ def visit_yield_node(node) # Lazily initialize the parse result. def result - @result ||= - begin - scopes = RUBY_VERSION >= "3.3.0" ? [] : [[]] - Prism.parse(source, scopes: scopes) - end + @result ||= Prism.parse(source, partial_script: true) end ########################################################################## diff --git a/lib/prism/translation/ruby_parser.rb b/lib/prism/translation/ruby_parser.rb index 4ccff0b600ec81..189038d008d677 100644 --- a/lib/prism/translation/ruby_parser.rb +++ b/lib/prism/translation/ruby_parser.rb @@ -1596,13 +1596,13 @@ def visit_write_value(node) # Parse the given source and translate it into the seattlerb/ruby_parser # gem's Sexp format. def parse(source, filepath = "(string)") - translate(Prism.parse(source, filepath: filepath, scopes: [[]]), filepath) + translate(Prism.parse(source, filepath: filepath, partial_script: true), filepath) end # Parse the given file and translate it into the seattlerb/ruby_parser # gem's Sexp format. def parse_file(filepath) - translate(Prism.parse_file(filepath, scopes: [[]]), filepath) + translate(Prism.parse_file(filepath, partial_script: true), filepath) end class << self From f56be4286f70734ead11b316b85f504ca5b6c6dc Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Wed, 2 Oct 2024 13:55:43 -0400 Subject: [PATCH 656/829] [DOC] Add pound sign before all <=> methods --- array.c | 30 +++++++++++++++--------------- compar.c | 2 +- enum.c | 14 +++++++------- range.c | 20 ++++++++++---------- 4 files changed, 33 insertions(+), 33 deletions(-) diff --git a/array.c b/array.c index ffdae09e5252f6..f7eae0fff44572 100644 --- a/array.c +++ b/array.c @@ -3404,7 +3404,7 @@ sort_2(const void *ap, const void *bp, void *dummy) * * Returns +self+ with its elements sorted in place. * - * With no block, compares elements using operator <=> + * With no block, compares elements using operator #<=> * (see Comparable): * * a = 'abcde'.split('').shuffle @@ -3507,7 +3507,7 @@ rb_ary_sort_bang(VALUE ary) * * Returns a new +Array+ whose elements are those from +self+, sorted. * - * With no block, compares elements using operator <=> + * With no block, compares elements using operator #<=> * (see Comparable): * * a = 'abcde'.split('').shuffle @@ -5932,13 +5932,13 @@ ary_max_opt_string(VALUE ary, long i, VALUE vmax) * with a numeric. * * With no argument and no block, returns the element in +self+ - * having the maximum value per method <=>: + * having the maximum value per method #<=>: * * [1, 0, 3, 2].max # => 3 * * With non-negative numeric argument +n+ and no block, * returns a new array with at most +n+ elements, - * in descending order, per method <=>: + * in descending order, per method #<=>: * * [1, 0, 3, 2].max(3) # => [3, 2, 1] * [1, 0, 3, 2].max(3.0) # => [3, 2, 1] @@ -6103,16 +6103,16 @@ ary_min_opt_string(VALUE ary, long i, VALUE vmin) * - The minimum-valued element from +self+. * - A new +Array+ of minimum-valued elements selected from +self+. * - * When no block is given, each element in +self+ must respond to method <=> + * When no block is given, each element in +self+ must respond to method #<=> * with an Integer. * * With no argument and no block, returns the element in +self+ - * having the minimum value per method <=>: + * having the minimum value per method #<=>: * * [0, 1, 2].min # => 0 * * With Integer argument +n+ and no block, returns a new +Array+ with at most +n+ elements, - * in ascending order per method <=>: + * in ascending order per method #<=>: * * [0, 1, 2, 3].min(3) # => [0, 1, 2] * [0, 1, 2, 3].min(6) # => [0, 1, 2, 3] @@ -6176,12 +6176,12 @@ rb_ary_min(int argc, VALUE *argv, VALUE ary) * array.minmax {|a, b| ... } -> [min_val, max_val] * * Returns a new 2-element +Array+ containing the minimum and maximum values - * from +self+, either per method <=> or per a given block:. + * from +self+, either per method #<=> or per a given block:. * - * When no block is given, each element in +self+ must respond to method <=> + * When no block is given, each element in +self+ must respond to method #<=> * with an Integer; * returns a new 2-element +Array+ containing the minimum and maximum values - * from +self+, per method <=>: + * from +self+, per method #<=>: * * [0, 1, 2].minmax # => [0, 2] * @@ -8616,11 +8616,11 @@ rb_ary_deconstruct(VALUE ary) * - #first: Returns one or more leading elements. * - #last: Returns one or more trailing elements. * - #max: Returns one or more maximum-valued elements, - * as determined by <=> or a given block. + * as determined by #<=> or a given block. * - #min: Returns one or more minimum-valued elements, - * as determined by <=> or a given block. + * as determined by #<=> or a given block. * - #minmax: Returns the minimum-valued and maximum-valued elements, - * as determined by <=> or a given block. + * as determined by #<=> or a given block. * - #assoc: Returns the first element that is an array * whose first element == a given object. * - #rassoc: Returns the first element that is an array @@ -8633,7 +8633,7 @@ rb_ary_deconstruct(VALUE ary) * - #take: Returns leading elements as determined by a given index. * - #drop_while: Returns trailing elements as determined by a given block. * - #take_while: Returns leading elements as determined by a given block. - * - #sort: Returns all elements in an order determined by <=> or a given block. + * - #sort: Returns all elements in an order determined by #<=> or a given block. * - #reverse: Returns all elements in reverse order. * - #compact: Returns an array containing all non-+nil+ elements. * - #select (aliased as #filter): Returns an array containing elements selected by a given block. @@ -8663,7 +8663,7 @@ rb_ary_deconstruct(VALUE ary) * - #rotate!: Replaces +self+ with its elements rotated. * - #shuffle!: Replaces +self+ with its elements in random order. * - #sort!: Replaces +self+ with its elements sorted, - * as determined by <=> or a given block. + * as determined by #<=> or a given block. * - #sort_by!: Replaces +self+ with its elements sorted, as determined by a given block. * * === Methods for Deleting diff --git a/compar.c b/compar.c index 081b4e2dea9f44..8d7a2081858789 100644 --- a/compar.c +++ b/compar.c @@ -293,7 +293,7 @@ cmp_clamp(int argc, VALUE *argv, VALUE x) * * == What's Here * - * \Module \Comparable provides these methods, all of which use method <=>: + * \Module \Comparable provides these methods, all of which use method #<=>: * * - #<: Returns whether +self+ is less than the given object. * - #<=: Returns whether +self+ is less than or equal to the given object. diff --git a/enum.c b/enum.c index b044da20d26a81..495b01dfa05309 100644 --- a/enum.c +++ b/enum.c @@ -1358,7 +1358,7 @@ enum_first(int argc, VALUE *argv, VALUE obj) * The ordering of equal elements is indeterminate and may be unstable. * * With no block given, the sort compares - * using the elements' own method <=>: + * using the elements' own method #<=>: * * %w[b c a d].sort # => ["a", "b", "c", "d"] * {foo: 0, bar: 1, baz: 2}.sort # => [[:bar, 1], [:baz, 2], [:foo, 0]] @@ -2327,7 +2327,7 @@ min_ii(RB_BLOCK_CALL_FUNC_ARGLIST(i, args)) * The ordering of equal elements is indeterminate and may be unstable. * * With no argument and no block, returns the minimum element, - * using the elements' own method <=> for comparison: + * using the elements' own method #<=> for comparison: * * (1..4).min # => 1 * (-4..-1).min # => -4 @@ -2449,7 +2449,7 @@ max_ii(RB_BLOCK_CALL_FUNC_ARGLIST(i, args)) * The ordering of equal elements is indeterminate and may be unstable. * * With no argument and no block, returns the maximum element, - * using the elements' own method <=> for comparison: + * using the elements' own method #<=> for comparison: * * (1..4).max # => 4 * (-4..-1).max # => -1 @@ -2638,7 +2638,7 @@ minmax_ii(RB_BLOCK_CALL_FUNC_ARGLIST(i, _memo)) * The ordering of equal elements is indeterminate and may be unstable. * * With no argument and no block, returns the minimum and maximum elements, - * using the elements' own method <=> for comparison: + * using the elements' own method #<=> for comparison: * * (1..4).minmax # => [1, 4] * (-4..-1).minmax # => [-4, -1] @@ -4980,9 +4980,9 @@ enum_compact(VALUE obj) * Minimum and maximum value elements: * * - #min: Returns the elements whose values are smallest among the elements, - * as determined by <=> or a given block. + * as determined by #<=> or a given block. * - #max: Returns the elements whose values are largest among the elements, - * as determined by <=> or a given block. + * as determined by #<=> or a given block. * - #minmax: Returns a 2-element Array containing the smallest and largest elements. * - #min_by: Returns the smallest element, as determined by the given block. * - #max_by: Returns the largest element, as determined by the given block. @@ -5015,7 +5015,7 @@ enum_compact(VALUE obj) * * These methods return elements in sorted order: * - * - #sort: Returns the elements, sorted by <=> or the given block. + * - #sort: Returns the elements, sorted by #<=> or the given block. * - #sort_by: Returns the elements, sorted by the given block. * * === Methods for Iterating diff --git a/range.c b/range.c index 49c34aa8cbefd4..e06e3be7d97cd7 100644 --- a/range.c +++ b/range.c @@ -1471,7 +1471,7 @@ range_last(int argc, VALUE *argv, VALUE range) * min(n) {|a, b| ... } -> array * * Returns the minimum value in +self+, - * using method <=> or a given block for comparison. + * using method #<=> or a given block for comparison. * * With no argument and no block given, * returns the minimum-valued element of +self+. @@ -1579,7 +1579,7 @@ range_min(int argc, VALUE *argv, VALUE range) * max(n) {|a, b| ... } -> array * * Returns the maximum value in +self+, - * using method <=> or a given block for comparison. + * using method #<=> or a given block for comparison. * * With no argument and no block given, * returns the maximum-valued element of +self+. @@ -1698,10 +1698,10 @@ range_max(int argc, VALUE *argv, VALUE range) * minmax {|a, b| ... } -> [object, object] * * Returns a 2-element array containing the minimum and maximum value in +self+, - * either according to comparison method <=> or a given block. + * either according to comparison method #<=> or a given block. * * With no block given, returns the minimum and maximum values, - * using <=> for comparison: + * using #<=> for comparison: * * (1..4).minmax # => [1, 4] * (1...4).minmax # => [1, 3] @@ -2151,7 +2151,7 @@ static int r_cover_range_p(VALUE range, VALUE beg, VALUE end, VALUE val); * Returns +false+ if either: * * - The begin value of +self+ is larger than its end value. - * - An internal call to <=> returns +nil+; + * - An internal call to #<=> returns +nil+; * that is, the operands are not comparable. * * Beginless ranges cover all values of the same type before the end, @@ -2399,7 +2399,7 @@ empty_region_p(VALUE beg, VALUE end, int excl) * * (1..3).overlap?(1) # TypeError * - * Returns +false+ if an internal call to <=> returns +nil+; + * Returns +false+ if an internal call to #<=> returns +nil+; * that is, the operands are not comparable. * * (1..3).overlap?('a'..'d') # => false @@ -2589,7 +2589,7 @@ range_overlap(VALUE range, VALUE other) * == Ranges and Other Classes * * An object may be put into a range if its class implements - * instance method <=>. + * instance method #<=>. * Ruby core classes that do so include Array, Complex, File::Stat, * Float, Integer, Kernel, Module, Numeric, Rational, String, Symbol, and Time. * @@ -2621,15 +2621,15 @@ range_overlap(VALUE range, VALUE other) * == Ranges and User-Defined Classes * * A user-defined class that is to be used in a range - * must implement instance <=>; + * must implement instance #<=>; * see Integer#<=>. * To make iteration available, it must also implement * instance method +succ+; see Integer#succ. * - * The class below implements both <=> and +succ+, + * The class below implements both #<=> and +succ+, * and so can be used both to construct ranges and to iterate over them. * Note that the Comparable module is included - * so the == method is defined in terms of <=>. + * so the == method is defined in terms of #<=>. * * # Represent a string of 'X' characters. * class Xs From dc83de49288d6da59fd8b13f701ac437e09f2d23 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Wed, 2 Oct 2024 13:56:19 -0400 Subject: [PATCH 657/829] [DOC] Add missing word --- range.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/range.c b/range.c index e06e3be7d97cd7..4af5d4943ec3c8 100644 --- a/range.c +++ b/range.c @@ -2621,7 +2621,7 @@ range_overlap(VALUE range, VALUE other) * == Ranges and User-Defined Classes * * A user-defined class that is to be used in a range - * must implement instance #<=>; + * must implement instance method #<=>; * see Integer#<=>. * To make iteration available, it must also implement * instance method +succ+; see Integer#succ. From 9986a7c3930437bc9d9b88736c22695585aa6c48 Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Wed, 11 Sep 2024 21:29:41 -0700 Subject: [PATCH 658/829] Make Object#singleton_method return methods in modules included in or prepended to singleton class To simplify the implementation, this makes Object#singleton_method call the same method called by Object#method (rb_obj_method), then check that the returned Method is defined before the superclass of the object's singleton class. To keep the same error messages, it rescues exceptions raised by rb_obj_method, and then raises its own exception. Fixes [Bug #20620] --- proc.c | 47 ++++++++++++++++++++++++++++------------ test/ruby/test_method.rb | 32 +++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 14 deletions(-) diff --git a/proc.c b/proc.c index b1956bb3468826..8e82c13720ab78 100644 --- a/proc.c +++ b/proc.c @@ -2046,6 +2046,19 @@ rb_obj_public_method(VALUE obj, VALUE vid) return obj_method(obj, vid, TRUE); } +static VALUE +rb_obj_singleton_method_lookup(VALUE arg) +{ + VALUE *args = (VALUE *)arg; + return rb_obj_method(args[0], args[1]); +} + +static VALUE +rb_obj_singleton_method_lookup_fail(VALUE arg1, VALUE arg2) +{ + return Qfalse; +} + /* * call-seq: * obj.singleton_method(sym) -> method @@ -2073,11 +2086,12 @@ rb_obj_public_method(VALUE obj, VALUE vid) VALUE rb_obj_singleton_method(VALUE obj, VALUE vid) { - VALUE klass = rb_singleton_class_get(obj); + VALUE sc = rb_singleton_class_get(obj); + VALUE klass; ID id = rb_check_id(&vid); - if (NIL_P(klass) || - NIL_P(klass = RCLASS_ORIGIN(klass)) || + if (NIL_P(sc) || + NIL_P(klass = RCLASS_ORIGIN(sc)) || !NIL_P(rb_special_singleton_class(obj))) { /* goto undef; */ } @@ -2087,21 +2101,26 @@ rb_obj_singleton_method(VALUE obj, VALUE vid) /* else goto undef; */ } else { - const rb_method_entry_t *me = rb_method_entry_at(klass, id); - vid = ID2SYM(id); - - if (UNDEFINED_METHOD_ENTRY_P(me)) { - /* goto undef; */ - } - else if (UNDEFINED_REFINED_METHOD_P(me->def)) { - /* goto undef; */ - } - else { - return mnew_from_me(me, klass, klass, obj, id, rb_cMethod, FALSE); + VALUE args[2] = {obj, vid}; + VALUE ruby_method = rb_rescue(rb_obj_singleton_method_lookup, (VALUE)args, rb_obj_singleton_method_lookup_fail, Qfalse); + if (ruby_method) { + struct METHOD *method = (struct METHOD *)RTYPEDDATA_GET_DATA(ruby_method); + VALUE lookup_class = RBASIC_CLASS(obj); + VALUE stop_class = rb_class_superclass(sc); + VALUE method_class = method->iclass; + + /* Determine if method is in singleton class, or module included in or prepended to it */ + do { + if (lookup_class == method_class) { + return ruby_method; + } + lookup_class = RCLASS_SUPER(lookup_class); + } while (lookup_class && lookup_class != stop_class); } } /* undef: */ + vid = ID2SYM(id); rb_name_err_raise("undefined singleton method '%1$s' for '%2$s'", obj, vid); UNREACHABLE_RETURN(Qundef); diff --git a/test/ruby/test_method.rb b/test/ruby/test_method.rb index a7945082c23701..ebe711ddb47028 100644 --- a/test/ruby/test_method.rb +++ b/test/ruby/test_method.rb @@ -940,6 +940,38 @@ class << o; prepend Module.new; end assert_raise(NameError, bug14658) {o.singleton_method(:bar)} end + def test_singleton_method_included_or_prepended_bug_20620 + m = Module.new do + extend self + def foo = :foo + end + assert_equal(:foo, m.singleton_method(:foo).call) + assert_raise(NameError) {m.singleton_method(:puts)} + + sc = Class.new do + def t = :t + end + c = Class.new(sc) do + singleton_class.prepend(Module.new do + def bar = :bar + end) + extend(Module.new do + def quux = :quux + end) + def self.baz = :baz + end + assert_equal(:bar, c.singleton_method(:bar).call) + assert_equal(:baz, c.singleton_method(:baz).call) + assert_equal(:quux, c.singleton_method(:quux).call) + + assert_raise(NameError) {c.singleton_method(:t)} + + c2 = Class.new(c) + assert_raise(NameError) {c2.singleton_method(:bar)} + assert_raise(NameError) {c2.singleton_method(:baz)} + assert_raise(NameError) {c2.singleton_method(:quux)} + end + Feature9783 = '[ruby-core:62212] [Feature #9783]' def assert_curry_three_args(m) From ac0a8c6230537cc92f137f517517f67ea2e34032 Mon Sep 17 00:00:00 2001 From: tomoya ishida Date: Fri, 4 Oct 2024 00:52:29 +0900 Subject: [PATCH 659/829] [ruby/reline] Make rendering test faster using updated yamatanooroti (https://github.com/ruby/reline/pull/747) https://github.com/ruby/reline/commit/7534f7f92a --- test/reline/yamatanooroti/test_rendering.rb | 234 ++++++++++---------- 1 file changed, 118 insertions(+), 116 deletions(-) diff --git a/test/reline/yamatanooroti/test_rendering.rb b/test/reline/yamatanooroti/test_rendering.rb index c90d3d6a7f1092..000491270f67aa 100644 --- a/test/reline/yamatanooroti/test_rendering.rb +++ b/test/reline/yamatanooroti/test_rendering.rb @@ -56,66 +56,65 @@ def test_history_back start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') write(":a\n") write("\C-p") - close assert_screen(<<~EOC) Multiline REPL. prompt> :a => :a prompt> :a EOC + close end def test_backspace start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') write(":abc\C-h\n") - close assert_screen(<<~EOC) Multiline REPL. prompt> :ab => :ab prompt> EOC + close end def test_autowrap start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') write('01234567890123456789012') - close assert_screen(<<~EOC) Multiline REPL. prompt> 0123456789012345678901 2 EOC + close end def test_fullwidth start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') write(":あ\n") - close assert_screen(<<~EOC) Multiline REPL. prompt> :あ => :あ prompt> EOC + close end def test_two_fullwidth start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') write(":あい\n") - close assert_screen(<<~EOC) Multiline REPL. prompt> :あい => :あい prompt> EOC + close end def test_finish_autowrapped_line start_terminal(10, 40, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') write("[{'user'=>{'email'=>'a@a', 'id'=>'ABC'}, 'version'=>4, 'status'=>'succeeded'}]\n") - close assert_screen(<<~EOC) Multiline REPL. prompt> [{'user'=>{'email'=>'a@a', 'id'= @@ -126,13 +125,13 @@ def test_finish_autowrapped_line ] prompt> EOC + close end def test_finish_autowrapped_line_in_the_middle_of_lines start_terminal(20, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') write("[{'user'=>{'email'=>'abcdef@abcdef', 'id'=>'ABC'}, 'version'=>4, 'status'=>'succeeded'}]#{"\C-b"*7}") write("\n") - close assert_screen(<<~EOC) Multiline REPL. prompt> [{'user'=>{'email'=>'a @@ -145,13 +144,13 @@ def test_finish_autowrapped_line_in_the_middle_of_lines ] prompt> EOC + close end def test_finish_autowrapped_line_in_the_middle_of_multilines omit if RUBY_VERSION < '2.7' start_terminal(30, 16, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') write("<<~EOM\n ABCDEFG\nEOM\n") - close assert_screen(<<~'EOC') Multiline REPL. prompt> <<~EOM @@ -161,6 +160,7 @@ def test_finish_autowrapped_line_in_the_middle_of_multilines => "ABCDEFG\n" prompt> EOC + close end def test_prompt @@ -169,13 +169,13 @@ def test_prompt LINES start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') write("abc\n") - close assert_screen(<<~EOC) Multiline REPL. prompt> 123 => 123 prompt> EOC + close end def test_mode_string_emacs @@ -183,11 +183,11 @@ def test_mode_string_emacs set show-mode-in-prompt on LINES start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') - close assert_screen(<<~EOC) Multiline REPL. @prompt> EOC + close end def test_mode_string_vi @@ -199,7 +199,6 @@ def test_mode_string_vi write(":a\n\C-[k") write("i\n:a") write("\C-[h") - close assert_screen(<<~EOC) (ins)prompt> :a => :a @@ -207,6 +206,7 @@ def test_mode_string_vi => :a (cmd)prompt> :a EOC + close end def test_original_mode_string_emacs @@ -215,11 +215,11 @@ def test_original_mode_string_emacs set emacs-mode-string [emacs] LINES start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') - close assert_screen(<<~EOC) Multiline REPL. [emacs]prompt> EOC + close end def test_original_mode_string_with_quote @@ -228,11 +228,11 @@ def test_original_mode_string_with_quote set emacs-mode-string "[emacs]" LINES start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') - close assert_screen(<<~EOC) Multiline REPL. [emacs]prompt> EOC + close end def test_original_mode_string_vi @@ -244,13 +244,13 @@ def test_original_mode_string_vi LINES start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') write(":a\n\C-[k") - close assert_screen(<<~EOC) Multiline REPL. {InS}prompt> :a => :a {CmD}prompt> :a EOC + close end def test_mode_string_vi_changing @@ -260,11 +260,11 @@ def test_mode_string_vi_changing LINES start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') write(":a\C-[ab\C-[ac\C-h\C-h\C-h\C-h:a") - close assert_screen(<<~EOC) Multiline REPL. (ins)prompt> :a EOC + close end def test_esc_input @@ -275,31 +275,30 @@ def test_esc_input sleep 1 write("A") write("B\eAC") # ESC + A (M-A, specified ed_unassigned in Reline::KeyActor::Emacs) - close assert_screen(<<~EOC) Multiline REPL. prompt> abcABCdef EOC + close end def test_prompt_with_escape_sequence ENV['RELINE_TEST_PROMPT'] = "\1\e[30m\2prompt> \1\e[m\2" start_terminal(5, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') write("123\n") - close assert_screen(<<~EOC) Multiline REPL. prompt> 123 => 123 prompt> EOC + close end def test_prompt_with_escape_sequence_and_autowrap ENV['RELINE_TEST_PROMPT'] = "\1\e[30m\2prompt> \1\e[m\2" start_terminal(5, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') write("1234567890123\n") - close assert_screen(<<~EOC) Multiline REPL. prompt> 123456789012 @@ -307,6 +306,7 @@ def test_prompt_with_escape_sequence_and_autowrap => 1234567890123 prompt> EOC + close end def test_readline_with_multiline_input @@ -314,7 +314,6 @@ def test_readline_with_multiline_input write("def foo\n bar\nend\n") write("Reline.readline('prompt> ')\n") write("\C-p\C-p") - close assert_screen(<<~EOC) => :foo [0000]> Reline.readline('prompt> ') @@ -322,12 +321,12 @@ def test_readline_with_multiline_input bar end EOC + close end def test_multiline_and_autowrap start_terminal(10, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') write("def aaaaaaaaaa\n 33333333\n end\C-a\C-pputs\C-e\e\C-m888888888888888") - close assert_screen(<<~EOC) Multiline REPL. prompt> def aaaaaaaa @@ -339,6 +338,7 @@ def test_multiline_and_autowrap prompt> e nd EOC + close end def test_multiline_add_new_line_and_autowrap @@ -347,7 +347,6 @@ def test_multiline_add_new_line_and_autowrap write("\n") write(" bbbbbbbbbbbb") write("\n") - close assert_screen(<<~EOC) Multiline REPL. prompt> def aaaaaaaa @@ -356,56 +355,56 @@ def test_multiline_add_new_line_and_autowrap bb prompt> EOC + close end def test_clear start_terminal(10, 15, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') write("3\C-l") - close assert_screen(<<~EOC) prompt> 3 EOC + close end def test_clear_multiline_and_autowrap start_terminal(10, 15, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') write("def aaaaaa\n 3\n\C-lend") - close assert_screen(<<~EOC) prompt> def aaa aaa prompt> 3 prompt> end EOC + close end def test_nearest_cursor start_terminal(10, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') write("def ああ\n :いい\nend\C-pbb\C-pcc") - close assert_screen(<<~EOC) Multiline REPL. prompt> def ccああ prompt> :bbいい prompt> end EOC + close end def test_delete_line start_terminal(10, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') write("def a\n\nend\C-p\C-h") - close assert_screen(<<~EOC) Multiline REPL. prompt> def a prompt> end EOC + close end def test_last_line_of_screen start_terminal(5, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') write("\n\n\n\n\ndef a\nend") - close assert_screen(<<~EOC) prompt> prompt> @@ -413,13 +412,13 @@ def test_last_line_of_screen prompt> def a prompt> end EOC + close end # c17a09b7454352e2aff5a7d8722e80afb73e454b def test_autowrap_at_last_line_of_screen start_terminal(5, 15, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') write("def a\nend\n\C-p") - close assert_screen(<<~EOC) prompt> def a prompt> end @@ -427,60 +426,60 @@ def test_autowrap_at_last_line_of_screen prompt> def a prompt> end EOC + close end # f002483b27cdb325c5edf9e0fe4fa4e1c71c4b0e def test_insert_line_in_the_middle_of_line start_terminal(5, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') write("333\C-b\C-b\e\C-m8") - close assert_screen(<<~EOC) Multiline REPL. prompt> 3 prompt> 833 EOC + close end # 9d8978961c5de5064f949d56d7e0286df9e18f43 def test_insert_line_in_the_middle_of_line_at_last_line_of_screen start_terminal(3, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') write("333333333333333\C-a\C-f\e\C-m") - close assert_screen(<<~EOC) prompt> 3 prompt> 333333333333 33 EOC + close end def test_insert_after_clear start_terminal(10, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') write("def a\n 01234\nend\C-l\C-p5678") - close assert_screen(<<~EOC) prompt> def a prompt> 056781234 prompt> end EOC + close end def test_foced_newline_insertion start_terminal(10, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') #write("def a\nend\C-p\C-e\e\C-m 3") write("def a\nend\C-p\C-e\e\x0D") - close assert_screen(<<~EOC) Multiline REPL. prompt> def a prompt> prompt> end EOC + close end def test_multiline_incremental_search start_terminal(6, 25, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') write("def a\n 8\nend\ndef b\n 3\nend\C-s8") - close assert_screen(<<~EOC) prompt> 8 prompt> end @@ -489,12 +488,12 @@ def test_multiline_incremental_search (i-search)`8' 8 (i-search)`8'end EOC + close end def test_multiline_incremental_search_finish start_terminal(6, 25, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') write("def a\n 8\nend\ndef b\n 3\nend\C-r8\C-j") - close assert_screen(<<~EOC) prompt> 8 prompt> end @@ -503,6 +502,7 @@ def test_multiline_incremental_search_finish prompt> 8 prompt> end EOC + close end def test_binding_for_vi_movement_mode @@ -512,48 +512,48 @@ def test_binding_for_vi_movement_mode LINES start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') write(":1234\C-ahhhi0") - close assert_screen(<<~EOC) Multiline REPL. prompt> :01234 EOC + close end def test_broken_prompt_list start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --broken-dynamic-prompt}, startup_message: 'Multiline REPL.') write("def hoge\n 3\nend") - close assert_screen(<<~EOC) Multiline REPL. [0000]> def hoge [0001]> 3 [0001]> end EOC + close end def test_no_escape_sequence_passed_to_dynamic_prompt start_terminal(10, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --autocomplete --color-bold --broken-dynamic-prompt-assert-no-escape-sequence}, startup_message: 'Multiline REPL.') write("%[ S") write("\n") - close assert_screen(<<~EOC) Multiline REPL. [0000]> %[ S [0001]> EOC + close end def test_bracketed_paste omit if Reline.core.io_gate.win? start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') write("\e[200~def hoge\r\t3\rend\e[201~") - close assert_screen(<<~EOC) Multiline REPL. prompt> def hoge prompt> 3 prompt> end EOC + close end def test_bracketed_paste_with_undo @@ -562,11 +562,11 @@ def test_bracketed_paste_with_undo write("abc") write("\e[200~def hoge\r\t3\rend\e[201~") write("\C-_") - close assert_screen(<<~EOC) Multiline REPL. prompt> abc EOC + close end def test_bracketed_paste_with_redo @@ -576,24 +576,24 @@ def test_bracketed_paste_with_redo write("\e[200~def hoge\r\t3\rend\e[201~") write("\C-_") write("\M-\C-_") - close assert_screen(<<~EOC) Multiline REPL. prompt> abcdef hoge prompt> 3 prompt> end EOC + close end def test_backspace_until_returns_to_initial start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') write("ABC") write("\C-h\C-h\C-h") - close assert_screen(<<~EOC) Multiline REPL. prompt> EOC + close end def test_longer_than_screen_height @@ -632,8 +632,6 @@ def each_top_level_statement end end EOC - sleep 1 - close assert_screen(<<~EOC) prompt> prompt prompt> end @@ -641,6 +639,7 @@ def each_top_level_statement prompt> end prompt> end EOC + close end def test_longer_than_screen_height_with_scroll_back @@ -681,7 +680,6 @@ def each_top_level_statement EOC sleep 1 write("\C-p" * 6) - close assert_screen(<<~EOC) prompt> rescue Terminate LineInput @@ -689,6 +687,7 @@ def each_top_level_statement ut prompt> prompt EOC + close end def test_longer_than_screen_height_with_complex_scroll_back @@ -730,13 +729,13 @@ def each_top_level_statement sleep 1 write("\C-p" * 5) write("\C-n" * 3) - close assert_screen(<<~EOC) ut prompt> prompt prompt> end prompt> end EOC + close end def test_longer_than_screen_height_nearest_cursor_with_scroll_back @@ -754,7 +753,6 @@ def test_longer_than_screen_height_nearest_cursor_with_scroll_back EOC write("\C-p" * 4 + "\C-e" + "\C-p" * 4) write("2") - close assert_screen(<<~EOC) prompt> if 12 prompt> if 2 @@ -762,6 +760,7 @@ def test_longer_than_screen_height_nearest_cursor_with_scroll_back prompt> if 4 prompt> puts EOC + close end def test_update_cursor_correctly_when_just_cursor_moving @@ -773,12 +772,12 @@ def test_update_cursor_correctly_when_just_cursor_moving write('5') write("\C-e") write('9') - close assert_screen(<<~EOC) Multiline REPL. prompt> def hoge prompt> 0123456789 EOC + close end def test_auto_indent @@ -786,7 +785,6 @@ def test_auto_indent "def hoge\nputs(\n1,\n2\n)\nend".lines do |line| write line end - close assert_screen(<<~EOC) Multiline REPL. prompt> def hoge @@ -796,18 +794,19 @@ def test_auto_indent prompt> ) prompt> end EOC + close end def test_auto_indent_when_inserting_line start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --auto-indent}, startup_message: 'Multiline REPL.') write 'aa(bb(cc(dd(ee(' write "\C-b" * 5 + "\n" - close assert_screen(<<~EOC) Multiline REPL. prompt> aa(bb(cc(d prompt> d(ee( EOC + close end def test_auto_indent_multibyte_insert_line @@ -815,7 +814,6 @@ def test_auto_indent_multibyte_insert_line write "if true\n" write "あいうえお\n" 4.times { write "\C-b\C-b\C-b\C-b\e\r" } - close assert_screen(<<~EOC) Multiline REPL. prompt> if true @@ -826,26 +824,26 @@ def test_auto_indent_multibyte_insert_line prompt> お prompt> EOC + close end def test_newline_after_wrong_indent start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --auto-indent}, startup_message: 'Multiline REPL.') write "if 1\n aa" write "\n" - close assert_screen(<<~EOC) Multiline REPL. prompt> if 1 prompt> aa prompt> EOC + close end def test_suppress_auto_indent_just_after_pasted start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --auto-indent}, startup_message: 'Multiline REPL.') write("def hoge\n [[\n 3]]\ned") write("\C-bn") - close assert_screen(<<~EOC) Multiline REPL. prompt> def hoge @@ -853,6 +851,7 @@ def test_suppress_auto_indent_just_after_pasted prompt> 3]] prompt> end EOC + close end def test_suppress_auto_indent_for_adding_newlines_in_pasting @@ -860,7 +859,6 @@ def test_suppress_auto_indent_for_adding_newlines_in_pasting write("<<~Q\n") write("{\n #\n}") write("#") - close assert_screen(<<~EOC) Multiline REPL. prompt> <<~Q @@ -868,6 +866,7 @@ def test_suppress_auto_indent_for_adding_newlines_in_pasting prompt> # prompt> }# EOC + close end def test_auto_indent_with_various_spaces @@ -875,13 +874,13 @@ def test_auto_indent_with_various_spaces write "(\n\C-v" write "\C-k\n\C-v" write "\C-k)" - close assert_screen(<<~EOC) Multiline REPL. prompt> ( prompt> ^K prompt> ) EOC + close end def test_autowrap_in_the_middle_of_a_line @@ -890,19 +889,18 @@ def test_autowrap_in_the_middle_of_a_line %w{h i}.each do |c| write(c) end - close assert_screen(<<~EOC) Multiline REPL. prompt> def abcdefgh i; end EOC + close end def test_terminate_in_the_middle_of_lines start_terminal(5, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') write("def hoge\n 1\n 2\n 3\n 4\nend\n") write("\C-p\C-p\C-p\C-e\n") - close assert_screen(<<~EOC) prompt> 3 prompt> 4 @@ -910,12 +908,12 @@ def test_terminate_in_the_middle_of_lines => :hoge prompt> EOC + close end def test_dynamic_prompt_returns_empty start_terminal(5, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --dynamic-prompt-returns-empty}, startup_message: 'Multiline REPL.') write("def hoge\nend\n") - close assert_screen(<<~EOC) Multiline REPL. prompt> def hoge @@ -923,108 +921,106 @@ def test_dynamic_prompt_returns_empty => :hoge prompt> EOC + close end def test_reset_rest_height_when_clear_screen start_terminal(5, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') write("\n\n\n\C-l3\n") - close assert_screen(<<~EOC) prompt> 3 => 3 prompt> EOC + close end def test_meta_key start_terminal(30, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') write("def ge\M-bho") - close assert_screen(<<~EOC) Multiline REPL. prompt> def hoge EOC + close end def test_not_meta_key start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') write("おだんご") # "だ" in UTF-8 contains "\xA0" - close assert_screen(<<~EOC) Multiline REPL. prompt> おだんご EOC + close end def test_force_enter start_terminal(30, 120, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') write("def hoge\nend\C-p\C-e") write("\M-\x0D") - close assert_screen(<<~EOC) Multiline REPL. prompt> def hoge prompt> prompt> end EOC + close end def test_nontty omit if Reline.core.io_gate.win? cmd = %Q{ruby -e 'puts(%Q{ello\C-ah\C-e})' | ruby -I#{@pwd}/lib -rreline -e 'p Reline.readline(%{> })' | ruby -e 'print STDIN.read'} start_terminal(40, 50, ['bash', '-c', cmd]) - sleep 1 - close rescue nil assert_screen(<<~'EOC') > hello "hello" EOC + close end def test_eof_with_newline omit if Reline.core.io_gate.win? cmd = %Q{ruby -e 'print(%Q{abc def \\e\\r})' | ruby -I#{@pwd}/lib -rreline -e 'p Reline.readline(%{> })'} start_terminal(40, 50, ['bash', '-c', cmd]) - sleep 1 - close rescue nil assert_screen(<<~'EOC') > abc def "abc def " EOC + close end def test_eof_without_newline omit if Reline.core.io_gate.win? cmd = %Q{ruby -e 'print(%{hello})' | ruby -I#{@pwd}/lib -rreline -e 'p Reline.readline(%{> })'} start_terminal(40, 50, ['bash', '-c', cmd]) - sleep 1 - close rescue nil assert_screen(<<~'EOC') > hello "hello" EOC + close end def test_em_set_mark_and_em_exchange_mark start_terminal(10, 50, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') write("aaa bbb ccc ddd\M-b\M-b\M-\x20\M-b\C-x\C-xX\C-x\C-xY") - close assert_screen(<<~'EOC') Multiline REPL. prompt> aaa Ybbb Xccc ddd EOC + close end def test_multiline_completion start_terminal(10, 50, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --complete}, startup_message: 'Multiline REPL.') write("def hoge\n St\n St\C-p\t") - close assert_screen(<<~'EOC') Multiline REPL. prompt> def hoge prompt> String prompt> St EOC + close end def test_completion_journey_2nd_line @@ -1033,12 +1029,12 @@ def test_completion_journey_2nd_line LINES start_terminal(10, 50, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --complete}, startup_message: 'Multiline REPL.') write("def hoge\n S\C-n") - close assert_screen(<<~'EOC') Multiline REPL. prompt> def hoge prompt> String EOC + close end def test_completion_journey_with_empty_line @@ -1047,23 +1043,23 @@ def test_completion_journey_with_empty_line LINES start_terminal(10, 50, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --complete}, startup_message: 'Multiline REPL.') write("\C-n\C-p") - close assert_screen(<<~'EOC') Multiline REPL. prompt> EOC + close end def test_completion_menu_is_displayed_horizontally start_terminal(20, 50, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --complete}, startup_message: 'Multiline REPL.') write("S\t\t") - close assert_screen(<<~'EOC') Multiline REPL. prompt> S ScriptError String Signal SyntaxError EOC + close end def test_show_all_if_ambiguous_on @@ -1072,13 +1068,13 @@ def test_show_all_if_ambiguous_on LINES start_terminal(20, 50, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --complete}, startup_message: 'Multiline REPL.') write("S\t") - close assert_screen(<<~'EOC') Multiline REPL. prompt> S ScriptError String Signal SyntaxError EOC + close end def test_show_all_if_ambiguous_on_and_menu_with_perfect_match @@ -1087,12 +1083,12 @@ def test_show_all_if_ambiguous_on_and_menu_with_perfect_match LINES start_terminal(20, 50, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --complete-menu-with-perfect-match}, startup_message: 'Multiline REPL.') write("a\t") - close assert_screen(<<~'EOC') Multiline REPL. prompt> abs abs abs2 EOC + close end def test_simple_dialog @@ -1143,7 +1139,6 @@ def test_dialog_scroll_pushup_condition write("\n" * 10) write("if 1\n sSts\nend") write("\C-p\C-h\C-e\C-h") - close assert_screen(<<~'EOC') prompt> prompt> @@ -1156,6 +1151,7 @@ def test_dialog_scroll_pushup_condition prompt> enString Struct EOC + close end end @@ -1179,7 +1175,6 @@ def test_autocomplete_at_bottom start_terminal(15, 50, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --autocomplete}, startup_message: 'Multiline REPL.') write('def hoge' + "\C-m" * 10 + "end\C-p ") write('S') - close assert_screen(<<~'EOC') Multiline REPL. prompt> def hoge @@ -1194,6 +1189,7 @@ def test_autocomplete_at_bottom prompt> S prompt> end EOC + close end def test_autocomplete_return_to_original @@ -1202,13 +1198,13 @@ def test_autocomplete_return_to_original write('t') write('r') 3.times{ write("\C-i") } - close assert_screen(<<~'EOC') Multiline REPL. prompt> Str String Struct EOC + close end def test_autocomplete_target_is_wrapped @@ -1217,7 +1213,6 @@ def test_autocomplete_target_is_wrapped write('S') write('t') write('r') - close assert_screen(<<~'EOC') Multiline REPL. prompt> St @@ -1225,6 +1220,7 @@ def test_autocomplete_target_is_wrapped String Struct EOC + close end def test_autocomplete_target_at_end_of_line @@ -1232,13 +1228,13 @@ def test_autocomplete_target_at_end_of_line write(' ') write('Str') write("\C-i") - close assert_screen(<<~'EOC') Multiline REPL. prompt> Str ing String Struct EOC + close end def test_autocomplete_completed_input_is_wrapped @@ -1246,33 +1242,32 @@ def test_autocomplete_completed_input_is_wrapped write(' ') write('Str') write("\C-i") - close assert_screen(<<~'EOC') Multiline REPL. prompt> Stri ng String Struct EOC + close end def test_force_insert_before_autocomplete start_terminal(20, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --autocomplete}, startup_message: 'Multiline REPL.') write('Sy') write(";St\t\t") - close assert_screen(<<~'EOC') Multiline REPL. prompt> Sy;Struct String Struct EOC + close end def test_simple_dialog_with_scroll_key start_terminal(20, 50, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --dialog long,scrollkey}, startup_message: 'Multiline REPL.') write('a') 5.times{ write('j') } - close assert_screen(<<~'EOC') Multiline REPL. prompt> a @@ -1281,13 +1276,13 @@ def test_simple_dialog_with_scroll_key language with a focus on simplicity EOC + close end def test_simple_dialog_scrollbar_with_moving_to_right start_terminal(20, 50, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --dialog long,scrollkey,scrollbar}, startup_message: 'Multiline REPL.') 6.times{ write('j') } write('a') - close assert_screen(<<~'EOC') Multiline REPL. prompt> a @@ -1296,6 +1291,7 @@ def test_simple_dialog_scrollbar_with_moving_to_right focus on simplicity and productivity. EOC + close end def test_simple_dialog_scrollbar_with_moving_to_left @@ -1303,7 +1299,6 @@ def test_simple_dialog_scrollbar_with_moving_to_left write('a') 6.times{ write('j') } write("\C-h") - close assert_screen(<<~'EOC') Multiline REPL. prompt> @@ -1312,13 +1307,13 @@ def test_simple_dialog_scrollbar_with_moving_to_left focus on simplicity and productivity. EOC + close end def test_dialog_with_fullwidth_chars ENV['RELINE_TEST_PROMPT'] = '> ' start_terminal(20, 5, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --dialog fullwidth,scrollkey,scrollbar}, startup_message: 'Multiline REPL.') 6.times{ write('j') } - close assert_screen(<<~'EOC') Multi line @@ -1329,13 +1324,13 @@ def test_dialog_with_fullwidth_chars 備え█ ち、█ EOC + close end def test_dialog_with_fullwidth_chars_split ENV['RELINE_TEST_PROMPT'] = '> ' start_terminal(20, 6, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --dialog fullwidth,scrollkey,scrollbar}, startup_message: 'Multiline REPL.') 6.times{ write('j') } - close assert_screen(<<~'EOC') Multil ine RE @@ -1346,34 +1341,34 @@ def test_dialog_with_fullwidth_chars_split 備え █ ち、 █ EOC + close end def test_autocomplete_empty start_terminal(20, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --autocomplete}, startup_message: 'Multiline REPL.') write('Street') - close assert_screen(<<~'EOC') Multiline REPL. prompt> Street EOC + close end def test_autocomplete start_terminal(20, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --autocomplete}, startup_message: 'Multiline REPL.') write('Str') - close assert_screen(<<~'EOC') Multiline REPL. prompt> Str String Struct EOC + close end def test_autocomplete_empty_string start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --autocomplete}, startup_message: 'Multiline REPL.') write("\C-i") - close assert_screen(<<~'EOC') Multiline REPL. prompt> String @@ -1381,12 +1376,12 @@ def test_autocomplete_empty_string Struct ▀ Symbol EOC + close end def test_paste_code_with_tab_indent_does_not_fail start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --autocomplete-empty}, startup_message: 'Multiline REPL.') write("2.times do\n\tputs\n\tputs\nend") - close assert_screen(<<~'EOC') Multiline REPL. prompt> 2.times do @@ -1394,12 +1389,12 @@ def test_paste_code_with_tab_indent_does_not_fail prompt> puts prompt> end EOC + close end def test_autocomplete_after_2nd_line start_terminal(20, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --autocomplete}, startup_message: 'Multiline REPL.') write("def hoge\n Str") - close assert_screen(<<~'EOC') Multiline REPL. prompt> def hoge @@ -1407,13 +1402,13 @@ def test_autocomplete_after_2nd_line String Struct EOC + close end def test_autocomplete_rerender_under_dialog start_terminal(20, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --autocomplete}, startup_message: 'Multiline REPL.') write("def hoge\n\n 123456\n 456789\nend\C-p\C-p\C-p a = Str") write('i') - close assert_screen(<<~'EOC') Multiline REPL. prompt> def hoge @@ -1422,13 +1417,13 @@ def test_autocomplete_rerender_under_dialog prompt> 456789 prompt> end EOC + close end def test_rerender_multiple_dialog start_terminal(20, 60, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --autocomplete --dialog simple}, startup_message: 'Multiline REPL.') write("if\n abcdef\n 123456\n 456789\nend\C-p\C-p\C-p\C-p Str") write("\t") - close assert_screen(<<~'EOC') Multiline REPL. prompt> if String @@ -1439,12 +1434,12 @@ def test_rerender_multiple_dialog syntax that is natural to read and easy to write. EOC + close end def test_autocomplete_long_with_scrollbar start_terminal(20, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --autocomplete-long}, startup_message: 'Multiline REPL.') write('S') - close assert_screen(<<~'EOC') Multiline REPL. prompt> S @@ -1464,12 +1459,12 @@ def test_autocomplete_long_with_scrollbar Socket StringIO EOC + close end def test_autocomplete_long_with_scrollbar_scroll start_terminal(20, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --autocomplete-long}, startup_message: 'Multiline REPL.') write('S' + "\C-i" * 16) - close assert_screen(<<~'EOC') Multiline REPL. prompt> StringScanner @@ -1489,13 +1484,13 @@ def test_autocomplete_long_with_scrollbar_scroll StringIO StringScanner EOC + close end def test_autocomplete_super_long_scroll_to_bottom start_terminal(20, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --autocomplete-super-long}, startup_message: 'Multiline REPL.') shift_tab = [27, 91, 90] write('S' + shift_tab.map(&:chr).join) - close assert_screen(<<~'EOC') Multiline REPL. prompt> Str_BXX @@ -1515,6 +1510,7 @@ def test_autocomplete_super_long_scroll_to_bottom Str_BXW Str_BXX▄ EOC + close end def test_autocomplete_super_long_and_backspace @@ -1522,7 +1518,6 @@ def test_autocomplete_super_long_and_backspace shift_tab = [27, 91, 90] write('S' + shift_tab.map(&:chr).join) write("\C-h") - close assert_screen(<<~'EOC') Multiline REPL. prompt> Str_BX @@ -1542,21 +1537,21 @@ def test_autocomplete_super_long_and_backspace Str_BXM Str_BXN EOC + close end def test_dialog_callback_returns_nil start_terminal(20, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --dialog nil}, startup_message: 'Multiline REPL.') write('a') - close assert_screen(<<~'EOC') Multiline REPL. prompt> a EOC + close end def test_dialog_narrower_than_screen start_terminal(20, 11, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --dialog simple}, startup_message: 'Multiline REPL.') - close assert_screen(<<~'EOC') Multiline R EPL. @@ -1568,12 +1563,12 @@ def test_dialog_narrower_than_screen syntax that easy to wri EOC + close end def test_dialog_narrower_than_screen_with_scrollbar start_terminal(20, 11, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --autocomplete-long}, startup_message: 'Multiline REPL.') write('S' + "\C-i" * 3) - close assert_screen(<<~'EOC') Multiline R EPL. @@ -1594,11 +1589,11 @@ def test_dialog_narrower_than_screen_with_scrollbar Socket StringIO EOC + close end def test_dialog_with_fullwidth_scrollbar start_terminal(20, 40, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --dialog simple,scrollkey,alt-scrollbar}, startup_message: 'Multiline REPL.') - close assert_screen(<<~'EOC') Multiline REPL. prompt> @@ -1607,17 +1602,18 @@ def test_dialog_with_fullwidth_scrollbar language with a focus on simplicity'' and productivity. It has an elegant EOC + close end def test_rerender_argument_prompt_after_pasting start_terminal(20, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') write('abcdef') write("\M-3\C-h") - close assert_screen(<<~'EOC') Multiline REPL. prompt> abc EOC + close end def test_autocomplete_old_dialog_width_greater_than_dialog_width @@ -1626,13 +1622,13 @@ def test_autocomplete_old_dialog_width_greater_than_dialog_width write("\C-p") write("r") write("a") - close assert_screen(<<~'EOC') Multiline REPL. prompt> 0+ ra prompt> 123rand 901234 raise EOC + close end def test_scroll_at_bottom_for_dialog @@ -1640,7 +1636,6 @@ def test_scroll_at_bottom_for_dialog write("\n\n\n\n\n\n\n\n\n\n\n") write("def hoge\n\nend\C-p\C-e") write(" S") - close assert_screen(<<~'EOC') prompt> prompt> @@ -1653,63 +1648,64 @@ def test_scroll_at_bottom_for_dialog Struct ▀ Symbol EOC + close end def test_clear_dialog_in_pasting start_terminal(10, 40, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --autocomplete}, startup_message: 'Multiline REPL.') write("S") write("tring ") - close assert_screen(<<~'EOC') Multiline REPL. prompt> String EOC + close end def test_prompt_with_newline ENV['RELINE_TEST_PROMPT'] = "::\n> " start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') write("def hoge\n 3\nend") - close assert_screen(<<~'EOC') Multiline REPL. ::\n> def hoge ::\n> 3 ::\n> end EOC + close end def test_dynamic_prompt_with_newline start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --dynamic-prompt-with-newline}, startup_message: 'Multiline REPL.') write("def hoge\n 3\nend") - close assert_screen(<<~'EOC') Multiline REPL. [0000\n]> def hoge [0001\n]> 3 [0001\n]> end EOC + close end def test_lines_passed_to_dynamic_prompt start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --dynamic-prompt-show-line}, startup_message: 'Multiline REPL.') write("if true") write("\n") - close assert_screen(<<~EOC) Multiline REPL. [if t]> if true [ ]> EOC + close end def test_clear_dialog_when_just_move_cursor_at_last_line start_terminal(10, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --autocomplete}, startup_message: 'Multiline REPL.') write("class A\n 3\nend\n\n\n") write("\C-p\C-p\C-e; S") + assert_screen(/String/) write("\C-n") write(";") - close assert_screen(<<~'EOC') prompt> 3 prompt> end @@ -1720,6 +1716,7 @@ def test_clear_dialog_when_just_move_cursor_at_last_line prompt> 3; S prompt> end; EOC + close end def test_clear_dialog_when_adding_new_line_to_end_of_buffer @@ -1729,7 +1726,6 @@ def test_clear_dialog_when_adding_new_line_to_end_of_buffer write("class S") write("\n") write(" 3") - close assert_screen(<<~'EOC') prompt> def a prompt> 3 @@ -1740,6 +1736,7 @@ def test_clear_dialog_when_adding_new_line_to_end_of_buffer prompt> class S prompt> 3 EOC + close end def test_insert_newline_in_the_middle_of_buffer_just_after_dialog @@ -1749,7 +1746,6 @@ def test_insert_newline_in_the_middle_of_buffer_just_after_dialog write("\C-p\C-p\C-p\C-p\C-p\C-e\C-hS") write("\M-\x0D") write(" 3") - close assert_screen(<<~'EOC') prompt> 3 prompt> end @@ -1762,6 +1758,7 @@ def test_insert_newline_in_the_middle_of_buffer_just_after_dialog prompt> end prompt> end EOC + close end def test_incremental_search_on_not_last_line @@ -1772,7 +1769,6 @@ def test_incremental_search_on_not_last_line write("\C-r") write("a") write("\n\n") - close assert_screen(<<~'EOC') prompt> def abc prompt> end @@ -1785,28 +1781,29 @@ def test_incremental_search_on_not_last_line => :abc prompt> EOC + close end def test_bracket_newline_indent start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --auto-indent}, startup_message: 'Multiline REPL.') write("[\n") write("1") - close assert_screen(<<~EOC) Multiline REPL. prompt> [ prompt> 1 EOC + close end def test_repeated_input_delete start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') write("a\C-h" * 4000) - close assert_screen(<<~'EOC') Multiline REPL. prompt> EOC + close end def test_exit_with_ctrl_d @@ -1821,6 +1818,7 @@ def test_exit_with_ctrl_d Multiline REPL. prompt> EOC + close end def test_print_before_readline @@ -1833,12 +1831,12 @@ def test_print_before_readline RUBY start_terminal(6, 30, ['ruby', "-I#{@pwd}/lib", '-rreline', '-e', code], startup_message: 'Multiline REPL.') write "x\n" - close assert_screen(<<~EOC) Multiline REPL. >x > EOC + close end def test_pre_input_hook_with_redisplay @@ -1855,6 +1853,7 @@ def test_pre_input_hook_with_redisplay Multiline REPL. prompt> abc EOC + close end def test_pre_input_hook_with_multiline_text_insert @@ -1873,6 +1872,7 @@ def test_pre_input_hook_with_multiline_text_insert >abc def EOC + close end def test_thread_safe @@ -1881,7 +1881,6 @@ def test_thread_safe write("exit\n") write("exit\n") write("42\n") - close assert_screen(<<~EOC) >exit >exit @@ -1890,6 +1889,7 @@ def test_thread_safe => 42 prompt> EOC + close end def test_stop_continue @@ -1902,13 +1902,15 @@ def test_stop_continue rubyfile.close start_terminal(40, 50, ['bash']) write "ruby -I#{@pwd}/lib -rreline #{rubyfile.path}\n" + assert_screen(/^>/) write "abc\ndef\nhi" pid = pidfile.tap(&:rewind).read.to_i Process.kill(:STOP, pid) unless pid.zero? write "fg\n" + assert_screen(/fg\n.*>/m) write "\ebg" + assert_screen(/>abc\n>def\n>ghi\n/) close - assert_include result.join("\n"), ">abc\n>def\n>ghi\n" end def write_inputrc(content) From 77db37813a5a436507260a92c8d41b616db1efd9 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Wed, 2 Oct 2024 11:04:18 -0400 Subject: [PATCH 660/829] Fix indentation in test_after_gc_start_hook_with_GC_stress --- test/-ext-/tracepoint/test_tracepoint.rb | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/test/-ext-/tracepoint/test_tracepoint.rb b/test/-ext-/tracepoint/test_tracepoint.rb index 48ffe2605c1c34..bf66d8f10514ff 100644 --- a/test/-ext-/tracepoint/test_tracepoint.rb +++ b/test/-ext-/tracepoint/test_tracepoint.rb @@ -66,15 +66,15 @@ def test_after_gc_start_hook_with_GC_stress count = 0 hook = proc {count += 1} def run(hook) - stress, GC.stress = GC.stress, false - Bug.after_gc_start_hook = hook - begin - GC.stress = true - 3.times {Object.new} - ensure - GC.stress = stress - Bug.after_gc_start_hook = nil - end + stress, GC.stress = GC.stress, false + Bug.after_gc_start_hook = hook + begin + GC.stress = true + 3.times {Object.new} + ensure + GC.stress = stress + Bug.after_gc_start_hook = nil + end end run(hook) puts count From f8568fbd7f87f749de46abc6ce07b9d3e0c6b40d Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Thu, 3 Oct 2024 12:31:58 -0400 Subject: [PATCH 661/829] [ruby/prism] Pop lex mode for heredocs in the lexer, not the parser https://github.com/ruby/prism/commit/5dd36b979e --- prism/parser.h | 34 +++++--- prism/prism.c | 95 ++++++++++------------ test/prism/errors/heredoc_unterminated.txt | 9 ++ 3 files changed, 76 insertions(+), 62 deletions(-) create mode 100644 test/prism/errors/heredoc_unterminated.txt diff --git a/prism/parser.h b/prism/parser.h index bdff8ad2996819..26427cda409a65 100644 --- a/prism/parser.h +++ b/prism/parser.h @@ -82,6 +82,23 @@ typedef enum { PM_HEREDOC_INDENT_TILDE, } pm_heredoc_indent_t; +/** + * All of the information necessary to store to lexing a heredoc. + */ +typedef struct { + /** A pointer to the start of the heredoc identifier. */ + const uint8_t *ident_start; + + /** The length of the heredoc identifier. */ + size_t ident_length; + + /** The type of quote that the heredoc uses. */ + pm_heredoc_quote_t quote; + + /** The type of indentation that the heredoc uses. */ + pm_heredoc_indent_t indent; +} pm_heredoc_lex_mode_t; + /** * When lexing Ruby source, the lexer has a small amount of state to tell which * kind of token it is currently lexing. For example, when we find the start of @@ -210,17 +227,10 @@ typedef struct pm_lex_mode { } string; struct { - /** A pointer to the start of the heredoc identifier. */ - const uint8_t *ident_start; - - /** The length of the heredoc identifier. */ - size_t ident_length; - - /** The type of quote that the heredoc uses. */ - pm_heredoc_quote_t quote; - - /** The type of indentation that the heredoc uses. */ - pm_heredoc_indent_t indent; + /** + * All of the data necessary to lex a heredoc. + */ + pm_heredoc_lex_mode_t base; /** * This is the pointer to the character where lexing should resume @@ -233,7 +243,7 @@ typedef struct pm_lex_mode { * line so that we know how much to dedent each line in the case of * a tilde heredoc. */ - size_t common_whitespace; + size_t *common_whitespace; /** True if the previous token ended with a line continuation. */ bool line_continuation; diff --git a/prism/prism.c b/prism/prism.c index ec75e9215f7835..a98f2f12c07f61 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -544,10 +544,7 @@ pm_parser_warn_node(pm_parser_t *parser, const pm_node_t *node, pm_diagnostic_id * token. */ static void -pm_parser_err_heredoc_term(pm_parser_t *parser, pm_lex_mode_t *lex_mode) { - const uint8_t *ident_start = lex_mode->as.heredoc.ident_start; - size_t ident_length = lex_mode->as.heredoc.ident_length; - +pm_parser_err_heredoc_term(pm_parser_t *parser, const uint8_t *ident_start, size_t ident_length) { PM_PARSER_ERR_FORMAT( parser, ident_start, @@ -11153,12 +11150,14 @@ parser_lex(pm_parser_t *parser) { lex_mode_push(parser, (pm_lex_mode_t) { .mode = PM_LEX_HEREDOC, .as.heredoc = { - .ident_start = ident_start, - .ident_length = ident_length, + .base = { + .ident_start = ident_start, + .ident_length = ident_length, + .quote = quote, + .indent = indent + }, .next_start = parser->current.end, - .quote = quote, - .indent = indent, - .common_whitespace = (size_t) -1, + .common_whitespace = NULL, .line_continuation = false } }); @@ -11171,7 +11170,7 @@ parser_lex(pm_parser_t *parser) { // this is not a valid heredoc declaration. In this case we // will add an error, but we will still return a heredoc // start. - if (!ident_error) pm_parser_err_heredoc_term(parser, parser->lex_modes.current); + if (!ident_error) pm_parser_err_heredoc_term(parser, ident_start, ident_length); body_start = parser->end; } else { // Otherwise, we want to indicate that the body of the @@ -12514,6 +12513,7 @@ parser_lex(pm_parser_t *parser) { // Now let's grab the information about the identifier off of the // current lex mode. pm_lex_mode_t *lex_mode = parser->lex_modes.current; + pm_heredoc_lex_mode_t *heredoc_lex_mode = &lex_mode->as.heredoc.base; bool line_continuation = lex_mode->as.heredoc.line_continuation; lex_mode->as.heredoc.line_continuation = false; @@ -12523,15 +12523,16 @@ parser_lex(pm_parser_t *parser) { // terminator) but still continue parsing so that content after the // declaration of the heredoc can be parsed. if (parser->current.end >= parser->end) { - pm_parser_err_heredoc_term(parser, lex_mode); + pm_parser_err_heredoc_term(parser, heredoc_lex_mode->ident_start, heredoc_lex_mode->ident_length); parser->next_start = lex_mode->as.heredoc.next_start; parser->heredoc_end = parser->current.end; lex_state_set(parser, PM_LEX_STATE_END); + lex_mode_pop(parser); LEX(PM_TOKEN_HEREDOC_END); } - const uint8_t *ident_start = lex_mode->as.heredoc.ident_start; - size_t ident_length = lex_mode->as.heredoc.ident_length; + const uint8_t *ident_start = heredoc_lex_mode->ident_start; + size_t ident_length = heredoc_lex_mode->ident_length; // If we are immediately following a newline and we have hit the // terminator, then we need to return the ending of the heredoc. @@ -12556,10 +12557,7 @@ parser_lex(pm_parser_t *parser) { const uint8_t *terminator_start = ident_end - ident_length; const uint8_t *cursor = start; - if ( - lex_mode->as.heredoc.indent == PM_HEREDOC_INDENT_DASH || - lex_mode->as.heredoc.indent == PM_HEREDOC_INDENT_TILDE - ) { + if (heredoc_lex_mode->indent == PM_HEREDOC_INDENT_DASH || heredoc_lex_mode->indent == PM_HEREDOC_INDENT_TILDE) { while (cursor < terminator_start && pm_char_is_inline_whitespace(*cursor)) { cursor++; } @@ -12582,17 +12580,19 @@ parser_lex(pm_parser_t *parser) { } lex_state_set(parser, PM_LEX_STATE_END); + lex_mode_pop(parser); LEX(PM_TOKEN_HEREDOC_END); } } - size_t whitespace = pm_heredoc_strspn_inline_whitespace(parser, &start, lex_mode->as.heredoc.indent); + size_t whitespace = pm_heredoc_strspn_inline_whitespace(parser, &start, heredoc_lex_mode->indent); if ( - lex_mode->as.heredoc.indent == PM_HEREDOC_INDENT_TILDE && - (lex_mode->as.heredoc.common_whitespace > whitespace) && + heredoc_lex_mode->indent == PM_HEREDOC_INDENT_TILDE && + lex_mode->as.heredoc.common_whitespace != NULL && + (*lex_mode->as.heredoc.common_whitespace > whitespace) && peek_at(parser, start) != '\n' ) { - lex_mode->as.heredoc.common_whitespace = whitespace; + *lex_mode->as.heredoc.common_whitespace = whitespace; } } @@ -12601,7 +12601,7 @@ parser_lex(pm_parser_t *parser) { // strpbrk to find the first of these characters. uint8_t breakpoints[] = "\r\n\\#"; - pm_heredoc_quote_t quote = lex_mode->as.heredoc.quote; + pm_heredoc_quote_t quote = heredoc_lex_mode->quote; if (quote == PM_HEREDOC_QUOTE_SINGLE) { breakpoints[3] = '\0'; } @@ -12664,8 +12664,7 @@ parser_lex(pm_parser_t *parser) { // leading whitespace if we have a - or ~ heredoc. const uint8_t *cursor = start; - if (lex_mode->as.heredoc.indent == PM_HEREDOC_INDENT_DASH || - lex_mode->as.heredoc.indent == PM_HEREDOC_INDENT_TILDE) { + if (heredoc_lex_mode->indent == PM_HEREDOC_INDENT_DASH || heredoc_lex_mode->indent == PM_HEREDOC_INDENT_TILDE) { while (cursor < terminator_start && pm_char_is_inline_whitespace(*cursor)) { cursor++; } @@ -12681,16 +12680,16 @@ parser_lex(pm_parser_t *parser) { } } - size_t whitespace = pm_heredoc_strspn_inline_whitespace(parser, &start, lex_mode->as.heredoc.indent); + size_t whitespace = pm_heredoc_strspn_inline_whitespace(parser, &start, lex_mode->as.heredoc.base.indent); // If we have hit a newline that is followed by a valid // terminator, then we need to return the content of the // heredoc here as string content. Then, the next time a // token is lexed, it will match again and return the // end of the heredoc. - if (lex_mode->as.heredoc.indent == PM_HEREDOC_INDENT_TILDE) { - if ((lex_mode->as.heredoc.common_whitespace > whitespace) && peek_at(parser, start) != '\n') { - lex_mode->as.heredoc.common_whitespace = whitespace; + if (lex_mode->as.heredoc.base.indent == PM_HEREDOC_INDENT_TILDE) { + if ((lex_mode->as.heredoc.common_whitespace != NULL) && (*lex_mode->as.heredoc.common_whitespace > whitespace) && peek_at(parser, start) != '\n') { + *lex_mode->as.heredoc.common_whitespace = whitespace; } parser->current.end = breakpoint + 1; @@ -12757,7 +12756,7 @@ parser_lex(pm_parser_t *parser) { // If we are in a tilde here, we should // break out of the loop and return the // string content. - if (lex_mode->as.heredoc.indent == PM_HEREDOC_INDENT_TILDE) { + if (heredoc_lex_mode->indent == PM_HEREDOC_INDENT_TILDE) { const uint8_t *end = parser->current.end; pm_newline_list_append(&parser->newline_list, end); @@ -13165,13 +13164,11 @@ expect3(pm_parser_t *parser, pm_token_type_t type1, pm_token_type_t type2, pm_to * lex mode accordingly. */ static void -expect1_heredoc_term(pm_parser_t *parser, pm_lex_mode_t *lex_mode) { +expect1_heredoc_term(pm_parser_t *parser, const uint8_t *ident_start, size_t ident_length) { if (match1(parser, PM_TOKEN_HEREDOC_END)) { - lex_mode_pop(parser); parser_lex(parser); } else { - pm_parser_err_heredoc_term(parser, lex_mode); - lex_mode_pop(parser); + pm_parser_err_heredoc_term(parser, ident_start, ident_length); parser->previous.start = parser->previous.end; parser->previous.type = PM_TOKEN_MISSING; } @@ -18441,10 +18438,11 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b case PM_TOKEN_HEREDOC_START: { // Here we have found a heredoc. We'll parse it and add it to the // list of strings. - pm_lex_mode_t *lex_mode = parser->lex_modes.current; - assert(lex_mode->mode == PM_LEX_HEREDOC); - pm_heredoc_quote_t quote = lex_mode->as.heredoc.quote; - pm_heredoc_indent_t indent = lex_mode->as.heredoc.indent; + assert(parser->lex_modes.current->mode == PM_LEX_HEREDOC); + pm_heredoc_lex_mode_t lex_mode = parser->lex_modes.current->as.heredoc.base; + + size_t common_whitespace = (size_t) -1; + parser->lex_modes.current->as.heredoc.common_whitespace = &common_whitespace; parser_lex(parser); pm_token_t opening = parser->previous; @@ -18455,10 +18453,10 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b if (match2(parser, PM_TOKEN_HEREDOC_END, PM_TOKEN_EOF)) { // If we get here, then we have an empty heredoc. We'll create // an empty content token and return an empty string node. - expect1_heredoc_term(parser, lex_mode); + expect1_heredoc_term(parser, lex_mode.ident_start, lex_mode.ident_length); pm_token_t content = parse_strings_empty_content(parser->previous.start); - if (quote == PM_HEREDOC_QUOTE_BACKTICK) { + if (lex_mode.quote == PM_HEREDOC_QUOTE_BACKTICK) { node = (pm_node_t *) pm_xstring_node_create_unescaped(parser, &opening, &content, &parser->previous, &PM_STRING_EMPTY); } else { node = (pm_node_t *) pm_string_node_create_unescaped(parser, &opening, &content, &parser->previous, &PM_STRING_EMPTY); @@ -18485,18 +18483,17 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b cast->closing_loc = PM_LOCATION_TOKEN_VALUE(&parser->current); cast->base.location = cast->opening_loc; - if (quote == PM_HEREDOC_QUOTE_BACKTICK) { + if (lex_mode.quote == PM_HEREDOC_QUOTE_BACKTICK) { assert(sizeof(pm_string_node_t) == sizeof(pm_x_string_node_t)); cast->base.type = PM_X_STRING_NODE; } - size_t common_whitespace = lex_mode->as.heredoc.common_whitespace; - if (indent == PM_HEREDOC_INDENT_TILDE && (common_whitespace != (size_t) -1) && (common_whitespace != 0)) { + if (lex_mode.indent == PM_HEREDOC_INDENT_TILDE && (common_whitespace != (size_t) -1) && (common_whitespace != 0)) { parse_heredoc_dedent_string(&cast->unescaped, common_whitespace); } node = (pm_node_t *) cast; - expect1_heredoc_term(parser, lex_mode); + expect1_heredoc_term(parser, lex_mode.ident_start, lex_mode.ident_length); } else { // If we get here, then we have multiple parts in the heredoc, // so we'll need to create an interpolated string node to hold @@ -18510,15 +18507,13 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b } } - size_t common_whitespace = lex_mode->as.heredoc.common_whitespace; - // Now that we have all of the parts, create the correct type of // interpolated node. - if (quote == PM_HEREDOC_QUOTE_BACKTICK) { + if (lex_mode.quote == PM_HEREDOC_QUOTE_BACKTICK) { pm_interpolated_x_string_node_t *cast = pm_interpolated_xstring_node_create(parser, &opening, &opening); cast->parts = parts; - expect1_heredoc_term(parser, lex_mode); + expect1_heredoc_term(parser, lex_mode.ident_start, lex_mode.ident_length); pm_interpolated_xstring_node_closing_set(cast, &parser->previous); cast->base.location = cast->opening_loc; @@ -18527,7 +18522,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b pm_interpolated_string_node_t *cast = pm_interpolated_string_node_create(parser, &opening, &parts, &opening); pm_node_list_free(&parts); - expect1_heredoc_term(parser, lex_mode); + expect1_heredoc_term(parser, lex_mode.ident_start, lex_mode.ident_length); pm_interpolated_string_node_closing_set(cast, &parser->previous); cast->base.location = cast->opening_loc; @@ -18536,9 +18531,9 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b // If this is a heredoc that is indented with a ~, then we need // to dedent each line by the common leading whitespace. - if (indent == PM_HEREDOC_INDENT_TILDE && (common_whitespace != (size_t) -1) && (common_whitespace != 0)) { + if (lex_mode.indent == PM_HEREDOC_INDENT_TILDE && (common_whitespace != (size_t) -1) && (common_whitespace != 0)) { pm_node_list_t *nodes; - if (quote == PM_HEREDOC_QUOTE_BACKTICK) { + if (lex_mode.quote == PM_HEREDOC_QUOTE_BACKTICK) { nodes = &((pm_interpolated_x_string_node_t *) node)->parts; } else { nodes = &((pm_interpolated_string_node_t *) node)->parts; diff --git a/test/prism/errors/heredoc_unterminated.txt b/test/prism/errors/heredoc_unterminated.txt new file mode 100644 index 00000000000000..3c6aeaeb81fdb5 --- /dev/null +++ b/test/prism/errors/heredoc_unterminated.txt @@ -0,0 +1,9 @@ +a=>{< Date: Thu, 3 Oct 2024 13:33:14 -0400 Subject: [PATCH 662/829] [ruby/prism] Handle single global variable character name https://github.com/ruby/prism/commit/7a0af49997 --- prism/prism.c | 7 ++++++- test/prism/magic_comment_test.rb | 9 ++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/prism/prism.c b/prism/prism.c index a98f2f12c07f61..6f905d501eb0d7 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -9048,6 +9048,10 @@ lex_global_variable(pm_parser_t *parser) { return PM_TOKEN_GLOBAL_VARIABLE; } + // True if multiple characters are allowed after the declaration of the + // global variable. Not true when it starts with "$-". + bool allow_multiple = true; + switch (*parser->current.end) { case '~': // $~: match-data case '*': // $*: argv @@ -9106,6 +9110,7 @@ lex_global_variable(pm_parser_t *parser) { case '-': parser->current.end++; + allow_multiple = false; /* fallthrough */ default: { size_t width; @@ -9113,7 +9118,7 @@ lex_global_variable(pm_parser_t *parser) { if ((width = char_is_identifier(parser, parser->current.end)) > 0) { do { parser->current.end += width; - } while (parser->current.end < parser->end && (width = char_is_identifier(parser, parser->current.end)) > 0); + } while (allow_multiple && parser->current.end < parser->end && (width = char_is_identifier(parser, parser->current.end)) > 0); } else if (pm_char_is_whitespace(peek(parser))) { // If we get here, then we have a $ followed by whitespace, // which is not allowed. diff --git a/test/prism/magic_comment_test.rb b/test/prism/magic_comment_test.rb index 14653fb0f861c8..ab4b5f56e5169b 100644 --- a/test/prism/magic_comment_test.rb +++ b/test/prism/magic_comment_test.rb @@ -87,7 +87,14 @@ def assert_magic_encoding(expected, line) # Compare against Ruby's expectation. if defined?(RubyVM::InstructionSequence) - expected = RubyVM::InstructionSequence.compile(source).eval.encoding + previous = $VERBOSE + expected = + begin + $VERBOSE = nil + RubyVM::InstructionSequence.compile(source).eval.encoding + ensure + $VERBOSE = previous + end assert_equal expected, actual end end From cd71fa96ac5ac46479eae262bff7349b2817d198 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Thu, 3 Oct 2024 10:59:29 -0400 Subject: [PATCH 663/829] Remove else case for shared-gc make target --- common.mk | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/common.mk b/common.mk index ebbaf1aa6cafc2..6e861dc4b01f2c 100644 --- a/common.mk +++ b/common.mk @@ -1912,9 +1912,8 @@ shared-gc: probes.h elif test -z $(SHARED_GC); then \ echo "You must specify SHARED_GC with the GC to build"; \ exit 1; \ - else \ - echo generating $(shared_gc_dir)librubygc.$(SHARED_GC).$(SOEXT); \ fi + $(ECHO) generating $(shared_gc_dir)librubygc.$(SHARED_GC).$(SOEXT) $(Q) $(MAKEDIRS) $(shared_gc_dir) $(Q) $(LDSHARED) -I$(srcdir)/include -I$(srcdir) -I$(arch_hdrdir) $(XDLDFLAGS) $(cflags) -DBUILDING_SHARED_GC -fPIC -o $(shared_gc_dir)librubygc.$(SHARED_GC).$(SOEXT) $(srcdir)/gc/$(SHARED_GC).c From b58a3645229b6c82c1f199fd948ec1fa97c0cc10 Mon Sep 17 00:00:00 2001 From: Matt Valentine-House Date: Wed, 2 Oct 2024 12:51:11 +0100 Subject: [PATCH 664/829] Inline eden_heap into size_pool After the individual tomb_heaps were removed in favour of a global list of empty pages, the only instance of rb_heap_t left is the eden_heap within each size pool. This PR inlines the heap fields directly into rb_size_pool_t to remove indirection and remove the SIZE_POOL_EDEN_HEAP macro --- gc/default.c | 411 ++++++++++++++++++++++++--------------------------- 1 file changed, 195 insertions(+), 216 deletions(-) diff --git a/gc/default.c b/gc/default.c index 781b1986f189f8..cd3b40e1400df9 100644 --- a/gc/default.c +++ b/gc/default.c @@ -403,21 +403,8 @@ typedef struct mark_stack { size_t unused_cache_size; } mark_stack_t; -#define SIZE_POOL_EDEN_HEAP(size_pool) (&(size_pool)->eden_heap) - typedef int (*gc_compact_compare_func)(const void *l, const void *r, void *d); -typedef struct rb_heap_struct { - struct heap_page *free_pages; - struct ccan_list_head pages; - struct heap_page *sweeping_page; /* iterator for .pages */ - struct heap_page *compact_cursor; - uintptr_t compact_cursor_index; - struct heap_page *pooled_pages; - size_t total_pages; /* total page count in a heap */ - size_t total_slots; /* total slot count (about total_pages * HEAP_PAGE_OBJ_LIMIT) */ -} rb_heap_t; - typedef struct rb_size_pool_struct { short slot_size; @@ -433,7 +420,15 @@ typedef struct rb_size_pool_struct { size_t freed_slots; size_t empty_slots; - rb_heap_t eden_heap; + struct heap_page *free_pages; + struct ccan_list_head pages; + struct heap_page *sweeping_page; /* iterator for .pages */ + struct heap_page *compact_cursor; + uintptr_t compact_cursor_index; + struct heap_page *pooled_pages; + size_t total_pages; /* total page count in a heap */ + size_t total_slots; /* total slot count (about total_pages * HEAP_PAGE_OBJ_LIMIT) */ + } rb_size_pool_t; enum { @@ -910,7 +905,7 @@ static inline bool has_sweeping_pages(rb_objspace_t *objspace) { for (int i = 0; i < SIZE_POOL_COUNT; i++) { - if (SIZE_POOL_EDEN_HEAP(&size_pools[i])->sweeping_page) { + if ((&size_pools[i])->sweeping_page) { return TRUE; } } @@ -922,7 +917,7 @@ heap_eden_total_pages(rb_objspace_t *objspace) { size_t count = 0; for (int i = 0; i < SIZE_POOL_COUNT; i++) { - count += SIZE_POOL_EDEN_HEAP(&size_pools[i])->total_pages; + count += (&size_pools[i])->total_pages; } return count; } @@ -1016,11 +1011,11 @@ static void gc_marking_enter(rb_objspace_t *objspace); static void gc_marking_exit(rb_objspace_t *objspace); static void gc_sweeping_enter(rb_objspace_t *objspace); static void gc_sweeping_exit(rb_objspace_t *objspace); -static bool gc_marks_continue(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *heap); +static bool gc_marks_continue(rb_objspace_t *objspace, rb_size_pool_t *size_pool); static void gc_sweep(rb_objspace_t *objspace); static void gc_sweep_finish_size_pool(rb_objspace_t *objspace, rb_size_pool_t *size_pool); -static void gc_sweep_continue(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *heap); +static void gc_sweep_continue(rb_objspace_t *objspace, rb_size_pool_t *size_pool); static inline void gc_mark(rb_objspace_t *objspace, VALUE ptr); static inline void gc_pin(rb_objspace_t *objspace, VALUE ptr); @@ -1212,8 +1207,8 @@ RVALUE_UNCOLLECTIBLE(rb_objspace_t *objspace, VALUE obj) #define RVALUE_PAGE_MARKING(page, obj) MARKED_IN_BITMAP((page)->marking_bits, (obj)) static int rgengc_remember(rb_objspace_t *objspace, VALUE obj); -static void rgengc_mark_and_rememberset_clear(rb_objspace_t *objspace, rb_heap_t *heap); -static void rgengc_rememberset_mark(rb_objspace_t *objspace, rb_heap_t *heap); +static void rgengc_mark_and_rememberset_clear(rb_objspace_t *objspace, rb_size_pool_t *size_pool); +static void rgengc_rememberset_mark(rb_objspace_t *objspace, rb_size_pool_t *size_pool); static int check_rvalue_consistency_force(rb_objspace_t *objspace, const VALUE obj, int terminate) @@ -1701,14 +1696,14 @@ size_pool_allocatable_slots_expand(rb_objspace_t *objspace, } static inline void -heap_add_freepage(rb_heap_t *heap, struct heap_page *page) +heap_add_freepage(rb_size_pool_t *size_pool, struct heap_page *page) { asan_unlock_freelist(page); GC_ASSERT(page->free_slots != 0); GC_ASSERT(page->freelist != NULL); - page->free_next = heap->free_pages; - heap->free_pages = page; + page->free_next = size_pool->free_pages; + size_pool->free_pages = page; RUBY_DEBUG_LOG("page:%p freelist:%p", (void *)page, (void *)page->freelist); @@ -1716,25 +1711,25 @@ heap_add_freepage(rb_heap_t *heap, struct heap_page *page) } static inline void -heap_add_poolpage(rb_objspace_t *objspace, rb_heap_t *heap, struct heap_page *page) +heap_add_poolpage(rb_objspace_t *objspace, rb_size_pool_t *size_pool, struct heap_page *page) { asan_unlock_freelist(page); GC_ASSERT(page->free_slots != 0); GC_ASSERT(page->freelist != NULL); - page->free_next = heap->pooled_pages; - heap->pooled_pages = page; + page->free_next = size_pool->pooled_pages; + size_pool->pooled_pages = page; objspace->rincgc.pooled_slots += page->free_slots; asan_lock_freelist(page); } static void -heap_unlink_page(rb_objspace_t *objspace, rb_heap_t *heap, struct heap_page *page) +heap_unlink_page(rb_objspace_t *objspace, rb_size_pool_t *size_pool, struct heap_page *page) { ccan_list_del(&page->page_node); - heap->total_pages--; - heap->total_slots -= page->total_slots; + size_pool->total_pages--; + size_pool->total_slots -= page->total_slots; } static void @@ -1973,10 +1968,10 @@ heap_page_allocate(rb_objspace_t *objspace) } static void -size_pool_add_page(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *heap, struct heap_page *page) +size_pool_add_page(rb_objspace_t *objspace, rb_size_pool_t *size_pool, struct heap_page *page) { /* Adding to eden heap during incremental sweeping is forbidden */ - GC_ASSERT(!heap->sweeping_page); + GC_ASSERT(!size_pool->sweeping_page); GC_ASSERT(heap_page_in_global_empty_pages_pool(objspace, page)); /* adjust obj_limit (object number available in this page) */ @@ -2016,25 +2011,25 @@ size_pool_add_page(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t size_pool->total_allocated_pages++; - ccan_list_add_tail(&heap->pages, &page->page_node); - heap->total_pages++; - heap->total_slots += page->total_slots; + ccan_list_add_tail(&size_pool->pages, &page->page_node); + size_pool->total_pages++; + size_pool->total_slots += page->total_slots; } static int -heap_page_allocate_and_initialize(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *heap) +heap_page_allocate_and_initialize(rb_objspace_t *objspace, rb_size_pool_t *size_pool) { if (objspace->heap_pages.allocatable_slots > 0) { gc_report(1, objspace, "heap_page_allocate_and_initialize: rb_darray_size(objspace->heap_pages.sorted): %"PRIdSIZE", " "allocatable_slots: %"PRIdSIZE", heap->total_pages: %"PRIdSIZE"\n", - rb_darray_size(objspace->heap_pages.sorted), objspace->heap_pages.allocatable_slots, heap->total_pages); + rb_darray_size(objspace->heap_pages.sorted), objspace->heap_pages.allocatable_slots, size_pool->total_pages); struct heap_page *page = heap_page_resurrect(objspace); if (page == NULL) { page = heap_page_allocate(objspace); } - size_pool_add_page(objspace, size_pool, heap, page); - heap_add_freepage(heap, page); + size_pool_add_page(objspace, size_pool, page); + heap_add_freepage(size_pool, page); if (objspace->heap_pages.allocatable_slots > (size_t)page->total_slots) { objspace->heap_pages.allocatable_slots -= page->total_slots; @@ -2050,60 +2045,60 @@ heap_page_allocate_and_initialize(rb_objspace_t *objspace, rb_size_pool_t *size_ } static void -heap_page_allocate_and_initialize_force(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *heap) +heap_page_allocate_and_initialize_force(rb_objspace_t *objspace, rb_size_pool_t *size_pool) { size_t prev_allocatable_slots = objspace->heap_pages.allocatable_slots; // Set allocatable slots to 1 to force a page to be created. objspace->heap_pages.allocatable_slots = 1; - heap_page_allocate_and_initialize(objspace, size_pool, heap); - GC_ASSERT(heap->free_pages != NULL); + heap_page_allocate_and_initialize(objspace, size_pool); + GC_ASSERT(size_pool->free_pages != NULL); objspace->heap_pages.allocatable_slots = prev_allocatable_slots; } static void -gc_continue(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *heap) +gc_continue(rb_objspace_t *objspace, rb_size_pool_t *size_pool) { unsigned int lock_lev; gc_enter(objspace, gc_enter_event_continue, &lock_lev); /* Continue marking if in incremental marking. */ if (is_incremental_marking(objspace)) { - if (gc_marks_continue(objspace, size_pool, heap)) { + if (gc_marks_continue(objspace, size_pool)) { gc_sweep(objspace); } } /* Continue sweeping if in lazy sweeping or the previous incremental * marking finished and did not yield a free page. */ - if (heap->free_pages == NULL && is_lazy_sweeping(objspace)) { - gc_sweep_continue(objspace, size_pool, heap); + if (size_pool->free_pages == NULL && is_lazy_sweeping(objspace)) { + gc_sweep_continue(objspace, size_pool); } gc_exit(objspace, gc_enter_event_continue, &lock_lev); } static void -heap_prepare(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *heap) +heap_prepare(rb_objspace_t *objspace, rb_size_pool_t *size_pool) { - GC_ASSERT(heap->free_pages == NULL); + GC_ASSERT(size_pool->free_pages == NULL); - if (SIZE_POOL_EDEN_HEAP(size_pool)->total_slots < gc_params.size_pool_init_slots[size_pool - size_pools] && - size_pool->eden_heap.sweeping_page == NULL) { - heap_page_allocate_and_initialize_force(objspace, size_pool, heap); - GC_ASSERT(heap->free_pages != NULL); + if (size_pool->total_slots < gc_params.size_pool_init_slots[size_pool - size_pools] && + size_pool->sweeping_page == NULL) { + heap_page_allocate_and_initialize_force(objspace, size_pool); + GC_ASSERT(size_pool->free_pages != NULL); return; } /* Continue incremental marking or lazy sweeping, if in any of those steps. */ - gc_continue(objspace, size_pool, heap); + gc_continue(objspace, size_pool); - if (heap->free_pages == NULL) { - heap_page_allocate_and_initialize(objspace, size_pool, heap); + if (size_pool->free_pages == NULL) { + heap_page_allocate_and_initialize(objspace, size_pool); } /* If we still don't have a free page and not allowed to create a new page, * we should start a new GC cycle. */ - if (heap->free_pages == NULL) { + if (size_pool->free_pages == NULL) { if (gc_start(objspace, GPR_FLAG_NEWOBJ) == FALSE) { rb_memerror(); } @@ -2111,16 +2106,16 @@ heap_prepare(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *heap if (objspace->heap_pages.allocatable_slots == 0 && !gc_config_full_mark_val) { size_pool_allocatable_slots_expand(objspace, size_pool, size_pool->freed_slots + size_pool->empty_slots, - heap->total_slots); + size_pool->total_slots); GC_ASSERT(objspace->heap_pages.allocatable_slots > 0); } /* Do steps of incremental marking or lazy sweeping if the GC run permits. */ - gc_continue(objspace, size_pool, heap); + gc_continue(objspace, size_pool); /* If we're not incremental marking (e.g. a minor GC) or finished * sweeping and still don't have a free page, then * gc_sweep_finish_size_pool should allow us to create a new page. */ - if (heap->free_pages == NULL && !heap_page_allocate_and_initialize(objspace, size_pool, heap)) { + if (size_pool->free_pages == NULL && !heap_page_allocate_and_initialize(objspace, size_pool)) { if (gc_needs_major_flags == GPR_FLAG_NONE) { rb_bug("cannot create a new page after GC"); } @@ -2130,10 +2125,10 @@ heap_prepare(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *heap } else { /* Do steps of incremental marking or lazy sweeping. */ - gc_continue(objspace, size_pool, heap); + gc_continue(objspace, size_pool); - if (heap->free_pages == NULL && - !heap_page_allocate_and_initialize(objspace, size_pool, heap)) { + if (size_pool->free_pages == NULL && + !heap_page_allocate_and_initialize(objspace, size_pool)) { rb_bug("cannot create a new page after major GC"); } } @@ -2142,7 +2137,7 @@ heap_prepare(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *heap } } - GC_ASSERT(heap->free_pages != NULL); + GC_ASSERT(size_pool->free_pages != NULL); } static inline VALUE @@ -2305,16 +2300,16 @@ ractor_cache_allocate_slot(rb_objspace_t *objspace, rb_ractor_newobj_cache_t *ca } static struct heap_page * -heap_next_free_page(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *heap) +heap_next_free_page(rb_objspace_t *objspace, rb_size_pool_t *size_pool) { struct heap_page *page; - if (heap->free_pages == NULL) { - heap_prepare(objspace, size_pool, heap); + if (size_pool->free_pages == NULL) { + heap_prepare(objspace, size_pool); } - page = heap->free_pages; - heap->free_pages = page->free_next; + page = size_pool->free_pages; + size_pool->free_pages = page->free_next; GC_ASSERT(page->free_slots != 0); @@ -2396,7 +2391,6 @@ static VALUE newobj_cache_miss(rb_objspace_t *objspace, rb_ractor_newobj_cache_t *cache, size_t size_pool_idx, bool vm_locked) { rb_size_pool_t *size_pool = &size_pools[size_pool_idx]; - rb_heap_t *heap = SIZE_POOL_EDEN_HEAP(size_pool); VALUE obj = Qfalse; unsigned int lev = 0; @@ -2410,7 +2404,7 @@ newobj_cache_miss(rb_objspace_t *objspace, rb_ractor_newobj_cache_t *cache, size { if (is_incremental_marking(objspace)) { - gc_continue(objspace, size_pool, heap); + gc_continue(objspace, size_pool); cache->incremental_mark_step_allocated_slots = 0; // Retry allocation after resetting incremental_mark_step_allocated_slots @@ -2419,7 +2413,7 @@ newobj_cache_miss(rb_objspace_t *objspace, rb_ractor_newobj_cache_t *cache, size if (obj == Qfalse) { // Get next free page (possibly running GC) - struct heap_page *page = heap_next_free_page(objspace, size_pool, heap); + struct heap_page *page = heap_next_free_page(objspace, size_pool); ractor_cache_set_page(objspace, cache, size_pool_idx, page); // Retry allocation after moving to new page @@ -2449,7 +2443,7 @@ newobj_alloc(rb_objspace_t *objspace, rb_ractor_newobj_cache_t *cache, size_t si rb_size_pool_t *size_pool = &size_pools[size_pool_idx]; size_pool->total_allocated_objects++; GC_ASSERT(rb_gc_multi_ractor_p() || - SIZE_POOL_EDEN_HEAP(size_pool)->total_slots >= + size_pool->total_slots >= (size_pool->total_allocated_objects - size_pool->total_freed_objects - size_pool->final_slots_count)); return obj; @@ -2697,7 +2691,7 @@ objspace_each_objects_try(VALUE arg) /* Copy pages from all size_pools to their respective buffers. */ for (int i = 0; i < SIZE_POOL_COUNT; i++) { rb_size_pool_t *size_pool = &size_pools[i]; - size_t size = SIZE_POOL_EDEN_HEAP(size_pool)->total_pages * sizeof(struct heap_page *); + size_t size = size_pool->total_pages * sizeof(struct heap_page *); struct heap_page **pages = malloc(size); if (!pages) rb_memerror(); @@ -2709,13 +2703,13 @@ objspace_each_objects_try(VALUE arg) * an infinite loop. */ struct heap_page *page = 0; size_t pages_count = 0; - ccan_list_for_each(&SIZE_POOL_EDEN_HEAP(size_pool)->pages, page, page_node) { + ccan_list_for_each(&size_pool->pages, page, page_node) { pages[pages_count] = page; pages_count++; } data->pages[i] = pages; data->pages_counts[i] = pages_count; - GC_ASSERT(pages_count == SIZE_POOL_EDEN_HEAP(size_pool)->total_pages); + GC_ASSERT(pages_count == size_pool->total_pages); } for (int i = 0; i < SIZE_POOL_COUNT; i++) { @@ -2723,7 +2717,7 @@ objspace_each_objects_try(VALUE arg) size_t pages_count = data->pages_counts[i]; struct heap_page **pages = data->pages[i]; - struct heap_page *page = ccan_list_top(&SIZE_POOL_EDEN_HEAP(size_pool)->pages, struct heap_page, page_node); + struct heap_page *page = ccan_list_top(&size_pool->pages, struct heap_page, page_node); for (size_t i = 0; i < pages_count; i++) { /* If we have reached the end of the linked list then there are no * more pages, so break. */ @@ -2745,7 +2739,7 @@ objspace_each_objects_try(VALUE arg) break; } - page = ccan_list_next(&SIZE_POOL_EDEN_HEAP(size_pool)->pages, page, page_node); + page = ccan_list_next(&size_pool->pages, page, page_node); } } @@ -3003,12 +2997,11 @@ gc_abort(void *objspace_ptr) if (is_lazy_sweeping(objspace)) { for (int i = 0; i < SIZE_POOL_COUNT; i++) { rb_size_pool_t *size_pool = &size_pools[i]; - rb_heap_t *heap = SIZE_POOL_EDEN_HEAP(size_pool); - heap->sweeping_page = NULL; + size_pool->sweeping_page = NULL; struct heap_page *page = NULL; - ccan_list_for_each(&heap->pages, page, page_node) { + ccan_list_for_each(&size_pool->pages, page, page_node) { page->flags.before_sweep = false; } } @@ -3016,8 +3009,7 @@ gc_abort(void *objspace_ptr) for (int i = 0; i < SIZE_POOL_COUNT; i++) { rb_size_pool_t *size_pool = &size_pools[i]; - rb_heap_t *heap = SIZE_POOL_EDEN_HEAP(size_pool); - rgengc_mark_and_rememberset_clear(objspace, heap); + rgengc_mark_and_rememberset_clear(objspace, size_pool); } gc_mode_set(objspace, gc_mode_none); @@ -3158,7 +3150,7 @@ objspace_available_slots(rb_objspace_t *objspace) size_t total_slots = 0; for (int i = 0; i < SIZE_POOL_COUNT; i++) { rb_size_pool_t *size_pool = &size_pools[i]; - total_slots += SIZE_POOL_EDEN_HEAP(size_pool)->total_slots; + total_slots += size_pool->total_slots; } return total_slots; } @@ -3222,7 +3214,7 @@ unlock_page_body(rb_objspace_t *objspace, struct heap_page_body *body) } static bool -try_move(rb_objspace_t *objspace, rb_heap_t *heap, struct heap_page *free_page, VALUE src) +try_move(rb_objspace_t *objspace, rb_size_pool_t *size_pool, struct heap_page *free_page, VALUE src) { GC_ASSERT(gc_is_moveable_obj(objspace, src)); @@ -3268,13 +3260,13 @@ try_move(rb_objspace_t *objspace, rb_heap_t *heap, struct heap_page *free_page, } static void -gc_unprotect_pages(rb_objspace_t *objspace, rb_heap_t *heap) +gc_unprotect_pages(rb_objspace_t *objspace, rb_size_pool_t *size_pool) { - struct heap_page *cursor = heap->compact_cursor; + struct heap_page *cursor = size_pool->compact_cursor; while (cursor) { unlock_page_body(objspace, cursor->body); - cursor = ccan_list_next(&heap->pages, cursor, page_node); + cursor = ccan_list_next(&size_pool->pages, cursor, page_node); } } @@ -3470,8 +3462,7 @@ gc_compact_finish(rb_objspace_t *objspace) { for (int i = 0; i < SIZE_POOL_COUNT; i++) { rb_size_pool_t *size_pool = &size_pools[i]; - rb_heap_t *heap = SIZE_POOL_EDEN_HEAP(size_pool); - gc_unprotect_pages(objspace, heap); + gc_unprotect_pages(objspace, size_pool); } uninstall_handlers(); @@ -3481,10 +3472,9 @@ gc_compact_finish(rb_objspace_t *objspace) for (int i = 0; i < SIZE_POOL_COUNT; i++) { rb_size_pool_t *size_pool = &size_pools[i]; - rb_heap_t *heap = SIZE_POOL_EDEN_HEAP(size_pool); - heap->compact_cursor = NULL; - heap->free_pages = NULL; - heap->compact_cursor_index = 0; + size_pool->compact_cursor = NULL; + size_pool->free_pages = NULL; + size_pool->compact_cursor_index = 0; } if (gc_prof_enabled(objspace)) { @@ -3502,7 +3492,7 @@ struct gc_sweep_context { }; static inline void -gc_sweep_plane(rb_objspace_t *objspace, rb_heap_t *heap, uintptr_t p, bits_t bitset, struct gc_sweep_context *ctx) +gc_sweep_plane(rb_objspace_t *objspace, rb_size_pool_t *size_pool, uintptr_t p, bits_t bitset, struct gc_sweep_context *ctx) { struct heap_page *sweep_page = ctx->page; short slot_size = sweep_page->slot_size; @@ -3582,10 +3572,10 @@ gc_sweep_plane(rb_objspace_t *objspace, rb_heap_t *heap, uintptr_t p, bits_t bit } static inline void -gc_sweep_page(rb_objspace_t *objspace, rb_heap_t *heap, struct gc_sweep_context *ctx) +gc_sweep_page(rb_objspace_t *objspace, rb_size_pool_t *size_pool, struct gc_sweep_context *ctx) { struct heap_page *sweep_page = ctx->page; - GC_ASSERT(SIZE_POOL_EDEN_HEAP(sweep_page->size_pool) == heap); + GC_ASSERT(sweep_page->size_pool == size_pool); uintptr_t p; bits_t *bits, bitset; @@ -3620,19 +3610,19 @@ gc_sweep_page(rb_objspace_t *objspace, rb_heap_t *heap, struct gc_sweep_context bitset = ~bits[0]; bitset >>= NUM_IN_PAGE(p); if (bitset) { - gc_sweep_plane(objspace, heap, p, bitset, ctx); + gc_sweep_plane(objspace, size_pool, p, bitset, ctx); } p += (BITS_BITLENGTH - NUM_IN_PAGE(p)) * BASE_SLOT_SIZE; for (int i = 1; i < bitmap_plane_count; i++) { bitset = ~bits[i]; if (bitset) { - gc_sweep_plane(objspace, heap, p, bitset, ctx); + gc_sweep_plane(objspace, size_pool, p, bitset, ctx); } p += BITS_BITLENGTH * BASE_SLOT_SIZE; } - if (!heap->compact_cursor) { + if (!size_pool->compact_cursor) { gc_setup_mark_bits(sweep_page); } @@ -3725,15 +3715,15 @@ heap_page_freelist_append(struct heap_page *page, struct free_slot *freelist) } static void -gc_sweep_start_heap(rb_objspace_t *objspace, rb_heap_t *heap) +gc_sweep_start_heap(rb_objspace_t *objspace, rb_size_pool_t *size_pool) { - heap->sweeping_page = ccan_list_top(&heap->pages, struct heap_page, page_node); - heap->free_pages = NULL; - heap->pooled_pages = NULL; + size_pool->sweeping_page = ccan_list_top(&size_pool->pages, struct heap_page, page_node); + size_pool->free_pages = NULL; + size_pool->pooled_pages = NULL; if (!objspace->flags.immediate_sweep) { struct heap_page *page = NULL; - ccan_list_for_each(&heap->pages, page, page_node) { + ccan_list_for_each(&size_pool->pages, page, page_node) { page->flags.before_sweep = TRUE; } } @@ -3787,14 +3777,12 @@ gc_sweep_start(rb_objspace_t *objspace) for (int i = 0; i < SIZE_POOL_COUNT; i++) { rb_size_pool_t *size_pool = &size_pools[i]; - rb_heap_t *heap = SIZE_POOL_EDEN_HEAP(size_pool); - - gc_sweep_start_heap(objspace, heap); + gc_sweep_start_heap(objspace, size_pool); /* We should call gc_sweep_finish_size_pool for size pools with no pages. */ - if (heap->sweeping_page == NULL) { - GC_ASSERT(heap->total_pages == 0); - GC_ASSERT(heap->total_slots == 0); + if (size_pool->sweeping_page == NULL) { + GC_ASSERT(size_pool->total_pages == 0); + GC_ASSERT(size_pool->total_slots == 0); gc_sweep_finish_size_pool(objspace, size_pool); } } @@ -3805,8 +3793,7 @@ gc_sweep_start(rb_objspace_t *objspace) static void gc_sweep_finish_size_pool(rb_objspace_t *objspace, rb_size_pool_t *size_pool) { - rb_heap_t *heap = SIZE_POOL_EDEN_HEAP(size_pool); - size_t total_slots = heap->total_slots; + size_t total_slots = size_pool->total_slots; size_t swept_slots = size_pool->freed_slots + size_pool->empty_slots; size_t init_slots = gc_params.size_pool_init_slots[size_pool - size_pools]; @@ -3822,8 +3809,8 @@ gc_sweep_finish_size_pool(rb_objspace_t *objspace, rb_size_pool_t *size_pool) struct heap_page *resurrected_page; while (swept_slots < min_free_slots && (resurrected_page = heap_page_resurrect(objspace))) { - size_pool_add_page(objspace, size_pool, heap, resurrected_page); - heap_add_freepage(heap, resurrected_page); + size_pool_add_page(objspace, size_pool, resurrected_page); + heap_add_freepage(size_pool, resurrected_page); swept_slots += resurrected_page->free_slots; } @@ -3833,7 +3820,7 @@ gc_sweep_finish_size_pool(rb_objspace_t *objspace, rb_size_pool_t *size_pool) * RVALUE_OLD_AGE minor GC since the last major GC. */ if (is_full_marking(objspace) || objspace->profile.count - objspace->rgengc.last_major_gc < RVALUE_OLD_AGE) { - size_pool_allocatable_slots_expand(objspace, size_pool, swept_slots, heap->total_slots); + size_pool_allocatable_slots_expand(objspace, size_pool, swept_slots, size_pool->total_slots); } else { gc_needs_major_flags |= GPR_FLAG_MAJOR_BY_NOFREE; @@ -3858,16 +3845,15 @@ gc_sweep_finish(rb_objspace_t *objspace) size_pool->empty_slots = 0; if (!will_be_incremental_marking(objspace)) { - rb_heap_t *eden_heap = SIZE_POOL_EDEN_HEAP(size_pool); - struct heap_page *end_page = eden_heap->free_pages; + struct heap_page *end_page = size_pool->free_pages; if (end_page) { while (end_page->free_next) end_page = end_page->free_next; - end_page->free_next = eden_heap->pooled_pages; + end_page->free_next = size_pool->pooled_pages; } else { - eden_heap->free_pages = eden_heap->pooled_pages; + size_pool->free_pages = size_pool->pooled_pages; } - eden_heap->pooled_pages = NULL; + size_pool->pooled_pages = NULL; objspace->rincgc.pooled_slots = 0; } } @@ -3881,9 +3867,9 @@ gc_sweep_finish(rb_objspace_t *objspace) } static int -gc_sweep_step(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *heap) +gc_sweep_step(rb_objspace_t *objspace, rb_size_pool_t *size_pool) { - struct heap_page *sweep_page = heap->sweeping_page; + struct heap_page *sweep_page = size_pool->sweeping_page; int unlink_limit = GC_SWEEP_PAGES_FREEABLE_PER_STEP; int swept_slots = 0; int pooled_slots = 0; @@ -3903,10 +3889,10 @@ gc_sweep_step(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *hea .freed_slots = 0, .empty_slots = 0, }; - gc_sweep_page(objspace, heap, &ctx); + gc_sweep_page(objspace, size_pool, &ctx); int free_slots = ctx.freed_slots + ctx.empty_slots; - heap->sweeping_page = ccan_list_next(&heap->pages, sweep_page, page_node); + size_pool->sweeping_page = ccan_list_next(&size_pool->pages, sweep_page, page_node); if (free_slots == sweep_page->total_slots && heap_pages_freeable_pages > 0 && @@ -3914,7 +3900,7 @@ gc_sweep_step(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *hea heap_pages_freeable_pages--; unlink_limit--; /* There are no living objects, so move this page to the global empty pages. */ - heap_unlink_page(objspace, heap, sweep_page); + heap_unlink_page(objspace, size_pool, sweep_page); sweep_page->start = 0; sweep_page->total_slots = 0; @@ -3937,11 +3923,11 @@ gc_sweep_step(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *hea size_pool->empty_slots += ctx.empty_slots; if (pooled_slots < GC_INCREMENTAL_SWEEP_POOL_SLOT_COUNT) { - heap_add_poolpage(objspace, heap, sweep_page); + heap_add_poolpage(objspace, size_pool, sweep_page); pooled_slots += free_slots; } else { - heap_add_freepage(heap, sweep_page); + heap_add_freepage(size_pool, sweep_page); swept_slots += free_slots; if (swept_slots > GC_INCREMENTAL_SWEEP_SLOT_COUNT) { break; @@ -3951,9 +3937,9 @@ gc_sweep_step(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *hea else { sweep_page->free_next = NULL; } - } while ((sweep_page = heap->sweeping_page)); + } while ((sweep_page = size_pool->sweeping_page)); - if (!heap->sweeping_page) { + if (!size_pool->sweeping_page) { gc_sweep_finish_size_pool(objspace, size_pool); if (!has_sweeping_pages(objspace)) { @@ -3965,7 +3951,7 @@ gc_sweep_step(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *hea gc_prof_sweep_timer_stop(objspace); #endif - return heap->free_pages != NULL; + return size_pool->free_pages != NULL; } static void @@ -3974,14 +3960,14 @@ gc_sweep_rest(rb_objspace_t *objspace) for (int i = 0; i < SIZE_POOL_COUNT; i++) { rb_size_pool_t *size_pool = &size_pools[i]; - while (SIZE_POOL_EDEN_HEAP(size_pool)->sweeping_page) { - gc_sweep_step(objspace, size_pool, SIZE_POOL_EDEN_HEAP(size_pool)); + while (size_pool->sweeping_page) { + gc_sweep_step(objspace, size_pool); } } } static void -gc_sweep_continue(rb_objspace_t *objspace, rb_size_pool_t *sweep_size_pool, rb_heap_t *heap) +gc_sweep_continue(rb_objspace_t *objspace, rb_size_pool_t *sweep_size_pool) { GC_ASSERT(dont_gc_val() == FALSE || objspace->profile.latest_gc_info & GPR_FLAG_METHOD); if (!GC_ENABLE_LAZY_SWEEP) return; @@ -3990,7 +3976,7 @@ gc_sweep_continue(rb_objspace_t *objspace, rb_size_pool_t *sweep_size_pool, rb_h for (int i = 0; i < SIZE_POOL_COUNT; i++) { rb_size_pool_t *size_pool = &size_pools[i]; - if (!gc_sweep_step(objspace, size_pool, SIZE_POOL_EDEN_HEAP(size_pool))) { + if (!gc_sweep_step(objspace, size_pool)) { /* sweep_size_pool requires a free slot but sweeping did not yield any * and we cannot allocate a new page. */ if (size_pool == sweep_size_pool && objspace->heap_pages.allocatable_slots == 0) { @@ -4109,13 +4095,13 @@ gc_compact_start(rb_objspace_t *objspace) gc_mode_transition(objspace, gc_mode_compacting); for (int i = 0; i < SIZE_POOL_COUNT; i++) { - rb_heap_t *heap = SIZE_POOL_EDEN_HEAP(&size_pools[i]); - ccan_list_for_each(&heap->pages, page, page_node) { + rb_size_pool_t *size_pool = &size_pools[i]; + ccan_list_for_each(&size_pool->pages, page, page_node) { page->flags.before_sweep = TRUE; } - heap->compact_cursor = ccan_list_tail(&heap->pages, struct heap_page, page_node); - heap->compact_cursor_index = 0; + size_pool->compact_cursor = ccan_list_tail(&size_pool->pages, struct heap_page, page_node); + size_pool->compact_cursor_index = 0; } if (gc_prof_enabled(objspace)) { @@ -4162,7 +4148,7 @@ gc_sweep(rb_objspace_t *objspace) /* Sweep every size pool. */ for (int i = 0; i < SIZE_POOL_COUNT; i++) { rb_size_pool_t *size_pool = &size_pools[i]; - gc_sweep_step(objspace, size_pool, SIZE_POOL_EDEN_HEAP(size_pool)); + gc_sweep_step(objspace, size_pool); } } @@ -5168,7 +5154,7 @@ gc_verify_heap_pages(rb_objspace_t *objspace) { int remembered_old_objects = 0; for (int i = 0; i < SIZE_POOL_COUNT; i++) { - remembered_old_objects += gc_verify_heap_pages_(objspace, &(SIZE_POOL_EDEN_HEAP(&size_pools[i])->pages)); + remembered_old_objects += gc_verify_heap_pages_(objspace, &((&size_pools[i])->pages)); } return remembered_old_objects; } @@ -5275,21 +5261,21 @@ gc_verify_internal_consistency(void *objspace_ptr) } static void -heap_move_pooled_pages_to_free_pages(rb_heap_t *heap) +heap_move_pooled_pages_to_free_pages(rb_size_pool_t *size_pool) { - if (heap->pooled_pages) { - if (heap->free_pages) { - struct heap_page *free_pages_tail = heap->free_pages; + if (size_pool->pooled_pages) { + if (size_pool->free_pages) { + struct heap_page *free_pages_tail = size_pool->free_pages; while (free_pages_tail->free_next) { free_pages_tail = free_pages_tail->free_next; } - free_pages_tail->free_next = heap->pooled_pages; + free_pages_tail->free_next = size_pool->pooled_pages; } else { - heap->free_pages = heap->pooled_pages; + size_pool->free_pages = size_pool->pooled_pages; } - heap->pooled_pages = NULL; + size_pool->pooled_pages = NULL; } } @@ -5335,11 +5321,11 @@ gc_marks_wb_unprotected_objects_plane(rb_objspace_t *objspace, uintptr_t p, bits } static void -gc_marks_wb_unprotected_objects(rb_objspace_t *objspace, rb_heap_t *heap) +gc_marks_wb_unprotected_objects(rb_objspace_t *objspace, rb_size_pool_t *size_pool) { struct heap_page *page = 0; - ccan_list_for_each(&heap->pages, page, page_node) { + ccan_list_for_each(&size_pool->pages, page, page_node) { bits_t *mark_bits = page->mark_bits; bits_t *wbun_bits = page->wb_unprotected_bits; uintptr_t p = page->start; @@ -5413,7 +5399,7 @@ gc_marks_finish(rb_objspace_t *objspace) objspace->flags.during_incremental_marking = FALSE; /* check children of all marked wb-unprotected objects */ for (int i = 0; i < SIZE_POOL_COUNT; i++) { - gc_marks_wb_unprotected_objects(objspace, SIZE_POOL_EDEN_HEAP(&size_pools[i])); + gc_marks_wb_unprotected_objects(objspace, &size_pools[i]); } } @@ -5507,9 +5493,9 @@ gc_marks_finish(rb_objspace_t *objspace) } static bool -gc_compact_heap_cursors_met_p(rb_heap_t *heap) +gc_compact_heap_cursors_met_p(rb_size_pool_t *size_pool) { - return heap->sweeping_page == heap->compact_cursor; + return size_pool->sweeping_page == size_pool->compact_cursor; } @@ -5530,35 +5516,34 @@ gc_compact_destination_pool(rb_objspace_t *objspace, rb_size_pool_t *src_pool, V } static bool -gc_compact_move(rb_objspace_t *objspace, rb_heap_t *heap, rb_size_pool_t *size_pool, VALUE src) +gc_compact_move(rb_objspace_t *objspace, rb_size_pool_t *size_pool, VALUE src) { GC_ASSERT(BUILTIN_TYPE(src) != T_MOVED); GC_ASSERT(gc_is_moveable_obj(objspace, src)); rb_size_pool_t *dest_pool = gc_compact_destination_pool(objspace, size_pool, src); - rb_heap_t *dheap = SIZE_POOL_EDEN_HEAP(dest_pool); uint32_t orig_shape = 0; uint32_t new_shape = 0; - if (gc_compact_heap_cursors_met_p(dheap)) { - return dheap != heap; + if (gc_compact_heap_cursors_met_p(dest_pool)) { + return dest_pool != size_pool; } if (RB_TYPE_P(src, T_OBJECT)) { orig_shape = rb_gc_get_shape(src); - if (dheap != heap) { + if (dest_pool != size_pool) { new_shape = rb_gc_rebuild_shape(src, dest_pool - size_pools); if (new_shape == 0) { - dheap = heap; + dest_pool = size_pool; } } } - while (!try_move(objspace, dheap, dheap->free_pages, src)) { + while (!try_move(objspace, dest_pool, dest_pool->free_pages, src)) { struct gc_sweep_context ctx = { - .page = dheap->sweeping_page, + .page = dest_pool->sweeping_page, .final_slots = 0, .freed_slots = 0, .empty_slots = 0, @@ -5568,16 +5553,16 @@ gc_compact_move(rb_objspace_t *objspace, rb_heap_t *heap, rb_size_pool_t *size_p * T_MOVED. Sweeping a page may read objects on this page, so we * need to lock the page. */ lock_page_body(objspace, GET_PAGE_BODY(src)); - gc_sweep_page(objspace, dheap, &ctx); + gc_sweep_page(objspace, dest_pool, &ctx); unlock_page_body(objspace, GET_PAGE_BODY(src)); - if (dheap->sweeping_page->free_slots > 0) { - heap_add_freepage(dheap, dheap->sweeping_page); + if (dest_pool->sweeping_page->free_slots > 0) { + heap_add_freepage(dest_pool, dest_pool->sweeping_page); } - dheap->sweeping_page = ccan_list_next(&dheap->pages, dheap->sweeping_page, page_node); - if (gc_compact_heap_cursors_met_p(dheap)) { - return dheap != heap; + dest_pool->sweeping_page = ccan_list_next(&dest_pool->pages, dest_pool->sweeping_page, page_node); + if (gc_compact_heap_cursors_met_p(dest_pool)) { + return dest_pool != size_pool; } } @@ -5593,7 +5578,7 @@ gc_compact_move(rb_objspace_t *objspace, rb_heap_t *heap, rb_size_pool_t *size_p } static bool -gc_compact_plane(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *heap, uintptr_t p, bits_t bitset, struct heap_page *page) +gc_compact_plane(rb_objspace_t *objspace, rb_size_pool_t *size_pool, uintptr_t p, bits_t bitset, struct heap_page *page) { short slot_size = page->slot_size; short slot_bits = slot_size / BASE_SLOT_SIZE; @@ -5607,7 +5592,7 @@ gc_compact_plane(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t * objspace->rcompactor.considered_count_table[BUILTIN_TYPE(vp)]++; if (gc_is_moveable_obj(objspace, vp)) { - if (!gc_compact_move(objspace, heap, size_pool, vp)) { + if (!gc_compact_move(objspace, size_pool, vp)) { //the cursors met. bubble up return false; } @@ -5622,9 +5607,9 @@ gc_compact_plane(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t * // Iterate up all the objects in page, moving them to where they want to go static bool -gc_compact_page(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *heap, struct heap_page *page) +gc_compact_page(rb_objspace_t *objspace, rb_size_pool_t *size_pool, struct heap_page *page) { - GC_ASSERT(page == heap->compact_cursor); + GC_ASSERT(page == size_pool->compact_cursor); bits_t *mark_bits, *pin_bits; bits_t bitset; @@ -5637,7 +5622,7 @@ gc_compact_page(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *h bitset = (mark_bits[0] & ~pin_bits[0]); bitset >>= NUM_IN_PAGE(p); if (bitset) { - if (!gc_compact_plane(objspace, size_pool, heap, (uintptr_t)p, bitset, page)) + if (!gc_compact_plane(objspace, size_pool, (uintptr_t)p, bitset, page)) return false; } p += (BITS_BITLENGTH - NUM_IN_PAGE(p)) * BASE_SLOT_SIZE; @@ -5645,7 +5630,7 @@ gc_compact_page(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *h for (int j = 1; j < HEAP_PAGE_BITMAP_LIMIT; j++) { bitset = (mark_bits[j] & ~pin_bits[j]); if (bitset) { - if (!gc_compact_plane(objspace, size_pool, heap, (uintptr_t)p, bitset, page)) + if (!gc_compact_plane(objspace, size_pool, (uintptr_t)p, bitset, page)) return false; } p += BITS_BITLENGTH * BASE_SLOT_SIZE; @@ -5659,10 +5644,9 @@ gc_compact_all_compacted_p(rb_objspace_t *objspace) { for (int i = 0; i < SIZE_POOL_COUNT; i++) { rb_size_pool_t *size_pool = &size_pools[i]; - rb_heap_t *heap = SIZE_POOL_EDEN_HEAP(size_pool); - if (heap->total_pages > 0 && - !gc_compact_heap_cursors_met_p(heap)) { + if (size_pool->total_pages > 0 && + !gc_compact_heap_cursors_met_p(size_pool)) { return false; } } @@ -5681,15 +5665,14 @@ gc_sweep_compact(rb_objspace_t *objspace) while (!gc_compact_all_compacted_p(objspace)) { for (int i = 0; i < SIZE_POOL_COUNT; i++) { rb_size_pool_t *size_pool = &size_pools[i]; - rb_heap_t *heap = SIZE_POOL_EDEN_HEAP(size_pool); - if (gc_compact_heap_cursors_met_p(heap)) { + if (gc_compact_heap_cursors_met_p(size_pool)) { continue; } - struct heap_page *start_page = heap->compact_cursor; + struct heap_page *start_page = size_pool->compact_cursor; - if (!gc_compact_page(objspace, size_pool, heap, start_page)) { + if (!gc_compact_page(objspace, size_pool, start_page)) { lock_page_body(objspace, start_page->body); continue; @@ -5698,7 +5681,7 @@ gc_sweep_compact(rb_objspace_t *objspace) // If we get here, we've finished moving all objects on the compact_cursor page // So we can lock it and move the cursor on to the next one. lock_page_body(objspace, start_page->body); - heap->compact_cursor = ccan_list_prev(&heap->pages, heap->compact_cursor, page_node); + size_pool->compact_cursor = ccan_list_prev(&size_pool->pages, size_pool->compact_cursor, page_node); } } @@ -5715,7 +5698,7 @@ gc_marks_rest(rb_objspace_t *objspace) gc_report(1, objspace, "gc_marks_rest\n"); for (int i = 0; i < SIZE_POOL_COUNT; i++) { - SIZE_POOL_EDEN_HEAP(&size_pools[i])->pooled_pages = NULL; + (&size_pools[i])->pooled_pages = NULL; } if (is_incremental_marking(objspace)) { @@ -5744,14 +5727,14 @@ gc_marks_step(rb_objspace_t *objspace, size_t slots) } static bool -gc_marks_continue(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *heap) +gc_marks_continue(rb_objspace_t *objspace, rb_size_pool_t *size_pool) { GC_ASSERT(dont_gc_val() == FALSE || objspace->profile.latest_gc_info & GPR_FLAG_METHOD); bool marking_finished = true; gc_marking_enter(objspace); - if (heap->free_pages) { + if (size_pool->free_pages) { gc_report(2, objspace, "gc_marks_continue: has pooled pages"); marking_finished = gc_marks_step(objspace, objspace->rincgc.step_slots); @@ -5795,14 +5778,13 @@ gc_marks_start(rb_objspace_t *objspace, int full_mark) for (int i = 0; i < SIZE_POOL_COUNT; i++) { rb_size_pool_t *size_pool = &size_pools[i]; - rb_heap_t *heap = SIZE_POOL_EDEN_HEAP(size_pool); - rgengc_mark_and_rememberset_clear(objspace, heap); - heap_move_pooled_pages_to_free_pages(heap); + rgengc_mark_and_rememberset_clear(objspace, size_pool); + heap_move_pooled_pages_to_free_pages(size_pool); if (objspace->flags.during_compacting) { struct heap_page *page = NULL; - ccan_list_for_each(&heap->pages, page, page_node) { + ccan_list_for_each(&size_pool->pages, page, page_node) { page->pinned_slots = 0; } } @@ -5815,7 +5797,7 @@ gc_marks_start(rb_objspace_t *objspace, int full_mark) objspace->profile.minor_gc_count++; for (int i = 0; i < SIZE_POOL_COUNT; i++) { - rgengc_rememberset_mark(objspace, SIZE_POOL_EDEN_HEAP(&size_pools[i])); + rgengc_rememberset_mark(objspace, &size_pools[i]); } } @@ -5957,7 +5939,7 @@ rgengc_rememberset_mark_plane(rb_objspace_t *objspace, uintptr_t p, bits_t bitse } static void -rgengc_rememberset_mark(rb_objspace_t *objspace, rb_heap_t *heap) +rgengc_rememberset_mark(rb_objspace_t *objspace, rb_size_pool_t *size_pool) { size_t j; struct heap_page *page = 0; @@ -5966,7 +5948,7 @@ rgengc_rememberset_mark(rb_objspace_t *objspace, rb_heap_t *heap) #endif gc_report(1, objspace, "rgengc_rememberset_mark: start\n"); - ccan_list_for_each(&heap->pages, page, page_node) { + ccan_list_for_each(&size_pool->pages, page, page_node) { if (page->flags.has_remembered_objects | page->flags.has_uncollectible_wb_unprotected_objects) { uintptr_t p = page->start; bits_t bitset, bits[HEAP_PAGE_BITMAP_LIMIT]; @@ -6009,11 +5991,11 @@ rgengc_rememberset_mark(rb_objspace_t *objspace, rb_heap_t *heap) } static void -rgengc_mark_and_rememberset_clear(rb_objspace_t *objspace, rb_heap_t *heap) +rgengc_mark_and_rememberset_clear(rb_objspace_t *objspace, rb_size_pool_t *size_pool) { struct heap_page *page = 0; - ccan_list_for_each(&heap->pages, page, page_node) { + ccan_list_for_each(&size_pool->pages, page, page_node) { memset(&page->mark_bits[0], 0, HEAP_PAGE_BITMAP_SIZE); memset(&page->uncollectible_bits[0], 0, HEAP_PAGE_BITMAP_SIZE); memset(&page->marking_bits[0], 0, HEAP_PAGE_BITMAP_SIZE); @@ -6250,12 +6232,12 @@ rb_gc_impl_ractor_cache_free(void *objspace_ptr, void *cache) } static void -heap_ready_to_gc(rb_objspace_t *objspace, rb_size_pool_t *size_pool, rb_heap_t *heap) +heap_ready_to_gc(rb_objspace_t *objspace, rb_size_pool_t *size_pool) { - if (!heap->free_pages) { - if (!heap_page_allocate_and_initialize(objspace, size_pool, heap)) { + if (!size_pool->free_pages) { + if (!heap_page_allocate_and_initialize(objspace, size_pool)) { objspace->heap_pages.allocatable_slots = 1; - heap_page_allocate_and_initialize(objspace, size_pool, heap); + heap_page_allocate_and_initialize(objspace, size_pool); } } } @@ -6266,7 +6248,7 @@ ready_to_gc(rb_objspace_t *objspace) if (dont_gc_val() || during_gc || ruby_disable_gc) { for (int i = 0; i < SIZE_POOL_COUNT; i++) { rb_size_pool_t *size_pool = &size_pools[i]; - heap_ready_to_gc(objspace, size_pool, SIZE_POOL_EDEN_HEAP(size_pool)); + heap_ready_to_gc(objspace, size_pool); } return FALSE; } @@ -7062,13 +7044,13 @@ gc_sort_heap_by_compare_func(rb_objspace_t *objspace, gc_compact_compare_func co for (int j = 0; j < SIZE_POOL_COUNT; j++) { rb_size_pool_t *size_pool = &size_pools[j]; - size_t total_pages = SIZE_POOL_EDEN_HEAP(size_pool)->total_pages; + size_t total_pages = size_pool->total_pages; size_t size = rb_size_mul_or_raise(total_pages, sizeof(struct heap_page *), rb_eRuntimeError); struct heap_page *page = 0, **page_list = malloc(size); size_t i = 0; - SIZE_POOL_EDEN_HEAP(size_pool)->free_pages = NULL; - ccan_list_for_each(&SIZE_POOL_EDEN_HEAP(size_pool)->pages, page, page_node) { + size_pool->free_pages = NULL; + ccan_list_for_each(&size_pool->pages, page, page_node) { page_list[i++] = page; GC_ASSERT(page); } @@ -7080,12 +7062,12 @@ gc_sort_heap_by_compare_func(rb_objspace_t *objspace, gc_compact_compare_func co ruby_qsort(page_list, total_pages, sizeof(struct heap_page *), compare_func, NULL); /* Reset the eden heap */ - ccan_list_head_init(&SIZE_POOL_EDEN_HEAP(size_pool)->pages); + ccan_list_head_init(&size_pool->pages); for (i = 0; i < total_pages; i++) { - ccan_list_add(&SIZE_POOL_EDEN_HEAP(size_pool)->pages, &page_list[i]->page_node); + ccan_list_add(&size_pool->pages, &page_list[i]->page_node); if (page_list[i]->free_slots != 0) { - heap_add_freepage(SIZE_POOL_EDEN_HEAP(size_pool), page_list[i]); + heap_add_freepage(size_pool, page_list[i]); } } @@ -7149,14 +7131,13 @@ gc_update_references(rb_objspace_t *objspace) for (int i = 0; i < SIZE_POOL_COUNT; i++) { bool should_set_mark_bits = TRUE; rb_size_pool_t *size_pool = &size_pools[i]; - rb_heap_t *heap = SIZE_POOL_EDEN_HEAP(size_pool); - ccan_list_for_each(&heap->pages, page, page_node) { + ccan_list_for_each(&size_pool->pages, page, page_node) { uintptr_t start = (uintptr_t)page->start; uintptr_t end = start + (page->total_slots * size_pool->slot_size); gc_ref_update((void *)start, (void *)end, size_pool->slot_size, objspace, page); - if (page == heap->sweeping_page) { + if (page == size_pool->sweeping_page) { should_set_mark_bits = FALSE; } if (should_set_mark_bits) { @@ -7643,8 +7624,8 @@ stat_one_heap(rb_size_pool_t *size_pool, VALUE hash, VALUE key) rb_hash_aset(hash, gc_stat_heap_symbols[gc_stat_heap_sym_##name], SIZET2NUM(attr)); SET(slot_size, size_pool->slot_size); - SET(heap_eden_pages, SIZE_POOL_EDEN_HEAP(size_pool)->total_pages); - SET(heap_eden_slots, SIZE_POOL_EDEN_HEAP(size_pool)->total_slots); + SET(heap_eden_pages, size_pool->total_pages); + SET(heap_eden_slots, size_pool->total_slots); SET(total_allocated_pages, size_pool->total_allocated_pages); SET(force_major_gc_count, size_pool->force_major_gc_count); SET(force_incremental_marking_finish_count, size_pool->force_incremental_marking_finish_count); @@ -9185,14 +9166,12 @@ gc_verify_compaction_references(int argc, VALUE* argv, VALUE self) size_t max_existing_pages = 0; for (int i = 0; i < SIZE_POOL_COUNT; i++) { rb_size_pool_t *size_pool = &size_pools[i]; - rb_heap_t *heap = SIZE_POOL_EDEN_HEAP(size_pool); - max_existing_pages = MAX(max_existing_pages, heap->total_pages); + max_existing_pages = MAX(max_existing_pages, size_pool->total_pages); } /* Add pages to each size pool so that compaction is guaranteed to move every object */ for (int i = 0; i < SIZE_POOL_COUNT; i++) { rb_size_pool_t *size_pool = &size_pools[i]; - rb_heap_t *heap = SIZE_POOL_EDEN_HEAP(size_pool); size_t pages_to_add = 0; /* @@ -9201,14 +9180,14 @@ gc_verify_compaction_references(int argc, VALUE* argv, VALUE self) * through all of the pools in `gc_sweep_compact` without hitting the "sweep & * compact cursors met" condition on some pools before fully compacting others */ - pages_to_add += max_existing_pages - heap->total_pages; + pages_to_add += max_existing_pages - size_pool->total_pages; /* * Step 2: Now add additional free pages to each size pool sufficient to hold all objects * that want to be in that size pool, whether moved into it or moved within it */ objspace->heap_pages.allocatable_slots = desired_compaction.required_slots[i]; while (objspace->heap_pages.allocatable_slots > 0) { - heap_page_allocate_and_initialize(objspace, size_pool, heap); + heap_page_allocate_and_initialize(objspace, size_pool); } /* * Step 3: Add two more pages so that the compact & sweep cursors will meet _after_ all objects @@ -9217,7 +9196,7 @@ gc_verify_compaction_references(int argc, VALUE* argv, VALUE self) pages_to_add += 2; for (; pages_to_add > 0; pages_to_add--) { - heap_page_allocate_and_initialize_force(objspace, size_pool, heap); + heap_page_allocate_and_initialize_force(objspace, size_pool); } } } @@ -9261,8 +9240,8 @@ rb_gc_impl_objspace_free(void *objspace_ptr) for (int i = 0; i < SIZE_POOL_COUNT; i++) { rb_size_pool_t *size_pool = &size_pools[i]; - SIZE_POOL_EDEN_HEAP(size_pool)->total_pages = 0; - SIZE_POOL_EDEN_HEAP(size_pool)->total_slots = 0; + size_pool->total_pages = 0; + size_pool->total_slots = 0; } st_free_table(objspace->id_to_obj_tbl); @@ -9335,7 +9314,7 @@ rb_gc_impl_objspace_init(void *objspace_ptr) size_pool->slot_size = (1 << i) * BASE_SLOT_SIZE; - ccan_list_head_init(&SIZE_POOL_EDEN_HEAP(size_pool)->pages); + ccan_list_head_init(&size_pool->pages); } rb_darray_make(&objspace->heap_pages.sorted, 0); From 8e7df4b7c674cf408fa570b9593811167bbff04a Mon Sep 17 00:00:00 2001 From: Matt Valentine-House Date: Thu, 3 Oct 2024 13:53:49 +0100 Subject: [PATCH 665/829] Rename size_pool -> heap Now that we've inlined the eden_heap into the size_pool, we should rename the size_pool to heap. So that Ruby contains multiple heaps, with different sized objects. The term heap as a collection of memory pages is more in memory management nomenclature, whereas size_pool was a name chosen out of necessity during the development of the Variable Width Allocation features of Ruby. The concept of size pools was introduced in order to facilitate different sized objects (other than the default 40 bytes). They wrapped the eden heap and the tomb heap, and some related state, and provided a reasonably simple way of duplicating all related concerns, to provide multiple pools that all shared the same structure but held different objects. Since then various changes have happend in Ruby's memory layout: * The concept of tomb heaps has been replaced by a global free pages list, with each page having it's slot size reconfigured at the point when it is resurrected * the eden heap has been inlined into the size pool itself, so that now the size pool directly controls the free_pages list, the sweeping page, the compaction cursor and the other state that was previously being managed by the eden heap. Now that there is no need for a heap wrapper, we should refer to the collection of pages containing Ruby objects as a heap again rather than a size pool --- benchmark/string_concat.yml | 4 +- gc.c | 24 +- gc/default.c | 790 ++++++++++++++++----------------- gc/gc.h | 2 +- gc/gc_impl.h | 4 +- internal/class.h | 2 +- internal/gc.h | 4 +- misc/lldb_cruby.py | 2 +- object.c | 4 +- rjit_c.rb | 2 +- shape.c | 14 +- shape.h | 2 +- test/ruby/test_gc.rb | 10 +- test/ruby/test_gc_compact.rb | 14 +- test/ruby/test_string.rb | 4 +- yjit/src/cruby_bindings.inc.rs | 2 +- 16 files changed, 442 insertions(+), 442 deletions(-) diff --git a/benchmark/string_concat.yml b/benchmark/string_concat.yml index da14692f5ecc2c..f11f95ee9a7891 100644 --- a/benchmark/string_concat.yml +++ b/benchmark/string_concat.yml @@ -45,7 +45,7 @@ benchmark: "#{CHUNK}#{CHUNK}#{CHUNK}#{CHUNK}#{CHUNK}#{CHUNK}#{CHUNK}#{CHUNK}#{CHUNK}#{CHUNK}" \ "#{CHUNK}#{CHUNK}#{CHUNK}#{CHUNK}#{CHUNK}#{CHUNK}#{CHUNK}#{CHUNK}#{CHUNK}#{CHUNK}" \ "#{CHUNK}#{CHUNK}#{CHUNK}#{CHUNK}#{CHUNK}#{CHUNK}#{CHUNK}#{CHUNK}#{CHUNK}" - interpolation_same_size_pool: | + interpolation_same_heap: | buffer = "#{SHORT}#{SHORT}" - interpolation_switching_size_pools: | + interpolation_switching_heaps: | buffer = "#{SHORT}#{LONG}" diff --git a/gc.c b/gc.c index 0f50974017a70e..66d0565f151c7d 100644 --- a/gc.c +++ b/gc.c @@ -310,13 +310,13 @@ rb_gc_set_shape(VALUE obj, uint32_t shape_id) } uint32_t -rb_gc_rebuild_shape(VALUE obj, size_t size_pool_id) +rb_gc_rebuild_shape(VALUE obj, size_t heap_id) { rb_shape_t *orig_shape = rb_shape_get_shape(obj); if (rb_shape_obj_too_complex(obj)) return (uint32_t)OBJ_TOO_COMPLEX_SHAPE_ID; - rb_shape_t *initial_shape = rb_shape_get_shape_by_id((shape_id_t)(size_pool_id + FIRST_T_OBJECT_SHAPE_ID)); + rb_shape_t *initial_shape = rb_shape_get_shape_by_id((shape_id_t)(heap_id + FIRST_T_OBJECT_SHAPE_ID)); rb_shape_t *new_shape = rb_shape_traverse_from_new_root(initial_shape, orig_shape); if (!new_shape) return 0; @@ -577,7 +577,7 @@ typedef struct gc_function_map { void (*ractor_cache_free)(void *objspace_ptr, void *cache); void (*set_params)(void *objspace_ptr); void (*init)(void); - size_t *(*size_pool_sizes)(void *objspace_ptr); + size_t *(*heap_sizes)(void *objspace_ptr); // Shutdown void (*shutdown_free_objects)(void *objspace_ptr); // GC @@ -594,7 +594,7 @@ typedef struct gc_function_map { // Object allocation VALUE (*new_obj)(void *objspace_ptr, void *cache_ptr, VALUE klass, VALUE flags, VALUE v1, VALUE v2, VALUE v3, bool wb_protected, size_t alloc_size); size_t (*obj_slot_size)(VALUE obj); - size_t (*size_pool_id_for_size)(void *objspace_ptr, size_t size); + size_t (*heap_id_for_size)(void *objspace_ptr, size_t size); bool (*size_allocatable_p)(size_t size); // Malloc void *(*malloc)(void *objspace_ptr, size_t size); @@ -708,7 +708,7 @@ ruby_external_gc_init(void) load_external_gc_func(ractor_cache_free); load_external_gc_func(set_params); load_external_gc_func(init); - load_external_gc_func(size_pool_sizes); + load_external_gc_func(heap_sizes); // Shutdown load_external_gc_func(shutdown_free_objects); // GC @@ -725,7 +725,7 @@ ruby_external_gc_init(void) // Object allocation load_external_gc_func(new_obj); load_external_gc_func(obj_slot_size); - load_external_gc_func(size_pool_id_for_size); + load_external_gc_func(heap_id_for_size); load_external_gc_func(size_allocatable_p); // Malloc load_external_gc_func(malloc); @@ -787,7 +787,7 @@ ruby_external_gc_init(void) # define rb_gc_impl_ractor_cache_free rb_gc_functions.ractor_cache_free # define rb_gc_impl_set_params rb_gc_functions.set_params # define rb_gc_impl_init rb_gc_functions.init -# define rb_gc_impl_size_pool_sizes rb_gc_functions.size_pool_sizes +# define rb_gc_impl_heap_sizes rb_gc_functions.heap_sizes // Shutdown # define rb_gc_impl_shutdown_free_objects rb_gc_functions.shutdown_free_objects // GC @@ -804,7 +804,7 @@ ruby_external_gc_init(void) // Object allocation # define rb_gc_impl_new_obj rb_gc_functions.new_obj # define rb_gc_impl_obj_slot_size rb_gc_functions.obj_slot_size -# define rb_gc_impl_size_pool_id_for_size rb_gc_functions.size_pool_id_for_size +# define rb_gc_impl_heap_id_for_size rb_gc_functions.heap_id_for_size # define rb_gc_impl_size_allocatable_p rb_gc_functions.size_allocatable_p // Malloc # define rb_gc_impl_malloc rb_gc_functions.malloc @@ -3000,9 +3000,9 @@ rb_gc_prepare_heap(void) } size_t -rb_gc_size_pool_id_for_size(size_t size) +rb_gc_heap_id_for_size(size_t size) { - return rb_gc_impl_size_pool_id_for_size(rb_gc_get_objspace(), size); + return rb_gc_impl_heap_id_for_size(rb_gc_get_objspace(), size); } bool @@ -3452,9 +3452,9 @@ rb_gc_initial_stress_set(VALUE flag) } size_t * -rb_gc_size_pool_sizes(void) +rb_gc_heap_sizes(void) { - return rb_gc_impl_size_pool_sizes(rb_gc_get_objspace()); + return rb_gc_impl_heap_sizes(rb_gc_get_objspace()); } VALUE diff --git a/gc/default.c b/gc/default.c index cd3b40e1400df9..237f822fb54742 100644 --- a/gc/default.c +++ b/gc/default.c @@ -150,22 +150,22 @@ #define USE_TICK_T (PRINT_ENTER_EXIT_TICK || PRINT_ROOT_TICKS) -#ifndef SIZE_POOL_COUNT -# define SIZE_POOL_COUNT 5 +#ifndef HEAP_COUNT +# define HEAP_COUNT 5 #endif -typedef struct ractor_newobj_size_pool_cache { +typedef struct ractor_newobj_heap_cache { struct free_slot *freelist; struct heap_page *using_page; -} rb_ractor_newobj_size_pool_cache_t; +} rb_ractor_newobj_heap_cache_t; typedef struct ractor_newobj_cache { size_t incremental_mark_step_allocated_slots; - rb_ractor_newobj_size_pool_cache_t size_pool_caches[SIZE_POOL_COUNT]; + rb_ractor_newobj_heap_cache_t heap_caches[HEAP_COUNT]; } rb_ractor_newobj_cache_t; typedef struct { - size_t size_pool_init_slots[SIZE_POOL_COUNT]; + size_t heap_init_slots[HEAP_COUNT]; size_t heap_free_slots; double growth_factor; size_t growth_max_slots; @@ -405,7 +405,7 @@ typedef struct mark_stack { typedef int (*gc_compact_compare_func)(const void *l, const void *r, void *d); -typedef struct rb_size_pool_struct { +typedef struct rb_heap_struct { short slot_size; /* Basic statistics */ @@ -429,7 +429,7 @@ typedef struct rb_size_pool_struct { size_t total_pages; /* total page count in a heap */ size_t total_slots; /* total slot count (about total_pages * HEAP_PAGE_OBJ_LIMIT) */ -} rb_size_pool_t; +} rb_heap_t; enum { gc_stress_no_major, @@ -477,7 +477,7 @@ typedef struct rb_objspace { rb_event_flag_t hook_events; unsigned long long next_object_id; - rb_size_pool_t size_pools[SIZE_POOL_COUNT]; + rb_heap_t heaps[HEAP_COUNT]; size_t empty_pages_count; struct heap_page *empty_pages; @@ -724,7 +724,7 @@ struct heap_page { unsigned int has_uncollectible_wb_unprotected_objects : 1; } flags; - rb_size_pool_t *size_pool; + rb_heap_t *heap; struct heap_page *free_next; struct heap_page_body *body; @@ -769,7 +769,7 @@ heap_page_in_global_empty_pages_pool(rb_objspace_t *objspace, struct heap_page * if (page->total_slots == 0) { GC_ASSERT(page->start == 0); GC_ASSERT(page->slot_size == 0); - GC_ASSERT(page->size_pool == NULL); + GC_ASSERT(page->heap == NULL); GC_ASSERT(page->free_slots == 0); asan_unpoisoning_memory_region(&page->freelist, sizeof(&page->freelist)) { GC_ASSERT(page->freelist == NULL); @@ -780,7 +780,7 @@ heap_page_in_global_empty_pages_pool(rb_objspace_t *objspace, struct heap_page * else { GC_ASSERT(page->start != 0); GC_ASSERT(page->slot_size != 0); - GC_ASSERT(page->size_pool != NULL); + GC_ASSERT(page->heap != NULL); return false; } @@ -843,7 +843,7 @@ RVALUE_AGE_SET(VALUE obj, int age) #define heap_pages_himem objspace->heap_pages.range[1] #define heap_pages_freeable_pages objspace->heap_pages.freeable_pages #define heap_pages_deferred_final objspace->heap_pages.deferred_final -#define size_pools objspace->size_pools +#define heaps objspace->heaps #define during_gc objspace->flags.during_gc #define finalizing objspace->atomic_flags.finalizing #define finalizer_table objspace->finalizer_table @@ -904,8 +904,8 @@ gc_mode_verify(enum gc_mode mode) static inline bool has_sweeping_pages(rb_objspace_t *objspace) { - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - if ((&size_pools[i])->sweeping_page) { + for (int i = 0; i < HEAP_COUNT; i++) { + if ((&heaps[i])->sweeping_page) { return TRUE; } } @@ -916,8 +916,8 @@ static inline size_t heap_eden_total_pages(rb_objspace_t *objspace) { size_t count = 0; - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - count += (&size_pools[i])->total_pages; + for (int i = 0; i < HEAP_COUNT; i++) { + count += (&heaps[i])->total_pages; } return count; } @@ -926,9 +926,9 @@ static inline size_t total_allocated_objects(rb_objspace_t *objspace) { size_t count = 0; - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - rb_size_pool_t *size_pool = &size_pools[i]; - count += size_pool->total_allocated_objects; + for (int i = 0; i < HEAP_COUNT; i++) { + rb_heap_t *heap = &heaps[i]; + count += heap->total_allocated_objects; } return count; } @@ -937,9 +937,9 @@ static inline size_t total_freed_objects(rb_objspace_t *objspace) { size_t count = 0; - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - rb_size_pool_t *size_pool = &size_pools[i]; - count += size_pool->total_freed_objects; + for (int i = 0; i < HEAP_COUNT; i++) { + rb_heap_t *heap = &heaps[i]; + count += heap->total_freed_objects; } return count; } @@ -948,9 +948,9 @@ static inline size_t total_final_slots_count(rb_objspace_t *objspace) { size_t count = 0; - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - rb_size_pool_t *size_pool = &size_pools[i]; - count += size_pool->final_slots_count; + for (int i = 0; i < HEAP_COUNT; i++) { + rb_heap_t *heap = &heaps[i]; + count += heap->final_slots_count; } return count; } @@ -1011,11 +1011,11 @@ static void gc_marking_enter(rb_objspace_t *objspace); static void gc_marking_exit(rb_objspace_t *objspace); static void gc_sweeping_enter(rb_objspace_t *objspace); static void gc_sweeping_exit(rb_objspace_t *objspace); -static bool gc_marks_continue(rb_objspace_t *objspace, rb_size_pool_t *size_pool); +static bool gc_marks_continue(rb_objspace_t *objspace, rb_heap_t *heap); static void gc_sweep(rb_objspace_t *objspace); -static void gc_sweep_finish_size_pool(rb_objspace_t *objspace, rb_size_pool_t *size_pool); -static void gc_sweep_continue(rb_objspace_t *objspace, rb_size_pool_t *size_pool); +static void gc_sweep_finish_heap(rb_objspace_t *objspace, rb_heap_t *heap); +static void gc_sweep_continue(rb_objspace_t *objspace, rb_heap_t *heap); static inline void gc_mark(rb_objspace_t *objspace, VALUE ptr); static inline void gc_pin(rb_objspace_t *objspace, VALUE ptr); @@ -1207,8 +1207,8 @@ RVALUE_UNCOLLECTIBLE(rb_objspace_t *objspace, VALUE obj) #define RVALUE_PAGE_MARKING(page, obj) MARKED_IN_BITMAP((page)->marking_bits, (obj)) static int rgengc_remember(rb_objspace_t *objspace, VALUE obj); -static void rgengc_mark_and_rememberset_clear(rb_objspace_t *objspace, rb_size_pool_t *size_pool); -static void rgengc_rememberset_mark(rb_objspace_t *objspace, rb_size_pool_t *size_pool); +static void rgengc_mark_and_rememberset_clear(rb_objspace_t *objspace, rb_heap_t *heap); +static void rgengc_rememberset_mark(rb_objspace_t *objspace, rb_heap_t *heap); static int check_rvalue_consistency_force(rb_objspace_t *objspace, const VALUE obj, int terminate) @@ -1512,10 +1512,10 @@ rb_gc_impl_get_measure_total_time(void *objspace_ptr) } static size_t -minimum_slots_for_size_pool(rb_objspace_t *objspace, rb_size_pool_t *size_pool) +minimum_slots_for_heap(rb_objspace_t *objspace, rb_heap_t *heap) { - size_t size_pool_idx = size_pool - size_pools; - return gc_params.size_pool_init_slots[size_pool_idx]; + size_t heap_idx = heap - heaps; + return gc_params.heap_init_slots[heap_idx]; } static int @@ -1650,8 +1650,8 @@ heap_page_add_freeobj(rb_objspace_t *objspace, struct heap_page *page, VALUE obj } static void -size_pool_allocatable_slots_expand(rb_objspace_t *objspace, - rb_size_pool_t *size_pool, size_t free_slots, size_t total_slots) +heap_allocatable_slots_expand(rb_objspace_t *objspace, + rb_heap_t *heap, size_t free_slots, size_t total_slots) { double goal_ratio = gc_params.heap_free_slots_goal_ratio; size_t target_total_slots; @@ -1660,7 +1660,7 @@ size_pool_allocatable_slots_expand(rb_objspace_t *objspace, target_total_slots = (size_t)(total_slots * gc_params.growth_factor); } else if (total_slots == 0) { - target_total_slots = minimum_slots_for_size_pool(objspace, size_pool); + target_total_slots = minimum_slots_for_heap(objspace, heap); } else { /* Find `f' where free_slots = f * total_slots * goal_ratio @@ -1696,14 +1696,14 @@ size_pool_allocatable_slots_expand(rb_objspace_t *objspace, } static inline void -heap_add_freepage(rb_size_pool_t *size_pool, struct heap_page *page) +heap_add_freepage(rb_heap_t *heap, struct heap_page *page) { asan_unlock_freelist(page); GC_ASSERT(page->free_slots != 0); GC_ASSERT(page->freelist != NULL); - page->free_next = size_pool->free_pages; - size_pool->free_pages = page; + page->free_next = heap->free_pages; + heap->free_pages = page; RUBY_DEBUG_LOG("page:%p freelist:%p", (void *)page, (void *)page->freelist); @@ -1711,25 +1711,25 @@ heap_add_freepage(rb_size_pool_t *size_pool, struct heap_page *page) } static inline void -heap_add_poolpage(rb_objspace_t *objspace, rb_size_pool_t *size_pool, struct heap_page *page) +heap_add_poolpage(rb_objspace_t *objspace, rb_heap_t *heap, struct heap_page *page) { asan_unlock_freelist(page); GC_ASSERT(page->free_slots != 0); GC_ASSERT(page->freelist != NULL); - page->free_next = size_pool->pooled_pages; - size_pool->pooled_pages = page; + page->free_next = heap->pooled_pages; + heap->pooled_pages = page; objspace->rincgc.pooled_slots += page->free_slots; asan_lock_freelist(page); } static void -heap_unlink_page(rb_objspace_t *objspace, rb_size_pool_t *size_pool, struct heap_page *page) +heap_unlink_page(rb_objspace_t *objspace, rb_heap_t *heap, struct heap_page *page) { ccan_list_del(&page->page_node); - size_pool->total_pages--; - size_pool->total_slots -= page->total_slots; + heap->total_pages--; + heap->total_slots -= page->total_slots; } static void @@ -1779,7 +1779,7 @@ heap_pages_free_unused_pages(rb_objspace_t *objspace) // Get number of pages estimated for the smallest size pool CEILDIV(objspace->heap_pages.allocatable_slots, HEAP_PAGE_OBJ_LIMIT) * // Estimate the average slot size multiple - (1 << (SIZE_POOL_COUNT / 2)); + (1 << (HEAP_COUNT / 2)); if (objspace->empty_pages != NULL && objspace->empty_pages_count > pages_to_keep_count) { GC_ASSERT(objspace->empty_pages_count > 0); @@ -1968,10 +1968,10 @@ heap_page_allocate(rb_objspace_t *objspace) } static void -size_pool_add_page(rb_objspace_t *objspace, rb_size_pool_t *size_pool, struct heap_page *page) +heap_add_page(rb_objspace_t *objspace, rb_heap_t *heap, struct heap_page *page) { /* Adding to eden heap during incremental sweeping is forbidden */ - GC_ASSERT(!size_pool->sweeping_page); + GC_ASSERT(!heap->sweeping_page); GC_ASSERT(heap_page_in_global_empty_pages_pool(objspace, page)); /* adjust obj_limit (object number available in this page) */ @@ -1986,50 +1986,50 @@ size_pool_add_page(rb_objspace_t *objspace, rb_size_pool_t *size_pool, struct he * In other words, ensure there are an even number of objects * per bit plane. */ if (NUM_IN_PAGE(start) == 1) { - start += size_pool->slot_size - BASE_SLOT_SIZE; + start += heap->slot_size - BASE_SLOT_SIZE; } - GC_ASSERT(NUM_IN_PAGE(start) * BASE_SLOT_SIZE % size_pool->slot_size == 0); + GC_ASSERT(NUM_IN_PAGE(start) * BASE_SLOT_SIZE % heap->slot_size == 0); } - int slot_count = (int)((HEAP_PAGE_SIZE - (start - (uintptr_t)page->body))/size_pool->slot_size); + int slot_count = (int)((HEAP_PAGE_SIZE - (start - (uintptr_t)page->body))/heap->slot_size); page->start = start; page->total_slots = slot_count; - page->slot_size = size_pool->slot_size; - page->size_pool = size_pool; + page->slot_size = heap->slot_size; + page->heap = heap; asan_unlock_freelist(page); page->freelist = NULL; asan_unpoison_memory_region(page->body, HEAP_PAGE_SIZE, false); - for (VALUE p = (VALUE)start; p < start + (slot_count * size_pool->slot_size); p += size_pool->slot_size) { + for (VALUE p = (VALUE)start; p < start + (slot_count * heap->slot_size); p += heap->slot_size) { heap_page_add_freeobj(objspace, page, p); } asan_lock_freelist(page); page->free_slots = slot_count; - size_pool->total_allocated_pages++; + heap->total_allocated_pages++; - ccan_list_add_tail(&size_pool->pages, &page->page_node); - size_pool->total_pages++; - size_pool->total_slots += page->total_slots; + ccan_list_add_tail(&heap->pages, &page->page_node); + heap->total_pages++; + heap->total_slots += page->total_slots; } static int -heap_page_allocate_and_initialize(rb_objspace_t *objspace, rb_size_pool_t *size_pool) +heap_page_allocate_and_initialize(rb_objspace_t *objspace, rb_heap_t *heap) { if (objspace->heap_pages.allocatable_slots > 0) { gc_report(1, objspace, "heap_page_allocate_and_initialize: rb_darray_size(objspace->heap_pages.sorted): %"PRIdSIZE", " "allocatable_slots: %"PRIdSIZE", heap->total_pages: %"PRIdSIZE"\n", - rb_darray_size(objspace->heap_pages.sorted), objspace->heap_pages.allocatable_slots, size_pool->total_pages); + rb_darray_size(objspace->heap_pages.sorted), objspace->heap_pages.allocatable_slots, heap->total_pages); struct heap_page *page = heap_page_resurrect(objspace); if (page == NULL) { page = heap_page_allocate(objspace); } - size_pool_add_page(objspace, size_pool, page); - heap_add_freepage(size_pool, page); + heap_add_page(objspace, heap, page); + heap_add_freepage(heap, page); if (objspace->heap_pages.allocatable_slots > (size_t)page->total_slots) { objspace->heap_pages.allocatable_slots -= page->total_slots; @@ -2045,77 +2045,77 @@ heap_page_allocate_and_initialize(rb_objspace_t *objspace, rb_size_pool_t *size_ } static void -heap_page_allocate_and_initialize_force(rb_objspace_t *objspace, rb_size_pool_t *size_pool) +heap_page_allocate_and_initialize_force(rb_objspace_t *objspace, rb_heap_t *heap) { size_t prev_allocatable_slots = objspace->heap_pages.allocatable_slots; // Set allocatable slots to 1 to force a page to be created. objspace->heap_pages.allocatable_slots = 1; - heap_page_allocate_and_initialize(objspace, size_pool); - GC_ASSERT(size_pool->free_pages != NULL); + heap_page_allocate_and_initialize(objspace, heap); + GC_ASSERT(heap->free_pages != NULL); objspace->heap_pages.allocatable_slots = prev_allocatable_slots; } static void -gc_continue(rb_objspace_t *objspace, rb_size_pool_t *size_pool) +gc_continue(rb_objspace_t *objspace, rb_heap_t *heap) { unsigned int lock_lev; gc_enter(objspace, gc_enter_event_continue, &lock_lev); /* Continue marking if in incremental marking. */ if (is_incremental_marking(objspace)) { - if (gc_marks_continue(objspace, size_pool)) { + if (gc_marks_continue(objspace, heap)) { gc_sweep(objspace); } } /* Continue sweeping if in lazy sweeping or the previous incremental * marking finished and did not yield a free page. */ - if (size_pool->free_pages == NULL && is_lazy_sweeping(objspace)) { - gc_sweep_continue(objspace, size_pool); + if (heap->free_pages == NULL && is_lazy_sweeping(objspace)) { + gc_sweep_continue(objspace, heap); } gc_exit(objspace, gc_enter_event_continue, &lock_lev); } static void -heap_prepare(rb_objspace_t *objspace, rb_size_pool_t *size_pool) +heap_prepare(rb_objspace_t *objspace, rb_heap_t *heap) { - GC_ASSERT(size_pool->free_pages == NULL); + GC_ASSERT(heap->free_pages == NULL); - if (size_pool->total_slots < gc_params.size_pool_init_slots[size_pool - size_pools] && - size_pool->sweeping_page == NULL) { - heap_page_allocate_and_initialize_force(objspace, size_pool); - GC_ASSERT(size_pool->free_pages != NULL); + if (heap->total_slots < gc_params.heap_init_slots[heap - heaps] && + heap->sweeping_page == NULL) { + heap_page_allocate_and_initialize_force(objspace, heap); + GC_ASSERT(heap->free_pages != NULL); return; } /* Continue incremental marking or lazy sweeping, if in any of those steps. */ - gc_continue(objspace, size_pool); + gc_continue(objspace, heap); - if (size_pool->free_pages == NULL) { - heap_page_allocate_and_initialize(objspace, size_pool); + if (heap->free_pages == NULL) { + heap_page_allocate_and_initialize(objspace, heap); } /* If we still don't have a free page and not allowed to create a new page, * we should start a new GC cycle. */ - if (size_pool->free_pages == NULL) { + if (heap->free_pages == NULL) { if (gc_start(objspace, GPR_FLAG_NEWOBJ) == FALSE) { rb_memerror(); } else { if (objspace->heap_pages.allocatable_slots == 0 && !gc_config_full_mark_val) { - size_pool_allocatable_slots_expand(objspace, size_pool, - size_pool->freed_slots + size_pool->empty_slots, - size_pool->total_slots); + heap_allocatable_slots_expand(objspace, heap, + heap->freed_slots + heap->empty_slots, + heap->total_slots); GC_ASSERT(objspace->heap_pages.allocatable_slots > 0); } /* Do steps of incremental marking or lazy sweeping if the GC run permits. */ - gc_continue(objspace, size_pool); + gc_continue(objspace, heap); /* If we're not incremental marking (e.g. a minor GC) or finished * sweeping and still don't have a free page, then - * gc_sweep_finish_size_pool should allow us to create a new page. */ - if (size_pool->free_pages == NULL && !heap_page_allocate_and_initialize(objspace, size_pool)) { + * gc_sweep_finish_heap should allow us to create a new page. */ + if (heap->free_pages == NULL && !heap_page_allocate_and_initialize(objspace, heap)) { if (gc_needs_major_flags == GPR_FLAG_NONE) { rb_bug("cannot create a new page after GC"); } @@ -2125,10 +2125,10 @@ heap_prepare(rb_objspace_t *objspace, rb_size_pool_t *size_pool) } else { /* Do steps of incremental marking or lazy sweeping. */ - gc_continue(objspace, size_pool); + gc_continue(objspace, heap); - if (size_pool->free_pages == NULL && - !heap_page_allocate_and_initialize(objspace, size_pool)) { + if (heap->free_pages == NULL && + !heap_page_allocate_and_initialize(objspace, heap)) { rb_bug("cannot create a new page after major GC"); } } @@ -2137,7 +2137,7 @@ heap_prepare(rb_objspace_t *objspace, rb_size_pool_t *size_pool) } } - GC_ASSERT(size_pool->free_pages != NULL); + GC_ASSERT(heap->free_pages != NULL); } static inline VALUE @@ -2242,15 +2242,15 @@ rb_gc_impl_obj_slot_size(VALUE obj) } static inline size_t -size_pool_slot_size(unsigned char pool_id) +heap_slot_size(unsigned char pool_id) { - GC_ASSERT(pool_id < SIZE_POOL_COUNT); + GC_ASSERT(pool_id < HEAP_COUNT); size_t slot_size = (1 << pool_id) * BASE_SLOT_SIZE; #if RGENGC_CHECK_MODE rb_objspace_t *objspace = rb_gc_get_objspace(); - GC_ASSERT(size_pools[pool_id].slot_size == (short)slot_size); + GC_ASSERT(heaps[pool_id].slot_size == (short)slot_size); #endif slot_size -= RVALUE_OVERHEAD; @@ -2261,15 +2261,15 @@ size_pool_slot_size(unsigned char pool_id) bool rb_gc_impl_size_allocatable_p(size_t size) { - return size <= size_pool_slot_size(SIZE_POOL_COUNT - 1); + return size <= heap_slot_size(HEAP_COUNT - 1); } static inline VALUE ractor_cache_allocate_slot(rb_objspace_t *objspace, rb_ractor_newobj_cache_t *cache, - size_t size_pool_idx) + size_t heap_idx) { - rb_ractor_newobj_size_pool_cache_t *size_pool_cache = &cache->size_pool_caches[size_pool_idx]; - struct free_slot *p = size_pool_cache->freelist; + rb_ractor_newobj_heap_cache_t *heap_cache = &cache->heap_caches[heap_idx]; + struct free_slot *p = heap_cache->freelist; if (RB_UNLIKELY(is_incremental_marking(objspace))) { // Not allowed to allocate without running an incremental marking step @@ -2284,8 +2284,8 @@ ractor_cache_allocate_slot(rb_objspace_t *objspace, rb_ractor_newobj_cache_t *ca if (RB_LIKELY(p)) { VALUE obj = (VALUE)p; - MAYBE_UNUSED(const size_t) stride = size_pool_slot_size(size_pool_idx); - size_pool_cache->freelist = p->next; + MAYBE_UNUSED(const size_t) stride = heap_slot_size(heap_idx); + heap_cache->freelist = p->next; asan_unpoison_memory_region(p, stride, true); #if RGENGC_CHECK_MODE GC_ASSERT(rb_gc_impl_obj_slot_size(obj) == stride); @@ -2300,16 +2300,16 @@ ractor_cache_allocate_slot(rb_objspace_t *objspace, rb_ractor_newobj_cache_t *ca } static struct heap_page * -heap_next_free_page(rb_objspace_t *objspace, rb_size_pool_t *size_pool) +heap_next_free_page(rb_objspace_t *objspace, rb_heap_t *heap) { struct heap_page *page; - if (size_pool->free_pages == NULL) { - heap_prepare(objspace, size_pool); + if (heap->free_pages == NULL) { + heap_prepare(objspace, heap); } - page = size_pool->free_pages; - size_pool->free_pages = page->free_next; + page = heap->free_pages; + heap->free_pages = page->free_next; GC_ASSERT(page->free_slots != 0); @@ -2319,78 +2319,78 @@ heap_next_free_page(rb_objspace_t *objspace, rb_size_pool_t *size_pool) } static inline void -ractor_cache_set_page(rb_objspace_t *objspace, rb_ractor_newobj_cache_t *cache, size_t size_pool_idx, +ractor_cache_set_page(rb_objspace_t *objspace, rb_ractor_newobj_cache_t *cache, size_t heap_idx, struct heap_page *page) { gc_report(3, objspace, "ractor_set_cache: Using page %p\n", (void *)page->body); - rb_ractor_newobj_size_pool_cache_t *size_pool_cache = &cache->size_pool_caches[size_pool_idx]; + rb_ractor_newobj_heap_cache_t *heap_cache = &cache->heap_caches[heap_idx]; - GC_ASSERT(size_pool_cache->freelist == NULL); + GC_ASSERT(heap_cache->freelist == NULL); GC_ASSERT(page->free_slots != 0); GC_ASSERT(page->freelist != NULL); - size_pool_cache->using_page = page; - size_pool_cache->freelist = page->freelist; + heap_cache->using_page = page; + heap_cache->freelist = page->freelist; page->free_slots = 0; page->freelist = NULL; - asan_unpoison_object((VALUE)size_pool_cache->freelist, false); - GC_ASSERT(RB_TYPE_P((VALUE)size_pool_cache->freelist, T_NONE)); - asan_poison_object((VALUE)size_pool_cache->freelist); + asan_unpoison_object((VALUE)heap_cache->freelist, false); + GC_ASSERT(RB_TYPE_P((VALUE)heap_cache->freelist, T_NONE)); + asan_poison_object((VALUE)heap_cache->freelist); } static inline size_t -size_pool_idx_for_size(size_t size) +heap_idx_for_size(size_t size) { size += RVALUE_OVERHEAD; size_t slot_count = CEILDIV(size, BASE_SLOT_SIZE); - /* size_pool_idx is ceil(log2(slot_count)) */ - size_t size_pool_idx = 64 - nlz_int64(slot_count - 1); + /* heap_idx is ceil(log2(slot_count)) */ + size_t heap_idx = 64 - nlz_int64(slot_count - 1); - if (size_pool_idx >= SIZE_POOL_COUNT) { - rb_bug("size_pool_idx_for_size: allocation size too large " - "(size=%"PRIuSIZE"u, size_pool_idx=%"PRIuSIZE"u)", size, size_pool_idx); + if (heap_idx >= HEAP_COUNT) { + rb_bug("heap_idx_for_size: allocation size too large " + "(size=%"PRIuSIZE"u, heap_idx=%"PRIuSIZE"u)", size, heap_idx); } #if RGENGC_CHECK_MODE rb_objspace_t *objspace = rb_gc_get_objspace(); - GC_ASSERT(size <= (size_t)size_pools[size_pool_idx].slot_size); - if (size_pool_idx > 0) GC_ASSERT(size > (size_t)size_pools[size_pool_idx - 1].slot_size); + GC_ASSERT(size <= (size_t)heaps[heap_idx].slot_size); + if (heap_idx > 0) GC_ASSERT(size > (size_t)heaps[heap_idx - 1].slot_size); #endif - return size_pool_idx; + return heap_idx; } size_t -rb_gc_impl_size_pool_id_for_size(void *objspace_ptr, size_t size) +rb_gc_impl_heap_id_for_size(void *objspace_ptr, size_t size) { - return size_pool_idx_for_size(size); + return heap_idx_for_size(size); } -static size_t size_pool_sizes[SIZE_POOL_COUNT + 1] = { 0 }; +static size_t heap_sizes[HEAP_COUNT + 1] = { 0 }; size_t * -rb_gc_impl_size_pool_sizes(void *objspace_ptr) +rb_gc_impl_heap_sizes(void *objspace_ptr) { - if (size_pool_sizes[0] == 0) { - for (unsigned char i = 0; i < SIZE_POOL_COUNT; i++) { - size_pool_sizes[i] = size_pool_slot_size(i); + if (heap_sizes[0] == 0) { + for (unsigned char i = 0; i < HEAP_COUNT; i++) { + heap_sizes[i] = heap_slot_size(i); } } - return size_pool_sizes; + return heap_sizes; } -NOINLINE(static VALUE newobj_cache_miss(rb_objspace_t *objspace, rb_ractor_newobj_cache_t *cache, size_t size_pool_idx, bool vm_locked)); +NOINLINE(static VALUE newobj_cache_miss(rb_objspace_t *objspace, rb_ractor_newobj_cache_t *cache, size_t heap_idx, bool vm_locked)); static VALUE -newobj_cache_miss(rb_objspace_t *objspace, rb_ractor_newobj_cache_t *cache, size_t size_pool_idx, bool vm_locked) +newobj_cache_miss(rb_objspace_t *objspace, rb_ractor_newobj_cache_t *cache, size_t heap_idx, bool vm_locked) { - rb_size_pool_t *size_pool = &size_pools[size_pool_idx]; + rb_heap_t *heap = &heaps[heap_idx]; VALUE obj = Qfalse; unsigned int lev = 0; @@ -2404,20 +2404,20 @@ newobj_cache_miss(rb_objspace_t *objspace, rb_ractor_newobj_cache_t *cache, size { if (is_incremental_marking(objspace)) { - gc_continue(objspace, size_pool); + gc_continue(objspace, heap); cache->incremental_mark_step_allocated_slots = 0; // Retry allocation after resetting incremental_mark_step_allocated_slots - obj = ractor_cache_allocate_slot(objspace, cache, size_pool_idx); + obj = ractor_cache_allocate_slot(objspace, cache, heap_idx); } if (obj == Qfalse) { // Get next free page (possibly running GC) - struct heap_page *page = heap_next_free_page(objspace, size_pool); - ractor_cache_set_page(objspace, cache, size_pool_idx, page); + struct heap_page *page = heap_next_free_page(objspace, heap); + ractor_cache_set_page(objspace, cache, heap_idx, page); // Retry allocation after moving to new page - obj = ractor_cache_allocate_slot(objspace, cache, size_pool_idx); + obj = ractor_cache_allocate_slot(objspace, cache, heap_idx); } } @@ -2432,27 +2432,27 @@ newobj_cache_miss(rb_objspace_t *objspace, rb_ractor_newobj_cache_t *cache, size } static VALUE -newobj_alloc(rb_objspace_t *objspace, rb_ractor_newobj_cache_t *cache, size_t size_pool_idx, bool vm_locked) +newobj_alloc(rb_objspace_t *objspace, rb_ractor_newobj_cache_t *cache, size_t heap_idx, bool vm_locked) { - VALUE obj = ractor_cache_allocate_slot(objspace, cache, size_pool_idx); + VALUE obj = ractor_cache_allocate_slot(objspace, cache, heap_idx); if (RB_UNLIKELY(obj == Qfalse)) { - obj = newobj_cache_miss(objspace, cache, size_pool_idx, vm_locked); + obj = newobj_cache_miss(objspace, cache, heap_idx, vm_locked); } - rb_size_pool_t *size_pool = &size_pools[size_pool_idx]; - size_pool->total_allocated_objects++; + rb_heap_t *heap = &heaps[heap_idx]; + heap->total_allocated_objects++; GC_ASSERT(rb_gc_multi_ractor_p() || - size_pool->total_slots >= - (size_pool->total_allocated_objects - size_pool->total_freed_objects - size_pool->final_slots_count)); + heap->total_slots >= + (heap->total_allocated_objects - heap->total_freed_objects - heap->final_slots_count)); return obj; } -ALWAYS_INLINE(static VALUE newobj_slowpath(VALUE klass, VALUE flags, rb_objspace_t *objspace, rb_ractor_newobj_cache_t *cache, int wb_protected, size_t size_pool_idx)); +ALWAYS_INLINE(static VALUE newobj_slowpath(VALUE klass, VALUE flags, rb_objspace_t *objspace, rb_ractor_newobj_cache_t *cache, int wb_protected, size_t heap_idx)); static inline VALUE -newobj_slowpath(VALUE klass, VALUE flags, rb_objspace_t *objspace, rb_ractor_newobj_cache_t *cache, int wb_protected, size_t size_pool_idx) +newobj_slowpath(VALUE klass, VALUE flags, rb_objspace_t *objspace, rb_ractor_newobj_cache_t *cache, int wb_protected, size_t heap_idx) { VALUE obj; unsigned int lev; @@ -2473,7 +2473,7 @@ newobj_slowpath(VALUE klass, VALUE flags, rb_objspace_t *objspace, rb_ractor_new } } - obj = newobj_alloc(objspace, cache, size_pool_idx, true); + obj = newobj_alloc(objspace, cache, heap_idx, true); newobj_init(klass, flags, wb_protected, objspace, obj); } rb_gc_cr_unlock(lev); @@ -2482,20 +2482,20 @@ newobj_slowpath(VALUE klass, VALUE flags, rb_objspace_t *objspace, rb_ractor_new } NOINLINE(static VALUE newobj_slowpath_wb_protected(VALUE klass, VALUE flags, - rb_objspace_t *objspace, rb_ractor_newobj_cache_t *cache, size_t size_pool_idx)); + rb_objspace_t *objspace, rb_ractor_newobj_cache_t *cache, size_t heap_idx)); NOINLINE(static VALUE newobj_slowpath_wb_unprotected(VALUE klass, VALUE flags, - rb_objspace_t *objspace, rb_ractor_newobj_cache_t *cache, size_t size_pool_idx)); + rb_objspace_t *objspace, rb_ractor_newobj_cache_t *cache, size_t heap_idx)); static VALUE -newobj_slowpath_wb_protected(VALUE klass, VALUE flags, rb_objspace_t *objspace, rb_ractor_newobj_cache_t *cache, size_t size_pool_idx) +newobj_slowpath_wb_protected(VALUE klass, VALUE flags, rb_objspace_t *objspace, rb_ractor_newobj_cache_t *cache, size_t heap_idx) { - return newobj_slowpath(klass, flags, objspace, cache, TRUE, size_pool_idx); + return newobj_slowpath(klass, flags, objspace, cache, TRUE, heap_idx); } static VALUE -newobj_slowpath_wb_unprotected(VALUE klass, VALUE flags, rb_objspace_t *objspace, rb_ractor_newobj_cache_t *cache, size_t size_pool_idx) +newobj_slowpath_wb_unprotected(VALUE klass, VALUE flags, rb_objspace_t *objspace, rb_ractor_newobj_cache_t *cache, size_t heap_idx) { - return newobj_slowpath(klass, flags, objspace, cache, FALSE, size_pool_idx); + return newobj_slowpath(klass, flags, objspace, cache, FALSE, heap_idx); } VALUE @@ -2514,21 +2514,21 @@ rb_gc_impl_new_obj(void *objspace_ptr, void *cache_ptr, VALUE klass, VALUE flags } } - size_t size_pool_idx = size_pool_idx_for_size(alloc_size); + size_t heap_idx = heap_idx_for_size(alloc_size); rb_ractor_newobj_cache_t *cache = (rb_ractor_newobj_cache_t *)cache_ptr; if (!RB_UNLIKELY(during_gc || ruby_gc_stressful) && wb_protected) { - obj = newobj_alloc(objspace, cache, size_pool_idx, false); + obj = newobj_alloc(objspace, cache, heap_idx, false); newobj_init(klass, flags, wb_protected, objspace, obj); } else { RB_DEBUG_COUNTER_INC(obj_newobj_slowpath); obj = wb_protected ? - newobj_slowpath_wb_protected(klass, flags, objspace, cache, size_pool_idx) : - newobj_slowpath_wb_unprotected(klass, flags, objspace, cache, size_pool_idx); + newobj_slowpath_wb_protected(klass, flags, objspace, cache, heap_idx) : + newobj_slowpath_wb_unprotected(klass, flags, objspace, cache, heap_idx); } return newobj_fill(obj, v1, v2, v3); @@ -2628,7 +2628,7 @@ rb_gc_impl_make_zombie(void *objspace_ptr, VALUE obj, void (*dfree)(void *), voi struct heap_page *page = GET_HEAP_PAGE(obj); page->final_slots++; - page->size_pool->final_slots_count++; + page->heap->final_slots_count++; } static void @@ -2659,8 +2659,8 @@ struct each_obj_data { each_page_callback *each_page_callback; void *data; - struct heap_page **pages[SIZE_POOL_COUNT]; - size_t pages_counts[SIZE_POOL_COUNT]; + struct heap_page **pages[HEAP_COUNT]; + size_t pages_counts[HEAP_COUNT]; }; static VALUE @@ -2674,7 +2674,7 @@ objspace_each_objects_ensure(VALUE arg) objspace->flags.dont_incremental = FALSE; } - for (int i = 0; i < SIZE_POOL_COUNT; i++) { + for (int i = 0; i < HEAP_COUNT; i++) { struct heap_page **pages = data->pages[i]; free(pages); } @@ -2688,10 +2688,10 @@ objspace_each_objects_try(VALUE arg) struct each_obj_data *data = (struct each_obj_data *)arg; rb_objspace_t *objspace = data->objspace; - /* Copy pages from all size_pools to their respective buffers. */ - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - rb_size_pool_t *size_pool = &size_pools[i]; - size_t size = size_pool->total_pages * sizeof(struct heap_page *); + /* Copy pages from all heaps to their respective buffers. */ + for (int i = 0; i < HEAP_COUNT; i++) { + rb_heap_t *heap = &heaps[i]; + size_t size = heap->total_pages * sizeof(struct heap_page *); struct heap_page **pages = malloc(size); if (!pages) rb_memerror(); @@ -2703,21 +2703,21 @@ objspace_each_objects_try(VALUE arg) * an infinite loop. */ struct heap_page *page = 0; size_t pages_count = 0; - ccan_list_for_each(&size_pool->pages, page, page_node) { + ccan_list_for_each(&heap->pages, page, page_node) { pages[pages_count] = page; pages_count++; } data->pages[i] = pages; data->pages_counts[i] = pages_count; - GC_ASSERT(pages_count == size_pool->total_pages); + GC_ASSERT(pages_count == heap->total_pages); } - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - rb_size_pool_t *size_pool = &size_pools[i]; + for (int i = 0; i < HEAP_COUNT; i++) { + rb_heap_t *heap = &heaps[i]; size_t pages_count = data->pages_counts[i]; struct heap_page **pages = data->pages[i]; - struct heap_page *page = ccan_list_top(&size_pool->pages, struct heap_page, page_node); + struct heap_page *page = ccan_list_top(&heap->pages, struct heap_page, page_node); for (size_t i = 0; i < pages_count; i++) { /* If we have reached the end of the linked list then there are no * more pages, so break. */ @@ -2728,10 +2728,10 @@ objspace_each_objects_try(VALUE arg) if (pages[i] != page) continue; uintptr_t pstart = (uintptr_t)page->start; - uintptr_t pend = pstart + (page->total_slots * size_pool->slot_size); + uintptr_t pend = pstart + (page->total_slots * heap->slot_size); if (data->each_obj_callback && - (*data->each_obj_callback)((void *)pstart, (void *)pend, size_pool->slot_size, data->data)) { + (*data->each_obj_callback)((void *)pstart, (void *)pend, heap->slot_size, data->data)) { break; } if (data->each_page_callback && @@ -2739,7 +2739,7 @@ objspace_each_objects_try(VALUE arg) break; } - page = ccan_list_next(&size_pool->pages, page, page_node); + page = ccan_list_next(&heap->pages, page, page_node); } } @@ -2930,14 +2930,14 @@ finalize_list(rb_objspace_t *objspace, VALUE zombie) obj_free_object_id(objspace, zombie); } - GC_ASSERT(page->size_pool->final_slots_count > 0); + GC_ASSERT(page->heap->final_slots_count > 0); GC_ASSERT(page->final_slots > 0); - page->size_pool->final_slots_count--; + page->heap->final_slots_count--; page->final_slots--; page->free_slots++; heap_page_add_freeobj(objspace, page, zombie); - page->size_pool->total_freed_objects++; + page->heap->total_freed_objects++; } rb_gc_vm_unlock(lev); @@ -2995,21 +2995,21 @@ gc_abort(void *objspace_ptr) } if (is_lazy_sweeping(objspace)) { - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - rb_size_pool_t *size_pool = &size_pools[i]; + for (int i = 0; i < HEAP_COUNT; i++) { + rb_heap_t *heap = &heaps[i]; - size_pool->sweeping_page = NULL; + heap->sweeping_page = NULL; struct heap_page *page = NULL; - ccan_list_for_each(&size_pool->pages, page, page_node) { + ccan_list_for_each(&heap->pages, page, page_node) { page->flags.before_sweep = false; } } } - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - rb_size_pool_t *size_pool = &size_pools[i]; - rgengc_mark_and_rememberset_clear(objspace, size_pool); + for (int i = 0; i < HEAP_COUNT; i++) { + rb_heap_t *heap = &heaps[i]; + rgengc_mark_and_rememberset_clear(objspace, heap); } gc_mode_set(objspace, gc_mode_none); @@ -3148,9 +3148,9 @@ static size_t objspace_available_slots(rb_objspace_t *objspace) { size_t total_slots = 0; - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - rb_size_pool_t *size_pool = &size_pools[i]; - total_slots += size_pool->total_slots; + for (int i = 0; i < HEAP_COUNT; i++) { + rb_heap_t *heap = &heaps[i]; + total_slots += heap->total_slots; } return total_slots; } @@ -3214,7 +3214,7 @@ unlock_page_body(rb_objspace_t *objspace, struct heap_page_body *body) } static bool -try_move(rb_objspace_t *objspace, rb_size_pool_t *size_pool, struct heap_page *free_page, VALUE src) +try_move(rb_objspace_t *objspace, rb_heap_t *heap, struct heap_page *free_page, VALUE src) { GC_ASSERT(gc_is_moveable_obj(objspace, src)); @@ -3260,13 +3260,13 @@ try_move(rb_objspace_t *objspace, rb_size_pool_t *size_pool, struct heap_page *f } static void -gc_unprotect_pages(rb_objspace_t *objspace, rb_size_pool_t *size_pool) +gc_unprotect_pages(rb_objspace_t *objspace, rb_heap_t *heap) { - struct heap_page *cursor = size_pool->compact_cursor; + struct heap_page *cursor = heap->compact_cursor; while (cursor) { unlock_page_body(objspace, cursor->body); - cursor = ccan_list_next(&size_pool->pages, cursor, page_node); + cursor = ccan_list_next(&heap->pages, cursor, page_node); } } @@ -3460,9 +3460,9 @@ install_handlers(void) static void gc_compact_finish(rb_objspace_t *objspace) { - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - rb_size_pool_t *size_pool = &size_pools[i]; - gc_unprotect_pages(objspace, size_pool); + for (int i = 0; i < HEAP_COUNT; i++) { + rb_heap_t *heap = &heaps[i]; + gc_unprotect_pages(objspace, heap); } uninstall_handlers(); @@ -3470,11 +3470,11 @@ gc_compact_finish(rb_objspace_t *objspace) gc_update_references(objspace); objspace->profile.compact_count++; - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - rb_size_pool_t *size_pool = &size_pools[i]; - size_pool->compact_cursor = NULL; - size_pool->free_pages = NULL; - size_pool->compact_cursor_index = 0; + for (int i = 0; i < HEAP_COUNT; i++) { + rb_heap_t *heap = &heaps[i]; + heap->compact_cursor = NULL; + heap->free_pages = NULL; + heap->compact_cursor_index = 0; } if (gc_prof_enabled(objspace)) { @@ -3492,7 +3492,7 @@ struct gc_sweep_context { }; static inline void -gc_sweep_plane(rb_objspace_t *objspace, rb_size_pool_t *size_pool, uintptr_t p, bits_t bitset, struct gc_sweep_context *ctx) +gc_sweep_plane(rb_objspace_t *objspace, rb_heap_t *heap, uintptr_t p, bits_t bitset, struct gc_sweep_context *ctx) { struct heap_page *sweep_page = ctx->page; short slot_size = sweep_page->slot_size; @@ -3572,10 +3572,10 @@ gc_sweep_plane(rb_objspace_t *objspace, rb_size_pool_t *size_pool, uintptr_t p, } static inline void -gc_sweep_page(rb_objspace_t *objspace, rb_size_pool_t *size_pool, struct gc_sweep_context *ctx) +gc_sweep_page(rb_objspace_t *objspace, rb_heap_t *heap, struct gc_sweep_context *ctx) { struct heap_page *sweep_page = ctx->page; - GC_ASSERT(sweep_page->size_pool == size_pool); + GC_ASSERT(sweep_page->heap == heap); uintptr_t p; bits_t *bits, bitset; @@ -3610,19 +3610,19 @@ gc_sweep_page(rb_objspace_t *objspace, rb_size_pool_t *size_pool, struct gc_swee bitset = ~bits[0]; bitset >>= NUM_IN_PAGE(p); if (bitset) { - gc_sweep_plane(objspace, size_pool, p, bitset, ctx); + gc_sweep_plane(objspace, heap, p, bitset, ctx); } p += (BITS_BITLENGTH - NUM_IN_PAGE(p)) * BASE_SLOT_SIZE; for (int i = 1; i < bitmap_plane_count; i++) { bitset = ~bits[i]; if (bitset) { - gc_sweep_plane(objspace, size_pool, p, bitset, ctx); + gc_sweep_plane(objspace, heap, p, bitset, ctx); } p += BITS_BITLENGTH * BASE_SLOT_SIZE; } - if (!size_pool->compact_cursor) { + if (!heap->compact_cursor) { gc_setup_mark_bits(sweep_page); } @@ -3639,7 +3639,7 @@ gc_sweep_page(rb_objspace_t *objspace, rb_size_pool_t *size_pool, struct gc_swee ctx->freed_slots, ctx->empty_slots, ctx->final_slots); sweep_page->free_slots += ctx->freed_slots + ctx->empty_slots; - sweep_page->size_pool->total_freed_objects += ctx->freed_slots; + sweep_page->heap->total_freed_objects += ctx->freed_slots; if (heap_pages_deferred_final && !finalizing) { gc_finalize_deferred_register(objspace); @@ -3715,15 +3715,15 @@ heap_page_freelist_append(struct heap_page *page, struct free_slot *freelist) } static void -gc_sweep_start_heap(rb_objspace_t *objspace, rb_size_pool_t *size_pool) +gc_sweep_start_heap(rb_objspace_t *objspace, rb_heap_t *heap) { - size_pool->sweeping_page = ccan_list_top(&size_pool->pages, struct heap_page, page_node); - size_pool->free_pages = NULL; - size_pool->pooled_pages = NULL; + heap->sweeping_page = ccan_list_top(&heap->pages, struct heap_page, page_node); + heap->free_pages = NULL; + heap->pooled_pages = NULL; if (!objspace->flags.immediate_sweep) { struct heap_page *page = NULL; - ccan_list_for_each(&size_pool->pages, page, page_node) { + ccan_list_for_each(&heap->pages, page, page_node) { page->flags.before_sweep = TRUE; } } @@ -3745,8 +3745,8 @@ gc_ractor_newobj_cache_clear(void *c, void *data) newobj_cache->incremental_mark_step_allocated_slots = 0; - for (size_t size_pool_idx = 0; size_pool_idx < SIZE_POOL_COUNT; size_pool_idx++) { - rb_ractor_newobj_size_pool_cache_t *cache = &newobj_cache->size_pool_caches[size_pool_idx]; + for (size_t heap_idx = 0; heap_idx < HEAP_COUNT; heap_idx++) { + rb_ractor_newobj_heap_cache_t *cache = &newobj_cache->heap_caches[heap_idx]; struct heap_page *page = cache->using_page; struct free_slot *freelist = cache->freelist; @@ -3775,15 +3775,15 @@ gc_sweep_start(rb_objspace_t *objspace) } #endif - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - rb_size_pool_t *size_pool = &size_pools[i]; - gc_sweep_start_heap(objspace, size_pool); + for (int i = 0; i < HEAP_COUNT; i++) { + rb_heap_t *heap = &heaps[i]; + gc_sweep_start_heap(objspace, heap); - /* We should call gc_sweep_finish_size_pool for size pools with no pages. */ - if (size_pool->sweeping_page == NULL) { - GC_ASSERT(size_pool->total_pages == 0); - GC_ASSERT(size_pool->total_slots == 0); - gc_sweep_finish_size_pool(objspace, size_pool); + /* We should call gc_sweep_finish_heap for size pools with no pages. */ + if (heap->sweeping_page == NULL) { + GC_ASSERT(heap->total_pages == 0); + GC_ASSERT(heap->total_slots == 0); + gc_sweep_finish_heap(objspace, heap); } } @@ -3791,17 +3791,17 @@ gc_sweep_start(rb_objspace_t *objspace) } static void -gc_sweep_finish_size_pool(rb_objspace_t *objspace, rb_size_pool_t *size_pool) +gc_sweep_finish_heap(rb_objspace_t *objspace, rb_heap_t *heap) { - size_t total_slots = size_pool->total_slots; - size_t swept_slots = size_pool->freed_slots + size_pool->empty_slots; + size_t total_slots = heap->total_slots; + size_t swept_slots = heap->freed_slots + heap->empty_slots; - size_t init_slots = gc_params.size_pool_init_slots[size_pool - size_pools]; + size_t init_slots = gc_params.heap_init_slots[heap - heaps]; size_t min_free_slots = (size_t)(MAX(total_slots, init_slots) * gc_params.heap_free_slots_min_ratio); if (swept_slots < min_free_slots && /* The heap is a growth heap if it freed more slots than had empty slots. */ - (size_pool->empty_slots == 0 || size_pool->freed_slots > size_pool->empty_slots)) { + (heap->empty_slots == 0 || heap->freed_slots > heap->empty_slots)) { /* If we don't have enough slots and we have pages on the tomb heap, move * pages from the tomb heap to the eden heap. This may prevent page * creation thrashing (frequently allocating and deallocting pages) and @@ -3809,8 +3809,8 @@ gc_sweep_finish_size_pool(rb_objspace_t *objspace, rb_size_pool_t *size_pool) struct heap_page *resurrected_page; while (swept_slots < min_free_slots && (resurrected_page = heap_page_resurrect(objspace))) { - size_pool_add_page(objspace, size_pool, resurrected_page); - heap_add_freepage(size_pool, resurrected_page); + heap_add_page(objspace, heap, resurrected_page); + heap_add_freepage(heap, resurrected_page); swept_slots += resurrected_page->free_slots; } @@ -3820,11 +3820,11 @@ gc_sweep_finish_size_pool(rb_objspace_t *objspace, rb_size_pool_t *size_pool) * RVALUE_OLD_AGE minor GC since the last major GC. */ if (is_full_marking(objspace) || objspace->profile.count - objspace->rgengc.last_major_gc < RVALUE_OLD_AGE) { - size_pool_allocatable_slots_expand(objspace, size_pool, swept_slots, size_pool->total_slots); + heap_allocatable_slots_expand(objspace, heap, swept_slots, heap->total_slots); } else { gc_needs_major_flags |= GPR_FLAG_MAJOR_BY_NOFREE; - size_pool->force_major_gc_count++; + heap->force_major_gc_count++; } } } @@ -3838,22 +3838,22 @@ gc_sweep_finish(rb_objspace_t *objspace) gc_prof_set_heap_info(objspace); heap_pages_free_unused_pages(objspace); - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - rb_size_pool_t *size_pool = &size_pools[i]; + for (int i = 0; i < HEAP_COUNT; i++) { + rb_heap_t *heap = &heaps[i]; - size_pool->freed_slots = 0; - size_pool->empty_slots = 0; + heap->freed_slots = 0; + heap->empty_slots = 0; if (!will_be_incremental_marking(objspace)) { - struct heap_page *end_page = size_pool->free_pages; + struct heap_page *end_page = heap->free_pages; if (end_page) { while (end_page->free_next) end_page = end_page->free_next; - end_page->free_next = size_pool->pooled_pages; + end_page->free_next = heap->pooled_pages; } else { - size_pool->free_pages = size_pool->pooled_pages; + heap->free_pages = heap->pooled_pages; } - size_pool->pooled_pages = NULL; + heap->pooled_pages = NULL; objspace->rincgc.pooled_slots = 0; } } @@ -3867,9 +3867,9 @@ gc_sweep_finish(rb_objspace_t *objspace) } static int -gc_sweep_step(rb_objspace_t *objspace, rb_size_pool_t *size_pool) +gc_sweep_step(rb_objspace_t *objspace, rb_heap_t *heap) { - struct heap_page *sweep_page = size_pool->sweeping_page; + struct heap_page *sweep_page = heap->sweeping_page; int unlink_limit = GC_SWEEP_PAGES_FREEABLE_PER_STEP; int swept_slots = 0; int pooled_slots = 0; @@ -3889,10 +3889,10 @@ gc_sweep_step(rb_objspace_t *objspace, rb_size_pool_t *size_pool) .freed_slots = 0, .empty_slots = 0, }; - gc_sweep_page(objspace, size_pool, &ctx); + gc_sweep_page(objspace, heap, &ctx); int free_slots = ctx.freed_slots + ctx.empty_slots; - size_pool->sweeping_page = ccan_list_next(&size_pool->pages, sweep_page, page_node); + heap->sweeping_page = ccan_list_next(&heap->pages, sweep_page, page_node); if (free_slots == sweep_page->total_slots && heap_pages_freeable_pages > 0 && @@ -3900,12 +3900,12 @@ gc_sweep_step(rb_objspace_t *objspace, rb_size_pool_t *size_pool) heap_pages_freeable_pages--; unlink_limit--; /* There are no living objects, so move this page to the global empty pages. */ - heap_unlink_page(objspace, size_pool, sweep_page); + heap_unlink_page(objspace, heap, sweep_page); sweep_page->start = 0; sweep_page->total_slots = 0; sweep_page->slot_size = 0; - sweep_page->size_pool = NULL; + sweep_page->heap = NULL; sweep_page->free_slots = 0; asan_unlock_freelist(sweep_page); @@ -3919,15 +3919,15 @@ gc_sweep_step(rb_objspace_t *objspace, rb_size_pool_t *size_pool) objspace->empty_pages = sweep_page; } else if (free_slots > 0) { - size_pool->freed_slots += ctx.freed_slots; - size_pool->empty_slots += ctx.empty_slots; + heap->freed_slots += ctx.freed_slots; + heap->empty_slots += ctx.empty_slots; if (pooled_slots < GC_INCREMENTAL_SWEEP_POOL_SLOT_COUNT) { - heap_add_poolpage(objspace, size_pool, sweep_page); + heap_add_poolpage(objspace, heap, sweep_page); pooled_slots += free_slots; } else { - heap_add_freepage(size_pool, sweep_page); + heap_add_freepage(heap, sweep_page); swept_slots += free_slots; if (swept_slots > GC_INCREMENTAL_SWEEP_SLOT_COUNT) { break; @@ -3937,10 +3937,10 @@ gc_sweep_step(rb_objspace_t *objspace, rb_size_pool_t *size_pool) else { sweep_page->free_next = NULL; } - } while ((sweep_page = size_pool->sweeping_page)); + } while ((sweep_page = heap->sweeping_page)); - if (!size_pool->sweeping_page) { - gc_sweep_finish_size_pool(objspace, size_pool); + if (!heap->sweeping_page) { + gc_sweep_finish_heap(objspace, heap); if (!has_sweeping_pages(objspace)) { gc_sweep_finish(objspace); @@ -3951,35 +3951,35 @@ gc_sweep_step(rb_objspace_t *objspace, rb_size_pool_t *size_pool) gc_prof_sweep_timer_stop(objspace); #endif - return size_pool->free_pages != NULL; + return heap->free_pages != NULL; } static void gc_sweep_rest(rb_objspace_t *objspace) { - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - rb_size_pool_t *size_pool = &size_pools[i]; + for (int i = 0; i < HEAP_COUNT; i++) { + rb_heap_t *heap = &heaps[i]; - while (size_pool->sweeping_page) { - gc_sweep_step(objspace, size_pool); + while (heap->sweeping_page) { + gc_sweep_step(objspace, heap); } } } static void -gc_sweep_continue(rb_objspace_t *objspace, rb_size_pool_t *sweep_size_pool) +gc_sweep_continue(rb_objspace_t *objspace, rb_heap_t *sweep_heap) { GC_ASSERT(dont_gc_val() == FALSE || objspace->profile.latest_gc_info & GPR_FLAG_METHOD); if (!GC_ENABLE_LAZY_SWEEP) return; gc_sweeping_enter(objspace); - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - rb_size_pool_t *size_pool = &size_pools[i]; - if (!gc_sweep_step(objspace, size_pool)) { - /* sweep_size_pool requires a free slot but sweeping did not yield any + for (int i = 0; i < HEAP_COUNT; i++) { + rb_heap_t *heap = &heaps[i]; + if (!gc_sweep_step(objspace, heap)) { + /* sweep_heap requires a free slot but sweeping did not yield any * and we cannot allocate a new page. */ - if (size_pool == sweep_size_pool && objspace->heap_pages.allocatable_slots == 0) { + if (heap == sweep_heap && objspace->heap_pages.allocatable_slots == 0) { /* Not allowed to create a new page so finish sweeping. */ gc_sweep_rest(objspace); break; @@ -4094,14 +4094,14 @@ gc_compact_start(rb_objspace_t *objspace) struct heap_page *page = NULL; gc_mode_transition(objspace, gc_mode_compacting); - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - rb_size_pool_t *size_pool = &size_pools[i]; - ccan_list_for_each(&size_pool->pages, page, page_node) { + for (int i = 0; i < HEAP_COUNT; i++) { + rb_heap_t *heap = &heaps[i]; + ccan_list_for_each(&heap->pages, page, page_node) { page->flags.before_sweep = TRUE; } - size_pool->compact_cursor = ccan_list_tail(&size_pool->pages, struct heap_page, page_node); - size_pool->compact_cursor_index = 0; + heap->compact_cursor = ccan_list_tail(&heap->pages, struct heap_page, page_node); + heap->compact_cursor_index = 0; } if (gc_prof_enabled(objspace)) { @@ -4146,9 +4146,9 @@ gc_sweep(rb_objspace_t *objspace) else { /* Sweep every size pool. */ - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - rb_size_pool_t *size_pool = &size_pools[i]; - gc_sweep_step(objspace, size_pool); + for (int i = 0; i < HEAP_COUNT; i++) { + rb_heap_t *heap = &heaps[i]; + gc_sweep_step(objspace, heap); } } @@ -5153,8 +5153,8 @@ static int gc_verify_heap_pages(rb_objspace_t *objspace) { int remembered_old_objects = 0; - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - remembered_old_objects += gc_verify_heap_pages_(objspace, &((&size_pools[i])->pages)); + for (int i = 0; i < HEAP_COUNT; i++) { + remembered_old_objects += gc_verify_heap_pages_(objspace, &((&heaps[i])->pages)); } return remembered_old_objects; } @@ -5261,21 +5261,21 @@ gc_verify_internal_consistency(void *objspace_ptr) } static void -heap_move_pooled_pages_to_free_pages(rb_size_pool_t *size_pool) +heap_move_pooled_pages_to_free_pages(rb_heap_t *heap) { - if (size_pool->pooled_pages) { - if (size_pool->free_pages) { - struct heap_page *free_pages_tail = size_pool->free_pages; + if (heap->pooled_pages) { + if (heap->free_pages) { + struct heap_page *free_pages_tail = heap->free_pages; while (free_pages_tail->free_next) { free_pages_tail = free_pages_tail->free_next; } - free_pages_tail->free_next = size_pool->pooled_pages; + free_pages_tail->free_next = heap->pooled_pages; } else { - size_pool->free_pages = size_pool->pooled_pages; + heap->free_pages = heap->pooled_pages; } - size_pool->pooled_pages = NULL; + heap->pooled_pages = NULL; } } @@ -5321,11 +5321,11 @@ gc_marks_wb_unprotected_objects_plane(rb_objspace_t *objspace, uintptr_t p, bits } static void -gc_marks_wb_unprotected_objects(rb_objspace_t *objspace, rb_size_pool_t *size_pool) +gc_marks_wb_unprotected_objects(rb_objspace_t *objspace, rb_heap_t *heap) { struct heap_page *page = 0; - ccan_list_for_each(&size_pool->pages, page, page_node) { + ccan_list_for_each(&heap->pages, page, page_node) { bits_t *mark_bits = page->mark_bits; bits_t *wbun_bits = page->wb_unprotected_bits; uintptr_t p = page->start; @@ -5398,8 +5398,8 @@ gc_marks_finish(rb_objspace_t *objspace) objspace->flags.during_incremental_marking = FALSE; /* check children of all marked wb-unprotected objects */ - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - gc_marks_wb_unprotected_objects(objspace, &size_pools[i]); + for (int i = 0; i < HEAP_COUNT; i++) { + gc_marks_wb_unprotected_objects(objspace, &heaps[i]); } } @@ -5432,8 +5432,8 @@ gc_marks_finish(rb_objspace_t *objspace) /* Setup freeable slots. */ size_t total_init_slots = 0; - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - total_init_slots += gc_params.size_pool_init_slots[i] * r_mul; + for (int i = 0; i < HEAP_COUNT; i++) { + total_init_slots += gc_params.heap_init_slots[i] * r_mul; } if (max_free_slots < total_init_slots) { @@ -5493,14 +5493,14 @@ gc_marks_finish(rb_objspace_t *objspace) } static bool -gc_compact_heap_cursors_met_p(rb_size_pool_t *size_pool) +gc_compact_heap_cursors_met_p(rb_heap_t *heap) { - return size_pool->sweeping_page == size_pool->compact_cursor; + return heap->sweeping_page == heap->compact_cursor; } -static rb_size_pool_t * -gc_compact_destination_pool(rb_objspace_t *objspace, rb_size_pool_t *src_pool, VALUE obj) +static rb_heap_t * +gc_compact_destination_pool(rb_objspace_t *objspace, rb_heap_t *src_pool, VALUE obj) { size_t obj_size = rb_gc_obj_optimal_size(obj); if (obj_size == 0) { @@ -5509,34 +5509,34 @@ gc_compact_destination_pool(rb_objspace_t *objspace, rb_size_pool_t *src_pool, V size_t idx = 0; if (rb_gc_impl_size_allocatable_p(obj_size)) { - idx = size_pool_idx_for_size(obj_size); + idx = heap_idx_for_size(obj_size); } - return &size_pools[idx]; + return &heaps[idx]; } static bool -gc_compact_move(rb_objspace_t *objspace, rb_size_pool_t *size_pool, VALUE src) +gc_compact_move(rb_objspace_t *objspace, rb_heap_t *heap, VALUE src) { GC_ASSERT(BUILTIN_TYPE(src) != T_MOVED); GC_ASSERT(gc_is_moveable_obj(objspace, src)); - rb_size_pool_t *dest_pool = gc_compact_destination_pool(objspace, size_pool, src); + rb_heap_t *dest_pool = gc_compact_destination_pool(objspace, heap, src); uint32_t orig_shape = 0; uint32_t new_shape = 0; if (gc_compact_heap_cursors_met_p(dest_pool)) { - return dest_pool != size_pool; + return dest_pool != heap; } if (RB_TYPE_P(src, T_OBJECT)) { orig_shape = rb_gc_get_shape(src); - if (dest_pool != size_pool) { - new_shape = rb_gc_rebuild_shape(src, dest_pool - size_pools); + if (dest_pool != heap) { + new_shape = rb_gc_rebuild_shape(src, dest_pool - heaps); if (new_shape == 0) { - dest_pool = size_pool; + dest_pool = heap; } } } @@ -5562,7 +5562,7 @@ gc_compact_move(rb_objspace_t *objspace, rb_size_pool_t *size_pool, VALUE src) dest_pool->sweeping_page = ccan_list_next(&dest_pool->pages, dest_pool->sweeping_page, page_node); if (gc_compact_heap_cursors_met_p(dest_pool)) { - return dest_pool != size_pool; + return dest_pool != heap; } } @@ -5578,7 +5578,7 @@ gc_compact_move(rb_objspace_t *objspace, rb_size_pool_t *size_pool, VALUE src) } static bool -gc_compact_plane(rb_objspace_t *objspace, rb_size_pool_t *size_pool, uintptr_t p, bits_t bitset, struct heap_page *page) +gc_compact_plane(rb_objspace_t *objspace, rb_heap_t *heap, uintptr_t p, bits_t bitset, struct heap_page *page) { short slot_size = page->slot_size; short slot_bits = slot_size / BASE_SLOT_SIZE; @@ -5592,7 +5592,7 @@ gc_compact_plane(rb_objspace_t *objspace, rb_size_pool_t *size_pool, uintptr_t p objspace->rcompactor.considered_count_table[BUILTIN_TYPE(vp)]++; if (gc_is_moveable_obj(objspace, vp)) { - if (!gc_compact_move(objspace, size_pool, vp)) { + if (!gc_compact_move(objspace, heap, vp)) { //the cursors met. bubble up return false; } @@ -5607,9 +5607,9 @@ gc_compact_plane(rb_objspace_t *objspace, rb_size_pool_t *size_pool, uintptr_t p // Iterate up all the objects in page, moving them to where they want to go static bool -gc_compact_page(rb_objspace_t *objspace, rb_size_pool_t *size_pool, struct heap_page *page) +gc_compact_page(rb_objspace_t *objspace, rb_heap_t *heap, struct heap_page *page) { - GC_ASSERT(page == size_pool->compact_cursor); + GC_ASSERT(page == heap->compact_cursor); bits_t *mark_bits, *pin_bits; bits_t bitset; @@ -5622,7 +5622,7 @@ gc_compact_page(rb_objspace_t *objspace, rb_size_pool_t *size_pool, struct heap_ bitset = (mark_bits[0] & ~pin_bits[0]); bitset >>= NUM_IN_PAGE(p); if (bitset) { - if (!gc_compact_plane(objspace, size_pool, (uintptr_t)p, bitset, page)) + if (!gc_compact_plane(objspace, heap, (uintptr_t)p, bitset, page)) return false; } p += (BITS_BITLENGTH - NUM_IN_PAGE(p)) * BASE_SLOT_SIZE; @@ -5630,7 +5630,7 @@ gc_compact_page(rb_objspace_t *objspace, rb_size_pool_t *size_pool, struct heap_ for (int j = 1; j < HEAP_PAGE_BITMAP_LIMIT; j++) { bitset = (mark_bits[j] & ~pin_bits[j]); if (bitset) { - if (!gc_compact_plane(objspace, size_pool, (uintptr_t)p, bitset, page)) + if (!gc_compact_plane(objspace, heap, (uintptr_t)p, bitset, page)) return false; } p += BITS_BITLENGTH * BASE_SLOT_SIZE; @@ -5642,11 +5642,11 @@ gc_compact_page(rb_objspace_t *objspace, rb_size_pool_t *size_pool, struct heap_ static bool gc_compact_all_compacted_p(rb_objspace_t *objspace) { - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - rb_size_pool_t *size_pool = &size_pools[i]; + for (int i = 0; i < HEAP_COUNT; i++) { + rb_heap_t *heap = &heaps[i]; - if (size_pool->total_pages > 0 && - !gc_compact_heap_cursors_met_p(size_pool)) { + if (heap->total_pages > 0 && + !gc_compact_heap_cursors_met_p(heap)) { return false; } } @@ -5663,16 +5663,16 @@ gc_sweep_compact(rb_objspace_t *objspace) #endif while (!gc_compact_all_compacted_p(objspace)) { - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - rb_size_pool_t *size_pool = &size_pools[i]; + for (int i = 0; i < HEAP_COUNT; i++) { + rb_heap_t *heap = &heaps[i]; - if (gc_compact_heap_cursors_met_p(size_pool)) { + if (gc_compact_heap_cursors_met_p(heap)) { continue; } - struct heap_page *start_page = size_pool->compact_cursor; + struct heap_page *start_page = heap->compact_cursor; - if (!gc_compact_page(objspace, size_pool, start_page)) { + if (!gc_compact_page(objspace, heap, start_page)) { lock_page_body(objspace, start_page->body); continue; @@ -5681,7 +5681,7 @@ gc_sweep_compact(rb_objspace_t *objspace) // If we get here, we've finished moving all objects on the compact_cursor page // So we can lock it and move the cursor on to the next one. lock_page_body(objspace, start_page->body); - size_pool->compact_cursor = ccan_list_prev(&size_pool->pages, size_pool->compact_cursor, page_node); + heap->compact_cursor = ccan_list_prev(&heap->pages, heap->compact_cursor, page_node); } } @@ -5697,8 +5697,8 @@ gc_marks_rest(rb_objspace_t *objspace) { gc_report(1, objspace, "gc_marks_rest\n"); - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - (&size_pools[i])->pooled_pages = NULL; + for (int i = 0; i < HEAP_COUNT; i++) { + (&heaps[i])->pooled_pages = NULL; } if (is_incremental_marking(objspace)) { @@ -5727,14 +5727,14 @@ gc_marks_step(rb_objspace_t *objspace, size_t slots) } static bool -gc_marks_continue(rb_objspace_t *objspace, rb_size_pool_t *size_pool) +gc_marks_continue(rb_objspace_t *objspace, rb_heap_t *heap) { GC_ASSERT(dont_gc_val() == FALSE || objspace->profile.latest_gc_info & GPR_FLAG_METHOD); bool marking_finished = true; gc_marking_enter(objspace); - if (size_pool->free_pages) { + if (heap->free_pages) { gc_report(2, objspace, "gc_marks_continue: has pooled pages"); marking_finished = gc_marks_step(objspace, objspace->rincgc.step_slots); @@ -5742,7 +5742,7 @@ gc_marks_continue(rb_objspace_t *objspace, rb_size_pool_t *size_pool) else { gc_report(2, objspace, "gc_marks_continue: no more pooled pages (stack depth: %"PRIdSIZE").\n", mark_stack_size(&objspace->mark_stack)); - size_pool->force_incremental_marking_finish_count++; + heap->force_incremental_marking_finish_count++; gc_marks_rest(objspace); } @@ -5776,15 +5776,15 @@ gc_marks_start(rb_objspace_t *objspace, int full_mark) objspace->rgengc.last_major_gc = objspace->profile.count; objspace->marked_slots = 0; - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - rb_size_pool_t *size_pool = &size_pools[i]; - rgengc_mark_and_rememberset_clear(objspace, size_pool); - heap_move_pooled_pages_to_free_pages(size_pool); + for (int i = 0; i < HEAP_COUNT; i++) { + rb_heap_t *heap = &heaps[i]; + rgengc_mark_and_rememberset_clear(objspace, heap); + heap_move_pooled_pages_to_free_pages(heap); if (objspace->flags.during_compacting) { struct heap_page *page = NULL; - ccan_list_for_each(&size_pool->pages, page, page_node) { + ccan_list_for_each(&heap->pages, page, page_node) { page->pinned_slots = 0; } } @@ -5796,8 +5796,8 @@ gc_marks_start(rb_objspace_t *objspace, int full_mark) objspace->rgengc.old_objects + objspace->rgengc.uncollectible_wb_unprotected_objects; /* uncollectible objects are marked already */ objspace->profile.minor_gc_count++; - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - rgengc_rememberset_mark(objspace, &size_pools[i]); + for (int i = 0; i < HEAP_COUNT; i++) { + rgengc_rememberset_mark(objspace, &heaps[i]); } } @@ -5939,7 +5939,7 @@ rgengc_rememberset_mark_plane(rb_objspace_t *objspace, uintptr_t p, bits_t bitse } static void -rgengc_rememberset_mark(rb_objspace_t *objspace, rb_size_pool_t *size_pool) +rgengc_rememberset_mark(rb_objspace_t *objspace, rb_heap_t *heap) { size_t j; struct heap_page *page = 0; @@ -5948,7 +5948,7 @@ rgengc_rememberset_mark(rb_objspace_t *objspace, rb_size_pool_t *size_pool) #endif gc_report(1, objspace, "rgengc_rememberset_mark: start\n"); - ccan_list_for_each(&size_pool->pages, page, page_node) { + ccan_list_for_each(&heap->pages, page, page_node) { if (page->flags.has_remembered_objects | page->flags.has_uncollectible_wb_unprotected_objects) { uintptr_t p = page->start; bits_t bitset, bits[HEAP_PAGE_BITMAP_LIMIT]; @@ -5991,11 +5991,11 @@ rgengc_rememberset_mark(rb_objspace_t *objspace, rb_size_pool_t *size_pool) } static void -rgengc_mark_and_rememberset_clear(rb_objspace_t *objspace, rb_size_pool_t *size_pool) +rgengc_mark_and_rememberset_clear(rb_objspace_t *objspace, rb_heap_t *heap) { struct heap_page *page = 0; - ccan_list_for_each(&size_pool->pages, page, page_node) { + ccan_list_for_each(&heap->pages, page, page_node) { memset(&page->mark_bits[0], 0, HEAP_PAGE_BITMAP_SIZE); memset(&page->uncollectible_bits[0], 0, HEAP_PAGE_BITMAP_SIZE); memset(&page->marking_bits[0], 0, HEAP_PAGE_BITMAP_SIZE); @@ -6232,12 +6232,12 @@ rb_gc_impl_ractor_cache_free(void *objspace_ptr, void *cache) } static void -heap_ready_to_gc(rb_objspace_t *objspace, rb_size_pool_t *size_pool) +heap_ready_to_gc(rb_objspace_t *objspace, rb_heap_t *heap) { - if (!size_pool->free_pages) { - if (!heap_page_allocate_and_initialize(objspace, size_pool)) { + if (!heap->free_pages) { + if (!heap_page_allocate_and_initialize(objspace, heap)) { objspace->heap_pages.allocatable_slots = 1; - heap_page_allocate_and_initialize(objspace, size_pool); + heap_page_allocate_and_initialize(objspace, heap); } } } @@ -6246,9 +6246,9 @@ static int ready_to_gc(rb_objspace_t *objspace) { if (dont_gc_val() || during_gc || ruby_disable_gc) { - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - rb_size_pool_t *size_pool = &size_pools[i]; - heap_ready_to_gc(objspace, size_pool); + for (int i = 0; i < HEAP_COUNT; i++) { + rb_heap_t *heap = &heaps[i]; + heap_ready_to_gc(objspace, heap); } return FALSE; } @@ -7007,8 +7007,8 @@ gc_move(rb_objspace_t *objspace, VALUE src, VALUE dest, size_t src_slot_size, si RMOVED(src)->destination = dest; GC_ASSERT(BUILTIN_TYPE(dest) != T_NONE); - GET_HEAP_PAGE(src)->size_pool->total_freed_objects++; - GET_HEAP_PAGE(dest)->size_pool->total_allocated_objects++; + GET_HEAP_PAGE(src)->heap->total_freed_objects++; + GET_HEAP_PAGE(dest)->heap->total_allocated_objects++; return src; } @@ -7041,16 +7041,16 @@ compare_free_slots(const void *left, const void *right, void *dummy) static void gc_sort_heap_by_compare_func(rb_objspace_t *objspace, gc_compact_compare_func compare_func) { - for (int j = 0; j < SIZE_POOL_COUNT; j++) { - rb_size_pool_t *size_pool = &size_pools[j]; + for (int j = 0; j < HEAP_COUNT; j++) { + rb_heap_t *heap = &heaps[j]; - size_t total_pages = size_pool->total_pages; + size_t total_pages = heap->total_pages; size_t size = rb_size_mul_or_raise(total_pages, sizeof(struct heap_page *), rb_eRuntimeError); struct heap_page *page = 0, **page_list = malloc(size); size_t i = 0; - size_pool->free_pages = NULL; - ccan_list_for_each(&size_pool->pages, page, page_node) { + heap->free_pages = NULL; + ccan_list_for_each(&heap->pages, page, page_node) { page_list[i++] = page; GC_ASSERT(page); } @@ -7062,12 +7062,12 @@ gc_sort_heap_by_compare_func(rb_objspace_t *objspace, gc_compact_compare_func co ruby_qsort(page_list, total_pages, sizeof(struct heap_page *), compare_func, NULL); /* Reset the eden heap */ - ccan_list_head_init(&size_pool->pages); + ccan_list_head_init(&heap->pages); for (i = 0; i < total_pages; i++) { - ccan_list_add(&size_pool->pages, &page_list[i]->page_node); + ccan_list_add(&heap->pages, &page_list[i]->page_node); if (page_list[i]->free_slots != 0) { - heap_add_freepage(size_pool, page_list[i]); + heap_add_freepage(heap, page_list[i]); } } @@ -7128,16 +7128,16 @@ gc_update_references(rb_objspace_t *objspace) struct heap_page *page = NULL; - for (int i = 0; i < SIZE_POOL_COUNT; i++) { + for (int i = 0; i < HEAP_COUNT; i++) { bool should_set_mark_bits = TRUE; - rb_size_pool_t *size_pool = &size_pools[i]; + rb_heap_t *heap = &heaps[i]; - ccan_list_for_each(&size_pool->pages, page, page_node) { + ccan_list_for_each(&heap->pages, page, page_node) { uintptr_t start = (uintptr_t)page->start; - uintptr_t end = start + (page->total_slots * size_pool->slot_size); + uintptr_t end = start + (page->total_slots * heap->slot_size); - gc_ref_update((void *)start, (void *)end, size_pool->slot_size, objspace, page); - if (page == size_pool->sweeping_page) { + gc_ref_update((void *)start, (void *)end, heap->slot_size, objspace, page); + if (page == heap->sweeping_page) { should_set_mark_bits = FALSE; } if (should_set_mark_bits) { @@ -7615,7 +7615,7 @@ setup_gc_stat_heap_symbols(void) } static size_t -stat_one_heap(rb_size_pool_t *size_pool, VALUE hash, VALUE key) +stat_one_heap(rb_heap_t *heap, VALUE hash, VALUE key) { #define SET(name, attr) \ if (key == gc_stat_heap_symbols[gc_stat_heap_sym_##name]) \ @@ -7623,14 +7623,14 @@ stat_one_heap(rb_size_pool_t *size_pool, VALUE hash, VALUE key) else if (hash != Qnil) \ rb_hash_aset(hash, gc_stat_heap_symbols[gc_stat_heap_sym_##name], SIZET2NUM(attr)); - SET(slot_size, size_pool->slot_size); - SET(heap_eden_pages, size_pool->total_pages); - SET(heap_eden_slots, size_pool->total_slots); - SET(total_allocated_pages, size_pool->total_allocated_pages); - SET(force_major_gc_count, size_pool->force_major_gc_count); - SET(force_incremental_marking_finish_count, size_pool->force_incremental_marking_finish_count); - SET(total_allocated_objects, size_pool->total_allocated_objects); - SET(total_freed_objects, size_pool->total_freed_objects); + SET(slot_size, heap->slot_size); + SET(heap_eden_pages, heap->total_pages); + SET(heap_eden_slots, heap->total_slots); + SET(total_allocated_pages, heap->total_allocated_pages); + SET(force_major_gc_count, heap->force_major_gc_count); + SET(force_incremental_marking_finish_count, heap->force_incremental_marking_finish_count); + SET(total_allocated_objects, heap->total_allocated_objects); + SET(total_freed_objects, heap->total_freed_objects); #undef SET if (!NIL_P(key)) { /* matched key should return above */ @@ -7652,28 +7652,28 @@ rb_gc_impl_stat_heap(void *objspace_ptr, VALUE heap_name, VALUE hash_or_sym) rb_raise(rb_eTypeError, "non-hash given"); } - for (int i = 0; i < SIZE_POOL_COUNT; i++) { + for (int i = 0; i < HEAP_COUNT; i++) { VALUE hash = rb_hash_aref(hash_or_sym, INT2FIX(i)); if (NIL_P(hash)) { hash = rb_hash_new(); rb_hash_aset(hash_or_sym, INT2FIX(i), hash); } - stat_one_heap(&size_pools[i], hash, Qnil); + stat_one_heap(&heaps[i], hash, Qnil); } } else if (FIXNUM_P(heap_name)) { - int size_pool_idx = FIX2INT(heap_name); + int heap_idx = FIX2INT(heap_name); - if (size_pool_idx < 0 || size_pool_idx >= SIZE_POOL_COUNT) { + if (heap_idx < 0 || heap_idx >= HEAP_COUNT) { rb_raise(rb_eArgError, "size pool index out of range"); } if (SYMBOL_P(hash_or_sym)) { - return stat_one_heap(&size_pools[size_pool_idx], Qnil, hash_or_sym); + return stat_one_heap(&heaps[heap_idx], Qnil, hash_or_sym); } else if (RB_TYPE_P(hash_or_sym, T_HASH)) { - return stat_one_heap(&size_pools[size_pool_idx], hash_or_sym, Qnil); + return stat_one_heap(&heaps[heap_idx], hash_or_sym, Qnil); } else { rb_raise(rb_eTypeError, "non-hash or symbol given"); @@ -7896,11 +7896,11 @@ rb_gc_impl_set_params(void *objspace_ptr) /* ok */ } - for (int i = 0; i < SIZE_POOL_COUNT; i++) { + for (int i = 0; i < HEAP_COUNT; i++) { char env_key[sizeof("RUBY_GC_HEAP_" "_INIT_SLOTS") + DECIMAL_SIZE_OF_BITS(sizeof(int) * CHAR_BIT)]; snprintf(env_key, sizeof(env_key), "RUBY_GC_HEAP_%d_INIT_SLOTS", i); - get_envparam_size(env_key, &gc_params.size_pool_init_slots[i], 0); + get_envparam_size(env_key, &gc_params.heap_init_slots[i], 0); } get_envparam_double("RUBY_GC_HEAP_GROWTH_FACTOR", &gc_params.growth_factor, 1.0, 0.0, FALSE); @@ -9085,7 +9085,7 @@ gc_compact(VALUE self) #if GC_CAN_COMPILE_COMPACTION struct desired_compaction_pages_i_data { rb_objspace_t *objspace; - size_t required_slots[SIZE_POOL_COUNT]; + size_t required_slots[HEAP_COUNT]; }; static int @@ -9094,15 +9094,15 @@ desired_compaction_pages_i(struct heap_page *page, void *data) struct desired_compaction_pages_i_data *tdata = data; rb_objspace_t *objspace = tdata->objspace; VALUE vstart = (VALUE)page->start; - VALUE vend = vstart + (VALUE)(page->total_slots * page->size_pool->slot_size); + VALUE vend = vstart + (VALUE)(page->total_slots * page->heap->slot_size); - for (VALUE v = vstart; v != vend; v += page->size_pool->slot_size) { + for (VALUE v = vstart; v != vend; v += page->heap->slot_size) { asan_unpoisoning_object(v) { /* skip T_NONEs; they won't be moved */ if (BUILTIN_TYPE(v) != T_NONE) { - rb_size_pool_t *dest_pool = gc_compact_destination_pool(objspace, page->size_pool, v); - size_t dest_pool_idx = dest_pool - size_pools; + rb_heap_t *dest_pool = gc_compact_destination_pool(objspace, page->heap, v); + size_t dest_pool_idx = dest_pool - heaps; tdata->required_slots[dest_pool_idx]++; } } @@ -9164,14 +9164,14 @@ gc_verify_compaction_references(int argc, VALUE* argv, VALUE self) /* Find out which pool has the most pages */ size_t max_existing_pages = 0; - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - rb_size_pool_t *size_pool = &size_pools[i]; - max_existing_pages = MAX(max_existing_pages, size_pool->total_pages); + for (int i = 0; i < HEAP_COUNT; i++) { + rb_heap_t *heap = &heaps[i]; + max_existing_pages = MAX(max_existing_pages, heap->total_pages); } /* Add pages to each size pool so that compaction is guaranteed to move every object */ - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - rb_size_pool_t *size_pool = &size_pools[i]; + for (int i = 0; i < HEAP_COUNT; i++) { + rb_heap_t *heap = &heaps[i]; size_t pages_to_add = 0; /* @@ -9180,14 +9180,14 @@ gc_verify_compaction_references(int argc, VALUE* argv, VALUE self) * through all of the pools in `gc_sweep_compact` without hitting the "sweep & * compact cursors met" condition on some pools before fully compacting others */ - pages_to_add += max_existing_pages - size_pool->total_pages; + pages_to_add += max_existing_pages - heap->total_pages; /* * Step 2: Now add additional free pages to each size pool sufficient to hold all objects * that want to be in that size pool, whether moved into it or moved within it */ objspace->heap_pages.allocatable_slots = desired_compaction.required_slots[i]; while (objspace->heap_pages.allocatable_slots > 0) { - heap_page_allocate_and_initialize(objspace, size_pool); + heap_page_allocate_and_initialize(objspace, heap); } /* * Step 3: Add two more pages so that the compact & sweep cursors will meet _after_ all objects @@ -9196,7 +9196,7 @@ gc_verify_compaction_references(int argc, VALUE* argv, VALUE self) pages_to_add += 2; for (; pages_to_add > 0; pages_to_add--) { - heap_page_allocate_and_initialize_force(objspace, size_pool); + heap_page_allocate_and_initialize_force(objspace, heap); } } } @@ -9238,10 +9238,10 @@ rb_gc_impl_objspace_free(void *objspace_ptr) heap_pages_lomem = 0; heap_pages_himem = 0; - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - rb_size_pool_t *size_pool = &size_pools[i]; - size_pool->total_pages = 0; - size_pool->total_slots = 0; + for (int i = 0; i < HEAP_COUNT; i++) { + rb_heap_t *heap = &heaps[i]; + heap->total_pages = 0; + heap->total_slots = 0; } st_free_table(objspace->id_to_obj_tbl); @@ -9309,12 +9309,12 @@ rb_gc_impl_objspace_init(void *objspace_ptr) rb_bug("Could not preregister postponed job for GC"); } - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - rb_size_pool_t *size_pool = &size_pools[i]; + for (int i = 0; i < HEAP_COUNT; i++) { + rb_heap_t *heap = &heaps[i]; - size_pool->slot_size = (1 << i) * BASE_SLOT_SIZE; + heap->slot_size = (1 << i) * BASE_SLOT_SIZE; - ccan_list_head_init(&size_pool->pages); + ccan_list_head_init(&heap->pages); } rb_darray_make(&objspace->heap_pages.sorted, 0); @@ -9336,9 +9336,9 @@ rb_gc_impl_objspace_init(void *objspace_ptr) objspace->rgengc.oldmalloc_increase_limit = gc_params.oldmalloc_limit_min; #endif /* Set size pools allocatable pages. */ - for (int i = 0; i < SIZE_POOL_COUNT; i++) { - /* Set the default value of size_pool_init_slots. */ - gc_params.size_pool_init_slots[i] = GC_HEAP_INIT_SLOTS; + for (int i = 0; i < HEAP_COUNT; i++) { + /* Set the default value of heap_init_slots. */ + gc_params.heap_init_slots[i] = GC_HEAP_INIT_SLOTS; } init_mark_stack(&objspace->mark_stack); @@ -9357,8 +9357,8 @@ rb_gc_impl_init(void) rb_hash_aset(gc_constants, ID2SYM(rb_intern("HEAP_PAGE_OBJ_LIMIT")), SIZET2NUM(HEAP_PAGE_OBJ_LIMIT)); rb_hash_aset(gc_constants, ID2SYM(rb_intern("HEAP_PAGE_BITMAP_SIZE")), SIZET2NUM(HEAP_PAGE_BITMAP_SIZE)); rb_hash_aset(gc_constants, ID2SYM(rb_intern("HEAP_PAGE_SIZE")), SIZET2NUM(HEAP_PAGE_SIZE)); - rb_hash_aset(gc_constants, ID2SYM(rb_intern("SIZE_POOL_COUNT")), LONG2FIX(SIZE_POOL_COUNT)); - rb_hash_aset(gc_constants, ID2SYM(rb_intern("RVARGC_MAX_ALLOCATE_SIZE")), LONG2FIX(size_pool_slot_size(SIZE_POOL_COUNT - 1))); + rb_hash_aset(gc_constants, ID2SYM(rb_intern("HEAP_COUNT")), LONG2FIX(HEAP_COUNT)); + rb_hash_aset(gc_constants, ID2SYM(rb_intern("RVARGC_MAX_ALLOCATE_SIZE")), LONG2FIX(heap_slot_size(HEAP_COUNT - 1))); rb_hash_aset(gc_constants, ID2SYM(rb_intern("RVALUE_OLD_AGE")), LONG2FIX(RVALUE_OLD_AGE)); if (RB_BUG_INSTEAD_OF_RB_MEMERROR+0) { rb_hash_aset(gc_constants, ID2SYM(rb_intern("RB_BUG_INSTEAD_OF_RB_MEMERROR")), Qtrue); diff --git a/gc/gc.h b/gc/gc.h index 9116822e812226..b4da013c1a8e52 100644 --- a/gc/gc.h +++ b/gc/gc.h @@ -40,7 +40,7 @@ const char *rb_obj_info(VALUE obj); bool rb_gc_shutdown_call_finalizer_p(VALUE obj); uint32_t rb_gc_get_shape(VALUE obj); void rb_gc_set_shape(VALUE obj, uint32_t shape_id); -uint32_t rb_gc_rebuild_shape(VALUE obj, size_t size_pool_id); +uint32_t rb_gc_rebuild_shape(VALUE obj, size_t heap_id); size_t rb_obj_memsize_of(VALUE obj); RUBY_SYMBOL_EXPORT_END diff --git a/gc/gc_impl.h b/gc/gc_impl.h index 925c336f95689f..045fce6c662ef8 100644 --- a/gc/gc_impl.h +++ b/gc/gc_impl.h @@ -32,7 +32,7 @@ GC_IMPL_FN void *rb_gc_impl_ractor_cache_alloc(void *objspace_ptr); GC_IMPL_FN void rb_gc_impl_ractor_cache_free(void *objspace_ptr, void *cache); GC_IMPL_FN void rb_gc_impl_set_params(void *objspace_ptr); GC_IMPL_FN void rb_gc_impl_init(void); -GC_IMPL_FN size_t *rb_gc_impl_size_pool_sizes(void *objspace_ptr); +GC_IMPL_FN size_t *rb_gc_impl_heap_sizes(void *objspace_ptr); // Shutdown GC_IMPL_FN void rb_gc_impl_shutdown_free_objects(void *objspace_ptr); // GC @@ -49,7 +49,7 @@ GC_IMPL_FN VALUE rb_gc_impl_config_set(void *objspace_ptr, VALUE hash); // Object allocation GC_IMPL_FN VALUE rb_gc_impl_new_obj(void *objspace_ptr, void *cache_ptr, VALUE klass, VALUE flags, VALUE v1, VALUE v2, VALUE v3, bool wb_protected, size_t alloc_size); GC_IMPL_FN size_t rb_gc_impl_obj_slot_size(VALUE obj); -GC_IMPL_FN size_t rb_gc_impl_size_pool_id_for_size(void *objspace_ptr, size_t size); +GC_IMPL_FN size_t rb_gc_impl_heap_id_for_size(void *objspace_ptr, size_t size); GC_IMPL_FN bool rb_gc_impl_size_allocatable_p(size_t size); // Malloc GC_IMPL_FN void *rb_gc_impl_malloc(void *objspace_ptr, size_t size); diff --git a/internal/class.h b/internal/class.h index 8a6c95623317b3..f94434b9389165 100644 --- a/internal/class.h +++ b/internal/class.h @@ -83,7 +83,7 @@ struct RClass { struct rb_id_table *m_tbl; }; -// Assert that classes can be embedded in size_pools[2] (which has 160B slot size) +// Assert that classes can be embedded in heaps[2] (which has 160B slot size) STATIC_ASSERT(sizeof_rb_classext_t, sizeof(struct RClass) + sizeof(rb_classext_t) <= 4 * RVALUE_SIZE); struct RClass_and_rb_classext_t { diff --git a/internal/gc.h b/internal/gc.h index 81ca1a51d8b6f7..0f48916ee89e41 100644 --- a/internal/gc.h +++ b/internal/gc.h @@ -201,8 +201,8 @@ void *rb_gc_ractor_cache_alloc(void); void rb_gc_ractor_cache_free(void *cache); bool rb_gc_size_allocatable_p(size_t size); -size_t *rb_gc_size_pool_sizes(void); -size_t rb_gc_size_pool_id_for_size(size_t size); +size_t *rb_gc_heap_sizes(void); +size_t rb_gc_heap_id_for_size(size_t size); void rb_gc_mark_and_move(VALUE *ptr); diff --git a/misc/lldb_cruby.py b/misc/lldb_cruby.py index 400ccb45b9aaf2..0707bb42d3027d 100755 --- a/misc/lldb_cruby.py +++ b/misc/lldb_cruby.py @@ -547,7 +547,7 @@ def __init__(self, page, target): self.target = target self.start = page.GetChildMemberWithName('start').GetValueAsUnsigned(); self.num_slots = page.GetChildMemberWithName('total_slots').unsigned - self.slot_size = page.GetChildMemberWithName('size_pool').GetChildMemberWithName('slot_size').unsigned + self.slot_size = page.GetChildMemberWithName('heap').GetChildMemberWithName('slot_size').unsigned self.counter = 0 self.tRBasic = target.FindFirstType("struct RBasic") self.tRValue = target.FindFirstType("struct RVALUE") diff --git a/object.c b/object.c index ae6ec6ea545086..1bd476b0228a0f 100644 --- a/object.c +++ b/object.c @@ -135,7 +135,7 @@ rb_class_allocate_instance(VALUE klass) RUBY_ASSERT(rb_shape_get_shape(obj)->type == SHAPE_ROOT); // Set the shape to the specific T_OBJECT shape. - ROBJECT_SET_SHAPE_ID(obj, (shape_id_t)(rb_gc_size_pool_id_for_size(size) + FIRST_T_OBJECT_SHAPE_ID)); + ROBJECT_SET_SHAPE_ID(obj, (shape_id_t)(rb_gc_heap_id_for_size(size) + FIRST_T_OBJECT_SHAPE_ID)); #if RUBY_DEBUG RUBY_ASSERT(!rb_shape_obj_too_complex(obj)); @@ -358,7 +358,7 @@ rb_obj_copy_ivar(VALUE dest, VALUE obj) rb_shape_t * initial_shape = rb_shape_get_shape(dest); - if (initial_shape->size_pool_index != src_shape->size_pool_index) { + if (initial_shape->heap_index != src_shape->heap_index) { RUBY_ASSERT(initial_shape->type == SHAPE_T_OBJECT); shape_to_set_on_dest = rb_shape_rebuild_shape(initial_shape, src_shape); diff --git a/rjit_c.rb b/rjit_c.rb index d2142e99633e4c..422b7f8e3de912 100644 --- a/rjit_c.rb +++ b/rjit_c.rb @@ -1446,7 +1446,7 @@ def C.rb_shape next_iv_index: [self.attr_index_t, Primitive.cexpr!("OFFSETOF((*((struct rb_shape *)NULL)), next_iv_index)")], capacity: [CType::Immediate.parse("uint32_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_shape *)NULL)), capacity)")], type: [CType::Immediate.parse("uint8_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_shape *)NULL)), type)")], - size_pool_index: [CType::Immediate.parse("uint8_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_shape *)NULL)), size_pool_index)")], + heap_index: [CType::Immediate.parse("uint8_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_shape *)NULL)), heap_index)")], parent_id: [self.shape_id_t, Primitive.cexpr!("OFFSETOF((*((struct rb_shape *)NULL)), parent_id)")], ancestor_index: [CType::Pointer.new { self.redblack_node_t }, Primitive.cexpr!("OFFSETOF((*((struct rb_shape *)NULL)), ancestor_index)")], ) diff --git a/shape.c b/shape.c index cfb6bae969d24e..b0e886692814ee 100644 --- a/shape.c +++ b/shape.c @@ -418,7 +418,7 @@ rb_shape_alloc(ID edge_name, rb_shape_t * parent, enum shape_type type) { rb_shape_t * shape = rb_shape_alloc_with_parent_id(edge_name, rb_shape_id(parent)); shape->type = (uint8_t)type; - shape->size_pool_index = parent->size_pool_index; + shape->heap_index = parent->heap_index; shape->capacity = parent->capacity; shape->edges = 0; return shape; @@ -1059,7 +1059,7 @@ rb_shape_t_to_rb_cShape(rb_shape_t *shape) INT2NUM(shape->parent_id), rb_shape_edge_name(shape), INT2NUM(shape->next_iv_index), - INT2NUM(shape->size_pool_index), + INT2NUM(shape->heap_index), INT2NUM(shape->type), INT2NUM(shape->capacity)); rb_obj_freeze(obj); @@ -1266,7 +1266,7 @@ Init_default_shapes(void) rb_shape_t *root = rb_shape_alloc_with_parent_id(0, INVALID_SHAPE_ID); root->capacity = 0; root->type = SHAPE_ROOT; - root->size_pool_index = 0; + root->heap_index = 0; GET_SHAPE_TREE()->root_shape = root; RUBY_ASSERT(rb_shape_id(GET_SHAPE_TREE()->root_shape) == ROOT_SHAPE_ID); @@ -1282,16 +1282,16 @@ Init_default_shapes(void) rb_shape_t *too_complex_shape = rb_shape_alloc_with_parent_id(0, ROOT_SHAPE_ID); too_complex_shape->type = SHAPE_OBJ_TOO_COMPLEX; - too_complex_shape->size_pool_index = 0; + too_complex_shape->heap_index = 0; RUBY_ASSERT(OBJ_TOO_COMPLEX_SHAPE_ID == (GET_SHAPE_TREE()->next_shape_id - 1)); RUBY_ASSERT(rb_shape_id(too_complex_shape) == OBJ_TOO_COMPLEX_SHAPE_ID); // Make shapes for T_OBJECT - size_t *sizes = rb_gc_size_pool_sizes(); + size_t *sizes = rb_gc_heap_sizes(); for (int i = 0; sizes[i] > 0; i++) { rb_shape_t *t_object_shape = rb_shape_alloc_with_parent_id(0, INVALID_SHAPE_ID); t_object_shape->type = SHAPE_T_OBJECT; - t_object_shape->size_pool_index = i; + t_object_shape->heap_index = i; t_object_shape->capacity = (uint32_t)((sizes[i] - offsetof(struct RObject, as.ary)) / sizeof(VALUE)); t_object_shape->edges = rb_id_table_create(0); t_object_shape->ancestor_index = LEAF; @@ -1308,7 +1308,7 @@ Init_shape(void) "parent_id", "edge_name", "next_iv_index", - "size_pool_index", + "heap_index", "type", "capacity", NULL); diff --git a/shape.h b/shape.h index d02613d714467a..3fdbc34a397efa 100644 --- a/shape.h +++ b/shape.h @@ -47,7 +47,7 @@ struct rb_shape { attr_index_t next_iv_index; uint32_t capacity; // Total capacity of the object with this shape uint8_t type; - uint8_t size_pool_index; + uint8_t heap_index; shape_id_t parent_id; redblack_node_t * ancestor_index; }; diff --git a/test/ruby/test_gc.rb b/test/ruby/test_gc.rb index 9a9796dc55ecfa..31ad71a1a18a1a 100644 --- a/test/ruby/test_gc.rb +++ b/test/ruby/test_gc.rb @@ -226,7 +226,7 @@ def test_stat_heap GC.stat_heap(0, stat_heap) GC.stat(stat) - GC::INTERNAL_CONSTANTS[:SIZE_POOL_COUNT].times do |i| + GC::INTERNAL_CONSTANTS[:HEAP_COUNT].times do |i| EnvUtil.without_gc do GC.stat_heap(i, stat_heap) GC.stat(stat) @@ -248,7 +248,7 @@ def test_stat_heap assert_equal stat_heap[:slot_size], GC.stat_heap(0)[:slot_size] assert_raise(ArgumentError) { GC.stat_heap(-1) } - assert_raise(ArgumentError) { GC.stat_heap(GC::INTERNAL_CONSTANTS[:SIZE_POOL_COUNT]) } + assert_raise(ArgumentError) { GC.stat_heap(GC::INTERNAL_CONSTANTS[:HEAP_COUNT]) } end def test_stat_heap_all @@ -259,7 +259,7 @@ def test_stat_heap_all GC.stat_heap(0, stat_heap) GC.stat_heap(nil, stat_heap_all) - GC::INTERNAL_CONSTANTS[:SIZE_POOL_COUNT].times do |i| + GC::INTERNAL_CONSTANTS[:HEAP_COUNT].times do |i| GC.stat_heap(nil, stat_heap_all) GC.stat_heap(i, stat_heap) @@ -538,7 +538,7 @@ def test_gc_parameter_init_slots gc_count = GC.stat(:count) # Fill up all of the size pools to the init slots - GC::INTERNAL_CONSTANTS[:SIZE_POOL_COUNT].times do |i| + GC::INTERNAL_CONSTANTS[:HEAP_COUNT].times do |i| capa = (GC.stat_heap(i, :slot_size) - GC::INTERNAL_CONSTANTS[:RVALUE_OVERHEAD] - (2 * RbConfig::SIZEOF["void*"])) / RbConfig::SIZEOF["void*"] while GC.stat_heap(i, :heap_eden_slots) < GC_HEAP_INIT_SLOTS Array.new(capa) @@ -558,7 +558,7 @@ def test_gc_parameter_init_slots gc_count = GC.stat(:count) # Fill up all of the size pools to the init slots - GC::INTERNAL_CONSTANTS[:SIZE_POOL_COUNT].times do |i| + GC::INTERNAL_CONSTANTS[:HEAP_COUNT].times do |i| capa = (GC.stat_heap(i, :slot_size) - GC::INTERNAL_CONSTANTS[:RVALUE_OVERHEAD] - (2 * RbConfig::SIZEOF["void*"])) / RbConfig::SIZEOF["void*"] while GC.stat_heap(i, :heap_eden_slots) < SIZES[i] Array.new(capa) diff --git a/test/ruby/test_gc_compact.rb b/test/ruby/test_gc_compact.rb index c331968b3d5c13..26d7c71687fa96 100644 --- a/test/ruby/test_gc_compact.rb +++ b/test/ruby/test_gc_compact.rb @@ -283,7 +283,7 @@ def test_updating_references_for_embed_frozen_shared_arrays end; end - def test_moving_arrays_down_size_pools + def test_moving_arrays_down_heaps omit if GC::INTERNAL_CONSTANTS[:SIZE_POOL_COUNT] == 1 assert_separately(%w[-robjspace], "#{<<~"begin;"}\n#{<<~"end;"}", timeout: 10) @@ -305,7 +305,7 @@ def test_moving_arrays_down_size_pools end; end - def test_moving_arrays_up_size_pools + def test_moving_arrays_up_heaps omit if GC::INTERNAL_CONSTANTS[:SIZE_POOL_COUNT] == 1 assert_separately(%w[-robjspace], "#{<<~"begin;"}\n#{<<~"end;"}", timeout: 10) @@ -329,7 +329,7 @@ def test_moving_arrays_up_size_pools end; end - def test_moving_objects_between_size_pools + def test_moving_objects_between_heaps omit if GC::INTERNAL_CONSTANTS[:SIZE_POOL_COUNT] == 1 assert_separately(%w[-robjspace], "#{<<~"begin;"}\n#{<<~"end;"}", timeout: 60) @@ -361,7 +361,7 @@ def add_ivars end; end - def test_moving_strings_up_size_pools + def test_moving_strings_up_heaps omit if GC::INTERNAL_CONSTANTS[:SIZE_POOL_COUNT] == 1 assert_separately(%w[-robjspace], "#{<<~"begin;"}\n#{<<~"end;"}", timeout: 30) @@ -382,7 +382,7 @@ def test_moving_strings_up_size_pools end; end - def test_moving_strings_down_size_pools + def test_moving_strings_down_heaps omit if GC::INTERNAL_CONSTANTS[:SIZE_POOL_COUNT] == 1 assert_separately(%w[-robjspace], "#{<<~"begin;"}\n#{<<~"end;"}", timeout: 30) @@ -402,7 +402,7 @@ def test_moving_strings_down_size_pools end; end - def test_moving_hashes_down_size_pools + def test_moving_hashes_down_heaps omit if GC::INTERNAL_CONSTANTS[:SIZE_POOL_COUNT] == 1 # AR and ST hashes are in the same size pool on 32 bit omit unless RbConfig::SIZEOF["uint64_t"] <= RbConfig::SIZEOF["void*"] @@ -425,7 +425,7 @@ def test_moving_hashes_down_size_pools end; end - def test_moving_objects_between_size_pools_keeps_shape_frozen_status + def test_moving_objects_between_heaps_keeps_shape_frozen_status # [Bug #19536] assert_separately([], "#{<<~"begin;"}\n#{<<~"end;"}") begin; diff --git a/test/ruby/test_string.rb b/test/ruby/test_string.rb index 8658097ae409ec..ba8d86d442d225 100644 --- a/test/ruby/test_string.rb +++ b/test/ruby/test_string.rb @@ -662,8 +662,8 @@ def test_concat_literals assert_equal(Encoding::UTF_8, "#{s}x".encoding) end - def test_string_interpolations_across_size_pools_get_embedded - omit if GC::INTERNAL_CONSTANTS[:SIZE_POOL_COUNT] == 1 + def test_string_interpolations_across_heaps_get_embedded + omit if GC::INTERNAL_CONSTANTS[:HEAP_COUNT] == 1 require 'objspace' base_slot_size = GC::INTERNAL_CONSTANTS[:BASE_SLOT_SIZE] diff --git a/yjit/src/cruby_bindings.inc.rs b/yjit/src/cruby_bindings.inc.rs index 03cb053fd323d9..ea4c14e512628b 100644 --- a/yjit/src/cruby_bindings.inc.rs +++ b/yjit/src/cruby_bindings.inc.rs @@ -648,7 +648,7 @@ pub struct rb_shape { pub next_iv_index: attr_index_t, pub capacity: u32, pub type_: u8, - pub size_pool_index: u8, + pub heap_index: u8, pub parent_id: shape_id_t, pub ancestor_index: *mut redblack_node_t, } From 3ece042c384b8d630fa7d9bf4ca96774f44c4a82 Mon Sep 17 00:00:00 2001 From: Burdette Lamar Date: Thu, 3 Oct 2024 16:02:32 -0500 Subject: [PATCH 666/829] [DOC] Tweaks for Array#min (#11786) --- array.c | 47 ++++++++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/array.c b/array.c index f7eae0fff44572..562bd3c5d1b779 100644 --- a/array.c +++ b/array.c @@ -6093,42 +6093,51 @@ ary_min_opt_string(VALUE ary, long i, VALUE vmin) /* * call-seq: - * array.min -> element - * array.min { |a, b| ... } -> element - * array.min(n) -> new_array - * array.min(n) { |a, b| ... } -> new_array + * min -> element + * min(n) -> new_array + * min {|a, b| ... } -> element + * min(n) {|a, b| ... } -> new_array * * Returns one of the following: * * - The minimum-valued element from +self+. - * - A new +Array+ of minimum-valued elements selected from +self+. + * - A new array of minimum-valued elements from +self+. * - * When no block is given, each element in +self+ must respond to method #<=> - * with an Integer. + * Does not modify +self+. + * + * With no block given, each element in +self+ must respond to method #<=> + * with a numeric. * * With no argument and no block, returns the element in +self+ * having the minimum value per method #<=>: * - * [0, 1, 2].min # => 0 + * [1, 0, 3, 2].min # => 0 * - * With Integer argument +n+ and no block, returns a new +Array+ with at most +n+ elements, - * in ascending order per method #<=>: + * With non-negative numeric argument +n+ and no block, + * returns a new array with at most +n+ elements, + * in ascending order, per method #<=>: * - * [0, 1, 2, 3].min(3) # => [0, 1, 2] - * [0, 1, 2, 3].min(6) # => [0, 1, 2, 3] + * [1, 0, 3, 2].min(3) # => [0, 1, 2] + * [1, 0, 3, 2].min(3.0) # => [0, 1, 2] + * [1, 0, 3, 2].min(9) # => [0, 1, 2, 3] + * [1, 0, 3, 2].min(0) # => [] * - * When a block is given, the block must return an Integer. + * With a block given, the block must return a numeric. * - * With a block and no argument, calls the block self.size-1 times to compare elements; - * returns the element having the minimum value per the block: + * With a block and no argument, calls the block self.size - 1 times to compare elements; + * returns the element having the minimum return value per the block: * - * ['0', '00', '000'].min { |a, b| a.size <=> b.size } # => "0" + * ['0', '', '000', '00'].min {|a, b| a.size <=> b.size } + * # => "" * - * With an argument +n+ and a block, returns a new +Array+ with at most +n+ elements, - * in ascending order per the block: + * With non-negative numeric argument +n+ and a block, + * returns a new array with at most +n+ elements, + * in ascending order, per the block: * - * ['0', '00', '000'].min(2) {|a, b| a.size <=> b.size } # => ["0", "00"] + * ['0', '', '000', '00'].min(2) {|a, b| a.size <=> b.size } + * # => ["", "0"] * + * Related: see {Methods for Fetching}[rdoc-ref:Array@Methods+for+Fetching]. */ static VALUE rb_ary_min(int argc, VALUE *argv, VALUE ary) From e90862f0edc08400183c81e08b7a20d5449f6f9b Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Thu, 3 Oct 2024 17:02:52 -0400 Subject: [PATCH 667/829] [DOC] Correct documentation for Array#max The return value of Array#max is the maximum value per the block, not from the block. --- array.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/array.c b/array.c index 562bd3c5d1b779..c79bae6e8e525a 100644 --- a/array.c +++ b/array.c @@ -5948,7 +5948,7 @@ ary_max_opt_string(VALUE ary, long i, VALUE vmax) * With a block given, the block must return a numeric. * * With a block and no argument, calls the block self.size - 1 times to compare elements; - * returns the element having the maximum return value from the block: + * returns the element having the maximum return value per the block: * * ['0', '', '000', '00'].max {|a, b| a.size <=> b.size } * # => "000" From 08346e7267b4f17ae207d67543d5f78c2541dc86 Mon Sep 17 00:00:00 2001 From: schneems Date: Tue, 27 Oct 2020 13:54:23 -0500 Subject: [PATCH 668/829] Introduce Pathname.mktmpdir When I want to create a tmpdir I often want to manipulate it as a pathname. By introducing Pathname.mktmpdir I can get this behavior. Currently I must: ```ruby Dir.mktmpdir do |dir| dir = Pathname(dir) # ... code end ``` I would like to be able to instead: ```ruby Pathname.mktmpdir do |dir| # ... code end ``` --- ext/pathname/lib/pathname.rb | 17 +++++++++++++++++ test/pathname/test_pathname.rb | 8 ++++++++ 2 files changed, 25 insertions(+) diff --git a/ext/pathname/lib/pathname.rb b/ext/pathname/lib/pathname.rb index 338b7a3dc05208..52e1d5cfbb43d8 100644 --- a/ext/pathname/lib/pathname.rb +++ b/ext/pathname/lib/pathname.rb @@ -603,3 +603,20 @@ def rmtree(noop: nil, verbose: nil, secure: nil) end end +class Pathname # * tmpdir * + # Creates a tmp directory and wraps the returned path in a Pathname object. + # + # See Dir.mktmpdir + def self.mktmpdir + require 'tmpdir' unless defined?(Dir.mktmpdir) + if block_given? + Dir.mktmpdir do |dir| + dir = self.new(dir) + yield dir + end + else + self.new(Dir.mktmpdir) + end + end +end + diff --git a/test/pathname/test_pathname.rb b/test/pathname/test_pathname.rb index a23dc21ae36f84..edd96e27245432 100644 --- a/test/pathname/test_pathname.rb +++ b/test/pathname/test_pathname.rb @@ -1333,6 +1333,14 @@ def test_s_glob_3args } end + def test_mktmpdir + Pathname.mktmpdir do |dir| + assert_equal Pathname(dir), dir + assert dir.directory? + assert dir.exist? + end + end + def test_s_getwd wd = Pathname.getwd assert_kind_of(Pathname, wd) From 3c54b8e9205fa8debe09447138fd08aeaa59e69c Mon Sep 17 00:00:00 2001 From: schneems Date: Mon, 26 Oct 2020 13:46:40 -0500 Subject: [PATCH 669/829] Allow method chaining with Pathname#mkpath Currently in my code when I want to create a pathname object and create a path at the same time I must use tap ``` path = Pathname.new("/tmp/new").tap(&:mkpath) ``` I think it would be cleaner to be able to chain on the results of these methods instead: ``` path = Pathname.new("/tmp/new").mkpath ``` --- ext/pathname/lib/pathname.rb | 5 ++--- test/pathname/test_pathname.rb | 6 ++++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/ext/pathname/lib/pathname.rb b/ext/pathname/lib/pathname.rb index 52e1d5cfbb43d8..2deda00ff2abb8 100644 --- a/ext/pathname/lib/pathname.rb +++ b/ext/pathname/lib/pathname.rb @@ -588,7 +588,7 @@ class Pathname # * FileUtils * def mkpath(mode: nil) require 'fileutils' FileUtils.mkpath(@path, mode: mode) - nil + self end # Recursively deletes a directory, including all directories beneath it. @@ -599,7 +599,7 @@ def rmtree(noop: nil, verbose: nil, secure: nil) # File::Path provides "mkpath" and "rmtree". require 'fileutils' FileUtils.rm_rf(@path, noop: noop, verbose: verbose, secure: secure) - nil + self end end @@ -619,4 +619,3 @@ def self.mktmpdir end end end - diff --git a/test/pathname/test_pathname.rb b/test/pathname/test_pathname.rb index edd96e27245432..6a4bb784bd0d66 100644 --- a/test/pathname/test_pathname.rb +++ b/test/pathname/test_pathname.rb @@ -1475,7 +1475,8 @@ def assert_mode(val, mask, path, mesg = nil) def test_mkpath with_tmpchdir('rubytest-pathname') {|dir| - Pathname("a/b/c/d").mkpath + path = Pathname("a/b/c/d") + assert_equal(path, path.mkpath) assert_file.directory?("a/b/c/d") unless File.stat(dir).world_readable? # mktmpdir should make unreadable @@ -1491,7 +1492,8 @@ def test_rmtree with_tmpchdir('rubytest-pathname') {|dir| Pathname("a/b/c/d").mkpath assert_file.exist?("a/b/c/d") - Pathname("a").rmtree + path = Pathname("a") + assert_equal(path, path.rmtree) assert_file.not_exist?("a") } end From c5b1df7524e35d6c0a270c38ae65daf7668e2c31 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Fri, 4 Oct 2024 11:54:49 +0900 Subject: [PATCH 670/829] Skip related tests in PathnameInstanceTest --- tool/rbs_skip_tests | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tool/rbs_skip_tests b/tool/rbs_skip_tests index 650d1828d5b983..3ce0d5a1969957 100644 --- a/tool/rbs_skip_tests +++ b/tool/rbs_skip_tests @@ -77,3 +77,7 @@ test_merge_types(RBS::RuntimePrototypeTest) test_reflection(RBS::RuntimePrototypeTest) test_todo(RBS::RuntimePrototypeTest) test_of(RubyVM::AbstractSyntaxTreeSingletonTest) + +# Pathname#mkpath and #rmtree https://github.com/ruby/ruby/pull/3705 +test_mkpath(PathnameInstanceTest) +test_rmtree(PathnameInstanceTest) From 939ec9f080632f1272e6c270f6ca9a2143b3c8ae Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 4 Oct 2024 02:45:20 +0000 Subject: [PATCH 671/829] Bump github/codeql-action from 3.26.10 to 3.26.11 Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.26.10 to 3.26.11. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/e2b3eafc8d227b0241d48be5f425d47c2d750a13...6db8d6351fd0be61f9ed8ebd12ccd35dcec51fea) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/codeql-analysis.yml | 8 ++++---- .github/workflows/scorecards.yml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index f7f315d56f476a..676047cc9cf3ea 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -77,15 +77,15 @@ jobs: run: sudo rm /usr/lib/ruby/vendor_ruby/rubygems/defaults/operating_system.rb - name: Initialize CodeQL - uses: github/codeql-action/init@e2b3eafc8d227b0241d48be5f425d47c2d750a13 # v3.26.10 + uses: github/codeql-action/init@6db8d6351fd0be61f9ed8ebd12ccd35dcec51fea # v3.26.11 with: languages: ${{ matrix.language }} - name: Autobuild - uses: github/codeql-action/autobuild@e2b3eafc8d227b0241d48be5f425d47c2d750a13 # v3.26.10 + uses: github/codeql-action/autobuild@6db8d6351fd0be61f9ed8ebd12ccd35dcec51fea # v3.26.11 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@e2b3eafc8d227b0241d48be5f425d47c2d750a13 # v3.26.10 + uses: github/codeql-action/analyze@6db8d6351fd0be61f9ed8ebd12ccd35dcec51fea # v3.26.11 with: category: '/language:${{ matrix.language }}' upload: False @@ -115,7 +115,7 @@ jobs: continue-on-error: true - name: Upload SARIF - uses: github/codeql-action/upload-sarif@e2b3eafc8d227b0241d48be5f425d47c2d750a13 # v3.26.10 + uses: github/codeql-action/upload-sarif@6db8d6351fd0be61f9ed8ebd12ccd35dcec51fea # v3.26.11 with: sarif_file: sarif-results/${{ matrix.language }}.sarif continue-on-error: true diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml index 6597fe3061ec2a..40f86480c298eb 100644 --- a/.github/workflows/scorecards.yml +++ b/.github/workflows/scorecards.yml @@ -67,6 +67,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: 'Upload to code-scanning' - uses: github/codeql-action/upload-sarif@e2b3eafc8d227b0241d48be5f425d47c2d750a13 # v3.26.10 + uses: github/codeql-action/upload-sarif@6db8d6351fd0be61f9ed8ebd12ccd35dcec51fea # v3.26.11 with: sarif_file: results.sarif From 96d69d2df269bbf68bb0e378b2cd4af46bfd37a4 Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Fri, 4 Oct 2024 18:40:38 +1300 Subject: [PATCH 672/829] Clarify `rb_io_maybe_wait` behaviour. (#9527) --- include/ruby/io.h | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/include/ruby/io.h b/include/ruby/io.h index e9dfeda5b1214b..8fae7eb0f991da 100644 --- a/include/ruby/io.h +++ b/include/ruby/io.h @@ -964,6 +964,9 @@ VALUE rb_io_wait(VALUE io, VALUE events, VALUE timeout); * } * ``` * + * On timeout, ::RUBY_Qfalse is returned. Unless you are specifically handling + * the timeouts, you should typically raise ::rb_eIOTimeoutError in this case. + * * @param[in] error System errno. * @param[in] io An IO object to wait. * @param[in] events An integer set of interests. @@ -974,10 +977,6 @@ VALUE rb_io_wait(VALUE io, VALUE events, VALUE timeout); * @retval RUBY_Qfalse Operation timed out. * @retval Otherwise Actual events reached. * - * @internal - * - * This function to return ::RUBY_Qfalse on timeout could be unintended. It - * seems timeout feature has some rough edge. */ VALUE rb_io_maybe_wait(int error, VALUE io, VALUE events, VALUE timeout); From c878843b2cb8fd54ebfaabd10b6334cf4d400208 Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Fri, 4 Oct 2024 19:36:06 +1300 Subject: [PATCH 673/829] Better handling of timeout in `rb_io_maybe_wait_*`. (#9531) --- include/ruby/io.h | 19 +++++++++++++------ io.c | 14 +++++++++----- spec/ruby/optional/capi/io_spec.rb | 12 ++++++++---- 3 files changed, 30 insertions(+), 15 deletions(-) diff --git a/include/ruby/io.h b/include/ruby/io.h index 8fae7eb0f991da..d2fd3ed317a3c9 100644 --- a/include/ruby/io.h +++ b/include/ruby/io.h @@ -975,6 +975,7 @@ VALUE rb_io_wait(VALUE io, VALUE events, VALUE timeout); * @exception rb_eRangeError `timeout` is out of range. * @exception rb_eSystemCallError `select(2)` failed for some reason. * @retval RUBY_Qfalse Operation timed out. + * @retval RUBY_Qnil Operation failed for some other reason (errno). * @retval Otherwise Actual events reached. * */ @@ -982,8 +983,11 @@ VALUE rb_io_maybe_wait(int error, VALUE io, VALUE events, VALUE timeout); /** * Blocks until the passed IO is ready for reading, if that makes sense for the - * passed errno. This is a special case of rb_io_maybe_wait() that only - * concerns for reading. + * passed errno. This is a special case of rb_io_maybe_wait() that is + * only concerned with reading and handles the timeout. + * + * If you do not want the default timeout handling, consider using + * ::rb_io_maybe_wait directly. * * @param[in] error System errno. * @param[in] io An IO object to wait. @@ -991,15 +995,18 @@ VALUE rb_io_maybe_wait(int error, VALUE io, VALUE events, VALUE timeout); * @exception rb_eIOError `io` is not open. * @exception rb_eRangeError `timeout` is out of range. * @exception rb_eSystemCallError `select(2)` failed for some reason. - * @retval 0 Operation timed out. + * @exception rb_eIOTimeoutError The wait operation timed out. * @retval Otherwise Always returns ::RUBY_IO_READABLE. */ int rb_io_maybe_wait_readable(int error, VALUE io, VALUE timeout); /** * Blocks until the passed IO is ready for writing, if that makes sense for the - * passed errno. This is a special case of rb_io_maybe_wait() that only - * concernsfor writing. + * passed errno. This is a special case of rb_io_maybe_wait() that is + * only concerned with writing, and handles the timeout. + * + * If you do not want the default timeout handling, consider using + * ::rb_io_maybe_wait directly. * * @param[in] error System errno. * @param[in] io An IO object to wait. @@ -1007,7 +1014,7 @@ int rb_io_maybe_wait_readable(int error, VALUE io, VALUE timeout); * @exception rb_eIOError `io` is not open. * @exception rb_eRangeError `timeout` is out of range. * @exception rb_eSystemCallError `select(2)` failed for some reason. - * @retval 0 Operation timed out. + * @exception rb_eIOTimeoutError The wait operation timed out. * @retval Otherwise Always returns ::RUBY_IO_WRITABLE. */ int rb_io_maybe_wait_writable(int error, VALUE io, VALUE timeout); diff --git a/io.c b/io.c index 3c990439162d01..1e5c851f8740cb 100644 --- a/io.c +++ b/io.c @@ -1623,7 +1623,7 @@ rb_io_maybe_wait(int error, VALUE io, VALUE events, VALUE timeout) default: // Non-specific error, no event is ready: - return Qfalse; + return Qnil; } } @@ -1635,9 +1635,11 @@ rb_io_maybe_wait_readable(int error, VALUE io, VALUE timeout) if (RTEST(result)) { return RB_NUM2INT(result); } - else { - return 0; + else if (result == RUBY_Qfalse) { + rb_raise(rb_eIOTimeoutError, "Timed out waiting for IO to become readable!"); } + + return 0; } int @@ -1648,9 +1650,11 @@ rb_io_maybe_wait_writable(int error, VALUE io, VALUE timeout) if (RTEST(result)) { return RB_NUM2INT(result); } - else { - return 0; + else if (result == RUBY_Qfalse) { + rb_raise(rb_eIOTimeoutError, "Timed out waiting for IO to become writable!"); } + + return 0; } static void diff --git a/spec/ruby/optional/capi/io_spec.rb b/spec/ruby/optional/capi/io_spec.rb index bdec46f5e187bf..01588408e10c78 100644 --- a/spec/ruby/optional/capi/io_spec.rb +++ b/spec/ruby/optional/capi/io_spec.rb @@ -458,10 +458,6 @@ @o.rb_io_maybe_wait(Errno::EINTR::Errno, @w_io, IO::WRITABLE, nil).should == IO::WRITABLE end - it "returns false if there is no error condition" do - @o.rb_io_maybe_wait(0, @w_io, IO::WRITABLE, nil).should == false - end - it "raises an IOError if the IO is closed" do @w_io.close -> { @o.rb_io_maybe_wait(0, @w_io, IO::WRITABLE, nil) }.should raise_error(IOError, "closed stream") @@ -521,6 +517,14 @@ end end end + + ruby_version_is "3.4" do + describe "rb_io_maybe_wait" do + it "returns nil if there is no error condition" do + @o.rb_io_maybe_wait(0, @w_io, IO::WRITABLE, nil).should == nil + end + end + end end describe "rb_fd_fix_cloexec" do From c33cb9a5867b0d35335a7d6921184a60356a32d7 Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Fri, 4 Oct 2024 20:35:57 +1300 Subject: [PATCH 674/829] Update `io_spec.c` to use `rb_io_maybe_wait*` if possible. (#11792) --- spec/ruby/optional/capi/ext/io_spec.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/spec/ruby/optional/capi/ext/io_spec.c b/spec/ruby/optional/capi/ext/io_spec.c index 1b4d4fccce4970..e0b1df0de7a2bf 100644 --- a/spec/ruby/optional/capi/ext/io_spec.c +++ b/spec/ruby/optional/capi/ext/io_spec.c @@ -143,7 +143,11 @@ VALUE io_spec_rb_io_wait_readable(VALUE self, VALUE io, VALUE read_p) { errno = saved_errno; } +#ifdef RUBY_VERSION_IS_3_1 + ret = rb_io_maybe_wait_readable(errno, io, Qnil); +#else ret = rb_io_wait_readable(fd); +#endif if (RTEST(read_p)) { ssize_t r = read(fd, buf, RB_IO_WAIT_READABLE_BUF); @@ -162,7 +166,11 @@ VALUE io_spec_rb_io_wait_readable(VALUE self, VALUE io, VALUE read_p) { } VALUE io_spec_rb_io_wait_writable(VALUE self, VALUE io) { +#ifdef RUBY_VERSION_IS_3_1 + int ret = rb_io_maybe_wait_writable(errno, io, Qnil); +#else int ret = rb_io_wait_writable(io_spec_get_fd(io)); +#endif return ret ? Qtrue : Qfalse; } @@ -230,13 +238,23 @@ VALUE io_spec_rb_thread_wait_fd(VALUE self, VALUE io) { } VALUE io_spec_rb_wait_for_single_fd(VALUE self, VALUE io, VALUE events, VALUE secs, VALUE usecs) { - int fd = io_spec_get_fd(io); +#ifdef RUBY_VERSION_IS_3_0 + VALUE timeout = Qnil; + if (!NIL_P(secs)) { + timeout = rb_float_new((double)FIX2INT(secs) + (0.000001f * FIX2INT(usecs))); + } + VALUE result = rb_io_wait(io, events, timeout); + if (result == Qfalse) return INT2FIX(0); + else return result; +#else struct timeval tv; if (!NIL_P(secs)) { tv.tv_sec = FIX2INT(secs); tv.tv_usec = FIX2INT(usecs); } + int fd = io_spec_get_fd(io); return INT2FIX(rb_wait_for_single_fd(fd, FIX2INT(events), NIL_P(secs) ? NULL : &tv)); +#endif } VALUE io_spec_rb_thread_fd_writable(VALUE self, VALUE io) { From 6ea0dcc9781931129e77540097712f6196d49fde Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Fri, 4 Oct 2024 20:44:23 +1300 Subject: [PATCH 675/829] Direct access to `fptr->fd` should prefer to use the `internal/io.h`. (#11793) --- process.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/process.c b/process.c index ef4757ab23cd62..fc52a7ee454036 100644 --- a/process.c +++ b/process.c @@ -15,6 +15,8 @@ #include "ruby/fiber/scheduler.h" +#include "internal/io.h" + #include #include #include @@ -1961,7 +1963,7 @@ check_exec_redirect_fd(VALUE v, int iskey) goto wrong; } else if (!NIL_P(tmp = rb_io_check_io(v))) { - rb_io_t *fptr; + struct rb_io *fptr; GetOpenFile(tmp, fptr); if (fptr->tied_io_for_writing) rb_raise(rb_eArgError, "duplex IO redirection"); From 86e8a36e77a9946aeb179c73a232a793867951bb Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Fri, 4 Oct 2024 21:25:43 +1300 Subject: [PATCH 676/829] Revert "Direct access to `fptr->fd` should prefer to use the `internal/io.h`. (#11793)" This reverts commit 6ea0dcc9781931129e77540097712f6196d49fde that was accidentally merged. --- process.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/process.c b/process.c index fc52a7ee454036..ef4757ab23cd62 100644 --- a/process.c +++ b/process.c @@ -15,8 +15,6 @@ #include "ruby/fiber/scheduler.h" -#include "internal/io.h" - #include #include #include @@ -1963,7 +1961,7 @@ check_exec_redirect_fd(VALUE v, int iskey) goto wrong; } else if (!NIL_P(tmp = rb_io_check_io(v))) { - struct rb_io *fptr; + rb_io_t *fptr; GetOpenFile(tmp, fptr); if (fptr->tied_io_for_writing) rb_raise(rb_eArgError, "duplex IO redirection"); From 79a8750ade3e332c1ab78aa9cbc6ca7fd823dec2 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Fri, 4 Oct 2024 18:49:47 +0900 Subject: [PATCH 677/829] [Bug #20783] Insert a space between RPATHFLAG and LIBPATHFLAG --- configure.ac | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/configure.ac b/configure.ac index 9db4f0c7a8337a..7862cf16f5a5c5 100644 --- a/configure.ac +++ b/configure.ac @@ -3719,16 +3719,16 @@ AS_CASE("$enable_shared", [yes], [ ]) ]) AS_IF([test "$enable_rpath" = yes], [ - test -z "$LIBRUBY_RPATHFLAGS" || LIBRUBY_RPATHFLAGS="$LIBRUBY_RPATHFLAGS " - rpathflag="${RPATHFLAG}" - AS_CASE(["${cross_compiling}${load_relative}"], [*yes*], [], [rpathflag="$RPATHFLAG$LIBPATHFLAG"]) + AS_CASE(["${cross_compiling}${load_relative}"], + [*yes*], [rpathflag="${RPATHFLAG}"], + [rpathflag="$RPATHFLAG${LIBPATHFLAG:+${RPATHFLAG:+ }$LIBPATHFLAG}"]) rpathflag=`IFS="$PATH_SEPARATOR" echo x "$rpathflag" | sed "s/^x *//;s${IFS}"'%1\\$-s'"${IFS}${libprefix}${IFS}g;s${IFS}%s${IFS}${libprefix}${IFS}g" ` - LIBRUBY_RPATHFLAGS="$LIBRUBY_RPATHFLAGS${rpathflag}" - LIBRUBYARG_SHARED="$LIBRUBY_RPATHFLAGS $LIBRUBYARG_SHARED" - LIBRUBYARG_STATIC="$LIBRUBY_RPATHFLAGS $LIBRUBYARG_STATIC" + LIBRUBY_RPATHFLAGS="${LIBRUBY_RPATHFLAGS:+$LIBRUBY_RPATHFLAGS }${rpathflag}" + LIBRUBYARG_SHARED="${LIBRUBY_RPATHFLAGS:+$LIBRUBY_RPATHFLAGS }$LIBRUBYARG_SHARED" + LIBRUBYARG_STATIC="${LIBRUBY_RPATHFLAGS:+$LIBRUBY_RPATHFLAGS }$LIBRUBYARG_STATIC" ]) AC_SUBST(LIBRUBY_RELATIVE) From cd86393ad858d29c1204fd3f1561dca9c96fec16 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Thu, 3 Oct 2024 16:20:16 -0400 Subject: [PATCH 678/829] Assume VM locked in rb_mark_generic_ivar rb_gen_ivtbl_get locks the VM, but the VM must be locked during marking so we can directly read from the generic_ivtbl without locking the VM. --- variable.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/variable.c b/variable.c index 0dfc5cb7b83dfc..4e55427ff57494 100644 --- a/variable.c +++ b/variable.c @@ -1107,9 +1107,9 @@ gen_ivtbl_resize(struct gen_ivtbl *old, uint32_t n) void rb_mark_generic_ivar(VALUE obj) { - struct gen_ivtbl *ivtbl; - - if (rb_gen_ivtbl_get(obj, 0, &ivtbl)) { + st_data_t data; + if (st_lookup(generic_ivtbl_no_ractor_check(obj), (st_data_t)obj, &data)) { + struct gen_ivtbl *ivtbl = (struct gen_ivtbl *)data; if (rb_shape_obj_too_complex(obj)) { rb_mark_tbl_no_pin(ivtbl->as.complex.table); } From 75640037bfc8fc35562224b97c677f2c88221a3e Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Fri, 4 Oct 2024 12:02:22 -0400 Subject: [PATCH 679/829] [ruby/prism] Fix up multi target parsing https://github.com/ruby/prism/commit/80cd335222 --- prism/parser.h | 3 ++ prism/prism.c | 54 ++++++++++++++++++++--- test/prism/errors/multi_target_parens.txt | 19 ++++++++ test/prism/errors/multi_target_star.txt | 17 +++++++ 4 files changed, 87 insertions(+), 6 deletions(-) create mode 100644 test/prism/errors/multi_target_parens.txt create mode 100644 test/prism/errors/multi_target_star.txt diff --git a/prism/parser.h b/prism/parser.h index 26427cda409a65..992729d6555b1e 100644 --- a/prism/parser.h +++ b/prism/parser.h @@ -392,6 +392,9 @@ typedef enum { /** a rescue statement within a module statement */ PM_CONTEXT_MODULE_RESCUE, + /** a multiple target expression */ + PM_CONTEXT_MULTI_TARGET, + /** a parenthesized expression */ PM_CONTEXT_PARENS, diff --git a/prism/prism.c b/prism/prism.c index 6f905d501eb0d7..92381af6aa3a86 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -8570,6 +8570,7 @@ context_terminator(pm_context_t context, pm_token_t *token) { case PM_CONTEXT_MAIN: case PM_CONTEXT_DEF_PARAMS: case PM_CONTEXT_DEFINED: + case PM_CONTEXT_MULTI_TARGET: case PM_CONTEXT_TERNARY: case PM_CONTEXT_RESCUE_MODIFIER: return token->type == PM_TOKEN_EOF; @@ -8774,6 +8775,7 @@ context_human(pm_context_t context) { case PM_CONTEXT_LOOP_PREDICATE: return "loop predicate"; case PM_CONTEXT_MAIN: return "top level context"; case PM_CONTEXT_MODULE: return "module definition"; + case PM_CONTEXT_MULTI_TARGET: return "multiple targets"; case PM_CONTEXT_PARENS: return "parentheses"; case PM_CONTEXT_POSTEXE: return "'END' block"; case PM_CONTEXT_PREDICATE: return "predicate"; @@ -13799,6 +13801,13 @@ parse_targets(pm_parser_t *parser, pm_node_t *first_target, pm_binding_power_t b pm_node_t *splat = (pm_node_t *) pm_splat_node_create(parser, &star_operator, name); pm_multi_target_node_targets_append(parser, result, splat); has_rest = true; + } else if (match1(parser, PM_TOKEN_PARENTHESIS_LEFT)) { + context_push(parser, PM_CONTEXT_MULTI_TARGET); + pm_node_t *target = parse_expression(parser, binding_power, false, false, PM_ERR_EXPECT_EXPRESSION_AFTER_COMMA, (uint16_t) (depth + 1)); + target = parse_target(parser, target, true, false); + + pm_multi_target_node_targets_append(parser, result, target); + context_pop(parser); } else if (token_begins_expression_p(parser->current.type)) { pm_node_t *target = parse_expression(parser, binding_power, false, false, PM_ERR_EXPECT_EXPRESSION_AFTER_COMMA, (uint16_t) (depth + 1)); target = parse_target(parser, target, true, false); @@ -15501,6 +15510,7 @@ parse_return(pm_parser_t *parser, pm_node_t *node) { case PM_CONTEXT_IF: case PM_CONTEXT_LOOP_PREDICATE: case PM_CONTEXT_MAIN: + case PM_CONTEXT_MULTI_TARGET: case PM_CONTEXT_PARENS: case PM_CONTEXT_POSTEXE: case PM_CONTEXT_PREDICATE: @@ -15629,6 +15639,7 @@ parse_block_exit(pm_parser_t *parser, pm_node_t *node) { case PM_CONTEXT_MODULE_ENSURE: case PM_CONTEXT_MODULE_RESCUE: case PM_CONTEXT_MODULE: + case PM_CONTEXT_MULTI_TARGET: case PM_CONTEXT_PARENS: case PM_CONTEXT_PREDICATE: case PM_CONTEXT_RESCUE_MODIFIER: @@ -17780,6 +17791,7 @@ parse_retry(pm_parser_t *parser, const pm_node_t *node) { case PM_CONTEXT_LAMBDA_BRACES: case PM_CONTEXT_LAMBDA_DO_END: case PM_CONTEXT_LOOP_PREDICATE: + case PM_CONTEXT_MULTI_TARGET: case PM_CONTEXT_PARENS: case PM_CONTEXT_POSTEXE: case PM_CONTEXT_PREDICATE: @@ -17863,6 +17875,7 @@ parse_yield(pm_parser_t *parser, const pm_node_t *node) { case PM_CONTEXT_LAMBDA_ENSURE: case PM_CONTEXT_LAMBDA_RESCUE: case PM_CONTEXT_LOOP_PREDICATE: + case PM_CONTEXT_MULTI_TARGET: case PM_CONTEXT_PARENS: case PM_CONTEXT_POSTEXE: case PM_CONTEXT_PREDICATE: @@ -18120,14 +18133,32 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b multi_target->base.location.start = lparen_loc.start; multi_target->base.location.end = rparen_loc.end; - if (match1(parser, PM_TOKEN_COMMA)) { - if (binding_power == PM_BINDING_POWER_STATEMENT) { - return parse_targets_validate(parser, (pm_node_t *) multi_target, PM_BINDING_POWER_INDEX, (uint16_t) (depth + 1)); - } - return (pm_node_t *) multi_target; + pm_node_t *result; + if (match1(parser, PM_TOKEN_COMMA) && (binding_power == PM_BINDING_POWER_STATEMENT)) { + result = parse_targets(parser, (pm_node_t *) multi_target, PM_BINDING_POWER_INDEX, (uint16_t) (depth + 1)); + accept1(parser, PM_TOKEN_NEWLINE); + } else { + result = (pm_node_t *) multi_target; + } + + if (context_p(parser, PM_CONTEXT_MULTI_TARGET)) { + // All set, this is explicitly allowed by the parent + // context. + } else if (context_p(parser, PM_CONTEXT_FOR_INDEX) && match1(parser, PM_TOKEN_KEYWORD_IN)) { + // All set, we're inside a for loop and we're parsing + // multiple targets. + } else if (binding_power != PM_BINDING_POWER_STATEMENT) { + // Multi targets are not allowed when it's not a + // statement level. + pm_parser_err_node(parser, result, PM_ERR_WRITE_TARGET_UNEXPECTED); + } else if (!match2(parser, PM_TOKEN_EQUAL, PM_TOKEN_PARENTHESIS_RIGHT)) { + // Multi targets must be followed by an equal sign in + // order to be valid (or a right parenthesis if they are + // nested). + pm_parser_err_node(parser, result, PM_ERR_WRITE_TARGET_UNEXPECTED); } - return parse_target_validate(parser, (pm_node_t *) multi_target, false); + return result; } // If we have a single statement and are ending on a right parenthesis @@ -18184,6 +18215,17 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b } } + // When we're parsing multi targets, we allow them to be followed by + // a right parenthesis if they are at the statement level. This is + // only possible if they are the final statement in a parentheses. + // We need to explicitly reject that here. + { + const pm_node_t *statement = statements->body.nodes[statements->body.size - 1]; + if (PM_NODE_TYPE_P(statement, PM_MULTI_TARGET_NODE)) { + pm_parser_err_node(parser, statement, PM_ERR_WRITE_TARGET_UNEXPECTED); + } + } + context_pop(parser); pm_accepts_block_stack_pop(parser); expect1(parser, PM_TOKEN_PARENTHESIS_RIGHT, PM_ERR_EXPECT_RPAREN); diff --git a/test/prism/errors/multi_target_parens.txt b/test/prism/errors/multi_target_parens.txt new file mode 100644 index 00000000000000..fe1b9a4b180e32 --- /dev/null +++ b/test/prism/errors/multi_target_parens.txt @@ -0,0 +1,19 @@ +( + ( * ) ) + ^~~~~ unexpected write target +( a ( * ) ) + ^~~~~ unexpected write target +( 1 + ( * ) ) + ^~~~~ unexpected write target +( .. ( * ) ) + ^~~~~ unexpected write target +( a = ( * ) ) + ^~~~~ unexpected write target +( * = ( * ) ) + ^~~~~ unexpected write target +( a if ( * ) ) + ^~~~~ unexpected write target +( 1; ( * ) ) + ^~~~~ unexpected write target +( def f() = ( * ) ) + ^~~~~ unexpected write target + diff --git a/test/prism/errors/multi_target_star.txt b/test/prism/errors/multi_target_star.txt new file mode 100644 index 00000000000000..3d6d7f42867adb --- /dev/null +++ b/test/prism/errors/multi_target_star.txt @@ -0,0 +1,17 @@ +[(*),] + ^~~ unexpected write target +[1,(a,*b,(c,d)),1] + ^~~~~~~~~~~~ unexpected write target +{a:(*),} + ^~~ unexpected write target +[1+(*),] + ^~~ unexpected write target +x=(*),1 + ^~~ unexpected write target +p((*),) + ^~~ unexpected write target +p (*),1 + ^~~ unexpected write target +x = def f = (*),1 + ^~~ unexpected write target + From 5a95a6905875594bb434d25d3db131d6fc2432ee Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Fri, 4 Oct 2024 12:43:02 -0400 Subject: [PATCH 680/829] [ruby/prism] Fix up pattern parsing with trailing commas https://github.com/ruby/prism/commit/51f2df60ff --- prism/prism.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/prism/prism.c b/prism/prism.c index 92381af6aa3a86..24023525e5d785 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -17057,7 +17057,7 @@ parse_pattern_hash(pm_parser_t *parser, pm_constant_id_list_t *captures, pm_node parse_pattern_hash_key(parser, &keys, first_node); pm_node_t *value; - if (match7(parser, PM_TOKEN_COMMA, PM_TOKEN_KEYWORD_THEN, PM_TOKEN_BRACE_RIGHT, PM_TOKEN_BRACKET_RIGHT, PM_TOKEN_PARENTHESIS_RIGHT, PM_TOKEN_NEWLINE, PM_TOKEN_SEMICOLON)) { + if (match8(parser, PM_TOKEN_COMMA, PM_TOKEN_KEYWORD_THEN, PM_TOKEN_BRACE_RIGHT, PM_TOKEN_BRACKET_RIGHT, PM_TOKEN_PARENTHESIS_RIGHT, PM_TOKEN_NEWLINE, PM_TOKEN_SEMICOLON, PM_TOKEN_EOF)) { // Otherwise, we will create an implicit local variable // target for the value. value = parse_pattern_hash_implicit_value(parser, captures, (pm_symbol_node_t *) first_node); @@ -17094,7 +17094,12 @@ parse_pattern_hash(pm_parser_t *parser, pm_constant_id_list_t *captures, pm_node // If there are any other assocs, then we'll parse them now. while (accept1(parser, PM_TOKEN_COMMA)) { // Here we need to break to support trailing commas. - if (match6(parser, PM_TOKEN_KEYWORD_THEN, PM_TOKEN_BRACE_RIGHT, PM_TOKEN_BRACKET_RIGHT, PM_TOKEN_PARENTHESIS_RIGHT, PM_TOKEN_NEWLINE, PM_TOKEN_SEMICOLON)) { + if (match7(parser, PM_TOKEN_KEYWORD_THEN, PM_TOKEN_BRACE_RIGHT, PM_TOKEN_BRACKET_RIGHT, PM_TOKEN_PARENTHESIS_RIGHT, PM_TOKEN_NEWLINE, PM_TOKEN_SEMICOLON, PM_TOKEN_EOF)) { + // Trailing commas are not allowed to follow a rest pattern. + if (rest != NULL) { + pm_parser_err_token(parser, &parser->current, PM_ERR_PATTERN_EXPRESSION_AFTER_REST); + } + break; } @@ -17587,9 +17592,10 @@ parse_pattern(pm_parser_t *parser, pm_constant_id_list_t *captures, uint8_t flag // Gather up all of the patterns into the list. while (accept1(parser, PM_TOKEN_COMMA)) { // Break early here in case we have a trailing comma. - if (match4(parser, PM_TOKEN_KEYWORD_THEN, PM_TOKEN_BRACE_RIGHT, PM_TOKEN_BRACKET_RIGHT, PM_TOKEN_SEMICOLON)) { + if (match6(parser, PM_TOKEN_KEYWORD_THEN, PM_TOKEN_BRACE_RIGHT, PM_TOKEN_BRACKET_RIGHT, PM_TOKEN_SEMICOLON, PM_TOKEN_NEWLINE, PM_TOKEN_EOF)) { node = (pm_node_t *) pm_implicit_rest_node_create(parser, &parser->previous); pm_node_list_append(&nodes, node); + trailing_rest = true; break; } From 95ad0e5f85ed5c46367cb61dfcb01978925a225e Mon Sep 17 00:00:00 2001 From: Burdette Lamar Date: Fri, 4 Oct 2024 12:34:11 -0500 Subject: [PATCH 681/829] [DOC] Tweaks for Array#minmax (#11787) --- array.c | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/array.c b/array.c index c79bae6e8e525a..cc1f927b0eaceb 100644 --- a/array.c +++ b/array.c @@ -6181,26 +6181,25 @@ rb_ary_min(int argc, VALUE *argv, VALUE ary) /* * call-seq: - * array.minmax -> [min_val, max_val] - * array.minmax {|a, b| ... } -> [min_val, max_val] + * minmax -> array + * minmax {|a, b| ... } -> array * - * Returns a new 2-element +Array+ containing the minimum and maximum values - * from +self+, either per method #<=> or per a given block:. + * Returns a 2-element array containing the minimum-valued and maximum-valued + * elements from +self+; + * does not modify +self+. * - * When no block is given, each element in +self+ must respond to method #<=> - * with an Integer; - * returns a new 2-element +Array+ containing the minimum and maximum values - * from +self+, per method #<=>: + * With no block given, the minimum and maximum values are determined using method #<=>: * - * [0, 1, 2].minmax # => [0, 2] + * [1, 0, 3, 2].minmax # => [0, 3] * - * When a block is given, the block must return an Integer; - * the block is called self.size-1 times to compare elements; - * returns a new 2-element +Array+ containing the minimum and maximum values - * from +self+, per the block: + * With a block given, the block must return a numeric; + * the block is called self.size - 1 times to compare elements; + * returns the elements having the minimum and maximum values per the block: * - * ['0', '00', '000'].minmax {|a, b| a.size <=> b.size } # => ["0", "000"] + * ['0', '', '000', '00'].minmax {|a, b| a.size <=> b.size } + * # => ["", "000"] * + * Related: see {Methods for Fetching}[rdoc-ref:Array@Methods+for+Fetching]. */ static VALUE rb_ary_minmax(VALUE ary) From c7dc7da2ee29322980a143d7125e22c11b540012 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Fri, 4 Oct 2024 13:35:56 -0400 Subject: [PATCH 682/829] [DOC] Minor adjustment for Array#max --- array.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/array.c b/array.c index cc1f927b0eaceb..905bfd784683ad 100644 --- a/array.c +++ b/array.c @@ -5948,7 +5948,7 @@ ary_max_opt_string(VALUE ary, long i, VALUE vmax) * With a block given, the block must return a numeric. * * With a block and no argument, calls the block self.size - 1 times to compare elements; - * returns the element having the maximum return value per the block: + * returns the element having the maximum value per the block: * * ['0', '', '000', '00'].max {|a, b| a.size <=> b.size } * # => "000" From f77517f473c38e3fcef72c23de977a44da881caf Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Fri, 4 Oct 2024 13:36:36 -0400 Subject: [PATCH 683/829] [DOC] Minor adjustment for Array#min --- array.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/array.c b/array.c index 905bfd784683ad..9abc63d2d72837 100644 --- a/array.c +++ b/array.c @@ -6125,7 +6125,7 @@ ary_min_opt_string(VALUE ary, long i, VALUE vmin) * With a block given, the block must return a numeric. * * With a block and no argument, calls the block self.size - 1 times to compare elements; - * returns the element having the minimum return value per the block: + * returns the element having the minimum value per the block: * * ['0', '', '000', '00'].min {|a, b| a.size <=> b.size } * # => "" From 30038656aa3a4931abefd99b8166c26599d168fd Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Fri, 4 Oct 2024 13:57:14 -0400 Subject: [PATCH 684/829] Fix intermediate array off-by-one error Co-authored-by: Adam Hess --- iseq.c | 51 ++++++++++++++++++++++++++++++--- prism_compile.c | 2 ++ test/ruby/test_compile_prism.rb | 5 +++- 3 files changed, 53 insertions(+), 5 deletions(-) diff --git a/iseq.c b/iseq.c index 3d18fb597a6a99..a60228c8e585eb 100644 --- a/iseq.c +++ b/iseq.c @@ -1569,6 +1569,48 @@ iseqw_s_compile(int argc, VALUE *argv, VALUE self) return iseqw_s_compile_parser(argc, argv, self, rb_ruby_prism_p()); } +/* + * call-seq: + * InstructionSequence.compile_parsey(source[, file[, path[, line[, options]]]]) -> iseq + * + * Takes +source+, which can be a string of Ruby code, or an open +File+ object. + * that contains Ruby source code. It parses and compiles using parse.y. + * + * Optionally takes +file+, +path+, and +line+ which describe the file path, + * real path and first line number of the ruby code in +source+ which are + * metadata attached to the returned +iseq+. + * + * +file+ is used for `__FILE__` and exception backtrace. +path+ is used for + * +require_relative+ base. It is recommended these should be the same full + * path. + * + * +options+, which can be +true+, +false+ or a +Hash+, is used to + * modify the default behavior of the Ruby iseq compiler. + * + * For details regarding valid compile options see ::compile_option=. + * + * RubyVM::InstructionSequence.compile_parsey("a = 1 + 2") + * #=> @> + * + * path = "test.rb" + * RubyVM::InstructionSequence.compile_parsey(File.read(path), path, File.expand_path(path)) + * #=> @test.rb:1> + * + * file = File.open("test.rb") + * RubyVM::InstructionSequence.compile_parsey(file) + * #=> @:1> + * + * path = File.expand_path("test.rb") + * RubyVM::InstructionSequence.compile_parsey(File.read(path), path, path) + * #=> @/absolute/path/to/test.rb:1> + * + */ +static VALUE +iseqw_s_compile_parsey(int argc, VALUE *argv, VALUE self) +{ + return iseqw_s_compile_parser(argc, argv, self, false); +} + /* * call-seq: * InstructionSequence.compile_prism(source[, file[, path[, line[, options]]]]) -> iseq @@ -1589,19 +1631,19 @@ iseqw_s_compile(int argc, VALUE *argv, VALUE self) * * For details regarding valid compile options see ::compile_option=. * - * RubyVM::InstructionSequence.compile("a = 1 + 2") + * RubyVM::InstructionSequence.compile_prism("a = 1 + 2") * #=> @> * * path = "test.rb" - * RubyVM::InstructionSequence.compile(File.read(path), path, File.expand_path(path)) + * RubyVM::InstructionSequence.compile_prism(File.read(path), path, File.expand_path(path)) * #=> @test.rb:1> * * file = File.open("test.rb") - * RubyVM::InstructionSequence.compile(file) + * RubyVM::InstructionSequence.compile_prism(file) * #=> @:1> * * path = File.expand_path("test.rb") - * RubyVM::InstructionSequence.compile(File.read(path), path, path) + * RubyVM::InstructionSequence.compile_prism(File.read(path), path, path) * #=> @/absolute/path/to/test.rb:1> * */ @@ -4283,6 +4325,7 @@ Init_ISeq(void) (void)iseq_s_load; rb_define_singleton_method(rb_cISeq, "compile", iseqw_s_compile, -1); + rb_define_singleton_method(rb_cISeq, "compile_parsey", iseqw_s_compile_parsey, -1); rb_define_singleton_method(rb_cISeq, "compile_prism", iseqw_s_compile_prism, -1); rb_define_singleton_method(rb_cISeq, "compile_file_prism", iseqw_s_compile_file_prism, -1); rb_define_singleton_method(rb_cISeq, "new", iseqw_s_compile, -1); diff --git a/prism_compile.c b/prism_compile.c index a9c8aea4b4e8dd..5f5e0aa6fe7c41 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -6797,6 +6797,8 @@ pm_compile_array_node(rb_iseq_t *iseq, const pm_node_t *node, const pm_node_list // Create the temporary array. for (; tmp_array_size; tmp_array_size--) rb_ary_push(tmp_array, pm_static_literal_value(iseq, elements->nodes[index++], scope_node)); + + index--; // about to be incremented by for loop OBJ_FREEZE(tmp_array); // Emit the optimized code. diff --git a/test/ruby/test_compile_prism.rb b/test/ruby/test_compile_prism.rb index afe39f9aef11d8..92c1304e9bf66d 100644 --- a/test/ruby/test_compile_prism.rb +++ b/test/ruby/test_compile_prism.rb @@ -768,6 +768,9 @@ def test_ArrayNode assert_prism_eval("a = [1,2]; [0, *a, 3, 4, *5..6, 7, 8, *9..11]") assert_prism_eval("[[*1..2], 3, *4..5]") + elements = Array.new(64) { ":foo" } + assert_prism_eval("[#{elements.join(", ")}, bar: 1, baz: 2]") + # Test keyword splat inside of array assert_prism_eval("[**{x: 'hello'}]") @@ -2628,7 +2631,7 @@ def test_parse_file def compare_eval(source, raw:, location:) source = raw ? source : "class Prism::TestCompilePrism\n#{source}\nend" - ruby_eval = RubyVM::InstructionSequence.compile(source).eval + ruby_eval = RubyVM::InstructionSequence.compile_parsey(source).eval prism_eval = RubyVM::InstructionSequence.compile_prism(source).eval if ruby_eval.is_a? Proc From bdc3363d0f045b1a6d81b72c3cd9b10d5759f71e Mon Sep 17 00:00:00 2001 From: Samuel Giddins Date: Tue, 1 Oct 2024 18:20:19 -0700 Subject: [PATCH 685/829] [rubygems/rubygems] Update required_ruby_version to 3.1 3.0 has been EOL since march, drop support for it before the 3.4 release is cut Signed-off-by: Samuel Giddins https://github.com/rubygems/rubygems/commit/fc1f03b06a --- lib/bundler/bundler.gemspec | 4 ++-- lib/bundler/cli/gem.rb | 2 +- lib/bundler/definition.rb | 6 +----- lib/bundler/fetcher/compact_index.rb | 2 +- lib/rubygems/core_ext/kernel_warn.rb | 8 ++------ 5 files changed, 7 insertions(+), 15 deletions(-) diff --git a/lib/bundler/bundler.gemspec b/lib/bundler/bundler.gemspec index 2d6269fae1f51b..88411f295dd3d2 100644 --- a/lib/bundler/bundler.gemspec +++ b/lib/bundler/bundler.gemspec @@ -29,10 +29,10 @@ Gem::Specification.new do |s| "source_code_uri" => "https://github.com/rubygems/rubygems/tree/master/bundler", } - s.required_ruby_version = ">= 3.0.0" + s.required_ruby_version = ">= 3.1.0" # It should match the RubyGems version shipped with `required_ruby_version` above - s.required_rubygems_version = ">= 3.2.3" + s.required_rubygems_version = ">= 3.3.3" s.files = Dir.glob("lib/bundler{.rb,/**/*}", File::FNM_DOTMATCH).reject {|f| File.directory?(f) } diff --git a/lib/bundler/cli/gem.rb b/lib/bundler/cli/gem.rb index fb0a184e5d8026..22bcf0e47aa272 100644 --- a/lib/bundler/cli/gem.rb +++ b/lib/bundler/cli/gem.rb @@ -446,7 +446,7 @@ def rust_builder_required_rubygems_version end def required_ruby_version - "3.0.0" + "3.1.0" end def rubocop_version diff --git a/lib/bundler/definition.rb b/lib/bundler/definition.rb index e7e6c49e6c9f84..36ca1ee9adf434 100644 --- a/lib/bundler/definition.rb +++ b/lib/bundler/definition.rb @@ -266,11 +266,7 @@ def dependencies_for(groups) groups.map!(&:to_sym) deps = current_dependencies # always returns a new array deps.select! do |d| - if RUBY_VERSION >= "3.1" - d.groups.intersect?(groups) - else - !(d.groups & groups).empty? - end + d.groups.intersect?(groups) end deps end diff --git a/lib/bundler/fetcher/compact_index.rb b/lib/bundler/fetcher/compact_index.rb index 6e5656d26a1fff..6c82d570114cde 100644 --- a/lib/bundler/fetcher/compact_index.rb +++ b/lib/bundler/fetcher/compact_index.rb @@ -10,7 +10,7 @@ def self.compact_index_request(method_name) method = instance_method(method_name) undef_method(method_name) define_method(method_name) do |*args, &blk| - method.bind(self).call(*args, &blk) + method.bind_call(self, *args, &blk) rescue NetworkDownError, CompactIndexClient::Updater::MismatchedChecksumError => e raise HTTPError, e.message rescue AuthenticationRequiredError, BadAuthenticationError diff --git a/lib/rubygems/core_ext/kernel_warn.rb b/lib/rubygems/core_ext/kernel_warn.rb index 9dc9f2218cf900..f806b77faba3de 100644 --- a/lib/rubygems/core_ext/kernel_warn.rb +++ b/lib/rubygems/core_ext/kernel_warn.rb @@ -13,11 +13,7 @@ class << self module_function define_method(:warn) {|*messages, **kw| unless uplevel = kw[:uplevel] - if Gem.java_platform? && RUBY_VERSION < "3.1" - return original_warn.bind(self).call(*messages) - else - return original_warn.bind(self).call(*messages, **kw) - end + return original_warn.bind_call(self, *messages, **kw) end # Ensure `uplevel` fits a `long` @@ -44,6 +40,6 @@ class << self kw[:uplevel] = start end - original_warn.bind(self).call(*messages, **kw) + original_warn.bind_call(self, *messages, **kw) } end From db6e6155d673931d1ae6b962664684c4fe4937e6 Mon Sep 17 00:00:00 2001 From: Samuel Giddins Date: Wed, 2 Oct 2024 09:19:55 -0700 Subject: [PATCH 686/829] [rubygems/rubygems] Remove outdated conditionals from tests Signed-off-by: Samuel Giddins https://github.com/rubygems/rubygems/commit/06eec6d855 --- lib/bundler/definition.rb | 2 +- spec/bundler/commands/exec_spec.rb | 4 -- spec/bundler/commands/update_spec.rb | 71 +++++++------------- spec/bundler/install/gemfile/gemspec_spec.rb | 8 +-- spec/bundler/install/gems/standalone_spec.rb | 6 +- spec/bundler/resolver/platform_spec.rb | 20 +++--- spec/bundler/runtime/setup_spec.rb | 2 - 7 files changed, 39 insertions(+), 74 deletions(-) diff --git a/lib/bundler/definition.rb b/lib/bundler/definition.rb index 36ca1ee9adf434..bb6eb11e4eaf7f 100644 --- a/lib/bundler/definition.rb +++ b/lib/bundler/definition.rb @@ -554,7 +554,7 @@ def expanded_dependencies def dependencies_with_bundler return dependencies unless @unlocking_bundler - return dependencies if dependencies.map(&:name).include?("bundler") + return dependencies if dependencies.any? {|d| d.name == "bundler" } [Dependency.new("bundler", @unlocking_bundler)] + dependencies end diff --git a/spec/bundler/commands/exec_spec.rb b/spec/bundler/commands/exec_spec.rb index ca8ef26344b977..4f87f3c38dbb17 100644 --- a/spec/bundler/commands/exec_spec.rb +++ b/spec/bundler/commands/exec_spec.rb @@ -616,10 +616,6 @@ end it "loads the correct optparse when `auto_install` is set, and optparse is a dependency" do - if Gem.rubygems_version < Gem::Version.new("3.3.0.a") - skip "optparse is a default gem, and rubygems loads it during install" - end - build_repo4 do build_gem "fastlane", "2.192.0" do |s| s.executables = "fastlane" diff --git a/spec/bundler/commands/update_spec.rb b/spec/bundler/commands/update_spec.rb index 1683827636bda2..60cd641d4b323b 100644 --- a/spec/bundler/commands/update_spec.rb +++ b/spec/bundler/commands/update_spec.rb @@ -1469,38 +1469,28 @@ bundle :update, bundler: true, verbose: true, preserve_ruby_flags: true - # Only updates properly on modern RubyGems. - - if Gem.rubygems_version >= Gem::Version.new("3.3.0.dev") - expect(out).to include("Updating bundler to 999.0.0") - expect(out).to include("Running `bundle update --bundler \"> 0.a\" --verbose` with bundler 999.0.0") - expect(out).not_to include("Installing Bundler 2.99.9 and restarting using that version.") + expect(out).to include("Updating bundler to 999.0.0") + expect(out).to include("Running `bundle update --bundler \"> 0.a\" --verbose` with bundler 999.0.0") + expect(out).not_to include("Installing Bundler 2.99.9 and restarting using that version.") - expect(lockfile).to eq <<~L - GEM - remote: https://gem.repo4/ - specs: - myrack (1.0) + expect(lockfile).to eq <<~L + GEM + remote: https://gem.repo4/ + specs: + myrack (1.0) - PLATFORMS - #{lockfile_platforms} + PLATFORMS + #{lockfile_platforms} - DEPENDENCIES - myrack + DEPENDENCIES + myrack - BUNDLED WITH - 999.0.0 - L + BUNDLED WITH + 999.0.0 + L - expect(the_bundle).to include_gems "bundler 999.0.0" - expect(the_bundle).to include_gems "myrack 1.0" - else - # Old RubyGems versions do not trampoline but they still change BUNDLED - # WITH to the latest bundler version. This means the below check fails - # because it tries to use bundler 999.0.0 which did not get installed. - # Workaround the bug by forcing the version we know is installed. - expect(the_bundle).to include_gems "myrack 1.0", env: { "BUNDLER_VERSION" => "2.99.9" } - end + expect(the_bundle).to include_gems "bundler 999.0.0" + expect(the_bundle).to include_gems "myrack 1.0" end it "does not claim to update to Bundler version to a wrong version when cached gems are present" do @@ -1599,12 +1589,8 @@ bundle :update, bundler: "999.999.999", raise_on_error: false - # Only gives a meaningful error message on modern RubyGems. - - if Gem.rubygems_version >= Gem::Version.new("3.3.0.dev") - expect(last_command).to be_failure - expect(err).to eq("The `bundle update --bundler` target version (999.999.999) does not exist") - end + expect(last_command).to be_failure + expect(err).to eq("The `bundle update --bundler` target version (999.999.999) does not exist") end it "allows updating to development versions if already installed locally" do @@ -1621,13 +1607,11 @@ bundle :update, bundler: "2.3.0.dev", verbose: "true" - # Only updates properly on modern RubyGems. - if Gem.rubygems_version >= Gem::Version.new("3.3.0.dev") - checksums = checksums_section_when_enabled do |c| - c.checksum(gem_repo4, "myrack", "1.0") - end + checksums = checksums_section_when_enabled do |c| + c.checksum(gem_repo4, "myrack", "1.0") + end - expect(lockfile).to eq <<~L + expect(lockfile).to eq <<~L GEM remote: https://gem.repo4/ specs: @@ -1643,8 +1627,7 @@ 2.3.0.dev L - expect(out).to include("Using bundler 2.3.0.dev") - end + expect(out).to include("Using bundler 2.3.0.dev") end it "does not touch the network if not necessary" do @@ -1668,8 +1651,7 @@ c.checksum(gem_repo4, "myrack", "1.0") end - if Gem.rubygems_version >= Gem::Version.new("3.3.0.dev") - expect(lockfile).to eq <<~L + expect(lockfile).to eq <<~L GEM remote: https://gem.repo4/ specs: @@ -1685,8 +1667,7 @@ 2.3.9 L - expect(out).to include("Using bundler 2.3.9") - end + expect(out).to include("Using bundler 2.3.9") end it "prints an error when trying to update bundler in frozen mode" do diff --git a/spec/bundler/install/gemfile/gemspec_spec.rb b/spec/bundler/install/gemfile/gemspec_spec.rb index 5610a6f05b83d1..be0694cb55ac87 100644 --- a/spec/bundler/install/gemfile/gemspec_spec.rb +++ b/spec/bundler/install/gemfile/gemspec_spec.rb @@ -10,11 +10,9 @@ let(:x64_mingw_archs) do if RUBY_PLATFORM == "x64-mingw-ucrt" - if Gem.rubygems_version >= Gem::Version.new("3.2.28") - ["x64-mingw-ucrt", "x64-mingw32"] - else - ["x64-mingw32", "x64-unknown"] - end + + ["x64-mingw-ucrt", "x64-mingw32"] + else ["x64-mingw32"] end diff --git a/spec/bundler/install/gems/standalone_spec.rb b/spec/bundler/install/gems/standalone_spec.rb index ee8d9c6d3a8cfb..65b14ea4259b8f 100644 --- a/spec/bundler/install/gems/standalone_spec.rb +++ b/spec/bundler/install/gems/standalone_spec.rb @@ -141,16 +141,13 @@ describe "with default gems and a lockfile", :ruby_repo do before do - skip "Does not work on old Windows Rubies" if Gem.ruby_version < Gem::Version.new("3.2") && Gem.win_platform? - necessary_system_gems = ["tsort --version 0.1.0"] - necessary_system_gems += ["etc --version 1.4.3"] if Gem.ruby_version >= Gem::Version.new("3.3.2") && Gem.win_platform? + necessary_system_gems += ["etc --version 1.4.3"] realworld_system_gems(*necessary_system_gems) end it "works and points to the vendored copies, not to the default copies" do necessary_gems_in_bundle_path = ["optparse --version 0.1.1", "psych --version 3.3.2", "logger --version 1.4.3", "etc --version 1.4.3", "stringio --version 3.1.0"] - necessary_gems_in_bundle_path += ["shellwords --version 0.2.0", "base64 --version 0.1.0", "resolv --version 0.2.1"] if Gem.rubygems_version < Gem::Version.new("3.3.a") necessary_gems_in_bundle_path += ["yaml --version 0.1.1"] if Gem.rubygems_version < Gem::Version.new("3.4.a") realworld_system_gems(*necessary_gems_in_bundle_path, path: scoped_gem_path(bundled_app("bundle"))) @@ -188,7 +185,6 @@ it "works for gems with extensions and points to the vendored copies, not to the default copies" do necessary_gems_in_bundle_path = ["optparse --version 0.1.1", "psych --version 3.3.2", "logger --version 1.4.3", "etc --version 1.4.3", "stringio --version 3.1.0", "shellwords --version 0.2.0", "open3 --version 0.2.1"] - necessary_gems_in_bundle_path += ["base64 --version 0.1.0", "resolv --version 0.2.1"] if Gem.rubygems_version < Gem::Version.new("3.3.a") necessary_gems_in_bundle_path += ["yaml --version 0.1.1"] if Gem.rubygems_version < Gem::Version.new("3.4.a") realworld_system_gems(*necessary_gems_in_bundle_path, path: scoped_gem_path(bundled_app("bundle"))) diff --git a/spec/bundler/resolver/platform_spec.rb b/spec/bundler/resolver/platform_spec.rb index 3e959aeb893286..8e51911bbdb2a9 100644 --- a/spec/bundler/resolver/platform_spec.rb +++ b/spec/bundler/resolver/platform_spec.rb @@ -381,20 +381,16 @@ should_resolve_as %w[win32-api-1.5.1-universal-mingw32] end - if Gem.rubygems_version >= Gem::Version.new("3.2.28") - it "finds x64-mingw-ucrt gems" do - platforms "x64-mingw-ucrt" - dep "thin" - should_resolve_as %w[thin-1.2.7-x64-mingw-ucrt] - end + it "finds x64-mingw-ucrt gems" do + platforms "x64-mingw-ucrt" + dep "thin" + should_resolve_as %w[thin-1.2.7-x64-mingw-ucrt] end - if Gem.rubygems_version >= Gem::Version.new("3.3.18") - it "finds universal-mingw gems on x64-mingw-ucrt" do - platform "x64-mingw-ucrt" - dep "win32-api" - should_resolve_as %w[win32-api-1.5.1-universal-mingw32] - end + it "finds universal-mingw gems on x64-mingw-ucrt", rubygems: ">= 3.3.18" do + platform "x64-mingw-ucrt" + dep "win32-api" + should_resolve_as %w[win32-api-1.5.1-universal-mingw32] end end diff --git a/spec/bundler/runtime/setup_spec.rb b/spec/bundler/runtime/setup_spec.rb index 175e2551f199f6..fc574f31962182 100644 --- a/spec/bundler/runtime/setup_spec.rb +++ b/spec/bundler/runtime/setup_spec.rb @@ -1399,8 +1399,6 @@ def lock_with(ruby_version = nil) let(:exemptions) do exempts = %w[did_you_mean bundler uri pathname] exempts << "etc" if (Gem.ruby_version < Gem::Version.new("3.2") || Gem.ruby_version >= Gem::Version.new("3.3.2")) && Gem.win_platform? - exempts << "set" unless Gem.rubygems_version >= Gem::Version.new("3.2.6") - exempts << "tsort" unless Gem.rubygems_version >= Gem::Version.new("3.2.31") exempts << "error_highlight" # added in Ruby 3.1 as a default gem exempts << "ruby2_keywords" # added in Ruby 3.1 as a default gem exempts << "syntax_suggest" # added in Ruby 3.2 as a default gem From 7695bf183b02361cc6adb953da6a54c505082260 Mon Sep 17 00:00:00 2001 From: Samuel Giddins Date: Wed, 2 Oct 2024 09:22:09 -0700 Subject: [PATCH 687/829] [rubygems/rubygems] Remove CorrectHashForLambdaOperator monkey patch Signed-off-by: Samuel Giddins https://github.com/rubygems/rubygems/commit/085bafd8d4 --- lib/bundler/rubygems_ext.rb | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/lib/bundler/rubygems_ext.rb b/lib/bundler/rubygems_ext.rb index 0f0680560a00d6..67f830d4f3fbc8 100644 --- a/lib/bundler/rubygems_ext.rb +++ b/lib/bundler/rubygems_ext.rb @@ -264,23 +264,6 @@ def to_lock end end - # Requirements using lambda operator differentiate trailing zeros since rubygems 3.2.6 - if Gem::Requirement.new("~> 2.0").hash == Gem::Requirement.new("~> 2.0.0").hash - class Requirement - module CorrectHashForLambdaOperator - def hash - if requirements.any? {|r| r.first == "~>" } - requirements.map {|r| r.first == "~>" ? [r[0], r[1].to_s] : r }.sort.hash - else - super - end - end - end - - prepend CorrectHashForLambdaOperator - end - end - require "rubygems/platform" class Platform From dfa11551aa1a4dc9ba9d2d78c083dc77e17b8f29 Mon Sep 17 00:00:00 2001 From: Samuel Giddins Date: Wed, 2 Oct 2024 09:25:56 -0700 Subject: [PATCH 688/829] [rubygems/rubygems] More rubygems 3.2.x removals Signed-off-by: Samuel Giddins https://github.com/rubygems/rubygems/commit/272f3464a3 --- lib/bundler/rubygems_gem_installer.rb | 1 - lib/bundler/rubygems_integration.rb | 10 +--------- lib/bundler/self_manager.rb | 1 - 3 files changed, 1 insertion(+), 11 deletions(-) diff --git a/lib/bundler/rubygems_gem_installer.rb b/lib/bundler/rubygems_gem_installer.rb index 62756680e7c44c..65fdf160725568 100644 --- a/lib/bundler/rubygems_gem_installer.rb +++ b/lib/bundler/rubygems_gem_installer.rb @@ -145,7 +145,6 @@ def prepare_extension_build(extension_dir) SharedHelpers.filesystem_access(extension_dir, :create) do FileUtils.mkdir_p extension_dir end - require "shellwords" unless Bundler.rubygems.provides?(">= 3.2.25") end def strict_rm_rf(dir) diff --git a/lib/bundler/rubygems_integration.rb b/lib/bundler/rubygems_integration.rb index 7abaa236ed673d..e77704aa0a3e78 100644 --- a/lib/bundler/rubygems_integration.rb +++ b/lib/bundler/rubygems_integration.rb @@ -20,10 +20,6 @@ def provides?(req_str) Gem::Requirement.new(req_str).satisfied_by?(version) end - def supports_bundler_trampolining? - provides?(">= 3.3.0.a") - end - def build_args require "rubygems/command" Gem::Command.build_args @@ -356,11 +352,7 @@ def undo_replacements @replaced_methods.each do |(sym, klass), method| redefine_method(klass, sym, method) end - if Binding.public_method_defined?(:source_location) - post_reset_hooks.reject! {|proc| proc.binding.source_location[0] == __FILE__ } - else - post_reset_hooks.reject! {|proc| proc.binding.eval("__FILE__") == __FILE__ } - end + post_reset_hooks.reject! {|proc| proc.binding.source_location[0] == __FILE__ } @replaced_methods.clear end diff --git a/lib/bundler/self_manager.rb b/lib/bundler/self_manager.rb index a6d93f20ffb579..6ab41b99f7fa0d 100644 --- a/lib/bundler/self_manager.rb +++ b/lib/bundler/self_manager.rb @@ -106,7 +106,6 @@ def needs_switching? def autoswitching_applies? ENV["BUNDLER_VERSION"].nil? && - Bundler.rubygems.supports_bundler_trampolining? && ruby_can_restart_with_same_arguments? && SharedHelpers.in_bundle? && lockfile_version From 40d7e5d2abcaa2206074a924e94d8fea2a67a3a5 Mon Sep 17 00:00:00 2001 From: Samuel Giddins Date: Wed, 2 Oct 2024 09:34:56 -0700 Subject: [PATCH 689/829] [rubygems/rubygems] Update rubocop to ruby 3.1 Signed-off-by: Samuel Giddins https://github.com/rubygems/rubygems/commit/300fb96ffc --- spec/bundler/bundler/specifications/foo.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/bundler/bundler/specifications/foo.gemspec b/spec/bundler/bundler/specifications/foo.gemspec index 46eb068cd177bf..81b77d0c86f3be 100644 --- a/spec/bundler/bundler/specifications/foo.gemspec +++ b/spec/bundler/bundler/specifications/foo.gemspec @@ -8,6 +8,6 @@ Gem::Specification.new do |s| s.version = "1.0.0" s.loaded_from = __FILE__ s.extensions = "ext/foo" - s.required_ruby_version = ">= 3.0.0" + s.required_ruby_version = ">= 3.1.0" end # rubocop:enable Style/FrozenStringLiteralComment From e472d1a6d697eea93dfa6c037fd9d65dc9d9f34e Mon Sep 17 00:00:00 2001 From: Samuel Giddins Date: Wed, 2 Oct 2024 14:31:51 -0700 Subject: [PATCH 690/829] [rubygems/rubygems] Remove extra space in BUNDLED WITH section Signed-off-by: Samuel Giddins https://github.com/rubygems/rubygems/commit/d8b5d05e46 --- spec/bundler/commands/update_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/bundler/commands/update_spec.rb b/spec/bundler/commands/update_spec.rb index 60cd641d4b323b..2d66c0e550d32c 100644 --- a/spec/bundler/commands/update_spec.rb +++ b/spec/bundler/commands/update_spec.rb @@ -1486,7 +1486,7 @@ myrack BUNDLED WITH - 999.0.0 + 999.0.0 L expect(the_bundle).to include_gems "bundler 999.0.0" From b653be0ba572adc145dfb13ea312439edca49e68 Mon Sep 17 00:00:00 2001 From: Samuel Giddins Date: Fri, 4 Oct 2024 10:48:55 -0700 Subject: [PATCH 691/829] [rubygems/rubygems] Update spec rubygems_ext Signed-off-by: Samuel Giddins https://github.com/rubygems/rubygems/commit/1ef33fa0af --- spec/bundler/support/rubygems_ext.rb | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/spec/bundler/support/rubygems_ext.rb b/spec/bundler/support/rubygems_ext.rb index 1fc5aa16c01bcb..5dfc2591b766a2 100644 --- a/spec/bundler/support/rubygems_ext.rb +++ b/spec/bundler/support/rubygems_ext.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -abort "RubyGems only supports Ruby 3.0 or higher" if RUBY_VERSION < "3.0.0" +abort "RubyGems only supports Ruby 3.1 or higher" if RUBY_VERSION < "3.1.0" require_relative "path" @@ -125,14 +125,7 @@ def gem_load_activate_and_possibly_install(gem_name, bin_container) def gem_activate_and_possibly_install(gem_name) gem_activate(gem_name) rescue Gem::LoadError => e - # Windows 3.0 puts a Windows stub script as `rake` while it should be - # named `rake.bat`. RubyGems does not like that and avoids overwriting it - # unless explicitly instructed to do so with `force`. - if RUBY_VERSION.start_with?("3.0") && Gem.win_platform? - Gem.install(gem_name, e.requirement, force: true) - else - Gem.install(gem_name, e.requirement) - end + Gem.install(gem_name, e.requirement) retry end From 648f558e01a9dbc71bb9d24fe5cb2dabe2b1bcb0 Mon Sep 17 00:00:00 2001 From: Samuel Giddins Date: Fri, 4 Oct 2024 10:49:35 -0700 Subject: [PATCH 692/829] [rubygems/rubygems] Remove now unused realworld spec Signed-off-by: Samuel Giddins https://github.com/rubygems/rubygems/commit/2484267920 --- spec/bundler/realworld/edgecases_spec.rb | 162 ----------------------- 1 file changed, 162 deletions(-) diff --git a/spec/bundler/realworld/edgecases_spec.rb b/spec/bundler/realworld/edgecases_spec.rb index dc15c56c795243..fb434aba7069b9 100644 --- a/spec/bundler/realworld/edgecases_spec.rb +++ b/spec/bundler/realworld/edgecases_spec.rb @@ -207,166 +207,4 @@ def rubygems_version(name, requirement) G expect(err).to include("resque-scheduler 2.2.0 includes a gemspec with `require_paths` set to an array of arrays. Newer versions of this gem might've already fixed this").once end - - it "doesn't hang on nix gemfile" do - skip "Only for ruby 3.0" unless RUBY_VERSION.start_with?("3.0") - - gemfile <<~G - source "https://rubygems.org" - - gem "addressable" - gem "atk" - gem "awesome_print" - gem "bacon" - gem "byebug" - gem "cairo" - gem "cairo-gobject" - gem "camping" - gem "charlock_holmes" - gem "cld3" - gem "cocoapods" - gem "cocoapods-acknowledgements" - gem "cocoapods-art" - gem "cocoapods-bin" - gem "cocoapods-browser" - gem "cocoapods-bugsnag" - gem "cocoapods-check" - gem "cocoapods-clean" - gem "cocoapods-clean_build_phases_scripts" - gem "cocoapods-core" - gem "cocoapods-coverage" - gem "cocoapods-deintegrate" - gem "cocoapods-dependencies" - gem "cocoapods-deploy" - gem "cocoapods-downloader" - gem "cocoapods-expert-difficulty" - gem "cocoapods-fix-react-native" - gem "cocoapods-generate" - gem "cocoapods-git_url_rewriter" - gem "cocoapods-keys" - gem "cocoapods-no-dev-schemes" - gem "cocoapods-open" - gem "cocoapods-packager" - gem "cocoapods-playgrounds" - gem "cocoapods-plugins" - gem "cocoapods-prune-localizations" - gem "cocoapods-rome" - gem "cocoapods-search" - gem "cocoapods-sorted-search" - gem "cocoapods-static-swift-framework" - gem "cocoapods-stats" - gem "cocoapods-tdfire-binary" - gem "cocoapods-testing" - gem "cocoapods-trunk" - gem "cocoapods-try" - gem "cocoapods-try-release-fix" - gem "cocoapods-update-if-you-dare" - gem "cocoapods-whitelist" - gem "cocoapods-wholemodule" - gem "coderay" - gem "concurrent-ruby" - gem "curb" - gem "curses" - gem "daemons" - gem "dep-selector-libgecode" - gem "digest-sha3" - gem "domain_name" - gem "do_sqlite3" - gem "ethon" - gem "eventmachine" - gem "excon" - gem "faraday" - gem "ffi" - gem "ffi-rzmq-core" - gem "fog-dnsimple" - gem "gdk_pixbuf2" - gem "gio2" - gem "gitlab-markup" - gem "glib2" - gem "gpgme" - gem "gtk2" - gem "hashie" - gem "highline" - gem "hike" - gem "hitimes" - gem "hpricot" - gem "httpclient" - gem "http-cookie" - gem "iconv" - gem "idn-ruby" - gem "jbuilder" - gem "jekyll" - gem "jmespath" - gem "jwt" - gem "libv8" - gem "libxml-ruby" - gem "magic" - gem "markaby" - gem "method_source" - gem "mini_magick" - gem "msgpack" - gem "mysql2" - gem "ncursesw" - gem "netrc" - gem "net-scp" - gem "net-ssh" - gem "nokogiri" - gem "opus-ruby" - gem "ovirt-engine-sdk" - gem "pango" - gem "patron" - gem "pcaprub" - gem "pg" - gem "pry" - gem "pry-byebug" - gem "pry-doc" - gem "public_suffix" - gem "puma" - gem "rails" - gem "rainbow" - gem "rbnacl" - gem "rb-readline" - gem "re2" - gem "redis" - gem "redis-rack" - gem "rest-client" - gem "rmagick" - gem "rpam2" - gem "rspec" - gem "rubocop" - gem "rubocop-performance" - gem "ruby-libvirt" - gem "ruby-lxc" - gem "ruby-progressbar" - gem "ruby-terminfo" - gem "ruby-vips" - gem "rubyzip" - gem "rugged" - gem "sassc" - gem "scrypt" - gem "semian" - gem "sequel" - gem "sequel_pg" - gem "simplecov" - gem "sinatra" - gem "slop" - gem "snappy" - gem "sqlite3" - gem "taglib-ruby" - gem "thrift" - gem "tilt" - gem "tiny_tds" - gem "treetop" - gem "typhoeus" - gem "tzinfo" - gem "unf_ext" - gem "uuid4r" - gem "whois" - gem "zookeeper" - G - - bundle :lock, env: { "DEBUG_RESOLVER" => "1" } - - expect(out).to include("Solution found after 4 attempts") - end end From b57bbf774fc0599740b0d133a762b2ad14ce021d Mon Sep 17 00:00:00 2001 From: Burdette Lamar Date: Fri, 4 Oct 2024 15:10:58 -0500 Subject: [PATCH 693/829] [DOC] Tweaks for Array#one? (#11789) --- array.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/array.c b/array.c index 9abc63d2d72837..81ad68f7cdc28e 100644 --- a/array.c +++ b/array.c @@ -7972,9 +7972,9 @@ rb_ary_none_p(int argc, VALUE *argv, VALUE ary) /* * call-seq: - * array.one? -> true or false - * array.one? {|element| ... } -> true or false - * array.one?(obj) -> true or false + * one? -> true or false + * one? {|element| ... } -> true or false + * one?(object) -> true or false * * Returns +true+ if exactly one element of +self+ meets a given criterion. * @@ -7986,14 +7986,14 @@ rb_ary_none_p(int argc, VALUE *argv, VALUE ary) * [nil, nil].one? # => false * [].one? # => false * - * With a block given and no argument, calls the block with each element in +self+; + * With a block given, calls the block with each element in +self+; * returns +true+ if the block a truthy value for exactly one element, +false+ otherwise: * * [0, 1, 2].one? {|element| element > 0 } # => false * [0, 1, 2].one? {|element| element > 1 } # => true * [0, 1, 2].one? {|element| element > 2 } # => false * - * If argument +obj+ is given, returns +true+ if obj.=== exactly one element, + * With argument +object+ given, returns +true+ if for exactly one element +element+, object === element; * +false+ otherwise: * * [0, 1, 2].one?(0) # => true @@ -8003,7 +8003,7 @@ rb_ary_none_p(int argc, VALUE *argv, VALUE ary) * ['food', 'drink'].one?(/foo/) # => true * [].one?(/foo/) # => false * - * Related: Enumerable#one? + * Related: see {Methods for Querying}[rdoc-ref:Array@Methods+for+Querying]. */ static VALUE From 87169dd435e0db40303f8dc3a29408663e978d14 Mon Sep 17 00:00:00 2001 From: Burdette Lamar Date: Fri, 4 Oct 2024 15:11:10 -0500 Subject: [PATCH 694/829] [DOC] Tweaks for Array#none? (#11788) --- array.c | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/array.c b/array.c index 81ad68f7cdc28e..8cfdbeb9c14d70 100644 --- a/array.c +++ b/array.c @@ -7912,34 +7912,35 @@ rb_ary_all_p(int argc, VALUE *argv, VALUE ary) /* * call-seq: - * array.none? -> true or false - * array.none? {|element| ... } -> true or false - * array.none?(obj) -> true or false + * none? -> true or false + * none?(object) -> true or false + * none? {|element| ... } -> true or false * - * Returns +true+ if no element of +self+ meet a given criterion. + * Returns +true+ if no element of +self+ meets a given criterion, +false+ otherwise. * * With no block given and no argument, returns +true+ if +self+ has no truthy elements, * +false+ otherwise: * - * [nil, false].none? # => true + * [nil, false].none? # => true * [nil, 0, false].none? # => false - * [].none? # => true + * [].none? # => true * - * With a block given and no argument, calls the block with each element in +self+; + * With argument +object+ given, returns +false+ if for any element +element+, + * object === element; +true+ otherwise: + * + * ['food', 'drink'].none?(/bar/) # => true + * ['food', 'drink'].none?(/foo/) # => false + * [].none?(/foo/) # => true + * [0, 1, 2].none?(3) # => true + * [0, 1, 2].none?(1) # => false + * + * With a block given, calls the block with each element in +self+; * returns +true+ if the block returns no truthy value, +false+ otherwise: * * [0, 1, 2].none? {|element| element > 3 } # => true * [0, 1, 2].none? {|element| element > 1 } # => false * - * If argument +obj+ is given, returns +true+ if obj.=== no element, +false+ otherwise: - * - * ['food', 'drink'].none?(/bar/) # => true - * ['food', 'drink'].none?(/foo/) # => false - * [].none?(/foo/) # => true - * [0, 1, 2].none?(3) # => true - * [0, 1, 2].none?(1) # => false - * - * Related: Enumerable#none? + * Related: see {Methods for Querying}[rdoc-ref:Array@Methods+for+Querying]. */ static VALUE From 563263a91ceba742277c6f4d2ec1b821388fbceb Mon Sep 17 00:00:00 2001 From: tomoya ishida Date: Sat, 5 Oct 2024 06:56:06 +0900 Subject: [PATCH 695/829] [ruby/reline] Concatenate some rendeing test (https://github.com/ruby/reline/pull/749) https://github.com/ruby/reline/commit/41b54140f4 --- test/reline/yamatanooroti/test_rendering.rb | 102 +------------------- 1 file changed, 4 insertions(+), 98 deletions(-) diff --git a/test/reline/yamatanooroti/test_rendering.rb b/test/reline/yamatanooroti/test_rendering.rb index 000491270f67aa..6503ea325b7b2d 100644 --- a/test/reline/yamatanooroti/test_rendering.rb +++ b/test/reline/yamatanooroti/test_rendering.rb @@ -556,7 +556,7 @@ def test_bracketed_paste close end - def test_bracketed_paste_with_undo + def test_bracketed_paste_with_undo_redo omit if Reline.core.io_gate.win? start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') write("abc") @@ -566,15 +566,6 @@ def test_bracketed_paste_with_undo Multiline REPL. prompt> abc EOC - close - end - - def test_bracketed_paste_with_redo - omit if Reline.core.io_gate.win? - start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') - write("abc") - write("\e[200~def hoge\r\t3\rend\e[201~") - write("\C-_") write("\M-\C-_") assert_screen(<<~EOC) Multiline REPL. @@ -639,46 +630,6 @@ def each_top_level_statement prompt> end prompt> end EOC - close - end - - def test_longer_than_screen_height_with_scroll_back - start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') - write(<<~EOC.chomp) - def each_top_level_statement - initialize_input - catch(:TERM_INPUT) do - loop do - begin - prompt - unless l = lex - throw :TERM_INPUT if @line == '' - else - @line_no += l.count("\n") - next if l == "\n" - @line.concat l - if @code_block_open or @ltype or @continue or @indent > 0 - next - end - end - if @line != "\n" - @line.force_encoding(@io.encoding) - yield @line, @exp_line_no - end - break if @io.eof? - @line = '' - @exp_line_no = @line_no - # - @indent = 0 - rescue TerminateLineInput - initialize_input - prompt - end - end - end - end - EOC - sleep 1 write("\C-p" * 6) assert_screen(<<~EOC) prompt> rescue Terminate @@ -687,49 +638,9 @@ def each_top_level_statement ut prompt> prompt EOC - close - end - - def test_longer_than_screen_height_with_complex_scroll_back - start_terminal(4, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') - write(<<~EOC.chomp) - def each_top_level_statement - initialize_input - catch(:TERM_INPUT) do - loop do - begin - prompt - unless l = lex - throw :TERM_INPUT if @line == '' - else - @line_no += l.count("\n") - next if l == "\n" - @line.concat l - if @code_block_open or @ltype or @continue or @indent > 0 - next - end - end - if @line != "\n" - @line.force_encoding(@io.encoding) - yield @line, @exp_line_no - end - break if @io.eof? - @line = '' - @exp_line_no = @line_no - # - @indent = 0 - rescue TerminateLineInput - initialize_input - prompt - end - end - end - end - EOC - sleep 1 - write("\C-p" * 5) - write("\C-n" * 3) + write("\C-n" * 4) assert_screen(<<~EOC) + prompt> initialize_inp ut prompt> prompt prompt> end @@ -1459,12 +1370,7 @@ def test_autocomplete_long_with_scrollbar Socket StringIO EOC - close - end - - def test_autocomplete_long_with_scrollbar_scroll - start_terminal(20, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --autocomplete-long}, startup_message: 'Multiline REPL.') - write('S' + "\C-i" * 16) + write("\C-i" * 16) assert_screen(<<~'EOC') Multiline REPL. prompt> StringScanner From e766cb3e578fcfb3f21dd8f4a95cd4296b704c89 Mon Sep 17 00:00:00 2001 From: S-H-GAMELINKS Date: Sat, 5 Oct 2024 05:54:32 +0900 Subject: [PATCH 696/829] Suppress warnings in `time_init_parse` function MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When building Ruby on Ubuntu 22.04 and GCC 11.4.0, the following warning appeared. And this change has suppressed warning. ``` compiling ../ruby/time.c ../ruby/time.c: In function ‘time_init_parse’: ../ruby/time.c:2650:21: warning: comparison of integer expressions of different signedness: ‘size_t’ {aka ‘long unsigned int’} and ‘int’ [-Wsign-compare] 2650 | if (ndigits < TIME_SCALE_NUMDIGITS) { | ^ ../ruby/time.c:2654:26: warning: comparison of integer expressions of different signedness: ‘size_t’ {aka ‘long unsigned int’} and ‘int’ [-Wsign-compare] 2654 | else if (ndigits > TIME_SCALE_NUMDIGITS) { | ``` --- time.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/time.c b/time.c index e3f58e36454ea1..54db29c2af1d33 100644 --- a/time.c +++ b/time.c @@ -2647,11 +2647,11 @@ time_init_parse(rb_execution_context_t *ec, VALUE time, VALUE str, VALUE zone, V } if (!NIL_P(subsec)) { /* subseconds is the last using ndigits */ - if (ndigits < TIME_SCALE_NUMDIGITS) { + if (ndigits < (size_t)TIME_SCALE_NUMDIGITS) { VALUE mul = rb_int_positive_pow(10, TIME_SCALE_NUMDIGITS - ndigits); subsec = rb_int_mul(subsec, mul); } - else if (ndigits > TIME_SCALE_NUMDIGITS) { + else if (ndigits > (size_t)TIME_SCALE_NUMDIGITS) { VALUE num = rb_int_positive_pow(10, ndigits - TIME_SCALE_NUMDIGITS); subsec = rb_rational_new(subsec, num); } From c50298d7d4f8797963490f5679b1c481b89d4955 Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Sat, 5 Oct 2024 15:10:12 +1300 Subject: [PATCH 697/829] Introduce `rb_io_blocking_region` which takes `struct rb_io` argument. (#11795) This does not change any actual behaviour, but provides a choke point for blocking IO operations. * Update `IO::Buffer` to use `rb_io_blocking_region`. * Update `File` to use `rb_io_blocking_region`. * Update `IO` to use `rb_io_blocking_region`. --- common.mk | 1 + file.c | 24 +++++++++---------- internal/io.h | 3 +++ io.c | 64 ++++++++++++++++++++++++++++++++------------------- io_buffer.c | 23 ++++++++++-------- 5 files changed, 69 insertions(+), 46 deletions(-) diff --git a/common.mk b/common.mk index 6e861dc4b01f2c..1d3766a8f4eafc 100644 --- a/common.mk +++ b/common.mk @@ -8601,6 +8601,7 @@ io_buffer.$(OBJEXT): $(top_srcdir)/internal/bits.h io_buffer.$(OBJEXT): $(top_srcdir)/internal/compilers.h io_buffer.$(OBJEXT): $(top_srcdir)/internal/error.h io_buffer.$(OBJEXT): $(top_srcdir)/internal/fixnum.h +io_buffer.$(OBJEXT): $(top_srcdir)/internal/io.h io_buffer.$(OBJEXT): $(top_srcdir)/internal/numeric.h io_buffer.$(OBJEXT): $(top_srcdir)/internal/serial.h io_buffer.$(OBJEXT): $(top_srcdir)/internal/static_assert.h diff --git a/file.c b/file.c index f94bef04aacdc4..1ba2eae98fac91 100644 --- a/file.c +++ b/file.c @@ -1145,14 +1145,14 @@ no_gvl_fstat(void *data) } static int -fstat_without_gvl(int fd, struct stat *st) +fstat_without_gvl(rb_io_t *fptr, struct stat *st) { no_gvl_stat_data data; - data.file.fd = fd; + data.file.fd = fptr->fd; data.st = st; - return (int)(VALUE)rb_thread_io_blocking_region(no_gvl_fstat, &data, fd); + return (int)rb_io_blocking_region(fptr, no_gvl_fstat, &data); } static void * @@ -1224,12 +1224,12 @@ statx_without_gvl(const char *path, struct statx *stx, unsigned int mask) } static int -fstatx_without_gvl(int fd, struct statx *stx, unsigned int mask) +fstatx_without_gvl(rb_io_t *fptr, struct statx *stx, unsigned int mask) { - no_gvl_statx_data data = {stx, fd, "", AT_EMPTY_PATH, mask}; + no_gvl_statx_data data = {stx, fptr->fd, "", AT_EMPTY_PATH, mask}; /* call statx(2) with fd */ - return (int)rb_thread_io_blocking_region(io_blocking_statx, &data, fd); + return (int)rb_io_blocking_region(fptr, io_blocking_statx, &data); } static int @@ -1242,7 +1242,7 @@ rb_statx(VALUE file, struct statx *stx, unsigned int mask) if (!NIL_P(tmp)) { rb_io_t *fptr; GetOpenFile(tmp, fptr); - result = fstatx_without_gvl(fptr->fd, stx, mask); + result = fstatx_without_gvl(fptr, stx, mask); file = tmp; } else { @@ -1283,7 +1283,7 @@ typedef struct statx statx_data; #elif defined(HAVE_STAT_BIRTHTIME) # define statx_without_gvl(path, st, mask) stat_without_gvl(path, st) -# define fstatx_without_gvl(fd, st, mask) fstat_without_gvl(fd, st) +# define fstatx_without_gvl(fptr, st, mask) fstat_without_gvl(fptr, st) # define statx_birthtime(st, fname) stat_birthtime(st) # define statx_has_birthtime(st) 1 # define rb_statx(file, st, mask) rb_stat(file, st) @@ -1303,7 +1303,7 @@ rb_stat(VALUE file, struct stat *st) rb_io_t *fptr; GetOpenFile(tmp, fptr); - result = fstat_without_gvl(fptr->fd, st); + result = fstat_without_gvl(fptr, st); file = tmp; } else { @@ -2501,7 +2501,7 @@ rb_file_birthtime(VALUE obj) statx_data st; GetOpenFile(obj, fptr); - if (fstatx_without_gvl(fptr->fd, &st, STATX_BTIME) == -1) { + if (fstatx_without_gvl(fptr, &st, STATX_BTIME) == -1) { rb_sys_fail_path(fptr->pathv); } return statx_birthtime(&st, fptr->pathv); @@ -5280,7 +5280,7 @@ rb_file_truncate(VALUE obj, VALUE len) } rb_io_flush_raw(obj, 0); fa.fd = fptr->fd; - if ((int)rb_thread_io_blocking_region(nogvl_ftruncate, &fa, fa.fd) < 0) { + if ((int)rb_io_blocking_region(fptr, nogvl_ftruncate, &fa) < 0) { rb_sys_fail_path(fptr->pathv); } return INT2FIX(0); @@ -5380,7 +5380,7 @@ rb_file_flock(VALUE obj, VALUE operation) if (fptr->mode & FMODE_WRITABLE) { rb_io_flush_raw(obj, 0); } - while ((int)rb_thread_io_blocking_region(rb_thread_flock, op, fptr->fd) < 0) { + while ((int)rb_io_blocking_region(fptr, rb_thread_flock, op) < 0) { int e = errno; switch (e) { case EAGAIN: diff --git a/internal/io.h b/internal/io.h index 1891248a19ee08..c207ca38bfcbdd 100644 --- a/internal/io.h +++ b/internal/io.h @@ -135,6 +135,9 @@ RUBY_SYMBOL_EXPORT_BEGIN void rb_maygvl_fd_fix_cloexec(int fd); int rb_gc_for_fd(int err); void rb_write_error_str(VALUE mesg); + +VALUE rb_io_blocking_region_wait(struct rb_io *io, rb_blocking_function_t *function, void *argument, enum rb_io_event events); +VALUE rb_io_blocking_region(struct rb_io *io, rb_blocking_function_t *function, void *argument); RUBY_SYMBOL_EXPORT_END #endif /* INTERNAL_IO_H */ diff --git a/io.c b/io.c index 1e5c851f8740cb..b26f71056f921d 100644 --- a/io.c +++ b/io.c @@ -222,6 +222,17 @@ static VALUE sym_HOLE; static VALUE prep_io(int fd, int fmode, VALUE klass, const char *path); +VALUE +rb_io_blocking_region_wait(struct rb_io *io, rb_blocking_function_t *function, void *argument, enum rb_io_event events) +{ + return rb_thread_io_blocking_call(function, argument, io->fd, events); +} + +VALUE rb_io_blocking_region(struct rb_io *io, rb_blocking_function_t *function, void *argument) +{ + return rb_io_blocking_region_wait(io, function, argument, 0); +} + struct argf { VALUE filename, current_file; long last_lineno; /* $. */ @@ -1298,7 +1309,7 @@ rb_io_read_memory(rb_io_t *fptr, void *buf, size_t count) iis.timeout = &timeout_storage; } - return (ssize_t)rb_thread_io_blocking_call(internal_read_func, &iis, fptr->fd, RB_WAITFD_IN); + return (ssize_t)rb_io_blocking_region_wait(fptr, internal_read_func, &iis, RUBY_IO_READABLE); } static ssize_t @@ -1331,7 +1342,7 @@ rb_io_write_memory(rb_io_t *fptr, const void *buf, size_t count) iis.timeout = &timeout_storage; } - return (ssize_t)rb_thread_io_blocking_call(internal_write_func, &iis, fptr->fd, RB_WAITFD_OUT); + return (ssize_t)rb_io_blocking_region_wait(fptr, internal_write_func, &iis, RUBY_IO_WRITABLE); } #ifdef HAVE_WRITEV @@ -1368,7 +1379,7 @@ rb_writev_internal(rb_io_t *fptr, const struct iovec *iov, int iovcnt) iis.timeout = &timeout_storage; } - return (ssize_t)rb_thread_io_blocking_call(internal_writev_func, &iis, fptr->fd, RB_WAITFD_OUT); + return (ssize_t)rb_io_blocking_region_wait(fptr, internal_writev_func, &iis, RUBY_IO_WRITABLE); } #endif @@ -1398,7 +1409,7 @@ static VALUE io_flush_buffer_async(VALUE arg) { rb_io_t *fptr = (rb_io_t *)arg; - return rb_thread_io_blocking_call(io_flush_buffer_sync, fptr, fptr->fd, RB_WAITFD_OUT); + return rb_io_blocking_region_wait(fptr, io_flush_buffer_sync, fptr, RUBY_IO_WRITABLE); } static inline int @@ -2788,8 +2799,10 @@ rb_io_fsync(VALUE io) if (io_fflush(fptr) < 0) rb_sys_fail_on_write(fptr); - if ((int)rb_thread_io_blocking_region(nogvl_fsync, fptr, fptr->fd) < 0) + + if ((int)rb_io_blocking_region(fptr, nogvl_fsync, fptr)) rb_sys_fail_path(fptr->pathv); + return INT2FIX(0); } #else @@ -2838,7 +2851,7 @@ rb_io_fdatasync(VALUE io) if (io_fflush(fptr) < 0) rb_sys_fail_on_write(fptr); - if ((int)rb_thread_io_blocking_region(nogvl_fdatasync, fptr, fptr->fd) == 0) + if ((int)rb_io_blocking_region(fptr, nogvl_fdatasync, fptr) == 0) return INT2FIX(0); /* fall back */ @@ -3423,10 +3436,10 @@ io_read_memory_call(VALUE arg) } if (iis->nonblock) { - return rb_thread_io_blocking_call(internal_read_func, iis, iis->fptr->fd, 0); + return rb_io_blocking_region(iis->fptr, internal_read_func, iis); } else { - return rb_thread_io_blocking_call(internal_read_func, iis, iis->fptr->fd, RB_WAITFD_IN); + return rb_io_blocking_region_wait(iis->fptr, internal_read_func, iis, RUBY_IO_READABLE); } } @@ -6099,7 +6112,7 @@ rb_io_sysread(int argc, VALUE *argv, VALUE io) } struct prdwr_internal_arg { - VALUE io; + struct rb_io *io; int fd; void *buf; size_t count; @@ -6121,14 +6134,14 @@ pread_internal_call(VALUE _arg) VALUE scheduler = rb_fiber_scheduler_current(); if (scheduler != Qnil) { - VALUE result = rb_fiber_scheduler_io_pread_memory(scheduler, arg->io, arg->offset, arg->buf, arg->count, 0); + VALUE result = rb_fiber_scheduler_io_pread_memory(scheduler, arg->io->self, arg->offset, arg->buf, arg->count, 0); if (!UNDEF_P(result)) { return rb_fiber_scheduler_io_result_apply(result); } } - return rb_thread_io_blocking_call(internal_pread_func, arg, arg->fd, RB_WAITFD_IN); + return rb_io_blocking_region_wait(arg->io, internal_pread_func, arg, RUBY_IO_READABLE); } /* @@ -6165,7 +6178,7 @@ rb_io_pread(int argc, VALUE *argv, VALUE io) VALUE len, offset, str; rb_io_t *fptr; ssize_t n; - struct prdwr_internal_arg arg = {.io = io}; + struct prdwr_internal_arg arg; int shrinkable; rb_scan_args(argc, argv, "21", &len, &offset, &str); @@ -6179,6 +6192,7 @@ rb_io_pread(int argc, VALUE *argv, VALUE io) GetOpenFile(io, fptr); rb_io_check_byte_readable(fptr); + arg.io = fptr; arg.fd = fptr->fd; rb_io_check_closed(fptr); @@ -6203,7 +6217,7 @@ internal_pwrite_func(void *_arg) VALUE scheduler = rb_fiber_scheduler_current(); if (scheduler != Qnil) { - VALUE result = rb_fiber_scheduler_io_pwrite_memory(scheduler, arg->io, arg->offset, arg->buf, arg->count, 0); + VALUE result = rb_fiber_scheduler_io_pwrite_memory(scheduler, arg->io->self, arg->offset, arg->buf, arg->count, 0); if (!UNDEF_P(result)) { return rb_fiber_scheduler_io_result_apply(result); @@ -6244,7 +6258,7 @@ rb_io_pwrite(VALUE io, VALUE str, VALUE offset) { rb_io_t *fptr; ssize_t n; - struct prdwr_internal_arg arg = {.io = io}; + struct prdwr_internal_arg arg; VALUE tmp; if (!RB_TYPE_P(str, T_STRING)) @@ -6255,13 +6269,15 @@ rb_io_pwrite(VALUE io, VALUE str, VALUE offset) io = GetWriteIO(io); GetOpenFile(io, fptr); rb_io_check_writable(fptr); + + arg.io = fptr; arg.fd = fptr->fd; tmp = rb_str_tmp_frozen_acquire(str); arg.buf = RSTRING_PTR(tmp); arg.count = (size_t)RSTRING_LEN(tmp); - n = (ssize_t)rb_thread_io_blocking_call(internal_pwrite_func, &arg, fptr->fd, RB_WAITFD_OUT); + n = (ssize_t)rb_io_blocking_region_wait(fptr, internal_pwrite_func, &arg, RUBY_IO_WRITABLE); if (n < 0) rb_sys_fail_path(fptr->pathv); rb_str_tmp_frozen_release(str, tmp); @@ -10806,7 +10822,7 @@ do_io_advise(rb_io_t *fptr, VALUE advice, rb_off_t offset, rb_off_t len) ias.offset = offset; ias.len = len; - rv = (int)rb_thread_io_blocking_region(io_advise_internal, &ias, fptr->fd); + rv = (int)rb_io_blocking_region(fptr, io_advise_internal, &ias); if (rv && rv != ENOSYS) { /* posix_fadvise(2) doesn't set errno. On success it returns 0; otherwise it returns the error code. */ @@ -11099,16 +11115,16 @@ nogvl_ioctl(void *ptr) } static int -do_ioctl(int fd, ioctl_req_t cmd, long narg) +do_ioctl(struct rb_io *io, ioctl_req_t cmd, long narg) { int retval; struct ioctl_arg arg; - arg.fd = fd; + arg.fd = io->fd; arg.cmd = cmd; arg.narg = narg; - retval = (int)rb_thread_io_blocking_region(nogvl_ioctl, &arg, fd); + retval = (int)rb_io_blocking_region(io, nogvl_ioctl, &arg); return retval; } @@ -11371,7 +11387,7 @@ rb_ioctl(VALUE io, VALUE req, VALUE arg) narg = setup_narg(cmd, &arg, ioctl_narg_len); GetOpenFile(io, fptr); - retval = do_ioctl(fptr->fd, cmd, narg); + retval = do_ioctl(fptr, cmd, narg); return finish_narg(retval, arg, fptr); } @@ -11425,16 +11441,16 @@ nogvl_fcntl(void *ptr) } static int -do_fcntl(int fd, int cmd, long narg) +do_fcntl(struct rb_io *io, int cmd, long narg) { int retval; struct fcntl_arg arg; - arg.fd = fd; + arg.fd = io->fd; arg.cmd = cmd; arg.narg = narg; - retval = (int)rb_thread_io_blocking_region(nogvl_fcntl, &arg, fd); + retval = (int)rb_io_blocking_region(io, nogvl_fcntl, &arg); if (retval != -1) { switch (cmd) { #if defined(F_DUPFD) @@ -11460,7 +11476,7 @@ rb_fcntl(VALUE io, VALUE req, VALUE arg) narg = setup_narg(cmd, &arg, fcntl_narg_len); GetOpenFile(io, fptr); - retval = do_fcntl(fptr->fd, cmd, narg); + retval = do_fcntl(fptr, cmd, narg); return finish_narg(retval, arg, fptr); } diff --git a/io_buffer.c b/io_buffer.c index 211663b7b0f518..51ddde8c29c71b 100644 --- a/io_buffer.c +++ b/io_buffer.c @@ -6,7 +6,6 @@ **********************************************************************/ -#include "ruby/io.h" #include "ruby/io/buffer.h" #include "ruby/fiber/scheduler.h" @@ -16,7 +15,7 @@ #include "internal/error.h" #include "internal/numeric.h" #include "internal/string.h" -#include "internal/thread.h" +#include "internal/io.h" VALUE rb_cIOBuffer; VALUE rb_eIOBufferLockedError; @@ -2656,10 +2655,10 @@ io_buffer_default_size(size_t page_size) } struct io_buffer_blocking_region_argument { + struct rb_io *io; struct rb_io_buffer *buffer; rb_blocking_function_t *function; void *data; - int descriptor; }; static VALUE @@ -2667,7 +2666,7 @@ io_buffer_blocking_region_begin(VALUE _argument) { struct io_buffer_blocking_region_argument *argument = (void*)_argument; - return rb_thread_io_blocking_region(argument->function, argument->data, argument->descriptor); + return rb_io_blocking_region(argument->io, argument->function, argument->data); } static VALUE @@ -2681,13 +2680,17 @@ io_buffer_blocking_region_ensure(VALUE _argument) } static VALUE -io_buffer_blocking_region(struct rb_io_buffer *buffer, rb_blocking_function_t *function, void *data, int descriptor) +io_buffer_blocking_region(VALUE io, struct rb_io_buffer *buffer, rb_blocking_function_t *function, void *data) { + io = rb_io_get_io(io); + struct rb_io *ioptr; + RB_IO_POINTER(io, ioptr); + struct io_buffer_blocking_region_argument argument = { + .io = ioptr, .buffer = buffer, .function = function, .data = data, - .descriptor = descriptor, }; // If the buffer is already locked, we can skip the ensure (unlock): @@ -2774,7 +2777,7 @@ rb_io_buffer_read(VALUE self, VALUE io, size_t length, size_t offset) .length = length, }; - return io_buffer_blocking_region(buffer, io_buffer_read_internal, &argument, descriptor); + return io_buffer_blocking_region(io, buffer, io_buffer_read_internal, &argument); } /* @@ -2892,7 +2895,7 @@ rb_io_buffer_pread(VALUE self, VALUE io, rb_off_t from, size_t length, size_t of .offset = from, }; - return io_buffer_blocking_region(buffer, io_buffer_pread_internal, &argument, descriptor); + return io_buffer_blocking_region(io, buffer, io_buffer_pread_internal, &argument); } /* @@ -3011,7 +3014,7 @@ rb_io_buffer_write(VALUE self, VALUE io, size_t length, size_t offset) .length = length, }; - return io_buffer_blocking_region(buffer, io_buffer_write_internal, &argument, descriptor); + return io_buffer_blocking_region(io, buffer, io_buffer_write_internal, &argument); } /* @@ -3129,7 +3132,7 @@ rb_io_buffer_pwrite(VALUE self, VALUE io, rb_off_t from, size_t length, size_t o .offset = from, }; - return io_buffer_blocking_region(buffer, io_buffer_pwrite_internal, &argument, descriptor); + return io_buffer_blocking_region(io, buffer, io_buffer_pwrite_internal, &argument); } /* From e939f28cc93a538e751c9c1200c95c4c85c9d09b Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sat, 5 Oct 2024 11:24:12 +0900 Subject: [PATCH 698/829] Use quadrigraphs for a hash So that the closing bracket does not look like commented out. --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 7862cf16f5a5c5..d099b626796af1 100644 --- a/configure.ac +++ b/configure.ac @@ -2088,7 +2088,7 @@ AC_CHECK_FUNCS(_longjmp) # used for AC_ARG_WITH(setjmp-type) test x$ac_cv_func__longjmp = xno && ac_cv_func__setjmp=no AC_CHECK_FUNCS(arc4random_buf) AC_CHECK_FUNCS(atan2l atan2f) -AC_CHECK_DECLS(atomic_signal_fence, [], [], [#include ]) +AC_CHECK_DECLS(atomic_signal_fence, [], [], [@%:@include ]) AC_CHECK_FUNCS(chmod) AC_CHECK_FUNCS(chown) AC_CHECK_FUNCS(chroot) From 6743e6285a585fbd0a3b25b8eeed10caf1fae66e Mon Sep 17 00:00:00 2001 From: tompng Date: Sat, 5 Oct 2024 15:18:45 +0900 Subject: [PATCH 699/829] [Bug #20784] Fix incomplete character syntax followed by EOF --- parse.y | 2 +- test/ripper/test_scanner_events.rb | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/parse.y b/parse.y index e3391d64eed975..50e32e842a5bd1 100644 --- a/parse.y +++ b/parse.y @@ -10118,7 +10118,7 @@ parse_qmark(struct parser_params *p, int space_seen) enc = rb_utf8_encoding(); tokadd_utf8(p, &enc, -1, 0, 0); } - else if (!ISASCII(c = peekc(p))) { + else if (!ISASCII(c = peekc(p)) && c != -1) { nextc(p); if (tokadd_mbchar(p, c) == -1) return 0; } diff --git a/test/ripper/test_scanner_events.rb b/test/ripper/test_scanner_events.rb index 261e259889c12a..ed291c4384ed4b 100644 --- a/test/ripper/test_scanner_events.rb +++ b/test/ripper/test_scanner_events.rb @@ -951,6 +951,10 @@ def test_CHAR assert_equal ["?\\u{41}"], scan('CHAR', "?\\u{41}") + err = nil + assert_equal [], scan('CHAR', '?\\') {|*e| err = e} + assert_equal([:on_parse_error, "Invalid escape character syntax", "?\\"], err) + err = nil assert_equal [], scan('CHAR', '?\\M ') {|*e| err = e} assert_equal([:on_parse_error, "Invalid escape character syntax", "?\\M "], err) From 9dbbd0181f8c5e165f474e064c6f808050011bc8 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sat, 5 Oct 2024 15:48:52 +0900 Subject: [PATCH 700/829] Parser string encoding is always ASCII-compatible --- parse.y | 27 +++++---------------------- 1 file changed, 5 insertions(+), 22 deletions(-) diff --git a/parse.y b/parse.y index 50e32e842a5bd1..08cd4f420c69d6 100644 --- a/parse.y +++ b/parse.y @@ -2202,8 +2202,7 @@ rb_parser_enc_associate(struct parser_params *p, rb_parser_string_t *str, rb_enc { if (rb_parser_str_get_encoding(str) == enc) return str; - if (!PARSER_ENC_CODERANGE_ASCIIONLY(str) || - !rb_enc_asciicompat(enc)) { + if (!PARSER_ENC_CODERANGE_ASCIIONLY(str)) { PARSER_ENC_CODERANGE_CLEAR(str); } rb_parser_string_set_encoding(str, enc); @@ -2216,18 +2215,6 @@ rb_parser_is_ascii_string(struct parser_params *p, rb_parser_string_t *str) return rb_parser_enc_str_coderange(p, str) == RB_PARSER_ENC_CODERANGE_7BIT; } -static int -rb_parser_enc_str_asciionly_p(struct parser_params *p, rb_parser_string_t *str) -{ - rb_encoding *enc = rb_parser_str_get_encoding(str); - - if (!rb_enc_asciicompat(enc)) - return FALSE; - else if (rb_parser_is_ascii_string(p, str)) - return TRUE; - return FALSE; -} - static rb_encoding * rb_parser_enc_compatible_latter(struct parser_params *p, rb_parser_string_t *str1, rb_parser_string_t *str2, rb_encoding *enc1, rb_encoding *enc2) { @@ -2236,10 +2223,7 @@ rb_parser_enc_compatible_latter(struct parser_params *p, rb_parser_string_t *str if (PARSER_STRING_LEN(str2) == 0) return enc1; if (PARSER_STRING_LEN(str1) == 0) - return (rb_enc_asciicompat(enc1) && rb_parser_enc_str_asciionly_p(p, str2)) ? enc1 : enc2; - if (!rb_enc_asciicompat(enc1) || !rb_enc_asciicompat(enc2)) { - return 0; - } + return rb_parser_is_ascii_string(p, str2) ? enc1 : enc2; cr1 = rb_parser_enc_str_coderange(p, str1); cr2 = rb_parser_enc_str_coderange(p, str2); @@ -6991,7 +6975,6 @@ rb_parser_str_escape(struct parser_params *p, rb_parser_string_t *str) const char *prev = ptr; char charbuf[5] = {'\\', 'x', 0, 0, 0}; rb_parser_string_t * result = rb_parser_string_new(p, 0, 0); - int asciicompat = rb_enc_asciicompat(enc); while (ptr < pend) { unsigned int c; @@ -7021,7 +7004,7 @@ rb_parser_str_escape(struct parser_params *p, rb_parser_string_t *str) parser_str_cat_cstr(result, cc); prev = ptr; } - else if (asciicompat && rb_enc_isascii(c, enc) && ISPRINT(c)) { + else if (rb_enc_isascii(c, enc) && ISPRINT(c)) { } else { if (ptr - n > prev) { @@ -7703,7 +7686,7 @@ parser_str_new(struct parser_params *p, const char *ptr, long len, rb_encoding * pstr = rb_parser_encoding_string_new(p, ptr, len, enc); - if (!(func & STR_FUNC_REGEXP) && rb_enc_asciicompat(enc)) { + if (!(func & STR_FUNC_REGEXP)) { if (rb_parser_is_ascii_string(p, pstr)) { } else if (rb_is_usascii_enc((void *)enc0) && enc != rb_utf8_encoding()) { @@ -9187,7 +9170,7 @@ here_document(struct parser_params *p, rb_strterm_heredoc_t *here) } else { if ((len = p->lex.pcur - p->lex.ptok) > 0) { - if (!(func & STR_FUNC_REGEXP) && rb_enc_asciicompat(enc)) { + if (!(func & STR_FUNC_REGEXP)) { int cr = ENC_CODERANGE_UNKNOWN; rb_str_coderange_scan_restartable(p->lex.ptok, p->lex.pcur, enc, &cr); if (cr != ENC_CODERANGE_7BIT && From 4b065bbe2b3e2c5ff747cb27bb1763aa040453a3 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sat, 5 Oct 2024 16:06:54 +0900 Subject: [PATCH 701/829] Move common code to `enc_compatible_latter` --- encoding.c | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/encoding.c b/encoding.c index 222610b1d476b3..d4fe6ea1243bd9 100644 --- a/encoding.c +++ b/encoding.c @@ -1053,6 +1053,13 @@ rb_enc_check(VALUE str1, VALUE str2) static rb_encoding* enc_compatible_latter(VALUE str1, VALUE str2, int idx1, int idx2) { + if (idx1 < 0 || idx2 < 0) + return 0; + + if (idx1 == idx2) { + return rb_enc_from_index(idx1); + } + int isstr1, isstr2; rb_encoding *enc1 = rb_enc_from_index(idx1); rb_encoding *enc2 = rb_enc_from_index(idx2); @@ -1111,15 +1118,7 @@ enc_compatible_str(VALUE str1, VALUE str2) int idx1 = enc_get_index_str(str1); int idx2 = enc_get_index_str(str2); - if (idx1 < 0 || idx2 < 0) - return 0; - - if (idx1 == idx2) { - return rb_enc_from_index(idx1); - } - else { - return enc_compatible_latter(str1, str2, idx1, idx2); - } + return enc_compatible_latter(str1, str2, idx1, idx2); } rb_encoding* @@ -1128,13 +1127,6 @@ rb_enc_compatible(VALUE str1, VALUE str2) int idx1 = rb_enc_get_index(str1); int idx2 = rb_enc_get_index(str2); - if (idx1 < 0 || idx2 < 0) - return 0; - - if (idx1 == idx2) { - return rb_enc_from_index(idx1); - } - return enc_compatible_latter(str1, str2, idx1, idx2); } From f37e6d7f7b9dd0fac4fe01637a410dc4752a7ded Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sat, 5 Oct 2024 16:07:57 +0900 Subject: [PATCH 702/829] Merge `rb_parser_enc_compatible_latter` into `rb_parser_enc_compatible` --- parse.y | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/parse.y b/parse.y index 08cd4f420c69d6..b532c5ff7d14a4 100644 --- a/parse.y +++ b/parse.y @@ -2216,15 +2216,25 @@ rb_parser_is_ascii_string(struct parser_params *p, rb_parser_string_t *str) } static rb_encoding * -rb_parser_enc_compatible_latter(struct parser_params *p, rb_parser_string_t *str1, rb_parser_string_t *str2, rb_encoding *enc1, rb_encoding *enc2) +rb_parser_enc_compatible(struct parser_params *p, rb_parser_string_t *str1, rb_parser_string_t *str2) { - int cr1, cr2; + rb_encoding *enc1 = rb_parser_str_get_encoding(str1); + rb_encoding *enc2 = rb_parser_str_get_encoding(str2); + + if (enc1 == NULL || enc2 == NULL) + return 0; + + if (enc1 == enc2) { + return enc1; + } if (PARSER_STRING_LEN(str2) == 0) return enc1; if (PARSER_STRING_LEN(str1) == 0) return rb_parser_is_ascii_string(p, str2) ? enc1 : enc2; + int cr1, cr2; + cr1 = rb_parser_enc_str_coderange(p, str1); cr2 = rb_parser_enc_str_coderange(p, str2); @@ -2244,22 +2254,6 @@ rb_parser_enc_compatible_latter(struct parser_params *p, rb_parser_string_t *str return 0; } -static rb_encoding * -rb_parser_enc_compatible(struct parser_params *p, rb_parser_string_t *str1, rb_parser_string_t *str2) -{ - rb_encoding *enc1 = rb_parser_str_get_encoding(str1); - rb_encoding *enc2 = rb_parser_str_get_encoding(str2); - - if (enc1 == NULL || enc2 == NULL) - return 0; - - if (enc1 == enc2) { - return enc1; - } - - return rb_parser_enc_compatible_latter(p, str1, str2, enc1, enc2); -} - static void rb_parser_str_modify(rb_parser_string_t *str) { From d17edf3a170b733356836353508319443d12c53c Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Thu, 5 Sep 2024 22:08:41 +0900 Subject: [PATCH 703/829] [Bug #20705] Update `strtod` implementation The absence of either the integer or fractional part should be allowed. --- missing/dtoa.c | 16 ++++------------ spec/ruby/core/string/modulo_spec.rb | 4 +++- test/ruby/test_float.rb | 26 +++++++++++++------------- 3 files changed, 20 insertions(+), 26 deletions(-) diff --git a/missing/dtoa.c b/missing/dtoa.c index bce2cb22a1655c..477b212a1be682 100644 --- a/missing/dtoa.c +++ b/missing/dtoa.c @@ -1552,7 +1552,7 @@ strtod(const char *s00, char **se) aadj = 1.0; nd0 = -4; - if (!*++s || !(s1 = strchr(hexdigit, *s))) goto ret0; + if (!*++s || (!(s1 = strchr(hexdigit, *s)) && *s != '.')) goto ret0; if (*s == '0') { while (*++s == '0'); if (!*s) goto ret; @@ -1566,9 +1566,7 @@ strtod(const char *s00, char **se) } while (*++s && (s1 = strchr(hexdigit, *s))); } - if (*s == '.') { - dsign = 1; - if (!*++s || !(s1 = strchr(hexdigit, *s))) goto ret0; + if ((*s == '.') && *++s && (s1 = strchr(hexdigit, *s))) { if (nd0 < 0) { while (*s == '0') { s++; @@ -1583,9 +1581,6 @@ strtod(const char *s00, char **se) } } } - else { - dsign = 0; - } if (*s == 'P' || *s == 'p') { dsign = 0x2C - *++s; /* +: 2B, -: 2D */ @@ -1608,9 +1603,6 @@ strtod(const char *s00, char **se) } while ('0' <= c && c <= '9'); nd0 += nd * dsign; } - else { - if (dsign) goto ret0; - } dval(rv) = ldexp(adj, nd0); goto ret; } @@ -1647,9 +1639,9 @@ strtod(const char *s00, char **se) } #endif if (c == '.') { - if (!ISDIGIT(s[1])) - goto dig_done; c = *++s; + if (!ISDIGIT(c)) + goto dig_done; if (!nd) { for (; c == '0'; c = *++s) nz++; diff --git a/spec/ruby/core/string/modulo_spec.rb b/spec/ruby/core/string/modulo_spec.rb index 5d8560000c081a..8e3853551f36c1 100644 --- a/spec/ruby/core/string/modulo_spec.rb +++ b/spec/ruby/core/string/modulo_spec.rb @@ -749,6 +749,9 @@ def obj.to_s() "obj" end (format % "-10.4e-20").should == (format % -10.4e-20) (format % ".5").should == (format % 0.5) (format % "-.5").should == (format % -0.5) + ruby_bug("#20705", ""..."3.4") do + (format % "10.").should == (format % 10) + end # Something's strange with this spec: # it works just fine in individual mode, but not when run as part of a group (format % "10_1_0.5_5_5").should == (format % 1010.555) @@ -758,7 +761,6 @@ def obj.to_s() "obj" end -> { format % "" }.should raise_error(ArgumentError) -> { format % "x" }.should raise_error(ArgumentError) -> { format % "." }.should raise_error(ArgumentError) - -> { format % "10." }.should raise_error(ArgumentError) -> { format % "5x" }.should raise_error(ArgumentError) -> { format % "0b1" }.should raise_error(ArgumentError) -> { format % "10e10.5" }.should raise_error(ArgumentError) diff --git a/test/ruby/test_float.rb b/test/ruby/test_float.rb index 9f522c32bf6435..f2c56d1b41fe33 100644 --- a/test/ruby/test_float.rb +++ b/test/ruby/test_float.rb @@ -129,9 +129,9 @@ def test_strtod assert_in_delta(a, 0, Float::EPSILON) a = Float("-.0") assert_in_delta(a, 0, Float::EPSILON) - assert_raise(ArgumentError){Float("0.")} - assert_raise(ArgumentError){Float("+0.")} - assert_raise(ArgumentError){Float("-0.")} + assert_equal(0.0, Float("0.")) + assert_equal(0.0, Float("+0.")) + assert_equal(0.0, Float("-0.")) assert_raise(ArgumentError){Float(".")} assert_raise(ArgumentError){Float("+")} assert_raise(ArgumentError){Float("+.")} @@ -139,12 +139,12 @@ def test_strtod assert_raise(ArgumentError){Float("-.")} assert_raise(ArgumentError){Float("1e")} assert_raise(ArgumentError){Float("1__1")} - assert_raise(ArgumentError){Float("1.")} - assert_raise(ArgumentError){Float("1.e+00")} - assert_raise(ArgumentError){Float("0x.1")} - assert_raise(ArgumentError){Float("0x1.")} - assert_raise(ArgumentError){Float("0x1.0")} - assert_raise(ArgumentError){Float("0x1.p+0")} + assert_equal(1.0, Float("1.")) + assert_equal(1.0, Float("1.e+00")) + assert_equal(0.0625, Float("0x.1")) + assert_equal(1.0, Float("0x1.")) + assert_equal(1.0, Float("0x1.0")) + assert_equal(1.0, Float("0x1.p+0")) # add expected behaviour here. assert_equal(10, Float("1_0")) @@ -191,7 +191,7 @@ def test_strtod break end end - assert_nil(x, ->{"%a" % x}) + assert_equal(1.0, x, ->{"%a" % x}) end def test_divmod @@ -833,10 +833,10 @@ def test_Float assert_equal(15, Float('0xf')) assert_equal(15, Float('0xfp0')) assert_raise(ArgumentError) { Float('0xfp') } - assert_raise(ArgumentError) { Float('0xf.') } + assert_equal(15, Float('0xf.')) assert_raise(ArgumentError) { Float('0xf.p') } - assert_raise(ArgumentError) { Float('0xf.p0') } - assert_raise(ArgumentError) { Float('0xf.f') } + assert_equal(15, Float('0xf.p0')) + assert_equal(15.9375, Float('0xf.f')) assert_raise(ArgumentError) { Float('0xf.fp') } begin verbose_bak, $VERBOSE = $VERBOSE, nil From a6da8d69e616f6c0c937a2bf18ca3c0561a20b3d Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sun, 6 Oct 2024 00:45:46 +0900 Subject: [PATCH 704/829] [ruby/irb] Hash#inspect style has changed in ruby 3.4 [[Bug #20433]](https://bugs.ruby-lang.org/issues/20433) https://github.com/ruby/irb/commit/ecd08a527e --- test/irb/test_helper_method.rb | 3 ++- test/irb/test_irb.rb | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/test/irb/test_helper_method.rb b/test/irb/test_helper_method.rb index 291278c16a80ca..a3e2c43b2fac1c 100644 --- a/test/irb/test_helper_method.rb +++ b/test/irb/test_helper_method.rb @@ -76,7 +76,8 @@ def execute( type "exit" end - assert_include(output, '["required", "optional", ["splat"], "required", "optional", {:a=>1, :b=>2}, "block"]') + optional = {a: 1, b: 2} + assert_include(output, %[["required", "optional", ["splat"], "required", "optional", #{optional.inspect}, "block"]]) end def test_helper_method_injection_can_happen_after_irb_require diff --git a/test/irb/test_irb.rb b/test/irb/test_irb.rb index 2913f3d48ef3f4..617e9c9614b29c 100644 --- a/test/irb/test_irb.rb +++ b/test/irb/test_irb.rb @@ -155,8 +155,8 @@ def test_current_context_restore type 'exit' end - assert_include output, '{:context_changed=>true}' - assert_include output, '{:context_restored=>true}' + assert_include output, {context_changed: true}.inspect + assert_include output, {context_restored: true}.inspect end end From e6fa7c35445a60598dbe816b46a41e41ed6898d8 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sun, 6 Oct 2024 01:47:49 +0900 Subject: [PATCH 705/829] [ruby/reline] Hash#inspect style has changed in ruby 3.4 [[Bug #20433]](https://bugs.ruby-lang.org/issues/20433) https://github.com/ruby/reline/commit/ca457ffb70 --- test/reline/yamatanooroti/test_rendering.rb | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/test/reline/yamatanooroti/test_rendering.rb b/test/reline/yamatanooroti/test_rendering.rb index 6503ea325b7b2d..a9523991b75ae4 100644 --- a/test/reline/yamatanooroti/test_rendering.rb +++ b/test/reline/yamatanooroti/test_rendering.rb @@ -115,14 +115,13 @@ def test_two_fullwidth def test_finish_autowrapped_line start_terminal(10, 40, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') write("[{'user'=>{'email'=>'a@a', 'id'=>'ABC'}, 'version'=>4, 'status'=>'succeeded'}]\n") + expected = [{'user'=>{'email'=>'a@a', 'id'=>'ABC'}, 'version'=>4, 'status'=>'succeeded'}].inspect assert_screen(<<~EOC) Multiline REPL. prompt> [{'user'=>{'email'=>'a@a', 'id'= >'ABC'}, 'version'=>4, 'status'=>'succee ded'}] - => [{"user"=>{"email"=>"a@a", "id"=>"ABC - "}, "version"=>4, "status"=>"succeeded"} - ] + #{fold_multiline("=> " + expected, 40)} prompt> EOC close @@ -132,16 +131,14 @@ def test_finish_autowrapped_line_in_the_middle_of_lines start_terminal(20, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') write("[{'user'=>{'email'=>'abcdef@abcdef', 'id'=>'ABC'}, 'version'=>4, 'status'=>'succeeded'}]#{"\C-b"*7}") write("\n") + expected = [{'user'=>{'email'=>'abcdef@abcdef', 'id'=>'ABC'}, 'version'=>4, 'status'=>'succeeded'}].inspect assert_screen(<<~EOC) Multiline REPL. prompt> [{'user'=>{'email'=>'a bcdef@abcdef', 'id'=>'ABC'}, ' version'=>4, 'status'=>'succee ded'}] - => [{"user"=>{"email"=>"abcdef - @abcdef", "id"=>"ABC"}, "versi - on"=>4, "status"=>"succeeded"} - ] + #{fold_multiline("=> " + expected, 30)} prompt> EOC close @@ -1824,6 +1821,10 @@ def write_inputrc(content) f.write content end end + + def fold_multiline(str, width) + str.scan(/.{1,#{width}}/).each(&:rstrip!).join("\n") + end end rescue LoadError, NameError # On Ruby repository, this test suit doesn't run because Ruby repo doesn't From 802445487e5e0abb91811c84c220c0b58da3ca0c Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sun, 6 Oct 2024 02:02:48 +0900 Subject: [PATCH 706/829] [ruby/reline] Fix tempfile leaks (https://github.com/ruby/reline/pull/757) https://github.com/ruby/reline/actions/runs/11187507536/job/31104699331#step:13:1064 ``` Children under /tmp/rubytest.m48l5o: * -rw------- 1 101 2024-10-02 17:43:51 +0000 rubyfile20241002-60503-bhbfgq ``` https://github.com/ruby/reline/commit/1287f97a6f --- test/reline/test_reline.rb | 2 ++ test/reline/yamatanooroti/test_rendering.rb | 3 +++ 2 files changed, 5 insertions(+) diff --git a/test/reline/test_reline.rb b/test/reline/test_reline.rb index 4134beac808733..0a4f38986b0173 100644 --- a/test/reline/test_reline.rb +++ b/test/reline/test_reline.rb @@ -471,6 +471,8 @@ def test_tty_amibuous_width w.close Process.waitpid pid end + ensure + File.delete(ruby_file.path) if ruby_file end def get_reline_encoding diff --git a/test/reline/yamatanooroti/test_rendering.rb b/test/reline/yamatanooroti/test_rendering.rb index a9523991b75ae4..414bca5b7cdde5 100644 --- a/test/reline/yamatanooroti/test_rendering.rb +++ b/test/reline/yamatanooroti/test_rendering.rb @@ -1814,6 +1814,9 @@ def test_stop_continue write "\ebg" assert_screen(/>abc\n>def\n>ghi\n/) close + ensure + File.delete(rubyfile.path) if rubyfile + File.delete(pidfile.path) if pidfile end def write_inputrc(content) From a1c222801de786d8cf3b2b77cc48f22d87c026ec Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Thu, 3 Oct 2024 15:45:45 -0400 Subject: [PATCH 707/829] Non-zero exit when error in loading shared GC Before this commit, when there is an error in loading the shared GC, an error was outputted but it did not exit, causing it to segfault later on. --- gc.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/gc.c b/gc.c index 66d0565f151c7d..9760f343f8ed10 100644 --- a/gc.c +++ b/gc.c @@ -648,8 +648,6 @@ static rb_gc_function_map_t rb_gc_functions; # define RUBY_GC_LIBRARY "RUBY_GC_LIBRARY" -# define fatal(...) do {fprintf(stderr, "" __VA_ARGS__); return;} while (0) - static void ruby_external_gc_init(void) { @@ -672,7 +670,8 @@ ruby_external_gc_init(void) case '.': break; default: - fatal("Only alphanumeric, dash, underscore, and period is allowed in "RUBY_GC_LIBRARY""); + fprintf(stderr, "Only alphanumeric, dash, underscore, and period is allowed in "RUBY_GC_LIBRARY"\n"); + exit(1); } } @@ -682,7 +681,8 @@ ruby_external_gc_init(void) handle = dlopen(gc_so_path, RTLD_LAZY | RTLD_GLOBAL); if (!handle) { - fatal("ruby_external_gc_init: Shared library %s cannot be opened: %s", gc_so_path, dlerror()); + fprintf(stderr, "ruby_external_gc_init: Shared library %s cannot be opened: %s\n", gc_so_path, dlerror()); + exit(1); } } @@ -692,7 +692,8 @@ ruby_external_gc_init(void) if (handle) { \ gc_functions.name = dlsym(handle, "rb_gc_impl_" #name); \ if (!gc_functions.name) { \ - fatal("ruby_external_gc_init: " #name " func not exported by library %s", gc_so_path); \ + fprintf(stderr, "ruby_external_gc_init: " #name " func not exported by library %s\n", gc_so_path); \ + exit(1); \ } \ } \ else { \ From a6383fbe1628bdaa9ec6a30b3baa60dd7430b461 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sun, 6 Oct 2024 02:03:39 +0900 Subject: [PATCH 708/829] CI: Simplify parsey.yml --- .github/workflows/parsey.yml | 32 ++++---------------------------- 1 file changed, 4 insertions(+), 28 deletions(-) diff --git a/.github/workflows/parsey.yml b/.github/workflows/parsey.yml index 8d4e738f29ec0d..7bfcf271664678 100644 --- a/.github/workflows/parsey.yml +++ b/.github/workflows/parsey.yml @@ -30,34 +30,9 @@ jobs: strategy: matrix: include: - - test_task: test - run_opts: '--parser=parse.y' - testopts: '-v --tty=no' - timeout: 30 - - test_task: test-all - run_opts: '--parser=parse.y' - testopts: '-q --tty=no --excludes-dir="../src/test/.excludes-parsey"' - timeout: 40 - - test_task: test-spec - run_opts: '--parser=parse.y' - specopts: '-T --parser=parse.y' - timeout: 10 - - test_task: test-tool - run_opts: '--parser=parse.y' - testopts: '-v --tty=no' - timeout: 30 + - test_task: check - test_task: test-bundler-parallel - run_opts: '--parser=parse.y' - testopts: '-v --tty=no' - timeout: 50 - test_task: test-bundled-gems - run_opts: '--parser=parse.y' - testopts: '-v --tty=no' - timeout: 30 - - test_task: test-syntax-suggest - run_opts: '--parser=parse.y' - testopts: '-v --tty=no' - timeout: 30 fail-fast: false env: @@ -103,8 +78,9 @@ jobs: timeout-minutes: ${{ matrix.timeout }} env: RUBY_TESTOPTS: ${{ matrix.testopts }} - RUN_OPTS: ${{ matrix.run_opts }} - SPECOPTS: ${{ matrix.specopts }} + EXCLUDES: '../src/test/.excludes-parsey' + RUN_OPTS: ${{ matrix.run_opts || '--parser=parse.y' }} + SPECOPTS: ${{ matrix.specopts || '-T --parser=parse.y' }} TEST_BUNDLED_GEMS_ALLOW_FAILURES: 'typeprof' - uses: ./.github/actions/slack From 98620f6c5246d27fed440b8d61cdb31cd915eafa Mon Sep 17 00:00:00 2001 From: tomoya ishida Date: Sun, 6 Oct 2024 20:10:09 +0900 Subject: [PATCH 709/829] [ruby/irb] Change default completor from regexp to auto, try TypeCompletor and fallback to RegexpCompletor. (https://github.com/ruby/irb/pull/1010) https://github.com/ruby/irb/commit/bb6a99d815 --- lib/irb/context.rb | 14 ++++++++++---- lib/irb/init.rb | 2 +- test/irb/test_context.rb | 2 ++ test/irb/test_init.rb | 10 +++++++--- test/irb/test_type_completor.rb | 16 ++++++++++++++++ 5 files changed, 36 insertions(+), 8 deletions(-) diff --git a/lib/irb/context.rb b/lib/irb/context.rb index 668a823f5cb4cf..505bed80a13568 100644 --- a/lib/irb/context.rb +++ b/lib/irb/context.rb @@ -176,11 +176,17 @@ def use_loader=(val) private def build_completor completor_type = IRB.conf[:COMPLETOR] + + # Gem repl_type_completor is added to bundled gems in Ruby 3.4. + # Use :type as default completor only in Ruby 3.4 or later. + verbose = !!completor_type + completor_type ||= RUBY_VERSION >= '3.4' ? :type : :regexp + case completor_type when :regexp return RegexpCompletor.new when :type - completor = build_type_completor + completor = build_type_completor(verbose: verbose) return completor if completor else warn "Invalid value for IRB.conf[:COMPLETOR]: #{completor_type}" @@ -189,17 +195,17 @@ def use_loader=(val) RegexpCompletor.new end - private def build_type_completor + private def build_type_completor(verbose:) if RUBY_ENGINE == 'truffleruby' # Avoid SyntaxError. truffleruby does not support endless method definition yet. - warn 'TypeCompletor is not supported on TruffleRuby yet' + warn 'TypeCompletor is not supported on TruffleRuby yet' if verbose return end begin require 'repl_type_completor' rescue LoadError => e - warn "TypeCompletor requires `gem repl_type_completor`: #{e.message}" + warn "TypeCompletor requires `gem repl_type_completor`: #{e.message}" if verbose return end diff --git a/lib/irb/init.rb b/lib/irb/init.rb index 7dc08912ef92ee..d474bd41d692e4 100644 --- a/lib/irb/init.rb +++ b/lib/irb/init.rb @@ -80,7 +80,7 @@ def IRB.init_config(ap_path) @CONF[:USE_SINGLELINE] = false unless defined?(ReadlineInputMethod) @CONF[:USE_COLORIZE] = (nc = ENV['NO_COLOR']).nil? || nc.empty? @CONF[:USE_AUTOCOMPLETE] = ENV.fetch("IRB_USE_AUTOCOMPLETE", "true") != "false" - @CONF[:COMPLETOR] = ENV.fetch("IRB_COMPLETOR", "regexp").to_sym + @CONF[:COMPLETOR] = ENV["IRB_COMPLETOR"]&.to_sym @CONF[:INSPECT_MODE] = true @CONF[:USE_TRACER] = false @CONF[:USE_LOADER] = false diff --git a/test/irb/test_context.rb b/test/irb/test_context.rb index 7ad8fd2fc4a84a..9fa23cccef34f4 100644 --- a/test/irb/test_context.rb +++ b/test/irb/test_context.rb @@ -705,6 +705,8 @@ def test_irb_path_setter def test_build_completor verbose, $VERBOSE = $VERBOSE, nil original_completor = IRB.conf[:COMPLETOR] + IRB.conf[:COMPLETOR] = nil + assert_match /IRB::(Regexp|Type)Completor/, @context.send(:build_completor).class.name IRB.conf[:COMPLETOR] = :regexp assert_equal 'IRB::RegexpCompletor', @context.send(:build_completor).class.name IRB.conf[:COMPLETOR] = :unknown diff --git a/test/irb/test_init.rb b/test/irb/test_init.rb index 3e8d01c5ce03eb..f7168e02feaff2 100644 --- a/test/irb/test_init.rb +++ b/test/irb/test_init.rb @@ -167,9 +167,10 @@ def test_completor_environment_variable orig_use_autocomplete_env = ENV['IRB_COMPLETOR'] orig_use_autocomplete_conf = IRB.conf[:COMPLETOR] + # Default value is nil: auto-detect ENV['IRB_COMPLETOR'] = nil IRB.setup(__FILE__) - assert_equal(:regexp, IRB.conf[:COMPLETOR]) + assert_equal(nil, IRB.conf[:COMPLETOR]) ENV['IRB_COMPLETOR'] = 'regexp' IRB.setup(__FILE__) @@ -193,10 +194,12 @@ def test_completor_environment_variable def test_completor_setup_with_argv orig_completor_conf = IRB.conf[:COMPLETOR] + orig_completor_env = ENV['IRB_COMPLETOR'] + ENV['IRB_COMPLETOR'] = nil - # Default is :regexp + # Default value is nil: auto-detect IRB.setup(__FILE__, argv: []) - assert_equal :regexp, IRB.conf[:COMPLETOR] + assert_equal nil, IRB.conf[:COMPLETOR] IRB.setup(__FILE__, argv: ['--type-completor']) assert_equal :type, IRB.conf[:COMPLETOR] @@ -205,6 +208,7 @@ def test_completor_setup_with_argv assert_equal :regexp, IRB.conf[:COMPLETOR] ensure IRB.conf[:COMPLETOR] = orig_completor_conf + ENV['IRB_COMPLETOR'] = orig_completor_env end def test_noscript diff --git a/test/irb/test_type_completor.rb b/test/irb/test_type_completor.rb index 412d7c696d62d5..3d0e25d19e026a 100644 --- a/test/irb/test_type_completor.rb +++ b/test/irb/test_type_completor.rb @@ -27,6 +27,22 @@ def empty_binding binding end + def test_build_completor + IRB.init_config(nil) + verbose, $VERBOSE = $VERBOSE, nil + original_completor = IRB.conf[:COMPLETOR] + workspace = IRB::WorkSpace.new(Object.new) + @context = IRB::Context.new(nil, workspace, TestInputMethod.new) + IRB.conf[:COMPLETOR] = nil + expected_default_completor = RUBY_VERSION >= '3.4' ? 'IRB::TypeCompletor' : 'IRB::RegexpCompletor' + assert_equal expected_default_completor, @context.send(:build_completor).class.name + IRB.conf[:COMPLETOR] = :type + assert_equal 'IRB::TypeCompletor', @context.send(:build_completor).class.name + ensure + $VERBOSE = verbose + IRB.conf[:COMPLETOR] = original_completor + end + def assert_completion(preposing, target, binding: empty_binding, include: nil, exclude: nil) raise ArgumentError if include.nil? && exclude.nil? candidates = @completor.completion_candidates(preposing, target, '', bind: binding) From 8f5abcb0c7a81b63f8af9fc53ac7bbb48007974b Mon Sep 17 00:00:00 2001 From: tomoya ishida Date: Mon, 7 Oct 2024 08:35:03 +0900 Subject: [PATCH 710/829] [ruby/reline] Allow utf-8 safe meta key mapping in inputrc (https://github.com/ruby/reline/pull/723) Readline's convert-meta setting is utf-8 unsafe. Allow assigning `"\M-char": key` to bind "\echar": key even if convert-meta is not enabled. https://github.com/ruby/reline/commit/9844b99c6e --- lib/reline/config.rb | 48 +++++++++++++++++--------------------- test/reline/test_config.rb | 47 ++++++++++++++++++++++++++----------- 2 files changed, 55 insertions(+), 40 deletions(-) diff --git a/lib/reline/config.rb b/lib/reline/config.rb index 6aa6ba8d9418a9..e0fc37fc680114 100644 --- a/lib/reline/config.rb +++ b/lib/reline/config.rb @@ -1,7 +1,7 @@ class Reline::Config attr_reader :test_mode - KEYSEQ_PATTERN = /\\(?:C|Control)-[A-Za-z_]|\\(?:M|Meta)-[0-9A-Za-z_]|\\(?:C|Control)-(?:M|Meta)-[A-Za-z_]|\\(?:M|Meta)-(?:C|Control)-[A-Za-z_]|\\e|\\[\\\"\'abdfnrtv]|\\\d{1,3}|\\x\h{1,2}|./ + KEYSEQ_PATTERN = /\\(?:C|Control)-[A-Za-z_]|\\(?:M|Meta)-[0-9A-Za-z_]|\\(?:C|Control)-\\(?:M|Meta)-[A-Za-z_]|\\(?:M|Meta)-\\(?:C|Control)-[A-Za-z_]|\\e|\\[\\\"\'abdfnrtv]|\\\d{1,3}|\\x\h{1,2}|./ class InvalidInputrc < RuntimeError attr_accessor :file, :lineno @@ -194,13 +194,14 @@ def read_lines(lines, file = nil) # value ignores everything after a space, raw_value does not. var, value, raw_value = $1.downcase, $2.partition(' ').first, $2 bind_variable(var, value, raw_value) - next - when /\s*("#{KEYSEQ_PATTERN}+")\s*:\s*(.*)\s*$/o - key, func_name = $1, $2 - func_name = func_name.split.first - keystroke, func = bind_key(key, func_name) - next unless keystroke - @additional_key_bindings[@keymap_label].add(@keymap_prefix + keystroke, func) + when /^\s*(?:M|Meta)-([a-zA-Z_])\s*:\s*(.*)\s*$/o + bind_key("\"\\M-#$1\"", $2) + when /^\s*(?:C|Control)-([a-zA-Z_])\s*:\s*(.*)\s*$/o + bind_key("\"\\C-#$1\"", $2) + when /^\s*(?:(?:C|Control)-(?:M|Meta)|(?:M|Meta)-(?:C|Control))-([a-zA-Z_])\s*:\s*(.*)\s*$/o + bind_key("\"\\M-\\C-#$1\"", $2) + when /^\s*("#{KEYSEQ_PATTERN}+")\s*:\s*(.*)\s*$/o + bind_key($1, $2) end end unless if_stack.empty? @@ -310,7 +311,12 @@ def retrieve_string(str) parse_keyseq(str).map { |c| c.chr(Reline.encoding_system_needs) }.join end - def bind_key(key, func_name) + def bind_key(key, value) + keystroke, func = parse_key_binding(key, value) + @additional_key_bindings[@keymap_label].add(@keymap_prefix + keystroke, func) if keystroke + end + + def parse_key_binding(key, func_name) if key =~ /\A"(.*)"\z/ keyseq = parse_keyseq($1) else @@ -319,27 +325,19 @@ def bind_key(key, func_name) if func_name =~ /"(.*)"/ func = parse_keyseq($1) else - func = func_name.tr(?-, ?_).to_sym # It must be macro. + func = func_name.split.first.tr(?-, ?_).to_sym # It must be macro. end [keyseq, func] end def key_notation_to_code(notation) case notation + when /(?:\\(?:C|Control)-\\(?:M|Meta)|\\(?:M|Meta)-\\(?:C|Control))-([A-Za-z_])/ + [?\e.ord, $1.ord % 32] when /\\(?:C|Control)-([A-Za-z_])/ - (1 + $1.downcase.ord - ?a.ord) + ($1.upcase.ord % 32) when /\\(?:M|Meta)-([0-9A-Za-z_])/ - modified_key = $1 - case $1 - when /[0-9]/ - ?\M-0.bytes.first + (modified_key.ord - ?0.ord) - when /[A-Z]/ - ?\M-A.bytes.first + (modified_key.ord - ?A.ord) - when /[a-z]/ - ?\M-a.bytes.first + (modified_key.ord - ?a.ord) - end - when /\\(?:C|Control)-(?:M|Meta)-[A-Za-z_]/, /\\(?:M|Meta)-(?:C|Control)-[A-Za-z_]/ - # 129 M-^A + [?\e.ord, $1.ord] when /\\(\d{1,3})/ then $1.to_i(8) # octal when /\\x(\h{1,2})/ then $1.to_i(16) # hexadecimal when "\\e" then ?\e.ord @@ -359,11 +357,9 @@ def key_notation_to_code(notation) end def parse_keyseq(str) - ret = [] - str.scan(KEYSEQ_PATTERN) do - ret << key_notation_to_code($&) + str.scan(KEYSEQ_PATTERN).flat_map do |notation| + key_notation_to_code(notation) end - ret end def reload diff --git a/test/reline/test_config.rb b/test/reline/test_config.rb index 68a102a599cf17..878477fe5e6075 100644 --- a/test/reline/test_config.rb +++ b/test/reline/test_config.rb @@ -126,41 +126,46 @@ def test_invalid_keystroke end def test_bind_key - assert_equal ['input'.bytes, 'abcde'.bytes], @config.bind_key('"input"', '"abcde"') + assert_equal ['input'.bytes, 'abcde'.bytes], @config.parse_key_binding('"input"', '"abcde"') end def test_bind_key_with_macro - assert_equal ['input'.bytes, :abcde], @config.bind_key('"input"', 'abcde') + assert_equal ['input'.bytes, :abcde], @config.parse_key_binding('"input"', 'abcde') end def test_bind_key_with_escaped_chars - assert_equal ['input'.bytes, "\e \\ \" ' \a \b \d \f \n \r \t \v".bytes], @config.bind_key('"input"', '"\\e \\\\ \\" \\\' \\a \\b \\d \\f \\n \\r \\t \\v"') + assert_equal ['input'.bytes, "\e \\ \" ' \a \b \d \f \n \r \t \v".bytes], @config.parse_key_binding('"input"', '"\\e \\\\ \\" \\\' \\a \\b \\d \\f \\n \\r \\t \\v"') end def test_bind_key_with_ctrl_chars - assert_equal ['input'.bytes, "\C-h\C-h".bytes], @config.bind_key('"input"', '"\C-h\C-H"') - assert_equal ['input'.bytes, "\C-h\C-h".bytes], @config.bind_key('"input"', '"\Control-h\Control-H"') + assert_equal ['input'.bytes, "\C-h\C-h\C-_".bytes], @config.parse_key_binding('"input"', '"\C-h\C-H\C-_"') + assert_equal ['input'.bytes, "\C-h\C-h\C-_".bytes], @config.parse_key_binding('"input"', '"\Control-h\Control-H\Control-_"') end def test_bind_key_with_meta_chars - assert_equal ['input'.bytes, "\M-h\M-H".bytes], @config.bind_key('"input"', '"\M-h\M-H"') - assert_equal ['input'.bytes, "\M-h\M-H".bytes], @config.bind_key('"input"', '"\Meta-h\Meta-H"') + assert_equal ['input'.bytes, "\eh\eH\e_".bytes], @config.parse_key_binding('"input"', '"\M-h\M-H\M-_"') + assert_equal ['input'.bytes, "\eh\eH\e_".bytes], @config.parse_key_binding('"input"', '"\Meta-h\Meta-H\M-_"') + end + + def test_bind_key_with_ctrl_meta_chars + assert_equal ['input'.bytes, "\e\C-h\e\C-h\e\C-_".bytes], @config.parse_key_binding('"input"', '"\M-\C-h\C-\M-H\M-\C-_"') + assert_equal ['input'.bytes, "\e\C-h\e\C-_".bytes], @config.parse_key_binding('"input"', '"\Meta-\Control-h\Control-\Meta-_"') end def test_bind_key_with_octal_number input = %w{i n p u t}.map(&:ord) - assert_equal [input, "\1".bytes], @config.bind_key('"input"', '"\1"') - assert_equal [input, "\12".bytes], @config.bind_key('"input"', '"\12"') - assert_equal [input, "\123".bytes], @config.bind_key('"input"', '"\123"') - assert_equal [input, "\123".bytes + '4'.bytes], @config.bind_key('"input"', '"\1234"') + assert_equal [input, "\1".bytes], @config.parse_key_binding('"input"', '"\1"') + assert_equal [input, "\12".bytes], @config.parse_key_binding('"input"', '"\12"') + assert_equal [input, "\123".bytes], @config.parse_key_binding('"input"', '"\123"') + assert_equal [input, "\123".bytes + '4'.bytes], @config.parse_key_binding('"input"', '"\1234"') end def test_bind_key_with_hexadecimal_number input = %w{i n p u t}.map(&:ord) - assert_equal [input, "\x4".bytes], @config.bind_key('"input"', '"\x4"') - assert_equal [input, "\x45".bytes], @config.bind_key('"input"', '"\x45"') - assert_equal [input, "\x45".bytes + '6'.bytes], @config.bind_key('"input"', '"\x456"') + assert_equal [input, "\x4".bytes], @config.parse_key_binding('"input"', '"\x4"') + assert_equal [input, "\x45".bytes], @config.parse_key_binding('"input"', '"\x45"') + assert_equal [input, "\x45".bytes + '6'.bytes], @config.parse_key_binding('"input"', '"\x456"') end def test_include @@ -384,6 +389,20 @@ def test_additional_key_bindings assert_equal expected, registered_key_bindings(expected.keys) end + def test_unquoted_additional_key_bindings + @config.read_lines(<<~'LINES'.lines) + Meta-a: "Ma" + Control-b: "Cb" + Meta-Control-c: "MCc" + Control-Meta-d: "CMd" + M-C-e: "MCe" + C-M-f: "CMf" + LINES + + expected = { "\ea".bytes => 'Ma'.bytes, "\C-b".bytes => 'Cb'.bytes, "\e\C-c".bytes => 'MCc'.bytes, "\e\C-d".bytes => 'CMd'.bytes, "\e\C-e".bytes => 'MCe'.bytes, "\e\C-f".bytes => 'CMf'.bytes } + assert_equal expected, registered_key_bindings(expected.keys) + end + def test_additional_key_bindings_with_nesting_and_comment_out @config.read_lines(<<~'LINES'.lines) #"ab": "AB" From 0752fff2152c86caa67d7a0dafcfda3582fbf384 Mon Sep 17 00:00:00 2001 From: tomoya ishida Date: Mon, 7 Oct 2024 09:37:29 +0900 Subject: [PATCH 711/829] [ruby/reline] Add cursor keys for application keypad mode to default key bindings (https://github.com/ruby/reline/pull/719) * Add SS3 arrow sequence to default key bindings * Remove wrong KDE arrow sequence https://github.com/ruby/reline/commit/546a42522e --- lib/reline/io/ansi.rb | 23 ++++------------------- test/reline/test_ansi_without_terminfo.rb | 4 ---- 2 files changed, 4 insertions(+), 23 deletions(-) diff --git a/lib/reline/io/ansi.rb b/lib/reline/io/ansi.rb index 82d2ee23717c1e..cf0c1c1b3172a3 100644 --- a/lib/reline/io/ansi.rb +++ b/lib/reline/io/ansi.rb @@ -75,7 +75,10 @@ def set_bracketed_paste_key_bindings(config) def set_default_key_bindings_ansi_cursor(config) ANSI_CURSOR_KEY_BINDINGS.each do |char, (default_func, modifiers)| - bindings = [["\e[#{char}", default_func]] # CSI + char + bindings = [ + ["\e[#{char}", default_func], # CSI + char + ["\eO#{char}", default_func] # SS3 + char, application cursor key mode + ] if modifiers[:ctrl] # CSI + ctrl_key_modifier + char bindings << ["\e[1;5#{char}", modifiers[:ctrl]] @@ -123,27 +126,9 @@ def set_default_key_bindings_comprehensive_list(config) [27, 91, 49, 126] => :ed_move_to_beg, # Home [27, 91, 52, 126] => :ed_move_to_end, # End - # KDE - # Del is 0x08 - [27, 71, 65] => :ed_prev_history, # ↑ - [27, 71, 66] => :ed_next_history, # ↓ - [27, 71, 67] => :ed_next_char, # → - [27, 71, 68] => :ed_prev_char, # ← - # urxvt / exoterm [27, 91, 55, 126] => :ed_move_to_beg, # Home [27, 91, 56, 126] => :ed_move_to_end, # End - - # GNOME - [27, 79, 72] => :ed_move_to_beg, # Home - [27, 79, 70] => :ed_move_to_end, # End - # Del is 0x08 - # Arrow keys are the same of KDE - - [27, 79, 65] => :ed_prev_history, # ↑ - [27, 79, 66] => :ed_next_history, # ↓ - [27, 79, 67] => :ed_next_char, # → - [27, 79, 68] => :ed_prev_char, # ← }.each_pair do |key, func| config.add_default_key_binding_by_keymap(:emacs, key, func) config.add_default_key_binding_by_keymap(:vi_insert, key, func) diff --git a/test/reline/test_ansi_without_terminfo.rb b/test/reline/test_ansi_without_terminfo.rb index 2db14cf0a05745..62b1e7dec029c6 100644 --- a/test/reline/test_ansi_without_terminfo.rb +++ b/test/reline/test_ansi_without_terminfo.rb @@ -32,25 +32,21 @@ def test_delete def test_up_arrow assert_key_binding("\e[A", :ed_prev_history) # Console (80x25) - assert_key_binding("\eGA", :ed_prev_history) # KDE assert_key_binding("\eOA", :ed_prev_history) end def test_down_arrow assert_key_binding("\e[B", :ed_next_history) # Console (80x25) - assert_key_binding("\eGB", :ed_next_history) # KDE assert_key_binding("\eOB", :ed_next_history) end def test_right_arrow assert_key_binding("\e[C", :ed_next_char) # Console (80x25) - assert_key_binding("\eGC", :ed_next_char) # KDE assert_key_binding("\eOC", :ed_next_char) end def test_left_arrow assert_key_binding("\e[D", :ed_prev_char) # Console (80x25) - assert_key_binding("\eGD", :ed_prev_char) # KDE assert_key_binding("\eOD", :ed_prev_char) end From ec526c61c937ea03c460c91b01552629d196695a Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Mon, 7 Oct 2024 10:04:42 +0900 Subject: [PATCH 712/829] json upstream is ruby/json now --- tool/sync_default_gems.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tool/sync_default_gems.rb b/tool/sync_default_gems.rb index 2c01106af0970e..4a7a2dcb8050e3 100755 --- a/tool/sync_default_gems.rb +++ b/tool/sync_default_gems.rb @@ -35,7 +35,7 @@ module SyncDefaultGems forwardable: "ruby/forwardable", ipaddr: 'ruby/ipaddr', irb: 'ruby/irb', - json: 'flori/json', + json: 'ruby/json', logger: 'ruby/logger', open3: "ruby/open3", openssl: "ruby/openssl", From 773d140f65c1c8b726e107915bc003c186f38677 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Mon, 7 Oct 2024 11:06:44 +0900 Subject: [PATCH 713/829] [Bug #20787] Check the separator in `IO#readline` as well as 3.2 --- io.c | 18 +++++++++++++----- test/ruby/test_io.rb | 8 ++++++++ 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/io.c b/io.c index b26f71056f921d..945c5f4fd15210 100644 --- a/io.c +++ b/io.c @@ -4396,23 +4396,31 @@ rb_io_set_lineno(VALUE io, VALUE lineno) static VALUE io_readline(rb_execution_context_t *ec, VALUE io, VALUE sep, VALUE lim, VALUE chomp) { + long limit = -1; if (NIL_P(lim)) { + VALUE tmp = Qnil; // If sep is specified, but it's not a string and not nil, then assume // it's the limit (it should be an integer) - if (!NIL_P(sep) && NIL_P(rb_check_string_type(sep))) { + if (!NIL_P(sep) && NIL_P(tmp = rb_check_string_type(sep))) { // If the user has specified a non-nil / non-string value // for the separator, we assume it's the limit and set the // separator to default: rb_rs. lim = sep; + limit = NUM2LONG(lim); sep = rb_rs; } + else { + sep = tmp; + } } - - if (!NIL_P(sep)) { - StringValue(sep); + else { + if (!NIL_P(sep)) StringValue(sep); + limit = NUM2LONG(lim); } - VALUE line = rb_io_getline_1(sep, NIL_P(lim) ? -1L : NUM2LONG(lim), RTEST(chomp), io); + check_getline_args(&sep, &limit, io); + + VALUE line = rb_io_getline_1(sep, limit, RTEST(chomp), io); rb_lastline_set_up(line, 1); if (NIL_P(line)) { diff --git a/test/ruby/test_io.rb b/test/ruby/test_io.rb index 1ca05ae362f6b6..a623fd1d156387 100644 --- a/test/ruby/test_io.rb +++ b/test/ruby/test_io.rb @@ -2002,6 +2002,14 @@ def test_readline_chomp_true end end + def test_readline_incompatible_rs + first_line = File.open(__FILE__, &:gets).encode("utf-32le") + File.open(__FILE__, encoding: "utf-8:utf-32le") {|f| + assert_equal first_line, f.readline + assert_raise(ArgumentError) {f.readline("\0")} + } + end + def test_set_lineno_readline pipe(proc do |w| w.puts "foo" From 32c733f57bb91e22972319ee63eac9521d954ebc Mon Sep 17 00:00:00 2001 From: Misaki Shioi <31817032+shioimm@users.noreply.github.com> Date: Mon, 7 Oct 2024 15:28:32 +0900 Subject: [PATCH 714/829] [DOC] Add some descriptions for options of `Socket::tcp` --- ext/socket/lib/socket.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ext/socket/lib/socket.rb b/ext/socket/lib/socket.rb index d61de1e8e93f41..0832ed1783efaf 100644 --- a/ext/socket/lib/socket.rb +++ b/ext/socket/lib/socket.rb @@ -635,7 +635,9 @@ class << self # The optional last argument _opts_ is options represented by a hash. # _opts_ may have following options: # - # [:connect_timeout] specify the timeout in seconds. + # [:resolv_timeout] specify the timeout of hostname resolution in seconds. + # [:connect_timeout] specify the timeout of conncetion in seconds. + # [:fast_fallback] enable Happy Eyeballs Version 2 ({RFC 8305}[https://datatracker.ietf.org/doc/html/rfc8305]) algorithm (Enabled by default). # # If a block is given, the block is called with the socket. # The value of the block is returned. From 7081838d2a6b64308161e46296dec5dcea01f789 Mon Sep 17 00:00:00 2001 From: Holger Just Date: Mon, 7 Oct 2024 10:20:03 +0200 Subject: [PATCH 715/829] [DOC] String#sub! and String#gsub! return nil if no replacement occured --- string.c | 4 ++-- string.rb | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/string.c b/string.c index 0b3878b9b15649..e193539f4faa81 100644 --- a/string.c +++ b/string.c @@ -6092,8 +6092,8 @@ rb_pat_search(VALUE pat, VALUE str, long pos, int set_backref_str) * sub!(pattern, replacement) -> self or nil * sub!(pattern) {|match| ... } -> self or nil * - * Returns +self+ with only the first occurrence - * (not all occurrences) of the given +pattern+ replaced. + * Replaces the first occurrence (not all occurrences) of the given +pattern+ + * on +self+; returns +self+ if a replacement occurred, +nil+ otherwise. * * See {Substitution Methods}[rdoc-ref:String@Substitution+Methods]. * diff --git a/string.rb b/string.rb index 1f0e9ceace2822..941fda0c244b9f 100644 --- a/string.rb +++ b/string.rb @@ -29,9 +29,11 @@ # These methods perform substitutions: # # - String#sub: One substitution (or none); returns a new string. -# - String#sub!: One substitution (or none); returns +self+. +# - String#sub!: One substitution (or none); returns +self+ if any changes, +# +nil+ otherwise. # - String#gsub: Zero or more substitutions; returns a new string. -# - String#gsub!: Zero or more substitutions; returns +self+. +# - String#gsub!: Zero or more substitutions; returns +self+ if any changes, +# +nil+ otherwise. # # Each of these methods takes: # From 66b69d4ea553485306b683d7f965181dffca5205 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Mon, 7 Oct 2024 17:57:44 +0900 Subject: [PATCH 716/829] [DOC] Move each `Float#to_s` example item by item Like as +half+ option in Float#round. If the body of the preceding list items and the following code block are indented at the same position, the code block is parsed as a list continuation. [Fixes GH-11683] --- numeric.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/numeric.c b/numeric.c index ef7a39dc48802e..7e0e8f480f59f5 100644 --- a/numeric.c +++ b/numeric.c @@ -1047,16 +1047,15 @@ rb_float_new_in_heap(double d) * may contain: * * - A fixed-point number. + * 3.14.to_s # => "3.14" * - A number in "scientific notation" (containing an exponent). + * (10.1**50).to_s # => "1.644631821843879e+50" * - 'Infinity'. + * (10.1**500).to_s # => "Infinity" * - '-Infinity'. + * (-10.1**500).to_s # => "-Infinity" * - 'NaN' (indicating not-a-number). - * - * 3.14.to_s # => "3.14" - * (10.1**50).to_s # => "1.644631821843879e+50" - * (10.1**500).to_s # => "Infinity" - * (-10.1**500).to_s # => "-Infinity" - * (0.0/0.0).to_s # => "NaN" + * (0.0/0.0).to_s # => "NaN" * */ From dbb1abacf0538db61496cd25d9616dfa18327cd9 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Mon, 7 Oct 2024 18:45:07 +0900 Subject: [PATCH 717/829] Make rbconfig/sizeof keys as literals These keys are made from string literals, and used only as keys of hashes. --- template/limits.c.tmpl | 2 +- template/sizes.c.tmpl | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/template/limits.c.tmpl b/template/limits.c.tmpl index d1e5b44592e851..a46cf5ed63524a 100644 --- a/template/limits.c.tmpl +++ b/template/limits.c.tmpl @@ -82,7 +82,7 @@ Init_limits(void) #define MAX2NUM(name) ULONG2NUM(name ## _MAX) #define MIN2NUM(name) LONG2NUM(name ## _MIN) #endif -#define DEFINE(k, v) rb_hash_aset(h, rb_str_new_cstr(#k), v) +#define DEFINE(k, v) rb_hash_aset(h, rb_str_new_lit(#k), v) % limits.each do |type| #ifdef <%= type %>_MAX diff --git a/template/sizes.c.tmpl b/template/sizes.c.tmpl index 909902fd172ad7..d44ef378feef80 100644 --- a/template/sizes.c.tmpl +++ b/template/sizes.c.tmpl @@ -47,8 +47,8 @@ Init_sizeof(void) VALUE mRbConfig = rb_define_module("RbConfig"); rb_define_const(mRbConfig, "SIZEOF", s); -#define DEFINE(type, size) rb_hash_aset(s, rb_str_new_cstr(#type), INT2FIX(SIZEOF_##size)) -#define DEFINE_SIZE(type) rb_hash_aset(s, rb_str_new_cstr(#type), INT2FIX(sizeof(type))) +#define DEFINE(type, size) rb_hash_aset(s, rb_str_new_lit(#type), INT2FIX(SIZEOF_##size)) +#define DEFINE_SIZE(type) rb_hash_aset(s, rb_str_new_lit(#type), INT2FIX(sizeof(type))) % types.each do |type| % if sizes[type] From 67591b545ce2b4c15bcf9ef813576954d7e2bf4f Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Mon, 7 Oct 2024 19:20:08 +0900 Subject: [PATCH 718/829] Make rbconfig/sizeof keys US-ASCII --- template/limits.c.tmpl | 2 +- template/sizes.c.tmpl | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/template/limits.c.tmpl b/template/limits.c.tmpl index a46cf5ed63524a..f7867ded9a1950 100644 --- a/template/limits.c.tmpl +++ b/template/limits.c.tmpl @@ -82,7 +82,7 @@ Init_limits(void) #define MAX2NUM(name) ULONG2NUM(name ## _MAX) #define MIN2NUM(name) LONG2NUM(name ## _MIN) #endif -#define DEFINE(k, v) rb_hash_aset(h, rb_str_new_lit(#k), v) +#define DEFINE(k, v) rb_hash_aset(h, rb_usascii_str_new_lit(#k), v) % limits.each do |type| #ifdef <%= type %>_MAX diff --git a/template/sizes.c.tmpl b/template/sizes.c.tmpl index d44ef378feef80..abc3b5c90879f0 100644 --- a/template/sizes.c.tmpl +++ b/template/sizes.c.tmpl @@ -47,8 +47,8 @@ Init_sizeof(void) VALUE mRbConfig = rb_define_module("RbConfig"); rb_define_const(mRbConfig, "SIZEOF", s); -#define DEFINE(type, size) rb_hash_aset(s, rb_str_new_lit(#type), INT2FIX(SIZEOF_##size)) -#define DEFINE_SIZE(type) rb_hash_aset(s, rb_str_new_lit(#type), INT2FIX(sizeof(type))) +#define DEFINE(type, size) rb_hash_aset(s, rb_usascii_str_new_lit(#type), INT2FIX(SIZEOF_##size)) +#define DEFINE_SIZE(type) rb_hash_aset(s, rb_usascii_str_new_lit(#type), INT2FIX(sizeof(type))) % types.each do |type| % if sizes[type] From c818606d843cab19e8eab22cc3298484b38b343e Mon Sep 17 00:00:00 2001 From: Sam Bostock Date: Mon, 7 Oct 2024 07:25:55 -0400 Subject: [PATCH 719/829] [ruby/rdoc] Use normal `font-weight` for links (https://github.com/ruby/rdoc/pull/1188) https://github.com/ruby/rdoc/commit/b53f0cb2ed --- lib/rdoc/generator/template/darkfish/css/rdoc.css | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/rdoc/generator/template/darkfish/css/rdoc.css b/lib/rdoc/generator/template/darkfish/css/rdoc.css index 7a42e625223ac7..772a06b85b21e9 100644 --- a/lib/rdoc/generator/template/darkfish/css/rdoc.css +++ b/lib/rdoc/generator/template/darkfish/css/rdoc.css @@ -92,7 +92,6 @@ h6:target { color: var(--link-color); text-decoration: none; transition: color 0.3s ease; - font-weight: 600; /* Make links bolder */ } :link:hover, From ef7d7ee72309c57576d3e2f95e4364cc6c301428 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Mon, 7 Oct 2024 22:00:31 +0900 Subject: [PATCH 720/829] CI: Use full name of the label 'Documentation' Since `github.event.pull_request.labels.*.name` is an object filter, the item to be searched in needs to be the same whole string, not a partial string. --- .github/workflows/annocheck.yml | 2 +- .github/workflows/baseruby.yml | 2 +- .github/workflows/check_dependencies.yml | 2 +- .github/workflows/codeql-analysis.yml | 2 +- .github/workflows/compilers.yml | 24 ++++++++++++------------ .github/workflows/macos.yml | 2 +- .github/workflows/mingw.yml | 2 +- .github/workflows/parsey.yml | 2 +- .github/workflows/rjit-bindgen.yml | 2 +- .github/workflows/rjit.yml | 2 +- .github/workflows/spec_guards.yml | 2 +- .github/workflows/ubuntu.yml | 2 +- .github/workflows/wasm.yml | 2 +- .github/workflows/windows.yml | 2 +- .github/workflows/yjit-macos.yml | 4 ++-- .github/workflows/yjit-ubuntu.yml | 6 +++--- 16 files changed, 30 insertions(+), 30 deletions(-) diff --git a/.github/workflows/annocheck.yml b/.github/workflows/annocheck.yml index c9fefbb022b7af..8cc482c428dd8e 100644 --- a/.github/workflows/annocheck.yml +++ b/.github/workflows/annocheck.yml @@ -42,7 +42,7 @@ jobs: || contains(github.event.head_commit.message, 'Document') || contains(github.event.pull_request.title, '[DOC]') || contains(github.event.pull_request.title, 'Document') - || contains(github.event.pull_request.labels.*.name, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Documentation') || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} diff --git a/.github/workflows/baseruby.yml b/.github/workflows/baseruby.yml index 3894c85d97569e..3dbf135736a4d8 100644 --- a/.github/workflows/baseruby.yml +++ b/.github/workflows/baseruby.yml @@ -38,7 +38,7 @@ jobs: || contains(github.event.head_commit.message, 'Document') || contains(github.event.pull_request.title, '[DOC]') || contains(github.event.pull_request.title, 'Document') - || contains(github.event.pull_request.labels.*.name, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Documentation') || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} diff --git a/.github/workflows/check_dependencies.yml b/.github/workflows/check_dependencies.yml index b416b365977d6d..5536396b86e5f5 100644 --- a/.github/workflows/check_dependencies.yml +++ b/.github/workflows/check_dependencies.yml @@ -40,7 +40,7 @@ jobs: || contains(github.event.head_commit.message, 'Document') || contains(github.event.pull_request.title, '[DOC]') || contains(github.event.pull_request.title, 'Document') - || contains(github.event.pull_request.labels.*.name, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Documentation') || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 676047cc9cf3ea..ca5e815f8a1927 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -44,7 +44,7 @@ jobs: || contains(github.event.head_commit.message, 'Document') || contains(github.event.pull_request.title, '[DOC]') || contains(github.event.pull_request.title, 'Document') - || contains(github.event.pull_request.labels.*.name, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Documentation') || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} diff --git a/.github/workflows/compilers.yml b/.github/workflows/compilers.yml index 3fb3813d0cf792..785ed5a8d8e647 100644 --- a/.github/workflows/compilers.yml +++ b/.github/workflows/compilers.yml @@ -38,7 +38,7 @@ jobs: || contains(github.event.head_commit.message, 'Document') || contains(github.event.pull_request.title, '[DOC]') || contains(github.event.pull_request.title, 'Document') - || contains(github.event.pull_request.labels.*.name, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Documentation') || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } @@ -70,7 +70,7 @@ jobs: || contains(github.event.head_commit.message, 'Document') || contains(github.event.pull_request.title, '[DOC]') || contains(github.event.pull_request.title, 'Document') - || contains(github.event.pull_request.labels.*.name, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Documentation') || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } @@ -95,7 +95,7 @@ jobs: || contains(github.event.head_commit.message, 'Document') || contains(github.event.pull_request.title, '[DOC]') || contains(github.event.pull_request.title, 'Document') - || contains(github.event.pull_request.labels.*.name, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Documentation') || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } @@ -122,7 +122,7 @@ jobs: || contains(github.event.head_commit.message, 'Document') || contains(github.event.pull_request.title, '[DOC]') || contains(github.event.pull_request.title, 'Document') - || contains(github.event.pull_request.labels.*.name, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Documentation') || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } @@ -148,7 +148,7 @@ jobs: || contains(github.event.head_commit.message, 'Document') || contains(github.event.pull_request.title, '[DOC]') || contains(github.event.pull_request.title, 'Document') - || contains(github.event.pull_request.labels.*.name, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Documentation') || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } @@ -183,7 +183,7 @@ jobs: || contains(github.event.head_commit.message, 'Document') || contains(github.event.pull_request.title, '[DOC]') || contains(github.event.pull_request.title, 'Document') - || contains(github.event.pull_request.labels.*.name, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Documentation') || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } @@ -208,7 +208,7 @@ jobs: || contains(github.event.head_commit.message, 'Document') || contains(github.event.pull_request.title, '[DOC]') || contains(github.event.pull_request.title, 'Document') - || contains(github.event.pull_request.labels.*.name, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Documentation') || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } @@ -234,7 +234,7 @@ jobs: || contains(github.event.head_commit.message, 'Document') || contains(github.event.pull_request.title, '[DOC]') || contains(github.event.pull_request.title, 'Document') - || contains(github.event.pull_request.labels.*.name, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Documentation') || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } @@ -262,7 +262,7 @@ jobs: || contains(github.event.head_commit.message, 'Document') || contains(github.event.pull_request.title, '[DOC]') || contains(github.event.pull_request.title, 'Document') - || contains(github.event.pull_request.labels.*.name, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Documentation') || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } @@ -289,7 +289,7 @@ jobs: || contains(github.event.head_commit.message, 'Document') || contains(github.event.pull_request.title, '[DOC]') || contains(github.event.pull_request.title, 'Document') - || contains(github.event.pull_request.labels.*.name, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Documentation') || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } @@ -315,7 +315,7 @@ jobs: || contains(github.event.head_commit.message, 'Document') || contains(github.event.pull_request.title, '[DOC]') || contains(github.event.pull_request.title, 'Document') - || contains(github.event.pull_request.labels.*.name, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Documentation') || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } @@ -341,7 +341,7 @@ jobs: || contains(github.event.head_commit.message, 'Document') || contains(github.event.pull_request.title, '[DOC]') || contains(github.event.pull_request.title, 'Document') - || contains(github.event.pull_request.labels.*.name, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Documentation') || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} services: { docuum: { image: 'stephanmisc/docuum', options: '--init', volumes: [ '/root', '/var/run/docker.sock:/var/run/docker.sock' ] } } diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index dfdfa3c0110e90..b4543ceeb9c2c2 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -51,7 +51,7 @@ jobs: || contains(github.event.head_commit.message, 'Document') || contains(github.event.pull_request.title, '[DOC]') || contains(github.event.pull_request.title, 'Document') - || contains(github.event.pull_request.labels.*.name, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Documentation') || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} diff --git a/.github/workflows/mingw.yml b/.github/workflows/mingw.yml index 149f9fbe83f6b5..37cbfa5f385663 100644 --- a/.github/workflows/mingw.yml +++ b/.github/workflows/mingw.yml @@ -61,7 +61,7 @@ jobs: || contains(github.event.head_commit.message, 'Document') || contains(github.event.pull_request.title, '[DOC]') || contains(github.event.pull_request.title, 'Document') - || contains(github.event.pull_request.labels.*.name, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Documentation') || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} diff --git a/.github/workflows/parsey.yml b/.github/workflows/parsey.yml index 7bfcf271664678..fce8f94035855b 100644 --- a/.github/workflows/parsey.yml +++ b/.github/workflows/parsey.yml @@ -48,7 +48,7 @@ jobs: || contains(github.event.head_commit.message, 'Document') || contains(github.event.pull_request.title, '[DOC]') || contains(github.event.pull_request.title, 'Document') - || contains(github.event.pull_request.labels.*.name, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Documentation') || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} diff --git a/.github/workflows/rjit-bindgen.yml b/.github/workflows/rjit-bindgen.yml index 65ef44ee8da624..c2ec4a6a6824a1 100644 --- a/.github/workflows/rjit-bindgen.yml +++ b/.github/workflows/rjit-bindgen.yml @@ -41,7 +41,7 @@ jobs: || contains(github.event.head_commit.message, 'Document') || contains(github.event.pull_request.title, '[DOC]') || contains(github.event.pull_request.title, 'Document') - || contains(github.event.pull_request.labels.*.name, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Documentation') || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} diff --git a/.github/workflows/rjit.yml b/.github/workflows/rjit.yml index 9cec3bcd86979d..12e6b94b53ff9f 100644 --- a/.github/workflows/rjit.yml +++ b/.github/workflows/rjit.yml @@ -50,7 +50,7 @@ jobs: || contains(github.event.head_commit.message, 'Document') || contains(github.event.pull_request.title, '[DOC]') || contains(github.event.pull_request.title, 'Document') - || contains(github.event.pull_request.labels.*.name, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Documentation') || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} diff --git a/.github/workflows/spec_guards.yml b/.github/workflows/spec_guards.yml index 86abe44034ca94..321099f024a890 100644 --- a/.github/workflows/spec_guards.yml +++ b/.github/workflows/spec_guards.yml @@ -30,7 +30,7 @@ jobs: || contains(github.event.head_commit.message, 'Document') || contains(github.event.pull_request.title, '[DOC]') || contains(github.event.pull_request.title, 'Document') - || contains(github.event.pull_request.labels.*.name, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Documentation') || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu.yml index e8295961658731..750944e754ed30 100644 --- a/.github/workflows/ubuntu.yml +++ b/.github/workflows/ubuntu.yml @@ -57,7 +57,7 @@ jobs: || contains(github.event.head_commit.message, 'Document') || contains(github.event.pull_request.title, '[DOC]') || contains(github.event.pull_request.title, 'Document') - || contains(github.event.pull_request.labels.*.name, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Documentation') || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} diff --git a/.github/workflows/wasm.yml b/.github/workflows/wasm.yml index dac107c57b1a4e..4810cd6d0b36fa 100644 --- a/.github/workflows/wasm.yml +++ b/.github/workflows/wasm.yml @@ -56,7 +56,7 @@ jobs: || contains(github.event.head_commit.message, 'Document') || contains(github.event.pull_request.title, '[DOC]') || contains(github.event.pull_request.title, 'Document') - || contains(github.event.pull_request.labels.*.name, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Documentation') || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index e821883157cad0..61ce6b9efedf2f 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -40,7 +40,7 @@ jobs: || contains(github.event.head_commit.message, 'Document') || contains(github.event.pull_request.title, '[DOC]') || contains(github.event.pull_request.title, 'Document') - || contains(github.event.pull_request.labels.*.name, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Documentation') || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} diff --git a/.github/workflows/yjit-macos.yml b/.github/workflows/yjit-macos.yml index 9c1e75a95da6aa..e93981f3792df8 100644 --- a/.github/workflows/yjit-macos.yml +++ b/.github/workflows/yjit-macos.yml @@ -32,7 +32,7 @@ jobs: || contains(github.event.head_commit.message, 'Document') || contains(github.event.pull_request.title, '[DOC]') || contains(github.event.pull_request.title, 'Document') - || contains(github.event.pull_request.labels.*.name, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Documentation') || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} @@ -76,7 +76,7 @@ jobs: || contains(github.event.head_commit.message, 'Document') || contains(github.event.pull_request.title, '[DOC]') || contains(github.event.pull_request.title, 'Document') - || contains(github.event.pull_request.labels.*.name, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Documentation') || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} diff --git a/.github/workflows/yjit-ubuntu.yml b/.github/workflows/yjit-ubuntu.yml index d67ea8d49e69b0..7b7ec644a2e75e 100644 --- a/.github/workflows/yjit-ubuntu.yml +++ b/.github/workflows/yjit-ubuntu.yml @@ -31,7 +31,7 @@ jobs: ${{!(false || contains(github.event.head_commit.message, '[DOC]') || contains(github.event.pull_request.title, '[DOC]') - || contains(github.event.pull_request.labels.*.name, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Documentation') || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} @@ -63,7 +63,7 @@ jobs: ${{!(false || contains(github.event.head_commit.message, '[DOC]') || contains(github.event.pull_request.title, '[DOC]') - || contains(github.event.pull_request.labels.*.name, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Documentation') || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} @@ -122,7 +122,7 @@ jobs: || contains(github.event.head_commit.message, 'Document') || contains(github.event.pull_request.title, '[DOC]') || contains(github.event.pull_request.title, 'Document') - || contains(github.event.pull_request.labels.*.name, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Documentation') || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} From 9ee0e1127481021562a03c43b20c6e3af7c5f2f5 Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Sat, 5 Oct 2024 16:59:54 -0400 Subject: [PATCH 721/829] Mention `Hash#inspect` changes in NEWS.md This will likely cause some incompatibilities in various projects we should try to make it as clear as possible for the next preview release. --- NEWS.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/NEWS.md b/NEWS.md index a09437fda2bbda..bb9fd2ffa13d9a 100644 --- a/NEWS.md +++ b/NEWS.md @@ -141,6 +141,10 @@ See GitHub releases like [GitHub Releases of Logger](https://github.com/ruby/log from test.rb:2:in `
' ``` +* `Hash#inspect` rendering have been changed. [[Bug #20433]] + * Symbol keys are displayed using the modern symbol key syntax: `"{user: 1}"` + * Other keys now have spaces around `=>`: `'{"user" => 1}'`, while previously they didn't: `'{"user"=>1}'` + ## Stdlib compatibility issues ## C API updates @@ -180,6 +184,7 @@ See GitHub releases like [GitHub Releases of Logger](https://github.com/ruby/log [Bug #20218]: https://bugs.ruby-lang.org/issues/20218 [Feature #20265]: https://bugs.ruby-lang.org/issues/20265 [Feature #20429]: https://bugs.ruby-lang.org/issues/20429 +[Bug #20433]: https://bugs.ruby-lang.org/issues/20433 [Feature #20443]: https://bugs.ruby-lang.org/issues/20443 [Feature #20497]: https://bugs.ruby-lang.org/issues/20497 [Feature #20624]: https://bugs.ruby-lang.org/issues/20624 From 216d087f50de719d551592e589f7ecece00570da Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Sat, 5 Oct 2024 13:58:34 -0400 Subject: [PATCH 722/829] Disable -Wunused-function for shared GC in gc/gc.h Shared GC might not use the private functions in gc/gc.h, so they will show up as warnings for unused functions. This commit disables -Wunused-function for these functions when building as shared GC. --- gc/gc.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/gc/gc.h b/gc/gc.h index b4da013c1a8e52..d5b07faf9270d9 100644 --- a/gc/gc.h +++ b/gc/gc.h @@ -49,6 +49,11 @@ void rb_ractor_finish_marking(void); // -------------------Private section begin------------------------ // Functions in this section are private to the default GC and gc.c +#ifdef BUILDING_SHARED_GC +RBIMPL_WARNING_PUSH() +RBIMPL_WARNING_IGNORED(-Wunused-function) +#endif + /* RGENGC_CHECK_MODE * 0: disable all assertions * 1: enable assertions (to debug RGenGC) @@ -180,6 +185,10 @@ type_sym(size_t type) default: return SIZET2NUM(type); break; } } + +#ifdef BUILDING_SHARED_GC +RBIMPL_WARNING_POP() +#endif // -------------------Private section end------------------------ #endif From fa547b809aba50da72c9145904b5605481fdce3e Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Mon, 7 Oct 2024 10:02:19 -0400 Subject: [PATCH 723/829] [ruby/prism] Fix up errors on invalid escape character syntax https://github.com/ruby/prism/commit/14c8559378 --- prism/prism.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/prism/prism.c b/prism/prism.c index 24023525e5d785..76a1758f3835cc 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -9885,6 +9885,10 @@ escape_read(pm_parser_t *parser, pm_buffer_t *buffer, pm_buffer_t *regular_expre } case 'c': { parser->current.end++; + if (flags & PM_ESCAPE_FLAG_CONTROL) { + pm_parser_err_current(parser, PM_ERR_ESCAPE_INVALID_CONTROL_REPEAT); + } + if (parser->current.end == parser->end) { pm_parser_err_current(parser, PM_ERR_ESCAPE_INVALID_CONTROL); return; @@ -9898,10 +9902,6 @@ escape_read(pm_parser_t *parser, pm_buffer_t *buffer, pm_buffer_t *regular_expre return; } case '\\': - if (flags & PM_ESCAPE_FLAG_CONTROL) { - pm_parser_err_current(parser, PM_ERR_ESCAPE_INVALID_CONTROL_REPEAT); - return; - } parser->current.end++; if (match(parser, 'u') || match(parser, 'U')) { @@ -9935,6 +9935,10 @@ escape_read(pm_parser_t *parser, pm_buffer_t *buffer, pm_buffer_t *regular_expre } case 'C': { parser->current.end++; + if (flags & PM_ESCAPE_FLAG_CONTROL) { + pm_parser_err_current(parser, PM_ERR_ESCAPE_INVALID_CONTROL_REPEAT); + } + if (peek(parser) != '-') { size_t width = parser->encoding->char_width(parser->current.end, parser->end - parser->current.end); pm_parser_err(parser, parser->current.start, parser->current.end + width, PM_ERR_ESCAPE_INVALID_CONTROL); @@ -9955,10 +9959,6 @@ escape_read(pm_parser_t *parser, pm_buffer_t *buffer, pm_buffer_t *regular_expre return; } case '\\': - if (flags & PM_ESCAPE_FLAG_CONTROL) { - pm_parser_err_current(parser, PM_ERR_ESCAPE_INVALID_CONTROL_REPEAT); - return; - } parser->current.end++; if (match(parser, 'u') || match(parser, 'U')) { @@ -9993,6 +9993,10 @@ escape_read(pm_parser_t *parser, pm_buffer_t *buffer, pm_buffer_t *regular_expre } case 'M': { parser->current.end++; + if (flags & PM_ESCAPE_FLAG_META) { + pm_parser_err_current(parser, PM_ERR_ESCAPE_INVALID_META_REPEAT); + } + if (peek(parser) != '-') { size_t width = parser->encoding->char_width(parser->current.end, parser->end - parser->current.end); pm_parser_err(parser, parser->current.start, parser->current.end + width, PM_ERR_ESCAPE_INVALID_META); @@ -10008,10 +10012,6 @@ escape_read(pm_parser_t *parser, pm_buffer_t *buffer, pm_buffer_t *regular_expre uint8_t peeked = peek(parser); switch (peeked) { case '\\': - if (flags & PM_ESCAPE_FLAG_META) { - pm_parser_err_current(parser, PM_ERR_ESCAPE_INVALID_META_REPEAT); - return; - } parser->current.end++; if (match(parser, 'u') || match(parser, 'U')) { @@ -10054,6 +10054,8 @@ escape_read(pm_parser_t *parser, pm_buffer_t *buffer, pm_buffer_t *regular_expre default: { if (parser->current.end < parser->end) { escape_write_escape_encoded(parser, buffer); + } else { + pm_parser_err_current(parser, PM_ERR_INVALID_ESCAPE_CHARACTER); } return; } From a6cf1324759a64d43ca9707c20316cf681038240 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Mon, 7 Oct 2024 10:47:30 -0400 Subject: [PATCH 724/829] Revert "Add debugging code to vm_objtostring in ASAN" This reverts commit c32fd1b5ed6709dfbed3d19cac881886576e231b. The bug seems to have been fixed with 6acf03618a937f5302fbd3043f9c3420a49f8cb3. --- vm_insnhelper.c | 7 ------- 1 file changed, 7 deletions(-) diff --git a/vm_insnhelper.c b/vm_insnhelper.c index bd616b2422ca56..543f31a3b1f56e 100644 --- a/vm_insnhelper.c +++ b/vm_insnhelper.c @@ -6056,13 +6056,6 @@ VALUE rb_mod_name(VALUE); static VALUE vm_objtostring(const rb_iseq_t *iseq, VALUE recv, CALL_DATA cd) { - // Debugging code for ASAN issues such as: - // http://ci.rvm.jp/logfiles/brlog.trunk_asan.20240922-002945 - if (!RB_IMMEDIATE_P(recv) && asan_poisoned_object_p(recv)) { - asan_unpoison_object(recv, false); - rb_bug("vm_objtostring: recv is poisoned (type %d)", TYPE(recv)); - } - int type = TYPE(recv); if (type == T_STRING) { return recv; From b8c8529dcfcd0c5bc76f4efdeab9b98100f2ead7 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Mon, 7 Oct 2024 11:30:47 -0400 Subject: [PATCH 725/829] [ruby/prism] Fix up unary * binding power https://github.com/ruby/prism/commit/c1d23d4702 --- prism/prism.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prism/prism.c b/prism/prism.c index 76a1758f3835cc..f19b0392dffd86 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -12991,7 +12991,7 @@ pm_binding_powers_t pm_binding_powers[PM_TOKEN_MAXIMUM] = { [PM_TOKEN_PERCENT] = LEFT_ASSOCIATIVE(PM_BINDING_POWER_FACTOR), [PM_TOKEN_SLASH] = LEFT_ASSOCIATIVE(PM_BINDING_POWER_FACTOR), [PM_TOKEN_STAR] = LEFT_ASSOCIATIVE(PM_BINDING_POWER_FACTOR), - [PM_TOKEN_USTAR] = LEFT_ASSOCIATIVE(PM_BINDING_POWER_FACTOR), + [PM_TOKEN_USTAR] = RIGHT_ASSOCIATIVE_UNARY(PM_BINDING_POWER_FACTOR), // -@ [PM_TOKEN_UMINUS] = RIGHT_ASSOCIATIVE_UNARY(PM_BINDING_POWER_UMINUS), From 8d359644e7a71c4835b8f385c308571a7a8baf7f Mon Sep 17 00:00:00 2001 From: Andrew Konchin Date: Mon, 7 Oct 2024 15:36:36 +0300 Subject: [PATCH 726/829] [ruby/prism] Set contains_keywords flag for implicit gets($/, chomp: true) method call to handle -l CLI option https://github.com/ruby/prism/commit/717e41c87d --- prism/prism.c | 1 + test/prism/api/command_line_test.rb | 3 +++ 2 files changed, 4 insertions(+) diff --git a/prism/prism.c b/prism/prism.c index f19b0392dffd86..e3b1754d3960af 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -21906,6 +21906,7 @@ wrap_statements(pm_parser_t *parser, pm_statements_node_t *statements) { )); pm_arguments_node_arguments_append(arguments, (pm_node_t *) keywords); + pm_node_flag_set((pm_node_t *) arguments, PM_ARGUMENTS_NODE_FLAGS_CONTAINS_KEYWORDS); } pm_statements_node_t *wrapped_statements = pm_statements_node_create(parser); diff --git a/test/prism/api/command_line_test.rb b/test/prism/api/command_line_test.rb index a8c43551522c07..e53d18703a4dff 100644 --- a/test/prism/api/command_line_test.rb +++ b/test/prism/api/command_line_test.rb @@ -52,6 +52,9 @@ def test_command_line_l assert_kind_of CallNode, predicate assert_equal :gets, predicate.name + arguments = predicate.arguments + assert arguments.contains_keywords? + arguments = predicate.arguments.arguments assert_equal 2, arguments.length assert_equal :$/, arguments.first.name From a90861340ae6799ae9dcd75a14b451cae433cefe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Mon, 30 Sep 2024 12:36:40 +0200 Subject: [PATCH 727/829] [rubygems/rubygems] Fix `bundle.bat` re-execution It does not have ruby code, so we should not prepend `ruby` to the command the re-execute it. https://github.com/rubygems/rubygems/commit/e04e00f7bb --- lib/bundler/self_manager.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/bundler/self_manager.rb b/lib/bundler/self_manager.rb index 6ab41b99f7fa0d..21516713d46c76 100644 --- a/lib/bundler/self_manager.rb +++ b/lib/bundler/self_manager.rb @@ -85,7 +85,7 @@ def restart_with(version) cmd = [*Shellwords.shellsplit(bundler_spec_original_cmd), *ARGV] else cmd = [$PROGRAM_NAME, *ARGV] - cmd.unshift(Gem.ruby) unless File.executable?($PROGRAM_NAME) + cmd.unshift(Gem.ruby) unless File.executable?($PROGRAM_NAME) || $PROGRAM_NAME.end_with?(".bat") end Bundler.with_original_env do From 8d1906e8b723c8721c7b7f8d983b88a8fa3f8395 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Mon, 7 Oct 2024 12:27:52 -0400 Subject: [PATCH 728/829] [ruby/prism] Handle invalid commas in arguments, parameters, and arrays https://github.com/ruby/prism/commit/023e894b74 --- prism/config.yml | 1 + prism/prism.c | 109 +++++++++++------- prism/templates/src/diagnostic.c.erb | 1 + test/prism/errors/arguments_invalid_comma.txt | 4 + test/prism/errors/array_invalid_comma.txt | 4 + .../prism/errors/parameters_invalid_comma.txt | 4 + 6 files changed, 84 insertions(+), 39 deletions(-) create mode 100644 test/prism/errors/arguments_invalid_comma.txt create mode 100644 test/prism/errors/array_invalid_comma.txt create mode 100644 test/prism/errors/parameters_invalid_comma.txt diff --git a/prism/config.yml b/prism/config.yml index 972f1e8e69a52f..8bf621508f4627 100644 --- a/prism/config.yml +++ b/prism/config.yml @@ -141,6 +141,7 @@ errors: - INSTANCE_VARIABLE_BARE - INVALID_BLOCK_EXIT - INVALID_CHARACTER + - INVALID_COMMA - INVALID_ENCODING_MAGIC_COMMENT - INVALID_ESCAPE_CHARACTER - INVALID_FLOAT_EXPONENT diff --git a/prism/prism.c b/prism/prism.c index e3b1754d3960af..b88c99c6591e39 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -2107,14 +2107,6 @@ pm_array_node_create(pm_parser_t *parser, const pm_token_t *opening) { return node; } -/** - * Return the size of the given array node. - */ -static inline size_t -pm_array_node_size(pm_array_node_t *node) { - return node->elements.size; -} - /** * Append an argument to an array node. */ @@ -14121,8 +14113,8 @@ static void parse_arguments(pm_parser_t *parser, pm_arguments_t *arguments, bool accepts_forwarding, pm_token_type_t terminator, uint16_t depth) { pm_binding_power_t binding_power = pm_binding_powers[parser->current.type].left; - // First we need to check if the next token is one that could be the start of - // an argument. If it's not, then we can just return. + // First we need to check if the next token is one that could be the start + // of an argument. If it's not, then we can just return. if ( match2(parser, terminator, PM_TOKEN_EOF) || (binding_power != PM_BINDING_POWER_UNSET && binding_power < PM_BINDING_POWER_RANGE) || @@ -14309,23 +14301,32 @@ parse_arguments(pm_parser_t *parser, pm_arguments_t *arguments, bool accepts_for // If parsing the argument failed, we need to stop parsing arguments. if (PM_NODE_TYPE_P(argument, PM_MISSING_NODE) || parser->recovering) break; - // If the terminator of these arguments is not EOF, then we have a specific - // token we're looking for. In that case we can accept a newline here - // because it is not functioning as a statement terminator. - if (terminator != PM_TOKEN_EOF) accept1(parser, PM_TOKEN_NEWLINE); + // If the terminator of these arguments is not EOF, then we have a + // specific token we're looking for. In that case we can accept a + // newline here because it is not functioning as a statement terminator. + bool accepted_newline = false; + if (terminator != PM_TOKEN_EOF) { + accepted_newline = accept1(parser, PM_TOKEN_NEWLINE); + } if (parser->previous.type == PM_TOKEN_COMMA && parsed_bare_hash) { - // If we previously were on a comma and we just parsed a bare hash, then - // we want to continue parsing arguments. This is because the comma was - // grabbed up by the hash parser. + // If we previously were on a comma and we just parsed a bare hash, + // then we want to continue parsing arguments. This is because the + // comma was grabbed up by the hash parser. + } else if (accept1(parser, PM_TOKEN_COMMA)) { + // If there was a comma, then we need to check if we also accepted a + // newline. If we did, then this is a syntax error. + if (accepted_newline) { + pm_parser_err_previous(parser, PM_ERR_INVALID_COMMA); + } } else { - // If there is no comma at the end of the argument list then we're done - // parsing arguments and can break out of this loop. - if (!accept1(parser, PM_TOKEN_COMMA)) break; + // If there is no comma at the end of the argument list then we're + // done parsing arguments and can break out of this loop. + break; } - // If we hit the terminator, then that means we have a trailing comma so we - // can accept that output as well. + // If we hit the terminator, then that means we have a trailing comma so + // we can accept that output as well. if (match1(parser, terminator)) break; } } @@ -14482,13 +14483,14 @@ parse_parameters( bool accepts_blocks_in_defaults, uint16_t depth ) { - pm_parameters_node_t *params = pm_parameters_node_create(parser); - bool looping = true; - pm_do_loop_stack_push(parser, false); + + pm_parameters_node_t *params = pm_parameters_node_create(parser); pm_parameters_order_t order = PM_PARAMETERS_ORDER_NONE; - do { + while (true) { + bool parsing = true; + switch (parser->current.type) { case PM_TOKEN_PARENTHESIS_LEFT: { update_parameter_state(parser, &parser->current, &order); @@ -14623,7 +14625,7 @@ parse_parameters( // then we can put a missing node in its place and stop parsing the // parameters entirely now. if (parser->recovering) { - looping = false; + parsing = false; break; } } else if (order > PM_PARAMETERS_ORDER_AFTER_OPTIONAL) { @@ -14681,7 +14683,7 @@ parse_parameters( context_pop(parser); if (uses_parentheses) { - looping = false; + parsing = false; break; } @@ -14725,7 +14727,7 @@ parse_parameters( // then we can put a missing node in its place and stop parsing the // parameters entirely now. if (parser->recovering) { - looping = false; + parsing = false; break; } } @@ -14827,14 +14829,31 @@ parse_parameters( } } - looping = false; + parsing = false; break; } - if (looping && uses_parentheses) { - accept1(parser, PM_TOKEN_NEWLINE); + // If we hit some kind of issue while parsing the parameter, this would + // have been set to false. In that case, we need to break out of the + // loop. + if (!parsing) break; + + bool accepted_newline = false; + if (uses_parentheses) { + accepted_newline = accept1(parser, PM_TOKEN_NEWLINE); + } + + if (accept1(parser, PM_TOKEN_COMMA)) { + // If there was a comma, but we also accepted a newline, then this + // is a syntax error. + if (accepted_newline) { + pm_parser_err_previous(parser, PM_ERR_INVALID_COMMA); + } + } else { + // If there was no comma, then we're done parsing parameters. + break; } - } while (looping && accept1(parser, PM_TOKEN_COMMA)); + } pm_do_loop_stack_pop(parser); @@ -17973,19 +17992,31 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b bool parsed_bare_hash = false; while (!match2(parser, PM_TOKEN_BRACKET_RIGHT, PM_TOKEN_EOF)) { + bool accepted_newline = accept1(parser, PM_TOKEN_NEWLINE); + // Handle the case where we don't have a comma and we have a // newline followed by a right bracket. - if (accept1(parser, PM_TOKEN_NEWLINE) && match1(parser, PM_TOKEN_BRACKET_RIGHT)) { + if (accepted_newline && match1(parser, PM_TOKEN_BRACKET_RIGHT)) { break; } // Ensure that we have a comma between elements in the array. - if ((pm_array_node_size(array) != 0) && !accept1(parser, PM_TOKEN_COMMA)) { - const uint8_t *location = parser->previous.end; - PM_PARSER_ERR_FORMAT(parser, location, location, PM_ERR_ARRAY_SEPARATOR, pm_token_type_human(parser->current.type)); + if (array->elements.size > 0) { + if (accept1(parser, PM_TOKEN_COMMA)) { + // If there was a comma but we also accepts a newline, + // then this is a syntax error. + if (accepted_newline) { + pm_parser_err_previous(parser, PM_ERR_INVALID_COMMA); + } + } else { + // If there was no comma, then we need to add a syntax + // error. + const uint8_t *location = parser->previous.end; + PM_PARSER_ERR_FORMAT(parser, location, location, PM_ERR_ARRAY_SEPARATOR, pm_token_type_human(parser->current.type)); - parser->previous.start = location; - parser->previous.type = PM_TOKEN_MISSING; + parser->previous.start = location; + parser->previous.type = PM_TOKEN_MISSING; + } } // If we have a right bracket immediately following a comma, diff --git a/prism/templates/src/diagnostic.c.erb b/prism/templates/src/diagnostic.c.erb index d2b7b4f691ec9a..c0ec69652f37c7 100644 --- a/prism/templates/src/diagnostic.c.erb +++ b/prism/templates/src/diagnostic.c.erb @@ -223,6 +223,7 @@ static const pm_diagnostic_data_t diagnostic_messages[PM_DIAGNOSTIC_ID_MAX] = { [PM_ERR_INCOMPLETE_VARIABLE_INSTANCE] = { "'%.*s' is not allowed as an instance variable name", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_INSTANCE_VARIABLE_BARE] = { "'@' without identifiers is not allowed as an instance variable name", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_INVALID_BLOCK_EXIT] = { "Invalid %s", PM_ERROR_LEVEL_SYNTAX }, + [PM_ERR_INVALID_COMMA] = { "invalid comma", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_INVALID_ESCAPE_CHARACTER] = { "Invalid escape character syntax", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_INVALID_FLOAT_EXPONENT] = { "invalid exponent", PM_ERROR_LEVEL_SYNTAX }, [PM_ERR_INVALID_LOCAL_VARIABLE_READ] = { "identifier %.*s is not valid to get", PM_ERROR_LEVEL_SYNTAX }, diff --git a/test/prism/errors/arguments_invalid_comma.txt b/test/prism/errors/arguments_invalid_comma.txt new file mode 100644 index 00000000000000..4e1360580c4982 --- /dev/null +++ b/test/prism/errors/arguments_invalid_comma.txt @@ -0,0 +1,4 @@ +p(a,b +,) +^ invalid comma + diff --git a/test/prism/errors/array_invalid_comma.txt b/test/prism/errors/array_invalid_comma.txt new file mode 100644 index 00000000000000..2f52a253e0fbe9 --- /dev/null +++ b/test/prism/errors/array_invalid_comma.txt @@ -0,0 +1,4 @@ +[a +,] +^ invalid comma + diff --git a/test/prism/errors/parameters_invalid_comma.txt b/test/prism/errors/parameters_invalid_comma.txt new file mode 100644 index 00000000000000..2d22f7ca76e6dc --- /dev/null +++ b/test/prism/errors/parameters_invalid_comma.txt @@ -0,0 +1,4 @@ +def f(a +,b);end +^ invalid comma + From 35711903f239e462da682929982f434ee45c2199 Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Mon, 7 Oct 2024 10:07:23 -0700 Subject: [PATCH 729/829] YJIT: Add --yjit-mem-size option (#11810) * YJIT: Add --yjit-mem-size option * Improve --help * s/the region/this virtual memory region/ Co-authored-by: Maxime Chevalier-Boisvert --------- Co-authored-by: Maxime Chevalier-Boisvert --- doc/yjit/yjit.md | 3 ++- yjit/src/asm/mod.rs | 4 ++-- yjit/src/codegen.rs | 11 ++++++----- yjit/src/options.rs | 36 +++++++++++++++++++++++++++++------- yjit/src/stats.rs | 7 ++++++- yjit/src/virtualmem.rs | 22 +++++++++++++++++----- 6 files changed, 62 insertions(+), 21 deletions(-) diff --git a/doc/yjit/yjit.md b/doc/yjit/yjit.md index c63d31b64f5924..906a827d51d1ba 100644 --- a/doc/yjit/yjit.md +++ b/doc/yjit/yjit.md @@ -166,7 +166,8 @@ The machine code generated for a given method can be printed by adding `puts Rub YJIT supports all command-line options supported by upstream CRuby, but also adds a few YJIT-specific options: - `--yjit`: enable YJIT (disabled by default) -- `--yjit-exec-mem-size=N`: size of the executable memory block to allocate, in MiB (default 48 MiB) +- `--yjit-mem-size=N`: soft limit on YJIT memory usage in MiB (default: 128). Tries to limit `code_region_size + yjit_alloc_size` +- `--yjit-exec-mem-size=N`: hard limit on executable memory block in MiB. Limits `code_region_size` - `--yjit-call-threshold=N`: number of calls after which YJIT begins to compile a function. It defaults to 30, and it's then increased to 120 when the number of ISEQs in the process reaches 40,000. - `--yjit-cold-threshold=N`: number of global calls after which an ISEQ is considered cold and not diff --git a/yjit/src/asm/mod.rs b/yjit/src/asm/mod.rs index a113a41c739949..ed6feb3174dc98 100644 --- a/yjit/src/asm/mod.rs +++ b/yjit/src/asm/mod.rs @@ -686,7 +686,7 @@ impl CodeBlock { let alloc = TestingAllocator::new(mem_size); let mem_start: *const u8 = alloc.mem_start(); - let virt_mem = VirtualMem::new(alloc, 1, NonNull::new(mem_start as *mut u8).unwrap(), mem_size); + let virt_mem = VirtualMem::new(alloc, 1, NonNull::new(mem_start as *mut u8).unwrap(), mem_size, 128 * 1024 * 1024); Self::new(Rc::new(RefCell::new(virt_mem)), false, Rc::new(None), true) } @@ -704,7 +704,7 @@ impl CodeBlock { let alloc = TestingAllocator::new(mem_size); let mem_start: *const u8 = alloc.mem_start(); - let virt_mem = VirtualMem::new(alloc, 1, NonNull::new(mem_start as *mut u8).unwrap(), mem_size); + let virt_mem = VirtualMem::new(alloc, 1, NonNull::new(mem_start as *mut u8).unwrap(), mem_size, 128 * 1024 * 1024); Self::new(Rc::new(RefCell::new(virt_mem)), false, Rc::new(Some(freed_pages)), true) } diff --git a/yjit/src/codegen.rs b/yjit/src/codegen.rs index d3aac992aa5c41..746a46903ccd3c 100644 --- a/yjit/src/codegen.rs +++ b/yjit/src/codegen.rs @@ -10504,11 +10504,11 @@ impl CodegenGlobals { /// Initialize the codegen globals pub fn init() { // Executable memory and code page size in bytes - let mem_size = get_option!(exec_mem_size); + let exec_mem_size = get_option!(exec_mem_size).unwrap_or(get_option!(mem_size)); #[cfg(not(test))] let (mut cb, mut ocb) = { - let virt_block: *mut u8 = unsafe { rb_yjit_reserve_addr_space(mem_size as u32) }; + let virt_block: *mut u8 = unsafe { rb_yjit_reserve_addr_space(exec_mem_size as u32) }; // Memory protection syscalls need page-aligned addresses, so check it here. Assuming // `virt_block` is page-aligned, `second_half` should be page-aligned as long as the @@ -10530,7 +10530,8 @@ impl CodegenGlobals { SystemAllocator {}, page_size, NonNull::new(virt_block).unwrap(), - mem_size, + exec_mem_size, + get_option!(mem_size), ); let mem_block = Rc::new(RefCell::new(mem_block)); @@ -10546,9 +10547,9 @@ impl CodegenGlobals { // In test mode we're not linking with the C code // so we don't allocate executable memory #[cfg(test)] - let mut cb = CodeBlock::new_dummy(mem_size / 2); + let mut cb = CodeBlock::new_dummy(exec_mem_size / 2); #[cfg(test)] - let mut ocb = OutlinedCb::wrap(CodeBlock::new_dummy(mem_size / 2)); + let mut ocb = OutlinedCb::wrap(CodeBlock::new_dummy(exec_mem_size / 2)); let ocb_start_addr = ocb.unwrap().get_write_ptr(); let leave_exit_code = gen_leave_exit(&mut ocb).unwrap(); diff --git a/yjit/src/options.rs b/yjit/src/options.rs index 85d068595ade94..c91c36573890fa 100644 --- a/yjit/src/options.rs +++ b/yjit/src/options.rs @@ -27,9 +27,14 @@ pub static mut rb_yjit_cold_threshold: u64 = 200_000; #[derive(Debug)] #[repr(C)] pub struct Options { - // Size of the executable memory block to allocate in bytes - // Note that the command line argument is expressed in MiB and not bytes - pub exec_mem_size: usize, + /// Soft limit of all memory used by YJIT in bytes + /// VirtualMem avoids allocating new pages if code_region_size + yjit_alloc_size + /// is larger than this threshold. Rust may still allocate memory beyond this limit. + pub mem_size: usize, + + /// Hard limit of the executable memory block to allocate in bytes + /// Note that the command line argument is expressed in MiB and not bytes + pub exec_mem_size: Option, // Disable the propagation of type information pub no_type_prop: bool, @@ -81,7 +86,8 @@ pub struct Options { // Initialize the options to default values pub static mut OPTIONS: Options = Options { - exec_mem_size: 48 * 1024 * 1024, + mem_size: 128 * 1024 * 1024, + exec_mem_size: None, no_type_prop: false, max_versions: 4, num_temp_regs: 5, @@ -100,8 +106,10 @@ pub static mut OPTIONS: Options = Options { }; /// YJIT option descriptions for `ruby --help`. -static YJIT_OPTIONS: [(&str, &str); 9] = [ - ("--yjit-exec-mem-size=num", "Size of executable memory block in MiB (default: 48)."), +/// Note that --help allows only 80 characters per line, including indentation. 80-character limit --> | +pub const YJIT_OPTIONS: &'static [(&str, &str)] = &[ + ("--yjit-mem-size=num", "Soft limit on YJIT memory usage in MiB (default: 128)."), + ("--yjit-exec-mem-size=num", "Hard limit on executable memory block in MiB."), ("--yjit-call-threshold=num", "Number of calls to trigger JIT."), ("--yjit-cold-threshold=num", "Global calls after which ISEQs not compiled (default: 200K)."), ("--yjit-stats", "Enable collecting YJIT statistics."), @@ -183,6 +191,20 @@ pub fn parse_option(str_ptr: *const std::os::raw::c_char) -> Option<()> { match (opt_name, opt_val) { ("", "") => (), // Simply --yjit + ("mem-size", _) => match opt_val.parse::() { + Ok(n) => { + if n == 0 || n > 2 * 1024 * 1024 { + return None + } + + // Convert from MiB to bytes internally for convenience + unsafe { OPTIONS.mem_size = n * 1024 * 1024 } + } + Err(_) => { + return None; + } + }, + ("exec-mem-size", _) => match opt_val.parse::() { Ok(n) => { if n == 0 || n > 2 * 1024 * 1024 { @@ -190,7 +212,7 @@ pub fn parse_option(str_ptr: *const std::os::raw::c_char) -> Option<()> { } // Convert from MiB to bytes internally for convenience - unsafe { OPTIONS.exec_mem_size = n * 1024 * 1024 } + unsafe { OPTIONS.exec_mem_size = Some(n * 1024 * 1024) } } Err(_) => { return None; diff --git a/yjit/src/stats.rs b/yjit/src/stats.rs index c49f8af553a095..a6dffe9103b5e6 100644 --- a/yjit/src/stats.rs +++ b/yjit/src/stats.rs @@ -56,6 +56,11 @@ unsafe impl GlobalAlloc for StatsAlloc { } } +/// The number of bytes YJIT has allocated on the Rust heap. +pub fn yjit_alloc_size() -> usize { + GLOBAL_ALLOCATOR.alloc_size.load(Ordering::SeqCst) +} + /// Mapping of C function / ISEQ name to integer indices /// This is accessed at compilation time only (protected by a lock) static mut CFUNC_NAME_TO_IDX: Option> = None; @@ -770,7 +775,7 @@ fn rb_yjit_gen_stats_dict(key: VALUE) -> VALUE { set_stat_usize!(hash, "code_region_size", cb.mapped_region_size()); // Rust global allocations in bytes - set_stat_usize!(hash, "yjit_alloc_size", GLOBAL_ALLOCATOR.alloc_size.load(Ordering::SeqCst)); + set_stat_usize!(hash, "yjit_alloc_size", yjit_alloc_size()); // How many bytes we are using to store context data let context_data = CodegenGlobals::get_context_data(); diff --git a/yjit/src/virtualmem.rs b/yjit/src/virtualmem.rs index f3c0ceefffc804..f56b0d8213e94f 100644 --- a/yjit/src/virtualmem.rs +++ b/yjit/src/virtualmem.rs @@ -5,7 +5,7 @@ use std::ptr::NonNull; -use crate::{utils::IntoUsize, backend::ir::Target}; +use crate::{backend::ir::Target, stats::yjit_alloc_size, utils::IntoUsize}; #[cfg(not(test))] pub type VirtualMem = VirtualMemory; @@ -26,9 +26,12 @@ pub struct VirtualMemory { /// Location of the virtual memory region. region_start: NonNull, - /// Size of the region in bytes. + /// Size of this virtual memory region in bytes. region_size_bytes: usize, + /// mapped_region_bytes + yjit_alloc_size may not increase beyond this limit. + memory_limit_bytes: usize, + /// Number of bytes per "page", memory protection permission can only be controlled at this /// granularity. page_size_bytes: usize, @@ -106,13 +109,20 @@ use WriteError::*; impl VirtualMemory { /// Bring a part of the address space under management. - pub fn new(allocator: A, page_size: u32, virt_region_start: NonNull, size_bytes: usize) -> Self { + pub fn new( + allocator: A, + page_size: u32, + virt_region_start: NonNull, + region_size_bytes: usize, + memory_limit_bytes: usize, + ) -> Self { assert_ne!(0, page_size); let page_size_bytes = page_size.as_usize(); Self { region_start: virt_region_start, - region_size_bytes: size_bytes, + region_size_bytes, + memory_limit_bytes, page_size_bytes, mapped_region_bytes: 0, current_write_page: None, @@ -176,7 +186,8 @@ impl VirtualMemory { } self.current_write_page = Some(page_addr); - } else if (start..whole_region_end).contains(&raw) { + } else if (start..whole_region_end).contains(&raw) && + (page_addr + page_size - start as usize) + yjit_alloc_size() < self.memory_limit_bytes { // Writing to a brand new page let mapped_region_end_addr = mapped_region_end as usize; let alloc_size = page_addr - mapped_region_end_addr + page_size; @@ -368,6 +379,7 @@ pub mod tests { PAGE_SIZE.try_into().unwrap(), NonNull::new(mem_start as *mut u8).unwrap(), mem_size, + 128 * 1024 * 1024, ) } From 4cbd2ab9d462784ee44108e396177807e869ad23 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Mon, 7 Oct 2024 13:47:04 -0400 Subject: [PATCH 730/829] [ruby/prism] Properly handle non-assoc operators https://github.com/ruby/prism/commit/dbd5c929d6 --- prism/prism.c | 14 ++++++++++++-- .../errors/binary_range_with_left_unary_range.txt | 1 + test/prism/errors/non_assoc_equality.txt | 6 ++++++ test/prism/errors/range_and_bin_op.txt | 1 + test/prism/errors/range_and_bin_op_2.txt | 1 + 5 files changed, 21 insertions(+), 2 deletions(-) diff --git a/prism/prism.c b/prism/prism.c index b88c99c6591e39..7ef92ef5a59f0d 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -21764,8 +21764,11 @@ parse_expression(pm_parser_t *parser, pm_binding_power_t binding_power, bool acc // Otherwise we'll look and see if the next token can be parsed as an infix // operator. If it can, then we'll parse it using parse_expression_infix. pm_binding_powers_t current_binding_powers; + pm_token_type_t current_token_type; + while ( - current_binding_powers = pm_binding_powers[parser->current.type], + current_token_type = parser->current.type, + current_binding_powers = pm_binding_powers[current_token_type], binding_power <= current_binding_powers.left && current_binding_powers.binary ) { @@ -21806,6 +21809,13 @@ parse_expression(pm_parser_t *parser, pm_binding_power_t binding_power, bool acc // If the operator is nonassoc and we should not be able to parse the // upcoming infix operator, break. if (current_binding_powers.nonassoc) { + // If this is a non-assoc operator and we are about to parse the + // exact same operator, then we need to add an error. + if (match1(parser, current_token_type)) { + PM_PARSER_ERR_TOKEN_FORMAT(parser, parser->current, PM_ERR_NON_ASSOCIATIVE_OPERATOR, pm_token_type_human(parser->current.type), pm_token_type_human(current_token_type)); + break; + } + // If this is an endless range, then we need to reject a couple of // additional operators because it violates the normal operator // precedence rules. Those patterns are: @@ -21815,7 +21825,7 @@ parse_expression(pm_parser_t *parser, pm_binding_power_t binding_power, bool acc // if (PM_NODE_TYPE_P(node, PM_RANGE_NODE) && ((pm_range_node_t *) node)->right == NULL) { if (match4(parser, PM_TOKEN_UAMPERSAND, PM_TOKEN_USTAR, PM_TOKEN_DOT, PM_TOKEN_AMPERSAND_DOT)) { - PM_PARSER_ERR_TOKEN_FORMAT(parser, parser->current, PM_ERR_NON_ASSOCIATIVE_OPERATOR, pm_token_type_human(parser->current.type), pm_token_type_human(parser->previous.type)); + PM_PARSER_ERR_TOKEN_FORMAT(parser, parser->current, PM_ERR_NON_ASSOCIATIVE_OPERATOR, pm_token_type_human(parser->current.type), pm_token_type_human(current_token_type)); break; } diff --git a/test/prism/errors/binary_range_with_left_unary_range.txt b/test/prism/errors/binary_range_with_left_unary_range.txt index 37e41f397179b9..85cf55fb8064cf 100644 --- a/test/prism/errors/binary_range_with_left_unary_range.txt +++ b/test/prism/errors/binary_range_with_left_unary_range.txt @@ -2,6 +2,7 @@ ^~ unexpected range operator; .. and ... are non-associative and cannot be chained ...1.. ^~ unexpected range operator; .. and ... are non-associative and cannot be chained + ^~ unexpected ..; .. is a non-associative operator ^~ unexpected .., expecting end-of-input ^~ unexpected .., ignoring it diff --git a/test/prism/errors/non_assoc_equality.txt b/test/prism/errors/non_assoc_equality.txt index 6ce8da88d6a72c..9b3f13754913a9 100644 --- a/test/prism/errors/non_assoc_equality.txt +++ b/test/prism/errors/non_assoc_equality.txt @@ -1,19 +1,25 @@ 1 == 2 == 3 + ^~ unexpected '=='; '==' is a non-associative operator ^~ unexpected '==', expecting end-of-input ^~ unexpected '==', ignoring it 1 != 2 != 3 + ^~ unexpected '!='; '!=' is a non-associative operator ^~ unexpected '!=', expecting end-of-input ^~ unexpected '!=', ignoring it 1 === 2 === 3 + ^~~ unexpected '==='; '===' is a non-associative operator ^~~ unexpected '===', expecting end-of-input ^~~ unexpected '===', ignoring it 1 =~ 2 =~ 3 + ^~ unexpected '=~'; '=~' is a non-associative operator ^~ unexpected '=~', expecting end-of-input ^~ unexpected '=~', ignoring it 1 !~ 2 !~ 3 + ^~ unexpected '!~'; '!~' is a non-associative operator ^~ unexpected '!~', expecting end-of-input ^~ unexpected '!~', ignoring it 1 <=> 2 <=> 3 + ^~~ unexpected '<=>'; '<=>' is a non-associative operator ^~~ unexpected '<=>', expecting end-of-input ^~~ unexpected '<=>', ignoring it diff --git a/test/prism/errors/range_and_bin_op.txt b/test/prism/errors/range_and_bin_op.txt index 4a7a396d0d649d..55928c409b8a9d 100644 --- a/test/prism/errors/range_and_bin_op.txt +++ b/test/prism/errors/range_and_bin_op.txt @@ -1,4 +1,5 @@ 1..2..3 + ^~ unexpected ..; .. is a non-associative operator ^~ unexpected .., expecting end-of-input ^~ unexpected .., ignoring it diff --git a/test/prism/errors/range_and_bin_op_2.txt b/test/prism/errors/range_and_bin_op_2.txt index f2a31dcf82cf6e..6ca91a26eb97b7 100644 --- a/test/prism/errors/range_and_bin_op_2.txt +++ b/test/prism/errors/range_and_bin_op_2.txt @@ -1,4 +1,5 @@ 1..2.. + ^~ unexpected ..; .. is a non-associative operator ^~ unexpected .., expecting end-of-input ^~ unexpected .., ignoring it From 05d3b727d654002258ae10111f7b0f03574084e9 Mon Sep 17 00:00:00 2001 From: Burdette Lamar Date: Mon, 7 Oct 2024 14:21:47 -0500 Subject: [PATCH 731/829] [DOC] Tweaks for Array#permutation (#11802) --- array.c | 82 ++++++++++++++++----------------------------------------- 1 file changed, 22 insertions(+), 60 deletions(-) diff --git a/array.c b/array.c index 8cfdbeb9c14d70..0bd08028fcc957 100644 --- a/array.c +++ b/array.c @@ -7000,82 +7000,44 @@ rb_ary_permutation_size(VALUE ary, VALUE args, VALUE eobj) /* * call-seq: - * array.permutation {|element| ... } -> self - * array.permutation(n) {|element| ... } -> self - * array.permutation -> new_enumerator - * array.permutation(n) -> new_enumerator + * permutation(n = self.size) {|permutation| ... } -> self + * permutation(n = self.size) -> new_enumerator * - * When invoked with a block, yield all permutations of elements of +self+; returns +self+. - * The order of permutations is indeterminate. + * Iterates over permutations of the elements of +self+; + * the order of permutations is indeterminate. * - * When a block and an in-range positive Integer argument +n+ (0 < n <= self.size) - * are given, calls the block with all +n+-tuple permutations of +self+. - * - * Example: - * - * a = [0, 1, 2] - * a.permutation(2) {|permutation| p permutation } - * - * Output: - * - * [0, 1] - * [0, 2] - * [1, 0] - * [1, 2] - * [2, 0] - * [2, 1] - * - * Another example: + * With a block and an in-range positive integer argument +n+ (0 < n <= self.size) given, + * calls the block with each +n+-tuple permutations of +self+; + * returns +self+: * * a = [0, 1, 2] - * a.permutation(3) {|permutation| p permutation } - * - * Output: + * perms = [] + * a.permutation(1) {|perm| perms.push(perm) } + * perms # => [[0], [1], [2]] * - * [0, 1, 2] - * [0, 2, 1] - * [1, 0, 2] - * [1, 2, 0] - * [2, 0, 1] - * [2, 1, 0] + * perms = [] + * a.permutation(2) {|perm| perms.push(perm) } + * perms # => [[0, 1], [0, 2], [1, 0], [1, 2], [2, 0], [2, 1]] * - * When +n+ is zero, calls the block once with a new empty +Array+: + * perms = [] + * a.permutation(3) {|perm| perms.push(perm) } + * perms # => [[0, 1, 2], [0, 2, 1], [1, 0, 2], [1, 2, 0], [2, 0, 1], [2, 1, 0]] * - * a = [0, 1, 2] - * a.permutation(0) {|permutation| p permutation } - * - * Output: + * When +n+ is zero, calls the block once with a new empty array: * - * [] + * perms = [] + * a.permutation(0) {|perm| perms.push(perm) } + * perms # => [[]] * * When +n+ is out of range (negative or larger than self.size), * does not call the block: * - * a = [0, 1, 2] * a.permutation(-1) {|permutation| fail 'Cannot happen' } * a.permutation(4) {|permutation| fail 'Cannot happen' } * - * When a block given but no argument, - * behaves the same as a.permutation(a.size): - * - * a = [0, 1, 2] - * a.permutation {|permutation| p permutation } - * - * Output: - * - * [0, 1, 2] - * [0, 2, 1] - * [1, 0, 2] - * [1, 2, 0] - * [2, 0, 1] - * [2, 1, 0] - * - * Returns a new Enumerator if no block given: - * - * a = [0, 1, 2] - * a.permutation # => # - * a.permutation(2) # => # + * With no block given, returns a new Enumerator. * + * Related: {Methods for Iterating}[rdoc-ref:Array@Methods+for+Iterating]. */ static VALUE From 8c7e291dd86f21f1d9bbcd3c0ba1e7e01761b129 Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Mon, 7 Oct 2024 19:45:16 -0400 Subject: [PATCH 732/829] Update references to flori/json Now that the repository was transfered, these links will become dead in a few months. --- complex.c | 2 +- doc/ChangeLog/ChangeLog-1.9.3 | 2 +- doc/ChangeLog/ChangeLog-2.0.0 | 2 +- doc/ChangeLog/ChangeLog-2.1.0 | 4 ++-- doc/ChangeLog/ChangeLog-2.3.0 | 8 ++++---- doc/ChangeLog/ChangeLog-2.4.0 | 4 ++-- doc/maintainers.md | 2 +- test/json/json_parser_test.rb | 1 - 8 files changed, 12 insertions(+), 13 deletions(-) diff --git a/complex.c b/complex.c index b89c6f1f930916..1d7ae694d50dde 100644 --- a/complex.c +++ b/complex.c @@ -2588,7 +2588,7 @@ float_arg(VALUE self) * - #as_json: Returns a serialized hash constructed from +self+. * - #to_json: Returns a JSON string representing +self+. * - * These methods are provided by the {JSON gem}[https://github.com/flori/json]. To make these methods available: + * These methods are provided by the {JSON gem}[https://github.com/ruby/json]. To make these methods available: * * require 'json/add/complex' * diff --git a/doc/ChangeLog/ChangeLog-1.9.3 b/doc/ChangeLog/ChangeLog-1.9.3 index 0f80eed2d5d0b9..03a7f3eabffd10 100644 --- a/doc/ChangeLog/ChangeLog-1.9.3 +++ b/doc/ChangeLog/ChangeLog-1.9.3 @@ -9012,7 +9012,7 @@ Thu Dec 2 01:24:39 2010 NARUSE, Yui Thu Dec 2 01:02:03 2010 NARUSE, Yui - * ext/json: Update github/flori/json from 1.4.2+ to + * ext/json: Update github/ruby/json from 1.4.2+ to e22b2f2bdfe6a9b0. this fixes some bugs. Thu Dec 2 00:05:44 2010 NARUSE, Yui diff --git a/doc/ChangeLog/ChangeLog-2.0.0 b/doc/ChangeLog/ChangeLog-2.0.0 index 9e654db1893a91..de47b66a6947ba 100644 --- a/doc/ChangeLog/ChangeLog-2.0.0 +++ b/doc/ChangeLog/ChangeLog-2.0.0 @@ -14426,7 +14426,7 @@ Tue May 8 02:34:26 2012 NARUSE, Yui Mon May 7 21:19:17 2012 NARUSE, Yui * ext/json: Merge JSON 1.7.1. - https://github.com/flori/json/commit/e5b9a9465c1159fae533bca320d950b772bcb4ac + https://github.com/ruby/json/commit/e5b9a9465c1159fae533bca320d950b772bcb4ac Mon May 7 22:54:22 2012 Martin Bosslet diff --git a/doc/ChangeLog/ChangeLog-2.1.0 b/doc/ChangeLog/ChangeLog-2.1.0 index 7964a682ebd9c8..b6977dbccdd980 100644 --- a/doc/ChangeLog/ChangeLog-2.1.0 +++ b/doc/ChangeLog/ChangeLog-2.1.0 @@ -2167,7 +2167,7 @@ Wed Nov 20 11:46:38 2013 NARUSE, Yui * ext/json: merge JSON 1.8.1. https://github.com/nurse/json/compare/002ac2771ce32776b32ccd2d06e5604de6c36dcd...e09ffc0d7da25d0393873936c118c188c78dbac3 * Remove Rubinius exception since transcoding should be working now. - * Fix https://github.com/flori/json/issues/162 reported by Marc-Andre + * Fix https://github.com/ruby/json/issues/162 reported by Marc-Andre Lafortune . Thanks! * Applied patches by Yui NARUSE to suppress warning with -Wchar-subscripts and better validate UTF-8 strings. @@ -17913,7 +17913,7 @@ Tue Feb 12 12:02:35 2013 NARUSE, Yui * ext/json: merge JSON 1.7.7. This includes security fix. [CVE-2013-0269] - https://github.com/flori/json/commit/d0a62f3ced7560daba2ad546d83f0479a5ae2cf2 + https://github.com/ruby/json/commit/d0a62f3ced7560daba2ad546d83f0479a5ae2cf2 https://groups.google.com/d/topic/rubyonrails-security/4_YvCpLzL58/discussion Mon Feb 11 23:08:48 2013 Tanaka Akira diff --git a/doc/ChangeLog/ChangeLog-2.3.0 b/doc/ChangeLog/ChangeLog-2.3.0 index 94996cffd0de92..e6161838957e67 100644 --- a/doc/ChangeLog/ChangeLog-2.3.0 +++ b/doc/ChangeLog/ChangeLog-2.3.0 @@ -1211,7 +1211,7 @@ Sun Dec 6 08:39:05 2015 SHIBATA Hiroshi upstream changes. https://github.com/ruby/ruby/commit/4d059bf9f5f10f3d3088de49fc87e5555db7770d - https://github.com/flori/json/commit/d4c99de78905d96c3f301f48b2c789943bb3f098 + https://github.com/ruby/json/commit/d4c99de78905d96c3f301f48b2c789943bb3f098 * ext/json/lib/json/version.rb: ditto. @@ -10989,7 +10989,7 @@ Fri Feb 13 21:16:00 2015 Yusuke Endoh Fri Feb 13 14:19:06 2015 SHIBATA Hiroshi - * ext/json: merge upstream from flori/json + * ext/json: merge upstream from ruby/json change usage of TypedData. [Feature #10739][ruby-core:67564] Thu Feb 12 18:34:01 2015 multisnow @@ -11556,7 +11556,7 @@ Tue Jan 13 21:08:22 2015 SHIBATA Hiroshi * ext/json, test/json: merge JSON HEAD(259dee6) separate implementation of Typed_Data macro. - https://github.com/flori/json/compare/v1.8.1...v1.8.2 + https://github.com/ruby/json/compare/v1.8.1...v1.8.2 Tue Jan 13 14:16:35 2015 Nobuyoshi Nakada @@ -12009,7 +12009,7 @@ Mon Dec 29 10:37:27 2014 Thiago Lewin Mon Dec 29 07:27:23 2014 SHIBATA Hiroshi * ext/json, test/json: merge JSON HEAD(17fe8e7) - https://github.com/flori/json/compare/v1.8.1...17fe8e7 + https://github.com/ruby/json/compare/v1.8.1...17fe8e7 Sun Dec 28 23:49:37 2014 Michal Papis diff --git a/doc/ChangeLog/ChangeLog-2.4.0 b/doc/ChangeLog/ChangeLog-2.4.0 index 30e9ccab3d9aac..5e126fbd90e282 100644 --- a/doc/ChangeLog/ChangeLog-2.4.0 +++ b/doc/ChangeLog/ChangeLog-2.4.0 @@ -2668,8 +2668,8 @@ Wed Jul 6 07:11:27 2016 Shugo Maeda Tue Jul 5 20:49:30 2016 SHIBATA Hiroshi * ext/json/*, test/json/*: Update json-2.0.1. - Changes of 2.0.0: https://github.com/flori/json/blob/f679ebd0c69a94e3e70a897ac9a229f5779c2ee1/CHANGES.md#2015-09-11-200 - Changes of 2.0.1: https://github.com/flori/json/blob/f679ebd0c69a94e3e70a897ac9a229f5779c2ee1/CHANGES.md#2016-07-01-201 + Changes of 2.0.0: https://github.com/ruby/json/blob/f679ebd0c69a94e3e70a897ac9a229f5779c2ee1/CHANGES.md#2015-09-11-200 + Changes of 2.0.1: https://github.com/ruby/json/blob/f679ebd0c69a94e3e70a897ac9a229f5779c2ee1/CHANGES.md#2016-07-01-201 [Feature #12542][ruby-dev:49706][fix GH-1395] Tue Jul 5 19:39:49 2016 Naohisa Goto diff --git a/doc/maintainers.md b/doc/maintainers.md index dabbdc0cb6e687..e31ac2553126f7 100644 --- a/doc/maintainers.md +++ b/doc/maintainers.md @@ -348,7 +348,7 @@ have commit right, others don't. #### ext/json * NARUSE, Yui (naruse) * Hiroshi SHIBATA (hsbt) -* https://github.com/flori/json +* https://github.com/ruby/json * https://rubygems.org/gems/json #### ext/openssl diff --git a/test/json/json_parser_test.rb b/test/json/json_parser_test.rb index 49c7c8565db56d..610ea06f3f88d1 100644 --- a/test/json/json_parser_test.rb +++ b/test/json/json_parser_test.rb @@ -27,7 +27,6 @@ def test_argument_encoding end if defined?(Encoding::UTF_16) def test_error_message_encoding - # https://github.com/flori/json/actions/runs/6478148162/job/17589572890 pend if RUBY_ENGINE == 'truffleruby' bug10705 = '[ruby-core:67386] [Bug #10705]' From b9b06df3bf33867d18a9b37eb0eae25b4fe6e53c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Oct 2024 02:19:22 +0000 Subject: [PATCH 733/829] Bump actions/cache in /.github/actions/setup/directories Bumps [actions/cache](https://github.com/actions/cache) from 4.0.2 to 4.1.0. - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/0c45773b623bea8c8e75f6c82b208c3cf94ea4f9...2cdf405574d6ef1f33a1d12acccd3ae82f47b3f2) --- updated-dependencies: - dependency-name: actions/cache dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/actions/setup/directories/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/setup/directories/action.yml b/.github/actions/setup/directories/action.yml index d54c0f93f8aa8d..ab3eba1be48d49 100644 --- a/.github/actions/setup/directories/action.yml +++ b/.github/actions/setup/directories/action.yml @@ -93,7 +93,7 @@ runs: path: ${{ inputs.srcdir }} fetch-depth: ${{ inputs.fetch-depth }} - - uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 + - uses: actions/cache@2cdf405574d6ef1f33a1d12acccd3ae82f47b3f2 # v4.1.0 with: path: ${{ inputs.srcdir }}/.downloaded-cache key: downloaded-cache From 24621df43e1a67217fc97600fd5b99cc3d93c947 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Oct 2024 02:27:49 +0000 Subject: [PATCH 734/829] Bump actions/upload-artifact from 4.4.0 to 4.4.1 Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4.4.0 to 4.4.1. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/50769540e7f4bd5e21e526ee35c689e35e0d6874...604373da6381bf24206979c74d06a550515601b9) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/wasm.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/wasm.yml b/.github/workflows/wasm.yml index 4810cd6d0b36fa..3924aaeb9905ca 100644 --- a/.github/workflows/wasm.yml +++ b/.github/workflows/wasm.yml @@ -136,7 +136,7 @@ jobs: - run: tar cfz ../install.tar.gz -C ../install . - name: Upload artifacts - uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0 + uses: actions/upload-artifact@604373da6381bf24206979c74d06a550515601b9 # v4.4.1 with: name: ruby-wasm-install path: ${{ github.workspace }}/install.tar.gz @@ -164,7 +164,7 @@ jobs: - name: Save Pull Request number if: ${{ github.event_name == 'pull_request' }} run: echo "${{ github.event.pull_request.number }}" >> ${{ github.workspace }}/github-pr-info.txt - - uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0 + - uses: actions/upload-artifact@604373da6381bf24206979c74d06a550515601b9 # v4.4.1 if: ${{ github.event_name == 'pull_request' }} with: name: github-pr-info From f6494276f5a70760e9f1f299fac79a866bd9ad34 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Oct 2024 02:28:06 +0000 Subject: [PATCH 735/829] Bump github/codeql-action from 3.26.11 to 3.26.12 Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.26.11 to 3.26.12. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/6db8d6351fd0be61f9ed8ebd12ccd35dcec51fea...c36620d31ac7c881962c3d9dd939c40ec9434f2b) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/codeql-analysis.yml | 8 ++++---- .github/workflows/scorecards.yml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index ca5e815f8a1927..32c49518595817 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -77,15 +77,15 @@ jobs: run: sudo rm /usr/lib/ruby/vendor_ruby/rubygems/defaults/operating_system.rb - name: Initialize CodeQL - uses: github/codeql-action/init@6db8d6351fd0be61f9ed8ebd12ccd35dcec51fea # v3.26.11 + uses: github/codeql-action/init@c36620d31ac7c881962c3d9dd939c40ec9434f2b # v3.26.12 with: languages: ${{ matrix.language }} - name: Autobuild - uses: github/codeql-action/autobuild@6db8d6351fd0be61f9ed8ebd12ccd35dcec51fea # v3.26.11 + uses: github/codeql-action/autobuild@c36620d31ac7c881962c3d9dd939c40ec9434f2b # v3.26.12 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@6db8d6351fd0be61f9ed8ebd12ccd35dcec51fea # v3.26.11 + uses: github/codeql-action/analyze@c36620d31ac7c881962c3d9dd939c40ec9434f2b # v3.26.12 with: category: '/language:${{ matrix.language }}' upload: False @@ -115,7 +115,7 @@ jobs: continue-on-error: true - name: Upload SARIF - uses: github/codeql-action/upload-sarif@6db8d6351fd0be61f9ed8ebd12ccd35dcec51fea # v3.26.11 + uses: github/codeql-action/upload-sarif@c36620d31ac7c881962c3d9dd939c40ec9434f2b # v3.26.12 with: sarif_file: sarif-results/${{ matrix.language }}.sarif continue-on-error: true diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml index 40f86480c298eb..4dc912f3db4ecd 100644 --- a/.github/workflows/scorecards.yml +++ b/.github/workflows/scorecards.yml @@ -67,6 +67,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: 'Upload to code-scanning' - uses: github/codeql-action/upload-sarif@6db8d6351fd0be61f9ed8ebd12ccd35dcec51fea # v3.26.11 + uses: github/codeql-action/upload-sarif@c36620d31ac7c881962c3d9dd939c40ec9434f2b # v3.26.12 with: sarif_file: results.sarif From f35e97bfa49885659a4b74e4307e3b08181e300b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Oct 2024 02:45:54 +0000 Subject: [PATCH 736/829] Bump actions/checkout in /.github/actions/setup/directories Bumps [actions/checkout](https://github.com/actions/checkout) from 4.2.0 to 4.2.1. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/d632683dd7b4114ad314bca15554477dd762a938...eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/actions/setup/directories/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/setup/directories/action.yml b/.github/actions/setup/directories/action.yml index ab3eba1be48d49..0ca1d9ea27be73 100644 --- a/.github/actions/setup/directories/action.yml +++ b/.github/actions/setup/directories/action.yml @@ -88,7 +88,7 @@ runs: git config --global init.defaultBranch garbage - if: inputs.checkout - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 + uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 with: path: ${{ inputs.srcdir }} fetch-depth: ${{ inputs.fetch-depth }} From bad4ad63bff71748302d1089523a5dcbc40f6c57 Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Mon, 7 Oct 2024 08:21:58 -0400 Subject: [PATCH 737/829] [ruby/json] Update all links to the repository following transfert https://github.com/ruby/json/commit/1edfeb8f10 --- ext/json/json.gemspec | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ext/json/json.gemspec b/ext/json/json.gemspec index 64d0c81391e2f8..5a951a8b25db83 100644 --- a/ext/json/json.gemspec +++ b/ext/json/json.gemspec @@ -54,14 +54,14 @@ Gem::Specification.new do |s| "lib/json/pure/parser.rb", "lib/json/version.rb", ] - s.homepage = "https://flori.github.io/json" + s.homepage = "https://ruby.github.io/json" s.metadata = { - 'bug_tracker_uri' => 'https://github.com/flori/json/issues', - 'changelog_uri' => 'https://github.com/flori/json/blob/master/CHANGES.md', - 'documentation_uri' => 'https://flori.github.io/json/doc/index.html', + 'bug_tracker_uri' => 'https://github.com/ruby/json/issues', + 'changelog_uri' => 'https://github.com/ruby/json/blob/master/CHANGES.md', + 'documentation_uri' => 'https://ruby.github.io/json/doc/index.html', 'homepage_uri' => s.homepage, - 'source_code_uri' => 'https://github.com/flori/json', - 'wiki_uri' => 'https://github.com/flori/json/wiki' + 'source_code_uri' => 'https://github.com/ruby/json', + 'wiki_uri' => 'https://github.com/ruby/json/wiki' } s.required_ruby_version = Gem::Requirement.new(">= 2.3") From 6e47968929f2ee77376d28a6561266d8f8e3a4f7 Mon Sep 17 00:00:00 2001 From: "Luke T. Shumaker" Date: Thu, 22 Feb 2024 20:51:28 -0700 Subject: [PATCH 738/829] [ruby/json] Delete code that is based on CVTUTF I did this based on manual inspection, comparing the code to my re-created history of CVTUTF at https://git.lukeshu.com/2git/cvtutf/ (created by the scripts at https://git.lukeshu.com/2git/cvtutf-make/) https://github.com/ruby/json/commit/0819553144 --- ext/json/generator/generator.c | 232 --------------------------------- ext/json/generator/generator.h | 24 ---- ext/json/parser/parser.h | 12 -- 3 files changed, 268 deletions(-) diff --git a/ext/json/generator/generator.c b/ext/json/generator/generator.c index b8734764c71e29..d3f651651117b8 100644 --- a/ext/json/generator/generator.c +++ b/ext/json/generator/generator.c @@ -18,54 +18,6 @@ static ID i_to_s, i_to_json, i_new, i_indent, i_space, i_space_before, i_aref, i_send, i_respond_to_p, i_match, i_keys, i_depth, i_buffer_initial_length, i_dup, i_script_safe, i_escape_slash, i_strict; -/* - * Copyright 2001-2004 Unicode, Inc. - * - * Disclaimer - * - * This source code is provided as is by Unicode, Inc. No claims are - * made as to fitness for any particular purpose. No warranties of any - * kind are expressed or implied. The recipient agrees to determine - * applicability of information provided. If this file has been - * purchased on magnetic or optical media from Unicode, Inc., the - * sole remedy for any claim will be exchange of defective media - * within 90 days of receipt. - * - * Limitations on Rights to Redistribute This Code - * - * Unicode, Inc. hereby grants the right to freely use the information - * supplied in this file in the creation of products supporting the - * Unicode Standard, and to make copies of this file in any form - * for internal or external distribution as long as this notice - * remains attached. - */ - -/* - * Index into the table below with the first byte of a UTF-8 sequence to - * get the number of trailing bytes that are supposed to follow it. - * Note that *legal* UTF-8 values can't have 4 or 5-bytes. The table is - * left as-is for anyone who may want to do such conversion, which was - * allowed in earlier algorithms. - */ -static const char trailingBytesForUTF8[256] = { - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 -}; - -/* - * Magic values subtracted from a buffer value during UTF8 conversion. - * This table contains as many values as there might be trailing bytes - * in a UTF-8 sequence. - */ -static const UTF32 offsetsFromUTF8[6] = { 0x00000000UL, 0x00003080UL, 0x000E2080UL, - 0x03C82080UL, 0xFA082080UL, 0x82082080UL }; - /* Escapes the UTF16 character and stores the result in the buffer buf. */ static void unicode_escape(char *buf, UTF16 character) { @@ -94,98 +46,6 @@ static void convert_UTF8_to_JSON_ASCII(FBuffer *buffer, VALUE string, char scrip const UTF8 *sourceEnd = source + RSTRING_LEN(string); char buf[6] = { '\\', 'u' }; - int ascii_only = rb_enc_str_asciionly_p(string); - - if (!ascii_only) { - if (RB_ENCODING_GET_INLINED(string) != rb_utf8_encindex() || RB_ENC_CODERANGE(string) != RUBY_ENC_CODERANGE_VALID) { - rb_raise(rb_path2class("JSON::GeneratorError"), - "source sequence is illegal/malformed utf-8"); - } - } - - while (source < sourceEnd) { - UTF32 ch = 0; - unsigned short extraBytesToRead = trailingBytesForUTF8[*source]; - /* - * The cases all fall through. See "Note A" below. - */ - switch (extraBytesToRead) { - case 5: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */ - case 4: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */ - case 3: ch += *source++; ch <<= 6; - case 2: ch += *source++; ch <<= 6; - case 1: ch += *source++; ch <<= 6; - case 0: ch += *source++; - } - ch -= offsetsFromUTF8[extraBytesToRead]; - - if (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */ - /* UTF-16 surrogate values are illegal in UTF-32 */ - if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) { -#if UNI_STRICT_CONVERSION - source -= (extraBytesToRead+1); /* return to the illegal value itself */ - rb_raise(rb_path2class("JSON::GeneratorError"), - "source sequence is illegal/malformed utf-8"); -#else - unicode_escape_to_buffer(buffer, buf, UNI_REPLACEMENT_CHAR); -#endif - } else { - /* normal case */ - if (ch >= 0x20 && ch <= 0x7f) { - switch (ch) { - case '\\': - fbuffer_append(buffer, "\\\\", 2); - break; - case '"': - fbuffer_append(buffer, "\\\"", 2); - break; - case '/': - if(script_safe) { - fbuffer_append(buffer, "\\/", 2); - break; - } - default: - fbuffer_append_char(buffer, (char)ch); - break; - } - } else { - switch (ch) { - case '\n': - fbuffer_append(buffer, "\\n", 2); - break; - case '\r': - fbuffer_append(buffer, "\\r", 2); - break; - case '\t': - fbuffer_append(buffer, "\\t", 2); - break; - case '\f': - fbuffer_append(buffer, "\\f", 2); - break; - case '\b': - fbuffer_append(buffer, "\\b", 2); - break; - default: - unicode_escape_to_buffer(buffer, buf, (UTF16) ch); - break; - } - } - } - } else if (ch > UNI_MAX_UTF16) { -#if UNI_STRICT_CONVERSION - source -= (extraBytesToRead+1); /* return to the start */ - rb_raise(rb_path2class("JSON::GeneratorError"), - "source sequence is illegal/malformed utf8"); -#else - unicode_escape_to_buffer(buffer, buf, UNI_REPLACEMENT_CHAR); -#endif - } else { - /* target is a character in range 0xFFFF - 0x10FFFF. */ - ch -= halfBase; - unicode_escape_to_buffer(buffer, buf, (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START)); - unicode_escape_to_buffer(buffer, buf, (UTF16)((ch & halfMask) + UNI_SUR_LOW_START)); - } - } RB_GC_GUARD(string); } @@ -202,98 +62,6 @@ static void convert_UTF8_to_JSON(FBuffer *buffer, VALUE string, char script_safe unsigned char c; char buf[6] = { '\\', 'u' }; int ascii_only = rb_enc_str_asciionly_p(string); - - if (!ascii_only) { - if (RB_ENCODING_GET_INLINED(string) != rb_utf8_encindex() || RB_ENC_CODERANGE(string) != RUBY_ENC_CODERANGE_VALID) { - rb_raise(rb_path2class("JSON::GeneratorError"), - "source sequence is illegal/malformed utf-8"); - } - } - - for (start = 0, end = 0; end < len;) { - p = ptr + end; - c = (unsigned char) *p; - if (c < 0x20) { - switch (c) { - case '\n': - escape = "\\n"; - escape_len = 2; - break; - case '\r': - escape = "\\r"; - escape_len = 2; - break; - case '\t': - escape = "\\t"; - escape_len = 2; - break; - case '\f': - escape = "\\f"; - escape_len = 2; - break; - case '\b': - escape = "\\b"; - escape_len = 2; - break; - default: - unicode_escape(buf, (UTF16) *p); - escape = buf; - escape_len = 6; - break; - } - } else { - switch (c) { - case '\\': - escape = "\\\\"; - escape_len = 2; - break; - case '"': - escape = "\\\""; - escape_len = 2; - break; - case '/': - if(script_safe) { - escape = "\\/"; - escape_len = 2; - break; - } - default: - { - unsigned short clen = 1; - if (!ascii_only) { - clen += trailingBytesForUTF8[c]; - if (end + clen > len) { - rb_raise(rb_path2class("JSON::GeneratorError"), - "partial character in source, but hit end"); - } - - if (script_safe && c == 0xE2) { - unsigned char c2 = (unsigned char) *(p+1); - unsigned char c3 = (unsigned char) *(p+2); - if (c2 == 0x80 && (c3 == 0xA8 || c3 == 0xA9)) { - fbuffer_append(buffer, ptr + start, end - start); - start = end = (end + clen); - if (c3 == 0xA8) { - fbuffer_append(buffer, "\\u2028", 6); - } else { - fbuffer_append(buffer, "\\u2029", 6); - } - continue; - } - } - } - end += clen; - } - continue; - break; - } - } - fbuffer_append(buffer, ptr + start, end - start); - fbuffer_append(buffer, escape, escape_len); - start = ++end; - escape = NULL; - } - fbuffer_append(buffer, ptr + start, end - start); } static char *fstrndup(const char *ptr, unsigned long len) { diff --git a/ext/json/generator/generator.h b/ext/json/generator/generator.h index 8dde7be8272edc..95ce2479c6b3bb 100644 --- a/ext/json/generator/generator.h +++ b/ext/json/generator/generator.h @@ -22,30 +22,6 @@ #define option_given_p(opts, key) RTEST(rb_funcall(opts, i_key_p, 1, key)) -/* unicode definitions */ - -#define UNI_STRICT_CONVERSION 1 - -typedef unsigned long UTF32; /* at least 32 bits */ -typedef unsigned short UTF16; /* at least 16 bits */ -typedef unsigned char UTF8; /* typically 8 bits */ - -#define UNI_REPLACEMENT_CHAR (UTF32)0x0000FFFD -#define UNI_MAX_BMP (UTF32)0x0000FFFF -#define UNI_MAX_UTF16 (UTF32)0x0010FFFF -#define UNI_MAX_UTF32 (UTF32)0x7FFFFFFF -#define UNI_MAX_LEGAL_UTF32 (UTF32)0x0010FFFF - -#define UNI_SUR_HIGH_START (UTF32)0xD800 -#define UNI_SUR_HIGH_END (UTF32)0xDBFF -#define UNI_SUR_LOW_START (UTF32)0xDC00 -#define UNI_SUR_LOW_END (UTF32)0xDFFF - -static const int halfShift = 10; /* used for shifting by 10 bits */ - -static const UTF32 halfBase = 0x0010000UL; -static const UTF32 halfMask = 0x3FFUL; - static void unicode_escape(char *buf, UTF16 character); static void unicode_escape_to_buffer(FBuffer *buffer, char buf[6], UTF16 character); static void convert_UTF8_to_JSON_ASCII(FBuffer *buffer, VALUE string, char script_safe); diff --git a/ext/json/parser/parser.h b/ext/json/parser/parser.h index 651d40c074992f..d80f1b7303cabc 100644 --- a/ext/json/parser/parser.h +++ b/ext/json/parser/parser.h @@ -19,18 +19,6 @@ #define option_given_p(opts, key) RTEST(rb_funcall(opts, i_key_p, 1, key)) -/* unicode */ - -typedef unsigned long UTF32; /* at least 32 bits */ -typedef unsigned short UTF16; /* at least 16 bits */ -typedef unsigned char UTF8; /* typically 8 bits */ - -#define UNI_REPLACEMENT_CHAR (UTF32)0x0000FFFD -#define UNI_SUR_HIGH_START (UTF32)0xD800 -#define UNI_SUR_HIGH_END (UTF32)0xDBFF -#define UNI_SUR_LOW_START (UTF32)0xDC00 -#define UNI_SUR_LOW_END (UTF32)0xDFFF - typedef struct JSON_ParserStruct { VALUE Vsource; char *source; From 74d459fd52ef85f92f7c20819afcc4ffcf11714d Mon Sep 17 00:00:00 2001 From: "Luke T. Shumaker" Date: Thu, 22 Feb 2024 20:51:28 -0700 Subject: [PATCH 739/829] [ruby/json] Adjust to the CVTUTF code being gone I, Luke T. Shumaker, am the sole author of the added code. I did not reference CVTUTF when writing it. I did reference the Unicode standard (15.0.0), the Wikipedia article on UTF-8, and the Wikipedia article on UTF-16. When I saw some tests fail, I did reference the old deleted code (but a JSON-specific part, inherently not as based on CVTUTF) to determine that script_safe should also escape U+2028 and U+2029. I targeted simplicity and clarity when writing the code--it can likely be optimized. In my mind, the obvious next optimization is to have it combine contiguous non-escaped characters into just one call to fbuffer_append(), instead of calling fbuffer_append() for each character. Regarding the use of the "modern" types `uint32_t`, `uint16_t`, and `bool`: - ruby.h is guaranteed to give us uint32_t and uint16_t. - Since Ruby 3.0.0, ruby.h is guaranteed to give us bool... but we support down to Ruby 2.3. But, ruby.h is guaranteed to give us HAVE_STDBOOL_H for the C99 stdbool.h; so use that to include stdbool.h if we can, and if not then fall back to a copy of the same bool definition that Ruby 3.0.5 uses with C89. https://github.com/ruby/json/commit/c96351f874 --- ext/json/generator/generator.c | 152 +++++++++++++++++++-------- ext/json/generator/generator.h | 13 ++- ext/json/parser/parser.c | 182 ++++++++++++++++++--------------- ext/json/parser/parser.h | 4 +- ext/json/parser/parser.rl | 32 ++++-- 5 files changed, 239 insertions(+), 144 deletions(-) diff --git a/ext/json/generator/generator.c b/ext/json/generator/generator.c index d3f651651117b8..4d853ec343adac 100644 --- a/ext/json/generator/generator.c +++ b/ext/json/generator/generator.c @@ -18,50 +18,119 @@ static ID i_to_s, i_to_json, i_new, i_indent, i_space, i_space_before, i_aref, i_send, i_respond_to_p, i_match, i_keys, i_depth, i_buffer_initial_length, i_dup, i_script_safe, i_escape_slash, i_strict; -/* Escapes the UTF16 character and stores the result in the buffer buf. */ -static void unicode_escape(char *buf, UTF16 character) +/* Converts in_string to a JSON string (without the wrapping '"' + * characters) in FBuffer out_buffer. + * + * Character are JSON-escaped according to: + * + * - Always: ASCII control characters (0x00-0x1F), dquote, and + * backslash. + * + * - If out_ascii_only: non-ASCII characters (>0x7F) + * + * - If out_script_safe: forwardslash, line separator (U+2028), and + * paragraph separator (U+2029) + * + * Everything else (should be UTF-8) is just passed through and + * appended to the result. + */ +static void convert_UTF8_to_JSON(FBuffer *out_buffer, VALUE in_string, bool out_ascii_only, bool out_script_safe) { - const char *digits = "0123456789abcdef"; + const char *hexdig = "0123456789abcdef"; + char scratch[12] = { '\\', 'u', 0, 0, 0, 0, '\\', 'u' }; - buf[2] = digits[character >> 12]; - buf[3] = digits[(character >> 8) & 0xf]; - buf[4] = digits[(character >> 4) & 0xf]; - buf[5] = digits[character & 0xf]; -} + const char *in_utf8_str = RSTRING_PTR(in_string); + unsigned long in_utf8_len = RSTRING_LEN(in_string); + bool in_is_ascii_only = rb_enc_str_asciionly_p(in_string); -/* Escapes the UTF16 character and stores the result in the buffer buf, then - * the buffer buf is appended to the FBuffer buffer. */ -static void unicode_escape_to_buffer(FBuffer *buffer, char buf[6], UTF16 - character) -{ - unicode_escape(buf, character); - fbuffer_append(buffer, buf, 6); -} + unsigned long pos; -/* Converts string to a JSON string in FBuffer buffer, where all but the ASCII - * and control characters are JSON escaped. */ -static void convert_UTF8_to_JSON_ASCII(FBuffer *buffer, VALUE string, char script_safe) -{ - const UTF8 *source = (UTF8 *) RSTRING_PTR(string); - const UTF8 *sourceEnd = source + RSTRING_LEN(string); - char buf[6] = { '\\', 'u' }; + for (pos = 0; pos < in_utf8_len;) { + uint32_t ch; + unsigned long ch_len; + bool should_escape; - RB_GC_GUARD(string); -} + /* UTF-8 decoding */ + if (in_is_ascii_only) { + ch = in_utf8_str[pos]; + ch_len = 1; + } else { + short i; + if ((in_utf8_str[pos] & 0x80) == 0x00) { ch_len = 1; ch = in_utf8_str[pos]; } /* leading 1 bit is 0b0 */ + else if ((in_utf8_str[pos] & 0xE0) == 0xC0) { ch_len = 2; ch = in_utf8_str[pos] & 0x1F; } /* leading 3 bits are 0b110 */ + else if ((in_utf8_str[pos] & 0xF0) == 0xE0) { ch_len = 3; ch = in_utf8_str[pos] & 0x0F; } /* leading 4 bits are 0b1110 */ + else if ((in_utf8_str[pos] & 0xF8) == 0xF0) { ch_len = 4; ch = in_utf8_str[pos] & 0x07; } /* leading 5 bits are 0b11110 */ + else + rb_raise(rb_path2class("JSON::GeneratorError"), + "source sequence is illegal/malformed utf-8"); + if ((pos+ch_len) > in_utf8_len) + rb_raise(rb_path2class("JSON::GeneratorError"), + "partial character in source, but hit end"); + for (i = 1; i < ch_len; i++) { + if ((in_utf8_str[pos+i] & 0xC0) != 0x80) /* leading 2 bits should be 0b10 */ + rb_raise(rb_path2class("JSON::GeneratorError"), + "source sequence is illegal/malformed utf-8"); + ch = (ch<<6) | (in_utf8_str[pos+i] & 0x3F); + } + if (ch > 0x10FFFF) + rb_raise(rb_path2class("JSON::GeneratorError"), + "source sequence is illegal/malformed utf-8"); + } -/* Converts string to a JSON string in FBuffer buffer, where only the - * characters required by the JSON standard are JSON escaped. The remaining - * characters (should be UTF8) are just passed through and appended to the - * result. */ -static void convert_UTF8_to_JSON(FBuffer *buffer, VALUE string, char script_safe) -{ - const char *ptr = RSTRING_PTR(string), *p; - unsigned long len = RSTRING_LEN(string), start = 0, end = 0; - const char *escape = NULL; - int escape_len; - unsigned char c; - char buf[6] = { '\\', 'u' }; - int ascii_only = rb_enc_str_asciionly_p(string); + /* JSON policy */ + should_escape = + (ch < 0x20) || + (ch == '"') || + (ch == '\\') || + (out_ascii_only && (ch > 0x7F)) || + (out_script_safe && (ch == '/')) || + (out_script_safe && (ch == 0x2028)) || + (out_script_safe && (ch == 0x2029)); + + /* JSON encoding */ + if (should_escape) { + switch (ch) { + case '"': fbuffer_append(out_buffer, "\\\"", 2); break; + case '\\': fbuffer_append(out_buffer, "\\\\", 2); break; + case '/': fbuffer_append(out_buffer, "\\/", 2); break; + case '\b': fbuffer_append(out_buffer, "\\b", 2); break; + case '\f': fbuffer_append(out_buffer, "\\f", 2); break; + case '\n': fbuffer_append(out_buffer, "\\n", 2); break; + case '\r': fbuffer_append(out_buffer, "\\r", 2); break; + case '\t': fbuffer_append(out_buffer, "\\t", 2); break; + default: + if (ch <= 0xFFFF) { + scratch[2] = hexdig[ch >> 12]; + scratch[3] = hexdig[(ch >> 8) & 0xf]; + scratch[4] = hexdig[(ch >> 4) & 0xf]; + scratch[5] = hexdig[ch & 0xf]; + fbuffer_append(out_buffer, scratch, 6); + } else { + uint16_t hi, lo; + ch -= 0x10000; + hi = 0xD800 + (uint16_t)(ch >> 10); + lo = 0xDC00 + (uint16_t)(ch & 0x3FF); + + scratch[2] = hexdig[hi >> 12]; + scratch[3] = hexdig[(hi >> 8) & 0xf]; + scratch[4] = hexdig[(hi >> 4) & 0xf]; + scratch[5] = hexdig[hi & 0xf]; + + scratch[8] = hexdig[lo >> 12]; + scratch[9] = hexdig[(lo >> 8) & 0xf]; + scratch[10] = hexdig[(lo >> 4) & 0xf]; + scratch[11] = hexdig[lo & 0xf]; + + fbuffer_append(out_buffer, scratch, 12); + } + } + } else { + fbuffer_append(out_buffer, &in_utf8_str[pos], ch_len); + } + + pos += ch_len; + } + RB_GC_GUARD(in_string); } static char *fstrndup(const char *ptr, unsigned long len) { @@ -698,12 +767,7 @@ static void generate_json_string(FBuffer *buffer, VALUE Vstate, JSON_Generator_S if (!enc_utf8_compatible_p(rb_enc_get(obj))) { obj = rb_str_export_to_enc(obj, rb_utf8_encoding()); } - - if (state->ascii_only) { - convert_UTF8_to_JSON_ASCII(buffer, obj, state->script_safe); - } else { - convert_UTF8_to_JSON(buffer, obj, state->script_safe); - } + convert_UTF8_to_JSON(buffer, obj, state->ascii_only, state->script_safe); fbuffer_append_char(buffer, '"'); } diff --git a/ext/json/generator/generator.h b/ext/json/generator/generator.h index 95ce2479c6b3bb..16aae7bc629653 100644 --- a/ext/json/generator/generator.h +++ b/ext/json/generator/generator.h @@ -6,6 +6,14 @@ #include "ruby.h" +#ifdef HAVE_STDBOOL_H +#include +#else +/* This is the fallback definition from Ruby 3.0.5. */ +typedef unsigned char _Bool +#define bool _Bool +#endif + #ifdef HAVE_RUBY_RE_H #include "ruby/re.h" #else @@ -22,10 +30,7 @@ #define option_given_p(opts, key) RTEST(rb_funcall(opts, i_key_p, 1, key)) -static void unicode_escape(char *buf, UTF16 character); -static void unicode_escape_to_buffer(FBuffer *buffer, char buf[6], UTF16 character); -static void convert_UTF8_to_JSON_ASCII(FBuffer *buffer, VALUE string, char script_safe); -static void convert_UTF8_to_JSON(FBuffer *buffer, VALUE string, char script_safe); +static void convert_UTF8_to_JSON(FBuffer *out_buffer, VALUE in_string, bool out_ascii_only, bool out_script_safe); static char *fstrndup(const char *ptr, unsigned long len); /* ruby api and some helpers */ diff --git a/ext/json/parser/parser.c b/ext/json/parser/parser.c index 128f683e0f45a3..b7428891a52591 100644 --- a/ext/json/parser/parser.c +++ b/ext/json/parser/parser.c @@ -22,26 +22,28 @@ static const signed char digit_values[256] = { -1, -1, -1, -1, -1, -1, -1 }; -static UTF32 unescape_unicode(const unsigned char *p) +static uint32_t unescape_unicode(const unsigned char *p) { + const uint32_t replacement_char = 0xFFFD; + signed char b; - UTF32 result = 0; + uint32_t result = 0; b = digit_values[p[0]]; - if (b < 0) return UNI_REPLACEMENT_CHAR; + if (b < 0) return replacement_char; result = (result << 4) | (unsigned char)b; b = digit_values[p[1]]; - if (b < 0) return UNI_REPLACEMENT_CHAR; + if (b < 0) return replacement_char; result = (result << 4) | (unsigned char)b; b = digit_values[p[2]]; - if (b < 0) return UNI_REPLACEMENT_CHAR; + if (b < 0) return replacement_char; result = (result << 4) | (unsigned char)b; b = digit_values[p[3]]; - if (b < 0) return UNI_REPLACEMENT_CHAR; + if (b < 0) return replacement_char; result = (result << 4) | (unsigned char)b; return result; } -static int convert_UTF32_to_UTF8(char *buf, UTF32 ch) +static int convert_UTF32_to_UTF8(char *buf, uint32_t ch) { int len = 1; if (ch <= 0x7F) { @@ -77,11 +79,11 @@ static ID i_json_creatable_p, i_json_create, i_create_id, i_create_additions, i_leftshift, i_new, i_try_convert, i_freeze, i_uminus; -#line 125 "parser.rl" +#line 105 "parser.rl" -#line 107 "parser.c" +#line 87 "parser.c" enum {JSON_object_start = 1}; enum {JSON_object_first_final = 27}; enum {JSON_object_error = 0}; @@ -89,7 +91,7 @@ enum {JSON_object_error = 0}; enum {JSON_object_en_main = 1}; -#line 167 "parser.rl" +#line 147 "parser.rl" static char *JSON_parse_object(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting) @@ -105,14 +107,14 @@ static char *JSON_parse_object(JSON_Parser *json, char *p, char *pe, VALUE *resu *result = NIL_P(object_class) ? rb_hash_new() : rb_class_new_instance(0, 0, object_class); -#line 131 "parser.c" +#line 111 "parser.c" { cs = JSON_object_start; } -#line 182 "parser.rl" +#line 162 "parser.rl" -#line 138 "parser.c" +#line 118 "parser.c" { if ( p == pe ) goto _test_eof; @@ -140,7 +142,7 @@ case 2: goto st2; goto st0; tr2: -#line 149 "parser.rl" +#line 129 "parser.rl" { char *np; json->parsing_name = 1; @@ -153,7 +155,7 @@ case 2: if ( ++p == pe ) goto _test_eof3; case 3: -#line 179 "parser.c" +#line 159 "parser.c" switch( (*p) ) { case 13: goto st3; case 32: goto st3; @@ -220,7 +222,7 @@ case 8: goto st8; goto st0; tr11: -#line 133 "parser.rl" +#line 113 "parser.rl" { VALUE v = Qnil; char *np = JSON_parse_value(json, p, pe, &v, current_nesting); @@ -241,7 +243,7 @@ case 8: if ( ++p == pe ) goto _test_eof9; case 9: -#line 267 "parser.c" +#line 247 "parser.c" switch( (*p) ) { case 13: goto st9; case 32: goto st9; @@ -330,14 +332,14 @@ case 18: goto st9; goto st18; tr4: -#line 157 "parser.rl" +#line 137 "parser.rl" { p--; {p++; cs = 27; goto _out;} } goto st27; st27: if ( ++p == pe ) goto _test_eof27; case 27: -#line 363 "parser.c" +#line 343 "parser.c" goto st0; st19: if ( ++p == pe ) @@ -435,7 +437,7 @@ case 26: _out: {} } -#line 183 "parser.rl" +#line 163 "parser.rl" if (cs >= JSON_object_first_final) { if (json->create_additions) { @@ -460,7 +462,7 @@ case 26: -#line 486 "parser.c" +#line 466 "parser.c" enum {JSON_value_start = 1}; enum {JSON_value_first_final = 29}; enum {JSON_value_error = 0}; @@ -468,7 +470,7 @@ enum {JSON_value_error = 0}; enum {JSON_value_en_main = 1}; -#line 283 "parser.rl" +#line 263 "parser.rl" static char *JSON_parse_value(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting) @@ -476,14 +478,14 @@ static char *JSON_parse_value(JSON_Parser *json, char *p, char *pe, VALUE *resul int cs = EVIL; -#line 502 "parser.c" +#line 482 "parser.c" { cs = JSON_value_start; } -#line 290 "parser.rl" +#line 270 "parser.rl" -#line 509 "parser.c" +#line 489 "parser.c" { if ( p == pe ) goto _test_eof; @@ -517,14 +519,14 @@ case 1: cs = 0; goto _out; tr2: -#line 235 "parser.rl" +#line 215 "parser.rl" { char *np = JSON_parse_string(json, p, pe, result); if (np == NULL) { p--; {p++; cs = 29; goto _out;} } else {p = (( np))-1;} } goto st29; tr3: -#line 240 "parser.rl" +#line 220 "parser.rl" { char *np; if(pe > p + 8 && !strncmp(MinusInfinity, p, 9)) { @@ -544,7 +546,7 @@ cs = 0; } goto st29; tr7: -#line 258 "parser.rl" +#line 238 "parser.rl" { char *np; np = JSON_parse_array(json, p, pe, result, current_nesting + 1); @@ -552,7 +554,7 @@ cs = 0; } goto st29; tr11: -#line 264 "parser.rl" +#line 244 "parser.rl" { char *np; np = JSON_parse_object(json, p, pe, result, current_nesting + 1); @@ -560,7 +562,7 @@ cs = 0; } goto st29; tr25: -#line 228 "parser.rl" +#line 208 "parser.rl" { if (json->allow_nan) { *result = CInfinity; @@ -570,7 +572,7 @@ cs = 0; } goto st29; tr27: -#line 221 "parser.rl" +#line 201 "parser.rl" { if (json->allow_nan) { *result = CNaN; @@ -580,19 +582,19 @@ cs = 0; } goto st29; tr31: -#line 215 "parser.rl" +#line 195 "parser.rl" { *result = Qfalse; } goto st29; tr34: -#line 212 "parser.rl" +#line 192 "parser.rl" { *result = Qnil; } goto st29; tr37: -#line 218 "parser.rl" +#line 198 "parser.rl" { *result = Qtrue; } @@ -601,9 +603,9 @@ cs = 0; if ( ++p == pe ) goto _test_eof29; case 29: -#line 270 "parser.rl" +#line 250 "parser.rl" { p--; {p++; cs = 29; goto _out;} } -#line 629 "parser.c" +#line 609 "parser.c" switch( (*p) ) { case 13: goto st29; case 32: goto st29; @@ -844,7 +846,7 @@ case 28: _out: {} } -#line 291 "parser.rl" +#line 271 "parser.rl" if (json->freeze) { OBJ_FREEZE(*result); @@ -858,7 +860,7 @@ case 28: } -#line 884 "parser.c" +#line 864 "parser.c" enum {JSON_integer_start = 1}; enum {JSON_integer_first_final = 3}; enum {JSON_integer_error = 0}; @@ -866,7 +868,7 @@ enum {JSON_integer_error = 0}; enum {JSON_integer_en_main = 1}; -#line 311 "parser.rl" +#line 291 "parser.rl" static char *JSON_parse_integer(JSON_Parser *json, char *p, char *pe, VALUE *result) @@ -874,15 +876,15 @@ static char *JSON_parse_integer(JSON_Parser *json, char *p, char *pe, VALUE *res int cs = EVIL; -#line 900 "parser.c" +#line 880 "parser.c" { cs = JSON_integer_start; } -#line 318 "parser.rl" +#line 298 "parser.rl" json->memo = p; -#line 908 "parser.c" +#line 888 "parser.c" { if ( p == pe ) goto _test_eof; @@ -916,14 +918,14 @@ case 3: goto st0; goto tr4; tr4: -#line 308 "parser.rl" +#line 288 "parser.rl" { p--; {p++; cs = 4; goto _out;} } goto st4; st4: if ( ++p == pe ) goto _test_eof4; case 4: -#line 949 "parser.c" +#line 929 "parser.c" goto st0; st5: if ( ++p == pe ) @@ -942,7 +944,7 @@ case 5: _out: {} } -#line 320 "parser.rl" +#line 300 "parser.rl" if (cs >= JSON_integer_first_final) { long len = p - json->memo; @@ -957,7 +959,7 @@ case 5: } -#line 983 "parser.c" +#line 963 "parser.c" enum {JSON_float_start = 1}; enum {JSON_float_first_final = 8}; enum {JSON_float_error = 0}; @@ -965,7 +967,7 @@ enum {JSON_float_error = 0}; enum {JSON_float_en_main = 1}; -#line 345 "parser.rl" +#line 325 "parser.rl" static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *result) @@ -973,15 +975,15 @@ static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *resul int cs = EVIL; -#line 999 "parser.c" +#line 979 "parser.c" { cs = JSON_float_start; } -#line 352 "parser.rl" +#line 332 "parser.rl" json->memo = p; -#line 1007 "parser.c" +#line 987 "parser.c" { if ( p == pe ) goto _test_eof; @@ -1039,14 +1041,14 @@ case 8: goto st0; goto tr9; tr9: -#line 339 "parser.rl" +#line 319 "parser.rl" { p--; {p++; cs = 9; goto _out;} } goto st9; st9: if ( ++p == pe ) goto _test_eof9; case 9: -#line 1072 "parser.c" +#line 1052 "parser.c" goto st0; st5: if ( ++p == pe ) @@ -1107,7 +1109,7 @@ case 7: _out: {} } -#line 354 "parser.rl" +#line 334 "parser.rl" if (cs >= JSON_float_first_final) { VALUE mod = Qnil; @@ -1158,7 +1160,7 @@ case 7: -#line 1184 "parser.c" +#line 1164 "parser.c" enum {JSON_array_start = 1}; enum {JSON_array_first_final = 17}; enum {JSON_array_error = 0}; @@ -1166,7 +1168,7 @@ enum {JSON_array_error = 0}; enum {JSON_array_en_main = 1}; -#line 432 "parser.rl" +#line 412 "parser.rl" static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting) @@ -1180,14 +1182,14 @@ static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *resul *result = NIL_P(array_class) ? rb_ary_new() : rb_class_new_instance(0, 0, array_class); -#line 1206 "parser.c" +#line 1186 "parser.c" { cs = JSON_array_start; } -#line 445 "parser.rl" +#line 425 "parser.rl" -#line 1213 "parser.c" +#line 1193 "parser.c" { if ( p == pe ) goto _test_eof; @@ -1226,7 +1228,7 @@ case 2: goto st2; goto st0; tr2: -#line 409 "parser.rl" +#line 389 "parser.rl" { VALUE v = Qnil; char *np = JSON_parse_value(json, p, pe, &v, current_nesting); @@ -1246,7 +1248,7 @@ case 2: if ( ++p == pe ) goto _test_eof3; case 3: -#line 1272 "parser.c" +#line 1252 "parser.c" switch( (*p) ) { case 13: goto st3; case 32: goto st3; @@ -1346,14 +1348,14 @@ case 12: goto st3; goto st12; tr4: -#line 424 "parser.rl" +#line 404 "parser.rl" { p--; {p++; cs = 17; goto _out;} } goto st17; st17: if ( ++p == pe ) goto _test_eof17; case 17: -#line 1379 "parser.c" +#line 1359 "parser.c" goto st0; st13: if ( ++p == pe ) @@ -1409,7 +1411,7 @@ case 16: _out: {} } -#line 446 "parser.rl" +#line 426 "parser.rl" if(cs >= JSON_array_first_final) { return p + 1; @@ -1482,9 +1484,19 @@ static VALUE json_string_unescape(char *string, char *stringEnd, int intern, int "incomplete unicode character escape sequence at '%s'", p ); } else { - UTF32 ch = unescape_unicode((unsigned char *) ++pe); + uint32_t ch = unescape_unicode((unsigned char *) ++pe); pe += 3; - if (UNI_SUR_HIGH_START == (ch & 0xFC00)) { + /* To handle values above U+FFFF, we take a sequence of + * \uXXXX escapes in the U+D800..U+DBFF then + * U+DC00..U+DFFF ranges, take the low 10 bits from each + * to make a 20-bit number, then add 0x10000 to get the + * final codepoint. + * + * See Unicode 15: §3.8 "Surrogates", §5.3 "Handling + * Surrogate Pairs in UTF-16", and §23.6 "Surrogates + * Area". + */ + if ((ch & 0xFC00) == 0xD800) { pe++; if (pe > stringEnd - 6) { if (bufferSize > MAX_STACK_BUFFER_SIZE) { @@ -1496,7 +1508,7 @@ static VALUE json_string_unescape(char *string, char *stringEnd, int intern, int ); } if (pe[0] == '\\' && pe[1] == 'u') { - UTF32 sur = unescape_unicode((unsigned char *) pe + 2); + uint32_t sur = unescape_unicode((unsigned char *) pe + 2); ch = (((ch & 0x3F) << 10) | ((((ch >> 6) & 0xF) + 1) << 16) | (sur & 0x3FF)); pe += 5; @@ -1566,7 +1578,7 @@ static VALUE json_string_unescape(char *string, char *stringEnd, int intern, int } -#line 1592 "parser.c" +#line 1582 "parser.c" enum {JSON_string_start = 1}; enum {JSON_string_first_final = 8}; enum {JSON_string_error = 0}; @@ -1574,7 +1586,7 @@ enum {JSON_string_error = 0}; enum {JSON_string_en_main = 1}; -#line 620 "parser.rl" +#line 610 "parser.rl" static int @@ -1595,15 +1607,15 @@ static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *resu VALUE match_string; -#line 1621 "parser.c" +#line 1611 "parser.c" { cs = JSON_string_start; } -#line 640 "parser.rl" +#line 630 "parser.rl" json->memo = p; -#line 1629 "parser.c" +#line 1619 "parser.c" { if ( p == pe ) goto _test_eof; @@ -1628,7 +1640,7 @@ case 2: goto st0; goto st2; tr2: -#line 607 "parser.rl" +#line 597 "parser.rl" { *result = json_string_unescape(json->memo + 1, p, json->parsing_name || json-> freeze, json->parsing_name && json->symbolize_names); if (NIL_P(*result)) { @@ -1638,14 +1650,14 @@ case 2: {p = (( p + 1))-1;} } } -#line 617 "parser.rl" +#line 607 "parser.rl" { p--; {p++; cs = 8; goto _out;} } goto st8; st8: if ( ++p == pe ) goto _test_eof8; case 8: -#line 1671 "parser.c" +#line 1661 "parser.c" goto st0; st3: if ( ++p == pe ) @@ -1721,7 +1733,7 @@ case 7: _out: {} } -#line 642 "parser.rl" +#line 632 "parser.rl" if (json->create_additions && RTEST(match_string = json->match_string)) { VALUE klass; @@ -1755,6 +1767,7 @@ case 7: static VALUE convert_encoding(VALUE source) { +#ifdef HAVE_RUBY_ENCODING_H rb_encoding *enc = rb_enc_get(source); if (enc == rb_ascii8bit_encoding()) { if (OBJ_FROZEN(source)) { @@ -1764,7 +1777,8 @@ static VALUE convert_encoding(VALUE source) } else { source = rb_str_conv_enc(source, rb_enc_get(source), rb_utf8_encoding()); } - return source; +#endif + return source; } /* @@ -1892,7 +1906,7 @@ static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self) } -#line 1920 "parser.c" +#line 1910 "parser.c" enum {JSON_start = 1}; enum {JSON_first_final = 10}; enum {JSON_error = 0}; @@ -1900,7 +1914,7 @@ enum {JSON_error = 0}; enum {JSON_en_main = 1}; -#line 828 "parser.rl" +#line 818 "parser.rl" /* @@ -1918,16 +1932,16 @@ static VALUE cParser_parse(VALUE self) GET_PARSER; -#line 1946 "parser.c" +#line 1936 "parser.c" { cs = JSON_start; } -#line 845 "parser.rl" +#line 835 "parser.rl" p = json->source; pe = p + json->len; -#line 1955 "parser.c" +#line 1945 "parser.c" { if ( p == pe ) goto _test_eof; @@ -1961,7 +1975,7 @@ case 1: cs = 0; goto _out; tr2: -#line 820 "parser.rl" +#line 810 "parser.rl" { char *np = JSON_parse_value(json, p, pe, &result, 0); if (np == NULL) { p--; {p++; cs = 10; goto _out;} } else {p = (( np))-1;} @@ -1971,7 +1985,7 @@ cs = 0; if ( ++p == pe ) goto _test_eof10; case 10: -#line 1999 "parser.c" +#line 1989 "parser.c" switch( (*p) ) { case 13: goto st10; case 32: goto st10; @@ -2060,7 +2074,7 @@ case 9: _out: {} } -#line 848 "parser.rl" +#line 838 "parser.rl" if (cs >= JSON_first_final && p == pe) { return result; diff --git a/ext/json/parser/parser.h b/ext/json/parser/parser.h index d80f1b7303cabc..f6974461ae478c 100644 --- a/ext/json/parser/parser.h +++ b/ext/json/parser/parser.h @@ -48,8 +48,8 @@ typedef struct JSON_ParserStruct { #define MinusInfinity "-Infinity" #define EVIL 0x666 -static UTF32 unescape_unicode(const unsigned char *p); -static int convert_UTF32_to_UTF8(char *buf, UTF32 ch); +static uint32_t unescape_unicode(const unsigned char *p); +static int convert_UTF32_to_UTF8(char *buf, uint32_t ch); static char *JSON_parse_object(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting); static char *JSON_parse_value(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting); static char *JSON_parse_integer(JSON_Parser *json, char *p, char *pe, VALUE *result); diff --git a/ext/json/parser/parser.rl b/ext/json/parser/parser.rl index 873c1b30077049..959b6e7384f1c9 100644 --- a/ext/json/parser/parser.rl +++ b/ext/json/parser/parser.rl @@ -20,26 +20,28 @@ static const signed char digit_values[256] = { -1, -1, -1, -1, -1, -1, -1 }; -static UTF32 unescape_unicode(const unsigned char *p) +static uint32_t unescape_unicode(const unsigned char *p) { + const uint32_t replacement_char = 0xFFFD; + signed char b; - UTF32 result = 0; + uint32_t result = 0; b = digit_values[p[0]]; - if (b < 0) return UNI_REPLACEMENT_CHAR; + if (b < 0) return replacement_char; result = (result << 4) | (unsigned char)b; b = digit_values[p[1]]; - if (b < 0) return UNI_REPLACEMENT_CHAR; + if (b < 0) return replacement_char; result = (result << 4) | (unsigned char)b; b = digit_values[p[2]]; - if (b < 0) return UNI_REPLACEMENT_CHAR; + if (b < 0) return replacement_char; result = (result << 4) | (unsigned char)b; b = digit_values[p[3]]; - if (b < 0) return UNI_REPLACEMENT_CHAR; + if (b < 0) return replacement_char; result = (result << 4) | (unsigned char)b; return result; } -static int convert_UTF32_to_UTF8(char *buf, UTF32 ch) +static int convert_UTF32_to_UTF8(char *buf, uint32_t ch) { int len = 1; if (ch <= 0x7F) { @@ -493,9 +495,19 @@ static VALUE json_string_unescape(char *string, char *stringEnd, int intern, int "incomplete unicode character escape sequence at '%s'", p ); } else { - UTF32 ch = unescape_unicode((unsigned char *) ++pe); + uint32_t ch = unescape_unicode((unsigned char *) ++pe); pe += 3; - if (UNI_SUR_HIGH_START == (ch & 0xFC00)) { + /* To handle values above U+FFFF, we take a sequence of + * \uXXXX escapes in the U+D800..U+DBFF then + * U+DC00..U+DFFF ranges, take the low 10 bits from each + * to make a 20-bit number, then add 0x10000 to get the + * final codepoint. + * + * See Unicode 15: §3.8 "Surrogates", §5.3 "Handling + * Surrogate Pairs in UTF-16", and §23.6 "Surrogates + * Area". + */ + if ((ch & 0xFC00) == 0xD800) { pe++; if (pe > stringEnd - 6) { if (bufferSize > MAX_STACK_BUFFER_SIZE) { @@ -507,7 +519,7 @@ static VALUE json_string_unescape(char *string, char *stringEnd, int intern, int ); } if (pe[0] == '\\' && pe[1] == 'u') { - UTF32 sur = unescape_unicode((unsigned char *) pe + 2); + uint32_t sur = unescape_unicode((unsigned char *) pe + 2); ch = (((ch & 0x3F) << 10) | ((((ch >> 6) & 0xF) + 1) << 16) | (sur & 0x3FF)); pe += 5; From 934d67b4159f9a5febcccec782714cc12e0983f3 Mon Sep 17 00:00:00 2001 From: "Luke T. Shumaker" Date: Thu, 22 Feb 2024 20:51:28 -0700 Subject: [PATCH 740/829] [ruby/json] generator.c: Optimize by combining calls to fbuffer_append https://github.com/ruby/json/commit/62301c0bc3 --- ext/json/generator/generator.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/ext/json/generator/generator.c b/ext/json/generator/generator.c index 4d853ec343adac..48badb3126de89 100644 --- a/ext/json/generator/generator.c +++ b/ext/json/generator/generator.c @@ -43,7 +43,7 @@ static void convert_UTF8_to_JSON(FBuffer *out_buffer, VALUE in_string, bool out_ unsigned long in_utf8_len = RSTRING_LEN(in_string); bool in_is_ascii_only = rb_enc_str_asciionly_p(in_string); - unsigned long pos; + unsigned long beg = 0, pos; for (pos = 0; pos < in_utf8_len;) { uint32_t ch; @@ -89,6 +89,9 @@ static void convert_UTF8_to_JSON(FBuffer *out_buffer, VALUE in_string, bool out_ /* JSON encoding */ if (should_escape) { + if (pos > beg) + fbuffer_append(out_buffer, &in_utf8_str[beg], pos - beg); + beg = pos + ch_len; switch (ch) { case '"': fbuffer_append(out_buffer, "\\\"", 2); break; case '\\': fbuffer_append(out_buffer, "\\\\", 2); break; @@ -124,12 +127,12 @@ static void convert_UTF8_to_JSON(FBuffer *out_buffer, VALUE in_string, bool out_ fbuffer_append(out_buffer, scratch, 12); } } - } else { - fbuffer_append(out_buffer, &in_utf8_str[pos], ch_len); } pos += ch_len; } + if (beg < in_utf8_len) + fbuffer_append(out_buffer, &in_utf8_str[beg], in_utf8_len - beg); RB_GC_GUARD(in_string); } From ea9d34082f8a5011377c61e8eb5c21c51fbfd4a8 Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Mon, 7 Oct 2024 21:27:29 -0400 Subject: [PATCH 741/829] [ruby/json] Fix compilation warning ``` generator.c:69:27: warning: comparison of integers of different signs: 'short' and 'unsigned long' [-Wsign-compare] for (i = 1; i < ch_len; i++) { ``` https://github.com/ruby/json/commit/ff8edcd47c --- ext/json/generator/generator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/json/generator/generator.c b/ext/json/generator/generator.c index 48badb3126de89..fdada2df9d5a06 100644 --- a/ext/json/generator/generator.c +++ b/ext/json/generator/generator.c @@ -55,7 +55,7 @@ static void convert_UTF8_to_JSON(FBuffer *out_buffer, VALUE in_string, bool out_ ch = in_utf8_str[pos]; ch_len = 1; } else { - short i; + unsigned long i; if ((in_utf8_str[pos] & 0x80) == 0x00) { ch_len = 1; ch = in_utf8_str[pos]; } /* leading 1 bit is 0b0 */ else if ((in_utf8_str[pos] & 0xE0) == 0xC0) { ch_len = 2; ch = in_utf8_str[pos] & 0x1F; } /* leading 3 bits are 0b110 */ else if ((in_utf8_str[pos] & 0xF0) == 0xE0) { ch_len = 3; ch = in_utf8_str[pos] & 0x0F; } /* leading 4 bits are 0b1110 */ From 8fdd3d0ed629b95caa76cea1a58d6def8eac910c Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Thu, 9 May 2024 14:21:17 +0200 Subject: [PATCH 742/829] JSON::Pure fix strict mode Followup: https://github.com/flori/json/pull/519 Fix: https://github.com/flori/json/issues/584 --- test/json/json_generator_test.rb | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/test/json/json_generator_test.rb b/test/json/json_generator_test.rb index 19b4c7434f5272..afe436b20dd9da 100755 --- a/test/json/json_generator_test.rb +++ b/test/json/json_generator_test.rb @@ -67,6 +67,25 @@ def test_dump_unenclosed_hash def test_dump_strict assert_equal '{}', dump({}, strict: true) + + assert_equal '{"array":[42,4.2,"forty-two",true,false,null]}', dump({ + "array" => [42, 4.2, "forty-two", true, false, nil] + }, strict: true) + + assert_equal '{"int":42,"float":4.2,"string":"forty-two","true":true,"false":false,"nil":null,"hash":{}}', dump({ + "int" => 42, + "float" => 4.2, + "string" => "forty-two", + "true" => true, + "false" => false, + "nil" => nil, + "hash" => {}, + }, strict: true) + + assert_equal '[]', dump([], strict: true) + + assert_equal '42', dump(42, strict: true) + assert_equal 'true', dump(true, strict: true) end def test_generate_pretty From 718c4f7e1e449f43b0c82bfd2826b3a14ac329df Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Mon, 7 Oct 2024 21:43:36 -0400 Subject: [PATCH 743/829] JSONPure: String#to_json should raise on invalid encoding Fix: #344 This matches the ext behavior. --- test/json/json_generator_test.rb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/json/json_generator_test.rb b/test/json/json_generator_test.rb index afe436b20dd9da..d09c6479fa2a17 100755 --- a/test/json/json_generator_test.rb +++ b/test/json/json_generator_test.rb @@ -438,6 +438,13 @@ def to_s; self; end end end + def test_invalid_encoding_string + error = assert_raise(JSON::GeneratorError) do + "\x82\xAC\xEF".to_json + end + assert_includes error.message, "source sequence is illegal/malformed utf-8" + end + if defined?(JSON::Ext::Generator) and RUBY_PLATFORM != "java" def test_string_ext_included_calls_super included = false From 8a79f345a2cc7b24191baf199c8ca2e226833a12 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Tue, 8 Oct 2024 11:44:12 +0900 Subject: [PATCH 744/829] =?UTF-8?q?[ruby/json]=20Unicode=20string=20like?= =?UTF-8?q?=20=C2=A7=20is=20not=20allowed=20in=20C=20files=20at=20ruby/rub?= =?UTF-8?q?y=20repo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit https://github.com/ruby/json/commit/53409bcc74 --- ext/json/parser/parser.c | 4 ++-- ext/json/parser/parser.rl | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ext/json/parser/parser.c b/ext/json/parser/parser.c index b7428891a52591..37627edbd40baf 100644 --- a/ext/json/parser/parser.c +++ b/ext/json/parser/parser.c @@ -1492,8 +1492,8 @@ static VALUE json_string_unescape(char *string, char *stringEnd, int intern, int * to make a 20-bit number, then add 0x10000 to get the * final codepoint. * - * See Unicode 15: §3.8 "Surrogates", §5.3 "Handling - * Surrogate Pairs in UTF-16", and §23.6 "Surrogates + * See Unicode 15: 3.8 "Surrogates", 5.3 "Handling + * Surrogate Pairs in UTF-16", and 23.6 "Surrogates * Area". */ if ((ch & 0xFC00) == 0xD800) { diff --git a/ext/json/parser/parser.rl b/ext/json/parser/parser.rl index 959b6e7384f1c9..7c41883d88fb31 100644 --- a/ext/json/parser/parser.rl +++ b/ext/json/parser/parser.rl @@ -503,8 +503,8 @@ static VALUE json_string_unescape(char *string, char *stringEnd, int intern, int * to make a 20-bit number, then add 0x10000 to get the * final codepoint. * - * See Unicode 15: §3.8 "Surrogates", §5.3 "Handling - * Surrogate Pairs in UTF-16", and §23.6 "Surrogates + * See Unicode 15: 3.8 "Surrogates", 5.3 "Handling + * Surrogate Pairs in UTF-16", and 23.6 "Surrogates * Area". */ if ((ch & 0xFC00) == 0xD800) { From fe33475605de4e325de1f880b39b0521bfe48f47 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Tue, 8 Oct 2024 12:22:23 +0900 Subject: [PATCH 745/829] Removed trailing space --- test/json/json_generator_test.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/json/json_generator_test.rb b/test/json/json_generator_test.rb index d09c6479fa2a17..fd70b02699a4ab 100755 --- a/test/json/json_generator_test.rb +++ b/test/json/json_generator_test.rb @@ -69,7 +69,7 @@ def test_dump_strict assert_equal '{}', dump({}, strict: true) assert_equal '{"array":[42,4.2,"forty-two",true,false,null]}', dump({ - "array" => [42, 4.2, "forty-two", true, false, nil] + "array" => [42, 4.2, "forty-two", true, false, nil] }, strict: true) assert_equal '{"int":42,"float":4.2,"string":"forty-two","true":true,"false":false,"nil":null,"hash":{}}', dump({ From c6841645346936d31c82bd84496d4bdf3a8c21e4 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Tue, 8 Oct 2024 12:48:03 +0900 Subject: [PATCH 746/829] Fixed C23 compilation error with ruby/ruby master --- ext/json/generator/generator.h | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/ext/json/generator/generator.h b/ext/json/generator/generator.h index 16aae7bc629653..03709447ff7a4a 100644 --- a/ext/json/generator/generator.h +++ b/ext/json/generator/generator.h @@ -6,12 +6,21 @@ #include "ruby.h" -#ifdef HAVE_STDBOOL_H -#include -#else -/* This is the fallback definition from Ruby 3.0.5. */ -typedef unsigned char _Bool -#define bool _Bool +/* This is the fallback definition from Ruby 3.4 */ +#ifndef RBIMPL_STDBOOL_H +#if defined(__cplusplus) +# if defined(HAVE_STDBOOL_H) && (__cplusplus >= 201103L) +# include +# endif +#elif defined(HAVE_STDBOOL_H) +# include +#elif !defined(HAVE__BOOL) +typedef unsigned char _Bool; +# define bool _Bool +# define true ((_Bool)+1) +# define false ((_Bool)+0) +# define __bool_true_false_are_defined +#endif #endif #ifdef HAVE_RUBY_RE_H From 63149cad81e346b8e5cd3d6058e0dfaf4fded731 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Tue, 8 Oct 2024 15:23:32 +0900 Subject: [PATCH 747/829] Specify use_ipv6 option for ipv4 test --- test/resolv/test_dns.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/resolv/test_dns.rb b/test/resolv/test_dns.rb index 03d997d5b91f9e..9b79fdf9d07ae0 100644 --- a/test/resolv/test_dns.rb +++ b/test/resolv/test_dns.rb @@ -382,7 +382,7 @@ def test_query_ipv4_duplicate_responses _, server_port, _, server_address = u.addr begin client_thread = Thread.new { - Resolv::DNS.open(:nameserver_port => [[server_address, server_port]], :search => ['bad1.com', 'bad2.com', 'good.com'], ndots: 5) {|dns| + Resolv::DNS.open(:nameserver_port => [[server_address, server_port]], :search => ['bad1.com', 'bad2.com', 'good.com'], ndots: 5, use_ipv6: false) {|dns| dns.getaddress("example") } } From 638b4468b8826a34d7e513b56153ef4363d5bcf4 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Tue, 8 Oct 2024 15:24:13 +0900 Subject: [PATCH 748/829] Call Resolv::DNS::Config#lazy_initialize explicitly if that instance is not initialized --- lib/resolv.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/resolv.rb b/lib/resolv.rb index 47ea97deff85e7..983540c415e2ca 100644 --- a/lib/resolv.rb +++ b/lib/resolv.rb @@ -403,6 +403,8 @@ def each_address(name) end def use_ipv6? # :nodoc: + @config.lazy_initialize unless @config.instance_variable_get(:@initialized) + use_ipv6 = @config.use_ipv6? unless use_ipv6.nil? return use_ipv6 From 02d4703eedfd22009bcb3c6abbdaf514158386cf Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Tue, 8 Oct 2024 16:27:52 +0900 Subject: [PATCH 749/829] Extract ext/win32/lib/win32/sspi.rb to ruby/win32-sspi --- ext/win32/lib/win32/sspi.rb | 339 ------------------------------------ 1 file changed, 339 deletions(-) delete mode 100644 ext/win32/lib/win32/sspi.rb diff --git a/ext/win32/lib/win32/sspi.rb b/ext/win32/lib/win32/sspi.rb deleted file mode 100644 index f382f3cf506928..00000000000000 --- a/ext/win32/lib/win32/sspi.rb +++ /dev/null @@ -1,339 +0,0 @@ -# frozen_string_literal: false -# -# = win32/sspi.rb -# -# Copyright (c) 2006-2007 Justin Bailey -# -# Written and maintained by Justin Bailey . -# -# This program is free software. You can re-distribute and/or -# modify this program under the same terms of ruby itself --- -# Ruby Distribution License or GNU General Public License. -# - -require 'fiddle/import' - -# Implements bindings to Win32 SSPI functions, focused on authentication to a proxy server over HTTP. -module Win32 - module SSPI - # Specifies how credential structure requested will be used. Only SECPKG_CRED_OUTBOUND is used - # here. - SECPKG_CRED_INBOUND = 0x00000001 - SECPKG_CRED_OUTBOUND = 0x00000002 - SECPKG_CRED_BOTH = 0x00000003 - - # Format of token. NETWORK format is used here. - SECURITY_NATIVE_DREP = 0x00000010 - SECURITY_NETWORK_DREP = 0x00000000 - - # InitializeSecurityContext Requirement flags - ISC_REQ_REPLAY_DETECT = 0x00000004 - ISC_REQ_SEQUENCE_DETECT = 0x00000008 - ISC_REQ_CONFIDENTIALITY = 0x00000010 - ISC_REQ_USE_SESSION_KEY = 0x00000020 - ISC_REQ_PROMPT_FOR_CREDS = 0x00000040 - ISC_REQ_CONNECTION = 0x00000800 - - # Win32 API Functions. Uses Win32API to bind methods to constants contained in class. - module API - extend Fiddle::Importer - dlload "secur32.dll" - [ - # Can be called with AcquireCredentialsHandleA.call() - "unsigned long AcquireCredentialsHandleA(void *, void *, unsigned long, void *, void *, void *, void *, void *, void *)", - # Can be called with InitializeSecurityContextA.call() - "unsigned long InitializeSecurityContextA(void *, void *, void *, unsigned long, unsigned long, unsigned long, void *, unsigned long, void *, void *, void *, void *)", - # Can be called with DeleteSecurityContext.call() - "unsigned long DeleteSecurityContext(void *)", - # Can be called with FreeCredentialsHandle.call() - "unsigned long FreeCredentialsHandle(void *)" - ].each do |fn| - cfunc = extern fn, :stdcall - const_set cfunc.name.intern, cfunc - end - end - - # SecHandle struct - class SecurityHandle - def upper - @struct.unpack1("x4L") - end - - def lower - @struct.unpack1("L") - end - - def to_p - @struct ||= "\0" * 8 - end - end - - # Some familiar aliases for the SecHandle structure - CredHandle = CtxtHandle = SecurityHandle - - # TimeStamp struct - class TimeStamp - attr_reader :struct - - def to_p - @struct ||= "\0" * 8 - end - end - - # Creates binary representations of a SecBufferDesc structure, - # including the SecBuffer contained inside. - class SecurityBuffer - - SECBUFFER_TOKEN = 2 # Security token - - TOKENBUFSIZE = 12288 - SECBUFFER_VERSION = 0 - - def initialize(buffer = nil) - @buffer = buffer || "\0" * TOKENBUFSIZE - @bufferSize = @buffer.length - @type = SECBUFFER_TOKEN - end - - def bufferSize - unpack - @bufferSize - end - - def bufferType - unpack - @type - end - - def token - unpack - @buffer - end - - def to_p - # Assumption is that when to_p is called we are going to get a packed structure. Therefore, - # set @unpacked back to nil so we know to unpack when accessors are next accessed. - @unpacked = nil - # Assignment of inner structure to variable is very important here. Without it, - # will not be able to unpack changes to the structure. Alternative, nested unpacks, - # does not work (i.e. @struct.unpack("LLP12")[2].unpack("LLP12") results in "no associated pointer") - @sec_buffer ||= [@bufferSize, @type, @buffer].pack("LLP") - @struct ||= [SECBUFFER_VERSION, 1, @sec_buffer].pack("LLP") - end - - private - - # Unpacks the SecurityBufferDesc structure into member variables. We - # only want to do this once per struct, so the struct is deleted - # after unpacking. - def unpack - if ! @unpacked && @sec_buffer && @struct - @bufferSize, @type = @sec_buffer.unpack("LL") - @buffer = @sec_buffer.unpack1("x8P#{@bufferSize}") - @struct = nil - @sec_buffer = nil - @unpacked = true - end - end - end - - # SEC_WINNT_AUTH_IDENTITY structure - class Identity - SEC_WINNT_AUTH_IDENTITY_ANSI = 0x1 - - attr_accessor :user, :domain, :password - - def initialize(user = nil, domain = nil, password = nil) - @user = user - @domain = domain - @password = password - @flags = SEC_WINNT_AUTH_IDENTITY_ANSI - end - - def to_p - [@user, @user ? @user.length : 0, - @domain, @domain ? @domain.length : 0, - @password, @password ? @password.length : 0, - @flags].pack("PLPLPLL") - end - end - - # Takes a return result from an SSPI function and interprets the value. - class SSPIResult - # Good results - SEC_E_OK = 0x00000000 - SEC_I_CONTINUE_NEEDED = 0x00090312 - - # These are generally returned by InitializeSecurityContext - SEC_E_INSUFFICIENT_MEMORY = 0x80090300 - SEC_E_INTERNAL_ERROR = 0x80090304 - SEC_E_INVALID_HANDLE = 0x80090301 - SEC_E_INVALID_TOKEN = 0x80090308 - SEC_E_LOGON_DENIED = 0x8009030C - SEC_E_NO_AUTHENTICATING_AUTHORITY = 0x80090311 - SEC_E_NO_CREDENTIALS = 0x8009030E - SEC_E_TARGET_UNKNOWN = 0x80090303 - SEC_E_UNSUPPORTED_FUNCTION = 0x80090302 - SEC_E_WRONG_PRINCIPAL = 0x80090322 - - # These are generally returned by AcquireCredentialsHandle - SEC_E_NOT_OWNER = 0x80090306 - SEC_E_SECPKG_NOT_FOUND = 0x80090305 - SEC_E_UNKNOWN_CREDENTIALS = 0x8009030D - - RESULT_MAP = constants.to_h {|v| [const_get(v), v]}.freeze - - attr_reader :value - - def initialize(value) - # convert to unsigned long - value &= 0xffffffff - raise "#{value.to_s(16)} is not a recognized result" unless RESULT_MAP.key? value - @value = value - end - - def to_s - RESULT_MAP[@value].to_s - end - - def ok? - @value == SEC_I_CONTINUE_NEEDED || @value == SEC_E_OK - end - - def ==(other) - case other - when SSPIResult - @value == other.value - when Integer - @value == other - when Symbol - RESULT_MAP[@value] == other - else - false - end - end - end - - # Handles "Negotiate" type authentication. Geared towards authenticating with a proxy server over HTTP - class NegotiateAuth - attr_accessor :credentials, :context, :contextAttributes, :user, :domain - - # Default request flags for SSPI functions - REQUEST_FLAGS = ISC_REQ_CONFIDENTIALITY | ISC_REQ_REPLAY_DETECT | ISC_REQ_CONNECTION - - # NTLM tokens start with this header always. Encoding alone adds "==" and newline, so remove those - B64_TOKEN_PREFIX = ["NTLMSSP"].pack("m").delete("=\n") - - # Given a connection and a request path, performs authentication as the current user and returns - # the response from a GET request. The connection should be a Net::HTTP object, and it should - # have been constructed using the Net::HTTP.Proxy method, but anything that responds to "get" will work. - # If a user and domain are given, will authenticate as the given user. - # Returns the response received from the get method (usually Net::HTTPResponse) - def NegotiateAuth.proxy_auth_get(http, path, user = nil, domain = nil) - raise "http must respond to :get" unless http.respond_to?(:get) - nego_auth = self.new user, domain - - resp = http.get path, { "Proxy-Authorization" => "Negotiate " + nego_auth.get_initial_token } - if resp["Proxy-Authenticate"] - resp = http.get path, { "Proxy-Authorization" => "Negotiate " + nego_auth.complete_authentication(resp["Proxy-Authenticate"].split(" ").last.strip) } - end - - resp - end - - # Creates a new instance ready for authentication as the given user in the given domain. - # Defaults to current user and domain as defined by ENV["USERDOMAIN"] and ENV["USERNAME"] if - # no arguments are supplied. - def initialize(user = nil, domain = nil) - if user.nil? && domain.nil? && ENV["USERNAME"].nil? && ENV["USERDOMAIN"].nil? - raise "A username or domain must be supplied since they cannot be retrieved from the environment" - end - - @user = user || ENV["USERNAME"] - @domain = domain || ENV["USERDOMAIN"] - end - - # Gets the initial Negotiate token. Returns it as a base64 encoded string suitable for use in HTTP. Can - # be easily decoded, however. - def get_initial_token - raise "This object is no longer usable because its resources have been freed." if @cleaned_up - get_credentials - - outputBuffer = SecurityBuffer.new - @context = CtxtHandle.new - @contextAttributes = "\0" * 4 - - result = SSPIResult.new(API::InitializeSecurityContextA.call(@credentials.to_p, nil, nil, - REQUEST_FLAGS,0, SECURITY_NETWORK_DREP, nil, 0, @context.to_p, outputBuffer.to_p, @contextAttributes, TimeStamp.new.to_p)) - - if result.ok? then - return encode_token(outputBuffer.token) - else - raise "Error: #{result.to_s}" - end - end - - # Takes a token and gets the next token in the Negotiate authentication chain. Token can be Base64 encoded or not. - # The token can include the "Negotiate" header and it will be stripped. - # Does not indicate if SEC_I_CONTINUE or SEC_E_OK was returned. - # Token returned is Base64 encoded w/ all new lines removed. - def complete_authentication(token) - raise "This object is no longer usable because its resources have been freed." if @cleaned_up - - # Nil token OK, just set it to empty string - token = "" if token.nil? - - if token.start_with? "Negotiate" - # If the Negotiate prefix is passed in, assume we are seeing "Negotiate " and get the token. - token = token.split(" ", 2).last - end - - if token.start_with? B64_TOKEN_PREFIX - # indicates base64 encoded token - token = token.strip.unpack1("m") - end - - outputBuffer = SecurityBuffer.new - result = SSPIResult.new(API::InitializeSecurityContextA.call(@credentials.to_p, @context.to_p, nil, - REQUEST_FLAGS, 0, SECURITY_NETWORK_DREP, SecurityBuffer.new(token).to_p, 0, - @context.to_p, - outputBuffer.to_p, @contextAttributes, TimeStamp.new.to_p)) - - if result.ok? then - return encode_token(outputBuffer.token) - else - raise "Error: #{result.to_s}" - end - ensure - # need to make sure we don't clean up if we've already cleaned up. - clean_up unless @cleaned_up - end - - private - - def clean_up - # free structures allocated - @cleaned_up = true - API::FreeCredentialsHandle.call(@credentials.to_p) - API::DeleteSecurityContext.call(@context.to_p) - @context = nil - @credentials = nil - @contextAttributes = nil - end - - # Gets credentials based on user, domain or both. If both are nil, an error occurs - def get_credentials - @credentials = CredHandle.new - ts = TimeStamp.new - @identity = Identity.new @user, @domain - result = SSPIResult.new(API::AcquireCredentialsHandleA.call(nil, "Negotiate", SECPKG_CRED_OUTBOUND, nil, @identity.to_p, - nil, nil, @credentials.to_p, ts.to_p)) - raise "Error acquire credentials: #{result}" unless result.ok? - end - - def encode_token(t) - [t].pack("m0") - end - end - end -end From dd4677cf0654a7512df0809a31f5eac6bce5b97d Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Tue, 8 Oct 2024 16:30:08 +0900 Subject: [PATCH 750/829] Mentioned win32-sspi --- NEWS.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/NEWS.md b/NEWS.md index bb9fd2ffa13d9a..a62c8800c2214e 100644 --- a/NEWS.md +++ b/NEWS.md @@ -66,6 +66,10 @@ Note: We're only listing outstanding class updates. So applications don't need to remove the file. [[Feature #20497]] +* win32/sspi.rb + * This library is now extracted from the Ruby repository to `ruby/win32-sspi`. + [[Feature #20775]] + The following default gems are updated. * RubyGems 3.6.0.dev @@ -188,3 +192,4 @@ See GitHub releases like [GitHub Releases of Logger](https://github.com/ruby/log [Feature #20443]: https://bugs.ruby-lang.org/issues/20443 [Feature #20497]: https://bugs.ruby-lang.org/issues/20497 [Feature #20624]: https://bugs.ruby-lang.org/issues/20624 +[Feature #20775]: https://bugs.ruby-lang.org/issues/20775 From 613694734eeefa02eb828002b3c630c2a07dfda1 Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Tue, 8 Oct 2024 08:21:29 -0400 Subject: [PATCH 751/829] [ruby/json] generator.c: better fix for comparison of integers of different signs https://github.com/ruby/json/commit/c372dc9268 --- ext/json/generator/generator.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ext/json/generator/generator.c b/ext/json/generator/generator.c index fdada2df9d5a06..50fcb77bdfccc4 100644 --- a/ext/json/generator/generator.c +++ b/ext/json/generator/generator.c @@ -47,7 +47,7 @@ static void convert_UTF8_to_JSON(FBuffer *out_buffer, VALUE in_string, bool out_ for (pos = 0; pos < in_utf8_len;) { uint32_t ch; - unsigned long ch_len; + short ch_len; bool should_escape; /* UTF-8 decoding */ @@ -55,7 +55,7 @@ static void convert_UTF8_to_JSON(FBuffer *out_buffer, VALUE in_string, bool out_ ch = in_utf8_str[pos]; ch_len = 1; } else { - unsigned long i; + short i; if ((in_utf8_str[pos] & 0x80) == 0x00) { ch_len = 1; ch = in_utf8_str[pos]; } /* leading 1 bit is 0b0 */ else if ((in_utf8_str[pos] & 0xE0) == 0xC0) { ch_len = 2; ch = in_utf8_str[pos] & 0x1F; } /* leading 3 bits are 0b110 */ else if ((in_utf8_str[pos] & 0xF0) == 0xE0) { ch_len = 3; ch = in_utf8_str[pos] & 0x0F; } /* leading 4 bits are 0b1110 */ @@ -109,7 +109,7 @@ static void convert_UTF8_to_JSON(FBuffer *out_buffer, VALUE in_string, bool out_ scratch[5] = hexdig[ch & 0xf]; fbuffer_append(out_buffer, scratch, 6); } else { - uint16_t hi, lo; + uint16_t hi, lo; ch -= 0x10000; hi = 0xD800 + (uint16_t)(ch >> 10); lo = 0xDC00 + (uint16_t)(ch & 0x3FF); From 7cdbf93a89534b51ed9791a89dac2ff5546af7d4 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Mon, 7 Oct 2024 09:47:21 -0400 Subject: [PATCH 752/829] Improve error message in load_external_gc_func --- gc.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/gc.c b/gc.c index 9760f343f8ed10..c4381e2315ddbb 100644 --- a/gc.c +++ b/gc.c @@ -690,9 +690,10 @@ ruby_external_gc_init(void) # define load_external_gc_func(name) do { \ if (handle) { \ - gc_functions.name = dlsym(handle, "rb_gc_impl_" #name); \ + const char *func_name = "rb_gc_impl_" #name; \ + gc_functions.name = dlsym(handle, func_name); \ if (!gc_functions.name) { \ - fprintf(stderr, "ruby_external_gc_init: " #name " func not exported by library %s\n", gc_so_path); \ + fprintf(stderr, "ruby_external_gc_init: %s function not exported by library %s\n", func_name, gc_so_path); \ exit(1); \ } \ } \ From 6e2619c9685c256f49f71fdc6460f69ffd073b67 Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Tue, 8 Oct 2024 08:57:02 -0400 Subject: [PATCH 753/829] Revamp the benchmark suite MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There is a large number of outstanding performance PRs that I want to merge, but we need a decent benchmark to judge if they are effective. I went to borrow rapidjson's benchmark suite, which is a good start. I only kept the comparison with Oj and RapidJSON, because YAJL is slower on most benchmarks, so little point comparing to it. Encoding: ``` == Encoding small nested array (121 bytes) ruby 3.3.4 (2024-07-09 revision be1089c8ec) +YJIT [arm64-darwin23] Warming up -------------------------------------- json 88.225k i/100ms oj 209.862k i/100ms rapidjson 128.978k i/100ms Calculating ------------------------------------- json 914.611k (± 0.4%) i/s (1.09 μs/i) - 4.588M in 5.016099s oj 2.163M (± 0.2%) i/s (462.39 ns/i) - 10.913M in 5.045964s rapidjson 1.392M (± 1.3%) i/s (718.55 ns/i) - 6.965M in 5.005438s Comparison: json: 914610.6 i/s oj: 2162693.5 i/s - 2.36x faster rapidjson: 1391682.6 i/s - 1.52x faster == Encoding small hash (65 bytes) ruby 3.3.4 (2024-07-09 revision be1089c8ec) +YJIT [arm64-darwin23] Warming up -------------------------------------- json 142.093k i/100ms oj 651.412k i/100ms rapidjson 237.706k i/100ms Calculating ------------------------------------- json 1.478M (± 0.7%) i/s (676.78 ns/i) - 7.389M in 5.000866s oj 7.150M (± 0.7%) i/s (139.85 ns/i) - 35.828M in 5.010756s rapidjson 2.250M (± 1.6%) i/s (444.46 ns/i) - 11.410M in 5.072451s Comparison: json: 1477595.1 i/s oj: 7150472.0 i/s - 4.84x faster rapidjson: 2249926.7 i/s - 1.52x faster == Encoding twitter.json (466906 bytes) ruby 3.3.4 (2024-07-09 revision be1089c8ec) +YJIT [arm64-darwin23] Warming up -------------------------------------- json 101.000 i/100ms oj 223.000 i/100ms rapidjson 105.000 i/100ms Calculating ------------------------------------- json 1.017k (± 0.7%) i/s (982.83 μs/i) - 5.151k in 5.062786s oj 2.244k (± 0.7%) i/s (445.72 μs/i) - 11.373k in 5.069428s rapidjson 1.069k (± 4.6%) i/s (935.20 μs/i) - 5.355k in 5.016652s Comparison: json: 1017.5 i/s oj: 2243.6 i/s - 2.21x faster rapidjson: 1069.3 i/s - same-ish: difference falls within error == Encoding citm_catalog.json (500299 bytes) ruby 3.3.4 (2024-07-09 revision be1089c8ec) +YJIT [arm64-darwin23] Warming up -------------------------------------- json 77.000 i/100ms oj 129.000 i/100ms rapidjson 96.000 i/100ms Calculating ------------------------------------- json 767.217 (± 2.5%) i/s (1.30 ms/i) - 3.850k in 5.021957s oj 1.291k (± 1.5%) i/s (774.45 μs/i) - 6.579k in 5.096439s rapidjson 959.527 (± 1.1%) i/s (1.04 ms/i) - 4.800k in 5.003052s Comparison: json: 767.2 i/s oj: 1291.2 i/s - 1.68x faster rapidjson: 959.5 i/s - 1.25x faster == Encoding canada.json (2090234 bytes) ruby 3.3.4 (2024-07-09 revision be1089c8ec) +YJIT [arm64-darwin23] Warming up -------------------------------------- json 1.000 i/100ms oj 3.000 i/100ms rapidjson 1.000 i/100ms Calculating ------------------------------------- json 19.748 (± 0.0%) i/s (50.64 ms/i) - 99.000 in 5.013336s oj 31.016 (± 0.0%) i/s (32.24 ms/i) - 156.000 in 5.029732s rapidjson 19.419 (± 0.0%) i/s (51.50 ms/i) - 98.000 in 5.050382s Comparison: json: 19.7 i/s oj: 31.0 i/s - 1.57x faster rapidjson: 19.4 i/s - 1.02x slower == Encoding many #to_json calls (2661 bytes) oj does not match expected output. Skipping rapidjson unsupported (Invalid object key type: Object) ruby 3.3.4 (2024-07-09 revision be1089c8ec) +YJIT [arm64-darwin23] Warming up -------------------------------------- json 2.129k i/100ms Calculating ------------------------------------- json 21.599k (± 0.6%) i/s (46.30 μs/i) - 108.579k in 5.027198s ``` Parsing: ``` == Parsing small nested array (121 bytes) ruby 3.3.4 (2024-07-09 revision be1089c8ec) +YJIT [arm64-darwin23] Warming up -------------------------------------- json 47.497k i/100ms oj 54.115k i/100ms oj strict 53.854k i/100ms Oj::Parser 150.904k i/100ms rapidjson 80.775k i/100ms Calculating ------------------------------------- json 481.096k (± 1.1%) i/s (2.08 μs/i) - 2.422M in 5.035657s oj 554.878k (± 0.6%) i/s (1.80 μs/i) - 2.814M in 5.071521s oj strict 547.888k (± 0.7%) i/s (1.83 μs/i) - 2.747M in 5.013212s Oj::Parser 1.545M (± 0.4%) i/s (647.16 ns/i) - 7.847M in 5.078302s rapidjson 822.422k (± 0.6%) i/s (1.22 μs/i) - 4.120M in 5.009178s Comparison: json: 481096.4 i/s Oj::Parser: 1545223.5 i/s - 3.21x faster rapidjson: 822422.4 i/s - 1.71x faster oj: 554877.7 i/s - 1.15x faster oj strict: 547887.7 i/s - 1.14x faster == Parsing small hash (65 bytes) ruby 3.3.4 (2024-07-09 revision be1089c8ec) +YJIT [arm64-darwin23] Warming up -------------------------------------- json 154.479k i/100ms oj 220.283k i/100ms oj strict 249.928k i/100ms Oj::Parser 445.062k i/100ms rapidjson 289.615k i/100ms Calculating ------------------------------------- json 1.581M (± 3.0%) i/s (632.55 ns/i) - 8.033M in 5.086476s oj 2.202M (± 3.5%) i/s (454.08 ns/i) - 11.014M in 5.008146s oj strict 2.498M (± 3.5%) i/s (400.25 ns/i) - 12.496M in 5.008245s Oj::Parser 4.640M (± 0.4%) i/s (215.50 ns/i) - 23.588M in 5.083443s rapidjson 3.111M (± 0.3%) i/s (321.44 ns/i) - 15.639M in 5.027097s Comparison: json: 1580898.5 i/s Oj::Parser: 4640298.1 i/s - 2.94x faster rapidjson: 3111005.2 i/s - 1.97x faster oj strict: 2498421.4 i/s - 1.58x faster oj: 2202276.6 i/s - 1.39x faster == Parsing test from oj (256 bytes) ruby 3.3.4 (2024-07-09 revision be1089c8ec) +YJIT [arm64-darwin23] Warming up -------------------------------------- json 37.580k i/100ms oj 41.899k i/100ms oj strict 50.731k i/100ms Oj::Parser 74.589k i/100ms rapidjson 50.954k i/100ms Calculating ------------------------------------- json 382.150k (± 1.0%) i/s (2.62 μs/i) - 1.917M in 5.015737s oj 420.282k (± 0.2%) i/s (2.38 μs/i) - 2.137M in 5.084338s oj strict 511.758k (± 0.5%) i/s (1.95 μs/i) - 2.587M in 5.055821s Oj::Parser 759.087k (± 0.3%) i/s (1.32 μs/i) - 3.804M in 5.011388s rapidjson 518.273k (± 1.8%) i/s (1.93 μs/i) - 2.599M in 5.015867s Comparison: json: 382149.6 i/s Oj::Parser: 759087.1 i/s - 1.99x faster rapidjson: 518272.8 i/s - 1.36x faster oj strict: 511758.4 i/s - 1.34x faster oj: 420282.5 i/s - 1.10x faster == Parsing twitter.json (567916 bytes) ruby 3.3.4 (2024-07-09 revision be1089c8ec) +YJIT [arm64-darwin23] Warming up -------------------------------------- json 52.000 i/100ms oj 63.000 i/100ms oj strict 74.000 i/100ms Oj::Parser 79.000 i/100ms rapidjson 56.000 i/100ms Calculating ------------------------------------- json 522.896 (± 0.4%) i/s (1.91 ms/i) - 2.652k in 5.071809s oj 624.849 (± 0.6%) i/s (1.60 ms/i) - 3.150k in 5.041398s oj strict 737.779 (± 0.4%) i/s (1.36 ms/i) - 3.700k in 5.015117s Oj::Parser 789.254 (± 0.3%) i/s (1.27 ms/i) - 3.950k in 5.004764s rapidjson 565.663 (± 0.4%) i/s (1.77 ms/i) - 2.856k in 5.049015s Comparison: json: 522.9 i/s Oj::Parser: 789.3 i/s - 1.51x faster oj strict: 737.8 i/s - 1.41x faster oj: 624.8 i/s - 1.19x faster rapidjson: 565.7 i/s - 1.08x faster == Parsing citm_catalog.json (1727030 bytes) ruby 3.3.4 (2024-07-09 revision be1089c8ec) +YJIT [arm64-darwin23] Warming up -------------------------------------- json 27.000 i/100ms oj 31.000 i/100ms oj strict 36.000 i/100ms Oj::Parser 42.000 i/100ms rapidjson 38.000 i/100ms Calculating ------------------------------------- json 305.248 (± 0.3%) i/s (3.28 ms/i) - 1.539k in 5.041813s oj 320.265 (± 3.4%) i/s (3.12 ms/i) - 1.612k in 5.039715s oj strict 373.701 (± 1.6%) i/s (2.68 ms/i) - 1.872k in 5.010633s Oj::Parser 457.792 (± 0.4%) i/s (2.18 ms/i) - 2.310k in 5.046049s rapidjson 350.933 (± 8.8%) i/s (2.85 ms/i) - 1.748k in 5.052491s Comparison: json: 305.2 i/s Oj::Parser: 457.8 i/s - 1.50x faster oj strict: 373.7 i/s - 1.22x faster rapidjson: 350.9 i/s - 1.15x faster oj: 320.3 i/s - 1.05x faster == Parsing canada.json (2251051 bytes) ruby 3.3.4 (2024-07-09 revision be1089c8ec) +YJIT [arm64-darwin23] Warming up -------------------------------------- json 2.000 i/100ms oj 2.000 i/100ms oj strict 2.000 i/100ms Oj::Parser 2.000 i/100ms rapidjson 28.000 i/100ms Calculating ------------------------------------- json 29.216 (± 6.8%) i/s (34.23 ms/i) - 146.000 in 5.053753s oj 24.899 (± 0.0%) i/s (40.16 ms/i) - 126.000 in 5.061915s oj strict 24.828 (± 4.0%) i/s (40.28 ms/i) - 124.000 in 5.003067s Oj::Parser 30.867 (± 3.2%) i/s (32.40 ms/i) - 156.000 in 5.057104s rapidjson 285.761 (± 1.0%) i/s (3.50 ms/i) - 1.456k in 5.095715s Comparison: json: 29.2 i/s rapidjson: 285.8 i/s - 9.78x faster Oj::Parser: 30.9 i/s - same-ish: difference falls within error oj: 24.9 i/s - 1.17x slower oj strict: 24.8 i/s - 1.18x slower ``` --- benchmark/data/canada.json | 9 + benchmark/data/citm_catalog.json | 50469 +++++++++++++++++++++++++++++ benchmark/data/twitter.json | 15482 +++++++++ benchmark/encoder.rb | 53 + benchmark/parser.rb | 39 + 5 files changed, 66052 insertions(+) create mode 100644 benchmark/data/canada.json create mode 100644 benchmark/data/citm_catalog.json create mode 100644 benchmark/data/twitter.json create mode 100644 benchmark/encoder.rb create mode 100644 benchmark/parser.rb diff --git a/benchmark/data/canada.json b/benchmark/data/canada.json new file mode 100644 index 00000000000000..04f63b405b2ad0 --- /dev/null +++ b/benchmark/data/canada.json @@ -0,0 +1,9 @@ +{ "type": "FeatureCollection", + "features": [ +{ + "type": "Feature", +"properties": { "name": "Canada" }, +"geometry": {"type":"Polygon","coordinates":[[[-65.613616999999977,43.420273000000009],[-65.619720000000029,43.418052999999986],[-65.625,43.421379000000059],[-65.636123999999882,43.449714999999969],[-65.633056999999951,43.474709000000132],[-65.611389000000031,43.513054000000068],[-65.605835000000013,43.516105999999979],[-65.598343,43.515830999999935],[-65.566101000000003,43.508331000000055],[-65.561935000000005,43.504439999999988],[-65.55999799999995,43.499718000000087],[-65.573333999999988,43.476379000000065],[-65.593612999999948,43.444153000000028],[-65.613616999999977,43.420273000000009]],[[-59.816947999999911,43.928328999999962],[-59.841667000000029,43.918602000000021],[-59.866393999999957,43.909987999999998],[-59.879722999999956,43.906654000000003],[-59.895835999999974,43.904160000000047],[-59.919448999999929,43.901099999999985],[-59.953330999999991,43.898604999999975],[-60.013617999999951,43.903320000000008],[-60.028609999999958,43.905548000000124],[-60.078338999999914,43.917496000000028],[-60.103888999999981,43.926659000000029],[-60.121666000000005,43.934990000000084],[-60.129997000000003,43.941933000000063],[-60.124167999999997,43.945267000000058],[-60.095000999999968,43.939430000000129],[-60.017776000000026,43.925827000000083],[-59.975554999999986,43.921936000000017],[-59.966942000000017,43.921936000000017],[-59.915000999999961,43.925552000000096],[-59.861945999999989,43.934433000000013],[-59.841385000000002,43.938880999999981],[-59.80972300000002,43.950828999999999],[-59.793334999999956,43.959435000000099],[-59.777221999999938,43.968048000000067],[-59.755279999999971,43.979431000000091],[-59.724716000000001,43.991104000000121],[-59.727775999999949,43.986382000000049],[-59.736389000000031,43.979156000000103],[-59.753615999999965,43.964995999999985],[-59.762504999999919,43.957771000000093],[-59.782501000000025,43.944434999999999],[-59.793059999999969,43.93832400000008],[-59.816947999999911,43.928328999999962]],[[-66.282775999999956,44.289719000000105],[-66.314437999999996,44.250548999999978],[-66.322234999999978,44.252777000000094],[-66.324448000000018,44.25750000000005],[-66.323897999999986,44.263329000000113],[-66.310271999999998,44.289993000000038],[-66.303054999999915,44.300545000000056],[-66.294723999999917,44.310271999999998],[-66.228333000000021,44.385826000000009],[-66.21945199999999,44.394713999999965],[-66.214447000000007,44.397774000000027],[-66.206389999999942,44.395271000000037],[-66.204726999999934,44.384995000000004],[-66.205275999999969,44.379433000000063],[-66.208053999999947,44.372765000000072],[-66.214721999999938,44.36360900000011],[-66.249725000000012,44.327217000000132],[-66.282775999999956,44.289719000000105]],[[-66.886123999999995,44.614440999999999],[-66.900283999999999,44.61332699999997],[-66.904174999999952,44.618049999999982],[-66.904449,44.622489999999971],[-66.884734999999978,44.68332700000002],[-66.858611999999937,44.743050000000039],[-66.837783999999942,44.770827999999995],[-66.833327999999938,44.774994000000049],[-66.803329000000019,44.798881999999992],[-66.798049999999932,44.802490000000091],[-66.786666999999852,44.808044000000109],[-66.779723999999931,44.809158000000082],[-66.772507000000019,44.809158000000082],[-66.767226999999934,44.805549999999982],[-66.764724999999999,44.801102000000014],[-66.757781999999963,44.792496000000085],[-66.734726000000023,44.729156000000103],[-66.736938000000009,44.717209000000139],[-66.740279999999927,44.70777099999998],[-66.761123999999995,44.676102000000128],[-66.765015000000005,44.671378999999945],[-66.875274999999931,44.619438000000059],[-66.886123999999995,44.614440999999999]],[[-61.199996999999996,45.558327000000077],[-61.204720000000009,45.555267000000072],[-61.212775999999963,45.556656000000032],[-61.219993999999986,45.559990000000028],[-61.224167000000023,45.564156000000139],[-61.222220999999934,45.569443000000035],[-61.21416499999998,45.568886000000134],[-61.208610999999962,45.56721500000009],[-61.202498999999989,45.563324000000023],[-61.199996999999996,45.558327000000077]],[[-60.993889000000024,45.45777099999998],[-61.00028199999997,45.455826000000002],[-61.007781999999963,45.457214000000079],[-61.019446999999957,45.463882000000069],[-61.101943999999946,45.523048000000017],[-61.105835000000013,45.526939000000084],[-61.108337000000006,45.540833000000021],[-61.104445999999939,45.546387000000038],[-61.098609999999951,45.549164000000076],[-61.023612999999955,45.574997000000053],[-61.017220000000009,45.575272000000041],[-60.936942999999985,45.576659999999947],[-60.908051,45.576103000000046],[-60.900275999999906,45.575554000000125],[-60.879996999999946,45.560547000000099],[-60.878608999999869,45.555824000000143],[-60.883888000000013,45.550544999999943],[-60.889167999999984,45.548332000000016],[-60.910277999999948,45.546104000000071],[-60.936110999999983,45.539161999999976],[-60.947495000000004,45.533607000000075],[-60.952498999999932,45.529990999999995],[-60.962501999999915,45.519989000000066],[-60.96305799999999,45.514998999999989],[-60.961669999999913,45.510277000000087],[-60.958611000000019,45.505829000000119],[-60.950553999999954,45.497771999999998],[-60.993889000000024,45.45777099999998]],[[-63.246391000000017,46.435547000000042],[-63.25389100000001,46.435265000000129],[-63.26167299999986,46.436378000000047],[-63.269446999999957,46.439713000000097],[-63.285004000000015,46.450829000000056],[-63.27055399999989,46.450271999999984],[-63.245834000000002,46.442764000000125],[-63.240836999999999,46.438599000000124],[-63.246391000000017,46.435547000000042]],[[-71.111114999999984,46.850548000000003],[-71.118606999999997,46.850273000000016],[-71.127486999999917,46.851662000000033],[-71.130279999999914,46.856102000000021],[-71.128326000000015,46.862213000000111],[-71.121383999999978,46.874161000000129],[-71.098891999999978,46.898048000000017],[-71.078339000000028,46.913605000000075],[-70.936935000000005,46.992493000000024],[-70.896666999999866,47.013329000000056],[-70.87222300000002,47.024162000000047],[-70.860001000000011,47.02777100000003],[-70.845276000000013,47.029160000000047],[-70.836394999999982,47.02777100000003],[-70.818893000000003,47.02276599999999],[-70.81361400000003,47.019440000000145],[-70.809158000000025,47.01527400000009],[-70.807495000000017,47.00999500000006],[-70.809432999999956,47.004439999999988],[-70.814437999999996,46.998329000000126],[-70.877212999999983,46.931107000000111],[-70.887512000000015,46.923607000000004],[-70.904174999999952,46.913605000000075],[-71.009170999999924,46.871101000000067],[-71.033324999999934,46.862494999999967],[-71.040832999999964,46.860549999999989],[-71.082229999999925,46.853325000000098],[-71.111114999999984,46.850548000000003]],[[-60.445273999999984,46.861664000000133],[-60.436942999999985,46.861107000000061],[-60.352782999999988,46.861664000000133],[-60.345832999999857,46.862494999999967],[-60.334441999999967,46.868881000000101],[-60.326110999999969,46.868323999999973],[-60.320838999999978,46.864441000000056],[-60.309440999999936,46.851105000000132],[-60.302223000000026,46.837493999999936],[-60.301392000000021,46.831940000000145],[-60.304442999999935,46.815269000000114],[-60.322776999999917,46.736382000000049],[-60.327224999999885,46.724991000000045],[-60.478881999999942,46.389992000000063],[-60.535277999999948,46.321663000000058],[-60.589438999999857,46.25499700000006],[-60.609169000000009,46.201934999999935],[-60.590331999999933,46.207821000000081],[-60.587001999999984,46.209488000000135],[-60.57150299999995,46.228653000000122],[-60.553329000000019,46.248878000000047],[-60.551391999999964,46.25499700000006],[-60.543335000000013,46.266663000000051],[-60.528053,46.278602999999919],[-60.479720999999984,46.311104000000057],[-60.46805599999999,46.316665999999998],[-60.44388600000002,46.326942000000088],[-60.430557000000022,46.33138299999996],[-60.424171000000001,46.331665000000044],[-60.416388999999867,46.328049000000021],[-60.412216000000001,46.31888600000002],[-60.417777999999942,46.285827999999981],[-60.419997999999964,46.279991000000052],[-60.42472099999992,46.27526899999998],[-60.438048999999921,46.270828000000051],[-60.454719999999952,46.262215000000083],[-60.470550999999944,46.251105999999993],[-60.53583100000003,46.192436000000043],[-60.59027900000001,46.138603000000103],[-60.600280999999939,46.130271999999991],[-60.61611199999993,46.120827000000133],[-60.645836000000031,46.106102000000021],[-60.687774999999874,46.088326000000052],[-60.701110999999912,46.08526599999999],[-60.788895000000025,46.066666000000055],[-60.86333499999995,46.052490000000034],[-60.986114999999927,45.982491000000095],[-61.023887999999943,45.969437000000028],[-61.080283999999949,45.951660000000004],[-61.087776000000019,45.95138500000013],[-61.095832999999971,45.952217000000076],[-61.105003000000011,45.954712000000086],[-61.113059999999905,45.955268999999987],[-61.117774999999938,45.950828999999999],[-61.126944999999978,45.928329000000133],[-61.125556999999958,45.923607000000061],[-61.118332000000009,45.923049999999932],[-61.056999000000019,45.931216999999947],[-61.052834000000018,45.931881000000033],[-61.017497999999989,45.940712000000076],[-61.014835000000005,45.943382000000042],[-60.989165999999955,45.95638300000013],[-60.987777999999935,45.962494000000049],[-60.984168999999952,45.967490999999939],[-60.957221999999945,45.984992999999974],[-60.940551999999911,45.994438000000059],[-60.892776000000026,46.01527400000009],[-60.853057999999976,46.03138000000007],[-60.770835999999917,46.057495000000074],[-60.757506999999919,46.060546999999985],[-60.743056999999965,46.061661000000015],[-60.735557999999912,46.058044000000052],[-60.734169000000009,46.05332199999998],[-60.734169000000009,46.047493000000145],[-60.807502999999997,45.931107000000111],[-60.870276999999987,45.910820000000058],[-60.898055999999997,45.906654000000117],[-60.956947000000014,45.903046000000018],[-61.042888999999946,45.891327000000103],[-61.047053999999946,45.890659000000085],[-61.050555999999972,45.888991999999973],[-61.053390999999976,45.886162000000127],[-61.096663999999976,45.860275000000001],[-61.097777999999948,45.854713000000061],[-61.094718999999998,45.850273000000016],[-61.087776000000019,45.847487999999998],[-61.079726999999991,45.84693900000002],[-61.073059000000001,45.84804500000007],[-61.060829000000012,45.852776000000006],[-61.049445999999989,45.858330000000024],[-61.026107999999965,45.86971299999999],[-60.989997999999957,45.881934999999999],[-60.96805599999999,45.883331000000055],[-60.960281000000009,45.880272000000048],[-60.919448999999986,45.857498000000078],[-60.915833000000021,45.852776000000006],[-60.917777999999942,45.847487999999998],[-60.935271999999941,45.825271999999984],[-60.940551999999911,45.821663000000001],[-60.947495000000004,45.820549000000028],[-61.019446999999957,45.809989999999971],[-61.067504999999983,45.791663999999969],[-61.079169999999976,45.786110000000008],[-61.118057000000022,45.763611000000026],[-61.12777699999998,45.755271999999991],[-61.147223999999994,45.704993999999999],[-61.149170000000026,45.699715000000026],[-61.142501999999922,45.696381000000031],[-61.077498999999932,45.688880999999981],[-61.070838999999978,45.689987000000031],[-61.041945999999996,45.704162999999994],[-61.012778999999966,45.718880000000013],[-60.996391000000017,45.727767999999969],[-60.972771000000023,45.738045],[-60.954719999999952,45.745543999999938],[-60.935829000000012,45.751389000000074],[-60.92222599999991,45.75360900000004],[-60.914443999999946,45.75360900000004],[-60.890556000000004,45.751663000000008],[-60.881942999999922,45.750000000000057],[-60.864165999999898,45.744438000000116],[-60.844161999999983,45.735268000000076],[-60.816665999999998,45.722488000000112],[-60.809998000000007,45.719154000000117],[-60.800835000000006,45.71166199999999],[-60.729438999999957,45.778603000000032],[-60.719718999999998,45.788329999999974],[-60.516944999999964,45.920830000000137],[-60.491942999999878,45.929436000000067],[-60.466942000000017,45.938041999999996],[-60.409163999999976,45.979987999999935],[-60.404166999999973,45.984436000000073],[-60.395835999999974,45.99610100000001],[-60.40166499999998,45.994713000000104],[-60.555000000000007,45.946938000000102],[-60.611671000000001,45.924995000000138],[-60.629722999999899,45.917496000000142],[-60.639998999999989,45.91027100000008],[-60.644721999999945,45.905548000000124],[-60.655272999999966,45.898330999999985],[-60.661110000000008,45.895270999999923],[-60.673331999999903,45.890549000000021],[-60.686110999999926,45.886940000000038],[-60.69388600000002,45.886107999999922],[-60.708892999999875,45.887215000000026],[-60.723327999999981,45.893326000000116],[-60.788337999999953,45.929436000000067],[-60.789725999999973,45.934433000000126],[-60.788895000000025,45.939986999999974],[-60.785278000000005,45.946381000000031],[-60.78055599999999,45.950828999999999],[-60.691382999999973,46.001937999999939],[-60.679168999999945,46.006660000000011],[-60.601395000000025,46.039719000000105],[-60.541114999999991,46.065544000000102],[-60.523612999999955,46.075554000000011],[-60.490836999999942,46.094437000000084],[-60.30999799999995,46.206939999999975],[-60.30499999999995,46.210548000000074],[-60.299994999999967,46.214996000000042],[-60.295279999999934,46.226936000000137],[-60.295279999999934,46.232208000000071],[-60.304169000000002,46.233878999999945],[-60.365554999999972,46.224990999999989],[-60.372771999999998,46.223320000000115],[-60.396111000000019,46.213051000000064],[-60.401938999999913,46.21027399999997],[-60.418335000000013,46.199996999999996],[-60.428054999999915,46.192490000000078],[-60.442497000000003,46.17943600000001],[-60.463332999999921,46.163879000000122],[-60.479163999999912,46.152771000000143],[-60.528053,46.121658000000139],[-60.605835000000013,46.074715000000083],[-60.629997000000003,46.065269000000114],[-60.644164999999987,46.063049000000092],[-60.65193899999997,46.063880999999981],[-60.656104999999968,46.067772000000048],[-60.656386999999938,46.073051000000021],[-60.652495999999985,46.079436999999984],[-60.638335999999867,46.093048000000124],[-60.456107999999972,46.241379000000052],[-60.404998999999975,46.279991000000052],[-60.399726999999984,46.283882000000119],[-60.388892999999996,46.291106999999954],[-60.359725999999966,46.304993000000138],[-60.347778000000005,46.310546999999985],[-60.285278000000005,46.321381000000031],[-60.205558999999994,46.240273000000002],[-60.138054000000011,46.246658000000025],[-60.131942999999922,46.248604000000114],[-60.124167999999997,46.248604000000114],[-60.099997999999971,46.246384000000091],[-60.091666999999916,46.244713000000047],[-59.950553999999897,46.201385000000073],[-59.873054999999965,46.17582699999997],[-59.808608999999876,46.111938000000066],[-59.80972300000002,46.106384000000048],[-59.819449999999961,46.097214000000008],[-59.834166999999979,46.084717000000012],[-59.853888999999924,46.00249500000001],[-59.840553,45.938324000000023],[-59.958610999999962,45.901657000000057],[-60.130279999999971,45.867767000000129],[-60.136115999999959,45.864997999999957],[-60.155272999999966,45.846656999999993],[-60.159438999999963,45.841102999999976],[-60.160552999999936,45.835548000000074],[-60.174445999999989,45.76388500000013],[-60.229163999999969,45.705551000000128],[-60.233886999999925,45.701102999999932],[-60.245834000000002,45.69499200000007],[-60.379723000000013,45.644997000000046],[-60.392226999999991,45.641105999999979],[-60.411666999999966,45.636940000000095],[-60.49888599999997,45.620269999999948],[-60.513061999999934,45.618880999999988],[-60.55750299999994,45.618049999999982],[-60.765556000000004,45.594994000000099],[-60.960830999999928,45.599433999999917],[-61.101669000000015,45.564437999999996],[-61.14833799999991,45.555267000000072],[-61.168334999999956,45.551384000000098],[-61.196917999999982,45.583740000000091],[-61.218696999999963,45.580788000000098],[-61.237521999999956,45.581528000000048],[-61.273055999999997,45.561935000000005],[-61.336945000000014,45.573326000000009],[-61.37557599999991,45.622131000000138],[-61.430556999999965,45.665543000000071],[-61.454719999999952,45.705551000000128],[-61.457503999999972,45.71527100000003],[-61.478049999999996,45.803879000000109],[-61.494720000000029,45.846381999999949],[-61.527495999999985,45.98943300000002],[-61.455558999999994,46.137497000000053],[-61.447776999999974,46.149436999999978],[-61.438888999999961,46.159430999999984],[-61.412772999999959,46.178329000000076],[-61.390839000000028,46.191376000000105],[-61.37388599999997,46.200829000000113],[-61.343329999999924,46.212493999999992],[-61.305557000000022,46.224990999999989],[-61.293892000000028,46.230819999999994],[-61.283332999999971,46.238884000000041],[-61.09722099999999,46.44609800000012],[-61.089438999999913,46.458046000000138],[-61.035278000000005,46.555549999999982],[-61.033057999999926,46.561661000000072],[-61.031113000000005,46.572769000000051],[-61.032501000000025,46.577492000000063],[-60.996947999999918,46.634720000000073],[-60.892226999999991,46.77388000000002],[-60.873610999999869,46.793052999999929],[-60.86361699999992,46.801384000000041],[-60.84027900000001,46.813605999999993],[-60.833884999999896,46.815543999999932],[-60.805557000000022,46.820273999999984],[-60.793892000000028,46.825271999999984],[-60.724716000000001,46.874992000000134],[-60.714721999999995,46.88249200000007],[-60.704444999999907,46.891380000000026],[-60.695273999999927,46.901657],[-60.686660999999958,46.912491000000045],[-60.678336999999942,46.930824000000143],[-60.670554999999979,46.953606000000036],[-60.664444000000003,46.966103000000032],[-60.65694400000001,46.978600000000029],[-60.640282000000013,47],[-60.609169000000009,47.024437000000091],[-60.597777999999892,47.031105000000025],[-60.591942000000017,47.033333000000027],[-60.583327999999938,47.031661999999926],[-60.460830999999871,46.999161000000015],[-60.427498000000014,46.965827999999988],[-60.493889000000024,46.902214000000072],[-60.498055000000022,46.896660000000111],[-60.452224999999942,46.864441000000056],[-60.445273999999984,46.861664000000133]],[[-64.039718999999991,46.743324000000086],[-64.031677000000002,46.742767000000015],[-64.016402999999912,46.743607000000054],[-64.009170999999981,46.744156000000032],[-64.005004999999983,46.749718000000144],[-63.999999999999943,46.75360900000004],[-63.991668999999945,46.753052000000139],[-63.979163999999912,46.746383999999978],[-63.974715999999944,46.742493000000081],[-63.832503999999972,46.617210000000057],[-63.831673000000023,46.611938000000123],[-63.865004999999883,46.537498000000085],[-63.868888999999967,46.531937000000084],[-63.840836000000024,46.464438999999913],[-63.828339000000028,46.458046000000138],[-63.780281000000002,46.44499200000007],[-63.742226000000016,46.439430000000129],[-63.733054999999979,46.438881000000038],[-63.709442000000024,46.43749200000002],[-63.703888000000006,46.440544000000102],[-63.698050999999964,46.456383000000073],[-63.698607999999979,46.461662000000047],[-63.700279000000023,46.466385000000002],[-63.722771000000023,46.48054500000012],[-63.738051999999982,46.491378999999995],[-63.739998000000014,46.496101000000067],[-63.723327999999924,46.543610000000058],[-63.716110000000015,46.553879000000109],[-63.709723999999994,46.556099000000131],[-63.676391999999964,46.564156000000082],[-63.662216000000001,46.566382999999973],[-63.647223999999881,46.56721500000009],[-63.618889000000024,46.561104],[-63.497779999999977,46.527771000000143],[-63.315001999999936,46.488602000000071],[-63.271979999999928,46.426926000000094],[-63.240661999999986,46.420456000000001],[-63.216392999999982,46.412209000000132],[-62.942771999999877,46.426941000000113],[-62.862777999999935,46.434715000000097],[-62.698607999999979,46.452492000000007],[-62.692497000000003,46.456100000000106],[-62.686385999999914,46.457497000000046],[-62.665833000000021,46.461104999999975],[-62.595001000000025,46.470825000000048],[-62.477218999999991,46.477768000000026],[-62.455558999999994,46.478600000000142],[-62.182502999999997,46.485824999999977],[-62.166388999999981,46.486107000000061],[-62.133330999999941,46.482764999999915],[-62.058051999999975,46.472762999999986],[-62.014724999999942,46.46527100000003],[-61.979720999999984,46.45915999999994],[-61.970551,46.456940000000145],[-61.965003999999965,46.453323000000012],[-61.968886999999995,46.447768999999994],[-61.973609999999951,46.443047000000092],[-62.013061999999991,46.421104000000128],[-62.101112000000001,46.379715000000033],[-62.173331999999959,46.349433999999974],[-62.215552999999943,46.343605000000139],[-62.279723999999931,46.338043000000027],[-62.309166000000005,46.349998000000085],[-62.326392999999996,46.354996000000085],[-62.342773000000022,46.356102000000135],[-62.357779999999934,46.35582700000009],[-62.355834999999956,46.35083000000003],[-62.348052999999993,46.332214000000022],[-62.334723999999994,46.311935000000062],[-62.361945999999932,46.276657000000057],[-62.419448999999986,46.219986000000119],[-62.424720999999977,46.215546000000074],[-62.453888000000006,46.21443899999997],[-62.507506999999919,46.214157000000114],[-62.603888999999924,46.182495000000131],[-62.603888999999924,46.177215999999987],[-62.54222900000002,46.122490000000028],[-62.507506999999919,46.118881000000044],[-62.5,46.119156000000089],[-62.478333000000021,46.120827000000133],[-62.477218999999991,46.126380999999924],[-62.478881999999999,46.131935000000112],[-62.481667000000016,46.13638300000008],[-62.489998000000014,46.138328999999999],[-62.497222999999963,46.138046000000031],[-62.506110999999976,46.139717000000076],[-62.513892999999996,46.142220000000066],[-62.509726999999998,46.148605000000032],[-62.504448000000025,46.150825999999995],[-62.489166000000012,46.151382000000126],[-62.473052999999993,46.150269000000094],[-62.468886999999995,46.146102999999982],[-62.449164999999937,46.100548000000003],[-62.447494999999947,46.095543000000134],[-62.446945000000028,46.090546000000018],[-62.454720000000009,46.018883000000073],[-62.459166999999979,46.006386000000077],[-62.473609999999951,45.994713000000104],[-62.496947999999975,45.983879000000002],[-62.510001999999929,45.979156000000046],[-62.541671999999949,45.970543000000077],[-62.548614999999927,45.969437000000028],[-62.591667000000029,45.964996000000099],[-62.613891999999964,45.962769000000037],[-62.650276000000019,45.960274000000027],[-62.761115999999959,45.954162999999937],[-62.837776000000019,45.967490999999939],[-62.856667000000016,45.977486000000056],[-62.882773999999984,45.995544000000109],[-62.930283000000031,46.037215999999944],[-62.970832999999971,46.07416500000005],[-62.922500999999954,46.092491000000052],[-62.917220999999984,46.096382000000119],[-62.875274999999931,46.134995000000004],[-62.871940999999936,46.143607999999972],[-62.885276999999974,46.155823000000055],[-62.890839000000028,46.159430999999984],[-63.025276000000019,46.189156000000082],[-63.103614999999991,46.201934999999935],[-63.112777999999992,46.204163000000108],[-63.119445999999868,46.207214000000135],[-63.12222300000002,46.211662000000103],[-63.120276999999987,46.217766000000097],[-63.115836999999942,46.222487999999998],[-63.038895000000025,46.280273000000079],[-63.02416999999997,46.290275999999949],[-63.017776000000026,46.292496000000142],[-63.010284000000013,46.292770000000075],[-63.002228000000002,46.289992999999981],[-62.99610899999999,46.292220999999984],[-62.979438999999957,46.301658999999972],[-62.969161999999983,46.309432999999956],[-62.964721999999881,46.314156000000139],[-62.962775999999963,46.319992000000013],[-62.969443999999953,46.31888600000002],[-63.035277999999892,46.301658999999972],[-63.041388999999981,46.299721000000034],[-63.052779999999927,46.293884000000048],[-63.058608999999933,46.290833000000021],[-63.090836000000024,46.26915699999995],[-63.165001000000018,46.210548000000074],[-63.143332999999984,46.201660000000118],[-63.139167999999984,46.197769000000051],[-63.138610999999912,46.192490000000078],[-63.140556000000004,46.186378000000104],[-63.22444200000001,46.139717000000076],[-63.23860899999994,46.138046000000031],[-63.253615999999965,46.137497000000053],[-63.26167299999986,46.138046000000031],[-63.289169000000015,46.14388299999996],[-63.409163999999919,46.176940999999999],[-63.519722000000002,46.206099999999935],[-63.591942000000017,46.211937000000091],[-63.642775999999913,46.224990999999989],[-63.649726999999928,46.228043000000071],[-63.699722000000008,46.259437999999989],[-63.700553999999954,46.269989000000066],[-63.702224999999999,46.27526899999998],[-63.70666499999993,46.278602999999919],[-63.741942999999935,46.304436000000067],[-63.754447999999968,46.310822000000144],[-63.811110999999926,46.32749200000012],[-63.772223999999937,46.360825000000091],[-63.736945999999932,46.353882000000112],[-63.729163999999969,46.352776000000063],[-63.714721999999995,46.354164000000026],[-63.739166000000012,46.391106000000036],[-63.745002999999997,46.394714000000135],[-63.754447999999968,46.396385000000009],[-63.761672999999917,46.396659999999997],[-63.841109999999958,46.39888000000002],[-63.963615000000004,46.401100000000042],[-63.981941000000006,46.39388300000013],[-63.989165999999898,46.393608000000086],[-64.121933000000013,46.404709000000025],[-64.129989999999964,46.407211000000132],[-64.133057000000008,46.4116590000001],[-64.135009999999909,46.416382000000056],[-64.133057000000008,46.43332700000002],[-64.115828999999962,46.523048000000017],[-64.11332699999997,46.53472099999999],[-64.110000999999954,46.541107000000125],[-64.105559999999969,46.54583000000008],[-64.100280999999882,46.549720999999977],[-64.094161999999926,46.551659000000086],[-64.105559999999969,46.618050000000096],[-64.273894999999982,46.62332200000003],[-64.387511999999958,46.62082700000002],[-64.391952999999944,46.624709999999936],[-64.413895000000025,46.665825000000098],[-64.415558000000033,46.670546999999999],[-64.416655999999932,46.68110699999994],[-64.414718999999991,46.697769000000108],[-64.410277999999948,46.711105000000089],[-64.400283999999942,46.727486000000113],[-64.382492000000013,46.746658000000082],[-64.346953999999982,46.773605000000032],[-64.323897999999929,46.786384999999996],[-64.296386999999982,46.801659000000029],[-64.286117999999931,46.80943300000007],[-64.27305599999994,46.823607999999979],[-64.249724999999955,46.868050000000039],[-64.247771999999941,46.874161000000129],[-64.247222999999906,46.879714999999976],[-64.243880999999988,46.886108000000092],[-64.236389000000031,46.897491000000116],[-64.226943999999946,46.906097000000045],[-64.182770000000005,46.945541000000105],[-64.168610000000001,46.956657000000064],[-64.020844000000011,47.038605000000132],[-63.99500299999994,46.984161000000086],[-63.969993999999986,46.901657],[-63.967498999999862,46.891662999999994],[-64.041381999999999,46.82249500000006],[-64.066100999999946,46.804436000000123],[-64.076401000000033,46.798881999999992],[-64.091674999999952,46.778603000000032],[-64.077498999999932,46.756386000000134],[-64.074448000000018,46.752220000000023],[-64.067504999999926,46.749161000000072],[-64.039718999999991,46.743324000000086]],[[-55.876105999999993,47.260551000000021],[-55.968329999999867,47.257773999999927],[-55.946388000000013,47.273323000000062],[-55.934440999999936,47.279434000000094],[-55.895003999999972,47.290833000000021],[-55.888053999999954,47.292496000000142],[-55.881110999999976,47.293326999999977],[-55.872771999999998,47.292221000000097],[-55.865836999999885,47.287773000000129],[-55.855003000000011,47.269714000000022],[-55.876105999999993,47.260551000000021]],[[-61.380554000000018,47.620270000000119],[-61.493057000000022,47.552490000000091],[-61.498610999999926,47.550270000000069],[-61.535560999999973,47.54583000000008],[-61.54222900000002,47.545547000000113],[-61.547782999999868,47.549164000000076],[-61.549445999999989,47.553879000000109],[-61.545279999999991,47.55943300000007],[-61.520279000000016,47.569160000000011],[-61.513892999999939,47.572495000000117],[-61.477492999999924,47.60054800000006],[-61.473610000000008,47.6055530000001],[-61.471382000000006,47.611382000000106],[-61.470551,47.616936000000123],[-61.479163999999969,47.618599000000017],[-61.534447,47.618881000000101],[-61.541945999999996,47.617210000000057],[-61.559440999999993,47.609161000000029],[-61.653610000000015,47.549995000000081],[-61.855559999999969,47.417213000000061],[-61.849723999999981,47.413605000000132],[-61.841667000000029,47.410820000000115],[-61.833611000000019,47.409987999999998],[-61.789169000000015,47.425827000000083],[-61.777221999999995,47.431664000000069],[-61.766662999999937,47.439156000000025],[-61.714447000000007,47.489989999999977],[-61.691382999999973,47.515548999999965],[-61.701392999999939,47.491936000000067],[-61.740836999999942,47.44499200000007],[-61.843329999999924,47.388603000000046],[-61.90589099999994,47.354935000000012],[-61.925277999999992,47.343605000000139],[-61.93332700000002,47.333327999999938],[-61.962776000000019,47.281662000000097],[-61.965003999999965,47.275551000000007],[-61.964721999999995,47.270271000000093],[-61.961945000000014,47.266106000000093],[-61.957503999999972,47.261940000000038],[-61.938605999999993,47.257217000000026],[-61.827782000000013,47.234161000000029],[-61.819450000000018,47.233330000000024],[-61.807776999999987,47.239159000000029],[-61.799445999999989,47.250274999999931],[-61.794723999999917,47.254714999999976],[-61.783057999999869,47.260551000000021],[-61.782775999999956,47.255272000000048],[-61.789725999999916,47.242493000000024],[-61.793892000000028,47.236938000000123],[-61.799445999999989,47.232764999999972],[-61.810279999999977,47.226654000000053],[-61.816948000000025,47.224709000000075],[-61.84444400000001,47.219436999999971],[-61.859443999999883,47.218047999999953],[-61.955276000000026,47.211662000000047],[-61.979995999999971,47.213608000000136],[-61.996390999999903,47.214996000000042],[-62.004722999999956,47.217766000000097],[-62.010001999999872,47.22137500000008],[-62.013061999999991,47.225821999999994],[-62.014724999999942,47.23054500000012],[-62.015006999999912,47.235825000000034],[-62.013061999999991,47.241661000000079],[-61.948607999999979,47.379432999999949],[-61.941665999999941,47.392219999999952],[-61.937499999999943,47.39777400000014],[-61.928054999999972,47.407211000000075],[-61.922225999999966,47.409987999999998],[-61.908889999999928,47.413879000000065],[-61.736114999999984,47.507216999999969],[-61.705832999999984,47.532494000000099],[-61.684440999999936,47.547492999999974],[-61.662216000000001,47.561661000000072],[-61.616942999999992,47.588042999999914],[-61.571114000000023,47.613608999999997],[-61.553611999999987,47.623046999999985],[-61.53583500000002,47.631659999999954],[-61.529167000000029,47.633606000000043],[-61.521110999999962,47.634437999999989],[-61.425277999999992,47.642769000000044],[-61.407775999999956,47.641105999999922],[-61.388892999999996,47.637771999999984],[-61.381942999999922,47.634437999999989],[-61.377776999999924,47.631103999999993],[-61.376105999999993,47.626380999999981],[-61.380554000000018,47.620270000000119]],[[-54.261391000000003,47.39027400000009],[-54.268889999999999,47.389717000000019],[-54.293059999999969,47.391663000000051],[-54.341385000000002,47.398048000000074],[-54.358054999999979,47.403046000000074],[-54.364448999999979,47.406654000000003],[-54.365554999999915,47.411659000000043],[-54.359726000000023,47.416664000000083],[-54.326392999999996,47.436653000000035],[-54.295279999999991,47.44999700000011],[-54.278053,47.460823000000062],[-54.267220000000009,47.469437000000084],[-54.262222000000008,47.474709000000018],[-54.257781999999963,47.480820000000108],[-54.230552999999986,47.523605000000032],[-54.229996000000028,47.550270000000069],[-54.204719999999952,47.593605000000082],[-54.13527699999986,47.668053000000043],[-54.128882999999973,47.670546999999999],[-54.122771999999998,47.66693900000007],[-54.121940999999993,47.661934000000031],[-54.122222999999963,47.656937000000084],[-54.124999999999943,47.640831000000105],[-54.160827999999981,47.534996000000035],[-54.238892000000021,47.40387700000008],[-54.243331999999953,47.399437000000091],[-54.255004999999983,47.392769000000101],[-54.261391000000003,47.39027400000009]],[[-54.077498999999989,47.479431000000091],[-54.08306099999993,47.474991000000102],[-54.093055999999933,47.483046999999999],[-54.096663999999976,47.487213000000054],[-54.101112000000001,47.496384000000035],[-54.101944000000003,47.501389000000074],[-54.099723999999924,47.558883999999978],[-54.09833500000002,47.589714000000015],[-54.097220999999934,47.605270000000132],[-54.09332999999998,47.631659999999954],[-54.083610999999962,47.679717999999923],[-54.078612999999962,47.684990000000028],[-54.071388000000013,47.685546999999929],[-54.067504999999983,47.681107000000111],[-54.060555000000022,47.651099999999985],[-54.078056000000004,47.563881000000038],[-54.05972300000002,47.532211000000132],[-54.058891000000017,47.527214000000072],[-54.077498999999989,47.479431000000091]],[[-55.901938999999857,47.602493000000038],[-55.923057999999912,47.599434000000088],[-55.947220000000016,47.601936000000137],[-56.013335999999981,47.611664000000019],[-56.097778000000005,47.627487000000031],[-56.105559999999855,47.630821000000026],[-56.109169000000009,47.63499500000006],[-56.113616999999977,47.644714000000022],[-56.112220999999977,47.649719000000118],[-56.106666999999959,47.654709000000139],[-56.100280999999939,47.657211000000018],[-56.005835999999988,47.680274999999995],[-55.941108999999983,47.689156000000139],[-55.933883999999978,47.688324000000023],[-55.92861199999993,47.684432999999956],[-55.927498000000014,47.676658999999972],[-55.934440999999936,47.658882000000119],[-55.934440999999936,47.653877000000023],[-55.932502999999997,47.643883000000017],[-55.930000000000007,47.639435000000049],[-55.926392000000021,47.635268999999994],[-55.914161999999976,47.628326000000015],[-55.889442000000031,47.618881000000101],[-55.876388999999961,47.611664000000019],[-55.882499999999936,47.607773000000122],[-55.901938999999857,47.602493000000038]],[[-64.482773000000009,47.917770000000019],[-64.50167799999997,47.856384000000048],[-64.503615999999909,47.850273000000016],[-64.514724999999999,47.832497000000046],[-64.523055999999997,47.822220000000016],[-64.541106999999954,47.80332199999998],[-64.604995999999971,47.748329000000126],[-64.610549999999989,47.745270000000005],[-64.635833999999988,47.735825000000091],[-64.647507000000019,47.733879000000002],[-64.690551999999968,47.753052000000139],[-64.693328999999949,47.758049000000028],[-64.702788999999939,47.823607999999979],[-64.697768999999994,47.836104999999918],[-64.685546999999985,47.852219000000048],[-64.667496000000028,47.866936000000067],[-64.662215999999944,47.870827000000133],[-64.624160999999958,47.884719999999959],[-64.617767000000015,47.886658000000125],[-64.609160999999972,47.886939999999981],[-64.584166999999923,47.884995000000004],[-64.508057000000008,47.903877000000023],[-64.482773000000009,47.917770000000019]],[[-64.567504999999926,47.899436999999978],[-64.574448000000018,47.89804799999996],[-64.583617999999888,47.899436999999978],[-64.589447000000007,47.902771000000143],[-64.593886999999995,47.90665400000006],[-64.594451999999933,47.911933999999974],[-64.593612999999891,47.918052999999986],[-64.531677000000002,48.016105999999979],[-64.52694699999995,48.02165999999994],[-64.522780999999952,48.025551000000007],[-64.516952999999944,48.028602999999976],[-64.509734999999921,48.029991000000052],[-64.50111400000003,48.027488999999946],[-64.495543999999938,48.023880000000133],[-64.490828999999906,48.019989000000066],[-64.48582499999992,48.013054000000011],[-64.482773000000009,48.008606000000043],[-64.469726999999978,47.969711000000132],[-64.469161999999869,47.96443899999997],[-64.470550999999944,47.953323000000069],[-64.47444200000001,47.947769000000051],[-64.496383999999978,47.933875999999998],[-64.513901000000033,47.924712999999997],[-64.567504999999926,47.899436999999978]],[[-53.712775999999963,48.14888000000002],[-53.689720000000023,48.147217000000126],[-53.682502999999997,48.147774000000027],[-53.667503000000011,48.150542999999971],[-53.647781000000009,48.155265999999926],[-53.615554999999915,48.167496000000028],[-53.583327999999995,48.18082400000003],[-53.571113999999909,48.186104000000114],[-53.564162999999951,48.190543999999932],[-53.553054999999972,48.199158000000011],[-53.539444000000003,48.202217000000132],[-53.53167000000002,48.202774000000034],[-53.516395999999986,48.201935000000105],[-53.509726999999941,48.198326000000066],[-53.509170999999867,48.193321000000026],[-53.510833999999988,48.150826000000109],[-53.512504999999919,48.145271000000037],[-53.530829999999924,48.097771000000023],[-53.536391999999978,48.093323000000055],[-53.549445999999989,48.088600000000099],[-53.56361400000003,48.084991000000116],[-53.598884999999996,48.079437000000098],[-53.634170999999924,48.075272000000098],[-53.823333999999932,48.092765999999983],[-53.83943899999997,48.094437000000084],[-53.856110000000001,48.098044999999956],[-53.871940999999936,48.104713000000118],[-53.876663000000008,48.108604000000014],[-53.93250299999994,48.172767999999962],[-53.935829000000012,48.182495000000131],[-53.932776999999987,48.198326000000066],[-53.929168999999945,48.209434999999985],[-53.922225999999966,48.212493999999936],[-53.906386999999938,48.21027400000014],[-53.898887999999943,48.206657000000007],[-53.860000999999954,48.174438000000123],[-53.855559999999969,48.169991000000095],[-53.712775999999963,48.14888000000002]],[[-123.47444200000001,48.709160000000054],[-123.48277300000001,48.708328000000108],[-123.48999000000003,48.709435000000042],[-123.51306199999993,48.716385000000116],[-123.52471899999989,48.722488000000055],[-123.54943800000001,48.746658000000082],[-123.551941,48.752220000000023],[-123.59277299999991,48.898331000000098],[-123.595551,48.909714000000122],[-123.59612299999998,48.928329000000076],[-123.59665699999994,48.946938000000046],[-123.59361299999995,48.947211999999979],[-123.58056599999992,48.935547000000042],[-123.57721699999996,48.929161000000136],[-123.53611799999999,48.914993000000095],[-123.53028899999998,48.911933999999974],[-123.45749699999993,48.863052000000039],[-123.43388400000003,48.844437000000084],[-123.37027,48.768326000000002],[-123.36888099999993,48.762771999999984],[-123.37165800000002,48.75750000000005],[-123.37638900000002,48.753608999999983],[-123.43195300000002,48.721099999999979],[-123.47444200000001,48.709160000000054]],[[-58.342223999999987,49.066101000000117],[-58.349166999999966,49.064437999999996],[-58.356109999999944,49.065826000000129],[-58.351943999999889,49.071938000000102],[-58.341385000000002,49.07638500000013],[-58.333611000000019,49.077773999999977],[-58.330558999999994,49.073326000000009],[-58.335830999999928,49.068885999999964],[-58.342223999999987,49.066101000000117]],[[-123.32277699999997,48.861107000000004],[-123.3705369999999,48.856384000000048],[-123.37888299999997,48.85694100000012],[-123.38474299999996,48.859993000000031],[-123.54055799999998,48.944992000000127],[-123.66251399999999,49.03527100000008],[-123.70388800000001,49.095268000000033],[-123.70527599999997,49.100273000000072],[-123.70249899999999,49.105552999999986],[-123.695831,49.108047000000113],[-123.68639400000001,49.106659000000036],[-123.68055700000002,49.103607000000068],[-123.674713,49.093048000000067],[-123.65943900000002,49.073608000000036],[-123.60444599999994,49.014717000000132],[-123.58640300000002,49.000549000000092],[-123.52166699999998,48.96027400000014],[-123.49916099999996,48.947211999999979],[-123.487503,48.94110100000006],[-123.45973200000003,48.930549999999982],[-123.43639399999995,48.924438000000009],[-123.42027299999995,48.920547000000113],[-123.38194299999992,48.910819999999944],[-123.32833900000003,48.895827999999938],[-123.32250999999991,48.892768999999987],[-123.31777999999997,48.88888500000013],[-123.31276700000001,48.872765000000072],[-123.3125,48.868050000000039],[-123.31639100000001,48.863327000000027],[-123.32277699999997,48.861107000000004]],[[-125.816101,49.125824000000136],[-125.82028200000002,49.124709999999993],[-125.86028299999998,49.134438000000046],[-125.906387,49.160820000000115],[-125.91027800000001,49.165543000000071],[-125.92582699999991,49.190826000000015],[-125.93360899999993,49.211104999999918],[-125.93306000000001,49.218048000000124],[-125.93055700000002,49.219986000000063],[-125.92610200000001,49.223320000000058],[-125.87888299999992,49.235824999999977],[-125.86749299999997,49.233330000000137],[-125.82917800000001,49.226379000000009],[-125.81806899999987,49.220543000000134],[-125.79915599999998,49.208328000000051],[-125.78888699999993,49.172768000000133],[-125.79583699999995,49.151932000000102],[-125.79833999999994,49.146385000000009],[-125.81249999999994,49.129158000000132],[-125.816101,49.125824000000136]],[[-126.13194299999992,49.393325999999945],[-126.126938,49.390274000000034],[-126.12470999999999,49.390274000000034],[-126.12053699999996,49.388602999999989],[-126.11054999999999,49.382210000000043],[-126.10665899999992,49.378601000000003],[-126.09612300000003,49.368599000000074],[-126.08640300000002,49.358604000000128],[-126.07277699999997,49.34304800000001],[-126.0497279999999,49.265548999999965],[-126.0511019999999,49.260550999999964],[-126.05583200000001,49.256104000000107],[-126.06471299999987,49.250832000000003],[-126.07112100000001,49.248329000000012],[-126.07972699999999,49.246658000000139],[-126.08917199999991,49.246101000000067],[-126.09638999999999,49.24721500000004],[-126.18666100000002,49.263328999999999],[-126.19167299999992,49.265548999999965],[-126.22332799999992,49.279716000000121],[-126.22944599999994,49.282493999999929],[-126.23916600000001,49.289718999999991],[-126.23473399999995,49.374161000000015],[-126.22917200000001,49.378601000000003],[-126.22138999999999,49.380547000000092],[-126.14138800000001,49.39415699999995],[-126.13194299999992,49.393325999999945]],[[-123.37943999999999,49.326941999999974],[-123.39222699999999,49.326103000000046],[-123.41027799999995,49.334159999999997],[-123.42194399999994,49.339714000000015],[-123.42666600000001,49.344154000000003],[-123.42804699999999,49.348877000000016],[-123.42027299999995,49.381660000000011],[-123.41332999999997,49.386107999999979],[-123.3600009999999,49.411658999999986],[-123.35472099999998,49.413322000000107],[-123.327789,49.416664000000083],[-123.31696299999999,49.417496000000142],[-123.31220999999999,49.414992999999981],[-123.30943300000001,49.41137700000013],[-123.31027199999994,49.40526600000004],[-123.31194299999993,49.401932000000045],[-123.327789,49.363052000000096],[-123.33112299999999,49.354996000000028],[-123.34472699999998,49.341934000000037],[-123.36833199999995,49.330275999999969],[-123.37943999999999,49.326941999999974]],[[-54.705276000000026,49.400543000000084],[-54.712776000000019,49.398330999999985],[-54.730277999999998,49.403046000000018],[-54.735557999999969,49.407211000000018],[-54.759726999999941,49.432495000000017],[-54.759170999999981,49.437766999999951],[-54.754723000000013,49.443878000000041],[-54.749442999999928,49.449158000000125],[-54.73833499999995,49.457771000000093],[-54.680556999999908,49.49193600000001],[-54.673057999999912,49.492493000000081],[-54.665001000000018,49.489159000000086],[-54.644164999999987,49.473320000000001],[-54.640281999999956,49.46915400000006],[-54.640838999999971,49.463881999999955],[-54.654716000000008,49.460823000000005],[-54.684440999999993,49.420546999999999],[-54.699164999999994,49.40387700000008],[-54.705276000000026,49.400543000000084]],[[-124.179169,49.441101000000117],[-124.18554699999999,49.439986999999974],[-124.31360599999999,49.456099999999992],[-124.32668299999995,49.460823000000005],[-124.36000099999995,49.474433999999974],[-124.36609599999997,49.477486000000056],[-124.37082699999996,49.481102000000135],[-124.37165799999997,49.483047000000113],[-124.38054699999998,49.506943000000035],[-124.38110399999994,49.511940000000095],[-124.37832599999996,49.515830999999991],[-124.37165799999997,49.518326000000002],[-124.361107,49.519157000000064],[-124.35500299999995,49.517494000000113],[-124.34889199999998,49.514442000000031],[-124.30471799999992,49.512214999999969],[-124.24471999999997,49.501389000000017],[-124.23750299999995,49.498329000000126],[-124.22138999999993,49.491379000000109],[-124.1875,49.474433999999974],[-124.18167099999999,49.471375000000023],[-124.17388900000003,49.45638299999996],[-124.17194399999994,49.446655000000135],[-124.17223399999989,49.444153000000085],[-124.179169,49.441101000000117]],[[-123.33277899999996,49.441101000000117],[-123.36028299999987,49.433051999999918],[-123.37499999999994,49.433327000000133],[-123.442207,49.438599000000067],[-123.448036,49.441658000000018],[-123.45944199999997,49.467209000000082],[-123.45973200000003,49.470543000000077],[-123.45305599999995,49.495544000000109],[-123.44526699999994,49.51527400000009],[-123.43666100000002,49.522217000000069],[-123.38082899999995,49.536110000000122],[-123.37000299999994,49.536110000000122],[-123.360817,49.534995999999978],[-123.3550029999999,49.531936999999971],[-123.33833300000003,49.50610400000005],[-123.33167999999995,49.500832000000116],[-123.32805599999995,49.496383999999978],[-123.32389799999993,49.488602000000014],[-123.319458,49.474708999999962],[-123.31777999999997,49.464157],[-123.319458,49.451934999999992],[-123.32224300000001,49.448043999999925],[-123.32695000000001,49.444153000000085],[-123.33277899999996,49.441101000000117]],[[-55.695548999999971,49.506943000000035],[-55.725829999999974,49.505554000000018],[-55.732497999999964,49.509163000000001],[-55.735001000000011,49.513610999999969],[-55.736114999999984,49.518599999999935],[-55.735832000000016,49.52388000000002],[-55.730277999999942,49.545547000000056],[-55.722771000000023,49.557770000000119],[-55.716110000000015,49.560271999999998],[-55.684998000000007,49.561104000000114],[-55.676948999999979,49.561104000000114],[-55.658332999999971,49.559158000000025],[-55.653052999999886,49.555267000000129],[-55.652221999999938,49.550270000000069],[-55.653885000000002,49.544716000000051],[-55.661384999999939,49.529716000000064],[-55.664444000000003,49.52388000000002],[-55.68111399999998,49.510826000000122],[-55.687499999999943,49.508049000000028],[-55.695548999999971,49.506943000000035]],[[-124.68943799999994,49.480270000000019],[-124.69611399999997,49.477767999999969],[-124.70221700000002,49.478042999999957],[-124.74137899999994,49.488045000000113],[-124.75361599999991,49.491379000000109],[-124.82362399999994,49.539435999999966],[-124.83666999999997,49.554993000000024],[-124.84111000000001,49.562767000000008],[-124.84249899999992,49.578605999999979],[-124.84194899999989,49.58415999999994],[-124.83416699999992,49.607773000000066],[-124.83168000000001,49.610549999999989],[-124.82749899999993,49.608887000000038],[-124.81054699999993,49.589714000000129],[-124.80888400000003,49.586655000000007],[-124.80583200000001,49.585823000000062],[-124.77887699999997,49.568886000000077],[-124.68804899999986,49.483604000000014],[-124.68943799999994,49.480270000000019]],[[-55.693053999999961,49.56749700000006],[-55.709166999999979,49.566383000000087],[-55.716659999999933,49.567214999999976],[-55.720832999999971,49.571381000000088],[-55.723052999999993,49.576102999999989],[-55.722771000000023,49.581383000000073],[-55.705832999999927,49.613883999999985],[-55.684998000000007,49.624992000000134],[-55.673888999999974,49.630547000000035],[-55.659720999999934,49.635551000000021],[-55.653052999999886,49.63638300000008],[-55.572776999999974,49.603881999999999],[-55.567504999999926,49.599998000000141],[-55.573058999999944,49.595543000000134],[-55.586387999999943,49.59137700000008],[-55.608054999999979,49.586104999999975],[-55.671669000000009,49.571381000000088],[-55.693053999999961,49.56749700000006]],[[-54.576667999999984,49.558601000000124],[-54.77305599999994,49.493880999999988],[-54.809440999999993,49.488045000000113],[-54.83916499999998,49.48443600000013],[-54.855835000000013,49.48443600000013],[-54.863060000000019,49.485268000000019],[-54.871940999999936,49.487495000000081],[-54.873055000000022,49.492218000000094],[-54.893616000000009,49.580551000000128],[-54.894447000000014,49.58526599999999],[-54.891945000000021,49.590546000000074],[-54.885276999999974,49.593048000000124],[-54.805556999999965,49.595825000000048],[-54.792228999999963,49.572768999999994],[-54.793335000000013,49.566939999999988],[-54.791671999999892,49.56249200000002],[-54.78833800000001,49.557770000000119],[-54.784172000000012,49.554161000000136],[-54.768607999999972,49.546661000000029],[-54.760001999999986,49.545547000000056],[-54.743889000000024,49.544998000000135],[-54.729720999999984,49.548050000000046],[-54.708611000000019,49.554436000000123],[-54.614722999999969,49.606102000000021],[-54.574722000000008,49.635269000000108],[-54.561942999999928,49.653603000000089],[-54.548889000000031,49.659988000000055],[-54.536117999999931,49.664153999999996],[-54.529723999999987,49.633881000000031],[-54.531669999999963,49.62221500000004],[-54.538054999999986,49.587494000000106],[-54.543334999999956,49.582497000000046],[-54.570557000000008,49.562209999999936],[-54.576667999999984,49.558601000000124]],[[-54.004448000000025,49.647491000000116],[-54.257781999999963,49.566666000000055],[-54.265839000000028,49.566939999999988],[-54.274719000000005,49.569160000000011],[-54.289444000000003,49.576102999999989],[-54.293335000000013,49.580551000000128],[-54.298888999999917,49.609993000000088],[-54.297782999999981,49.651100000000099],[-54.288054999999929,49.71138000000002],[-54.282775999999956,49.716660000000104],[-54.269996999999989,49.722487999999998],[-54.141945000000021,49.75],[-54.102225999999973,49.750274999999988],[-54.093886999999938,49.748878000000047],[-54.085830999999985,49.745544000000052],[-54.081115999999952,49.736381999999935],[-54.040000999999961,49.689987000000087],[-54.003058999999951,49.659988000000055],[-54.004448000000025,49.647491000000116]],[[-124.129707,49.650825999999995],[-124.139183,49.650543000000027],[-124.15361000000001,49.655548000000067],[-124.18694299999993,49.668883999999991],[-124.196663,49.676940999999999],[-124.20195000000001,49.701934999999992],[-124.19943199999989,49.706099999999992],[-124.14750699999996,49.746658000000025],[-124.14277600000003,49.75],[-124.13722199999995,49.752219999999966],[-124.09166699999997,49.767769000000101],[-124.03611799999999,49.777214000000129],[-124.029449,49.778328000000101],[-124.021118,49.77777100000003],[-124.01611299999996,49.775551000000007],[-124.01862299999999,49.77165999999994],[-124.02555799999993,49.767769000000101],[-124.04611199999999,49.756386000000077],[-124.06054699999999,49.744995000000131],[-124.07472200000001,49.733330000000024],[-124.09084300000001,49.715546000000131],[-124.10109699999992,49.700272000000041],[-124.10555999999991,49.689430000000016],[-124.10722399999992,49.677215999999987],[-124.11081699999994,49.664992999999924],[-124.11361699999998,49.659713999999951],[-124.12304699999993,49.651931999999988],[-124.129707,49.650825999999995]],[[-56.80361199999993,49.763329000000056],[-56.827498999999989,49.761107999999979],[-56.83555599999994,49.762771999999984],[-56.83805099999995,49.767494000000056],[-56.832779000000016,49.771934999999985],[-56.826667999999984,49.77526899999998],[-56.792503000000011,49.785552999999993],[-56.782218999999998,49.78694200000001],[-56.78194400000001,49.780822999999941],[-56.790840000000003,49.768326000000002],[-56.796669000000009,49.764999000000046],[-56.80361199999993,49.763329000000056]],[[-124.44611399999991,49.723320000000115],[-124.43749999999994,49.723045000000127],[-124.42887899999994,49.723877000000016],[-124.41000400000001,49.723045000000127],[-124.38137799999998,49.713326000000109],[-124.35138699999999,49.698044000000095],[-124.33277900000002,49.683327000000077],[-124.13474300000001,49.525269000000037],[-124.13221699999991,49.520271000000037],[-124.12416100000002,49.499161000000072],[-124.122772,49.493607000000054],[-124.12748699999997,49.489715999999987],[-124.13417099999992,49.487495000000081],[-124.14167799999996,49.485825000000091],[-124.14916999999997,49.486107000000004],[-124.15527299999985,49.488602000000014],[-124.281387,49.546661000000029],[-124.40583800000002,49.605826999999977],[-124.43804899999998,49.628875999999991],[-124.44220699999994,49.638046000000031],[-124.47666900000002,49.67193600000013],[-124.5396649999999,49.692768000000001],[-124.55249799999996,49.697105000000022],[-124.56167599999998,49.699935999999923],[-124.61416600000001,49.713607999999965],[-124.62721299999993,49.71915400000006],[-124.65416699999997,49.736107000000118],[-124.66082799999992,49.742767000000129],[-124.65666199999993,49.796943999999939],[-124.65110800000002,49.799995000000138],[-124.61945300000002,49.797218000000044],[-124.604446,49.789436000000137],[-124.59944199999995,49.78443900000002],[-124.59028599999999,49.77165999999994],[-124.56234000000001,49.753326000000015],[-124.55933399999998,49.751495000000034],[-124.49472000000003,49.733330000000024],[-124.44611399999991,49.723320000000115]],[[-126.67610199999996,49.583603000000039],[-126.68138099999993,49.583054000000118],[-126.68888899999996,49.583878000000084],[-126.69722000000002,49.585548000000074],[-126.78971899999999,49.612213000000111],[-126.80803699999996,49.61971299999999],[-126.81416299999995,49.622765000000072],[-126.90556300000003,49.685547000000099],[-126.96528599999999,49.726935999999966],[-126.96945199999999,49.731102000000078],[-126.97416699999991,49.740273000000002],[-126.97556299999997,49.75],[-126.94055200000003,49.831383000000017],[-126.890556,49.84777100000008],[-126.79915599999993,49.876099000000011],[-126.77749599999993,49.87971500000009],[-126.76872299999997,49.878616000000079],[-126.74944299999999,49.85694100000012],[-126.73416099999997,49.848045000000013],[-126.67804699999994,49.825272000000098],[-126.64472999999992,49.774162000000047],[-126.636124,49.759437999999989],[-126.63445300000001,49.753883000000087],[-126.61332699999997,49.648330999999985],[-126.61609599999997,49.624435000000062],[-126.62053699999996,49.606102000000021],[-126.62416099999996,49.601386999999988],[-126.63305700000001,49.596100000000035],[-126.66861,49.585548000000074],[-126.67610199999996,49.583603000000039]],[[-62.089721999999881,49.386383000000137],[-62.081389999999999,49.385551000000078],[-62.051665999999955,49.390274000000034],[-62.043616999999927,49.390549000000078],[-62.025276000000019,49.38749700000011],[-61.892226999999934,49.351387000000045],[-61.875557000000015,49.344994000000042],[-61.825835999999924,49.312209999999993],[-61.821114000000023,49.308883999999978],[-61.663329999999917,49.149162000000047],[-61.661666999999966,49.144439999999975],[-61.670837000000006,49.134163000000001],[-61.702224999999942,49.111107000000004],[-61.735557999999969,49.096099999999979],[-61.796111999999937,49.078048999999965],[-62.019996999999989,49.069443000000035],[-62.029167000000029,49.069443000000035],[-62.195549000000028,49.074997000000053],[-62.368057000000022,49.0991590000001],[-62.726105000000018,49.154709000000025],[-62.782218999999884,49.165824999999984],[-62.946662999999944,49.198874999999987],[-63.089995999999985,49.228043000000014],[-63.097778000000005,49.23054500000012],[-63.209442000000024,49.270827999999995],[-63.23082699999992,49.280273000000022],[-63.242774999999938,49.287498000000085],[-63.253059000000007,49.294997999999964],[-63.269996999999989,49.311104],[-63.275832999999977,49.314712999999983],[-63.283332999999914,49.317771999999934],[-63.387221999999952,49.34388000000007],[-63.416945999999882,49.350829999999974],[-63.501296999999965,49.370384000000115],[-63.537223999999867,49.379714999999976],[-63.573058999999944,49.396660000000111],[-63.61611199999993,49.446938000000102],[-63.621940999999879,49.455551000000071],[-63.620833999999945,49.461105000000089],[-63.616660999999908,49.46665999999999],[-63.61333499999995,49.473044999999956],[-63.612502999999947,49.478873999999962],[-63.61611199999993,49.488327000000027],[-63.619720000000029,49.492767000000015],[-63.662772999999959,49.533051],[-63.67888599999992,49.544716000000051],[-63.714446999999893,49.566383000000087],[-63.84194199999996,49.639160000000004],[-63.881942999999978,49.65915700000005],[-63.918334999999956,49.674438000000009],[-64.01556399999987,49.702492000000063],[-64.306945999999925,49.777489000000003],[-64.382216999999969,49.789436000000137],[-64.389998999999932,49.789719000000105],[-64.418335000000013,49.801658999999972],[-64.511123999999995,49.858604000000014],[-64.513901000000033,49.863609000000054],[-64.510283999999956,49.868599000000131],[-64.50111400000003,49.878043999999989],[-64.496108999999876,49.883049000000085],[-64.490828999999906,49.886939999999925],[-64.472778000000005,49.895828000000108],[-64.458618000000001,49.900826000000109],[-64.445540999999992,49.904434000000037],[-64.226943999999946,49.948326000000066],[-64.203613000000018,49.950271999999984],[-64.142775999999969,49.948044000000039],[-64.133057000000008,49.947212000000093],[-64.12388599999997,49.945267000000115],[-64.029175000000009,49.924438000000123],[-63.958892999999932,49.898048000000131],[-63.615836999999942,49.849158999999986],[-63.545006000000001,49.843323000000112],[-63.49222599999996,49.840828000000045],[-63.475272999999959,49.840546000000018],[-63.346946999999943,49.820274000000097],[-63.309722999999963,49.813880999999981],[-63.136115999999959,49.780822999999941],[-63.074447999999961,49.764160000000061],[-62.99610899999999,49.736656000000096],[-62.786667000000023,49.676384000000098],[-62.71055599999994,49.660820000000001],[-62.545554999999979,49.599998000000141],[-62.443610999999919,49.5472180000001],[-62.340553,49.486938000000009],[-62.212218999999948,49.41443600000008],[-62.205832999999984,49.41137700000013],[-62.188889000000017,49.405823000000112],[-62.169166999999959,49.401099999999985],[-62.099167000000023,49.387771999999984],[-62.089721999999881,49.386383000000137]],[[-124.92415599999998,50.05860100000001],[-124.96861299999995,50.035827999999981],[-125.00055699999996,50.056656000000032],[-125.06304899999998,50.103324999999984],[-125.06696299999999,50.107498000000135],[-125.066101,50.113884000000041],[-125.0625,50.118324000000086],[-125.03971899999999,50.130546999999922],[-124.991669,50.168327000000033],[-124.98222399999992,50.176102000000128],[-124.98055999999991,50.18221299999999],[-124.98332199999999,50.225548000000003],[-124.93138099999993,50.171104000000128],[-124.92859599999997,50.166100000000142],[-124.91528299999999,50.141380000000083],[-124.89778100000001,50.077492000000063],[-124.92415599999998,50.05860100000001]],[[-63.859443999999996,50.197768999999937],[-63.873610999999983,50.194434999999999],[-63.890282000000013,50.194709999999986],[-63.899993999999936,50.196098000000063],[-63.908607000000018,50.198601000000053],[-63.916107000000011,50.201660000000004],[-63.920837000000006,50.205551000000071],[-63.930557000000022,50.218597000000045],[-63.931389000000024,50.223877000000073],[-63.930557000000022,50.229431000000091],[-63.926948999999922,50.236107000000004],[-63.922774999999888,50.241661000000022],[-63.916663999999969,50.244713000000104],[-63.909995999999921,50.246658000000139],[-63.90193899999997,50.24721500000004],[-63.889724999999999,50.242218000000094],[-63.865554999999915,50.228325000000041],[-63.859443999999996,50.224709000000018],[-63.854720999999927,50.220824999999991],[-63.852782999999988,50.216103000000089],[-63.853614999999991,50.210548000000017],[-63.855835000000013,50.204437000000098],[-63.859443999999996,50.197768999999937]],[[-125.16777000000002,49.980819999999937],[-125.16999800000002,49.980819999999937],[-125.17111199999994,49.981659000000093],[-125.18582199999997,50.004165999999998],[-125.20722999999998,50.044998000000021],[-125.21417199999996,50.069992000000013],[-125.28167699999989,50.11332700000014],[-125.31777999999986,50.136107999999979],[-125.32362399999994,50.143326000000002],[-125.33999599999993,50.203049000000021],[-125.34916699999997,50.242493000000138],[-125.34973100000002,50.25777400000004],[-125.348343,50.261665000000107],[-125.34554299999996,50.263901000000033],[-125.33999599999993,50.26888300000013],[-125.31082200000003,50.281380000000127],[-125.26334400000002,50.293883999999991],[-125.25472999999988,50.293610000000058],[-125.24638399999998,50.290549999999996],[-125.24333199999995,50.288329999999974],[-125.16722099999987,50.213608000000079],[-125.16111799999999,50.200272000000098],[-125.16000400000001,50.190544000000102],[-125.18666100000002,50.141663000000051],[-125.1536099999999,50.006103999999937],[-125.15416699999997,50.000832000000003],[-125.16416900000002,49.985268000000133],[-125.16777000000002,49.980819999999937]],[[-124.8125,50.111381999999992],[-124.82112100000001,50.111107000000118],[-124.82749899999993,50.111937999999952],[-124.83361799999989,50.114441000000113],[-124.86110699999989,50.136383000000023],[-124.93916299999995,50.207771000000093],[-124.96305799999999,50.236382000000049],[-124.96610999999996,50.246941000000106],[-124.96556099999992,50.251663000000008],[-124.92304999999993,50.296386999999982],[-124.91832699999986,50.29972099999992],[-124.91082799999998,50.299995000000081],[-124.90249599999999,50.29833200000013],[-124.89862099999999,50.293883999999991],[-124.87581599999993,50.28472099999999],[-124.82167099999992,50.239716000000044],[-124.75666799999999,50.178328999999962],[-124.75250199999999,50.167770000000132],[-124.752228,50.161376999999959],[-124.75499699999995,50.156097000000102],[-124.80695300000002,50.113884000000041],[-124.8125,50.111381999999992]],[[-124.73082699999992,50.302215999999987],[-124.72693599999997,50.299164000000019],[-124.72471599999994,50.299164000000019],[-124.69554099999999,50.289436000000023],[-124.68331899999993,50.283333000000084],[-124.67250100000001,50.276100000000042],[-124.66860999999994,50.272491000000059],[-124.66111799999993,50.263054000000125],[-124.65943900000002,50.258330999999941],[-124.65750099999997,50.247772000000111],[-124.65611299999989,50.231377000000009],[-124.65834000000001,50.212212000000022],[-124.66000399999996,50.207496999999989],[-124.66251399999999,50.203323000000125],[-124.695831,50.157494000000042],[-124.70195000000001,50.158600000000092],[-124.70805399999995,50.161376999999959],[-124.79222099999993,50.22526600000009],[-124.79499800000002,50.228874000000019],[-124.78083800000002,50.269440000000031],[-124.77778599999999,50.27748900000006],[-124.74500299999994,50.299437999999952],[-124.74054699999994,50.30193300000002],[-124.73082699999992,50.302215999999987]],[[-125.54387700000001,50.393883000000017],[-125.63583399999999,50.379714999999976],[-125.69360399999999,50.383330999999998],[-125.70333899999991,50.384163000000115],[-125.75527999999997,50.391662999999994],[-125.762787,50.394157000000121],[-125.76363400000002,50.397491000000116],[-125.75527999999997,50.405548000000067],[-125.74416399999996,50.40776800000009],[-125.59528399999999,50.433052000000089],[-125.58640300000002,50.434158000000139],[-125.52390300000002,50.434433000000126],[-125.51889,50.431381000000044],[-125.51806599999998,50.428604000000121],[-125.51777600000003,50.409431000000041],[-125.520554,50.403320000000122],[-125.52500899999995,50.400825999999995],[-125.53639199999998,50.395827999999995],[-125.54387700000001,50.393883000000017]],[[-125.16555800000003,50.374435000000062],[-125.06139400000001,50.240547000000049],[-125.05194099999989,50.226653999999996],[-125.05027799999993,50.221657000000107],[-125.048607,50.207771000000093],[-125.04915599999993,50.193320999999969],[-125.05166599999995,50.190826000000129],[-125.11638599999998,50.136658000000011],[-125.12917299999998,50.126098999999954],[-125.13390400000003,50.122764999999958],[-125.14028899999994,50.121658000000025],[-125.14472999999987,50.12193300000007],[-125.15083299999998,50.12499200000002],[-125.15416699999997,50.133331000000055],[-125.13971699999996,50.159431000000097],[-125.15611299999995,50.239158999999972],[-125.21083099999993,50.313048999999921],[-125.21362299999993,50.316666000000055],[-125.22000099999991,50.318329000000006],[-125.26363400000002,50.323607999999979],[-125.27194199999997,50.323883000000023],[-125.31555199999997,50.318054000000018],[-125.32112099999989,50.316939999999988],[-125.32695000000001,50.313881000000038],[-125.33306900000002,50.304435999999953],[-125.33473200000003,50.29972099999992],[-125.33944699999989,50.29583000000008],[-125.35610999999994,50.290276000000063],[-125.37222300000002,50.289436000000023],[-125.38527699999997,50.289993000000095],[-125.390289,50.29222100000004],[-125.39306599999998,50.29583000000008],[-125.39917000000003,50.311104000000114],[-125.400284,50.320831000000055],[-125.39943699999998,50.331108000000086],[-125.39806399999998,50.333878000000084],[-125.391953,50.340546000000074],[-125.291946,50.433876000000055],[-125.28443899999996,50.435822000000144],[-125.27500900000001,50.433327000000133],[-125.27306399999992,50.431107000000111],[-125.23665599999993,50.415825000000098],[-125.21640000000002,50.404709000000139],[-125.16555800000003,50.374435000000062]],[[-125.42610200000001,50.3555530000001],[-125.45777899999996,50.349434000000088],[-125.46749899999998,50.350273000000016],[-125.52610800000002,50.378875999999991],[-125.52806099999998,50.381660000000124],[-125.51862299999993,50.390274000000034],[-125.47749299999998,50.424164000000133],[-125.47165699999999,50.427489999999977],[-125.465012,50.429993000000138],[-125.37998999999996,50.460823000000005],[-125.37165799999997,50.457771000000037],[-125.37082699999996,50.455826000000059],[-125.36665299999993,50.454162999999937],[-125.34306300000003,50.441658000000018],[-125.33194700000001,50.435547000000099],[-125.33000199999998,50.430824000000143],[-125.33056599999986,50.425270000000125],[-125.33693700000003,50.416664000000026],[-125.38583399999999,50.36971299999999],[-125.39835399999998,50.364159000000029],[-125.42610200000001,50.3555530000001]],[[-125.80721999999997,50.413605000000075],[-125.90695199999993,50.409714000000008],[-125.92194399999988,50.41027100000008],[-125.92804699999999,50.411658999999986],[-125.93110699999988,50.413879000000009],[-125.95111099999997,50.433876000000055],[-125.93943799999988,50.443047000000035],[-125.90583799999996,50.45638300000013],[-125.81416299999995,50.46804800000001],[-125.80777,50.467765999999983],[-125.80359599999997,50.465546000000131],[-125.79055799999998,50.456940000000031],[-125.74109599999997,50.431664000000012],[-125.73805199999998,50.428047000000049],[-125.73805199999998,50.426658999999972],[-125.74276700000001,50.424164000000133],[-125.75834700000001,50.419990999999982],[-125.79110700000001,50.414992999999981],[-125.80721999999997,50.413605000000075]],[[-126.22582999999997,50.555267000000129],[-126.30888399999998,50.528327999999988],[-126.33640299999996,50.521659999999997],[-126.35056299999997,50.52027099999998],[-126.486107,50.515549000000078],[-126.58805799999999,50.521378000000084],[-126.60417199999995,50.52526899999998],[-126.62389400000001,50.533881999999949],[-126.60417199999995,50.539719000000105],[-126.57444800000002,50.546387000000095],[-126.55695300000002,50.548607000000118],[-126.54194599999994,50.549438000000123],[-126.52667200000002,50.548882000000106],[-126.48860200000001,50.553321999999923],[-126.38110399999999,50.574715000000026],[-126.28611799999999,50.598327999999981],[-126.28278399999999,50.597488000000112],[-126.22609699999998,50.564156000000025],[-126.22305299999999,50.560546999999985],[-126.224716,50.556655999999919],[-126.22582999999997,50.555267000000129]],[[-126.46639999999996,50.575829000000056],[-126.47501399999993,50.575554000000011],[-126.47917199999995,50.576385000000016],[-126.53555299999999,50.590546000000018],[-126.54915599999998,50.596382000000062],[-126.55222300000003,50.598602000000085],[-126.554169,50.602776000000119],[-126.55248999999998,50.607498000000021],[-126.55027799999999,50.608604000000071],[-126.54360999999994,50.611382000000049],[-126.52916699999997,50.614998000000128],[-126.45361299999996,50.626937999999996],[-126.40499899999992,50.626099000000067],[-126.385559,50.625549000000035],[-126.37721299999993,50.623877999999934],[-126.364441,50.619438000000116],[-126.36138900000003,50.615829000000133],[-126.36165599999998,50.613052000000039],[-126.36971999999992,50.605826999999977],[-126.38027999999997,50.598602000000085],[-126.38474300000001,50.596100000000035],[-126.39138799999995,50.59276600000004],[-126.39806399999998,50.591103000000089],[-126.46639999999996,50.575829000000056]],[[-59.345832999999971,50.533881999999949],[-59.353888999999924,50.533881999999949],[-59.358337000000006,50.537773000000016],[-59.384170999999924,50.633049000000085],[-59.384170999999924,50.638328999999999],[-59.382773999999984,50.64388300000013],[-59.378051999999911,50.649161999999933],[-59.371940999999993,50.652771000000143],[-59.364448999999979,50.653876999999966],[-59.355003000000011,50.652214000000072],[-59.337775999999906,50.640831000000048],[-59.333610999999905,50.636108000000036],[-59.321670999999981,50.618881000000044],[-59.305556999999965,50.59165999999999],[-59.300277999999992,50.581940000000088],[-59.298339999999939,50.57249500000006],[-59.298339999999939,50.561935000000119],[-59.308891000000017,50.553047000000106],[-59.320557000000008,50.545830000000024],[-59.333060999999873,50.539436000000137],[-59.345832999999971,50.533881999999949]],[[-126.87332200000003,50.663322000000051],[-126.83416699999998,50.634163000000058],[-126.83112299999999,50.629158000000018],[-126.83583099999998,50.625267000000122],[-126.90249599999993,50.613883999999928],[-126.91251399999999,50.61360900000011],[-127.01666299999999,50.638328999999999],[-127.025284,50.639992000000063],[-127.04276999999996,50.637497000000053],[-127.05832700000002,50.632492000000013],[-127.10193600000002,50.627486999999974],[-127.12249800000001,50.62721300000004],[-127.13221699999991,50.628326000000129],[-127.14055599999995,50.62971500000009],[-127.14472999999998,50.633881000000031],[-127.14334100000002,50.63888500000013],[-127.13166799999999,50.652214000000072],[-127.12721299999998,50.656096999999988],[-127.10916099999997,50.665267999999969],[-127.093887,50.669159000000036],[-127.08640300000002,50.669716000000108],[-126.89028899999994,50.667213000000118],[-126.87970699999994,50.666100000000029],[-126.87332200000003,50.663322000000051]],[[-126.64388999999994,50.691933000000006],[-126.65249599999999,50.691376000000105],[-126.65888999999993,50.694435000000055],[-126.662781,50.69860099999994],[-126.66583300000002,50.703323000000012],[-126.69027699999998,50.75499700000006],[-126.68554699999993,50.758888000000127],[-126.66832699999998,50.759163000000115],[-126.60221899999999,50.770828000000051],[-126.58277900000002,50.769714000000022],[-126.54387700000001,50.765831000000105],[-126.53639199999992,50.763611000000083],[-126.53582799999998,50.758606000000043],[-126.63806199999993,50.694992000000127],[-126.64388999999994,50.691933000000006]],[[-55.564720000000023,50.699714999999912],[-55.580001999999922,50.698326000000122],[-55.588889999999992,50.699431999999945],[-55.64527899999996,50.71888000000007],[-55.65166499999998,50.72304500000007],[-55.653052999999886,50.727211000000011],[-55.629439999999931,50.780823000000112],[-55.62471800000003,50.787216000000058],[-55.619163999999955,50.791381999999999],[-55.462775999999963,50.805824000000143],[-55.454444999999964,50.802489999999977],[-55.450554000000011,50.798332000000016],[-55.449722000000008,50.792770000000075],[-55.454720000000009,50.788048000000003],[-55.46694199999996,50.784163999999976],[-55.512504999999976,50.722763000000043],[-55.525001999999972,50.715827999999988],[-55.551392000000021,50.703323000000012],[-55.557502999999997,50.701385000000073],[-55.564720000000023,50.699714999999912]],[[-126.27306399999998,50.652771000000143],[-126.46333300000003,50.641662999999937],[-126.56806899999998,50.648331000000098],[-126.58416699999992,50.650269000000037],[-126.59889199999998,50.654159999999933],[-126.60637699999995,50.657211000000132],[-126.612503,50.659988000000055],[-126.61749299999997,50.664993000000095],[-126.61749299999997,50.667770000000019],[-126.54583700000001,50.726096999999982],[-126.43720999999999,50.783882000000119],[-126.38971699999996,50.806381000000044],[-126.38221699999997,50.808043999999995],[-126.28056299999997,50.828331000000048],[-126.26640299999997,50.827773999999977],[-126.25805699999995,50.824715000000026],[-126.2538909999999,50.821938000000102],[-126.25171699999987,50.818932000000075],[-126.23832699999997,50.811104000000057],[-126.22944599999994,50.803322000000094],[-126.17832900000002,50.750832000000059],[-126.17722299999997,50.748604000000114],[-126.17666600000001,50.743881000000101],[-126.25305200000003,50.699646000000087],[-126.25611900000001,50.661377000000073],[-126.26083399999999,50.657211000000132],[-126.26640299999997,50.654709000000082],[-126.27306399999998,50.652771000000143]],[[-126.73137700000001,50.771934999999985],[-126.79778299999992,50.768883000000017],[-126.807503,50.769989000000066],[-126.85333300000002,50.782767999999919],[-126.86472299999997,50.78943600000008],[-126.90583799999996,50.822769000000108],[-126.90139799999992,50.825272000000098],[-126.88806199999999,50.829162999999994],[-126.88137799999993,50.830276000000026],[-126.64862099999999,50.847214000000122],[-126.64334100000002,50.846939000000134],[-126.63583399999999,50.845268000000033],[-126.62943999999993,50.842490999999995],[-126.58860800000002,50.821381000000031],[-126.56806899999998,50.807770000000062],[-126.56304899999992,50.799995000000138],[-126.56861900000001,50.797493000000088],[-126.73137700000001,50.771934999999985]],[[-127.22693599999991,50.636108000000036],[-126.975281,50.576942000000088],[-126.85472099999993,50.554436000000123],[-126.77639799999997,50.546104000000128],[-126.76806599999998,50.544441000000006],[-126.72138999999999,50.531936999999971],[-126.70527600000003,50.527489000000003],[-126.63999899999999,50.507773999999984],[-126.62332199999992,50.498329000000126],[-126.56388899999996,50.483604000000014],[-126.49388099999993,50.481934000000024],[-126.39472999999998,50.481658999999979],[-126.38694800000002,50.482765000000029],[-126.35582699999998,50.48333000000008],[-126.327789,50.480820000000051],[-126.22112299999998,50.468596999999988],[-126.20500199999992,50.466660000000104],[-126.15471600000001,50.459435000000042],[-126.06916799999999,50.438599000000067],[-126.04611199999994,50.432495000000017],[-126.031387,50.427773000000116],[-126.01889,50.42193600000013],[-125.97609699999992,50.394996999999989],[-125.96250900000001,50.388885000000016],[-125.94776899999994,50.38499500000006],[-125.92859599999997,50.382209999999986],[-125.81696299999999,50.378044000000102],[-125.58000199999987,50.365828999999962],[-125.56416300000001,50.363883999999985],[-125.54860699999989,50.359161000000029],[-125.46305799999993,50.329719999999952],[-125.44972200000001,50.323607999999979],[-125.44055200000003,50.318329000000006],[-125.43554699999999,50.314712999999983],[-125.43167099999999,50.310547000000042],[-125.42887899999994,50.305549999999982],[-125.42722300000003,50.299995000000081],[-125.42666599999995,50.293883999999991],[-125.42722300000003,50.287498000000085],[-125.41500899999994,50.261665000000107],[-125.39362299999999,50.215546000000018],[-125.37777699999998,50.17971799999998],[-125.36277799999993,50.138046000000088],[-125.33084099999996,50.113884000000041],[-125.28694199999995,50.08138300000013],[-125.229446,50.026657],[-125.22165699999999,50.018051000000071],[-125.21611000000001,50.001389000000074],[-125.21417199999996,49.976379000000065],[-125.212784,49.970825000000048],[-125.20722999999998,49.961662000000047],[-125.16860999999994,49.912766000000033],[-125.11221299999994,49.868324000000086],[-124.99305699999991,49.788330000000087],[-124.89806399999998,49.731658999999979],[-124.89138799999989,49.664711000000068],[-124.91639700000002,49.631660000000124],[-124.86028299999992,49.541663999999969],[-124.85305800000003,49.532494000000099],[-124.83306900000002,49.510826000000122],[-124.78943599999991,49.464157],[-124.579453,49.38749700000011],[-124.55110200000001,49.378044000000102],[-124.53555299999999,49.373878000000047],[-124.51917300000002,49.370270000000119],[-124.26083399999993,49.315269000000001],[-124.12193299999996,49.270271000000093],[-123.94304699999992,49.211104999999918],[-123.85637699999995,49.149162000000047],[-123.86028299999992,49.153046000000074],[-123.86638599999998,49.160820000000115],[-123.86805700000002,49.164436000000137],[-123.87110899999988,49.173607000000118],[-123.87138399999998,49.181106999999997],[-123.86638599999998,49.186378000000047],[-123.86165599999993,49.188880999999981],[-123.84999099999999,49.191658000000075],[-123.82444800000002,49.192764000000125],[-123.82055699999995,49.190544000000102],[-123.80722000000003,49.180275000000051],[-123.79444899999993,49.173325000000034],[-123.78859699999998,49.170273000000122],[-123.76944700000001,49.16304800000006],[-123.73805199999993,49.154433999999981],[-123.71112099999999,49.149993999999992],[-123.70417800000001,49.147491000000002],[-123.699432,49.143883000000073],[-123.696663,49.14027400000009],[-123.69638099999997,49.135551000000078],[-123.69915799999995,49.130272000000105],[-123.70388800000001,49.126381000000038],[-123.73137700000001,49.117493000000081],[-123.74166899999989,49.118049999999982],[-123.83750899999995,49.14138000000014],[-123.85056299999997,49.145546000000024],[-123.81027199999994,49.115829000000076],[-123.75195300000001,49.040833000000021],[-123.74944299999999,49.03527100000008],[-123.75028999999989,49.02915999999999],[-123.75695799999994,48.986938000000123],[-123.75862099999989,48.980819999999994],[-123.76334399999996,48.976936000000137],[-123.69193999999993,48.908325000000104],[-123.68222000000003,48.902214000000072],[-123.5911099999999,48.839989000000116],[-123.58277900000002,48.831940000000088],[-123.56555199999997,48.789719000000105],[-123.56304899999998,48.778327999999988],[-123.56471299999993,48.749718000000087],[-123.50945300000001,48.587493999999992],[-123.47666899999996,48.631660000000124],[-123.47083999999995,48.673324999999977],[-123.46916199999993,48.67943600000001],[-123.46444700000001,48.683327000000077],[-123.45973200000003,48.685822000000144],[-123.45140100000003,48.686652999999978],[-123.44193999999999,48.686652999999978],[-123.41639699999996,48.684433000000126],[-123.40110800000002,48.681381000000044],[-123.39639299999999,48.677773000000116],[-123.34973099999996,48.547775000000058],[-123.34834299999994,48.535828000000095],[-123.29527300000001,48.484718000000044],[-123.29167200000001,48.480820000000108],[-123.27861000000001,48.456100000000049],[-123.27610800000002,48.451103000000103],[-123.27694700000001,48.445540999999992],[-123.28694200000001,48.418602000000021],[-123.28971899999999,48.413321999999937],[-123.29444899999993,48.409714000000065],[-123.30082699999997,48.406654000000003],[-123.32055699999989,48.399437000000034],[-123.33640299999996,48.396942000000024],[-123.36028299999987,48.397217000000069],[-123.41665599999999,48.423882000000106],[-123.42138699999992,48.427490000000034],[-123.425003,48.431938000000002],[-123.45973200000003,48.411934000000031],[-123.51334400000002,48.374709999999993],[-123.53694200000001,48.338326000000109],[-123.54250300000001,48.312492000000077],[-123.54611199999999,48.307770000000005],[-123.55166600000001,48.304710000000114],[-123.55915800000002,48.303047000000049],[-123.58332799999994,48.301102000000014],[-123.598343,48.311661000000072],[-123.71444699999995,48.348045000000127],[-123.76251199999996,48.361664000000019],[-123.77166699999998,48.361664000000019],[-123.77999899999998,48.360550000000046],[-123.79499799999996,48.357498000000135],[-123.80888400000003,48.353324999999984],[-123.817497,48.352493000000095],[-123.823624,48.352776000000063],[-123.91610699999995,48.364159000000029],[-123.92415599999998,48.366104000000064],[-123.97609699999998,48.381934999999999],[-124.26363399999997,48.468880000000013],[-124.423607,48.516937000000041],[-124.609444,48.560547000000042],[-124.6885989999999,48.578330999999991],[-124.72083999999995,48.586655000000007],[-124.75917099999998,48.6055530000001],[-124.77111799999994,48.611663999999962],[-124.79499800000002,48.629989999999964],[-124.81777999999997,48.648880000000133],[-124.82277699999997,48.652489000000116],[-124.9225009999999,48.679993000000138],[-125.02887699999997,48.708885000000009],[-125.0625,48.714996000000099],[-125.09500100000002,48.721930999999984],[-125.10221899999993,48.724433999999917],[-125.11389199999996,48.731102000000078],[-125.18443299999996,48.796104000000128],[-125.18499800000001,48.800827000000083],[-125.01722699999999,48.920547000000113],[-124.90862300000003,48.969154000000003],[-124.90306099999998,48.97137500000008],[-124.84750399999996,49.011664999999994],[-124.84277299999985,49.015549000000021],[-124.83556399999998,49.02416199999999],[-124.78083800000002,49.131377999999984],[-124.77944899999994,49.144439999999975],[-124.78083800000002,49.150542999999914],[-124.79695099999998,49.215828000000101],[-124.79972799999996,49.22693600000008],[-124.80499299999997,49.236938000000066],[-124.80776999999995,49.240547000000049],[-124.81555199999997,49.238045],[-124.818893,49.234718000000044],[-124.82444800000002,49.224158999999986],[-124.82501199999996,49.217209000000139],[-124.82333399999993,49.205551000000128],[-124.81723,49.18332700000002],[-124.81610099999995,49.164711000000011],[-124.81806899999998,49.146103000000096],[-124.82611099999997,49.122489999999971],[-124.83139,49.112495000000081],[-124.87832599999996,49.025268999999923],[-124.88194299999998,49.020546000000138],[-124.89472999999998,49.008888000000127],[-124.90055799999993,49.00499700000006],[-124.906113,49.001938000000052],[-124.93694299999999,48.988045000000056],[-124.94999699999994,48.983330000000024],[-124.96278399999994,48.981102000000021],[-125.06916799999999,48.984436000000017],[-125.126938,48.991104000000007],[-125.19888300000002,48.96276899999998],[-125.21000699999996,48.955826000000002],[-125.21665999999988,48.953323000000012],[-125.22416699999991,48.951660000000118],[-125.23137699999995,48.951103000000046],[-125.24194299999988,48.951660000000118],[-125.318893,48.96443899999997],[-125.32721699999996,48.966102999999976],[-125.45722999999992,48.918052999999986],[-125.46472199999988,48.916382000000112],[-125.48361199999999,48.915825000000041],[-125.502228,48.917770000000019],[-125.50723299999999,48.920273000000009],[-125.75110599999994,49.055267000000072],[-125.76806599999998,49.098602000000028],[-125.73805199999998,49.105552999999986],[-125.69304699999992,49.12860100000006],[-125.64167800000001,49.16304800000006],[-125.63722200000001,49.166939000000127],[-125.60888699999998,49.198043999999982],[-125.60582699999992,49.210274000000084],[-125.60749800000002,49.215828000000101],[-125.611107,49.220267999999919],[-125.61638599999998,49.219711000000018],[-125.66443599999991,49.189987000000031],[-125.72083999999995,49.157767999999976],[-125.74694799999997,49.148604999999975],[-125.75334199999998,49.147491000000002],[-125.75611899999996,49.151657000000114],[-125.779449,49.241661000000022],[-125.79666099999992,49.310272000000055],[-125.86609599999991,49.274436999999978],[-125.952789,49.230270000000075],[-125.96501199999989,49.22526599999992],[-125.97028399999999,49.224709000000018],[-125.97444199999995,49.224991000000102],[-125.98137700000001,49.227211000000125],[-125.98750299999989,49.230270000000075],[-126.020554,49.263054000000125],[-126.02333099999993,49.268051000000071],[-126.02223200000003,49.280823000000055],[-126.01862299999993,49.285553000000107],[-126.01306199999999,49.288887000000102],[-126.00666799999993,49.290549999999996],[-125.98029300000002,49.292496000000085],[-125.97361799999999,49.294997999999964],[-125.96916199999998,49.297493000000031],[-125.950287,49.311935000000005],[-125.94554099999999,49.316666000000112],[-125.89750699999996,49.41027100000008],[-125.89584399999995,49.416381999999999],[-125.89695699999993,49.428047000000049],[-125.89972699999998,49.433601000000067],[-125.90471599999995,49.435822000000144],[-125.90915699999988,49.431938000000116],[-125.94722000000002,49.395546000000138],[-125.96250900000001,49.377487000000031],[-125.96501199999989,49.373604000000114],[-125.96528599999999,49.367493000000024],[-125.962219,49.3555530000001],[-125.962784,49.350273000000072],[-125.96610999999996,49.345543000000021],[-125.99527,49.324440000000095],[-126.00195300000001,49.321938000000046],[-126.00945299999989,49.321663000000001],[-126.03916900000002,49.330275999999969],[-126.04638699999987,49.333328000000108],[-126.06111099999998,49.344154000000003],[-126.06500199999999,49.348328000000038],[-126.07556199999999,49.386383000000137],[-126.07389799999999,49.392494000000056],[-126.120003,49.423049999999989],[-126.22556299999991,49.41027100000008],[-126.26390099999998,49.389435000000049],[-126.36527999999998,49.401657000000057],[-126.45916699999998,49.401932000000045],[-126.46167000000003,49.382767000000115],[-126.46611000000001,49.380272000000048],[-126.52667200000002,49.371933000000013],[-126.54222099999993,49.374435000000119],[-126.54723399999995,49.378044000000102],[-126.57778899999988,49.407767999999919],[-126.579453,49.413322000000107],[-126.57917799999996,49.419440999999949],[-126.56973299999999,49.576385000000073],[-126.56610099999995,49.584434999999985],[-126.47028399999999,49.635551000000021],[-126.46167000000003,49.636658000000125],[-126.40416699999997,49.637772000000098],[-126.38417099999992,49.63638300000008],[-126.36749299999997,49.633049000000085],[-126.36028299999998,49.630820999999969],[-126.34137699999997,49.628875999999991],[-126.28472899999997,49.634438000000102],[-126.22389199999998,49.640549000000021],[-126.13417099999998,49.649994000000049],[-126.09445199999988,49.655548000000067],[-126.08693699999998,49.657211000000018],[-126.08750899999995,49.662209000000018],[-126.09028599999999,49.666382000000112],[-126.09416199999993,49.671104000000014],[-126.10305799999998,49.679161000000022],[-126.11028299999992,49.681380999999988],[-126.11972000000003,49.681107000000054],[-126.20944199999991,49.673881999999992],[-126.23444399999994,49.669159000000036],[-126.24638400000003,49.664711000000068],[-126.283073,49.654990999999995],[-126.29833999999994,49.652214000000072],[-126.34084300000001,49.648605000000089],[-126.43110699999994,49.662491000000045],[-126.43831599999993,49.664153999999996],[-126.58500699999996,49.701103000000046],[-126.59028599999994,49.704437000000041],[-126.63027999999997,49.794998000000078],[-126.67971799999998,49.878876000000105],[-126.80444299999988,49.909156999999993],[-126.83917200000002,49.884720000000129],[-126.84555099999989,49.8822100000001],[-126.85221899999993,49.87971500000009],[-126.87609899999995,49.873322000000087],[-126.93943799999994,49.862770000000125],[-126.99416399999996,49.855270000000019],[-127.12111699999997,49.85228699999999],[-127.13249200000001,49.85694100000012],[-127.17749000000003,49.88888500000013],[-127.18554699999999,49.897491000000059],[-127.22444199999995,49.940269000000114],[-127.24137899999999,49.961937000000034],[-127.23889199999996,49.967208999999968],[-127.234444,49.97137500000008],[-127.17999299999991,50.021378000000027],[-127.18277,50.03166200000004],[-127.18360899999999,50.051102000000014],[-127.17666599999995,50.061104],[-127.172234,50.064995000000067],[-127.13027999999997,50.084717000000126],[-127.15833999999995,50.096382000000006],[-127.27055399999995,50.0991590000001],[-127.27500899999995,50.059990000000028],[-127.27749599999993,50.055267000000015],[-127.28388999999999,50.052216000000044],[-127.33000199999998,50.033882000000062],[-127.34500100000002,50.030273000000079],[-127.38054699999998,50.026100000000099],[-127.38999899999993,50.028603000000089],[-127.42331699999994,50.042221000000097],[-127.45195000000001,50.069716999999969],[-127.46916199999993,50.088042999999971],[-127.47193900000002,50.092765999999983],[-127.54804999999993,50.130272000000105],[-127.63276699999994,50.129990000000021],[-127.78028899999993,50.084160000000054],[-127.781387,50.084160000000054],[-127.78362299999998,50.084160000000054],[-127.890556,50.106941000000063],[-127.89584400000001,50.108886999999925],[-127.90083299999998,50.112495000000024],[-127.90695199999999,50.12082700000002],[-127.90666199999998,50.127769000000114],[-127.90334300000001,50.132492000000127],[-127.89222699999988,50.139160000000061],[-127.87917299999998,50.144440000000145],[-127.86805700000002,50.151099999999985],[-127.83721899999995,50.172493000000088],[-127.82833900000003,50.180550000000096],[-127.78888699999999,50.222214000000008],[-127.79915599999993,50.317772000000105],[-127.80444299999994,50.321380999999917],[-127.86389200000002,50.336937000000091],[-127.87138399999998,50.33776899999998],[-127.88110399999999,50.337212000000079],[-127.895554,50.326385000000073],[-127.90778399999999,50.319717000000082],[-127.92166099999997,50.316666000000055],[-127.93138099999993,50.31610100000006],[-127.94833399999993,50.321937999999989],[-127.95249899999993,50.324715000000083],[-127.97860700000001,50.342491000000052],[-127.97944599999994,50.347214000000065],[-127.92610199999996,50.459991000000059],[-127.92388900000003,50.462769000000037],[-127.91722099999993,50.464156999999943],[-127.75666799999993,50.486381999999992],[-127.708054,50.491661000000136],[-127.70028699999995,50.492218000000037],[-127.58416699999998,50.486938000000009],[-127.576683,50.484717999999987],[-127.57140400000003,50.481934000000024],[-127.56331599999999,50.4741590000001],[-127.53278399999999,50.439986999999974],[-127.50750700000003,50.409157000000107],[-127.49527,50.395827999999995],[-127.47444200000001,50.381660000000124],[-127.46193699999998,50.37582400000008],[-127.454453,50.373604000000057],[-127.44695300000001,50.372765000000129],[-127.446663,50.379714999999976],[-127.45249899999988,50.388885000000016],[-127.48665599999993,50.437492000000134],[-127.50583599999999,50.458602999999982],[-127.52027899999996,50.469711000000132],[-127.53083800000002,50.476936000000023],[-127.54750100000001,50.486938000000009],[-127.56388899999996,50.502220000000023],[-127.57000699999998,50.512214999999912],[-127.56749699999995,50.516105999999979],[-127.55027799999999,50.538329999999917],[-127.54472399999997,50.541664000000083],[-127.50361599999997,50.562210000000107],[-127.49694799999992,50.565269000000058],[-127.49027999999993,50.568054000000132],[-127.47501399999999,50.571663000000115],[-127.44360399999999,50.571663000000115],[-127.41972399999992,50.573883000000137],[-127.41416900000002,50.575829000000056],[-127.41166699999997,50.581383000000017],[-127.41139199999992,50.587494000000106],[-127.41944899999999,50.596657000000107],[-127.58168000000001,50.593880000000013],[-127.69138299999997,50.606659000000093],[-127.87332200000003,50.623877999999934],[-127.87666299999995,50.621658000000139],[-127.87361099999993,50.616936000000067],[-127.854446,50.608330000000137],[-127.80055199999998,50.587494000000106],[-127.78666699999997,50.582214000000022],[-127.76834099999996,50.579994000000056],[-127.75110599999999,50.581108000000029],[-127.72501399999993,50.584434999999928],[-127.708618,50.584991000000116],[-127.66251399999999,50.581383000000017],[-127.63445300000001,50.578049000000021],[-127.61028299999998,50.565825999999959],[-127.595551,50.55582400000003],[-127.59166699999997,50.551659000000029],[-127.58972199999999,50.546104000000128],[-127.595551,50.536659000000043],[-127.60109699999998,50.533333000000027],[-127.60888699999987,50.53138000000007],[-128.05142199999995,50.446693000000039],[-128.13363599999997,50.474709000000132],[-128.224152,50.531105000000082],[-128.319458,50.608604000000071],[-128.37527499999993,50.678604000000064],[-128.40695199999999,50.738883999999985],[-128.41473399999995,50.762771999999984],[-128.41665599999999,50.76915699999995],[-128.41305499999993,50.773880000000133],[-128.40863000000002,50.77777100000003],[-128.35583499999996,50.799721000000034],[-128.349152,50.801658999999972],[-128.10693400000002,50.860550000000103],[-128.05306999999999,50.87193300000007],[-127.91832699999998,50.872214999999983],[-127.90972899999991,50.871375999999998],[-127.882767,50.865546999999992],[-127.83332799999999,50.854163999999969],[-127.67749000000003,50.817497000000003],[-127.51471700000002,50.774437000000034],[-127.50723299999993,50.772217000000012],[-127.49582699999996,50.765831000000105],[-127.48750299999995,50.757217000000082],[-127.45916699999992,50.718322999999998],[-127.354446,50.676102000000014],[-127.22693599999991,50.636108000000036]],[[-127.65471599999995,50.837769000000094],[-127.66139199999998,50.834991000000059],[-127.67027300000001,50.835266000000104],[-127.75306699999999,50.852776000000063],[-127.83332799999999,50.879715000000033],[-127.83860799999997,50.881660000000068],[-127.83306899999997,50.884995000000117],[-127.73500100000001,50.909987999999998],[-127.72638699999993,50.908600000000092],[-127.71665999999999,50.90554800000001],[-127.71028099999995,50.901932000000102],[-127.69138299999997,50.887214999999969],[-127.67083699999995,50.86693600000001],[-127.65833999999995,50.854163999999969],[-127.65527299999997,50.849433999999974],[-127.65334299999995,50.843880000000127],[-127.65471599999995,50.837769000000094]],[[-55.555557000000022,50.886383000000023],[-55.563888999999961,50.884995000000117],[-55.571670999999924,50.885826000000122],[-55.581116000000009,50.888046000000145],[-55.604720999999984,50.898048000000074],[-55.615554999999972,50.906097000000102],[-55.619720000000029,50.910271000000137],[-55.636115999999959,50.950829000000056],[-55.635276999999917,50.961380000000133],[-55.629439999999931,50.965546000000018],[-55.565552000000025,50.983046999999999],[-55.558334000000002,50.984436000000017],[-55.550551999999925,50.985268000000076],[-55.54222900000002,50.984993000000088],[-55.535277999999948,50.981377000000009],[-55.531386999999995,50.977211000000125],[-55.529723999999987,50.968323000000112],[-55.549995000000024,50.890830999999991],[-55.555557000000022,50.886383000000023]],[[-55.993889000000024,51.200272000000098],[-55.999999999999943,51.196655000000135],[-56.00111400000003,51.201660000000004],[-55.998055000000022,51.207496999999989],[-55.992774999999995,51.212769000000094],[-55.981383999999935,51.22165700000005],[-55.975554999999986,51.225822000000051],[-55.967772999999966,51.226653999999996],[-55.968329999999867,51.221375000000023],[-55.970550999999944,51.218323000000055],[-55.982498000000021,51.208885000000066],[-55.993889000000024,51.200272000000098]],[[-58.413329999999917,51.238884000000098],[-58.462219000000005,51.216103000000089],[-58.563613999999973,51.228325000000041],[-58.565001999999993,51.23333000000008],[-58.561942999999928,51.239159000000086],[-58.555831999999953,51.242767000000015],[-58.513335999999924,51.264999000000103],[-58.506392999999946,51.268326000000059],[-58.419448999999986,51.274712000000136],[-58.412773000000016,51.267212000000029],[-58.409163999999919,51.256943000000035],[-58.413329999999917,51.238884000000098]],[[-53.756366999999955,48.50326200000012],[-53.997498000000007,48.425552000000039],[-54.011116000000015,48.421660999999972],[-54.025001999999915,48.418602000000021],[-54.048889000000031,48.420546999999999],[-54.057220000000029,48.421936000000017],[-54.072776999999917,48.428604000000007],[-54.081115999999952,48.429992999999968],[-54.094443999999953,48.425827000000083],[-54.100554999999929,48.422493000000088],[-54.147223999999994,48.391380000000083],[-54.138054000000011,48.359161000000029],[-54.134726999999998,48.354438999999957],[-54.12749500000001,48.353324999999984],[-54.118606999999997,48.364998000000014],[-54.088607999999965,48.395545999999968],[-54.075561999999934,48.401932000000102],[-54.069449999999961,48.40387700000008],[-54.054442999999935,48.404160000000047],[-54.045554999999979,48.401932000000102],[-54.029167000000029,48.399437000000034],[-54.021111000000019,48.399162000000047],[-53.998885999999914,48.400826000000052],[-53.99222599999996,48.402489000000003],[-53.97972099999987,48.408042999999964],[-53.913054999999929,48.444153000000085],[-53.756366999999955,48.50326200000012],[-53.674445999999932,48.534164000000089],[-53.647223999999994,48.541107000000068],[-53.631942999999978,48.541382000000056],[-53.623054999999965,48.53916200000009],[-53.586387999999999,48.525269000000037],[-53.574722000000008,48.507216999999969],[-53.558051999999975,48.474709000000018],[-53.588051000000007,48.428047000000106],[-53.562217999999973,48.439155999999969],[-53.533889999999985,48.451935000000049],[-53.48860899999994,48.507216999999969],[-53.461945000000014,48.555266999999958],[-53.46527900000001,48.568603999999993],[-53.465835999999967,48.57416500000005],[-53.465003999999965,48.579436999999984],[-53.437217999999973,48.619987000000094],[-53.424445999999989,48.625549000000035],[-53.345832999999914,48.615828999999962],[-53.33805099999995,48.612494999999967],[-53.313056999999958,48.595267999999976],[-53.305832000000009,48.586655000000007],[-53.303329000000019,48.581940000000145],[-53.226386999999932,48.555549999999926],[-53.216392999999925,48.566939999999988],[-53.153884999999946,48.628601000000003],[-53.079726999999991,48.6988750000001],[-53.072776999999917,48.700272000000041],[-53.067779999999914,48.696380999999974],[-53.02305599999994,48.660820000000001],[-53.018889999999942,48.656380000000013],[-52.978049999999996,48.604439000000127],[-52.976386999999988,48.599159000000043],[-52.976944000000003,48.59388000000007],[-52.987220999999977,48.548050000000046],[-53.053885999999977,48.442764000000068],[-53.075561999999991,48.422493000000088],[-53.097495999999978,48.405266000000097],[-53.1875,48.350829999999974],[-53.194159999999954,48.348602000000028],[-53.201941999999974,48.347488000000055],[-53.209723999999937,48.347771000000023],[-53.218055999999933,48.3491590000001],[-53.24888599999997,48.362770000000069],[-53.261391000000003,48.37082700000002],[-53.266395999999986,48.37499200000002],[-53.345001000000025,48.360275000000058],[-53.388892999999882,48.303879000000109],[-53.615279999999984,48.178046999999935],[-53.621383999999921,48.174712999999997],[-53.634170999999924,48.169991000000095],[-53.662216000000001,48.163321999999994],[-53.668609999999944,48.162490999999989],[-53.676948999999979,48.163879000000065],[-53.694716999999912,48.169158999999979],[-53.71055599999994,48.17582700000014],[-53.892501999999979,48.226936000000137],[-53.901389999999935,48.229156000000103],[-53.934165999999948,48.233330000000137],[-53.940551999999968,48.230819999999937],[-53.945273999999984,48.178879000000052],[-53.944159999999897,48.163879000000065],[-53.917777999999998,48.088043000000027],[-53.912498000000028,48.084160000000054],[-53.904167000000029,48.081940000000088],[-53.823616000000015,48.074439999999981],[-53.793335000000013,48.073608000000092],[-53.77027899999996,48.073326000000009],[-53.733611999999994,48.076103000000103],[-53.718604999999968,48.078049000000021],[-53.696944999999971,48.079162999999994],[-53.689163000000008,48.078880000000026],[-53.692885999999874,48.067993000000001],[-53.688389000000029,48.065989999999999],[-53.685219000000018,48.063660000000141],[-53.683887000000027,48.060822000000144],[-53.684222999999918,48.057822999999985],[-53.687888999999927,48.054825000000108],[-53.691055000000006,48.052658000000065],[-53.698883000000023,48.049328000000003],[-53.736945999999989,48.032767999999976],[-53.763335999999981,48.026382000000012],[-53.799445999999989,48.02165999999994],[-53.836661999999933,48.022217000000012],[-53.852225999999973,48.023048000000074],[-53.876389000000017,48.025826000000052],[-53.893889999999942,48.029991000000052],[-53.90166499999998,48.033607000000075],[-53.909438999999963,48.033882000000119],[-53.916663999999912,48.033332999999971],[-53.923614999999984,48.031662000000097],[-53.924170999999944,48.026657000000057],[-53.919167000000016,48.022490999999945],[-53.911384999999939,48.019157000000007],[-53.893058999999937,48.014442000000145],[-53.794448999999986,47.996384000000091],[-53.779166999999973,47.996658000000025],[-53.695388999999921,48.018218999999988],[-53.69138700000002,48.019215000000145],[-53.668723999999997,48.029880999999989],[-53.650218999999993,48.037884000000133],[-53.607779999999991,48.051102000000071],[-53.605835000000013,48.046387000000038],[-53.619164000000012,47.998878000000047],[-53.622498000000007,47.993050000000096],[-53.723610000000008,47.843880000000013],[-53.737777999999992,47.826660000000061],[-53.787506000000008,47.773048000000074],[-53.793335000000013,47.768599999999935],[-53.801391999999964,47.769989000000123],[-53.807502999999997,47.773604999999975],[-53.825561999999991,47.794998000000078],[-53.852500999999961,47.785271000000137],[-53.850554999999986,47.760551000000135],[-53.837501999999915,47.699432000000058],[-53.760283999999956,47.609993000000145],[-53.631110999999976,47.54332700000009],[-53.550551999999982,47.529159999999933],[-53.545279999999991,47.534439000000134],[-53.542502999999954,47.550270000000069],[-53.541114999999991,47.585266000000047],[-53.497779999999977,47.734717999999987],[-53.495834000000002,47.740273000000059],[-53.461113000000012,47.806655999999975],[-53.434998000000007,47.83776899999998],[-53.30610699999994,47.984161000000029],[-53.290840000000003,47.999435000000119],[-53.274445000000014,48.013329000000056],[-53.170554999999979,48.05360399999995],[-53.110001000000011,48.03943600000008],[-53.101943999999946,48.038048000000003],[-53.095001000000025,48.03943600000008],[-53.053329000000019,48.049721000000034],[-53.041945999999996,48.055824000000143],[-52.996947999999975,48.086380000000077],[-52.974716000000001,48.116385999999977],[-52.959723999999994,48.143051000000014],[-52.956389999999999,48.148605000000032],[-52.926948999999979,48.169991000000095],[-52.919998000000021,48.171379000000002],[-52.902221999999995,48.16304800000006],[-52.886115999999959,48.151100000000042],[-52.881942999999922,48.147491000000059],[-52.83555599999994,48.106383999999991],[-52.831389999999942,48.101661999999919],[-52.832779000000016,48.096939000000134],[-52.838889999999935,48.093605000000139],[-52.871940999999993,48.082214000000022],[-52.880279999999914,48.083327999999995],[-52.898055999999997,48.090546000000018],[-52.904167000000029,48.089714000000072],[-52.911384999999996,48.088043000000027],[-52.917503000000011,48.084716999999955],[-52.928336999999999,48.075553999999954],[-53.058051999999975,47.922493000000031],[-53.05999799999995,47.916939000000013],[-53.059440999999993,47.886658000000125],[-53.075835999999981,47.850830000000087],[-53.158607000000018,47.683052000000089],[-53.178336999999999,47.651382000000012],[-53.183608999999933,47.646385000000123],[-53.201667999999984,47.636383000000137],[-53.221106999999961,47.628601000000003],[-53.240836999999942,47.622489999999914],[-53.259726999999998,47.615829000000019],[-53.265006999999969,47.611664000000019],[-53.267220000000009,47.606102000000078],[-53.261672999999973,47.546386999999982],[-53.175560000000019,47.431381000000101],[-53.128333999999995,47.411102000000142],[-53.121940999999993,47.413321999999994],[-53.111945999999989,47.423607000000118],[-53.083060999999987,47.458327999999995],[-53.065833999999938,47.469986000000063],[-53.013061999999934,47.501389000000074],[-52.995002999999997,47.51138300000008],[-52.951667999999927,47.530823000000055],[-52.919167000000016,47.541663999999969],[-52.907218999999998,47.54833200000013],[-52.896949999999947,47.55860100000001],[-52.849167000000023,47.621101000000124],[-52.842498999999918,47.632767000000115],[-52.840552999999943,47.638329000000056],[-52.837501999999915,47.65415999999999],[-52.838889999999935,47.663879000000009],[-52.841110000000015,47.668602000000021],[-52.841667000000029,47.673324999999977],[-52.840552999999943,47.683876000000055],[-52.798889000000031,47.784164000000033],[-52.791388999999981,47.795547000000056],[-52.78556100000003,47.79972100000009],[-52.779442000000017,47.803047000000106],[-52.770554000000004,47.79972100000009],[-52.704169999999976,47.753882999999973],[-52.700554000000011,47.749435000000005],[-52.657776000000013,47.657493999999986],[-52.614448999999979,47.516662999999937],[-52.620276999999987,47.500275000000101],[-52.625832000000003,47.489158999999972],[-52.653327999999988,47.437767000000008],[-52.718055999999933,47.364998000000014],[-52.787506000000008,47.308043999999938],[-52.818610999999976,47.224159000000043],[-52.849723999999981,47.1616590000001],[-52.845276000000013,47.142493999999942],[-52.843613000000005,47.063880999999981],[-52.844161999999983,47.058601000000067],[-52.852782999999988,47.022491000000002],[-52.884170999999981,46.9741590000001],[-52.909995999999978,46.911658999999986],[-52.92972599999996,46.851662000000033],[-52.932776999999987,46.825554000000068],[-52.934998000000007,46.804993000000024],[-52.938332000000003,46.78916200000009],[-53.090836000000024,46.643326000000002],[-53.102501000000018,46.636658000000011],[-53.161110000000008,46.619986999999981],[-53.169166999999959,46.619713000000047],[-53.192497000000003,46.62332200000003],[-53.207221999999888,46.630272000000105],[-53.213332999999977,46.633881000000088],[-53.315552000000025,46.694709999999986],[-53.354171999999949,46.736938000000009],[-53.361945999999932,46.737495000000081],[-53.384170999999981,46.721375000000023],[-53.410552999999936,46.700828999999999],[-53.426391999999964,46.687210000000107],[-53.451392999999996,46.66137700000013],[-53.463614999999947,46.654160000000047],[-53.521111000000019,46.62082700000002],[-53.532776000000013,46.614159000000029],[-53.561667999999941,46.612770000000069],[-53.569449999999961,46.614159000000029],[-53.577224999999999,46.617493000000024],[-53.607779999999991,46.636107999999979],[-53.613891999999964,46.640274000000034],[-53.617774999999995,46.644157000000007],[-53.635001999999929,46.680823999999973],[-53.643058999999994,46.704437000000098],[-53.64416499999993,46.709160000000111],[-53.648055999999997,46.796661000000029],[-53.647781000000009,46.801932999999963],[-53.645279000000016,46.81249200000002],[-53.639724999999999,46.829163000000051],[-53.636391000000003,46.834717000000069],[-53.594718999999998,46.9447100000001],[-53.64166999999992,46.983879000000002],[-53.633614000000023,47.001105999999993],[-53.577781999999956,47.085265999999933],[-53.55083499999995,47.106659000000036],[-53.539444000000003,47.114158999999972],[-53.591385000000002,47.156096999999988],[-53.646392999999989,47.105270000000075],[-53.703612999999962,47.053047000000106],[-53.823059000000001,46.956657000000064],[-53.894164999999987,46.899994000000106],[-53.945830999999941,46.858887000000038],[-54.053328999999962,46.794998000000135],[-54.097220999999934,46.799438000000123],[-54.17888599999992,46.81610100000006],[-54.187774999999988,46.819160000000011],[-54.18999500000001,46.823607999999979],[-54.190833999999995,46.828605999999979],[-54.196387999999956,46.862494999999967],[-54.196663000000001,46.883330999999998],[-54.193329000000006,46.893607999999972],[-54.160827999999981,46.981934000000024],[-54.131942999999978,47.012496999999996],[-54.11500499999994,47.039719000000105],[-54.092498999999975,47.079437000000098],[-54.066665999999998,47.131104000000107],[-53.993889000000024,47.265274000000034],[-53.964721999999995,47.299721000000034],[-53.928611999999987,47.302773000000116],[-53.921943999999996,47.304161000000022],[-53.879997000000003,47.348045000000127],[-53.875557000000015,47.354163999999969],[-53.867500000000007,47.402771000000087],[-53.879439999999931,47.43082400000003],[-53.900275999999963,47.486107000000061],[-53.891669999999976,47.524711999999965],[-53.885558999999944,47.576941999999974],[-53.894721999999945,47.6055530000001],[-53.896950000000004,47.609993000000145],[-53.983886999999925,47.75777400000004],[-54.003333999999995,47.778877000000136],[-54.033332999999914,47.796661000000029],[-54.195273999999984,47.857498000000021],[-54.194999999999993,47.843048000000124],[-54.197219999999902,47.832214000000079],[-54.212776000000019,47.777771000000087],[-54.219161999999926,47.766106000000036],[-54.223884999999939,47.759995000000117],[-54.259170999999981,47.715271000000143],[-54.337776000000019,47.621658000000025],[-54.435271999999998,47.505554000000075],[-54.468605000000025,47.441658000000075],[-54.477492999999981,47.404991000000052],[-54.472495999999978,47.401099999999985],[-54.477492999999981,47.395828000000051],[-54.482772999999952,47.391663000000051],[-54.511116000000015,47.372765000000015],[-54.517219999999952,47.369438000000059],[-54.601394999999968,47.345268000000033],[-54.611388999999974,47.353049999999996],[-54.613060000000019,47.35833000000008],[-54.61333499999995,47.362770000000069],[-54.606948999999986,47.374434999999949],[-54.601944000000003,47.379715000000033],[-54.596663999999862,47.383880999999917],[-54.559998000000007,47.413879000000065],[-54.529166999999973,47.442214999999976],[-54.489998000000014,47.486382000000049],[-54.417220999999984,47.583603000000096],[-54.410827999999867,47.594994000000042],[-54.413329999999917,47.599715999999944],[-54.418334999999956,47.603607000000011],[-54.430557000000022,47.597771000000137],[-54.440833999999938,47.586937000000091],[-54.508614000000023,47.513328999999999],[-54.53194400000001,47.479987999999992],[-54.539444000000003,47.468048000000124],[-54.563613999999973,47.439987000000031],[-54.578887999999893,47.423882000000106],[-54.604720999999984,47.401932000000102],[-54.621383999999978,47.389992000000007],[-54.700279000000023,47.357773000000009],[-54.719993999999929,47.352218999999991],[-54.727218999999991,47.351387000000045],[-54.818610999999862,47.363609000000054],[-54.819450000000018,47.368599000000074],[-54.803054999999972,47.380546999999979],[-54.793616999999983,47.391936999999984],[-54.786667000000023,47.413879000000065],[-54.787506000000008,47.418884000000105],[-54.796111999999994,47.420830000000024],[-54.856392000000028,47.390549000000078],[-54.980552999999929,47.285552999999936],[-55.039169000000015,47.225821999999994],[-55.043892000000028,47.220825000000048],[-55.045554999999979,47.215271000000087],[-55.043335000000013,47.210548000000074],[-55.05361199999993,47.150826000000109],[-55.065833999999995,47.093323000000112],[-55.069450000000018,47.082214000000022],[-55.100280999999995,47.05471],[-55.149444999999957,47.012215000000083],[-55.154716000000008,47.008049000000028],[-55.193329000000006,46.984993000000145],[-55.225829999999974,46.934433000000126],[-55.230277999999942,46.928329000000076],[-55.236945999999932,46.923607000000004],[-55.246947999999975,46.916939000000013],[-55.258613999999966,46.91027100000008],[-55.358337000000006,46.874161000000129],[-55.384170999999924,46.865829000000133],[-55.399993999999936,46.865829000000133],[-55.456664999999987,46.874710000000107],[-55.463615000000004,46.877486999999974],[-55.468604999999968,46.881660000000124],[-55.471938999999963,46.886383000000137],[-55.626944999999921,46.868881000000101],[-55.634170999999981,46.866661000000079],[-55.689719999999966,46.858329999999967],[-55.803328999999962,46.860549999999989],[-55.845832999999971,46.86971299999999],[-55.915000999999961,46.88749700000011],[-55.923614999999927,46.889717000000076],[-55.931389000000024,46.892769000000044],[-55.946663000000001,46.899436999999978],[-55.966110000000015,46.909988000000112],[-55.98082699999992,46.932213000000104],[-55.982773000000009,46.936652999999978],[-55.984168999999952,46.941658000000018],[-55.983054999999979,46.952492000000063],[-55.980552999999986,46.957771000000037],[-55.96665999999999,46.981377000000123],[-55.952498999999989,46.996383999999921],[-55.886948000000018,47.056099000000017],[-55.87110899999999,47.069160000000124],[-55.865554999999972,47.072768999999937],[-55.775276000000019,47.10193600000008],[-55.768607999999972,47.103325000000041],[-55.745551999999918,47.10443900000007],[-55.738892000000021,47.10443900000007],[-55.723609999999951,47.104164000000026],[-55.715553,47.103050000000053],[-55.698050999999964,47.098045000000013],[-55.68250299999994,47.091377000000023],[-55.674445999999989,47.090270999999973],[-55.586945000000014,47.110275000000115],[-55.573616000000015,47.11360900000011],[-55.493331999999896,47.133880999999974],[-55.487777999999992,47.137214999999969],[-55.329445000000021,47.242493000000024],[-55.298339999999939,47.267211999999972],[-55.290557999999976,47.278328000000101],[-55.285278000000005,47.294998000000021],[-55.28583500000002,47.310272000000111],[-55.286948999999993,47.314995000000067],[-55.286117999999988,47.325554000000125],[-55.269721999999945,47.390830999999991],[-55.266662999999994,47.396659999999997],[-55.262221999999895,47.402771000000087],[-55.256949999999961,47.407211000000075],[-55.202224999999999,47.44609800000012],[-55.179169000000002,47.460548000000017],[-55.172501000000011,47.463882000000012],[-55.107779999999991,47.483604000000071],[-55.100554999999986,47.484160999999972],[-55.083611000000019,47.481101999999964],[-55.075835999999867,47.480820000000108],[-55.040282999999931,47.484993000000031],[-54.951392999999882,47.504997000000003],[-54.868057000000022,47.543883999999991],[-54.845832999999971,47.556938000000059],[-54.841666999999973,47.563324000000136],[-54.841385000000002,47.583603000000096],[-54.845551,47.633881000000088],[-54.949439999999925,47.599715999999944],[-54.956389999999999,47.59804500000007],[-54.970832999999971,47.596656999999993],[-55.019278999999926,47.621101000000124],[-55.028277999999887,47.620766000000117],[-55.033278999999936,47.621601000000112],[-55.036109999999894,47.623936000000015],[-55.037612999999908,47.626601999999991],[-55.037440999999887,47.62977200000006],[-55.03561000000002,47.633269999999982],[-55.029612999999927,47.639598999999976],[-55.013779,47.65310299999993],[-55.00777800000003,47.65943500000003],[-54.956389999999999,47.741379000000109],[-54.947494999999947,47.75360900000004],[-54.938048999999978,47.771103000000096],[-54.936110999999926,47.781661999999983],[-54.943054000000018,47.781105000000082],[-54.948607999999922,47.776657000000114],[-55.011391000000003,47.721374999999966],[-55.021942000000024,47.711661999999933],[-55.025276000000019,47.705268999999987],[-55.027221999999995,47.695267000000058],[-55.03055599999999,47.684158000000139],[-55.033614999999941,47.678329000000133],[-55.119114000000025,47.616936000000123],[-55.122443999999916,47.614269000000093],[-55.126281999999946,47.612774000000002],[-55.130774999999915,47.611938000000123],[-55.135777000000019,47.613605000000007],[-55.262778999999966,47.650543000000084],[-55.349167000000023,47.704437000000098],[-55.34833500000002,47.710274000000027],[-55.357506000000001,47.726097000000095],[-55.365004999999996,47.726379000000122],[-55.379722999999956,47.724991000000045],[-55.427497999999957,47.711661999999933],[-55.432502999999997,47.70638299999996],[-55.461944999999957,47.646103000000039],[-55.464721999999938,47.640274000000034],[-55.467498999999975,47.619155999999919],[-55.46665999999999,47.614159000000029],[-55.461387999999943,47.610275000000001],[-55.454444999999964,47.611107000000118],[-55.446663000000001,47.623046999999985],[-55.436110999999926,47.631659999999954],[-55.430000000000007,47.634163000000115],[-55.423057999999969,47.635826000000066],[-55.415276000000006,47.63249200000007],[-55.407776000000013,47.624161000000015],[-55.400276000000019,47.615547000000106],[-55.398337999999967,47.610275000000001],[-55.389724999999999,47.58638000000002],[-55.400276000000019,47.514717000000076],[-55.406661999999926,47.493050000000039],[-55.40972099999999,47.487213000000054],[-55.414161999999919,47.481101999999964],[-55.429726000000016,47.467209000000139],[-55.43638599999997,47.465546000000018],[-55.498610999999983,47.453880000000026],[-55.505835999999931,47.453322999999955],[-55.526108000000022,47.454436999999928],[-55.555274999999938,47.440269000000058],[-55.560555000000022,47.436104000000057],[-55.565001999999993,47.429993000000024],[-55.587776000000019,47.398604999999975],[-55.625,47.463608000000079],[-55.654167000000029,47.495270000000062],[-55.795279999999991,47.492767000000072],[-55.914443999999946,47.437767000000008],[-55.920279999999934,47.435265000000129],[-55.925560000000019,47.439156000000025],[-55.923889000000031,47.444709999999986],[-55.91972399999986,47.450829000000056],[-55.831673000000023,47.517212000000086],[-55.788895000000025,47.551102000000014],[-55.745834000000002,47.585266000000047],[-55.77305599999994,47.579720000000009],[-55.824172999999973,47.566382999999973],[-55.892226999999991,47.5366590000001],[-55.987777999999992,47.500549000000035],[-56.104172000000005,47.463608000000079],[-56.110557999999855,47.462494000000106],[-56.11860699999994,47.463608000000079],[-56.158889999999928,47.484718000000044],[-56.169167000000016,47.492493000000138],[-56.172500999999897,47.49721500000004],[-56.172500999999897,47.501663000000008],[-56.168059999999969,47.507216999999969],[-56.162498000000028,47.51138300000008],[-56.12027699999993,47.519157000000064],[-56.044448999999986,47.535271000000023],[-55.941939999999931,47.561661000000072],[-55.889998999999932,47.578330999999991],[-55.639998999999989,47.668053000000043],[-55.633330999999998,47.671104000000071],[-55.628333999999995,47.674713000000054],[-55.635001999999986,47.678329000000133],[-55.642501999999979,47.678604000000121],[-55.649993999999992,47.677773000000116],[-55.663886999999932,47.675552000000039],[-55.704169999999976,47.664992999999981],[-55.75,47.649437000000034],[-55.756110999999976,47.646942000000024],[-55.774718999999948,47.638329000000056],[-55.80471799999998,47.624435000000119],[-55.824447999999961,47.618599000000017],[-55.838889999999935,47.617210000000057],[-55.855835000000013,47.620270000000119],[-55.903327999999931,47.645270999999923],[-55.913611999999944,47.653046000000018],[-55.917503000000011,47.657493999999986],[-55.919448999999929,47.667213000000004],[-55.918609999999944,47.673049999999989],[-55.916388999999981,47.678329000000133],[-55.91194200000001,47.684432999999956],[-55.901389999999992,47.693047000000035],[-55.895554000000004,47.696655000000135],[-55.866393999999957,47.713882000000126],[-55.83277899999996,47.742493000000081],[-55.815001999999993,47.772491000000002],[-55.799445999999875,47.799164000000019],[-55.742226000000016,47.923325000000091],[-55.746947999999975,47.93249499999996],[-55.754447999999968,47.94110100000006],[-55.767219999999952,47.953323000000069],[-55.773613000000012,47.956940000000031],[-55.78055599999999,47.95526899999993],[-55.817504999999983,47.886939999999981],[-55.835273999999913,47.850830000000087],[-55.835555999999997,47.845543000000134],[-55.847220999999934,47.806938000000002],[-55.849998000000028,47.801102000000128],[-55.854445999999996,47.794716000000051],[-55.865279999999984,47.786110000000122],[-55.877219999999966,47.778602999999976],[-55.888892999999996,47.773048000000074],[-56.049727999999959,47.699432000000058],[-56.087501999999972,47.736938000000009],[-56.081116000000009,47.739715999999987],[-56.053611999999987,47.77388000000002],[-56.057502999999997,47.778327999999988],[-56.064163000000008,47.776657000000114],[-56.111671000000001,47.763610999999969],[-56.125,47.757216999999969],[-56.185271999999998,47.680274999999995],[-56.160278000000005,47.642220000000123],[-56.154998999999862,47.638329000000056],[-56.161384999999939,47.634163000000115],[-56.173332000000016,47.629714999999976],[-56.187499999999943,47.627213000000097],[-56.358336999999892,47.603324999999984],[-56.394722000000002,47.601105000000132],[-56.410277999999948,47.601387000000045],[-56.418892000000028,47.601936000000137],[-56.443053999999904,47.605827000000033],[-56.546950999999979,47.613883999999985],[-56.615554999999915,47.613327000000083],[-56.644164999999987,47.596100000000092],[-56.641113000000018,47.592216000000064],[-56.639998999999989,47.587212000000079],[-56.644164999999987,47.581108000000086],[-56.65055099999995,47.578330999999991],[-56.774719000000005,47.531937000000028],[-56.840836000000024,47.52137799999997],[-56.902221999999995,47.552490000000091],[-56.924445999999989,47.562209999999993],[-56.956107999999972,47.574996999999996],[-56.96527900000001,47.57777400000009],[-56.992500000000007,47.583878000000141],[-56.999725000000012,47.584717000000069],[-57.014724999999942,47.583878000000141],[-57.096663999999976,47.56610100000006],[-57.118332000000009,47.563881000000038],[-57.126105999999993,47.563881000000038],[-57.134445000000028,47.566382999999973],[-57.150276000000019,47.572769000000051],[-57.163329999999917,47.579720000000009],[-57.204720000000009,47.59304800000001],[-57.530829999999867,47.630821000000026],[-57.657776000000013,47.60305000000011],[-57.779441999999904,47.627487000000031],[-57.882499999999993,47.651382000000012],[-58.027495999999928,47.694153000000028],[-58.036391999999978,47.696098000000063],[-58.359443999999939,47.647217000000012],[-58.690552000000025,47.598877000000016],[-58.771110999999962,47.59137700000008],[-58.861945999999932,47.589157000000114],[-58.885001999999872,47.592766000000097],[-58.894164999999873,47.59388000000007],[-58.937499999999943,47.589989000000003],[-59.076667999999984,47.571663000000001],[-59.102130999999929,47.564251000000127],[-59.11361699999992,47.558327000000077],[-59.118889000000024,47.554710000000114],[-59.135559000000001,47.556380999999988],[-59.161941999999954,47.561661000000072],[-59.297782999999868,47.606658999999979],[-59.304442999999992,47.609993000000145],[-59.305831999999953,47.614998000000014],[-59.309440999999993,47.661102000000085],[-59.309440999999993,47.671379000000059],[-59.30499999999995,47.724991000000045],[-59.3024979999999,47.736107000000004],[-59.325561999999991,47.807213000000047],[-59.329726999999991,47.816383000000087],[-59.369164000000012,47.852775999999949],[-59.40193899999997,47.880271999999991],[-59.40694400000001,47.889717000000076],[-59.404715999999951,47.900269000000094],[-59.400832999999921,47.90665400000006],[-59.39166999999992,47.916664000000026],[-59.378051999999911,47.922493000000031],[-59.365554999999915,47.924995000000081],[-59.328612999999905,47.928879000000109],[-59.321945000000028,47.930549999999982],[-59.31639100000001,47.934158000000082],[-59.31138599999997,47.938881000000094],[-59.267775999999969,47.982208000000071],[-59.265006999999912,47.988045000000056],[-59.262778999999966,47.999435000000119],[-59.246947999999975,48.011940000000038],[-59.230277999999942,48.02276599999999],[-59.218605000000025,48.029160000000047],[-59.091384999999946,48.090271000000143],[-59.053885999999864,48.105552999999986],[-59.041114999999934,48.110275000000058],[-59.020554000000004,48.116385999999977],[-58.958054000000004,48.149993999999992],[-58.75,48.287498000000085],[-58.701392999999996,48.319716999999969],[-58.691108999999983,48.32888000000014],[-58.686385999999914,48.334160000000054],[-58.682502999999997,48.340546000000131],[-58.678336999999999,48.351936000000023],[-58.675835000000006,48.363051999999925],[-58.670279999999991,48.37499200000002],[-58.598884999999939,48.423325000000034],[-58.587775999999963,48.430550000000039],[-58.568892999999889,48.438599000000067],[-58.555831999999953,48.443047000000035],[-58.514724999999999,48.452773999999977],[-58.500556999999958,48.455551000000071],[-58.492774999999995,48.455551000000071],[-58.492774999999995,48.450272000000098],[-58.497779999999977,48.44582400000013],[-58.518889999999999,48.441375999999991],[-58.526108000000022,48.440544000000102],[-58.546394000000021,48.434990000000084],[-58.558891000000017,48.42971799999998],[-58.588889999999935,48.412765999999976],[-58.599998000000028,48.405822999999998],[-58.601112000000001,48.400826000000052],[-58.59194199999996,48.398879999999963],[-58.483611999999994,48.427773000000002],[-58.470832999999971,48.43221299999999],[-58.464721999999995,48.436377999999991],[-58.449439999999925,48.449158000000125],[-58.4183349999999,48.486655999999982],[-58.420279999999991,48.508049000000085],[-58.569449999999961,48.538605000000018],[-58.673614999999984,48.554710000000057],[-58.682502999999997,48.554993000000024],[-58.697219999999959,48.553046999999992],[-58.732215999999994,48.545830000000024],[-58.765556000000004,48.535828000000095],[-58.778052999999886,48.531937000000028],[-58.812499999999943,48.52388000000002],[-58.857506000000001,48.518599999999992],[-58.931389000000024,48.511939999999981],[-58.954720000000009,48.510825999999952],[-58.979163999999969,48.512497000000053],[-58.988335000000006,48.514442000000031],[-59.004722999999956,48.520271000000037],[-59.013335999999924,48.522217000000126],[-59.091667000000029,48.508331000000112],[-59.105559999999969,48.50471500000009],[-59.118889000000024,48.50110600000005],[-59.146392999999875,48.493049999999982],[-59.192771999999991,48.477767999999969],[-59.232497999999964,48.468597000000045],[-59.246947999999975,48.46665999999999],[-59.255279999999971,48.467490999999995],[-59.260558999999944,48.471931000000041],[-59.261115999999959,48.476653999999996],[-59.232773000000009,48.523048000000131],[-59.228881999999999,48.529160000000104],[-59.215003999999965,48.545547000000056],[-59.209998999999925,48.549995000000024],[-59.137504999999976,48.598876999999959],[-59.084166999999866,48.626380999999981],[-59.077782000000013,48.629158000000075],[-59.050277999999935,48.635551000000021],[-59.03055599999999,48.641937000000098],[-59.02416999999997,48.644714000000022],[-58.908889999999985,48.701934999999992],[-58.828888000000006,48.750832000000116],[-58.811667999999941,48.76166500000005],[-58.799727999999959,48.768050999999957],[-58.774719000000005,48.77887700000008],[-58.767775999999969,48.775551000000064],[-58.772498999999982,48.769989000000123],[-58.815001999999936,48.735825000000091],[-58.849723999999867,48.714996000000099],[-58.873885999999914,48.701659999999947],[-58.891113000000018,48.690826000000072],[-58.912773000000016,48.674713000000054],[-58.938605999999879,48.653603000000089],[-58.947776999999917,48.642769000000044],[-58.955832999999984,48.630272000000048],[-58.958610999999962,48.624161000000129],[-58.958610999999962,48.613883999999985],[-58.955832999999984,48.609436000000017],[-58.947494999999947,48.601105000000132],[-58.896950000000004,48.55193300000002],[-58.888335999999924,48.551101999999958],[-58.743057000000022,48.560822000000087],[-58.728332999999964,48.56249200000002],[-58.721381999999949,48.564438000000109],[-58.715003999999965,48.567215000000033],[-58.709442000000024,48.570831000000055],[-58.704445000000021,48.575271999999984],[-58.695549000000028,48.586937000000091],[-58.68332700000002,48.605827000000033],[-58.676666000000012,48.618050000000096],[-58.672501000000011,48.629433000000063],[-58.669998000000021,48.640831000000105],[-58.671386999999925,48.650825999999995],[-58.674171000000001,48.65526600000004],[-58.679442999999992,48.66944100000012],[-58.680832000000009,48.68471500000004],[-58.658051,48.743049999999982],[-58.618331999999896,48.779716000000064],[-58.543892000000028,48.860824999999977],[-58.535834999999963,48.878601000000117],[-58.506667999999934,48.949431999999945],[-58.506667999999934,48.98054499999995],[-58.503333999999995,48.997490000000084],[-58.500838999999928,49.003608999999926],[-58.400832999999864,49.127487000000087],[-58.396110999999962,49.131377999999984],[-58.351943999999889,49.15026899999998],[-58.348884999999996,49.145828000000108],[-58.342967999999985,49.100201000000027],[-58.365634999999997,49.079922000000067],[-58.368019000000004,49.061428000000035],[-58.353702999999939,49.056656000000032],[-58.31075299999992,49.068584000000044],[-58.292857999999967,49.072762000000068],[-58.240554999999972,49.070274000000097],[-58.17832199999998,49.063217000000066],[-58.143726000000015,49.041740000000118],[-58.09833500000002,48.99221799999998],[-58.084723999999937,48.985268000000133],[-58.077781999999956,48.981934000000138],[-58.060279999999921,48.976096999999982],[-58.050551999999982,48.973320000000115],[-57.99610899999999,48.96138000000002],[-57.961387999999999,48.956657000000007],[-57.938605999999993,48.958328000000051],[-57.90166499999998,48.96276899999998],[-57.888054000000011,48.966102999999976],[-57.881667999999991,48.96888000000007],[-57.892226999999934,48.981658999999922],[-57.900551000000007,48.9847180000001],[-57.929442999999992,48.978874000000076],[-57.958611000000019,48.976096999999982],[-57.974716000000001,48.976096999999982],[-58.009223999999961,48.98041500000005],[-58.02777900000001,48.985549999999989],[-58.035834999999963,48.988602000000128],[-58.050551999999982,48.99582700000002],[-58.09332999999998,49.025825999999995],[-58.103888999999924,49.033607000000075],[-58.108054999999922,49.037772999999959],[-58.135276999999974,49.082771000000037],[-58.144447000000014,49.12193300000007],[-58.122612000000004,49.124931000000004],[-58.119281999999998,49.127102000000036],[-58.115608000000009,49.129105000000038],[-58.111110999999994,49.129771999999946],[-58.094775999999968,49.124603000000036],[-58.078776999999945,49.121769000000029],[-58.049445999999932,49.120270000000005],[-57.925559999999962,49.123047000000042],[-57.918610000000001,49.124709999999993],[-57.913329999999974,49.129158000000132],[-57.882773999999927,49.157767999999976],[-57.878882999999973,49.170273000000122],[-57.89805599999994,49.158600000000092],[-57.912215999999944,49.152771000000087],[-57.925834999999893,49.148331000000042],[-57.939437999999996,49.144997000000046],[-57.947494999999947,49.144997000000046],[-58.057220000000029,49.144997000000046],[-58.075558000000001,49.153271000000075],[-58.081054999999992,49.154438000000141],[-58.086055999999928,49.156269000000123],[-58.092555999999945,49.160934000000111],[-58.09589399999993,49.166271000000108],[-58.064055999999994,49.183350000000132],[-58.063057000000015,49.185451999999941],[-58.065455999999983,49.190414000000033],[-58.060622999999964,49.188583000000051],[-58.05495499999995,49.187583999999958],[-58.034957999999904,49.185749000000044],[-58.025459000000012,49.185749000000044],[-58.011292000000026,49.186252999999965],[-58.002456999999993,49.188251000000093],[-57.995621000000028,49.192078000000038],[-57.988785000000007,49.197247000000118],[-57.932219999999973,49.234160999999972],[-57.928054999999972,49.240273000000116],[-57.93638599999997,49.239716000000044],[-57.995162999999991,49.236885000000086],[-58.003330000000005,49.234215000000006],[-58.011662000000001,49.23071299999998],[-58.031001999999944,49.224548000000027],[-58.03566399999994,49.223713000000032],[-58.049331999999936,49.222717000000046],[-58.058829999999944,49.223049000000003],[-58.191939999999931,49.236382000000049],[-58.200835999999867,49.239716000000044],[-58.211945000000014,49.24721500000004],[-58.233886999999982,49.27304799999996],[-58.236663999999905,49.27748900000006],[-58.240836999999942,49.286942000000067],[-58.241942999999992,49.291663999999969],[-58.241942999999992,49.302215999999987],[-58.223327999999924,49.390274000000034],[-58.216392999999982,49.402488999999946],[-58.192497000000003,49.429436000000067],[-58.157776000000013,49.464439000000027],[-58.152221999999995,49.468879999999956],[-58.043892000000028,49.541382000000056],[-58.032218999999941,49.548332000000073],[-58.019164999999873,49.553879000000052],[-57.998336999999992,49.559158000000025],[-57.971107000000018,49.554993000000024],[-57.915112000000022,49.532047000000034],[-57.910609999999963,49.530216000000053],[-57.903445999999974,49.525551000000064],[-57.861445999999944,49.505885999999975],[-57.746947999999918,49.453606000000093],[-57.715004000000022,49.454712000000086],[-57.707503999999915,49.455551000000071],[-57.701110999999969,49.458327999999995],[-57.696388000000013,49.463608000000022],[-57.698883000000023,49.468323000000055],[-57.705832999999984,49.47165700000005],[-57.788895000000025,49.500832000000116],[-57.864222999999981,49.534939000000065],[-57.869389000000012,49.535439000000054],[-57.872719000000018,49.537773000000072],[-57.942223000000013,49.60305000000011],[-57.944716999999969,49.607498000000078],[-57.951110999999912,49.652771000000143],[-57.951110999999912,49.65776800000009],[-57.948333999999932,49.674164000000076],[-57.935271999999998,49.708602999999925],[-57.926391999999964,49.726379000000065],[-57.899993999999992,49.762215000000083],[-57.82916999999992,49.845543000000077],[-57.671111999999937,50.084160000000054],[-57.631667999999934,50.144714000000079],[-57.543334999999956,50.29833200000013],[-57.524445000000014,50.334159999999997],[-57.521384999999952,50.345267999999976],[-57.521111000000019,50.35054800000006],[-57.515555999999947,50.373604000000057],[-57.507224999999949,50.390831000000105],[-57.498336999999992,50.408600000000035],[-57.490836999999999,50.420830000000137],[-57.448607999999979,50.486106999999947],[-57.377220000000023,50.584434999999928],[-57.37249799999995,50.590828000000101],[-57.361114999999927,50.598602000000085],[-57.341667000000029,50.607498000000021],[-57.310059000000024,50.608940000000132],[-57.300220000000024,50.609776000000068],[-57.295559000000026,50.60927200000009],[-57.291224999999997,50.607105000000047],[-57.276222000000018,50.601440000000082],[-57.245276999999987,50.596382000000062],[-57.228049999999939,50.594437000000084],[-57.204444999999964,50.596100000000035],[-57.173614999999927,50.60083000000003],[-57.166945999999996,50.603325000000098],[-57.161384999999996,50.606384000000048],[-57.150832999999921,50.616104000000121],[-57.148055999999997,50.621933000000126],[-57.154715999999951,50.625549000000035],[-57.171943999999996,50.624992000000134],[-57.276442999999915,50.640717000000052],[-57.378608999999926,50.687767000000065],[-57.334166999999923,50.711937000000091],[-57.325004999999919,50.711662000000047],[-57.236945999999989,50.727211000000011],[-57.162498000000028,50.751105999999993],[-57.14833799999991,50.756103999999993],[-57.089438999999913,50.780548000000124],[-57.072501999999986,50.793884000000048],[-56.983054999999979,50.868324000000086],[-56.927498000000014,50.915824999999984],[-56.898055999999997,51.019440000000088],[-56.899170000000026,51.024436999999978],[-56.903327999999988,51.028603000000089],[-56.909995999999978,51.03276800000009],[-56.927223000000026,51.038605000000018],[-56.964721999999995,51.04332700000009],[-56.921669000000009,51.051384000000098],[-56.892226999999991,51.060272000000055],[-56.879996999999946,51.065543999999989],[-56.784446999999943,51.137771999999984],[-56.781386999999995,51.143608000000029],[-56.78194400000001,51.149162000000047],[-56.785278000000005,51.153046000000074],[-56.793334999999956,51.16137700000013],[-56.80972300000002,51.183601000000067],[-56.793892000000028,51.239989999999921],[-56.744164000000012,51.293052999999929],[-56.738608999999997,51.298881999999935],[-56.733330000000024,51.302773000000002],[-56.68250299999994,51.339432000000102],[-56.623885999999914,51.366386000000034],[-56.616942999999935,51.368881000000044],[-56.512504999999976,51.402214000000072],[-56.476661999999919,51.411658999999986],[-56.461945000000014,51.414992999999981],[-56.45416999999992,51.415543000000014],[-56.271384999999952,51.471656999999993],[-56.110557999999855,51.523879999999963],[-56.011391000000003,51.56638300000003],[-55.998336999999992,51.572220000000016],[-55.960281000000009,51.593880000000013],[-55.943329000000006,51.606384000000048],[-55.918609999999944,51.62110100000001],[-55.90555599999999,51.626937999999996],[-55.898055999999997,51.628601000000117],[-55.890282000000013,51.629433000000006],[-55.837775999999963,51.621376000000055],[-55.846389999999928,51.60193600000008],[-55.857779999999991,51.593323000000112],[-55.885001999999929,51.562492000000134],[-55.886664999999937,51.556938000000002],[-55.886948000000018,51.551933000000133],[-55.887222000000008,51.500274999999988],[-55.886116000000015,51.495270000000119],[-55.87777699999998,51.492218000000037],[-55.694442999999978,51.481102000000078],[-55.639998999999989,51.481934000000024],[-55.648612999999955,51.485267999999962],[-55.68360899999999,51.5],[-55.729720999999984,51.543327000000033],[-55.737503000000004,51.552490000000034],[-55.739166000000012,51.556656000000089],[-55.73860899999994,51.567214999999976],[-55.735274999999945,51.573051000000021],[-55.724716000000001,51.583603000000039],[-55.718605000000025,51.587212000000022],[-55.653327999999988,51.590546000000018],[-55.631667999999991,51.569717000000026],[-55.625,51.565544000000102],[-55.598610000000008,51.561377999999991],[-55.589721999999995,51.560271999999941],[-55.581389999999942,51.560271999999941],[-55.574448000000018,51.562767000000008],[-55.547501000000011,51.584991000000116],[-55.515838999999971,51.602219000000048],[-55.458610999999962,51.592216000000008],[-55.411110000000008,51.580826000000116],[-55.40555599999999,51.576942000000088],[-55.404442000000017,51.571938000000102],[-55.405273000000022,51.561661000000129],[-55.40694400000001,51.556099000000017],[-55.454444999999964,51.455268999999987],[-55.492226000000016,51.377769000000058],[-55.508057000000008,51.363327000000083],[-55.597778000000005,51.303604000000064],[-55.612777999999935,51.301102000000128],[-55.62222300000002,51.30332199999998],[-55.702782000000013,51.328049000000078],[-55.820557000000008,51.350830000000087],[-56.030555999999876,51.378600999999946],[-56.078338999999971,51.36971299999999],[-56.085555999999997,51.368323999999973],[-56.096389999999985,51.318329000000006],[-56.025557999999876,51.238327000000027],[-56.012252999999987,51.212337000000048],[-55.992561000000023,51.176575000000128],[-55.959441999999967,51.197487000000081],[-55.851394999999968,51.226936000000023],[-55.837775999999963,51.230545000000063],[-55.769164999999987,51.216934000000094],[-55.760833999999988,51.213881999999955],[-55.726105000000018,51.190544000000045],[-55.712776000000019,51.178047000000049],[-55.709998999999982,51.173607000000061],[-55.719161999999983,51.123047000000042],[-55.732497999999964,51.079994000000113],[-55.735557999999912,51.074165000000107],[-55.751113999999973,51.058327000000077],[-55.756950000000018,51.053879000000109],[-55.796111999999994,51.03916200000009],[-55.805557000000022,51.009163000000058],[-55.859169000000009,50.942490000000021],[-55.999442999999872,50.788605000000075],[-56.068893000000003,50.724434000000088],[-56.092278000000022,50.725716000000091],[-56.097279000000015,50.725880000000018],[-56.101279999999917,50.728045999999949],[-56.125832000000003,50.754166000000055],[-56.130829000000006,50.763329000000056],[-56.133330999999998,50.773048000000017],[-56.128052000000025,50.846382000000062],[-56.12222300000002,50.863884000000098],[-56.119720000000029,50.869156000000032],[-56.116394000000014,50.874992000000077],[-56.107223999999974,50.887214999999969],[-56.103888999999981,50.893326000000002],[-56.103888999999981,50.898331000000042],[-56.107779999999934,50.902771000000087],[-56.12222300000002,50.899437000000091],[-56.143058999999937,50.892494000000113],[-56.155272999999966,50.885551000000135],[-56.172500999999897,50.85582700000009],[-56.157218999999941,50.690826000000072],[-56.141272999999956,50.671047000000101],[-56.135776999999962,50.669884000000138],[-56.163329999999917,50.617767000000072],[-56.258614000000023,50.502777000000094],[-56.323615999999959,50.446380999999974],[-56.423057999999912,50.352776000000006],[-56.421943999999939,50.347771000000137],[-56.422226000000023,50.342491000000052],[-56.423614999999984,50.336937000000091],[-56.426666000000012,50.331108000000086],[-56.462501999999915,50.272217000000126],[-56.501944999999921,50.214439000000084],[-56.511947999999961,50.203606000000093],[-56.555832000000009,50.167496000000028],[-56.635276999999974,50.106383999999991],[-56.743056999999965,50.022766000000104],[-56.767501999999922,49.962212000000079],[-56.778610000000015,49.933875999999998],[-56.78194400000001,49.917496000000028],[-56.775001999999972,49.919158999999979],[-56.726661999999976,49.916100000000029],[-56.759845999999982,49.837275999999974],[-56.82790399999999,49.785000000000082],[-56.866863000000023,49.777602999999999],[-56.90533099999999,49.747520000000122],[-56.820999000000029,49.74209600000006],[-56.784007999999972,49.731243000000006],[-56.782776000000013,49.690826000000072],[-56.815552000000025,49.594994000000042],[-56.818610999999976,49.588882000000012],[-56.848884999999939,49.544441000000006],[-56.843055999999933,49.548050000000046],[-56.826667999999984,49.562767000000008],[-56.782776000000013,49.609993000000088],[-56.763061999999991,49.631378000000041],[-56.749167999999884,49.64916199999999],[-56.735557999999969,49.666939000000013],[-56.712501999999972,49.696380999999974],[-56.677779999999927,49.733604000000128],[-56.598609999999894,49.811935000000062],[-56.56138599999997,49.842215999999951],[-56.477776000000006,49.892220000000009],[-56.464164999999923,49.896385000000009],[-56.431945999999982,49.890549000000135],[-56.412216000000001,49.909714000000122],[-56.388054000000011,49.943047000000092],[-56.385001999999929,49.949158000000011],[-56.330284000000006,50.024994000000106],[-56.324172999999973,50.029990999999995],[-56.237777999999992,50.100273000000072],[-56.220832999999971,50.112495000000024],[-56.208892999999989,50.120270000000119],[-56.160278000000005,50.148048000000074],[-56.153884999999946,50.150543000000084],[-56.132499999999993,50.155548000000124],[-56.12471800000003,50.15638000000007],[-56.116660999999965,50.153046000000074],[-56.067222999999956,50.096382000000006],[-56.065001999999936,50.091377000000136],[-56.005004999999983,50.031380000000013],[-55.938605999999936,50.036385000000053],[-55.905273000000022,50.033882000000062],[-55.896111000000019,50.031937000000084],[-55.881110999999976,50.024994000000106],[-55.853888999999924,50.005554000000075],[-55.846106999999961,49.996940999999936],[-55.845275999999956,49.99221799999998],[-55.845551,49.986938000000066],[-55.844161999999983,49.981934000000138],[-55.840836000000024,49.977211000000125],[-55.830001999999979,49.969154000000003],[-55.755004999999869,49.924164000000019],[-55.746108999999933,49.923050000000046],[-55.587218999999948,49.964157000000057],[-55.55610699999994,49.980270000000132],[-55.543892000000028,49.987213000000111],[-55.527221999999995,50.000275000000101],[-55.491698999999983,50.007309000000021],[-55.463332999999977,49.966933999999981],[-55.460830999999985,49.962212000000079],[-55.459723999999937,49.957497000000046],[-55.460281000000009,49.952216999999962],[-55.465004000000022,49.940826000000015],[-55.475272999999959,49.930275000000108],[-55.492226000000016,49.917213000000061],[-55.511391000000003,49.908882000000006],[-55.659163999999976,49.84777100000008],[-55.843055999999933,49.788330000000087],[-55.98611499999987,49.746940999999993],[-56.115279999999927,49.63999200000012],[-56.124167999999997,49.613327000000083],[-56.050551999999925,49.666382000000112],[-56.044448999999986,49.669990999999925],[-55.963889999999935,49.698600999999996],[-55.957779000000016,49.700272000000041],[-55.893889999999999,49.714157000000114],[-55.833327999999995,49.686652999999922],[-55.880279999999971,49.584990999999945],[-55.935443999999961,49.543991000000119],[-55.945441999999957,49.536159999999995],[-55.953444999999988,49.533660999999995],[-55.971607000000006,49.531826000000024],[-55.980277999999998,49.53049500000003],[-56.035277999999948,49.506660000000068],[-56.080001999999922,49.486938000000009],[-56.12749500000001,49.431107000000111],[-56.129165999999998,49.425552000000039],[-56.122771999999941,49.421379000000115],[-56.073891000000003,49.434432999999956],[-56.06221800000003,49.440544000000045],[-56.025275999999963,49.461105000000089],[-56.02027899999996,49.464995999999928],[-56.005279999999914,49.480820000000051],[-55.999725000000012,49.485268000000019],[-55.96305499999994,49.496155000000044],[-55.91705300000001,49.507496000000117],[-55.874717999999973,49.517212000000029],[-55.827781999999956,49.524162000000103],[-55.783332999999914,49.511940000000095],[-55.775001999999915,49.508605999999929],[-55.724997999999971,49.479431000000091],[-55.720832999999971,49.475822000000051],[-55.725554999999986,49.470543000000077],[-55.722771000000023,49.453880000000026],[-55.678336999999942,49.386940000000038],[-55.673057999999969,49.383049000000142],[-55.664444000000003,49.381934999999999],[-55.656386999999938,49.382210000000043],[-55.650275999999963,49.384162999999944],[-55.639167999999984,49.392769000000044],[-55.636115999999959,49.398604999999918],[-55.637778999999966,49.409157000000107],[-55.637778999999966,49.413605000000075],[-55.636115999999959,49.419159000000093],[-55.589164999999923,49.462494000000049],[-55.560279999999977,49.482490999999925],[-55.55388599999992,49.484993000000031],[-55.546950999999979,49.486381999999992],[-55.53167000000002,49.487770000000125],[-55.523055999999997,49.486655999999925],[-55.522223999999994,49.481934000000024],[-55.566390999999953,49.409157000000107],[-55.572776999999974,49.376656000000025],[-55.573058999999944,49.371658000000025],[-55.570556999999951,49.366936000000123],[-55.566665999999998,49.362770000000012],[-55.559998000000007,49.365273000000002],[-55.554717999999923,49.369713000000047],[-55.539443999999946,49.385551000000078],[-55.529723999999987,49.396942000000024],[-55.528053,49.402488999999946],[-55.528885000000002,49.408043000000134],[-55.529166999999973,49.423324999999977],[-55.526389999999992,49.42860399999995],[-55.49610899999999,49.453880000000026],[-55.441665999999998,49.491104000000064],[-55.430282999999974,49.498878000000104],[-55.37749500000001,49.50360900000004],[-55.369445999999982,49.503326000000072],[-55.349276999999972,49.468159000000014],[-55.332946999999933,49.416489000000126],[-55.33577699999995,49.388161000000025],[-55.333610999999905,49.359161000000029],[-55.338608000000022,49.355270000000132],[-55.336112999999955,49.350829999999974],[-55.315276999999924,49.314437999999939],[-55.310996999999929,49.355937999999981],[-55.306830999999931,49.356772999999976],[-55.274833999999998,49.385605000000055],[-55.267501999999979,49.396603000000027],[-55.264499999999998,49.403435000000059],[-55.264336000000014,49.406441000000086],[-55.266669999999863,49.409103000000073],[-55.269833000000006,49.411438000000032],[-55.280838000000017,49.41443600000008],[-55.28317299999992,49.41693500000008],[-55.310000999999943,49.484772000000021],[-55.310832999999946,49.487770000000125],[-55.305557000000022,49.534439000000077],[-55.261390999999946,49.541107000000068],[-55.149726999999928,49.546387000000095],[-55.141112999999962,49.545273000000122],[-55.137222000000008,49.540833000000134],[-55.123328999999956,49.496941000000049],[-55.124717999999973,49.465271000000143],[-55.221107000000018,49.261939999999981],[-55.231109999999944,49.251389000000074],[-55.237220999999977,49.248046999999929],[-55.296394000000021,49.226379000000009],[-55.315001999999936,49.216933999999924],[-55.365836999999999,49.165268000000083],[-55.369164000000012,49.159431000000097],[-55.369445999999982,49.154160000000047],[-55.360001000000011,49.151382000000069],[-55.347495999999978,49.157211000000075],[-55.339721999999995,49.158600000000092],[-55.331673000000023,49.156654000000003],[-55.323615999999959,49.153602999999976],[-55.319449999999904,49.149162000000047],[-55.307219999999973,49.104996000000085],[-55.307776999999987,49.0991590000001],[-55.317504999999983,49.087769000000037],[-55.323059000000001,49.083327999999938],[-55.383330999999998,49.040833000000021],[-55.345551,49.057770000000062],[-55.272223999999937,49.099998000000085],[-55.277495999999985,49.103882000000112],[-55.282501000000025,49.113051999999982],[-55.283332999999914,49.118049999999982],[-55.288054999999986,49.182495000000074],[-55.288054999999986,49.187210000000107],[-55.285004000000015,49.193047000000092],[-55.280555999999933,49.199157999999954],[-55.275275999999963,49.204436999999984],[-55.148055999999997,49.259995000000004],[-55.081116000000009,49.283882000000062],[-55.081673000000023,49.345825000000104],[-55.081389999999942,49.351105000000132],[-55.078055999999947,49.356941000000006],[-55.069450000000018,49.3555530000001],[-55.010284000000013,49.323883000000023],[-54.989998000000014,49.286942000000067],[-54.990554999999972,49.28166200000004],[-54.824448000000018,49.269157000000064],[-54.817779999999914,49.271660000000054],[-54.787506000000008,49.288605000000018],[-54.78194400000001,49.292770000000019],[-54.67972599999996,49.379990000000021],[-54.658332999999971,49.399162000000047],[-54.648055999999997,49.409431000000041],[-54.641388000000006,49.421104000000071],[-54.643889999999999,49.425827000000083],[-54.579726999999934,49.494713000000104],[-54.541114999999934,49.526657000000114],[-54.528885000000002,49.533333000000027],[-54.521111000000019,49.533882000000006],[-54.474716000000001,49.534995999999978],[-54.431945999999925,49.470824999999991],[-54.430831999999953,49.465828000000045],[-54.450554000000011,49.427773000000116],[-54.483330000000024,49.361938000000123],[-54.49361399999998,49.268051000000071],[-54.492500000000007,49.263611000000026],[-54.486945999999989,49.259719999999959],[-54.480552999999929,49.262215000000026],[-54.474716000000001,49.266662999999994],[-54.406386999999938,49.320831000000112],[-54.400832999999921,49.325272000000041],[-54.399170000000026,49.330551000000014],[-54.410278000000005,49.343605000000082],[-54.412773000000016,49.34804500000007],[-54.413612000000001,49.353049999999939],[-54.407501000000025,49.374710000000107],[-54.404167000000029,49.380547000000092],[-54.395003999999915,49.392769000000044],[-54.380279999999971,49.408882000000119],[-54.36999499999996,49.419159000000093],[-54.364166000000012,49.423607000000061],[-54.358054999999979,49.426941000000056],[-54.325279000000023,49.423882000000049],[-54.24888599999997,49.397490999999945],[-54.186661000000015,49.371101000000124],[-54.17888599999992,49.37082700000002],[-54.166106999999897,49.378044000000102],[-54.161941999999897,49.383606000000043],[-54.15582999999998,49.40526600000004],[-54.153327999999931,49.416100000000085],[-54.151938999999913,49.427216000000044],[-54.148337999999967,49.437492000000134],[-54.145279000000016,49.443320999999969],[-54.139998999999932,49.448601000000053],[-54.133888000000013,49.451934999999992],[-54.048889000000031,49.479431000000091],[-54.041671999999949,49.480820000000051],[-53.919998000000021,49.447769000000108],[-53.775001999999972,49.396103000000039],[-53.673331999999959,49.34304800000001],[-53.511116000000015,49.277214000000072],[-53.48860899999994,49.220543000000134],[-53.588332999999977,49.040833000000021],[-53.593886999999995,49.035552999999993],[-53.66194200000001,49.032211000000018],[-53.714721999999938,49.02915999999999],[-53.804442999999992,49.022217000000012],[-53.785277999999948,49.011107999999922],[-53.731667000000016,49.013329000000056],[-53.725273000000016,49.009720000000016],[-53.736664000000019,49.001105999999993],[-53.742774999999995,48.997771999999998],[-53.749167999999941,48.995270000000119],[-53.77027899999996,48.989433000000133],[-53.803611999999987,48.978043000000071],[-53.813056999999958,48.938881000000038],[-53.974441999999954,48.84777100000008],[-54.021384999999952,48.833327999999995],[-54.096106999999961,48.812210000000107],[-53.920279999999991,48.834991000000116],[-53.899170000000026,48.838043000000027],[-53.875557000000015,48.836937000000034],[-53.829445000000021,48.831383000000017],[-53.820556999999951,48.829436999999928],[-53.800835000000006,48.812767000000008],[-53.802223000000026,48.807770000000062],[-53.845276000000013,48.766936999999984],[-53.867774999999938,48.75],[-53.89055599999989,48.733604000000014],[-53.897223999999937,48.731377000000123],[-53.932219999999973,48.71393599999999],[-53.950554000000011,48.670830000000137],[-53.93250299999994,48.624710000000107],[-53.924445999999989,48.624435000000062],[-53.917220999999927,48.624991999999963],[-53.888610999999969,48.631660000000124],[-53.882773999999927,48.633606000000043],[-53.869163999999955,48.638885000000016],[-53.857223999999974,48.644157000000121],[-53.795554999999922,48.675827000000027],[-53.790001000000018,48.679993000000138],[-53.798889000000031,48.682213000000104],[-53.817779999999971,48.673882000000049],[-53.831389999999999,48.669990999999982],[-53.852782999999931,48.666381999999942],[-53.896950000000004,48.662209000000018],[-53.913054999999929,48.663605000000075],[-53.920836999999949,48.667213000000004],[-53.924445999999989,48.671379000000059],[-53.892058999999904,48.682938000000092],[-53.887225999999941,48.690102000000024],[-53.884051999999997,48.693100000000129],[-53.880554000000018,48.695099000000141],[-53.857558999999981,48.704937000000029],[-53.759170999999981,48.714156999999943],[-53.618056999999965,48.694435000000112],[-53.610001000000011,48.693046999999979],[-53.601943999999946,48.68971300000004],[-53.599723999999924,48.684990000000028],[-53.603888999999924,48.674164000000076],[-53.610001000000011,48.668602000000135],[-53.645835999999974,48.648330999999985],[-53.658607000000018,48.641937000000098],[-53.671943999999939,48.638602999999932],[-53.728881999999942,48.629433000000063],[-53.779998999999975,48.623604000000057],[-53.787780999999995,48.622490000000084],[-53.928336999999942,48.575829000000056],[-53.93332700000002,48.572220000000073],[-53.951392999999996,48.549995000000024],[-53.956107999999915,48.543883999999991],[-53.952498999999932,48.539436000000023],[-53.944159999999897,48.539718999999991],[-53.932219999999973,48.544998000000135],[-53.919998000000021,48.551659000000086],[-53.914444000000003,48.555824000000086],[-53.908332999999914,48.559158000000025],[-53.901389999999935,48.562209999999993],[-53.895003999999858,48.563048999999921],[-53.804169000000002,48.568053999999961],[-53.788054999999929,48.566383000000087],[-53.746391000000017,48.558600999999953],[-53.746947999999918,48.523322999999948],[-53.74888599999997,48.513329000000113],[-53.750838999999985,48.50777400000004],[-53.756366999999955,48.50326200000012]],[[-127.91443599999991,51.410820000000001],[-127.92443799999995,51.41027100000008],[-128.06527700000004,51.464157000000114],[-128.07583599999998,51.470543000000021],[-128.08111599999995,51.474709000000132],[-128.15307599999988,51.601661999999976],[-128.15417499999995,51.605826999999977],[-128.15280199999995,51.638046000000145],[-128.15249600000004,51.641937000000041],[-128.15029899999996,51.647491000000059],[-128.14556900000002,51.653603000000032],[-128.136414,51.6616590000001],[-128.01306199999993,51.72137500000008],[-128.00527999999997,51.723320000000058],[-128,51.720542999999964],[-127.99694799999997,51.714157000000057],[-127.99804699999999,51.711662000000047],[-127.995003,51.705269000000101],[-127.98388699999998,51.682495000000131],[-127.96749899999992,51.651931999999988],[-127.951683,51.633880999999974],[-127.93776699999995,51.621933000000126],[-127.92639199999996,51.608886999999982],[-127.91999800000002,51.600547999999947],[-127.90556300000003,51.55971500000004],[-127.87361099999993,51.464439000000027],[-127.87193300000001,51.451934999999992],[-127.87332200000003,51.447769000000051],[-127.87666299999995,51.443046999999979],[-127.90444899999994,51.414711000000068],[-127.91443599999991,51.410820000000001]],[[-55.367500000000007,51.874161000000015],[-55.37471800000003,51.873878000000047],[-55.382216999999912,51.875267000000065],[-55.428885999999977,51.884163000000001],[-55.430000000000007,51.885826000000122],[-55.431113999999923,51.887771999999984],[-55.430557000000022,51.896659999999997],[-55.42610899999994,51.905822999999998],[-55.423331999999959,51.909431000000097],[-55.387779000000023,51.942764000000125],[-55.353614999999991,51.963608000000079],[-55.301392000000021,51.993050000000039],[-55.283889999999985,52.001389000000074],[-55.277221999999938,52.002495000000067],[-55.269996999999989,52.000549000000035],[-55.268889999999942,51.998604],[-55.267501999999979,51.993881000000044],[-55.274170000000026,51.97693600000008],[-55.274170000000026,51.975548000000003],[-55.28194400000001,51.961937000000034],[-55.295005999999944,51.943321000000026],[-55.302222999999969,51.933326999999963],[-55.332503999999972,51.896384999999952],[-55.342223999999874,51.886383000000023],[-55.354720999999927,51.878043999999989],[-55.360001000000011,51.875824000000136],[-55.367500000000007,51.874161000000015]],[[-128.05389400000001,51.753609000000097],[-128.11972000000003,51.741661000000079],[-128.13192699999996,51.743881000000101],[-128.13613899999996,51.746657999999968],[-128.25445599999995,51.865829000000019],[-128.25308199999995,51.872214999999983],[-128.22222899999997,51.953323000000125],[-128.21749899999998,51.962769000000094],[-128.177795,52.008330999999941],[-128.150848,52.035271000000023],[-128.14529400000004,52.038605000000018],[-128.10775799999999,52.051659000000086],[-128.06082200000003,52.056380999999988],[-127.99582699999996,52.062767000000065],[-127.98332199999993,52.061934999999949],[-127.96028100000001,52.055549999999982],[-127.95472699999999,52.05332199999998],[-127.95121799999998,52.046913000000131],[-127.95140100000003,52.03054800000001],[-127.95472699999999,51.981101999999964],[-128.00723299999993,51.782493999999986],[-128.00945999999999,51.778328000000101],[-128.01306199999993,51.773605000000089],[-128.01861600000001,51.770271000000093],[-128.03582800000004,51.760826000000066],[-128.05389400000001,51.753609000000097]],[[-79.252791999999999,52.071380999999917],[-79.319732999999985,51.969986000000063],[-79.364440999999943,51.942214999999976],[-79.370543999999995,51.938599000000124],[-79.376663000000008,51.936104000000057],[-79.385833999999988,51.935546999999985],[-79.42361499999987,51.936935000000062],[-79.433318999999869,51.93832400000008],[-79.450561999999877,51.942214999999976],[-79.50111400000003,51.942489999999964],[-79.568344000000025,51.935546999999985],[-79.576675000000023,51.934158000000025],[-79.591949,51.922768000000133],[-79.604445999999996,51.916664000000083],[-79.611664000000019,51.914436000000137],[-79.617767000000015,51.917770000000132],[-79.621383999999978,51.9222180000001],[-79.652785999999992,51.981101999999964],[-79.654175000000009,51.986655999999982],[-79.650832999999977,51.991936000000067],[-79.633895999999993,52.017493999999942],[-79.629439999999988,52.022217000000126],[-79.62332200000003,52.025269000000037],[-79.61471599999993,52.023048000000131],[-79.608611999999994,52.01998900000001],[-79.603881999999942,52.016106000000036],[-79.596114999999998,52.013611000000026],[-79.585281000000009,52.012772000000041],[-79.567779999999971,52.014999000000103],[-79.538329999999974,52.023323000000005],[-79.408889999999985,52.071938000000046],[-79.396666999999866,52.077217000000019],[-79.383895999999936,52.090827999999988],[-79.345551,52.108604000000128],[-79.338332999999977,52.110275000000001],[-79.297225999999966,52.091933999999981],[-79.277221999999881,52.090546000000074],[-79.269729999999925,52.08776899999998],[-79.263625999999988,52.083878000000084],[-79.252791999999999,52.071380999999917]],[[-131.01889,51.946098000000063],[-131.02166699999998,51.940825999999959],[-131.02917500000001,51.941375999999991],[-131.03695700000003,51.944434999999999],[-131.04861499999998,51.951385000000016],[-131.07415800000001,51.970543000000134],[-131.09500099999997,51.989989999999977],[-131.10165399999994,52.00277699999998],[-131.120544,52.055549999999982],[-131.12719699999997,52.095543000000021],[-131.126373,52.106941000000006],[-131.12249800000001,52.124710000000107],[-131.11639400000001,52.148048000000017],[-131.11026000000004,52.151099999999929],[-131.10192899999998,52.151932000000045],[-131.08361799999989,52.151382000000012],[-131.07720900000004,52.150268999999923],[-131.00945999999999,52.102776000000006],[-130.99249299999991,52.060822000000087],[-131.00473,52.005829000000062],[-131.01889,51.946098000000063]],[[-127.96278399999989,52.074714999999912],[-128.05111699999992,52.07416500000005],[-128.06222500000001,52.074996999999996],[-128.07638499999996,52.079994000000113],[-128.09387199999998,52.090546000000074],[-128.10583500000001,52.100273000000016],[-128.10888699999992,52.105270000000132],[-128.12081899999998,52.141936999999928],[-128.11471599999987,52.14916199999999],[-128.10693400000002,52.152489000000116],[-128.03167699999995,52.163292000000126],[-128.01583900000003,52.164711000000125],[-127.89111299999996,52.171660999999972],[-127.88110399999999,52.172218000000044],[-127.87917299999998,52.166664000000026],[-127.88971700000002,52.131103999999993],[-127.89334100000002,52.126938000000052],[-127.94360399999999,52.079163000000051],[-127.94721999999996,52.075829000000113],[-127.96278399999989,52.074714999999912]],[[-128.21194499999996,52.015549000000135],[-128.22082499999999,52.014442000000031],[-128.23858599999994,52.014717000000076],[-128.2463679999999,52.016662999999937],[-128.25308199999995,52.019714000000135],[-128.29110699999995,52.101936000000137],[-128.29415899999998,52.113608999999997],[-128.29168700000002,52.118881000000101],[-128.25280799999996,52.171379000000059],[-128.24444600000004,52.179993000000138],[-128.23971599999993,52.184158000000139],[-128.23193399999997,52.187492000000134],[-128.18804899999998,52.193604000000107],[-128.16223100000002,52.196655000000135],[-128.15307599999988,52.195267000000001],[-128.14779699999997,52.191658000000018],[-128.14584399999995,52.186104],[-128.1480709999999,52.183327000000133],[-128.15472399999999,52.159431000000041],[-128.15612799999997,52.153320000000122],[-128.15862999999996,52.11971299999999],[-128.154449,52.108604000000128],[-128.15139799999997,52.103882000000056],[-128.14752199999998,52.092766000000097],[-128.15112299999993,52.081108000000086],[-128.20611600000001,52.01888300000013],[-128.21194499999996,52.015549000000135]],[[-128.42834499999992,52.13749700000011],[-128.44415300000003,52.134163000000115],[-128.44638099999997,52.13499500000006],[-128.50472999999994,52.16027100000008],[-128.50918599999994,52.16443600000008],[-128.51113899999996,52.169990999999982],[-128.50863600000002,52.175552000000039],[-128.50527999999997,52.180274999999995],[-128.50058000000001,52.184158000000139],[-128.45138499999996,52.217209000000082],[-128.448059,52.21915400000006],[-128.43331899999998,52.223320000000001],[-128.41641200000004,52.226379000000122],[-128.40972899999997,52.224991000000045],[-128.40640299999995,52.2227630000001],[-128.40527299999997,52.218596999999988],[-128.4100039999999,52.214714000000072],[-128.40777599999996,52.15277100000003],[-128.408905,52.149437000000034],[-128.41363499999994,52.145270999999923],[-128.42834499999992,52.13749700000011]],[[-128.29998799999998,52.133606000000043],[-128.308044,52.128875999999991],[-128.31362899999999,52.129714999999976],[-128.36499000000003,52.162491000000102],[-128.37304699999999,52.185265000000072],[-128.378601,52.213608000000022],[-128.37832599999996,52.220268000000033],[-128.37719699999991,52.223877000000073],[-128.37027,52.228600000000029],[-128.35665900000004,52.235825000000091],[-128.34527600000001,52.238602000000014],[-128.29724099999999,52.237212999999997],[-128.23721299999994,52.222488000000055],[-128.22943099999998,52.220268000000033],[-128.22720300000003,52.218880000000127],[-128.22610499999996,52.216934000000037],[-128.22747799999996,52.212769000000037],[-128.22997999999995,52.209435000000099],[-128.29998799999998,52.133606000000043]],[[-81.476944000000003,52.249161000000072],[-81.48582499999992,52.248329000000126],[-81.646118000000001,52.251389000000017],[-81.687499999999943,52.254997000000117],[-81.706115999999952,52.258049000000028],[-81.710007000000019,52.262496999999996],[-81.695830999999941,52.267212000000029],[-81.578063999999983,52.294716000000051],[-81.551666000000012,52.298050000000046],[-81.541672000000005,52.296661000000029],[-81.493057000000022,52.283881999999949],[-81.480559999999969,52.277489000000003],[-81.475280999999995,52.27388000000002],[-81.471664000000033,52.268051000000014],[-81.468063000000029,52.263054000000068],[-81.467772999999966,52.256942999999978],[-81.470839999999953,52.252220000000023],[-81.476944000000003,52.249161000000072]],[[-127.924713,52.174164000000133],[-127.93360899999999,52.173049999999932],[-128.036407,52.177489999999977],[-128.05416899999994,52.180550000000039],[-128.07971199999997,52.186377999999934],[-128.08639500000004,52.188599000000067],[-128.09277299999991,52.19221500000009],[-128.16696199999996,52.244713000000104],[-128.17001299999998,52.249718000000144],[-128.15862999999996,52.256386000000077],[-128.06945799999994,52.294716000000051],[-128.0477909999999,52.300545000000056],[-128.04000899999994,52.301659000000029],[-127.97944599999994,52.296661000000029],[-127.97277800000001,52.295273000000122],[-127.96193700000003,52.289436000000137],[-127.95861799999989,52.287498000000028],[-127.95111099999997,52.279716000000064],[-127.90943899999996,52.210274000000027],[-127.90750100000002,52.204712000000086],[-127.90666199999998,52.198600999999996],[-127.91055299999988,52.186377999999934],[-127.91776999999996,52.176940999999999],[-127.924713,52.174164000000133]],[[-128.18444799999992,52.278602999999976],[-128.20361299999996,52.277489000000003],[-128.21026599999993,52.278327999999988],[-128.21362299999998,52.279716000000064],[-128.18917799999986,52.330826000000116],[-128.18307499999997,52.339714000000129],[-128.11471599999987,52.41832700000009],[-128.11111499999998,52.421661000000086],[-128.10443099999992,52.421379000000002],[-128.09997599999991,52.418602000000135],[-128.09359699999999,52.411658999999929],[-128.09249899999998,52.408324999999934],[-128.08526599999999,52.396385000000066],[-128.05917399999998,52.352219000000048],[-128.05694600000004,52.346100000000035],[-128.05526699999996,52.334991000000116],[-128.05667099999994,52.328880000000083],[-128.06140099999999,52.324715000000083],[-128.15194700000001,52.282211000000075],[-128.18444799999992,52.278602999999976]],[[-127.72444199999995,51.97693600000008],[-127.87082699999991,51.944709999999986],[-127.87970699999994,51.94499200000007],[-127.886124,51.947768999999994],[-127.89167800000001,51.951385000000016],[-127.89472999999992,51.956100000000049],[-127.89943700000003,51.973320000000001],[-127.90110799999991,51.985824999999977],[-127.90055799999988,51.999435000000005],[-127.88110399999999,52.078880000000083],[-127.87361099999993,52.094994000000042],[-127.85138699999999,52.141380000000026],[-127.82833900000003,52.175827000000027],[-127.817497,52.191375999999934],[-127.79750100000001,52.213882000000126],[-127.78916899999996,52.221930999999984],[-127.75334199999998,52.245827000000077],[-127.74527,52.247772000000055],[-127.699997,52.257216999999912],[-127.68083199999995,52.258888000000013],[-127.65943900000002,52.259163000000001],[-127.65055799999999,52.260276999999974],[-127.58640300000002,52.281105000000082],[-127.51666299999999,52.304436000000123],[-127.51000999999985,52.306938000000002],[-127.46056399999998,52.345824999999991],[-127.45694700000001,52.350548000000003],[-127.45612299999988,52.362213000000054],[-127.45694700000001,52.368324000000143],[-127.45333900000003,52.373046999999929],[-127.4177699999999,52.385269000000108],[-127.36277799999999,52.403876999999966],[-127.26390100000003,52.436653000000092],[-127.25945300000001,52.435265000000015],[-127.23473399999995,52.416939000000013],[-127.20777899999996,52.344711000000018],[-127.21056399999992,52.33526599999999],[-127.218887,52.325829000000056],[-127.23222399999992,52.313049000000092],[-127.24749800000001,52.301933000000133],[-127.27084399999995,52.288605000000132],[-127.28916899999996,52.279433999999981],[-127.30304699999999,52.274162000000047],[-127.30999800000001,52.271659999999997],[-127.32584400000002,52.268051000000014],[-127.36193800000001,52.264717000000019],[-127.42582699999997,52.24610100000001],[-127.43971299999993,52.240829000000076],[-127.44526699999994,52.23832699999997],[-127.57972699999999,52.177216000000044],[-127.58444199999991,52.173324999999977],[-127.58805799999999,52.167770000000075],[-127.59631300000001,52.151793999999995],[-127.65416700000003,52.123877999999991],[-127.68694299999993,52.074440000000095],[-127.69193999999993,52.06360600000005],[-127.70111099999991,52.041107000000068],[-127.70388800000001,52.028877000000136],[-127.699997,52.017768999999987],[-127.69915799999995,52.01138300000008],[-127.699432,52.00471500000009],[-127.70194999999995,51.998604],[-127.708054,51.988327000000027],[-127.71749899999998,51.980270000000075],[-127.72444199999995,51.97693600000008]],[[-128.66860999999994,52.266388000000063],[-128.67556799999994,52.266388000000063],[-128.72055099999994,52.306938000000002],[-128.724152,52.311378000000047],[-128.72637899999995,52.316101000000003],[-128.74832200000003,52.369156000000089],[-128.76196299999998,52.41832700000009],[-128.76251200000002,52.423325000000091],[-128.76196299999998,52.429160999999965],[-128.759186,52.449432000000002],[-128.75280799999996,52.467766000000097],[-128.74722299999996,52.471656999999993],[-128.68139599999989,52.482208000000071],[-128.67443800000001,52.482208000000071],[-128.65029899999996,52.474434000000088],[-128.63696299999992,52.468597000000102],[-128.624146,52.461662000000103],[-128.61914099999996,52.457771000000037],[-128.615814,52.453606000000036],[-128.61608899999993,52.44860099999994],[-128.61331199999995,52.364441000000056],[-128.61471599999993,52.353325000000098],[-128.61776699999996,52.329994000000056],[-128.61999500000002,52.323883000000137],[-128.62554899999992,52.311378000000047],[-128.62997399999995,52.305550000000096],[-128.66860999999994,52.266388000000063]],[[-128.471924,52.492767000000129],[-128.46777299999991,52.483047000000056],[-128.46499599999993,52.47304500000007],[-128.46417199999996,52.46804800000001],[-128.46499599999993,52.462212000000136],[-128.46722399999999,52.456099999999935],[-128.47082499999993,52.449714999999969],[-128.48055999999991,52.440269000000001],[-128.4869379999999,52.437209999999993],[-128.49414100000001,52.434989999999971],[-128.50945999999999,52.432213000000104],[-128.51806599999998,52.431938000000059],[-128.59553499999998,52.460140000000081],[-128.66314699999987,52.491927999999973],[-128.75500499999998,52.487770000000012],[-128.77557399999995,52.49332400000003],[-128.78472899999991,52.496101000000124],[-128.80944799999997,52.515549000000078],[-128.81304899999992,52.519989000000066],[-128.81390399999998,52.524994000000106],[-128.811127,52.536941999999954],[-128.808899,52.543053000000043],[-128.73889199999996,52.587494000000049],[-128.732483,52.590545999999961],[-128.72470099999998,52.59165999999999],[-128.5781859999999,52.5936430000001],[-128.56750499999998,52.622490000000028],[-128.53527800000001,52.647217000000069],[-128.53167699999995,52.62110100000001],[-128.52890000000002,52.611107000000004],[-128.52194199999997,52.591377000000023],[-128.50085399999995,52.543610000000115],[-128.48889199999991,52.52027099999998],[-128.48526000000004,52.515831000000105],[-128.47970599999996,52.506660000000011],[-128.471924,52.492767000000129]],[[-131.46444700000001,52.627487000000087],[-131.58554099999998,52.585266000000104],[-131.59359699999999,52.585823000000005],[-131.60137900000001,52.588600000000099],[-131.6119379999999,52.596099999999979],[-131.62359600000002,52.608886999999982],[-131.70971700000001,52.705269000000044],[-131.691101,52.724991000000102],[-131.68499799999995,52.728043000000014],[-131.65945399999993,52.730270000000075],[-131.48471099999995,52.736938000000066],[-131.475281,52.736655999999982],[-131.46859699999999,52.733330000000137],[-131.46887200000003,52.73054500000012],[-131.44943199999994,52.714996000000042],[-131.44027699999998,52.706940000000145],[-131.43917799999991,52.701660000000061],[-131.44137599999999,52.684158000000025],[-131.45443699999998,52.636383000000023],[-131.45834399999995,52.630821000000083],[-131.46444700000001,52.627487000000087]],[[-128.43029799999994,52.368050000000039],[-128.44168099999996,52.368050000000039],[-128.45611599999989,52.373046999999929],[-128.46026599999999,52.37721300000004],[-128.46664399999986,52.386939999999981],[-128.46777299999991,52.393051000000071],[-128.43777499999999,52.543610000000115],[-128.44973800000002,52.620827000000077],[-128.45056199999999,52.626937999999996],[-128.44168099999996,52.746941000000106],[-128.43917799999997,52.752220000000079],[-128.43582200000003,52.756943000000092],[-128.39001500000001,52.797493000000031],[-128.383331,52.797493000000031],[-128.37332200000003,52.791107000000125],[-128.36276199999998,52.740272999999945],[-128.35861199999988,52.729156000000103],[-128.32138099999992,52.634720000000129],[-128.275848,52.496101000000124],[-128.27502400000003,52.489990000000034],[-128.28640699999994,52.457771000000037],[-128.31140099999999,52.423881999999992],[-128.365814,52.38220999999993],[-128.37164300000001,52.378875999999991],[-128.386414,52.374992000000134],[-128.40335099999993,52.371658000000139],[-128.43029799999994,52.368050000000039]],[[-128.97442599999999,52.453323000000069],[-128.98275799999999,52.453049000000135],[-129.11471599999993,52.556656000000089],[-129.21081499999997,52.64888000000002],[-129.26333599999998,52.710548000000074],[-129.27056899999997,52.719153999999946],[-129.29196200000001,52.761664999999994],[-129.29278599999998,52.766937000000098],[-129.28140299999995,52.81721500000009],[-129.27722199999988,52.823051000000135],[-129.27084400000001,52.826103000000046],[-129.26223799999997,52.826660000000118],[-129.252228,52.825272000000041],[-129.23111,52.81610100000006],[-129.218323,52.809158000000082],[-129.10415599999999,52.74110399999995],[-129.066101,52.714714000000129],[-128.94695999999993,52.626381000000094],[-128.926941,52.610825000000091],[-128.92333999999994,52.606659000000036],[-128.91973899999999,52.602218999999991],[-128.91861,52.527488999999946],[-128.92251599999997,52.515274000000034],[-128.93640099999999,52.480545000000006],[-128.94360399999999,52.469711000000075],[-128.9491579999999,52.465546000000074],[-128.96166999999997,52.459435000000042],[-128.97442599999999,52.453323000000069]],[[-128.26974499999994,52.596939000000134],[-128.27416999999997,52.595543000000077],[-128.27890000000002,52.595824999999991],[-128.28445399999998,52.598602000000028],[-128.28750600000001,52.602776000000063],[-128.28973399999995,52.60833000000008],[-128.29269399999993,52.661549000000036],[-128.32305899999994,52.74110399999995],[-128.32638499999996,52.771378000000027],[-128.32501199999996,52.776100000000099],[-128.26322900000002,52.784645000000125],[-128.21063200000003,52.798515000000009],[-128.18582199999992,52.826942000000031],[-128.177795,52.826103000000046],[-128.17334,52.823326000000122],[-128.17028799999997,52.817771999999991],[-128.17584199999999,52.787773000000129],[-128.17861899999997,52.776100000000099],[-128.20776399999994,52.704436999999984],[-128.21026599999993,52.698875000000044],[-128.24722299999996,52.620544000000109],[-128.24972500000001,52.616660999999965],[-128.26141399999995,52.604439000000013],[-128.26974499999994,52.596939000000134]],[[-131.63973999999996,52.828049000000135],[-131.64666699999992,52.825829000000113],[-131.64889499999998,52.826103000000046],[-131.66973899999999,52.819160000000068],[-131.70834400000001,52.811378000000104],[-131.72387700000002,52.808327000000077],[-131.73306299999996,52.80860100000001],[-131.81332399999997,52.82027400000004],[-131.82388300000002,52.82777400000009],[-131.83138999999994,52.841934000000037],[-131.83029199999999,52.846656999999993],[-131.82250999999991,52.848045000000127],[-131.74859599999996,52.853324999999984],[-131.72860699999995,52.851387000000045],[-131.644745,52.835548000000131],[-131.636414,52.832497000000103],[-131.63973999999996,52.828049000000135]],[[-128.50527999999997,52.641106000000036],[-128.5125119999999,52.641106000000036],[-128.51611300000002,52.645271000000037],[-128.52029400000004,52.654991000000109],[-128.54000899999994,52.703323000000012],[-128.53500399999996,52.758049000000085],[-128.53362999999996,52.769157000000121],[-128.51391599999999,52.860825000000034],[-128.51028400000001,52.867493000000024],[-128.50613399999992,52.873047000000042],[-128.49887100000001,52.87082700000002],[-128.49194299999994,52.868599000000074],[-128.48553499999997,52.865273000000002],[-128.471924,52.853049999999996],[-128.46832299999994,52.848602000000028],[-128.45083599999992,52.805267000000015],[-128.45361300000002,52.782493999999986],[-128.45443699999998,52.776939000000084],[-128.50167799999991,52.647491000000002],[-128.50527999999997,52.641106000000036]],[[-129.61053500000003,52.954993999999999],[-129.61831699999999,52.953606000000093],[-129.62222299999996,52.958046000000081],[-129.65139799999992,53.013329000000113],[-129.650848,53.01888300000013],[-129.62441999999993,53.02388000000002],[-129.615814,53.024436999999921],[-129.60720800000001,53.022766000000047],[-129.57055699999989,53.013611000000026],[-129.5625,53.010551000000135],[-129.55749499999996,53.006660000000068],[-129.55667099999999,53.001389000000017],[-129.55862400000001,52.997490000000028],[-129.55334500000004,52.984993000000031],[-129.561127,52.970543000000077],[-129.59637499999991,52.959435000000099],[-129.61053500000003,52.954993999999999]],[[-129.531677,53.010551000000135],[-129.53890999999993,53.008049000000085],[-129.546967,53.008888000000013],[-129.58859299999995,53.024162000000103],[-129.64001500000001,53.044158999999979],[-129.63391099999996,53.056099000000074],[-129.56277499999993,53.053046999999992],[-129.52444500000001,53.033606999999961],[-129.51779199999993,53.029991000000109],[-129.51724200000001,53.024993999999992],[-129.52056900000002,53.018326000000059],[-129.531677,53.010551000000135]],[[-55.763061999999991,53.029434000000037],[-55.853333000000021,53.01527399999992],[-55.861945999999989,53.015549000000135],[-55.870834000000002,53.018599999999992],[-55.876388999999961,53.02748900000006],[-55.876105999999993,53.032768000000033],[-55.872771999999998,53.043883999999991],[-55.869719999999973,53.04972100000009],[-55.857779999999991,53.06749700000006],[-55.854445999999996,53.071663000000001],[-55.848609999999951,53.076102999999989],[-55.808333999999945,53.09137700000008],[-55.800551999999982,53.093605000000025],[-55.79222900000002,53.093048000000124],[-55.788612000000001,53.089714000000129],[-55.788337999999953,53.086655000000007],[-55.749167999999997,53.069160000000011],[-55.748885999999914,53.064712999999927],[-55.755004999999869,53.038604999999961],[-55.756667999999991,53.033051],[-55.763061999999991,53.029434000000037]],[[-129.60247799999996,53.057213000000047],[-129.61080899999996,53.056655999999975],[-129.69250499999993,53.075829000000056],[-129.70193499999999,53.078330999999935],[-129.70834399999995,53.08166499999993],[-129.72305299999999,53.099159000000043],[-129.73611500000004,53.12221500000004],[-129.73831200000001,53.12721300000004],[-129.73275799999999,53.131103999999937],[-129.716949,53.133881000000031],[-129.69973800000002,53.134995000000004],[-129.66805999999991,53.136108000000092],[-129.66250600000001,53.135551000000021],[-129.65444899999994,53.132767000000058],[-129.650848,53.130547000000035],[-129.64416499999999,53.12721300000004],[-129.62081899999998,53.112494999999967],[-129.615814,53.108604000000071],[-129.58804299999991,53.084717000000069],[-129.58416699999998,53.08027600000014],[-129.58193999999997,53.075554000000068],[-129.58612099999999,53.069992000000127],[-129.59664900000001,53.061104000000114],[-129.60247799999996,53.057213000000047]],[[-79.909164000000033,53.081940000000145],[-79.919723999999974,53.081940000000145],[-79.926102000000014,53.084991000000002],[-79.92971799999998,53.089432000000102],[-79.932220000000029,53.094436999999971],[-79.938599000000011,53.122490000000084],[-79.938599000000011,53.134995000000004],[-79.93499799999995,53.147774000000084],[-79.930557000000022,53.152489000000116],[-79.906386999999995,53.172768000000076],[-79.897781000000009,53.174438000000009],[-79.887511999999958,53.174438000000009],[-79.877486999999974,53.173050000000103],[-79.866393999999957,53.16944100000012],[-79.858886999999868,53.166939000000013],[-79.846114999999941,53.160545000000013],[-79.795836999999892,53.116386000000034],[-79.789444000000003,53.106941000000006],[-79.787215999999944,53.101936000000137],[-79.789444000000003,53.095825000000048],[-79.796951000000035,53.093605000000025],[-79.835555999999997,53.083878000000084],[-79.843886999999995,53.082214000000079],[-79.909164000000033,53.081940000000145]],[[-129.4324949999999,53.151382000000012],[-129.35278299999993,53.072220000000073],[-129.29000899999988,52.993607000000054],[-129.28750600000001,52.978043000000014],[-129.28945899999985,52.971930999999984],[-129.29583700000001,52.968880000000013],[-129.31222499999996,52.966934000000094],[-129.341095,52.973320000000001],[-129.41418499999997,53.010551000000135],[-129.41915900000004,53.014442000000031],[-129.42138699999998,53.019157000000064],[-129.42471299999994,53.040276000000063],[-129.42916899999994,53.04972100000009],[-129.475281,53.101936000000137],[-129.50527999999997,53.126380999999981],[-129.51196300000004,53.129714999999976],[-129.52194199999985,53.131103999999937],[-129.53750600000001,53.128326000000129],[-129.54473899999994,53.128326000000129],[-129.54724099999993,53.133049000000142],[-129.54806500000001,53.14916199999999],[-129.546967,53.16027100000008],[-129.5386049999999,53.171660999999915],[-129.52166699999992,53.18360100000001],[-129.51446499999997,53.185822000000144],[-129.49859599999996,53.188599000000011],[-129.49026499999997,53.188881000000094],[-129.47997999999995,53.187767000000122],[-129.470551,53.185265000000015],[-129.46276899999992,53.179993000000081],[-129.4324949999999,53.151382000000012]],[[-81.106109999999887,53.199714999999969],[-81.087783999999886,53.17943600000001],[-81.045272999999952,53.148605000000089],[-80.978881999999942,53.113052000000039],[-80.973617999999988,53.109436000000017],[-80.809433000000013,52.97693600000008],[-80.775008999999955,52.944434999999942],[-80.763335999999924,52.931381000000044],[-80.669158999999979,52.776939000000084],[-80.667769999999962,52.771935000000099],[-80.667496000000028,52.759438000000102],[-80.670836999999892,52.745827000000133],[-80.673049999999932,52.740547000000049],[-80.699722000000008,52.69609800000012],[-80.705001999999979,52.692214999999976],[-80.712509000000011,52.689156000000025],[-80.720551,52.688324000000136],[-80.731673999999998,52.688881000000038],[-80.739166000000012,52.691376000000048],[-80.749161000000015,52.698875000000044],[-80.753066999999987,52.703323000000012],[-80.765839000000028,52.709717000000012],[-80.797500999999954,52.719153999999946],[-80.815001999999993,52.723045000000013],[-80.861388999999917,52.731102000000021],[-80.898894999999982,52.737495000000138],[-80.918883999999991,52.740272999999945],[-80.995543999999938,52.746101000000067],[-81.015563999999927,52.748604000000057],[-81.024444999999957,52.750549000000035],[-81.138061999999934,52.788048000000117],[-81.15306099999998,52.793052999999986],[-81.198882999999967,52.814156000000082],[-81.212783999999942,52.819991999999957],[-81.251953000000015,52.832497000000103],[-81.287216000000001,52.83998900000006],[-81.369155999999862,52.856102000000078],[-81.41722099999987,52.863052000000096],[-81.58444199999991,52.889160000000061],[-81.649170000000026,52.907211000000075],[-81.763625999999931,52.937767000000008],[-81.781386999999995,52.941658000000075],[-81.811660999999958,52.945267000000058],[-81.834166999999866,52.946381000000031],[-81.881377999999984,52.954162999999994],[-81.916655999999989,52.96166199999999],[-81.933318999999983,52.965828000000045],[-81.949721999999952,52.971375000000023],[-81.962783999999886,52.97693600000008],[-82.049987999999985,53.014442000000031],[-82.056655999999862,53.017494000000113],[-82.061661000000015,53.021102999999925],[-82.063323999999909,53.026657000000114],[-82.060271999999998,53.031937000000028],[-82.053329000000019,53.041938999999957],[-82.049164000000019,53.046661000000029],[-81.974716000000001,53.113883999999985],[-81.965285999999935,53.12221500000004],[-81.954177999999956,53.129990000000134],[-81.910827999999981,53.158882000000062],[-81.892226999999991,53.168326999999977],[-81.864440999999999,53.178604000000121],[-81.848052999999936,53.181664000000012],[-81.826110999999969,53.181381000000044],[-81.714721999999881,53.188599000000011],[-81.543059999999969,53.209160000000054],[-81.385283999999899,53.224990999999989],[-81.374999999999943,53.224990999999989],[-81.295546999999999,53.217765999999983],[-81.116394000000014,53.200829000000113],[-81.106109999999887,53.199714999999969]],[[-131.76223800000002,53.196655000000078],[-131.6305539999999,53.084159999999997],[-131.595551,53.046103999999957],[-131.59304800000001,53.041382000000056],[-131.59472700000003,53.035271000000023],[-131.60165399999994,53.033051],[-131.61026000000004,53.032211000000132],[-131.62887599999999,53.032494000000099],[-131.63973999999996,53.034439000000077],[-131.73666400000002,53.053879000000052],[-131.75558499999994,53.058601000000124],[-131.77444500000001,53.068886000000077],[-131.78390499999989,53.071381000000088],[-131.79473899999994,53.073051000000078],[-131.81362899999999,53.073607999999979],[-131.82971199999992,53.071381000000088],[-131.94332900000001,53.054993000000024],[-131.96472199999999,53.046386999999925],[-131.91195700000003,53.005271999999991],[-131.90835599999991,53.011108000000036],[-131.89944499999996,53.019714000000135],[-131.88806199999999,53.026939000000027],[-131.87027,53.037498000000028],[-131.85611,53.04222100000004],[-131.84777800000001,53.043052999999929],[-131.83111600000001,53.043052999999929],[-131.81167600000003,53.039718999999991],[-131.662781,53.00777400000004],[-131.644745,53.003882999999973],[-131.62860099999995,52.998328999999956],[-131.61498999999998,52.991661000000022],[-131.609711,52.988045000000113],[-131.59805299999999,52.97526600000009],[-131.59582499999993,52.964714000000072],[-131.59750399999996,52.958602999999982],[-131.61554000000001,52.920273000000066],[-131.662781,52.882210000000043],[-131.66805999999997,52.878043999999932],[-131.68057299999992,52.871658000000025],[-131.68749999999994,52.869155999999975],[-131.70443699999993,52.867767000000129],[-131.80221599999999,52.86471599999993],[-131.80862400000001,52.865829000000019],[-131.833618,52.88499500000006],[-131.849152,52.901932000000102],[-131.87027,52.922768000000076],[-131.88473499999992,52.934433000000013],[-131.89001500000001,52.93832400000008],[-131.898346,52.941100999999946],[-131.906677,52.940269000000058],[-131.93859899999995,52.934990000000084],[-131.94473299999999,52.931664000000012],[-131.982483,52.879715000000033],[-131.97860700000001,52.875549000000092],[-131.96859699999999,52.874435000000119],[-131.95278899999988,52.875267000000065],[-131.94528200000002,52.876938000000109],[-131.93139599999995,52.881660000000011],[-131.85638399999993,52.856102000000078],[-131.77557399999989,52.716660000000047],[-131.767517,52.713882000000012],[-131.73361199999999,52.69860100000011],[-131.72692900000004,52.695541000000048],[-131.72305299999988,52.691101000000003],[-131.683899,52.642220000000009],[-131.68139600000001,52.637496999999996],[-131.65945399999993,52.581665000000044],[-131.57278400000001,52.529991000000052],[-131.56527700000004,52.531662000000097],[-131.55667099999994,52.532211000000018],[-131.54583700000001,52.530273000000079],[-131.48193400000002,52.507773999999984],[-131.46749899999992,52.501389000000131],[-131.42361499999998,52.460823000000119],[-131.42748999999998,52.414993000000095],[-131.39849899999996,52.377827000000025],[-131.39533999999998,52.375492000000122],[-131.39016699999996,52.374660000000006],[-131.36749299999991,52.381827999999985],[-131.36549400000001,52.384491000000025],[-131.36599699999988,52.390986999999996],[-131.36715700000002,52.397160000000042],[-131.357483,52.403320000000065],[-131.35833699999989,52.414153999999996],[-131.35305799999998,52.41832700000009],[-131.32833900000003,52.431107000000054],[-131.31304899999998,52.434158000000082],[-131.27252199999998,52.438881000000038],[-131.25558499999988,52.440269000000001],[-131.23638900000003,52.439156000000082],[-131.23248299999995,52.434714999999983],[-131.24749800000001,52.365829000000133],[-131.25085399999995,52.359160999999972],[-131.25836200000003,52.34777100000008],[-131.26306199999999,52.34276600000004],[-131.30311599999993,52.332100000000025],[-131.31977799999993,52.335106000000053],[-131.33059700000001,52.332770999999923],[-131.33248899999995,52.293610000000001],[-131.32833900000003,52.284995999999978],[-131.32443199999989,52.280822999999998],[-131.27139299999999,52.277771000000087],[-131.259186,52.284164000000033],[-131.25613399999992,52.290833000000077],[-131.24832199999997,52.302216000000101],[-131.17971799999998,52.317772000000048],[-131.17193599999996,52.319442999999922],[-131.136414,52.311378000000047],[-131.09500099999997,52.286110000000122],[-131.01501500000001,52.225548000000117],[-131.00750699999998,52.217209000000082],[-131.00527999999991,52.206657000000064],[-131.01168799999988,52.193604000000107],[-131.01556400000004,52.187767000000122],[-131.024719,52.178047000000049],[-131.030304,52.173882000000049],[-131.036407,52.170830000000137],[-131.04305999999991,52.168326999999977],[-131.11512799999997,52.168289000000016],[-131.16610700000001,52.125549000000092],[-131.18057299999987,52.121658000000025],[-131.26473999999985,52.11971299999999],[-131.29888900000003,52.150268999999923],[-131.36025999999993,52.189156000000139],[-131.36694299999999,52.192490000000134],[-131.38946499999997,52.205826000000059],[-131.41168200000004,52.220543000000077],[-131.55111699999998,52.333878000000084],[-131.57333399999993,52.360824999999977],[-131.58194000000003,52.379990000000134],[-131.582764,52.385269000000108],[-131.58056599999986,52.390548999999965],[-131.57778899999994,52.393607999999972],[-131.57083099999994,52.396102999999982],[-131.54806500000001,52.400543000000027],[-131.53973399999995,52.401100000000099],[-131.52972399999993,52.400269000000094],[-131.52029400000004,52.397774000000027],[-131.56140099999999,52.431664000000126],[-131.66168199999998,52.478324999999984],[-131.67916899999994,52.483604000000128],[-131.70944199999991,52.491104000000007],[-131.76223800000002,52.50499700000006],[-131.77529899999996,52.51166500000005],[-131.89279199999999,52.582771000000093],[-132.01751699999994,52.677490000000034],[-132.08194000000003,52.727485999999942],[-132.08471700000001,52.732208000000014],[-132.060272,52.755272000000048],[-132.01028399999996,52.775269000000094],[-132.00250199999999,52.776939000000084],[-131.993042,52.774436999999978],[-131.97305299999999,52.764717000000076],[-131.96389799999997,52.756660000000124],[-131.94445799999988,52.735549999999989],[-131.93362400000001,52.728043000000014],[-131.92694099999994,52.724709000000075],[-131.91751099999988,52.722487999999942],[-131.91723599999995,52.725822000000107],[-131.93722499999996,52.763611000000083],[-131.93972799999995,52.768326000000116],[-131.95166,52.781105000000139],[-131.96221899999995,52.788605000000018],[-131.96887200000003,52.791939000000013],[-132.03417999999994,52.812767000000122],[-132.06167599999998,52.813881000000094],[-132.05804399999994,52.804161000000022],[-132.05557299999987,52.793610000000058],[-132.10247800000002,52.749435000000062],[-132.11026000000004,52.748046999999985],[-132.12026999999995,52.748877999999991],[-132.12747199999995,52.750832000000003],[-132.21417199999991,52.804710000000114],[-132.21945199999999,52.808327000000077],[-132.22888199999994,52.816382999999973],[-132.31640599999997,52.902214000000129],[-132.34414700000002,52.931664000000012],[-132.34695399999993,52.936377999999991],[-132.34304799999995,52.942214999999976],[-132.32971199999992,52.94582400000013],[-132.31362899999999,52.948043999999982],[-132.25558499999994,52.954711999999915],[-132.24527,52.953880000000026],[-132.23803699999991,52.951935000000049],[-132.16778599999992,52.928047000000106],[-132.15640300000001,52.958885000000066],[-132.11248799999998,52.987770000000125],[-132.11026000000004,52.993049999999982],[-132.11276199999992,52.997772000000055],[-132.11944599999998,53.00110600000005],[-132.25613399999997,53.028877000000136],[-132.26696799999996,53.030823000000055],[-132.29501300000004,53.031105000000082],[-132.41195700000003,53.031937000000028],[-132.47970599999996,53.027214000000015],[-132.49609399999991,53.032768000000033],[-132.50778199999996,53.040549999999996],[-132.51196300000004,53.044716000000051],[-132.55279499999995,53.089714000000129],[-132.55557299999992,53.094436999999971],[-132.56362899999999,53.139160000000004],[-132.56222500000001,53.145271000000093],[-132.55667099999994,53.149436999999978],[-132.54916399999991,53.151100000000099],[-132.53945899999991,53.148880000000077],[-132.52584799999994,53.142220000000066],[-132.50140399999998,53.133881000000031],[-132.48165899999998,53.130820999999969],[-132.45111099999986,53.128044000000102],[-132.41363499999989,53.127486999999974],[-132.378601,53.129433000000063],[-132.21081499999997,53.141662999999994],[-132.07083099999994,53.153877000000023],[-132.06390399999987,53.156380000000013],[-132.05777,53.159714000000008],[-132.03057899999999,53.179993000000081],[-132.00750700000003,53.1947100000001],[-131.92834500000004,53.230545000000006],[-131.92138699999992,53.233047000000056],[-131.811127,53.253608999999983],[-131.80194099999994,53.253326000000015],[-131.794464,53.251388999999961],[-131.79055800000003,53.247214999999926],[-131.76223800000002,53.196655000000078]],[[-55.778052999999943,53.289719000000105],[-55.786667000000023,53.288330000000087],[-55.794448999999929,53.291107000000011],[-55.797226000000023,53.295546999999999],[-55.793334999999956,53.300545],[-55.785003999999958,53.303604000000007],[-55.776108000000022,53.300270000000012],[-55.776389999999992,53.295273000000066],[-55.778052999999943,53.289719000000105]],[[-128.68945299999996,53.16443600000008],[-128.67944299999994,53.163047999999947],[-128.67083700000001,53.163605000000075],[-128.65222199999999,53.16276600000009],[-128.64196799999996,53.161377000000073],[-128.62469499999997,53.155548000000067],[-128.60555999999997,53.145271000000093],[-128.57611099999991,53.105270000000132],[-128.53167699999995,53.021102999999925],[-128.52890000000002,53.011108000000036],[-128.52056900000002,52.959435000000099],[-128.51834099999991,52.943604000000107],[-128.51779199999987,52.927489999999977],[-128.51834099999991,52.911102000000142],[-128.52001999999999,52.899719000000118],[-128.52279699999991,52.888046000000088],[-128.57028199999996,52.691376000000048],[-128.57223499999992,52.685265000000129],[-128.57528699999995,52.679993000000024],[-128.59359699999993,52.659156999999993],[-128.58526599999988,52.659431000000097],[-128.57748400000003,52.65638000000007],[-128.58581499999991,52.6322100000001],[-128.59222399999993,52.613884000000098],[-128.59722899999991,52.609161000000086],[-128.60497999999995,52.607773000000009],[-128.74887099999995,52.597214000000122],[-128.75167799999997,52.60083000000003],[-128.74859600000002,52.748604000000057],[-128.74804699999999,52.754165999999998],[-128.74444600000004,52.760826000000009],[-128.69250499999998,52.856102000000078],[-128.65335099999999,52.892769000000101],[-128.648346,52.89777400000014],[-128.64474499999994,52.904160000000047],[-128.64334099999996,52.915543000000071],[-128.64196799999996,52.948601000000053],[-128.64334099999996,52.958885000000066],[-128.646973,52.963325999999995],[-128.65335099999999,52.96665999999999],[-128.663635,52.968048000000067],[-128.67138699999998,52.96665999999999],[-128.67694099999994,52.962769000000094],[-128.67999299999997,52.957771000000093],[-128.75112899999999,52.835823000000119],[-128.75390600000003,52.830826000000059],[-128.76223800000002,52.810822000000087],[-128.76446499999997,52.804710000000114],[-128.78057899999999,52.739989999999977],[-128.78140299999995,52.734160999999972],[-128.77999899999998,52.72387700000013],[-128.77780200000001,52.718880000000013],[-128.77111799999994,52.704711999999972],[-128.76556400000004,52.695541000000048],[-128.77889999999991,52.66415400000011],[-128.84637499999997,52.653320000000065],[-128.88445999999999,52.648048000000131],[-128.89251699999994,52.64888000000002],[-129,52.697212000000093],[-129.03277600000001,52.719711000000075],[-129.04779099999996,52.731377000000009],[-129.08029199999999,52.772491000000116],[-129.10861199999999,52.812767000000122],[-129.11080899999996,52.817497000000117],[-129.114441,52.821938000000046],[-129.11886600000003,52.83138300000013],[-129.12191799999994,52.852218999999934],[-129.12191799999994,52.863052000000096],[-129.11999500000002,52.869155999999975],[-129.11080899999996,52.877487000000031],[-129.10360699999995,52.879715000000033],[-129.09500100000002,52.880272000000105],[-129.08444199999997,52.878043999999932],[-129.0763849999999,52.87499200000002],[-129.02224699999988,52.905548000000124],[-128.95178199999992,52.973660000000052],[-128.86999499999996,53.021935000000042],[-128.85498000000001,53.025269000000037],[-128.84082000000001,53.029716000000121],[-128.83639499999998,53.03555300000005],[-128.84359699999999,53.044158999999979],[-128.89556899999997,53.08277099999998],[-128.96389799999992,53.121657999999968],[-128.970551,53.124992000000134],[-129.00222799999995,53.136940000000038],[-129.01168799999999,53.139717000000076],[-129.01583900000003,53.133881000000031],[-129.01501499999995,53.128875999999991],[-129.00473,53.109993000000088],[-128.99386599999997,53.097214000000065],[-128.98748799999998,53.095825000000048],[-128.98110999999994,53.09887700000013],[-128.97387700000002,53.101105000000132],[-128.96444699999995,53.100548000000003],[-128.95666499999999,53.097771000000137],[-128.912781,53.073051000000078],[-128.86444099999989,53.038887000000045],[-128.862213,53.034164000000089],[-129.05584699999997,52.909156999999936],[-129.06915299999991,52.90387700000008],[-129.09500100000002,52.902489000000003],[-129.10583500000001,52.904708999999968],[-129.15945399999998,52.919715999999994],[-129.16583299999996,52.923049999999989],[-129.169464,52.927489999999977],[-129.17529300000001,52.936377999999991],[-129.18554700000004,52.955269000000044],[-129.18722499999996,52.965546000000018],[-129.191956,53.00777400000004],[-129.19137599999999,53.013329000000113],[-129.18804899999992,53.024162000000103],[-129.16665599999993,53.06610100000006],[-129.16168200000004,53.0711060000001],[-129.15472399999999,53.073326000000066],[-129.13165300000003,53.078049000000078],[-129.11804199999989,53.079163000000051],[-129.11749299999991,53.073882999999967],[-129.11804199999989,53.068329000000006],[-129.11499000000003,53.064712999999927],[-129.10861199999999,53.067772000000105],[-129.08248899999995,53.089989000000003],[-129.075287,53.10305000000011],[-129.07333399999999,53.109160999999972],[-129.07055700000001,53.131660000000124],[-129.05889899999988,53.231377000000123],[-129.06027199999988,53.241661000000136],[-129.064728,53.251105999999993],[-129.07193000000001,53.25999500000006],[-129.08221400000002,53.267769000000101],[-129.08972199999994,53.287216000000114],[-129.08612099999999,53.293610000000001],[-129.07971199999997,53.296661000000029],[-129.06664999999992,53.300827000000083],[-129.04305999999997,53.30471],[-129.025848,53.305550000000096],[-129.01861600000001,53.305550000000096],[-128.90084799999994,53.290276000000006],[-128.89138799999989,53.287773000000016],[-128.88137800000004,53.279991000000052],[-128.87777699999992,53.275826000000052],[-128.86389199999991,53.263610999999969],[-128.84359699999999,53.248047000000042],[-128.83221399999996,53.240546999999992],[-128.77529900000002,53.208885000000009],[-128.71167000000003,53.173882000000049],[-128.70526099999989,53.170546999999942],[-128.68945299999996,53.16443600000008]],[[-129.15307599999994,53.098328000000038],[-129.16168200000004,53.097771000000137],[-129.25945999999999,53.09804500000007],[-129.28945899999985,53.101936000000137],[-129.31140099999999,53.116936000000067],[-129.32665999999989,53.128601000000003],[-129.33248900000001,53.13749700000011],[-129.33471699999996,53.142493999999999],[-129.33639500000004,53.152770999999973],[-129.33889799999986,53.179161000000022],[-129.3383179999999,53.184990000000028],[-129.33639500000004,53.191101000000117],[-129.32528699999989,53.216103000000032],[-129.27389500000004,53.328049000000021],[-129.26806599999992,53.331940000000088],[-129.26028399999996,53.333327999999995],[-129.250854,53.333054000000061],[-129.22915599999988,53.328880000000026],[-129.22692899999998,53.326102999999932],[-129.20889299999999,53.321937999999932],[-129.19415299999997,53.315544000000102],[-129.18112199999996,53.308601000000067],[-129.17611699999998,53.30471],[-129.16860999999994,53.296104000000128],[-129.14529399999998,53.22165700000005],[-129.13247699999999,53.118599000000017],[-129.13192699999996,53.11360899999994],[-129.1339109999999,53.107498000000078],[-129.13891599999994,53.102493000000038],[-129.15307599999994,53.098328000000038]],[[-79.942764000000011,53.266936999999984],[-80.009170999999924,53.263885000000073],[-80.018065999999862,53.265830999999991],[-80.024445000000014,53.268883000000073],[-80.081679999999949,53.316101000000003],[-80.083892999999989,53.321106000000043],[-80.085281000000009,53.326942000000088],[-80.073333999999988,53.348877000000073],[-80.068892999999946,53.353325000000041],[-80.061385999999914,53.355553000000043],[-79.999724999999955,53.364716000000044],[-79.944716999999969,53.368050000000039],[-79.950561999999934,53.349716000000058],[-79.951949999999954,53.348327999999981],[-79.913054999999986,53.296104000000128],[-79.91194200000001,53.29055000000011],[-79.913329999999917,53.283051000000114],[-79.920836999999949,53.273048000000074],[-79.927215999999987,53.27027099999998],[-79.942764000000011,53.266936999999984]],[[-129.35833700000001,53.304161000000079],[-129.37441999999999,53.301383999999985],[-129.38363600000002,53.301933000000133],[-129.3875119999999,53.306099000000017],[-129.43499799999995,53.378876000000105],[-129.43307500000003,53.384720000000129],[-129.39501999999999,53.410819999999944],[-129.386414,53.40915700000005],[-129.37970000000001,53.40554800000001],[-129.37387100000001,53.400826000000109],[-129.36663799999991,53.398880000000077],[-129.32861300000002,53.377769000000001],[-129.30557299999998,53.335823000000005],[-129.30334499999992,53.331107999999972],[-129.30749500000002,53.31888600000002],[-129.31249999999989,53.313880999999981],[-129.32693499999999,53.309715000000097],[-129.35833700000001,53.304161000000079]],[[-55.787505999999951,53.394157000000064],[-55.793059999999969,53.391663000000108],[-55.801392000000021,53.392493999999942],[-55.949439999999981,53.430275000000108],[-55.958053999999947,53.434158000000082],[-55.971663999999919,53.445824000000016],[-55.978881999999942,53.454712000000029],[-55.979163999999912,53.459159999999997],[-55.976386999999988,53.463051000000064],[-55.958892999999932,53.472487999999998],[-55.945549000000028,53.478600000000142],[-55.931670999999994,53.483879000000115],[-55.923889000000031,53.485549999999989],[-55.916388999999981,53.485825000000034],[-55.883057000000008,53.486382000000106],[-55.878051999999968,53.486656000000039],[-55.811942999999928,53.483879000000115],[-55.757224999999949,53.468322999999998],[-55.740554999999915,53.462212000000079],[-55.729163999999969,53.455269000000101],[-55.729439000000013,53.450271999999984],[-55.787505999999951,53.394157000000064]],[[-128.94250499999998,53.317497000000003],[-129.11138899999997,53.315826000000129],[-129.12222299999996,53.318054000000132],[-129.12582399999991,53.322495000000004],[-129.13891599999994,53.339989000000116],[-129.14334099999996,53.349716000000058],[-129.14416499999993,53.354996000000142],[-129.14306599999986,53.366104000000121],[-129.14083899999997,53.37221500000004],[-129.13445999999993,53.383880999999974],[-129.08270299999998,53.429259999999999],[-129.05406199999999,53.453601999999989],[-129.05883799999998,53.487965000000145],[-129.051941,53.50499700000006],[-129.04779099999996,53.510551000000021],[-129.03778099999988,53.520271000000093],[-129.02194199999997,53.533882000000062],[-129.015289,53.536658999999986],[-128.99941999999987,53.53943600000008],[-128.988586,53.537216000000058],[-128.984711,53.533051000000057],[-128.98416099999997,53.52777100000003],[-128.98553499999997,53.523048000000017],[-128.98611499999998,53.513054000000011],[-128.98611499999998,53.502220000000136],[-128.9844359999999,53.491661000000079],[-128.97555499999987,53.472762999999986],[-128.95361300000002,53.446655000000021],[-128.94137599999993,53.434158000000082],[-128.93612699999994,53.430275000000108],[-128.90335099999993,53.39138000000014],[-128.90112299999998,53.386658000000068],[-128.90029900000002,53.381378000000041],[-128.91805999999997,53.331383000000017],[-128.92251599999997,53.325828999999999],[-128.92806999999999,53.321663000000115],[-128.94250499999998,53.317497000000003]],[[-79.709732000000031,53.508049000000142],[-79.720276000000013,53.507499999999993],[-79.730559999999969,53.508888000000127],[-79.746947999999918,53.513328999999999],[-79.764724999999942,53.523605000000089],[-79.769729999999925,53.527214000000129],[-79.773620999999991,53.531662000000097],[-79.77027899999996,53.536942000000124],[-79.761397999999929,53.546104000000071],[-79.755004999999983,53.543053000000043],[-79.70695499999988,53.515549000000021],[-79.703338999999914,53.511108000000092],[-79.709732000000031,53.508049000000142]],[[-129.93472299999985,53.484161000000029],[-129.94277999999991,53.482764999999972],[-129.95220899999998,53.483047000000056],[-130.01446499999997,53.501938000000052],[-130.02111799999994,53.505272000000048],[-129.98858599999988,53.528603000000089],[-129.94195599999995,53.551102000000071],[-129.93417399999998,53.552489999999977],[-129.92611699999992,53.551658999999972],[-129.89334099999991,53.545546999999999],[-129.88668799999999,53.542221000000097],[-129.88418599999994,53.537216000000058],[-129.88696300000004,53.534163999999976],[-129.894745,53.521934999999928],[-129.89889499999998,53.516388000000006],[-129.913635,53.501938000000052],[-129.92916899999994,53.488327000000083],[-129.93472299999985,53.484161000000029]],[[-129.87942499999991,53.392768999999987],[-129.72915599999993,53.215271000000087],[-129.73028599999992,53.204163000000108],[-129.73220799999996,53.198044000000095],[-129.74249299999997,53.178329000000076],[-129.75085399999989,53.166939000000013],[-129.75585899999993,53.162209000000018],[-129.76223799999997,53.158882000000062],[-129.86416600000001,53.153046000000018],[-129.91223100000002,53.156380000000013],[-129.93167099999999,53.158043000000077],[-129.93695099999997,53.161933999999974],[-130.08804299999991,53.289436000000137],[-130.11111500000004,53.328049000000021],[-130.16500899999988,53.358330000000137],[-130.20333899999997,53.378876000000105],[-130.24249299999997,53.384163000000058],[-130.261414,53.384720000000129],[-130.28695700000003,53.381378000000041],[-130.29638699999998,53.381660000000068],[-130.30584699999997,53.384163000000058],[-130.31640600000003,53.391937000000041],[-130.40194700000001,53.479988000000048],[-130.52722199999999,53.552216000000044],[-130.52999899999998,53.567771999999991],[-130.52944899999994,53.573326000000009],[-130.52224699999994,53.618599000000074],[-130.52029399999998,53.624709999999993],[-130.50836200000003,53.631935000000055],[-130.459991,53.637496999999996],[-130.450287,53.634995000000117],[-130.39584399999995,53.619438000000059],[-130.39111300000002,53.61693600000001],[-130.37554899999992,53.612212999999997],[-130.27529900000002,53.580276000000026],[-130.20220900000004,53.553878999999938],[-130.14083900000003,53.528877000000023],[-129.97720300000003,53.455550999999957],[-129.94415299999991,53.438598999999954],[-129.93222000000003,53.431380999999988],[-129.92056300000002,53.424164000000019],[-129.88418599999994,53.397217000000126],[-129.87942499999991,53.392768999999987]],[[-129.08639500000004,53.446097999999949],[-129.15750099999997,53.392768999999987],[-129.16778599999998,53.593880000000127],[-129.16583299999996,53.610825000000091],[-129.16305499999999,53.622489999999971],[-129.16082799999998,53.62860100000006],[-129.15307599999994,53.638603000000046],[-129.14724699999994,53.642494000000113],[-129.14083899999997,53.645546000000024],[-129.05249000000003,53.681106999999997],[-129.03860499999985,53.686377999999991],[-129.00805699999995,53.693321000000026],[-128.98330699999991,53.696655000000021],[-128.87554899999998,53.709434999999928],[-128.832764,53.712494000000106],[-128.82388299999997,53.713051000000007],[-128.81887800000004,53.709160000000111],[-128.82110599999999,53.703049000000021],[-128.82360799999998,53.700546000000088],[-128.87222299999991,53.661102000000142],[-128.97970599999996,53.58387799999997],[-128.98638900000003,53.580826000000059],[-128.99221799999992,53.576942000000031],[-129.07556199999993,53.514717000000132],[-129.08554100000003,53.50499700000006],[-129.08999599999999,53.499435000000062],[-129.09359699999993,53.492767000000129],[-129.09414699999996,53.487213000000111],[-129.093323,53.481934000000138],[-129.08889799999997,53.472487999999998],[-129.08526599999993,53.468047999999953],[-129.08306899999997,53.463326000000052],[-129.08221400000002,53.458328000000051],[-129.08276399999988,53.452492000000007],[-129.08639500000004,53.446097999999949]],[[-130.09109499999994,53.569443000000035],[-130.09832800000004,53.566940000000102],[-130.10775799999999,53.567497000000003],[-130.14862099999999,53.571938000000102],[-130.21887199999992,53.587212000000136],[-130.22833299999996,53.589431999999988],[-130.32916299999994,53.618049999999982],[-130.34249899999998,53.624709999999993],[-130.39028899999988,53.669991000000039],[-130.40335099999999,53.682495000000074],[-130.39111300000002,53.699432000000058],[-130.29888899999997,53.796944000000053],[-130.2836299999999,53.79833200000013],[-130.27194199999997,53.797775000000058],[-130.26168799999994,53.796386999999982],[-130.24664299999989,53.790276000000063],[-130.23330699999985,53.783607000000018],[-130.11944600000004,53.686653000000035],[-130.11721799999998,53.681938000000002],[-130.09109499999994,53.569443000000035]],[[-56.86721799999998,53.764998999999932],[-56.948607999999979,53.750000000000057],[-56.982773000000009,53.755271999999991],[-57.01139099999989,53.781105000000139],[-57.014450000000011,53.785553000000107],[-57.012222000000008,53.790276000000063],[-57.006667999999991,53.794716000000108],[-57,53.79833200000013],[-56.984726000000023,53.803879000000109],[-56.966942000000017,53.803879000000109],[-56.863060000000019,53.798050000000103],[-56.84444400000001,53.792496000000085],[-56.847518999999977,53.786644000000138],[-56.86721799999998,53.764998999999932]],[[-129.82611099999991,53.724158999999986],[-129.59722899999997,53.550270000000125],[-129.51611300000002,53.488045000000056],[-129.42471299999994,53.411377000000016],[-129.43472299999996,53.401656999999943],[-129.45165999999995,53.379158000000018],[-129.45498699999996,53.372490000000028],[-129.47415199999995,53.289162000000033],[-129.47387700000002,53.239990000000091],[-129.50668299999995,53.216660000000104],[-129.56390399999998,53.207497000000103],[-129.72582999999992,53.340546000000018],[-129.800568,53.380546999999979],[-129.80721999999997,53.384163000000058],[-129.82223499999986,53.401382000000126],[-129.85833700000001,53.456383000000073],[-129.87719699999997,53.50499700000006],[-129.87026999999995,53.518051000000128],[-129.86999500000002,53.534721000000047],[-129.87026999999995,53.545546999999999],[-129.88391100000001,53.579720000000009],[-129.91607699999992,53.601715000000013],[-129.9192349999999,53.604050000000143],[-129.92489599999999,53.605545000000006],[-129.93022199999996,53.605213000000106],[-129.939728,53.603549999999984],[-129.94305399999985,53.601215000000025],[-129.94605999999987,53.598216999999977],[-129.94555700000001,53.59521500000011],[-129.96139500000004,53.594711000000132],[-129.96554600000002,53.589156999999943],[-129.99941999999993,53.574714999999969],[-130.00750699999998,53.573326000000009],[-130.01611300000002,53.572769000000108],[-130.02694699999989,53.574714999999969],[-130.04028299999993,53.58138300000013],[-130.05166600000001,53.594437000000028],[-130.05639599999995,53.603882000000112],[-130.05584699999991,53.609436000000073],[-130.05166600000001,53.615273000000059],[-130.03085299999987,53.622765000000015],[-129.98288000000002,53.641605000000084],[-129.97805799999992,53.642436999999973],[-129.96240199999994,53.643436000000065],[-129.95622300000002,53.642769000000101],[-129.94955400000003,53.641434000000118],[-129.93505900000002,53.636272000000076],[-129.92938199999998,53.634765999999956],[-129.926895,53.636772000000065],[-129.92820699999993,53.639602999999966],[-129.93440199999992,53.644268000000125],[-129.94956999999994,53.646805000000086],[-129.95996100000002,53.649501999999927],[-129.96726999999993,53.650299000000018],[-129.98693799999995,53.658600000000092],[-130.01889,53.653046000000074],[-130.091949,53.677216000000101],[-130.15695199999999,53.721375000000023],[-130.283905,53.83277099999998],[-130.286407,53.837493999999992],[-130.27917499999995,53.856384000000105],[-130.27029400000004,53.875549000000092],[-130.26641799999999,53.881378000000097],[-130.25472999999994,53.889160000000061],[-130.20166,53.912491000000102],[-130.19445799999994,53.914711000000125],[-130.18640099999999,53.916100000000085],[-130.10916099999992,53.885551000000021],[-129.96444699999995,53.805824000000086],[-129.83139,53.728043000000014],[-129.82611099999991,53.724158999999986]],[[-79.864166000000012,53.906380000000013],[-79.873885999999914,53.90415999999999],[-79.906113000000005,53.913879000000009],[-79.918883999999991,53.920273000000066],[-79.922775000000001,53.924713000000054],[-79.925277999999878,53.929717999999923],[-79.926392000000021,53.935265000000072],[-79.915008999999998,53.933876000000055],[-79.867492999999968,53.919715999999994],[-79.862212999999997,53.915825000000098],[-79.860001000000011,53.910820000000058],[-79.864166000000012,53.906380000000013]],[[-130.14974999999998,53.989159000000086],[-130.16805999999997,53.988884000000098],[-130.179169,53.990829000000076],[-130.19415300000003,53.997214999999983],[-130.20306400000004,54.005271999999934],[-130.21499600000004,54.029160000000104],[-130.21694899999994,54.039436000000137],[-130.21640000000002,54.044998000000078],[-130.21304299999997,54.051659000000029],[-130.20278899999994,54.069160000000011],[-130.19360399999999,54.079720000000123],[-130.18640099999999,54.081940000000145],[-130.17834500000004,54.083328000000051],[-130.16861,54.083054000000118],[-130.15917999999994,54.080551000000128],[-130.15557899999999,54.075554000000011],[-130.14889500000004,54.072220000000016],[-130.14361599999995,54.068328999999949],[-130.13973999999996,54.064156000000025],[-130.13247699999999,54.049995000000024],[-130.12249799999995,54.024993999999992],[-130.1213679999999,54.019989000000123],[-130.12249799999995,54.0086060000001],[-130.12441999999999,54.002495000000067],[-130.13528399999996,53.993607000000054],[-130.14974999999998,53.989159000000086]],[[-130.25918599999994,54.004715000000033],[-130.237213,53.984161000000086],[-130.23330699999985,53.979987999999935],[-130.23083499999996,53.975266000000033],[-130.228882,53.964714000000072],[-130.22998000000001,53.953606000000093],[-130.23330699999985,53.946938000000102],[-130.24249299999997,53.936377999999991],[-130.338593,53.839157000000114],[-130.34445199999999,53.835266000000047],[-130.35220299999997,53.833878000000141],[-130.37860099999995,53.831939999999975],[-130.38723800000002,53.831383000000073],[-130.45016499999997,53.864326000000005],[-130.45433000000003,53.866325000000018],[-130.45849599999997,53.882159999999942],[-130.41278099999994,53.958602999999982],[-130.40777600000001,53.963325999999995],[-130.400848,53.965828000000045],[-130.38165300000003,53.965271000000143],[-130.35055499999993,53.961661999999933],[-130.341095,53.961380000000077],[-130.33306899999991,53.962769000000094],[-130.32748400000003,53.966934000000094],[-130.34359699999987,53.984993000000031],[-130.35497999999995,53.993324000000086],[-130.42944299999994,53.983047000000113],[-130.4375,53.981659000000036],[-130.44387800000004,53.978600000000029],[-130.452789,53.968048000000067],[-130.47517400000004,53.944213999999931],[-130.47550999999993,53.940712000000076],[-130.47917199999995,53.926379999999995],[-130.48266599999988,53.915379000000144],[-130.48516799999993,53.912048000000027],[-130.4895019999999,53.910549000000003],[-130.49465900000001,53.910217000000046],[-130.500854,53.910881000000131],[-130.524338,53.914711000000125],[-130.54724099999999,53.903877000000023],[-130.55248999999998,53.907767999999919],[-130.55639599999995,53.911934000000031],[-130.56527699999998,53.925827000000027],[-130.57748400000003,53.93721000000005],[-130.591949,53.949158000000125],[-130.59722899999997,53.953048999999965],[-130.60278299999993,53.956657000000064],[-130.61080900000002,53.959717000000126],[-130.62191799999999,53.961661999999933],[-130.65805099999989,53.964439000000027],[-130.66696200000001,53.963882000000126],[-130.67251599999997,53.959991000000059],[-130.67666600000001,53.954162999999994],[-130.69528200000002,53.91944100000012],[-130.698059,53.914154000000053],[-130.69555700000001,53.909431000000041],[-130.68499799999989,53.901932000000045],[-130.66305499999993,53.892220000000123],[-130.64666699999998,53.886657999999954],[-130.633331,53.879990000000021],[-130.62777700000004,53.876099000000124],[-130.62249799999995,53.872215000000097],[-130.6177669999999,53.862770000000012],[-130.61804199999995,53.857216000000051],[-130.62136799999996,53.85054800000006],[-130.62554899999998,53.844711000000075],[-130.6305539999999,53.839989000000003],[-130.64251699999994,53.83277099999998],[-130.65139799999997,53.834435000000042],[-130.69583099999994,53.844436999999971],[-130.70639,53.851936000000137],[-130.71026599999999,53.856384000000105],[-130.71276899999998,53.861107000000118],[-130.72305299999999,53.917213000000004],[-130.72277799999995,53.922768000000076],[-130.7202759999999,53.93471500000004],[-130.71777299999991,53.939986999999974],[-130.667236,53.986938000000009],[-130.66168200000004,53.990829000000076],[-130.59527600000001,54.026382000000069],[-130.523346,54.059989999999914],[-130.41113300000001,54.100830000000087],[-130.40249600000004,54.101386999999988],[-130.37081899999998,54.087212000000079],[-130.33612099999999,54.06749700000006],[-130.30499299999991,54.045273000000122],[-130.25918599999994,54.004715000000033]],[[-58.518332999999927,54.051659000000029],[-58.526664999999923,54.050545000000056],[-58.536666999999966,54.05082700000014],[-58.545554999999979,54.052216000000101],[-58.556389000000024,54.054710000000057],[-58.56138599999997,54.058044000000052],[-58.56138599999997,54.063880999999981],[-58.55777699999993,54.069160000000011],[-58.552779999999927,54.074440000000038],[-58.53556100000003,54.086654999999951],[-58.503058999999951,54.103050000000053],[-58.468605000000025,54.114716000000044],[-58.450554000000011,54.11721],[-58.437774999999988,54.115547000000049],[-58.378608999999926,54.106659000000093],[-58.373885999999914,54.104164000000083],[-58.378052000000025,54.099998000000141],[-58.407172999999943,54.090561000000037],[-58.426108999999997,54.070831000000055],[-58.43250299999994,54.067214999999976],[-58.440551999999968,54.064713000000097],[-58.456389999999999,54.061661000000015],[-58.518332999999927,54.051659000000029]],[[-132.808044,54.120270000000062],[-132.78890999999999,54.119987000000094],[-132.77999899999998,54.120827000000133],[-132.75723300000004,54.126380999999924],[-132.73580899999996,54.133881000000031],[-132.70306399999993,54.139160000000004],[-132.65835600000003,54.142220000000066],[-132.6480709999999,54.141380000000026],[-132.63946499999997,54.138603000000103],[-132.57528699999995,54.115547000000049],[-132.56973300000004,54.111938000000066],[-132.55777,54.088043000000084],[-132.558899,54.048332000000073],[-132.56054699999999,54.04222100000004],[-132.56664999999992,54.029160000000104],[-132.57583599999998,54.019157000000007],[-132.58139,54.014999000000103],[-132.59387199999998,54.0086060000001],[-132.62554899999992,54.002220000000023],[-132.63275099999993,53.999718000000144],[-132.66418499999997,53.98333000000008],[-132.67999299999997,53.958885000000066],[-132.68167099999999,53.952773999999977],[-132.68029799999999,53.947769000000108],[-132.65890499999989,53.939430000000073],[-132.57223499999992,53.976653999999996],[-132.55584699999997,53.989159000000086],[-132.55029299999995,53.993880999999988],[-132.5477909999999,53.999161000000072],[-132.54888899999997,54.004166000000112],[-132.55306999999999,54.008331000000112],[-132.54833999999994,54.02693899999997],[-132.54528800000003,54.033607000000131],[-132.54055799999998,54.038329999999974],[-132.41665599999999,54.096100000000035],[-132.40972899999997,54.098602000000085],[-132.40167199999985,54.099998000000141],[-132.30111699999998,54.111664000000133],[-132.29055800000003,54.110549999999989],[-132.28582799999998,54.107773000000066],[-132.25280799999996,54.08526599999999],[-132.22833300000002,54.065826000000015],[-132.15029899999996,53.992767000000015],[-132.142517,53.978600000000029],[-132.11111499999998,53.878326000000015],[-132.11721799999992,53.864998000000014],[-132.125,53.853324999999984],[-132.13445999999988,53.843605000000082],[-132.22500600000001,53.780273000000022],[-132.23111,53.776939000000027],[-132.24527,53.772217000000126],[-132.47442599999999,53.707496999999989],[-132.50500499999998,53.700271999999927],[-132.52084399999995,53.697212000000093],[-132.53805499999999,53.695823999999959],[-132.55721999999997,53.695823999999959],[-132.56832899999995,53.697768999999994],[-132.58889799999992,53.699715000000026],[-132.60693399999991,53.698874999999987],[-132.62441999999993,53.697487000000081],[-132.64724699999994,53.69193300000012],[-132.65890499999989,53.684433000000013],[-132.66332999999997,53.679436000000123],[-132.665009,53.673325000000034],[-132.46362299999993,53.612770000000069],[-132.41805999999997,53.606102000000078],[-132.32138099999992,53.663605000000132],[-132.31527699999998,53.666939000000127],[-132.308044,53.669158999999922],[-132.29943799999995,53.669991000000039],[-132.290009,53.669716000000051],[-132.27890000000002,53.6680530000001],[-132.24554399999994,53.662490999999989],[-132.15640300000001,53.716385000000002],[-132.15249600000004,53.812492000000077],[-132.08450299999998,53.872738000000027],[-132.106201,53.917881000000023],[-132.126373,53.979431000000034],[-132.07250999999997,54.022766000000047],[-132.01501499999989,54.021935000000042],[-131.98803699999996,54.023048000000074],[-131.97109999999998,54.025269000000037],[-131.87499999999994,54.052773000000002],[-131.86053500000003,54.057495000000074],[-131.81777999999997,54.071937999999989],[-131.75473,54.094993999999986],[-131.72778299999999,54.106102000000021],[-131.71499599999999,54.112495000000138],[-131.70361299999996,54.120543999999995],[-131.67193599999996,54.146660000000054],[-131.66305499999999,54.152214000000072],[-131.66000399999996,54.131104000000107],[-131.66665599999999,54.079436999999984],[-131.67279099999996,54.044158999999979],[-131.67971799999998,54.019714000000135],[-131.70498699999996,53.966934000000094],[-131.72082499999999,53.943878000000041],[-131.73889199999996,53.923324999999977],[-131.78640699999994,53.874435000000119],[-131.79666099999997,53.865273000000002],[-131.82971199999992,53.841102999999976],[-131.85333300000002,53.816382999999973],[-131.86886600000003,53.79332700000009],[-131.87222299999996,53.786942000000067],[-131.93331899999998,53.615273000000059],[-131.93499800000001,53.609161000000086],[-131.94000199999988,53.519714000000022],[-131.93917799999991,53.508888000000127],[-131.91778599999998,53.399162000000103],[-131.90863000000002,53.357498000000021],[-131.95916699999992,53.276382000000069],[-131.96832299999988,53.266388000000063],[-131.98220799999996,53.251663000000121],[-131.988586,53.248604000000114],[-132.00585899999993,53.247214999999926],[-132.036407,53.25],[-132.0561219999999,53.253326000000015],[-132.08331299999992,53.253052000000082],[-132.17138699999998,53.23832700000014],[-132.19500700000003,53.233879000000002],[-132.21054100000003,53.230545000000006],[-132.21749899999998,53.228324999999984],[-132.27279699999997,53.210274000000027],[-132.27029399999998,53.205551000000014],[-132.26611300000002,53.20138500000013],[-132.25558499999994,53.193877999999984],[-132.23776199999998,53.188881000000094],[-132.22997999999995,53.190544000000045],[-132.21581999999995,53.195267000000001],[-132.20361299999996,53.201659999999947],[-132.19415299999991,53.201659999999947],[-132.14501999999999,53.198325999999952],[-132.13391100000001,53.196655000000078],[-132.12441999999987,53.194153000000028],[-132.12191799999999,53.189430000000016],[-132.158905,53.169990999999982],[-132.18695099999997,53.160545000000013],[-132.19473300000004,53.158882000000062],[-132.390289,53.142769000000044],[-132.40835599999997,53.142220000000066],[-132.44665499999991,53.143607999999972],[-132.45748900000001,53.145271000000093],[-132.506958,53.161102000000085],[-132.53668199999998,53.178879000000109],[-132.56527700000004,53.212769000000037],[-132.57638499999996,53.232208000000128],[-132.58581500000003,53.240273000000059],[-132.59664899999996,53.247489999999971],[-132.61471599999993,53.252777000000094],[-132.64529399999992,53.255553999999961],[-132.66473400000001,53.256386000000077],[-132.68362400000001,53.256660000000011],[-132.67584199999999,53.281661999999926],[-132.61944599999998,53.300270000000012],[-132.55221599999999,53.308043999999995],[-132.54446399999995,53.309433000000013],[-132.53973400000001,53.314438000000052],[-132.53695700000003,53.321106000000043],[-132.53918499999997,53.326385000000016],[-132.54333499999996,53.330551000000071],[-132.54998799999987,53.333878000000027],[-132.55835000000002,53.336655000000121],[-132.56860399999999,53.337494000000106],[-132.67001300000004,53.326942000000088],[-132.72000100000002,53.320830999999998],[-132.73388699999998,53.337212000000022],[-132.709991,53.370270000000005],[-132.70443699999993,53.374435000000005],[-132.69750999999991,53.376937999999996],[-132.52076699999998,53.340160000000026],[-132.51744099999996,53.337990000000104],[-132.41641200000004,53.2972180000001],[-132.41055299999994,53.294715999999994],[-132.406677,53.300545],[-132.40362500000003,53.30721299999999],[-132.40057399999995,53.319443000000092],[-132.40029900000002,53.330826000000116],[-132.40280200000001,53.335548000000017],[-132.406677,53.339714000000072],[-132.41223099999996,53.343604999999968],[-132.52084399999995,53.412209000000132],[-132.54138199999994,53.416382000000112],[-132.73580899999996,53.453323000000012],[-132.85775799999999,53.461104999999975],[-132.86749299999997,53.463608000000136],[-132.87277199999988,53.467209000000025],[-132.97250399999996,53.555824000000143],[-132.991669,53.583054000000004],[-132.9941409999999,53.587769000000037],[-132.98889199999991,53.591934000000037],[-132.96139500000004,53.600273000000072],[-132.95361300000002,53.601936000000023],[-132.94415300000003,53.601936000000023],[-132.93444799999986,53.599716000000001],[-132.91805999999997,53.588600000000042],[-132.90972899999997,53.585823000000005],[-132.89862099999999,53.584160000000054],[-132.89083900000003,53.585548000000131],[-132.88445999999999,53.588882000000126],[-132.88082900000001,53.594711000000132],[-132.8805539999999,53.600273000000072],[-132.88192700000002,53.605552999999986],[-132.8861389999999,53.609717999999987],[-132.92028800000003,53.637214999999912],[-132.935272,53.648604999999975],[-132.95056199999999,53.654709000000025],[-133.00778200000002,53.676383999999985],[-132.95361300000002,53.682770000000119],[-132.95443699999998,53.702774000000034],[-132.9844359999999,53.742767000000072],[-133.02471899999995,53.751389000000074],[-133.03362999999996,53.75277699999998],[-133.09387200000003,53.775551000000121],[-133.10082999999997,53.778603000000032],[-133.10638399999993,53.782494000000099],[-133.10916099999997,53.786942000000067],[-133.13751199999996,53.87499200000002],[-133.13891599999994,53.880272000000048],[-133.14001500000001,53.908043000000134],[-133.13833599999992,53.914154000000053],[-133.13391100000001,53.919159000000093],[-133.11639399999996,53.934158000000139],[-133.09527599999996,53.949432000000058],[-133.09081999999995,53.954162999999994],[-133.04110700000001,54.031661999999983],[-133.03973400000001,54.037773000000072],[-133.04083299999996,54.0430530000001],[-133.05862399999995,54.076102999999989],[-133.07916299999999,54.09777100000008],[-133.08193999999992,54.102492999999981],[-133.07165499999996,54.168883999999991],[-133.06722999999988,54.173881999999992],[-133.04083299999996,54.176102000000014],[-133.03112799999991,54.176102000000014],[-132.94027700000004,54.161377000000073],[-132.93029799999994,54.15915700000005],[-132.92001299999993,54.15248900000006],[-132.90335099999993,54.135826000000009],[-132.82748400000003,54.122490000000084],[-132.808044,54.120270000000062]],[[-130.19555699999995,54.118050000000039],[-130.21166999999997,54.115273000000116],[-130.22109999999998,54.115547000000049],[-130.23220799999996,54.117493000000138],[-130.24581899999993,54.124161000000129],[-130.25112899999999,54.128044000000045],[-130.25500499999998,54.132209999999986],[-130.261414,54.141380000000026],[-130.26364099999995,54.146102999999982],[-130.26473999999996,54.151381999999955],[-130.26306199999993,54.16832700000009],[-130.2611389999999,54.174164000000076],[-130.25778199999996,54.180824000000086],[-130.2528079999999,54.185547000000099],[-130.23971599999999,54.189712999999983],[-130.23083499999996,54.190269000000001],[-130.20944199999985,54.187209999999993],[-130.20999099999989,54.18360100000001],[-130.20166,54.183052000000032],[-130.19223,54.180549999999982],[-130.17861900000003,54.173607000000004],[-130.16113300000001,54.16276600000009],[-130.15585299999992,54.158882000000062],[-130.15194699999995,54.154434000000094],[-130.15112299999998,54.149436999999978],[-130.153076,54.143326000000059],[-130.158051,54.138328999999999],[-130.169464,54.130547000000035],[-130.19555699999995,54.118050000000039]],[[-79.469727000000034,54.167496000000085],[-79.477218999999877,54.165825000000041],[-79.483611999999994,54.169159000000036],[-79.485001000000011,54.174712999999997],[-79.481109999999944,54.187492000000077],[-79.475554999999929,54.191376000000105],[-79.43472300000002,54.200272000000041],[-79.413054999999986,54.191657999999961],[-79.418610000000001,54.187209999999993],[-79.426392000000021,54.183052000000032],[-79.469727000000034,54.167496000000085]],[[-130.64862099999999,54.114441000000056],[-130.67138699999992,54.107773000000066],[-130.69055199999997,54.108330000000137],[-130.69888299999997,54.111107000000061],[-130.77417000000003,54.142220000000066],[-130.78500399999996,54.149994000000049],[-130.79806500000001,54.162208999999962],[-130.800568,54.166939000000013],[-130.79861500000004,54.173050000000103],[-130.78167699999995,54.211662000000103],[-130.77444500000001,54.213882000000069],[-130.76391599999999,54.212769000000037],[-130.75613399999992,54.209159999999997],[-130.74636799999996,54.206657000000064],[-130.72582999999997,54.196655000000078],[-130.64889500000004,54.149719000000061],[-130.64501999999993,54.145271000000093],[-130.64001500000001,54.135826000000009],[-130.63919099999993,54.130820999999969],[-130.63946499999997,54.124992000000134],[-130.64279199999999,54.118599000000017],[-130.64862099999999,54.114441000000056]],[[-130.35555999999991,54.257773999999984],[-130.36663799999991,54.241104000000007],[-130.375,54.244155999999975],[-130.38861099999997,54.250832000000059],[-130.40057400000001,54.258048999999971],[-130.45556599999998,54.295830000000137],[-130.46639999999996,54.303322000000094],[-130.46722399999993,54.308601000000067],[-130.44750999999991,54.325828999999999],[-130.44000199999999,54.328049000000021],[-130.43112199999996,54.328606000000093],[-130.41778599999992,54.326385000000016],[-130.39196799999996,54.312492000000134],[-130.38528400000001,54.308884000000035],[-130.37997399999995,54.305267000000072],[-130.37582399999997,54.300827000000083],[-130.35470599999996,54.269157000000007],[-130.35220299999997,54.264442000000145],[-130.35555999999991,54.257773999999984]],[[-130.26641799999999,54.260551000000078],[-130.32528699999995,54.243050000000096],[-130.33416699999998,54.244713000000047],[-130.33804299999997,54.248878000000047],[-130.355255,54.282211000000075],[-130.35415599999999,54.293326999999977],[-130.350281,54.305550000000039],[-130.34445199999999,54.30971500000004],[-130.29000899999994,54.332214000000022],[-130.27279699999991,54.329720000000066],[-130.26751699999994,54.325828999999999],[-130.25973499999998,54.317497000000003],[-130.25250199999999,54.303047000000049],[-130.25058000000001,54.292770000000075],[-130.25167799999991,54.281380000000013],[-130.255585,54.269440000000145],[-130.25973499999998,54.263610999999912],[-130.26641799999999,54.260551000000078]],[[-130.70416299999994,54.356659000000036],[-130.745544,54.354713000000118],[-130.754456,54.356102000000135],[-130.76391599999999,54.364159000000086],[-130.76724200000001,54.374161000000072],[-130.76834099999991,54.379433000000006],[-130.76779199999987,54.384995000000117],[-130.76446499999992,54.389434999999992],[-130.75805699999995,54.392494000000113],[-130.72943099999986,54.402771000000087],[-130.72222899999991,54.404991000000109],[-130.71417199999996,54.406380000000127],[-130.699432,54.40665400000006],[-130.68890399999998,54.393326000000059],[-130.68331899999998,54.373047000000099],[-130.685272,54.36693600000001],[-130.6894529999999,54.361381999999992],[-130.69610599999999,54.358047000000113],[-130.70416299999994,54.356659000000036]],[[-57.324721999999952,54.498877999999991],[-57.342498999999918,54.498604000000057],[-57.351668999999958,54.500275000000101],[-57.356666999999959,54.502220000000079],[-57.362777999999992,54.506104000000107],[-57.365004999999996,54.511664999999994],[-57.365554999999972,54.516387999999949],[-57.362502999999947,54.527489000000116],[-57.359443999999996,54.533332999999914],[-57.333327999999995,54.565543999999989],[-57.327782000000013,54.570831000000112],[-57.321114000000023,54.574997000000053],[-57.267220000000009,54.585548000000131],[-57.265556000000004,54.580551000000014],[-57.269722000000002,54.574997000000053],[-57.272728000000029,54.572495000000117],[-57.239440999999999,54.522217000000012],[-57.240279999999984,54.517769000000044],[-57.255004999999926,54.513328999999999],[-57.293059999999912,54.503609000000097],[-57.307776999999987,54.500549000000035],[-57.324721999999952,54.498877999999991]],[[-130.95166,54.454711999999972],[-130.95944199999997,54.453323000000012],[-130.96499600000004,54.456940000000145],[-130.96749899999992,54.461662000000047],[-130.96609499999994,54.510826000000009],[-130.96472199999994,54.527771000000143],[-130.96112099999999,54.539992999999981],[-130.93057299999998,54.61471599999993],[-130.92556799999994,54.619438000000059],[-130.88891599999994,54.628876000000048],[-130.88137800000004,54.629158000000132],[-130.754456,54.62943300000012],[-130.74777199999994,54.626099000000124],[-130.74664299999995,54.62082700000002],[-130.74694799999997,54.615273000000059],[-130.7441409999999,54.60166200000009],[-130.745544,54.584717000000126],[-130.74914599999994,54.572769000000051],[-130.75250199999999,54.566101000000117],[-130.75613399999992,54.559433000000126],[-130.76083399999999,54.554710000000114],[-130.76666299999999,54.550545000000113],[-130.84915199999995,54.496941000000106],[-130.85583500000001,54.493881000000044],[-130.93695099999997,54.459434999999985],[-130.95166,54.454711999999972]],[[-79.667220999999927,54.76388500000013],[-79.726944000000003,54.752495000000067],[-79.710281000000009,54.76388500000013],[-79.703613000000018,54.766937000000041],[-79.611114999999984,54.79332700000009],[-79.587218999999948,54.799164000000019],[-79.624435000000005,54.779716000000121],[-79.631103999999993,54.776657000000114],[-79.637786999999946,54.773605000000032],[-79.659728999999913,54.766106000000036],[-79.667220999999927,54.76388500000013]],[[-130.26834099999991,54.714995999999985],[-130.370544,54.692214999999976],[-130.37887599999988,54.695267000000058],[-130.37609899999995,54.700546000000031],[-130.37109399999991,54.705269000000044],[-130.32693499999999,54.739716000000044],[-130.32110599999987,54.743881000000044],[-130.22415199999989,54.803046999999992],[-130.21749899999998,54.806380999999988],[-130.20944199999985,54.807770000000119],[-130.20694000000003,54.803046999999992],[-130.19860800000004,54.783607000000018],[-130.20056199999999,54.77748900000006],[-130.20971699999996,54.760551000000135],[-130.21362299999993,54.748329000000012],[-130.21722399999999,54.741661000000022],[-130.22222899999986,54.736938000000009],[-130.23388699999998,54.728874000000019],[-130.2611389999999,54.717209000000139],[-130.26834099999991,54.714995999999985]],[[-130.51834099999996,54.70249200000012],[-130.52722199999999,54.701935000000049],[-130.5386049999999,54.703880000000026],[-130.56750499999993,54.716934000000094],[-130.57443199999994,54.72026800000009],[-130.58526599999999,54.727767999999969],[-130.60803199999992,54.748329000000012],[-130.61053499999991,54.753052000000139],[-130.61166399999996,54.758049000000085],[-130.60665900000004,54.763054000000125],[-130.48803699999991,54.807495000000131],[-130.47998000000001,54.808883999999921],[-130.46945199999999,54.807770000000119],[-130.458618,54.800270000000069],[-130.44665499999996,54.787216000000001],[-130.44027699999992,54.778327999999988],[-130.43777499999993,54.773605000000032],[-130.43582199999997,54.763329000000113],[-130.43972799999989,54.75110600000005],[-130.45388799999989,54.719154000000117],[-130.45748900000001,54.712769000000094],[-130.46331799999996,54.708603000000039],[-130.51834099999996,54.70249200000012]],[[-57.940833999999938,54.911933999999974],[-57.985832000000016,54.870826999999963],[-57.98860899999994,54.86721],[-57.991942999999935,54.833878000000084],[-57.983886999999868,54.802215999999987],[-57.980277999999942,54.798607000000118],[-57.971663999999976,54.798050000000046],[-57.965553,54.799437999999952],[-57.958892999999989,54.803046999999992],[-57.955558999999994,54.805824000000086],[-57.923888999999974,54.823326000000122],[-57.871666000000005,54.83166499999993],[-57.864723000000026,54.832214000000079],[-57.859726000000023,54.83027600000014],[-57.843613000000005,54.820549000000028],[-57.841110000000015,54.816939999999988],[-57.841667000000029,54.81249200000002],[-57.848334999999963,54.806938000000059],[-57.875,54.79332700000009],[-57.881942999999922,54.790549999999996],[-58.022774000000027,54.755554000000018],[-58.031386999999995,54.753882999999973],[-58.040000999999961,54.75277699999998],[-58.04999499999991,54.753052000000139],[-58.119995000000017,54.755554000000018],[-58.139167999999927,54.757216999999969],[-58.15943900000002,54.76138300000008],[-58.174171000000001,54.767768999999987],[-58.176948999999979,54.770828000000108],[-58.172378999999978,54.797314000000085],[-58.184173999999985,54.808471999999938],[-58.219718999999941,54.825829000000056],[-58.222771000000023,54.83027600000014],[-58.224715999999944,54.83526599999999],[-58.225554999999986,54.850273000000016],[-58.225554999999986,54.862770000000012],[-58.224998000000028,54.866936000000067],[-58.218886999999938,54.875267000000008],[-58.215836000000024,54.878044000000102],[-58.209723999999937,54.877487000000031],[-58.049445999999932,54.893326000000116],[-57.967773000000022,54.919159000000036],[-57.942771999999991,54.924995000000138],[-57.94027699999998,54.923607000000004],[-57.938605999999993,54.918602000000135],[-57.940833999999938,54.911933999999974]],[[-79.125823999999909,54.897217000000012],[-79.134445000000028,54.895827999999995],[-79.235000999999954,54.896660000000111],[-79.515288999999939,54.840546000000074],[-79.660277999999948,54.805549999999926],[-79.763625999999988,54.771660000000054],[-79.774170000000026,54.773048000000131],[-79.776947000000007,54.778046000000131],[-79.773330999999985,54.783333000000084],[-79.768889999999942,54.787773000000072],[-79.725554999999986,54.818886000000077],[-79.714721999999995,54.826385000000073],[-79.686934999999949,54.838326000000052],[-79.656661999999983,54.846656999999993],[-79.467223999999931,54.888328999999999],[-79.458617999999944,54.88999200000012],[-79.430557000000022,54.892769000000044],[-79.419448999999872,54.892769000000044],[-79.339446999999893,54.896941999999967],[-79.164169000000015,54.925552000000039],[-79.053878999999995,54.946655000000078],[-79.041945999999882,54.945824000000073],[-79.015014999999948,54.938324000000023],[-79.015014999999948,54.932213000000104],[-79.027221999999995,54.925270000000125],[-79.05749499999996,54.917770000000075],[-79.102782999999988,54.903877000000023],[-79.125823999999909,54.897217000000012]],[[-58.675277999999992,54.914153999999996],[-58.68360899999999,54.913048000000003],[-58.752501999999993,54.915825000000041],[-58.757225000000005,54.916100000000085],[-58.760558999999887,54.920546999999942],[-58.759170999999981,54.926102000000071],[-58.754723000000013,54.932495000000017],[-58.701667999999927,54.999161000000015],[-58.697495000000004,55.003326000000015],[-58.691108999999983,55.006942999999978],[-58.684722999999906,55.008331000000055],[-58.676391999999908,55.009437999999989],[-58.660277999999948,55.0086060000001],[-58.653609999999901,55.005554000000018],[-58.652778999999953,55.00110600000005],[-58.657500999999968,54.996100999999953],[-58.662772999999902,54.992218000000037],[-58.658332999999971,54.962494000000049],[-58.656661999999983,54.94221500000009],[-58.658607000000018,54.932495000000017],[-58.663054999999986,54.922493000000031],[-58.668892000000028,54.917770000000075],[-58.675277999999992,54.914153999999996]],[[-130.38528400000001,54.769988999999953],[-130.39916999999997,54.764717000000019],[-130.40917999999999,54.767212000000086],[-130.41445899999997,54.770828000000108],[-130.45556599999998,54.813324000000136],[-130.45944199999997,54.81749700000006],[-130.46194499999996,54.822220000000073],[-130.459991,54.828330999999991],[-130.41833499999996,54.853324999999927],[-130.38528400000001,54.868881000000101],[-130.34304800000001,54.894996999999989],[-130.27029400000004,54.950272000000041],[-130.25,54.969711000000132],[-130.22778299999993,54.997214999999983],[-130.2133179999999,55.012496999999996],[-130.20083599999992,55.019714000000079],[-130.18499800000001,55.023323000000119],[-130.17529300000001,55.023048000000074],[-130.16833500000001,55.019714000000079],[-130.16500899999988,55.014160000000118],[-130.16027799999995,55.004439999999988],[-130.146973,54.975822000000051],[-130.14529399999998,54.965271000000143],[-130.14556899999997,54.959717000000126],[-130.14611799999994,54.954163000000108],[-130.14974999999998,54.947487000000024],[-130.16332999999997,54.931381000000044],[-130.27029400000004,54.830826000000002],[-130.38528400000001,54.769988999999953]],[[-82.964721999999995,55.263611000000083],[-82.970000999999968,55.259720000000016],[-83.014450000000011,55.269714000000022],[-83.031951999999876,55.273880000000133],[-83.035278000000005,55.278877000000023],[-83.027495999999928,55.281380000000013],[-83.016953000000001,55.281662000000097],[-82.990279999999984,55.280548000000124],[-82.980835000000013,55.278877000000023],[-82.963332999999977,55.273880000000133],[-82.96166999999997,55.269157000000121],[-82.964721999999995,55.263611000000083]],[[-77.592772999999909,55.435265000000129],[-77.633330999999998,55.424438000000123],[-77.644164999999873,55.425827000000083],[-77.449431999999945,55.533882000000062],[-77.336120999999991,55.604439000000127],[-77.323058999999944,55.610550000000046],[-77.221389999999928,55.653602999999919],[-77.213897999999915,55.65526600000004],[-77.205276000000026,55.65387700000008],[-77.199996999999939,55.65026899999998],[-77.201110999999912,55.64415699999995],[-77.210555999999997,55.639717000000132],[-77.252227999999945,55.618050000000096],[-77.389174999999966,55.546386999999982],[-77.452224999999942,55.512772000000098],[-77.474166999999966,55.498046999999929],[-77.484160999999915,55.489158999999972],[-77.49499499999996,55.481377000000009],[-77.500564999999938,55.478325000000098],[-77.55221599999993,55.453049000000021],[-77.592772999999909,55.435265000000129]],[[-60.970832999999914,55.869437999999946],[-60.98833499999995,55.86721],[-60.998336999999992,55.867767000000072],[-61.008895999999936,55.869156000000089],[-61.016944999999964,55.873046999999985],[-61.051666000000012,55.901100000000099],[-61.056664000000012,55.905823000000055],[-61.059165999999948,55.909988000000055],[-61.070557000000008,55.938599000000011],[-61.065551999999968,55.944153000000028],[-61.047782999999981,55.945541000000105],[-61.036948999999993,55.9447100000001],[-60.96805599999999,55.936652999999922],[-60.948607999999979,55.930549999999982],[-60.908332999999971,55.898330999999985],[-60.906386999999995,55.893326000000116],[-60.911109999999951,55.887772000000098],[-60.917503000000011,55.884163000000115],[-60.970832999999914,55.869437999999946]],[[-60.858611999999994,55.864716000000044],[-60.876105999999993,55.863883999999985],[-60.892501999999979,55.864441000000056],[-60.898612999999955,55.86721],[-60.902221999999995,55.871376000000112],[-60.900551000000007,55.876380999999981],[-60.873610999999869,55.94360400000005],[-60.869995000000017,55.949432000000002],[-60.86500499999994,55.95277400000009],[-60.851944000000003,55.95526899999993],[-60.748336999999935,55.944153000000028],[-60.74138599999992,55.942764000000011],[-60.742500000000007,55.939156000000082],[-60.747498000000007,55.931663999999955],[-60.691939999999875,55.925270000000125],[-60.68638599999997,55.92193600000013],[-60.688048999999978,55.917213000000118],[-60.692771999999991,55.911658999999986],[-60.705001999999979,55.903046000000018],[-60.718604999999911,55.896385000000066],[-60.756393000000003,55.880272000000048],[-60.778610000000015,55.876099000000067],[-60.840836000000024,55.86610399999995],[-60.858611999999994,55.864716000000044]],[[-79.123046999999929,55.789993000000038],[-79.130553999999961,55.788887000000045],[-79.135559000000001,55.789162000000033],[-79.137786999999946,55.790549999999939],[-79.136123999999938,55.794158999999979],[-79.131667999999934,55.799995000000024],[-79.126099000000011,55.803879000000052],[-79.121932999999956,55.808601000000124],[-79.108886999999925,55.823883000000137],[-79.102782999999988,55.833054000000118],[-79.039168999999958,55.952492000000063],[-79.03083799999996,55.968596999999932],[-79.027221999999995,55.976935999999966],[-79.022232000000031,55.996384000000091],[-79.009353999999973,56.063614000000086],[-78.960007000000019,56.083054000000061],[-78.957503999999972,56.083602999999982],[-78.952788999999939,56.080826000000116],[-78.949157999999898,56.071663000000115],[-78.939712999999983,56.02526899999998],[-79.054442999999935,55.865547000000049],[-79.089995999999985,55.816939999999988],[-79.104445999999996,55.80082700000014],[-79.116652999999985,55.792496000000028],[-79.123046999999929,55.789993000000038]],[[-60.943329000000006,56.006660000000011],[-61.040557999999976,56.005272000000105],[-61.0819469999999,56.011382999999967],[-61.141387999999949,56.020545999999968],[-61.17111199999988,56.028602999999976],[-61.18721800000003,56.033882000000119],[-61.215836000000024,56.046387000000038],[-61.220832999999971,56.050827000000083],[-61.228333000000021,56.06332400000008],[-61.232772999999952,56.072769000000108],[-61.233611999999994,56.085548000000017],[-61.232772999999952,56.091103000000089],[-61.226944000000003,56.098045000000013],[-61.217498999999975,56.100547999999947],[-61.211670000000026,56.101387000000102],[-61.08916499999998,56.169991000000095],[-61.059165999999948,56.159714000000122],[-61.045836999999892,56.153877000000136],[-60.944442999999978,56.094993999999986],[-60.943610999999976,56.090271000000143],[-60.934440999999993,56.015830999999935],[-60.934722999999963,56.011382999999967],[-60.943329000000006,56.006660000000011]],[[-61.623610999999983,56.399993999999992],[-61.546668999999952,56.390830999999991],[-61.493057000000022,56.404991000000052],[-61.482773000000009,56.406654000000003],[-61.474716000000001,56.406654000000003],[-61.468329999999924,56.404433999999981],[-61.415275999999949,56.376656000000025],[-61.411667000000023,56.372214999999926],[-61.411109999999951,56.367210000000057],[-61.412216000000001,56.326659999999947],[-61.416106999999954,56.322220000000129],[-61.424171000000001,56.32027400000004],[-61.482773000000009,56.309990000000028],[-61.569449999999904,56.320549000000085],[-61.579726999999991,56.322494999999947],[-61.599723999999924,56.32777399999992],[-61.686385999999857,56.352776000000063],[-61.719993999999986,56.365829000000019],[-61.788895000000025,56.405822999999998],[-61.793335000000013,56.408882000000119],[-61.796111999999937,56.41304800000006],[-61.790557999999919,56.415824999999927],[-61.783889999999872,56.415824999999927],[-61.677779999999927,56.405548000000124],[-61.623610999999983,56.399993999999992]],[[-78.839995999999928,56.129990000000078],[-78.927490000000034,56.113884000000098],[-78.933318999999983,56.115547000000049],[-78.930556999999965,56.128601000000117],[-78.916945999999996,56.172493000000145],[-78.908339999999896,56.182495000000131],[-78.903884999999946,56.187209999999993],[-78.883330999999998,56.201935000000105],[-78.846389999999985,56.2347180000001],[-78.830291999999929,56.253326000000129],[-78.825287000000003,56.262772000000098],[-78.813323999999966,56.304709999999943],[-78.809432999999956,56.338882000000126],[-78.813888999999961,56.343323000000055],[-78.834732000000031,56.345543000000021],[-78.832503999999915,56.350829999999974],[-78.762512000000015,56.424713000000111],[-78.751403999999923,56.432495000000074],[-78.731673999999941,56.440544000000102],[-78.694992000000013,56.443878000000097],[-78.686385999999914,56.443320999999969],[-78.667220999999984,56.439713000000097],[-78.661666999999966,56.436104000000057],[-78.660003999999958,56.430550000000096],[-78.650832999999921,56.289161999999976],[-78.652785999999935,56.241936000000067],[-78.655563000000029,56.223602000000142],[-78.676392000000021,56.181106999999997],[-78.688599000000011,56.172767999999962],[-78.839995999999928,56.129990000000078]],[[-79.626937999999996,56.265273999999977],[-79.635833999999988,56.264998999999989],[-79.636672999999973,56.266388000000006],[-79.636397999999872,56.269157000000121],[-79.609436000000017,56.319716999999969],[-79.538605000000018,56.433051999999975],[-79.53443900000002,56.437491999999963],[-79.523894999999982,56.442764000000068],[-79.511123999999938,56.446381000000031],[-79.496947999999975,56.448601000000053],[-79.492217999999923,56.446937999999932],[-79.490554999999915,56.440826000000129],[-79.510833999999932,56.397491000000002],[-79.557769999999891,56.305267000000015],[-79.561110999999926,56.299164000000076],[-79.565552000000025,56.293884000000048],[-79.569457999999997,56.289992999999981],[-79.619445999999868,56.267211999999972],[-79.626937999999996,56.265273999999977]],[[-79.619995000000017,56.385268999999994],[-79.638061999999991,56.360550000000046],[-79.649444999999957,56.346382000000006],[-79.663329999999974,56.333878000000141],[-79.682495000000017,56.317496999999946],[-79.701110999999969,56.306381000000044],[-79.714447000000007,56.299995000000081],[-79.906661999999926,56.227211000000125],[-79.928328999999962,56.219711000000075],[-79.986114999999984,56.199715000000083],[-80.01916499999993,56.191376000000048],[-80.060546999999985,56.18443300000007],[-80.082503999999915,56.186653000000092],[-80.092223999999987,56.188324000000136],[-80.100554999999986,56.191376000000048],[-80.107497999999907,56.194992000000127],[-80.109726000000023,56.197768999999994],[-80.110275000000001,56.203323000000012],[-80.100280999999995,56.239158999999972],[-80.098617999999874,56.244156000000089],[-80.055267000000015,56.303604000000121],[-80.044448999999929,56.310822000000144],[-80.040558000000033,56.312767000000122],[-80.022506999999962,56.319716999999969],[-79.867492999999968,56.357498000000135],[-79.795546999999942,56.366661000000136],[-79.756667999999991,56.361937999999952],[-79.72444200000001,56.362770000000069],[-79.69888299999991,56.368880999999988],[-79.679169000000002,56.378326000000015],[-79.656386999999995,56.392769000000101],[-79.642501999999979,56.404433999999981],[-79.618880999999931,56.426941000000056],[-79.614440999999999,56.431664000000069],[-79.604171999999949,56.444153000000085],[-79.598052999999936,56.454437000000098],[-79.591384999999946,56.469154000000117],[-79.588333000000034,56.493881000000044],[-79.585281000000009,56.499161000000072],[-79.582503999999915,56.501663000000008],[-79.549728000000016,56.525269000000037],[-79.543334999999956,56.527771000000143],[-79.542770000000019,56.522217000000126],[-79.549438000000009,56.508049000000085],[-79.613891999999964,56.39527099999998],[-79.619995000000017,56.385268999999994]],[[-61.435829000000012,56.541382000000112],[-61.168059999999969,56.474709000000018],[-61.149993999999992,56.445540999999992],[-61.148887999999943,56.441101000000003],[-61.154442000000017,56.438599000000067],[-61.163612000000001,56.436653000000035],[-61.181945999999925,56.435265000000129],[-61.200278999999966,56.435265000000129],[-61.220832999999971,56.435546999999985],[-61.517501999999865,56.446937999999932],[-61.609169000000009,56.46166199999999],[-61.630553999999961,56.465270999999973],[-61.642226999999991,56.486382000000049],[-61.637221999999952,56.489716000000044],[-61.629997000000003,56.490547000000049],[-61.546394000000021,56.488044999999943],[-61.538612000000001,56.485824999999977],[-61.525832999999864,56.478874000000019],[-61.512778999999966,56.474991000000102],[-61.438048999999921,56.476379000000009],[-61.423057999999969,56.479156000000103],[-61.417777999999998,56.483330000000137],[-61.418335000000013,56.488327000000027],[-61.422501000000011,56.490547000000049],[-61.455276000000026,56.496383999999978],[-61.496666000000005,56.500000000000057],[-61.527221999999938,56.501663000000008],[-61.624167999999997,56.503882999999973],[-61.633330999999998,56.506386000000134],[-61.634445000000028,56.512497000000053],[-61.631942999999978,56.51638800000012],[-61.602225999999916,56.552773000000059],[-61.595832999999971,56.556380999999988],[-61.588332999999977,56.558044000000052],[-61.576667999999984,56.557769999999948],[-61.561667999999941,56.554161000000136],[-61.558051999999975,56.55193300000002],[-61.525947999999971,56.550212999999985],[-61.459166999999923,56.54583000000008],[-61.435829000000012,56.541382000000112]],[[-79.021666999999923,56.426941000000056],[-79.009445000000028,56.426383999999985],[-78.98832699999997,56.426941000000056],[-78.949157999999898,56.43082400000003],[-78.943054000000018,56.430550000000096],[-78.93582200000003,56.428878999999995],[-78.928878999999938,56.425827000000083],[-78.92471299999994,56.419441000000006],[-78.922775000000001,56.415268000000026],[-78.921111999999994,56.409714000000065],[-78.920546999999942,56.403320000000008],[-78.923049999999932,56.386940000000095],[-78.93638599999997,56.317496999999946],[-78.943328999999949,56.284996000000035],[-78.949996999999939,56.282493999999986],[-78.955276000000026,56.27915999999999],[-78.961394999999868,56.271378000000027],[-79.029174999999952,56.172493000000145],[-79.06138599999997,56.124435000000005],[-79.071670999999981,56.104996000000085],[-79.085007000000019,56.07749200000012],[-79.094161999999983,56.054993000000138],[-79.129990000000021,55.989432999999963],[-79.175277999999935,55.92332499999992],[-79.195266999999944,55.891937000000098],[-79.203613000000018,55.894157000000121],[-79.166267000000005,55.973881000000006],[-79.122116000000005,56.046715000000006],[-79.061935000000005,56.148605000000032],[-79.022781000000009,56.202492000000007],[-79.008895999999993,56.221656999999936],[-78.990829000000019,56.261664999999994],[-78.985824999999977,56.273605000000089],[-78.972777999999948,56.306656000000032],[-78.970275999999956,56.314156000000082],[-78.967772999999909,56.323608000000036],[-78.966109999999901,56.336105000000032],[-78.970275999999956,56.378043999999989],[-78.97084000000001,56.3836060000001],[-78.977218999999991,56.388602999999989],[-78.983321999999987,56.389716999999962],[-78.998885999999914,56.384163000000001],[-79.043334999999956,56.360550000000046],[-79.055267000000015,56.344437000000028],[-79.062209999999993,56.329720000000009],[-79.089172000000019,56.267769000000044],[-79.091109999999958,56.263054000000011],[-79.093062999999972,56.256943000000092],[-79.092948999999976,56.231716000000006],[-79.095443999999986,56.2190480000001],[-79.093948000000012,56.213717999999972],[-79.092781000000002,56.211551999999983],[-79.089110999999946,56.211884000000111],[-79.083327999999995,56.174164000000019],[-79.212783999999999,55.954163000000108],[-79.236114999999927,55.917496000000085],[-79.259444999999914,55.886108000000092],[-79.275283999999999,55.870270000000062],[-79.283324999999991,55.864441000000056],[-79.286666999999852,55.866661000000079],[-79.286117999999988,55.869987000000094],[-79.278060999999923,55.885551000000021],[-79.267226999999934,55.903046000000018],[-79.226668999999958,55.962493999999992],[-79.183608999999933,56.037497999999971],[-79.139998999999932,56.115273000000116],[-79.133895999999993,56.126656000000082],[-79.132721000000004,56.175770000000057],[-79.138564999999858,56.205269000000101],[-79.139724999999999,56.20776699999999],[-79.143561999999974,56.211266000000137],[-79.15055799999999,56.233046999999999],[-79.160552999999993,56.231377000000066],[-79.170272999999952,56.225548000000003],[-79.205565999999976,56.190826000000015],[-79.243880999999988,56.151100000000042],[-79.256393000000003,56.13110400000005],[-79.270844000000011,56.104712999999947],[-79.277495999999985,56.090828000000045],[-79.284164000000033,56.078049000000021],[-79.299727999999959,56.051658999999972],[-79.309158000000025,56.036385000000109],[-79.323623999999938,56.016936999999984],[-79.358611999999937,55.974434000000088],[-79.452498999999989,55.879990000000134],[-79.479996000000028,55.863883999999985],[-79.493056999999965,55.858887000000038],[-79.500564999999995,55.856659000000093],[-79.510559000000001,55.855553000000043],[-79.520279000000016,55.854713000000004],[-79.532500999999968,55.854996000000142],[-79.567779999999971,55.864716000000044],[-79.593886999999938,55.874435000000062],[-79.604996000000028,55.881660000000124],[-79.78195199999999,55.78804800000006],[-79.763061999999934,55.814156000000025],[-79.598052999999936,55.981658999999979],[-79.486937999999952,56.087212000000022],[-79.474716000000001,56.098327999999981],[-79.470275999999956,56.104439000000013],[-79.470551,56.112770000000125],[-79.472504000000015,56.11693600000001],[-79.478881999999999,56.123322000000087],[-79.497222999999963,56.133605999999986],[-79.513061999999991,56.134995000000117],[-79.523055999999997,56.133880999999974],[-79.537216000000001,56.12971500000009],[-79.550277999999935,56.123322000000087],[-79.567504999999983,56.112770000000125],[-79.59722899999997,56.091377000000023],[-79.645003999999972,56.050545],[-79.819457999999941,55.901100000000099],[-79.831680000000006,55.88999200000012],[-79.846663999999976,55.874161000000129],[-79.858046999999999,55.859993000000088],[-79.863892000000021,55.850830000000087],[-79.865829000000019,55.847214000000008],[-79.909164000000033,55.840546000000074],[-79.985824999999977,55.898048000000017],[-79.961944999999957,55.960274000000027],[-79.774444999999957,56.112213000000054],[-79.668059999999912,56.189987000000031],[-79.648620999999991,56.198326000000066],[-79.642226999999991,56.201385000000073],[-79.587783999999999,56.230270000000132],[-79.536330999999961,56.295052000000055],[-79.526839999999993,56.304214000000115],[-79.516173999999978,56.319881000000066],[-79.494666999999993,56.367214000000047],[-79.48733500000003,56.402714000000117],[-79.458892999999875,56.464157],[-79.458617999999944,56.468323000000112],[-79.458617999999944,56.478600000000085],[-79.466109999999958,56.498878000000104],[-79.474441999999954,56.521102999999982],[-79.471389999999928,56.544441000000063],[-79.466109999999958,56.54833200000013],[-79.456664999999987,56.55332199999998],[-79.448883000000023,56.554435999999953],[-79.445267000000001,56.553604000000064],[-79.441939999999875,56.551384000000041],[-79.438599000000011,56.547775000000058],[-79.418334999999956,56.490829000000076],[-79.419448999999872,56.443603999999937],[-79.443000999999981,56.393436000000008],[-79.474998000000028,56.320438000000138],[-79.531386999999995,56.206940000000145],[-79.514450000000011,56.186378000000047],[-79.461670000000026,56.193321000000026],[-79.438889000000017,56.197212000000093],[-79.427215999999987,56.203049000000078],[-79.416397000000018,56.212212000000079],[-79.413054999999986,56.216660000000047],[-79.309998000000007,56.424163999999962],[-79.301101999999958,56.447212000000036],[-79.298049999999932,56.459435000000099],[-79.293335000000013,56.488044999999943],[-79.291672000000005,56.498878000000104],[-79.286391999999921,56.570273999999984],[-79.139998999999932,56.546386999999982],[-79.133057000000008,56.542770000000019],[-79.129990000000021,56.537773000000072],[-79.125548999999978,56.514159999999947],[-79.121932999999956,56.495543999999938],[-79.119995000000017,56.489989999999977],[-79.111938000000009,56.47526600000009],[-79.099990999999989,56.463051000000007],[-79.091384999999889,56.454437000000098],[-79.075561999999934,56.444153000000085],[-79.055557000000022,56.433876000000112],[-79.038895000000025,56.428878999999995],[-79.021666999999923,56.426941000000056]],[[-79.141952999999944,56.616661000000079],[-79.15194699999995,56.616386000000091],[-79.260009999999966,56.628044000000102],[-79.268889999999999,56.629158000000075],[-79.274719000000005,56.632209999999986],[-79.277495999999985,56.637215000000026],[-79.279998999999975,56.648880000000133],[-79.280288999999982,56.654990999999995],[-79.275009000000011,56.667213000000004],[-79.271941999999967,56.67193600000013],[-79.254729999999881,56.679993000000138],[-79.244155999999919,56.682495000000017],[-79.218886999999938,56.684990000000028],[-79.208892999999989,56.683876000000055],[-79.193603999999937,56.678329000000133],[-79.160004000000015,56.65776800000009],[-79.151108000000022,56.649994000000106],[-79.141678000000013,56.635826000000066],[-79.138061999999991,56.626099000000124],[-79.138901000000033,56.619986999999924],[-79.141952999999944,56.616661000000079]],[[-61.1875,56.586104999999975],[-61.211670000000026,56.581664999999987],[-61.217498999999975,56.58277099999998],[-61.222770999999966,56.588882000000069],[-61.231667000000016,56.611663999999962],[-61.231941000000006,56.61971299999999],[-61.226104999999961,56.626656000000025],[-61.165832999999964,56.684433000000126],[-61.159163999999919,56.688324000000023],[-61.150276000000019,56.689430000000073],[-61.131942999999978,56.68721000000005],[-61.0819469999999,56.678878999999938],[-61.0777819999999,56.674995000000138],[-61.057776999999987,56.628875999999991],[-61.059440999999993,56.626380999999981],[-61.06361400000003,56.624160999999958],[-61.103888999999867,56.606658999999922],[-61.1875,56.586104999999975]],[[-79.560821999999973,56.617767000000129],[-79.567504999999983,56.615273000000002],[-79.573333999999988,56.618881000000101],[-79.583618000000001,56.648048000000017],[-79.583892999999932,56.65277100000003],[-79.589995999999985,56.768326000000002],[-79.587508999999898,56.788886999999988],[-79.581679999999949,56.80721299999999],[-79.578339000000028,56.81249200000002],[-79.57417299999986,56.815825999999959],[-79.567504999999983,56.817772000000048],[-79.516662999999937,56.78555300000005],[-79.496384000000035,56.766936999999984],[-79.476943999999946,56.72165700000005],[-79.474716000000001,56.689156000000139],[-79.486114999999984,56.658043000000134],[-79.488891999999964,56.655548000000067],[-79.560821999999973,56.617767000000129]],[[-79.881942999999978,56.743607000000054],[-79.888610999999969,56.741104000000064],[-79.904723999999987,56.741661000000136],[-79.923889000000031,56.751389000000017],[-79.930831999999953,56.754997000000117],[-79.941101000000003,56.763610999999969],[-79.944442999999922,56.767769000000101],[-79.947494999999947,56.773323000000119],[-79.957229999999925,56.799164000000019],[-79.958892999999932,56.805267000000129],[-79.958618000000001,56.811377999999991],[-79.954726999999934,56.823607999999922],[-79.945830999999998,56.833603000000039],[-79.919158999999922,56.858330000000137],[-79.915008999999998,56.861382000000049],[-79.865829000000019,56.866104000000121],[-79.858046999999999,56.865829000000133],[-79.843886999999995,56.858330000000137],[-79.83444199999991,56.852492999999981],[-79.819457999999941,56.84027100000003],[-79.81639100000001,56.835548000000017],[-79.814712999999927,56.829162999999994],[-79.81361400000003,56.816939999999988],[-79.833892999999989,56.793610000000001],[-79.83805799999999,56.788886999999988],[-79.872222999999906,56.752220000000023],[-79.876663000000008,56.747772000000055],[-79.881942999999978,56.743607000000054]],[[-79.750564999999938,56.905823000000055],[-79.717498999999918,56.813605999999993],[-79.71833799999996,56.80721299999999],[-79.721114999999884,56.802773000000002],[-79.725554999999986,56.798049999999989],[-79.730834999999956,56.794158999999922],[-79.749725000000012,56.783607000000131],[-79.757507000000032,56.781936999999971],[-79.781113000000005,56.784721000000104],[-79.78832999999986,56.785828000000038],[-79.793555999999967,56.795792000000063],[-79.794373000000007,56.832947000000104],[-79.793143999999984,56.859890000000064],[-79.82376899999997,56.895003999999972],[-79.852753000000007,56.885204000000044],[-79.894164999999873,56.881935000000112],[-79.897506999999962,56.884995000000004],[-79.89805599999994,56.891106000000036],[-79.896118000000001,56.897217000000126],[-79.892776000000026,56.90248900000006],[-79.858611999999937,56.938599000000011],[-79.851943999999946,56.940268999999944],[-79.808333999999945,56.948326000000122],[-79.799438000000009,56.949431999999945],[-79.790833000000021,56.947769000000051],[-79.784164000000033,56.940826000000072],[-79.753615999999965,56.910820000000001],[-79.750564999999938,56.905823000000055]],[[-61.429211000000009,56.929707000000008],[-61.397204999999985,56.927715000000035],[-61.37261199999989,56.930972999999994],[-61.354888999999957,56.93639799999994],[-61.343319000000008,56.934227000000078],[-61.340785999999866,56.930248000000006],[-61.355277999999998,56.910820000000001],[-61.400275999999963,56.884720000000129],[-61.404716000000008,56.87971500000009],[-61.399444999999957,56.875824000000023],[-61.378052000000025,56.871658000000139],[-61.360282999999924,56.866104000000121],[-61.352225999999973,56.857773000000066],[-61.355834999999956,56.852776000000119],[-61.361670999999944,56.848045000000013],[-61.375831999999946,56.840546000000018],[-61.443168999999898,56.817719000000125],[-61.48966999999999,56.807549000000108],[-61.563331999999946,56.784721000000104],[-61.570281999999906,56.781661999999983],[-61.576949999999954,56.778046000000074],[-61.585555999999997,56.766388000000063],[-61.584998999999982,56.761383000000023],[-61.58277899999996,56.756660000000011],[-61.575561999999991,56.753052000000082],[-61.564720000000023,56.751663000000121],[-61.555831999999953,56.752777000000094],[-61.540839999999946,56.757773999999984],[-61.526664999999866,56.76527400000009],[-61.515282000000013,56.774712000000079],[-61.497653999999955,56.78694200000001],[-61.488975999999923,56.789295000000038],[-61.476315,56.79019900000003],[-61.434002000000021,56.783688000000097],[-61.393313999999918,56.778988000000027],[-61.386626999999976,56.775913000000003],[-61.382107000000019,56.771393000000103],[-61.373965999999996,56.74390800000009],[-61.368724999999984,56.695988],[-61.368632999999988,56.6857720000001],[-61.370804000000021,56.675282000000038],[-61.378399000000002,56.632607000000007],[-61.379119999999944,56.626820000000066],[-61.39358900000002,56.617779000000041],[-61.409137999999928,56.615608000000009],[-61.444217999999978,56.619587000000081],[-61.484000999999978,56.641647000000091],[-61.521975999999938,56.669857000000093],[-61.561034999999947,56.682513999999969],[-61.588157999999964,56.703853999999978],[-61.605334999999968,56.713798999999995],[-61.635353000000009,56.731518000000051],[-61.644393999999977,56.734775999999954],[-61.644031999999868,56.73802900000004],[-61.634991000000014,56.770938999999998],[-61.624865999999997,56.82591200000013],[-61.632098999999982,56.859547000000077],[-61.588698999999963,56.893539000000089],[-61.534812999999986,56.901859000000002],[-61.522517999999934,56.914879000000099],[-61.5261339999999,56.933323000000087],[-61.523963999999921,56.940193000000079],[-61.499370999999996,56.952849999999955],[-61.473694000000023,56.95900000000006],[-61.460673999999983,56.955021000000045],[-61.446571000000006,56.935131000000126],[-61.429211000000009,56.929707000000008]],[[-76.621108999999933,57.075554000000125],[-76.646956999999986,57.073050999999964],[-76.660278000000005,57.075828999999999],[-76.671386999999925,57.083327999999995],[-76.675551999999925,57.087769000000094],[-76.681106999999997,57.097771000000023],[-76.709732000000031,57.182213000000047],[-76.708617999999944,57.18832400000008],[-76.678329000000019,57.205269000000044],[-76.669998000000021,57.20249199999995],[-76.667496000000028,57.195541000000048],[-76.626099000000011,57.142769000000101],[-76.618880999999988,57.080276000000026],[-76.621108999999933,57.075554000000125]],[[-61.621666000000005,57.335548000000131],[-61.611114999999984,57.334991000000002],[-61.605559999999912,57.335548000000131],[-61.594443999999953,57.334159999999997],[-61.589995999999985,57.330275999999969],[-61.589438999999913,57.325272000000041],[-61.59194199999996,57.321380999999974],[-61.608337000000006,57.308327000000077],[-61.652221999999995,57.290549999999996],[-61.658051,57.290276000000063],[-61.734725999999966,57.290276000000063],[-61.739998000000014,57.291939000000013],[-61.753333999999938,57.302490000000091],[-61.763617999999951,57.311661000000072],[-61.766662999999937,57.315269000000001],[-61.767776000000026,57.319716999999969],[-61.768607999999915,57.324996999999996],[-61.767501999999979,57.328330999999991],[-61.752228000000002,57.360275000000001],[-61.74888599999997,57.365546999999935],[-61.74500299999994,57.369155999999975],[-61.726944000000003,57.374435000000119],[-61.702498999999989,57.372765000000129],[-61.693329000000006,57.368050000000096],[-61.677497999999957,57.357216000000051],[-61.632216999999912,57.337769000000037],[-61.621666000000005,57.335548000000131]],[[-76.715012000000002,57.292770000000019],[-76.72972099999987,57.289718999999991],[-76.734726000000023,57.291382000000112],[-76.740279999999984,57.294441000000063],[-76.744445999999982,57.299438000000009],[-76.793059999999969,57.374709999999936],[-76.821944999999914,57.419715999999994],[-76.823623999999995,57.424713000000111],[-76.821670999999981,57.429436000000067],[-76.812774999999931,57.428329000000133],[-76.78443900000002,57.41693900000007],[-76.761397999999986,57.40387700000008],[-76.735549999999989,57.386383000000137],[-76.731109999999944,57.381934999999999],[-76.725554999999986,57.372765000000129],[-76.721114999999941,57.356658999999979],[-76.708054000000004,57.29583000000008],[-76.715012000000002,57.292770000000019]],[[-61.655273000000022,57.391380000000083],[-61.675003000000004,57.389992000000007],[-61.839721999999995,57.408043000000134],[-61.860000999999954,57.412491000000102],[-61.877494999999954,57.418602000000021],[-61.889998999999989,57.426102000000071],[-61.894446999999957,57.42971799999998],[-61.897780999999952,57.433327000000133],[-61.900275999999963,57.437492000000134],[-61.897498999999982,57.444153000000085],[-61.813003999999921,57.473709000000042],[-61.772738999999945,57.495097999999984],[-61.742774999999995,57.534995999999978],[-61.737220999999977,57.536942000000067],[-61.719993999999986,57.536384999999996],[-61.648055999999997,57.530272999999966],[-61.643889999999999,57.522766000000047],[-61.634726999999998,57.509438000000046],[-61.613616999999977,57.416100000000142],[-61.615279999999984,57.409157000000107],[-61.634170999999924,57.398880000000133],[-61.648337999999967,57.393608000000029],[-61.655273000000022,57.391380000000083]],[[-61.878333999999995,57.46305099999995],[-61.926948999999979,57.45249200000012],[-61.937499999999943,57.453049000000021],[-61.946945000000028,57.454993999999999],[-61.955832999999927,57.458046000000081],[-61.962776000000019,57.462212000000022],[-62.012504999999919,57.508331000000112],[-62.021942000000024,57.521102999999925],[-62.02305599999994,57.534164000000033],[-62.020279000000016,57.540276000000063],[-62.014450000000011,57.549438000000123],[-61.992500000000007,57.569160000000011],[-61.974997999999971,57.581383000000073],[-61.968886999999995,57.584434999999985],[-61.953056000000004,57.59027100000003],[-61.944442999999978,57.590828000000101],[-61.878052000000025,57.584991000000002],[-61.855002999999954,57.580551000000128],[-61.833327999999995,57.574440000000038],[-61.817504999999926,57.567215000000033],[-61.783614999999941,57.550545000000056],[-61.781386999999995,57.548050000000046],[-61.778885000000002,57.543883999999935],[-61.77694699999995,57.52388000000002],[-61.777778999999953,57.518326000000059],[-61.779441999999904,57.513611000000026],[-61.783057999999869,57.508331000000112],[-61.864165999999955,57.466385000000116],[-61.878333999999995,57.46305099999995]],[[-79.797501000000011,57.418884000000048],[-79.801666000000012,57.415825000000098],[-79.805556999999965,57.418053000000043],[-79.835830999999985,57.460274000000084],[-79.826949999999897,57.53804800000006],[-79.808883999999978,57.561661000000015],[-79.792769999999962,57.578880000000083],[-79.749160999999958,57.609718000000044],[-79.740828999999962,57.615547000000106],[-79.734160999999915,57.618881000000044],[-79.727782999999931,57.61721],[-79.723052999999993,57.612770000000012],[-79.706116000000009,57.585548000000074],[-79.70666499999993,57.580826000000002],[-79.704726999999991,57.576660000000061],[-79.698607999999979,57.563324000000136],[-79.695830999999998,57.531661999999983],[-79.698607999999979,57.519989000000123],[-79.705001999999922,57.508605999999929],[-79.712508999999955,57.500548999999978],[-79.797501000000011,57.418884000000048]],[[-61.688605999999936,57.713051000000121],[-61.696105999999929,57.712212000000136],[-61.757506999999976,57.715546000000131],[-61.768889999999999,57.716934000000037],[-61.894164999999987,57.754166000000055],[-61.896950000000004,57.758331000000055],[-61.896110999999962,57.769714000000079],[-61.891669999999976,57.779160000000047],[-61.865836999999999,57.799721000000034],[-61.853614999999934,57.808327000000133],[-61.80889099999996,57.836936999999978],[-61.800551999999925,57.841377000000023],[-61.778885000000002,57.84526800000009],[-61.773055999999997,57.845543000000077],[-61.711113000000012,57.834160000000111],[-61.698607999999922,57.830276000000083],[-61.653610000000015,57.784721000000104],[-61.652221999999995,57.782494000000042],[-61.651664999999923,57.779433999999981],[-61.652495999999928,57.775826000000052],[-61.654166999999916,57.771103000000096],[-61.668609999999887,57.738884000000041],[-61.674171000000001,57.726936000000023],[-61.684440999999936,57.714996000000099],[-61.688605999999936,57.713051000000121]],[[-61.947494999999947,57.787216000000114],[-61.957222000000002,57.78694200000001],[-62.08916499999998,57.808043999999995],[-62.100280999999995,57.816101000000003],[-62.108337000000006,57.824715000000026],[-62.109443999999996,57.829437000000098],[-62.108054999999922,57.837769000000094],[-62.099723999999924,57.846382000000062],[-62.094443999999953,57.850547999999947],[-62.065276999999924,57.870544000000109],[-62.028884999999946,57.892768999999987],[-62.009170999999924,57.904434000000037],[-61.995002999999997,57.90915700000005],[-61.986114999999984,57.910271000000023],[-61.971663999999976,57.911377000000016],[-61.941108999999983,57.909988000000055],[-61.928336999999942,57.908599999999922],[-61.923332000000016,57.906096999999988],[-61.918891999999971,57.90248900000006],[-61.884444999999971,57.86693600000001],[-61.867774999999881,57.84276600000004],[-61.867774999999881,57.838600000000099],[-61.879439999999931,57.816665999999998],[-61.881942999999922,57.812767000000008],[-61.885558999999887,57.809157999999968],[-61.889998999999989,57.806381000000101],[-61.940833999999938,57.788886999999988],[-61.947494999999947,57.787216000000114]],[[-77.678328999999962,58.235549999999932],[-77.687774999999931,58.235268000000076],[-77.702788999999996,58.238884000000098],[-77.761123999999938,58.257499999999936],[-77.946380999999917,58.3211060000001],[-77.950835999999924,58.32416500000005],[-77.947495000000004,58.328605999999979],[-77.940551999999968,58.330551000000014],[-77.932495000000017,58.331383000000073],[-77.917312999999922,58.329369000000042],[-77.829726999999934,58.311378000000047],[-77.80749499999996,58.305267000000015],[-77.801392000000021,58.303046999999992],[-77.702788999999996,58.260277000000031],[-77.689437999999996,58.253882999999973],[-77.670273000000009,58.244156000000032],[-77.668334999999956,58.241936000000067],[-77.668334999999956,58.240547000000049],[-77.678328999999962,58.235549999999932]],[[-67.596114999999998,58.284164000000089],[-67.616394000000014,58.284164000000089],[-67.637786999999946,58.28472099999999],[-67.666106999999954,58.292770000000019],[-67.673888999999917,58.296104000000014],[-67.676666000000012,58.301384000000041],[-67.675827000000027,58.306099000000074],[-67.672775000000001,58.312209999999993],[-67.624435000000005,58.368050000000096],[-67.61999499999996,58.372215000000097],[-67.61082499999992,58.373877999999991],[-67.599166999999909,58.373046999999985],[-67.580565999999976,58.369986999999924],[-67.527221999999995,58.343605000000082],[-67.520844000000011,58.339989000000003],[-67.517501999999979,58.335266000000047],[-67.51916499999993,58.329719999999952],[-67.524445000000014,58.32416500000005],[-67.551102000000014,58.302215999999987],[-67.557220000000029,58.298050000000046],[-67.571670999999867,58.290833000000134],[-67.596114999999998,58.284164000000089]],[[-78.453888000000006,58.539993000000038],[-78.455565999999862,58.537215999999944],[-78.463332999999977,58.537498000000028],[-78.474716000000001,58.541382000000056],[-78.649993999999936,58.601386999999988],[-78.672501000000011,58.610549999999989],[-78.683884000000035,58.620827000000133],[-78.697495000000004,58.678329000000076],[-78.698607999999979,58.688599000000011],[-78.696944999999971,58.690543999999989],[-78.692764000000011,58.691933000000006],[-78.665008999999998,58.674995000000081],[-78.659163999999976,58.669991000000095],[-78.635284000000013,58.618598999999961],[-78.631942999999978,58.616386000000034],[-78.628051999999968,58.614158999999972],[-78.56639100000001,58.586104999999918],[-78.513061999999934,58.563880999999981],[-78.457229999999981,58.542770000000132],[-78.453888000000006,58.539993000000038]],[[-69.194442999999922,59.064712999999983],[-69.18638599999997,59.064437999999996],[-69.180831999999953,59.06721500000009],[-69.178328999999906,59.029715999999951],[-69.227218999999934,58.971931000000041],[-69.320281999999963,58.946381000000088],[-69.327498999999989,58.94499200000007],[-69.338897999999972,58.944434999999999],[-69.350280999999995,58.946381000000088],[-69.355559999999969,58.949715000000083],[-69.360000999999954,58.958603000000039],[-69.357223999999974,58.964714000000129],[-69.318344000000025,59.02555099999995],[-69.319457999999997,59.098045000000127],[-69.353057999999976,59.127213000000097],[-69.357773000000009,59.13499500000006],[-69.357223999999974,59.139717000000132],[-69.345550999999944,59.144714000000079],[-69.339447000000007,59.146103000000039],[-69.282227000000034,59.154433999999981],[-69.275283999999942,59.154991000000052],[-69.198607999999922,59.14527099999998],[-69.18638599999997,59.138329000000056],[-69.18249499999996,59.128601000000003],[-69.194991999999957,59.09415400000006],[-69.199996999999996,59.077217000000019],[-69.200561999999877,59.072495000000117],[-69.198607999999922,59.06721500000009],[-69.194442999999922,59.064712999999983]],[[-80.53443900000002,59.369438000000002],[-80.544158999999979,59.365547000000106],[-80.552215999999873,59.365829000000133],[-80.555832000000009,59.369438000000002],[-80.549437999999952,59.446938000000046],[-80.537506000000008,59.455268999999987],[-80.488051999999982,59.477486000000056],[-80.475554999999929,59.481102000000078],[-80.465011999999945,59.463882000000126],[-80.471389999999928,59.454994000000113],[-80.477218999999934,59.451103000000046],[-80.520844000000011,59.382767000000058],[-80.525283999999942,59.377486999999974],[-80.53443900000002,59.369438000000002]],[[-80.277495999999985,59.618599000000131],[-80.319167999999991,59.612213000000054],[-80.329726999999991,59.612495000000138],[-80.340560999999923,59.614158999999972],[-80.343886999999995,59.619156000000032],[-80.340835999999967,59.625267000000122],[-80.295273000000009,59.678329000000019],[-80.232773000000009,59.725265999999976],[-80.222228999999857,59.723602000000142],[-80.171386999999925,59.715271000000087],[-80.154175000000009,59.709991000000002],[-80.14527899999996,59.705550999999957],[-80.154723999999931,59.682495000000131],[-80.156661999999983,59.678329000000019],[-80.170546999999999,59.673881999999992],[-80.205840999999964,59.665267999999912],[-80.222777999999892,59.660271000000023],[-80.229720999999984,59.656380000000127],[-80.233063000000016,59.651100000000042],[-80.237212999999997,59.639434999999992],[-80.240554999999858,59.634163000000058],[-80.246384000000035,59.629990000000078],[-80.260833999999988,59.623604],[-80.277495999999985,59.618599000000131]],[[-64.019729999999925,59.714713999999958],[-64.124160999999958,59.695267000000115],[-64.134170999999981,59.695541000000048],[-64.146118000000001,59.696655000000021],[-64.157226999999978,59.699715000000083],[-64.16332999999986,59.703605999999979],[-64.204452999999944,59.734436000000017],[-64.192490000000021,59.765549000000021],[-64.121933000000013,59.849433999999974],[-64.115828999999962,59.852776000000063],[-64.107223999999974,59.854996000000085],[-64.067504999999926,59.863884000000041],[-64.061385999999914,59.864440999999943],[-64.052779999999984,59.859992999999974],[-64.049727999999959,59.855270000000019],[-64.047774999999945,59.849433999999974],[-64.055266999999958,59.835266000000104],[-64.054442999999992,59.829437000000041],[-64.042769999999905,59.783882000000062],[-64.020278999999903,59.781104999999968],[-64.002791999999943,59.774712000000022],[-63.959723999999937,59.75638600000002],[-63.959441999999967,59.752220000000136],[-63.99722300000002,59.723602000000142],[-64.011397999999872,59.716385000000059],[-64.019729999999925,59.714713999999958]],[[-80.089721999999938,59.751938000000052],[-80.166945999999996,59.742493000000024],[-80.177779999999984,59.744156000000089],[-80.184158000000025,59.747771999999998],[-80.184722999999963,59.752777000000037],[-80.128875999999991,59.82388300000008],[-80.11500499999994,59.837769000000037],[-80.103057999999976,59.844994000000099],[-80.015015000000005,59.884995000000117],[-80.00778200000002,59.886107999999979],[-79.946944999999914,59.880272000000105],[-79.937774999999931,59.877768999999944],[-79.929992999999911,59.873603999999943],[-79.884170999999924,59.85833000000008],[-79.878875999999991,59.854713000000118],[-79.883621000000005,59.849998000000085],[-79.906661999999926,59.828049000000135],[-79.922226000000023,59.815544000000045],[-79.928054999999972,59.811661000000072],[-80.025283999999942,59.764442000000088],[-80.089721999999938,59.751938000000052]],[[-64.427673000000027,60.372932000000048],[-64.452788999999996,60.357215999999994],[-64.442763999999897,60.309715000000097],[-64.438323999999966,60.305550000000096],[-64.423614999999984,60.282494000000042],[-64.429442999999935,60.281936999999971],[-64.438048999999864,60.282494000000042],[-64.448607999999979,60.284164000000033],[-64.50111400000003,60.301933000000133],[-64.521712999999977,60.310730000000035],[-64.541106999999954,60.324440000000038],[-64.557219999999916,60.331383000000017],[-64.601943999999889,60.350273000000016],[-64.610001000000011,60.353606999999954],[-64.632216999999912,60.357498000000021],[-64.643889999999942,60.357773000000066],[-64.655562999999972,60.357498000000021],[-64.666107000000011,60.356940999999949],[-64.675551999999982,60.355270000000075],[-64.710007000000019,60.358330000000137],[-64.728881999999999,60.363327000000083],[-64.790282999999931,60.391106000000093],[-64.815552000000025,60.406096999999988],[-64.831116000000009,60.419159000000036],[-64.867492999999911,60.450272000000041],[-64.868606999999997,60.453323000000069],[-64.868056999999965,60.458885000000009],[-64.856110000000001,60.473877000000016],[-64.84722899999997,60.478874000000133],[-64.837783999999999,60.482491000000039],[-64.823058999999944,60.485268000000133],[-64.639998999999989,60.4847180000001],[-64.61860699999994,60.477211000000011],[-64.426940999999943,60.401381999999955],[-64.423889000000031,60.397216999999955],[-64.422501000000011,60.391937000000098],[-64.423889000000031,60.383049000000085],[-64.427673000000027,60.372932000000048]],[[-68.25140399999998,60.230820000000051],[-68.310546999999985,60.223045000000127],[-68.340285999999992,60.223320000000001],[-68.361937999999952,60.225822000000051],[-68.376937999999996,60.232491000000095],[-68.387222000000008,60.240829000000076],[-68.393065999999976,60.249161000000072],[-68.394729999999981,60.254440000000045],[-68.395003999999972,60.259995000000117],[-68.393065999999976,60.276100000000042],[-68.384170999999924,60.29972100000009],[-68.37777699999998,60.310271999999998],[-68.314437999999996,60.390273999999977],[-68.175277999999992,60.53443900000002],[-68.129439999999931,60.570549000000085],[-68.119155999999919,60.577217000000076],[-68.092223999999987,60.581665000000044],[-68.081679999999949,60.582496999999989],[-68.035277999999948,60.581107999999972],[-67.999435000000005,60.57749200000012],[-67.956664999999987,60.566100999999946],[-67.948607999999922,60.561377999999991],[-67.887221999999952,60.503883000000087],[-67.862212999999997,60.488045000000056],[-67.839721999999995,60.478043000000071],[-67.831389999999999,60.474990999999989],[-67.821395999999993,60.472487999999998],[-67.808043999999938,60.467209000000025],[-67.803054999999972,60.463051000000064],[-67.79861499999987,60.457497000000103],[-67.794998000000021,60.447769000000051],[-67.795546999999942,60.443877999999984],[-67.79861499999987,60.432213000000104],[-67.806106999999997,60.417496000000085],[-67.815276999999924,60.408043000000077],[-67.836394999999925,60.388603000000103],[-67.841385000000002,60.384438000000102],[-67.853333000000021,60.375266999999951],[-67.885559000000001,60.353606999999954],[-67.898055999999997,60.345267999999919],[-67.934433000000013,60.321662999999944],[-67.965285999999992,60.30832700000002],[-67.97222899999997,60.30582400000003],[-68.167496000000028,60.245544000000109],[-68.17721599999993,60.243049999999982],[-68.205276000000026,60.238045000000113],[-68.25140399999998,60.230820000000051]],[[-64.689986999999917,60.584435000000099],[-64.697220000000016,60.582214000000022],[-64.704452999999944,60.582496999999989],[-64.712783999999942,60.590271000000143],[-64.713897999999915,60.59526800000009],[-64.713057999999876,60.598877000000073],[-64.710830999999985,60.602776000000119],[-64.615554999999858,60.681664000000069],[-64.610274999999945,60.685265000000129],[-64.599166999999966,60.689430000000129],[-64.592772999999909,60.685547000000042],[-64.590835999999967,60.676659000000029],[-64.592498999999975,60.666939000000127],[-64.593886999999995,60.648331000000098],[-64.59584000000001,60.645271000000037],[-64.620543999999995,60.616661000000022],[-64.631667999999991,60.60833000000008],[-64.638061999999934,60.604996000000085],[-64.689986999999917,60.584435000000099]],[[-78.656386999999995,60.702774000000034],[-78.664718999999991,60.702217000000132],[-78.674163999999962,60.704711999999972],[-78.689986999999974,60.712212000000079],[-78.694716999999912,60.716660000000047],[-78.698333999999988,60.721656999999936],[-78.697768999999937,60.724159000000043],[-78.616393999999957,60.771935000000099],[-78.573623999999995,60.784163999999919],[-78.399993999999992,60.809990000000028],[-78.223891999999978,60.830826000000059],[-78.21945199999999,60.823883000000023],[-78.219161999999983,60.817497000000117],[-78.221114999999998,60.814156000000082],[-78.226669000000015,60.808883999999978],[-78.277221999999995,60.769157000000121],[-78.285004000000015,60.766106000000093],[-78.397231999999917,60.743881000000044],[-78.62332200000003,60.705551000000128],[-78.656386999999995,60.702774000000034]],[[-69.977218999999991,60.933051999999975],[-69.983886999999982,60.93110699999994],[-69.995269999999948,60.931381000000101],[-70.003615999999965,60.935265000000072],[-70.007781999999963,60.939155999999969],[-70.026107999999965,60.995827000000077],[-70.025008999999955,61.001937999999996],[-70.021666999999866,61.008605999999986],[-70.016662999999994,61.013611000000026],[-70.009170999999867,61.017768999999987],[-70.003341999999918,61.020828000000108],[-69.982772999999895,61.028327999999988],[-69.964721999999995,61.032768000000033],[-69.954177999999956,61.033882000000006],[-69.943603999999993,61.031380000000127],[-69.931380999999931,61.020271000000037],[-69.929992999999854,61.016663000000108],[-69.929717999999923,61.010825999999952],[-69.930832000000009,61.00471500000009],[-69.933883999999921,60.998047000000099],[-69.977218999999991,60.933051999999975]],[[-64.723891999999921,61.53833000000003],[-64.71665999999999,61.535827999999981],[-64.706954999999994,61.536658999999986],[-64.688323999999909,61.535552999999993],[-64.683318999999869,61.531105000000025],[-64.675277999999992,61.508606000000043],[-64.674164000000019,61.503325999999959],[-64.686935000000005,61.465827999999988],[-64.705276000000026,61.444153000000142],[-64.715012000000002,61.433327000000077],[-64.820557000000008,61.355270000000075],[-64.866942999999992,61.324164999999994],[-64.870833999999945,61.32249500000006],[-64.875274999999988,61.32249500000006],[-64.887222000000008,61.324715000000026],[-64.972503999999958,61.344154000000117],[-64.977492999999924,61.34777100000008],[-64.985000999999954,61.367493000000138],[-65.179168999999945,61.466933999999981],[-65.18582200000003,61.47554800000006],[-65.187499999999943,61.480270000000132],[-65.190552000000025,61.494995000000074],[-65.195267000000001,61.499160999999958],[-65.295272999999895,61.528877000000023],[-65.329453000000001,61.531937000000084],[-65.353333000000021,61.534721000000047],[-65.37249799999995,61.537216000000058],[-65.381103999999993,61.540550000000053],[-65.47444200000001,61.586936999999978],[-65.481109999999887,61.590828000000045],[-65.487777999999935,61.599433999999974],[-65.486938000000009,61.610825000000091],[-65.485000999999954,61.62193300000007],[-65.482223999999974,61.62860100000006],[-65.472228999999857,61.64027400000009],[-65.466400000000021,61.644997000000046],[-65.459441999999854,61.649162000000047],[-65.453063999999983,61.651932000000102],[-65.449158000000011,61.653602999999976],[-65.441375999999934,61.656654000000003],[-65.43582200000003,61.658043000000021],[-65.339721999999938,61.670547000000056],[-65.247498000000007,61.68082400000003],[-65.174438000000009,61.686935000000119],[-65.068343999999968,61.693047000000092],[-65.036391999999921,61.693603999999993],[-65.018889999999885,61.692490000000021],[-65.016112999999962,61.692214999999976],[-64.99499499999996,61.689987000000031],[-64.733062999999959,61.659987999999998],[-64.719161999999983,61.658043000000021],[-64.646392999999932,61.603882000000112],[-64.646118000000001,61.599716000000001],[-64.650833000000034,61.594437000000028],[-64.65972899999997,61.588042999999971],[-64.662780999999995,61.587769000000037],[-64.714172000000019,61.556381000000044],[-64.720275999999956,61.551383999999928],[-64.726104999999961,61.542220999999927],[-64.723891999999921,61.53833000000003]],[[-65.695266999999888,61.776657],[-65.71945199999999,61.754165999999998],[-65.803054999999915,61.755554000000075],[-65.827224999999942,61.758049000000085],[-65.891388000000006,61.76638800000012],[-65.903885000000002,61.768326000000059],[-65.931106999999997,61.778328000000045],[-65.939163000000008,61.782210999999961],[-65.944442999999978,61.785828000000095],[-65.948043999999925,61.790276000000063],[-65.94749499999989,61.796104000000014],[-65.943877999999927,61.799720999999977],[-65.818344000000025,61.860825000000034],[-65.809432999999956,61.86332700000014],[-65.789992999999981,61.865547000000106],[-65.778060999999866,61.865547000000106],[-65.767501999999979,61.862770000000012],[-65.718613000000005,61.841102999999976],[-65.714721999999938,61.836937000000091],[-65.713622999999984,61.824165000000107],[-65.695266999999888,61.776657]],[[-92.963897999999972,61.879158000000075],[-92.995270000000005,61.851105000000132],[-93.00167799999997,61.847214000000065],[-93.051940999999943,61.829437000000041],[-93.07028200000002,61.825272000000041],[-93.079726999999991,61.826941999999974],[-93.086669999999913,61.829437000000041],[-93.115828999999962,61.860275000000001],[-93.120270000000005,61.864441000000113],[-93.126937999999882,61.868599000000074],[-93.135833999999988,61.872489999999914],[-93.14805599999994,61.87582400000008],[-93.179717999999923,61.875549000000092],[-93.189437999999996,61.874161000000015],[-93.211120999999935,61.875267000000008],[-93.218886999999995,61.87943300000012],[-93.223327999999981,61.888329000000056],[-93.226105000000018,61.908325000000048],[-93.223617999999931,61.913048000000003],[-93.218886999999995,61.918884000000048],[-93.20944199999991,61.921104000000071],[-93.072509999999909,61.929993000000138],[-93.062209999999993,61.930550000000039],[-92.96945199999999,61.888329000000056],[-92.962783999999999,61.884162999999944],[-92.963897999999972,61.879158000000075]],[[-64.916106999999954,61.719437000000084],[-64.926940999999943,61.718880000000013],[-64.951950000000011,61.722488000000112],[-65.14805599999994,61.780548000000067],[-65.156661999999926,61.783882000000062],[-65.210555999999883,61.816940000000045],[-65.214721999999881,61.821938000000046],[-65.251953000000015,61.869713000000047],[-65.255843999999968,61.885551000000078],[-65.255004999999926,61.901657000000057],[-65.249435000000005,61.91027100000008],[-65.245270000000005,61.914711000000125],[-65.189712999999983,61.945540999999992],[-65.170273000000009,61.947769000000108],[-65.156951999999876,61.946938000000102],[-65.080291999999929,61.931107000000111],[-65.074448000000018,61.928329000000133],[-65.06806899999998,61.923882000000049],[-65.039169000000015,61.899719000000118],[-64.980834999999956,61.885826000000066],[-64.893341000000021,61.829994000000113],[-64.886948000000018,61.825554000000068],[-64.828887999999893,61.766662999999994],[-64.825835999999981,61.761939999999981],[-64.825287000000003,61.758330999999998],[-64.828887999999893,61.752220000000079],[-64.83555599999994,61.748877999999991],[-64.858046999999942,61.739158999999972],[-64.889449999999954,61.725822000000107],[-64.906112999999948,61.721100000000035],[-64.916106999999954,61.719437000000084]],[[-65.852492999999924,62.084717000000012],[-65.869155999999919,62.079720000000123],[-65.889998999999989,62.080551000000128],[-65.913329999999974,62.084990999999945],[-66.009734999999978,62.116661000000079],[-66.016662999999994,62.120543999999995],[-66.020279000000016,62.124435000000062],[-66.021118000000001,62.128326000000129],[-66.020843999999954,62.131660000000124],[-66.014724999999942,62.136658000000125],[-65.991942999999935,62.141380000000026],[-65.928054999999972,62.151657],[-65.904449,62.152771000000143],[-65.853607000000011,62.131104000000107],[-65.845000999999911,62.124992000000134],[-65.83555599999994,62.115272999999945],[-65.835830999999928,62.099716000000114],[-65.843886999999995,62.088599999999985],[-65.852492999999924,62.084717000000012]],[[-92.223617999999931,62.355552999999986],[-92.306106999999997,62.351661999999919],[-92.339721999999995,62.354712999999947],[-92.34973100000002,62.356659000000036],[-92.371932999999956,62.386939999999925],[-92.372498000000007,62.391937000000041],[-92.354445999999939,62.410820000000115],[-92.347777999999948,62.414436000000023],[-92.319457999999941,62.415268000000083],[-92.308333999999945,62.414436000000023],[-92.162216000000001,62.402214000000015],[-92.139724999999999,62.399719000000005],[-92.141112999999905,62.394714000000135],[-92.15834000000001,62.390549000000135],[-92.223617999999931,62.355552999999986]],[[-79.540558000000033,62.411102000000028],[-79.449996999999939,62.382767000000001],[-79.442764000000011,62.379990000000078],[-79.433883999999978,62.371376000000055],[-79.429168999999945,62.361664000000076],[-79.427215999999987,62.356102000000135],[-79.424438000000009,62.344154000000117],[-79.420546999999942,62.339989000000116],[-79.359160999999972,62.296104000000071],[-79.347228999999913,62.288886999999988],[-79.328613000000018,62.283332999999971],[-79.272780999999952,62.262215000000083],[-79.266112999999962,62.258048999999971],[-79.260833999999988,62.253608999999983],[-79.256393000000003,62.244438000000002],[-79.255568999999923,62.23971599999993],[-79.261397999999929,62.163605000000018],[-79.262222000000008,62.158882000000062],[-79.329726999999991,62.01527400000009],[-79.353881999999999,61.999718000000144],[-79.396392999999932,61.968879999999956],[-79.457229999999925,61.893883000000017],[-79.461944999999957,61.881660000000011],[-79.465560999999923,61.876099000000124],[-79.524445000000014,61.811378000000104],[-79.541320999999925,61.799789000000089],[-79.552779999999927,61.796386999999982],[-79.568344000000025,61.790276000000063],[-79.583618000000001,61.783051],[-79.596664000000033,61.774436999999978],[-79.605269999999962,61.765273999999977],[-79.611114999999984,61.754440000000102],[-79.612777999999992,61.742767000000072],[-79.611938000000009,61.738045],[-79.608336999999949,61.732208000000014],[-79.606110000000001,61.726654000000053],[-79.605559999999969,61.721100000000035],[-79.607498000000021,61.708885000000123],[-79.628875999999934,61.669158999999979],[-79.632216999999969,61.664993000000038],[-79.642226999999991,61.655822999999998],[-79.65695199999999,61.642494000000113],[-79.740828999999962,61.588600000000099],[-79.75389100000001,61.580276000000026],[-79.761397999999929,61.576942000000031],[-79.779449,61.571938000000102],[-79.805831999999896,61.568054000000075],[-79.827788999999939,61.566665999999998],[-79.846114999999941,61.569992000000013],[-79.87110899999999,61.609717999999987],[-79.954178000000013,61.683601000000124],[-80.06806899999998,61.745270000000062],[-80.079453000000001,61.747772000000111],[-80.092223999999987,61.748046999999929],[-80.138610999999912,61.748604000000057],[-80.161941999999954,61.748604000000057],[-80.173324999999977,61.750275000000101],[-80.191665999999884,61.755554000000075],[-80.205276000000026,61.762772000000098],[-80.275283999999999,61.806656000000032],[-80.27806099999998,61.810272000000055],[-80.278884999999946,61.816382999999973],[-80.291381999999942,61.929993000000138],[-80.295273000000009,61.983604000000014],[-80.268616000000009,62.107215999999994],[-80.266662999999994,62.111382000000049],[-80.198607999999979,62.1988750000001],[-80.180283000000031,62.217491000000109],[-80.017501999999979,62.358604000000014],[-80.009445000000028,62.362495000000081],[-79.981383999999935,62.374161000000072],[-79.947220000000016,62.386108000000036],[-79.938048999999978,62.388603000000046],[-79.919723999999974,62.393051000000014],[-79.900283999999999,62.395828000000108],[-79.842772999999909,62.403603000000032],[-79.833617999999944,62.404160000000104],[-79.730834999999956,62.399162000000103],[-79.605559999999969,62.41304800000006],[-79.584166999999979,62.417213000000061],[-79.561934999999892,62.417213000000061],[-79.540558000000033,62.411102000000028]],[[-92.411117999999931,62.39388300000013],[-92.420546999999942,62.391663000000108],[-92.431380999999988,62.391663000000108],[-92.440825999999959,62.393608000000086],[-92.529175000000009,62.378326000000072],[-92.539443999999946,62.377212999999983],[-92.561385999999914,62.377486999999917],[-92.583892999999989,62.379990000000078],[-92.595839999999953,62.382491999999957],[-92.600554999999986,62.386939999999925],[-92.600280999999995,62.392494000000113],[-92.596953999999926,62.397774000000027],[-92.592772999999966,62.40248900000006],[-92.539992999999981,62.428329000000019],[-92.531112999999948,62.431380999999931],[-92.410278000000005,62.408882000000006],[-92.403884999999946,62.404709000000025],[-92.405563000000029,62.399436999999921],[-92.411117999999931,62.39388300000013]],[[-64.653884999999946,62.540833000000021],[-64.580840999999964,62.538605000000075],[-64.559722999999963,62.554161000000022],[-64.559998000000007,62.55860100000001],[-64.555556999999965,62.560822000000144],[-64.549727999999959,62.56221000000005],[-64.397506999999962,62.536385000000053],[-64.389724999999999,62.533882000000062],[-64.385284000000013,62.531105000000139],[-64.382767000000001,62.525825999999995],[-64.382767000000001,62.511383000000137],[-64.39416499999993,62.461379999999963],[-64.477218999999991,62.408043000000021],[-64.528609999999958,62.386658000000068],[-64.59056099999998,62.367210000000114],[-64.598891999999978,62.366385999999977],[-64.653610000000015,62.372490000000028],[-64.772781000000009,62.386383000000023],[-64.87110899999999,62.406380000000127],[-64.926666000000012,62.41832700000009],[-64.937209999999993,62.421103999999957],[-64.945830999999998,62.424438000000123],[-64.952498999999875,62.428329000000019],[-64.953887999999949,62.431380999999931],[-64.965835999999911,62.465827999999931],[-64.846114999999998,62.555267000000015],[-64.815552000000025,62.559714999999983],[-64.797500999999954,62.561378000000104],[-64.766953000000001,62.562767000000122],[-64.753066999999987,62.562492000000077],[-64.741669000000002,62.560822000000144],[-64.653884999999946,62.540833000000021]],[[-78.008347000000015,62.593605000000082],[-77.86721799999998,62.589157000000114],[-77.850554999999986,62.582771000000037],[-77.841674999999952,62.568054000000018],[-77.837783999999999,62.556938000000116],[-77.840835999999911,62.549995000000081],[-77.844726999999978,62.544716000000108],[-77.852782999999988,62.541664000000026],[-77.86221299999994,62.53943600000008],[-77.873046999999985,62.537773000000129],[-77.885009999999966,62.537498000000141],[-77.913054999999929,62.53943600000008],[-78.103333000000021,62.559158000000082],[-78.113051999999925,62.56221000000005],[-78.114440999999943,62.570549000000085],[-78.111664000000019,62.578049000000135],[-78.107772999999952,62.582771000000037],[-78.105835000000013,62.583328000000108],[-78.047500999999897,62.591934000000037],[-78.030838000000017,62.593323000000055],[-78.019164999999987,62.591934000000037],[-78.008347000000015,62.593605000000082]],[[-77.805267000000015,62.592491000000109],[-77.727218999999934,62.585822999999948],[-77.665832999999907,62.586655000000064],[-77.628052000000025,62.588326000000109],[-77.621384000000035,62.584435000000042],[-77.637787000000003,62.570831000000112],[-77.651108000000022,62.563881000000094],[-77.659164000000033,62.560822000000144],[-77.734725999999966,62.535827999999981],[-77.745270000000005,62.534163999999976],[-77.758620999999891,62.535553000000107],[-77.780288999999925,62.539161999999976],[-77.808608999999933,62.546660999999915],[-77.813613999999973,62.551102000000014],[-77.831116000000009,62.590271000000087],[-77.831679999999949,62.595825000000104],[-77.821121000000005,62.596099999999922],[-77.809433000000013,62.59415400000006],[-77.805267000000015,62.592491000000109]],[[-64.983063000000016,62.528046000000018],[-65.007232999999928,62.526382000000012],[-65.096389999999985,62.534996000000035],[-65.119720000000029,62.537498000000141],[-65.131942999999978,62.539719000000048],[-65.138061999999991,62.542770000000075],[-65.141677999999956,62.54694400000011],[-65.137787000000003,62.550544999999943],[-65.022507000000019,62.594994000000099],[-65.00306699999993,62.598877000000016],[-64.972503999999958,62.602493000000095],[-64.909163999999976,62.604438999999957],[-64.892501999999979,62.598877000000016],[-64.884734999999921,62.59415400000006],[-64.843886999999938,62.582771000000037],[-64.839447000000007,62.57777399999992],[-64.860824999999863,62.561378000000104],[-64.866104000000007,62.558044000000109],[-64.874435000000005,62.554709999999943],[-64.965285999999878,62.531380000000013],[-64.972778000000005,62.529716000000008],[-64.983063000000016,62.528046000000018]],[[-91.572783999999956,62.627487000000087],[-91.578612999999962,62.62193300000007],[-91.668059999999912,62.649162000000047],[-91.683059999999955,62.662209000000075],[-91.685546999999985,62.666939000000127],[-91.67582699999997,62.669159000000093],[-91.663329999999974,62.665543000000071],[-91.655272999999909,62.662209000000075],[-91.581954999999994,62.641380000000083],[-91.575561999999934,62.637215000000083],[-91.571121000000005,62.632767000000115],[-91.572783999999956,62.627487000000087]],[[-90.979995999999971,62.657767999999976],[-90.990279999999984,62.656654000000003],[-91.003341999999918,62.657211000000075],[-91.098891999999921,62.654433999999981],[-91.244719999999973,62.669991000000039],[-91.256393000000003,62.671936000000017],[-91.266952999999944,62.675552000000096],[-91.271117999999944,62.679992999999968],[-91.267226999999991,62.685546999999985],[-91.226944000000003,62.691658000000075],[-91.173049999999989,62.691375999999991],[-91.080291999999986,62.686935000000062],[-91.056106999999997,62.681664000000069],[-90.981673999999998,62.661376999999959],[-90.979995999999971,62.657767999999976]],[[-74.347778000000005,62.679436000000067],[-74.309998000000007,62.679161000000079],[-74.285552999999993,62.679992999999968],[-74.25028999999995,62.682495000000074],[-74.216109999999958,62.684990000000084],[-74.181670999999994,62.688880999999981],[-74.158889999999985,62.688880999999981],[-74.145843999999954,62.687767000000008],[-74.015839000000028,62.664993000000038],[-74.009170999999981,62.662490999999932],[-73.959732000000031,62.62082700000002],[-73.958054000000004,62.616661000000136],[-73.958054000000004,62.612495000000024],[-73.962508999999955,62.607772999999952],[-73.969727000000034,62.604163999999969],[-73.988602000000014,62.602218999999991],[-74.128875999999877,62.600829999999974],[-74.154448999999886,62.601105000000018],[-74.169158999999922,62.602218999999991],[-74.183608999999933,62.603882000000056],[-74.333618000000001,62.62943300000012],[-74.541381999999942,62.668327000000033],[-74.551102000000014,62.670829999999967],[-74.586394999999925,62.683051999999975],[-74.617217999999923,62.696098000000063],[-74.639724999999999,62.706383000000017],[-74.64973399999991,62.712769000000094],[-74.651397999999858,62.716934000000094],[-74.645844000000011,62.720824999999991],[-74.537215999999944,62.748878000000104],[-74.526671999999905,62.748878000000104],[-74.519164999999873,62.747772000000111],[-74.482772999999952,62.739716000000044],[-74.392226999999934,62.687210000000107],[-74.379989999999964,62.682495000000074],[-74.374160999999958,62.681381000000101],[-74.347778000000005,62.679436000000067]],[[-70.711670000000026,62.81499500000001],[-70.659728999999913,62.79833200000013],[-70.587783999999999,62.774162000000103],[-70.547500999999954,62.765273999999977],[-70.415557999999976,62.729156000000103],[-70.396956999999986,62.723045000000013],[-70.226104999999961,62.603049999999996],[-70.217772999999966,62.594437000000028],[-70.212218999999948,62.584160000000054],[-70.211120999999991,62.579163000000108],[-70.211945000000014,62.57777399999992],[-70.264724999999999,62.559158000000082],[-70.283324999999991,62.55443600000001],[-70.373610999999926,62.533332999999914],[-70.393065999999976,62.530273000000079],[-70.414444000000003,62.529434000000094],[-70.466659999999933,62.53166200000004],[-70.501113999999973,62.533607000000075],[-70.686385999999914,62.546104000000014],[-70.723891999999978,62.550270000000125],[-70.746383999999978,62.554709999999943],[-70.765015000000005,62.560547000000099],[-70.770844000000011,62.564712999999983],[-70.819732999999985,62.604713000000118],[-70.825011999999958,62.614441000000113],[-70.854445999999939,62.713608000000079],[-70.846663999999976,62.766106000000036],[-70.945540999999935,62.798050000000046],[-71.01916499999993,62.811934999999949],[-71.032500999999968,62.81249200000002],[-71.043334999999956,62.811934999999949],[-71.051665999999955,62.810547000000042],[-71.106383999999935,62.80082700000014],[-71.141113000000018,62.794998000000135],[-71.148620999999935,62.794998000000135],[-71.15834000000001,62.797217999999987],[-71.176101999999958,62.809158000000082],[-71.240554999999972,62.876380999999981],[-71.241378999999995,62.881378000000097],[-71.236389000000031,62.886658000000125],[-71.229445999999882,62.888046000000031],[-71.191100999999946,62.884720000000016],[-71.073897999999929,62.871933000000013],[-70.788054999999929,62.836104999999975],[-70.760283999999956,62.829994000000056],[-70.711670000000026,62.81499500000001]],[[-66.368331999999953,62.83526599999999],[-66.373885999999857,62.833603000000096],[-66.386123999999995,62.834434999999985],[-66.490279999999984,62.855270000000132],[-66.505279999999971,62.861382000000106],[-66.601669000000015,62.906654000000117],[-66.593886999999938,62.911934000000031],[-66.574172999999973,62.913048000000003],[-66.547775000000001,62.910545000000013],[-66.540282999999931,62.907493999999986],[-66.441939999999988,62.871101000000124],[-66.377776999999924,62.843322999999998],[-66.370270000000005,62.839713999999958],[-66.368331999999953,62.83526599999999]],[[-81.87110899999999,62.928329000000133],[-81.865554999999972,62.923324999999977],[-81.864165999999955,62.919990999999982],[-81.90695199999999,62.866386000000091],[-81.926101999999958,62.744156000000032],[-81.924712999999997,62.739158999999972],[-81.923889000000031,62.733046999999942],[-81.924164000000019,62.728325000000041],[-81.926101999999958,62.723602000000085],[-81.929169000000002,62.719437000000084],[-81.938598999999954,62.709991000000116],[-81.958892999999989,62.697768999999937],[-81.973052999999993,62.689713000000097],[-82.102218999999991,62.629158000000132],[-82.1875,62.599433999999917],[-82.277785999999935,62.584160000000054],[-82.286941999999897,62.581664999999987],[-82.315552000000025,62.571663000000058],[-82.369155999999919,62.547493000000031],[-82.381667999999991,62.53943600000008],[-82.387786999999946,62.534721000000047],[-82.40194699999995,62.520546000000138],[-82.40834000000001,62.509720000000016],[-82.408889999999928,62.496657999999968],[-82.414444000000003,62.478043000000071],[-82.425811999999951,62.469986000000063],[-82.442214999999919,62.458603000000096],[-82.449722000000008,62.455269000000101],[-82.499434999999949,62.438599000000124],[-82.533889999999985,62.428604000000064],[-82.551940999999999,62.423881999999992],[-82.583617999999944,62.412766000000033],[-82.621384000000035,62.395271000000037],[-82.641113000000018,62.385269000000051],[-82.647232000000031,62.38110400000005],[-82.670273000000009,62.35943600000013],[-82.688599000000011,62.341103000000089],[-82.713057999999933,62.321381000000031],[-82.731383999999935,62.309990000000084],[-82.743606999999997,62.302489999999977],[-82.769164999999987,62.290276000000006],[-82.985549999999989,62.209717000000126],[-83.001953000000015,62.204437000000041],[-83.087783999999999,62.178879000000109],[-83.121932999999956,62.173050000000103],[-83.136397999999986,62.173050000000103],[-83.143889999999999,62.176659000000086],[-83.150832999999977,62.182770000000005],[-83.15943900000002,62.198600999999996],[-83.168059999999912,62.207497000000103],[-83.176392000000021,62.213051000000064],[-83.198607999999979,62.222214000000065],[-83.249435000000005,62.240829000000019],[-83.275832999999977,62.248604000000114],[-83.308043999999882,62.252777000000037],[-83.322784000000013,62.253052000000082],[-83.337783999999942,62.252219999999966],[-83.359726000000023,62.249718000000087],[-83.405562999999972,62.238884000000041],[-83.471938999999907,62.222763000000043],[-83.480835000000013,62.219986000000119],[-83.498885999999914,62.213326000000109],[-83.513335999999924,62.20638300000013],[-83.539992999999924,62.191933000000006],[-83.57417299999986,62.176384000000098],[-83.639174999999966,62.151100000000099],[-83.653885000000002,62.145827999999995],[-83.672774999999945,62.141106000000093],[-83.683318999999983,62.139717000000076],[-83.703887999999949,62.141662999999994],[-83.709441999999967,62.144440000000088],[-83.713897999999972,62.147216999999955],[-83.71833799999996,62.152214000000072],[-83.722778000000005,62.160271000000023],[-83.722778000000005,62.167213000000118],[-83.718063000000029,62.17943600000001],[-83.711945000000014,62.217209000000025],[-83.711669999999913,62.235825000000034],[-83.721389999999985,62.281662000000097],[-83.722778000000005,62.286385000000109],[-83.725829999999917,62.295273000000066],[-83.731673999999998,62.303604000000007],[-83.738892000000021,62.306937999999946],[-83.756667999999991,62.312492000000134],[-83.783324999999991,62.31888600000002],[-83.806655999999975,62.326385000000016],[-83.824448000000018,62.337212000000022],[-83.902495999999871,62.387497000000053],[-83.918610000000001,62.399162000000103],[-83.933608999999876,62.412209000000132],[-83.942489999999964,62.421661000000029],[-83.945267000000001,62.42721599999993],[-83.946654999999964,62.434158000000025],[-83.946654999999964,62.440269000000114],[-83.945267000000001,62.447212000000093],[-83.939162999999951,62.457497000000046],[-83.914168999999958,62.478600000000142],[-83.908339999999953,62.482764999999972],[-83.869445999999982,62.501105999999936],[-83.853058000000033,62.508049000000142],[-83.814437999999996,62.523880000000077],[-83.741378999999995,62.551658999999916],[-83.704177999999956,62.569443000000035],[-83.698043999999925,62.573051000000135],[-83.570007000000032,62.675270000000012],[-83.559433000000013,62.684157999999968],[-83.550277999999935,62.69999700000011],[-83.545546999999999,62.712212000000022],[-83.545546999999999,62.71776600000004],[-83.551392000000021,62.726653999999996],[-83.555831999999953,62.731659000000036],[-83.558884000000035,62.743881000000044],[-83.533614999999884,62.810272000000055],[-83.527495999999928,62.8211060000001],[-83.523055999999997,62.825271999999984],[-83.516953000000001,62.829994000000056],[-83.400283999999999,62.897491000000116],[-83.374160999999958,62.906937000000084],[-83.31082200000003,62.924438000000066],[-83.298614999999984,62.925827000000027],[-83.211670000000026,62.913605000000075],[-83.204177999999956,62.91027100000008],[-83.198333999999988,62.906654000000117],[-83.193877999999984,62.901932000000045],[-83.182495000000017,62.881378000000097],[-83.178054999999915,62.876380999999981],[-83.156112999999948,62.860549999999989],[-83.142501999999979,62.854439000000127],[-83.124709999999936,62.84804500000007],[-83.108337000000006,62.843322999999998],[-83.087509000000011,62.840271000000087],[-83.061935000000005,62.837493999999992],[-83.041107000000011,62.837212000000079],[-83.021392999999989,62.838599999999985],[-83.001677999999913,62.842491000000052],[-82.982223999999917,62.847771000000137],[-82.857497999999964,62.88999200000012],[-82.825561999999991,62.90277100000003],[-82.793335000000013,62.915543000000014],[-82.759734999999921,62.926940999999999],[-82.751952999999901,62.928878999999938],[-82.694442999999978,62.939430000000073],[-82.652221999999995,62.943878000000041],[-82.62470999999988,62.945540999999935],[-82.606658999999979,62.945540999999935],[-82.573623999999995,62.943878000000041],[-82.540833000000021,62.939430000000073],[-82.507781999999963,62.933601000000067],[-82.461394999999982,62.927489999999977],[-82.436110999999983,62.925270000000125],[-82.420837000000006,62.924995000000138],[-82.398055999999883,62.927489999999977],[-82.381377999999984,62.932770000000005],[-82.378052000000025,62.936377999999934],[-82.376389000000017,62.941101000000117],[-82.379165999999998,62.946655000000135],[-82.383620999999948,62.95138500000013],[-82.379989999999964,62.957497000000103],[-82.37222300000002,62.960274000000027],[-82.292770000000019,62.98333000000008],[-82.266662999999937,62.989159000000086],[-82.239440999999999,62.990273000000059],[-82.185821999999916,62.979988000000105],[-82.121932999999956,62.966660000000104],[-82.008057000000008,62.954993999999942],[-81.94027699999998,62.95387999999997],[-81.911666999999966,62.952217000000076],[-81.905838000000017,62.949997000000053],[-81.87110899999999,62.928329000000133]],[[-66.825561999999991,62.984161000000086],[-66.831389999999999,62.982765000000029],[-66.871384000000035,62.988884000000041],[-66.881942999999978,62.991661000000136],[-66.889450000000011,62.995269999999948],[-67.069457999999997,63.107498000000021],[-67.032776000000013,63.103881999999999],[-66.965285999999992,63.082496999999989],[-66.952224999999999,63.078049000000021],[-66.946105999999872,63.07499700000011],[-66.944442999999922,63.072768999999994],[-66.930557000000022,63.066939999999988],[-66.917496000000028,63.059715000000097],[-66.907501000000025,63.052773000000002],[-66.830001999999922,62.992493000000081],[-66.826950000000011,62.989990000000091],[-66.825011999999958,62.985550000000046],[-66.825561999999991,62.984161000000086]],[[-67.764450000000011,63.162491000000045],[-67.775833000000034,63.1616590000001],[-67.787505999999951,63.163048000000117],[-67.79861499999987,63.165543000000127],[-67.806380999999988,63.168602000000135],[-67.851943999999946,63.191376000000105],[-67.863327000000027,63.199158000000011],[-67.876388999999961,63.211937000000091],[-67.876937999999996,63.216933999999981],[-67.875,63.22304500000007],[-67.866393999999957,63.232491000000039],[-67.852218999999877,63.244438000000002],[-67.84445199999999,63.247215000000097],[-67.839721999999995,63.247215000000097],[-67.831954999999994,63.244155999999919],[-67.821945000000028,63.236656000000039],[-67.822234999999921,63.233330000000024],[-67.816101000000003,63.23054499999995],[-67.791671999999949,63.214996000000042],[-67.769454999999994,63.198326000000122],[-67.746108999999933,63.178879000000109],[-67.744720000000029,63.173050000000103],[-67.746384000000035,63.166939000000013],[-67.764450000000011,63.162491000000045]],[[-67.925003000000004,63.183327000000077],[-67.956116000000009,63.181107000000054],[-67.966949,63.183875999999998],[-68.000838999999985,63.208046000000024],[-68.017226999999991,63.220543000000021],[-68.061385999999914,63.257773999999984],[-68.105834999999956,63.299438000000066],[-68.111663999999962,63.309158000000139],[-68.112212999999997,63.313606000000107],[-68.106383999999991,63.318604000000107],[-68.096953999999926,63.318885999999964],[-68.085555999999997,63.316101000000117],[-68.069167999999877,63.309432999999956],[-68.048889000000031,63.297493000000088],[-68.032227000000034,63.284996000000092],[-68.00028999999995,63.260276999999917],[-67.92582699999997,63.196098000000006],[-67.920546999999999,63.191376000000105],[-67.916945999999939,63.186653000000092],[-67.925003000000004,63.183327000000077]],[[-78.079726999999991,63.469436999999914],[-77.946105999999986,63.468048000000124],[-77.937774999999988,63.471100000000035],[-77.930556999999965,63.474991000000102],[-77.924164000000019,63.47693600000008],[-77.911941999999954,63.476379000000009],[-77.845001000000025,63.472214000000008],[-77.680557000000022,63.434433000000013],[-77.636672999999917,63.402771000000087],[-77.495834000000002,63.274994000000106],[-77.493880999999988,63.269989000000066],[-77.49499499999996,63.265831000000105],[-77.50389100000001,63.252494999999954],[-77.573333999999932,63.200546000000145],[-77.641953000000001,63.171936000000073],[-77.785277999999892,63.121658000000139],[-77.898894999999925,63.09276600000004],[-77.906661999999983,63.09165999999999],[-77.931380999999931,63.090546000000018],[-77.946655000000021,63.091103000000089],[-77.958343999999954,63.093048000000124],[-78.025008999999898,63.11721],[-78.124709999999993,63.165825000000041],[-78.226944000000003,63.221656999999993],[-78.295546999999999,63.25999500000006],[-78.311385999999914,63.272217000000012],[-78.322234999999978,63.281105000000025],[-78.343613000000005,63.29694400000011],[-78.354445999999996,63.303604000000121],[-78.446655000000021,63.350273000000129],[-78.486937999999896,63.364998000000071],[-78.519729999999981,63.370270000000005],[-78.523894999999982,63.372489999999971],[-78.562499999999943,63.395828000000108],[-78.572234999999921,63.434715000000097],[-78.572783999999956,63.440269000000114],[-78.551665999999955,63.44499200000007],[-78.379989999999964,63.476379000000009],[-78.278885000000002,63.489716000000044],[-78.214111000000003,63.496535999999992],[-78.212783999999999,63.496101000000067],[-78.158614999999884,63.482208000000014],[-78.091675000000009,63.470543000000134],[-78.079726999999991,63.469436999999914]],[[-90.653884999999946,63.441101000000003],[-90.697495000000004,63.439713000000097],[-90.708892999999932,63.440544000000102],[-90.719161999999983,63.443603999999993],[-90.72582999999986,63.448043999999982],[-90.755004999999983,63.489716000000044],[-90.757232999999985,63.494438000000116],[-90.748046999999929,63.498329000000012],[-90.737502999999947,63.499161000000129],[-90.645553999999947,63.483330000000137],[-90.620269999999948,63.47693600000008],[-90.602782999999988,63.463882000000012],[-90.598052999999993,63.454436999999984],[-90.602218999999991,63.449158000000011],[-90.611937999999952,63.44609800000012],[-90.621932999999956,63.444153000000142],[-90.653884999999946,63.441101000000003]],[[-78.55749499999996,63.457497000000046],[-78.600554999999929,63.456383000000017],[-78.603333000000021,63.45777099999998],[-78.56138599999997,63.502495000000124],[-78.543334999999956,63.516106000000093],[-78.515839000000028,63.53166200000004],[-78.505004999999869,63.532493999999929],[-78.496108999999933,63.529434000000094],[-78.473327999999981,63.519157000000121],[-78.468063000000029,63.515549000000021],[-78.46166999999997,63.507499999999993],[-78.459166999999979,63.479988000000048],[-78.461945000000014,63.47387700000013],[-78.467223999999987,63.469436999999914],[-78.475554999999986,63.466933999999981],[-78.531113000000005,63.458603000000039],[-78.55749499999996,63.457497000000046]],[[-90.793609999999944,63.494156000000089],[-90.804442999999935,63.493324000000143],[-90.816956000000005,63.495827000000133],[-90.877212999999983,63.514717000000076],[-90.933318999999983,63.534164000000089],[-90.965835999999967,63.54583000000008],[-90.96833799999996,63.550270000000125],[-90.957503999999972,63.551384000000098],[-90.771117999999944,63.55193300000002],[-90.748046999999929,63.550270000000125],[-90.720001000000025,63.543052999999986],[-90.709731999999974,63.539992999999924],[-90.700835999999981,63.536110000000008],[-90.681380999999988,63.52304799999996],[-90.676940999999886,63.518599999999992],[-90.674712999999997,63.513884999999959],[-90.678604000000007,63.508330999999998],[-90.688889000000017,63.50638600000002],[-90.793609999999944,63.494156000000089]],[[-64.851944000000003,63.385826000000122],[-64.856948999999986,63.385826000000122],[-64.882216999999969,63.395546000000024],[-64.904175000000009,63.40638000000007],[-64.918335000000013,63.413879000000065],[-64.942215000000033,63.43082400000003],[-64.950835999999924,63.439156000000025],[-65.026672000000019,63.515549000000021],[-65.035278000000005,63.524436999999978],[-65.053054999999972,63.548331999999959],[-65.051940999999999,63.552215999999987],[-64.977218999999991,63.568329000000062],[-64.967498999999918,63.568329000000062],[-64.954726999999991,63.558883999999978],[-64.954726999999991,63.553879000000109],[-64.93360899999999,63.544716000000108],[-64.912216000000001,63.533333000000084],[-64.909163999999976,63.528603000000089],[-64.867492999999911,63.461662000000047],[-64.860824999999863,63.447212000000093],[-64.847504000000015,63.407494000000042],[-64.844726999999978,63.396942000000081],[-64.847778000000005,63.387496999999996],[-64.851944000000003,63.385826000000122]],[[-72.182495000000017,63.51998900000001],[-72.207503999999972,63.51998900000001],[-72.218886999999995,63.522491000000059],[-72.226943999999946,63.525825999999995],[-72.232772999999895,63.530273000000022],[-72.286666999999909,63.583328000000108],[-72.279174999999952,63.585548000000131],[-72.232223999999917,63.586655000000064],[-72.230285999999978,63.587212000000136],[-72.205276000000026,63.583054000000004],[-72.184432999999956,63.577217000000019],[-72.135559000000001,63.562767000000065],[-72.129165999999998,63.558883999999978],[-72.128052000000025,63.553879000000109],[-72.145003999999972,63.539436000000023],[-72.165833000000021,63.526381999999955],[-72.173614999999984,63.522766000000104],[-72.182495000000017,63.51998900000001]],[[-91.329177999999956,63.559714999999983],[-91.401947000000007,63.549438000000009],[-91.424438000000009,63.550270000000125],[-91.43638599999997,63.55193300000002],[-91.461944999999901,63.558327000000077],[-91.540282999999931,63.601662000000033],[-91.540558000000033,63.606658999999979],[-91.534164000000033,63.611381999999935],[-91.501113999999973,63.611938000000123],[-91.463897999999915,63.6097180000001],[-91.440826000000015,63.608047000000056],[-91.428604000000007,63.606383999999935],[-91.416396999999961,63.603607000000068],[-91.362503000000004,63.590271000000087],[-91.34944200000001,63.586655000000064],[-91.299727999999959,63.567771999999934],[-91.308884000000035,63.563881000000094],[-91.329177999999956,63.559714999999983]],[[-64.092498999999918,63.481659000000093],[-64.101944000000003,63.47943099999992],[-64.109160999999915,63.483046999999999],[-64.169448999999986,63.523605000000089],[-64.180556999999965,63.533051000000057],[-64.184158000000025,63.537216000000058],[-64.209166999999979,63.574996999999996],[-64.216109999999901,63.595268000000033],[-64.216948999999943,63.601105000000132],[-64.215285999999935,63.617493000000024],[-64.212783999999942,63.623604000000114],[-64.199722000000008,63.633331000000055],[-64.191939999999988,63.637215000000083],[-64.182495000000017,63.639435000000105],[-64.17193599999996,63.633606000000043],[-64.09333799999996,63.568329000000062],[-64.078338999999914,63.550545000000113],[-64.077224999999999,63.545273000000009],[-64.077788999999882,63.539718999999991],[-64.086120999999935,63.493050000000039],[-64.087508999999955,63.486655999999982],[-64.092498999999918,63.481659000000093]],[[-68.656386999999938,63.626381000000038],[-68.717772999999909,63.624161000000015],[-68.731109999999944,63.625549000000092],[-68.815552000000025,63.649162000000047],[-68.821670999999981,63.652488999999946],[-68.820007000000032,63.65526600000004],[-68.793059999999969,63.661659000000043],[-68.71444699999995,63.672493000000088],[-68.691665999999941,63.673607000000061],[-68.676940999999999,63.671379000000115],[-68.668883999999935,63.668326999999977],[-68.666397000000018,63.663879000000009],[-68.666259999999966,63.662581999999986],[-68.655272999999966,63.634437999999989],[-68.654449,63.630272000000105],[-68.656386999999938,63.626381000000038]],[[-64.061110999999983,63.270546000000138],[-64.070556999999951,63.268326000000116],[-64.078338999999914,63.268883000000017],[-64.181945999999982,63.29694400000011],[-64.25140399999998,63.320830999999998],[-64.266953000000001,63.326384999999959],[-64.349730999999963,63.392220000000009],[-64.353881999999885,63.395828000000108],[-64.421936000000017,63.471657000000107],[-64.496108999999876,63.6097180000001],[-64.490554999999972,63.620544000000052],[-64.479171999999949,63.636940000000038],[-64.473617999999874,63.640549000000078],[-64.386672999999973,63.675270000000012],[-64.377212999999927,63.677489999999977],[-64.367217999999923,63.675270000000012],[-64.363051999999925,63.671936000000017],[-64.328888000000006,63.644440000000145],[-64.325561999999934,63.637496999999939],[-64.325561999999934,63.59804500000007],[-64.324447999999961,63.588042999999971],[-64.321670999999981,63.577492000000063],[-64.316101000000003,63.562492000000077],[-64.262511999999958,63.421104000000128],[-64.232498000000021,63.388329000000113],[-64.225280999999939,63.384438000000046],[-64.20666499999993,63.384163000000001],[-64.166945999999996,63.369438000000059],[-64.144729999999925,63.355552999999986],[-64.099990999999932,63.322769000000108],[-64.057495000000017,63.278046000000018],[-64.057495000000017,63.273880000000133],[-64.061110999999983,63.270546000000138]],[[-71.799164000000019,63.615546999999935],[-71.806945999999868,63.611938000000123],[-71.845275999999956,63.613608999999997],[-71.855269999999905,63.615829000000019],[-71.863327000000027,63.619438000000002],[-71.865829000000019,63.624435000000119],[-71.865829000000019,63.636383000000137],[-71.864166000000012,63.669440999999949],[-71.830565999999919,63.693878000000041],[-71.821945000000028,63.695267000000058],[-71.789444000000003,63.691375999999991],[-71.779449,63.68832400000008],[-71.775283999999999,63.683051999999918],[-71.777221999999938,63.670830000000137],[-71.791107000000011,63.627213000000097],[-71.799164000000019,63.615546999999935]],[[-76.810546999999985,63.601105000000132],[-76.710555999999997,63.565826000000072],[-76.672225999999966,63.528877000000023],[-76.675551999999925,63.496658000000139],[-76.681609999999978,63.481354000000067],[-76.61332699999997,63.473602000000085],[-76.565551999999911,63.46776600000004],[-76.546111999999994,63.464714000000129],[-76.541945999999939,63.462494000000106],[-76.543883999999991,63.461104999999918],[-76.675002999999947,63.374709999999993],[-76.682219999999973,63.370827000000077],[-76.692214999999976,63.367767000000015],[-76.703338999999971,63.365829000000076],[-76.712783999999942,63.365546999999992],[-76.726105000000018,63.36693600000001],[-76.847778000000005,63.385269000000051],[-76.984160999999915,63.40638000000007],[-77.035277999999948,63.423882000000106],[-77.039443999999946,63.426102000000128],[-77.046111999999994,63.42971799999998],[-77.051391999999964,63.434158000000025],[-77.05360399999995,63.436935000000119],[-77.055556999999965,63.442764000000125],[-77.06138599999997,63.450546000000088],[-77.105834999999956,63.476654000000053],[-77.111663999999962,63.479713000000004],[-77.327788999999996,63.572220000000129],[-77.36721799999998,63.583054000000004],[-77.391388000000006,63.585548000000131],[-77.411666999999966,63.584991000000002],[-77.422226000000023,63.586655000000064],[-77.427779999999984,63.589157000000114],[-77.431945999999982,63.591934000000037],[-77.442215000000033,63.608330000000024],[-77.457229999999981,63.643325999999945],[-77.453887999999949,63.652214000000129],[-77.44027699999998,63.665268000000026],[-77.410277999999948,63.686652999999978],[-77.40055799999999,63.688880999999981],[-77.378051999999968,63.692214999999919],[-77.343338000000017,63.696098000000063],[-77.116942999999935,63.681107000000111],[-77.103332999999964,63.67971799999998],[-77.06138599999997,63.672768000000076],[-77.021392999999932,63.664154000000053],[-76.810546999999985,63.601105000000132]],[[-72.594727000000034,63.642494000000056],[-72.604445999999939,63.641663000000051],[-72.780563000000029,63.659987999999942],[-72.783324999999877,63.66443600000008],[-72.770553999999947,63.669715999999994],[-72.756667999999877,63.672768000000076],[-72.723052999999993,63.67860399999995],[-72.506667999999991,63.707214000000022],[-72.483886999999982,63.708885000000066],[-72.474166999999909,63.705826000000116],[-72.470839999999953,63.702217000000076],[-72.471389999999985,63.700828999999999],[-72.468886999999938,63.699158000000125],[-72.463333000000034,63.689156000000139],[-72.459731999999974,63.679161000000079],[-72.46055599999994,63.672768000000076],[-72.463897999999972,63.668326999999977],[-72.584441999999967,63.644440000000145],[-72.594727000000034,63.642494000000056]],[[-64.032501000000025,63.68971300000004],[-64.161117999999988,63.674438000000066],[-64.181106999999997,63.675827000000083],[-64.200286999999946,63.685546999999985],[-64.208344000000011,63.697487000000081],[-64.21166999999997,63.706383000000017],[-64.212509000000011,63.712212000000022],[-64.208892999999989,63.721930999999984],[-64.180283000000031,63.742218000000094],[-64.17471299999994,63.745270000000005],[-64.166655999999989,63.747772000000055],[-64.083069000000023,63.758331000000112],[-64.078063999999983,63.758331000000112],[-64.075287000000003,63.758049000000028],[-64.073333999999932,63.756386000000134],[-64.054840000000013,63.736595000000079],[-64.043335000000013,63.734161000000086],[-64.030288999999982,63.729713000000118],[-64.025283999999942,63.70249200000012],[-64.025283999999942,63.697487000000081],[-64.026397999999915,63.693878000000041],[-64.032501000000025,63.68971300000004]],[[-72.667769999999962,63.69582400000013],[-72.6949919999999,63.690269000000058],[-72.703613000000018,63.692490000000134],[-72.734160999999972,63.710823000000005],[-72.738891999999908,63.714439000000084],[-72.741669000000002,63.719711000000018],[-72.743880999999874,63.730270000000019],[-72.739989999999977,63.736107000000004],[-72.719727000000034,63.76388500000013],[-72.715560999999923,63.766106000000036],[-72.705841000000021,63.767494000000113],[-72.693877999999984,63.765830999999991],[-72.682495000000017,63.762214999999969],[-72.664718999999934,63.755554000000018],[-72.642226999999934,63.745270000000005],[-72.635833999999988,63.741379000000109],[-72.626663000000008,63.732207999999957],[-72.625823999999966,63.727486000000056],[-72.626389000000017,63.721099999999979],[-72.634170999999981,63.709160000000054],[-72.649993999999992,63.701385000000016],[-72.667769999999962,63.69582400000013]],[[-64.28443900000002,63.708602999999982],[-64.286391999999978,63.708046000000081],[-64.311110999999926,63.709991000000116],[-64.329178000000013,63.71665999999999],[-64.336394999999925,63.719986000000006],[-64.348617999999988,63.728042999999957],[-64.356948999999986,63.736938000000009],[-64.363616999999977,63.746383999999978],[-64.381103999999993,63.807495000000131],[-64.35943599999996,63.803879000000052],[-64.339721999999938,63.796943999999996],[-64.331954999999994,63.791663999999969],[-64.302779999999927,63.78054800000001],[-64.278610000000015,63.770828000000108],[-64.275008999999955,63.766663000000108],[-64.255279999999971,63.729713000000118],[-64.255004999999926,63.72526600000009],[-64.260833999999875,63.719711000000018],[-64.28443900000002,63.708602999999982]],[[-64.170273000000009,63.856384000000105],[-64.180831999999896,63.785270999999966],[-64.195267000000001,63.778603000000032],[-64.203338999999971,63.776382000000126],[-64.234435999999903,63.771378000000141],[-64.245834000000002,63.771378000000141],[-64.256957999999997,63.774162000000103],[-64.325561999999934,63.80582400000003],[-64.398346000000004,63.845543000000134],[-64.39916999999997,63.849434000000031],[-64.397780999999895,63.851386999999988],[-64.396117999999944,63.851936000000137],[-64.353881999999885,63.861107000000061],[-64.334091000000001,63.852081000000055],[-64.325561999999934,63.850273000000016],[-64.31082200000003,63.848328000000038],[-64.268340999999907,63.846100000000035],[-64.215012000000002,63.850273000000016],[-64.208344000000011,63.852776000000006],[-64.200286999999946,63.859718000000044],[-64.186661000000015,63.86721],[-64.179992999999911,63.865547000000106],[-64.175827000000027,63.861938000000066],[-64.170273000000009,63.856384000000105]],[[-92.954178000000013,63.871101000000067],[-92.96055599999994,63.866386000000034],[-92.972778000000005,63.867767000000072],[-92.998610999999983,63.873046999999985],[-93.068619000000012,63.888046000000031],[-93.093886999999995,63.899994000000049],[-93.094451999999933,63.904990999999995],[-93.087783999999999,63.908882000000062],[-93.070007000000032,63.909713999999951],[-93.002791999999943,63.911377000000073],[-92.990829000000019,63.910820000000001],[-92.978333000000021,63.908324999999991],[-92.97444200000001,63.901657],[-92.955275999999969,63.880820999999969],[-92.952498999999989,63.876099000000067],[-92.954178000000013,63.871101000000067]],[[-64.576110999999855,63.780822999999998],[-64.525832999999977,63.771378000000141],[-64.467772999999966,63.771378000000141],[-64.461945000000014,63.774712000000136],[-64.452498999999989,63.777214000000015],[-64.432769999999948,63.779434000000037],[-64.426102000000014,63.777771000000087],[-64.394729999999981,63.745827000000077],[-64.387511999999958,63.737495000000081],[-64.386123999999938,63.73443600000013],[-64.386123999999938,63.701660000000004],[-64.389998999999932,63.696381000000031],[-64.404175000000009,63.687492000000134],[-64.419158999999979,63.67971799999998],[-64.436385999999914,63.673324999999977],[-64.450561999999934,63.671660999999972],[-64.459441999999967,63.672768000000076],[-64.47444200000001,63.679161000000079],[-64.496947999999918,63.690826000000129],[-64.661666999999909,63.754997000000117],[-64.802215999999987,63.764442000000031],[-64.813323999999966,63.767212000000029],[-64.890288999999939,63.789435999999966],[-64.90055799999999,63.793883999999935],[-64.906386999999995,63.797493000000145],[-64.916396999999904,63.806380999999931],[-64.918335000000013,63.815269000000114],[-64.920272999999952,63.824715000000083],[-64.917769999999905,63.831108000000029],[-64.910277999999948,63.837212000000079],[-64.896392999999989,63.845267999999976],[-64.811660999999958,63.87721300000004],[-64.710555999999997,63.908882000000062],[-64.682494999999903,63.91443600000008],[-64.660278000000005,63.916382000000112],[-64.647231999999974,63.916100000000085],[-64.557219999999916,63.909988000000112],[-64.553054999999915,63.906380000000013],[-64.549437999999952,63.895271000000093],[-64.571121000000005,63.870827000000133],[-64.585555999999997,63.844994000000042],[-64.576110999999855,63.780822999999998]],[[-77.743880999999931,63.926658999999916],[-77.753341999999975,63.925551999999982],[-77.948607999999979,63.950829000000113],[-77.956954999999937,63.95388000000014],[-77.966948999999886,63.959160000000054],[-77.978881999999999,63.96915400000006],[-77.982497999999964,63.97554800000006],[-77.982497999999964,63.983047000000056],[-77.976105000000018,63.990273000000059],[-77.957503999999972,64.004715000000033],[-77.950287000000003,64.009155000000021],[-77.943603999999993,64.011107999999979],[-77.923889000000031,64.014999000000046],[-77.889998999999989,64.019989000000066],[-77.774445000000014,64.031662000000097],[-77.753890999999953,64.032761000000107],[-77.648620999999991,64.032486000000063],[-77.591110000000015,64.030272999999966],[-77.557219999999973,64.028046000000074],[-77.549727999999959,64.025543000000084],[-77.544448999999986,64.021927000000062],[-77.545273000000009,64.018600000000106],[-77.623610999999983,63.997214999999926],[-77.623885999999914,63.99582700000002],[-77.628052000000025,63.991104000000064],[-77.639450000000011,63.981934000000024],[-77.68638599999997,63.954437000000041],[-77.728606999999954,63.932213000000104],[-77.737212999999883,63.928329000000076],[-77.743880999999931,63.926658999999916]],[[-89.808884000000035,64.056366000000082],[-89.817229999999938,64.054703000000131],[-89.828887999999893,64.055816999999934],[-89.839447000000007,64.058868000000132],[-89.847778000000005,64.063034000000073],[-89.861114999999984,64.071655000000135],[-89.869995000000017,64.080826000000116],[-89.871933000000013,64.085541000000148],[-89.867767000000015,64.095824999999991],[-89.857498000000021,64.0977630000001],[-89.831679999999892,64.091094999999939],[-89.828063999999927,64.088318000000072],[-89.819732999999928,64.080276000000083],[-89.80471799999998,64.0619200000001],[-89.808884000000035,64.056366000000082]],[[-64.962783999999999,64.110809000000074],[-64.948607999999979,64.109710999999947],[-64.903609999999901,64.111099000000081],[-64.87110899999999,64.099152000000117],[-64.869445999999982,64.096649000000127],[-64.869995000000017,64.093323000000112],[-64.87332200000003,64.090820000000122],[-64.884445000000028,64.086655000000121],[-64.905563000000029,64.082214000000022],[-64.946655000000021,64.078872999999987],[-64.988892000000021,64.081375000000037],[-65.002228000000002,64.083878000000027],[-65.02305599999994,64.089432000000045],[-65.045546999999942,64.099426000000051],[-65.055556999999965,64.108596999999975],[-65.057495000000017,64.11303700000002],[-65.056380999999931,64.117203000000075],[-65.05221599999993,64.121093999999971],[-65.039718999999934,64.124985000000038],[-65.025009000000011,64.127472000000125],[-65.015563999999927,64.126922999999977],[-64.995270000000005,64.12303199999991],[-64.989990000000034,64.118590999999981],[-64.980834999999956,64.115265000000136],[-64.962783999999999,64.110809000000074]],[[-64.491104000000007,64.109146000000123],[-64.499999999999943,64.10803199999998],[-64.511397999999929,64.108321999999987],[-64.587508999999955,64.147491000000059],[-64.592498999999975,64.151931999999988],[-64.595276000000013,64.15498400000007],[-64.59584000000001,64.156647000000021],[-64.567779999999971,64.163605000000018],[-64.554169000000002,64.166931000000034],[-64.524444999999957,64.167206000000022],[-64.518111999999917,64.166214000000025],[-64.50111400000003,64.163314999999955],[-64.453339000000028,64.146942000000081],[-64.450287000000003,64.130264000000011],[-64.491104000000007,64.109146000000123]],[[-73.176940999999999,64.200271999999984],[-73.282776000000013,64.143326000000059],[-73.291945999999939,64.14387499999998],[-73.386397999999872,64.158874999999966],[-73.396956999999986,64.161102000000028],[-73.401672000000019,64.165543000000127],[-73.394729999999925,64.187759000000085],[-73.393065999999919,64.192474000000118],[-73.385559000000001,64.196365000000014],[-73.309433000000013,64.194977000000108],[-73.206664999999987,64.213882000000069],[-73.189986999999917,64.212203999999929],[-73.178054999999972,64.209991000000002],[-73.17332499999992,64.205261000000121],[-73.176940999999999,64.200271999999984]],[[-81.471389999999985,64.188873000000058],[-81.493606999999997,64.188309000000118],[-81.516112999999962,64.190536000000009],[-81.527785999999992,64.194137999999953],[-81.536666999999852,64.208603000000096],[-81.538054999999929,64.218048000000124],[-81.532226999999921,64.223038000000031],[-81.470000999999911,64.239426000000094],[-81.458618000000001,64.238876000000062],[-81.413329999999974,64.233322000000044],[-81.390288999999939,64.229155999999932],[-81.378601000000003,64.22554000000008],[-81.375823999999909,64.220825000000048],[-81.374999999999943,64.215820000000008],[-81.378875999999934,64.211929000000112],[-81.388901000000033,64.204987000000017],[-81.405272999999909,64.19470200000012],[-81.471389999999985,64.188873000000058]],[[-64.52027899999996,64.220261000000107],[-64.576401000000033,64.210541000000035],[-64.601668999999958,64.212493999999992],[-64.611938000000009,64.215820000000008],[-64.619445999999925,64.219711000000075],[-64.646956999999986,64.244141000000127],[-64.647781000000009,64.250000000000114],[-64.643616000000009,64.255829000000119],[-64.637512000000015,64.259995000000004],[-64.629715000000033,64.261658000000125],[-64.571670999999924,64.264998999999989],[-64.557525999999996,64.264862000000051],[-64.553054999999915,64.263321000000076],[-64.55221599999993,64.261658000000125],[-64.552490000000034,64.256653000000085],[-64.468062999999972,64.243316999999934],[-64.464721999999938,64.240814],[-64.462218999999948,64.237487999999928],[-64.464447000000007,64.234420999999998],[-64.471114999999998,64.231659000000093],[-64.52027899999996,64.220261000000107]],[[-75.551392000000021,64.303863999999976],[-75.691939999999988,64.302475000000129],[-75.702224999999999,64.305817000000104],[-75.708892999999989,64.315262000000132],[-75.705840999999964,64.341934000000037],[-75.696655000000021,64.351089000000115],[-75.686385999999914,64.353317000000061],[-75.665008999999998,64.350815000000011],[-75.578887999999949,64.346099999999979],[-75.572784000000013,64.344985999999949],[-75.502501999999936,64.319716999999969],[-75.493606999999997,64.316376000000105],[-75.50111400000003,64.313309000000004],[-75.511123999999938,64.311096000000077],[-75.551392000000021,64.303863999999976]],[[-64.938598999999954,64.235535000000027],[-64.989165999999955,64.209152000000017],[-65.00306699999993,64.21026599999999],[-65.048614999999984,64.218322999999998],[-65.052779999999984,64.219436999999971],[-65.059997999999894,64.223312000000135],[-65.065551999999968,64.227478000000019],[-65.073059000000001,64.240540000000067],[-65.102492999999981,64.296371000000136],[-65.109160999999972,64.310806000000071],[-65.113892000000021,64.323608000000036],[-65.114715999999987,64.329437000000041],[-65.114166000000012,64.334991000000059],[-65.112503000000004,64.339706000000092],[-65.110001000000011,64.343596999999988],[-65.101669000000015,64.346374999999966],[-65.08944699999995,64.349716000000001],[-65.028884999999889,64.361099000000024],[-65.021392999999932,64.362487999999985],[-65.010283999999956,64.361649000000057],[-65.006393000000003,64.360535000000084],[-65.001952999999958,64.356934000000024],[-64.99888599999997,64.354431000000034],[-64.982223999999974,64.333054000000004],[-64.884734999999921,64.28776600000009],[-64.886123999999938,64.283051000000057],[-64.890838999999971,64.276382000000012],[-64.926940999999943,64.242477000000065],[-64.938598999999954,64.235535000000027]],[[-73.876389000000017,64.301376000000005],[-73.883620999999948,64.298874000000069],[-73.951674999999966,64.304977000000008],[-73.96556099999998,64.30664100000007],[-73.972503999999958,64.309707999999944],[-73.97444200000001,64.313309000000004],[-73.960281000000009,64.362197999999978],[-73.95666499999993,64.368317000000047],[-73.952498999999932,64.370819000000097],[-73.942214999999919,64.372757000000036],[-73.932219999999916,64.37359600000002],[-73.918335000000013,64.371918000000051],[-73.909438999999963,64.369980000000112],[-73.889175000000023,64.359711000000118],[-73.879165999999941,64.351928999999984],[-73.874160999999958,64.343323000000055],[-73.87332200000003,64.305252000000053],[-73.876389000000017,64.301376000000005]],[[-73.69776899999988,64.269989000000066],[-73.704726999999934,64.268875000000037],[-73.72084000000001,64.272765999999933],[-73.75389100000001,64.28276100000005],[-73.776671999999962,64.294708000000014],[-73.823333999999988,64.324707000000046],[-73.833618000000001,64.331665000000044],[-73.781386999999995,64.405547999999953],[-73.776108000000022,64.407486000000119],[-73.765563999999983,64.409424000000058],[-73.749161000000015,64.410262999999986],[-73.744445999999982,64.405822999999998],[-73.730835000000013,64.386383000000023],[-73.729172000000005,64.386107999999979],[-73.726944000000003,64.383331000000055],[-73.724441999999954,64.377472000000068],[-73.702498999999989,64.322769000000108],[-73.699157999999954,64.314147999999989],[-73.690552000000025,64.276932000000045],[-73.691665999999998,64.273605000000089],[-73.694442999999922,64.271103000000039],[-73.69776899999988,64.269989000000066]],[[-64.849730999999963,64.307479999999998],[-64.861388999999974,64.307479999999998],[-64.877212999999983,64.313309000000004],[-64.888061999999991,64.321105999999986],[-64.937774999999988,64.361649000000057],[-64.944992000000013,64.37052900000009],[-64.955565999999976,64.383880999999917],[-64.959732000000031,64.397217000000069],[-64.958618000000001,64.405822999999998],[-64.951674999999909,64.411376999999959],[-64.946655000000021,64.413605000000132],[-64.932495000000017,64.417480000000126],[-64.925277999999992,64.418594000000098],[-64.910004000000015,64.416655999999989],[-64.902495999999985,64.412766000000147],[-64.897507000000019,64.408600000000092],[-64.820007000000032,64.379425000000026],[-64.771941999999967,64.348877000000016],[-64.770553999999947,64.345825000000104],[-64.773055999999997,64.34248400000007],[-64.849730999999963,64.307479999999998]],[[-74.27194199999991,64.413605000000132],[-74.285004000000015,64.41304000000008],[-74.357497999999964,64.421097000000088],[-74.377212999999983,64.424423000000104],[-74.423324999999977,64.443863000000079],[-74.437209999999936,64.450271999999927],[-74.439437999999996,64.453323000000125],[-74.338608000000022,64.49470500000001],[-74.331679999999949,64.496933000000126],[-74.31040999999999,64.49884000000003],[-74.285277999999948,64.481659000000036],[-74.228607000000011,64.451096000000064],[-74.205841000000021,64.44747899999993],[-74.183060000000012,64.443039000000113],[-74.17332499999992,64.439148000000046],[-74.174712999999997,64.434981999999991],[-74.178328999999962,64.433867999999961],[-74.27194199999991,64.413605000000132]],[[-73.744995000000017,64.426086000000055],[-73.758346999999958,64.425537000000077],[-73.77806099999998,64.428314],[-73.781386999999995,64.431931000000134],[-73.782776000000013,64.437484999999924],[-73.782500999999968,64.442474000000061],[-73.776108000000022,64.495818999999983],[-73.773894999999982,64.501937999999996],[-73.773330999999928,64.503326000000072],[-73.746917999999937,64.508513999999991],[-73.736664000000019,64.507216999999969],[-73.729172000000005,64.505264000000068],[-73.724166999999852,64.50221300000004],[-73.673049999999989,64.469711000000018],[-73.668610000000001,64.464432000000045],[-73.668334999999956,64.460265999999933],[-73.671936000000017,64.455826000000116],[-73.67971799999998,64.452208999999982],[-73.727218999999934,64.431091000000094],[-73.735001000000011,64.428040000000067],[-73.744995000000017,64.426086000000055]],[[-74.212783999999999,64.483046999999999],[-74.223327999999981,64.480270000000075],[-74.229171999999949,64.481369000000029],[-74.307495000000017,64.516098000000113],[-74.331116000000009,64.526656999999943],[-74.337508999999955,64.531096999999988],[-74.357773000000009,64.546936000000073],[-74.357773000000009,64.551086000000112],[-74.353881999999999,64.553589000000045],[-74.345550999999944,64.555251999999996],[-74.253066999999987,64.548035000000084],[-74.240554999999972,64.546371000000079],[-74.236114999999984,64.545532000000094],[-74.169723999999974,64.523880000000077],[-74.169448999999929,64.519714000000135],[-74.206664999999987,64.486374000000069],[-74.212783999999999,64.483046999999999]],[[-73.557495000000017,64.312758999999971],[-73.577788999999939,64.309982000000105],[-73.601669000000015,64.310257000000092],[-73.626388999999904,64.312758999999971],[-73.650283999999999,64.31721500000009],[-73.655563000000029,64.320267000000001],[-73.658339999999953,64.334991000000059],[-73.669532999999888,64.426849000000118],[-73.610442999999975,64.470489999999984],[-73.68249499999996,64.509720000000129],[-73.679992999999911,64.526093000000003],[-73.677779999999927,64.532211000000132],[-73.666655999999875,64.535538000000088],[-73.577224999999999,64.559982000000048],[-73.537215999999944,64.567764000000011],[-73.527785999999992,64.566940000000045],[-73.521118000000001,64.56303400000013],[-73.509170999999981,64.552475000000072],[-73.504729999999938,64.542480000000012],[-73.50306699999993,64.53414900000007],[-73.489165999999955,64.463318000000072],[-73.488051999999982,64.453598],[-73.48832699999997,64.443863000000079],[-73.490279999999927,64.439148000000046],[-73.555266999999958,64.314697000000137],[-73.557495000000017,64.312758999999971]],[[-65.492767000000015,64.517761000000007],[-65.658339999999953,64.509720000000129],[-65.669448999999929,64.510269000000108],[-65.67971799999998,64.512207000000046],[-65.686110999999926,64.515273999999977],[-65.689712999999983,64.51998900000001],[-65.690276999999924,64.524155000000064],[-65.689712999999983,64.52998400000007],[-65.686935000000005,64.538879000000122],[-65.672500999999954,64.56053200000008],[-65.660278000000005,64.573883000000023],[-65.651108000000022,64.580551000000014],[-65.615829000000019,64.599152000000004],[-65.563323999999909,64.615540000000067],[-65.554442999999992,64.618591000000094],[-65.546951000000035,64.622481999999991],[-65.449158000000011,64.678863999999976],[-65.443877999999927,64.684708000000001],[-65.43582200000003,64.696365000000128],[-65.381942999999922,64.716934000000037],[-65.292495999999971,64.735535000000084],[-65.256957999999941,64.709991000000059],[-65.252501999999936,64.706375000000037],[-65.258057000000008,64.700821000000019],[-65.266402999999912,64.6933140000001],[-65.249999999999886,64.663605000000075],[-65.208054000000004,64.639708999999982],[-65.208618000000001,64.631363000000079],[-65.213897999999915,64.626083000000051],[-65.228057999999919,64.6202550000001],[-65.309433000000013,64.60054000000008],[-65.420272999999952,64.55442800000003],[-65.452788999999939,64.532760999999994],[-65.450835999999924,64.528320000000065],[-65.453613000000018,64.524428999999998],[-65.460555999999997,64.521102999999982],[-65.468886999999995,64.519150000000025],[-65.492767000000015,64.517761000000007]],[[-63.353333000000021,64.994980000000112],[-63.349167000000023,64.991652999999985],[-63.34722099999999,64.991927999999973],[-63.330558999999994,64.986923000000104],[-63.257506999999976,64.92942800000003],[-63.256392999999889,64.926376000000118],[-63.258895999999936,64.921097000000145],[-63.27305599999994,64.918045000000063],[-63.281386999999938,64.918320000000051],[-63.37777699999998,64.940811000000053],[-63.385276999999974,64.944138000000009],[-63.393889999999942,64.951096000000007],[-63.417220999999984,64.97137499999991],[-63.420279999999934,64.976089000000059],[-63.420279999999934,64.978317000000004],[-63.418892000000028,64.982483000000116],[-63.415549999999996,64.986923000000104],[-63.395279000000016,64.995529000000033],[-63.376105999999993,64.998871000000008],[-63.363616999999977,64.997208000000057],[-63.353333000000021,64.994980000000112]],[[-63.243613999999923,65.254990000000134],[-63.251395999999943,65.253875999999991],[-63.256667999999991,65.256104000000107],[-63.310554999999965,65.290542999999957],[-63.313331999999946,65.293869000000029],[-63.311667999999941,65.298035000000084],[-63.306663999999898,65.302475000000129],[-63.257781999999963,65.320831000000112],[-63.244445999999925,65.322769000000051],[-63.236663999999962,65.321655000000078],[-63.227218999999991,65.313873000000115],[-63.166388999999924,65.286102000000085],[-63.165833000000021,65.282486000000006],[-63.166663999999969,65.27915999999999],[-63.235274999999888,65.256943000000092],[-63.243613999999923,65.254990000000134]],[[-66.92471299999994,65.284424000000115],[-66.933883999999978,65.283324999999991],[-66.962509000000011,65.283599999999979],[-66.976943999999946,65.284424000000115],[-66.989166000000012,65.286377000000073],[-66.99110399999995,65.288878999999952],[-67.011123999999938,65.319153000000028],[-67.011948000000018,65.323044000000095],[-67.010559000000001,65.333328000000108],[-67.005004999999926,65.339706000000092],[-66.992217999999923,65.346100000000092],[-66.974441999999954,65.350540000000137],[-66.932494999999903,65.358032000000094],[-66.920273000000009,65.358597000000088],[-66.910827999999867,65.356933999999967],[-66.908614999999998,65.355255],[-66.908050999999944,65.351089000000059],[-66.90943900000002,65.346100000000092],[-66.91194200000001,65.342209000000025],[-66.920273000000009,65.294434000000024],[-66.921386999999982,65.289703000000088],[-66.92471299999994,65.284424000000115]],[[-89.005568999999923,65.385544000000039],[-89.017501999999979,65.385544000000039],[-89.030288999999982,65.387496999999939],[-89.076110999999969,65.394714000000079],[-89.100280999999882,65.400818000000072],[-89.099990999999932,65.405822999999941],[-89.091674999999952,65.408325000000048],[-89.06806899999998,65.408325000000048],[-89.03195199999999,65.407211000000075],[-89.018615999999952,65.403320000000008],[-89.009445000000028,65.399155000000007],[-89.005279999999914,65.395538000000045],[-89.003066999999987,65.390549000000078],[-89.005568999999923,65.385544000000039]],[[-88.430282999999918,65.455261000000064],[-88.465011999999888,65.453597999999943],[-88.489990000000034,65.456650000000081],[-88.503615999999909,65.460541000000148],[-88.510284000000013,65.464995999999985],[-88.512222000000008,65.469711000000018],[-88.507506999999976,65.474991000000045],[-88.496383999999978,65.476928999999984],[-88.485001000000011,65.477767999999969],[-88.461120999999991,65.477478000000133],[-88.424163999999962,65.474426000000051],[-88.398620999999878,65.47026100000005],[-88.39416499999993,65.465820000000122],[-88.399733999999967,65.461380000000077],[-88.421386999999982,65.456940000000088],[-88.430282999999918,65.455261000000064]],[[-62.795005999999887,65.519988999999953],[-62.804442999999992,65.519150000000025],[-62.819450000000018,65.524155000000064],[-62.826950000000011,65.528046000000131],[-62.893889999999942,65.581100000000106],[-62.895553999999947,65.585541000000035],[-62.895553999999947,65.589981000000023],[-62.889724999999942,65.599152000000004],[-62.884444999999971,65.60554500000012],[-62.87471800000003,65.613602000000071],[-62.8663939999999,65.617477000000065],[-62.856392000000028,65.61914100000007],[-62.849723999999981,65.618866000000082],[-62.842773000000022,65.616378999999995],[-62.838051000000007,65.613602000000071],[-62.834998999999925,65.606644000000131],[-62.834998999999925,65.604705999999965],[-62.830001999999979,65.593048000000124],[-62.824448000000018,65.58526599999999],[-62.817504999999926,65.578598],[-62.810279999999977,65.574706999999933],[-62.785560999999973,65.564148000000102],[-62.765006999999969,65.557480000000112],[-62.750838999999985,65.551376000000062],[-62.788894999999968,65.523315000000025],[-62.795005999999887,65.519988999999953]],[[-83.882766999999944,65.666931000000091],[-83.893889999999942,65.664703000000145],[-83.906386999999938,65.666931000000091],[-83.937499999999943,65.677199999999914],[-83.943054000000018,65.681931000000077],[-83.942214999999976,65.686920000000043],[-83.93638599999997,65.691925000000083],[-83.928328999999962,65.69720500000011],[-83.896118000000001,65.710266000000047],[-83.884734999999978,65.712769000000037],[-83.872771999999941,65.712203999999986],[-83.864440999999943,65.707763999999997],[-83.868880999999988,65.696930000000123],[-83.871384000000035,65.686920000000043],[-83.876937999999939,65.672210999999947],[-83.882766999999944,65.666931000000091]],[[-67.472504000000015,65.705261000000007],[-67.55972300000002,65.702209000000096],[-67.584731999999974,65.703598000000113],[-67.640563999999927,65.696091000000138],[-67.691375999999934,65.685806000000014],[-67.701401000000033,65.686096000000077],[-67.706954999999937,65.688034000000016],[-67.713897999999858,65.696640000000116],[-67.715835999999967,65.701659999999947],[-67.713332999999921,65.705551000000014],[-67.695830999999885,65.720825000000104],[-67.658614999999998,65.725266000000033],[-67.577498999999989,65.731658999999979],[-67.529175000000009,65.734985000000052],[-67.499999999999943,65.734985000000052],[-67.48971599999993,65.734985000000052],[-67.424438000000009,65.735260000000039],[-67.446944999999914,65.718596999999988],[-67.472504000000015,65.705261000000007]],[[-62.268332999999984,65.701659999999947],[-62.259445000000028,65.699707000000046],[-62.238051999999982,65.702484000000084],[-62.221107000000018,65.708038000000101],[-62.20416999999992,65.711655000000064],[-62.186385999999914,65.711928999999998],[-62.167777999999942,65.70277399999992],[-62.131667999999934,65.678863999999976],[-62.128333999999938,65.674149000000114],[-62.131942999999978,65.657211000000018],[-62.135276999999974,65.651382000000012],[-62.142226999999991,65.64498900000001],[-62.194999999999993,65.612762000000032],[-62.202498999999989,65.610259999999982],[-62.215004000000022,65.609984999999938],[-62.22444200000001,65.611098999999967],[-62.296950999999979,65.624985000000095],[-62.455001999999979,65.659988000000112],[-62.466109999999958,65.663879000000009],[-62.483886999999925,65.721099999999922],[-62.484443999999939,65.726928999999984],[-62.483611999999994,65.731658999999979],[-62.480552999999873,65.737761999999918],[-62.473609999999951,65.74192800000003],[-62.46832999999998,65.744140999999956],[-62.461944999999957,65.745254999999986],[-62.283889999999928,65.74443100000002],[-62.27194199999991,65.744140999999956],[-62.260283999999956,65.74331699999999],[-62.252501999999993,65.74192800000003],[-62.251396,65.739151000000106],[-62.258613999999909,65.728592000000049],[-62.27027899999996,65.723038000000088],[-62.297501000000011,65.708602999999982],[-62.268332999999984,65.701659999999947]],[[-83.283889999999928,65.834152000000131],[-83.292220999999927,65.828872999999987],[-83.30360399999995,65.826385000000016],[-83.315551999999968,65.826096000000064],[-83.327498999999932,65.82748399999997],[-83.347777999999892,65.832489000000066],[-83.395279000000016,65.8316650000001],[-83.406661999999983,65.830276000000083],[-83.418059999999969,65.827774000000034],[-83.429168999999945,65.824432000000058],[-83.439986999999917,65.819153000000085],[-83.456389999999999,65.808867999999961],[-83.473327999999981,65.800262000000032],[-83.485274999999945,65.800812000000064],[-83.498046999999929,65.804152999999928],[-83.529723999999987,65.817489999999964],[-83.559157999999968,65.831100000000049],[-83.575561999999934,65.839980999999966],[-83.581679999999892,65.844711000000018],[-83.585007000000019,65.849426000000051],[-83.586120999999991,65.854156000000103],[-83.580291999999986,65.859420999999941],[-83.571670999999981,65.862488000000042],[-83.560271999999941,65.864990000000148],[-83.525283999999886,65.868317000000104],[-83.478058000000033,65.870255000000043],[-83.442490000000021,65.870818999999983],[-83.36999499999996,65.866653000000042],[-83.345551,65.863876000000005],[-83.333069000000023,65.860260000000096],[-83.291106999999954,65.843597000000045],[-83.285277999999948,65.838882000000012],[-83.283889999999928,65.834152000000131]],[[-65.645843999999954,65.813034000000073],[-65.656386999999995,65.812759000000028],[-65.660278000000005,65.819717000000026],[-65.654998999999918,65.869431000000077],[-65.651671999999962,65.876647999999989],[-65.647781000000009,65.879974000000004],[-65.636123999999882,65.88638300000008],[-65.623885999999914,65.891373000000101],[-65.583069000000023,65.902771000000143],[-65.542769999999962,65.908035000000098],[-65.531676999999945,65.908874999999966],[-65.516112999999962,65.906371999999976],[-65.511397999999929,65.903046000000131],[-65.512221999999895,65.894440000000031],[-65.513335999999981,65.890548999999965],[-65.52806099999998,65.859420999999941],[-65.559433000000013,65.834717000000012],[-65.645843999999954,65.813034000000073]],[[-85.480559999999969,65.791930999999977],[-85.468062999999972,65.790817000000004],[-85.456389999999942,65.791367000000037],[-85.445266999999944,65.793869000000086],[-85.424164000000019,65.801926000000094],[-85.413895000000025,65.807480000000055],[-85.40834000000001,65.812485000000095],[-85.404998999999975,65.817489999999964],[-85.404175000000009,65.822495000000004],[-85.393065999999862,65.832764000000054],[-85.381942999999978,65.835265999999933],[-85.369995000000017,65.834991000000116],[-85.333327999999995,65.832214000000022],[-85.313613999999916,65.830276000000083],[-85.288605000000018,65.826660000000004],[-85.263061999999991,65.821106000000043],[-85.213622999999984,65.808029000000033],[-85.202788999999939,65.803588999999988],[-85.18582200000003,65.794708000000071],[-85.162505999999894,65.78137200000009],[-85.156386999999938,65.776657000000057],[-85.049164000000019,65.621643000000006],[-85.047774999999945,65.616928000000144],[-85.048614999999984,65.611923000000104],[-85.051666000000012,65.606934000000138],[-85.067504999999926,65.59637500000008],[-85.08805799999999,65.585541000000035],[-85.120270000000005,65.574996999999996],[-85.142226999999934,65.569992000000127],[-85.175827000000027,65.563309000000118],[-85.232223999999917,65.554703000000018],[-85.24360699999994,65.55386400000009],[-85.267776000000026,65.555542000000003],[-85.280563000000029,65.55802900000009],[-85.291945999999882,65.557205000000124],[-85.302490000000034,65.552765000000079],[-85.307770000000005,65.547760000000039],[-85.311110999999926,65.542479999999955],[-85.311935000000005,65.537766000000033],[-85.308043999999995,65.533051],[-85.295836999999949,65.52388000000002],[-85.271118000000001,65.511658000000068],[-85.240829000000019,65.498322000000087],[-85.204178000000013,65.485809000000017],[-85.165557999999976,65.474991000000045],[-85.127776999999924,65.466095000000109],[-85.088608000000022,65.453597999999943],[-85.043609999999944,65.436371000000122],[-85.02694699999995,65.427475000000015],[-85.015015000000005,65.418319999999937],[-85.011123999999938,65.413605000000075],[-85.002791999999943,65.401382000000069],[-85.001403999999923,65.396652000000017],[-85.005004999999983,65.37692300000009],[-85.011672999999973,65.352203000000031],[-84.930557000000022,65.214157000000057],[-84.924712999999997,65.209717000000012],[-84.912216000000001,65.206375000000094],[-84.900283999999942,65.206100000000106],[-84.832503999999972,65.212494000000106],[-84.821395999999879,65.213882000000012],[-84.810271999999998,65.216385000000002],[-84.800277999999992,65.221649000000014],[-84.792496000000028,65.226929000000041],[-84.748046999999985,65.292755000000056],[-84.746947999999975,65.297485000000052],[-84.749724999999899,65.307204999999954],[-84.755004999999869,65.316666000000112],[-84.762221999999952,65.326096000000007],[-84.761123999999995,65.331099999999992],[-84.758056999999951,65.336105000000032],[-84.754729999999938,65.341095000000053],[-84.745834000000002,65.351379000000065],[-84.740279999999984,65.356368999999972],[-84.595839999999953,65.475540000000024],[-84.58555599999994,65.481093999999985],[-84.573623999999995,65.481659000000036],[-84.561934999999949,65.481093999999985],[-84.549437999999952,65.47886699999998],[-84.440276999999924,65.456650000000081],[-84.432220000000029,65.453323000000125],[-84.426392000000021,65.448593000000074],[-84.424712999999997,65.443863000000079],[-84.42582699999997,65.438873000000001],[-84.314437999999996,65.381653000000142],[-84.291945999999996,65.37692300000009],[-84.161391999999921,65.341934000000037],[-84.151107999999908,65.338593000000003],[-84.147507000000019,65.333878000000141],[-84.153060999999923,65.328598000000056],[-84.194153000000028,65.297485000000052],[-84.201950000000011,65.292206000000078],[-84.220839999999953,65.284713999999951],[-84.228881999999999,65.279434000000094],[-84.230834999999956,65.269440000000088],[-84.229720999999984,65.264708999999982],[-84.141388000000006,65.219986000000063],[-84.088333000000034,65.203873000000044],[-83.899993999999992,65.165543000000071],[-83.876098999999954,65.162766000000033],[-83.852782999999931,65.161652000000004],[-83.666945999999939,65.160811999999964],[-83.620543999999938,65.160811999999964],[-83.540282999999931,65.16415400000011],[-83.52806099999998,65.161925999999937],[-83.408614999999998,65.135544000000095],[-83.388061999999934,65.126647999999932],[-83.378875999999991,65.117203000000075],[-83.33805799999999,65.074707000000046],[-83.334732000000031,65.069992000000013],[-83.335830999999928,65.064986999999974],[-83.339447000000007,65.059982000000105],[-83.343063000000029,65.045258000000047],[-83.340835999999967,65.035537999999974],[-83.330840999999964,65.021378000000084],[-83.319457999999941,65.012207000000103],[-83.208053999999947,64.945526000000086],[-83.198043999999868,64.941086000000098],[-83.190552000000025,64.939423000000147],[-83.156386999999995,64.939972000000068],[-83.005004999999926,64.913039999999967],[-82.992766999999901,64.909714000000122],[-82.865828999999962,64.873596000000077],[-82.855834999999956,64.86914100000007],[-82.848052999999993,64.864426000000037],[-82.842498999999918,64.859985000000108],[-82.829726999999991,64.840819999999951],[-82.828613000000018,64.836104999999918],[-82.825287000000003,64.831375000000094],[-82.816390999999953,64.821930000000009],[-82.800277999999992,64.808868000000018],[-82.770003999999972,64.795532000000037],[-82.75778200000002,64.791092000000049],[-82.709166999999979,64.776382000000069],[-82.697220000000016,64.77388000000002],[-82.569732999999928,64.763885000000073],[-82.361388999999974,64.763610999999969],[-82.34944200000001,64.760269000000051],[-82.211944999999957,64.718323000000055],[-82.202224999999885,64.713608000000022],[-82.203339000000028,64.708602999999982],[-82.209166999999979,64.703598000000113],[-82.217498999999975,64.698593000000074],[-82.203612999999962,64.684417999999994],[-82.064437999999996,64.648605000000089],[-81.932495000000017,64.584427000000062],[-81.763061999999991,64.501099000000067],[-81.753890999999953,64.486923000000047],[-81.75140399999998,64.472488000000112],[-81.753066999999987,64.355820000000051],[-81.764174999999966,64.341095000000109],[-81.770003999999972,64.336105000000032],[-81.777221999999995,64.326096000000007],[-81.778885000000002,64.321105999999986],[-81.777221999999995,64.31164600000011],[-81.77416999999997,64.30664100000007],[-81.74888599999997,64.273605000000089],[-81.727218999999934,64.258330999999998],[-81.712783999999999,64.250000000000114],[-81.702788999999996,64.2452550000001],[-81.669723999999974,64.232758000000103],[-81.646118000000001,64.22554000000008],[-81.622498000000007,64.216660000000047],[-81.613051999999982,64.212203999999929],[-81.600280999999939,64.20277400000009],[-81.594451999999933,64.193313999999987],[-81.590835999999967,64.183594000000085],[-81.589995999999928,64.17886400000009],[-81.602492999999981,64.129974000000004],[-81.610824999999977,64.125809000000004],[-81.717772999999966,64.099426000000051],[-81.758621000000005,64.089432000000045],[-81.76916499999993,64.088043000000027],[-81.824447999999961,64.086380000000077],[-81.879165999999941,64.080826000000116],[-81.955840999999964,64.0619200000001],[-81.964171999999962,64.0577550000001],[-81.970000999999968,64.052765000000022],[-81.973617999999931,64.047759999999982],[-81.999160999999958,64.003326000000015],[-81.996384000000035,63.998604000000114],[-81.986938000000009,63.994155999999975],[-81.975005999999951,63.990546999999992],[-81.963897999999972,63.988884000000041],[-81.952498999999932,63.98832700000014],[-81.930556999999965,63.988045000000056],[-81.897507000000019,63.989990000000091],[-81.875823999999909,63.991661000000136],[-81.56082200000003,64.029433999999981],[-81.44027699999998,64.067764000000068],[-81.383620999999948,64.090546000000018],[-81.287780999999882,64.080276000000083],[-81.276397999999972,64.07748399999997],[-81.270003999999915,64.072495000000004],[-81.264174999999966,64.062759000000028],[-81.256957999999997,64.059143000000006],[-81.245543999999995,64.055542000000116],[-80.964721999999938,63.991936000000123],[-80.942489999999964,63.990546999999992],[-80.931670999999994,63.991936000000123],[-80.920837000000006,63.994995000000131],[-80.910277999999892,63.999161000000015],[-80.906661999999926,64.004166000000055],[-80.903335999999967,64.013885000000073],[-80.909163999999976,64.023315000000139],[-80.914168999999958,64.028046000000074],[-80.92582699999997,64.032761000000107],[-80.948607999999979,64.038879000000065],[-80.967498999999918,64.04803499999997],[-80.972778000000005,64.052765000000022],[-80.975554999999986,64.0577550000001],[-80.973891999999978,64.062485000000095],[-80.935821999999973,64.111923000000047],[-80.890838999999971,64.11554000000001],[-80.812209999999993,64.091094999999939],[-80.777495999999871,64.079437000000098],[-80.734726000000023,64.054153000000099],[-80.566100999999946,63.994155999999975],[-80.543335000000013,63.987770000000069],[-80.531677000000002,63.983330000000024],[-80.522507000000019,63.978600000000029],[-80.517501999999979,63.973877000000016],[-80.488327000000027,63.910545000000013],[-80.49221799999998,63.905548000000067],[-80.503066999999987,63.902489000000116],[-80.567504999999926,63.889435000000049],[-80.453063999999927,63.859436000000017],[-80.363051999999925,63.841102999999976],[-80.217223999999987,63.809989999999971],[-80.194480999999996,63.804474000000084],[-80.189986999999974,63.799995000000024],[-80.174712999999883,63.780822999999998],[-80.172225999999966,63.776100000000042],[-80.171660999999972,63.771102999999925],[-80.178878999999881,63.756660000000068],[-80.184998000000007,63.751663000000121],[-80.195830999999885,63.748604],[-80.346953999999982,63.728042999999957],[-80.357772999999952,63.728600000000085],[-80.369155999999975,63.73333000000008],[-80.380279999999971,63.734993000000031],[-80.391387999999949,63.734993000000031],[-80.402221999999995,63.734717999999987],[-80.434433000000013,63.731102000000135],[-80.454178000000013,63.727767999999969],[-80.485275000000001,63.715546000000018],[-80.493606999999997,63.710274000000084],[-80.504729999999995,63.690826000000129],[-80.506393000000003,63.685822000000144],[-80.510009999999966,63.681107000000111],[-80.52194199999991,63.671104000000071],[-80.587783999999999,63.635826000000066],[-80.608886999999982,63.628326000000015],[-80.774445000000014,63.573326000000122],[-80.912216000000001,63.526381999999955],[-80.922501000000011,63.521378000000027],[-80.930557000000022,63.516106000000093],[-80.936385999999914,63.511108000000092],[-80.938048999999864,63.50638600000002],[-80.9375,63.501389000000074],[-80.934433000000013,63.496658000000139],[-80.930557000000022,63.482208000000014],[-80.930282999999974,63.477486000000113],[-80.9375,63.467491000000052],[-80.958053999999947,63.458328000000051],[-80.968613000000005,63.455269000000044],[-80.989440999999999,63.450829000000056],[-81.011123999999995,63.449158000000011],[-81.032775999999956,63.44860100000011],[-81.054442999999992,63.449158000000011],[-81.076401000000033,63.451385000000016],[-81.110000999999954,63.458328000000051],[-81.386123999999938,63.526381999999955],[-81.694153000000028,63.607498000000135],[-81.734160999999972,63.625549000000092],[-81.757232999999985,63.634720000000073],[-81.768889999999999,63.638046000000088],[-81.779998999999975,63.639717000000132],[-81.801940999999943,63.641105999999979],[-81.823623999999995,63.639435000000105],[-81.855270000000019,63.63249200000007],[-81.876662999999951,63.629990000000021],[-81.887512000000015,63.62943300000012],[-81.909728999999913,63.631934999999999],[-81.995270000000005,63.661102000000142],[-82.01167299999986,63.667213000000004],[-82.026397999999972,63.676383999999985],[-82.031386999999938,63.681107000000111],[-82.041107000000011,63.685822000000144],[-82.052490000000034,63.689156000000139],[-82.06361400000003,63.690826000000129],[-82.107772999999952,63.692214999999919],[-82.129439999999988,63.691658000000018],[-82.214172000000019,63.687766999999951],[-82.224715999999887,63.686377999999991],[-82.285552999999993,63.678047000000049],[-82.296111999999937,63.674713000000111],[-82.299437999999952,63.669715999999994],[-82.298889000000031,63.664992999999981],[-82.302215999999987,63.659987999999942],[-82.307769999999948,63.654991000000052],[-82.318344000000025,63.651657000000057],[-82.328887999999949,63.65026899999998],[-82.339995999999871,63.650826000000052],[-82.351395000000025,63.653320000000008],[-82.472228999999913,63.680275000000051],[-82.483886999999982,63.68471500000004],[-82.491103999999893,63.689156000000139],[-82.535278000000005,63.726378999999952],[-82.545836999999949,63.735550000000103],[-82.549728000000016,63.745270000000005],[-82.550827000000027,63.750000000000057],[-82.546951000000035,63.764717000000019],[-82.543334999999956,63.769714000000135],[-82.532226999999978,63.779991000000109],[-82.514450000000011,63.790276000000063],[-82.504456000000005,63.795547000000056],[-82.484160999999972,63.804993000000024],[-82.473617999999931,63.80832700000002],[-82.431945999999982,63.820273999999984],[-82.420837000000006,63.820831000000055],[-82.40972899999997,63.819160000000011],[-82.398055999999883,63.815826000000015],[-82.386672999999973,63.814156000000025],[-82.376389000000017,63.81749700000006],[-82.372771999999998,63.82249500000006],[-82.353881999999942,63.852219000000105],[-82.351395000000025,63.861938000000066],[-82.358336999999949,63.900543000000027],[-82.361388999999974,63.905265999999983],[-82.368880999999988,63.909988000000112],[-82.378325999999959,63.91443600000008],[-82.413894999999968,63.926940999999999],[-82.525833000000034,63.966103000000032],[-82.548888999999974,63.96915400000006],[-82.828613000000018,63.979431000000034],[-82.967223999999987,63.965546000000131],[-82.978058000000033,63.963051000000121],[-83.064162999999951,63.951934999999992],[-83.086944999999957,63.954994000000113],[-83.098891999999921,63.959160000000054],[-83.12388599999997,63.972763000000043],[-83.129165999999941,63.977486000000056],[-83.145279000000016,64.001099000000124],[-83.139724999999999,64.006103999999993],[-83.095550999999887,64.028320000000008],[-83.029449,64.074707000000103],[-83.016113000000018,64.084991000000116],[-82.996947999999975,64.10026600000009],[-82.980285999999978,64.11554000000001],[-82.97084000000001,64.125534000000016],[-82.961944999999901,64.135818000000029],[-82.960555999999997,64.140548999999965],[-82.96166999999997,64.145538000000101],[-82.964721999999995,64.150269000000037],[-83.008346999999958,64.187484999999981],[-83.019729999999981,64.188873000000058],[-83.072783999999956,64.186646000000053],[-83.105269999999962,64.181655999999975],[-83.126388999999961,64.175811999999951],[-83.157227000000034,64.163040000000137],[-83.339447000000007,64.134720000000129],[-83.488327000000027,64.122482000000048],[-83.519729999999981,64.11442599999998],[-83.530288999999925,64.111099000000081],[-83.548339999999996,64.102478000000133],[-83.673324999999977,64.017212000000029],[-83.682220000000029,64.007217000000082],[-83.683318999999983,64.002212999999927],[-83.676666000000012,63.992766999999958],[-83.665833000000021,63.983603999999957],[-83.642501999999979,63.969986000000119],[-83.626099000000011,63.956099999999992],[-83.608611999999994,63.937492000000077],[-83.605559999999969,63.932770000000005],[-83.604171999999949,63.928047000000049],[-83.595839999999896,63.825829000000056],[-83.596664000000033,63.820831000000055],[-83.623046999999929,63.781661999999983],[-83.631942999999865,63.771659999999997],[-83.637222000000008,63.766388000000063],[-83.647507000000019,63.763054000000125],[-83.658614999999941,63.763611000000026],[-83.670272999999952,63.766937000000041],[-83.694442999999978,63.775826000000109],[-83.718613000000005,63.779991000000109],[-83.740554999999972,63.779991000000109],[-83.750838999999985,63.776657000000114],[-83.824172999999973,63.747490000000028],[-84.007232999999985,63.668053000000043],[-84.012786999999889,63.662765999999976],[-84.021117999999944,63.65277100000003],[-84.027495999999928,63.642769000000044],[-84.050277999999935,63.626938000000109],[-84.069457999999997,63.616386000000091],[-84.079453000000001,63.611938000000123],[-84.089447000000007,63.607773000000122],[-84.09973100000002,63.605270000000132],[-84.110000999999954,63.603607000000068],[-84.121383999999978,63.604163999999969],[-84.132767000000001,63.606658999999979],[-84.144729999999925,63.610825000000034],[-84.162216000000001,63.619713000000047],[-84.174164000000019,63.623047000000042],[-84.196380999999917,63.62499200000002],[-84.261123999999995,63.62082700000002],[-84.286117999999988,63.615546999999935],[-84.388061999999991,63.559158000000082],[-84.395279000000016,63.553879000000109],[-84.40055799999999,63.548607000000004],[-84.446380999999974,63.488045],[-84.449431999999888,63.483046999999999],[-84.452224999999942,63.472488000000112],[-84.447220000000016,63.453323000000012],[-84.449157999999954,63.443603999999993],[-84.477492999999981,63.3836060000001],[-84.563323999999966,63.337494000000049],[-84.754456000000005,63.264160000000061],[-84.774170000000026,63.257217000000082],[-84.793883999999991,63.250274999999988],[-84.823059000000001,63.237213000000111],[-84.841949,63.227211000000011],[-84.870834000000002,63.214157000000114],[-84.890563999999983,63.207214000000079],[-85.143341000000021,63.139992000000063],[-85.224166999999966,63.120827000000133],[-85.244995000000017,63.118598999999961],[-85.266402999999968,63.117493000000138],[-85.288054999999986,63.118324000000143],[-85.343338000000017,63.122765000000072],[-85.375823999999909,63.123877999999934],[-85.396956999999929,63.122765000000072],[-85.449158000000011,63.116661000000022],[-85.482223999999974,63.118598999999961],[-85.493331999999953,63.119987000000094],[-85.505004999999983,63.123046999999929],[-85.536391999999921,63.134995000000004],[-85.543883999999935,63.138328999999999],[-85.577788999999939,63.165543000000127],[-85.589171999999962,63.174712999999997],[-85.592498999999975,63.17943600000001],[-85.638061999999934,63.244995000000074],[-85.639175000000023,63.249718000000087],[-85.648345999999947,63.33554799999996],[-85.653884999999946,63.408882000000006],[-85.650833000000034,63.428604000000007],[-85.644454999999994,63.443603999999993],[-85.635833999999988,63.458603000000039],[-85.626098999999897,63.468880000000013],[-85.618057000000022,63.479156000000103],[-85.60722399999986,63.494438000000116],[-85.604995999999971,63.509163000000058],[-85.591110000000015,63.617493000000024],[-85.59333799999996,63.631934999999999],[-85.596114999999941,63.641380000000083],[-85.607497999999964,63.665268000000026],[-85.61332699999997,63.669715999999994],[-85.717498999999975,63.716103000000089],[-85.879439999999988,63.704711999999915],[-85.98582499999992,63.693320999999969],[-86.017226999999934,63.68832400000008],[-86.183608999999933,63.653046000000074],[-86.224441999999954,63.642769000000044],[-86.244995000000017,63.639435000000105],[-86.266952999999944,63.638046000000088],[-86.300277999999935,63.639717000000132],[-86.346114999999998,63.645546000000138],[-86.381377999999984,63.652214000000129],[-86.450286999999889,63.660545000000013],[-86.552779999999871,63.670273000000066],[-86.56361400000003,63.670546999999999],[-86.596114999999941,63.668602000000021],[-86.626937999999996,63.661659000000043],[-86.666397000000018,63.648331000000042],[-86.694442999999922,63.633606000000043],[-86.733886999999982,63.606658999999979],[-86.759170999999981,63.590271000000087],[-86.778060999999923,63.581108000000086],[-86.807495000000017,63.571380999999974],[-86.837783999999999,63.563323999999966],[-86.847778000000005,63.560822000000087],[-86.879165999999998,63.555549999999982],[-86.922225999999966,63.552773000000059],[-87.050551999999982,63.549720999999977],[-87.083618000000001,63.550270000000125],[-87.095275999999956,63.551384000000098],[-87.118606999999997,63.555824000000086],[-87.141388000000006,63.563881000000094],[-87.14973399999991,63.568329000000062],[-87.188048999999864,63.589989000000003],[-87.217223999999987,63.622215000000097],[-87.222778000000005,63.631660000000011],[-87.226394999999968,63.641105999999979],[-87.225280999999995,63.651099999999985],[-87.22193900000002,63.665825000000098],[-87.218886999999938,63.675827000000083],[-87.210830999999985,63.691100999999946],[-87.200835999999867,63.706657000000121],[-87.186661000000015,63.722213999999951],[-87.161117999999931,63.743607000000054],[-86.943877999999927,63.900543000000027],[-86.934432999999956,63.906097000000045],[-86.915282999999988,63.91443600000008],[-86.875823999999966,63.928604000000121],[-86.784163999999976,63.956940000000031],[-86.763625999999988,63.962212000000136],[-86.700287000000003,63.972214000000122],[-86.668609999999887,63.978324999999984],[-86.503890999999896,64.018326000000002],[-86.41361999999998,64.048598999999967],[-86.255004999999926,64.076096000000064],[-86.233611999999994,64.079437000000098],[-86.223327999999981,64.081940000000088],[-86.213333000000034,64.085541000000148],[-86.203888000000006,64.091094999999939],[-86.189437999999882,64.101653999999996],[-86.178328999999962,64.121918000000107],[-86.178878999999995,64.131653000000028],[-86.182220000000029,64.141373000000101],[-86.212219000000005,64.178589000000045],[-86.253066999999987,64.200546000000088],[-86.273894999999982,64.208878000000084],[-86.300551999999982,64.221924000000058],[-86.308884000000035,64.226379000000065],[-86.3125,64.230819999999994],[-86.354720999999984,64.289978000000133],[-86.384170999999981,64.36442599999998],[-86.401672000000019,64.436645999999996],[-86.401107999999965,64.441649999999925],[-86.383620999999948,64.564987000000087],[-86.368880999999988,64.629424999999969],[-86.315552000000025,64.701096000000064],[-86.272506999999962,64.768051000000014],[-86.24888599999997,64.793868999999916],[-86.238891999999964,64.804152999999985],[-86.231383999999935,64.809418000000051],[-86.221114999999998,64.813034000000073],[-86.210280999999952,64.814697000000024],[-86.198607999999922,64.81442300000009],[-86.187209999999993,64.815262000000018],[-86.176665999999955,64.817764000000125],[-86.171660999999915,64.823043999999982],[-86.152495999999928,64.918045000000063],[-86.151947000000007,64.923035000000084],[-86.153335999999911,64.927765000000136],[-86.157226999999978,64.932479999999998],[-86.181106999999997,64.955551000000014],[-86.187209999999993,64.959991000000002],[-86.212509000000011,64.966385000000059],[-86.22084000000001,64.970535000000041],[-86.226394999999968,64.979980000000126],[-86.227782999999988,64.983871000000022],[-86.225829999999974,64.998596000000134],[-86.225006000000008,65.003601000000003],[-86.212219000000005,65.03387500000008],[-86.206389999999885,65.043869000000086],[-86.198333999999988,65.054153000000099],[-86.189986999999917,65.064423000000033],[-86.18472300000002,65.069717000000026],[-86.165282999999931,65.080551000000071],[-86.144729999999981,65.08859300000006],[-86.138335999999924,65.094437000000028],[-86.138061999999991,65.099425999999994],[-86.135558999999944,65.1827550000001],[-86.137221999999952,65.197753999999975],[-86.141953000000001,65.212204000000099],[-86.146118000000001,65.216660000000047],[-86.151397999999972,65.226379000000009],[-86.164168999999958,65.250000000000114],[-86.170546999999942,65.269150000000081],[-86.171660999999915,65.278869999999984],[-86.153335999999911,65.384720000000073],[-86.149733999999967,65.394714000000079],[-86.111937999999952,65.494141000000013],[-86.097777999999948,65.529160000000104],[-86.013900999999976,65.709152000000074],[-86.010009999999909,65.714996000000099],[-85.993880999999988,65.730545000000006],[-85.982773000000009,65.740814000000057],[-85.975280999999882,65.746094000000085],[-85.888335999999981,65.799987999999928],[-85.832503999999915,65.832489000000066],[-85.791381999999999,65.853317000000118],[-85.770554000000004,65.862198000000035],[-85.728333000000021,65.879425000000083],[-85.696654999999907,65.891937000000041],[-85.621108999999933,65.917480000000012],[-85.56527699999998,65.930267000000015],[-85.542496000000028,65.933319000000097],[-85.506667999999991,65.934418000000051],[-85.493880999999988,65.932205000000124],[-85.491013000000009,65.931060999999943],[-85.482773000000009,65.927765000000079],[-85.476944000000003,65.923309000000017],[-85.468886999999938,65.913879000000122],[-85.469726999999978,65.908874999999966],[-85.473891999999978,65.898880000000077],[-85.488892000000021,65.878586000000098],[-85.511123999999995,65.857758000000047],[-85.520554000000004,65.84275800000006],[-85.523620999999991,65.823043999999982],[-85.520554000000004,65.813309000000061],[-85.516662999999994,65.808594000000028],[-85.510559000000001,65.804152999999928],[-85.493331999999953,65.795258000000103],[-85.480559999999969,65.791930999999977]],[[-62.136664999999937,65.851379000000009],[-62.141669999999976,65.849716000000058],[-62.154442000000017,65.850815000000068],[-62.162216000000001,65.854156000000103],[-62.210830999999985,65.880539000000056],[-62.296950999999979,65.927765000000079],[-62.296669000000009,65.938583000000051],[-62.281386999999995,65.946365000000014],[-62.265006999999969,65.946930000000066],[-62.230552999999986,65.943862999999965],[-62.167220999999984,65.932754999999986],[-62.137779000000023,65.925811999999951],[-62.139724999999999,65.913040000000137],[-62.118606999999997,65.881087999999977],[-62.129996999999889,65.859146000000123],[-62.136664999999937,65.851379000000009]],[[-67.138335999999981,65.92692599999998],[-67.145844000000011,65.926376000000118],[-67.154448999999943,65.92886400000009],[-67.161117999999988,65.932205000000124],[-67.185271999999941,65.948317999999972],[-67.209166999999923,65.978867000000037],[-67.211945000000014,65.982758000000103],[-67.208892999999989,65.984421000000054],[-67.199158000000011,65.986373999999955],[-67.181380999999874,65.987198000000092],[-67.166945999999939,65.984984999999995],[-67.153885000000002,65.978591999999992],[-67.152785999999992,65.974990999999989],[-67.152602999999885,65.970733999999993],[-67.134445000000028,65.933044000000052],[-67.134734999999921,65.930267000000015],[-67.138335999999981,65.92692599999998]],[[-83.576950000000011,65.983047000000056],[-83.588607999999965,65.981658999999922],[-83.60082999999986,65.983322000000044],[-83.604445999999996,65.987762000000089],[-83.60082999999986,65.993042000000116],[-83.588897999999972,66.003052000000025],[-83.570007000000032,66.013611000000083],[-83.547500999999954,66.019440000000088],[-83.511397999999986,66.019989000000066],[-83.498885999999914,66.01748699999996],[-83.493056999999965,66.012771999999927],[-83.50140399999998,66.00749200000007],[-83.510009999999966,66.003325999999959],[-83.554442999999935,65.988876000000062],[-83.576950000000011,65.983047000000056]],[[-84.722777999999948,65.546097000000088],[-84.733886999999982,65.544708000000128],[-84.746108999999933,65.545822000000101],[-84.78472899999997,65.556640999999956],[-84.803604000000007,65.565536000000009],[-84.828612999999962,65.578873000000044],[-84.840835999999967,65.588043000000084],[-84.848052999999879,65.597487999999998],[-84.853333000000021,65.606934000000138],[-84.852218999999934,65.611923000000104],[-84.857772999999952,65.645827999999995],[-84.858886999999925,65.650818000000072],[-84.866393999999957,65.659988000000112],[-84.878601000000003,65.669144000000074],[-84.900283999999942,65.67804000000001],[-85.028609999999958,65.711655000000064],[-85.063048999999921,65.723312000000021],[-85.073897999999986,65.727768000000083],[-85.082229999999981,65.732208000000128],[-85.106948999999929,65.750548999999921],[-85.118057000000022,65.764709000000039],[-85.181945999999982,65.945526000000086],[-85.173049999999932,65.994705000000067],[-85.143889999999942,66.021103000000039],[-85.137222000000008,66.023315000000082],[-85.081679999999949,66.026657],[-85.057495000000017,66.02609300000006],[-84.9375,66.010543999999982],[-84.924712999999997,66.008040999999992],[-84.910277999999892,66.000000000000114],[-84.887221999999952,65.945526000000086],[-84.883330999999885,65.940811000000053],[-84.807770000000005,65.895828000000108],[-84.755004999999869,65.853317000000118],[-84.716110000000015,65.817215000000147],[-84.714171999999962,65.807205000000067],[-84.712783999999942,65.802200000000028],[-84.707779000000016,65.792755000000113],[-84.637222000000008,65.712203999999986],[-84.597503999999958,65.696640000000116],[-84.586670000000026,65.692200000000071],[-84.574172999999917,65.639160000000004],[-84.576110999999969,65.629150000000095],[-84.585006999999962,65.61914100000007],[-84.598617999999931,65.608597000000032],[-84.667769999999962,65.560532000000023],[-84.722777999999948,65.546097000000088]],[[-83.608611999999994,66.044144000000074],[-83.642226999999991,66.034988000000112],[-83.652221999999995,66.036652000000117],[-83.653609999999901,66.04136699999998],[-83.647507000000019,66.046646000000123],[-83.644164999999987,66.051650999999993],[-83.626099000000011,66.066940000000102],[-83.618056999999965,66.072220000000129],[-83.607223999999974,66.07748400000014],[-83.597778000000005,66.078873000000101],[-83.583618000000001,66.070540999999935],[-83.577788999999996,66.06581100000011],[-83.570847000000015,66.056366000000025],[-83.574447999999961,66.051376000000005],[-83.58555599999994,66.048035000000141],[-83.59722899999997,66.046646000000123],[-83.608611999999994,66.044144000000074]],[[-85.019164999999987,66.05720500000001],[-85.135558999999944,66.044434000000081],[-85.147781000000009,66.045821999999987],[-85.149170000000026,66.05053700000002],[-85.107773000000009,66.084427000000119],[-85.09973100000002,66.089706000000092],[-85.063323999999966,66.087769000000037],[-85.038604999999961,66.086105000000032],[-85.016112999999905,66.079712000000086],[-85.008620999999948,66.070540999999935],[-85.006957999999941,66.065536000000066],[-85.010283999999956,66.060531999999967],[-85.019164999999987,66.05720500000001]],[[-83.649444999999901,66.083602999999982],[-83.661117999999988,66.081940000000031],[-83.673614999999984,66.083327999999938],[-83.692490000000021,66.091370000000097],[-83.696105999999986,66.096099999999979],[-83.689986999999974,66.111099000000024],[-83.685271999999941,66.121093999999914],[-83.678878999999995,66.125259000000142],[-83.606658999999979,66.124146000000053],[-83.593886999999938,66.121643000000063],[-83.587783999999999,66.117203000000075],[-83.591674999999896,66.112197999999978],[-83.604445999999996,66.105820000000051],[-83.610549999999932,66.10165399999994],[-83.638061999999991,66.086928999999998],[-83.649444999999901,66.083602999999982]],[[-83.921386999999982,66.009720000000016],[-83.730834999999956,65.947754000000032],[-83.705840999999964,65.934143000000063],[-83.694152999999972,65.924697999999978],[-83.683318999999983,65.910538000000088],[-83.680832000000009,65.901093000000003],[-83.689163000000008,65.866653000000042],[-83.699721999999952,65.851379000000009],[-83.713897999999972,65.841094999999939],[-83.724715999999944,65.836929000000055],[-83.73582499999992,65.833603000000039],[-83.727492999999924,65.799713000000111],[-83.525008999999955,65.737761999999918],[-83.360001000000011,65.727478000000076],[-83.348052999999993,65.726928999999984],[-83.25111400000003,65.716934000000037],[-83.226944000000003,65.714157000000114],[-83.214447000000007,65.710541000000092],[-83.210830999999871,65.705826000000059],[-83.25111400000003,65.654709000000139],[-83.259445000000028,65.649429000000055],[-83.288894999999968,65.632750999999985],[-83.299727999999959,65.629424999999969],[-83.311110999999983,65.627196999999967],[-83.345000999999968,65.62081900000004],[-83.379165999999998,65.615540000000067],[-83.391387999999949,65.617203000000131],[-83.399170000000026,65.62081900000004],[-83.406113000000005,65.630264000000068],[-83.41194200000001,65.634720000000016],[-83.419998000000021,65.639435000000049],[-83.430557000000022,65.643875000000037],[-83.443328999999949,65.648041000000148],[-83.468612999999948,65.654984000000127],[-83.493056999999965,65.65776100000005],[-83.505004999999926,65.658324999999991],[-83.528610000000015,65.658324999999991],[-83.598891999999978,65.656372000000033],[-83.660277999999948,65.647217000000012],[-83.829726999999991,65.64498900000001],[-83.842772999999909,65.649155000000121],[-83.846114999999941,65.653869999999984],[-83.84973100000002,65.668320000000108],[-83.846389999999985,65.673309000000074],[-83.840560999999866,65.678589000000102],[-83.794158999999979,65.719437000000028],[-83.785827999999981,65.724700999999982],[-83.775009000000011,65.728043000000127],[-83.740828999999962,65.733322000000101],[-83.695266999999944,65.741089000000045],[-83.684158000000025,65.74443100000002],[-83.682769999999948,65.749419999999986],[-83.688888999999961,65.754166000000055],[-83.785278000000005,65.788879000000065],[-83.797501000000011,65.789429000000098],[-83.808883999999978,65.78804000000008],[-83.84973100000002,65.780548000000124],[-83.90583799999996,65.767487000000017],[-83.927490000000034,65.759720000000073],[-83.938048999999978,65.74443100000002],[-83.948607999999922,65.740265000000079],[-83.960007000000019,65.737761999999918],[-83.971664000000033,65.737198000000149],[-83.983886999999925,65.738586000000055],[-84.071121000000005,65.75],[-84.120543999999938,65.758331000000055],[-84.133330999999941,65.760817999999972],[-84.143615999999952,65.764160000000061],[-84.145003999999972,65.769149999999968],[-84.141388000000006,65.774155000000007],[-84.11721799999998,65.789703000000031],[-84.111388999999974,65.794983000000059],[-84.103333000000021,65.809981999999934],[-84.101105000000018,65.819717000000026],[-84.123610999999926,65.900269000000037],[-84.189437999999996,65.968322999999998],[-84.198043999999925,65.973038000000031],[-84.208617999999888,65.977203000000031],[-84.286391999999978,65.999145999999996],[-84.299438000000009,66.002487000000031],[-84.31138599999997,66.003052000000025],[-84.323333999999988,66.002487000000031],[-84.358046999999999,65.997756999999979],[-84.369995000000017,65.997208000000057],[-84.382766999999944,66.000549000000092],[-84.424163999999962,66.028046000000018],[-84.436110999999926,66.037201000000096],[-84.464447000000007,66.060257000000092],[-84.468062999999972,66.064986999999974],[-84.469161999999983,66.069992000000013],[-84.470001000000025,66.089431999999988],[-84.471114999999998,66.128311000000053],[-84.470275999999956,66.133331000000112],[-84.464447000000007,66.138321000000133],[-84.455841000000021,66.141663000000051],[-84.433060000000012,66.138885000000073],[-84.381103999999993,66.129149999999981],[-84.368056999999908,66.125808999999947],[-84.240279999999927,66.098328000000095],[-84.146392999999875,66.081099999999992],[-84.039443999999946,66.076934999999992],[-84.00167799999997,66.033600000000035],[-83.921386999999982,66.009720000000016]],[[-84.579726999999991,66.141373000000044],[-84.627486999999917,66.139160000000118],[-84.639998999999989,66.140549000000078],[-84.648346000000004,66.144989000000123],[-84.654449,66.149429000000112],[-84.675827000000027,66.173035000000027],[-84.678604000000007,66.182480000000055],[-84.667220999999927,66.184981999999991],[-84.618880999999988,66.176651000000049],[-84.59333799999996,66.171097000000088],[-84.589447000000007,66.166382000000056],[-84.574448000000018,66.147491000000002],[-84.579726999999991,66.141373000000044]],[[-84.265288999999996,66.177765000000022],[-84.276947000000007,66.175262000000089],[-84.289169000000015,66.175537000000077],[-84.301391999999964,66.176926000000094],[-84.313889000000017,66.179428000000144],[-84.353333000000021,66.190262000000018],[-84.361937999999952,66.194702000000063],[-84.364440999999943,66.204436999999928],[-84.363616999999977,66.209427000000005],[-84.360001000000011,66.214432000000045],[-84.348343,66.215820000000122],[-84.335830999999985,66.214432000000045],[-84.30972300000002,66.207764000000054],[-84.299164000000019,66.203322999999955],[-84.27305599999994,66.196640000000002],[-84.264450000000011,66.192199999999957],[-84.258347000000015,66.187759000000085],[-84.256957999999997,66.1827550000001],[-84.265288999999996,66.177765000000022]],[[-62.183883999999864,66.237198000000092],[-62.199164999999994,66.216933999999924],[-62.404998999999862,66.218597000000045],[-62.415276000000006,66.219147000000078],[-62.421668999999952,66.222214000000008],[-62.42999999999995,66.229156000000103],[-62.426665999999898,66.233046999999999],[-62.419167000000016,66.237762000000032],[-62.319450000000018,66.269440000000031],[-62.301940999999999,66.274994000000049],[-62.287223999999924,66.278046000000131],[-62.278336000000024,66.279709000000082],[-62.261672999999973,66.280273000000022],[-62.24888599999997,66.278595000000109],[-62.243057000000022,66.276931999999988],[-62.231383999999935,66.269440000000031],[-62.183883999999864,66.237198000000092]],[[-83.067229999999881,66.255554000000075],[-83.054992999999911,66.254990000000134],[-83.043059999999969,66.255264000000068],[-83.031113000000005,66.256653000000028],[-83.019454999999994,66.259155000000135],[-82.996947999999975,66.265823000000069],[-82.960830999999985,66.272491000000059],[-82.937209999999936,66.275269000000037],[-82.91332999999986,66.276093000000003],[-82.902495999999985,66.271652000000131],[-82.904175000000009,66.266662999999937],[-82.910278000000005,66.261658000000068],[-82.918610000000001,66.257492000000013],[-82.92971799999998,66.25221300000004],[-82.935546999999929,66.251389000000074],[-82.990279999999984,66.203598],[-82.996384000000035,66.19859300000013],[-83.00778200000002,66.195250999999985],[-83.019729999999981,66.194977000000051],[-83.080291999999986,66.196640000000002],[-83.093062999999972,66.198868000000118],[-83.263335999999981,66.247208000000001],[-83.287216000000001,66.256104000000107],[-83.293335000000013,66.260544000000095],[-83.296660999999972,66.265273999999977],[-83.297775000000001,66.270263999999997],[-83.298339999999882,66.313873000000115],[-83.285004000000015,66.329163000000108],[-83.273055999999997,66.339432000000102],[-83.264175000000023,66.343597000000102],[-83.252228000000002,66.344986000000119],[-83.226944000000003,66.33998100000008],[-83.216110000000015,66.335541000000035],[-83.204726999999934,66.316666000000112],[-83.173889000000031,66.288589000000115],[-83.168059999999912,66.283874999999966],[-83.067229999999881,66.255554000000075]],[[-66.62332200000003,66.280823000000055],[-66.641952999999944,66.279434000000037],[-66.656951999999933,66.280273000000022],[-66.667495999999971,66.282760999999994],[-66.678878999999995,66.286925999999994],[-66.701400999999976,66.297760000000039],[-66.741942999999878,66.316376000000105],[-66.843063000000029,66.362487999999985],[-66.905837999999903,66.376648000000046],[-66.916107000000011,66.379974000000118],[-66.944716999999969,66.394989000000066],[-66.956115999999952,66.401932000000045],[-66.958617999999944,66.40637200000009],[-66.958344000000011,66.411926000000051],[-66.955276000000026,66.413605000000075],[-66.944442999999922,66.413879000000009],[-66.851943999999946,66.402205999999978],[-66.829726999999991,66.398330999999985],[-66.823059000000001,66.392761000000121],[-66.820846999999958,66.388046000000088],[-66.801101999999958,66.375534000000073],[-66.782227000000034,66.369141000000127],[-66.726944000000003,66.354980000000126],[-66.705565999999976,66.349715999999944],[-66.678329000000019,66.345535000000041],[-66.662216000000001,66.343597000000102],[-66.650283999999942,66.34304800000001],[-66.639724999999999,66.340546000000074],[-66.62388599999997,66.335266000000047],[-66.584441999999967,66.320541000000105],[-66.575012000000015,66.313873000000115],[-66.573623999999995,66.310806000000014],[-66.591675000000009,66.293593999999985],[-66.605269999999962,66.286652000000061],[-66.62332200000003,66.280823000000055]],[[-66.998336999999935,66.493042000000003],[-66.990279999999984,66.489150999999936],[-66.976104999999961,66.489150999999936],[-66.963332999999977,66.487198000000035],[-66.873321999999973,66.468596999999988],[-66.868880999999988,66.464431999999988],[-66.871384000000035,66.460541000000092],[-66.878052000000025,66.458327999999995],[-66.936110999999926,66.445525999999973],[-66.948883000000023,66.444702000000007],[-66.987212999999997,66.445250999999928],[-67.030288999999925,66.45248400000014],[-67.036666999999966,66.456099999999992],[-67.038329999999974,66.472488000000055],[-67.038054999999986,66.478043000000127],[-67.035278000000005,66.484711000000118],[-67.025008999999955,66.489975000000129],[-67.006957999999884,66.493042000000003],[-66.998336999999935,66.493042000000003]],[[-107.92304999999993,66.850540000000024],[-107.93499799999989,66.849152000000117],[-107.94611399999991,66.851089000000115],[-107.94554099999993,66.856934000000024],[-107.837784,67.003875999999991],[-107.83029199999993,67.008606000000043],[-107.81696299999993,67.009155000000135],[-107.80666400000001,67.005829000000119],[-107.79499800000002,66.997208000000001],[-107.79110699999995,66.988312000000064],[-107.78971899999999,66.985259999999982],[-107.79055800000003,66.979705999999965],[-107.82389799999999,66.901093000000003],[-107.83000199999992,66.895538000000101],[-107.89499699999999,66.860809000000017],[-107.90360999999996,66.856934000000024],[-107.92304999999993,66.850540000000024]],[[-108.01445000000001,66.897766000000047],[-108.025284,66.895538000000101],[-108.03859699999998,66.897217000000126],[-108.04444899999993,66.901382000000126],[-108.09638999999993,66.967484000000013],[-108.09777800000001,66.972762999999986],[-108.10659799999996,67.026001000000065],[-108.06360599999988,67.001099000000067],[-107.93831599999999,66.946930000000066],[-107.95944199999991,66.931655999999975],[-107.96665999999993,66.926651000000106],[-108.00583599999987,66.901931999999931],[-108.01445000000001,66.897766000000047]],[[-63.059166000000005,66.957764000000111],[-63.083327999999995,66.954987000000017],[-63.095550999999944,66.955826000000002],[-63.116942999999992,66.963043000000084],[-63.136391000000003,66.974701000000096],[-63.163054999999929,66.995255000000043],[-63.165549999999996,66.999145999999939],[-63.166106999999954,67.004990000000134],[-63.159163999999976,67.015549000000021],[-63.154166999999973,67.021378000000027],[-63.144446999999957,67.028869999999984],[-63.127494999999954,67.033599999999979],[-63.123055000000022,67.034713999999951],[-63.110831999999903,67.033875000000023],[-63.101668999999902,67.029709000000082],[-63.098052999999936,67.027205999999978],[-63.097778000000005,67.023315000000082],[-63.021111000000019,66.996643000000006],[-63.011672999999973,66.992477000000065],[-63.003890999999953,66.988585999999998],[-62.999999999999886,66.984420999999998],[-62.999442999999985,66.978591999999992],[-63.002228000000002,66.97554000000008],[-63.020835999999974,66.966385000000002],[-63.040000999999961,66.960815000000139],[-63.059166000000005,66.957764000000111]],[[-62.918334999999956,67.009720000000016],[-62.938048999999978,67.005829000000119],[-62.977775999999949,67.006653000000085],[-63.009726999999998,67.009995000000004],[-63.037780999999939,67.015823000000125],[-63.068335999999988,67.025543000000027],[-63.092772999999966,67.035812000000078],[-63.12388599999997,67.049149000000114],[-63.135559000000001,67.054703000000075],[-63.138892999999996,67.059418000000107],[-63.138054000000011,67.065262000000132],[-63.135833999999988,67.069716999999969],[-63.130279999999914,67.074158000000068],[-63.11721799999998,67.078873000000101],[-63.110557999999969,67.080276000000026],[-63.100081999999929,67.079712000000086],[-63.002228000000002,67.069443000000035],[-62.978333000000021,67.062759000000142],[-62.961112999999955,67.054703000000075],[-62.941108999999926,67.043593999999985],[-62.922500999999954,67.031097000000045],[-62.914444000000003,67.023041000000148],[-62.912215999999944,67.014708999999982],[-62.918334999999956,67.009720000000016]],[[-62.64416499999993,67.057479999999998],[-62.646949999999947,67.049988000000042],[-62.65166499999998,67.04693600000013],[-62.752501999999993,67.010543999999982],[-62.764449999999954,67.009155000000135],[-62.782775999999956,67.009430000000009],[-62.813056999999958,67.016937000000098],[-62.832222000000002,67.024429000000055],[-62.899445000000014,67.058318999999983],[-62.894599999999969,67.059113000000082],[-62.865004999999996,67.057479999999998],[-62.82028200000002,67.055817000000047],[-62.810279999999977,67.05693100000002],[-62.806664000000012,67.05914300000012],[-62.702869000000021,67.128685000000075],[-62.652221999999995,67.166091999999992],[-62.641945000000021,67.174149],[-62.631942999999865,67.176926000000037],[-62.547782999999924,67.186096000000134],[-62.533889999999985,67.187195000000088],[-62.425277999999992,67.191085999999984],[-62.418059999999969,67.19081099999994],[-62.37888299999986,67.169708000000071],[-62.375274999999931,67.165817000000004],[-62.376105999999936,67.164429000000098],[-62.388054000000011,67.157486000000063],[-62.443610999999919,67.135817999999972],[-62.451942000000031,67.132751000000042],[-62.472495999999978,67.126083000000051],[-62.504172999999923,67.119430999999963],[-62.538612000000001,67.113876000000062],[-62.569449999999961,67.105819999999994],[-62.580001999999979,67.102203000000088],[-62.596106999999961,67.092209000000025],[-62.631667999999934,67.069991999999957],[-62.638610999999912,67.063873000000115],[-62.64416499999993,67.057479999999998]],[[-107.40778399999999,67.083054000000004],[-107.49054699999999,67.071380999999974],[-107.50639299999995,67.072495000000117],[-107.51750199999987,67.074706999999989],[-107.52778599999999,67.078048999999965],[-107.54972800000002,67.08998100000008],[-107.56500199999999,67.103317000000061],[-107.57444799999996,67.112198000000149],[-107.58389299999988,67.121368000000018],[-107.59110999999996,67.130813999999987],[-107.62917299999992,67.18331900000004],[-107.63054699999992,67.188582999999994],[-107.62970699999988,67.194138000000066],[-107.62666300000001,67.200272000000098],[-107.62053700000001,67.206100000000049],[-107.60833700000001,67.20748900000001],[-107.59777799999995,67.204162999999994],[-107.58168000000001,67.196365000000128],[-107.57584400000002,67.192200000000128],[-107.56194299999987,67.183868000000132],[-107.51000999999991,67.15637200000009],[-107.47778299999993,67.140823000000012],[-107.46193700000003,67.133331000000055],[-107.44360399999999,67.126083000000051],[-107.412781,67.115814000000057],[-107.40055799999993,67.113037000000134],[-107.40778399999999,67.083054000000004]],[[-95.361663999999962,67.197754000000145],[-95.373610999999926,67.196365000000128],[-95.400557999999933,67.197204999999997],[-95.415282999999988,67.199707000000103],[-95.430831999999896,67.202773999999977],[-95.527495999999928,67.223037999999974],[-95.543334999999956,67.226379000000009],[-95.551392000000021,67.230270000000075],[-95.552779999999927,67.235260000000096],[-95.542220999999984,67.238585999999941],[-95.391112999999962,67.263046000000145],[-95.377776999999924,67.262772000000041],[-95.317229999999995,67.255554000000018],[-95.307220000000029,67.252486999999917],[-95.305832000000009,67.247757000000092],[-95.309432999999956,67.242203000000075],[-95.314712999999927,67.238585999999941],[-95.336669999999913,67.212769000000094],[-95.342772999999966,67.206940000000088],[-95.361663999999962,67.197754000000145]],[[-107.66278099999994,67.22026100000005],[-107.675003,67.218872000000033],[-107.73029300000002,67.289978000000076],[-107.73306300000002,67.300261999999918],[-107.73029300000002,67.306366000000139],[-107.72501399999993,67.31303400000013],[-107.71083099999998,67.319153000000142],[-107.67777999999993,67.311919999999986],[-107.66944899999993,67.30802900000009],[-107.66000399999996,67.298874000000012],[-107.64472999999998,67.269150000000025],[-107.64028899999994,67.253601000000117],[-107.63945000000001,67.242752000000053],[-107.64250199999992,67.236649000000114],[-107.64778100000001,67.229980000000012],[-107.65416699999997,67.224426000000051],[-107.66278099999994,67.22026100000005]],[[-63.366393999999957,67.287766000000033],[-63.396111000000019,67.269988999999953],[-63.417777999999998,67.26638800000012],[-63.456107999999972,67.264434999999992],[-63.507506999999976,67.269440000000031],[-63.541945999999939,67.272491000000059],[-63.55972300000002,67.273041000000092],[-63.578339000000028,67.273315000000025],[-63.62027699999993,67.269150000000025],[-63.763618000000008,67.272491000000059],[-63.81361400000003,67.279160000000104],[-63.829726999999878,67.28414900000007],[-63.819449999999961,67.289978000000076],[-63.796668999999952,67.299987999999985],[-63.688331999999889,67.341660000000047],[-63.666663999999969,67.345535000000041],[-63.646110999999962,67.348038000000031],[-63.605559999999969,67.352203000000031],[-63.585830999999871,67.353317000000004],[-63.485001000000011,67.341094999999996],[-63.369164000000012,67.302475000000072],[-63.357779999999991,67.293868999999972],[-63.366393999999957,67.287766000000033]],[[-107.91082799999998,67.310532000000023],[-107.93443300000001,67.306640999999956],[-107.94803599999995,67.308319000000097],[-108.08444199999997,67.381363000000079],[-108.076683,67.424698000000035],[-108.07389799999993,67.430817000000104],[-108.06861899999996,67.437485000000038],[-108.06111099999993,67.442200000000071],[-107.94748700000002,67.479980000000012],[-107.91776999999996,67.48942599999998],[-107.90306099999992,67.489151000000106],[-107.89472999999992,67.485535000000084],[-107.88722200000001,67.476089000000115],[-107.88276699999989,67.462494000000049],[-107.89806399999998,67.319717000000082],[-107.90110799999997,67.313598999999954],[-107.91082799999998,67.310532000000023]],[[-108.36833200000001,67.467209000000082],[-108.38194299999998,67.466660000000104],[-108.39806399999998,67.467758000000003],[-108.43388399999998,67.47665400000011],[-108.44444299999992,67.479980000000012],[-108.45278899999994,67.483871000000079],[-108.45889299999988,67.488037000000134],[-108.49249299999997,67.519714000000079],[-108.49638400000003,67.524429000000112],[-108.49582700000002,67.529984000000013],[-108.49137899999999,67.563034000000073],[-108.48137700000001,67.566375999999991],[-108.45777899999996,67.568054000000132],[-108.33583099999993,67.565810999999997],[-108.29750100000001,67.557205000000067],[-108.28582799999998,67.54304500000012],[-108.28443899999996,67.537766000000147],[-108.29527299999995,67.49693300000007],[-108.30166600000001,67.491089000000045],[-108.35722399999986,67.469437000000028],[-108.36833200000001,67.467209000000082]],[[-108.14111300000002,67.449997000000053],[-108.16944899999993,67.449707000000046],[-108.23665599999993,67.456650000000025],[-108.25167799999997,67.458878000000141],[-108.26222200000001,67.462204000000042],[-108.26806599999992,67.466660000000104],[-108.27194199999991,67.471374999999966],[-108.275284,67.481658999999979],[-108.22556299999997,67.565536000000122],[-108.21916199999987,67.571106000000043],[-108.20638999999994,67.570540999999992],[-108.19833399999999,67.566665999999998],[-108.17360699999995,67.552475000000015],[-108.1661069999999,67.54304500000012],[-108.13137799999993,67.481934000000024],[-108.12970699999994,67.47665400000011],[-108.12888299999997,67.465820000000065],[-108.12943999999999,67.460266000000047],[-108.13249200000001,67.454163000000108],[-108.14111300000002,67.449997000000053]],[[-108.32277699999997,67.589980999999966],[-108.32362399999994,67.586655000000121],[-108.33944700000001,67.587769000000094],[-108.42027300000001,67.599426000000051],[-108.48222399999992,67.631363000000022],[-108.48388699999992,67.636658000000068],[-108.475281,67.640548999999965],[-108.46389799999992,67.643051000000071],[-108.44803599999995,67.641937000000041],[-108.41832699999992,67.63638300000008],[-108.40334299999995,67.634155000000135],[-108.390289,67.631088000000034],[-108.379707,67.627762000000132],[-108.37138400000003,67.62414600000011],[-108.33416699999992,67.604156000000103],[-108.32277699999997,67.589980999999966]],[[-63.881942999999978,67.503326000000015],[-63.935555000000022,67.501938000000109],[-63.979163999999912,67.503052000000082],[-63.99500299999994,67.504166000000055],[-64.005279999999914,67.505263999999954],[-64.025283999999942,67.510544000000039],[-64.029723999999874,67.513885000000073],[-64.031677000000002,67.518600000000106],[-64.034728999999913,67.52887000000004],[-64.038054999999872,67.542755000000113],[-64.034438999999907,67.558594000000028],[-63.981110000000001,67.644150000000025],[-63.976944000000003,67.649428999999998],[-63.969993999999986,67.653595000000109],[-63.962775999999963,67.65554800000001],[-63.952498999999989,67.654434000000037],[-63.945549000000028,67.651382000000126],[-63.93721800000003,67.645263999999997],[-63.926392000000021,67.633330999999941],[-63.922226000000023,67.624985000000038],[-63.915549999999996,67.617203000000131],[-63.904442000000017,67.60803199999998],[-63.875556999999958,67.593048000000067],[-63.853888999999924,67.585541000000148],[-63.815276999999924,67.566665999999998],[-63.787223999999981,67.550537000000077],[-63.769996999999989,67.537766000000147],[-63.763618000000008,67.529709000000025],[-63.758056999999951,67.520538000000045],[-63.760833999999988,67.51527400000009],[-63.769447000000014,67.513321000000133],[-63.818335999999988,67.5086060000001],[-63.842223999999931,67.506377999999984],[-63.881942999999978,67.503326000000015]],[[-108.05999799999995,67.475266000000033],[-108.08972199999994,67.465546000000131],[-108.10333300000002,67.467209000000082],[-108.109444,67.471374999999966],[-108.11332700000003,67.476089000000115],[-108.14389,67.530547999999953],[-108.14277600000003,67.541655999999989],[-108.13362099999989,67.628036000000066],[-108.13221699999997,67.639434999999992],[-108.11776699999996,67.669982999999945],[-108.11361699999998,67.675261999999975],[-108.10109699999992,67.676651000000106],[-108.087219,67.674988000000042],[-108.01418299999995,67.662491000000045],[-108.00361599999997,67.65914900000007],[-107.99553700000001,67.655258000000003],[-107.98944099999994,67.651093000000003],[-107.98332199999999,67.644714000000135],[-107.92832900000002,67.561645999999996],[-107.92304999999993,67.551651000000049],[-107.92138699999992,67.54664600000001],[-107.922234,67.540817000000004],[-107.92749000000003,67.534424000000058],[-108.05999799999995,67.475266000000033]],[[-97.502791999999943,67.624420000000043],[-97.515563999999927,67.623871000000065],[-97.530288999999982,67.624985000000038],[-97.541381999999999,67.628860000000032],[-97.549437999999952,67.638045999999974],[-97.551391999999964,67.642761000000007],[-97.553054999999915,67.647766000000104],[-97.560546999999929,67.692748999999992],[-97.40055799999999,67.731658999999922],[-97.387786999999889,67.732208000000071],[-97.360001000000011,67.731658999999922],[-97.346389999999928,67.728317000000004],[-97.337783999999999,67.724152000000004],[-97.337783999999999,67.721100000000092],[-97.33277899999996,67.70637499999998],[-97.327224999999999,67.681655999999975],[-97.33277899999996,67.675812000000008],[-97.341675000000009,67.670532000000094],[-97.370543999999882,67.657760999999994],[-97.433608999999933,67.637497000000053],[-97.478881999999942,67.627472000000125],[-97.502791999999943,67.624420000000043]],[[-109.11221299999994,67.763321000000076],[-109.12581599999987,67.76249700000011],[-109.14111299999996,67.764998999999989],[-109.195267,67.775543000000027],[-109.20612299999993,67.778869999999984],[-109.20777900000002,67.783875000000023],[-109.16944899999999,67.797759999999926],[-109.15943899999996,67.801085999999998],[-109.135559,67.802764999999965],[-109.0933379999999,67.803863999999976],[-109.07584400000002,67.802199999999971],[-109.06054699999999,67.799713000000054],[-109.03916899999996,67.793320000000108],[-109.04083299999996,67.788315000000068],[-109.05277999999993,67.782486000000063],[-109.08000199999987,67.771103000000039],[-109.08972199999994,67.768051000000128],[-109.11221299999994,67.763321000000076]],[[-96.170546999999999,67.773041000000148],[-96.182769999999948,67.77165199999996],[-96.192490000000021,67.773605000000089],[-96.196380999999917,67.778046000000018],[-96.185821999999973,67.794708000000014],[-96.179992999999968,67.800262000000032],[-96.171386999999925,67.806366000000025],[-96.098617999999988,67.832213999999965],[-96.077224999999942,67.838882000000126],[-96.065552000000025,67.841095000000109],[-96.053328999999962,67.842758000000003],[-96.040282999999931,67.843323000000055],[-96.02806099999998,67.841659999999933],[-95.997498000000007,67.820830999999998],[-95.996384000000035,67.81581100000011],[-96.004729999999995,67.809708000000001],[-96.016113000000018,67.807479999999998],[-96.040832999999964,67.804428000000087],[-96.170546999999999,67.773041000000148]],[[-114.11501299999998,67.883880999999974],[-114.08222999999998,67.883041000000105],[-114.02223200000003,67.884155000000078],[-114.00583599999999,67.8836060000001],[-113.95500199999998,67.881362999999965],[-113.92138699999998,67.878036000000009],[-113.925003,67.874694999999974],[-113.94138299999986,67.875259000000142],[-113.98638899999997,67.874419999999986],[-113.99999999999994,67.873306000000014],[-114.01027699999992,67.871368000000075],[-114.05166600000001,67.870254999999986],[-114.08306900000002,67.87052900000009],[-114.195267,67.872482000000048],[-114.22972099999987,67.874146000000053],[-114.25250199999999,67.879974000000004],[-114.29638699999998,67.892212000000029],[-114.29695100000004,67.895263999999941],[-114.27555799999999,67.900542999999914],[-114.25110599999994,67.904433999999981],[-114.21972700000003,67.904160000000047],[-114.20612299999993,67.901932000000102],[-114.17388899999997,67.892487000000074],[-114.14862099999999,67.887206999999989],[-114.13305700000001,67.885269000000051],[-114.11501299999998,67.883880999999974]],[[-97.856383999999935,67.850539999999967],[-97.866942999999992,67.846939000000134],[-97.924164000000019,67.849991000000045],[-97.954453000000001,67.856368999999972],[-97.963333000000034,67.860260000000039],[-97.970001000000025,67.86442599999998],[-97.974166999999909,67.869141000000013],[-97.973327999999924,67.874146000000053],[-97.976944000000003,67.884155000000078],[-97.97444200000001,67.904984000000013],[-97.961120999999991,67.90554800000001],[-97.933318999999983,67.89888000000002],[-97.920272999999952,67.893600000000106],[-97.91361999999998,67.889160000000118],[-97.895554000000004,67.881362999999965],[-97.86221299999994,67.859985000000052],[-97.858046999999942,67.855255],[-97.856383999999935,67.850539999999967]],[[-108.64695699999999,67.86943100000002],[-108.66082799999998,67.868865999999969],[-108.66915899999998,67.872482000000048],[-108.64666699999998,67.887206999999989],[-108.58500700000002,67.915543000000071],[-108.56610099999989,67.922759999999982],[-108.54472399999997,67.928314],[-108.531113,67.928864000000033],[-108.38027999999997,67.922484999999995],[-108.37082699999996,67.919708000000071],[-108.36444099999994,67.915543000000071],[-108.36110699999989,67.905257999999947],[-108.35944399999994,67.899993999999992],[-108.41221599999994,67.885817999999972],[-108.64695699999999,67.86943100000002]],[[-113.390289,67.897766000000047],[-113.46389799999997,67.895828000000108],[-113.52694699999995,67.896378000000141],[-113.55972300000002,67.897491000000002],[-113.59416199999993,67.899428999999941],[-113.60333299999991,67.903046000000074],[-113.59750399999996,67.906647000000135],[-113.58528100000001,67.908600000000092],[-113.41972399999997,67.925262000000089],[-113.39111300000002,67.926651000000049],[-113.34750400000001,67.928040000000067],[-113.27390299999996,67.929977000000122],[-113.25723299999993,67.929428000000144],[-113.25029000000001,67.925262000000089],[-113.24694799999997,67.914429000000098],[-113.25361599999997,67.909424000000058],[-113.27778599999999,67.905822999999998],[-113.297234,67.904433999999981],[-113.33444199999991,67.901092999999946],[-113.390289,67.897766000000047]],[[-112.93055700000002,67.916655999999989],[-112.98361199999999,67.915268000000083],[-112.99999999999989,67.916092000000049],[-113.06027199999994,67.915268000000083],[-113.13110399999999,67.911652000000004],[-113.14750700000002,67.912200999999982],[-113.14750700000002,67.915817000000004],[-113.13806199999999,67.919144000000131],[-112.94304699999998,67.931091000000094],[-112.89639299999999,67.93081699999999],[-112.88722199999995,67.927200000000028],[-112.890289,67.921921000000054],[-112.90110800000002,67.919144000000131],[-112.93055700000002,67.916655999999989]],[[-111.07167099999998,67.847488000000055],[-111.08666999999997,67.847488000000055],[-111.0911099999999,67.852203000000088],[-111.08693700000003,67.858871000000079],[-111.07028200000002,67.867203000000075],[-110.84889199999998,67.954711999999972],[-110.83917200000002,67.958037999999988],[-110.82668299999995,67.959717000000012],[-110.81388900000002,67.959152000000017],[-110.80722000000003,67.954987000000017],[-110.80943300000001,67.948867999999948],[-110.81696299999999,67.940262000000018],[-110.86221299999994,67.894989000000123],[-110.86945300000002,67.889984000000084],[-110.88027999999991,67.887496999999996],[-111.05943300000001,67.849152000000061],[-111.07167099999998,67.847488000000055]],[[-114.21916199999998,67.945250999999985],[-114.29583699999995,67.944702000000063],[-114.30999799999995,67.945816000000036],[-114.31722999999988,67.949707000000103],[-114.31082200000003,67.954711999999972],[-114.30027799999988,67.957489000000066],[-114.25446299999987,67.963318000000072],[-114.17138699999992,67.969147000000078],[-114.13999899999999,67.96887200000009],[-114.12416099999996,67.967209000000139],[-114.12110899999993,67.961929000000055],[-114.12332199999992,67.958037999999988],[-114.16332999999986,67.949142000000052],[-114.20388800000001,67.945816000000036],[-114.21916199999998,67.945250999999985]],[[-108.13806199999999,67.872482000000048],[-108.15167199999996,67.871918000000107],[-108.24553699999996,67.878036000000009],[-108.25418100000002,67.881927000000076],[-108.25556899999992,67.887206999999989],[-108.23916599999995,67.920258000000103],[-108.236107,67.926376000000062],[-108.23111,67.933044000000052],[-108.22471599999994,67.938873000000058],[-108.198036,67.950821000000076],[-108.14723200000003,67.96665999999999],[-108.12581599999999,67.972214000000008],[-108.114441,67.974426000000051],[-108.10056299999997,67.974991000000102],[-108.08416699999998,67.97387700000013],[-108.07140399999992,67.971100000000035],[-108.06054699999999,67.967758000000117],[-108.05444299999988,67.963318000000072],[-108.05055199999998,67.958603000000039],[-108.048607,67.949142000000052],[-108.05139200000002,67.926651000000049],[-108.06331599999993,67.902206000000035],[-108.06833599999999,67.895538000000045],[-108.07501200000002,67.889709000000039],[-108.08249699999999,67.884995000000117],[-108.09137699999985,67.880814000000044],[-108.11277799999999,67.87553400000013],[-108.13806199999999,67.872482000000048]],[[-113.72000099999997,67.973312000000078],[-113.72778299999993,67.969147000000078],[-113.73998999999998,67.967209000000139],[-113.75361599999997,67.966094999999996],[-113.79750099999995,67.964705999999978],[-113.99305699999996,67.961104999999918],[-113.99109599999997,67.964995999999985],[-113.98249800000002,67.967209000000139],[-113.97250400000001,67.968597000000045],[-113.91639700000002,67.972214000000008],[-113.88639799999999,67.972762999999986],[-113.83833299999998,67.971924000000001],[-113.81111099999993,67.97387700000013],[-113.78527800000001,67.976929000000041],[-113.77223199999997,67.980270000000075],[-113.74082899999996,67.979980000000069],[-113.72501399999999,67.978043000000014],[-113.72000099999997,67.973312000000078]],[[-109.195267,67.989974999999959],[-109.04998799999993,67.958328000000051],[-109.03028899999993,67.966933999999924],[-108.99082900000002,67.976379000000009],[-108.97693599999997,67.976929000000041],[-108.95111099999991,67.973312000000078],[-108.89723199999997,67.956940000000088],[-108.88445300000001,67.94859300000013],[-108.86554699999999,67.905822999999998],[-108.86609599999991,67.90026899999998],[-108.87943999999999,67.875259000000142],[-108.88806199999999,67.871093999999971],[-108.90055799999999,67.869705000000124],[-108.916946,67.87052900000009],[-109.04888900000003,67.90387000000004],[-109.10305799999998,67.920258000000103],[-109.135559,67.930267000000129],[-109.16972399999992,67.945250999999985],[-109.18888899999996,67.957764000000054],[-109.195267,67.962204000000099],[-109.19888299999997,67.972488000000112],[-109.198036,67.983871000000136],[-109.195267,67.989974999999959]],[[-110.33444199999997,68.011658000000125],[-110.39362299999993,68.011108000000092],[-110.41000400000001,68.011932000000058],[-110.42111199999994,68.014998999999932],[-110.42083700000001,68.020827999999995],[-110.41055299999999,68.024704000000042],[-110.32640099999992,68.047760000000096],[-110.317497,68.049712999999997],[-110.31082199999992,68.045532000000094],[-110.30888400000003,68.037491000000045],[-110.316101,68.019150000000025],[-110.32333399999999,68.014160000000004],[-110.33444199999997,68.011658000000125]],[[-98.951401000000033,67.979980000000069],[-98.963622999999927,67.978317000000118],[-98.979445999999939,67.980270000000075],[-99.005004999999983,67.987198000000092],[-99.014450000000011,67.991088999999988],[-99.028335999999911,67.999420000000043],[-99.078612999999905,68.045592999999997],[-99.051392000000021,68.055817000000047],[-98.990554999999858,68.078323000000069],[-98.975554999999986,68.077209000000039],[-98.968886999999995,68.073044000000039],[-98.964721999999995,68.064987000000087],[-98.934432999999956,67.99664300000012],[-98.934998000000007,67.991363999999976],[-98.942763999999954,67.985259999999926],[-98.951401000000033,67.979980000000069]],[[-65.397232000000031,68.039978000000133],[-65.409163999999976,68.039428999999984],[-65.500290000000007,68.046097000000145],[-65.510833999999988,68.04942299999999],[-65.516662999999994,68.05442800000003],[-65.519729999999981,68.067490000000078],[-65.518065999999976,68.072220000000073],[-65.505279999999971,68.076385000000073],[-65.43582200000003,68.088042999999971],[-65.394454999999994,68.08998100000008],[-65.386397999999929,68.088318000000129],[-65.390288999999996,68.078323000000069],[-65.383057000000008,68.053314000000057],[-65.383330999999941,68.048599000000024],[-65.387222000000008,68.043320000000051],[-65.397232000000031,68.039978000000133]],[[-108.50611900000001,68.034714000000122],[-108.51862299999993,68.033324999999934],[-108.53388999999999,68.035538000000088],[-108.54028299999993,68.039978000000133],[-108.53751399999999,68.046097000000145],[-108.45472699999999,68.090546000000074],[-108.44748700000002,68.087769000000037],[-108.44583099999994,68.082489000000123],[-108.44611399999991,68.074706999999989],[-108.45140100000003,68.068054000000018],[-108.46665999999999,68.058319000000097],[-108.49722299999996,68.038879000000122],[-108.50611900000001,68.034714000000122]],[[-109.32167099999998,67.981094000000041],[-109.33556399999992,67.980270000000075],[-109.35193600000002,67.981369000000086],[-109.37805199999991,67.986923000000047],[-109.432503,68.003052000000025],[-109.49804699999993,68.022766000000104],[-109.50666799999993,68.026382000000126],[-109.53888699999999,68.047485000000052],[-109.54305999999991,68.052200000000084],[-109.50473,68.088882000000069],[-109.49749799999989,68.093597000000102],[-109.484734,68.095260999999937],[-109.44722000000002,68.092209000000025],[-109.41055299999999,68.071930000000066],[-109.32167099999998,68.039978000000133],[-109.31527699999987,68.035812000000021],[-109.3116609999999,68.025543000000027],[-109.31111099999987,67.997756999999922],[-109.3116609999999,67.991928000000087],[-109.31416299999995,67.985809000000074],[-109.32167099999998,67.981094000000041]],[[-108.36054999999999,68.049712999999997],[-108.37444299999993,68.048874000000069],[-108.38751200000002,68.05192599999998],[-108.40638699999994,68.064697000000081],[-108.40805099999994,68.069716999999969],[-108.40167200000002,68.075546000000145],[-108.38221699999991,68.092758000000003],[-108.37444299999993,68.095535000000041],[-108.36193800000001,68.096939000000077],[-108.32000699999992,68.098877000000016],[-108.306107,68.099425999999937],[-108.29444899999999,68.097214000000065],[-108.297234,68.091095000000053],[-108.29778299999998,68.085541000000035],[-108.30082700000003,68.079437000000041],[-108.30860899999999,68.074706999999989],[-108.34916699999997,68.05192599999998],[-108.36054999999999,68.049712999999997]],[[-110.21362299999998,68.038039999999967],[-110.23998999999998,68.035812000000021],[-110.25639299999995,68.036652000000061],[-110.25862100000001,68.041931000000034],[-110.25,68.046097000000145],[-110.22165699999994,68.056641000000013],[-110.18195300000002,68.069716999999969],[-109.93276999999989,68.131927000000076],[-109.92166099999997,68.134155000000021],[-109.89639299999999,68.13749700000011],[-109.88583399999993,68.136383000000137],[-109.87721299999993,68.12692300000009],[-109.87748699999997,68.121368000000018],[-109.882767,68.114151000000106],[-109.88527699999997,68.108032000000037],[-109.88999899999993,68.101379000000065],[-109.89584399999995,68.095535000000041],[-109.90334300000001,68.090546000000074],[-109.92111199999994,68.081664999999987],[-109.93222000000003,68.079163000000108],[-110.08721899999995,68.053314000000057],[-110.21362299999998,68.038039999999967]],[[-112.78056299999997,68.131088000000091],[-112.79276999999996,68.129424999999969],[-112.88999899999999,68.137207000000103],[-112.9058379999999,68.139160000000061],[-112.91722099999998,68.142211999999972],[-112.922234,68.146652000000017],[-112.91832699999992,68.153594999999996],[-112.91306299999997,68.159424000000001],[-112.90638699999994,68.164429000000041],[-112.89835399999998,68.168869000000086],[-112.88861099999997,68.172211000000004],[-112.87638900000002,68.173874000000126],[-112.86110699999995,68.174149000000114],[-112.76722699999993,68.166656000000103],[-112.75167799999997,68.164703000000145],[-112.74973299999994,68.158034999999984],[-112.74472000000003,68.153594999999996],[-112.74638399999998,68.147490999999945],[-112.75334199999998,68.142211999999972],[-112.76139799999993,68.138046000000088],[-112.78056299999997,68.131088000000091]],[[-74.21556099999998,68.117751999999939],[-74.164718999999991,68.065536000000066],[-73.974716000000001,68.041092000000106],[-73.736388999999974,68.013611000000026],[-73.655471999999975,68.007705999999985],[-73.643340999999907,68.012207000000046],[-73.619995000000017,68.014998999999932],[-73.608886999999868,68.015548999999965],[-73.578063999999983,68.014434999999992],[-73.567504999999983,68.013046000000031],[-73.543883999999935,68.008330999999998],[-73.439986999999974,67.985535000000141],[-73.428329000000019,67.982208000000014],[-73.418883999999991,67.97886699999998],[-73.411666999999966,67.974991000000102],[-73.409728999999913,67.970534999999984],[-73.348617999999988,67.828048999999965],[-73.361664000000019,67.810257000000092],[-73.377776999999867,67.793869000000029],[-73.383330999999941,67.789429000000041],[-73.404175000000009,67.774994000000106],[-73.411391999999921,67.770537999999988],[-73.418609999999944,67.766388000000006],[-73.429442999999992,67.762771999999927],[-73.449431999999945,67.76249700000011],[-73.664168999999958,67.774704000000099],[-73.932219999999916,67.78637700000013],[-73.993057000000022,67.788040000000024],[-74.038329999999917,67.788589000000002],[-74.083892999999875,67.788315000000068],[-74.113327000000027,67.787201000000096],[-74.168059999999855,67.78276100000005],[-74.228881999999942,67.775268999999923],[-74.251952999999901,67.772491000000116],[-74.263061999999991,67.77165199999996],[-74.305832000000009,67.768600000000049],[-74.32028200000002,67.768875000000094],[-74.388610999999969,67.775268999999923],[-74.400833000000034,67.776657000000057],[-74.481109999999944,67.789429000000041],[-74.535278000000005,67.804703000000131],[-74.564162999999951,67.814423000000033],[-74.581680000000006,67.821381000000031],[-74.59722899999997,67.828598000000113],[-74.640838999999971,67.852203000000088],[-74.659728999999913,67.864700000000084],[-74.684433000000013,67.881927000000076],[-74.758895999999993,67.950271999999984],[-74.772232000000031,67.963318000000072],[-74.775557999999876,67.969147000000078],[-74.777221999999995,67.97387700000013],[-74.778060999999923,68.006104000000107],[-74.777495999999985,68.017761000000064],[-74.773055999999997,68.029984000000127],[-74.760009999999966,68.05442800000003],[-74.754181000000017,68.06053200000008],[-74.748610999999926,68.065536000000066],[-74.731948999999872,68.070831000000112],[-74.718613000000005,68.072220000000073],[-74.629990000000021,68.078598000000056],[-74.615279999999984,68.078323000000069],[-74.436661000000015,68.097487999999998],[-74.363892000000021,68.166381999999999],[-74.355834999999956,68.172759999999982],[-74.346953999999926,68.176376000000005],[-74.339447000000007,68.177199999999971],[-74.322509999999909,68.173035000000141],[-74.268889999999999,68.154984000000013],[-74.239440999999999,68.144989000000066],[-74.231673999999941,68.141936999999984],[-74.216399999999965,68.134155000000021],[-74.212509000000011,68.130538999999942],[-74.210830999999985,68.124984999999981],[-74.21556099999998,68.117751999999939]],[[-65.642226999999991,68.159424000000001],[-65.56639100000001,68.152205999999978],[-65.512787000000003,68.15277100000003],[-65.502791999999999,68.151093000000117],[-65.497771999999941,68.14776599999999],[-65.494445999999925,68.142487000000017],[-65.495543999999995,68.128310999999997],[-65.500838999999985,68.121918000000051],[-65.516953000000001,68.113037000000077],[-65.525283999999999,68.109711000000061],[-65.675551999999982,68.096100000000092],[-65.686935000000005,68.095825000000104],[-65.696105999999929,68.098877000000016],[-65.709731999999974,68.106094000000098],[-65.713897999999972,68.112762000000089],[-65.721938999999963,68.164429000000041],[-65.716949,68.175812000000064],[-65.711670000000026,68.180267000000072],[-65.701400999999976,68.181366000000082],[-65.67582699999997,68.179977000000065],[-65.656661999999926,68.175262000000032],[-65.648345999999947,68.168594000000041],[-65.646666999999923,68.163605000000075],[-65.642226999999991,68.159424000000001]],[[-107.47361799999993,68.144714000000079],[-107.48500100000001,68.142487000000017],[-107.50140399999998,68.143600000000049],[-107.55499299999991,68.160537999999974],[-107.55416899999994,68.166091999999992],[-107.54499800000002,68.169983000000059],[-107.5038909999999,68.182480000000055],[-107.49472000000003,68.18664600000011],[-107.48444399999994,68.189697000000137],[-107.46806300000003,68.188582999999994],[-107.46193700000003,68.184142999999949],[-107.46028100000001,68.179153000000099],[-107.45935800000001,68.175629000000015],[-107.45667299999997,68.174423000000047],[-107.45527600000003,68.169144000000074],[-107.45584099999996,68.163605000000075],[-107.46694899999994,68.15026899999998],[-107.47361799999993,68.144714000000079]],[[-104.453056,68.102203000000031],[-104.48277299999995,68.079712000000029],[-104.497772,68.080275999999969],[-104.50334199999992,68.084717000000069],[-104.55304699999999,68.140274000000034],[-104.55610699999994,68.145264000000111],[-104.55695299999996,68.15026899999998],[-104.55387899999999,68.161651999999947],[-104.54666099999997,68.164992999999981],[-104.42639200000002,68.199997000000053],[-104.41555799999998,68.202773999999977],[-104.391953,68.206940000000088],[-104.37721299999998,68.199707000000046],[-104.36860699999994,68.190536000000122],[-104.370003,68.184982000000105],[-104.37416100000002,68.178863999999976],[-104.40499899999992,68.139435000000049],[-104.453056,68.102203000000031]],[[-107.38890100000003,68.172211000000004],[-107.40278599999999,68.171645999999953],[-107.41111799999999,68.17553700000002],[-107.44167299999992,68.196929999999952],[-107.445267,68.201660000000004],[-107.43998699999997,68.208327999999995],[-107.42944299999999,68.211380000000077],[-107.41443599999997,68.211105000000089],[-107.30972300000002,68.209152000000131],[-107.295547,68.20748900000001],[-107.29167200000001,68.202773999999977],[-107.31054699999999,68.196091000000024],[-107.38890100000003,68.172211000000004]],[[-111.83332799999999,68.181931000000077],[-111.84722899999997,68.180817000000104],[-111.860817,68.183594000000028],[-111.86554699999999,68.188034000000016],[-111.83222999999998,68.204987000000131],[-111.81416300000001,68.212494000000049],[-111.79194599999994,68.21775800000006],[-111.77944899999994,68.219437000000028],[-111.764183,68.219437000000028],[-111.75499699999995,68.215820000000122],[-111.75945299999995,68.209152000000131],[-111.76666299999994,68.206375000000037],[-111.79194599999994,68.193588000000034],[-111.81111099999998,68.186920000000043],[-111.83332799999999,68.181931000000077]],[[-98.650283999999999,68.180267000000072],[-98.674438000000009,68.173874000000126],[-98.704453000000001,68.176085999999998],[-98.702788999999996,68.191650000000095],[-98.693328999999949,68.213608000000022],[-98.684433000000013,68.218872000000033],[-98.672226000000023,68.220534999999927],[-98.657226999999978,68.219437000000028],[-98.643065999999976,68.216095000000109],[-98.638610999999969,68.211655000000121],[-98.636672999999917,68.206650000000025],[-98.643065999999976,68.201660000000004],[-98.650283999999999,68.180267000000072]],[[-74.062774999999988,68.151657000000057],[-74.073623999999938,68.150818000000072],[-74.138335999999924,68.170258000000047],[-74.169723999999974,68.195525999999973],[-74.176392000000021,68.204162999999994],[-74.171386999999982,68.208602999999982],[-74.15583799999996,68.217484000000127],[-74.138061999999991,68.225815000000011],[-74.117217999999923,68.232207999999957],[-74.105835000000013,68.235260000000096],[-74.097228999999913,68.236649000000057],[-74.086944999999957,68.235260000000096],[-74.079726999999991,68.232483000000002],[-74.075286999999946,68.227767999999969],[-74.073059000000001,68.223877000000073],[-74.063323999999909,68.203049000000021],[-74.055557000000022,68.172485000000108],[-74.054442999999992,68.159988000000112],[-74.057219999999973,68.154984000000013],[-74.062774999999988,68.151657000000057]],[[-108.59028599999999,68.214431999999988],[-108.63944999999995,68.151382000000012],[-108.6499859999999,68.152481000000023],[-108.65862299999998,68.156097000000045],[-108.67748999999998,68.168869000000086],[-108.67360699999995,68.186371000000122],[-108.67194399999994,68.191085999999984],[-108.63500999999997,68.228592000000106],[-108.62748699999992,68.233597000000145],[-108.60555999999997,68.23692299999999],[-108.56610099999989,68.240540000000124],[-108.55972300000002,68.236099000000024],[-108.59028599999999,68.214431999999988]],[[-109.78388999999999,68.13749700000011],[-109.81166099999996,68.136107999999979],[-109.828056,68.136932000000115],[-109.84137699999997,68.139708999999982],[-109.84999099999999,68.143325999999945],[-109.85665899999998,68.14776599999999],[-109.85417200000001,68.153869999999984],[-109.845551,68.158034999999984],[-109.77194199999997,68.188309000000061],[-109.676941,68.224152000000061],[-109.64417300000002,68.232207999999957],[-109.58889799999997,68.245254999999986],[-109.57749899999988,68.247482000000048],[-109.56806899999998,68.247208000000114],[-109.57055699999995,68.241089000000102],[-109.57695000000001,68.232483000000002],[-109.58194700000001,68.225815000000011],[-109.59416199999993,68.214431999999988],[-109.67388899999997,68.173309000000074],[-109.7625119999999,68.143325999999945],[-109.77250699999991,68.139984000000027],[-109.78388999999999,68.13749700000011]],[[-66.31361400000003,68.14776599999999],[-66.326950000000011,68.147490999999945],[-66.354995999999971,68.153319999999951],[-66.381103999999937,68.158600000000035],[-66.396392999999932,68.161102000000085],[-66.468612999999948,68.171097000000032],[-66.527785999999878,68.177765000000022],[-66.570847000000015,68.181366000000082],[-66.601944000000003,68.182480000000055],[-66.607223999999974,68.217209000000082],[-66.5,68.239700000000084],[-66.299437999999952,68.254440000000045],[-66.221938999999963,68.241089000000102],[-66.256667999999991,68.163605000000075],[-66.269729999999925,68.158600000000035],[-66.301391999999964,68.149154999999951],[-66.31361400000003,68.14776599999999]],[[-96.384170999999924,68.200821000000019],[-96.422775000000001,68.198318000000086],[-96.436935000000005,68.198593000000074],[-96.448607999999922,68.20248400000014],[-96.454726999999934,68.206650000000025],[-96.462783999999999,68.216095000000109],[-96.456664999999987,68.221649000000127],[-96.375,68.254715000000033],[-96.364166000000012,68.258041000000105],[-96.350829999999974,68.258605999999929],[-96.344451999999933,68.254166000000112],[-96.317504999999926,68.231934000000024],[-96.324448000000018,68.221099999999979],[-96.338897999999915,68.212204000000042],[-96.348891999999864,68.208037999999988],[-96.360001000000011,68.204712000000086],[-96.384170999999924,68.200821000000019]],[[-78.571670999999981,68.200272000000098],[-78.655563000000029,68.187759000000028],[-78.662216000000001,68.189147999999989],[-78.660277999999892,68.196365000000128],[-78.643065999999976,68.218323000000055],[-78.607223999999917,68.248322000000087],[-78.593886999999881,68.255554000000018],[-78.581115999999952,68.258880999999974],[-78.550277999999992,68.263610999999969],[-78.548049999999989,68.263046000000145],[-78.545273000000009,68.25],[-78.525283999999999,68.233597000000145],[-78.517226999999934,68.223312000000021],[-78.522506999999905,68.21775800000006],[-78.532226999999978,68.213043000000027],[-78.558883999999978,68.203049000000021],[-78.571670999999981,68.200272000000098]],[[-86.426391999999964,68.069152999999972],[-86.397507000000019,68.021652000000131],[-86.378325999999959,67.993317000000104],[-86.376662999999951,67.988585999999998],[-86.368606999999997,67.954711999999972],[-86.370833999999945,67.939972000000012],[-86.396117999999944,67.859711000000118],[-86.403609999999958,67.848877000000073],[-86.465012000000002,67.786652000000117],[-86.47084000000001,67.78137200000009],[-86.489989999999977,67.770537999999988],[-86.571945000000028,67.728867000000037],[-86.583617999999944,67.725266000000147],[-86.596663999999976,67.72554000000008],[-86.676665999999955,67.731658999999922],[-86.690552000000025,67.733871000000022],[-86.858336999999949,67.79693599999996],[-86.879439999999931,67.810257000000092],[-86.883895999999936,67.814986999999974],[-86.910278000000005,67.8477630000001],[-86.918610000000001,67.86192299999999],[-86.926940999999999,67.876373000000115],[-86.945830999999941,67.909424000000058],[-86.951949999999897,67.923874000000012],[-86.948607999999979,67.928864000000033],[-86.940551999999968,67.934418000000051],[-86.926101999999958,67.931366000000082],[-86.913329999999974,67.931931000000134],[-86.854445999999882,67.954163000000051],[-86.84333799999996,67.958603000000039],[-86.838897999999972,67.986374000000126],[-86.836945000000014,68.001099000000067],[-86.840835999999911,68.010818000000029],[-86.847503999999958,68.020263999999997],[-86.851944000000003,68.024994000000049],[-86.863892000000021,68.029159999999933],[-86.878325999999959,68.032210999999961],[-86.904175000000009,68.030548000000067],[-86.932495000000017,68.035812000000021],[-86.942214999999976,68.040267999999969],[-86.986664000000019,68.061646000000053],[-86.992766999999901,68.066666000000112],[-86.991942999999935,68.071655000000078],[-86.98832699999997,68.081664999999987],[-86.978881999999999,68.096939000000077],[-86.906386999999938,68.180267000000072],[-86.89805599999994,68.185531999999967],[-86.742492999999911,68.282760999999937],[-86.711944999999957,68.299149],[-86.700561999999934,68.303589000000045],[-86.675003000000004,68.306091000000094],[-86.646666999999923,68.301651000000106],[-86.602782999999988,68.291367000000037],[-86.538605000000018,68.270538000000101],[-86.487503000000004,68.24859600000002],[-86.458617999999888,68.235535000000084],[-86.411117999999988,68.208878000000027],[-86.406661999999983,68.204162999999994],[-86.402785999999992,68.194427000000019],[-86.434998000000007,68.162491000000102],[-86.433884000000035,68.098601999999971],[-86.432495000000017,68.088882000000069],[-86.426391999999964,68.069152999999972]],[[-111.71028100000001,68.220534999999927],[-111.72556299999997,68.220260999999994],[-111.74221799999998,68.221099999999979],[-111.75583599999993,68.223602000000028],[-111.76500699999997,68.227203000000088],[-111.77194199999991,68.231369000000029],[-111.77639799999992,68.236099000000024],[-111.77887699999997,68.241089000000102],[-111.77916699999997,68.246933000000126],[-111.77722199999999,68.253052000000139],[-111.77166699999998,68.258880999999974],[-111.71501199999994,68.296936000000073],[-111.70388799999989,68.299422999999933],[-111.52887699999991,68.310806000000127],[-111.51363400000002,68.311096000000134],[-111.49944299999993,68.296936000000073],[-111.50446299999999,68.292480000000126],[-111.52861000000001,68.290543000000071],[-111.55777,68.289429000000098],[-111.58277899999996,68.286101999999971],[-111.60526999999996,68.281096999999932],[-111.61361699999998,68.276657000000114],[-111.62777699999998,68.266663000000108],[-111.633331,68.260818000000029],[-111.63305699999995,68.249709999999993],[-111.63054699999992,68.24443100000002],[-111.63249200000001,68.238312000000008],[-111.63945000000001,68.23332199999993],[-111.64943700000003,68.229980000000012],[-111.67166099999997,68.224701000000039],[-111.696663,68.221375000000023],[-111.71028100000001,68.220534999999927]],[[-75.582779000000016,68.300262000000089],[-75.5625,68.294433999999967],[-75.453888000000006,68.266663000000108],[-75.42971799999998,68.262206999999989],[-75.386672999999917,68.258041000000105],[-75.263061999999934,68.247208000000114],[-75.228881999999942,68.24552900000009],[-75.199158000000011,68.24552900000009],[-75.183059999999955,68.243866000000025],[-75.158614999999941,68.239975000000129],[-75.134734999999864,68.234711000000118],[-75.121933000000013,68.229156000000046],[-75.030563000000029,68.167205999999965],[-75.011948000000018,68.14776599999999],[-75.003066999999987,68.132202000000063],[-75,68.119690000000105],[-75.002227999999945,68.114426000000094],[-75.049163999999962,68.041367000000093],[-75.052490000000034,68.036652000000061],[-75.063323999999966,68.027206000000092],[-75.091675000000009,68.009995000000004],[-75.148055999999997,67.974426000000051],[-75.153609999999901,67.969437000000084],[-75.164443999999946,67.954163000000051],[-75.164443999999946,67.949417000000096],[-75.162780999999939,67.943863000000079],[-75.113891999999964,67.86192299999999],[-75.104445999999996,67.847488000000055],[-75.064162999999951,67.782486000000063],[-75.025008999999955,67.625534000000016],[-75.025283999999999,67.619431000000077],[-75.068892999999889,67.542755000000113],[-75.071944999999971,67.538879000000065],[-75.133620999999948,67.481658999999979],[-75.161117999999988,67.463882000000126],[-75.198607999999979,67.443314000000044],[-75.388061999999934,67.354705999999965],[-75.395843999999954,67.353043000000071],[-75.553603999999893,67.333603000000096],[-75.662506000000008,67.305251999999996],[-75.84445199999999,67.264159999999947],[-75.946105999999929,67.251937999999996],[-76.116652999999928,67.255554000000018],[-76.226943999999946,67.260818000000029],[-76.30860899999999,67.253601000000117],[-76.490829000000019,67.236374000000069],[-76.66361999999998,67.219986000000006],[-76.693053999999961,67.221099999999979],[-76.978057999999976,67.245529000000147],[-77.026672000000019,67.254990000000078],[-77.044723999999917,67.260544000000095],[-77.057219999999916,67.267212000000086],[-77.074448000000018,67.280823000000055],[-77.101395000000025,67.30581699999999],[-77.246947999999975,67.451934999999992],[-77.247222999999963,67.457214000000135],[-77.236937999999952,67.495254999999986],[-77.224441999999954,67.535538000000031],[-77.225829999999974,67.543869000000086],[-77.230285999999978,67.554428000000144],[-77.242217999999923,67.569153000000085],[-77.275008999999955,67.614699999999971],[-77.312209999999993,67.676376000000118],[-77.320847000000015,67.691649999999981],[-77.322509999999909,67.698029000000076],[-77.319167999999991,67.71138000000002],[-77.258346999999958,67.816375999999934],[-77.251953000000015,67.82638500000013],[-77.243332000000009,67.837494000000049],[-77.233062999999959,67.848877000000073],[-77.228333000000021,67.853867000000093],[-77.220551,67.86192299999999],[-77.203888000000006,67.876373000000115],[-76.865554999999972,68.15776100000005],[-76.858886999999925,68.161651999999947],[-76.726105000000018,68.238876000000118],[-76.702498999999932,68.24859600000002],[-76.673888999999974,68.259155000000078],[-76.635009999999909,68.271927000000062],[-76.606948999999929,68.279434000000037],[-76.28195199999999,68.332764000000111],[-76.267226999999934,68.332764000000111],[-76.258346999999901,68.3316650000001],[-76.251953000000015,68.328598],[-76.25,68.323044000000039],[-76.25306699999993,68.313599000000124],[-76.249161000000015,68.307480000000112],[-76.235824999999977,68.303314],[-76.221663999999976,68.301376000000062],[-76.116104000000007,68.296646000000067],[-76.083327999999995,68.295257999999933],[-76.060546999999985,68.296936000000073],[-76.052779999999984,68.298598999999967],[-76.032227000000034,68.304703000000018],[-76.000564999999995,68.316939999999988],[-75.985001000000011,68.324432000000115],[-75.966399999999965,68.331100000000106],[-75.954178000000013,68.333878000000084],[-75.930831999999953,68.336929000000112],[-75.917495999999915,68.338318000000072],[-75.887511999999958,68.339705999999978],[-75.818068999999866,68.336655000000007],[-75.756667999999991,68.332489000000066],[-75.726105000000018,68.33027600000014],[-75.695540999999878,68.326935000000105],[-75.667496000000028,68.322768999999994],[-75.62249799999995,68.313034000000073],[-75.602492999999868,68.307480000000112],[-75.582779000000016,68.300262000000089]],[[-79.020553999999947,68.169144000000074],[-79.032500999999911,68.165268000000026],[-79.075012000000015,68.168320000000108],[-79.089721999999938,68.170258000000047],[-79.101669000000015,68.175262000000032],[-79.171386999999868,68.205261000000064],[-79.176940999999943,68.209427000000119],[-79.179992999999968,68.215545999999961],[-79.188323999999966,68.247208000000114],[-79.191100999999946,68.319442999999978],[-79.151671999999962,68.346649000000014],[-79.141952999999944,68.34887700000013],[-79.125548999999978,68.350266000000147],[-79.099441999999954,68.348602000000142],[-79.044997999999964,68.343322999999941],[-78.929992999999911,68.338882000000012],[-78.826110999999969,68.295532000000037],[-78.809998000000007,68.287490999999989],[-78.804717999999923,68.283051],[-78.801666000000012,68.279160000000104],[-78.80221599999993,68.272491000000002],[-78.805266999999958,68.266663000000108],[-78.815551999999911,68.255554000000018],[-78.823333999999932,68.250548999999978],[-78.841948999999886,68.240540000000124],[-79.020553999999947,68.169144000000074]],[[-100.07472200000001,68.349716000000114],[-100.08640299999996,68.296097000000088],[-100.09166700000003,68.284987999999998],[-100.09944200000001,68.278595000000053],[-100.11221299999994,68.276382000000069],[-100.12832600000002,68.278320000000065],[-100.14028899999994,68.281661999999983],[-100.16443600000002,68.288589000000059],[-100.20056199999999,68.299149],[-100.22693600000002,68.316086000000041],[-100.23082699999992,68.319717000000082],[-100.21556099999998,68.318603999999993],[-100.20249899999988,68.319717000000082],[-100.19110099999995,68.322220000000073],[-100.1183319999999,68.347214000000008],[-100.11000100000001,68.352478000000019],[-100.08583099999998,68.368866000000082],[-100.07668299999989,68.359711000000004],[-100.07444799999996,68.354980000000069],[-100.07472200000001,68.349716000000114]],[[-82.05999799999995,68.306091000000094],[-82.072509999999966,68.303040000000067],[-82.271117999999944,68.338593000000117],[-82.312774999999988,68.349151999999947],[-82.326675000000023,68.353591999999992],[-82.33805799999999,68.358322000000044],[-82.344451999999876,68.362762000000032],[-82.345550999999944,68.36775200000011],[-82.333327999999995,68.371917999999994],[-82.230559999999969,68.385543999999982],[-82.216949,68.384155000000135],[-82.135558999999944,68.372756999999979],[-82.012512000000015,68.350815000000068],[-82.001113999999973,68.34637500000008],[-81.99722300000002,68.34137000000004],[-82.010009999999909,68.332764000000111],[-82.05999799999995,68.306091000000094]],[[-111.11444099999994,68.405823000000055],[-111.12832600000002,68.404984000000127],[-111.13751199999996,68.408599999999979],[-111.141953,68.413315000000011],[-111.14890300000002,68.428863999999919],[-111.14917000000003,68.439972000000125],[-111.141953,68.444976999999994],[-111.13054699999992,68.447479000000044],[-111.11527999999998,68.447754000000089],[-111.09861799999999,68.446930000000123],[-111.08249699999993,68.44470200000012],[-111.07611099999991,68.436919999999986],[-111.08416699999998,68.424988000000042],[-111.10582699999998,68.409988000000055],[-111.11444099999994,68.405823000000055]],[[-99.045273000000009,68.423874000000069],[-99.054992999999911,68.408324999999991],[-99.147781000000009,68.442200000000071],[-99.154723999999987,68.446365000000071],[-99.159163999999919,68.451096000000007],[-99.149733999999853,68.455261000000007],[-99.12110899999999,68.454987000000074],[-99.105269999999962,68.453048999999965],[-99.087219000000005,68.449416999999983],[-99.045273000000009,68.423874000000069]],[[-74.162216000000001,68.246093999999971],[-74.190552000000025,68.242477000000008],[-74.20777899999996,68.243317000000047],[-74.221114999999998,68.247208000000114],[-74.228881999999942,68.250823999999966],[-74.244155999999862,68.261383000000023],[-74.260559000000001,68.273314999999968],[-74.388610999999969,68.398330999999985],[-74.399733999999967,68.42025799999999],[-74.402221999999938,68.427765000000136],[-74.400283999999999,68.43414300000012],[-74.393065999999919,68.445251000000098],[-74.376937999999882,68.459717000000126],[-74.360275000000001,68.463882000000126],[-74.340835999999911,68.462493999999992],[-74.307769999999948,68.461655000000064],[-74.293883999999991,68.460541000000092],[-74.279448999999943,68.458328000000108],[-74.269729999999868,68.454712000000029],[-74.217498999999862,68.426086000000112],[-74.198043999999982,68.414992999999924],[-74.079452999999944,68.338593000000117],[-74.074722000000008,68.330825999999945],[-74.077498999999989,68.325546000000088],[-74.144454999999937,68.254440000000045],[-74.149733999999853,68.25],[-74.162216000000001,68.246093999999971]],[[-100.71056399999998,68.402480999999966],[-100.72416699999997,68.401657],[-100.78943599999997,68.409988000000055],[-100.88971699999996,68.45277400000009],[-100.88027999999997,68.457214000000135],[-100.84889199999992,68.464996000000099],[-100.83029199999999,68.468596999999932],[-100.79332699999986,68.468872000000147],[-100.78611799999999,68.464706000000092],[-100.71806300000003,68.411926000000051],[-100.71305799999999,68.407486000000006],[-100.71056399999998,68.402480999999966]],[[-110.86250299999995,68.474152000000061],[-110.92610199999996,68.465820000000065],[-111.05444299999999,68.469711000000132],[-111.08833299999998,68.473311999999964],[-111.09750400000001,68.477203000000031],[-111.09750400000001,68.482757999999933],[-111.09249899999998,68.487198000000149],[-111.08528099999995,68.492203000000018],[-111.07528699999995,68.495529000000033],[-110.984734,68.515549000000078],[-110.82167099999998,68.54803499999997],[-110.80332899999996,68.546371000000136],[-110.79222099999998,68.543319999999937],[-110.76390100000003,68.533600000000035],[-110.74582700000002,68.526382000000069],[-110.69833399999999,68.491364000000033],[-110.69611399999991,68.486374000000012],[-110.70889299999988,68.484711000000061],[-110.72833300000002,68.484421000000054],[-110.79499799999996,68.479980000000126],[-110.86250299999995,68.474152000000061]],[[-110.58693700000003,68.524155000000007],[-110.625,68.519440000000145],[-110.6600039999999,68.521927000000005],[-110.72112299999998,68.531097000000102],[-110.73249800000002,68.534149000000014],[-110.74610899999999,68.542480000000069],[-110.75974300000001,68.55664100000007],[-110.76194800000002,68.561645999999939],[-110.75473,68.566665999999998],[-110.63861099999997,68.569443000000092],[-110.62832600000002,68.559143000000006],[-110.52971600000001,68.54803499999997],[-110.520554,68.544144000000074],[-110.51834100000002,68.539154000000053],[-110.52722199999988,68.534987999999942],[-110.53859699999992,68.532486000000063],[-110.58693700000003,68.524155000000007]],[[-104.54527300000001,68.396102999999982],[-104.58667000000003,68.394440000000088],[-104.64666699999998,68.395827999999995],[-104.69332900000001,68.402480999999966],[-104.708618,68.40525800000006],[-104.75974299999996,68.418045000000063],[-104.88305699999995,68.449996999999996],[-104.91915899999992,68.459991000000059],[-104.9375,68.46748400000007],[-105.08167999999995,68.546371000000136],[-105.04415899999998,68.562759000000028],[-105.024719,68.570540999999992],[-105.01390100000003,68.573318000000086],[-104.98999000000003,68.57748400000014],[-104.93859900000001,68.583327999999995],[-104.91000399999996,68.583878000000027],[-104.76167299999997,68.582764000000054],[-104.74610899999993,68.582214000000022],[-104.71193699999998,68.578597999999943],[-104.682503,68.57388300000008],[-104.55332899999996,68.537201000000096],[-104.52999899999992,68.530548000000124],[-104.50917099999992,68.523315000000139],[-104.48277299999995,68.511658000000011],[-104.46916199999998,68.503326000000015],[-104.46362299999998,68.498871000000008],[-104.44915799999995,68.485260000000039],[-104.44055200000003,68.476089000000059],[-104.42777999999987,68.456940000000031],[-104.42527799999999,68.441360000000032],[-104.426941,68.435806000000014],[-104.43083199999995,68.429703000000075],[-104.43499799999995,68.423599000000024],[-104.44138299999997,68.417206000000078],[-104.45111099999991,68.413315000000011],[-104.48332199999999,68.404709000000082],[-104.51917299999997,68.398330999999985],[-104.54527300000001,68.396102999999982]],[[-105.139183,68.53637700000013],[-105.12609900000001,68.533325000000048],[-105.11305199999998,68.534424000000001],[-105.10109699999998,68.536652000000004],[-105.08693699999998,68.536926000000108],[-105.07861300000002,68.533051000000114],[-105.06639099999995,68.519149999999968],[-105.05972300000002,68.509430000000066],[-105.05888400000003,68.504166000000055],[-105.06833599999999,68.500274999999988],[-105.08612099999999,68.502777000000037],[-105.11193800000001,68.508881000000088],[-105.23361199999994,68.541091999999992],[-105.24416400000001,68.544708000000071],[-105.29110700000001,68.576935000000049],[-105.29222099999998,68.582214000000022],[-105.28138699999994,68.584991000000116],[-105.25611900000001,68.588318000000015],[-105.24305700000002,68.589705999999978],[-105.228882,68.589980999999966],[-105.21112099999993,68.587769000000094],[-105.18582200000003,68.580826000000116],[-105.18611099999998,68.576660000000004],[-105.18167099999994,68.566665999999998],[-105.17832900000002,68.561645999999939],[-105.139183,68.53637700000013]],[[-113.78611799999999,68.582764000000054],[-113.80166599999995,68.58248900000001],[-113.85249299999998,68.584152000000131],[-113.88945000000001,68.586929000000055],[-113.93138099999999,68.593872000000033],[-113.95259099999987,68.597389000000078],[-113.95966299999998,68.603195000000142],[-113.96611000000001,68.611099000000081],[-113.95667300000002,68.614699999999914],[-113.94248999999996,68.615814000000114],[-113.91388699999999,68.615814000000114],[-113.89972699999998,68.616928000000087],[-113.83693700000003,68.608871000000079],[-113.80027799999999,68.606093999999985],[-113.78611799999999,68.60386699999998],[-113.77667200000002,68.60026600000009],[-113.76194800000002,68.592209000000082],[-113.761124,68.586655000000121],[-113.77223199999997,68.583878000000027],[-113.78611799999999,68.582764000000054]],[[-100.74054699999999,68.596375000000023],[-100.78388999999993,68.594437000000084],[-100.86805699999991,68.603043000000014],[-100.88249200000001,68.611374000000069],[-100.87666300000001,68.616379000000109],[-100.86527999999998,68.619141000000013],[-100.85305800000003,68.620818999999983],[-100.83972199999999,68.62164300000012],[-100.81388900000002,68.619141000000013],[-100.75556899999992,68.607758000000047],[-100.74082899999996,68.604706000000078],[-100.73361199999994,68.600540000000024],[-100.74054699999999,68.596375000000023]],[[-78.468886999999995,68.563873000000001],[-78.474441999999897,68.55831900000004],[-78.482223999999917,68.553313999999943],[-78.503066999999987,68.545532000000037],[-78.530837999999903,68.541091999999992],[-78.545836999999949,68.540817000000004],[-78.562209999999993,68.541930999999977],[-78.599227999999925,68.550644000000034],[-78.614554999999939,68.553650000000061],[-78.638901000000033,68.558028999999976],[-78.654723999999987,68.558594000000028],[-78.668883999999991,68.554153000000099],[-78.724715999999944,68.521927000000005],[-78.715835999999911,68.515823000000012],[-78.691375999999991,68.509155000000021],[-78.674438000000009,68.509720000000073],[-78.653335999999967,68.512496999999939],[-78.636123999999938,68.513046000000088],[-78.621947999999975,68.509720000000073],[-78.617615000000001,68.507217000000082],[-78.610275000000001,68.502213000000097],[-78.610824999999977,68.498032000000023],[-78.618056999999965,68.492203000000018],[-78.705565999999976,68.451660000000118],[-78.716110000000015,68.447754000000089],[-78.743057000000022,68.442748999999992],[-78.776672000000019,68.439147999999989],[-78.795272999999952,68.438583000000108],[-78.813048999999921,68.438873000000115],[-78.828063999999983,68.440811000000053],[-78.861663999999962,68.446365000000071],[-78.876389000000017,68.450546000000145],[-78.959732000000031,68.474700999999982],[-78.946105999999986,68.508041000000048],[-78.943328999999949,68.511932000000115],[-78.936935000000005,68.516388000000006],[-78.822784000000013,68.547759999999982],[-78.809432999999956,68.550537000000077],[-78.791672000000005,68.550262000000032],[-78.759170999999981,68.54803499999997],[-78.743880999999988,68.546097000000032],[-78.723891999999978,68.547484999999938],[-78.704177999999899,68.554703000000131],[-78.698883000000023,68.558028999999976],[-78.688889000000017,68.564697000000137],[-78.670837000000006,68.578872999999987],[-78.668609999999944,68.583327999999995],[-78.672774999999945,68.58859300000006],[-78.680557000000022,68.593323000000112],[-78.693054000000018,68.596939000000134],[-78.705841000000021,68.600540000000024],[-78.784163999999976,68.618590999999981],[-78.851395000000025,68.634155000000078],[-78.894454999999994,68.646378000000141],[-78.89805599999994,68.64888000000002],[-78.889724999999942,68.652771000000087],[-78.863892000000021,68.659714000000122],[-78.837783999999886,68.661102000000028],[-78.720001000000025,68.657211000000132],[-78.689437999999939,68.653320000000065],[-78.495834000000002,68.627762000000132],[-78.481948999999929,68.624985000000038],[-78.469451999999933,68.621093999999971],[-78.460555999999997,68.617203000000075],[-78.467223999999987,68.569153000000085],[-78.468886999999995,68.563873000000001]],[[-74.768889999999999,68.673874000000012],[-74.756667999999991,68.672760000000039],[-74.65583799999996,68.65498400000007],[-74.648346000000004,68.652206000000092],[-74.522231999999974,68.565262000000018],[-74.518340999999907,68.558594000000028],[-74.531951999999876,68.552765000000022],[-74.551392000000021,68.550537000000077],[-74.586944999999957,68.548874000000126],[-74.726668999999902,68.556091000000038],[-74.742767000000015,68.557480000000055],[-74.807219999999916,68.563599000000067],[-74.821945000000028,68.56581099999994],[-74.833892999999989,68.569717000000026],[-74.84333799999996,68.575821000000076],[-74.870543999999995,68.598877000000073],[-74.883056999999894,68.61303700000002],[-74.890288999999996,68.624985000000038],[-74.805832000000009,68.668868999999972],[-74.796111999999994,68.671646000000067],[-74.787216000000001,68.673035000000027],[-74.779998999999975,68.673874000000012],[-74.77194199999991,68.673035000000027],[-74.768889999999999,68.673874000000012]],[[-114.04723399999995,68.613602000000014],[-114.06139399999995,68.612488000000042],[-114.075287,68.614699999999914],[-114.10193600000002,68.625809000000004],[-114.12666299999995,68.637206999999989],[-114.14890299999996,68.649428999999998],[-114.16166699999991,68.658035000000098],[-114.18998699999986,68.680266999999958],[-114.18639400000001,68.683594000000085],[-114.15387699999991,68.679703000000018],[-114.141953,68.676925999999924],[-114.14111299999996,68.671097000000088],[-114.05638099999987,68.635818000000029],[-114.04888900000003,68.631927000000132],[-114.04167200000001,68.627762000000132],[-114.03778099999994,68.616928000000087],[-114.04723399999995,68.613602000000014]],[[-74.811385999999914,68.320541000000048],[-74.817504999999926,68.318603999999993],[-75,68.333344000000125],[-75.002227999999945,68.333603000000039],[-75.008346999999958,68.337204000000099],[-75.010284000000013,68.346649000000014],[-75.005004999999926,68.353591999999992],[-75.002791999999999,68.35914600000001],[-75.00140399999998,68.366378999999995],[-75.015014999999948,68.379700000000128],[-75.029174999999952,68.390549000000021],[-75.037505999999951,68.394714000000022],[-75.081679999999892,68.404984000000127],[-75.10943599999996,68.406937000000084],[-75.138061999999991,68.409988000000055],[-75.153060999999866,68.413040000000024],[-75.241378999999995,68.436371000000065],[-75.263900999999919,68.444976999999994],[-75.294723999999974,68.457763999999997],[-75.369995000000017,68.489700000000028],[-75.396118000000001,68.503601000000003],[-75.416397000000018,68.518051000000128],[-75.416397000000018,68.524429000000112],[-75.396956999999873,68.611099000000081],[-75.389175000000023,68.62303200000008],[-75.307770000000005,68.694702000000063],[-75.299727999999959,68.700546000000088],[-75.280562999999972,68.709717000000069],[-75.254729999999881,68.717484000000013],[-75.239440999999999,68.718048000000124],[-75.014450000000011,68.677200000000028],[-75,68.672241000000099],[-74.942764000000011,68.576096000000064],[-74.938323999999909,68.571655000000135],[-74.931380999999931,68.566665999999998],[-74.836945000000014,68.511658000000011],[-74.801940999999999,68.501099000000124],[-74.785004000000015,68.494705000000067],[-74.780288999999982,68.490265000000079],[-74.772232000000031,68.479980000000126],[-74.768341000000021,68.473311999999964],[-74.776397999999915,68.410537999999917],[-74.811385999999914,68.320541000000048]],[[-84.808043999999938,68.763885000000016],[-84.821395999999879,68.763611000000083],[-84.835830999999985,68.766662999999994],[-84.939163000000008,68.793594000000041],[-84.907776000000013,68.803589000000102],[-84.895279000000016,68.80720500000001],[-84.882492000000013,68.809707999999944],[-84.855835000000013,68.810806000000014],[-84.841385000000002,68.807479999999998],[-84.837219000000005,68.802765000000136],[-84.837783999999999,68.79693600000013],[-84.801665999999955,68.769150000000081],[-84.808043999999938,68.763885000000016]],[[-68.110275000000001,68.78276100000005],[-67.807494999999903,68.733597000000032],[-67.781676999999945,68.729155999999932],[-67.679169000000002,68.711379999999963],[-67.668335000000013,68.707214000000079],[-67.661391999999921,68.701935000000105],[-67.662216000000001,68.698317999999972],[-67.676666000000012,68.695816000000093],[-67.850554999999929,68.697754000000032],[-67.869720000000029,68.69859299999996],[-67.897781000000009,68.704987000000017],[-67.918609999999887,68.712493999999936],[-67.951400999999976,68.721649000000014],[-68.039169000000015,68.738037000000077],[-68.188323999999909,68.763885000000016],[-68.306106999999997,68.779434000000094],[-68.323623999999995,68.779984000000127],[-68.339995999999985,68.778594999999939],[-68.352492999999981,68.775543000000027],[-68.367492999999854,68.774994000000106],[-68.433608999999933,68.781097000000045],[-68.451400999999976,68.783875000000023],[-68.457779000000016,68.785812000000078],[-68.459441999999967,68.791092000000106],[-68.455275999999969,68.802199999999914],[-68.450835999999867,68.80720500000001],[-68.439163000000008,68.812485000000038],[-68.428328999999962,68.813034000000016],[-68.418899999999894,68.810257000000092],[-68.375548999999921,68.808029000000147],[-68.241942999999935,68.798874000000069],[-68.224716000000001,68.797485000000108],[-68.110275000000001,68.78276100000005]],[[-101.83112299999999,68.566940000000102],[-101.84555099999989,68.566665999999998],[-101.86028299999998,68.569717000000026],[-101.88527699999986,68.576385000000016],[-101.90527299999991,68.583878000000027],[-102.00583599999999,68.613875999999948],[-102.112213,68.62359600000002],[-102.23000300000001,68.64027399999992],[-102.254997,68.646942000000081],[-102.31639100000001,68.672211000000061],[-102.3125,68.688583000000051],[-102.21665999999999,68.718322999999998],[-102.14862099999999,68.734984999999938],[-102.13639799999993,68.736923000000104],[-102.11389200000002,68.742477000000065],[-102.09249899999998,68.748871000000122],[-102.073059,68.756943000000092],[-102.05638099999993,68.768051000000071],[-102.05166600000001,68.773880000000077],[-102.04943799999995,68.779434000000094],[-102.04972799999996,68.784714000000008],[-102.05555699999996,68.794434000000081],[-102.05555699999996,68.799713000000054],[-102.05082700000003,68.805542000000059],[-102.04276999999996,68.811096000000077],[-102.02306399999992,68.819443000000035],[-101.99833699999999,68.823044000000095],[-101.98500099999995,68.824158000000068],[-101.95612299999999,68.824158000000068],[-101.93943799999994,68.822494999999947],[-101.9119419999999,68.816086000000098],[-101.77861000000001,68.783875000000023],[-101.69387799999993,68.768051000000071],[-101.69999699999994,68.737762000000032],[-101.68055699999996,68.672484999999995],[-101.68250299999994,68.661652000000061],[-101.701683,68.637772000000041],[-101.83112299999999,68.566940000000102]],[[-102.60082999999997,68.813309000000004],[-102.60749799999996,68.80914300000012],[-102.69695299999995,68.813034000000016],[-102.70722999999992,68.816666000000112],[-102.68888900000002,68.833328000000108],[-102.67859599999997,68.836928999999998],[-102.64055599999995,68.841934000000037],[-102.61277799999993,68.84304800000001],[-102.59889199999986,68.841095000000053],[-102.60221899999999,68.834152000000074],[-102.60082999999997,68.813309000000004]],[[-89.944442999999978,68.662200999999982],[-89.956389999999942,68.661652000000061],[-89.974166999999966,68.705826000000002],[-89.999160999999958,68.730819999999937],[-90.017226999999934,68.740540000000067],[-90.022507000000019,68.74581900000004],[-90.027495999999985,68.752486999999974],[-90.027785999999992,68.758606000000043],[-90.025557999999933,68.771927000000005],[-90.00306699999993,68.806641000000013],[-89.958618000000001,68.838042999999971],[-89.944442999999978,68.847488000000055],[-89.931945999999982,68.852203000000088],[-89.921935999999903,68.853867000000093],[-89.914443999999946,68.853043000000127],[-89.781677000000002,68.766662999999994],[-89.784163999999919,68.760818000000086],[-89.791381999999999,68.752486999999974],[-89.808884000000035,68.733322000000044],[-89.857498000000021,68.700546000000088],[-89.877486999999917,68.690810999999997],[-89.944442999999978,68.662200999999982]],[[-114.35082999999997,68.871643000000063],[-114.37917299999992,68.86943100000002],[-114.39639299999999,68.869705000000124],[-114.429169,68.87359600000002],[-114.45333900000003,68.879425000000026],[-114.46305799999999,68.882751000000042],[-114.468613,68.887206999999989],[-114.47165699999999,68.892487000000017],[-114.46056399999998,68.895264000000111],[-114.44444299999998,68.896103000000096],[-114.424713,68.896942000000024],[-114.37609899999995,68.893600000000106],[-114.34084300000001,68.890549000000078],[-114.32888800000001,68.887496999999996],[-114.32333399999999,68.883041000000048],[-114.32861299999996,68.87692300000009],[-114.33805799999993,68.87359600000002],[-114.35082999999997,68.871643000000063]],[[-67.847777999999948,68.851928999999984],[-67.863891999999964,68.849425999999994],[-67.883056999999951,68.849990999999989],[-67.897232000000031,68.853043000000127],[-67.908051,68.857208000000128],[-67.956389999999942,68.915268000000026],[-67.96055599999994,68.922484999999995],[-67.96055599999994,68.929977000000065],[-67.954726999999934,68.935806000000127],[-67.946654999999964,68.940810999999997],[-67.938048999999978,68.944427000000019],[-67.923889000000031,68.94859300000013],[-67.892226999999991,68.951660000000004],[-67.876388999999961,68.949417000000096],[-67.869445999999982,68.944138000000066],[-67.83944699999995,68.911926000000108],[-67.831389999999999,68.875809000000118],[-67.833068999999909,68.861374000000012],[-67.837509000000011,68.856368999999972],[-67.847777999999948,68.851928999999984]],[[-85.341675000000009,68.983596999999975],[-85.351669000000015,68.981094000000041],[-85.379165999999941,68.981934000000081],[-85.407227000000034,68.984420999999941],[-85.437209999999993,68.991928000000087],[-85.446944999999971,68.996368000000075],[-85.451400999999976,69.001099000000011],[-85.453063999999983,69.005829000000062],[-85.44387799999987,69.010269000000108],[-85.418883999999991,69.009430000000123],[-85.369995000000017,69.001937999999996],[-85.354720999999927,68.997757000000092],[-85.342223999999931,68.993317000000104],[-85.337783999999999,68.988585999999941],[-85.341675000000009,68.983596999999975]],[[-89.90834000000001,68.917755000000113],[-89.915008999999998,68.913315000000125],[-89.952498999999875,68.926376000000062],[-89.978332999999964,68.933867999999961],[-90,68.937575999999979],[-90.03195199999999,68.943039000000113],[-90.075561999999991,68.948028999999963],[-90.070557000000008,68.981934000000081],[-89.946380999999917,69.010269000000108],[-89.93360899999999,69.011658000000068],[-89.920837000000006,69.010269000000108],[-89.914169000000015,69.006943000000035],[-89.910277999999948,69.003052000000139],[-89.906661999999983,68.922484999999995],[-89.90834000000001,68.917755000000113]],[[-100.17555199999987,68.794708000000014],[-100.22083999999995,68.764435000000049],[-100.25446299999999,68.769150000000081],[-100.26917300000002,68.772217000000012],[-100.28555299999994,68.774155000000121],[-100.29915599999998,68.773315000000082],[-100.30860899999999,68.768875000000037],[-100.31639100000001,68.76249700000011],[-100.35749799999996,68.71527100000003],[-100.36694299999994,68.710541000000035],[-100.40722699999998,68.708038000000045],[-100.423607,68.709991000000002],[-100.61332700000003,68.758040999999992],[-100.62304699999999,68.761932000000058],[-100.62805199999997,68.766388000000006],[-100.632767,68.77609300000006],[-100.62581599999999,68.912490999999932],[-100.59999099999999,69.000548999999978],[-100.56111099999993,69.025818000000015],[-100.54360999999994,69.036652000000061],[-100.52916699999997,69.036652000000061],[-100.497772,69.034714000000122],[-100.41610700000001,69.026382000000126],[-100.38110399999994,69.020828000000108],[-100.35082999999997,69.014709000000096],[-100.34111000000001,69.010818000000029],[-100.33361799999994,69.006653000000028],[-100.32861300000002,69.00221300000004],[-100.32362399999994,68.996093999999971],[-100.32888800000001,68.989975000000129],[-100.33168000000001,68.984420999999941],[-100.33168000000001,68.979431000000091],[-100.326683,68.974701000000039],[-100.31276700000001,68.965820000000122],[-100.23889200000002,68.924149],[-100.22888199999994,68.920258000000103],[-100.21665999999988,68.916930999999977],[-100.20361300000002,68.915543000000071],[-100.16027799999995,68.915268000000026],[-100.14362299999993,68.913315000000125],[-100.13110399999999,68.909987999999998],[-100.12638899999996,68.905548000000124],[-100.17194399999994,68.799423000000047],[-100.17555199999987,68.794708000000014]],[[-85.119445999999925,69.014709000000096],[-85.132216999999855,69.013045999999974],[-85.166107000000011,69.031096999999988],[-85.170273000000009,69.035812000000021],[-85.155562999999972,69.056090999999981],[-85.14555399999989,69.058319000000097],[-85.095551,69.048035000000084],[-85.068343999999968,69.041367000000093],[-85.061385999999914,69.036652000000061],[-85.075835999999924,69.031096999999988],[-85.119445999999925,69.014709000000096]],[[-85.265288999999996,69.072495000000117],[-85.343886999999938,69.06303400000013],[-85.357773000000009,69.063598999999954],[-85.373046999999929,69.067763999999954],[-85.392776000000026,69.076660000000118],[-85.397232000000031,69.081374999999923],[-85.398894999999982,69.086104999999975],[-85.392501999999979,69.09137000000004],[-85.380279999999914,69.095825000000048],[-85.301392000000021,69.104155999999989],[-85.287780999999882,69.104706000000022],[-85.258895999999993,69.100266000000147],[-85.248885999999914,69.095825000000048],[-85.241942999999992,69.09137000000004],[-85.245543999999995,69.086104999999975],[-85.246658000000025,69.081374999999923],[-85.253066999999987,69.07609599999995],[-85.265288999999996,69.072495000000117]],[[-99.999434999999949,68.943588000000034],[-100.006958,68.939423000000033],[-100.021118,68.939696999999967],[-100.03778099999988,68.941360000000088],[-100.12000299999994,68.950821000000076],[-100.16166699999997,68.961380000000133],[-100.18138099999999,68.968872000000033],[-100.19860799999998,68.976929000000041],[-100.20612299999988,68.981094000000041],[-100.23693800000001,69.008605999999986],[-100.25666799999999,69.026656999999943],[-100.25890399999992,69.031661999999983],[-100.25862099999995,69.041931000000034],[-100.23693800000001,69.081374999999923],[-100.23194899999993,69.087203999999986],[-100.21333300000003,69.097214000000065],[-100.12970699999994,69.130264000000125],[-100.09555099999994,69.117477000000122],[-100.05304699999999,69.102478000000019],[-100.03333299999991,69.094711000000075],[-100.02834299999995,69.090271000000087],[-99.978881999999999,69.01388500000013],[-99.976943999999946,69.003876000000105],[-99.999434999999949,68.943588000000034]],[[-90.124709999999993,69.04942299999999],[-90.12721299999987,69.044982999999945],[-90.138061999999991,69.04525799999999],[-90.231948999999986,69.065536000000009],[-90.247498000000007,69.070267000000115],[-90.279175000000009,69.098328000000038],[-90.276397999999858,69.125809000000061],[-90.263335999999924,69.141936999999928],[-90.262511999999958,69.142761000000064],[-90.253890999999953,69.142761000000064],[-90.147231999999974,69.103591999999992],[-90.125,69.055542000000003],[-90.124709999999993,69.04942299999999]],[[-101.66416900000002,69.083603000000096],[-101.67749000000003,69.082764000000111],[-101.69027699999998,69.086104999999975],[-101.69554099999993,69.090546000000074],[-101.69833399999993,69.095261000000107],[-101.71806300000003,69.178588999999931],[-101.71584300000001,69.189147999999989],[-101.71112099999993,69.195251000000098],[-101.70361300000002,69.201660000000004],[-101.695267,69.206940000000031],[-101.68443300000001,69.210815000000025],[-101.65834000000001,69.213608000000022],[-101.60166899999996,69.215546000000131],[-101.55860899999999,69.216660000000104],[-101.53527799999995,69.209427000000119],[-101.5202789999999,69.197479000000101],[-101.497772,69.170258000000047],[-101.49500299999994,69.165543000000014],[-101.49500299999994,69.160262999999929],[-101.49999999999994,69.154434000000094],[-101.55555699999991,69.105255000000113],[-101.56360599999999,69.099990999999989],[-101.65139799999997,69.085541000000035],[-101.66416900000002,69.083603000000096]],[[-90.512512000000015,69.20248400000014],[-90.575561999999991,69.198593000000074],[-90.613327000000027,69.207763999999997],[-90.777221999999995,69.272491000000002],[-90.778609999999901,69.317215000000147],[-90.775832999999977,69.32998699999996],[-90.762512000000015,69.345534999999984],[-90.757232999999985,69.349426000000051],[-90.740829000000019,69.357483000000059],[-90.692215000000033,69.37164300000012],[-90.67332499999992,69.373871000000065],[-90.655272999999966,69.374695000000031],[-90.638610999999969,69.373871000000065],[-90.608046999999999,69.36970500000001],[-90.595001000000025,69.365264999999965],[-90.582503999999972,69.359711000000004],[-90.559433000000013,69.347214000000008],[-90.548614999999984,69.339981000000023],[-90.47193900000002,69.281097000000102],[-90.460830999999928,69.267487000000017],[-90.455565999999976,69.234711000000118],[-90.454452999999887,69.226379000000122],[-90.457503999999972,69.222763000000043],[-90.512512000000015,69.20248400000014]],[[-78.412215999999887,69.379700000000128],[-78.396392999999932,69.377761999999962],[-78.338608000000022,69.3808140000001],[-78.305832000000009,69.377761999999962],[-78.291381999999999,69.374985000000095],[-78.279723999999987,69.370255000000043],[-78.270844000000011,69.364150999999993],[-78.211394999999925,69.299987999999985],[-78.210830999999985,69.294434000000138],[-78.214447000000007,69.288315000000125],[-78.318344000000025,69.238312000000008],[-78.396118000000001,69.210541000000092],[-78.472504000000015,69.191360000000032],[-78.551392000000021,69.089157000000057],[-78.556655999999919,69.083603000000096],[-78.572234999999921,69.073317999999972],[-78.601943999999946,69.066086000000041],[-78.62777699999998,69.058593999999914],[-78.707229999999981,69.014709000000096],[-78.715011999999945,69.009720000000129],[-78.718062999999972,69.003601000000117],[-78.71665999999999,68.99664300000012],[-78.712783999999999,68.984985000000108],[-78.716110000000015,68.979156000000103],[-78.725280999999995,68.968872000000033],[-78.735000999999954,68.963608000000079],[-78.830291999999929,68.91304000000008],[-78.840285999999935,68.908600000000092],[-78.867492999999968,68.900543000000084],[-78.934433000000013,68.888596000000121],[-78.978881999999999,68.882477000000108],[-79.033614999999998,68.877197000000024],[-79.095275999999956,68.872757000000036],[-79.185271999999941,68.853317000000061],[-79.194152999999972,68.849425999999994],[-79.197219999999902,68.839157000000114],[-79.204726999999991,68.833878000000141],[-79.216949,68.829987000000074],[-79.238892000000021,68.827484000000084],[-79.287216000000001,68.83137499999998],[-79.353332999999964,68.844147000000021],[-79.366103999999893,68.847763000000043],[-79.386948000000018,68.856093999999985],[-79.392501999999865,68.860535000000084],[-79.396392999999932,68.864990000000091],[-79.400283999999999,68.871918000000051],[-79.402221999999938,68.923598999999967],[-79.379439999999931,68.931656000000089],[-79.353881999999999,68.943863000000079],[-79.330565999999976,68.958327999999995],[-79.309432999999956,68.973602000000085],[-79.303878999999938,68.978317000000118],[-79.292769999999962,68.995818999999983],[-79.283065999999963,69.012772000000041],[-79.238892000000021,69.066376000000048],[-79.227218999999991,69.076385000000073],[-79.216949,69.081100000000106],[-79.146117999999944,69.093597000000102],[-79.049438000000009,69.102203000000031],[-78.985824999999977,69.099990999999989],[-78.974441999999954,69.100266000000147],[-78.960280999999952,69.102478000000019],[-78.864165999999955,69.141098],[-78.855834999999956,69.145537999999988],[-78.749160999999901,69.261107999999979],[-78.721938999999963,69.310532000000023],[-78.726668999999902,69.318603999999993],[-78.724715999999944,69.331100000000049],[-78.722778000000005,69.336105000000089],[-78.716110000000015,69.34027100000003],[-78.606948999999986,69.371368000000132],[-78.577498999999989,69.377197000000137],[-78.568618999999956,69.378860000000032],[-78.489989999999977,69.391098000000113],[-78.47084000000001,69.392212000000086],[-78.458617999999944,69.38998400000014],[-78.412215999999887,69.379700000000128]],[[-135.28890999999993,69.309418000000051],[-135.29751599999997,69.304977000000122],[-135.33138999999989,69.322768999999994],[-135.34805299999994,69.330551000000128],[-135.38613899999996,69.344986000000063],[-135.39779699999997,69.348037999999974],[-135.44000199999999,69.355820000000108],[-135.48693800000001,69.362198000000092],[-135.51501500000001,69.367477000000065],[-135.52694699999995,69.370529000000147],[-135.55999800000001,69.380264000000068],[-135.56527700000004,69.384995000000004],[-135.56555199999997,69.390548999999965],[-135.55999800000001,69.396652000000131],[-135.54998799999998,69.399994000000049],[-135.52444499999996,69.403595000000109],[-135.50723300000004,69.403046000000131],[-135.42028799999997,69.397491000000059],[-135.365814,69.393599999999992],[-135.33776899999992,69.388596000000064],[-135.32806400000004,69.384995000000004],[-135.27224699999988,69.358321999999987],[-135.27139299999999,69.346938999999963],[-135.27722199999999,69.328322999999955],[-135.28332499999988,69.315262000000018],[-135.28890999999993,69.309418000000051]],[[-76.950835999999867,69.395263999999997],[-76.923614999999984,69.393599999999992],[-76.902221999999995,69.394713999999965],[-76.804168999999945,69.400269000000037],[-76.787780999999995,69.402480999999966],[-76.779174999999952,69.403870000000097],[-76.760833999999875,69.40914900000007],[-76.75140399999998,69.412766000000033],[-76.744445999999982,69.416931000000034],[-76.732772999999952,69.422760000000039],[-76.723327999999981,69.423599000000024],[-76.716400000000021,69.422211000000118],[-76.705840999999964,69.418868999999972],[-76.652221999999938,69.38638300000008],[-76.644729999999925,69.381363000000022],[-76.643889999999942,69.374420000000043],[-76.646666999999979,69.336929000000055],[-76.648894999999925,69.331940000000088],[-76.676391999999964,69.306091000000094],[-76.706389999999999,69.303588999999988],[-76.718886999999995,69.301651000000049],[-76.736937999999952,69.296371000000022],[-76.799438000000009,69.272491000000002],[-76.926392000000021,69.21748400000007],[-76.933608999999933,69.213882000000126],[-76.939986999999974,69.209152000000074],[-76.945830999999998,69.203598000000113],[-76.949431999999945,69.197479000000101],[-76.950561999999934,69.1933140000001],[-76.958892999999989,69.14248699999996],[-77.118057000000022,69.119431000000134],[-77.137787000000003,69.116652999999928],[-77.171660999999915,69.117202999999961],[-77.213622999999984,69.125809000000061],[-77.238601999999958,69.132750999999985],[-77.25778200000002,69.139984000000027],[-77.285827999999924,69.153594999999996],[-77.301392000000021,69.164153999999996],[-77.320281999999963,69.181366000000025],[-77.381942999999865,69.247482000000048],[-77.384170999999981,69.263610999999969],[-77.383330999999941,69.270538000000045],[-77.359725999999966,69.392761000000064],[-77.356383999999935,69.396652000000131],[-77.348342999999943,69.401657],[-77.288329999999917,69.417755],[-77.259170999999924,69.424698000000035],[-77.189162999999951,69.438309000000004],[-77.153610000000015,69.444427000000076],[-77.129989999999964,69.445251000000042],[-77.113616999999977,69.441650000000038],[-77.075561999999991,69.428314000000057],[-77.043335000000013,69.417206000000078],[-77.006957999999997,69.406372000000033],[-76.978332999999907,69.399994000000049],[-76.950835999999867,69.395263999999997]],[[-90.329453000000001,69.235809000000017],[-90.34722899999997,69.234711000000118],[-90.361388999999974,69.238312000000008],[-90.506392999999946,69.329162999999994],[-90.510009999999909,69.334717000000012],[-90.514450000000011,69.363876000000005],[-90.501113999999973,69.372482000000105],[-90.491669000000002,69.376647999999989],[-90.301940999999943,69.434418000000107],[-90.205275999999913,69.445816000000093],[-90.200835999999981,69.444427000000076],[-90.199722000000008,69.439148000000102],[-90.195267000000001,69.416931000000034],[-90.178604000000007,69.409988000000055],[-90.149733999999967,69.375534000000016],[-90.148345999999947,69.370255000000043],[-90.154723999999987,69.350815000000068],[-90.15972899999997,69.34526100000005],[-90.271666999999923,69.255554000000018],[-90.288605000000018,69.249419999999986],[-90.329453000000001,69.235809000000017]],[[-135.59222399999999,69.482208000000071],[-135.574432,69.446640000000059],[-135.61999499999996,69.468597000000102],[-135.62942499999991,69.472214000000065],[-135.66528299999999,69.481368999999916],[-135.69360399999999,69.486649],[-135.74081399999994,69.493041999999946],[-135.77835099999999,69.496094000000085],[-135.81054700000004,69.497756999999979],[-135.81555200000003,69.502487000000031],[-135.8125,69.508041000000048],[-135.79528799999997,69.516663000000051],[-135.78555299999999,69.519989000000066],[-135.77389500000004,69.52276599999999],[-135.76113899999996,69.524429000000055],[-135.74526999999995,69.524704000000099],[-135.66610700000001,69.505828999999949],[-135.59942599999999,69.486098999999967],[-135.59222399999999,69.482208000000071]],[[-101.05304699999999,69.504439999999988],[-101.00611900000001,69.486923000000104],[-101.00862099999995,69.450272000000041],[-101.12526700000001,69.401382000000126],[-101.21861299999989,69.371368000000132],[-101.23029299999996,69.368591000000038],[-101.24305700000002,69.371917999999994],[-101.26888999999994,69.378860000000032],[-101.27916700000003,69.382476999999994],[-101.271118,69.385818000000029],[-101.256958,69.386658000000068],[-101.24526999999995,69.389434999999992],[-101.2369379999999,69.394713999999965],[-101.23166699999996,69.400818000000015],[-101.18888899999996,69.469711000000075],[-101.18639400000001,69.475265999999976],[-101.22749299999992,69.495529000000033],[-101.23805199999998,69.499145999999996],[-101.2538909999999,69.500274999999988],[-101.266953,69.49832200000003],[-101.31749699999995,69.511107999999922],[-101.38445300000001,69.53276100000005],[-101.38722199999995,69.53776600000009],[-101.35833700000001,69.566940000000102],[-101.34973099999996,69.572495000000004],[-101.34056099999992,69.574707000000046],[-101.27555799999993,69.580826000000059],[-101.26167299999992,69.581665000000044],[-101.07305899999994,69.534988000000112],[-101.06276699999995,69.53137200000009],[-101.05999800000001,69.526382000000012],[-101.05304699999999,69.504439999999988]],[[-96.663054999999929,69.569717000000026],[-96.563323999999966,69.564147999999989],[-96.461120999999991,69.564147999999989],[-96.401671999999905,69.562759000000028],[-96.373610999999983,69.560806000000071],[-96.358886999999868,69.55720500000001],[-96.351943999999946,69.55304000000001],[-96.345275999999899,69.548599000000081],[-96.343886999999995,69.543594000000041],[-96.335555999999997,69.534424000000001],[-96.328613000000018,69.529983999999956],[-96.31639100000001,69.526382000000012],[-96.291671999999892,69.531097000000045],[-96.218063000000029,69.546371000000136],[-96.207229999999981,69.55053700000002],[-96.198333999999875,69.55664100000007],[-96.194442999999978,69.561920000000043],[-96.184432999999956,69.56721500000009],[-96.169723999999917,69.566940000000102],[-96.152221999999995,69.563599000000067],[-96.139998999999932,69.559982000000105],[-96.133330999999941,69.555542000000059],[-96.134445000000028,69.550262000000032],[-96.136397999999986,69.546097000000032],[-96.104171999999949,69.49832200000003],[-96.101104999999961,69.493041999999946],[-96.097778000000005,69.483322000000044],[-96.096114999999998,69.46804800000001],[-96.098617999999988,69.457763999999941],[-96.143065999999919,69.351379000000009],[-96.146666999999979,69.345824999999991],[-96.163329999999974,69.348037999999974],[-96.233886999999982,69.359711000000004],[-96.248610999999926,69.36303700000002],[-96.270003999999972,69.370818999999983],[-96.288604999999961,69.378860000000032],[-96.304992999999911,69.387497000000053],[-96.325286999999946,69.400269000000037],[-96.333617999999944,69.409714000000122],[-96.348343,69.423035000000084],[-96.382216999999912,69.44470200000012],[-96.401108000000022,69.453048999999908],[-96.430557000000022,69.459717000000069],[-96.461944999999957,69.462493999999992],[-96.507232999999985,69.464432000000102],[-96.524719000000005,69.467484000000013],[-96.548889000000031,69.474990999999989],[-96.630828999999949,69.512207000000103],[-96.654175000000009,69.524994000000106],[-96.736663999999962,69.576660000000004],[-96.735549999999989,69.581940000000031],[-96.721663999999919,69.58248900000001],[-96.691665999999884,69.581940000000031],[-96.676940999999999,69.578323000000125],[-96.663054999999929,69.569717000000026]],[[-67.310546999999929,69.549149000000114],[-67.324172999999973,69.533875000000023],[-67.331680000000006,69.53137200000009],[-67.351105000000018,69.530823000000112],[-67.388610999999969,69.533051000000057],[-67.473052999999936,69.533875000000023],[-67.492766999999958,69.533051000000057],[-67.53083799999996,69.52915999999999],[-67.545272999999895,69.525818000000072],[-67.552489999999977,69.523041000000148],[-67.549437999999896,69.519714000000022],[-67.507232999999985,69.514998999999989],[-67.499999999999943,69.512833000000057],[-67.49888599999997,69.51249700000011],[-67.489990000000034,69.508606000000043],[-67.481673999999941,69.500000000000114],[-67.492492999999854,69.495529000000033],[-67.50778200000002,69.494980000000112],[-67.573623999999995,69.506653000000085],[-67.58555599999994,69.50749200000007],[-67.598891999999978,69.506378000000097],[-67.626662999999951,69.500549000000092],[-67.642226999999878,69.500274999999988],[-67.731948999999929,69.513611000000083],[-67.744445999999925,69.515822999999955],[-67.749725000000012,69.521103000000039],[-67.739440999999943,69.540817000000118],[-67.730834999999956,69.544434000000081],[-67.723052999999993,69.545258000000047],[-67.707229999999981,69.544434000000081],[-67.686661000000015,69.541091999999992],[-67.674712999999883,69.540268000000026],[-67.663329999999974,69.54193099999992],[-67.578063999999983,69.559708000000001],[-67.550277999999935,69.565536000000122],[-67.541381999999999,69.569153000000028],[-67.531386999999995,69.576384999999959],[-67.527221999999995,69.581940000000031],[-67.48443599999996,69.590271000000143],[-67.425002999999947,69.588882000000126],[-67.394454999999994,69.584991000000059],[-67.367217999999923,69.578323000000125],[-67.321395999999993,69.560531999999967],[-67.314437999999996,69.55664100000007],[-67.309433000000013,69.552765000000022],[-67.310546999999929,69.549149000000114]],[[-96.760558999999944,69.54553199999998],[-96.770003999999915,69.543594000000041],[-96.786666999999909,69.54553199999998],[-96.868880999999874,69.555817000000104],[-96.883895999999993,69.55914300000012],[-96.888061999999991,69.563873000000001],[-96.902221999999995,69.5977630000001],[-96.900283999999999,69.602203000000088],[-96.870543999999995,69.601379000000122],[-96.851395000000025,69.599425999999994],[-96.840835999999967,69.597488000000055],[-96.81639100000001,69.590271000000143],[-96.809433000000013,69.585815000000025],[-96.766402999999968,69.554977000000065],[-96.761947999999961,69.55053700000002],[-96.760558999999944,69.54553199999998]],[[-91.110001000000011,69.549423000000047],[-91.119155999999975,69.548324999999977],[-91.140288999999939,69.560806000000071],[-91.142501999999922,69.564986999999974],[-91.136397999999986,69.575546000000031],[-91.121384000000035,69.593048000000067],[-91.108886999999925,69.602203000000088],[-91.037215999999944,69.614990000000091],[-90.969161999999926,69.618317000000047],[-90.959732000000031,69.61943100000002],[-90.937499999999943,69.616379000000109],[-90.923049999999932,69.611374000000069],[-90.920272999999952,69.608032000000094],[-90.919158999999979,69.606093999999985],[-90.930832000000009,69.599152000000061],[-91.110001000000011,69.549423000000047]],[[-133.93222000000003,69.560256999999922],[-133.948059,69.560256999999922],[-133.96304299999997,69.561371000000122],[-133.98611499999998,69.565536000000122],[-134.01196299999992,69.571381000000031],[-134.01666299999994,69.576096000000064],[-134.01419099999998,69.58248900000001],[-134.01028400000001,69.585541000000092],[-133.94528199999996,69.613312000000008],[-133.93362399999995,69.616089000000102],[-133.89446999999996,69.621093999999971],[-133.87997399999995,69.621918000000107],[-133.86581399999994,69.619141000000013],[-133.84472700000003,69.600815000000011],[-133.84695399999998,69.588882000000126],[-133.868042,69.56721500000009],[-133.87719699999997,69.565261999999962],[-133.93222000000003,69.560256999999922]],[[-95.488892000000021,69.565536000000122],[-95.452498999999932,69.550262000000032],[-95.375548999999978,69.517761000000121],[-95.366104000000007,69.513611000000083],[-95.359726000000023,69.509155000000021],[-95.362212999999997,69.498870999999951],[-95.402495999999985,69.383330999999998],[-95.515839000000028,69.330826000000116],[-95.527221999999995,69.327484000000027],[-95.539718999999991,69.325271999999927],[-95.606383999999935,69.319153000000085],[-95.620270000000005,69.318603999999993],[-95.634170999999924,69.318329000000119],[-95.692489999999964,69.319153000000085],[-95.706954999999994,69.319442999999922],[-95.722778000000005,69.320831000000055],[-95.736938000000009,69.324432000000058],[-95.741104000000007,69.329162999999994],[-95.741668999999945,69.334717000000012],[-95.731673999999941,69.373031999999967],[-95.727782999999874,69.378585999999927],[-95.716949,69.382750999999928],[-95.693877999999984,69.389434999999992],[-95.669158999999979,69.394150000000025],[-95.657776000000013,69.397217000000126],[-95.648346000000004,69.403320000000065],[-95.666397000000018,69.497756999999979],[-95.669158999999979,69.50749200000007],[-95.694442999999978,69.540268000000026],[-95.708053999999947,69.548874000000126],[-95.720001000000025,69.552765000000022],[-95.736663999999905,69.554977000000065],[-95.815826000000015,69.562759000000028],[-95.827498999999932,69.559708000000001],[-95.831680000000006,69.554153000000099],[-95.822784000000013,69.514435000000049],[-95.817504999999926,69.504990000000021],[-95.809432999999956,69.495529000000033],[-95.797225999999966,69.481658999999979],[-95.862212999999997,69.348037999999974],[-95.87222300000002,69.34275800000006],[-95.899445000000014,69.340820000000122],[-95.961670000000026,69.346375000000023],[-95.978881999999999,69.349426000000051],[-95.990829000000019,69.353317000000118],[-96.011123999999882,69.478043000000071],[-96.009734999999978,69.483047000000056],[-95.919998000000021,69.595260999999994],[-95.909164000000033,69.599425999999994],[-95.789443999999946,69.634155000000078],[-95.773894999999925,69.632751000000098],[-95.625548999999921,69.616089000000102],[-95.61221299999994,69.61442599999998],[-95.488892000000021,69.565536000000122]],[[-138.86721799999992,69.588318000000015],[-138.87332200000003,69.583054000000061],[-138.88305699999995,69.579437000000098],[-138.91000399999996,69.576096000000064],[-138.945831,69.57887299999993],[-138.97720300000003,69.583054000000061],[-138.99609399999997,69.584152000000131],[-139.02307099999996,69.580826000000059],[-139.03417999999999,69.578048999999965],[-139.05306999999999,69.570540999999992],[-139.12109399999997,69.52915999999999],[-139.137787,69.530823000000112],[-139.33248899999995,69.566085999999927],[-139.32998699999996,69.571655000000135],[-139.32223499999992,69.576096000000064],[-139.26779199999993,69.605820000000051],[-139.24221799999992,69.618317000000047],[-139.23275799999999,69.621918000000107],[-139.19973800000002,69.630538999999999],[-139.14416499999999,69.644989000000123],[-139.13305700000001,69.647766000000047],[-139.12027,69.649993999999992],[-139.10333299999996,69.648041000000035],[-139.02029399999998,69.633331000000112],[-138.95611600000001,69.619705000000124],[-138.92111199999994,69.610535000000084],[-138.88055399999996,69.596939000000134],[-138.872772,69.59275800000006],[-138.86721799999992,69.588318000000015]],[[-135.51724199999995,69.569153000000028],[-135.54305999999997,69.565536000000122],[-135.55721999999997,69.568054000000075],[-135.57138099999997,69.576934999999992],[-135.58111600000001,69.580551000000071],[-135.5883179999999,69.584717000000126],[-135.591095,69.589980999999966],[-135.58944699999989,69.596099999999979],[-135.58612099999993,69.601653999999996],[-135.57888800000001,69.606644000000017],[-135.55471799999992,69.620254999999986],[-135.51196299999998,69.641663000000108],[-135.50030500000003,69.644439999999975],[-135.43972799999995,69.65248100000008],[-135.42388900000003,69.65248100000008],[-135.40972899999991,69.649993999999992],[-135.39779699999997,69.646942000000081],[-135.40917999999999,69.634995000000117],[-135.4655459999999,69.585541000000092],[-135.474152,69.581375000000037],[-135.505585,69.571655000000135],[-135.51724199999995,69.569153000000028]],[[-67.920273000000009,69.521927000000005],[-67.935271999999941,69.518875000000094],[-68.002228000000002,69.526657000000057],[-68.049437999999952,69.533875000000023],[-68.238892000000021,69.570267000000058],[-68.248885999999914,69.596649000000127],[-68.078339000000028,69.665268000000083],[-67.970839999999896,69.701935000000049],[-67.959731999999974,69.704987000000017],[-67.946380999999974,69.706375000000094],[-67.895553999999947,69.708603000000039],[-67.889724999999999,69.708328000000051],[-67.869720000000029,69.700821000000076],[-67.821120999999948,69.676376000000062],[-67.831680000000006,69.601928999999984],[-67.910278000000005,69.526657000000057],[-67.920273000000009,69.521927000000005]],[[-134.26058999999987,68.733535999999958],[-134.23248299999989,68.706100000000106],[-134.22778299999993,68.701385000000073],[-134.22726399999999,68.696426000000088],[-134.23580900000002,68.694977000000108],[-134.26779199999999,68.695816000000093],[-134.35693400000002,68.703049000000078],[-134.38861099999997,68.707214000000079],[-134.436127,68.713608000000136],[-134.45748899999995,68.719147000000135],[-134.46194499999996,68.72387700000013],[-134.49554399999994,68.75221300000004],[-134.53640699999994,68.786926000000051],[-134.66946399999989,68.894440000000145],[-134.741669,68.935531999999967],[-134.75500499999987,68.944427000000019],[-134.76696799999991,68.953323000000125],[-134.78306599999996,68.965355000000045],[-134.82583599999998,68.97886699999998],[-134.85278299999999,68.976379000000009],[-134.89224200000001,68.971924000000001],[-134.90472399999999,68.969986000000006],[-134.91473400000001,68.96665999999999],[-134.92028799999997,68.960815000000082],[-134.91973899999994,68.949417000000096],[-134.91723599999995,68.944138000000066],[-134.91641199999998,68.926926000000094],[-134.92028799999997,68.914703000000031],[-134.92584199999999,68.908600000000092],[-134.93307499999997,68.903594999999996],[-134.94137599999999,68.899429000000112],[-134.96112099999999,68.892487000000017],[-134.97500599999995,68.891663000000051],[-134.99999999999994,68.892082000000073],[-135.00750699999998,68.892212000000029],[-135.12609900000001,68.899429000000112],[-135.14196800000002,68.901382000000069],[-135.167236,68.907211000000075],[-135.17083699999995,68.911102000000142],[-135.17806999999999,68.920822000000044],[-135.18084699999997,68.926085999999998],[-135.20165999999995,68.9327550000001],[-135.23330699999991,68.934708000000001],[-135.262787,68.933594000000028],[-135.36111500000004,68.926651000000049],[-135.39196799999996,68.926651000000049],[-135.42138699999987,68.928864000000033],[-135.444458,68.934981999999934],[-135.45388799999995,68.938582999999994],[-135.46081499999997,68.942749000000106],[-135.76916499999993,68.896378000000084],[-135.808044,68.895264000000111],[-135.843323,68.897217000000069],[-135.88247699999999,68.905258000000117],[-135.90585299999992,68.911376999999959],[-135.94805899999994,68.924698000000092],[-135.99527,68.942474000000061],[-136.00250199999999,68.946640000000002],[-136.00527999999997,68.951935000000049],[-135.98916599999995,69.029160000000104],[-135.98525999999998,69.035812000000021],[-135.97833299999996,69.040817000000061],[-135.96859699999999,69.044434000000024],[-135.95443699999998,69.045532000000094],[-135.88861099999991,69.026093000000003],[-135.85012800000004,69.007401000000129],[-135.83389299999993,68.998322000000144],[-135.82888799999989,68.993591000000038],[-135.80248999999992,68.989426000000037],[-135.77001999999999,68.989150999999993],[-135.64889499999998,68.991928000000087],[-135.63473499999998,68.993042000000059],[-135.57861300000002,69.006104000000107],[-135.52557399999995,69.021102999999982],[-135.51779199999999,69.023880000000077],[-135.529449,69.026931999999988],[-135.72082499999999,69.046097000000145],[-135.91583300000002,69.088318000000129],[-135.92748999999998,69.09137000000004],[-135.93472299999996,69.095535000000041],[-135.95138499999996,69.142761000000064],[-135.96582000000001,69.197754000000089],[-135.96722399999999,69.214706000000092],[-135.95944199999997,69.228317000000061],[-135.94695999999993,69.23942599999998],[-135.92611699999998,69.254715000000033],[-135.915009,69.257492000000127],[-135.89862099999999,69.255554000000018],[-135.89138800000001,69.251389000000017],[-135.82138099999986,69.215271000000143],[-135.75140399999998,69.179428000000087],[-135.74194299999999,69.175812000000064],[-135.66610700000001,69.146941999999967],[-135.65667699999995,69.143600000000049],[-135.56750499999993,69.11775200000011],[-135.55279499999989,69.116652999999928],[-135.48693800000001,69.113312000000121],[-135.49581899999993,69.124145999999996],[-135.60720799999996,69.145264000000054],[-135.6305539999999,69.151382000000012],[-135.64001499999995,69.154984000000127],[-135.81082199999997,69.242751999999996],[-135.83999600000004,69.259430000000066],[-135.85220300000003,69.268051000000014],[-135.85498000000001,69.273315000000139],[-135.8558349999999,69.284714000000065],[-135.85415599999999,69.290817000000004],[-135.84860199999997,69.296936000000017],[-135.8416749999999,69.301926000000094],[-135.83331299999998,69.306366000000082],[-135.80389400000001,69.316666000000055],[-135.79251099999999,69.319442999999922],[-135.57192999999995,69.33859300000006],[-135.5561219999999,69.338882000000012],[-135.48580900000002,69.33526599999999],[-135.44860799999998,69.332214000000022],[-135.41332999999997,69.323043999999982],[-135.39196799999996,69.309981999999991],[-135.38723800000002,69.30525200000011],[-135.379974,69.301086000000055],[-135.37027,69.297484999999995],[-135.32333399999999,69.285262999999986],[-135.25778200000002,69.271378000000084],[-135.24386599999997,69.268600000000106],[-135.22970599999996,69.266098000000056],[-135.18554699999993,69.258880999999917],[-135.17056300000002,69.257766999999944],[-135.16223099999996,69.261931999999945],[-135.15805099999994,69.268600000000106],[-135.15835599999997,69.274429000000112],[-135.16500899999994,69.279160000000047],[-135.17443800000001,69.283051000000114],[-135.23971599999987,69.3316650000001],[-135.28695699999992,69.413605000000018],[-135.28723100000002,69.419144000000017],[-135.28527800000001,69.425537000000134],[-135.278076,69.430542000000003],[-135.26834099999996,69.434143000000063],[-135.16082800000004,69.473602000000142],[-135.15084799999994,69.476929000000098],[-135.137787,69.478592000000049],[-134.99664300000001,69.48414600000001],[-134.91528299999993,69.485259999999982],[-134.69473300000004,69.481658999999979],[-134.67749000000003,69.480819999999994],[-134.64251699999988,69.477203000000031],[-134.62832599999996,69.474426000000108],[-134.60861199999988,69.468597000000102],[-134.570831,69.453873000000044],[-134.55917399999987,69.450821000000133],[-134.53112799999997,69.445526000000086],[-134.49609399999997,69.441925000000026],[-134.48165900000004,69.442748999999992],[-134.46859699999993,69.444427000000076],[-134.43832399999997,69.454712000000029],[-134.42083699999995,69.463042999999914],[-134.413635,69.468322999999998],[-134.40777600000001,69.474152000000004],[-134.40557899999993,69.480270000000132],[-134.40835600000003,69.491364000000033],[-134.41778599999992,69.500549000000092],[-134.43667600000003,69.508041000000048],[-134.44833399999999,69.511107999999922],[-134.46887200000003,69.542755000000056],[-134.40167199999996,69.638321000000133],[-134.40249600000004,69.649719000000005],[-134.406677,69.654434000000037],[-134.44277999999997,69.68081699999999],[-134.48580899999996,69.706100000000049],[-134.49054000000001,69.710815000000082],[-134.49304199999995,69.715819999999951],[-134.49108899999993,69.722214000000008],[-134.47637900000001,69.723037999999974],[-134.30972299999996,69.715819999999951],[-134.20388799999995,69.668868999999972],[-134.17748999999998,69.64027400000009],[-134.19638099999992,69.621093999999971],[-134.20388799999995,69.616089000000102],[-134.24026500000002,69.585815000000025],[-134.24472000000003,69.579162999999994],[-134.24472000000003,69.573318000000029],[-134.24221799999998,69.568054000000075],[-134.11331200000001,69.538879000000009],[-134.09860199999997,69.539978000000019],[-134.08111600000001,69.548324999999977],[-134.06195099999997,69.555817000000104],[-134.03750600000001,69.560256999999922],[-134.02001999999999,69.559417999999994],[-134.00836200000003,69.556091000000038],[-134.00140399999998,69.551926000000037],[-133.97778299999999,69.528594999999996],[-133.96112099999999,69.509155000000021],[-133.94723499999992,69.506378000000097],[-133.91833499999996,69.508331000000055],[-133.87914999999998,69.513321000000076],[-133.86749299999997,69.515822999999955],[-133.86026000000004,69.520828000000051],[-133.82250999999997,69.555252000000053],[-133.823151,69.5600740000001],[-133.81973300000004,69.564986999999974],[-133.801941,69.573608000000092],[-133.79168699999997,69.576934999999992],[-133.77835099999993,69.576384999999959],[-133.75057999999996,69.547485000000108],[-133.74832199999992,69.542205999999965],[-133.79861500000004,69.481094000000098],[-133.81805399999996,69.464157000000114],[-133.85055499999999,69.445816000000093],[-133.87692300000003,69.433044000000109],[-133.92083699999995,69.412201000000039],[-133.94137599999999,69.405258000000003],[-133.96444699999995,69.400269000000037],[-134.08554100000003,69.340546000000018],[-134.21112099999993,69.276092999999946],[-134.21832299999988,69.271103000000096],[-134.27557400000001,69.226089000000115],[-134.27999899999986,69.219437000000028],[-134.28222699999998,69.213318000000015],[-134.28195199999999,69.20748900000001],[-134.27722199999994,69.202773999999977],[-134.27471899999995,69.197754000000089],[-134.27444500000001,69.186096000000077],[-134.28030399999994,69.180267000000072],[-134.287781,69.175262000000032],[-134.38363599999997,69.11831699999999],[-134.39779699999997,69.117477000000122],[-134.44888300000002,69.119705000000067],[-134.47720300000003,69.118042000000116],[-134.53112799999997,69.112762000000089],[-134.5680539999999,69.106644000000131],[-134.58526599999999,69.098038000000031],[-134.67361500000004,69.017761000000007],[-134.67584199999993,69.01138300000008],[-134.675568,69.005829000000062],[-134.66973899999999,68.9727630000001],[-134.67166099999997,68.966385000000002],[-134.66665599999999,68.956100000000049],[-134.65280200000001,68.947754000000145],[-134.60665900000004,68.935256999999979],[-134.58831799999996,68.928040000000067],[-134.51419099999987,68.887496999999996],[-134.50723300000004,68.883041000000048],[-134.48858599999994,68.870254999999986],[-134.47470099999998,68.856093999999985],[-134.46417199999991,68.84248400000007],[-134.45693999999997,68.826934999999992],[-134.44750999999991,68.811920000000043],[-134.44027700000004,68.80192599999998],[-134.43112199999996,68.792755000000056],[-134.417236,68.784423999999944],[-134.39889499999998,68.777205999999978],[-134.37609899999995,68.770827999999995],[-134.3511049999999,68.764998999999989],[-134.29666099999992,68.754440000000102],[-134.28750599999995,68.75082400000008],[-134.28057899999999,68.746643000000006],[-134.26058999999987,68.733535999999958]],[[-102.14527900000002,69.648604999999975],[-102.16027800000001,69.648331000000042],[-102.17832900000002,69.651093000000003],[-102.21028099999995,69.662200999999982],[-102.22609699999992,69.670258000000103],[-102.23166700000002,69.674698000000149],[-102.24305699999996,69.694138000000123],[-102.243607,69.704436999999984],[-102.24137899999999,69.71026599999999],[-102.23416099999997,69.716660000000047],[-102.22556299999991,69.721924000000001],[-102.21584300000001,69.726654000000053],[-102.15778399999999,69.736099000000081],[-102.13474300000001,69.724701000000096],[-102.12943999999993,69.72026100000005],[-102.12332199999997,69.71276899999998],[-102.12026999999989,69.708038000000045],[-102.11721799999998,69.697753999999975],[-102.11554699999999,69.666655999999989],[-102.11805700000002,69.660812000000135],[-102.12277199999994,69.65498400000007],[-102.13221699999991,69.650542999999971],[-102.14527900000002,69.648604999999975]],[[-77.946655000000021,69.646652000000074],[-77.944992000000013,69.639709000000039],[-77.946105999999986,69.633331000000112],[-77.965835999999967,69.624985000000038],[-78.07028200000002,69.59275800000006],[-78.169997999999964,69.570540999999992],[-78.311934999999949,69.54304500000012],[-78.397780999999952,69.520828000000051],[-78.505004999999869,69.488876000000062],[-78.576401000000033,69.501663000000065],[-78.588057999999933,69.506103999999993],[-78.611388999999917,69.509430000000009],[-78.626098999999954,69.50999500000006],[-78.646117999999888,69.50999500000006],[-78.664443999999889,69.50749200000007],[-78.685271999999941,69.49832200000003],[-78.698043999999982,69.489151000000049],[-78.718886999999938,69.479980000000126],[-78.756957999999941,69.467484000000013],[-78.801940999999943,69.455826000000002],[-78.817504999999926,69.45277400000009],[-78.838608000000022,69.451385000000073],[-78.853058000000033,69.454163000000108],[-78.861938000000009,69.457489000000123],[-78.868331999999953,69.460541000000035],[-78.873885999999857,69.464706000000035],[-78.880279999999971,69.476929000000098],[-78.87860099999989,69.479980000000126],[-78.874160999999958,69.486923000000104],[-78.865004999999996,69.494980000000112],[-78.841385000000002,69.508041000000048],[-78.826110999999969,69.511657999999954],[-78.809722999999963,69.514160000000061],[-78.783324999999991,69.521103000000039],[-78.764175000000023,69.527205999999978],[-78.717772999999966,69.544708000000014],[-78.695266999999944,69.556931000000077],[-78.674438000000009,69.568329000000062],[-78.652785999999935,69.581940000000031],[-78.628051999999968,69.608597000000145],[-78.615554999999915,69.617477000000008],[-78.586394999999925,69.631927000000132],[-78.575835999999981,69.636383000000023],[-78.522506999999905,69.648331000000042],[-78.499724999999899,69.650542999999971],[-78.482772999999895,69.649428999999941],[-78.400283999999999,69.643326000000002],[-78.260833999999932,69.659987999999998],[-78.245270000000005,69.663605000000132],[-78.229445999999996,69.67164600000001],[-78.228057999999976,69.677475000000072],[-78.236938000000009,69.688583000000051],[-78.244995000000017,69.693313999999987],[-78.256957999999941,69.705825999999945],[-78.263625999999931,69.713608000000079],[-78.26916499999993,69.728043000000014],[-78.268615999999952,69.732208000000014],[-78.265838999999971,69.733871000000136],[-78.180557000000022,69.75221300000004],[-78.164168999999958,69.752486999999974],[-78.154174999999952,69.750549000000035],[-78.141953000000001,69.742477000000065],[-78.080001999999979,69.72943099999992],[-78.018341000000021,69.708328000000051],[-77.992767000000015,69.699417000000096],[-77.982773000000009,69.694702000000063],[-77.973891999999978,69.688583000000051],[-77.966110000000015,69.681655999999975],[-77.955565999999976,69.668319999999994],[-77.946655000000021,69.646652000000074]],[[-82.507781999999963,69.704987000000017],[-82.542770000000019,69.704163000000051],[-82.678878999999995,69.726379000000009],[-82.720001000000025,69.733321999999987],[-82.865004999999996,69.770827999999995],[-82.877776999999924,69.774994000000049],[-82.879439999999931,69.778595000000109],[-82.856383999999991,69.800261999999975],[-82.846664000000033,69.803040000000124],[-82.839171999999962,69.80386400000009],[-82.811661000000015,69.806090999999981],[-82.803054999999915,69.805817000000047],[-82.796111999999994,69.805251999999996],[-82.776108000000022,69.804153000000042],[-82.677779999999927,69.794707999999957],[-82.629990000000021,69.789153999999996],[-82.563889000000017,69.778595000000109],[-82.460281000000009,69.761658000000125],[-82.453063999999983,69.720534999999984],[-82.455001999999922,69.714432000000045],[-82.467223999999987,69.709990999999945],[-82.507781999999963,69.704987000000017]],[[-79.423049999999989,69.784988000000055],[-79.331680000000006,69.713318000000072],[-79.328338999999971,69.707214000000079],[-79.329452999999944,69.701385000000016],[-79.333892999999989,69.697478999999987],[-79.354720999999984,69.688034000000073],[-79.482223999999917,69.646103000000096],[-79.544997999999964,69.626647999999932],[-79.571670999999981,69.61943100000002],[-79.600280999999995,69.612761999999975],[-79.631667999999934,69.608871000000079],[-79.957503999999972,69.619979999999998],[-79.963333000000034,69.626373000000115],[-79.974166999999852,69.631652999999972],[-79.994995000000017,69.638596000000007],[-80.02194199999991,69.643599999999935],[-80.038054999999986,69.645263999999941],[-80.059432999999899,69.64387499999998],[-80.065552000000025,69.641663000000108],[-80.081954999999994,69.630538999999999],[-80.082779000000016,69.626923000000147],[-80.078887999999949,69.622208000000114],[-80.032776000000013,69.587204000000042],[-79.991378999999938,69.568878000000041],[-79.937774999999931,69.531937000000084],[-79.935546999999985,69.527205999999978],[-79.93638599999997,69.523604999999918],[-79.940276999999924,69.518875000000094],[-79.974441999999954,69.502213000000097],[-79.993880999999931,69.494431000000134],[-80.011948000000018,69.491652999999985],[-80.021117999999944,69.49275200000011],[-80.046111999999937,69.497756999999979],[-80.200561999999991,69.530823000000112],[-80.214721999999995,69.586655000000064],[-80.353606999999954,69.614700000000084],[-80.461944999999957,69.656372000000147],[-80.492767000000015,69.664993000000038],[-80.577788999999996,69.667480000000126],[-80.74360699999994,69.666092000000049],[-80.761123999999995,69.666930999999977],[-80.793334999999956,69.670258000000103],[-80.804442999999878,69.675537000000077],[-80.809433000000013,69.683044000000052],[-80.809433000000013,69.68942300000009],[-80.801392000000021,69.701096000000121],[-80.730835000000013,69.746368000000132],[-80.725006000000008,69.74914600000011],[-80.720275999999899,69.750549000000035],[-80.649733999999967,69.748596000000077],[-80.520003999999972,69.720825000000048],[-80.498610999999983,69.759719999999959],[-80.50111400000003,69.762497000000053],[-80.502791999999943,69.76638800000012],[-80.504455999999948,69.774994000000049],[-80.503066999999987,69.779984000000127],[-80.499999999999943,69.783324999999991],[-80.490554999999972,69.788589000000115],[-80.46665999999999,69.791931000000091],[-80.388901000000033,69.799988000000042],[-80.371384000000035,69.799149000000057],[-80.340285999999992,69.794707999999957],[-80.338607999999908,69.790542999999957],[-80.343063000000029,69.784149000000127],[-80.34445199999999,69.776931999999988],[-80.329726999999991,69.774155000000121],[-80.314712999999983,69.778045999999961],[-80.289444000000003,69.786652000000061],[-80.264175000000023,69.79525799999999],[-80.246657999999968,69.798599000000024],[-80.232773000000009,69.79942299999999],[-80.20666499999993,69.798035000000084],[-80.191665999999884,69.79525799999999],[-80.182769999999948,69.792755000000056],[-80.129165999999941,69.765549000000021],[-80.073058999999944,69.74971000000005],[-79.972778000000005,69.723312000000078],[-79.862777999999935,69.741088999999988],[-79.768065999999976,69.75277699999998],[-79.756392999999889,69.778869999999927],[-79.752501999999993,69.783599999999979],[-79.744720000000029,69.788589000000115],[-79.687209999999993,69.814697000000081],[-79.678329000000019,69.814423000000147],[-79.512787000000003,69.80693100000002],[-79.476943999999946,69.803589000000102],[-79.453888000000006,69.798874000000069],[-79.442489999999907,69.794983000000002],[-79.431670999999938,69.789703000000088],[-79.423049999999989,69.784988000000055]],[[-83.674437999999952,69.719986000000063],[-83.688598999999954,69.719436999999914],[-83.717772999999966,69.723312000000078],[-83.776947000000007,69.732758000000047],[-83.806945999999982,69.739426000000037],[-83.898894999999982,69.764434999999992],[-83.908614999999998,69.769150000000025],[-83.917220999999984,69.778595000000109],[-83.913054999999986,69.793320000000051],[-83.900833000000034,69.808318999999926],[-83.886948000000018,69.81860400000005],[-83.873885999999914,69.823044000000095],[-83.860274999999945,69.824432000000002],[-83.832503999999972,69.825272000000041],[-83.577498999999989,69.797760000000096],[-83.533324999999934,69.791366999999923],[-83.529174999999952,69.786652000000061],[-83.542220999999984,69.783324999999991],[-83.576675000000023,69.780823000000055],[-83.601944000000003,69.779984000000127],[-83.695830999999998,69.763884999999959],[-83.708618000000001,69.759429999999952],[-83.712783999999999,69.754440000000102],[-83.705840999999964,69.750000000000057],[-83.693329000000006,69.745529000000147],[-83.662506000000008,69.736923000000047],[-83.655838000000017,69.732208000000014],[-83.654175000000009,69.727203000000145],[-83.661117999999988,69.722214000000008],[-83.674437999999952,69.719986000000063]],[[-82.429442999999992,69.782210999999961],[-82.444153000000028,69.778320000000122],[-82.470551,69.781372000000033],[-82.513335999999867,69.788315000000011],[-82.526107999999965,69.790542999999957],[-82.551392000000021,69.796646000000123],[-82.564437999999996,69.800812000000008],[-82.688599000000011,69.850815000000125],[-82.674438000000009,69.874984999999981],[-82.673049999999989,69.875809000000118],[-82.660552999999993,69.876083000000051],[-82.636397999999986,69.871094000000085],[-82.555831999999953,69.860809000000131],[-82.517226999999934,69.854155999999989],[-82.446105999999986,69.822220000000129],[-82.436661000000015,69.817490000000078],[-82.428878999999938,69.812195000000031],[-82.426666000000012,69.799988000000042],[-82.425827000000027,69.793045000000063],[-82.426101999999958,69.786925999999994],[-82.429442999999992,69.782210999999961]],[[-91.520003999999915,69.731369000000086],[-91.535278000000005,69.726929000000041],[-91.549438000000009,69.727203000000145],[-91.560271999999884,69.728316999999947],[-91.725280999999995,69.784149000000127],[-91.735549999999989,69.789153999999996],[-91.733321999999873,69.791931000000091],[-91.475829999999974,69.875534000000073],[-91.449432000000002,69.879149999999981],[-91.433883999999978,69.880538999999942],[-91.419448999999986,69.879974000000118],[-91.409164000000033,69.874984999999981],[-91.456664999999987,69.774994000000049],[-91.463332999999977,69.763611000000026],[-91.470551,69.755554000000075],[-91.520003999999915,69.731369000000086]],[[-91.819167999999934,69.821655000000078],[-91.833892999999989,69.821105999999929],[-91.844727000000034,69.822220000000129],[-91.860001000000011,69.838593000000003],[-91.864166000000012,69.844146999999964],[-91.860549999999989,69.848877000000016],[-91.84944200000001,69.858871000000022],[-91.821120999999891,69.868042000000003],[-91.782501000000025,69.877762000000075],[-91.763901000000033,69.880264000000125],[-91.745543999999995,69.881653000000142],[-91.728607000000011,69.880813999999987],[-91.71305799999999,69.878310999999997],[-91.701110999999969,69.875259000000085],[-91.644454999999937,69.859421000000054],[-91.639724999999999,69.854980000000126],[-91.651671999999962,69.851089000000059],[-91.666397000000018,69.847487999999998],[-91.819167999999934,69.821655000000078]],[[-97.397781000000009,69.685532000000023],[-97.41194200000001,69.684708000000057],[-97.441939999999931,69.685532000000023],[-97.455841000000021,69.684708000000057],[-97.468338000000017,69.682480000000112],[-97.479720999999984,69.678864000000033],[-97.489440999999999,69.673874000000012],[-97.490279999999871,69.668594000000098],[-97.476944000000003,69.654709000000025],[-97.398346000000004,69.597488000000055],[-97.391388000000006,69.593323000000055],[-97.378875999999934,69.592484000000127],[-97.372771999999998,69.598328000000095],[-97.351943999999946,69.631362999999965],[-97.350829999999974,69.636658000000068],[-97.347504000000015,69.642212000000029],[-97.329726999999878,69.669708000000071],[-97.31639100000001,69.686645999999996],[-97.303878999999938,69.698317999999915],[-97.289168999999958,69.69802900000002],[-97.273894999999982,69.694702000000063],[-97.226395000000025,69.675537000000077],[-97.206954999999937,69.667480000000126],[-97.113892000000021,69.622208000000114],[-97.106948999999929,69.617751999999996],[-97.103607000000011,69.614150999999936],[-97.101944000000003,69.609146000000067],[-97.102782999999931,69.603867000000093],[-97.09944200000001,69.594147000000021],[-97.09056099999998,69.584991000000059],[-97.064437999999939,69.572769000000108],[-96.955565999999976,69.523315000000082],[-96.879165999999998,69.491364000000033],[-96.866942999999992,69.487762000000089],[-96.637786999999946,69.437194999999974],[-96.502501999999936,69.409714000000122],[-96.32028200000002,69.354705999999965],[-96.301391999999964,69.346648999999957],[-96.208892999999989,69.306931000000134],[-96.202224999999942,69.302765000000022],[-96.189986999999974,69.288879000000065],[-96.172226000000023,69.26527400000009],[-96.170546999999999,69.260544000000039],[-96.171935999999903,69.255264000000011],[-96.175551999999925,69.249709999999993],[-96.193329000000006,69.237488000000042],[-96.203339000000028,69.232482999999945],[-96.209732000000031,69.22665399999994],[-96.21305799999999,69.211105000000032],[-96.223617999999931,69.141936999999928],[-96.235000999999954,69.064148000000102],[-96.23361199999988,69.059418000000051],[-96.229720999999984,69.054703000000018],[-96.225554999999986,69.049987999999985],[-96.218886999999995,69.045822000000101],[-96.195266999999944,69.038315000000011],[-96.166396999999904,69.031371999999976],[-96.1324919999999,69.024994000000049],[-96.118880999999931,69.025542999999971],[-96.115279999999984,69.030823000000055],[-96.113891999999964,69.036102000000028],[-96.129990000000021,69.054703000000018],[-96.152221999999995,69.103043000000071],[-96.15695199999999,69.163315000000068],[-96.155838000000017,69.168594000000041],[-96.149444999999901,69.174423000000047],[-96.073623999999995,69.231658999999979],[-96.05972300000002,69.232208000000128],[-96.047774999999888,69.228317000000061],[-96.041107000000011,69.223877000000073],[-95.955565999999919,69.141936999999928],[-95.951675000000023,69.13749700000011],[-95.924438000000009,69.089432000000102],[-95.925827000000027,69.084427000000062],[-95.93472300000002,69.078323000000012],[-95.953612999999905,69.067215000000033],[-95.971389999999928,69.054976999999951],[-95.977782999999988,69.049149000000057],[-95.978881999999999,69.043868999999972],[-95.97084000000001,69.034714000000122],[-95.938599000000011,69.003876000000105],[-95.925551999999982,68.995255000000043],[-95.843886999999995,68.923035000000027],[-95.82028200000002,68.870254999999986],[-95.770554000000004,68.891098000000056],[-95.756957999999997,68.891373000000044],[-95.745833999999945,68.888596000000121],[-95.674163999999962,68.869980000000112],[-95.670272999999895,68.865540000000124],[-95.668609999999944,68.860535000000084],[-95.667495999999971,68.855545000000006],[-95.671386999999982,68.850266000000033],[-95.667220999999984,68.835266000000047],[-95.663329999999974,68.830826000000059],[-95.654175000000009,68.826659999999947],[-95.626098999999954,68.826659999999947],[-95.575835999999981,68.830276000000026],[-95.550277999999878,68.833054000000004],[-95.528335999999911,68.840271000000087],[-95.510284000000013,68.852478000000076],[-95.489989999999977,68.861649000000057],[-95.446655000000021,68.879149999999981],[-95.42471299999994,68.886658000000011],[-95.389998999999989,68.895264000000111],[-95.378052000000025,68.89776599999999],[-95.365004999999996,68.899155000000007],[-95.351395000000025,68.899429000000112],[-95.335555999999997,68.897217000000069],[-95.321395999999993,68.893600000000106],[-95.240279999999984,68.86692800000003],[-95.228881999999942,68.863037000000134],[-95.21055599999994,68.854706000000022],[-95.206954999999994,68.850266000000033],[-95.210830999999985,68.844711000000132],[-95.263061999999991,68.802765000000136],[-95.273055999999997,68.797485000000108],[-95.476395000000025,68.711929000000112],[-95.543610000000001,68.702484000000027],[-95.539992999999924,68.708038000000045],[-95.538895000000025,68.713318000000129],[-95.538895000000025,68.723312000000135],[-95.546386999999982,68.732483000000059],[-95.559433000000013,68.741364000000033],[-95.568344000000025,68.745529000000033],[-95.593886999999938,68.752777000000037],[-95.608046999999885,68.753326000000129],[-95.621932999999956,68.752777000000037],[-95.790558000000033,68.737198000000092],[-95.801666000000012,68.733870999999965],[-95.848343,68.669983000000116],[-95.859726000000023,68.653320000000065],[-95.988891999999964,68.62164300000012],[-96.000838999999928,68.61943100000002],[-96.14973399999991,68.55720500000001],[-96.256393000000003,68.503326000000015],[-96.262512000000015,68.497481999999991],[-96.264724999999885,68.487198000000149],[-96.270844000000011,68.481368999999972],[-96.291381999999942,68.473038000000031],[-96.30221599999993,68.469711000000132],[-96.313888999999961,68.467209000000025],[-96.503615999999909,68.446091000000138],[-96.530563000000029,68.444976999999994],[-96.717498999999918,68.474990999999989],[-96.768341000000021,68.485260000000039],[-96.913895000000025,68.518051000000128],[-96.928328999999962,68.521378000000084],[-97.094451999999876,68.539154000000053],[-97.095550999999944,68.534149000000014],[-97.098891999999978,68.528594999999996],[-97.11999499999996,68.520828000000051],[-97.130828999999949,68.517487000000017],[-97.142501999999979,68.514999000000046],[-97.154175000000009,68.512771999999984],[-97.181106999999997,68.511382999999967],[-97.460007000000019,68.534149000000014],[-97.475005999999951,68.535537999999974],[-97.506118999999956,68.541930999999977],[-97.553329000000019,68.55664100000007],[-97.574172999999917,68.564148000000046],[-97.583618000000001,68.568054000000075],[-97.667220999999927,68.60386699999998],[-97.727218999999991,68.63220199999995],[-97.918609999999944,68.675537000000134],[-98.020554000000004,68.693588000000091],[-98.035552999999936,68.694702000000063],[-98.049987999999985,68.694977000000108],[-98.062774999999988,68.693588000000091],[-98.078338999999971,68.683319000000097],[-98.083892999999989,68.677475000000072],[-98.09333799999996,68.672211000000061],[-98.104995999999971,68.669708000000128],[-98.11999499999996,68.670822000000101],[-98.129715000000033,68.674698000000149],[-98.240279999999984,68.720825000000048],[-98.261123999999938,68.733597000000032],[-98.281677000000002,68.746368000000132],[-98.290558000000033,68.755554000000075],[-98.292495999999971,68.760543999999982],[-98.291945999999939,68.765823000000125],[-98.286117999999931,68.771652000000131],[-98.269729999999981,68.783875000000023],[-98.260833999999932,68.789153999999996],[-98.249161000000015,68.800812000000008],[-98.243056999999965,68.811920000000043],[-98.244155999999975,68.822220000000129],[-98.263061999999991,68.829987000000074],[-98.275283999999886,68.833602999999982],[-98.369719999999973,68.857483000000116],[-98.383330999999941,68.859985000000052],[-98.408051,68.855820000000051],[-98.418609999999944,68.852478000000076],[-98.425003000000004,68.841370000000097],[-98.415282999999988,68.815262000000132],[-98.40194699999995,68.801650999999993],[-98.393615999999952,68.787201000000039],[-98.394729999999925,68.776932000000045],[-98.400283999999942,68.770827999999995],[-98.408614999999941,68.764708999999982],[-98.418609999999944,68.760543999999982],[-98.451110999999969,68.750000000000114],[-98.476395000000025,68.746933000000013],[-98.489990000000034,68.746094000000028],[-98.519454999999994,68.747481999999934],[-98.724715999999887,68.791092000000106],[-98.84722899999997,68.825546000000145],[-98.859436000000017,68.829163000000108],[-98.866394000000014,68.833328000000108],[-98.875548999999978,68.84248400000007],[-98.879714999999976,68.852203000000088],[-98.879165999999941,68.857483000000116],[-98.86999499999996,68.874146000000053],[-98.864440999999999,68.879974000000118],[-98.856383999999991,68.886383000000023],[-98.847503999999958,68.891663000000051],[-98.826675000000023,68.899429000000112],[-98.817504999999869,68.904709000000025],[-98.811934999999949,68.910538000000031],[-98.811385999999914,68.915817000000004],[-98.820556999999951,68.924987999999928],[-98.827498999999989,68.929152999999928],[-98.84944200000001,68.933594000000028],[-98.965835999999967,68.949417000000096],[-98.981109999999944,68.950546000000031],[-98.993057000000022,68.947754000000145],[-99.077498999999989,68.918319999999994],[-99.09584000000001,68.899429000000112],[-99.076401000000033,68.891663000000051],[-99.062209999999936,68.883041000000048],[-99.043883999999935,68.864990000000091],[-99.044158999999866,68.859711000000118],[-99.176102000000014,68.825821000000019],[-99.188599000000011,68.824158000000068],[-99.21055599999994,68.831664999999987],[-99.236664000000019,68.848877000000016],[-99.24610899999999,68.852768000000083],[-99.267226999999991,68.859146000000067],[-99.311385999999914,68.868866000000139],[-99.413329999999974,68.884155000000021],[-99.428054999999972,68.887206999999989],[-99.437774999999988,68.891098000000056],[-99.444992000000013,68.895538000000045],[-99.449722000000008,68.899993999999992],[-99.454178000000013,68.909714000000065],[-99.451110999999912,68.915268000000026],[-99.447768999999994,68.926085999999998],[-99.448882999999967,68.936645999999996],[-99.450835999999981,68.941650000000095],[-99.460555999999997,68.950821000000076],[-99.489166000000012,68.967484000000127],[-99.523330999999871,68.983596999999975],[-99.562499999999943,68.99914600000011],[-99.589721999999881,69.011108000000036],[-99.594161999999983,69.015823000000069],[-99.596389999999928,69.020538000000101],[-99.596114999999998,69.025818000000015],[-99.593338000000017,69.031371999999976],[-99.579880000000003,69.043930000000046],[-99.513625999999874,69.101929000000098],[-99.492217999999866,69.1202550000001],[-99.485824999999977,69.125259000000028],[-99.476943999999946,69.13081399999993],[-99.466659999999933,69.13499500000006],[-99.311385999999914,69.158875000000023],[-99.296660999999972,69.158600000000035],[-99.238051999999982,69.149719000000061],[-99.168334999999956,69.138321000000076],[-99.035278000000005,69.135818000000086],[-99.006957999999997,69.136383000000137],[-98.798049999999989,69.17053199999998],[-98.774445000000014,69.17553700000002],[-98.730559999999969,69.189423000000033],[-98.720275999999956,69.193863000000022],[-98.711120999999991,69.199141999999995],[-98.702788999999996,69.205261000000007],[-98.699722000000008,69.210815000000025],[-98.701110999999969,69.220825000000104],[-98.705275999999969,69.230820000000051],[-98.615554999999915,69.294708000000071],[-98.533889999999928,69.291367000000037],[-98.441375999999877,69.298035000000027],[-98.415558000000033,69.301086000000055],[-98.403335999999967,69.303588999999988],[-98.393341000000021,69.308029000000033],[-98.387512000000015,69.313873000000058],[-98.384170999999981,69.319442999999922],[-98.388061999999991,69.329162999999994],[-98.397232000000031,69.338318000000072],[-98.44027699999998,69.363876000000005],[-98.457229999999981,69.371917999999994],[-98.476944000000003,69.379974000000061],[-98.488892000000021,69.383605999999986],[-98.523330999999985,69.388321000000019],[-98.535552999999936,69.391937000000098],[-98.555556999999965,69.399994000000049],[-98.562499999999943,69.404159999999933],[-98.598052999999993,69.430542000000003],[-98.611937999999952,69.444138000000009],[-98.608886999999868,69.449706999999989],[-98.591675000000009,69.467484000000013],[-98.585555999999997,69.473312000000135],[-98.577224999999999,69.479430999999977],[-98.563323999999909,69.477203000000031],[-98.553329000000019,69.473312000000135],[-98.540833000000021,69.469711000000075],[-98.508347000000015,69.463318000000129],[-98.477492999999924,69.461928999999941],[-98.447768999999994,69.461655000000007],[-98.422501000000011,69.465820000000008],[-98.419448999999986,69.47137499999991],[-98.424164000000019,69.475815000000125],[-98.44888299999991,69.483047000000056],[-98.463897999999972,69.486374000000012],[-98.549438000000009,69.501389000000131],[-98.564712999999927,69.504715000000147],[-98.577224999999999,69.508331000000055],[-98.586944999999901,69.512207000000103],[-98.601669000000015,69.520828000000051],[-98.605559999999912,69.530548000000124],[-98.604995999999971,69.535812000000078],[-98.601943999999946,69.541091999999992],[-98.592772999999909,69.552765000000022],[-98.575561999999991,69.570267000000058],[-98.566955999999948,69.576384999999959],[-98.556655999999862,69.580826000000059],[-98.531386999999938,69.584991000000059],[-98.501403999999923,69.584427000000119],[-98.485549999999989,69.583327999999995],[-98.433318999999983,69.575546000000031],[-98.385559000000001,69.566085999999927],[-98.357773000000009,69.55914300000012],[-98.350554999999929,69.554703000000131],[-98.338897999999972,69.546097000000032],[-98.334166999999979,69.54136699999998],[-98.322509999999909,69.532486000000063],[-98.310821999999973,69.523880000000133],[-98.28443900000002,69.506378000000097],[-98.248610999999983,69.484984999999995],[-98.092498999999975,69.424988000000042],[-98.078613000000018,69.422760000000039],[-98.049727999999959,69.423035000000084],[-98.036666999999852,69.424698000000035],[-98.024719000000005,69.427200000000084],[-98.00389100000001,69.435806000000014],[-97.997771999999998,69.441650000000038],[-97.99722300000002,69.446930000000066],[-98.006957999999997,69.450821000000133],[-98.071395999999993,69.468872000000147],[-98.157226999999978,69.4994200000001],[-98.166945999999996,69.503326000000015],[-98.188599000000011,69.516098],[-98.211394999999925,69.538879000000009],[-98.255843999999968,69.574707000000046],[-98.263061999999991,69.57887299999993],[-98.295837000000006,69.585266000000104],[-98.330291999999986,69.590271000000143],[-98.360549999999932,69.596649000000127],[-98.367767000000015,69.601089000000115],[-98.321670999999981,69.713608000000079],[-98.314163000000008,69.722214000000008],[-98.281951999999933,69.751663000000008],[-98.230285999999978,69.788879000000122],[-98.211120999999991,69.79942299999999],[-98.199722000000008,69.802765000000136],[-98.187209999999936,69.805251999999996],[-98.143889999999942,69.806366000000025],[-98.118057000000022,69.81053200000008],[-98.107772999999895,69.814697000000081],[-98.088608000000022,69.825272000000041],[-98.079726999999991,69.83137499999998],[-98.061661000000015,69.848877000000016],[-98.058333999999888,69.854431000000034],[-98.049164000000019,69.865814],[-98.043059999999969,69.871643000000006],[-98.034164000000033,69.878036000000009],[-98.012222000000008,69.885817999999972],[-97.999725000000012,69.888046000000088],[-97.974166999999909,69.892211999999972],[-97.945540999999992,69.893600000000106],[-97.930557000000022,69.893325999999945],[-97.913329999999974,69.891098],[-97.880279999999914,69.88499500000006],[-97.755004999999926,69.851379000000065],[-97.691101000000003,69.819992000000127],[-97.689162999999951,69.815262000000132],[-97.682219999999973,69.810806000000014],[-97.660004000000015,69.803314000000057],[-97.610000999999954,69.788589000000115],[-97.579726999999991,69.781937000000028],[-97.449158000000011,69.760269000000108],[-97.341109999999958,69.706375000000094],[-97.33944699999995,69.701385000000016],[-97.348052999999879,69.695251000000042],[-97.358611999999994,69.690810999999997],[-97.37110899999999,69.688583000000051],[-97.397781000000009,69.685532000000023]],[[-97.325012000000015,69.889160000000061],[-97.315276999999924,69.888046000000088],[-97.301665999999955,69.889709000000039],[-97.289992999999924,69.893051000000128],[-97.276947000000007,69.894440000000145],[-97.267775999999969,69.894440000000145],[-97.25,69.891373000000044],[-97.237503000000004,69.887771999999984],[-97.230559999999912,69.883331000000055],[-97.226943999999946,69.873596000000134],[-97.230559999999912,69.868042000000003],[-97.236937999999896,69.862198000000149],[-97.243880999999988,69.857483000000116],[-97.269164999999987,69.852478000000076],[-97.283889999999985,69.852768000000083],[-97.299163999999905,69.856094000000098],[-97.308883999999978,69.860260000000039],[-97.317779999999914,69.869431000000134],[-97.418334999999956,69.893600000000106],[-97.448883000000023,69.894149999999911],[-97.465835999999911,69.896378000000084],[-97.480285999999921,69.898880000000133],[-97.488892000000021,69.908035000000041],[-97.492767000000015,69.917755000000113],[-97.488602000000014,69.943863000000079],[-97.485000999999954,69.949417000000039],[-97.476105000000018,69.955551000000071],[-97.466399999999965,69.960815000000082],[-97.453612999999962,69.963043000000027],[-97.4375,69.961929000000055],[-97.350829999999974,69.949417000000039],[-97.335555999999997,69.946091000000024],[-97.328339000000028,69.941650000000095],[-97.327498999999989,69.931656000000089],[-97.346114999999998,69.917205999999965],[-97.349730999999963,69.911651999999947],[-97.351669000000015,69.901382000000012],[-97.347228999999913,69.896652000000017],[-97.337509000000011,69.892761000000121],[-97.325012000000015,69.889160000000061]],[[-100.84973099999991,69.925537000000077],[-100.86389199999991,69.924698000000092],[-100.87444299999999,69.928588999999988],[-100.87999000000002,69.933043999999995],[-100.87999000000002,69.938309000000061],[-100.85861199999994,69.977767999999969],[-100.85333300000002,69.983597000000145],[-100.84333800000002,69.98803700000002],[-100.83112299999993,69.990814000000057],[-100.81500199999994,69.989700000000084],[-100.80695300000002,69.985809000000017],[-100.80526700000001,69.980270000000019],[-100.80721999999997,69.97526600000009],[-100.80721999999997,69.969986000000006],[-100.81249999999994,69.958878000000027],[-100.83112299999993,69.935531999999967],[-100.83999599999999,69.929977000000065],[-100.84973099999991,69.925537000000077]],[[-87.091385000000002,70.150269000000094],[-87.06361400000003,70.147766000000104],[-87.051665999999955,70.141937000000098],[-87.02555799999999,70.135543999999982],[-87.020843999999954,70.131927000000019],[-87.023894999999982,70.127762000000018],[-87.021941999999967,70.121094000000028],[-87.009170999999924,70.116378999999995],[-86.994155999999975,70.113602000000071],[-86.922501000000011,70.104156000000103],[-86.905562999999972,70.103043000000071],[-86.87388599999997,70.09887700000013],[-86.856658999999922,70.097762999999986],[-86.825835999999924,70.092758000000117],[-86.798889000000031,70.087204000000099],[-86.778060999999923,70.089706000000035],[-86.761123999999938,70.093597000000102],[-86.688599000000011,70.115265000000022],[-86.670273000000009,70.118042000000116],[-86.639724999999999,70.116653000000099],[-86.611664000000019,70.111923000000104],[-86.598617999999988,70.108597000000032],[-86.586670000000026,70.104430999999977],[-86.545546999999942,70.081375000000094],[-86.549728000000016,70.07249500000006],[-86.550551999999982,70.066376000000048],[-86.536666999999909,70.062484999999981],[-86.511123999999995,70.053040000000067],[-86.505004999999983,70.048035000000027],[-86.503615999999965,70.036925999999994],[-86.505844000000025,70.028595000000053],[-86.50556899999998,70.023315000000025],[-86.502501999999993,70.020828000000108],[-86.487503000000004,70.017761000000007],[-86.47193900000002,70.015823000000069],[-86.460555999999997,70.012206999999989],[-86.45666499999993,70.007491999999957],[-86.460006999999962,70.00471500000009],[-86.468886999999995,69.999709999999993],[-86.489715999999987,69.983871000000079],[-86.502791999999999,69.980545000000063],[-86.523620999999991,69.978042999999957],[-86.542496000000028,69.977478000000133],[-86.662216000000001,69.967484000000127],[-86.714447000000007,69.966934000000094],[-86.747771999999998,69.969437000000084],[-86.76556399999987,69.969711000000018],[-86.833069000000023,69.974426000000051],[-86.864440999999999,69.978592000000106],[-86.881377999999984,69.979706000000078],[-86.89805599999994,69.982207999999957],[-86.926391999999964,69.989150999999993],[-86.938599000000011,69.993317000000047],[-86.962219000000005,70.00471500000009],[-86.985274999999945,70.01388500000013],[-87.002227999999945,70.014999000000103],[-87.016113000000018,70.010544000000095],[-87.021941999999967,70.005264000000011],[-87.029449,70.000824000000023],[-87.037215999999944,69.99664300000012],[-87.050277999999878,69.991653000000042],[-87.066665999999998,69.989150999999993],[-87.086394999999925,69.987761999999975],[-87.104172000000005,69.987761999999975],[-87.135009999999966,69.992752000000053],[-87.148055999999997,69.997482000000048],[-87.168883999999991,70.008605999999929],[-87.182769999999948,70.01388500000013],[-87.195830999999998,70.017212000000029],[-87.21362299999987,70.017487000000074],[-87.229445999999996,70.019440000000031],[-87.240828999999906,70.021378000000141],[-87.255004999999983,70.025269000000037],[-87.274444999999957,70.034987999999998],[-87.277495999999985,70.038879000000065],[-87.27694699999995,70.044983000000116],[-87.273620999999991,70.050812000000121],[-87.272507000000019,70.054703000000018],[-87.272780999999952,70.059981999999991],[-87.278335999999967,70.067490000000021],[-87.288329999999974,70.073317999999972],[-87.295837000000006,70.077484000000027],[-87.307495000000017,70.080826000000002],[-87.319457999999884,70.083328000000051],[-87.335555999999997,70.085541000000035],[-87.34973100000002,70.086104999999975],[-87.363892000000021,70.088593000000117],[-87.376937999999939,70.093322999999941],[-87.378325999999959,70.096100000000035],[-87.376099000000011,70.099426000000108],[-87.371384000000035,70.103867000000037],[-87.355834999999956,70.107208000000071],[-87.341948999999886,70.108597000000032],[-87.307495000000017,70.107208000000071],[-87.277785999999992,70.114699999999971],[-87.267226999999878,70.113312000000064],[-87.265609999999924,70.113556000000017],[-87.254729999999995,70.112198000000092],[-87.222503999999901,70.111374000000126],[-87.187774999999931,70.108322000000044],[-87.180557000000022,70.109420999999998],[-87.173049999999989,70.112198000000092],[-87.164443999999946,70.117203000000131],[-87.156112999999891,70.11914100000007],[-87.130829000000006,70.120255000000043],[-87.118332000000009,70.11914100000007],[-87.102782999999988,70.12081900000004],[-87.099730999999963,70.123596000000077],[-87.100554999999929,70.125534000000073],[-87.143065999999976,70.139435000000049],[-87.145279000000016,70.142761000000064],[-87.141388000000006,70.146378000000027],[-87.128326000000015,70.149719000000061],[-87.113891999999964,70.148880000000077],[-87.091385000000002,70.150269000000094]],[[-125.05695299999996,70.118317000000104],[-125.08500700000002,70.116333000000111],[-125.10221899999993,70.118072999999981],[-125.11971999999997,70.124954000000002],[-125.122772,70.130066000000056],[-125.12332200000003,70.13546800000006],[-125.12110899999999,70.141372999999987],[-125.11277799999999,70.14697300000006],[-125.10333300000002,70.151688000000092],[-125.08332799999999,70.159973000000093],[-125.07055700000001,70.16187999999994],[-125,70.162933000000066],[-124.97693600000002,70.167206000000078],[-124.96305799999999,70.168320000000051],[-124.95500199999998,70.164153999999996],[-124.98832700000003,70.134430000000009],[-124.99777199999994,70.129974000000061],[-125.04415899999992,70.120315999999946],[-125.05695299999996,70.118317000000104]],[[-124.67944299999994,70.161652000000117],[-124.69444299999998,70.161377000000073],[-124.73750299999995,70.174149000000114],[-124.75361599999991,70.182479999999998],[-124.75917099999998,70.186919999999986],[-124.76194799999996,70.191925000000083],[-124.75890400000003,70.196640000000116],[-124.74471999999997,70.197754000000089],[-124.55110200000001,70.208602999999925],[-124.53611799999987,70.208602999999925],[-124.51888999999994,70.206940000000031],[-124.51055899999994,70.20277399999992],[-124.50527999999997,70.198318000000029],[-124.50750700000003,70.192749000000049],[-124.53694200000001,70.18193100000002],[-124.67944299999994,70.161652000000117]],[[-112.65527299999991,70.266098],[-112.67223399999995,70.266098],[-112.69193999999999,70.267487000000017],[-112.72193900000002,70.272491000000002],[-112.74722300000002,70.278594999999996],[-112.75499699999995,70.282761000000107],[-112.76027699999992,70.287201000000096],[-112.76306199999993,70.292480000000069],[-112.76139799999993,70.298598999999967],[-112.75389100000001,70.303588999999988],[-112.73111,70.309708000000001],[-112.71611000000001,70.310531999999967],[-112.699997,70.309417999999994],[-112.6875,70.306366000000082],[-112.67971799999992,70.302475000000015],[-112.67859599999991,70.300812000000064],[-112.64334099999996,70.28137200000009],[-112.64277600000003,70.275818000000129],[-112.64472999999987,70.269714000000079],[-112.65527299999991,70.266098]],[[-112.96972700000003,70.28137200000009],[-113.00306699999999,70.281097000000102],[-113.104446,70.281936999999971],[-113.14083899999997,70.283325000000048],[-113.15834000000001,70.285262999999986],[-113.20361300000002,70.292480000000069],[-113.16972399999992,70.306931000000134],[-113.15750100000002,70.309708000000001],[-113.12888299999997,70.312485000000095],[-113.11054999999993,70.3119200000001],[-112.993607,70.299423000000104],[-112.97609699999992,70.297484999999938],[-112.96362299999998,70.294434000000138],[-112.95333900000003,70.290817000000004],[-112.94554099999999,70.286652000000004],[-112.95612299999999,70.283325000000048],[-112.96972700000003,70.28137200000009]],[[-100.765289,70.25],[-100.78083800000002,70.25],[-100.7938769999999,70.253326000000015],[-100.84166699999997,70.278320000000008],[-100.86305199999993,70.291091999999992],[-100.86833200000001,70.295532000000037],[-100.85193600000002,70.323883000000137],[-100.83889799999992,70.325546000000031],[-100.80943300000001,70.324158000000125],[-100.77639799999997,70.322495000000004],[-100.75890399999997,70.320540999999992],[-100.74804699999999,70.316940000000102],[-100.74082899999996,70.310531999999967],[-100.75890399999997,70.254990000000021],[-100.765289,70.25]],[[-116.80526699999996,70.509430000000009],[-116.78971899999993,70.507217000000026],[-116.75418100000002,70.50749200000007],[-116.63390400000003,70.493591000000094],[-116.60722399999997,70.488037000000077],[-116.59638999999993,70.484984999999995],[-116.56833599999999,70.473876999999959],[-116.57305899999989,70.467758000000117],[-116.70111099999997,70.468597000000102],[-116.71916199999993,70.470261000000107],[-116.787781,70.483597000000032],[-116.814438,70.488876000000062],[-116.82055700000001,70.493591000000094],[-116.82861300000002,70.503601000000003],[-116.82224300000001,70.508881000000031],[-116.80526699999996,70.509430000000009]],[[-116.287781,70.553314000000114],[-116.26027699999992,70.549988000000042],[-116.24333199999995,70.550261999999975],[-116.18943799999994,70.54553199999998],[-116.140556,70.538589000000002],[-116.12748699999997,70.535812000000078],[-116.13110399999999,70.532486000000006],[-116.29110699999995,70.515549000000021],[-116.32333399999993,70.513611000000083],[-116.44611399999991,70.508881000000031],[-116.46472199999999,70.509154999999964],[-116.47778299999999,70.511932000000058],[-116.495003,70.519989000000066],[-116.49582700000002,70.522765999999933],[-116.47000099999997,70.538040000000024],[-116.30304699999988,70.552199999999971],[-116.287781,70.553314000000114]],[[-116.56304899999998,70.534424000000001],[-116.57833900000003,70.533051000000057],[-116.596947,70.533324999999991],[-116.75028999999995,70.539153999999996],[-116.76363400000002,70.541931000000091],[-116.77443700000003,70.545258000000047],[-116.766953,70.548324999999977],[-116.75527999999991,70.551085999999941],[-116.72361799999987,70.556366000000025],[-116.71193699999998,70.559417999999937],[-116.68167099999999,70.561920000000043],[-116.66471899999999,70.562485000000038],[-116.64611799999994,70.562195000000031],[-116.54305999999997,70.559707999999944],[-116.52278100000001,70.558593999999971],[-116.50945300000001,70.556091000000038],[-116.50778200000002,70.550261999999975],[-116.51806599999998,70.546646000000123],[-116.56304899999998,70.534424000000001]],[[-115.92054699999989,70.54136699999998],[-115.95445299999994,70.540267999999969],[-115.99333200000001,70.541656000000103],[-116.051941,70.54553199999998],[-116.06111099999993,70.548324999999977],[-116.04250299999995,70.552199999999971],[-115.98388699999998,70.560806000000071],[-115.97222899999991,70.563599000000011],[-115.91972399999997,70.572494999999947],[-115.87917299999998,70.578598000000113],[-115.86389200000002,70.579987000000074],[-115.82501199999996,70.578323000000069],[-115.81416300000001,70.574997000000053],[-115.80803700000001,70.570541000000105],[-115.81082199999997,70.564986999999974],[-115.81916799999999,70.560806000000071],[-115.84111000000001,70.554153000000042],[-115.86638599999998,70.549423000000047],[-115.92054699999989,70.54136699999998]],[[-116.87943999999993,70.547485000000108],[-116.88945000000001,70.543869000000029],[-116.923317,70.542755000000056],[-117.03611799999993,70.546371000000136],[-117.18331899999998,70.537491000000102],[-117.20195000000001,70.53776600000009],[-117.22000099999997,70.539153999999996],[-117.27555799999993,70.550261999999975],[-117.28888699999993,70.55304000000001],[-117.29778299999998,70.556931000000077],[-117.30166600000001,70.561920000000043],[-117.29778299999998,70.571380999999974],[-117.26083399999999,70.584717000000126],[-117.25140399999992,70.587204000000042],[-117.23805199999998,70.589156999999943],[-117.21640000000002,70.591095000000109],[-117.19943199999994,70.591660000000104],[-117.16332999999997,70.588593000000003],[-116.89444700000001,70.556091000000038],[-116.88362100000001,70.552765000000136],[-116.87943999999993,70.547485000000108]],[[-128.08612099999999,70.605545000000006],[-128.10415599999999,70.595825000000104],[-128.1201779999999,70.597214000000122],[-128.11444099999994,70.591934000000037],[-128.11721799999992,70.580551000000014],[-128.12387100000001,70.57388300000008],[-128.13275099999993,70.569153000000028],[-128.34054599999996,70.539153999999996],[-128.34167499999995,70.542205999999908],[-128.252228,70.646378000000084],[-128.24581899999998,70.653046000000074],[-128.23416099999986,70.656097000000102],[-128.21639999999996,70.654709000000025],[-128.18832399999997,70.648604999999975],[-128.11498999999998,70.628036000000009],[-128.10360699999995,70.624419999999986],[-128.09472700000003,70.62052900000009],[-128.0883179999999,70.616089000000045],[-128.08499099999995,70.611099000000024],[-128.08612099999999,70.605545000000006]],[[-100.23082699999992,70.451660000000061],[-100.24333199999995,70.449142000000109],[-100.26000999999985,70.449996999999996],[-100.27610799999997,70.453049000000078],[-100.47250400000001,70.496367999999961],[-100.49916100000002,70.503326000000129],[-100.63054699999998,70.543320000000108],[-100.662781,70.554703000000075],[-100.67083700000001,70.558868000000075],[-100.67639199999996,70.563309000000004],[-100.68138099999993,70.573044000000095],[-100.68138099999993,70.583602999999982],[-100.67832900000002,70.594147000000021],[-100.66443599999991,70.637771999999984],[-100.65194699999995,70.669708000000071],[-100.51194800000002,70.676376000000062],[-100.49500299999988,70.675262000000089],[-100.48000300000001,70.673309000000131],[-100.46916199999998,70.669434000000138],[-100.46112099999999,70.659987999999998],[-100.451683,70.651932000000102],[-100.44360399999999,70.64776599999999],[-100.34722899999991,70.608032000000094],[-100.33640300000002,70.604431000000034],[-100.31945799999994,70.603317000000061],[-100.21833799999996,70.564422999999977],[-100.22444200000001,70.456649999999968],[-100.23082699999992,70.451660000000061]],[[-103.17777999999993,70.622482000000048],[-103.19360399999994,70.622208000000114],[-103.24833699999994,70.622757000000036],[-103.26640299999991,70.624146000000053],[-103.27500900000001,70.628311000000053],[-103.28111299999995,70.632751000000042],[-103.281387,70.638046000000088],[-103.26834099999996,70.666382000000056],[-103.22582999999986,70.676376000000062],[-103.21000700000002,70.676651000000049],[-103.19415299999997,70.673035000000027],[-103.173607,70.6336060000001],[-103.17304999999999,70.628586000000041],[-103.17777999999993,70.622482000000048]],[[-103.35082999999992,70.687195000000088],[-103.36416599999995,70.685256999999979],[-103.38110399999988,70.685806000000127],[-103.39499699999999,70.689148000000046],[-103.42887899999994,70.69999700000011],[-103.43776700000001,70.703872999999987],[-103.44638099999997,70.708037999999988],[-103.45249899999993,70.712494000000106],[-103.45889299999999,70.722214000000008],[-103.46278399999994,70.732208000000014],[-103.45694700000001,70.737198000000035],[-103.44360399999999,70.739150999999993],[-103.42777999999998,70.739426000000037],[-103.39917000000003,70.737198000000035],[-103.36361699999992,70.727767999999969],[-103.34111000000001,70.72026100000005],[-103.33500699999996,70.716094999999996],[-103.33444199999997,70.710815000000082],[-103.33860800000002,70.699417000000096],[-103.34333799999996,70.693588000000091],[-103.35082999999992,70.687195000000088]],[[-71.471664000000033,71.012772000000041],[-71.428878999999995,71.012206999999989],[-71.389175000000023,71.013885000000073],[-71.371108999999933,71.011931999999945],[-71.357497999999964,71.009720000000073],[-71.344727000000034,71.005554000000018],[-71.339171999999962,70.998322000000087],[-71.339721999999995,70.99136400000009],[-71.343063000000029,70.984985000000052],[-71.386672999999917,70.922485000000108],[-71.392226999999991,70.916656000000103],[-71.402495999999871,70.911926000000051],[-71.415557999999976,70.90776100000005],[-71.433060000000012,70.904709000000139],[-71.451110999999912,70.903046000000018],[-71.474441999999954,70.902481000000023],[-71.495543999999938,70.90277100000003],[-71.654448999999943,70.890822999999955],[-71.733063000000016,70.874984999999924],[-71.933884000000035,70.833328000000051],[-71.937774999999931,70.824706999999989],[-71.946380999999974,70.820831000000112],[-71.955565999999976,70.818329000000006],[-71.991668999999945,70.814697000000081],[-72.038605000000018,70.811371000000008],[-72.081954999999994,70.809708000000114],[-72.096664000000033,70.809708000000114],[-72.112212999999997,70.811371000000008],[-72.198607999999979,70.882750999999985],[-72.223327999999981,70.916931000000091],[-72.225280999999939,70.924423000000047],[-72.226395000000025,70.930542000000059],[-72.213897999999915,70.934708000000001],[-72.202224999999999,70.93664600000011],[-72.166655999999989,70.938034000000016],[-72.148894999999925,70.936371000000065],[-72.136672999999973,70.933594000000028],[-72.133620999999948,70.931656000000032],[-72.145554000000004,70.926085999999998],[-72.149170000000026,70.921097000000032],[-72.136123999999995,70.916931000000091],[-72.117492999999911,70.917205999999965],[-72.097778000000005,70.919708000000014],[-72.078339000000028,70.923599000000081],[-72.057769999999948,70.933043999999995],[-72.044723999999917,70.944426999999962],[-72.039443999999946,70.950272000000098],[-72.033324999999934,70.963042999999971],[-72.026672000000019,70.98275799999999],[-72.019729999999868,71.034424000000058],[-72.021392999999989,71.041930999999977],[-72.008620999999948,71.049713000000111],[-71.916107000000011,71.06442300000009],[-71.884170999999924,71.068878000000097],[-71.851669000000015,71.072220000000016],[-71.831680000000006,71.071106000000043],[-71.794723999999974,71.053040000000067],[-71.730834999999956,71.045532000000037],[-71.644454999999994,71.034987999999998],[-71.546950999999979,71.018600000000106],[-71.471664000000033,71.012772000000041]],[[-96.563323999999966,71.292205999999965],[-96.546950999999979,71.289154000000053],[-96.535552999999993,71.28276100000005],[-96.472504000000015,71.232208000000071],[-96.470275999999956,71.226089000000059],[-96.480835000000013,71.208878000000141],[-96.487503000000004,71.203598000000056],[-96.561110999999983,71.208328000000108],[-96.578063999999983,71.210541000000035],[-96.628601000000003,71.220260999999937],[-96.638610999999912,71.226089000000059],[-96.641678000000013,71.231368999999972],[-96.642776000000026,71.234421000000054],[-96.652495999999985,71.287201000000096],[-96.649170000000026,71.29304500000012],[-96.610549999999989,71.290543000000014],[-96.581116000000009,71.293594000000041],[-96.563323999999966,71.292205999999965]],[[-98.895554000000004,71.27777100000003],[-98.90834000000001,71.273040999999978],[-98.97444200000001,71.284714000000008],[-98.989715999999987,71.290543000000014],[-99.000290000000007,71.297211000000004],[-99.00556899999998,71.301926000000037],[-99.008621000000005,71.308029000000147],[-99.008895999999936,71.313873000000001],[-99.00306699999993,71.319443000000092],[-98.963622999999927,71.352203000000088],[-98.955840999999964,71.352203000000088],[-98.930283000000031,71.342209000000082],[-98.923324999999977,71.337769000000094],[-98.914443999999946,71.331665000000044],[-98.895554000000004,71.27777100000003]],[[-73.120543999999995,71.479705999999965],[-73.129439999999931,71.450821000000076],[-73.077498999999932,71.466385000000002],[-73.043335000000013,71.47886699999998],[-73.035552999999936,71.48414600000001],[-73.016402999999968,71.500000000000114],[-73.005844000000025,71.511658000000125],[-72.998046999999985,71.517211999999915],[-72.985275000000001,71.521378000000027],[-72.97222899999997,71.521378000000027],[-72.962508999999955,71.51998900000001],[-72.934157999999968,71.509155000000135],[-72.827498999999989,71.454987000000017],[-72.820281999999963,71.449707000000103],[-72.817504999999983,71.444977000000108],[-72.823333999999988,71.439697000000024],[-72.831954999999994,71.435806000000127],[-72.849730999999963,71.4327550000001],[-72.872497999999894,71.43081699999999],[-72.921660999999972,71.428314],[-72.992767000000015,71.419433999999967],[-73.010009999999966,71.415543000000071],[-73.022780999999952,71.411101999999971],[-73.031112999999948,71.406646999999964],[-73.028885000000002,71.399155000000064],[-73.007507000000032,71.352203000000088],[-72.978881999999942,71.329712000000086],[-72.974166999999909,71.324997000000053],[-72.97193900000002,71.317490000000134],[-72.973617999999874,71.313309000000061],[-72.983886999999982,71.308594000000028],[-72.996657999999911,71.304153000000099],[-73.025283999999999,71.297485000000108],[-73.060546999999929,71.294708000000014],[-73.089446999999893,71.313873000000001],[-73.163329999999917,71.33248900000001],[-73.198607999999922,71.336380000000077],[-73.244995000000017,71.348877000000073],[-73.265288999999939,71.357483000000002],[-73.272506999999962,71.36192299999999],[-73.275008999999955,71.365814000000057],[-73.276397999999972,71.379150000000038],[-73.265015000000005,71.396378000000141],[-73.255004999999926,71.408874999999966],[-73.254729999999995,71.415268000000083],[-73.293609999999887,71.454711999999972],[-73.301392000000021,71.459717000000012],[-73.320556999999894,71.469711000000075],[-73.347504000000015,71.477768000000026],[-73.362502999999947,71.481094000000041],[-73.374160999999901,71.485809000000074],[-73.379990000000021,71.519714000000022],[-73.377212999999983,71.522766000000104],[-73.366942999999992,71.527480999999966],[-73.189986999999917,71.565536000000066],[-73.176940999999999,71.566376000000105],[-73.147507000000019,71.564423000000147],[-73.132216999999912,71.561371000000065],[-73.090285999999935,71.546371000000079],[-73.081116000000009,71.542206000000078],[-73.073623999999938,71.536926000000051],[-73.074722000000008,71.531372000000033],[-73.11332699999997,71.485809000000074],[-73.120543999999995,71.479705999999965]],[[-72.760833999999875,71.531937000000084],[-72.786391999999978,71.530273000000022],[-72.830841000000021,71.531096999999988],[-72.848891999999921,71.532211000000018],[-72.867492999999911,71.533875000000023],[-72.949996999999996,71.547211000000118],[-72.982497999999907,71.553589000000102],[-73.008895999999879,71.56109600000002],[-73.020554000000004,71.565811000000053],[-73.030562999999916,71.571655000000078],[-73.035277999999948,71.575546000000145],[-73.039992999999981,71.579987000000074],[-73.037506000000008,71.587203999999986],[-73.034164000000033,71.592209000000025],[-72.968062999999972,71.636658000000011],[-72.948607999999979,71.644714000000079],[-72.924712999999997,71.649429000000112],[-72.806655999999919,71.659149000000014],[-72.781113000000005,71.660812000000135],[-72.745269999999948,71.659987999999942],[-72.726669000000015,71.658325000000048],[-72.709166999999979,71.655258000000117],[-72.695830999999941,71.651093000000117],[-72.684433000000013,71.642761000000121],[-72.662215999999944,71.604431000000034],[-72.660552999999936,71.598038000000031],[-72.671111999999994,71.585815000000025],[-72.682495000000017,71.574706999999989],[-72.701110999999912,71.557479999999998],[-72.712783999999942,71.547211000000118],[-72.718886999999995,71.542755000000056],[-72.727492999999981,71.538589000000115],[-72.742492999999968,71.534149000000127],[-72.760833999999875,71.531937000000084]],[[-73.370270000000005,71.554428000000087],[-73.394454999999937,71.554428000000087],[-73.406661999999983,71.556366000000025],[-73.418335000000013,71.56109600000002],[-73.42860399999995,71.566940000000045],[-73.436934999999949,71.573318000000029],[-73.450561999999991,71.584152000000074],[-73.449721999999952,71.58998100000008],[-73.448043999999925,71.594146999999964],[-73.441939999999988,71.598877000000016],[-73.388610999999912,71.634155000000021],[-73.348342999999943,71.658325000000048],[-73.276108000000022,71.691924999999912],[-73.243332000000009,71.696639999999945],[-73.213332999999977,71.698593000000074],[-73.209166999999979,71.698868000000118],[-73.190552000000025,71.697204999999997],[-73.167496000000028,71.692200000000128],[-73.155562999999972,71.687195000000088],[-73.148894999999982,71.679977000000065],[-73.149993999999992,71.674423000000104],[-73.170546999999942,71.668319999999937],[-73.221114999999998,71.660262999999986],[-73.249434999999949,71.652481000000023],[-73.262511999999958,71.648041000000035],[-73.282776000000013,71.637771999999984],[-73.303604000000007,71.621918000000051],[-73.320281999999963,71.605545000000006],[-73.325012000000015,71.599152000000061],[-73.331679999999949,71.588042999999971],[-73.338607999999965,71.571105999999929],[-73.339721999999938,71.565262000000132],[-73.352492999999981,71.557479999999998],[-73.370270000000005,71.554428000000087]],[[-96.958892999999932,71.704437000000098],[-96.99888599999997,71.701096000000064],[-97.036391999999921,71.701385000000016],[-97.050277999999935,71.704162999999994],[-97.049727999999902,71.709991000000116],[-97.040282999999988,71.72026100000005],[-97.02416999999997,71.731093999999985],[-96.99888599999997,71.741363999999919],[-96.991668999999945,71.743042000000059],[-96.990829000000019,71.743866000000025],[-96.96945199999999,71.74859600000002],[-96.963897999999972,71.752212999999983],[-96.924163999999962,71.755554000000018],[-96.886397999999986,71.755264000000011],[-96.866942999999992,71.753601000000117],[-96.850554999999872,71.749419999999986],[-96.84445199999999,71.744141000000013],[-96.851104999999905,71.738875999999948],[-96.86860699999994,71.728592000000106],[-96.881377999999927,71.723312000000078],[-96.896956999999929,71.718323000000112],[-96.915832999999964,71.713608000000079],[-96.958892999999932,71.704437000000098]],[[-95.339995999999928,71.731369000000029],[-95.39805599999994,71.729431000000091],[-95.43582200000003,71.729980000000012],[-95.471114999999941,71.733597000000145],[-95.483062999999902,71.736923000000047],[-95.48832699999997,71.740814000000114],[-95.488051999999868,71.745529000000147],[-95.450286999999946,71.818877999999927],[-95.44027699999998,71.824158000000011],[-95.420836999999892,71.828873000000044],[-95.384170999999981,71.836104999999975],[-95.348891999999978,71.840546000000074],[-95.328613000000018,71.842208999999968],[-95.301666000000012,71.844147000000135],[-95.286666999999966,71.843048000000124],[-95.275832999999977,71.84027100000003],[-95.265838999999971,71.836655000000007],[-95.261672999999973,71.833328000000051],[-95.259734999999921,71.827484000000027],[-95.310546999999929,71.737198000000035],[-95.324721999999952,71.732758000000047],[-95.339995999999928,71.731369000000029]],[[-134.49554399999994,68.75221300000004],[-134.48803699999991,68.736649],[-134.48803699999991,68.731094000000098],[-134.48306299999996,68.720535000000041],[-134.47387700000002,68.711379999999963],[-134.46472199999994,68.707489000000066],[-134.44638099999997,68.700271999999984],[-134.40112299999993,68.687759000000085],[-134.37387100000001,68.682480000000112],[-134.33999599999999,68.67886400000009],[-134.30804399999994,68.678040000000124],[-134.28277600000001,68.681366000000139],[-134.24636799999996,68.687484999999981],[-134.23071299999998,68.692841000000101],[-134.22692899999998,68.694138000000123],[-134.22332800000004,68.699706999999933],[-134.26058999999987,68.733535999999958],[-134.26251200000002,68.736374000000126],[-134.28750599999995,68.753601000000003],[-134.30835000000002,68.766097999999943],[-134.32638499999996,68.773605000000089],[-134.42306500000001,68.831664999999987],[-134.54168700000002,68.919708000000071],[-134.558044,68.933043999999995],[-134.614441,68.983321999999987],[-134.62387099999995,68.992752000000053],[-134.62887599999999,69.003052000000139],[-134.62914999999992,69.008880999999974],[-134.62469499999992,69.015548999999965],[-134.56222499999996,69.082764000000111],[-134.55499299999997,69.08776899999998],[-134.53750600000001,69.09387200000009],[-134.49194299999999,69.104155999999989],[-134.46362299999998,69.106094000000098],[-134.44805899999989,69.106094000000098],[-134.36303699999996,69.102203000000031],[-134.34887700000002,69.103043000000071],[-134.33889799999992,69.106369000000086],[-134.22747800000002,69.174988000000099],[-134.22305299999999,69.181656000000032],[-134.22082499999993,69.188034000000016],[-134.22137499999997,69.216385000000116],[-134.21694899999989,69.223038000000088],[-134.162781,69.254715000000033],[-134.15389999999996,69.258880999999917],[-134.142517,69.261383000000023],[-134.12832599999996,69.262206999999989],[-134.06915299999997,69.262771999999984],[-134.05471799999998,69.263610999999969],[-134.02917500000001,69.266936999999984],[-133.92861899999991,69.282211000000075],[-133.90557899999988,69.287490999999989],[-133.89529400000004,69.290817000000004],[-133.88668799999999,69.294983000000116],[-133.87914999999998,69.299987999999985],[-133.87332199999997,69.30581699999999],[-133.86859100000004,69.312484999999924],[-133.86886599999997,69.318329000000119],[-133.87332199999997,69.323043999999982],[-133.87582399999997,69.328322999999955],[-133.86972000000003,69.33415199999996],[-133.67028799999997,69.386658000000068],[-133.65863000000002,69.389160000000004],[-133.55056799999994,69.405823000000055],[-133.40777600000001,69.414703000000088],[-133.37222299999991,69.412201000000039],[-133.35583499999996,69.409988000000055],[-133.32806400000004,69.404709000000082],[-133.30972299999996,69.402771000000143],[-133.23443599999996,69.397217000000126],[-133.21749899999992,69.39637799999997],[-133.20584099999991,69.398880000000077],[-133.073059,69.434982000000048],[-132.99941999999999,69.481934000000138],[-132.966095,69.511657999999954],[-132.95220899999998,69.563309000000061],[-132.95193499999999,69.569153000000028],[-132.95666499999993,69.57388300000008],[-132.96581999999995,69.57748400000014],[-132.98638900000003,69.590271000000143],[-132.988586,69.595260999999994],[-132.98361199999994,69.602203000000088],[-132.97747800000002,69.608032000000094],[-132.92251599999997,69.642212000000029],[-132.904449,69.650542999999971],[-132.89388999999994,69.65387000000004],[-132.86471599999999,69.658325000000104],[-132.82110599999999,69.660538000000031],[-132.78778099999994,69.659714000000065],[-132.66229199999998,69.651206999999999],[-132.628784,69.648048000000074],[-132.62028499999997,69.646378000000141],[-132.61479199999991,69.644043000000011],[-132.606628,69.639046000000121],[-132.55279499999995,69.631362999999965],[-132.53527800000001,69.630264000000011],[-132.41751099999993,69.635544000000039],[-132.39389,69.64027400000009],[-132.372772,69.646942000000081],[-132.34527600000001,69.659424000000058],[-132.33248900000001,69.671097000000088],[-132.32748399999997,69.677765000000079],[-132.333618,69.682480000000112],[-132.441101,69.702484000000027],[-132.45748900000001,69.704711999999972],[-132.46777299999991,69.701385000000016],[-132.51779199999999,69.68331900000004],[-132.54823299999998,69.685310000000129],[-132.55523700000003,69.683823000000018],[-132.57455400000003,69.683983000000126],[-132.582718,69.685654],[-132.586884,69.688148000000126],[-132.58673099999993,69.691649999999981],[-132.54833999999994,69.735809000000074],[-132.54055799999998,69.740814000000114],[-132.52749600000004,69.742477000000065],[-132.47305299999999,69.747756999999922],[-132.39974999999998,69.751663000000008],[-132.28918499999992,69.724991000000102],[-132.21304299999997,69.690810999999997],[-132.19888300000002,69.688034000000073],[-132.16305499999999,69.685256999999979],[-132.14697299999995,69.685256999999979],[-132.12304700000004,69.713608000000079],[-132.11663799999991,69.719436999999914],[-132.10720800000001,69.723602000000085],[-132.08331299999992,69.728591999999992],[-131.95443699999998,69.75471500000009],[-131.87469499999992,69.763884999999959],[-131.85861199999999,69.763611000000026],[-131.84527600000001,69.765273999999977],[-131.8347169999999,69.768599999999992],[-131.76556400000004,69.794707999999957],[-131.75891100000001,69.800536999999963],[-131.75836200000003,69.806366000000025],[-131.76028400000001,69.811646000000053],[-131.7647399999999,69.816376000000105],[-131.76666299999994,69.821655000000078],[-131.76000999999997,69.827484000000084],[-131.75058000000001,69.83137499999998],[-131.64501999999999,69.864990000000034],[-131.62359600000002,69.871368000000018],[-131.44778400000001,69.918594000000041],[-131.42639199999991,69.947479000000101],[-131.42111199999994,69.954162999999994],[-131.41027799999995,69.957214000000022],[-131.34887700000002,69.95248400000014],[-131.26916499999993,69.937759000000028],[-131.24609399999991,69.931091000000038],[-131.237213,69.927199999999971],[-131.23055999999991,69.923035000000141],[-131.20916699999998,69.899155000000007],[-131.20333899999997,69.889160000000061],[-131.20138499999996,69.883881000000088],[-131.20193499999999,69.878036000000009],[-131.2049869999999,69.871918000000051],[-131.21054099999998,69.865265000000079],[-131.21722399999987,69.859421000000054],[-131.22164899999996,69.854155999999989],[-131.22222899999991,69.848328000000038],[-131.220551,69.84304800000001],[-131.21194499999996,69.833603000000096],[-131.20526100000001,69.829437000000041],[-131.19638099999997,69.825546000000145],[-131.18499799999995,69.824158000000068],[-131.08056599999998,69.88499500000006],[-131.07501199999996,69.891663000000051],[-131.03140299999995,69.949417000000039],[-131.01028399999996,69.98692299999999],[-131.01278699999995,70.023315000000025],[-131.01947000000001,70.027771000000087],[-130.93029799999999,70.083054000000118],[-130.89224200000001,70.099152000000004],[-130.74832199999997,70.081940000000145],[-130.65612799999991,70.108597000000032],[-130.554169,70.165267999999969],[-130.54305999999991,70.168320000000051],[-130.48721299999994,70.173309000000017],[-130.47222899999997,70.173874000000069],[-130.46771200000001,70.170089999999959],[-130.47271699999993,70.167099000000121],[-130.48388699999998,70.164992999999981],[-130.51141399999995,70.162201000000039],[-130.52224699999994,70.158875000000023],[-130.54724099999999,70.127472000000012],[-130.54806499999995,70.121643000000006],[-130.54638699999992,70.116378999999995],[-130.54223599999995,70.111648999999943],[-130.53555299999999,70.107483000000059],[-130.52416999999997,70.103867000000037],[-130.5102839999999,70.101089000000002],[-130.49527,70.101654000000053],[-130.48416099999992,70.104705999999965],[-130.43237299999998,70.125870000000134],[-130.40722700000003,70.140533000000119],[-130.35360699999995,70.132202000000007],[-130.33084099999996,70.110809000000074],[-130.32250999999997,70.101379000000009],[-130.18472299999996,70.053589000000045],[-130.16861,70.053314],[-129.97555499999993,70.069442999999978],[-129.96304299999997,70.071655000000021],[-129.92611699999992,70.078598],[-129.89083900000003,70.092758000000117],[-129.86444099999994,70.126923000000033],[-129.84609999999986,70.154984000000127],[-129.8324889999999,70.195525999999916],[-129.79000899999994,70.219986000000119],[-129.73138399999999,70.253052000000082],[-129.69778400000001,70.262496999999996],[-129.68667600000003,70.265549000000078],[-129.67306499999995,70.266936999999984],[-129.64724699999999,70.251663000000065],[-129.60916099999992,70.213042999999971],[-129.45916699999998,70.147491000000116],[-129.40472399999999,70.123031999999967],[-129.40335099999999,70.11775200000011],[-129.40527299999997,70.106369000000086],[-129.40640300000001,70.10054000000008],[-129.4100039999999,70.094436999999971],[-129.433899,70.068054000000132],[-129.49749800000001,70.020538000000101],[-129.57360799999998,69.997757000000092],[-129.59555099999994,69.991363999999919],[-129.88946499999992,69.917205999999965],[-129.99304199999989,69.892487000000017],[-130.22805800000003,69.840546000000131],[-130.49581899999998,69.78166200000004],[-130.55999800000001,69.737198000000092],[-130.56140099999999,69.725815000000068],[-130.56472799999995,69.719711000000018],[-130.57028200000002,69.713043000000084],[-130.57833900000003,69.708038000000045],[-130.62136799999996,69.695251000000042],[-130.64697299999989,69.691360000000145],[-130.70416299999994,69.688309000000118],[-130.75750700000003,69.682480000000112],[-130.78030399999994,69.676926000000094],[-130.78973400000001,69.672760000000039],[-130.83639500000004,69.6336060000001],[-130.83944699999995,69.627472000000068],[-130.84081999999995,69.616089000000102],[-130.83667000000003,69.611099000000024],[-130.83749399999999,69.605545000000063],[-130.84414699999996,69.599716000000001],[-130.91915899999998,69.56721500000009],[-130.92861899999997,69.563309000000061],[-130.94473299999999,69.565536000000122],[-131.02667199999996,69.593048000000067],[-131.03973399999995,69.601653999999996],[-131.04168699999997,69.606934000000024],[-131.04083300000002,69.612761999999975],[-131.05306999999999,69.637206999999989],[-131.16332999999992,69.627762000000132],[-131.18859900000001,69.623871000000065],[-131.32861299999996,69.579987000000131],[-131.40750099999997,69.586655000000064],[-131.58694500000001,69.567490000000134],[-131.69168100000002,69.551650999999993],[-131.70498699999996,69.560256999999922],[-131.71389799999992,69.563873000000001],[-131.72778299999999,69.566940000000102],[-131.74108899999993,69.567490000000134],[-131.75585899999999,69.566940000000102],[-131.99722299999991,69.53137200000009],[-132.00640899999996,69.527205999999978],[-132.03890999999999,69.508331000000055],[-132.04666099999992,69.503326000000015],[-132.0799869999999,69.480819999999994],[-132.14169300000003,69.412766000000033],[-132.13305699999995,69.403320000000065],[-132.12164299999995,69.399994000000049],[-132.09750399999996,69.396057000000098],[-132.08526599999999,69.390823000000069],[-132.08084099999996,69.386108000000036],[-132.07888800000001,69.3808140000001],[-132.08166499999999,69.374695000000031],[-132.09472700000003,69.362762000000032],[-132.11663799999991,69.357208000000014],[-132.32916299999999,69.31442300000009],[-132.52417000000003,69.277771000000087],[-132.53195199999999,69.280547999999953],[-132.54556300000002,69.283325000000048],[-132.56167599999998,69.285812000000135],[-132.57998699999996,69.287490999999989],[-132.59222399999993,69.287200999999982],[-132.70611600000001,69.26887499999998],[-132.71777299999997,69.266388000000063],[-132.739441,69.260817999999972],[-132.76028399999996,69.254166000000112],[-132.76779199999999,69.249146000000053],[-132.90722699999998,69.1244200000001],[-132.90722699999998,69.118866000000082],[-132.90527299999997,69.042755],[-132.94610599999999,69.037491000000045],[-133.05084199999999,69.054703000000018],[-133.10638399999993,69.050537000000134],[-133.1719359999999,69.043320000000051],[-133.18331899999998,69.040817000000061],[-133.19332900000001,69.037491000000045],[-133.20083599999987,69.032485999999949],[-133.20556599999998,69.025818000000015],[-133.21499600000004,69.006653000000028],[-133.21664399999997,69.001937999999996],[-133.21444700000001,68.99664300000012],[-133.209991,68.991928000000087],[-133.20333900000003,68.987761999999975],[-133.19860799999998,68.983046999999942],[-133.19888300000002,68.977203000000145],[-133.21304299999991,68.938034000000073],[-133.22610499999996,68.913605000000132],[-133.23361199999999,68.908600000000092],[-133.31332399999985,68.871918000000051],[-133.32333399999993,68.868590999999924],[-133.33471699999996,68.866089000000045],[-133.34887699999996,68.865265000000079],[-133.36331200000001,68.866652999999985],[-133.37692300000003,68.869140999999956],[-133.38583399999999,68.873032000000023],[-133.39944500000001,68.881362999999965],[-133.40167199999991,68.886658000000011],[-133.39529400000004,68.89027400000009],[-133.37969999999996,68.89027400000009],[-133.36694299999994,68.891936999999984],[-133.359711,68.896942000000024],[-133.35360700000001,68.90277100000003],[-133.35803199999992,68.907486000000063],[-133.36944599999993,68.910538000000031],[-133.38275099999998,68.911102000000142],[-133.39556899999997,68.909424000000058],[-133.46112099999999,68.892761000000121],[-133.466095,68.888321000000133],[-133.484711,68.850266000000033],[-133.493042,68.826659999999947],[-133.49081399999994,68.821655000000078],[-133.48416099999997,68.81164600000011],[-133.47082499999999,68.797485000000108],[-133.46389799999992,68.793320000000108],[-133.4549869999999,68.789703000000145],[-133.40557899999999,68.772217000000012],[-133.32138099999992,68.746368000000132],[-133.16418499999992,68.707214000000079],[-133.08999599999999,68.694977000000108],[-133.05416899999994,68.691360000000145],[-133.03750599999995,68.690536000000009],[-133.02334599999995,68.691360000000145],[-133.01083399999987,68.693038999999999],[-132.98803699999996,68.697754000000032],[-132.95861799999994,68.69859299999996],[-132.94305399999996,68.696365000000014],[-132.91833500000001,68.690262000000075],[-132.92056299999996,68.695526000000029],[-132.9336239999999,68.709717000000069],[-132.94250499999998,68.713318000000129],[-132.95471199999997,68.71527100000003],[-133.00723299999999,68.719711000000075],[-133.02252199999998,68.719711000000075],[-133.03527800000001,68.718048000000124],[-133.04583699999995,68.711379999999963],[-133.11248799999998,68.714996000000042],[-133.142517,68.718597000000102],[-133.15249599999993,68.720825000000048],[-133.25500499999998,68.758606000000043],[-133.25945999999999,68.763321000000076],[-133.26611299999996,68.778869999999984],[-133.26141399999995,68.785537999999974],[-133.24999999999994,68.788040000000024],[-133.23416099999992,68.785812000000078],[-133.225281,68.782211000000018],[-133.22082499999999,68.777480999999966],[-133.22082499999999,68.771652000000131],[-133.21664399999997,68.766937000000098],[-133.20306399999998,68.764160000000004],[-133.16168200000004,68.75749200000007],[-133.14752199999998,68.758330999999998],[-133.13891599999994,68.76249700000011],[-133.1397399999999,68.766937000000098],[-133.21139499999998,68.790817000000118],[-133.23498499999999,68.795821999999987],[-133.250854,68.798035000000141],[-133.28178399999996,68.794426000000101],[-133.28863499999989,68.793097999999986],[-133.30145300000004,68.789429000000041],[-133.32556199999999,68.787491000000045],[-133.33554099999992,68.789703000000145],[-133.34445199999993,68.793594000000041],[-133.35665899999992,68.801085999999941],[-133.35888699999998,68.806366000000025],[-133.35415599999993,68.832214000000135],[-133.332764,68.843872000000147],[-133.27722199999988,68.856934000000024],[-133.26583900000003,68.859421000000054],[-133.23776199999998,68.861099000000024],[-133.22192399999994,68.858871000000022],[-133.18804899999986,68.849152000000061],[-133.16778599999998,68.836655000000064],[-133.15917999999999,68.827209000000096],[-133.15222199999999,68.823044000000095],[-133.12191799999994,68.805817000000047],[-133.10833700000001,68.80304000000001],[-133.09167500000001,68.802199999999914],[-133.06222500000001,68.802765000000136],[-133.00527999999997,68.815262000000132],[-132.95803799999993,68.835541000000092],[-132.962219,68.846099999999922],[-132.9619449999999,68.85165400000011],[-132.95193499999999,68.854979999999955],[-132.93667599999998,68.854979999999955],[-132.86749299999997,68.846099999999922],[-132.85611,68.842758000000003],[-132.78594999999996,68.818428000000097],[-132.75363199999998,68.802765000000136],[-132.49194299999994,68.801085999999941],[-132.48055999999991,68.803589000000102],[-132.47027600000001,68.806931000000077],[-132.40557899999999,68.842758000000003],[-132.40029900000002,68.847214000000122],[-132.39529400000004,68.853867000000093],[-132.39279199999999,68.859985000000052],[-132.396973,68.864700000000084],[-132.49249299999997,68.90637200000009],[-132.50363200000004,68.909714000000065],[-132.55334499999998,68.916091999999992],[-132.56750499999998,68.915268000000026],[-132.57638499999996,68.911102000000142],[-132.574432,68.906097000000102],[-132.56777999999991,68.901657000000057],[-132.54055799999998,68.896103000000096],[-132.55557299999992,68.878311000000053],[-132.66528299999993,68.841934000000037],[-132.67806999999993,68.840271000000087],[-132.69360399999994,68.840546000000131],[-132.76229899999998,68.857491000000095],[-132.77094999999997,68.858147000000031],[-132.77778599999999,68.860153000000082],[-132.78027299999991,68.862983999999983],[-132.833618,68.917755000000113],[-132.85998499999988,68.989150999999993],[-132.868042,69.021378000000141],[-132.87191799999999,69.056641000000013],[-132.86944600000004,69.062759000000085],[-132.86553999999995,69.068329000000006],[-132.81527699999998,69.08638000000002],[-132.80526699999996,69.089432000000102],[-132.77111799999994,69.085541000000035],[-132.75418100000002,69.084717000000069],[-132.68917799999991,69.082489000000123],[-132.67501800000002,69.083328000000051],[-132.66332999999997,69.085815000000139],[-132.54083300000002,69.135268999999994],[-132.46081500000003,69.124695000000088],[-132.46472199999999,69.119141000000127],[-132.46749899999998,69.107208000000071],[-132.45916699999992,69.108032000000037],[-132.42861900000003,69.11775200000011],[-132.40777599999996,69.1244200000001],[-132.38500999999997,69.139160000000061],[-132.37887599999999,69.145264000000054],[-132.36886600000003,69.158600000000035],[-132.36138899999997,69.171371000000136],[-132.343323,69.203323000000069],[-132.34249899999992,69.220260999999994],[-132.33972199999994,69.22665399999994],[-132.33056599999998,69.230820000000051],[-132.32055699999995,69.233871000000079],[-132.30612199999996,69.234711000000118],[-132.22360199999997,69.213608000000022],[-132.2225039999999,69.141662999999994],[-132.16805999999997,69.213882000000126],[-132.11694299999999,69.242203000000075],[-132.05804399999994,69.242203000000075],[-131.99600199999998,69.251632999999913],[-131.96389799999997,69.256942999999978],[-131.87527499999999,69.279709000000025],[-131.86499000000003,69.283051000000114],[-131.8052669999999,69.316375999999991],[-131.79751599999986,69.321381000000088],[-131.79110700000001,69.327208999999982],[-131.71444699999995,69.397766000000104],[-131.72555499999993,69.401093000000003],[-131.73416099999997,69.400542999999971],[-131.80667099999999,69.39137299999993],[-131.950287,69.395827999999938],[-131.96499600000004,69.397217000000126],[-131.97277800000001,69.400269000000037],[-131.97000099999997,69.406372000000033],[-131.65222199999994,69.471924000000058],[-131.63919099999998,69.473602000000142],[-131.60748299999995,69.473312000000135],[-131.59136999999993,69.470825000000048],[-131.45889299999999,69.449141999999938],[-131.44528200000002,69.446365000000071],[-131.432953,69.437194999999974],[-131.42910799999993,69.434700000000134],[-131.43160999999998,69.431365999999969],[-131.43710299999992,69.429031000000066],[-131.45193499999999,69.420532000000094],[-131.46221899999995,69.417206000000078],[-131.47164900000001,69.413039999999967],[-131.47943099999998,69.408035000000098],[-131.48611500000004,69.402206000000092],[-131.53472899999997,69.333327999999995],[-131.52584799999994,69.329436999999928],[-131.49941999999999,69.332489000000066],[-131.42083700000001,69.361649000000114],[-131.41278099999994,69.366653000000099],[-131.40750099999997,69.373306000000071],[-131.38989300000003,69.404159999999933],[-131.377228,69.427483000000052],[-131.32193000000001,69.49331699999999],[-131.27166699999992,69.501099000000124],[-131.25723299999999,69.501663000000065],[-131.24581899999998,69.49832200000003],[-131.23330699999991,69.48414600000001],[-131.22387700000002,69.463608000000136],[-131.22027599999996,69.453323000000012],[-131.21664399999992,69.442748999999992],[-131.21276899999992,69.422202999999968],[-131.21093799999989,69.4125370000001],[-131.21026599999999,69.406044000000065],[-131.21304299999997,69.387497000000053],[-131.22360200000003,69.384430000000123],[-131.23330699999991,69.384720000000129],[-131.24526999999995,69.382202000000007],[-131.26641799999993,69.375809000000061],[-131.31777999999997,69.358871000000136],[-131.39529399999998,69.318603999999993],[-131.40307599999994,69.313873000000058],[-131.415009,69.301376000000062],[-131.41445899999997,69.296936000000017],[-131.33526599999993,69.316666000000055],[-131.32470699999999,69.31999200000007],[-131.19332899999995,69.365264999999965],[-131.18859900000001,69.368317000000104],[-131.16650400000003,69.404930000000093],[-131.16223099999996,69.490540000000067],[-131.16418499999997,69.495529000000033],[-131.23123199999992,69.543892000000028],[-131.25385999999997,69.571846000000107],[-131.22546399999999,69.580719000000101],[-131.20681799999994,69.55720500000001],[-131.15046699999994,69.518600000000049],[-131.13006599999994,69.516388000000006],[-131.11053499999997,69.485329000000036],[-131.130157,69.429375000000107],[-131.14851399999992,69.403534000000036],[-131.1458439999999,69.374695000000031],[-131.13583399999999,69.359985000000108],[-131.12832599999996,69.361923000000047],[-131.10122699999999,69.393921000000091],[-131.08525099999991,69.440514000000007],[-131.06085199999995,69.470688000000109],[-131.06617699999993,69.491096000000084],[-131.06394999999998,69.512389999999982],[-131.08924899999994,69.531914000000143],[-131.10920699999997,69.543449000000123],[-131.127838,69.554543000000024],[-131.14781199999993,69.561195000000112],[-131.16599999999988,69.567856000000006],[-131.18832399999991,69.574707000000046],[-131.19473300000004,69.57887299999993],[-131.19665499999991,69.584152000000131],[-131.19610599999999,69.589980999999966],[-131.19055199999997,69.596649000000127],[-131.183899,69.602478000000133],[-131.17471299999994,69.606369000000029],[-131.13833599999998,69.614150999999936],[-131.12359600000002,69.614700000000084],[-131.10748299999989,69.612488000000042],[-131.09359699999999,69.609421000000111],[-131.087219,69.605255],[-131.08306900000002,69.600539999999967],[-131.04577599999999,69.524429000000055],[-131.02999899999998,69.485809000000131],[-131.02780200000001,69.463882000000069],[-131.03390499999995,69.429153000000042],[-131.03695700000003,69.423035000000084],[-131.07028200000002,69.367477000000065],[-131.10803199999992,69.33526599999999],[-131.11331200000001,69.328598],[-131.11639400000001,69.32249500000006],[-131.10888699999998,69.321655000000021],[-131.09973100000002,69.325821000000076],[-131.05084199999993,69.354431000000091],[-131.02667199999996,69.383865000000128],[-130.98999000000003,69.449141999999938],[-130.99121099999996,69.50104500000009],[-130.9922029999999,69.504203999999959],[-130.99026500000002,69.539429000000041],[-130.98083499999996,69.543594000000041],[-130.96887200000003,69.545821999999987],[-130.952789,69.543320000000108],[-130.94638099999992,69.539154000000053],[-130.94222999999994,69.534148999999957],[-130.94055200000003,69.52915999999999],[-130.9244379999999,69.448593000000017],[-130.93971299999998,69.421486000000016],[-130.94154400000002,69.417816000000073],[-130.94555699999995,69.414314000000047],[-130.95039399999996,69.411324000000093],[-130.98580900000002,69.383040999999935],[-131.02583299999998,69.347878000000037],[-131.02984600000002,69.344368000000088],[-131.03317300000003,69.340377999999987],[-131.03199799999999,69.337212000000022],[-131.03668200000004,69.310532000000023],[-131.02780200000001,69.306641000000127],[-131.01696800000002,69.307480000000055],[-131.01419099999993,69.313873000000058],[-131.01333599999998,69.319442999999922],[-131.010559,69.325546000000088],[-131.00500499999998,69.332214000000022],[-130.99832200000003,69.338043000000027],[-130.95693999999997,69.371917999999994],[-130.93194599999998,69.38348400000001],[-130.92710899999992,69.386490000000038],[-130.91844200000003,69.386818000000005],[-130.91177400000004,69.384818999999993],[-130.90928599999995,69.381980999999996],[-130.89611799999994,69.380539000000056],[-130.89889500000004,69.352768000000026],[-130.90249600000004,69.340820000000122],[-130.90640300000001,69.328872999999987],[-130.91427599999992,69.318313999999987],[-130.93194599999998,69.304977000000122],[-130.93972799999995,69.299987999999985],[-130.96362299999987,69.285262999999986],[-131.00057999999996,69.256653000000142],[-131.024719,69.209717000000126],[-131.01806599999992,69.141936999999928],[-131.01419099999993,69.136932000000058],[-130.99832200000003,69.134720000000016],[-130.9372249999999,69.134430000000009],[-130.92861899999997,69.145264000000054],[-130.93112199999996,69.222488000000055],[-130.93276999999995,69.227767999999912],[-130.93917799999991,69.232208000000128],[-130.9513849999999,69.246368000000075],[-130.950287,69.257766999999944],[-130.94723499999998,69.264160000000118],[-130.94168100000002,69.270538000000045],[-130.93499800000001,69.276382000000069],[-130.82110599999993,69.374695000000031],[-130.81304899999998,69.379700000000128],[-130.77139299999999,69.398880000000077],[-130.76055899999994,69.402206000000092],[-130.73165899999998,69.403320000000065],[-130.71472199999999,69.402206000000092],[-130.70028699999995,69.402771000000143],[-130.689728,69.406096999999988],[-130.66027800000001,69.42942800000003],[-130.65472399999993,69.43609600000002],[-130.64529400000004,69.454712000000029],[-130.65280200000001,69.457763999999941],[-130.667236,69.457214000000079],[-130.74777199999994,69.449141999999938],[-130.71499599999993,69.462203999999986],[-130.52502400000003,69.543594000000041],[-130.50723300000004,69.552474999999959],[-130.47860700000001,69.574707000000046],[-130.392517,69.645828000000108],[-130.385559,69.651657000000114],[-130.36248799999998,69.673874000000012],[-130.36608899999987,69.686371000000008],[-130.28112799999991,69.700271999999984],[-130.03308099999998,69.731934000000081],[-129.691956,69.784424000000115],[-129.67251599999992,69.792480000000012],[-129.65307599999994,69.800536999999963],[-129.624146,69.812485000000038],[-129.60220300000003,69.818877999999984],[-129.41332999999992,69.838042999999971],[-129.31555199999997,69.84664900000007],[-129.24276699999984,69.849990999999989],[-129.17999299999997,69.849152000000004],[-129.14862099999993,69.849990999999989],[-129.09942599999994,69.858871000000022],[-129.05889899999988,69.873871000000008],[-129.04196199999996,69.883606000000043],[-129.02722199999999,69.895264000000111],[-129.01501499999995,69.908325000000048],[-129.00058000000001,69.933043999999995],[-128.98831199999995,69.946091000000024],[-128.97360200000003,69.95748900000001],[-128.96527100000003,69.962494000000049],[-128.95526100000001,69.966385000000116],[-128.94415300000003,69.969437000000084],[-128.93194600000004,69.971649000000127],[-128.90084799999994,69.971924000000115],[-128.88723799999997,69.968872000000033],[-128.86471599999999,69.961655000000121],[-128.85610999999989,69.957764000000054],[-128.85470599999996,69.954711999999915],[-128.93444799999992,69.844146999999964],[-128.94665499999991,69.841934000000037],[-128.96417199999996,69.843322999999998],[-129.03805499999999,69.851929000000098],[-129.08248899999995,69.850540000000137],[-129.10971099999989,69.847763000000043],[-129.134186,69.843322999999998],[-129.14529399999998,69.840271000000087],[-129.15612799999997,69.836928999999998],[-129.163635,69.83137499999998],[-129.169464,69.824706999999989],[-129.16027799999995,69.715819999999951],[-129.15390000000002,69.700271999999984],[-129.14999399999994,69.695526000000029],[-129.14138800000001,69.691649999999981],[-129.13027999999991,69.688034000000073],[-128.97747800000002,69.674698000000149],[-128.96304299999997,69.675262000000089],[-128.92501799999997,69.68081699999999],[-128.78613300000001,69.760818000000086],[-128.64001500000001,69.84304800000001],[-128.54473899999999,69.885268999999994],[-128.44195599999989,69.921920999999998],[-128.32415800000001,69.948318000000086],[-128.31054700000004,69.958327999999995],[-128.30862400000001,70.008041000000105],[-128.31222499999996,70.012772000000041],[-128.349152,70.03915400000011],[-128.35638399999999,70.048874000000012],[-128.36138900000003,70.058868000000018],[-128.36972000000003,70.095825000000048],[-128.36831699999988,70.101654000000053],[-128.36193800000001,70.108322000000044],[-128.35333299999996,70.113037000000077],[-128.34304799999995,70.116928000000144],[-128.31054700000004,70.126923000000033],[-128.24414099999996,70.146378000000027],[-128.10916099999997,70.182204999999954],[-128.09414700000002,70.182479999999998],[-128.05667099999994,70.178039999999953],[-128.01055899999994,70.178314000000114],[-127.99472000000003,70.179428000000087],[-127.96833799999996,70.182754999999986],[-127.84861799999999,70.208878000000141],[-127.61501299999992,70.228867000000093],[-127.58500699999996,70.229431000000034],[-127.54998799999998,70.22665400000011],[-127.51500699999985,70.22164900000007],[-127.51750199999998,70.225540000000137],[-127.55082700000003,70.236374000000012],[-127.578056,70.242751999999996],[-127.61305199999987,70.247757000000036],[-127.71665999999999,70.259720000000073],[-127.73166700000002,70.261382999999967],[-127.79194599999994,70.25999500000006],[-127.85833699999995,70.263046000000088],[-127.87581599999987,70.264435000000105],[-128.02835099999993,70.28637700000013],[-128.03695700000003,70.290543000000071],[-128.06664999999987,70.307205000000067],[-128.07611099999991,70.343597000000045],[-128.07843000000003,70.346436000000097],[-128.07144199999988,70.348267000000078],[-128.0616149999999,70.347923000000037],[-128.05343599999998,70.346092000000056],[-128.04661599999986,70.343933000000106],[-128.02711499999998,70.340766999999971],[-127.98889200000002,70.345824999999991],[-127.97250399999996,70.34526100000005],[-127.96000699999996,70.347488000000112],[-127.94860799999998,70.350540000000024],[-127.94082600000002,70.356094000000041],[-127.90194699999995,70.393326000000059],[-127.91555800000003,70.396652000000074],[-127.93195300000002,70.396942000000081],[-127.95417799999996,70.39387499999998],[-127.97693600000002,70.387772000000041],[-127.987213,70.383880999999974],[-128.02166699999998,70.374695000000031],[-128.06500199999994,70.377312000000018],[-128.13833599999992,70.37598400000013],[-128.15183999999994,70.380310000000122],[-128.15933199999995,70.385483000000022],[-128.19665499999996,70.391937000000041],[-128.19888300000002,70.40248100000008],[-128.19055200000003,70.436646000000053],[-128.17749000000003,70.460815000000139],[-128.16055299999999,70.491364000000033],[-128.15249600000004,70.503601000000003],[-128.13583399999993,70.523041000000148],[-128.006958,70.588593000000003],[-127.99665799999997,70.590546000000131],[-127.97138999999999,70.583878000000141],[-127.90360999999996,70.562485000000038],[-127.83556399999998,70.540817000000118],[-127.68028300000003,70.486098999999967],[-127.51583900000003,70.426086000000055],[-127.42859599999991,70.393326000000059],[-127.27471899999995,70.326096000000064],[-127.24889399999995,70.314148000000046],[-127.18831599999999,70.280548000000124],[-127.173607,70.272217000000069],[-127.125,70.237198000000149],[-127.07640100000003,70.196365000000071],[-127.05499299999997,70.178039999999953],[-127.03443899999996,70.148880000000077],[-126.89334099999996,70.008880999999974],[-126.87888299999997,70.000548999999978],[-126.81276700000001,69.910537999999974],[-126.81194299999993,69.905258000000117],[-126.80526700000001,69.895538000000045],[-126.74388099999999,69.813873000000115],[-126.71472199999999,69.775269000000094],[-126.70584099999996,69.766098000000113],[-126.69999699999994,69.76138300000008],[-126.6808319999999,69.748031999999967],[-126.67250100000001,69.743866000000082],[-126.62053699999996,69.719986000000063],[-126.60166899999996,69.712479000000144],[-126.45944199999997,69.644149999999968],[-126.29055799999998,69.558594000000028],[-126.26777599999997,69.540817000000118],[-126.26722699999993,69.535537999999974],[-126.25583599999999,69.526657000000057],[-126.11221299999994,69.469436999999971],[-126.08860800000002,69.462493999999992],[-126.0497279999999,69.45277400000009],[-126.03666699999997,69.449706999999989],[-125.98889199999996,69.430542000000003],[-125.96806299999997,69.423035000000084],[-125.95749699999999,69.419434000000024],[-125.91055299999999,69.405548000000067],[-125.88474300000001,69.399155000000064],[-125.83972199999999,69.389160000000004],[-125.55110200000001,69.33718900000008],[-125.42639200000002,69.312180000000126],[-125.41528299999987,69.313019000000054],[-125.37249800000001,69.33580000000012],[-125.36554699999999,69.342468000000054],[-125.39083900000003,69.370513999999957],[-125.40110800000002,69.374130000000036],[-125.37748699999997,69.396087999999963],[-125.21000699999996,69.381912],[-125.16528299999999,69.381638000000066],[-125.14167800000001,69.38638300000008],[-125.13249200000001,69.391098000000113],[-125.12554899999998,69.397491000000059],[-125.11193800000001,69.415817000000061],[-125.08944700000001,69.449706999999989],[-125.11277799999999,69.464157000000114],[-125.12304699999993,69.468032999999991],[-125.462784,69.452469000000065],[-125.53056300000003,69.435242000000073],[-125.609444,69.415253000000121],[-125.62249799999995,69.418593999999985],[-125.61805700000002,69.42442299999999],[-125.57805599999995,69.471649000000014],[-125.48832700000003,69.50749200000007],[-125.47721899999993,69.510268999999994],[-125.46472199999988,69.512207000000103],[-125.449997,69.51249700000011],[-125.30695300000002,69.499984999999981],[-125.14723200000003,69.485519000000124],[-125.13166799999993,69.484694999999988],[-125.11805699999996,69.485793999999942],[-125.12082700000002,69.490798999999981],[-125.13137799999993,69.49441500000006],[-125.18554699999987,69.507202000000063],[-125.21640000000002,69.513031000000069],[-125.25499699999995,69.523026000000016],[-125.265556,69.526917000000083],[-125.41000399999996,69.628036000000066],[-125.41306299999997,69.633041000000105],[-125.41361999999992,69.638321000000133],[-125.41166699999991,69.64387499999998],[-125.37805200000003,69.678589000000045],[-125.36554699999999,69.690262000000075],[-125.35527000000002,69.694138000000123],[-125.079453,69.742752000000053],[-125.06555200000003,69.743591000000038],[-125.04972800000002,69.743042000000116],[-125.016953,69.740524000000107],[-125,69.738190000000088],[-124.98581699999994,69.734711000000004],[-124.97528099999994,69.730820000000108],[-124.96749899999998,69.726929000000041],[-124.93554699999999,69.678314],[-124.92500299999995,69.644714000000135],[-124.90638699999994,69.65387000000004],[-124.88166799999999,69.670532000000037],[-124.82195300000001,69.714995999999985],[-124.82972699999999,69.719147000000078],[-124.86165599999993,69.735809000000074],[-124.88555899999994,69.748031999999967],[-124.89750700000002,69.750549000000035],[-125.01418299999995,69.750534000000016],[-125.22805799999998,69.759140000000116],[-125.24137899999999,69.760254000000089],[-125.25890399999992,69.784103000000016],[-125.27639799999997,69.808243000000061],[-125.225281,69.839676000000054],[-125.20638999999994,69.849120999999968],[-125.19611399999997,69.853026999999997],[-125.18443299999996,69.855804000000091],[-125.16750300000001,69.85414099999997],[-125.16194199999995,69.849700999999982],[-125.15722700000003,69.823563000000036],[-125.15666199999998,69.818283000000122],[-125.17083700000001,69.805496000000119],[-125.170547,69.800216999999975],[-125.165009,69.795502000000113],[-125.15055799999999,69.793564000000003],[-125.05666399999996,69.795242000000087],[-125.03222700000003,69.817200000000071],[-125.00945300000001,69.845520000000079],[-124.94748700000002,69.910537999999974],[-124.94027699999987,69.916930999999977],[-124.89334100000002,69.940262000000018],[-124.76444999999995,69.970824999999991],[-124.79527299999995,70.008880999999974],[-124.82695000000001,70.012496999999996],[-124.88694799999996,70.011932000000002],[-124.99027999999998,70.00610400000005],[-125.025284,69.998000999999988],[-125.04695100000004,69.989990000000091],[-125.08640299999996,69.968535999999915],[-125.10722399999997,69.953522000000078],[-125.10759699999994,69.947975000000099],[-125.11138899999997,69.941940000000102],[-125.12389400000001,69.939956999999993],[-125.19082600000002,69.932433999999944],[-125.20667299999991,69.933228000000099],[-125.21721599999995,69.936905000000081],[-125.21777299999997,69.942337000000066],[-125.20221699999991,69.998581000000058],[-125.19748700000002,70.004501000000118],[-125.18831599999999,70.009033000000102],[-125.016953,70.076218000000097],[-125,70.079987000000017],[-124.98972300000003,70.078598],[-124.98166700000002,70.074432000000115],[-124.97556299999991,70.064697000000024],[-124.97528099999994,70.059418000000051],[-124.98194899999999,70.047760000000039],[-124.98665599999998,70.041655999999989],[-124.99610899999999,70.036925999999994],[-124.99768799999998,70.036925999999994],[-125,70.036925999999994],[-125.03999299999992,70.029068000000109],[-125.04804999999999,70.023041000000092],[-125.04527300000001,70.017990000000111],[-125.03443900000002,70.013931000000014],[-125.01999699999993,70.011993000000075],[-124.90139799999997,70.021378000000141],[-124.86332699999997,70.027206000000092],[-124.85527000000002,70.03054800000001],[-124.86972000000003,70.032760999999994],[-124.93916299999995,70.02748100000008],[-124.95500199999998,70.028320000000065],[-124.95694699999996,70.032211000000132],[-124.93916299999995,70.042480000000126],[-124.92859599999997,70.046097000000088],[-124.81416300000001,70.061645999999996],[-124.71444700000001,70.069153000000142],[-124.67527799999993,70.071930000000066],[-124.64527900000002,70.071930000000066],[-124.63474300000001,70.068329000000006],[-124.63417099999992,70.057754999999929],[-124.60333300000002,70.019714000000135],[-124.59777799999995,70.01527400000009],[-124.58473199999992,70.011932000000002],[-124.56861899999996,70.011108000000036],[-124.55583199999995,70.013046000000145],[-124.45754999999997,70.035706000000118],[-124.45172100000002,70.038376000000028],[-124.44672400000002,70.0417020000001],[-124.423607,70.056366000000139],[-124.44138299999997,70.076096000000121],[-124.449432,70.08027600000014],[-124.506958,70.100266000000147],[-124.51999699999999,70.103867000000037],[-124.54888899999997,70.109984999999938],[-124.58556399999992,70.115265000000022],[-124.59944199999995,70.114151000000049],[-124.62053700000001,70.106644000000074],[-124.63221699999997,70.103867000000037],[-124.68138099999999,70.094436999999971],[-124.71972699999998,70.088593000000117],[-124.735817,70.089432000000102],[-124.73889200000002,70.094436999999971],[-124.75195299999996,70.116378999999995],[-124.75250199999999,70.121643000000006],[-124.74388099999999,70.127197000000137],[-124.734444,70.131927000000019],[-124.70472699999993,70.14498900000001],[-124.69415299999997,70.148605000000089],[-124.68028299999997,70.149719000000061],[-124.43611099999998,70.15109300000006],[-124.39138800000001,70.134155000000135],[-124.35861199999988,70.068603999999993],[-124.36945299999996,70.034987999999998],[-124.37193300000001,70.029434000000037],[-124.38394199999993,70.017761000000007],[-124.41776999999996,69.98942599999998],[-124.42610199999996,69.983871000000079],[-124.45944199999991,69.956375000000037],[-124.42971799999992,69.849425999999937],[-124.44249000000002,69.832763999999997],[-124.45722999999998,69.819716999999969],[-124.47972099999998,69.803589000000102],[-124.50167799999991,69.784424000000115],[-124.50361599999997,69.730820000000108],[-124.5005569999999,69.725815000000068],[-124.49526999999995,69.72137500000008],[-124.487503,69.717209000000139],[-124.45916699999998,69.710815000000082],[-124.36138900000003,69.701096000000121],[-124.29499800000002,69.695251000000042],[-124.28111299999995,69.696091000000081],[-124.26862299999993,69.69802900000002],[-124.2433319999999,69.714705999999978],[-124.23388699999998,69.719147000000078],[-124.21305799999993,69.726654000000053],[-124.20140099999998,69.72943099999992],[-124.1875,69.73054500000012],[-124.06973299999987,69.723602000000085],[-124.04083300000002,69.701385000000016],[-124.05526700000001,69.670532000000037],[-124.21193699999998,69.586380000000077],[-124.24054699999994,69.550262000000032],[-124.24999999999994,69.54553199999998],[-124.28028899999998,69.533600000000035],[-124.33444199999997,69.516936999999984],[-124.37777699999992,69.496933000000013],[-124.39527899999996,69.486923000000104],[-124.51888999999994,69.404159999999933],[-124.51390099999998,69.399428999999998],[-124.48000300000001,69.378036000000066],[-124.47222899999991,69.37414600000011],[-124.44666299999994,69.367203000000131],[-124.32584399999996,69.351929000000041],[-124.26363399999997,69.348602000000085],[-124.21888699999994,69.347762999999929],[-124.16194200000001,69.349152000000117],[-124.12026999999995,69.351379000000009],[-124.09528399999999,69.354980000000069],[-124.01640299999997,69.379150000000095],[-123.962219,69.383040999999935],[-123.83138999999994,69.38888500000013],[-123.81696299999999,69.38888500000013],[-123.73055999999997,69.377472000000125],[-123.702789,69.371094000000028],[-123.69776899999988,69.366378999999995],[-123.69748699999997,69.361099000000081],[-123.69248999999996,69.356644000000074],[-123.67999299999991,69.353317000000118],[-123.66639700000002,69.354156000000103],[-123.502792,69.377197000000137],[-123.47778299999993,69.381088000000034],[-123.46611000000001,69.383881000000031],[-123.41915899999998,69.404434000000037],[-123.40750100000002,69.416092000000106],[-123.43276999999995,69.423035000000084],[-123.44027699999998,69.427200000000084],[-123.45084399999996,69.446930000000066],[-123.45084399999996,69.452209000000039],[-123.44833399999993,69.457763999999941],[-123.44332900000001,69.463882000000069],[-123.43611099999998,69.470261000000107],[-123.42859599999991,69.476379000000065],[-123.39998599999996,69.490265000000079],[-123.36527999999998,69.49832200000003],[-123.33999599999999,69.502213000000097],[-123.30110200000001,69.506653000000085],[-123.27306399999998,69.507767000000115],[-123.26139799999999,69.504990000000021],[-123.26287799999994,69.500267000000008],[-123.25723299999999,69.496094000000085],[-123.19275699999997,69.490814],[-123.17999299999991,69.492477000000122],[-123.16861,69.4952550000001],[-123.16332999999992,69.501389000000131],[-123.13166799999999,69.559708000000001],[-123.12666300000001,69.571105999999986],[-123.09638999999999,69.670532000000037],[-123.09612299999998,69.686371000000008],[-123.10637700000001,69.743042000000116],[-123.10888699999998,69.747756999999922],[-123.11665299999993,69.75221300000004],[-123.10527000000002,69.77915999999999],[-123.01583900000003,69.818329000000062],[-122.97083999999995,69.830826000000002],[-122.95916699999992,69.833603000000096],[-122.94332900000001,69.832763999999997],[-122.90499899999998,69.822220000000129],[-122.876938,69.810257000000092],[-122.85388199999994,69.803040000000124],[-122.82584400000002,69.796371000000079],[-122.80803699999996,69.793593999999985],[-122.79332699999992,69.793593999999985],[-122.779449,69.794707999999957],[-122.76666299999999,69.796371000000079],[-122.754997,69.799149000000057],[-122.74610899999999,69.80442800000003],[-122.66443599999997,69.818054000000018],[-122.61554699999999,69.812195000000031],[-122.58833300000003,69.807479999999998],[-122.47778299999999,69.802765000000136],[-122.45805399999995,69.802475000000129],[-122.24333200000001,69.802200000000084],[-122.12777699999992,69.802475000000129],[-122.06220999999999,69.813309000000004],[-122.04415899999998,69.813599000000011],[-121.89639299999999,69.805542000000059],[-121.71916199999993,69.79582199999993],[-121.68388400000003,69.793593999999985],[-121.44304699999998,69.765549000000021],[-121.41639700000002,69.760818000000086],[-121.38054699999992,69.75221300000004],[-121.33332799999994,69.740814000000114],[-121.28611799999999,69.729156000000103],[-121.18305999999995,69.702484000000027],[-121.12027,69.6827550000001],[-121.08667000000003,69.673598999999967],[-121.03555299999999,69.663315000000125],[-121.00890400000003,69.658325000000104],[-120.93415800000002,69.648604999999975],[-120.88110399999994,69.638885000000073],[-120.82556199999999,69.62359600000002],[-120.79638699999992,69.613036999999963],[-120.760559,69.598328000000095],[-120.73999000000003,69.585266000000104],[-120.73528299999992,69.580276000000026],[-120.72860700000001,69.575821000000019],[-120.70111099999997,69.558594000000028],[-120.67859599999991,69.546097000000032],[-120.61609599999997,69.520264000000054],[-120.39334100000002,69.439697000000081],[-120.27528399999994,69.404159999999933],[-120.23166700000002,69.391662999999937],[-119.98222399999986,69.344711000000018],[-119.93499800000001,69.339705999999978],[-119.91776999999996,69.338318000000072],[-119.63527699999997,69.315810999999997],[-119.46140300000002,69.303314],[-119.33500700000002,69.301926000000094],[-119.31582599999996,69.301086000000055],[-119.23000300000001,69.294434000000138],[-118.94082600000002,69.259430000000066],[-118.85555999999997,69.252487000000087],[-118.84056099999992,69.250548999999978],[-118.79998799999993,69.243317000000047],[-118.69360399999999,69.223602000000028],[-118.65527299999997,69.215820000000065],[-118.64472999999998,69.212494000000049],[-118.63639799999993,69.20887799999997],[-118.58168000000001,69.180267000000072],[-118.55248999999998,69.163605000000075],[-118.53999299999998,69.154984000000127],[-118.502228,69.134720000000016],[-118.48554999999999,69.12692300000009],[-118.45777900000002,69.117477000000122],[-118.432503,69.112198000000092],[-118.18611099999998,69.063873000000115],[-118.08167999999995,69.031371999999976],[-118.03555299999999,69.019714000000135],[-118.010559,69.014434999999992],[-117.87053700000001,68.985535000000141],[-117.83693700000003,68.982483000000002],[-117.74221799999998,68.978043000000014],[-117.63390400000003,68.973602000000085],[-117.59612300000003,68.971649000000127],[-117.5625,68.968597000000045],[-117.41583299999996,68.953598],[-117.26917300000002,68.915268000000026],[-117.19110099999995,68.893874999999923],[-117.15387699999997,68.885544000000039],[-117.13667299999997,68.885544000000039],[-116.978882,68.899993999999992],[-116.96639999999996,68.902206000000035],[-116.96056399999992,68.907211000000075],[-116.93907899999994,68.911003000000107],[-116.88667299999992,68.90887500000008],[-116.74445299999996,68.880538999999999],[-116.515289,68.858032000000094],[-116.50029000000001,68.857208000000128],[-116.43611099999998,68.858597000000088],[-116.42054699999994,68.859146000000067],[-116.41111799999999,68.862761999999918],[-116.40666199999998,68.868590999999924],[-116.40943899999996,68.879974000000118],[-116.39862099999999,68.882751000000042],[-116.38137799999998,68.882477000000108],[-116.36472300000003,68.880813999999987],[-116.34028599999994,68.875259000000085],[-116.28555299999999,68.859711000000118],[-116.22721899999993,68.839157000000114],[-116.22138999999999,68.834427000000119],[-116.21362299999998,68.830551000000014],[-116.12304699999993,68.818329000000062],[-116.10637700000001,68.816666000000112],[-115.99388099999999,68.806641000000013],[-115.96000699999996,68.804703000000075],[-115.94915800000001,68.807479999999998],[-115.94138299999997,68.811920000000043],[-115.94471699999997,68.816940000000045],[-115.95249899999993,68.820831000000112],[-116.12193299999996,68.872481999999991],[-116.31639099999995,68.94747899999993],[-116.32417299999992,68.951660000000004],[-116.33000199999992,68.956100000000049],[-116.325287,68.961929000000055],[-116.31610099999995,68.965546000000018],[-116.30526699999996,68.968597000000045],[-116.26139799999987,68.979980000000069],[-116.239441,68.985535000000141],[-116.20500199999987,68.984985000000108],[-116.19027699999998,68.982758000000047],[-116.068893,68.960541000000148],[-116.00750700000003,68.946365000000128],[-115.96833799999996,68.938582999999994],[-115.88417099999998,68.924698000000092],[-115.86749299999991,68.922759999999982],[-115.77806099999987,68.936371000000122],[-115.76695299999994,68.939148000000046],[-115.77500900000001,68.943039000000113],[-115.80943299999996,68.952208999999982],[-115.83332799999999,68.992477000000008],[-115.59306300000003,68.971649000000127],[-115.44638099999992,68.937759000000028],[-115.06471299999993,68.867476999999951],[-115.05055199999993,68.868866000000139],[-115.03500400000001,68.869140999999956],[-115.01640299999997,68.868042000000003],[-114.98999000000003,68.862761999999918],[-114.97805800000003,68.859146000000067],[-114.82167099999998,68.809707999999944],[-114.79194599999994,68.799423000000047],[-114.77916699999992,68.77915999999999],[-114.77055399999995,68.769440000000088],[-114.74916100000002,68.751389000000074],[-114.729446,68.744431000000134],[-114.71528599999999,68.742203000000131],[-114.69666299999994,68.740814],[-114.66555799999998,68.741653000000099],[-114.57833899999997,68.728043000000071],[-114.54250300000001,68.719436999999971],[-114.44833399999999,68.689697000000024],[-114.44055200000003,68.685805999999957],[-114.46028100000001,68.670532000000094],[-114.46528599999999,68.664428999999927],[-114.46221899999995,68.659424000000058],[-114.45667300000002,68.654709000000025],[-114.40471600000001,68.614990000000148],[-114.39499699999993,68.611374000000069],[-114.30444299999988,68.586929000000055],[-114.23361199999994,68.569443000000092],[-114.12165799999997,68.517487000000017],[-114.10665899999992,68.509430000000066],[-114.08889799999997,68.496368000000018],[-114.07055699999995,68.477478000000076],[-114.064438,68.467209000000025],[-114.06054699999993,68.456650000000025],[-114.01112399999994,68.250275000000045],[-114.01390100000003,68.244979999999998],[-114.02333099999998,68.24136400000009],[-114.03582799999998,68.23942599999998],[-114.28806299999997,68.228866999999923],[-114.32000700000003,68.229156000000046],[-114.33805799999993,68.230545000000063],[-114.35166900000002,68.233597000000145],[-114.37053700000001,68.240540000000124],[-114.37805199999997,68.24443100000002],[-114.38305700000001,68.248871000000065],[-114.390556,68.253052000000139],[-114.41166699999997,68.259430000000066],[-114.42555199999998,68.261932000000002],[-114.44167299999987,68.263610999999969],[-114.47361799999987,68.26388500000013],[-114.70249899999999,68.250275000000045],[-114.75527999999997,68.189697000000137],[-114.76471699999996,68.186096000000077],[-114.861107,68.153594999999996],[-114.87193300000001,68.151093000000117],[-114.89639299999999,68.146942000000024],[-114.92971799999992,68.14776599999999],[-114.97749299999992,68.153319999999951],[-115.00750700000003,68.157211000000018],[-115.076683,68.168869000000086],[-115.17054699999994,68.180542000000116],[-115.22501399999993,68.184142999999949],[-115.23721299999988,68.18220500000001],[-115.24194299999999,68.176376000000005],[-115.24388099999993,68.041367000000093],[-115.24054699999994,68.036377000000073],[-115.23528299999998,68.03166200000004],[-115.220551,68.023880000000077],[-115.204453,68.021927000000119],[-115.17138699999998,68.021102999999982],[-115.15638699999994,68.021652000000131],[-115.12526699999995,68.020263999999997],[-115.11389200000002,68.017487000000131],[-115.11054999999999,68.012207000000046],[-115.11665299999999,68.007217000000026],[-115.12581599999999,68.003601000000117],[-115.20472699999993,67.978043000000014],[-115.216949,67.976089000000002],[-115.34221599999995,67.958037999999988],[-115.50334199999986,67.934418000000051],[-115.52749599999999,67.930267000000129],[-115.53639199999998,67.926651000000049],[-115.5425029999999,67.92164600000001],[-115.53694200000001,67.905257999999947],[-115.53388999999993,67.899993999999992],[-115.52834299999995,67.895538000000045],[-115.521118,67.891663000000108],[-115.50723299999993,67.889435000000105],[-115.281387,67.866379000000109],[-115.27610800000002,67.861649000000057],[-115.20028699999995,67.821930000000123],[-115.19082599999996,67.818329000000062],[-115.11361699999998,67.798599000000081],[-115.1036069999999,67.796646000000123],[-115.02887699999985,67.786652000000117],[-115.01251200000002,67.78637700000013],[-114.99916099999996,67.787491000000102],[-114.93611099999998,67.79553199999998],[-114.88667299999997,67.802764999999965],[-114.84916699999991,67.807755000000043],[-114.80999800000001,67.812195000000031],[-114.78307299999989,67.814423000000033],[-114.75334199999992,67.814986999999974],[-114.73693799999995,67.814697000000137],[-114.718887,67.813309000000061],[-114.70749699999999,67.810531999999967],[-114.6866609999999,67.804153000000099],[-114.67722299999997,67.800812000000064],[-114.65527299999997,67.788879000000009],[-114.64499699999999,67.779709000000139],[-114.637787,67.775543000000027],[-114.29778299999992,67.718597000000102],[-114.28362300000003,67.717484000000013],[-114.27139299999999,67.719436999999971],[-114.25029000000001,67.724700999999982],[-114.24109599999991,67.728317000000004],[-114.22000099999997,67.733871000000022],[-114.19583099999994,67.737762000000089],[-114.1808319999999,67.738037000000077],[-114.14835399999993,67.736923000000104],[-114.11472300000003,67.733871000000022],[-113.99694799999992,67.723038000000031],[-113.98332199999999,67.720535000000041],[-113.94943199999994,67.711655000000007],[-113.89250199999992,67.696930000000066],[-113.84584000000001,67.691359999999975],[-113.76862299999999,67.691086000000041],[-113.70889299999999,67.691925000000026],[-113.55082699999997,67.698029000000076],[-113.25583599999999,67.704436999999984],[-113.24082899999996,67.704436999999984],[-113.20694700000001,67.702484000000084],[-113.17804699999988,67.698029000000076],[-113.15556300000003,67.692200000000014],[-113.11916399999996,67.678040000000124],[-113.10777300000001,67.674988000000042],[-113.06777999999997,67.667480000000012],[-113.04998799999993,67.666092000000106],[-112.965012,67.669708000000128],[-112.73972300000003,67.669434000000024],[-112.3958439999999,67.679153000000042],[-112.370003,67.68193100000002],[-112.348343,67.687194999999974],[-112.34056099999998,67.691359999999975],[-112.33361799999989,67.696365000000014],[-112.18331899999993,67.727768000000083],[-111.912781,67.754166000000055],[-111.88305700000001,67.754439999999988],[-111.79972799999996,67.75082400000008],[-111.66000399999996,67.733322000000044],[-111.57277699999992,67.744431000000134],[-111.45861799999989,67.763046000000088],[-111.37082699999991,67.781097000000045],[-111.32250999999991,67.806931000000077],[-111.31276699999995,67.810531999999967],[-111.29083299999996,67.815536000000066],[-111.200287,67.834152000000131],[-111.17582699999991,67.837494000000049],[-111.15943900000002,67.836655000000064],[-111.14835399999998,67.833602999999982],[-111.14388999999994,67.82887299999993],[-111.146118,67.822769000000108],[-111.12082700000002,67.780823000000112],[-111.03443899999996,67.764160000000061],[-111.01834100000002,67.763321000000076],[-111.00583599999999,67.764998999999989],[-110.84056099999998,67.800262000000032],[-110.83222999999998,67.804428000000087],[-110.80972300000002,67.818604000000107],[-110.78859699999998,67.833602999999982],[-110.78278399999994,67.839431999999988],[-110.75890400000003,67.852767999999969],[-110.74221799999992,67.861099000000024],[-110.73249800000002,67.86442599999998],[-110.41443600000002,67.947754000000145],[-110.33999599999999,67.965546000000018],[-110.1991579999999,67.972214000000008],[-110.17999299999991,67.994431000000077],[-110.1725009999999,67.999420000000043],[-110.162781,68.00277699999998],[-110.15167200000002,68.005264000000068],[-110.13054699999998,68.008040999999992],[-110.11694299999994,68.008881000000031],[-110.08389299999999,68.006943000000092],[-110.07084699999996,68.004165999999998],[-110.04888900000003,67.997756999999922],[-110.00110599999999,67.979705999999965],[-109.979446,67.967483999999956],[-109.97083999999995,67.958037999999988],[-109.96888699999994,67.953049000000021],[-109.96749899999992,67.941360000000145],[-109.97028399999999,67.929703000000018],[-109.97749299999987,67.911377000000016],[-109.99166899999994,67.891373000000044],[-110.00110599999999,67.872482000000048],[-110.00361599999991,67.866379000000109],[-110.00361599999991,67.860535000000084],[-109.99749799999995,67.850815000000011],[-109.98889200000002,67.841370000000097],[-109.98249800000002,67.837204000000042],[-109.97389199999998,67.833602999999982],[-109.96305799999993,67.830276000000026],[-109.948036,67.830276000000026],[-109.93554699999999,67.831940000000031],[-109.92582699999997,67.835266000000104],[-109.91722099999998,67.839157],[-109.91251399999999,67.845824999999934],[-109.912216,67.85165399999994],[-109.91639700000002,67.856093999999985],[-109.94888300000002,67.877197000000081],[-109.95305599999995,67.881927000000076],[-109.94193999999993,67.884430000000066],[-109.89028899999994,67.879974000000004],[-109.86193799999995,67.874985000000038],[-109.823059,67.866089000000102],[-109.81416299999995,67.862198000000035],[-109.80777,67.858032000000094],[-109.76722699999993,67.827773999999977],[-109.73082699999998,67.791931000000091],[-109.72917200000001,67.767761000000121],[-109.73581699999994,67.74275200000011],[-109.74553700000001,67.739426000000094],[-109.75167799999991,67.733597000000088],[-109.74973299999994,67.728592000000049],[-109.7369379999999,67.720261000000107],[-109.72609699999998,67.716933999999981],[-109.55222300000003,67.687759000000142],[-109.53472899999991,67.685806000000014],[-109.52250700000002,67.687484999999981],[-109.51139799999999,67.689697000000081],[-109.50279199999994,67.693862999999965],[-109.48805199999993,67.703873000000044],[-109.37026999999995,67.729155999999989],[-109.25361599999997,67.731934000000138],[-109.21028100000001,67.732208000000071],[-109.15915699999999,67.727478000000019],[-109.06582600000002,67.714157000000114],[-109.05972300000002,67.709991000000002],[-109.01471699999996,67.676651000000106],[-109.00279199999994,67.662491000000045],[-108.91915899999992,67.535812000000135],[-108.921944,67.529709000000025],[-108.95388800000001,67.511932000000115],[-108.96362299999998,67.5086060000001],[-108.99665800000002,67.501389000000017],[-109.00119000000001,67.5],[-109.00666799999993,67.498322000000087],[-109.01528899999994,67.494141000000013],[-109.02139299999999,67.488311999999951],[-109.02528399999994,67.483322000000101],[-109.01806599999998,67.462494000000049],[-109.002228,67.443587999999977],[-108.98554999999993,67.436096000000077],[-108.84999099999993,67.388596000000064],[-108.83112299999993,67.353591999999992],[-108.82501200000002,67.349426000000108],[-108.81276700000001,67.348876999999959],[-108.80416899999994,67.352768000000026],[-108.79666099999986,67.357758000000103],[-108.79055799999998,67.363602000000128],[-108.76611299999996,67.396378000000027],[-108.75834700000001,67.409149000000127],[-108.75583599999999,67.415267999999969],[-108.74445299999996,67.445525999999973],[-108.74109599999997,67.457214000000135],[-108.73638900000003,67.481093999999985],[-108.735817,67.486649000000057],[-108.734734,67.547759999999982],[-108.735817,67.558594000000028],[-108.73777799999993,67.563873000000058],[-108.73889200000002,67.574707000000103],[-108.73916599999995,67.596938999999963],[-108.73638900000003,67.603043000000014],[-108.73000299999995,67.608597000000032],[-108.71472199999999,67.61914100000007],[-108.70612299999988,67.623306000000071],[-108.69611399999997,67.626373000000001],[-108.67027299999995,67.628586000000098],[-108.65527299999991,67.62831100000011],[-108.62053700000001,67.624695000000031],[-108.6100009999999,67.621093999999971],[-108.58500700000002,67.609985000000108],[-108.57888799999989,67.605545000000063],[-108.516953,67.497482000000048],[-108.51139799999999,67.487487999999985],[-108.510559,67.47665400000011],[-108.51334399999996,67.470535000000098],[-108.52333099999993,67.45748900000001],[-108.52390300000002,67.451659999999947],[-108.52278100000001,67.44081100000011],[-108.49804699999993,67.363037000000077],[-108.49027999999998,67.353591999999992],[-108.48416099999997,67.349426000000108],[-108.47138999999993,67.346649000000014],[-108.458054,67.347214000000065],[-108.43720999999994,67.352768000000026],[-108.42971799999998,67.357483000000059],[-108.42471299999994,67.364151000000049],[-108.421944,67.3702550000001],[-108.42944299999999,67.379700000000128],[-108.43554699999999,67.383881000000031],[-108.439438,67.388596000000064],[-108.44275699999997,67.399155000000121],[-108.43998699999992,67.427475000000129],[-108.43472300000002,67.431656000000032],[-108.39388999999994,67.443587999999977],[-108.38166799999999,67.445251000000098],[-108.36694299999994,67.444976999999994],[-108.34361299999989,67.438582999999937],[-108.33556399999998,67.434982000000105],[-108.32112100000001,67.426926000000037],[-108.30750299999988,67.413040000000024],[-108.301941,67.403320000000122],[-108.30027799999999,67.398041000000148],[-108.29666099999997,67.393326000000116],[-108.28832999999997,67.389435000000049],[-108.13417099999992,67.329163000000051],[-108.06360599999988,67.305251999999996],[-108.02583300000003,67.296371000000022],[-108.015289,67.293045000000006],[-107.98554999999999,67.271927000000119],[-107.94471699999997,67.236374000000069],[-107.94082600000002,67.231659000000036],[-107.875,67.140823000000012],[-107.87526700000001,67.052765000000136],[-107.88054699999998,67.04832499999992],[-107.89362299999999,67.047760000000096],[-107.90499899999998,67.049713000000054],[-107.95028699999995,67.062195000000031],[-108.00834699999996,67.077484000000084],[-108.02084399999995,67.080551000000014],[-108.03666699999991,67.081664999999987],[-108.14862099999993,67.076660000000118],[-108.15722700000003,67.072769000000051],[-108.18916300000001,67.054977000000008],[-108.19304699999986,67.049713000000054],[-108.192207,67.038878999999952],[-108.19082600000002,67.033599999999979],[-108.19138299999992,67.028046000000018],[-108.19526699999994,67.022766000000104],[-108.20388799999995,67.018875000000037],[-108.21611000000001,67.017211999999915],[-108.23277300000001,67.019150000000081],[-108.24527,67.022217000000012],[-108.45028699999995,67.083328000000108],[-108.46056399999992,67.086928999999998],[-108.495003,67.102203000000088],[-108.51722699999999,67.113876000000062],[-108.541382,67.130813999999987],[-108.55555700000002,67.138885000000073],[-108.58029199999999,67.15026899999998],[-108.59056099999998,67.153594999999996],[-108.6063769999999,67.154708999999968],[-108.61971999999997,67.15387000000004],[-108.622772,67.149993999999936],[-108.53028899999993,67.042480000000012],[-108.52416999999997,67.038315000000011],[-108.51611300000002,67.034423999999944],[-108.50140399999998,67.032211000000018],[-108.491669,67.0352630000001],[-108.48554999999988,67.041092000000106],[-108.48500100000001,67.046646000000123],[-108.48665599999998,67.05192599999998],[-108.49054699999988,67.056641000000013],[-108.48944099999994,67.067764000000011],[-108.48194899999999,67.072769000000051],[-108.468887,67.073318000000029],[-108.45612299999999,67.070541000000105],[-108.44193999999999,67.062485000000038],[-108.39222699999993,67.028869999999984],[-108.35637700000001,67.003326000000129],[-108.34665699999994,66.994431000000077],[-108.33056599999998,66.986923000000104],[-108.31806899999998,66.983871000000136],[-108.28971899999993,66.979980000000069],[-108.25862099999995,66.977768000000026],[-108.22860700000001,66.976654000000053],[-108.19695300000001,66.972214000000008],[-108.16639700000002,66.962204000000099],[-108.14998600000001,66.954436999999984],[-108.11472299999997,66.928864000000033],[-107.98528299999998,66.828598000000113],[-107.94138299999997,66.788315000000068],[-107.93831599999999,66.778046000000074],[-107.93971299999993,66.766663000000051],[-107.94193999999999,66.749709999999936],[-107.94471699999997,66.743591000000094],[-107.94803599999995,66.731933999999967],[-107.949432,66.720535000000098],[-107.94583099999994,66.715820000000065],[-107.89444699999996,66.671646000000123],[-107.88276699999989,66.663315000000011],[-107.87082699999996,66.662491000000045],[-107.86444099999989,66.668320000000051],[-107.86389200000002,66.673874000000069],[-107.86776700000001,66.71138000000002],[-107.88474299999996,66.750823999999909],[-107.88834400000002,66.755554000000132],[-107.88194299999992,66.759155000000021],[-107.86776700000001,66.758881000000088],[-107.85333299999996,66.756378000000097],[-107.829453,66.744980000000112],[-107.81777999999997,66.736374000000012],[-107.76500699999997,66.686919999999986],[-107.72416699999991,66.629700000000128],[-107.64750699999996,66.574707000000103],[-107.62805199999997,66.562194999999974],[-107.60082999999997,66.546097000000088],[-107.56945799999994,66.53054800000001],[-107.55721999999997,66.527771000000087],[-107.43305999999995,66.453598000000113],[-107.2911069999999,66.36831699999999],[-107.26027699999986,66.353043000000071],[-107.24804699999993,66.349990999999989],[-107.23500100000001,66.348602000000142],[-107.22222899999997,66.349152000000004],[-107.21140299999996,66.351379000000065],[-107.203056,66.355254999999943],[-107.196663,66.360809000000131],[-107.195831,66.366379000000052],[-107.19722000000002,66.371643000000006],[-107.20056199999993,66.376373000000058],[-107.23554999999993,66.407486000000063],[-107.34221599999995,66.461655000000064],[-107.43888899999996,66.513046000000145],[-107.56220999999994,66.591369999999984],[-107.56582599999996,66.596100000000035],[-107.56861899999996,66.606644000000074],[-107.56777999999991,66.612198000000092],[-107.56916799999999,66.617477000000065],[-107.57055700000001,66.622482000000105],[-107.57417299999997,66.627471999999955],[-107.62416100000002,66.660812000000021],[-107.64943700000003,66.693862999999965],[-107.69387799999998,66.755829000000006],[-107.74665800000002,66.922760000000039],[-107.68861399999997,66.977097000000128],[-107.63806199999999,67.024429000000055],[-107.66665599999993,67.063034000000016],[-107.66805999999985,67.068329000000062],[-107.66166699999997,67.073883000000023],[-107.65083299999992,67.076096000000007],[-107.63612399999994,67.073883000000023],[-107.60777299999995,67.063309000000004],[-107.58361799999994,67.051650999999993],[-107.52390300000002,67.020264000000054],[-107.51666299999999,67.010543999999982],[-107.48388699999998,66.924149],[-107.48473399999995,66.918593999999928],[-107.49694799999997,66.917206000000022],[-107.57972699999988,66.916382000000056],[-107.59445199999999,66.918868999999972],[-107.60221899999988,66.922760000000039],[-107.608047,66.926926000000094],[-107.62332200000003,66.940262000000075],[-107.626938,66.944977000000108],[-107.632767,66.949417000000096],[-107.64083899999997,66.953049000000078],[-107.647064,66.942711000000031],[-107.65521999999999,66.943710000000067],[-107.66238399999997,66.942879000000062],[-107.66754900000001,66.940376000000072],[-107.67138699999998,66.937035000000037],[-107.67038700000001,66.933868000000018],[-107.63527699999997,66.892212000000029],[-107.57028199999991,66.837769000000094],[-107.564438,66.833602999999982],[-107.51306199999993,66.822220000000016],[-107.42832900000002,66.804703000000131],[-107.41610699999995,66.806091000000038],[-107.40888999999993,66.811096000000077],[-107.39111299999996,66.891373000000101],[-107.39584400000001,66.901382000000126],[-107.422234,66.939697000000024],[-107.42944299999999,66.949142000000109],[-107.43888899999996,66.958328000000051],[-107.44471699999997,66.962493999999936],[-107.44387799999993,66.968048000000124],[-107.435272,66.972214000000008],[-107.421944,66.972762999999986],[-107.40611299999995,66.97137500000008],[-107.37943999999993,66.966094999999996],[-107.35916099999992,66.959427000000005],[-107.23388699999992,66.902206000000092],[-107.21806299999997,66.894714000000135],[-107.21028099999995,66.890823000000069],[-107.1875,66.87359600000002],[-107.15750099999991,66.846939000000134],[-107.15055799999999,66.837494000000049],[-107.14916999999991,66.832214000000022],[-107.137787,66.823608000000092],[-107.12554899999992,66.820540999999992],[-107.09472700000003,66.818329000000119],[-107.08361799999994,66.820540999999992],[-107.15527299999997,66.899719000000005],[-107.20388800000001,66.944702000000063],[-107.22666900000002,66.961655000000007],[-107.24027999999998,66.969986000000063],[-107.29750100000001,67.001938000000052],[-107.3052669999999,67.005829000000119],[-107.31139399999995,67.127197000000024],[-107.38806199999993,67.144440000000145],[-107.43083200000001,67.158325000000048],[-107.44915800000001,67.165543000000071],[-107.47332799999992,67.176926000000037],[-107.48137700000001,67.180816999999934],[-107.50306699999993,67.192749000000106],[-107.53250100000002,67.214157],[-107.64862099999993,67.359984999999995],[-107.57694999999995,67.475540000000137],[-107.57389799999993,67.481658999999979],[-107.57528699999995,67.48692299999999],[-107.57888800000001,67.491652999999985],[-107.58277899999996,67.496368000000018],[-107.58860799999991,67.500823999999966],[-107.71833800000002,67.573318000000086],[-107.74054699999994,67.585265999999933],[-107.77362099999999,67.600540000000024],[-107.81331599999999,67.614426000000037],[-107.84472700000003,67.624420000000043],[-107.89055599999989,67.642487000000074],[-107.96916199999998,67.676651000000106],[-107.98972300000003,67.688873000000115],[-107.99944299999999,67.698029000000076],[-108.006958,67.707489000000123],[-108.01334399999996,67.728317000000004],[-108.01445000000001,67.73414600000001],[-108.015289,67.744980000000055],[-108.01390099999998,67.756103999999993],[-108.00805699999995,67.768326000000116],[-107.99249299999997,67.788040000000024],[-107.94833399999993,67.841095000000109],[-107.94193999999999,67.846939000000134],[-107.93415800000002,67.85165399999994],[-107.92278299999998,67.853867000000093],[-107.890289,67.85165399999994],[-107.87777699999992,67.853317000000061],[-107.85527000000002,67.85775799999999],[-107.75666799999993,67.880814000000044],[-107.71472199999994,67.892487000000074],[-107.70472699999993,67.895828000000108],[-107.674713,67.916092000000049],[-107.66166699999997,67.927475000000015],[-107.65110800000002,67.940535999999952],[-107.65499899999992,67.945250999999985],[-107.66555800000003,67.94859300000013],[-107.77050800000001,67.96526300000005],[-107.81133999999992,67.971596000000034],[-107.91027800000001,67.988585999999998],[-107.91639699999996,67.993042000000059],[-107.91999800000002,67.997756999999922],[-107.89055599999989,68.081664999999987],[-107.88527699999997,68.088318000000129],[-107.87888299999997,68.093872000000147],[-107.86332699999997,68.103592000000049],[-107.85166899999996,68.106094000000098],[-107.837784,68.104430999999977],[-107.72112300000003,68.082763999999941],[-107.69943199999994,68.075821000000133],[-107.69360399999994,68.071655000000078],[-107.69776899999994,68.066376000000105],[-107.70667300000002,68.062485000000038],[-107.72721899999993,68.056090999999981],[-107.73860200000001,68.05386400000009],[-107.77250700000002,68.05693100000002],[-107.78778099999994,68.057205000000124],[-107.80027799999999,68.055817000000047],[-107.80943299999996,68.051650999999936],[-107.83332799999988,68.013046000000031],[-107.83389299999999,68.007217000000026],[-107.82778899999988,68.003052000000025],[-107.8038479999999,68.004264999999975],[-107.78733799999998,67.997597000000042],[-107.77900699999998,67.996765000000096],[-107.763847,67.998428000000047],[-107.75699599999996,67.999771000000123],[-107.75426500000003,68.006812999999966],[-107.73306300000002,68.020827999999995],[-107.72501399999993,68.025818000000015],[-107.69027699999992,68.042480000000012],[-107.67999299999997,68.04582199999993],[-107.61028299999998,68.058593999999971],[-107.58583099999998,68.059982000000048],[-107.57084700000001,68.059708000000114],[-107.53806299999997,68.057479999999998],[-107.45028699999989,68.047211000000118],[-107.38890100000003,68.04525799999999],[-107.36221299999994,68.04693600000013],[-107.34944200000001,68.048599000000024],[-107.32640099999998,68.053040000000124],[-107.28778099999994,68.064987000000087],[-107.25140399999998,68.080826000000002],[-107.22638699999993,68.094436999999971],[-107.154449,68.12692300000009],[-107.141953,68.128310999999997],[-107.11028299999998,68.12692300000009],[-107.10665899999998,68.122208000000057],[-107.11888099999987,68.084717000000069],[-106.96556099999998,68.113312000000121],[-106.95278899999988,68.114700000000028],[-106.85611,68.116927999999973],[-106.84111000000001,68.116379000000052],[-106.80194099999994,68.197479000000101],[-106.80943300000001,68.207214000000022],[-106.80610699999994,68.213043000000027],[-106.80027799999993,68.217484000000127],[-106.79110700000001,68.221375000000023],[-106.62748699999997,68.246643000000063],[-106.61444099999994,68.24803200000008],[-106.5994419999999,68.247482000000048],[-106.58860800000002,68.244141000000013],[-106.468613,68.190536000000122],[-106.45777900000002,68.176376000000005],[-106.45417799999996,68.160812000000078],[-106.45056199999999,68.155823000000112],[-106.44471699999991,68.151657000000057],[-106.43195300000002,68.153046000000018],[-106.42138699999987,68.156097000000045],[-106.35056299999997,68.179153000000099],[-106.34472699999998,68.183318999999983],[-106.35056299999997,68.187759000000028],[-106.35888699999992,68.191650000000095],[-106.39277600000003,68.201660000000004],[-106.42083700000001,68.207214000000022],[-106.468887,68.214431999999988],[-106.48194899999993,68.217484000000127],[-106.48999000000003,68.221375000000023],[-106.49582699999996,68.225540000000024],[-106.49722300000002,68.230820000000051],[-106.46833799999996,68.329711999999972],[-106.46501199999994,68.335815000000139],[-106.45667299999991,68.340820000000008],[-106.44748700000002,68.344711000000075],[-106.42639200000002,68.350815000000068],[-106.25611900000001,68.387772000000098],[-106.24416400000001,68.38998400000014],[-106.21833800000002,68.392487000000131],[-106.203056,68.392211999999915],[-106.185272,68.38998400000014],[-106.17471299999994,68.386658000000125],[-106.16665599999999,68.382750999999985],[-106.15471599999989,68.373871000000122],[-105.79638699999998,68.422211000000118],[-105.79055799999998,68.418045000000063],[-105.78222699999998,68.413878999999952],[-105.76583900000003,68.41276600000009],[-105.75167799999991,68.413040000000024],[-105.73972300000003,68.415267999999969],[-105.73029300000002,68.419144000000017],[-105.72305299999999,68.424698000000035],[-105.70111099999991,68.469711000000132],[-105.69721999999996,68.486649],[-105.69833399999993,68.49192800000003],[-105.70278899999994,68.501938000000109],[-105.71444699999995,68.510544000000039],[-105.74305700000002,68.564697000000137],[-105.724716,68.574158000000125],[-105.64499699999999,68.633880999999974],[-105.65083300000003,68.638046000000145],[-105.66639699999996,68.638596000000007],[-105.90222199999999,68.635269000000051],[-105.92832899999996,68.632476999999994],[-106.02944899999994,68.619704999999954],[-106.041382,68.617477000000008],[-106.04972799999996,68.612761999999975],[-106.04750100000001,68.602203000000145],[-106.05332900000002,68.595824999999991],[-106.06416300000001,68.59275800000006],[-106.2077789999999,68.567764000000068],[-106.23638900000003,68.566665999999998],[-106.37027,68.545258000000103],[-106.51083399999999,68.518326000000002],[-106.54387700000001,68.511932000000115],[-106.62470999999999,68.46748400000007],[-106.63166799999999,68.461928999999998],[-106.62888299999992,68.45138500000013],[-106.62165799999997,68.441925000000026],[-106.61582899999996,68.437759000000142],[-106.59528399999994,68.425261999999975],[-106.58473200000003,68.421646000000123],[-106.57167099999992,68.418593999999985],[-106.55387899999994,68.416656000000046],[-106.52194199999997,68.414992999999924],[-106.50446299999999,68.41276600000009],[-106.493607,68.409424000000115],[-106.48777799999988,68.404984000000127],[-106.48055999999997,68.395537999999988],[-106.52722199999994,68.300812000000121],[-106.53415699999999,68.295257999999933],[-106.54332699999998,68.291367000000037],[-106.556107,68.289978000000076],[-106.57277699999986,68.291092000000049],[-106.58444199999991,68.293319999999994],[-106.59500099999997,68.296646000000067],[-106.60109699999998,68.301086000000055],[-106.6119379999999,68.315262000000075],[-106.6383439999999,68.343048000000124],[-106.64444700000001,68.347487999999942],[-106.77887699999997,68.408034999999984],[-106.78971899999999,68.411652000000117],[-106.80277999999993,68.414428999999984],[-107.01363400000002,68.369431000000077],[-107.02166699999998,68.364699999999971],[-107.02027899999996,68.359420999999998],[-107.01666299999999,68.354705999999965],[-107.01750199999998,68.349151999999947],[-107.03138699999994,68.33776899999998],[-107.13221699999991,68.283325000000104],[-107.24610899999999,68.261383000000023],[-107.25890400000003,68.259995000000117],[-107.26500699999997,68.264160000000118],[-107.274719,68.273314999999968],[-107.28611799999993,68.287490999999989],[-107.29611199999994,68.296646000000067],[-107.30194099999994,68.300812000000121],[-107.32721699999991,68.312484999999981],[-107.33805799999999,68.315810999999997],[-107.54666099999992,68.347487999999942],[-107.56082200000003,68.349151999999947],[-107.81331599999999,68.342484000000013],[-107.82611099999997,68.341094999999996],[-107.83640300000002,68.338043000000084],[-107.84973100000002,68.326385000000073],[-107.85500299999995,68.31999200000007],[-107.88527699999997,68.26887499999998],[-107.88362100000001,68.263610999999969],[-107.879707,68.258880999999974],[-107.85417199999995,68.247482000000048],[-107.83029199999993,68.241089000000102],[-107.74194299999999,68.216934000000094],[-107.61332700000003,68.178588999999988],[-107.60249299999998,68.175262000000032],[-107.59861799999999,68.17053199999998],[-107.60305800000003,68.165268000000026],[-107.61582900000002,68.163879000000009],[-107.63221699999997,68.164992999999981],[-107.68998699999997,68.174423000000047],[-107.78639199999992,68.183868000000132],[-107.80027799999999,68.183318999999983],[-107.82584399999996,68.180542000000116],[-107.87193300000001,68.171371000000136],[-108.03388999999999,68.168594000000041],[-108.16139199999986,68.172759999999982],[-108.18694299999999,68.169983000000059],[-108.19695300000001,68.166656000000103],[-108.22028399999999,68.152205999999978],[-108.24944299999993,68.141663000000051],[-108.30055199999993,68.125809000000118],[-108.33222999999998,68.117203000000018],[-108.37026999999989,68.112762000000089],[-108.38555899999994,68.113037000000077],[-108.40306099999998,68.114990000000034],[-108.41388699999993,68.11831699999999],[-108.42250099999995,68.122208000000057],[-108.43277,68.131088000000091],[-108.43611099999987,68.141373000000044],[-108.43306000000001,68.147490999999945],[-108.42804699999994,68.154160000000047],[-108.40888999999999,68.16137700000013],[-108.39750700000002,68.163605000000075],[-108.36694299999994,68.161102000000085],[-108.36277799999993,68.15637200000009],[-108.36582899999996,68.15026899999998],[-108.37361099999993,68.145264000000111],[-108.37998999999996,68.139708999999982],[-108.37832599999996,68.134430000000009],[-108.36527999999993,68.133606000000043],[-108.34612299999998,68.140823000000012],[-108.33860800000002,68.145828000000051],[-108.33332799999994,68.152205999999978],[-108.33056599999998,68.158600000000035],[-108.32695000000001,68.170258000000047],[-108.32444800000002,68.192749000000049],[-108.32945299999989,68.208327999999995],[-108.3958439999999,68.289978000000076],[-108.40222199999994,68.294144000000131],[-108.44360399999999,68.308029000000033],[-108.46000700000002,68.309143000000006],[-108.484444,68.305251999999939],[-108.504997,68.298874000000012],[-108.55999800000001,68.275542999999971],[-108.56500199999999,68.26887499999998],[-108.56806899999992,68.262772000000041],[-108.57444799999996,68.257216999999969],[-108.58444199999997,68.253876000000105],[-108.71556099999998,68.231369000000029],[-108.72944599999988,68.230820000000051],[-108.74610899999993,68.231934000000024],[-108.756958,68.235260000000096],[-108.765556,68.238876000000118],[-108.81527699999998,68.262206999999989],[-108.81916799999993,68.266663000000108],[-108.81416299999989,68.273314999999968],[-108.74889400000001,68.33776899999998],[-108.74109599999997,68.342758000000117],[-108.71417199999996,68.354705999999965],[-108.70417799999996,68.35803199999998],[-108.69387799999993,68.361098999999911],[-108.67083700000001,68.365813999999943],[-108.63999899999993,68.375534000000016],[-108.62082700000002,68.382750999999985],[-108.61193800000001,68.386658000000125],[-108.58112299999999,68.406372000000033],[-108.56667299999998,68.416931000000091],[-108.53443900000002,68.445526000000086],[-108.52916699999992,68.452209000000096],[-108.52278100000001,68.458038000000101],[-108.43167099999994,68.538315000000068],[-108.40416700000003,68.560256999999979],[-108.383331,68.576660000000004],[-108.36888099999999,68.587204000000042],[-108.34528399999994,68.601928999999984],[-108.31416300000001,68.611374000000069],[-108.27916700000003,68.618317000000047],[-108.25195299999996,68.620529000000147],[-108.1702729999999,68.626647999999989],[-107.93331899999998,68.64027399999992],[-107.80499299999997,68.645538000000101],[-107.63834399999996,68.665543000000127],[-107.43167099999994,68.690536000000009],[-107.23137700000001,68.71887200000009],[-107.10833700000001,68.748596000000134],[-106.96140300000002,68.783051000000057],[-106.93859899999995,68.788315000000011],[-106.82084700000001,68.811371000000065],[-106.79444899999993,68.813872999999944],[-106.765556,68.814986999999917],[-106.63500999999991,68.818329000000062],[-106.31555200000003,68.892761000000121],[-106.27250699999996,68.904709000000025],[-106.262787,68.90887500000008],[-106.25446299999993,68.913605000000132],[-106.24833699999988,68.919983000000059],[-106.24472000000003,68.926085999999998],[-106.24360699999994,68.931656000000089],[-106.23998999999998,68.937759000000028],[-106.22917200000001,68.940810999999997],[-106.21472199999999,68.941360000000088],[-106.20140100000003,68.940536000000122],[-106.14943699999998,68.933594000000028],[-106.08084099999996,68.918869000000086],[-105.81360599999988,68.881927000000076],[-105.79804999999999,68.879425000000026],[-105.77639799999997,68.872481999999991],[-105.71806300000003,68.844985999999949],[-105.48693800000001,68.729430999999977],[-105.475281,68.720535000000041],[-105.47165699999999,68.715820000000008],[-105.47833300000002,68.69859299999996],[-105.48194899999999,68.692474000000118],[-105.4891659999999,68.68691999999993],[-105.49889400000001,68.683044000000052],[-105.49944299999999,68.621368000000075],[-105.41443600000002,68.528594999999996],[-105.38082900000001,68.486649],[-105.40888999999999,68.492477000000122],[-105.42304999999999,68.49192800000003],[-105.43388400000003,68.489151000000106],[-105.44360399999994,68.485260000000039],[-105.52944899999994,68.450272000000041],[-105.53806299999991,68.445526000000086],[-105.54387700000001,68.439147999999989],[-105.54778299999998,68.433044000000109],[-105.54888900000003,68.427475000000129],[-105.54804999999999,68.422211000000118],[-105.54110699999995,68.41276600000009],[-105.53307299999994,68.408599999999979],[-105.51777600000003,68.406096999999988],[-105.41639700000002,68.406937000000084],[-105.39028899999988,68.409424000000115],[-105.34528399999999,68.384155000000135],[-105.34889199999992,68.378036000000122],[-105.350281,68.372482000000105],[-105.34472700000003,68.368042000000116],[-105.29499800000002,68.339157000000057],[-105.28694200000001,68.33526599999999],[-105.10082999999992,68.266098000000056],[-105.07305899999994,68.260269000000051],[-105.05555700000002,68.258041000000105],[-105.02639799999992,68.257767000000001],[-105.00894900000003,68.264938000000029],[-105.00661500000001,68.268599999999935],[-105.00578300000001,68.272094999999922],[-105.00666799999993,68.278595000000053],[-105.01695299999994,68.282211000000132],[-105.02610800000002,68.309418000000051],[-104.88474300000001,68.339705999999978],[-104.86416600000001,68.332489000000066],[-104.84805299999999,68.324707000000103],[-104.83917200000002,68.315536000000009],[-104.83583099999998,68.310806000000127],[-104.83416699999998,68.300262000000089],[-104.83944699999995,68.288589000000059],[-104.84584000000001,68.282211000000132],[-104.85305800000003,68.276657000000114],[-104.86277799999993,68.272766000000047],[-104.87332199999997,68.269714000000135],[-104.94554099999999,68.258041000000105],[-104.952789,68.252487000000087],[-104.95194999999995,68.247482000000048],[-104.94055200000003,68.238586000000112],[-104.924713,68.230545000000063],[-104.91443600000002,68.227203000000088],[-104.900284,68.22526600000009],[-104.88639799999999,68.225540000000024],[-104.87332199999997,68.226928999999984],[-104.79750100000001,68.24443100000002],[-104.73111,68.250275000000045],[-104.68776699999995,68.250275000000045],[-104.63999899999999,68.246933000000126],[-104.609734,68.24136400000009],[-104.59889199999998,68.232483000000002],[-104.59722899999997,68.222214000000122],[-104.61277799999999,68.198029000000133],[-104.61888099999993,68.191650000000095],[-104.6324919999999,68.179428000000087],[-104.65471600000001,68.162766000000147],[-104.66722099999993,68.149994000000106],[-104.67027299999995,68.138596000000121],[-104.59221599999989,68.083603000000096],[-104.50778200000002,68.035812000000021],[-104.5,68.031937000000028],[-104.48638900000003,68.029984000000127],[-104.45722999999992,68.029709000000082],[-104.36694299999994,68.034149000000127],[-104.21472199999994,68.024155000000064],[-104.199997,68.021378000000027],[-104.16665599999993,68.017487000000131],[-104.12470999999994,68.018326000000059],[-104.11193800000001,68.019440000000031],[-104.06471299999998,68.027480999999966],[-104.01139799999999,68.042206000000078],[-103.99944299999999,68.044144000000017],[-103.98554999999999,68.044434000000024],[-103.97084000000001,68.043869000000029],[-103.94082600000002,68.038315000000011],[-103.92832900000002,68.034988000000055],[-103.89806399999998,68.024155000000064],[-103.88362100000001,68.021378000000027],[-103.87082699999996,68.020263999999997],[-103.84306300000003,68.020827999999995],[-103.791382,68.025269000000094],[-103.76695299999994,68.028320000000065],[-103.55526700000001,68.057205000000124],[-103.54444899999987,68.059982000000048],[-103.53694200000001,68.065536000000066],[-103.53278399999999,68.071655000000078],[-103.53333299999991,68.076660000000118],[-103.53639199999998,68.081664999999987],[-103.54472399999997,68.090820000000008],[-103.55526700000001,68.099715999999944],[-103.55803699999996,68.104430999999977],[-103.55304699999999,68.109711000000061],[-103.52139299999999,68.130813999999987],[-103.50389099999995,68.140274000000034],[-103.49526999999995,68.144714000000079],[-103.46694899999994,68.156936999999914],[-103.45722999999998,68.160537999999974],[-103.42166099999997,68.166656000000103],[-103.40416700000003,68.164154000000053],[-103.38971700000002,68.16137700000013],[-103.38194299999992,68.157211000000018],[-103.36888099999999,68.148880000000133],[-103.34416199999993,68.121094000000085],[-103.34137699999991,68.116089000000045],[-103.34028599999988,68.105819999999994],[-103.341949,68.100265999999976],[-103.37249799999995,68.06860400000005],[-103.36916399999996,68.010818000000029],[-103.36609599999997,68.005829000000062],[-103.25418100000002,67.966385000000002],[-103.22084000000001,67.962204000000099],[-103.20612299999999,67.961380000000133],[-103.17832899999996,67.961929000000055],[-103.14943699999998,67.961380000000133],[-103.13694800000002,67.958037999999988],[-103.12943999999999,67.953872999999987],[-103.12416100000002,67.949707000000103],[-103.11277799999999,67.930267000000129],[-103.1052699999999,67.926086000000055],[-103.09306300000003,67.923035000000027],[-103.01471700000002,67.913605000000132],[-103.00083899999998,67.913879000000065],[-102.99082899999996,67.917480000000126],[-102.98222399999997,67.922211000000061],[-102.97250399999996,67.925812000000121],[-102.95944199999985,67.926926000000094],[-102.94972199999995,67.923309000000131],[-102.94444299999998,67.918868999999916],[-102.939438,67.914429000000098],[-102.92111199999999,67.896378000000141],[-102.82972699999993,67.831940000000031],[-102.80027799999993,67.820830999999998],[-102.68639400000001,67.804703000000131],[-102.67054699999994,67.80304000000001],[-102.53611799999999,67.795258000000047],[-102.50446299999999,67.791931000000091],[-102.47083999999995,67.786926000000051],[-102.446663,67.780273000000079],[-102.39306599999992,67.76249700000011],[-102.33972199999994,67.744705000000067],[-102.25110599999999,67.725266000000147],[-102.22444199999995,67.733871000000022],[-102.21556099999992,67.738312000000121],[-102.15139799999997,67.765549000000021],[-102.1416779999999,67.769150000000081],[-101.92610200000001,67.760268999999994],[-101.76471699999991,67.723312000000135],[-101.671944,67.691649999999981],[-101.54250300000001,67.67942800000003],[-101.51500699999997,67.67942800000003],[-101.446663,67.732483000000116],[-101.43388400000003,67.733322000000044],[-101.10582699999992,67.741928000000144],[-101.09889199999998,67.737762000000089],[-101.01278699999995,67.742477000000122],[-100.99973299999999,67.74331699999999],[-100.92749000000003,67.753325999999959],[-100.90387699999991,67.756942999999922],[-100.89277600000003,67.759720000000016],[-100.81139400000001,67.794708000000014],[-100.72028399999994,67.834427000000119],[-100.58167999999995,67.834152000000131],[-100.39555399999995,67.847488000000055],[-100.18415799999997,67.843048000000067],[-100.16832699999998,67.841095000000109],[-100.156387,67.837769000000037],[-100.14723200000003,67.828598000000113],[-100.135559,67.825272000000098],[-100.083618,67.814986999999974],[-99.820006999999919,67.795821999999987],[-99.618606999999997,67.789153999999996],[-99.607772999999952,67.791931000000091],[-99.589172000000019,67.800812000000064],[-99.577788999999996,67.803314000000114],[-99.500564999999938,67.799713000000054],[-99.412215999999887,67.788315000000068],[-99.403060999999923,67.784424000000001],[-99.398620999999991,67.779983999999956],[-99.396666999999979,67.774994000000106],[-99.387787000000003,67.765822999999955],[-99.378325999999959,67.761932000000058],[-99.236114999999984,67.713608000000136],[-99.21055599999994,67.706940000000145],[-98.986938000000009,67.718322999999998],[-98.813613999999973,67.741928000000144],[-98.528884999999889,67.777481000000023],[-98.385833999999988,67.785812000000078],[-98.363327000000027,67.790817000000118],[-98.354445999999996,67.796097000000032],[-98.358046999999942,67.805817000000104],[-98.442490000000021,67.861374000000069],[-98.449431999999945,67.865814000000057],[-98.463333000000034,67.868865999999969],[-98.475554999999986,67.867203000000075],[-98.486114999999927,67.863876000000118],[-98.49888599999997,67.863312000000008],[-98.514724999999942,67.865265000000136],[-98.540282999999988,67.872208000000114],[-98.65583799999996,67.916382000000056],[-98.665008999999998,67.920258000000103],[-98.696944999999914,67.936645999999996],[-98.719726999999921,67.948867999999948],[-98.724166999999852,67.953598],[-98.746947999999975,68.047760000000096],[-98.732772999999952,68.070267000000001],[-98.615554999999915,68.074706999999989],[-98.544998000000021,68.061371000000065],[-98.336945000000014,67.96026599999999],[-98.321121000000005,67.952208999999982],[-98.266952999999887,67.923309000000131],[-98.233321999999987,67.901932000000102],[-98.171111999999994,67.843323000000055],[-98.169158999999922,67.838593000000003],[-98.122771999999941,67.788040000000024],[-98.094451999999933,67.766098],[-97.956664999999873,67.727768000000083],[-97.799438000000009,67.68553200000008],[-97.66194200000001,67.643051000000071],[-97.650283999999999,67.639434999999992],[-97.637512000000015,67.6308140000001],[-97.626099000000011,67.618042000000059],[-97.613051999999982,67.609420999999998],[-97.603881999999999,67.605255000000056],[-97.592772999999852,67.601653999999996],[-97.576674999999966,67.598602000000085],[-97.561385999999914,67.596649000000127],[-97.547501000000011,67.596375000000023],[-97.509734999999921,67.599152000000117],[-97.48582499999992,67.602203000000145],[-97.415008999999998,67.613312000000064],[-97.392226999999991,67.618042000000059],[-97.381942999999978,67.621368000000132],[-97.353058000000033,67.634430000000123],[-97.33444199999991,67.643875000000037],[-97.316665999999941,67.654434000000037],[-97.295546999999942,67.661102000000028],[-97.283324999999991,67.662491000000045],[-97.167220999999927,67.675537000000134],[-97.138900999999919,67.674149000000057],[-97.116942999999878,67.777481000000023],[-97.115828999999962,67.78276100000005],[-97.119155999999919,67.792480000000069],[-97.127212999999983,67.801650999999993],[-97.240279999999984,67.926086000000055],[-97.254180999999903,67.929428000000144],[-97.263061999999934,67.924149],[-97.268889999999942,67.918319999999994],[-97.27305599999994,67.907761000000107],[-97.273620999999991,67.90248100000008],[-97.277221999999938,67.896942000000081],[-97.282776000000013,67.891098000000056],[-97.291107000000011,67.884995000000117],[-97.301392000000021,67.881652999999972],[-97.324447999999961,67.876648000000102],[-97.336670000000026,67.875259000000142],[-97.362503000000004,67.873871000000008],[-97.376388999999961,67.874146000000053],[-97.392226999999991,67.876373000000115],[-97.403335999999967,67.879974000000004],[-97.412216000000001,67.884155000000078],[-97.416397000000018,67.888596000000007],[-97.41972399999986,67.898331000000042],[-97.428054999999858,67.907761000000107],[-97.434433000000013,67.911926000000108],[-97.449996999999996,67.920258000000103],[-97.643616000000009,68.008330999999998],[-97.652495999999985,68.012207000000046],[-97.683060000000012,68.018599999999992],[-97.695267000000001,68.017212000000086],[-97.705001999999979,68.012772000000098],[-97.708344000000011,68.007217000000026],[-97.710555999999997,67.991653000000099],[-97.87777699999998,67.963608000000079],[-97.996657999999911,67.950271999999984],[-98.009734999999921,67.949707000000103],[-98.029998999999975,67.941924999999969],[-98.045837000000006,67.929428000000144],[-98.051391999999964,67.923598999999967],[-98.057495000000017,67.912490999999989],[-98.060271999999998,67.891663000000108],[-98.063888999999961,67.829162999999937],[-98.078613000000018,67.830276000000026],[-98.095276000000013,67.833327999999938],[-98.106658999999979,67.836928999999998],[-98.115828999999962,67.840820000000065],[-98.176392000000021,67.873871000000008],[-98.189437999999996,67.882476999999938],[-98.194716999999969,67.897217000000069],[-98.200835999999981,67.906647000000135],[-98.213622999999984,67.920532000000037],[-98.224716000000001,67.929428000000144],[-98.25140399999998,67.946365000000014],[-98.283324999999934,67.962768999999923],[-98.319732999999928,67.978591999999992],[-98.34056099999998,67.986099000000081],[-98.378051999999968,67.996368000000132],[-98.398620999999991,68.004165999999998],[-98.412216000000001,68.012497000000053],[-98.581115999999952,68.139984000000027],[-98.587509000000011,68.149429000000112],[-98.58444199999991,68.154984000000013],[-98.485275000000001,68.184417999999994],[-98.473891999999978,68.186920000000043],[-98.459732000000031,68.183594000000028],[-98.450561999999991,68.179703000000131],[-98.432495000000017,68.166656000000103],[-98.428054999999915,68.162201000000096],[-98.424437999999952,68.152205999999978],[-98.425551999999925,68.141936999999984],[-98.428329000000019,68.136383000000137],[-98.434158000000025,68.130538999999942],[-98.44027699999998,68.119431000000134],[-98.441100999999946,68.10914600000001],[-98.439437999999996,68.104155999999989],[-98.430556999999908,68.094986000000119],[-98.417220999999927,68.08638000000002],[-98.408051,68.082489000000123],[-98.393889999999999,68.079163000000108],[-98.379990000000021,68.079163000000108],[-98.367767000000015,68.080551000000014],[-98.358886999999982,68.085814999999968],[-98.350829999999917,68.092209000000025],[-98.339721999999938,68.103867000000037],[-98.321670999999981,68.136932000000115],[-98.317779999999971,68.14776599999999],[-98.317229999999938,68.153046000000018],[-98.317504999999983,68.162201000000096],[-98.326110999999969,68.171371000000136],[-98.333068999999966,68.17553700000002],[-98.342223999999931,68.179428000000087],[-98.377486999999917,68.190262000000018],[-98.40834000000001,68.196640000000116],[-98.439712999999927,68.200821000000019],[-98.469727000000034,68.203049000000021],[-98.485275000000001,68.204987000000131],[-98.501113999999973,68.208602999999982],[-98.531113000000005,68.22526600000009],[-98.537780999999995,68.229431000000091],[-98.542220999999927,68.234146000000123],[-98.561110999999983,68.27388000000002],[-98.607772999999952,68.293319999999994],[-98.704178000000013,68.352768000000026],[-98.710830999999985,68.356934000000081],[-98.715285999999992,68.361648999999943],[-98.717223999999931,68.366378999999995],[-98.71444699999995,68.372208000000001],[-98.704726999999934,68.376373000000001],[-98.680557000000022,68.380539000000113],[-98.667496000000028,68.381363000000079],[-98.637221999999952,68.379150000000095],[-98.606383999999991,68.372756999999979],[-98.594161999999983,68.36914100000007],[-98.580565999999919,68.360809000000074],[-98.571670999999981,68.351654000000053],[-98.548614999999984,68.339157000000057],[-98.532501000000025,68.331100000000106],[-98.521392999999932,68.328323000000012],[-98.511397999999929,68.329711999999972],[-98.470839999999953,68.348327999999981],[-98.462218999999948,68.353591999999992],[-98.461394999999982,68.358871000000136],[-98.471389999999985,68.373596000000077],[-98.491942999999935,68.38638300000008],[-98.503615999999965,68.38998400000014],[-98.49499499999996,68.409424000000115],[-98.319457999999997,68.358871000000136],[-98.30972300000002,68.354980000000069],[-98.298889000000031,68.346100000000035],[-98.294448999999929,68.34137000000004],[-98.292495999999971,68.336655000000007],[-98.288329999999974,68.331940000000145],[-98.281386999999995,68.327774000000034],[-98.225554999999929,68.304152999999985],[-98.213897999999915,68.300537000000134],[-98.199722000000008,68.300262000000089],[-98.187499999999943,68.301926000000094],[-98.096663999999976,68.317764000000125],[-98.073897999999986,68.334990999999945],[-97.905838000000017,68.384155000000135],[-97.894118999999932,68.386459000000002],[-97.86471599999993,68.384995000000004],[-97.849166999999909,68.383040999999992],[-97.777785999999878,68.366378999999995],[-97.761123999999995,68.363312000000064],[-97.748885999999914,68.364699999999971],[-97.743056999999908,68.370528999999976],[-97.75140399999998,68.379700000000128],[-97.764174999999909,68.393600000000049],[-97.768616000000009,68.398041000000148],[-97.781951999999933,68.406647000000021],[-97.79611199999988,68.409988000000055],[-97.81138599999997,68.411377000000073],[-97.869719999999973,68.414153999999996],[-97.885559000000001,68.416382000000112],[-97.899993999999936,68.419707999999957],[-97.906386999999995,68.423874000000069],[-98.009734999999921,68.498032000000023],[-98.011397999999929,68.503052000000082],[-98.010833999999988,68.508041000000048],[-97.999725000000012,68.535262999999986],[-97.994155999999919,68.541091999999992],[-97.852492999999981,68.542480000000069],[-97.836394999999925,68.540268000000026],[-97.723891999999921,68.523041000000035],[-97.692764000000011,68.516663000000051],[-97.665008999999941,68.504715000000033],[-97.658339999999896,68.500549000000092],[-97.654174999999896,68.496094000000085],[-97.650557999999933,68.486098999999967],[-97.653884999999946,68.480545000000006],[-97.655272999999966,68.470260999999994],[-97.650283999999999,68.455551000000014],[-97.646118000000001,68.450820999999962],[-97.639175000000023,68.446640000000059],[-97.611663999999962,68.434708000000114],[-97.537780999999995,68.418320000000051],[-97.523055999999997,68.416931000000091],[-97.511123999999938,68.419434000000024],[-97.502228000000002,68.424698000000035],[-97.49888599999997,68.430267000000015],[-97.500564999999995,68.434982000000048],[-97.509170999999981,68.444427000000132],[-97.520554000000004,68.448029000000076],[-97.535552999999993,68.449141999999995],[-97.547501000000011,68.446640000000059],[-97.573333999999932,68.444427000000132],[-97.589171999999962,68.446640000000059],[-97.603332999999964,68.449996999999996],[-97.615004999999996,68.453598000000056],[-97.619155999999919,68.458328000000108],[-97.617767000000015,68.462493999999992],[-97.597778000000005,68.483597000000088],[-97.578613000000018,68.493042000000003],[-97.567779999999971,68.496368000000018],[-97.544448999999986,68.501389000000131],[-97.531112999999948,68.501938000000109],[-97.516952999999944,68.501663000000065],[-97.385559000000001,68.495254999999929],[-97.353606999999954,68.491089000000045],[-97.282776000000013,68.474152000000061],[-97.259170999999867,68.466660000000104],[-97.160278000000005,68.389435000000049],[-97.053329000000019,68.353316999999947],[-97.058334000000002,68.302765000000079],[-97.070007000000032,68.300262000000089],[-97.075835999999924,68.294433999999967],[-97.091110000000015,68.268051000000014],[-97.089447000000007,68.263320999999962],[-97.080291999999929,68.259155000000078],[-96.939162999999951,68.239700000000084],[-96.925003000000004,68.239150999999993],[-96.912505999999951,68.240814000000057],[-96.817779999999914,68.258331000000112],[-96.806380999999931,68.260818000000029],[-96.799438000000009,68.265548999999965],[-96.767775999999969,68.270263999999997],[-96.693877999999927,68.280272999999966],[-96.680556999999965,68.280822999999998],[-96.669158999999979,68.276931999999931],[-96.625274999999874,68.251663000000121],[-96.553328999999962,68.273605000000032],[-96.533066000000019,68.281936999999971],[-96.47084000000001,68.305542000000003],[-96.448883000000023,68.312194999999974],[-96.437209999999993,68.314697000000024],[-96.42471299999994,68.316086000000041],[-96.410552999999993,68.315536000000009],[-96.404174999999952,68.311371000000008],[-96.496947999999975,68.207764000000054],[-96.508895999999993,68.196365000000128],[-96.525832999999977,68.184142999999949],[-96.623046999999985,68.115540000000067],[-96.690551999999968,68.079987000000074],[-96.702224999999999,68.077484000000084],[-96.730285999999921,68.078323000000069],[-96.743057000000022,68.07777400000009],[-96.75556899999998,68.076096000000007],[-96.778884999999946,68.071380999999974],[-96.797225999999966,68.06109600000002],[-96.808883999999978,68.04942299999999],[-96.812209999999936,68.043869000000029],[-96.813323999999909,68.038589000000115],[-96.811660999999901,68.033599999999979],[-96.801940999999999,68.025818000000015],[-96.789169000000015,68.017212000000086],[-96.77305599999994,68.013884999999959],[-96.722778000000005,68.009719999999959],[-96.708343999999954,68.008605999999986],[-96.676101999999958,68.018599999999992],[-96.556655999999975,68.033324999999934],[-96.540282999999931,68.030273000000022],[-96.52806099999998,68.03166200000004],[-96.466399999999965,68.038879000000122],[-96.450835999999981,68.053040000000124],[-96.479996000000028,68.090271000000087],[-96.49110399999995,68.094147000000135],[-96.505004999999926,68.094436999999971],[-96.516113000000018,68.091095000000053],[-96.53443900000002,68.080826000000002],[-96.546950999999979,68.079437000000041],[-96.548339999999996,68.084152000000074],[-96.547501000000011,68.089432000000102],[-96.535277999999892,68.101089000000059],[-96.510009999999966,68.119431000000134],[-96.482498000000021,68.134720000000016],[-96.463057999999933,68.144149999999911],[-96.432220000000029,68.156097000000045],[-96.31082200000003,68.192200000000128],[-96.288329999999974,68.197754000000089],[-96.171386999999925,68.221649000000127],[-96.136123999999938,68.228592000000106],[-95.980285999999978,68.254715000000033],[-95.968338000000017,68.230820000000051],[-96.043334999999956,68.179428000000087],[-96.069167999999991,68.16137700000013],[-96.075012000000015,68.155548000000124],[-96.078612999999962,68.149994000000106],[-96.077498999999989,68.144989000000066],[-96.073623999999995,68.140274000000034],[-96.045837000000006,68.133331000000055],[-96.03443900000002,68.129700000000014],[-96.02806099999998,68.125259000000085],[-96.020553999999947,68.116089000000045],[-96.01916499999993,68.111098999999967],[-96.020279000000016,68.106094000000098],[-96.083618000000001,68.00221300000004],[-96.144164999999987,67.923598999999967],[-96.211669999999913,67.829162999999937],[-96.215285999999878,67.823608000000036],[-96.217223999999987,67.813309000000061],[-96.221389999999985,67.697754000000032],[-96.220000999999911,67.693038999999999],[-96.212508999999955,67.683868000000075],[-96.206116000000009,67.67942800000003],[-96.195540999999992,67.682754999999986],[-96.186934999999949,67.688873000000115],[-96.179717999999923,67.692748999999992],[-96.168335000000013,67.694977000000108],[-96.166655999999989,67.690262000000075],[-96.174712999999997,67.643051000000071],[-96.185271999999941,67.626373000000001],[-96.191939999999988,67.62164300000012],[-96.203339000000028,67.61914100000007],[-96.216400000000021,67.618591000000038],[-96.230834999999956,67.619979999999998],[-96.246657999999968,67.623306000000071],[-96.257781999999963,67.626923000000033],[-96.266402999999968,67.631088000000034],[-96.329726999999991,67.610260000000096],[-96.437774999999931,67.541367000000037],[-96.461394999999925,67.508880999999917],[-96.464721999999881,67.503326000000015],[-96.469161999999983,67.492751999999996],[-96.464721999999881,67.478043000000127],[-96.461120999999991,67.473312000000021],[-96.451675000000023,67.471374999999966],[-96.441939999999931,67.475540000000137],[-96.363892000000021,67.478043000000127],[-96.294158999999979,67.444702000000007],[-96.222778000000005,67.421920999999941],[-96.210006999999962,67.419144000000074],[-96.196380999999917,67.418869000000029],[-96.185821999999973,67.422211000000004],[-96.158051,67.43664600000011],[-96.141388000000006,67.448868000000061],[-96.135559000000001,67.454712000000086],[-96.118880999999931,67.466660000000104],[-96.107498000000021,67.469147000000021],[-96.09722899999997,67.464706000000092],[-96.069457999999997,67.433593999999971],[-96.070281999999963,67.428314000000114],[-96.124161000000015,67.377196999999967],[-96.166655999999989,67.341660000000047],[-96.177215999999873,67.336929000000112],[-96.208618000000001,67.326935000000105],[-96.218613000000005,67.322768999999994],[-96.226944000000003,67.316666000000055],[-96.251113999999916,67.25277699999998],[-96.252228000000002,67.247482000000048],[-96.243606999999884,67.243317000000047],[-96.129990000000021,67.21665999999999],[-96.114440999999999,67.213318000000072],[-96.102492999999981,67.214705999999978],[-96.091384999999946,67.217209000000139],[-95.921111999999994,67.278595000000053],[-95.817504999999926,67.331940000000145],[-95.756393000000003,67.367477000000065],[-95.739990000000034,67.376648000000046],[-95.603057999999919,67.383330999999998],[-95.58944699999995,67.383040999999992],[-95.576949999999954,67.380264000000068],[-95.565825999999959,67.376648000000046],[-95.549163999999962,67.368316999999934],[-95.53472899999997,67.359984999999995],[-95.528610000000015,67.35554500000012],[-95.525008999999955,67.351089000000059],[-95.553328999999962,67.313309000000118],[-95.561660999999958,67.307205000000124],[-95.618056999999965,67.278320000000065],[-95.638061999999991,67.270828000000108],[-95.677489999999977,67.254166000000112],[-95.696654999999964,67.244979999999998],[-95.763061999999877,67.212769000000094],[-95.807495000000017,67.186096000000134],[-95.823897999999986,67.174149],[-95.829726999999991,67.168319999999937],[-95.833327999999938,67.162766000000147],[-95.821670999999924,67.161102000000142],[-95.796951000000035,67.16304000000008],[-95.774719000000005,67.167755000000113],[-95.74221799999998,67.176651000000049],[-95.712218999999948,67.188309000000061],[-95.651397999999915,67.198868000000118],[-95.568893000000003,67.210541000000148],[-95.544158999999922,67.212494000000106],[-95.515839000000028,67.209717000000012],[-95.501113999999973,67.20748900000001],[-95.435546999999929,67.193863000000079],[-95.379439999999931,67.154708999999968],[-95.326110999999969,67.027205999999978],[-95.328613000000018,67.016937000000098],[-95.337218999999948,66.99054000000001],[-95.34333799999996,66.974701000000096],[-95.350280999999882,66.963882000000069],[-95.357773000000009,66.959991000000002],[-95.416396999999961,66.951935000000105],[-95.53472899999997,66.941086000000041],[-95.597778000000005,66.948868000000004],[-95.614166000000012,66.970261000000107],[-95.721114999999998,66.964706000000035],[-95.743331999999953,66.959991000000002],[-95.839171999999962,66.94802900000002],[-95.876099000000011,66.945816000000036],[-95.902495999999985,66.946640000000002],[-95.928054999999972,66.952484000000027],[-95.93638599999997,66.956649999999968],[-95.990279999999984,67.004990000000134],[-95.993880999999931,67.009720000000016],[-95.990554999999915,67.014998999999989],[-95.978881999999999,67.026657],[-95.961120999999991,67.043869000000029],[-95.93638599999997,67.065262000000132],[-95.932219999999973,67.069716999999969],[-95.946945000000028,67.072220000000129],[-95.958344000000011,67.069716999999969],[-95.967772999999909,67.065536000000066],[-96.004456000000005,67.045821999999987],[-96.046111999999937,67.016387999999949],[-96.051665999999955,67.010818000000086],[-96.053878999999995,67.000275000000101],[-96.046660999999972,66.991088999999988],[-96.040558000000033,66.986648999999943],[-96.023620999999935,66.978591999999992],[-96.025008999999955,66.973312000000135],[-96.033066000000019,66.967484000000013],[-96.042770000000019,66.963043000000084],[-96.110549999999932,66.950821000000133],[-96.12332200000003,66.950271999999984],[-96.138610999999912,66.953598],[-96.240828999999962,66.983597000000032],[-96.262512000000015,66.991088999999988],[-96.279175000000009,66.999145999999939],[-96.285278000000005,67.003600999999946],[-96.286941999999954,67.008606000000043],[-96.285827999999981,67.013611000000083],[-96.274170000000026,67.025269000000094],[-96.265288999999996,67.030548000000067],[-96.261947999999961,67.035812000000078],[-96.261123999999995,67.041092000000106],[-96.263625999999988,67.051086000000112],[-96.268889999999885,67.06053200000008],[-96.288054999999929,67.068329000000062],[-96.37721299999987,67.084717000000126],[-96.392226999999991,67.086928999999998],[-96.403884999999946,67.085541000000092],[-96.452498999999989,67.068329000000062],[-96.460555999999883,67.062195000000031],[-96.456664999999987,67.057754999999986],[-96.403884999999946,67.008330999999998],[-96.273620999999991,66.950271999999984],[-96.146392999999989,66.894714000000135],[-96.128051999999968,66.881653000000028],[-96.11721799999998,66.867752000000053],[-96.115829000000019,66.862761999999975],[-96.11721799999998,66.857483000000002],[-96.116652999999985,66.847488000000055],[-96.115554999999972,66.842484000000127],[-96.114165999999898,66.837494000000049],[-96.108886999999982,66.832764000000054],[-96.100554999999929,66.828598000000113],[-96.006667999999934,66.794434000000081],[-95.980559999999912,66.787491000000102],[-95.956115999999952,66.782211000000075],[-95.912215999999944,66.775543000000084],[-95.883621000000005,66.768875000000094],[-95.862212999999997,66.761107999999979],[-95.848052999999993,66.752777000000037],[-95.841948999999943,66.74832200000003],[-95.784728999999913,66.674149000000057],[-95.777495999999985,66.654984000000127],[-95.777221999999881,66.644714000000022],[-95.780838000000017,66.629150000000095],[-95.741378999999938,66.638046000000031],[-95.656386999999995,66.6602630000001],[-95.646666999999979,66.664428999999984],[-95.629714999999976,66.675536999999963],[-95.627486999999974,66.68609600000002],[-95.648894999999982,66.724152000000004],[-95.652221999999995,66.728592000000049],[-95.660552999999993,66.732757999999933],[-95.674437999999896,66.734146000000067],[-95.784728999999913,66.737198000000149],[-95.993056999999965,66.84275800000006],[-96.087783999999999,66.907486000000119],[-96.091674999999896,66.911925999999994],[-96.092772999999966,66.916931000000034],[-96.091674999999896,66.922211000000061],[-96.08555599999994,66.926926000000094],[-96.066956000000005,66.936371000000008],[-96.047500999999954,66.944702000000063],[-96.037216000000001,66.94802900000002],[-96.026108000000022,66.950271999999984],[-96.000290000000007,66.950546000000088],[-95.902495999999985,66.946640000000002],[-95.814437999999996,66.941360000000145],[-95.785004000000015,66.93691999999993],[-95.772780999999952,66.932754999999929],[-95.766662999999994,66.928314],[-95.763061999999877,66.923874000000012],[-95.760559000000001,66.913879000000065],[-95.756957999999997,66.90914900000007],[-95.75111400000003,66.90498400000007],[-95.738051999999982,66.901382000000126],[-95.724715999999944,66.900817999999958],[-95.516662999999994,66.902206000000092],[-95.493057000000022,66.90498400000007],[-95.472228999999913,66.911652000000061],[-95.389175000000023,66.911102000000028],[-95.336669999999913,66.893051000000014],[-95.323623999999882,66.889434999999992],[-95.311385999999914,66.889984000000084],[-95.300827000000027,66.893326000000059],[-95.291672000000005,66.898331000000098],[-95.267501999999979,66.91415400000011],[-95.259170999999981,66.920257999999933],[-95.220839999999896,66.968322999999941],[-95.21945199999999,66.973602000000142],[-95.226394999999968,66.982758000000103],[-95.232223999999974,66.987198000000092],[-95.289443999999946,67.024994000000049],[-95.345000999999968,67.084427000000119],[-95.352218999999991,67.148331000000042],[-95.346389999999985,67.15387000000004],[-95.266112999999905,67.212769000000094],[-95.166107000000011,67.276931999999988],[-95.162216000000001,67.282211000000132],[-95.163329999999974,67.287200999999982],[-95.171936000000017,67.291367000000093],[-95.18249499999996,67.29525799999999],[-95.217223999999931,67.306366000000139],[-95.279723999999874,67.319442999999978],[-95.306380999999874,67.326660000000061],[-95.314712999999927,67.330550999999957],[-95.332779000000016,67.34387200000009],[-95.336394999999982,67.348328000000038],[-95.384170999999981,67.444138000000009],[-95.339995999999928,67.499709999999993],[-95.331679999999949,67.505829000000006],[-95.324172999999917,67.516663000000051],[-95.321670999999924,67.527206000000035],[-95.323058999999944,67.531936999999971],[-95.330001999999922,67.541367000000037],[-95.343613000000005,67.554977000000122],[-95.34973100000002,67.559417999999994],[-95.466400000000021,67.637207000000046],[-95.492492999999968,67.643326000000059],[-95.535003999999958,67.646652000000074],[-95.548339999999996,67.649994000000049],[-95.693054000000018,67.704436999999984],[-95.707779000000016,67.723038000000031],[-95.709166999999923,67.727768000000083],[-95.708053999999947,67.733047000000056],[-95.704453000000001,67.738586000000055],[-95.698333999999988,67.744431000000134],[-95.68110699999994,67.756378000000097],[-95.671936000000017,67.761657999999954],[-95.64973399999991,67.767211999999972],[-95.637511999999958,67.768600000000049],[-95.626388999999961,67.771927000000005],[-95.577498999999989,67.787491000000102],[-95.558883999999978,67.797759999999926],[-95.550277999999878,67.803863999999976],[-95.544158999999922,67.809708000000001],[-95.53443900000002,67.820830999999998],[-95.525833000000034,67.836928999999998],[-95.522231999999974,67.852767999999969],[-95.527221999999995,67.872208000000114],[-95.452224999999999,67.981094000000041],[-95.416945999999996,68.027771000000143],[-95.42721599999993,68.032486000000006],[-95.47193900000002,68.054977000000008],[-95.475280999999939,68.058319000000097],[-95.472777999999948,68.06053200000008],[-95.461394999999868,68.063873000000115],[-95.404175000000009,68.069443000000035],[-95.34973100000002,68.074432000000002],[-95.343063000000029,68.074432000000002],[-95.075561999999877,68.068877999999984],[-95.071120999999948,68.063599000000011],[-95.065276999999924,68.060257000000036],[-95.054992999999911,68.055251999999996],[-95.043883999999935,68.051376000000118],[-95.023620999999991,68.04582199999993],[-95.008895999999936,68.044434000000024],[-94.86721799999998,68.034149000000127],[-94.839721999999938,68.034149000000127],[-94.788054999999986,68.040543000000127],[-94.72222899999997,68.054977000000008],[-94.714172000000019,68.059418000000107],[-94.707503999999972,68.065811000000053],[-94.696654999999964,68.078598000000056],[-94.693877999999984,68.083328000000108],[-94.604995999999971,68.139708999999982],[-94.37249799999995,68.221375000000023],[-94.210555999999997,68.262772000000041],[-94.199157999999954,68.267761000000007],[-94.193603999999993,68.272217000000069],[-94.192214999999976,68.276382000000069],[-94.191665999999941,68.281372000000147],[-94.192489999999907,68.292206000000022],[-94.193603999999993,68.298325000000034],[-94.205275999999913,68.313309000000118],[-94.209166999999979,68.323607999999979],[-94.210280999999952,68.328049000000078],[-94.210830999999985,68.361374000000126],[-94.208054000000004,68.366088999999988],[-94.203888000000006,68.370255000000043],[-94.123046999999985,68.416931000000091],[-94.104720999999984,68.424149000000057],[-94.00028999999995,68.460815000000025],[-93.968063000000029,68.468596999999932],[-93.953613000000018,68.471924000000058],[-93.936661000000015,68.474700999999982],[-93.922774999999945,68.475540000000137],[-93.893615999999952,68.474700999999982],[-93.875823999999909,68.477203000000031],[-93.81138599999997,68.488037000000134],[-93.661391999999978,68.520828000000051],[-93.656661999999983,68.523315000000139],[-93.619155999999975,68.544144000000074],[-93.553329000000019,68.586380000000077],[-93.559722999999963,68.611649000000114],[-93.621933000000013,68.624419999999986],[-93.647507000000019,68.626923000000147],[-93.65306099999998,68.626373000000115],[-93.705276000000026,68.657211000000132],[-93.697220000000016,68.749145999999939],[-93.695267000000001,68.751938000000052],[-93.639450000000011,68.780548000000067],[-93.571670999999924,68.834152000000074],[-93.567504999999926,68.839706000000092],[-93.566100999999946,68.849425999999994],[-93.634444999999971,68.959152000000131],[-93.642226999999934,68.963882000000012],[-93.666945999999996,68.972214000000008],[-93.731383999999991,68.974991000000102],[-93.925551999999868,68.974701000000039],[-94.030838000000017,68.918594000000098],[-94.039169000000015,68.914154000000053],[-94.055832000000009,68.901932000000102],[-94.068893000000003,68.891098000000056],[-94.079726999999991,68.847488000000055],[-94.071120999999891,68.843596999999988],[-94.034164000000033,68.833328000000108],[-94.021118000000001,68.836105000000032],[-93.933884000000035,68.855255],[-93.852492999999981,68.879149999999981],[-93.838607999999965,68.885268999999994],[-93.837783999999999,68.886383000000023],[-93.824722000000008,68.891373000000044],[-93.813889000000017,68.893050999999957],[-93.80999799999995,68.890549000000078],[-93.813889000000017,68.88499500000006],[-93.829726999999934,68.876083000000051],[-93.934157999999968,68.824997000000053],[-94.085006999999962,68.761108000000092],[-94.095276000000013,68.758040999999992],[-94.108046999999999,68.755264000000068],[-94.15972899999997,68.747756999999979],[-94.385559000000001,68.729155999999932],[-94.490828999999962,68.728867000000037],[-94.625,68.761383000000137],[-94.608886999999925,68.819443000000035],[-94.588897999999915,68.841370000000097],[-94.583327999999938,68.845825000000104],[-94.570847000000015,68.850266000000033],[-94.561661000000015,68.855255],[-94.556106999999997,68.859985000000052],[-94.553054999999972,68.864425999999924],[-94.545273000000009,68.884720000000073],[-94.548049999999932,68.888885000000073],[-94.557495000000017,68.893050999999957],[-94.569457999999941,68.893600000000106],[-94.577224999999999,68.896652000000017],[-94.585555999999997,68.903046000000074],[-94.589995999999985,68.908325000000048],[-94.605835000000013,68.951096000000064],[-94.604172000000005,68.961929000000055],[-94.599166999999966,68.965546000000018],[-94.587219000000005,68.968872000000033],[-94.553329000000019,68.973877000000073],[-94.37388599999997,69.003052000000139],[-94.224166999999966,69.027771000000143],[-94.163054999999986,69.052200000000084],[-94.151397999999972,69.057205000000124],[-94.072784000000013,69.126648000000046],[-94.072509999999966,69.144989000000066],[-94.137511999999901,69.131927000000019],[-94.22084000000001,69.1202550000001],[-94.235001000000011,69.119431000000134],[-94.248336999999935,69.120529000000033],[-94.312209999999993,69.144989000000066],[-94.323058999999944,69.149994000000106],[-94.327498999999989,69.15525800000006],[-94.329177999999899,69.16137700000013],[-94.309433000000013,69.294144000000131],[-94.306655999999975,69.300262000000089],[-94.303328999999962,69.304977000000122],[-94.291672000000005,69.313873000000058],[-94.284163999999976,69.318878000000097],[-94.259170999999924,69.326660000000061],[-94.166655999999989,69.342483999999956],[-94.043335000000013,69.357483000000059],[-94.025009000000011,69.359711000000004],[-93.955276000000026,69.362762000000032],[-93.736664000000019,69.399994000000049],[-93.626937999999939,69.432479999999941],[-93.574721999999952,69.441650000000038],[-93.562774999999988,69.442748999999992],[-93.526397999999915,69.438309000000004],[-93.532501000000025,69.429977000000008],[-93.547774999999945,69.420532000000094],[-93.67971799999998,69.347762999999929],[-93.691665999999941,69.34275800000006],[-93.741378999999995,69.324432000000058],[-93.753066999999987,69.320540999999992],[-93.764174999999966,69.320540999999992],[-93.828612999999962,69.265549000000078],[-93.856110000000001,69.176926000000037],[-93.856658999999979,69.172211000000004],[-93.845001000000025,69.164992999999981],[-93.837218999999891,69.164429000000041],[-93.634734999999978,69.251663000000121],[-93.467498999999918,69.317490000000021],[-93.456664999999987,69.323043999999982],[-93.362777999999992,69.37164300000012],[-93.365279999999984,69.376082999999994],[-93.379439999999988,69.376373000000001],[-93.459166999999866,69.359711000000004],[-93.470001000000025,69.356644000000074],[-93.478057999999976,69.353317000000118],[-93.498046999999985,69.349152000000117],[-93.511947999999961,69.349426000000051],[-93.565001999999936,69.367752000000053],[-93.560546999999929,69.383881000000031],[-93.538054999999929,69.410538000000088],[-93.527221999999995,69.421646000000067],[-93.515839000000028,69.425537000000134],[-93.503066999999874,69.427475000000072],[-93.488892000000021,69.434982000000048],[-93.439437999999939,69.475265999999976],[-93.441375999999991,69.48054499999995],[-93.487777999999992,69.502777000000037],[-93.509734999999921,69.513046000000088],[-93.532501000000025,69.521103000000039],[-93.540833000000021,69.523315000000082],[-93.587219000000005,69.528046000000018],[-93.621933000000013,69.527205999999978],[-93.683883999999978,69.522217000000012],[-93.709732000000031,69.516098],[-93.808884000000035,69.488876000000062],[-93.869719999999973,69.451660000000118],[-94.045272999999952,69.439148000000102],[-94.279175000000009,69.440262000000075],[-94.299728000000016,69.443038999999999],[-94.313048999999978,69.446640000000059],[-94.343886999999938,69.459152000000074],[-94.451674999999966,69.518600000000049],[-94.502501999999993,69.556366000000025],[-94.591948999999943,69.637206999999989],[-94.629439999999988,69.683044000000052],[-94.670273000000009,69.677475000000072],[-94.712783999999999,69.67164600000001],[-94.749435000000005,69.663605000000132],[-94.755004999999926,69.661652000000004],[-94.764174999999966,69.65498400000007],[-94.766662999999937,69.651093000000003],[-94.762222000000008,69.644714000000135],[-94.742217999999923,69.628311000000053],[-94.724441999999954,69.61442599999998],[-94.725554999999929,69.608597000000145],[-94.730835000000013,69.602767999999969],[-94.740279999999984,69.597488000000055],[-94.769729999999981,69.583054000000061],[-94.801101999999901,69.572219999999959],[-94.820007000000032,69.56721500000009],[-94.831116000000009,69.56581100000011],[-94.846664000000033,69.565536000000122],[-94.862777999999878,69.566940000000102],[-94.951950000000011,69.584427000000119],[-95.010558999999944,69.603043000000127],[-95,69.618865999999969],[-95.009444999999971,69.621643000000063],[-95.021118000000001,69.621643000000063],[-95.078612999999962,69.616379000000109],[-95.168609999999887,69.630538999999999],[-95.396118000000001,69.678864000000033],[-95.40834000000001,69.681931000000134],[-95.423049999999932,69.686096000000134],[-95.544997999999964,69.726929000000041],[-95.648055999999997,69.780273000000022],[-95.71556099999998,69.791366999999923],[-95.724715999999944,69.789978000000133],[-95.728332999999907,69.789153999999996],[-95.738892000000021,69.786102000000028],[-95.757232999999928,69.777205999999921],[-95.758620999999948,69.772766000000104],[-95.86332699999997,69.772216999999955],[-95.960830999999985,69.778045999999961],[-95.975554999999929,69.781937000000028],[-96.020279000000016,69.80442800000003],[-96.035827999999924,69.813873000000115],[-96.074447999999961,69.841934000000037],[-96.087783999999999,69.869141000000127],[-96.082229999999925,69.873596000000134],[-96.085007000000019,69.91137700000013],[-96.097778000000005,69.946639999999945],[-96.116104000000007,69.953872999999987],[-96.177215999999873,69.964705999999921],[-96.195540999999992,69.965546000000018],[-96.198607999999979,69.964995999999985],[-96.209441999999967,69.961655000000121],[-96.217223999999987,69.958327999999995],[-96.220550999999944,69.95748900000001],[-96.235000999999954,69.95748900000001],[-96.246947999999918,69.958878000000027],[-96.257232999999928,69.963043000000027],[-96.272780999999952,69.971099999999979],[-96.38137799999987,70.02748100000008],[-96.402495999999871,70.039978000000076],[-96.459441999999967,70.075546000000088],[-96.500290000000007,70.101379000000009],[-96.509170999999924,70.108597000000032],[-96.525283999999942,70.122756999999979],[-96.531677000000002,70.131088000000034],[-96.55610699999994,70.191925000000083],[-96.568892999999946,70.224425999999994],[-96.571670999999867,70.234421000000054],[-96.570281999999963,70.251099000000124],[-96.568619000000012,70.268600000000106],[-96.562774999999931,70.300262000000032],[-96.558608999999933,70.3119200000001],[-96.555557000000022,70.317490000000134],[-96.548339999999996,70.328872999999987],[-96.535003999999958,70.344147000000078],[-96.294723999999974,70.522491000000116],[-96.232773000000009,70.562195000000031],[-96.078887999999893,70.587494000000049],[-96.069732999999928,70.587769000000037],[-96.045273000000009,70.584152000000074],[-96.041107000000011,70.576934999999992],[-96.033324999999934,70.572769000000108],[-95.995269999999948,70.559707999999944],[-95.93499799999995,70.547485000000108],[-95.92332499999992,70.545258000000047],[-95.806106999999997,70.528869999999984],[-95.797225999999966,70.529434000000094],[-95.789443999999946,70.536652000000117],[-95.791381999999999,70.542755000000056],[-95.799164000000019,70.549149000000114],[-95.855834999999956,70.553314000000114],[-95.914168999999902,70.559417999999937],[-95.931670999999938,70.562195000000031],[-95.96444699999995,70.568878000000041],[-96.000564999999995,70.579987000000074],[-96.049987999999928,70.600266000000033],[-96.058334000000002,70.605820000000051],[-96.061385999999857,70.617203000000018],[-96.055557000000022,70.643050999999957],[-96.048339999999996,70.646942000000024],[-95.952498999999989,70.679702999999961],[-95.848343,70.706940000000088],[-95.815551999999968,70.70915199999996],[-95.817779999999971,70.710265999999933],[-95.901947000000007,70.707764000000054],[-95.932770000000005,70.701096000000064],[-96.115554999999972,70.656097000000102],[-96.138061999999991,70.646378000000084],[-96.149993999999936,70.637206999999989],[-96.152785999999935,70.632477000000108],[-96.154723999999987,70.624694999999974],[-96.153885000000002,70.621643000000063],[-96.158051,70.617476999999951],[-96.160277999999948,70.616379000000052],[-96.16361999999998,70.615540000000124],[-96.202788999999996,70.621643000000063],[-96.376098999999954,70.673035000000027],[-96.385284000000013,70.677765000000022],[-96.394729999999981,70.683594000000028],[-96.401108000000022,70.690536000000122],[-96.410003999999958,70.702484000000027],[-96.415557999999976,70.71527100000003],[-96.422500999999954,70.726089000000002],[-96.43472300000002,70.737198000000035],[-96.446654999999964,70.741928000000087],[-96.53694200000001,70.763321000000019],[-96.580565999999976,70.777480999999909],[-96.603881999999942,70.788040000000137],[-96.611938000000009,70.794434000000024],[-96.61500499999994,70.80442800000003],[-96.61361699999992,70.8211060000001],[-96.601944000000003,70.849990999999989],[-96.591674999999952,70.866928000000144],[-96.578613000000018,70.878035999999952],[-96.571121000000005,70.883040999999992],[-96.545272999999895,70.904983999999956],[-96.53083799999996,70.921371000000136],[-96.52416999999997,70.931656000000032],[-96.513061999999991,70.949707000000046],[-96.510833999999932,70.955826000000059],[-96.503066999999987,70.99693300000007],[-96.495833999999888,71.040268000000083],[-96.481673999999884,71.043319999999994],[-96.450286999999946,71.044983000000116],[-96.414444000000003,71.053589000000045],[-96.406661999999926,71.058594000000085],[-96.369995000000017,71.089981000000023],[-96.371108999999933,71.093048000000124],[-96.375823999999966,71.098037999999974],[-96.40943900000002,71.119431000000077],[-96.417770000000019,71.113602000000071],[-96.420273000000009,71.107208000000014],[-96.412215999999944,71.095824999999991],[-96.410003999999958,71.089705999999978],[-96.413619999999923,71.084152000000017],[-96.421111999999994,71.0816650000001],[-96.440825999999959,71.079163000000051],[-96.461394999999925,71.080551000000128],[-96.476669000000015,71.08526599999999],[-96.50556899999998,71.097214000000008],[-96.538329999999974,71.11303700000002],[-96.552215999999987,71.119980000000055],[-96.560546999999985,71.126373000000001],[-96.559433000000013,71.1308140000001],[-96.553878999999995,71.136932000000058],[-96.548614999999927,71.140548999999965],[-96.467223999999931,71.165267999999969],[-96.457992999999988,71.195564000000047],[-96.462203999999986,71.255501000000038],[-96.504455999999891,71.276093000000117],[-96.503890999999953,71.277205999999978],[-96.488891999999964,71.286102000000085],[-96.278060999999923,71.326384999999959],[-96.24499499999996,71.353866999999923],[-96.21833799999996,71.375809000000004],[-96.193329000000006,71.389984000000084],[-96.168335000000013,71.399993999999992],[-96.134170999999981,71.409714000000065],[-96.046386999999982,71.418045000000006],[-96.027785999999935,71.417755],[-95.926392000000021,71.400542999999971],[-95.893889999999942,71.390823000000069],[-95.882766999999944,71.384155000000078],[-95.878875999999991,71.378586000000098],[-95.878052000000025,71.37303200000008],[-95.878875999999991,71.367203000000075],[-95.859160999999972,71.354980000000012],[-95.830001999999922,71.343048000000067],[-95.792220999999927,71.328049000000021],[-95.673049999999989,71.287491000000102],[-95.658889999999985,71.285537999999974],[-95.551102000000014,71.289978000000019],[-95.535278000000005,71.290816999999947],[-95.455276000000026,71.367751999999996],[-95.451401000000033,71.375809000000004],[-95.547775000000001,71.487762000000032],[-95.779998999999975,71.503875999999991],[-95.832779000000016,71.515823000000125],[-95.936660999999901,71.546646000000123],[-95.943054000000018,71.553589000000102],[-95.908339999999953,71.600540000000137],[-95.895003999999915,71.610535000000027],[-95.889998999999989,71.613312000000121],[-95.877212999999983,71.61831699999999],[-95.863892000000021,71.619430999999963],[-95.812209999999936,71.621918000000051],[-95.744719999999973,71.624145999999996],[-95.678878999999995,71.646378000000084],[-95.539718999999991,71.703597999999943],[-95.399733999999967,71.718597000000045],[-95.301620000000014,71.721099999999979],[-95.289443999999946,71.753601000000117],[-95.289443999999946,71.757491999999957],[-95.288054999999872,71.761932000000002],[-95.285827999999981,71.767212000000086],[-95.239440999999999,71.82249500000006],[-95.226944000000003,71.826660000000061],[-95.073059000000001,71.84137000000004],[-94.890288999999996,71.844711000000075],[-94.856383999999991,71.843322999999998],[-94.838897999999972,71.841094999999996],[-94.795272999999952,71.833328000000051],[-94.744155999999975,71.823044000000039],[-94.73443599999996,71.823317999999972],[-94.716399999999965,71.826096000000121],[-94.653884999999946,71.845261000000107],[-94.612503000000004,71.859711000000004],[-94.606658999999979,71.863312000000064],[-94.607772999999952,71.866378999999995],[-94.615279999999984,71.868866000000082],[-94.629715000000033,71.866928000000144],[-94.65583799999996,71.861923000000104],[-94.706115999999952,71.848038000000031],[-94.743056999999965,71.839432000000102],[-94.756957999999941,71.837493999999936],[-94.775283999999942,71.838882000000069],[-94.783066000000019,71.84137000000004],[-94.826110999999969,71.847487999999998],[-94.853607000000011,71.849426000000108],[-94.903885000000002,71.850266000000147],[-95.102492999999981,71.851089000000002],[-95.119155999999975,71.850266000000147],[-95.157227000000034,71.845825000000048],[-95.179992999999968,71.843048000000124],[-95.180557000000022,71.842208999999968],[-95.192489999999964,71.84137000000004],[-95.213333000000034,71.843048000000124],[-95.231110000000001,71.849152000000004],[-95.240829000000019,71.853867000000037],[-95.25167799999997,71.86053499999997],[-95.256667999999934,71.866928000000144],[-95.255004999999983,71.895537999999988],[-95.222778000000005,71.942200000000071],[-95.217498999999862,71.944976999999994],[-95.201400999999976,71.94720500000011],[-94.97193900000002,71.975814999999955],[-94.741104000000007,71.99192800000003],[-94.698043999999982,71.993590999999924],[-94.661666999999966,71.994980000000112],[-94.579726999999991,71.99693300000007],[-94.56361400000003,71.99693300000007],[-94.530288999999982,71.99443100000002],[-94.499435000000005,71.988037000000134],[-94.487212999999997,71.983322000000101],[-94.393615999999952,71.938309000000004],[-94.387222000000008,71.933868000000075],[-94.388610999999912,71.924149000000114],[-94.460555999999997,71.849426000000108],[-94.47222899999997,71.847214000000065],[-94.506667999999991,71.847762999999986],[-94.521118000000001,71.849990999999932],[-94.539444000000003,71.851379000000065],[-94.562499999999943,71.849990999999932],[-94.574448000000018,71.84693900000002],[-94.64416499999993,71.818329000000006],[-94.61860699999994,71.753326000000072],[-94.611937999999952,71.74971000000005],[-94.599730999999906,71.744704999999954],[-94.594161999999983,71.743317000000047],[-94.569457999999941,71.744979999999998],[-94.555831999999896,71.750000000000057],[-94.538604999999961,71.758331000000112],[-94.536391999999978,71.761108000000036],[-94.528609999999958,71.771378000000141],[-94.519729999999925,71.78915400000011],[-94.497498000000007,71.818329000000006],[-94.48832699999997,71.824158000000011],[-94.484726000000023,71.824706999999933],[-94.392226999999991,71.81442300000009],[-94.366104000000007,71.802475000000072],[-94.356658999999866,71.796371000000022],[-94.354720999999984,71.792479999999955],[-94.389998999999989,71.71775800000006],[-94.419448999999986,71.667205999999965],[-94.423889000000031,71.66137700000013],[-94.418335000000013,71.659987999999942],[-94.40695199999999,71.660812000000135],[-94.368880999999988,71.675262000000032],[-94.267226999999991,71.730820000000051],[-94.258895999999993,71.741928000000087],[-94.255843999999968,71.753876000000105],[-94.242766999999958,71.770828000000108],[-94.228058000000033,71.781661999999983],[-94.207229999999925,71.789428999999927],[-94.194442999999922,71.791931000000034],[-94.181670999999994,71.791931000000034],[-94.036941999999954,71.787200999999982],[-94.023620999999991,71.785812000000021],[-94.014724999999885,71.781096999999988],[-94.008347000000015,71.774993999999992],[-94.006393000000003,71.763321000000019],[-93.993880999999988,71.753052000000139],[-93.972503999999958,71.745818999999983],[-93.942490000000021,71.743590999999981],[-93.909728999999913,71.744979999999998],[-93.888061999999991,71.748322000000087],[-93.871383999999978,71.753052000000139],[-93.850280999999995,71.763321000000019],[-93.830841000000021,71.771652000000074],[-93.818892999999889,71.774703999999986],[-93.802215999999987,71.775542999999971],[-93.784164000000033,71.774155000000064],[-93.741942999999992,71.769150000000025],[-93.726669000000015,71.76638800000012],[-93.71166999999997,71.761383000000023],[-93.707229999999925,71.754990000000078],[-93.694153000000028,71.716095000000109],[-93.696655000000021,71.710815000000082],[-93.704452999999944,71.705261000000064],[-93.737777999999992,71.689423000000033],[-93.764724999999999,71.679703000000131],[-93.811110999999926,71.657486000000063],[-93.818618999999956,71.651932000000102],[-93.81138599999997,71.645538000000045],[-93.797226000000023,71.639435000000105],[-93.658339999999896,71.581940000000031],[-93.618057000000022,71.56860400000005],[-93.589447000000007,71.561371000000065],[-93.513061999999877,71.544707999999957],[-93.494994999999903,71.541656000000046],[-93.476944000000003,71.540267999999969],[-93.428328999999962,71.534149000000127],[-93.412216000000001,71.530823000000055],[-93.230835000000013,71.473602000000142],[-93.214171999999962,71.467209000000139],[-93.201401000000033,71.461380000000133],[-93.18638599999997,71.435806000000127],[-93.18638599999997,71.430267000000129],[-93.18998699999986,71.423874000000012],[-93.193877999999927,71.419433999999967],[-93.195540999999935,71.413605000000132],[-93.190551999999968,71.408035000000098],[-93.180556999999965,71.401093000000003],[-93.142501999999979,71.374985000000038],[-93.128875999999991,71.368866000000025],[-93.101944000000003,71.367477000000008],[-93.062774999999988,71.36943100000002],[-93.045272999999952,71.367751999999996],[-93.029175000000009,71.36442599999998],[-92.997222999999963,71.353866999999923],[-92.985824999999863,71.348877000000073],[-92.977218999999934,71.343872000000033],[-92.973891999999978,71.340820000000122],[-92.941939999999931,71.288879000000009],[-92.938599000000011,71.270538000000045],[-92.936110999999926,71.247481999999991],[-92.931945999999925,71.220535000000041],[-92.930831999999953,71.214432000000102],[-92.923889000000031,71.207763999999941],[-92.854445999999996,71.151382000000126],[-92.862777999999992,71.139434999999992],[-92.869155999999975,71.128036000000122],[-92.888610999999969,71.074707000000103],[-92.889998999999932,71.065810999999997],[-92.906951999999933,70.912491000000102],[-93.030838000000017,70.878860000000088],[-93.040833000000021,70.877762000000018],[-93.048339999999996,70.873870999999951],[-93.046111999999937,70.867203000000018],[-93.042769999999905,70.863876000000062],[-93.027495999999985,70.852768000000083],[-92.982498000000021,70.825546000000145],[-92.958618000000001,70.817490000000078],[-92.928328999999962,70.811371000000008],[-92.911391999999978,70.809982000000048],[-92.813048999999978,70.805817000000047],[-92.688598999999954,70.775542999999971],[-92.676666000000012,70.771652000000074],[-92.641112999999962,70.71527100000003],[-92.639449999999954,70.709991000000116],[-92.642501999999979,70.706375000000094],[-92.621933000000013,70.683594000000028],[-92.592772999999966,70.685806000000127],[-92.430557000000022,70.666091999999992],[-92.418059999999969,70.66304000000008],[-92.208053999999947,70.610260000000039],[-92.199158000000011,70.606644000000017],[-92.169158999999979,70.590271000000143],[-92.159163999999976,70.584152000000074],[-92.157501000000025,70.579163000000108],[-92.156661999999983,70.573044000000095],[-92.168335000000013,70.569992000000013],[-92.196105999999986,70.571105999999986],[-92.228607000000011,70.573608000000036],[-92.245543999999995,70.571380999999974],[-92.25,70.569716999999969],[-92.265014999999892,70.551926000000037],[-92.265014999999892,70.548035000000141],[-92.25,70.501389000000131],[-92.238051999999982,70.487198000000092],[-92.116652999999985,70.470825000000048],[-92.110000999999897,70.468322999999998],[-91.996947999999975,70.390823000000069],[-91.987777999999992,70.355820000000108],[-91.992492999999968,70.320540999999992],[-91.995269999999948,70.316665999999998],[-91.985549999999932,70.289703000000031],[-91.959732000000031,70.2586060000001],[-91.952224999999999,70.255264000000125],[-91.946945000000028,70.258041000000048],[-91.942214999999976,70.263610999999969],[-91.920273000000009,70.296370999999965],[-91.900283999999999,70.330826000000116],[-91.903610000000015,70.337204000000042],[-91.904449,70.343323000000112],[-91.89805599999994,70.349152000000117],[-91.890288999999996,70.354431000000091],[-91.878052000000025,70.358321999999987],[-91.867492999999968,70.360260000000096],[-91.853058000000033,70.361374000000069],[-91.73721299999994,70.358596999999975],[-91.729720999999984,70.356934000000081],[-91.703887999999949,70.34526100000005],[-91.698883000000023,70.342484000000127],[-91.69387799999987,70.336380000000077],[-91.636123999999938,70.231658999999979],[-91.565276999999924,70.200546000000145],[-91.524169999999913,70.179153000000042],[-91.513625999999931,70.167206000000078],[-91.511948000000018,70.158875000000023],[-91.511397999999986,70.152771000000143],[-91.516953000000001,70.146378000000027],[-91.529174999999952,70.142487000000131],[-91.542495999999915,70.140823000000125],[-91.578063999999927,70.13749700000011],[-91.916655999999989,70.119980000000055],[-91.953339000000028,70.118317000000104],[-91.972228999999913,70.118591000000038],[-92.003890999999953,70.121368000000132],[-92.021392999999989,70.123596000000077],[-92.036117999999931,70.126923000000033],[-92.049438000000009,70.132202000000007],[-92.05749499999996,70.136932000000058],[-92.234436000000017,70.212203999999986],[-92.268341000000021,70.208878000000141],[-92.393065999999976,70.150543000000027],[-92.450287000000003,70.0711060000001],[-92.432220000000029,70.075546000000088],[-92.285278000000005,70.089706000000035],[-92.268341000000021,70.090546000000074],[-92.177489999999977,70.088318000000072],[-92.129990000000021,70.084991000000002],[-92.087508999999898,70.079711999999972],[-92.026397999999972,70.066376000000048],[-91.993056999999965,70.058594000000085],[-91.985274999999945,70.053864000000033],[-91.939712999999983,70.020263999999997],[-91.946654999999907,70.015823000000069],[-92.114440999999999,69.956375000000037],[-92.148894999999925,69.946639999999945],[-92.203887999999949,69.92053199999998],[-92.369445999999982,69.847763000000043],[-92.543335000000013,69.780548000000067],[-92.658614999999998,69.761108000000092],[-92.778610000000015,69.722214000000008],[-92.775283999999999,69.706375000000094],[-92.565552000000025,69.71276899999998],[-92.551392000000021,69.712494000000106],[-92.535004000000015,69.709427000000005],[-92.535277999999948,69.705261000000121],[-92.709732000000031,69.673874000000012],[-92.728881999999999,69.67164600000001],[-92.743805000000009,69.671951000000035],[-92.777221999999938,69.676086000000055],[-92.858046999999999,69.6827550000001],[-92.871384000000035,69.682480000000112],[-92.908889999999985,69.680541999999946],[-92.922774999999888,69.679427999999973],[-92.923614999999927,69.678314],[-92.920273000000009,69.669708000000071],[-92.897506999999962,69.665543000000071],[-92.836120999999991,69.655822999999998],[-92.827498999999989,69.655822999999998],[-92.694442999999978,69.656372000000147],[-92.634726999999998,69.671088999999938],[-92.629378999999972,69.673592000000099],[-92.619056999999998,69.675758000000087],[-92.5625,69.687484999999981],[-92.523620999999935,69.692749000000106],[-92.506957999999941,69.693588000000091],[-92.340835999999967,69.694138000000123],[-92.305831999999896,69.665817000000004],[-92.205276000000026,69.645538000000101],[-92.091110000000015,69.624695000000031],[-92.088333000000034,69.62303200000008],[-92.088607999999965,69.618865999999969],[-92.090835999999911,69.616089000000102],[-92.110549999999932,69.613036999999963],[-92.122771999999998,69.612198000000035],[-92.134170999999981,69.612488000000042],[-92.243606999999884,69.630264000000011],[-92.28195199999999,69.639984000000084],[-92.291107000000011,69.641373000000101],[-92.300551999999925,69.641663000000108],[-92.297501000000011,69.636932000000002],[-92.124709999999936,69.554977000000065],[-92.084166999999979,69.544708000000014],[-91.938323999999909,69.517761000000121],[-91.803329000000019,69.498870999999951],[-91.804168999999888,69.504990000000021],[-91.798339999999939,69.513885000000016],[-91.497498000000007,69.658600000000092],[-91.485001000000011,69.663315000000125],[-91.475280999999939,69.664429000000098],[-91.450835999999981,69.65887499999991],[-91.418883999999935,69.65554800000001],[-91.314163000000008,69.652771000000087],[-91.221114999999998,69.653320000000008],[-91.202224999999942,69.655258000000003],[-91.188599000000011,69.65387000000004],[-91.097777999999948,69.638321000000133],[-91.094161999999983,69.636108000000036],[-91.091949,69.631652999999972],[-91.095275999999956,69.626647999999932],[-91.101943999999946,69.620819000000097],[-91.105835000000013,69.619141000000013],[-91.334441999999967,69.552765000000022],[-91.36082499999992,69.54553199999998],[-91.380554000000018,69.542480000000069],[-91.396118000000001,69.541091999999992],[-91.460555999999997,69.539703000000145],[-91.494720000000029,69.537201000000096],[-91.514450000000011,69.534148999999957],[-91.562774999999931,69.522491000000116],[-91.570281999999963,69.520264000000054],[-91.56639100000001,69.514708999999982],[-91.557770000000005,69.508041000000048],[-91.553878999999995,69.505554000000132],[-91.402221999999938,69.522217000000012],[-91.333618000000001,69.534988000000112],[-91.321670999999924,69.538879000000009],[-91.192215000000033,69.562759000000028],[-91.17971799999998,69.558868000000132],[-91.160277999999892,69.546097000000032],[-91.15055799999999,69.537201000000096],[-91.146666999999923,69.531662000000097],[-91.143616000000009,69.525268999999923],[-91.138610999999855,69.519150000000081],[-91.128326000000015,69.514160000000061],[-91.114166000000012,69.510817999999915],[-91.102782999999988,69.508881000000088],[-90.969727000000034,69.511383000000137],[-90.830001999999922,69.484984999999995],[-90.758620999999948,69.482758000000103],[-90.751953000000015,69.487198000000149],[-90.751403999999866,69.49275200000011],[-90.758057000000008,69.501389000000131],[-90.755843999999968,69.507217000000082],[-90.754181000000017,69.509155000000021],[-90.716109999999958,69.539429000000041],[-90.698607999999922,69.539429000000041],[-90.651108000000022,69.534424000000001],[-90.536666999999909,69.513885000000016],[-90.493332000000009,69.504166000000055],[-90.436661000000015,69.489700000000028],[-90.318619000000012,69.454437000000041],[-90.307769999999948,69.450272000000041],[-90.307769999999948,69.44720500000011],[-90.319457999999997,69.440536000000009],[-90.34445199999999,69.432205000000124],[-90.358046999999942,69.429703000000075],[-90.396392999999875,69.428589000000102],[-90.411391999999921,69.431365999999969],[-90.427489999999977,69.440811000000053],[-90.43360899999999,69.444976999999938],[-90.438323999999966,69.448029000000076],[-90.450561999999991,69.450272000000041],[-90.463332999999921,69.448593000000017],[-90.493332000000009,69.440811000000053],[-90.555556999999965,69.422485000000052],[-90.613891999999908,69.451096000000007],[-90.621932999999956,69.453323000000012],[-90.703612999999962,69.453598000000056],[-90.704453000000001,69.451385000000073],[-90.698607999999922,69.446091000000138],[-90.636948000000018,69.429703000000075],[-90.585830999999985,69.419144000000017],[-90.582229999999925,69.416931000000034],[-90.584732000000031,69.41415399999994],[-90.600829999999974,69.408599999999979],[-90.694991999999957,69.389709000000096],[-90.705275999999969,69.387772000000098],[-90.718613000000005,69.387772000000098],[-90.741378999999938,69.382750999999928],[-90.790282999999988,69.362762000000032],[-90.809432999999956,69.342209000000139],[-90.813048999999921,69.338318000000072],[-90.815826000000015,69.333327999999995],[-90.818619000000012,69.298598999999967],[-90.815001999999993,69.293319999999994],[-90.80860899999999,69.287490999999989],[-90.805557000000022,69.282761000000107],[-90.803878999999995,69.259720000000073],[-90.804717999999923,69.255829000000006],[-90.809432999999956,69.253326000000015],[-90.822234999999978,69.251663000000121],[-90.903885000000002,69.246368000000075],[-90.920837000000006,69.246368000000075],[-90.931380999999931,69.247482000000048],[-91.081115999999952,69.266936999999984],[-91.214721999999938,69.290268000000083],[-91.296386999999925,69.3119200000001],[-91.345276000000013,69.328049000000021],[-91.355834999999956,69.332214000000022],[-91.426391999999964,69.350540000000024],[-91.438599000000011,69.352768000000026],[-91.447220000000016,69.352768000000026],[-91.446655000000021,69.349716000000058],[-91.431945999999982,69.33859300000006],[-91.335281000000009,69.304428000000144],[-91.130553999999961,69.24192800000003],[-91.031386999999938,69.218323000000055],[-90.918883999999935,69.160812000000078],[-90.895003999999972,69.150818000000072],[-90.815001999999993,69.133606000000043],[-90.664718999999991,69.083328000000051],[-90.654998999999918,69.078049000000078],[-90.654174999999952,69.07609599999995],[-90.654449,69.070541000000048],[-90.660552999999993,69.059982000000048],[-90.669448999999929,69.049987999999985],[-90.583892999999989,68.928864000000033],[-90.544998000000021,68.911102000000142],[-90.528884999999946,68.908600000000092],[-90.47444200000001,68.890549000000078],[-90.436385999999914,68.874419999999986],[-90.419448999999986,68.840820000000065],[-90.446105999999986,68.779709000000139],[-90.449158000000011,68.77609300000006],[-90.454177999999956,68.773605000000089],[-90.464721999999995,68.770827999999995],[-90.478332999999964,68.768326000000116],[-90.492492999999968,68.767761000000064],[-90.497498000000007,68.768326000000116],[-90.501113999999973,68.770827999999995],[-90.513900999999976,68.759155000000135],[-90.526672000000019,68.744431000000134],[-90.527785999999992,68.736649],[-90.522507000000019,68.729980000000069],[-90.506957999999997,68.724990999999932],[-90.480285999999921,68.707764000000111],[-90.479172000000005,68.705826000000002],[-90.47444200000001,68.530822999999941],[-90.509734999999978,68.495254999999929],[-90.519454999999994,68.487487999999985],[-90.528335999999911,68.483322000000101],[-90.557770000000005,68.474700999999982],[-90.584732000000031,68.465546000000131],[-90.603881999999999,68.455826000000059],[-90.607772999999952,68.451096000000007],[-90.606658999999979,68.446091000000138],[-90.603881999999999,68.439697000000081],[-90.601395000000025,68.436371000000065],[-90.55999799999995,68.423599000000024],[-90.523894999999982,68.414428999999984],[-90.466948999999886,68.403869999999984],[-90.361938000000009,68.384155000000135],[-90.332779000000016,68.378036000000122],[-90.317504999999983,68.373306000000071],[-90.315001999999993,68.369980000000055],[-90.319167999999991,68.368317000000104],[-90.343886999999938,68.365265000000022],[-90.367492999999911,68.345261000000107],[-90.271392999999989,68.238876000000118],[-90.255004999999926,68.23275799999999],[-90.232772999999952,68.230270000000019],[-90.207229999999925,68.231093999999985],[-90.178604000000007,68.235809000000017],[-90.144454999999994,68.243866000000025],[-90.132216999999912,68.24859600000002],[-90.122771999999941,68.25360100000006],[-90.119720000000029,68.257216999999969],[-90.118057000000022,68.262206999999989],[-90.038604999999961,68.352202999999975],[-89.985275000000001,68.396102999999982],[-89.912216000000001,68.467209000000025],[-89.893065999999919,68.543319999999937],[-89.911666999999966,68.547484999999938],[-89.919998000000021,68.553588999999988],[-89.927779999999984,68.563599000000067],[-89.948607999999979,68.599426000000051],[-89.950561999999991,68.60386699999998],[-89.949721999999952,68.607758000000047],[-89.894729999999868,68.65248100000008],[-89.80972300000002,68.71026599999999],[-89.802489999999921,68.712203999999929],[-89.789168999999958,68.71026599999999],[-89.780563000000029,68.705826000000002],[-89.763335999999924,68.690536000000009],[-89.757507000000032,68.684708000000057],[-89.746947999999975,68.669708000000128],[-89.729172000000005,68.699142000000109],[-89.693328999999949,68.763885000000016],[-89.68472300000002,68.810257000000092],[-89.687499999999943,68.819716999999969],[-89.689986999999917,68.824707000000046],[-89.714721999999995,68.846939000000077],[-89.733886999999925,68.881653000000142],[-89.739166000000012,68.892761000000121],[-89.756957999999884,68.939972000000012],[-89.75556899999998,68.954162999999994],[-89.753066999999987,68.958327999999995],[-89.71665999999999,69.006104000000107],[-89.707229999999925,69.014709000000096],[-89.700561999999991,69.019150000000025],[-89.684433000000013,69.028870000000097],[-89.666107000000011,69.038315000000011],[-89.644164999999987,69.048325000000091],[-89.582779000000016,69.06860400000005],[-89.56082200000003,69.077209000000039],[-89.529357999999945,69.090606999999977],[-89.489990000000034,69.110535000000027],[-89.482497999999907,69.115540000000067],[-89.458618000000001,69.133606000000043],[-89.402221999999995,69.178863999999976],[-89.398620999999935,69.182479999999998],[-89.394454999999937,69.193039000000056],[-89.394454999999937,69.199141999999995],[-89.396956999999929,69.208602999999982],[-89.394454999999937,69.214431999999988],[-89.389998999999932,69.219147000000021],[-89.322234999999921,69.247208000000114],[-89.306655999999919,69.251389000000017],[-89.258621000000005,69.259995000000117],[-89.220551,69.266663000000051],[-89.174164000000019,69.273315000000139],[-89.134170999999981,69.275542999999914],[-89.114440999999886,69.27526899999998],[-89.09056099999998,69.271927000000062],[-89.049987999999985,69.264435000000105],[-89.038054999999872,69.261931999999945],[-88.999435000000005,69.251389000000017],[-88.968886999999938,69.24136400000009],[-88.942489999999964,69.229980000000012],[-88.938048999999978,69.226928999999984],[-88.935546999999985,69.222214000000122],[-88.93472300000002,69.219986000000006],[-88.9375,69.214156999999943],[-88.936660999999958,69.209152000000074],[-88.929992999999968,69.198029000000133],[-88.870269999999948,69.148605000000089],[-88.85943599999996,69.142211999999972],[-88.782501000000025,69.103043000000071],[-88.772507000000019,69.098876999999959],[-88.62388599999997,69.042755],[-88.480285999999978,68.998871000000065],[-88.457229999999925,68.992752000000053],[-88.406113000000005,68.982758000000047],[-88.270844000000011,68.934981999999934],[-88.208618000000001,68.911652000000004],[-88.197768999999994,68.906647000000135],[-88.115829000000019,68.860535000000084],[-88.082229999999981,68.841370000000097],[-88.052215999999987,68.823044000000095],[-88.038329999999974,68.814147999999989],[-87.971664000000033,68.766097999999943],[-87.96444699999995,68.760543999999982],[-87.947768999999994,68.731659000000093],[-87.921660999999915,68.673035000000027],[-87.916655999999989,68.656372000000147],[-87.917496000000028,68.647491000000059],[-87.925002999999947,68.632476999999994],[-87.93499799999995,68.61943100000002],[-87.942489999999907,68.610809000000017],[-87.947768999999994,68.605255000000056],[-87.933883999999978,68.576935000000049],[-87.924163999999905,68.559708000000001],[-87.883621000000005,68.494430999999963],[-87.881377999999984,68.491089000000045],[-87.841675000000009,68.432479999999998],[-87.835555999999997,68.42442299999999],[-87.817504999999926,68.417206000000078],[-87.798614999999984,68.40525800000006],[-87.791672000000005,68.398330999999985],[-87.789718999999934,68.391937000000098],[-87.789444000000003,68.386658000000125],[-87.792220999999927,68.334427000000005],[-87.800551999999925,68.3119200000001],[-87.845276000000013,68.247757000000092],[-87.848891999999864,68.244141000000013],[-87.929168999999945,68.197204999999997],[-87.93582200000003,68.195815999999979],[-87.946945000000028,68.198593000000074],[-88.106658999999866,68.242751999999996],[-88.22193900000002,68.36554000000001],[-88.384445000000028,68.291092000000049],[-88.392226999999991,68.287490999999989],[-88.395553999999947,68.285263000000043],[-88.401671999999962,68.280272999999966],[-88.403335999999911,68.275542999999971],[-88.402785999999878,68.270263999999997],[-88.398345999999947,68.260544000000095],[-88.380829000000006,68.24552900000009],[-88.361937999999952,68.233871000000079],[-88.342498999999975,68.223602000000028],[-88.334732000000031,68.217484000000127],[-88.330841000000021,68.213043000000027],[-88.279723999999931,68.118041999999946],[-88.277495999999985,68.111649],[-88.277785999999992,68.105545000000006],[-88.283065999999963,68.099990999999989],[-88.315551999999968,68.086104999999975],[-88.331680000000006,68.076385000000073],[-88.338332999999977,68.070541000000105],[-88.341109999999901,68.064987000000087],[-88.347777999999948,68.037201000000039],[-88.366942999999992,68.03166200000004],[-88.381103999999993,68.025269000000094],[-88.372771999999941,67.96887200000009],[-88.370834000000002,67.959152000000017],[-88.36860699999994,67.954436999999984],[-88.285278000000005,67.81721500000009],[-88.276397999999972,67.80304000000001],[-88.269164999999987,67.793594000000041],[-88.160552999999993,67.682479999999941],[-88.151107999999908,67.673309000000017],[-88.139449999999954,67.664428999999984],[-88.124999999999943,67.65554800000001],[-88.095839999999953,67.642487000000074],[-88.066100999999946,67.634720000000129],[-88.009170999999924,67.622757000000092],[-87.979996000000028,67.615814000000114],[-87.965285999999992,67.611649000000114],[-87.955841000000021,67.607483000000002],[-87.881377999999984,67.568054000000132],[-87.841385000000002,67.536102000000142],[-87.827224999999999,67.527206000000035],[-87.789169000000015,67.505263999999954],[-87.623046999999929,67.412491000000102],[-87.606383999999935,67.403869999999984],[-87.585007000000019,67.395264000000054],[-87.53694200000001,67.378860000000088],[-87.460830999999985,67.344147000000135],[-87.357773000000009,67.262207000000046],[-87.359160999999972,67.247482000000048],[-87.361938000000009,67.242203000000075],[-87.429168999999945,67.208603000000039],[-87.440551999999968,67.204987000000131],[-87.486664000000019,67.194138000000066],[-87.497771999999941,67.190536000000122],[-87.50556899999998,67.185256999999979],[-87.511397999999986,67.174988000000099],[-87.511948000000018,67.169983000000059],[-87.516953000000001,67.115540000000124],[-87.510284000000013,67.112198000000149],[-87.497498000000007,67.115265000000079],[-87.322784000000013,67.162766000000147],[-87.240828999999906,67.216094999999939],[-87.117766999999958,67.212769000000094],[-87.069732999999928,67.219437000000084],[-86.968612999999948,67.245255000000043],[-86.96305799999999,67.250548999999978],[-86.967498999999975,67.255264000000011],[-87.008895999999936,67.282211000000132],[-87.075561999999934,67.327209000000039],[-87.086670000000026,67.336379999999963],[-87.090560999999923,67.345825000000048],[-87.089995999999985,67.350815000000125],[-87.081389999999999,67.354430999999977],[-86.874435000000005,67.404984000000127],[-86.804169000000002,67.420821999999987],[-86.79222099999987,67.422485000000108],[-86.779175000000009,67.422211000000004],[-86.765288999999939,67.419144000000074],[-86.709731999999974,67.388046000000031],[-86.689163000000008,67.3744200000001],[-86.68472300000002,67.369980000000055],[-86.675551999999982,67.365540000000067],[-86.647232000000031,67.358322000000044],[-86.592498999999975,67.345261000000107],[-86.579726999999991,67.344986000000063],[-86.543883999999935,67.344986000000063],[-86.53195199999999,67.346649000000014],[-86.523620999999991,67.352203000000031],[-86.518065999999976,67.357208000000071],[-86.509170999999981,67.36775200000011],[-86.50306699999993,67.377762000000018],[-86.473891999999978,67.468596999999988],[-86.472777999999892,67.478592000000049],[-86.47444200000001,67.483322000000101],[-86.49499499999996,67.49693300000007],[-86.485001000000011,67.516936999999984],[-86.452224999999999,67.592484000000127],[-86.451401000000033,67.597488000000112],[-86.455840999999964,67.601929000000041],[-86.465285999999935,67.606369000000029],[-86.479720999999984,67.610535000000141],[-86.488892000000021,67.614699999999971],[-86.521392999999932,67.671921000000111],[-86.525283999999999,67.681366000000139],[-86.508056999999894,67.69720500000011],[-86.359160999999915,67.827773999999977],[-86.350554999999986,67.833327999999938],[-86.286941999999897,67.869979999999941],[-86.098052999999993,67.978043000000014],[-86.041381999999942,68.000549000000035],[-86.029723999999931,68.004990000000134],[-86.005004999999983,68.008330999999998],[-85.99221799999998,68.009155000000135],[-85.979995999999915,68.011658000000125],[-85.898346000000004,68.046097000000145],[-85.892501999999979,68.051376000000118],[-85.890838999999971,68.061371000000065],[-85.912506000000008,68.084717000000069],[-85.916396999999961,68.094147000000135],[-85.914443999999946,68.104155999999989],[-85.888061999999991,68.189697000000137],[-85.842772999999966,68.317214999999976],[-85.839172000000019,68.321381000000088],[-85.712783999999942,68.411652000000117],[-85.726943999999946,68.486374000000012],[-85.733321999999987,68.598602000000085],[-85.675277999999992,68.711104999999975],[-85.663619999999923,68.726929000000098],[-85.645843999999954,68.737488000000099],[-85.633895999999936,68.741928000000144],[-85.620269999999948,68.741653000000099],[-85.606383999999991,68.740265000000022],[-85.591675000000009,68.737198000000092],[-85.569457999999941,68.728317000000004],[-85.558043999999938,68.726089000000002],[-85.494445999999925,68.736923000000104],[-85.481948999999929,68.739426000000037],[-85.466171000000031,68.749992000000134],[-85.464164999999923,68.752991000000122],[-85.464721999999938,68.759720000000016],[-85.507781999999963,68.766662999999994],[-85.550827000000027,68.773315000000082],[-85.562774999999988,68.776657],[-85.55360399999995,68.781097000000045],[-85.540833000000021,68.78276100000005],[-85.514175000000023,68.783875000000023],[-85.458053999999947,68.777770999999973],[-85.415008999999998,68.770827999999995],[-85.371383999999978,68.762207000000103],[-85.361664000000019,68.757767000000058],[-85.368056999999965,68.752486999999974],[-85.379439999999988,68.747208000000001],[-85.388335999999981,68.741928000000144],[-85.384170999999981,68.737198000000092],[-85.328612999999962,68.724990999999932],[-85.314162999999951,68.722762999999986],[-85.228881999999999,68.71026599999999],[-85.215835999999967,68.710815000000139],[-85.209166999999979,68.714996000000042],[-85.210830999999985,68.719711000000075],[-85.21945199999999,68.729155999999932],[-85.226669000000015,68.733597000000032],[-85.148345999999947,68.750000000000114],[-85.067504999999926,68.749710000000107],[-84.912780999999939,68.746933000000013],[-84.898055999999997,68.742477000000065],[-84.883895999999993,68.740265000000022],[-84.801102000000014,68.73414600000001],[-84.787215999999944,68.733597000000032],[-84.775283999999999,68.737198000000092],[-84.767501999999922,68.747208000000001],[-84.760009999999909,68.757217000000026],[-84.752791999999999,68.767487000000131],[-84.754180999999903,68.772217000000012],[-84.761123999999995,68.776932000000045],[-84.834732000000031,68.820541000000105],[-84.846664000000033,68.82388300000008],[-84.860824999999977,68.825272000000041],[-84.899993999999936,68.820541000000105],[-84.912216000000001,68.818054000000018],[-84.976944000000003,68.809418000000107],[-85.003615999999909,68.808318999999983],[-85.031677000000002,68.810806000000014],[-85.131942999999922,68.826934999999992],[-85.143889999999942,68.830276000000026],[-85.163054999999929,68.839157000000114],[-85.17721599999993,68.848328000000095],[-85.184158000000025,68.853043000000127],[-85.192764000000011,68.862198000000149],[-85.194442999999865,68.867203000000018],[-85.190826000000015,68.872208000000057],[-85.177779999999984,68.87359600000002],[-85.15306099999998,68.873032000000023],[-85.125,68.870254999999986],[-85.053329000000019,68.858871000000022],[-85.039992999999981,68.859421000000054],[-85.005568999999923,68.877472000000068],[-85.001952999999958,68.882477000000108],[-84.99749799999995,68.925812000000064],[-85.007232999999871,68.930267000000129],[-85.021117999999944,68.931656000000089],[-85.046660999999972,68.926651000000049],[-85.059998000000007,68.925812000000064],[-85.08805799999999,68.928588999999988],[-85.116942999999935,68.93331900000004],[-85.129439999999931,68.937485000000095],[-85.136123999999995,68.942200000000128],[-85.140563999999927,68.946640000000002],[-85.136947999999961,68.951935000000049],[-85.127776999999924,68.956100000000049],[-85.115004999999996,68.958603000000039],[-85.087508999999955,68.958037999999988],[-84.973785000000021,68.946869000000106],[-84.914718999999991,68.938034000000073],[-84.818893000000003,68.927765000000022],[-84.805831999999953,68.929152999999928],[-84.796386999999982,68.933594000000028],[-84.791381999999942,68.94331399999993],[-84.793334999999956,68.948318000000086],[-84.799987999999871,68.952774000000034],[-84.809433000000013,68.957214000000022],[-84.821945000000028,68.961655000000121],[-84.837219000000005,68.965820000000122],[-84.851394999999968,68.968323000000112],[-84.865554999999915,68.969711000000018],[-84.906951999999933,68.971649000000127],[-84.921386999999982,68.973877000000073],[-84.936110999999926,68.977203000000145],[-84.986922999999933,68.999511999999982],[-84.981673999999941,69.007492000000013],[-84.957779000000016,69.017487000000074],[-84.944442999999978,69.018051000000014],[-84.836394999999925,69.012772000000041],[-84.720000999999968,69.006943000000035],[-84.591674999999952,68.994431000000077],[-84.578063999999983,68.993866000000025],[-84.565552000000025,68.997482000000105],[-84.541381999999999,69.007216999999969],[-84.532227000000034,69.012497000000053],[-84.528335999999967,69.017487000000074],[-84.535277999999948,69.022217000000126],[-84.563613999999973,69.025818000000015],[-84.745543999999995,69.039703000000088],[-84.953887999999949,69.085815000000139],[-85.108337000000006,69.113312000000121],[-85.020554000000004,69.160262999999929],[-85.006957999999941,69.160812000000078],[-84.994155999999919,69.163315000000068],[-84.987502999999947,69.168594000000041],[-84.994719999999973,69.173035000000141],[-85.008895999999993,69.174423000000047],[-85.064712999999927,69.176926000000037],[-85.143775999999946,69.167091000000028],[-85.151778999999976,69.166091999999935],[-85.159110999999996,69.164101000000073],[-85.163276999999994,69.161598000000083],[-85.155272999999966,69.153107000000091],[-85.176665999999898,69.143600000000049],[-85.197494999999947,69.132750999999985],[-85.210555999999997,69.130264000000125],[-85.223617999999988,69.128860000000088],[-85.236937999999952,69.128036000000122],[-85.25140399999998,69.130264000000125],[-85.266662999999994,69.133606000000043],[-85.308334000000002,69.143600000000049],[-85.315552000000025,69.148041000000148],[-85.317504999999983,69.15277100000003],[-85.308043999999995,69.158034999999984],[-85.29611199999988,69.162491000000102],[-85.283324999999877,69.165267999999969],[-85.235001000000011,69.174698000000035],[-85.227501000000018,69.176872000000003],[-85.226836999999989,69.179870999999991],[-85.231162999999981,69.182541000000072],[-85.240829000000019,69.192474000000004],[-85.254729999999995,69.192749000000049],[-85.337783999999999,69.193863000000022],[-85.383057000000008,69.205551000000071],[-85.392776000000026,69.209991000000059],[-85.473327999999924,69.271927000000062],[-85.477782999999874,69.276382000000069],[-85.50306699999993,69.31442300000009],[-85.508057000000008,69.395263999999997],[-85.506957999999997,69.400269000000037],[-85.503341999999975,69.405258000000003],[-85.494155999999919,69.410812000000021],[-85.481948999999929,69.415267999999969],[-85.467498999999918,69.417206000000078],[-85.453339000000028,69.416931000000034],[-85.424437999999952,69.413315000000011],[-85.396117999999944,69.411652000000061],[-85.383330999999941,69.415267999999969],[-85.339172000000019,69.438873000000115],[-85.343613000000005,69.443587999999977],[-85.353606999999954,69.448029000000076],[-85.378875999999934,69.456649999999968],[-85.39416499999993,69.460815000000139],[-85.422774999999945,69.462493999999992],[-85.436385999999914,69.460815000000139],[-85.445830999999998,69.45637499999998],[-85.465011999999945,69.440811000000053],[-85.477218999999991,69.436371000000008],[-85.491378999999995,69.436646000000053],[-85.500838999999985,69.439148000000102],[-85.510833999999988,69.443587999999977],[-85.525283999999999,69.45277400000009],[-85.538894999999968,69.466933999999981],[-85.542496000000028,69.476379000000065],[-85.547775000000001,69.647217000000069],[-85.546951000000035,69.652206000000035],[-85.514724999999999,69.768051000000071],[-85.450287000000003,69.784714000000122],[-85.423324999999977,69.788879000000122],[-85.409163999999976,69.788589000000115],[-85.393889999999999,69.7852630000001],[-85.389174999999966,69.780548000000067],[-85.389998999999932,69.775818000000015],[-85.39416499999993,69.770537999999988],[-85.406951999999933,69.760269000000108],[-85.410827999999981,69.755264000000068],[-85.406386999999995,69.750549000000035],[-85.391952999999944,69.750275000000101],[-85.379165999999941,69.753601000000117],[-85.366652999999985,69.758040999999992],[-85.342498999999975,69.768875000000037],[-85.333068999999966,69.774155000000121],[-85.331954999999994,69.77915999999999],[-85.34445199999999,69.813033999999959],[-85.349166999999909,69.817490000000078],[-85.361938000000009,69.821930000000066],[-85.377212999999927,69.824158000000068],[-85.433608999999933,69.823608000000036],[-85.461394999999982,69.822495000000117],[-85.489990000000034,69.823044000000095],[-85.518615999999952,69.823608000000036],[-85.56138599999997,69.824706999999989],[-85.586394999999982,69.826934999999935],[-85.582229999999981,69.845825000000104],[-85.578613000000018,69.850815000000125],[-85.571945000000028,69.856094000000098],[-85.561935000000005,69.859421000000054],[-85.548049999999932,69.859984999999995],[-85.377212999999927,69.851089000000059],[-85.361938000000009,69.848877000000016],[-85.315552000000025,69.838042999999971],[-85.274169999999913,69.825272000000041],[-85.222504000000015,69.80802900000009],[-85.212509000000011,69.803589000000102],[-85.199432000000002,69.799149000000057],[-85.170836999999949,69.790542999999957],[-85.093886999999995,69.773315000000025],[-85.079177999999956,69.771102999999982],[-85.064437999999996,69.76998900000001],[-84.871658000000025,69.816086000000098],[-84.86471599999993,69.821105999999929],[-84.854172000000005,69.83137499999998],[-84.574172999999917,69.857483000000116],[-84.546386999999868,69.859421000000054],[-84.476669000000015,69.862198000000149],[-84.433608999999933,69.861098999999967],[-84.375823999999966,69.857483000000116],[-84.346663999999976,69.854706000000022],[-84.331680000000006,69.852203000000031],[-84.169448999999986,69.822220000000129],[-84.125823999999909,69.809418000000107],[-84.118606999999997,69.804703000000075],[-84.114165999999955,69.799988000000042],[-84.112220999999977,69.793593999999985],[-84.104171999999949,69.785812000000021],[-84.091674999999952,69.781372000000033],[-83.971938999999963,69.74971000000005],[-83.941665999999998,69.743042000000116],[-83.748610999999926,69.708878000000084],[-83.733886999999982,69.706649999999911],[-83.705001999999922,69.703598],[-83.603881999999942,69.693588000000091],[-83.589447000000007,69.692200000000014],[-83.360549999999989,69.676376000000062],[-83.346389999999985,69.676086000000055],[-83.333069000000023,69.678314],[-83.306380999999931,69.693862999999908],[-83.293610000000001,69.699142000000109],[-83.280562999999916,69.702484000000027],[-83.253341999999975,69.705261000000121],[-83.238892000000021,69.704711999999972],[-83.180557000000022,69.694977000000108],[-83.122771999999998,69.689148000000046],[-83.021941999999967,69.679703000000018],[-83.008056999999951,69.679152999999985],[-82.826950000000011,69.688873000000058],[-82.696654999999964,69.695816000000036],[-82.541007999999977,69.674477000000138],[-82.539672999999937,69.671593000000087],[-82.536162999999874,69.668823000000032],[-82.527328000000011,69.666153000000122],[-82.509505999999874,69.661979999999971],[-82.500671000000011,69.660491999999977],[-82.483329999999967,69.657990000000098],[-82.457503999999972,69.655327],[-82.291672000000005,69.639984000000084],[-82.263335999999981,69.638046000000145],[-82.254729999999995,69.636383000000023],[-82.307495000000017,69.622208000000114],[-82.334731999999974,69.61943100000002],[-82.390288999999996,69.618865999999969],[-82.47066499999994,69.62303200000008],[-82.476333999999952,69.625870000000077],[-82.483664999999974,69.628539999999987],[-82.492500000000007,69.630043000000001],[-82.552337999999963,69.635376000000008],[-82.560836999999992,69.635704000000146],[-82.56899999999996,69.634872000000087],[-82.577002999999991,69.632874000000129],[-82.653885000000002,69.62303200000008],[-82.654723999999987,69.568604000000107],[-82.612503000000004,69.566940000000102],[-82.600280999999995,69.562485000000095],[-82.535278000000005,69.534988000000112],[-82.489989999999977,69.507217000000082],[-82.476668999999958,69.497756999999979],[-82.486937999999896,69.493591000000094],[-82.500564999999938,69.492203000000018],[-82.528884999999946,69.4952550000001],[-82.74221799999998,69.50999500000006],[-82.897507000000019,69.518875000000094],[-82.939712999999927,69.521378000000084],[-82.982223999999917,69.524154999999951],[-83.067779999999914,69.533051000000057],[-83.125548999999921,69.539978000000019],[-83.154175000000009,69.543869000000086],[-83.228057999999976,69.538589000000002],[-83.082503999999972,69.514160000000061],[-83.025283999999999,69.508041000000048],[-82.954726999999991,69.503601000000003],[-82.870270000000005,69.500274999999988],[-82.856658999999922,69.50082400000008],[-82.842498999999918,69.500274999999988],[-82.785277999999948,69.494141000000127],[-82.68472300000002,69.479706000000022],[-82.324172999999917,69.418868999999972],[-82.295272999999952,69.413879000000122],[-82.23721299999994,69.400818000000015],[-82.225280999999995,69.39637799999997],[-82.221389999999928,69.391662999999937],[-82.231673999999941,69.387497000000053],[-82.289718999999991,69.251663000000121],[-82.291381999999999,69.246643000000063],[-82.273055999999997,69.237488000000042],[-82.258620999999948,69.233871000000079],[-82.244995000000017,69.233322000000101],[-82.217223999999931,69.233047000000113],[-82.203612999999962,69.233597000000145],[-82.054442999999992,69.24136400000009],[-82.041107000000011,69.242751999999996],[-82.027785999999992,69.244979999999941],[-81.99129499999998,69.25470700000011],[-81.914718999999877,69.269440000000145],[-81.70777899999996,69.264709000000039],[-81.693877999999984,69.263046000000145],[-81.67971799999998,69.260544000000039],[-81.650283999999999,69.251663000000121],[-81.512222000000008,69.20138500000013],[-81.416396999999904,69.208038000000101],[-81.402221999999995,69.207214000000135],[-81.388335999999981,69.204712000000086],[-81.359725999999966,69.196640000000116],[-81.347778000000005,69.191925000000083],[-81.338897999999972,69.187485000000038],[-81.332503999999858,69.182479999999998],[-81.299438000000009,69.1202550000001],[-81.330841000000021,69.095261000000107],[-81.57028200000002,68.992477000000008],[-81.59584000000001,68.984146000000123],[-81.71665999999999,68.949142000000052],[-81.75556899999998,68.941360000000088],[-81.809433000000013,68.9327550000001],[-81.888061999999991,68.919144000000131],[-81.914169000000015,68.914429000000098],[-81.966110000000015,68.904433999999981],[-82.005004999999983,68.895538000000045],[-82.043059999999969,68.883881000000088],[-82.055556999999965,68.878586000000041],[-82.057219999999973,68.873871000000008],[-82.043335000000013,68.872208000000057],[-82.00306699999993,68.874146000000053],[-81.977218999999991,68.879700000000014],[-81.833068999999966,68.907211000000075],[-81.819457999999997,68.908600000000092],[-81.68638599999997,68.905258000000117],[-81.673049999999989,68.904433999999981],[-81.66194200000001,68.90277100000003],[-81.650283999999999,68.899155000000007],[-81.58805799999999,68.869705000000124],[-81.581954999999937,68.864990000000091],[-81.438323999999966,68.874984999999981],[-81.424712999999997,68.87553400000013],[-81.382767000000001,68.866652999999985],[-81.354171999999892,68.857483000000116],[-81.238051999999925,68.774704000000042],[-81.23443599999996,68.76998900000001],[-81.232772999999952,68.760268999999937],[-81.252227999999945,68.653046000000131],[-81.255843999999911,68.643051000000014],[-81.260558999999944,68.638046000000145],[-81.267501999999922,68.633041000000105],[-81.357773000000009,68.599152000000117],[-81.560271999999998,68.541656000000103],[-81.687209999999993,68.509430000000066],[-81.798889000000031,68.489700000000028],[-81.816390999999896,68.469711000000132],[-81.830291999999986,68.459717000000126],[-81.842498999999918,68.455551000000014],[-81.958053999999947,68.423309000000017],[-81.970839999999953,68.421097000000145],[-81.997771999999941,68.423035000000084],[-82.011947999999961,68.427765000000136],[-82.024444999999957,68.436919999999986],[-82.027785999999992,68.441650000000038],[-82.028884999999946,68.446640000000059],[-82.033324999999991,68.456099999999992],[-82.038054999999929,68.465820000000065],[-82.041671999999949,68.470535000000098],[-82.062209999999936,68.494430999999963],[-82.068618999999899,68.499145999999996],[-82.077498999999932,68.503601000000003],[-82.091675000000009,68.507217000000082],[-82.229445999999996,68.531662000000097],[-82.256393000000003,68.533600000000035],[-82.269454999999937,68.532486000000063],[-82.271117999999944,68.527481000000023],[-82.267226999999991,68.52276599999999],[-82.254729999999995,68.513321000000133],[-82.243056999999965,68.508881000000088],[-82.229171999999892,68.505264000000125],[-82.1875,68.495819000000097],[-82.175826999999913,68.491364000000033],[-82.17332499999992,68.485808999999961],[-82.175002999999947,68.481093999999928],[-82.179169000000002,68.476089000000059],[-82.183608999999933,68.471100000000092],[-82.190552000000025,68.466095000000053],[-82.202498999999989,68.460815000000025],[-82.215011999999888,68.457489000000123],[-82.228057999999976,68.455261000000007],[-82.25418099999996,68.454437000000041],[-82.382767000000001,68.466934000000037],[-82.393889999999999,68.468322999999998],[-82.448882999999967,68.478592000000049],[-82.476943999999946,68.485535000000027],[-82.500290000000007,68.494430999999963],[-82.532501000000025,68.508041000000048],[-82.545273000000009,68.517487000000017],[-82.549163999999905,68.522217000000069],[-82.557770000000005,68.526932000000102],[-82.571395999999993,68.526382000000069],[-82.583892999999875,68.524155000000007],[-82.608886999999925,68.517487000000017],[-82.62110899999999,68.512206999999933],[-82.634734999999978,68.502213000000097],[-82.638901000000033,68.497208000000057],[-82.635284000000013,68.492203000000018],[-82.491103999999893,68.453873000000101],[-82.490554999999915,68.402205999999921],[-82.363051999999982,68.35054000000008],[-82.356658999999922,68.345825000000048],[-82.353057999999976,68.341094999999996],[-82.351105000000018,68.331375000000094],[-82.352492999999924,68.326660000000061],[-82.356658999999922,68.321655000000021],[-82.369445999999925,68.318329000000006],[-82.381942999999922,68.316939999999988],[-82.39527899999996,68.316666000000055],[-82.422225999999966,68.318603999999993],[-82.448607999999979,68.320831000000055],[-82.475006000000008,68.321106000000043],[-82.500838999999985,68.317490000000021],[-82.507781999999963,68.313309000000118],[-82.50140399999998,68.308594000000085],[-82.483611999999937,68.299422999999933],[-82.426101999999958,68.276657000000114],[-82.400557999999933,68.26887499999998],[-82.386947999999961,68.266388000000063],[-82.37388599999997,68.265548999999965],[-82.36082499999992,68.266937000000041],[-82.311661000000015,68.283051],[-82.286941999999897,68.289703000000031],[-82.273330999999928,68.288879000000065],[-82.264724999999999,68.284424000000058],[-82.260009999999966,68.274993999999992],[-82.259170999999981,68.269989000000123],[-82.258620999999948,68.255554000000018],[-82.264449999999897,68.24552900000009],[-82.270279000000016,68.235535000000084],[-82.278610000000015,68.225540000000024],[-82.289443999999946,68.215545999999961],[-82.300551999999868,68.205551000000071],[-82.321121000000005,68.190262000000018],[-82.330291999999872,68.185256999999922],[-82.337218999999948,68.180267000000072],[-82.345550999999944,68.170258000000047],[-82.34722899999997,68.165268000000026],[-82.345839999999953,68.160537999999974],[-82.337218999999948,68.155823000000112],[-82.314437999999939,68.146652000000017],[-82.272506999999962,68.133331000000055],[-82.230835000000013,68.121918000000051],[-82.206115999999952,68.115814],[-82.192489999999964,68.112487999999985],[-82.179169000000002,68.111649],[-82.166397000000018,68.114151000000106],[-82.145781999999997,68.125488000000018],[-82.099166999999966,68.154984000000013],[-82.080565999999919,68.179703000000131],[-82.06361400000003,68.199707000000046],[-82.056945999999982,68.204712000000086],[-82.047500999999897,68.209716999999955],[-82.037505999999894,68.213881999999955],[-82.025009000000011,68.216095000000109],[-82.01167299999986,68.214705999999921],[-81.997771999999941,68.211105000000089],[-81.988892000000021,68.206650000000025],[-81.985549999999989,68.201660000000004],[-81.984726000000023,68.196929999999952],[-81.993057000000022,68.172485000000108],[-82.008895999999936,68.14776599999999],[-82.019164999999987,68.132751000000042],[-82.027221999999938,68.122756999999979],[-82.034164000000033,68.117751999999939],[-82.043610000000001,68.112762000000089],[-82.056106999999997,68.109421000000054],[-82.114502000000016,68.082870000000014],[-82.173889000000031,68.002486999999974],[-82.175551999999982,67.997482000000105],[-82.102782999999988,67.907211000000075],[-82.096663999999976,67.90248100000008],[-82.079452999999944,67.893326000000002],[-82.070557000000008,67.888596000000007],[-81.837783999999999,67.783875000000023],[-81.727218999999934,67.740814],[-81.707503999999972,67.731658999999922],[-81.690552000000025,67.722487999999998],[-81.678328999999906,67.713042999999914],[-81.666397000000018,67.703598000000056],[-81.65972899999997,67.694138000000009],[-81.653884999999946,67.689423000000147],[-81.636672999999917,67.679977000000008],[-81.592498999999975,67.661652000000061],[-81.538329999999974,67.643599999999992],[-81.498046999999985,67.631927000000132],[-81.457779000000016,67.620529000000147],[-81.433059999999955,67.611374000000069],[-81.416396999999904,67.601929000000041],[-81.248885999999914,67.479706000000078],[-81.243056999999908,67.474991000000045],[-81.239715999999873,67.470260999999994],[-81.237212999999997,67.455551000000014],[-81.237503000000004,67.441086000000098],[-81.239166000000012,67.436096000000077],[-81.245269999999948,67.426376000000005],[-81.256392999999946,67.416381999999942],[-81.293610000000001,67.396103000000039],[-81.300551999999982,67.391098],[-81.30471799999998,67.386108000000092],[-81.347778000000005,67.292755],[-81.366394000000014,67.238875999999948],[-81.373610999999983,67.204711999999972],[-81.376099000000011,67.189972000000012],[-81.375274999999988,67.185256999999979],[-81.380279999999914,67.170532000000037],[-81.413895000000025,67.091370000000097],[-81.432220000000029,67.066666000000112],[-81.496657999999911,67.004715000000147],[-81.50306699999993,66.999710000000107],[-81.512512000000015,66.99470500000001],[-81.524170000000026,66.99054000000001],[-81.536117999999988,66.988312000000064],[-81.699722000000008,66.970261000000107],[-81.711944999999957,66.969986000000063],[-81.750838999999928,66.978591999999992],[-81.763901000000033,66.983046999999999],[-81.772232000000031,66.987762000000032],[-81.783066000000019,66.992477000000065],[-81.796111999999937,66.996933000000013],[-81.809157999999968,66.998321999999973],[-81.833618000000001,66.997756999999979],[-81.929717999999923,66.978591999999992],[-81.952498999999932,66.968048000000124],[-81.988892000000021,66.949706999999933],[-82.026947000000007,66.926086000000055],[-82.179992999999968,66.768875000000094],[-82.183884000000035,66.764160000000061],[-82.369720000000029,66.725815000000125],[-82.481109999999944,66.669707999999957],[-82.556380999999988,66.623871000000122],[-82.562774999999874,66.618866000000082],[-82.566665999999941,66.613876000000005],[-82.571670999999981,66.60386699999998],[-82.577498999999989,66.584427000000005],[-82.576675000000023,66.579436999999984],[-82.579452999999944,66.569717000000082],[-82.585555999999997,66.564697000000024],[-82.596953999999982,66.560256999999979],[-82.694442999999978,66.558029000000033],[-82.78195199999999,66.566666000000055],[-82.86999499999996,66.567490000000021],[-83.018065999999976,66.539978000000076],[-83.012787000000003,66.515823000000069],[-83.015288999999996,66.50610400000005],[-83.019164999999873,66.501099000000011],[-83.025283999999999,66.495819000000097],[-83.049987999999928,66.475539999999967],[-83.058608999999933,66.470260999999994],[-83.357497999999964,66.353043000000071],[-83.368332000000009,66.348877000000016],[-83.402221999999938,66.347487999999998],[-83.450561999999991,66.346649000000014],[-83.515288999999882,66.353867000000037],[-83.567504999999983,66.367477000000122],[-83.652785999999935,66.40776100000005],[-83.654175000000009,66.412491000000102],[-83.639449999999954,66.437195000000088],[-83.630828999999949,66.442200000000128],[-83.618331999999896,66.44081100000011],[-83.607773000000009,66.436371000000122],[-83.597778000000005,66.426926000000037],[-83.601669000000015,66.412201000000096],[-83.597778000000005,66.407486000000063],[-83.545273000000009,66.381363000000079],[-83.53472899999997,66.378035999999952],[-83.579726999999934,66.431656000000089],[-83.672501000000011,66.520538000000101],[-83.68110699999994,66.524993999999992],[-83.70695499999988,66.530822999999998],[-83.732497999999964,66.534714000000065],[-83.795273000000009,66.541930999999977],[-83.82028200000002,66.542754999999943],[-83.832229999999981,66.542206000000022],[-83.857497999999964,66.544144000000131],[-83.968886999999881,66.577484000000027],[-83.977492999999981,66.582214000000079],[-83.985001000000011,66.591660000000047],[-84.011397999999986,66.663605000000018],[-84.014174999999966,66.673309000000017],[-84.015563999999983,66.687759000000142],[-84.014450000000011,66.692748999999992],[-84.006119000000012,66.698029000000076],[-83.994719999999973,66.70138500000013],[-83.982772999999952,66.70277400000009],[-83.945540999999992,66.702484000000084],[-83.891113000000018,66.804153000000099],[-83.886123999999995,66.813873000000001],[-83.883895999999936,66.82388300000008],[-83.884170999999924,66.833602999999982],[-83.890288999999996,66.85775799999999],[-83.901671999999905,66.871918000000107],[-83.907776000000013,66.876647999999989],[-83.916397000000018,66.881087999999977],[-83.928878999999995,66.86303700000002],[-83.938323999999909,66.823608000000092],[-83.945540999999992,66.813599000000067],[-84.104996000000028,66.708328000000108],[-84.116394000000014,66.704987000000074],[-84.140288999999996,66.701934999999935],[-84.152785999999992,66.702484000000084],[-84.165558000000033,66.703873000000101],[-84.260284000000013,66.716385000000059],[-84.27305599999994,66.718596999999932],[-84.286666999999909,66.723038000000031],[-84.295273000000009,66.727478000000076],[-84.43638599999997,66.818329000000119],[-84.427779999999927,66.961104999999975],[-84.415008999999998,66.960815000000139],[-84.390288999999882,66.961929000000112],[-84.378600999999946,66.964157000000057],[-84.367492999999968,66.968597000000102],[-84.370834000000002,66.97137500000008],[-84.436110999999926,66.981369000000086],[-84.488051999999925,66.988876000000005],[-84.618057000000022,67.006378000000041],[-84.694153000000028,67.009720000000016],[-84.733063000000016,67.014708999999982],[-84.837783999999999,67.029434000000094],[-84.850829999999974,67.03166200000004],[-84.87332200000003,67.039428999999984],[-84.881942999999978,67.043869000000029],[-84.886123999999938,67.048599000000081],[-84.892501999999922,67.053314000000114],[-84.901397999999858,67.057754999999986],[-84.915008999999998,67.060806000000014],[-84.926940999999943,67.059418000000107],[-84.936110999999926,67.056090999999981],[-84.880279999999971,66.989426000000037],[-84.871658000000025,66.984984999999938],[-84.857772999999952,66.981659000000093],[-84.84584000000001,66.982208000000071],[-84.833892999999932,66.984711000000004],[-84.811110999999926,66.991653000000099],[-84.789444000000003,67.002486999999974],[-84.778335999999911,67.006653000000085],[-84.765563999999983,67.006378000000041],[-84.699996999999939,66.99581900000004],[-84.645844000000011,66.981659000000093],[-84.639724999999885,66.978043000000071],[-84.651397999999972,66.97554000000008],[-84.712783999999942,66.972762999999986],[-84.885833999999932,66.966660000000047],[-84.960007000000019,66.964157000000057],[-85.010009999999966,66.964706000000035],[-85.048339999999996,66.963318000000072],[-85.059722999999963,66.959717000000069],[-85.142775999999969,66.930267000000129],[-85.228333000000021,66.878311000000053],[-85.228881999999999,66.873306000000014],[-85.222777999999948,66.868866000000025],[-85.196105999999986,66.855255000000056],[-85.184433000000013,66.851089000000115],[-85.146118000000001,66.839431999999988],[-85.133057000000008,66.836929000000055],[-85.11999499999996,66.835541000000148],[-84.948607999999979,66.858597000000145],[-84.94027699999998,66.863876000000118],[-84.904556000000014,66.897202000000107],[-84.901053999999988,66.900375000000111],[-84.904892000000018,66.903037999999981],[-84.912888000000009,66.905044999999973],[-84.920546999999999,66.905373000000111],[-84.935225999999886,66.904540999999995],[-84.943061999999941,66.905373000000111],[-84.951050000000009,66.907378999999992],[-84.95788600000003,66.909874000000002],[-84.961730999999986,66.912704000000019],[-84.956389999999942,66.915367000000117],[-84.86233500000003,66.939835000000073],[-84.855164000000002,66.940666000000078],[-84.767775999999969,66.952209000000039],[-84.755279999999971,66.951660000000061],[-84.602218999999991,66.935806000000127],[-84.562209999999993,66.901382000000126],[-84.573897999999986,66.89888000000002],[-84.61082499999992,66.89387499999998],[-84.62332200000003,66.893326000000059],[-84.650283999999999,66.900817999999958],[-84.675827000000027,66.902771000000087],[-84.688323999999909,66.903046000000131],[-84.746384000000035,66.897491000000059],[-84.706389999999999,66.888596000000007],[-84.58555599999994,66.858871000000079],[-84.558334000000002,66.850540000000024],[-84.523330999999985,66.836929000000055],[-84.505843999999968,66.827773999999977],[-84.504729999999995,66.823043999999982],[-84.516113000000018,66.820540999999992],[-84.541381999999999,66.821381000000031],[-84.580565999999976,66.828323000000125],[-84.634170999999981,66.84165999999999],[-84.660278000000005,66.846375000000023],[-84.672501000000011,66.845824999999991],[-84.684432999999956,66.844147000000021],[-84.690551999999968,66.839980999999966],[-84.684432999999956,66.835266000000104],[-84.675551999999925,66.830826000000116],[-84.664444000000003,66.82748400000014],[-84.651107999999965,66.824158000000125],[-84.466949,66.787766000000147],[-84.434433000000013,66.725540000000137],[-84.445266999999888,66.720260999999937],[-84.448607999999922,66.715271000000087],[-84.442489999999964,66.710814999999968],[-84.429442999999935,66.708328000000108],[-84.404174999999952,66.705551000000014],[-84.343063000000029,66.699416999999983],[-84.203887999999949,66.691360000000032],[-84.153060999999923,66.685806000000014],[-84.144454999999994,66.681366000000025],[-84.136672999999973,66.662201000000039],[-84.138061999999877,66.657210999999961],[-84.142501999999979,66.647216999999955],[-84.146117999999944,66.642212000000086],[-84.180556999999965,66.606644000000074],[-84.186385999999914,66.601379000000009],[-84.128325999999959,66.554703000000018],[-83.967223999999931,66.473877000000073],[-83.916397000000018,66.446640000000116],[-83.89805599999994,66.432755000000043],[-83.888061999999991,66.423599000000081],[-83.871108999999933,66.394989000000066],[-83.867492999999968,66.380539000000113],[-83.804717999999923,66.307205000000124],[-83.773620999999991,66.289703000000088],[-83.774719000000005,66.275269000000037],[-83.772231999999974,66.265548999999965],[-83.768615999999952,66.260818000000029],[-83.762787000000003,66.256104000000107],[-83.728881999999999,66.23803700000002],[-83.71833799999996,66.233597000000032],[-83.684722999999906,66.215546000000018],[-83.68110699999994,66.210815000000082],[-83.67860399999995,66.201096000000121],[-83.684432999999956,66.196091000000024],[-83.693053999999961,66.190810999999997],[-83.767898999999943,66.168639999999982],[-83.789718999999934,66.163315000000125],[-83.835830999999928,66.154709000000025],[-83.847777999999948,66.153320000000008],[-83.855559999999912,66.155822999999998],[-83.977782999999988,66.199417000000096],[-84.118057000000022,66.25471500000009],[-84.135283999999956,66.26388500000013],[-84.141112999999962,66.268326000000059],[-84.148620999999991,66.277771000000143],[-84.149993999999992,66.282760999999994],[-84.150283999999942,66.292480000000012],[-84.148894999999925,66.297485000000052],[-84.152495999999985,66.302200000000084],[-84.158614999999998,66.306641000000013],[-84.167220999999927,66.31109600000002],[-84.178329000000019,66.315536000000009],[-84.190826000000015,66.318054000000018],[-84.216400000000021,66.321655000000078],[-84.228332999999964,66.3211060000001],[-84.317229999999995,66.299712999999997],[-84.426940999999886,66.363037000000077],[-84.441939999999931,66.372208000000057],[-84.506393000000003,66.402205999999978],[-84.516952999999944,66.404709000000139],[-84.528885000000002,66.40415999999999],[-84.550551999999868,66.394440000000088],[-84.558884000000035,66.389160000000061],[-84.619155999999919,66.349715999999944],[-84.626937999999882,66.343597000000102],[-84.635559000000001,66.334991000000002],[-84.636123999999995,66.328873000000044],[-84.625,66.319152999999972],[-84.527221999999995,66.278595000000109],[-84.424438000000009,66.224701000000096],[-84.407500999999968,66.215546000000018],[-84.401397999999972,66.211105000000089],[-84.389998999999932,66.196930000000009],[-84.386397999999986,66.192199999999957],[-84.37777699999998,66.178040000000067],[-84.372498000000007,66.168319999999994],[-84.374709999999993,66.158600000000092],[-84.448607999999922,66.158600000000092],[-84.46055599999994,66.159149000000014],[-84.473327999999981,66.161377000000016],[-84.483886999999925,66.164703000000031],[-84.509445000000028,66.178314],[-84.641112999999962,66.216094999999996],[-84.869155999999975,66.266662999999937],[-84.881942999999978,66.268051000000071],[-84.90583799999996,66.266937000000098],[-84.927489999999977,66.258881000000031],[-84.943877999999984,66.248322000000144],[-84.954726999999934,66.243866000000025],[-84.96665999999999,66.244431000000077],[-84.979720999999984,66.24664300000012],[-85.00167799999997,66.255264000000068],[-85.131942999999922,66.291931000000034],[-85.178329000000019,66.262207000000046],[-85.190276999999867,66.260544000000095],[-85.202498999999932,66.260818000000029],[-85.214721999999995,66.262207000000046],[-85.227782999999988,66.264434999999992],[-85.252227999999945,66.273041000000092],[-85.269729999999981,66.281937000000028],[-85.301392000000021,66.304703000000075],[-85.306655999999919,66.314148000000102],[-85.339721999999938,66.399154999999951],[-85.345550999999887,66.447754000000089],[-85.346114999999998,66.45748900000001],[-85.341675000000009,66.482208000000128],[-85.343338000000017,66.48692299999999],[-85.351394999999968,66.496093999999971],[-85.457503999999915,66.573883000000137],[-85.466400000000021,66.578323000000012],[-85.479720999999984,66.581375000000094],[-85.491942999999878,66.581940000000145],[-85.55221599999993,66.577774000000034],[-85.575561999999991,66.574707000000103],[-85.598617999999931,66.569442999999978],[-85.710555999999997,66.536101999999971],[-85.845276000000013,66.499419999999986],[-85.857773000000009,66.499709999999993],[-85.868880999999931,66.504166000000112],[-85.875548999999978,66.5086060000001],[-85.888901000000033,66.511932000000002],[-85.995543999999995,66.508041000000105],[-86.007507000000032,66.507216999999969],[-86.078888000000006,66.49693300000007],[-86.103333000000021,66.496643000000063],[-86.128326000000015,66.49803200000008],[-86.141113000000018,66.499419999999986],[-86.256667999999934,66.513321000000133],[-86.283324999999934,66.518599999999935],[-86.578888000000006,66.530272999999966],[-86.580001999999979,66.520538000000101],[-86.587783999999942,66.51527400000009],[-86.599730999999963,66.511108000000036],[-86.611389000000031,66.508331000000112],[-86.622771999999998,66.506652999999972],[-86.635009999999966,66.50610400000005],[-86.65972899999997,66.506377999999984],[-86.672500999999954,66.507767000000001],[-86.685546999999985,66.509720000000073],[-86.698883000000023,66.513046000000145],[-86.726944000000003,66.521103000000096],[-86.738051999999982,66.525269000000037],[-86.75167799999997,66.528320000000008],[-86.764174999999966,66.528595000000053],[-86.775283999999942,66.526093000000003],[-86.780838000000017,66.520828000000108],[-86.781386999999995,66.515823000000069],[-86.777221999999995,66.511108000000036],[-86.743880999999931,66.488586000000112],[-86.701110999999969,66.466659999999933],[-86.662780999999939,66.449417000000039],[-86.639998999999932,66.441085999999927],[-86.633621000000005,66.436371000000122],[-86.641677999999956,66.431931000000077],[-86.678604000000007,66.432755000000043],[-86.730559999999969,66.436920000000043],[-86.756957999999941,66.441360000000088],[-86.783614999999941,66.447479000000101],[-86.796386999999925,66.448593000000074],[-86.807495000000017,66.446091000000024],[-86.811110999999983,66.441925000000083],[-86.809158000000025,66.437195000000088],[-86.804992999999968,66.432480000000055],[-86.651671999999962,66.324158000000011],[-86.638335999999924,66.315262000000075],[-86.612777999999992,66.311646000000053],[-86.49722300000002,66.29942299999999],[-86.396117999999944,66.289703000000088],[-86.30610699999994,66.276382000000126],[-86.142226999999991,66.239699999999971],[-86.076110999999912,66.22387700000013],[-85.927489999999977,66.186370999999951],[-85.913895000000025,66.182205000000067],[-85.901108000000022,66.173035000000027],[-85.897232000000031,66.168319999999994],[-85.977492999999924,66.077773999999977],[-85.975829999999917,66.073044000000095],[-85.973891999999978,66.038879000000009],[-85.974716000000001,66.033875000000023],[-85.979995999999915,66.028594999999996],[-85.990554999999972,66.024155000000121],[-86.077224999999999,65.99581900000004],[-86.121384000000035,65.984421000000054],[-86.217498999999975,65.957489000000123],[-86.22084000000001,65.952209000000039],[-86.231383999999935,65.941925000000026],[-86.239166000000012,65.936646000000053],[-86.249435000000005,65.93193100000002],[-86.326400999999976,65.90498400000007],[-86.348617999999874,65.899719000000005],[-86.360275000000001,65.899155000000064],[-86.420272999999952,65.892487000000074],[-86.472228999999857,65.839980999999966],[-86.496947999999975,65.808029000000033],[-86.49499499999996,65.803314],[-86.486389000000031,65.799149],[-86.464171999999962,65.790543000000071],[-86.455276000000026,65.786102000000142],[-86.453888000000006,65.78137200000009],[-86.451110999999855,65.747208000000057],[-86.454177999999956,65.742203000000018],[-86.530288999999868,65.695525999999916],[-86.716109999999958,65.617477000000065],[-86.819457999999997,65.560532000000023],[-86.829726999999991,65.55581699999999],[-86.84056099999998,65.553314000000057],[-86.852782999999931,65.55442800000003],[-86.865828999999962,65.557480000000112],[-86.878052000000025,65.557754999999929],[-86.888610999999969,65.555251999999996],[-86.953888000000006,65.53915400000011],[-86.972777999999948,65.520263999999997],[-87.017226999999991,65.486923000000047],[-87.024445000000014,65.481659000000036],[-87.035278000000005,65.479156000000046],[-87.05471799999998,65.486649000000114],[-87.067504999999983,65.488875999999948],[-87.077788999999996,65.484985000000052],[-87.087783999999999,65.479431000000091],[-87.095001000000025,65.474152000000117],[-87.110275000000001,65.458602999999982],[-87.118606999999997,65.4433140000001],[-87.119155999999975,65.438309000000061],[-87.11500499999994,65.433594000000028],[-87.101944000000003,65.429703000000131],[-87.111664000000019,65.390274000000034],[-87.351105000000018,65.327209000000096],[-87.361938000000009,65.324432000000002],[-87.372771999999941,65.322769000000051],[-87.395843999999897,65.321380999999974],[-87.430831999999953,65.320831000000112],[-87.833327999999938,65.323883000000023],[-87.869155999999975,65.325272000000041],[-87.893065999999976,65.326660000000118],[-87.941939999999875,65.330826000000059],[-87.96665999999999,65.333054000000004],[-88.004456000000005,65.339157000000114],[-88.030288999999925,65.345260999999994],[-88.070281999999963,65.356093999999928],[-88.09445199999999,65.363312000000121],[-88.212783999999886,65.40277100000003],[-88.221389999999985,65.407211000000075],[-88.234726000000023,65.416091999999992],[-88.243331999999953,65.425262000000032],[-88.245270000000005,65.429977000000065],[-88.25389100000001,65.439148000000046],[-88.31361400000003,65.479156000000046],[-88.333617999999944,65.492477000000008],[-88.548614999999984,65.582764000000111],[-88.55972300000002,65.586929000000112],[-88.573058999999944,65.589706000000035],[-88.58555599999994,65.590820000000008],[-88.633330999999998,65.591094999999996],[-88.645554000000004,65.592208999999968],[-88.658889999999928,65.594986000000063],[-88.68582200000003,65.601929000000098],[-88.829726999999878,65.641372999999987],[-88.828888000000006,65.644150000000081],[-88.756667999999991,65.642761000000064],[-88.62249799999995,65.637207000000103],[-88.49888599999997,65.626923000000033],[-88.513335999999981,65.644440000000088],[-88.779723999999987,65.676085999999941],[-88.949721999999895,65.68664600000011],[-88.962783999999999,65.688583000000108],[-89.000838999999985,65.698593000000017],[-89.09944200000001,65.725266000000033],[-89.124435000000005,65.733322000000101],[-89.133895999999936,65.737487999999985],[-89.140563999999927,65.74192800000003],[-89.14527899999996,65.746368000000018],[-89.147507000000019,65.751388999999961],[-89.147231999999974,65.761107999999979],[-89.149444999999957,65.765823000000012],[-89.156386999999938,65.770264000000111],[-89.174438000000009,65.778594999999996],[-89.379990000000021,65.846375000000023],[-89.525283999999999,65.886932000000002],[-89.597228999999857,65.910812000000021],[-89.664718999999934,65.934982000000048],[-89.671660999999915,65.939423000000147],[-89.70944199999991,65.942200000000014],[-89.967223999999987,65.948593000000017],[-89.991104000000007,65.947478999999987],[-90,65.944359000000134],[-89.964171999999962,65.936919999999986],[-89.939163000000008,65.93609600000002],[-89.926391999999908,65.934143000000063],[-89.89916999999997,65.928589000000045],[-89.87110899999999,65.921097000000145],[-89.834166999999979,65.910263000000043],[-89.799438000000009,65.898331000000098],[-89.740829000000019,65.873306000000071],[-89.731673999999998,65.86914100000007],[-89.726943999999946,65.839980999999966],[-89.729172000000005,65.834717000000012],[-89.736389000000031,65.829162999999994],[-89.746947999999975,65.826385000000016],[-89.76916499999993,65.822495000000004],[-89.793334999999956,65.822495000000004],[-89.818892999999889,65.825546000000031],[-89.832229999999925,65.828323000000125],[-89.843886999999938,65.832214000000022],[-89.89056399999987,65.853043000000014],[-89.902221999999995,65.857208000000014],[-90.048614999999984,65.888321000000019],[-90.073623999999938,65.890273999999977],[-90.085555999999997,65.889159999999947],[-90.119995000000017,65.883880999999974],[-90.162780999999995,65.872207999999944],[-90.207229999999925,65.864426000000037],[-90.241942999999992,65.861374000000069],[-90.265838999999971,65.860535000000141],[-90.315001999999993,65.862198000000035],[-90.404448999999943,65.871093999999971],[-90.418335000000013,65.87414600000011],[-90.427489999999977,65.878036000000066],[-90.432495000000017,65.882751000000098],[-90.425551999999925,65.888321000000019],[-90.393065999999919,65.896102999999982],[-90.357773000000009,65.898041000000092],[-90.333327999999995,65.897217000000126],[-90.272781000000009,65.897491000000059],[-90.225554999999929,65.900542999999971],[-90.215560999999923,65.904434000000037],[-90.213333000000034,65.909424000000115],[-90.213333000000034,65.914428999999984],[-90.220551,65.918868999999972],[-90.234725999999966,65.922485000000052],[-90.258895999999993,65.922485000000052],[-90.293335000000013,65.918593999999985],[-90.360275000000001,65.907760999999994],[-90.418883999999878,65.901093000000003],[-90.574172999999973,65.896652000000074],[-90.596114999999941,65.896652000000074],[-90.708618000000001,65.902480999999909],[-90.733886999999925,65.904160000000104],[-90.850280999999995,65.915267999999912],[-91.068344000000025,65.940262000000075],[-91.316390999999953,65.969986000000119],[-91.328613000000018,65.969986000000119],[-91.340285999999935,65.96887200000009],[-91.429168999999945,65.95109599999995],[-91.444442999999865,65.930817000000047],[-91.362777999999935,65.893599999999992],[-91.353332999999964,65.889434999999992],[-91.341385000000002,65.885818000000029],[-91.328063999999983,65.883880999999974],[-91.189437999999939,65.853043000000014],[-91.06082200000003,65.813309000000061],[-91.046660999999915,65.809417999999994],[-91.020553999999947,65.806091000000094],[-91.008621000000005,65.806091000000094],[-91.004180999999903,65.811371000000122],[-91.013900999999976,65.820540999999992],[-91.05471799999998,65.846649000000127],[-91.108337000000006,65.891373000000101],[-91.123046999999929,65.904709000000082],[-91.125823999999852,65.909714000000122],[-91.121384000000035,65.914993000000095],[-91.099730999999963,65.919982999999945],[-91.088057999999933,65.921097000000145],[-91.063889000000017,65.921097000000145],[-90.990279999999984,65.919982999999945],[-90.976943999999946,65.918045000000006],[-90.948607999999979,65.910812000000021],[-90.921386999999925,65.905258000000003],[-90.90834000000001,65.903595000000109],[-90.741942999999992,65.887772000000041],[-90.692489999999964,65.886108000000036],[-90.531676999999945,65.880539000000056],[-90.078063999999983,65.812485000000095],[-90.013900999999919,65.800262000000032],[-90,65.797400999999923],[-89.986938000000009,65.794708000000071],[-89.960006999999962,65.788879000000065],[-89.932220000000029,65.78137200000009],[-89.744995000000017,65.724700999999982],[-89.720275999999956,65.713042999999971],[-89.660278000000005,65.683318999999983],[-89.653335999999911,65.678863999999976],[-89.428328999999962,65.529434000000037],[-89.308883999999978,65.469437000000084],[-89.146118000000001,65.400543000000084],[-89.065551999999911,65.333054000000004],[-89.054442999999992,65.328873000000101],[-89.044448999999986,65.32777400000009],[-88.771118000000001,65.307754999999986],[-88.733886999999982,65.306090999999981],[-88.710281000000009,65.306090999999981],[-88.698607999999979,65.30693100000002],[-88.676940999999999,65.31053200000008],[-88.606948999999929,65.30693100000002],[-88.490279999999984,65.293320000000051],[-88.389174999999909,65.277205999999921],[-88.364715999999873,65.274994000000049],[-88.215012000000002,65.277205999999921],[-88.133330999999941,65.278320000000122],[-88.109725999999966,65.278046000000018],[-88.096664000000033,65.274994000000049],[-88.061660999999958,65.258881000000031],[-88.021117999999888,65.274704000000042],[-88.011123999999938,65.278320000000122],[-87.978058000000033,65.283599999999979],[-87.943603999999993,65.286102000000085],[-87.731383999999991,65.290267999999969],[-87.673049999999989,65.291366999999923],[-87.602218999999934,65.290542999999957],[-87.357773000000009,65.270827999999995],[-87.21055599999994,65.254165999999998],[-87.075012000000015,65.236648999999943],[-86.957779000000016,65.165817000000004],[-86.944992000000013,65.156936999999971],[-86.936935000000005,65.147766000000047],[-86.933318999999983,65.138046000000145],[-86.967498999999975,65.059417999999994],[-86.970275999999899,65.054428000000087],[-86.977492999999981,65.048874000000126],[-86.997771999999941,65.040816999999947],[-87.040557999999976,65.031097000000045],[-87.110001000000011,64.999145999999996],[-87.430283000000031,64.711928999999998],[-87.521666999999923,64.621094000000085],[-87.571944999999971,64.573607999999979],[-87.579178000000013,64.568054000000018],[-87.586120999999991,64.562759000000142],[-87.595550999999944,64.557205000000124],[-87.698043999999925,64.527206000000092],[-87.764419999999973,64.520904999999914],[-87.786391999999921,64.51998900000001],[-87.797225999999966,64.518051000000071],[-87.807219999999973,64.514434999999992],[-87.855270000000019,64.43942300000009],[-87.855835000000013,64.429428000000144],[-87.863616999999977,64.379700000000014],[-87.8663939999999,64.369705000000124],[-87.983886999999925,64.191086000000041],[-87.990829000000019,64.185805999999957],[-88.113327000000027,64.136108000000036],[-88.12332200000003,64.133605999999986],[-88.285552999999936,64.106369000000029],[-88.551666000000012,64.025543000000084],[-88.553878999999995,64.020538000000045],[-88.674437999999952,63.980269999999962],[-88.684432999999956,63.977486000000056],[-88.736663999999962,63.968323000000055],[-88.759444999999971,63.969437000000028],[-88.993880999999931,63.998604000000114],[-89.077788999999882,64.026093000000117],[-89.110000999999954,64.03804000000008],[-89.127212999999983,64.04664600000001],[-89.150833000000034,64.059417999999994],[-89.182770000000005,64.081375000000037],[-89.198043999999982,64.094711000000018],[-89.202224999999999,64.099426000000051],[-89.208617999999944,64.108871000000079],[-89.210555999999997,64.118317000000047],[-89.210555999999997,64.123306000000014],[-89.212783999999942,64.128036000000066],[-89.22084000000001,64.137207000000046],[-89.244720000000029,64.15498400000007],[-89.251113999999973,64.159424000000115],[-89.260833999999875,64.160538000000088],[-89.284164000000033,64.141937000000041],[-89.286391999999978,64.136658000000068],[-89.182495000000017,64.036652000000004],[-89.096664000000033,63.973877000000016],[-89.061661000000015,63.960823000000119],[-89.051101999999958,63.961936999999921],[-89.040833000000021,63.958602999999925],[-89.023620999999991,63.950272000000041],[-89.028609999999958,63.946098000000006],[-89.039443999999946,63.944991999999957],[-89.050551999999925,63.944991999999957],[-89.246657999999968,63.959717000000126],[-89.254729999999938,63.963051000000121],[-89.321395999999936,63.996658000000025],[-89.396117999999944,64.038589000000002],[-89.507232999999928,64.070540999999992],[-89.551101999999958,64.07748399999997],[-89.55860899999999,64.073883000000137],[-89.56082200000003,64.068878000000041],[-89.56527699999998,64.019149999999968],[-89.563323999999852,64.009430000000066],[-89.554442999999992,64.000274999999988],[-89.548049999999932,63.996101000000124],[-89.530838000000017,63.987770000000069],[-89.517775999999913,63.978874000000133],[-89.489990000000034,63.956657000000064],[-89.485549999999989,63.951934999999992],[-89.483321999999873,63.947211999999979],[-89.485549999999989,63.94221500000009],[-89.49722300000002,63.943046999999979],[-89.521117999999944,63.955826000000059],[-89.527495999999985,63.960274000000027],[-89.577224999999999,63.995544000000052],[-89.585555999999997,64.004439999999988],[-89.589995999999928,64.014160000000061],[-89.594161999999926,64.018600000000106],[-89.637787000000003,64.049423000000104],[-89.644164999999987,64.053864000000033],[-89.699722000000008,64.076385000000016],[-89.712219000000005,64.079437000000098],[-89.719161999999983,64.074707000000103],[-89.726943999999946,64.047484999999938],[-89.785552999999993,64.076935000000049],[-89.818068999999923,64.098602000000085],[-89.822509999999909,64.103317000000118],[-89.822783999999956,64.10803199999998],[-89.820557000000008,64.113312000000008],[-89.80972300000002,64.128860000000032],[-89.802215999999987,64.132476999999994],[-89.780563000000029,64.134430000000123],[-89.757507000000032,64.133605999999986],[-89.746947999999975,64.135544000000095],[-89.738051999999925,64.14027399999992],[-89.735824999999977,64.145263999999997],[-89.75111400000003,64.218048000000124],[-89.75556899999998,64.227478000000019],[-89.760009999999966,64.232208000000071],[-89.773055999999997,64.240814],[-89.784163999999919,64.244705000000067],[-89.794158999999922,64.241928000000144],[-89.801102000000014,64.237487999999928],[-89.805557000000022,64.227203000000031],[-89.803328999999962,64.222487999999998],[-89.803054999999972,64.20277400000009],[-89.81639100000001,64.148041000000092],[-89.823623999999995,64.144440000000031],[-89.845550999999944,64.142761000000007],[-89.879439999999988,64.142487000000074],[-89.892226999999991,64.145538000000101],[-89.909728999999913,64.158599999999922],[-89.922501000000011,64.161377000000016],[-89.967498999999918,64.161377000000016],[-89.986938000000009,64.159714000000122],[-90.124161000000015,64.128586000000098],[-90.118057000000022,64.125259000000142],[-90.104995999999971,64.121368000000075],[-90.05860899999999,64.109710999999947],[-89.950561999999991,64.086929000000055],[-89.946105999999986,64.057480000000055],[-89.904175000000009,64.015823000000012],[-89.866942999999992,63.98971599999993],[-89.841674999999896,63.983879000000002],[-89.831116000000009,63.979988000000105],[-89.824447999999961,63.97554800000006],[-89.820281999999963,63.971099999999922],[-89.813613999999973,63.946938000000046],[-89.813613999999973,63.93721000000005],[-89.815552000000025,63.931938000000116],[-89.821944999999971,63.926384000000098],[-89.828612999999962,63.921104000000014],[-89.838057999999933,63.917212999999947],[-89.938888999999961,63.909713999999951],[-89.951400999999976,63.912491000000045],[-89.989440999999999,63.92193600000013],[-89.998336999999992,63.926102000000014],[-89.995270000000005,63.929161000000022],[-89.974715999999944,63.933052000000089],[-89.964721999999995,63.935822000000087],[-89.955276000000026,63.939712999999983],[-89.948607999999979,63.945267000000001],[-89.946655000000021,63.950546000000145],[-89.946655000000021,63.960274000000027],[-89.946655000000021,63.965271000000087],[-89.94888299999991,63.969986000000119],[-89.955565999999976,63.9741590000001],[-89.968613000000005,63.978043000000127],[-90,63.984043000000042],[-90.18249499999996,64.0086060000001],[-90.194153000000028,64.009430000000066],[-90.249435000000005,64.007492000000127],[-90.271392999999989,64.006377999999927],[-90.279175000000009,64.00360100000006],[-90.275009000000011,63.999161000000015],[-90.262786999999889,63.997214999999926],[-90.227492999999981,63.994438000000059],[-90.214721999999881,63.990829000000019],[-90.196944999999914,63.982491000000095],[-90.113892000000021,63.930824000000086],[-89.975005999999951,63.825829000000056],[-89.966400000000021,63.816939999999988],[-89.964171999999962,63.811935000000119],[-89.964171999999962,63.80221599999993],[-89.966110000000015,63.79222100000004],[-89.96833799999996,63.782211000000132],[-89.972503999999958,63.776657000000114],[-89.981673999999998,63.773048000000131],[-90.057770000000005,63.744438000000059],[-90.089995999999928,63.698874999999987],[-90.148894999999982,63.629158000000075],[-90.156386999999938,63.626656000000025],[-90.205275999999913,63.61221299999994],[-90.236388999999917,63.607216000000051],[-90.258620999999891,63.607216000000051],[-90.429442999999992,63.615829000000019],[-90.461394999999982,63.640549000000078],[-90.468613000000005,63.652309000000002],[-90.488051999999982,63.672493000000088],[-90.501113999999973,63.676383999999985],[-90.611937999999952,63.70249200000012],[-90.623885999999914,63.704162999999994],[-90.634445000000028,63.703049000000021],[-90.64416499999993,63.700272000000098],[-90.701400999999976,63.662209000000075],[-90.699157999999954,63.657494000000042],[-90.686660999999958,63.654709000000139],[-90.677779999999927,63.654433999999981],[-90.655563000000029,63.654709000000139],[-90.623610999999983,63.657767999999976],[-90.613891999999908,63.660545000000013],[-90.60972599999991,63.665825000000098],[-90.610001000000011,63.675827000000083],[-90.602782999999988,63.679436000000067],[-90.590285999999992,63.676658999999972],[-90.55972300000002,63.659714000000008],[-90.555556999999965,63.65526600000004],[-90.553329000000019,63.650543000000084],[-90.541381999999942,63.617210000000057],[-90.541381999999942,63.61221299999994],[-90.545273000000009,63.606941000000006],[-90.551391999999964,63.601387000000045],[-90.56082200000003,63.597487999999998],[-90.571120999999948,63.595543000000021],[-90.733886999999925,63.573883000000023],[-90.828063999999983,63.561661000000072],[-90.84944200000001,63.559714999999983],[-90.930556999999965,63.564156000000082],[-90.942763999999954,63.566666000000112],[-90.978881999999999,63.576103000000046],[-90.989440999999943,63.579994000000113],[-91.035003999999958,63.5991590000001],[-91.137786999999889,63.630821000000026],[-91.158051,63.635551000000078],[-91.188599000000011,63.62943300000012],[-91.198883000000023,63.628601000000003],[-91.210281000000009,63.628326000000015],[-91.233321999999987,63.629990000000021],[-91.375823999999966,63.659157000000107],[-91.399733999999967,63.666664000000083],[-91.406386999999938,63.671104000000071],[-91.406661999999983,63.676102000000071],[-91.402785999999992,63.681381000000044],[-91.393616000000009,63.685265000000072],[-91.371384000000035,63.685546999999985],[-91.34973100000002,63.677772999999945],[-91.336945000000014,63.675270000000012],[-91.329453000000001,63.677772999999945],[-91.333892999999989,63.682495000000017],[-91.34056099999998,63.686652999999978],[-91.34944200000001,63.690826000000129],[-91.362503000000004,63.694435000000112],[-91.411666999999909,63.707214000000022],[-91.529174999999952,63.729987999999992],[-91.540558000000033,63.730820000000051],[-91.551392000000021,63.729713000000118],[-91.560821999999916,63.726653999999996],[-91.569457999999997,63.721930999999984],[-91.575561999999934,63.716385000000116],[-91.584166999999979,63.711380000000077],[-91.595550999999887,63.711380000000077],[-91.910552999999936,63.740546999999992],[-92.06639100000001,63.74193600000001],[-92.136123999999938,63.745544000000109],[-92.148620999999991,63.748047000000099],[-92.175003000000004,63.755271999999991],[-92.186110999999983,63.758888000000013],[-92.434433000000013,63.804993000000024],[-92.482772999999952,63.811935000000119],[-92.471664000000033,63.80832700000002],[-92.437774999999931,63.79222100000004],[-92.428328999999962,63.783051],[-92.425551999999982,63.778603000000032],[-92.422500999999954,63.748878000000104],[-92.415832999999964,63.744713000000104],[-92.406661999999926,63.740546999999992],[-92.395553999999947,63.736938000000009],[-92.382766999999944,63.734161000000086],[-92.348891999999921,63.733879000000059],[-92.306380999999931,63.738602000000014],[-92.263061999999934,63.741379000000109],[-92.251113999999973,63.740546999999992],[-92.148055999999997,63.716934000000094],[-92.103881999999942,63.701660000000004],[-92.101669000000015,63.696938000000102],[-92.105559999999969,63.691658000000018],[-92.204177999999956,63.638046000000088],[-92.252501999999993,63.623878000000047],[-92.262512000000015,63.62193300000007],[-92.385009999999909,63.592491000000109],[-92.48971599999993,63.567215000000033],[-92.493056999999965,63.540832999999964],[-92.480835000000013,63.527214000000072],[-92.429168999999945,63.546944000000053],[-92.336394999999868,63.556938000000059],[-92.279998999999975,63.556099000000131],[-92.20666499999993,63.606102000000078],[-92.202788999999882,63.611381999999935],[-92.193877999999927,63.615273000000002],[-92.165282999999988,63.624435000000119],[-91.971114999999998,63.679993000000138],[-91.830291999999929,63.712212000000022],[-91.820006999999976,63.714157],[-91.809432999999956,63.715271000000143],[-91.776107999999965,63.715828000000045],[-91.763335999999981,63.713325999999995],[-91.695266999999944,63.690544000000045],[-91.670837000000006,63.678047000000049],[-91.617492999999911,63.648880000000133],[-91.613051999999925,63.644440000000145],[-91.611388999999974,63.639160000000061],[-91.61250299999989,63.629158000000075],[-91.618056999999965,63.613608999999997],[-91.617217999999923,63.603882000000056],[-91.607498000000021,63.584991000000002],[-91.600829999999974,63.580551000000014],[-91.39805599999994,63.524994000000049],[-91.274170000000026,63.502495000000124],[-91.133056999999951,63.478043000000014],[-90.945540999999935,63.440269000000114],[-90.854720999999984,63.408600000000092],[-90.915557999999919,63.41054500000007],[-90.932770000000005,63.418602000000078],[-90.945540999999935,63.422493000000145],[-90.956954999999937,63.423325000000034],[-90.96833799999996,63.423050000000046],[-90.975006000000008,63.419441000000006],[-90.972777999999948,63.414711000000011],[-90.957503999999972,63.401382000000069],[-90.942214999999976,63.393051000000014],[-90.931380999999931,63.389160000000118],[-90.918883999999935,63.386383000000023],[-90.816665999999998,63.369156000000032],[-90.741942999999992,63.360825000000091],[-90.690825999999959,63.228324999999984],[-90.627486999999974,63.059433000000013],[-90.649169999999913,63.036385000000109],[-90.739990000000034,62.962212000000136],[-90.775832999999977,62.941933000000006],[-90.785004000000015,62.938041999999939],[-90.794998000000021,62.936104],[-90.825835999999924,62.933052000000089],[-90.847778000000005,62.932770000000005],[-90.870270000000005,62.934433000000126],[-90.929442999999992,62.944435000000112],[-90.940551999999968,62.945267000000001],[-91.017226999999934,62.946380999999974],[-91.038329999999917,62.944153000000028],[-91.048049999999989,62.94221500000009],[-91.173049999999989,62.908600000000035],[-91.18249499999996,62.905823000000112],[-91.190825999999959,62.900825999999995],[-91.196654999999964,62.895271000000093],[-91.200561999999934,62.88999200000012],[-91.199721999999895,62.870270000000062],[-91.207229999999981,62.8597180000001],[-91.213333000000034,62.854164000000083],[-91.356383999999991,62.788605000000018],[-91.366652999999928,62.787498000000085],[-91.440276999999867,62.782768000000033],[-91.46166999999997,62.782494000000099],[-91.579178000000013,62.799995000000081],[-91.840285999999935,62.826385000000073],[-91.990279999999984,62.84693900000002],[-92.087508999999898,62.818886000000077],[-92.214721999999995,62.824715000000083],[-92.223052999999993,62.828880000000083],[-92.236114999999927,62.832214000000079],[-92.339995999999985,62.843605000000025],[-92.361937999999952,62.844154000000003],[-92.382766999999944,62.841660000000047],[-92.392501999999922,62.839713999999958],[-92.402221999999995,62.837493999999992],[-92.420836999999949,62.831383000000073],[-92.438323999999966,62.823607999999979],[-92.455275999999969,62.814712999999983],[-92.459441999999967,62.810272000000055],[-92.458618000000001,62.800270000000069],[-92.455841000000021,62.79583000000008],[-92.451400999999919,62.791107000000068],[-92.333617999999944,62.709991000000116],[-92.232773000000009,62.673049999999989],[-92.188598999999954,62.659156999999993],[-92.178329000000019,62.65638000000007],[-92.067779999999971,62.651657000000057],[-92.034728999999857,62.65026899999998],[-91.971389999999928,62.653320000000008],[-91.948883000000023,62.651932000000102],[-91.925827000000027,62.644440000000145],[-91.908614999999998,62.636383000000023],[-91.882766999999944,62.624161000000015],[-91.880554000000018,62.619438000000059],[-91.883330999999998,62.604438999999957],[-91.885009999999909,62.5991590000001],[-91.890288999999996,62.588600000000042],[-91.941375999999991,62.534996000000035],[-91.948043999999982,62.531380000000013],[-92.053328999999962,62.526657],[-92.153060999999923,62.598045000000127],[-92.163329999999974,62.600829999999974],[-92.186110999999983,62.603324999999984],[-92.196655000000021,62.603049999999996],[-92.266112999999962,62.595268000000033],[-92.275009000000011,62.591377000000136],[-92.271399999999971,62.578049000000135],[-92.275557999999933,62.560272000000111],[-92.325561999999991,62.540833000000021],[-92.365004999999996,62.533332999999914],[-92.384734999999978,62.529990999999995],[-92.396118000000001,62.530823000000112],[-92.430831999999953,62.535827999999981],[-92.468062999999972,62.54444100000012],[-92.539169000000015,62.532493999999986],[-92.606110000000001,62.464996000000042],[-92.617767000000015,62.466660000000047],[-92.710006999999962,62.465827999999931],[-92.726105000000018,62.444153000000142],[-92.729720999999984,62.438599000000124],[-92.731109999999944,62.433601000000124],[-92.730834999999956,62.428604000000064],[-92.724716000000001,62.358604000000014],[-92.714721999999995,62.343880000000013],[-92.665833000000021,62.332771000000093],[-92.628052000000025,62.322220000000016],[-92.606658999999922,62.31471300000004],[-92.598052999999936,62.310821999999973],[-92.585006999999905,62.302216000000044],[-92.584441999999967,62.297493000000088],[-92.585830999999871,62.292220999999984],[-92.601668999999958,62.265549000000078],[-92.610275000000001,62.261382999999967],[-92.603995999999938,62.236324000000138],[-92.573058999999944,62.196098000000006],[-92.568619000000012,62.191657999999961],[-92.561934999999949,62.187492000000077],[-92.536666999999966,62.175551999999982],[-92.486388999999974,62.161377000000073],[-92.478057999999919,62.157493999999986],[-92.47001599999993,62.146614],[-92.477782999999988,62.143883000000017],[-92.48721299999994,62.144157000000121],[-92.592223999999987,62.154990999999995],[-92.603881999999942,62.156379999999956],[-92.625823999999909,62.191657999999961],[-92.64044199999995,62.209098999999924],[-92.638435000000015,62.212273000000039],[-92.638275000000021,62.215103000000056],[-92.639938000000029,62.217770000000087],[-92.700561999999991,62.265549000000078],[-92.741103999999893,62.28694200000001],[-92.747498000000007,62.289993000000038],[-92.845551,62.309433000000013],[-93.075561999999991,62.332214000000022],[-93.12222300000002,62.334991000000116],[-92.904174999999952,62.262215000000083],[-92.892226999999991,62.259720000000073],[-92.866393999999957,62.263054000000068],[-92.839995999999985,62.260276999999974],[-92.828612999999905,62.257217000000082],[-92.780288999999868,62.236938000000123],[-92.765288999999996,62.224434000000088],[-92.764724999999942,62.219437000000028],[-92.790282999999988,62.177489999999921],[-92.795836999999949,62.172768000000019],[-92.800963999999965,62.172905000000014],[-92.840285999999992,62.174438000000009],[-92.851943999999946,62.175827000000027],[-92.862503000000004,62.17943600000001],[-92.954453000000001,62.192764000000011],[-93.06806899999998,62.174995000000081],[-93.076674999999909,62.17193600000013],[-93.110000999999954,62.156654000000117],[-93.114440999999999,62.15415999999999],[-93.119720000000029,62.148330999999985],[-93.126937999999882,62.132492000000013],[-93.124160999999958,62.128044000000045],[-93.119445999999925,62.123604000000057],[-93.081389999999942,62.10443900000007],[-93.069167999999877,62.103607000000011],[-93.059722999999906,62.105826999999977],[-93.037506000000008,62.121658000000139],[-93.028885000000002,62.12471000000005],[-93.019164999999987,62.126099000000067],[-93.008057000000008,62.125549000000035],[-92.940552000000025,62.115547000000049],[-92.933060000000012,62.11360900000011],[-92.930557000000022,62.109160999999972],[-92.931380999999988,62.104164000000083],[-92.936935000000005,62.099159000000043],[-92.968338000000017,62.077217000000132],[-92.991104000000007,62.067772000000105],[-93.140839000000028,62.009720000000129],[-93.237212999999997,62.02693899999997],[-93.246384000000035,62.033333000000027],[-93.277495999999871,62.042770000000132],[-93.302779999999927,62.049438000000123],[-93.325286999999946,62.051384000000041],[-93.411391999999978,62.03138000000007],[-93.413054999999986,62.025551000000064],[-93.39416499999993,62.013610999999969],[-93.385559000000001,62.009995000000117],[-93.373610999999983,62.007500000000107],[-93.361937999999952,62.00610400000005],[-93.342223999999931,62.004997000000117],[-93.318893000000003,61.998047000000099],[-93.244445999999982,61.969437000000028],[-93.235549999999989,61.965545999999961],[-93.222228999999913,61.957496999999989],[-93.218338000000017,61.95249200000012],[-93.217223999999987,61.947769000000108],[-93.281951999999876,61.891380000000083],[-93.299728000000016,61.885826000000066],[-93.309157999999911,61.883606000000043],[-93.330565999999919,61.886383000000137],[-93.442489999999964,61.915268000000026],[-93.461670000000026,61.922493000000088],[-93.616104000000007,61.939986999999974],[-93.600280999999939,61.879158000000075],[-93.61721799999998,61.861938000000123],[-93.556945999999982,61.847771000000137],[-93.435821999999973,61.808883999999978],[-93.282776000000013,61.788887000000102],[-93.248610999999983,61.78472099999999],[-93.237777999999935,61.777214000000072],[-93.242492999999968,61.767493999999999],[-93.25556899999998,61.742493000000138],[-93.356948999999986,61.707214000000022],[-93.449431999999945,61.682213000000047],[-93.542769999999962,61.663321999999994],[-93.594161999999926,61.648048000000074],[-93.654998999999862,61.629158000000132],[-93.856658999999979,61.549164000000133],[-93.984726000000023,61.456100000000106],[-93.985275000000001,61.454163000000051],[-93.968613000000005,61.396660000000054],[-93.932495000000017,61.387214999999969],[-93.921935999999903,61.385269000000108],[-93.911666999999966,61.385826000000009],[-93.906386999999995,61.387497000000053],[-93.895003999999972,61.389160000000004],[-93.884734999999864,61.389717000000076],[-93.868056999999965,61.389160000000004],[-93.857498000000021,61.385551000000135],[-93.820281999999963,61.355826999999977],[-93.817504999999983,61.351386999999932],[-93.819167999999991,61.347214000000008],[-93.839447000000007,61.319443000000092],[-93.84445199999999,61.316101000000003],[-93.858046999999942,61.312767000000008],[-93.932220000000029,61.296661000000029],[-93.940552000000025,61.294998000000078],[-94.057219999999973,61.178329000000076],[-94.14805599999994,61.043610000000058],[-94.226943999999946,60.942764000000068],[-94.349166999999909,60.858603999999957],[-94.353333000000021,60.853607000000068],[-94.391112999999905,60.798882000000049],[-94.415282999999988,60.762215000000026],[-94.415008999999998,60.756660000000124],[-94.451674999999966,60.671104000000128],[-94.505004999999983,60.549995000000138],[-94.509444999999971,60.544159000000093],[-94.563048999999978,60.522217000000012],[-94.575835999999981,60.52027099999998],[-94.611389000000031,60.52777100000003],[-94.67332499999992,60.522490999999945],[-94.671660999999915,60.466103000000032],[-94.629439999999988,60.41832700000009],[-94.626388999999961,60.413605000000018],[-94.614715999999873,60.38999200000012],[-94.613891999999908,60.380547000000035],[-94.615004999999996,60.375266999999951],[-94.620834000000002,60.363883999999985],[-94.681945999999925,60.224158999999929],[-94.673614999999927,60.191101000000117],[-94.704726999999934,60.091933999999981],[-94.707503999999972,60.083603000000096],[-94.711394999999925,60.078330999999991],[-94.714721999999938,60.075272000000041],[-94.728333000000021,60.071380999999974],[-94.746658000000025,60.069992000000127],[-94.752791999999943,60.06860400000005],[-94.766402999999912,60.061378000000104],[-94.771117999999944,60.055549999999982],[-94.803878999999995,60.008330999999998],[-94.803878999999995,60.003609000000097],[-94.800430000000006,59.999565000000132],[-94.819167999999991,59.964714000000129],[-94.821670999999924,59.959160000000111],[-94.822509999999909,59.954162999999994],[-94.820556999999951,59.944434999999999],[-94.803329000000019,59.877768999999944],[-94.803329000000019,59.711104999999975],[-94.819167999999991,59.63638300000008],[-94.788605000000018,59.51527400000009],[-94.735275000000001,59.426384000000098],[-94.680557000000022,59.357215999999994],[-94.715285999999992,59.323326000000066],[-94.770003999999972,59.29833200000013],[-94.775009000000011,59.29332700000009],[-94.781386999999995,59.263611000000026],[-94.782227000000034,59.258331000000112],[-94.789718999999991,59.092216000000064],[-94.681670999999994,58.975822000000107],[-94.679992999999968,58.97137500000008],[-94.676392000000021,58.93443300000007],[-94.597777999999948,58.878326000000072],[-94.586394999999868,58.874992000000077],[-94.486938000000009,58.815269000000058],[-94.482223999999974,58.811104000000057],[-94.477782999999931,58.806656000000089],[-94.474716000000001,58.802216000000044],[-94.457503999999915,58.774162000000047],[-94.453338999999914,58.765274000000034],[-94.452788999999882,58.759720000000016],[-94.453338999999914,58.750549000000092],[-94.448607999999979,58.736382000000106],[-94.446105999999986,58.731658999999979],[-94.43720999999988,58.72304500000007],[-94.421660999999972,58.716385000000059],[-94.410552999999993,58.714157000000114],[-94.361388999999974,58.712769000000037],[-94.343613000000005,58.715546000000074],[-94.326950000000011,58.721656999999993],[-94.291107000000011,58.743606999999997],[-94.279175000000009,58.771103000000039],[-94.228881999999999,58.784996000000092],[-94.234725999999966,58.714714000000015],[-94.252228000000002,58.649994000000049],[-94.285277999999892,58.512496999999996],[-94.287216000000001,58.438041999999996],[-94.289168999999958,58.427773000000116],[-94.291672000000005,58.422218000000044],[-94.296660999999972,58.415825000000098],[-94.326400999999976,58.349159000000043],[-94.348617999999988,58.2866590000001],[-94.351668999999902,58.276656999999943],[-94.363892000000021,58.22387700000013],[-94.363327000000027,58.218880000000013],[-94.360275000000001,58.220543000000134],[-94.3558349999999,58.226097000000095],[-94.259445000000028,58.351386999999988],[-94.231110000000001,58.390549000000021],[-94.228606999999954,58.396103000000039],[-94.226943999999946,58.406380000000013],[-94.231110000000001,58.430824000000143],[-94.238891999999964,58.494155999999975],[-94.24610899999999,58.576385000000016],[-94.24610899999999,58.586654999999951],[-94.245269999999948,58.59165999999999],[-94.242766999999958,58.597214000000008],[-94.143889999999942,58.763610999999912],[-94.113892000000021,58.762215000000083],[-93.995833999999945,58.760826000000066],[-93.949158000000011,58.76249700000011],[-93.843886999999938,58.767769000000044],[-93.798614999999927,58.773604999999918],[-93.728058000000033,58.783882000000119],[-93.709732000000031,58.785827999999981],[-93.673049999999932,58.780823000000112],[-93.575561999999991,58.763885000000016],[-93.475554999999986,58.732491000000039],[-93.350554999999929,58.74582700000002],[-93.343886999999881,58.750832000000059],[-93.327788999999996,58.757217000000082],[-93.319167999999991,58.758606000000043],[-93.236664000000019,58.766936999999984],[-93.216659999999933,58.764160000000061],[-93.196380999999974,58.758331000000055],[-93.155562999999972,58.740273000000002],[-93.152221999999938,58.737770000000012],[-93.141112999999962,58.691933000000006],[-93.139724999999885,58.653876999999966],[-93.126937999999882,58.532494000000042],[-93.126099000000011,58.527771000000087],[-93.118057000000022,58.508888000000013],[-93.095276000000013,58.467209000000082],[-93.035277999999948,58.37082700000002],[-92.964721999999938,58.261108000000036],[-92.93110699999994,58.21166199999999],[-92.868880999999931,58.143050999999957],[-92.811660999999901,58.071663000000058],[-92.803329000000019,58.057213000000104],[-92.799987999999985,58.042221000000097],[-92.805557000000022,58.011940000000038],[-92.805557000000022,58.00638600000002],[-92.80471799999998,57.997490000000084],[-92.795273000000009,57.96888000000007],[-92.753615999999965,57.85083000000003],[-92.724716000000001,57.801383999999985],[-92.672501000000011,57.733047000000056],[-92.621108999999876,57.670547000000113],[-92.450835999999981,57.442490000000134],[-92.446380999999974,57.433051999999918],[-92.418883999999991,57.337493999999992],[-92.418334999999956,57.332497000000103],[-92.418883999999991,57.323326000000122],[-92.427215999999987,57.263053999999954],[-92.430283000000031,57.252220000000079],[-92.441101000000003,57.23054500000012],[-92.549437999999896,57.08554799999996],[-92.563889000000017,57.068885999999964],[-92.576400999999976,57.056938000000116],[-92.695267000000001,56.961662000000047],[-92.708617999999888,56.951660000000118],[-92.715835999999967,56.947487000000137],[-92.723327999999924,56.944435000000055],[-92.73832699999997,56.94110100000006],[-92.771392999999932,56.93804200000011],[-92.837219000000005,56.924438000000009],[-92.868056999999965,56.91415399999994],[-92.877212999999927,56.90915700000005],[-92.876098999999954,56.907494000000099],[-92.868332000000009,56.90665400000006],[-92.850554999999929,56.907211000000132],[-92.831680000000006,56.908599999999979],[-92.790557999999976,56.913879000000122],[-92.756957999999997,56.918602000000135],[-92.731383999999991,56.922492999999974],[-92.691101000000003,56.93360100000001],[-92.660277999999948,56.945266999999944],[-92.652221999999881,56.949158000000011],[-92.61721799999998,56.96888000000007],[-92.610000999999954,56.974709000000075],[-92.589171999999905,56.986382000000106],[-92.552779999999984,57.004714999999976],[-92.514450000000011,57.023604999999918],[-92.492217999999923,57.032493999999986],[-92.475280999999995,57.037498000000141],[-92.443054000000018,57.044715999999994],[-92.40055799999999,57.052216000000044],[-92.376098999999954,57.056381000000044],[-92.253615999999965,57.065544000000045],[-92.235549999999989,57.066101000000117],[-92.226105000000018,57.065544000000045],[-92.217223999999987,57.063049000000035],[-92.212218999999948,57.058043999999995],[-92.218932999999993,57.052779999999984],[-92.337509000000011,56.981377000000066],[-92.344727000000034,56.977485999999999],[-92.352218999999991,56.974159000000043],[-92.368332000000009,56.969711000000075],[-92.385558999999944,56.967209000000025],[-92.394454999999994,56.966933999999981],[-92.418610000000001,56.961937000000091],[-92.432220000000029,56.955826000000002],[-92.46945199999999,56.934989999999971],[-92.466399999999965,56.932495000000131],[-92.375,56.949714999999912],[-92.303054999999972,56.967491000000109],[-92.287215999999944,56.974434000000088],[-92.281113000000005,56.978874000000076],[-92.268616000000009,56.990829000000019],[-92.261947999999961,56.99582700000002],[-92.235275000000001,57.012771999999984],[-92.220276000000013,57.018883000000017],[-92.204453000000001,57.02416199999999],[-92.180282999999974,57.030823000000112],[-92.155272999999909,57.036658999999986],[-92.146666999999979,57.037772999999959],[-92.129165999999941,57.03943600000008],[-92.093062999999972,57.040833000000021],[-92.057769999999891,57.043884000000048],[-92.031677000000002,57.046660999999972],[-91.987503000000004,57.052489999999977],[-91.952224999999999,57.05721299999999],[-91.828888000000006,57.087211999999965],[-91.779998999999975,57.100273000000129],[-91.241104000000007,57.222214000000008],[-91.15583799999996,57.239989999999977],[-91.08944699999995,57.251106000000107],[-91.05471799999998,57.256104000000107],[-91.036391999999978,57.258049000000085],[-91.001677999999913,57.26138300000008],[-90.992767000000015,57.26138300000008],[-90.834166999999923,57.257217000000026],[-90.81527699999998,57.255829000000119],[-90.795546999999999,57.24971800000003],[-90.779175000000009,57.243324000000143],[-90.758895999999993,57.237769999999955],[-90.738051999999925,57.232490999999982],[-90.71945199999999,57.228043000000014],[-90.709441999999967,57.226379000000009],[-90.563323999999909,57.212212000000079],[-90.451110999999969,57.193878000000097],[-90.408614999999998,57.181664000000069],[-90.391678000000013,57.176102000000128],[-90.387786999999946,57.171378999999945],[-90.310821999999973,57.134995000000117],[-90.225554999999929,57.104439000000013],[-90.025009000000011,57.031380000000013],[-90.005004999999983,57.01915699999995],[-90,57.016369000000054],[-89.990554999999972,57.011107999999922],[-89.970276000000013,57.004166000000055],[-89.833068999999966,56.978324999999984],[-89.715285999999992,56.957214000000079],[-89.521392999999932,56.92943600000001],[-89.439163000000008,56.923881999999992],[-89.132941999999957,56.864852999999982],[-89.06806899999998,56.852219000000048],[-89.015288999999939,56.84777100000008],[-88.950287000000003,56.843048000000124],[-88.94261199999994,56.844269000000054],[-88.815001999999993,56.824440000000038],[-88.742767000000015,56.764442000000145],[-88.67193599999996,56.709435000000042],[-88.654723999999931,56.696380999999974],[-88.639998999999989,56.688599000000067],[-88.631377999999984,56.68471500000004],[-88.584166999999923,56.670546999999999],[-88.440552000000025,56.603607000000011],[-88.415008999999998,56.58638000000002],[-88.365829000000019,56.561661000000015],[-88.324172999999973,56.542770000000019],[-88.218886999999995,56.504440000000045],[-88.149444999999957,56.486938000000009],[-88.103057999999976,56.476097000000095],[-88.069732999999928,56.468880000000013],[-88.048889000000031,56.465546000000018],[-88.028885000000002,56.459991000000116],[-88.018616000000009,56.456100000000049],[-87.982772999999952,56.441658000000075],[-87.975554999999929,56.437491999999963],[-87.841110000000015,56.315269000000001],[-87.723891999999978,56.203880000000083],[-87.719161999999926,56.198875000000044],[-87.715011999999945,56.189987000000031],[-87.71556099999998,56.169716000000051],[-87.713897999999972,56.164993000000095],[-87.708053999999947,56.156096999999988],[-87.702788999999996,56.151931999999988],[-87.548614999999927,56.049995000000138],[-87.478881999999999,56.029160000000047],[-87.368880999999988,56.000832000000059],[-87.351943999999889,55.992767000000129],[-87.345276000000013,55.988602000000128],[-87.343613000000005,55.983879000000002],[-87.348343,55.973320000000115],[-87.355270000000019,55.962769000000037],[-87.198333999999988,55.940269000000001],[-87.110001000000011,55.92943600000001],[-87.091675000000009,55.927489999999921],[-87.057220000000029,55.926940999999999],[-87.031676999999945,55.929718000000094],[-86.996947999999975,55.931663999999955],[-86.979445999999939,55.931663999999955],[-86.970000999999968,55.929718000000094],[-86.881942999999922,55.907211000000018],[-86.837783999999999,55.891380000000026],[-86.616942999999992,55.838882000000012],[-86.572783999999956,55.83027600000014],[-86.544448999999986,55.824440000000038],[-86.486663999999962,55.811378000000047],[-86.477782999999931,55.808884000000091],[-86.448607999999979,55.799995000000024],[-86.398620999999991,55.784164000000033],[-86.372771999999998,55.774993999999992],[-86.346114999999998,55.763054000000068],[-86.332779000000016,55.754715000000033],[-86.321944999999971,55.745544000000109],[-86.31527699999998,55.741104000000064],[-86.277221999999995,55.728873999999962],[-86.267776000000026,55.726936000000023],[-85.86721799999998,55.657493999999986],[-85.740829000000019,55.638046000000088],[-85.731673999999998,55.636940000000038],[-85.71444699999995,55.631660000000011],[-85.569457999999941,55.55860100000001],[-85.556655999999975,55.550270000000069],[-85.532227000000034,55.528045999999961],[-85.525833000000034,55.51888299999996],[-85.516662999999994,55.500000000000057],[-85.515015000000005,55.495270000000062],[-85.515288999999996,55.490273000000116],[-85.509170999999981,55.481102000000021],[-85.499435000000005,55.472214000000008],[-85.474166999999909,55.454711999999972],[-85.393340999999964,55.408881999999949],[-85.383620999999948,55.404991000000109],[-85.272232000000031,55.374709999999993],[-85.234726000000023,55.364715999999987],[-85.224716000000001,55.364159000000086],[-85.208617999999944,55.365273000000059],[-85.182219999999973,55.365273000000059],[-85.164444000000003,55.361664000000076],[-85.146118000000001,55.354996000000085],[-85.128875999999991,55.346382000000006],[-85.123885999999857,55.341934000000037],[-85.121933000000013,55.337769000000037],[-85.116652999999928,55.323050999999964],[-85.116394000000014,55.313606000000107],[-85.118331999999953,55.308601000000067],[-85.121933000000013,55.303322000000094],[-85.129165999999998,55.297775000000115],[-85.144164999999987,55.290276000000119],[-85.215285999999935,55.268600000000049],[-85.275283999999999,55.216660000000047],[-85.398055999999997,55.10083000000003],[-85.399993999999936,55.095824999999991],[-85.397506999999962,55.090546000000018],[-85.383620999999948,55.06749700000006],[-85.398055999999997,55.0472180000001],[-85.419448999999986,55.010826000000122],[-85.425003000000004,55.000274999999988],[-85.425003000000004,54.995544000000052],[-85.423889000000031,54.990546999999992],[-85.414443999999946,54.991104000000064],[-85.407500999999968,54.993324000000086],[-85.400283999999942,54.997772000000055],[-85.386123999999938,55.008049000000028],[-85.370543999999938,55.024437000000091],[-85.366942999999992,55.029716000000064],[-85.36250299999989,55.04055000000011],[-85.347778000000005,55.080826000000116],[-85.33555599999994,55.101661999999976],[-85.318344000000025,55.127486999999974],[-85.313048999999978,55.132767000000001],[-85.220275999999956,55.224434000000088],[-85.194153000000028,55.244155999999919],[-85.17971799999998,55.253608999999926],[-85.156113000000005,55.264160000000061],[-85.139998999999989,55.270270999999923],[-85.116652999999928,55.276657000000057],[-85.06806899999998,55.287498000000141],[-85.043883999999878,55.292770000000075],[-85.001952999999958,55.296660999999972],[-84.974715999999944,55.295830000000137],[-84.869445999999982,55.279716000000008],[-84.75140399999998,55.256103999999993],[-84.723617999999931,55.249718000000087],[-84.712783999999942,55.247771999999998],[-84.688048999999921,55.245270000000119],[-84.635559000000001,55.24221799999998],[-84.599166999999909,55.241661000000079],[-84.566390999999953,55.244155999999919],[-84.541381999999999,55.247490000000084],[-84.444716999999855,55.267769000000044],[-84.428878999999995,55.273048000000017],[-84.388610999999969,55.282493999999986],[-84.322783999999956,55.289992999999981],[-84.206954999999937,55.295546999999999],[-84.198607999999979,55.295273000000066],[-84.189437999999996,55.294159000000093],[-84.170837000000006,55.283051000000057],[-84.159438999999963,55.278328000000101],[-84.149170000000026,55.275551000000007],[-84.12222300000002,55.272217000000012],[-84.113892000000021,55.271934999999928],[-84.092223999999987,55.271660000000111],[-84.076110999999969,55.276099999999929],[-84.049987999999928,55.286110000000065],[-84.006393000000003,55.301383999999928],[-83.968886999999881,55.313881000000094],[-83.951675000000023,55.317497000000003],[-83.93249499999996,55.319443000000035],[-83.920273000000009,55.319160000000068],[-83.897506999999905,55.316940000000102],[-83.658386000000007,55.237324000000058],[-83.65439600000002,55.235493000000076],[-83.651732999999922,55.232985999999983],[-83.570281999999963,55.18804200000011],[-83.567229999999938,55.183052000000032],[-83.570007000000032,55.177773000000059],[-83.58555599999994,55.166100000000029],[-83.591674999999896,55.154434000000037],[-83.589721999999938,55.149719000000005],[-83.574447999999961,55.138045999999974],[-83.561935000000005,55.130820999999969],[-83.556655999999919,55.134163000000058],[-83.556655999999919,55.17943600000001],[-83.558608999999933,55.184989999999971],[-83.579505999999867,55.221157000000005],[-83.588057999999933,55.233330000000024],[-83.593886999999938,55.236938000000123],[-83.60082999999986,55.239990000000034],[-83.620833999999945,55.242767000000129],[-83.643889999999999,55.242767000000129],[-83.654448999999943,55.243881000000101],[-83.670837000000006,55.248604000000057],[-83.684432999999956,55.254439999999988],[-83.696105999999986,55.261664999999994],[-83.706116000000009,55.269714000000022],[-83.708892999999989,55.274437000000034],[-83.706116000000009,55.279990999999995],[-83.698607999999979,55.283051000000057],[-83.688888999999961,55.281937000000084],[-83.57417299999986,55.262215000000026],[-83.533324999999934,55.250549000000092],[-83.519454999999937,55.243881000000101],[-83.498885999999914,55.235549999999989],[-83.489440999999943,55.233879000000115],[-83.179717999999866,55.197211999999979],[-83.168609999999944,55.197487000000137],[-83.150283999999942,55.200271999999984],[-83.128051999999968,55.207497000000046],[-83.120270000000005,55.210823000000119],[-83.089721999999938,55.226654000000053],[-83.074447999999961,55.231658999999922],[-83.037505999999951,55.238327000000083],[-83.029174999999952,55.238883999999985],[-83.006392999999946,55.238602000000128],[-82.985001000000011,55.236382000000106],[-82.964721999999995,55.233604000000128],[-82.948607999999865,55.228874000000076],[-82.941665999999941,55.225821999999994],[-82.930556999999965,55.218322999999998],[-82.91332999999986,55.201385000000073],[-82.906113000000005,55.191932999999949],[-82.896956999999986,55.177215999999987],[-82.874435000000005,55.154434000000037],[-82.838333000000034,55.146660000000054],[-82.809998000000007,55.142220000000009],[-82.786117999999988,55.141106000000036],[-82.775283999999942,55.14137999999997],[-82.76556399999987,55.142493999999942],[-82.73971599999993,55.147491000000059],[-82.708618000000001,55.156380000000127],[-82.700835999999981,55.159714000000122],[-82.669723999999974,55.168052999999986],[-82.661117999999931,55.169716000000108],[-82.650283999999886,55.169716000000108],[-82.508346999999901,55.152771000000143],[-82.449432000000002,55.133049000000085],[-82.412506000000008,55.112770000000125],[-82.40972899999997,55.108046999999999],[-82.400833000000034,55.082771000000093],[-82.33555599999994,55.071014000000048],[-82.307495000000017,55.115829000000133],[-82.308043999999995,55.121933000000126],[-82.309432999999899,55.127486999999974],[-82.3125,55.132492000000013],[-82.323623999999995,55.139992000000063],[-82.337218999999948,55.146102999999982],[-82.345276000000013,55.148331000000098],[-82.355559999999969,55.162491000000045],[-82.349990999999875,55.166382000000112],[-82.34056099999998,55.164711000000011],[-82.333618000000001,55.1616590000001],[-82.307769999999948,55.148880000000077],[-82.25418099999996,55.111382000000049],[-82.245833999999945,55.102776000000119],[-82.244995000000017,55.09027100000003],[-82.246947999999861,55.084160000000111],[-82.253341999999975,55.073608000000092],[-82.25778200000002,55.06888600000002],[-82.273620999999935,55.05721299999999],[-82.282227000000034,55.048049999999989],[-82.285277999999948,55.042770000000132],[-82.287216000000001,55.036659000000043],[-82.287216000000001,55.030273000000136],[-82.270844000000011,54.931381000000044],[-82.267226999999991,54.920273000000009],[-82.255279999999914,54.894157000000121],[-82.246947999999861,54.879433000000063],[-82.241378999999938,54.874991999999963],[-82.231948999999986,54.873877999999991],[-82.221114999999998,54.787498000000085],[-82.320846999999958,54.571380999999974],[-82.403885000000002,54.410820000000115],[-82.419158999999979,54.384163000000058],[-82.431670999999938,54.370270000000005],[-82.436935000000005,54.366385999999977],[-82.441101000000003,54.361664000000076],[-82.441665999999941,54.330826000000116],[-82.434158000000025,54.209435000000042],[-82.421660999999972,54.197211999999979],[-82.389998999999989,54.16832700000009],[-82.362777999999878,54.143607999999972],[-82.301392000000021,54.103050000000053],[-82.283889999999985,54.092491000000052],[-82.253341999999975,54.076102999999989],[-82.248046999999929,54.072220000000016],[-82.243880999999931,54.068054000000132],[-82.238327000000027,54.057495000000074],[-82.160278000000005,53.898880000000133],[-82.131942999999978,53.817772000000105],[-82.130553999999961,53.793052999999986],[-82.129715000000033,53.774436999999978],[-82.130553999999961,53.767493999999999],[-82.136672999999917,53.749161000000129],[-82.148894999999982,53.727768000000026],[-82.189986999999917,53.674164000000019],[-82.194152999999915,53.669441000000006],[-82.203063999999927,53.653320000000008],[-82.208344000000011,53.641936999999984],[-82.212783999999999,53.622765000000015],[-82.21665999999999,53.603882000000112],[-82.211944999999957,53.536110000000065],[-82.208618000000001,53.524994000000106],[-82.198883000000023,53.504714999999976],[-82.190552000000025,53.489716000000101],[-82.172500999999954,53.460548000000074],[-82.165558000000033,53.451385000000073],[-82.158614999999998,53.442215000000033],[-82.147781000000009,53.421661000000086],[-82.138061999999991,53.38888500000013],[-82.125823999999966,53.344154000000117],[-82.119445999999982,53.315826000000129],[-82.115829000000019,53.298332000000073],[-82.113891999999908,53.286659000000043],[-82.113891999999908,53.280273000000136],[-82.114715999999873,53.273604999999975],[-82.117766999999958,53.268050999999957],[-82.121932999999956,53.263610999999969],[-82.141387999999949,53.254715000000033],[-82.21055599999994,53.220268000000033],[-82.248336999999935,53.193877999999984],[-82.269454999999937,53.163879000000009],[-82.27555799999999,53.153320000000122],[-82.279448999999943,53.141106000000093],[-82.300277999999935,53.060271999999998],[-82.301392000000021,53.05332199999998],[-82.301666000000012,53.041663999999969],[-82.296660999999972,53.018599999999992],[-82.273894999999982,52.956383000000017],[-82.261397999999986,52.937210000000107],[-82.257506999999976,52.932770000000062],[-82.235824999999977,52.924164000000133],[-82.196380999999974,52.913321999999937],[-82.136123999999995,52.894714000000079],[-82.120543999999995,52.889717000000132],[-82.101669000000015,52.879990000000021],[-82.050551999999982,52.84304800000001],[-82.025833000000034,52.823883000000023],[-82.001113999999973,52.804710000000114],[-81.977782999999931,52.784996000000035],[-81.973617999999931,52.780548000000067],[-81.951401000000033,52.736938000000066],[-81.733611999999994,52.549995000000138],[-81.719161999999983,52.538330000000087],[-81.714172000000019,52.534721000000047],[-81.697494999999947,52.524162000000047],[-81.639175000000023,52.490547000000106],[-81.621384000000035,52.480819999999994],[-81.607497999999964,52.475265999999976],[-81.577224999999999,52.465271000000087],[-81.569457999999941,52.462212000000136],[-81.558043999999938,52.456099999999935],[-81.554168999999888,52.451660000000118],[-81.551391999999964,52.446655000000078],[-81.549987999999985,52.44110100000006],[-81.542496000000028,52.338882000000012],[-81.56138599999997,52.316383000000087],[-81.663054999999986,52.292220999999984],[-81.822509999999909,52.254440000000045],[-81.850829999999917,52.244995000000131],[-81.863051999999982,52.238884000000041],[-81.865829000000019,52.23333000000008],[-81.883620999999948,52.187492000000134],[-81.874160999999901,52.188324000000023],[-81.841949,52.194992000000013],[-81.826950000000011,52.19887499999993],[-81.805557000000022,52.206099999999992],[-81.795546999999999,52.213882000000126],[-81.792495999999971,52.21915400000006],[-81.788605000000018,52.223877000000073],[-81.779448999999943,52.232208000000128],[-81.765015000000005,52.237770000000069],[-81.758346999999958,52.23943300000002],[-81.74888599999997,52.240273000000059],[-81.718886999999881,52.240829000000076],[-81.554992999999854,52.237495000000081],[-81.521392999999932,52.235825000000091],[-81.50167799999997,52.23333000000008],[-81.478881999999942,52.225822000000051],[-81.472778000000005,52.221930999999984],[-81.460006999999962,52.210274000000027],[-81.443603999999937,52.192764000000068],[-81.440552000000025,52.188599000000067],[-81.434432999999956,52.179161000000022],[-81.431670999999994,52.174164000000133],[-81.430557000000022,52.168053000000043],[-81.418335000000013,52.149437000000034],[-81.414443999999946,52.144996999999989],[-81.405838000000017,52.136940000000038],[-81.365279999999984,52.107216000000051],[-81.352782999999988,52.101105000000132],[-81.337783999999999,52.096100000000092],[-81.310546999999985,52.091102999999976],[-81.290832999999964,52.088599999999985],[-81.264724999999999,52.08277099999998],[-81.212509000000011,52.065543999999989],[-81.186110999999869,52.053604000000064],[-81.167496000000028,52.044158999999979],[-81.118057000000022,52.045547000000113],[-80.994445999999925,52.01138300000008],[-80.988327000000027,52.008049000000085],[-80.978333000000021,52.000832000000003],[-80.97444200000001,51.996384000000035],[-80.973052999999936,51.990829000000133],[-80.972778000000005,51.978325000000098],[-80.929992999999968,51.924163999999962],[-80.918609999999944,51.910271000000137],[-80.899993999999936,51.89527099999998],[-80.894729999999981,51.891663000000051],[-80.80972300000002,51.857498000000135],[-80.698607999999979,51.794715999999937],[-80.615279999999927,51.730270000000132],[-80.610275000000001,51.726379000000065],[-80.589171999999962,51.699715000000083],[-80.589171999999962,51.693321000000026],[-80.590285999999878,51.686653000000092],[-80.589995999999928,51.674164000000019],[-80.586120999999878,51.663605000000018],[-80.578887999999949,51.648605000000032],[-80.571395999999993,51.633605999999986],[-80.515015000000005,51.524437000000034],[-80.507506999999976,51.515830999999935],[-80.497771999999998,51.508331000000055],[-80.462218999999891,51.488601999999958],[-80.457229999999925,51.484993000000145],[-80.442489999999964,51.473602000000028],[-80.438889000000017,51.46915400000006],[-80.436385999999857,51.464157000000114],[-80.434998000000007,51.458602999999925],[-80.424438000000009,51.36360899999994],[-80.426392000000021,51.358887000000038],[-80.430557000000022,51.354164000000083],[-80.442489999999964,51.34804500000007],[-80.471664000000033,51.339714000000129],[-80.502791999999943,51.331940000000145],[-80.540558000000033,51.323326000000066],[-80.568619000000012,51.314156000000025],[-80.652495999999985,51.278327999999988],[-80.691939999999988,51.247490000000028],[-80.706954999999937,51.235550000000103],[-80.831680000000006,51.155822999999941],[-80.952498999999989,51.079720000000009],[-80.959441999999967,51.077492000000063],[-80.965285999999992,51.074440000000095],[-80.981110000000001,51.06360600000005],[-80.994994999999903,51.051384000000098],[-81.004181000000017,51.043052999999986],[-81.012222000000008,51.033882000000062],[-81.015015000000005,51.028328000000045],[-81.005279999999914,51.028603000000089],[-80.928054999999915,51.04583000000008],[-80.888335999999924,51.082771000000037],[-80.875274999999988,51.103324999999984],[-80.862212999999883,51.116104000000007],[-80.850280999999995,51.122489999999971],[-80.835280999999952,51.126938000000109],[-80.820557000000008,51.130272000000105],[-80.793610000000001,51.132767000000115],[-80.765014999999948,51.133606000000043],[-80.748046999999985,51.136658000000011],[-80.740829000000019,51.138885000000073],[-80.694442999999978,51.156097000000045],[-80.688599000000011,51.159157000000107],[-80.610000999999954,51.214157],[-80.567779999999971,51.258331000000112],[-80.562774999999988,51.262214999999969],[-80.541381999999999,51.276657000000114],[-80.530563000000029,51.283606999999961],[-80.512512000000015,51.292769999999962],[-80.480285999999865,51.307213000000047],[-80.414444000000003,51.332497000000046],[-80.400283999999886,51.337212000000079],[-80.392226999999991,51.338599999999985],[-80.371658000000025,51.336655000000007],[-80.330291999999986,51.326385000000073],[-80.219727000000034,51.301659000000029],[-80.190551999999968,51.297493000000145],[-80.129989999999907,51.297775000000001],[-80.120270000000005,51.296387000000095],[-80.016952999999944,51.263054000000125],[-79.996383999999921,51.25471500000009],[-79.800277999999992,51.156097000000045],[-79.788054999999929,51.149719000000118],[-79.741104000000007,51.123604000000114],[-79.736389000000031,51.119713000000047],[-79.729171999999949,51.110825000000034],[-79.716515000000015,51.081715000000031],[-79.685103999999967,51.045361000000014],[-79.612777999999992,51.008049000000085],[-79.537612999999908,50.958397000000048],[-79.519729999999981,50.929993000000024],[-79.516113000000018,50.926384000000041],[-79.466109999999958,50.889434999999935],[-79.450561999999877,50.87860100000006],[-79.438599000000011,50.872214999999983],[-79.415008999999941,50.846939000000134],[-79.411391999999978,50.842490999999995],[-79.352782999999931,50.748329000000069],[-79.350280999999939,50.736938000000123],[-79.348052999999993,50.731934000000138],[-79.343612999999891,50.728324999999984],[-79.337509000000011,50.724990999999989],[-79.332229999999981,50.723877000000016],[-79.330001999999922,50.758331000000055],[-79.330001999999922,50.764442000000088],[-79.332229999999981,50.775826000000052],[-79.420836999999949,50.879715000000033],[-79.439986999999917,50.894997000000103],[-79.464721999999995,50.913321999999994],[-79.515015000000005,50.95665699999995],[-79.537353999999993,50.983765000000062],[-79.571121000000005,51.00277699999998],[-79.660004000000015,51.045273000000009],[-79.673049999999876,51.050827000000027],[-79.678054999999915,51.054710000000114],[-79.698333999999932,51.075554000000068],[-79.705276000000026,51.084435000000042],[-79.749435000000005,51.168326999999977],[-79.751952999999958,51.178878999999995],[-79.752227999999889,51.184433000000013],[-79.751113999999973,51.197487000000081],[-79.745543999999995,51.208885000000066],[-79.742492999999968,51.214157],[-79.720551,51.243607000000054],[-79.703887999999949,51.261665000000107],[-79.699431999999945,51.266937000000041],[-79.688888999999961,51.281937000000028],[-79.682495000000017,51.292496000000028],[-79.680556999999908,51.298050000000046],[-79.679442999999992,51.304710000000057],[-79.668609999999944,51.398605000000089],[-79.593886999999938,51.449158000000068],[-79.581679999999949,51.455268999999987],[-79.574721999999895,51.457497000000103],[-79.547103999999877,51.460129000000109],[-79.533614999999941,51.50499700000006],[-79.474166999999966,51.579162999999994],[-79.376389000000017,51.642494000000113],[-79.353881999999999,51.656096999999988],[-79.331680000000006,51.661933999999917],[-79.322234999999978,51.662766000000033],[-79.239715999999987,51.634994999999947],[-79.236114999999927,51.630820999999912],[-79.235000999999954,51.624992000000077],[-79.23721299999994,51.619156000000032],[-79.251952999999958,51.60694100000012],[-79.275283999999999,51.577773999999977],[-79.285277999999948,51.562492000000134],[-79.285277999999948,51.556381000000101],[-79.274719000000005,51.530548000000124],[-79.271118000000001,51.525551000000064],[-79.267226999999934,51.521659999999997],[-79.202498999999989,51.518883000000073],[-79.183318999999983,51.519714000000079],[-79.175277999999935,51.521103000000096],[-79.161117999999931,51.525551000000064],[-79.154998999999975,51.528602999999976],[-79.144454999999937,51.536110000000065],[-79.137512000000015,51.538330000000087],[-79.12748699999986,51.538048000000003],[-79.120270000000005,51.535552999999993],[-79.024445000000014,51.476379000000122],[-79.020553999999947,51.473320000000115],[-79.012221999999952,51.464996000000099],[-79.005004999999926,51.449997000000053],[-78.963332999999977,51.353325000000098],[-78.950286999999946,51.29222100000004],[-78.955276000000026,51.256660000000068],[-78.95944199999991,51.252220000000023],[-78.962783999999942,51.246941000000049],[-78.962783999999942,51.240546999999992],[-78.958344000000011,51.230545000000063],[-78.951401000000033,51.215546000000018],[-78.937209999999936,51.197769000000108],[-78.928878999999938,51.18971300000004],[-78.924164000000019,51.185822000000144],[-78.912215999999944,51.179436000000067],[-78.906113000000005,51.176658999999972],[-78.853332999999964,51.165543000000014],[-78.914718999999934,51.22165700000005],[-78.918335000000013,51.226097000000095],[-78.920546999999942,51.231102000000135],[-78.921660999999915,51.237495000000081],[-78.920273000000009,51.249718000000144],[-78.890563999999927,51.390549000000021],[-78.888335999999981,51.396660000000111],[-78.883057000000008,51.401100000000099],[-78.832229999999981,51.438599000000011],[-78.779175000000009,51.474990999999989],[-78.82028200000002,51.513054000000068],[-78.823897999999986,51.517494000000056],[-78.826110999999969,51.522491000000002],[-78.824448000000018,51.541664000000083],[-78.820846999999958,51.554436000000067],[-78.80860899999999,51.576385000000016],[-78.791672000000005,51.603881999999942],[-78.796386999999925,51.608604000000014],[-78.859160999999972,51.634163000000058],[-78.944153000000028,51.670547000000056],[-79.03472899999997,51.764717000000132],[-79.035552999999993,51.770271000000093],[-79.033324999999877,51.776382000000012],[-79.029174999999952,51.781380000000013],[-79.008346999999958,51.795830000000137],[-78.995834000000002,51.801658999999972],[-78.985824999999977,51.801658999999972],[-78.976104999999905,51.799720999999977],[-78.961394999999868,51.794998000000021],[-78.944442999999865,51.790833000000021],[-78.918059999999969,51.79444100000012],[-78.910827999999981,51.796660999999972],[-78.903609999999958,51.799438000000009],[-78.879989999999964,51.811378000000104],[-78.851944000000003,51.828606000000036],[-78.846389999999985,51.832497000000103],[-78.836945000000014,51.841377000000136],[-78.833618000000001,51.845825000000104],[-78.832229999999981,51.852776000000063],[-78.834441999999967,51.857772999999952],[-78.841674999999952,51.866661000000136],[-78.846389999999985,51.870269999999948],[-78.858611999999937,51.876938000000109],[-78.86361699999992,51.880821000000083],[-78.89555399999989,51.926659000000029],[-78.896392999999932,51.932495000000074],[-78.894164999999987,51.93832400000008],[-78.881942999999922,51.944434999999999],[-78.860274999999888,51.951102999999932],[-78.851944000000003,51.95249200000012],[-78.810546999999929,51.958885000000066],[-78.769454999999994,51.966103000000089],[-78.747771999999998,51.973320000000001],[-78.736664000000019,51.979431000000091],[-78.695830999999998,52.008049000000085],[-78.579452999999944,52.111382000000106],[-78.537505999999951,52.180824000000143],[-78.501113999999973,52.255829000000006],[-78.524445000000014,52.311104000000114],[-78.516953000000001,52.367767000000072],[-78.507232999999985,52.454437000000041],[-78.506957999999997,52.460548000000074],[-78.545273000000009,52.514717000000132],[-78.564712999999983,52.530273000000079],[-78.577224999999999,52.536658999999986],[-78.585555999999997,52.538605000000075],[-78.59584000000001,52.538886999999988],[-78.654448999999943,52.54694400000011],[-78.684433000000013,52.551383999999985],[-78.763335999999981,52.564438000000052],[-78.761123999999938,52.570549000000085],[-78.755568999999923,52.574164999999994],[-78.721114999999998,52.586655000000121],[-78.691939999999931,52.596099999999979],[-78.713333000000034,52.628876000000105],[-78.753066999999874,52.683875999999941],[-78.790833000000021,52.737495000000138],[-78.796950999999979,52.773880000000077],[-78.765015000000005,52.777489000000116],[-78.731948999999986,52.783333000000084],[-78.724715999999944,52.785553000000107],[-78.722503999999901,52.791664000000026],[-78.725554999999986,52.819443000000035],[-78.738327000000027,52.872215000000097],[-78.794448999999986,52.861381999999935],[-78.856109999999887,52.877769000000114],[-78.880829000000006,52.896942000000024],[-78.881942999999922,52.90277100000003],[-78.87860099999989,52.908043000000134],[-78.864715999999987,52.963608000000079],[-78.915833000000021,53.000000000000057],[-78.923049999999932,53.068886000000077],[-78.888061999999934,53.224709000000132],[-78.894454999999994,53.259720000000073],[-78.895844000000011,53.26527400000009],[-78.942490000000021,53.384994999999947],[-78.949722000000008,53.399994000000049],[-78.991721999999925,53.434048000000018],[-78.994720000000029,53.436378000000047],[-79.004554999999925,53.439216999999928],[-79.009551999999928,53.438213000000019],[-79.044723999999974,53.439430000000016],[-79.053054999999972,53.438042000000053],[-79.063323999999966,53.439430000000016],[-79.068068999999923,53.443321000000083],[-79.090285999999992,53.470543000000021],[-79.093062999999972,53.474709000000075],[-79.107773000000009,53.497215000000097],[-79.110275000000001,53.502495000000124],[-79.103606999999954,53.513054000000011],[-79.084166999999979,53.522491000000116],[-79.054442999999935,53.531380000000013],[-79.035552999999993,53.53276800000009],[-79.012787000000003,53.531104999999968],[-79.031386999999995,53.529716000000008],[-79.038054999999986,53.526657],[-79.043334999999956,53.523048000000017],[-79.042495999999915,53.511108000000092],[-79.041381999999999,53.505554000000132],[-79.036391999999978,53.501663000000065],[-79.014838999999938,53.498940000000005],[-79.011002000000019,53.496937000000003],[-79.005675999999937,53.49577000000005],[-79.000678999999934,53.496609000000035],[-78.962783999999942,53.508888000000127],[-78.919158999999979,53.555267000000072],[-78.915833000000021,53.560547000000099],[-78.918335000000013,53.565544000000045],[-78.92193599999996,53.569992000000013],[-78.950561999999991,53.599716000000001],[-79.003341999999918,53.641663000000051],[-79.089721999999938,53.691658000000075],[-79.145003999999972,53.701660000000061],[-79.151397999999915,53.704994000000056],[-79.152221999999995,53.710548000000017],[-79.052490000000034,53.831939999999975],[-79.046951000000035,53.835548000000074],[-79.039444000000003,53.83776899999998],[-79.029723999999987,53.839157000000114],[-79.011123999999995,53.839989000000003],[-78.988891999999908,53.838882000000069],[-78.979995999999971,53.836104999999975],[-78.966109999999901,53.83027600000014],[-78.948333999999932,53.820831000000112],[-78.932770000000005,53.815543999999989],[-78.910827999999981,53.814437999999939],[-78.901397999999972,53.815268999999944],[-78.902221999999938,53.821380999999974],[-78.906386999999938,53.825272000000041],[-78.917769999999962,53.832214000000079],[-78.924164000000019,53.835548000000074],[-78.969727000000034,53.851387000000045],[-78.988891999999908,53.854713000000061],[-79.011948000000018,53.856658999999979],[-79.056655999999919,53.873046999999985],[-79.101104999999961,53.901657000000057],[-79.106110000000001,53.905548000000124],[-79.072509999999852,53.999161000000072],[-79.066956000000005,54.002777000000094],[-79.051102000000014,54.006660000000068],[-79.041381999999999,54.00777400000004],[-79.031676999999945,54.00777400000004],[-79.021392999999989,54.006386000000134],[-79.001098999999954,53.999992000000077],[-78.964950999999928,53.99716200000006],[-78.961623999999972,53.999992000000077],[-78.960280999999952,54.001389000000017],[-78.962783999999942,54.006386000000134],[-78.966659999999933,54.010826000000122],[-78.976669000000015,54.018326000000002],[-78.984160999999972,54.021659999999997],[-79.119445999999982,54.078605999999979],[-79.116393999999957,54.103050000000053],[-79.106383999999935,54.111382000000049],[-79.046386999999982,54.178329000000076],[-79.048889000000031,54.183327000000077],[-79.060546999999985,54.184158000000082],[-79.173324999999977,54.174995000000081],[-79.191665999999998,54.172768000000019],[-79.198043999999868,54.169716000000108],[-79.196944999999971,54.163605000000018],[-79.198333999999988,54.157210999999961],[-79.205840999999907,54.154990999999995],[-79.238051999999982,54.158882000000062],[-79.276397999999915,54.166939000000013],[-79.345276000000013,54.199432000000002],[-79.419998000000021,54.274437000000034],[-79.430557000000022,54.290275999999949],[-79.476669000000015,54.368599000000131],[-79.505004999999926,54.42582700000014],[-79.488051999999925,54.452217000000132],[-79.488051999999925,54.458603000000039],[-79.521392999999989,54.587212000000136],[-79.525283999999886,54.591377000000136],[-79.531677000000002,54.594711000000132],[-79.565552000000025,54.609993000000145],[-79.618880999999931,54.623878000000047],[-79.675551999999925,54.625824000000136],[-79.686110999999983,54.627212999999927],[-79.760833999999988,54.648048000000074],[-79.764449999999954,54.652214000000129],[-79.761123999999995,54.658325000000048],[-79.631667999999934,54.702773999999977],[-79.494155999999975,54.744713000000104],[-79.463622999999984,54.75360900000004],[-79.457229999999925,54.750275000000045],[-79.447494999999947,54.75110600000005],[-79.337783999999942,54.772491000000059],[-79.315826000000015,54.779991000000109],[-79.101104999999961,54.827216999999962],[-78.976669000000015,54.843048000000124],[-78.968886999999995,54.845267999999976],[-78.956664999999987,54.851936000000137],[-78.945540999999935,54.859436000000017],[-78.912505999999894,54.884163000000115],[-78.838608000000022,54.91443600000008],[-78.732773000000009,54.931107000000111],[-78.561110999999926,54.977767999999912],[-78.37388599999997,55.030273000000136],[-78.256118999999899,55.082214000000022],[-78.207672000000002,55.111655999999982],[-78.182220000000029,55.125267000000122],[-78.119445999999982,55.149994000000049],[-77.972778000000005,55.204994000000113],[-77.87249799999995,55.243606999999997],[-77.748610999999983,55.300827000000027],[-77.62222300000002,55.382766999999944],[-77.416655999999989,55.486107000000061],[-77.225829999999974,55.588326000000109],[-77.214721999999995,55.595267999999976],[-77.137221999999895,55.654160000000047],[-77.115279999999927,55.674164000000133],[-77.104720999999984,55.683876000000055],[-77.088332999999921,55.699432000000058],[-77.086120999999935,55.705551000000071],[-77.085555999999997,55.708046000000081],[-77.087783999999942,55.709716999999955],[-77.068343999999968,55.754715000000033],[-77.013061999999877,55.803046999999935],[-76.81138599999997,55.971100000000092],[-76.751953000000015,55.997771999999998],[-76.737503000000004,56.001663000000065],[-76.718886999999995,56.008048999999971],[-76.702498999999932,56.017494000000056],[-76.689162999999894,56.027489000000003],[-76.681945999999982,56.033882000000119],[-76.67721599999993,56.038605000000075],[-76.670836999999892,56.045830000000137],[-76.658050999999944,56.060821999999973],[-76.650833000000034,56.071938000000102],[-76.626662999999951,56.118049999999982],[-76.538329999999974,56.297775000000115],[-76.532227000000034,56.315269000000001],[-76.531112999999948,56.322220000000129],[-76.518889999999999,56.406097000000102],[-76.517501999999979,56.423325000000034],[-76.517501999999979,56.43582200000003],[-76.519164999999987,56.464714000000072],[-76.525832999999977,56.492767000000072],[-76.527221999999995,56.503052000000139],[-76.526397999999915,56.605827000000033],[-76.506957999999941,56.710823000000005],[-76.505004999999983,56.733879000000002],[-76.504455999999948,56.771934999999985],[-76.505568999999923,56.784995999999921],[-76.505279999999914,56.791382000000056],[-76.505568999999923,56.803047000000106],[-76.509445000000028,56.819717000000026],[-76.530838000000017,56.90665400000006],[-76.554442999999992,57.005828999999949],[-76.554717999999923,57.010826000000066],[-76.555832000000009,57.034996000000092],[-76.553329000000019,57.053322000000094],[-76.549164000000019,57.06221000000005],[-76.545272999999952,57.068885999999964],[-76.535552999999993,57.077773999999977],[-76.531112999999948,57.087211999999965],[-76.529175000000009,57.09665700000005],[-76.529723999999874,57.10582700000009],[-76.564437999999996,57.207214000000079],[-76.591384999999946,57.274436999999978],[-76.599990999999932,57.293610000000058],[-76.604445999999882,57.302773000000059],[-76.653060999999923,57.401382000000012],[-76.65834000000001,57.406653999999946],[-76.688048999999978,57.430550000000039],[-76.732223999999917,57.490273000000059],[-76.740829000000019,57.503326000000072],[-76.81138599999997,57.624710000000107],[-76.809433000000013,57.634720000000016],[-76.807770000000005,57.641662999999994],[-76.805557000000022,57.647774000000084],[-76.861937999999952,57.71915400000006],[-76.923049999999989,57.786110000000065],[-77.147231999999974,58.022765999999933],[-77.246658000000025,58.07388300000008],[-77.279723999999987,58.084435000000042],[-77.317504999999983,58.091934000000037],[-77.34944200000001,58.101936000000023],[-77.444442999999978,58.152489000000003],[-77.451110999999969,58.171379000000115],[-77.446655000000021,58.173882000000106],[-77.441100999999946,58.182770000000062],[-77.444152999999972,58.187767000000008],[-77.454453000000001,58.196381000000031],[-77.467223999999987,58.203323000000125],[-77.487777999999935,58.212769000000094],[-77.571670999999981,58.248047000000099],[-77.645843999999954,58.278603000000032],[-77.81527699999998,58.327217000000019],[-77.851944000000003,58.334991000000002],[-77.883895999999993,58.339989000000003],[-77.914443999999946,58.345543000000021],[-77.939163000000008,58.35305000000011],[-77.955276000000026,58.358604000000128],[-78.012512000000015,58.378601000000003],[-78.024445000000014,58.384163000000115],[-78.02806099999998,58.386940000000038],[-78.031386999999938,58.391380000000026],[-78.062682999999993,58.417309000000103],[-78.130553999999961,58.462769000000037],[-78.355559999999969,58.601661999999976],[-78.397231999999917,58.620827000000133],[-78.419998000000021,58.62721300000004],[-78.425277999999992,58.626099000000067],[-78.428329000000019,58.623604000000057],[-78.427779999999984,58.611107000000061],[-78.426101999999958,58.606102000000021],[-78.347778000000005,58.536659000000043],[-78.389724999999885,58.544716000000051],[-78.549163999999905,58.603881999999999],[-78.563889000000017,58.609993000000088],[-78.568618999999956,58.614441000000056],[-78.573897999999929,58.630547000000035],[-78.574722000000008,58.635269000000108],[-78.570006999999976,58.673050000000103],[-78.563889000000017,58.676940999999999],[-78.555831999999953,58.677773000000059],[-78.543883999999991,58.678046999999992],[-78.514724999999942,58.67943600000001],[-78.469727000000034,58.695541000000105],[-78.467223999999987,58.701660000000118],[-78.48832699999997,58.786385000000053],[-78.50556899999998,58.835266000000104],[-78.511672999999917,58.839157],[-78.516402999999968,58.843323000000055],[-78.538605000000018,58.886940000000095],[-78.571395999999879,58.957214000000079],[-78.570557000000008,58.961380000000133],[-78.561935000000005,58.965828000000101],[-78.552215999999987,58.968048000000124],[-78.396392999999932,58.964714000000129],[-78.361663999999962,58.958603000000039],[-78.352492999999924,58.956657000000007],[-78.346389999999985,58.953605999999979],[-78.344451999999876,58.949432000000115],[-78.344726999999978,58.946655000000021],[-78.345276000000013,58.944710000000043],[-78.348342999999943,58.942214999999976],[-78.366394000000014,58.920273000000122],[-78.363892000000021,58.912490999999989],[-78.357773000000009,58.910270999999966],[-78.345839999999953,58.909714000000065],[-78.338333000000034,58.912766000000033],[-78.310821999999973,58.927216000000101],[-78.304717999999923,58.931106999999997],[-78.205565999999976,59.050545000000113],[-78.127486999999974,59.108330000000024],[-78.08666999999997,59.156654000000003],[-78.093886999999995,59.193047000000035],[-78.098617999999988,59.196655000000135],[-78.101943999999946,59.200828999999999],[-78.103881999999999,59.205826000000116],[-78.092772999999909,59.214995999999985],[-77.961120999999935,59.258331000000112],[-77.949721999999952,59.261939999999925],[-77.930283000000031,59.26527399999992],[-77.884445000000028,59.271935000000042],[-77.860000999999954,59.272217000000126],[-77.843613000000005,59.275551000000121],[-77.828887999999949,59.281105000000082],[-77.824448000000018,59.283606999999961],[-77.68499799999995,59.393326000000116],[-77.677215999999987,59.399994000000106],[-77.678328999999962,59.401932000000045],[-77.779175000000009,59.426102000000014],[-77.787216000000001,59.426658999999916],[-77.798049999999989,59.426384000000098],[-77.831389999999942,59.414711000000068],[-77.880279999999914,59.39916199999999],[-77.887512000000015,59.397491000000116],[-77.896956999999986,59.397217000000012],[-77.902221999999995,59.398880000000077],[-77.905838000000017,59.401100000000099],[-77.910277999999948,59.405548000000067],[-77.912506000000008,59.415267999999969],[-77.910552999999879,59.425551999999982],[-77.872771999999998,59.491935999999953],[-77.867492999999911,59.5],[-77.86111499999987,59.503883000000087],[-77.84056099999998,59.513054000000068],[-77.798889000000031,59.524993999999992],[-77.779175000000009,59.52887700000008],[-77.769454999999937,59.529160000000047],[-77.749999999999886,59.532211000000075],[-77.721389999999928,59.539719000000105],[-77.724716000000001,59.593880000000013],[-77.755004999999926,59.628326000000072],[-77.762786999999889,59.631378000000041],[-77.767501999999922,59.634994999999947],[-77.797774999999945,59.670272999999952],[-77.801102000000014,59.675270000000069],[-77.798614999999927,59.679993000000081],[-77.773894999999982,59.709717000000069],[-77.761672999999973,59.709991000000002],[-77.731948999999986,59.70777099999998],[-77.710555999999883,59.704712000000029],[-77.585228000000029,59.66921200000013],[-77.53988599999991,59.653381000000138],[-77.535392999999942,59.651379000000077],[-77.524390999999923,59.644714000000135],[-77.518889999999885,59.639381000000128],[-77.513229000000024,59.630546999999979],[-77.513725000000022,59.620215999999971],[-77.514893000000029,59.614044000000035],[-77.464721999999995,59.587212000000022],[-77.460006999999962,59.582771000000093],[-77.454177999999956,59.579162999999994],[-77.444992000000013,59.576385000000016],[-77.426940999999943,59.571381000000031],[-77.353607000000011,59.563605999999936],[-77.322509999999909,59.562767000000008],[-77.313889000000017,59.564995000000124],[-77.311935000000005,59.566939999999931],[-77.316956000000005,59.56999200000007],[-77.344161999999983,59.576942000000088],[-77.427994000000012,59.619049000000075],[-77.433334000000002,59.620543999999938],[-77.441665999999998,59.624717999999973],[-77.502335000000016,59.678215000000023],[-77.542496000000028,59.747490000000084],[-77.541945999999996,59.750274999999931],[-77.533065999999963,59.754714999999976],[-77.432769999999948,59.784163999999976],[-77.412780999999939,59.787773000000129],[-77.389449999999954,59.788886999999932],[-77.333618000000001,59.78527100000008],[-77.311660999999958,59.785552999999936],[-77.30471799999998,59.787216000000058],[-77.298889000000031,59.789719000000048],[-77.293609999999887,59.793610000000115],[-77.296111999999937,59.801933000000076],[-77.301392000000021,59.811104],[-77.363616999999863,59.890830999999991],[-77.368056999999965,59.894714000000079],[-77.378051999999968,59.901382000000069],[-77.385559000000001,59.904433999999981],[-77.427489999999977,59.914710999999954],[-77.206954999999994,60.042770000000019],[-77.070006999999919,60.064156000000082],[-76.848052999999936,60.099159000000043],[-76.775833000000034,60.131659999999954],[-76.770843999999954,60.136383000000137],[-76.758895999999993,60.159157000000107],[-76.808608999999933,60.159714000000008],[-76.828339000000028,60.157493999999986],[-76.846114999999998,60.152214000000129],[-76.852492999999981,60.148330999999985],[-76.857772999999952,60.143883000000017],[-76.860549999999932,60.137771999999984],[-76.857498000000021,60.132767000000115],[-76.854172000000005,60.121658000000025],[-76.85943599999996,60.116936000000123],[-76.866942999999992,60.113883999999985],[-76.889724999999999,60.112495000000024],[-76.924437999999896,60.111664000000019],[-76.950561999999934,60.112213000000111],[-76.962783999999999,60.113608999999997],[-77.00389100000001,60.121933000000013],[-77.031386999999881,60.129714999999976],[-77.055556999999965,60.138602999999989],[-77.074172999999973,60.142769000000044],[-77.111938000000009,60.146942000000024],[-77.173888999999974,60.150268999999923],[-77.187499999999943,60.150826000000052],[-77.199996999999939,60.150826000000052],[-77.199722000000008,60.145270999999923],[-77.194716999999969,60.129158000000075],[-77.232498000000021,60.053879000000109],[-77.272781000000009,60.039993000000095],[-77.315825999999959,60.030548000000067],[-77.519164999999987,60.044159000000036],[-77.540282999999988,60.048050000000103],[-77.557219999999973,60.052773000000059],[-77.592223999999987,60.064156000000082],[-77.600280999999939,60.108604000000128],[-77.595275999999899,60.112495000000024],[-77.581680000000006,60.118881000000101],[-77.558043999999938,60.126656000000025],[-77.549164000000019,60.129158000000075],[-77.496947999999918,60.156097000000045],[-77.470276000000013,60.213325999999995],[-77.473617999999931,60.216934000000094],[-77.602782999999931,60.329994000000056],[-77.639724999999942,60.362213000000054],[-77.647506999999905,60.365273000000116],[-77.658339999999953,60.368050000000039],[-77.683060000000012,60.367767000000072],[-77.692489999999964,60.369438000000116],[-77.708344000000011,60.375824000000023],[-77.743606999999997,60.393326000000059],[-77.747222999999963,60.396942000000138],[-77.747756999999922,60.408134000000132],[-77.740829000000019,60.423607000000004],[-77.736937999999952,60.428879000000109],[-77.71945199999999,60.447211999999979],[-77.691939999999931,60.466660000000104],[-77.567504999999926,60.529716000000008],[-77.479995999999915,60.54055000000011],[-77.430832000000009,60.540275999999949],[-77.419723999999917,60.541107000000011],[-77.413329999999974,60.544159000000093],[-77.436385999999914,60.554436000000067],[-77.464447000000007,60.561935000000062],[-77.486114999999927,60.56638300000003],[-77.521666999999979,60.570274000000097],[-77.549438000000009,60.571381000000031],[-77.573623999999938,60.570549000000085],[-77.598617999999931,60.563606000000107],[-77.631942999999978,60.551933000000076],[-77.640563999999983,60.550270000000012],[-77.65055799999999,60.548882000000049],[-77.670273000000009,60.549721000000034],[-77.680831999999953,60.552216000000044],[-77.704453000000001,60.561661000000129],[-77.787216000000001,60.59665700000005],[-77.829453000000001,60.633605999999929],[-77.833892999999932,60.639434999999992],[-77.831679999999949,60.644714000000135],[-77.821670999999867,60.651931999999931],[-77.775832999999977,60.671104000000128],[-77.722504000000015,60.69193300000012],[-77.716399999999965,60.694434999999999],[-77.610001000000011,60.755554000000075],[-77.515839000000028,60.830551000000014],[-77.512512000000015,60.833602999999925],[-77.511672999999973,60.83638000000002],[-77.53195199999999,60.835266000000047],[-77.571670999999981,60.828330999999991],[-77.708054000000004,60.795547000000113],[-77.856383999999935,60.764442000000088],[-77.920546999999999,60.791382000000112],[-77.903885000000002,60.812492000000077],[-77.889998999999989,60.818886000000134],[-77.883330999999941,60.823325999999952],[-77.887222000000008,60.825829000000113],[-77.896392999999875,60.828049000000135],[-77.909163999999976,60.82888000000014],[-77.975280999999939,60.822769000000051],[-78.078612999999905,60.806099000000131],[-78.116942999999992,60.798050000000103],[-78.125823999999966,60.795547000000113],[-78.172500999999954,60.787216000000058],[-78.17971799999998,60.786942000000124],[-78.18638599999997,60.788047999999947],[-78.190552000000025,60.788887000000102],[-78.192764000000011,60.790833000000021],[-78.171660999999915,60.854713000000061],[-78.15943900000002,60.867210000000057],[-77.954726999999991,61.000831999999946],[-77.925551999999925,61.01888300000013],[-77.889175000000023,61.038048000000117],[-77.873610999999926,61.045547000000056],[-77.858046999999942,61.051101999999958],[-77.853881999999942,61.052215999999987],[-77.846664000000033,61.052490000000091],[-77.701675000000023,61.217491000000109],[-77.724441999999954,61.254439999999988],[-77.739990000000034,61.298607000000061],[-77.746658000000025,61.337494000000106],[-77.761123999999938,61.410271000000023],[-77.678878999999995,61.461104999999975],[-77.620834000000002,61.462493999999992],[-77.56361400000003,61.466660000000047],[-77.560546999999929,61.468047999999953],[-77.542496000000028,61.479430999999977],[-77.543335000000013,61.483047000000056],[-77.548339999999939,61.486107000000118],[-77.613892000000021,61.504166000000055],[-77.596114999999941,61.555824000000143],[-77.572784000000013,61.549995000000138],[-77.517226999999934,61.539719000000048],[-77.478607000000011,61.536385000000053],[-77.475005999999951,61.539161999999976],[-77.474715999999944,61.541664000000026],[-77.480285999999921,61.548882000000049],[-77.581389999999999,61.600548000000117],[-77.589171999999962,61.604439000000013],[-77.616500999999971,61.606327000000078],[-77.627997999999991,61.605995000000121],[-77.667496000000028,61.603049999999996],[-77.690825999999959,61.602218999999991],[-77.702498999999989,61.602776000000063],[-77.710555999999883,61.60582700000009],[-77.744155999999975,61.64027400000009],[-77.816665999999998,61.684989999999914],[-77.884445000000028,61.68582200000003],[-77.898894999999925,61.686378000000047],[-77.931380999999931,61.69193300000012],[-77.975829999999974,61.702774000000034],[-77.982223999999974,61.70665699999995],[-77.992492999999968,61.714714000000129],[-78.00306699999993,61.728325000000098],[-78.006119000000012,61.733046999999999],[-78.011947999999961,61.748604000000057],[-78.074447999999904,61.917213000000004],[-78.077498999999989,61.940544000000045],[-78.081389999999999,61.951103000000103],[-78.091675000000009,61.965271000000143],[-78.110001000000011,61.984161000000086],[-78.120269999999948,61.99193600000001],[-78.137787000000003,62.009163000000001],[-78.141387999999949,62.020546000000024],[-78.143616000000009,62.03138000000007],[-78.15943900000002,62.149994000000049],[-78.161666999999966,62.169159000000036],[-78.157776000000013,62.267494000000056],[-78.15583799999996,62.278328000000101],[-78.149733999999967,62.287216000000114],[-78.103058000000033,62.337494000000049],[-78.085007000000019,62.353325000000041],[-78.023894999999982,62.393326000000059],[-78.016402999999968,62.39388300000013],[-78.008056999999894,62.390549000000135],[-77.996657999999968,62.388046000000145],[-77.983063000000016,62.388329000000113],[-77.96305799999999,62.392768999999987],[-77.711394999999925,62.468048000000124],[-77.687209999999993,62.476654000000053],[-77.555556999999965,62.536110000000008],[-77.535278000000005,62.54694400000011],[-77.508347000000015,62.561661000000072],[-77.354996000000028,62.558044000000109],[-77.073623999999938,62.534163999999976],[-76.92582699999997,62.526382000000012],[-76.756957999999997,62.506943000000092],[-76.746947999999975,62.504997000000003],[-76.655562999999972,62.469986000000063],[-76.498610999999869,62.44110100000006],[-76.401947000000007,62.427490000000091],[-76.317779999999914,62.412209000000132],[-76.143065999999919,62.379158000000018],[-75.709732000000031,62.296387000000038],[-75.719214999999963,62.242493000000024],[-75.739562999999919,62.236160000000041],[-75.819884999999999,62.205657999999971],[-75.878875999999991,62.168602000000135],[-75.891113000000018,62.161933999999974],[-75.895003999999915,62.158599999999979],[-75.890839000000028,62.156937000000084],[-75.835830999999985,62.158043000000077],[-75.826949999999954,62.158882000000062],[-75.772399999999948,62.177215999999987],[-75.770720999999924,62.180049999999994],[-75.765052999999909,62.184718999999973],[-75.760887000000025,62.187050000000113],[-75.756057999999882,62.188713000000007],[-75.705062999999996,62.203216999999995],[-75.656882999999993,62.216544999999996],[-75.579177999999899,62.242218000000037],[-75.573897999999929,62.244155999999975],[-75.556945999999925,62.252777000000037],[-75.552779999999927,62.256660000000011],[-75.550277999999935,62.260826000000066],[-75.539443999999889,62.268326000000002],[-75.493606999999997,62.293326999999977],[-75.486937999999952,62.296387000000038],[-75.478881999999999,62.298607000000061],[-75.472777999999948,62.299438000000066],[-75.402221999999938,62.306381000000044],[-75.356383999999991,62.310546999999985],[-75.321945000000028,62.311104000000057],[-75.307495000000017,62.310271999999941],[-75.184432999999956,62.292220999999984],[-75.015563999999983,62.264999000000046],[-75,62.262245000000064],[-74.938323999999909,62.250274999999988],[-74.918610000000001,62.245544000000052],[-74.89805599999994,62.240273000000002],[-74.889998999999989,62.237495000000024],[-74.882216999999912,62.233604000000128],[-74.873885999999857,62.226097000000038],[-74.767226999999878,62.161102000000085],[-74.700835999999867,62.131104000000107],[-74.693054000000018,62.127769000000058],[-74.668883999999991,62.119156000000089],[-74.620833999999888,62.107215999999994],[-74.598052999999936,62.104164000000083],[-74.571670999999981,62.10305000000011],[-74.556380999999988,62.104713000000004],[-74.553054999999972,62.106102000000021],[-74.553878999999995,62.108046999999999],[-74.558608999999876,62.111938000000066],[-74.618880999999931,62.132492000000013],[-74.662216000000001,62.146660000000054],[-74.686110999999983,62.155823000000055],[-74.700287000000003,62.16276600000009],[-74.75111400000003,62.19110100000006],[-74.758895999999993,62.199158000000068],[-74.759734999999921,62.20138500000013],[-74.759734999999921,62.20638300000013],[-74.756393000000003,62.212212000000136],[-74.725829999999917,62.244995000000131],[-74.717498999999918,62.247771999999998],[-74.700287000000003,62.250832000000059],[-74.678328999999962,62.253608999999983],[-74.645844000000011,62.253608999999983],[-74.579453000000001,62.251938000000109],[-74.525833000000034,62.246940999999993],[-74.473617999999931,62.24332400000003],[-74.461394999999982,62.243880999999931],[-74.428878999999938,62.247771999999998],[-74.410004000000015,62.251389000000131],[-74.383895999999936,62.2586060000001],[-74.141677999999956,62.326660000000004],[-73.981383999999991,62.377769000000001],[-73.97444200000001,62.386108000000036],[-73.969727000000034,62.390830999999991],[-73.94027699999998,62.412209000000132],[-73.888901000000033,62.440543999999932],[-73.83805799999999,62.457497000000046],[-73.688048999999978,62.479988000000048],[-73.678878999999995,62.479988000000048],[-73.65972899999997,62.475265999999976],[-73.648345999999947,62.468322999999998],[-73.642501999999922,62.463608000000136],[-73.502791999999999,62.386658000000068],[-73.369995000000017,62.363609000000054],[-73.227218999999877,62.318054000000075],[-73.211394999999925,62.312767000000008],[-73.206664999999987,62.308884000000035],[-73.204178000000013,62.303878999999995],[-73.202788999999996,62.298882000000106],[-73.207229999999925,62.285828000000038],[-73.210280999999952,62.281936999999971],[-73.210830999999985,62.275826000000052],[-73.209732000000031,62.270828000000051],[-73.204178000000013,62.261382999999967],[-73.191939999999875,62.253608999999983],[-73.178054999999972,62.246101000000124],[-73.131942999999978,62.225266000000033],[-73.070006999999976,62.197487000000024],[-72.899445000000014,62.138328999999999],[-72.723891999999921,62.142220000000066],[-72.626663000000008,62.115547000000049],[-72.61721799999998,62.108604000000071],[-72.596114999999884,62.049164000000019],[-72.618713000000014,61.974212999999963],[-72.619888000000003,61.970878999999968],[-72.665717999999913,61.928382999999997],[-72.689986999999917,61.891936999999984],[-72.748610999999983,61.856384000000105],[-72.724716000000001,61.845267999999976],[-72.612503000000004,61.804993000000081],[-72.602782999999931,61.804160999999965],[-72.596114999999884,61.805549999999982],[-72.591674999999952,61.809989999999971],[-72.587783999999886,61.82027400000004],[-72.622771999999941,61.861382000000106],[-72.628875999999991,61.873047000000042],[-72.609557999999993,61.88771400000013],[-72.610893000000033,61.893714999999986],[-72.611397000000011,61.900047000000086],[-72.610222000000022,61.905380000000093],[-72.607551999999998,61.910049000000015],[-72.597548999999958,61.920211999999992],[-72.593886999999995,61.92321400000003],[-72.587226999999984,61.924376999999993],[-72.581222999999966,61.923378000000127],[-72.519729999999925,61.920546999999999],[-72.448607999999979,61.901382000000012],[-72.396666999999923,61.889435000000049],[-72.386948000000018,61.887771999999984],[-72.345551,61.884437999999989],[-72.321945000000028,61.883881000000088],[-72.256957999999997,61.876938000000109],[-72.235001000000011,61.872215000000097],[-72.205840999999964,61.86332700000014],[-72.200835999999924,61.860275000000001],[-72.041381999999999,61.722488000000112],[-72.01005600000002,61.675270000000012],[-72.038054999999986,61.624709999999993],[-72.080565999999976,61.601936000000023],[-72.087783999999999,61.598877000000073],[-72.095839999999953,61.596099999999979],[-72.113892000000021,61.595543000000077],[-72.12388599999997,61.596382000000006],[-72.160004000000015,61.605270000000019],[-72.194153000000028,61.615829000000076],[-72.227492999999981,61.619987000000037],[-72.236663999999962,61.619438000000059],[-72.254456000000005,61.615546999999992],[-72.271118000000001,61.609161000000086],[-72.303328999999906,61.570830999999998],[-72.303878999999938,61.568885999999964],[-72.303328999999906,61.56721500000009],[-72.083618000000001,61.582496999999933],[-72.057220000000029,61.586655000000064],[-71.980285999999978,61.599998000000085],[-71.978333000000021,61.601387000000102],[-71.967772999999966,61.609436000000073],[-71.940825999999959,61.648331000000042],[-71.936660999999958,61.65554800000001],[-71.933608999999933,61.663605000000132],[-71.933060000000012,61.668602000000078],[-71.933884000000035,61.674164000000019],[-71.936660999999958,61.677773000000002],[-71.941375999999991,61.681106999999997],[-71.946884000000011,61.688380999999993],[-71.950385999999867,61.688713000000121],[-71.953888000000006,61.690716000000123],[-71.956557999999916,61.693047000000092],[-71.956885999999884,61.694213999999988],[-71.956054999999935,61.698883000000137],[-71.950546000000031,61.701218000000097],[-71.948883000000023,61.701549999999997],[-71.945221000000004,61.701714000000095],[-71.928878999999995,61.705826000000116],[-71.819457999999941,61.688599000000124],[-71.795273000000009,61.682213000000047],[-71.644729999999925,61.639435000000105],[-71.575011999999901,61.608604000000014],[-71.571670999999867,61.605552999999986],[-71.545546999999999,61.571938000000102],[-71.546111999999937,61.566940000000102],[-71.549437999999896,61.558884000000035],[-71.560271999999941,61.557212999999933],[-71.629714999999976,61.548607000000061],[-71.635009999999966,61.545830000000137],[-71.652221999999995,61.543053000000043],[-71.663054999999929,61.54193900000007],[-71.751113999999973,61.538048000000003],[-71.789444000000003,61.521934999999928],[-71.746384000000035,61.47137500000008],[-71.746947999999975,61.465827999999988],[-71.802779999999984,61.446938000000046],[-71.817504999999983,61.442764000000011],[-71.875548999999921,61.436103999999943],[-71.885558999999944,61.432769999999948],[-71.887787000000003,61.430824000000086],[-71.887511999999958,61.428046999999992],[-71.879439999999988,61.422492999999974],[-71.873046999999929,61.419716000000108],[-71.853333000000021,61.414436000000023],[-71.700561999999991,61.405823000000055],[-71.684722999999963,61.404990999999939],[-71.676101999999958,61.37221500000004],[-71.67193599999996,61.330551000000128],[-71.598891999999978,61.254166000000055],[-71.53083799999996,61.213608000000022],[-71.389998999999989,61.137772000000098],[-71.295836999999892,61.148605000000089],[-71.286666999999909,61.149719000000061],[-71.279175000000009,61.151100000000099],[-71.174712999999997,61.13999200000012],[-71.011397999999986,61.121657999999968],[-70.966948999999943,61.113883999999985],[-70.945830999999941,61.108887000000095],[-70.928329000000019,61.102493000000038],[-70.921936000000017,61.09693900000002],[-70.921386999999982,61.09137700000008],[-70.773330999999985,61.08166499999993],[-70.656386999999995,61.050545000000056],[-70.553054999999972,61.024994000000049],[-70.539718999999991,61.055824000000086],[-70.535278000000005,61.05943300000007],[-70.419998000000021,61.08526599999999],[-70.41361999999998,61.086655000000007],[-70.315551999999911,61.094994000000042],[-70.165008999999998,61.088043000000084],[-70.146117999999888,61.084717000000069],[-70.141387999999949,61.08277099999998],[-70.107223999999917,61.064438000000109],[-70.085830999999985,60.954993999999999],[-70.088057999999876,60.89777400000014],[-69.927490000000034,60.807770000000005],[-69.914444000000003,60.80860100000001],[-69.901107999999965,60.81221000000005],[-69.888061999999934,60.819160000000068],[-69.856383999999991,60.838326000000109],[-69.850554999999986,60.841934000000037],[-69.84973100000002,60.846656999999993],[-69.851395000000025,60.849716000000001],[-69.858886999999982,60.851936000000023],[-69.869445999999925,60.850829999999974],[-69.883620999999948,60.845268000000033],[-69.894729999999925,60.855552999999929],[-69.833327999999995,60.889992000000007],[-69.826110999999969,60.893326000000002],[-69.778885000000002,60.91137700000013],[-69.756957999999941,60.918884000000105],[-69.750838999999928,60.919715999999994],[-69.741104000000007,60.9180530000001],[-69.738051999999925,60.915543000000071],[-69.743332000000009,60.906936999999971],[-69.75140399999998,60.898879999999963],[-69.750564999999995,60.894440000000145],[-69.74610899999999,60.884720000000073],[-69.740554999999972,60.881377999999927],[-69.71055599999994,60.873878000000047],[-69.688599000000011,60.871658000000025],[-69.677215999999987,60.871101000000124],[-69.658614999999998,60.876938000000109],[-69.649993999999879,60.8836060000001],[-69.645843999999954,60.893051000000128],[-69.643889999999942,60.903320000000008],[-69.649169999999913,60.913879000000065],[-69.655563000000029,60.9222180000001],[-69.671660999999915,60.934433000000013],[-69.680831999999953,60.943047000000035],[-69.688599000000011,60.951660000000004],[-69.689437999999882,60.956100000000049],[-69.689712999999983,60.96166199999999],[-69.680557000000022,61.014159999999947],[-69.679442999999935,61.019440000000031],[-69.676665999999955,61.025551000000121],[-69.656661999999926,61.053604000000064],[-69.653884999999946,61.056938000000059],[-69.613051999999925,61.079163000000051],[-69.599990999999989,61.081940000000145],[-69.554168999999945,61.080550999999957],[-69.528609999999958,61.076385000000073],[-69.519729999999925,61.073326000000122],[-69.514450000000011,61.069442999999978],[-69.511397999999929,61.06610100000006],[-69.508347000000015,61.060822000000087],[-69.492767000000015,61.031937000000028],[-69.468886999999995,60.994995000000017],[-69.465285999999935,60.990273000000116],[-69.453613000000018,60.974991000000045],[-69.368057000000022,60.903046000000074],[-69.368606999999997,60.811104],[-69.371933000000013,60.80443600000001],[-69.380554000000018,60.794716000000108],[-69.386672999999973,60.790550000000053],[-69.404448999999943,60.783332999999914],[-69.421386999999925,60.778046000000018],[-69.438598999999954,60.774994000000049],[-69.496657999999968,60.764442000000088],[-69.533065999999963,60.757217000000026],[-69.591675000000009,60.739158999999972],[-69.615829000000019,60.730270000000075],[-69.708618000000001,60.686935000000119],[-69.716109999999958,60.682770000000119],[-69.71055599999994,60.675270000000069],[-69.705001999999979,60.671936000000073],[-69.695830999999998,60.663879000000065],[-69.656386999999995,60.595543000000077],[-69.654174999999952,60.584991000000116],[-69.654174999999952,60.581383000000017],[-69.656951999999933,60.574715000000026],[-69.6875,60.551383999999985],[-69.693603999999937,60.54694400000011],[-69.702224999999885,60.544440999999949],[-69.748610999999983,60.539719000000048],[-69.797774999999945,60.53443900000002],[-69.813888999999904,60.530548000000124],[-69.822234999999978,60.52777100000003],[-69.826110999999969,60.525551000000007],[-69.824448000000018,60.522490999999945],[-69.787506000000008,60.480545000000006],[-69.78443900000002,60.478043000000071],[-69.778335999999967,60.475266000000033],[-69.762222000000008,60.470268000000033],[-69.74888599999997,60.461662000000103],[-69.721664000000033,60.368881000000044],[-69.722504000000015,60.364158999999972],[-69.727782999999988,60.35193600000008],[-69.744445999999982,60.340546000000018],[-69.751953000000015,60.336380000000133],[-69.756667999999934,60.331940000000145],[-69.764724999999999,60.323607999999979],[-69.766952999999944,60.318328999999949],[-69.768065999999862,60.312210000000107],[-69.764724999999999,60.307495000000074],[-69.758895999999993,60.304710000000057],[-69.696380999999974,60.278877000000136],[-69.606383999999991,60.232765000000029],[-69.605269999999905,60.2227630000001],[-69.605835000000013,60.218596999999988],[-69.610001000000011,60.208327999999995],[-69.614166000000012,60.202492000000063],[-69.636977999999999,60.179047000000025],[-69.601943999999946,60.183052000000089],[-69.594161999999983,60.180824000000143],[-69.593886999999995,60.175827000000027],[-69.603606999999954,60.10305000000011],[-69.624709999999993,60.067497000000117],[-69.636948000000018,60.065268999999944],[-69.706664999999987,60.057495000000131],[-69.837218999999948,60.019713999999965],[-69.892226999999934,59.99971800000003],[-70.217223999999931,60.007216999999969],[-70.296393999999907,60.011196000000041],[-70.336120999999935,60.004440000000102],[-70.488051999999868,59.993607000000111],[-70.505004999999926,59.992493000000138],[-70.53472899999997,59.991936000000067],[-70.556945999999925,59.992767000000072],[-70.579726999999934,59.994712999999933],[-70.593062999999972,59.996658000000139],[-70.770844000000011,60.028046000000131],[-70.945830999999941,60.063048999999978],[-70.900283999999999,60.040276000000063],[-70.631103999999993,59.985824999999977],[-70.610549999999932,59.980820000000108],[-70.585007000000019,59.971931000000041],[-70.566955999999948,59.968597000000045],[-70.507232999999985,59.96665999999999],[-70.475829999999974,59.968323000000112],[-70.33805799999999,59.976379000000009],[-70.236938000000009,59.986938000000066],[-70.227218999999934,59.986655999999982],[-70.218613000000005,59.984160999999972],[-70.197495000000004,59.974158999999986],[-70.164718999999991,59.962494000000106],[-70.112503000000004,59.949715000000026],[-70.086120999999991,59.946381000000088],[-70.06138599999997,59.94499200000007],[-70.049987999999871,59.945267000000058],[-70.030837999999903,59.948043999999982],[-69.947768999999994,59.958885000000123],[-69.758895999999993,59.96776600000004],[-69.726944000000003,59.963608000000079],[-69.718886999999938,59.959717000000012],[-69.600554999999872,59.833054000000004],[-69.605559999999912,59.777214000000129],[-69.610001000000011,59.728600000000142],[-69.540833000000021,59.671104000000014],[-69.604995999999971,59.588325999999995],[-69.61332699999997,59.588325999999995],[-69.62777699999998,59.583878000000027],[-69.658889999999985,59.572495000000004],[-69.679442999999935,59.563605999999936],[-69.698043999999982,59.553047000000106],[-69.718613000000005,59.537773000000016],[-69.729720999999927,59.52777100000003],[-69.748336999999935,59.50999500000006],[-69.759445000000028,59.493880999999988],[-69.761123999999938,59.484161000000086],[-69.759445000000028,59.481102000000078],[-69.756393000000003,59.478600000000029],[-69.728333000000021,59.479713000000118],[-69.703888000000006,59.481934000000024],[-69.698607999999922,59.481377000000123],[-69.697495000000004,59.480545000000006],[-69.669448999999929,59.455551000000014],[-69.665832999999964,59.451659999999947],[-69.649445000000014,59.428879000000109],[-69.645279000000016,59.419159000000036],[-69.631667999999877,59.377769000000058],[-69.631377999999927,59.374992000000134],[-69.639998999999875,59.361107000000061],[-69.646392999999989,59.358887000000038],[-69.677779999999927,59.356941000000006],[-69.736664000000019,59.345267999999976],[-69.744155999999975,59.343322999999998],[-69.75778200000002,59.330826000000002],[-69.758347000000015,59.320273999999984],[-69.75111400000003,59.311104000000114],[-69.746947999999861,59.307770000000119],[-69.738601999999958,59.305266999999958],[-69.645003999999915,59.29833200000013],[-69.631103999999993,59.298881999999992],[-69.626663000000008,59.29972100000009],[-69.616393999999957,59.304436000000123],[-69.550277999999992,59.329720000000123],[-69.445830999999998,59.35443900000007],[-69.43582200000003,59.3555530000001],[-69.412506000000008,59.354995999999971],[-69.259445000000028,59.326660000000061],[-69.249724999999955,59.323607999999979],[-69.238327000000027,59.259720000000129],[-69.235001000000011,59.23943300000002],[-69.234725999999966,59.233879000000059],[-69.238051999999925,59.229431000000091],[-69.244445999999982,59.224433999999974],[-69.285827999999924,59.208327999999995],[-69.366394000000014,59.190826000000129],[-69.37388599999997,59.189430000000073],[-69.404998999999975,59.190269000000058],[-69.419158999999979,59.192490000000134],[-69.420272999999952,59.196098000000063],[-69.417496000000028,59.202217000000076],[-69.414443999999946,59.212494000000049],[-69.416655999999989,59.219711000000018],[-69.420837000000006,59.223045000000013],[-69.429717999999923,59.224709000000018],[-69.439437999999996,59.224433999999974],[-69.448607999999979,59.2227630000001],[-69.470276000000013,59.213882000000012],[-69.512222000000008,59.192764000000068],[-69.530562999999972,59.18221299999999],[-69.537505999999894,59.172493000000088],[-69.540282999999988,59.166381999999999],[-69.541107000000011,59.161659000000043],[-69.537215999999944,59.123047000000042],[-69.533065999999963,59.110825000000034],[-69.527785999999992,59.106658999999979],[-69.52055399999989,59.104439000000127],[-69.511397999999929,59.103324999999984],[-69.505568999999923,59.104163999999969],[-69.49499499999996,59.109993000000145],[-69.484436000000017,59.121375999999998],[-69.474716000000001,59.128043999999932],[-69.46305799999999,59.12943300000012],[-69.453887999999949,59.128326000000015],[-69.384170999999981,59.118880999999931],[-69.367492999999911,59.116386000000091],[-69.359725999999966,59.112770000000069],[-69.349166999999909,59.104996000000028],[-69.345276000000013,59.095543000000021],[-69.344161999999983,59.091103000000032],[-69.352782999999988,59.080826000000059],[-69.431945999999982,59.025269000000094],[-69.466110000000015,59.044159000000036],[-69.493331999999953,59.037498000000085],[-69.475280999999939,58.971931000000041],[-69.457503999999915,58.915824999999984],[-69.454726999999991,58.90638000000007],[-69.453887999999949,58.895828000000108],[-69.454177999999956,58.892220000000009],[-69.456389999999999,58.884163000000001],[-69.460006999999962,58.878876000000105],[-69.547500999999897,58.808043999999995],[-69.557495000000017,58.80360399999995],[-69.587783999999942,58.796660999999972],[-69.611114999999984,58.792220999999984],[-69.656386999999995,58.787773000000016],[-69.670836999999949,58.792220999999984],[-69.680831999999953,58.800269999999955],[-69.711944999999957,58.848877000000073],[-69.714721999999938,58.85833000000008],[-69.716109999999958,58.864715999999987],[-69.702788999999996,58.876381000000094],[-69.672226000000023,58.89138000000014],[-69.668610000000001,58.899437000000091],[-69.668334999999956,58.902771000000087],[-69.668334999999956,58.92582700000014],[-69.671660999999915,58.930550000000096],[-69.709441999999967,58.972762999999986],[-69.848342999999943,59.047217999999987],[-69.865279999999927,59.052773000000059],[-69.869155999999919,59.053046999999992],[-69.872771999999998,59.050827000000027],[-69.87388599999997,59.041107000000125],[-69.874160999999958,59.034163999999919],[-69.87388599999997,59.02915999999999],[-69.865554999999972,58.977768000000026],[-69.832779000000016,58.951660000000061],[-69.815826000000015,58.82388300000008],[-69.972777999999892,58.808601000000067],[-70.153610000000015,58.777488999999946],[-70.158889999999985,58.761107999999979],[-70.049728000000016,58.743606999999997],[-69.974716000000001,58.755554000000132],[-69.931106999999997,58.733047000000056],[-69.910552999999936,58.68804200000011],[-69.864440999999999,58.617493000000138],[-69.861663999999962,58.614998000000128],[-69.818892999999946,58.588599999999985],[-69.813048999999921,58.589157000000057],[-69.799437999999952,58.59887700000013],[-69.793335000000013,58.603881999999999],[-69.724441999999954,58.668883999999991],[-69.625,58.743881000000101],[-69.608046999999999,58.754714999999976],[-69.581680000000006,58.765831000000105],[-69.570847000000015,58.769440000000145],[-69.544723999999974,58.773323000000062],[-69.507507000000032,58.774712000000079],[-69.498885999999857,58.778602999999919],[-69.445540999999878,58.808327000000133],[-69.418883999999878,58.825553999999954],[-69.411666999999966,58.830276000000026],[-69.410277999999948,58.83998900000006],[-69.405838000000017,58.850273000000129],[-69.394729999999925,58.856659000000036],[-69.381942999999922,58.861381999999992],[-69.348891999999978,58.871658000000082],[-69.279175000000009,58.888046000000145],[-69.153884999999946,58.899993999999992],[-69.129989999999964,58.901657000000114],[-69.098343,58.899162000000103],[-69.031676999999888,58.893326000000002],[-68.99221799999998,58.883880999999974],[-68.841675000000009,58.891106000000036],[-68.756957999999997,58.912490999999989],[-68.656386999999938,58.900269000000037],[-68.637512000000015,58.896659999999997],[-68.601668999999958,58.885826000000122],[-68.396392999999989,58.816101000000117],[-68.390686000000017,58.811707000000013],[-68.360549999999932,58.781936999999914],[-68.355835000000013,58.774437000000034],[-68.357772999999952,58.764717000000132],[-68.360275000000001,58.759437999999989],[-68.366393999999957,58.687492000000077],[-68.34584000000001,58.626937999999996],[-68.323059000000001,58.58526599999999],[-68.290832999999907,58.541107000000011],[-68.216659999999933,58.490829000000076],[-68.209732000000031,58.462494000000049],[-68.204726999999991,58.453323000000069],[-68.203063999999983,58.441658000000018],[-68.204178000000013,58.436935000000062],[-68.226943999999946,58.376380999999981],[-68.244720000000029,58.33776899999998],[-68.256667999999991,58.323607999999979],[-68.285827999999924,58.294998000000135],[-68.289992999999924,58.28916200000009],[-68.309157999999911,58.253326000000072],[-68.322509999999966,58.22693600000008],[-68.34584000000001,58.169991000000039],[-68.348052999999936,58.159714000000065],[-68.347777999999948,58.15387700000008],[-68.344161999999983,58.141663000000051],[-68.341385000000002,58.133331000000055],[-68.344161999999983,58.127487000000087],[-68.350554999999929,58.12193300000007],[-68.46665999999999,58.045546999999942],[-68.477218999999934,58.039992999999981],[-68.503615999999909,58.031380000000013],[-68.528609999999958,58.029434000000094],[-68.729889000000014,57.99971800000003],[-68.874161000000015,57.969154000000003],[-69.127212999999983,57.899436999999921],[-69.135009999999909,57.896942000000081],[-69.181380999999988,57.878044000000045],[-69.202498999999989,57.868599000000131],[-69.221389999999928,57.858886999999982],[-69.262511999999958,57.833603000000039],[-69.357773000000009,57.774162000000047],[-69.369048999999961,57.765251000000092],[-69.363892000000021,57.765830999999935],[-69.339721999999938,57.773323000000062],[-69.304992999999968,57.786659000000043],[-69.298339999999996,57.789436000000137],[-69.210280999999952,57.829437000000098],[-69.190825999999959,57.840546000000018],[-69.172775000000001,57.851661999999976],[-69.111937999999896,57.885825999999952],[-68.965285999999878,57.933875999999998],[-68.904175000000009,57.949715000000083],[-68.695723999999984,57.987713000000099],[-68.678894000000014,57.989716000000101],[-68.667388999999957,57.990383000000008],[-68.634720000000016,57.988879999999995],[-68.62239099999988,57.989379999999983],[-68.545272999999952,58.000549000000035],[-68.495833999999945,58.013328999999999],[-68.416945999999939,58.034439000000134],[-68.404175000000009,58.039719000000048],[-68.31361400000003,58.103049999999996],[-68.308883999999978,58.108047000000113],[-68.304992999999911,58.113884000000041],[-68.302490000000034,58.119155999999975],[-68.299987999999928,58.127487000000087],[-68.300277999999878,58.132492000000127],[-68.30471799999998,58.146384999999952],[-68.305557000000022,58.149993999999992],[-68.307220000000029,58.164436000000137],[-68.306106999999997,58.181106999999997],[-68.305267000000015,58.186104000000057],[-68.301102000000014,58.198043999999982],[-68.295273000000009,58.209991000000116],[-68.284164000000033,58.219986000000063],[-68.230835000000013,58.26888300000013],[-68.18582200000003,58.360549999999989],[-68.168335000000013,58.414711000000125],[-68.166655999999989,58.424438000000066],[-68.166945999999996,58.435822000000144],[-68.169998000000021,58.446655000000135],[-68.172775000000001,58.454993999999999],[-68.178054999999972,58.469711000000132],[-68.178329000000019,58.480270000000019],[-68.171386999999925,58.489990000000091],[-68.139175000000023,58.521103000000096],[-68.135009999999852,58.524162000000047],[-68.013061999999991,58.573607999999922],[-68.003341999999975,58.576385000000016],[-67.983321999999987,58.573051000000021],[-67.969161999999983,58.565826000000015],[-67.959166999999979,58.558044000000052],[-67.896118000000001,58.500548999999978],[-67.893889999999999,58.496658000000082],[-67.892226999999991,58.491379000000109],[-67.891953000000001,58.483604000000014],[-67.895003999999915,58.476936000000023],[-67.901108000000022,58.467209000000082],[-67.908051,58.458046000000081],[-67.914444000000003,58.453323000000069],[-67.919448999999929,58.445540999999935],[-67.920837000000006,58.439430000000073],[-67.924163999999962,58.41276600000009],[-67.92332499999992,58.403046000000018],[-67.908339999999953,58.360825000000034],[-67.906113000000005,58.356941000000006],[-67.903610000000015,58.353607000000011],[-67.893340999999964,58.346656999999993],[-67.868056999999965,58.332214000000079],[-67.864166000000012,58.328880000000083],[-67.857498000000021,58.320273999999984],[-67.894500999999934,58.287163000000078],[-67.896659999999883,58.281158000000062],[-67.90449499999994,58.26766200000003],[-67.913329999999917,58.25616100000002],[-67.919341999999972,58.250159999999994],[-67.926330999999948,58.245491000000015],[-67.934829999999977,58.241161000000034],[-67.946999000000005,58.235992000000124],[-67.974990999999989,58.220993000000021],[-68.047501000000011,58.170547000000056],[-68.065826000000015,58.159431000000097],[-68.095839999999953,58.138602999999989],[-68.101105000000018,58.133049000000028],[-68.127486999999917,58.084717000000126],[-68.129989999999964,58.07888000000014],[-68.128325999999959,58.073608000000036],[-68.125548999999978,58.071105999999986],[-68.115828999999962,58.071938000000046],[-68.101105000000018,58.077773999999977],[-68.006667999999934,58.131935000000055],[-67.991668999999945,58.146103000000096],[-67.978333000000021,58.163605000000132],[-67.876944999999978,58.243050000000039],[-67.801392000000021,58.296661000000086],[-67.815551999999968,58.308883999999978],[-67.823897999999872,58.317215000000033],[-67.829178000000013,58.326385000000073],[-67.830565999999919,58.331383000000073],[-67.828888000000006,58.349716000000114],[-67.819732999999871,58.393608000000029],[-67.817229999999995,58.40526600000004],[-67.813323999999909,58.416100000000085],[-67.787505999999951,58.464439000000027],[-67.783066000000019,58.468048000000067],[-67.775008999999898,58.471099999999979],[-67.764450000000011,58.470543000000077],[-67.723891999999978,58.458885000000066],[-67.669448999999986,58.431938000000116],[-67.667496000000028,58.427489999999977],[-67.669998000000021,58.42193599999996],[-67.679992999999968,58.41276600000009],[-67.691939999999988,58.404433999999924],[-67.696945000000028,58.399437000000034],[-67.704726999999991,58.389160000000061],[-67.737212999999997,58.326942000000145],[-67.738892000000021,58.320831000000112],[-67.737212999999997,58.315543999999989],[-67.732497999999964,58.311661000000015],[-67.698043999999925,58.284995999999978],[-67.660827999999981,58.264442000000031],[-67.646117999999944,58.253326000000072],[-67.642775999999913,58.248604],[-67.652495999999985,58.214714000000129],[-67.654175000000009,58.210548000000017],[-67.728607000000011,57.976654000000053],[-67.713897999999858,57.923050000000046],[-67.710281000000009,57.97554800000006],[-67.708343999999954,57.982491000000039],[-67.659438999999963,58.110275000000058],[-67.653609999999958,58.122765000000015],[-67.64527899999996,58.134437999999989],[-67.591949,58.200828999999999],[-67.578339000000028,58.21527100000003],[-67.566100999999946,58.223602000000085],[-67.481383999999935,58.273880000000077],[-67.46665999999999,58.279716000000121],[-67.332779000000016,58.31610100000006],[-67.17222599999991,58.376380999999981],[-67.168609999999944,58.378044000000102],[-67.15194699999995,58.376656000000025],[-67.137512000000015,58.373046999999985],[-67.116652999999985,58.363327000000083],[-67.106948999999986,58.3555530000001],[-67.095550999999944,58.348877000000016],[-67.09056099999998,58.35054800000006],[-66.995834000000002,58.439430000000073],[-66.991669000000002,58.445267000000001],[-66.989989999999977,58.45138500000013],[-66.986664000000019,58.458046000000081],[-66.978881999999999,58.468323000000055],[-66.951401000000033,58.498603999999943],[-66.944153000000028,58.501937999999939],[-66.928054999999972,58.501663000000121],[-66.887221999999952,58.485550000000103],[-66.876937999999939,58.479156000000046],[-66.875548999999864,58.473877000000073],[-66.878052000000025,58.468596999999988],[-66.801101999999958,58.473602000000028],[-66.629714999999976,58.50360900000004],[-66.651671999999962,58.542770000000132],[-66.551940999999999,58.71138000000002],[-66.469727000000034,58.81638300000003],[-66.465012000000002,58.819992000000013],[-66.388610999999969,58.850548000000117],[-66.366652999999928,58.848044999999956],[-66.357773000000009,58.846099999999979],[-66.349990999999932,58.843048000000067],[-66.350280999999939,58.837212000000022],[-66.348891999999978,58.831940000000088],[-66.344161999999926,58.827773999999977],[-66.11471599999993,58.699714999999969],[-66.106110000000001,58.684989999999971],[-66.077224999999999,58.654434000000094],[-66.072234999999921,58.650825999999995],[-66.067779999999914,58.648880000000077],[-66.054168999999945,58.646102999999982],[-65.945540999999935,58.616936000000067],[-65.938888999999961,58.613883999999928],[-65.93582200000003,58.609718000000044],[-65.93582200000003,58.604713000000004],[-65.938598999999954,58.594437000000084],[-65.941939999999988,58.582770999999923],[-66.021941999999967,58.486938000000009],[-66.08944699999995,58.365273000000002],[-66.091385000000002,58.358887000000095],[-66.091385000000002,58.354164000000083],[-66.073059000000001,58.327217000000019],[-66.065552000000025,58.320273999999984],[-66.058883999999978,58.320273999999984],[-66.052779999999927,58.34693900000002],[-66.051392000000021,58.352493000000038],[-66.045546999999942,58.363052000000096],[-66.041671999999949,58.368050000000096],[-66.030562999999972,58.376380999999981],[-66.02305599999994,58.379714999999976],[-66.015014999999948,58.381934999999999],[-65.988051999999982,58.384437999999989],[-65.979172000000005,58.386107999999922],[-65.972777999999948,58.388046000000088],[-65.965012000000002,58.391936999999928],[-65.960280999999895,58.396103000000039],[-65.920272999999952,58.44582400000013],[-65.920837000000006,58.449432000000002],[-65.926666000000012,58.456099999999992],[-65.932219999999973,58.458885000000066],[-65.94027699999998,58.461661999999933],[-65.96166999999997,58.464714000000072],[-65.980559999999912,58.470268000000033],[-65.982497999999964,58.4741590000001],[-65.981948999999929,58.480545000000006],[-65.980559999999912,58.483047000000113],[-65.887512000000015,58.577774000000034],[-65.884170999999981,58.580826000000116],[-65.876937999999882,58.581940000000088],[-65.879989999999964,58.62721300000004],[-65.945540999999935,58.665267999999969],[-66.032226999999978,58.710548000000074],[-66.101394999999968,58.771103000000039],[-66.103881999999999,58.773604999999918],[-66.081954999999994,58.80971500000004],[-66.037215999999944,58.85166200000009],[-65.990111999999954,58.852661000000012],[-65.984954999999957,58.851494000000059],[-65.952277999999865,58.836822999999981],[-65.845839999999953,58.826660000000004],[-65.839721999999995,58.827217000000076],[-65.797501000000011,58.847488000000055],[-65.792770000000019,58.853325000000041],[-65.790282999999988,58.857773000000009],[-65.789443999999946,58.861938000000009],[-65.791381999999999,58.865829000000076],[-65.794998000000021,58.86693600000001],[-65.80610699999994,58.866660999999965],[-65.833327999999995,58.864715999999987],[-65.861938000000009,58.863327000000027],[-65.880279999999914,58.864440999999999],[-65.940445000000011,58.879105000000038],[-65.952606000000003,58.88126799999992],[-65.958115000000021,58.882935000000032],[-65.964775000000031,58.887440000000083],[-65.968276999999887,58.893440000000055],[-65.988602000000014,58.903603000000032],[-65.885559000000001,59.001938000000052],[-65.777495999999985,59.029990999999995],[-65.695266999999888,59.043610000000058],[-65.673049999999989,59.046104000000014],[-65.660278000000005,59.044159000000036],[-65.654174999999952,59.042496000000085],[-65.634673999999904,59.033217999999977],[-65.632492000000013,59.031216000000086],[-65.614166000000012,59.019440000000088],[-65.565001999999936,58.993607000000111],[-65.514450000000011,58.984718000000044],[-65.5,58.983330000000137],[-65.49499499999996,58.984718000000044],[-65.493332000000009,58.987495000000138],[-65.49499499999996,58.991936000000067],[-65.509444999999971,59.008330999999998],[-65.516402999999968,59.010826000000009],[-65.533614999999998,59.014717000000076],[-65.543059999999969,59.015549000000021],[-65.553054999999972,59.017493999999999],[-65.56082200000003,59.020827999999995],[-65.571388000000013,59.039108000000112],[-65.572891000000027,59.044106000000113],[-65.570221000000004,59.045772999999997],[-65.568054000000018,59.046776000000023],[-65.532776000000013,59.063881000000094],[-65.518616000000009,59.066666000000112],[-65.510284000000013,59.066940000000045],[-65.506392999999946,59.066382999999973],[-65.492492999999968,59.061378000000104],[-65.454726999999991,59.042221000000097],[-65.340285999999992,59.03833000000003],[-65.330565999999976,59.038048000000117],[-65.324721999999952,59.038887000000102],[-65.317504999999983,59.041382000000112],[-65.319732999999985,59.047217999999987],[-65.333618000000001,59.059990000000028],[-65.344726999999978,59.064712999999983],[-65.354171999999949,59.067497000000117],[-65.533553999999924,59.077663000000143],[-65.53687999999994,59.074665000000095],[-65.546721999999988,59.071831000000088],[-65.564383999999961,59.070163999999977],[-65.577056999999968,59.069996000000117],[-65.58406100000002,59.070999000000143],[-65.586563000000012,59.072159000000056],[-65.651947000000007,59.079163000000108],[-65.715011999999945,59.148331000000042],[-65.718062999999972,59.153046000000074],[-65.740829000000019,59.214714000000072],[-65.742492999999911,59.219437000000084],[-65.743056999999965,59.228043000000014],[-65.744995000000017,59.259720000000129],[-65.744719999999973,59.263054000000125],[-65.743056999999965,59.265830999999991],[-65.731948999999986,59.269066000000009],[-65.706664999999987,59.268326000000059],[-65.685271999999884,59.264442000000031],[-65.676102000000014,59.261108000000036],[-65.646118000000001,59.244713000000104],[-65.587509000000011,59.20249200000012],[-65.612503000000004,59.237495000000081],[-65.614715999999873,59.243607000000054],[-65.614166000000012,59.246941000000049],[-65.581680000000006,59.37721300000004],[-65.572509999999966,59.378601000000003],[-65.570006999999976,59.378326000000129],[-65.551940999999999,59.372765000000072],[-65.499160999999958,59.352219000000105],[-65.48332199999993,59.345542999999964],[-65.476105000000018,59.338882000000069],[-65.471114999999941,59.327492000000007],[-65.453338999999971,59.316939999999988],[-65.383895999999993,59.281661999999983],[-65.372771999999998,59.276657000000114],[-65.366652999999872,59.274993999999992],[-65.36111499999987,59.274712000000136],[-65.357223999999974,59.277214000000015],[-65.356658999999922,59.282768000000033],[-65.437774999999988,59.393883000000017],[-65.495269999999891,59.433876000000055],[-65.559433000000013,59.481658999999979],[-65.56138599999997,59.486107000000118],[-65.557495000000017,59.487770000000069],[-65.549438000000009,59.48943300000002],[-65.542220999999984,59.489990000000091],[-65.360000999999954,59.481658999999979],[-65.347778000000005,59.480820000000051],[-65.260559000000001,59.466385000000116],[-65.19766199999998,59.450493000000051],[-65.195830999999998,59.447659000000044],[-65.176940999999999,59.440269000000001],[-65.170273000000009,59.434433000000126],[-65.141953000000001,59.415825000000041],[-65.126663000000008,59.40776800000009],[-65.119995000000017,59.40526600000004],[-65.060271999999998,59.384438000000102],[-65.041381999999942,59.378601000000003],[-65.017775999999969,59.373046999999985],[-65.005844000000025,59.371933000000013],[-64.995543999999995,59.372490000000084],[-64.98332199999993,59.376380999999981],[-65.031386999999938,59.392769000000044],[-65.075835999999981,59.408043000000077],[-65.111114999999984,59.420546999999942],[-65.118880999999988,59.423882000000049],[-65.141113000000018,59.434433000000126],[-65.147231999999974,59.43804200000011],[-65.151397999999972,59.443046999999979],[-65.156386999999938,59.451659999999947],[-65.158996999999886,59.460827000000108],[-65.16194200000001,59.466660000000104],[-65.168059999999969,59.470543000000021],[-65.22084000000001,59.48832700000014],[-65.290832999999964,59.506660000000011],[-65.308608999999933,59.50999500000006],[-65.330001999999865,59.509437999999989],[-65.388901000000033,59.50750000000005],[-65.411666999999966,59.509437999999989],[-65.419998000000021,59.516936999999984],[-65.462783999999886,59.578049000000021],[-65.494155999999975,59.626937999999996],[-65.501677999999913,59.63888500000013],[-65.527785999999992,59.716933999999981],[-65.501952999999958,59.747215000000097],[-65.433318999999983,59.798049999999932],[-65.374999999999943,59.828049000000135],[-65.33555599999994,59.84665700000005],[-65.333892999999932,59.847214000000122],[-65.323623999999995,59.845543000000077],[-65.236114999999984,59.819381999999962],[-65.21945199999999,59.814377000000093],[-65.205947999999978,59.808548000000087],[-65.203444999999931,59.806881000000033],[-65.198775999999953,59.802879000000019],[-65.195281999999963,59.797218000000044],[-65.158614999999998,59.782211000000018],[-65.152785999999992,59.779990999999995],[-65.136123999999995,59.776657],[-65.053054999999972,59.763611000000083],[-65.033065999999963,59.761383000000137],[-65.006667999999991,59.760277000000087],[-64.988602000000014,59.761940000000038],[-64.983886999999982,59.762771999999927],[-64.983063000000016,59.764160000000061],[-64.989165999999955,59.765831000000105],[-65.055556999999965,59.778328000000101],[-65.132766999999944,59.79694400000011],[-65.161391999999978,59.817490000000134],[-65.199393999999927,59.835659000000078],[-65.202713000000017,59.837326000000019],[-65.206054999999992,59.840492000000097],[-65.230835000000013,59.880546999999979],[-65.231948999999986,59.885826000000122],[-65.226104999999961,59.888603000000046],[-65.206389999999999,59.888603000000046],[-65.143340999999907,59.94999700000011],[-65.126098999999954,60.011108000000036],[-65.110001000000011,60.043052999999986],[-65.029723999999931,60.077217000000019],[-64.921111999999937,60.194992000000013],[-64.834166999999979,60.323051000000078],[-64.832229999999925,60.328605999999979],[-64.834441999999967,60.334434999999985],[-64.846389999999928,60.345543000000134],[-64.858336999999949,60.352492999999981],[-64.857223999999974,60.359436000000017],[-64.854445999999996,60.361107000000061],[-64.846114999999998,60.362769999999955],[-64.83555599999994,60.363327000000083],[-64.65306099999998,60.34693900000002],[-64.641677999999899,60.344711000000018],[-64.610274999999945,60.336380000000133],[-64.576674999999966,60.322768999999994],[-64.533249000000012,60.302498000000014],[-64.475600999999983,60.281609000000003],[-64.466919000000019,60.278602999999976],[-64.431090999999981,60.258105999999941],[-64.432593999999995,60.255608000000052],[-64.43460099999993,60.255108000000064],[-64.446091000000024,60.254771999999946],[-64.453093999999908,60.256271000000027],[-64.462424999999939,60.259273999999948],[-64.477591999999959,60.265609999999981],[-64.477218999999991,60.260551000000135],[-64.557495000000017,60.281105000000082],[-64.580291999999929,60.286110000000122],[-64.613051999999982,60.289436000000137],[-64.643065999999976,60.287498000000028],[-64.721114999999941,60.261108000000036],[-64.725829999999974,60.258331000000112],[-64.758056999999951,60.235825000000091],[-64.759445000000028,60.231102000000135],[-64.752501999999879,60.228600000000029],[-64.745269999999948,60.228325000000041],[-64.736937999999952,60.230545000000063],[-64.685546999999985,60.250832000000116],[-64.646118000000001,60.265830999999991],[-64.634170999999981,60.268883000000073],[-64.596389999999985,60.266937000000041],[-64.574448000000018,60.264999000000103],[-64.554169000000002,60.262772000000041],[-64.536391999999921,60.2586060000001],[-64.421676999999988,60.215656000000024],[-64.419501999999966,60.213661000000002],[-64.376937999999996,60.160545000000013],[-64.465011999999945,60.084991000000002],[-64.469161999999869,60.08277099999998],[-64.476944000000003,60.079720000000009],[-64.491378999999938,60.074714999999912],[-64.504455999999948,60.072495000000117],[-64.515015000000005,60.071938000000046],[-64.654998999999918,60.053604000000064],[-64.80471799999998,60.007216999999969],[-64.8125,60.004165999999998],[-64.823333999999988,59.997772000000111],[-64.826675000000023,59.994712999999933],[-64.827498999999989,59.986382000000049],[-64.820007000000032,59.979431000000091],[-64.811935000000005,59.978325000000098],[-64.796660999999972,59.980270000000075],[-64.735274999999945,60.001106000000107],[-64.490828999999906,60.05943300000007],[-64.410277999999948,60.111107000000118],[-64.396392999999989,60.121933000000013],[-64.392226999999991,60.124161000000015],[-64.385833999999932,60.125267000000008],[-64.379990000000021,60.125267000000008],[-64.37388599999997,60.123604000000114],[-64.367766999999958,60.119713000000047],[-64.366104000000007,60.117493000000024],[-64.36500499999994,60.109993000000145],[-64.374611000000016,60.033829000000082],[-64.375281999999856,60.028324000000055],[-64.394729999999981,59.941658000000075],[-64.396956999999929,59.937767000000008],[-64.408889999999985,59.932495000000074],[-64.450561999999934,59.925270000000012],[-64.462218999999948,59.922493000000088],[-64.491942999999992,59.913605000000132],[-64.506957999999997,59.907211000000075],[-64.514724999999999,59.901932000000102],[-64.513901000000033,59.896103000000096],[-64.506393000000003,59.891936999999984],[-64.499435000000005,59.891663000000051],[-64.481948999999872,59.894714000000079],[-64.376098999999954,59.9180530000001],[-64.367766999999958,59.920273000000122],[-64.363327000000027,59.922493000000088],[-64.360549999999932,59.924995000000024],[-64.320281999999963,60.004107999999974],[-64.322112999999945,60.006439000000114],[-64.324119999999994,60.011604000000091],[-64.32428699999997,60.014107000000024],[-64.322112999999945,60.024605000000008],[-64.320449999999937,60.027270999999985],[-64.317443999999909,60.028103000000044],[-64.265014999999948,60.048050000000103],[-64.216659999999933,60.039993000000095],[-64.173614999999984,60.028328000000045],[-64.166945999999996,60.024994000000049],[-64.160827999999981,60.01638800000012],[-64.150283999999999,59.985268000000076],[-64.150283999999999,59.982208000000014],[-64.165833000000021,59.850548000000117],[-64.17721599999993,59.785552999999936],[-64.180831999999896,59.781662000000097],[-64.193053999999961,59.775825999999995],[-64.202498999999932,59.77416199999999],[-64.220000999999968,59.77416199999999],[-64.236664000000019,59.779716000000008],[-64.244720000000029,59.784996000000035],[-64.25140399999998,59.787498000000141],[-64.257507000000032,59.78943600000008],[-64.261948000000018,59.789161999999976],[-64.264450000000011,59.787498000000141],[-64.266662999999994,59.77915999999999],[-64.261123999999995,59.764717000000132],[-64.255004999999926,59.756660000000124],[-64.21305799999999,59.717766000000097],[-64.197768999999994,59.705269000000101],[-64.173888999999974,59.688598999999954],[-64.163894999999968,59.684158000000082],[-64.151672000000019,59.680824000000086],[-64.129989999999964,59.676659000000086],[-64.057769999999948,59.625267000000122],[-64.116942999999935,59.517494000000056],[-64.047501000000011,59.549721000000034],[-64.040833000000021,59.553604000000007],[-64.033324999999991,59.563880999999981],[-64.034438999999907,59.573608000000092],[-64.034438999999907,59.582771000000093],[-64.029723999999874,59.599433999999974],[-64.024719000000005,59.609993000000031],[-64.019454999999937,59.618599000000131],[-64.011123999999938,59.624992000000077],[-64.004729999999995,59.626381000000094],[-63.99722300000002,59.626656000000139],[-63.90055099999995,59.619987000000037],[-63.885559000000001,59.618881000000044],[-63.876105999999993,59.615829000000076],[-63.865554999999915,59.609993000000031],[-63.731666999999959,59.526099999999985],[-63.724166999999966,59.517769000000101],[-63.722495999999978,59.513885000000073],[-63.723884999999996,59.506660000000011],[-63.785278000000005,59.426102000000014],[-63.807837999999947,59.420437000000106],[-63.810172999999963,59.41944100000012],[-63.814502999999945,59.418101999999976],[-63.866393999999957,59.421104000000014],[-63.90694400000001,59.421660999999915],[-63.947776999999974,59.419716000000108],[-64.000564999999995,59.41443600000008],[-64.018341000000021,59.410545000000013],[-64.033324999999991,59.406654000000117],[-64.050277999999992,59.399994000000106],[-64.061110999999983,59.393883000000017],[-64.065826000000015,59.388046000000031],[-64.062209999999993,59.38249200000007],[-64.052779999999984,59.379433000000063],[-63.805167999999924,59.368164000000093],[-63.790145999999993,59.370293000000004],[-63.786652000000004,59.371792000000084],[-63.78264999999999,59.374126000000103],[-63.751395999999943,59.37582400000008],[-63.748111999999935,59.333878000000084],[-63.75644699999998,59.30838],[-63.768280000000004,59.28788000000003],[-63.77044699999999,59.284381999999994],[-63.773444999999981,59.282215000000122],[-63.780944999999974,59.278213999999991],[-63.814162999999951,59.249435000000005],[-63.824722000000008,59.24610100000001],[-63.825499999999977,59.244377000000043],[-63.82527899999991,59.243324000000086],[-63.813889000000017,59.240829000000076],[-63.777942999999993,59.263938999999993],[-63.76677699999999,59.264275000000055],[-63.760940999999946,59.265434000000027],[-63.755942999999945,59.266773000000001],[-63.739112999999975,59.273605000000032],[-63.730441999999925,59.280769000000021],[-63.723777999999925,59.287436999999954],[-63.718776999999932,59.293941000000075],[-63.716113999999891,59.300934000000098],[-63.71527900000001,59.303768000000105],[-63.71527900000001,59.306438000000071],[-63.71594199999987,59.309437000000059],[-63.713775999999996,59.315605000000005],[-63.710608999999863,59.318107999999995],[-63.658332999999971,59.358046999999999],[-63.649993999999992,59.362494999999967],[-63.543059999999912,59.34804500000007],[-63.535277999999948,59.344436999999971],[-63.393332999999927,59.264999000000103],[-63.357506000000001,59.208046000000081],[-63.356392000000028,59.204993999999999],[-63.358054999999922,59.198043999999982],[-63.366661000000022,59.186377999999991],[-63.412773000000016,59.135826000000066],[-63.425560000000019,59.126381000000038],[-63.441108999999926,59.119438000000002],[-63.476944000000003,59.104439000000127],[-63.563613999999973,59.073326000000122],[-63.580001999999922,59.067497000000117],[-63.589721999999938,59.065543999999989],[-63.731392000000028,59.056270999999981],[-63.741055000000017,59.055770999999993],[-63.74872199999993,59.056934000000126],[-63.753890999999896,59.058266000000003],[-63.760222999999939,59.062767000000122],[-63.812217999999973,59.065826000000072],[-63.934440999999936,59.081108000000086],[-63.948333999999988,59.07888000000014],[-63.966110000000015,59.074714999999969],[-63.98833499999995,59.068329000000062],[-64.045546999999999,59.02416199999999],[-64.04722599999991,59.019440000000088],[-64.043883999999991,59.015273999999977],[-64.039443999999946,59.013885000000016],[-63.912216000000001,59.000549000000035],[-63.801719999999989,59.013992000000144],[-63.798388999999986,59.011329999999987],[-63.766395999999986,59.012772000000098],[-63.759444999999971,59.012497000000053],[-63.734443999999939,59.014998999999989],[-63.508057000000008,59.052773000000059],[-63.381667999999877,59.098045000000127],[-63.372771999999941,59.101104999999961],[-63.365554999999915,59.101104999999961],[-63.309440999999993,59.09415400000006],[-63.293335000000013,59.091377000000136],[-63.134170999999981,59.058327000000077],[-63.124999999999943,59.055267000000015],[-63.121940999999993,59.051384000000098],[-63.122771999999998,59.045547000000113],[-63.126944999999921,59.041382000000112],[-63.133330999999941,59.038048000000117],[-63.159438999999907,59.029990999999995],[-63.175277999999992,59.026939000000084],[-63.185271999999998,59.026381999999955],[-63.216942000000017,59.027489000000116],[-63.238892000000021,59.030548000000067],[-63.323333999999932,59.027771000000143],[-63.336112999999955,59.024994000000049],[-63.335555999999997,59.021935000000099],[-63.264450000000011,58.985549999999989],[-63.213889999999992,58.977211000000125],[-63.195273999999984,58.979713000000004],[-63.185271999999998,58.980270000000075],[-63.173057999999912,58.979713000000004],[-63.167503000000011,58.970825000000048],[-63.160552999999993,58.926384000000041],[-63.163054999999929,58.920273000000122],[-63.236389000000031,58.876937999999996],[-63.313331999999946,58.861107000000004],[-63.325004999999976,58.85582700000009],[-63.312774999999988,58.853049999999996],[-63.294723999999974,58.85083000000003],[-63.19027699999998,58.854996000000085],[-63.112777999999992,58.878043999999989],[-63.033332999999971,58.873878000000104],[-62.924170999999944,58.821381000000031],[-62.918334999999956,58.817497000000003],[-62.90694400000001,58.80471],[-62.904167000000029,58.799995000000138],[-62.847495999999978,58.690543999999989],[-62.845276000000013,58.684989999999971],[-62.842223999999987,58.669991000000095],[-62.843612999999948,58.659430999999984],[-62.847777999999948,58.653045999999961],[-62.915832999999907,58.600272999999959],[-62.974998000000028,58.576660000000061],[-63.169167000000016,58.503052000000139],[-63.334109999999896,58.455768999999975],[-63.334609999999941,58.45227100000011],[-63.337108999999941,58.448437000000126],[-63.373444000000006,58.417435000000069],[-63.38528100000002,58.41027100000008],[-63.39910900000001,58.405273000000079],[-63.486388999999974,58.37082700000002],[-63.522498999999982,58.361107000000118],[-63.537506000000008,58.354164000000083],[-63.583060999999987,58.311378000000047],[-63.587776000000019,58.305549999999982],[-63.58943899999997,58.30082700000014],[-63.584998999999925,58.298881999999992],[-63.579726999999991,58.298606999999947],[-63.571670999999924,58.299995000000081],[-63.555274999999938,58.305267000000015],[-63.533057999999983,58.314438000000109],[-63.428223000000003,58.369049000000132],[-63.392386999999928,58.388381999999979],[-63.378558999999939,58.399044000000004],[-63.364219999999932,58.410049000000015],[-63.351555000000019,58.418716000000018],[-63.286391999999978,58.456657000000064],[-63.28082999999998,58.459160000000054],[-63.264724999999942,58.463051000000121],[-63.241669000000002,58.466385000000116],[-63.213615000000004,58.469437000000028],[-63.148612999999955,58.476379000000122],[-63.13277399999987,58.477211000000068],[-63.124442999999872,58.475266000000033],[-63.096947,58.461936999999978],[-63.089721999999938,58.458327999999938],[-63.086113000000012,58.454993999999999],[-63.037506000000008,58.453048999999965],[-62.763335999999981,58.480820000000051],[-62.636664999999937,58.501389000000017],[-62.620551999999975,58.504997000000117],[-62.610001000000011,58.503882999999973],[-62.58943899999997,58.499718000000144],[-62.573615999999959,58.493880999999988],[-62.566108999999926,58.490546999999992],[-62.56138599999997,58.487495000000081],[-62.557502999999997,58.482491000000095],[-62.556389000000024,58.478043000000127],[-62.619719999999973,58.376938000000052],[-62.619445999999982,58.310272000000055],[-62.623054999999965,58.30443600000001],[-62.634170999999981,58.297775000000058],[-62.708611000000019,58.276100000000042],[-62.77666499999998,58.268599999999992],[-62.828056000000004,58.252220000000079],[-62.661666999999966,58.26998900000001],[-62.658607000000018,58.270271000000037],[-62.654442000000017,58.270271000000037],[-62.609725999999966,58.256660000000068],[-62.597778000000005,58.251663000000008],[-62.592772999999966,58.248604],[-62.582503999999858,58.23443600000013],[-62.581116000000009,58.221931000000041],[-62.58277899999996,58.216934000000094],[-62.584441999999967,58.214439000000084],[-62.631942999999865,58.185265000000129],[-62.638054000000011,58.181938000000002],[-62.653053,58.175270000000012],[-62.661384999999996,58.173049999999989],[-62.689163000000008,58.169991000000039],[-62.719718999999941,58.169715999999994],[-62.740279999999927,58.171936000000017],[-62.773887999999886,58.176941000000056],[-62.783889999999928,58.176659000000029],[-62.822226999999998,58.174713000000111],[-62.841666999999973,58.1722180000001],[-62.965004000000022,58.15387700000008],[-63.012221999999952,58.135551000000078],[-63.016662999999937,58.126098999999954],[-63.023887999999999,58.118880999999988],[-63.045279999999934,58.108886999999982],[-63.126944999999921,58.086936999999978],[-63.205558999999994,58.065826000000072],[-63.21166999999997,58.062492000000077],[-63.211387999999999,58.060272000000111],[-63.208892999999989,58.057770000000005],[-63.19027699999998,58.053047000000049],[-63.140838999999971,58.048882000000049],[-63.146998999999994,58.036831000000006],[-63.15582999999998,58.026939000000084],[-63.167777999999942,58.021103000000039],[-63.193329000000006,58.014717000000132],[-63.267220000000009,58.007217000000026],[-63.275275999999963,58.005554000000132],[-63.30471799999998,57.996940999999936],[-63.341666999999973,57.981102000000021],[-63.340835999999967,57.979988000000048],[-63.329726999999991,57.980270000000132],[-63.15166499999998,57.993606999999997],[-63.128882999999973,57.997771999999998],[-63.107779999999991,58.007774000000097],[-63.101944000000003,58.01249700000011],[-63.098884999999939,58.017769000000044],[-63.097778000000005,58.019714000000022],[-63.09833500000002,58.026939000000084],[-63.099998000000028,58.033051000000057],[-63.101944000000003,58.036942000000124],[-63.101668999999902,58.044159000000036],[-63.097778000000005,58.052216000000044],[-63.094718999999941,58.057495000000017],[-63.089164999999866,58.06221000000005],[-62.946662999999944,58.124161000000015],[-62.940276999999924,58.125824000000136],[-62.886390999999946,58.137496999999996],[-62.838051000000007,58.144997000000046],[-62.832222000000002,58.14527099999998],[-62.829445000000021,58.143326000000002],[-62.77277399999997,58.129158000000132],[-62.652221999999995,58.118599000000074],[-62.646111000000019,58.119155999999975],[-62.643058999999994,58.119986999999981],[-62.612502999999947,58.137771999999984],[-62.59944200000001,58.145546000000024],[-62.560828999999956,58.156654000000003],[-62.515838999999914,58.169158999999922],[-62.491942999999992,58.174163999999962],[-62.46665999999999,58.175552000000096],[-62.452781999999956,58.175270000000012],[-62.448051000000021,58.1722180000001],[-62.446388000000013,58.168327000000033],[-62.447776999999917,58.164154000000053],[-62.463000999999963,58.151047000000062],[-62.469666000000018,58.145718000000045],[-62.478333000000021,58.141212000000053],[-62.486168000000021,58.136547000000064],[-62.503890999999953,58.123604000000114],[-62.519447000000014,58.111937999999952],[-62.529166999999916,58.102776000000063],[-62.531386999999995,58.095268000000033],[-62.514450000000011,58.057495000000017],[-62.506392999999946,58.055267000000072],[-62.498054999999908,58.057213000000104],[-62.49138599999992,58.061378000000104],[-62.486664000000019,58.066940000000045],[-62.484443999999939,58.072220000000129],[-62.485557999999912,58.081107999999915],[-62.488051999999925,58.086105000000032],[-62.488891999999908,58.091103000000032],[-62.488051999999925,58.09665700000005],[-62.482772999999952,58.100273000000072],[-62.444827999999916,58.106720000000053],[-62.413054999999929,58.110825000000091],[-62.375,58.112770000000069],[-62.368889000000024,58.111664000000019],[-62.363892000000021,58.108604000000014],[-62.317779999999971,58.052489999999977],[-62.307502999999883,58.039161999999976],[-62.306945999999982,58.031104999999968],[-62.309722999999963,58.028603000000089],[-62.38144699999998,58.008327000000065],[-62.394112000000007,58.003658000000087],[-62.406280999999979,58.002827000000082],[-62.41311300000001,58.003658000000087],[-62.437613999999883,58.010159000000101],[-62.450443000000007,58.011993000000132],[-62.500838999999928,58.008049000000142],[-62.51916499999993,58.006943000000092],[-62.528335999999967,58.005554000000132],[-62.545279999999934,58.000549000000035],[-62.648055999999997,57.958328000000051],[-62.655273000000022,57.953605999999979],[-62.65972099999999,57.94860100000011],[-62.672774999999945,57.929993000000024],[-62.664443999999946,57.928604000000064],[-62.655273000000022,57.929993000000024],[-62.640838999999971,57.935264999999958],[-62.636116000000015,57.938598999999954],[-62.620833999999945,57.947487000000137],[-62.611670999999944,57.951660000000061],[-62.577498999999989,57.962212000000079],[-62.537780999999882,57.971100000000092],[-62.512504999999919,57.972487999999998],[-62.455165999999963,57.968212000000051],[-62.448001999999974,57.967708999999957],[-62.325004999999919,57.956100000000106],[-62.268332999999984,57.948875000000044],[-62.200278999999966,57.935822000000087],[-62.148887999999999,57.974990999999932],[-62.145279000000016,57.974159000000043],[-62.12749500000001,57.968048000000124],[-62.116111999999987,57.962493999999992],[-62.083610999999962,57.944992000000127],[-62.079726999999934,57.942763999999954],[-62.072226999999998,57.931107000000054],[-62.05972300000002,57.897774000000027],[-62.060828999999956,57.889992000000063],[-62.062774999999931,57.886658000000068],[-62.115279999999984,57.854164000000026],[-62.131942999999978,57.84276600000004],[-62.138053999999954,57.835823000000005],[-62.139167999999927,57.831940000000088],[-62.125274999999988,57.806938000000002],[-62.120833999999888,57.800827000000083],[-62.119995000000017,57.799994999999967],[-62.107779999999991,57.789719000000105],[-62.08916499999998,57.780548000000124],[-62.085830999999985,57.779433999999981],[-62.079169999999976,57.779433999999981],[-62.061110999999926,57.781936999999971],[-62.046394000000021,57.785828000000038],[-62.033332999999914,57.787216000000114],[-62.018058999999937,57.783607000000131],[-61.996666000000005,57.772217000000069],[-61.99138599999992,57.767769000000101],[-61.889998999999989,57.666382000000112],[-61.883330999999998,57.645546000000081],[-61.883057000000008,57.63749700000011],[-61.884444999999971,57.626938000000052],[-61.888610999999969,57.622490000000084],[-61.89805599999994,57.616386000000034],[-62.071670999999981,57.563605999999993],[-62.192222999999899,57.535828000000095],[-62.30860899999999,57.490546999999992],[-62.421386999999982,57.482207999999957],[-62.431945999999868,57.484717999999987],[-62.531113000000005,57.506943000000035],[-62.541388999999981,57.507500000000107],[-62.544723999999974,57.504440000000045],[-62.545279999999934,57.50110600000005],[-62.533332999999914,57.492218000000094],[-62.520553999999947,57.484993000000031],[-62.46444699999995,57.454437000000098],[-62.457222000000002,57.451103000000103],[-62.377220000000023,57.421936000000017],[-62.365279999999927,57.419715999999994],[-62.353888999999981,57.418326999999977],[-62.335830999999928,57.419440999999949],[-62.230552999999986,57.443604000000107],[-62.173331999999959,57.463608000000022],[-62.167220999999984,57.464439000000084],[-62.060828999999956,57.456383000000017],[-62.039725999999973,57.453323000000125],[-61.891388000000006,57.411934000000031],[-61.816948000000025,57.376938000000109],[-61.803054999999915,57.369155999999975],[-61.801391999999908,57.363052000000096],[-61.803054999999915,57.358887000000095],[-61.863892000000021,57.285553000000107],[-61.894164999999987,57.269440000000088],[-61.937499999999943,57.252220000000079],[-61.944999999999936,57.250832000000003],[-61.953888000000006,57.249435000000062],[-61.997779999999977,57.25638600000002],[-62.017219999999952,57.256943000000092],[-62.026389999999992,57.255829000000119],[-62.023613000000012,57.251663000000008],[-62.015839000000028,57.243050000000039],[-62.005004999999869,57.236655999999982],[-61.858894000000021,57.167770000000132],[-61.852500999999961,57.165268000000083],[-61.664444000000003,57.143883000000073],[-61.65555599999999,57.143051000000014],[-61.565551999999968,57.149719000000005],[-61.515555999999947,57.15638000000007],[-61.490836999999999,57.159431000000097],[-61.478881999999999,57.159431000000097],[-61.458892999999989,57.154709000000025],[-61.441665999999884,57.148604999999975],[-61.39305899999988,57.124709999999993],[-61.380279999999914,57.117210000000114],[-61.363892000000021,57.097214000000122],[-61.358336999999949,57.087494000000049],[-61.355559999999969,57.016388000000006],[-61.370833999999945,56.978600000000142],[-61.378052000000025,56.982208000000071],[-61.393332999999984,56.983047000000056],[-61.479720999999984,56.983604000000128],[-61.487777999999935,56.981658999999979],[-61.495551999999861,56.979430999999977],[-61.516395999999929,56.970267999999976],[-61.535560999999973,56.961104999999975],[-61.546668999999952,56.954437000000041],[-61.639998999999932,56.883881000000031],[-61.645003999999915,56.878326000000129],[-61.648337999999967,56.873046999999929],[-61.650832999999921,56.866936000000067],[-61.65277900000001,56.855826999999977],[-61.65277900000001,56.845543000000134],[-61.65055099999995,56.840828000000101],[-61.646111000000019,56.826942000000088],[-61.646111000000019,56.821106000000043],[-61.650276000000019,56.816666000000055],[-61.661384999999996,56.809433000000013],[-61.676392000000021,56.802773000000002],[-61.782391000000018,56.794441000000006],[-61.799224999999922,56.792937999999992],[-61.816886999999952,56.793610000000001],[-61.823558999999989,56.794441000000006],[-61.834556999999961,56.796108000000117],[-61.844559000000004,56.798943000000008],[-61.892226999999934,56.798607000000118],[-61.906386999999938,56.795273000000122],[-61.908606999999961,56.789162000000033],[-61.902221999999938,56.714156999999943],[-61.899993999999992,56.707214000000135],[-61.897223999999937,56.703049000000135],[-61.889998999999989,56.698044000000095],[-61.886115999999959,56.698044000000095],[-61.877776999999924,56.713051000000121],[-61.87027699999993,56.726936000000023],[-61.833667999999932,56.741993000000093],[-61.830832999999927,56.745327000000088],[-61.824996999999996,56.746826000000112],[-61.811504000000014,56.746826000000112],[-61.793335000000013,56.746826000000112],[-61.780498999999963,56.745658999999989],[-61.772834999999986,56.744160000000136],[-61.76266899999996,56.741325000000074],[-61.716392999999925,56.738045000000113],[-61.702498999999989,56.730820000000051],[-61.696944999999971,56.724709000000132],[-61.701667999999984,56.713325999999938],[-61.71055599999994,56.705551000000071],[-61.721106999999961,56.701103000000103],[-61.734443999999996,56.697212000000036],[-61.75417299999998,56.697487000000024],[-61.765006999999969,56.6988750000001],[-61.773055999999997,56.701103000000103],[-61.798339999999996,56.710823000000005],[-61.808334000000002,56.712212000000136],[-61.821670999999924,56.709717000000126],[-61.825004999999919,56.706657000000064],[-61.821670999999924,56.701660000000004],[-61.799171000000001,56.682770000000005],[-61.792503000000011,56.680824000000143],[-61.732215999999937,56.663322000000107],[-61.681670999999994,56.653603000000089],[-61.674445999999932,56.653046000000018],[-61.658889999999985,56.647774000000084],[-61.649726999999984,56.641662999999994],[-61.649993999999936,56.635268999999994],[-61.658607000000018,56.627487000000031],[-61.672500999999954,56.619986999999924],[-61.680557000000022,56.618050000000096],[-61.688889000000017,56.617210000000057],[-61.699164999999994,56.617767000000129],[-61.835555999999997,56.631660000000124],[-61.911667000000023,56.642769000000044],[-61.992774999999938,56.66027100000008],[-62.010001999999872,56.664153999999996],[-62.066947999999911,56.678604000000121],[-62.311110999999983,56.735550000000046],[-62.479995999999971,56.77388000000002],[-62.498885999999914,56.779716000000064],[-62.504448000000025,56.783607000000131],[-62.505004999999926,56.788886999999988],[-62.501944999999978,56.791939000000127],[-62.486114999999984,56.796104000000128],[-62.468886999999995,56.798607000000118],[-62.326392999999996,56.812767000000008],[-62.227492999999868,56.816666000000055],[-62.18999500000001,56.81332400000008],[-62.138335999999924,56.81082200000003],[-62.068335999999988,56.817214999999976],[-62.059440999999879,56.818603999999993],[-62.051665999999955,56.820549000000142],[-62.042502999999954,56.826942000000088],[-62.043334999999956,56.829994000000056],[-62.049445999999875,56.832496999999989],[-62.066947999999911,56.834434999999928],[-62.234726000000023,56.836937000000034],[-62.381667999999991,56.830276000000083],[-62.478606999999954,56.846657000000107],[-62.488891999999908,56.849434000000031],[-62.498885999999914,56.850548000000003],[-62.508338999999921,56.849998000000141],[-62.517219999999952,56.848045000000013],[-62.53194400000001,56.843605000000025],[-62.543892000000028,56.837212000000022],[-62.546950999999922,56.834717000000012],[-62.570281999999963,56.798607000000118],[-62.57389099999989,56.792770000000132],[-62.538337999999953,56.775551000000064],[-62.503058999999951,56.762214999999912],[-62.356109999999887,56.722214000000122],[-62.162773000000016,56.672768000000076],[-62.02277399999997,56.627487000000031],[-62.005279999999971,56.616936000000123],[-62.117500000000007,56.623046999999985],[-62.175003000000004,56.623877999999991],[-62.235557999999969,56.623604000000057],[-62.241111999999873,56.62332200000003],[-62.239722999999969,56.617210000000057],[-62.224715999999944,56.609161000000029],[-62.192222999999899,56.602493000000038],[-62.105003000000011,56.59693900000002],[-62.046394000000021,56.595825000000048],[-62.036117999999874,56.595267999999976],[-61.901389999999935,56.58776899999998],[-61.729439000000013,56.574440000000095],[-61.715004000000022,56.572220000000073],[-61.70805399999989,56.568886000000077],[-61.701110999999969,56.560822000000087],[-61.690833999999995,56.548050000000046],[-61.666663999999969,56.540549999999996],[-61.658332999999971,56.537498000000085],[-61.655273000000022,56.533882000000006],[-61.653327999999931,56.53054800000001],[-61.652221999999995,56.526100000000042],[-61.653327999999931,56.520546000000081],[-61.656661999999926,56.510826000000009],[-61.662216000000001,56.506104000000107],[-61.680282999999974,56.496658000000139],[-61.689163000000008,56.494713000000104],[-61.754723000000013,56.484993000000031],[-61.773055999999997,56.484718000000044],[-61.80388599999992,56.487770000000125],[-61.878052000000025,56.497772000000111],[-61.951942000000031,56.505554000000075],[-62.038612000000001,56.505271999999991],[-62.046950999999922,56.50471500000009],[-62.05471799999998,56.502495000000067],[-62.061667999999997,56.499435000000005],[-62.075561999999934,56.49193600000001],[-62.08306099999993,56.486938000000009],[-62.085273999999913,56.483046999999942],[-62.082222000000002,56.481659000000036],[-62.076667999999984,56.479987999999992],[-62.070838999999978,56.481102000000135],[-62.024170000000026,56.48443600000013],[-61.976386999999988,56.483330000000137],[-61.965278999999896,56.481934000000081],[-61.952224999999999,56.475822000000107],[-61.946945000000028,56.471100000000035],[-61.956164999999942,56.464050000000043],[-61.958831999999973,56.461048000000005],[-61.961333999999965,56.459717000000012],[-61.966003000000001,56.458549000000005],[-61.979835999999978,56.455551000000071],[-61.999724999999955,56.44999700000011],[-62.010284000000013,56.44999700000011],[-62.019996999999989,56.451102999999932],[-62.048888999999974,56.457214000000022],[-62.05972300000002,56.458603000000039],[-62.069999999999993,56.459160000000111],[-62.124999999999886,56.457214000000022],[-62.139998999999932,56.452217000000132],[-62.143058999999994,56.449158000000125],[-62.139167999999927,56.444709999999986],[-62.124999999999886,56.43832400000008],[-62.117500000000007,56.435546999999985],[-62.083327999999995,56.423325000000034],[-62.073059000000001,56.420546999999999],[-61.984726000000023,56.415268000000026],[-61.963717999999972,56.415657000000067],[-61.956889999999987,56.417823999999939],[-61.909720999999934,56.413879000000065],[-61.798057999999912,56.39527099999998],[-61.790840000000003,56.392494000000056],[-61.661384999999996,56.270271000000093],[-61.678332999999952,56.269161000000111],[-61.679169000000002,56.267993999999987],[-61.686835999999971,56.266994000000011],[-61.702834999999993,56.265327000000127],[-61.749999999999943,56.261329999999987],[-61.760665999999958,56.261662000000115],[-61.772166999999968,56.263493000000096],[-61.777167999999961,56.265327000000127],[-61.779671000000008,56.267493999999999],[-61.778335999999967,56.268661000000122],[-61.775001999999972,56.268826000000104],[-61.765166999999963,56.268162000000018],[-61.756667999999934,56.266994000000011],[-61.746001999999919,56.267493999999999],[-61.741000999999926,56.269161000000111],[-61.753616000000022,56.273048000000017],[-61.753059000000007,56.277770999999973],[-61.769996999999933,56.284163999999976],[-61.800835000000006,56.28943600000008],[-61.878608999999926,56.298607000000004],[-61.888610999999969,56.299164000000076],[-62.029723999999987,56.305267000000015],[-62.074447999999961,56.296386999999982],[-62.080001999999979,56.293610000000115],[-62.080832999999984,56.292496000000142],[-62.076110999999912,56.284996000000035],[-62.016395999999986,56.238883999999985],[-62.011672999999917,56.235825000000034],[-62.003890999999953,56.233604000000071],[-61.956947000000014,56.220825000000048],[-61.938331999999946,56.215827999999931],[-61.919448999999986,56.212212000000079],[-61.910278000000005,56.212493999999936],[-61.802054999999939,56.216381000000069],[-61.769889999999975,56.218048000000124],[-61.575004999999976,56.216933999999981],[-61.575561999999991,56.211937000000034],[-61.578612999999905,56.206940000000145],[-61.579726999999991,56.199158000000011],[-61.575279000000023,56.19609800000012],[-61.560279999999921,56.194434999999999],[-61.53583500000002,56.196381000000088],[-61.450553999999954,56.204994000000056],[-61.411941999999954,56.214714000000129],[-61.40444199999996,56.217491000000052],[-61.380279999999914,56.22304500000007],[-61.361670999999944,56.223602000000142],[-61.350837999999953,56.222214000000065],[-61.345550999999944,56.218322999999998],[-61.33083299999987,56.181938000000059],[-61.330284000000006,56.176659000000029],[-61.33555599999994,56.172767999999962],[-61.343329999999924,56.170547000000056],[-61.377220000000023,56.168602000000078],[-61.383613999999909,56.164711000000011],[-61.397223999999881,56.155823000000055],[-61.406104999999911,56.146102999999925],[-61.452498999999932,56.062767000000008],[-61.452224999999999,56.056937999999946],[-61.448607999999979,56.052772999999945],[-61.413886999999932,56.037773000000016],[-61.411384999999882,56.037497999999971],[-61.397498999999982,56.041107000000011],[-61.382773999999927,56.047493000000088],[-61.356391999999971,56.058327000000133],[-61.346663999999919,56.061377999999991],[-61.34027900000001,56.063049000000035],[-61.324721999999952,56.065269000000058],[-61.315552000000025,56.065544000000045],[-61.24361399999998,56.047493000000088],[-61.239722999999969,56.045273000000066],[-61.23750299999989,56.042770000000075],[-61.240554999999972,56.040276000000006],[-61.265838999999971,56.02276599999999],[-61.273613000000012,56.020828000000051],[-61.282500999999968,56.019714000000079],[-61.310279999999977,56.018600000000106],[-61.357223999999974,56.018600000000106],[-61.388610999999912,56.021934999999985],[-61.419167000000016,56.027214000000129],[-61.438605999999993,56.027489000000003],[-61.489997999999957,56.02027099999998],[-61.501395999999943,56.014442000000145],[-61.503890999999896,56.010551000000078],[-61.503615999999965,56.006942999999978],[-61.421943999999996,55.963882000000126],[-61.415001000000018,55.960274000000027],[-61.399170000000026,55.958602999999925],[-61.389998999999989,55.958885000000009],[-61.38138600000002,55.960274000000027],[-61.328055999999947,55.964157000000114],[-61.254722999999956,55.967491000000109],[-61.154442000000017,55.971375000000137],[-61.143616000000009,55.970543000000021],[-61.125556999999958,55.968596999999932],[-61.117774999999938,55.966103000000032],[-61.113616999999977,55.962493999999992],[-61.074448000000018,55.928329000000076],[-61.073891000000003,55.923050000000103],[-61.076667999999984,55.906937000000084],[-61.094111999999939,55.895606999999984],[-61.156386999999995,55.891937000000098],[-61.165276000000006,55.892220000000066],[-61.181670999999994,55.89916199999999],[-61.194999999999993,55.892220000000066],[-61.201667999999984,55.884163000000115],[-61.198607999999922,55.876380999999981],[-61.192771999999934,55.869437999999946],[-61.104445999999939,55.845543000000134],[-61.095275999999899,55.843880000000013],[-61.085274000000027,55.843322999999941],[-61.077224999999999,55.843880000000013],[-61.068061999999998,55.845543000000134],[-61.039665000000014,55.850937000000044],[-61.035999000000004,55.853271000000063],[-61.027168000000017,55.857273000000077],[-60.946105999999986,55.865829000000133],[-60.917220999999927,55.864441000000056],[-60.782500999999968,55.854164000000083],[-60.762221999999952,55.851386999999988],[-60.755561999999998,55.849434000000031],[-60.741669000000002,55.843048000000124],[-60.729720999999927,55.829436999999984],[-60.729163999999969,55.824440000000038],[-60.730826999999977,55.808044000000052],[-60.734443999999996,55.801212000000021],[-60.736941999999999,55.797382000000027],[-60.74222599999996,55.790549999999939],[-60.774719000000005,55.772491000000002],[-60.80777699999993,55.755271999999934],[-60.880554000000018,55.749161000000072],[-60.879439999999988,55.732765000000029],[-60.765006999999969,55.728042999999957],[-60.756393000000003,55.729431000000091],[-60.746947999999975,55.731659000000036],[-60.740279999999984,55.734161000000086],[-60.727218999999877,55.739990000000091],[-60.721663999999976,55.744713000000104],[-60.7016109999999,55.763443000000109],[-60.668891999999971,55.795830000000024],[-60.656386999999938,55.812767000000008],[-60.647223999999937,55.822768999999994],[-60.639998999999989,55.825554000000011],[-60.631667999999991,55.826660000000061],[-60.623885999999914,55.824996999999939],[-60.615279999999927,55.821937999999989],[-60.601943999999946,55.814713000000097],[-60.597777999999892,55.80943300000007],[-60.598052999999993,55.804436000000123],[-60.605835000000013,55.733879000000059],[-60.615836999999999,55.686935000000062],[-60.629722999999899,55.638329000000056],[-60.668059999999969,55.589432000000102],[-60.655555999999933,55.584435000000042],[-60.606109999999944,55.622489999999914],[-60.60222599999986,55.626656000000025],[-60.59027900000001,55.644714000000079],[-60.544167000000016,55.726936000000023],[-60.527221999999881,55.760551000000135],[-60.527495999999985,55.765830999999991],[-60.525557999999933,55.77693899999997],[-60.519446999999957,55.78804800000006],[-60.514449999999954,55.793610000000001],[-60.503059000000007,55.803046999999935],[-60.487777999999878,55.808601000000124],[-60.483611999999994,55.809158000000025],[-60.339995999999985,55.786384999999939],[-60.334998999999982,55.784439000000077],[-60.328888000000006,55.781661999999983],[-60.327224999999885,55.772766000000047],[-60.329444999999964,55.761383000000023],[-60.337775999999963,55.748604],[-60.380553999999961,55.691933000000063],[-60.406386999999995,55.674713000000054],[-60.463218999999924,55.666046000000108],[-60.472720999999979,55.663212000000101],[-60.493889000000024,55.658043000000134],[-60.499999999999943,55.654160000000047],[-60.50389100000001,55.648330999999985],[-60.525001999999972,55.610550000000046],[-60.531112999999948,55.597214000000065],[-60.532218999999884,55.591660000000104],[-60.531859999999938,55.588195999999982],[-60.515006999999969,55.599715999999944],[-60.506110999999919,55.611664000000019],[-60.495002999999997,55.621101000000124],[-60.481383999999991,55.627769000000114],[-60.440334000000007,55.620216000000084],[-60.426167000000021,55.618217000000072],[-60.420334000000025,55.616379000000052],[-60.415501000000006,55.61454800000007],[-60.322776999999917,55.578330999999991],[-60.31639100000001,55.573883000000023],[-60.31639100000001,55.57027400000004],[-60.319449999999961,55.530823000000055],[-60.321670999999981,55.509995000000004],[-60.426318999999978,55.448204000000089],[-60.442210999999986,55.427696000000026],[-60.437774999999988,55.399437000000091],[-60.478332999999907,55.347488000000055],[-60.472771000000023,55.347771000000023],[-60.451392999999939,55.357216000000108],[-60.42610899999994,55.376656000000082],[-60.420837000000006,55.382210000000043],[-60.418335000000013,55.386107999999979],[-60.415275999999949,55.394714000000079],[-60.417777999999942,55.402771000000087],[-60.422501000000011,55.407211000000075],[-60.425003000000004,55.411377000000016],[-60.423614999999984,55.421378999999945],[-60.418335000000013,55.427490000000034],[-60.413054999999986,55.431664000000069],[-60.349167000000023,55.475822000000107],[-60.331673000000023,55.486655999999982],[-60.319449999999961,55.491378999999995],[-60.268607999999972,55.502495000000124],[-60.253890999999953,55.503052000000025],[-60.213889999999992,55.489433000000076],[-60.203613000000018,55.483604000000071],[-60.201667999999984,55.478600000000085],[-60.195548999999971,55.431381000000101],[-60.265839000000028,55.409156999999993],[-60.274169999999913,55.408043000000021],[-60.284171999999955,55.408600000000092],[-60.295279999999934,55.411102000000142],[-60.305274999999881,55.411659000000043],[-60.313332000000003,55.411102000000142],[-60.354720999999927,55.394997000000046],[-60.468886999999938,55.285827999999981],[-60.49888599999997,55.253325999999959],[-60.538054999999929,55.200546000000145],[-60.499999999999943,55.218047999999953],[-60.488892000000021,55.227210999999954],[-60.482215999999994,55.231658999999922],[-60.476386999999988,55.2347180000001],[-60.468329999999924,55.237495000000024],[-60.37388599999997,55.260551000000021],[-60.365836999999942,55.260826000000066],[-60.355277999999998,55.259437999999989],[-60.348610000000008,55.255829000000119],[-60.348052999999936,55.250549000000092],[-60.353057999999976,55.244995000000074],[-60.512222000000008,55.120543999999938],[-60.587776000000019,55.088599999999929],[-60.616660999999965,55.077217000000132],[-60.636116000000015,55.066665999999998],[-60.670554999999979,55.044715999999994],[-60.681113999999923,55.004715000000033],[-60.683326999999906,54.994995000000131],[-60.592773000000022,55.058884000000091],[-60.475273000000016,55.124435000000005],[-60.266395999999986,55.240547000000106],[-60.259170999999924,55.244155999999919],[-60.252501999999993,55.246384000000091],[-60.176108999999997,55.270827999999995],[-60.079781000000025,55.249602999999979],[-60.073776000000009,55.247940000000028],[-60.072776999999974,55.245106000000021],[-60.110778999999923,55.199268000000075],[-60.123610999999926,55.156380000000127],[-60.146392999999932,55.137214999999969],[-60.157218999999941,55.128601000000117],[-60.187217999999973,55.108046999999999],[-60.204445000000021,55.107498000000021],[-60.212776000000019,55.108604000000071],[-60.220551,55.106384000000048],[-60.282776000000013,55.057770000000062],[-60.288337999999953,55.053321999999923],[-60.295006000000001,55.041382000000056],[-60.296950999999922,55.03443900000002],[-60.296668999999952,55.024993999999992],[-60.293892000000028,55.019440000000145],[-60.284171999999955,55.024437000000091],[-60.152495999999985,55.102776000000119],[-60.124442999999928,55.120270000000005],[-60.09944200000001,55.136658000000068],[-60.088332999999921,55.145827999999938],[-60.083884999999952,55.152214000000072],[-60.051223999999934,55.182381000000134],[-60.04571900000002,55.193046999999979],[-60.044723999999917,55.196711999999991],[-60.042721000000029,55.199883],[-60.039718999999877,55.203213000000005],[-60.036057000000028,55.206383000000073],[-60.021888999999987,55.218547999999942],[-60.015223999999989,55.221546000000046],[-60.009224000000017,55.221214000000089],[-59.964721999999938,55.235549999999989],[-59.939437999999939,55.233047000000056],[-59.922774999999945,55.233047000000056],[-59.916945999999939,55.233879000000115],[-59.912497999999971,55.238883999999985],[-59.890838999999971,55.265549000000021],[-59.868332000000009,55.291381999999999],[-59.863891999999964,55.296104000000071],[-59.851394999999968,55.303047000000049],[-59.80750299999994,55.324164999999937],[-59.795279999999991,55.327492000000063],[-59.779167000000029,55.329720000000066],[-59.776108000000022,55.329162999999937],[-59.715003999999965,55.276099999999929],[-59.711945000000014,55.269714000000022],[-59.713332999999977,55.256103999999993],[-59.729439000000013,55.205269000000101],[-59.732497999999964,55.197211999999979],[-59.735832000000016,55.194153000000142],[-59.742774999999938,55.191376000000048],[-59.831389999999999,55.162491000000045],[-59.847495999999978,55.158043000000077],[-59.863891999999964,55.154160000000104],[-59.897781000000009,55.151382000000126],[-59.918334999999956,55.155265999999983],[-59.94027699999998,55.162766000000033],[-59.950553999999897,55.164436000000023],[-59.962775999999963,55.161102000000028],[-59.967215999999951,55.158599999999979],[-59.970832999999914,55.15554800000001],[-59.973327999999867,55.147491000000059],[-59.968055999999933,55.119156000000032],[-59.963615000000004,55.110275000000115],[-59.80083499999995,55.108887000000038],[-59.795279999999991,55.109160999999972],[-59.615836999999999,55.13638300000008],[-59.57028200000002,55.159988000000055],[-59.531386999999995,55.181380999999988],[-59.487777999999992,55.181380999999988],[-59.430557000000022,55.151931999999988],[-59.428336999999999,55.149719000000005],[-59.427223000000026,55.139992000000063],[-59.427779999999927,55.135826000000009],[-59.431945999999925,55.129433000000006],[-59.438605999999936,55.123604],[-59.49610899999999,55.078331000000105],[-59.539169000000015,55.049163999999962],[-59.593886999999995,55.020828000000051],[-59.610831999999959,55.012771999999984],[-59.716659999999933,54.955826000000059],[-59.802165999999943,54.887268000000006],[-59.823996999999963,54.851105000000132],[-59.939163000000008,54.758888000000013],[-59.944160000000011,54.755554000000018],[-59.945549000000028,54.753052000000139],[-59.944160000000011,54.749718000000144],[-59.938605999999936,54.746383999999978],[-59.919166999999959,54.741379000000109],[-59.90943900000002,54.740829000000076],[-59.888610999999855,54.743324000000143],[-59.882499999999936,54.744995000000017],[-59.797500999999954,54.781661999999983],[-59.791114999999991,54.78555300000005],[-59.788612000000001,54.789436000000023],[-59.790282999999874,54.794158999999979],[-59.79099999999994,54.822658999999987],[-59.794166999999959,54.828159000000142],[-59.79466599999995,54.830994000000032],[-59.793830999999898,54.839992999999993],[-59.79099999999994,54.846825000000024],[-59.784339999999929,54.857658000000015],[-59.772002999999927,54.869492000000037],[-59.754722999999899,54.897491000000116],[-59.729995999999971,54.907493999999986],[-59.703888000000006,54.910545000000013],[-59.688888999999961,54.913605000000075],[-59.674445999999989,54.919990999999982],[-59.618331999999953,54.948600999999996],[-59.411110000000008,55.056381000000101],[-59.293891999999971,55.169716000000108],[-59.165275999999949,55.234993000000088],[-59.161384999999996,55.236938000000123],[-59.154716000000008,55.235549999999989],[-59.144164999999987,55.228043000000071],[-59.139442000000031,55.223877000000016],[-59.131110999999919,55.215546000000074],[-59.127494999999954,55.205826000000002],[-59.124999999999943,55.196380999999917],[-59.124442999999872,55.186103999999943],[-59.149440999999911,55.16182699999996],[-59.15060799999992,55.158992999999953],[-59.155276999999955,55.152156999999931],[-59.161277999999982,55.146823999999924],[-59.168609999999944,55.141827000000035],[-59.176608999999985,55.137989000000061],[-59.205276000000026,55.13116100000002],[-59.20911000000001,55.129822000000047],[-59.240279999999927,55.111382000000049],[-59.25278499999996,55.102492999999981],[-59.363335000000006,55.015830999999991],[-59.37471800000003,55.006386000000077],[-59.383056999999951,54.998047000000042],[-59.386390999999946,54.993049999999982],[-59.391113000000018,54.982208000000128],[-59.391387999999949,54.980270000000019],[-59.388610999999969,54.97665400000011],[-59.384170999999924,54.973319999999944],[-59.37471800000003,54.972763000000043],[-59.369164000000012,54.975266000000033],[-59.275001999999915,55.021659999999997],[-59.262504999999862,55.028327999999988],[-59.250838999999985,55.035828000000038],[-59.237220999999977,55.048332000000073],[-59.242500000000007,55.061104000000057],[-59.243057000000022,55.06638300000003],[-59.240836999999999,55.071106000000043],[-59.236663999999962,55.07749200000012],[-59.133330999999941,55.120491000000015],[-59.051666000000012,55.153320000000065],[-59.035277999999892,55.156937000000028],[-59.023613000000012,55.15665400000006],[-58.960555999999883,55.134995000000004],[-58.956107999999915,55.130271999999991],[-58.955832999999984,55.126381000000094],[-58.955832999999984,55.10083000000003],[-58.958336000000031,55.09165999999999],[-58.961670000000026,55.085265999999933],[-58.971106999999961,55.071106000000043],[-58.980277999999998,55.059990000000084],[-59.005561999999998,55.032767999999976],[-59.001944999999978,55.017769000000101],[-58.972495999999978,54.995544000000052],[-58.947220000000016,54.985550000000046],[-58.907218999999941,54.963882000000126],[-58.896950000000004,54.95638300000013],[-58.894164999999873,54.952773999999977],[-58.895279000000016,54.947769000000108],[-58.90055099999995,54.943878000000041],[-58.90694400000001,54.940269000000001],[-58.964721999999881,54.917496000000142],[-59.013061999999991,54.896103000000039],[-59.015556000000004,54.892220000000066],[-59.013618000000008,54.889717000000132],[-58.904167000000029,54.844711000000075],[-58.838332999999977,54.832497000000046],[-58.832503999999972,54.831940000000145],[-58.824172999999973,54.834434999999985],[-58.694442999999978,54.820549000000028],[-58.685271999999941,54.815543999999989],[-58.560828999999956,54.776100000000042],[-58.443610999999919,54.77388000000002],[-58.398887999999943,54.78472099999999],[-58.391944999999964,54.787498000000085],[-58.379997000000003,54.789993000000095],[-58.328056000000004,54.792496000000085],[-58.243331999999953,54.794716000000051],[-58.196663000000001,54.795272999999952],[-58.191108999999983,54.794158999999979],[-58.188332000000003,54.792496000000085],[-58.18721800000003,54.788605000000018],[-58.188605999999936,54.783051],[-58.19388600000002,54.777771000000087],[-58.196944999999971,54.773322999999948],[-58.198607999999979,54.767768999999987],[-58.184166000000005,54.751662999999951],[-58.173332000000016,54.745544000000109],[-58.145554000000004,54.739716000000044],[-58.110001000000011,54.737213000000054],[-58.001395999999943,54.73333000000008],[-57.945548999999971,54.739989999999977],[-57.935554999999965,54.741104000000121],[-57.910552999999936,54.74193600000001],[-57.855002999999954,54.737495000000081],[-57.847495999999921,54.735550000000103],[-57.842498999999918,54.731377000000009],[-57.831947000000014,54.71776600000004],[-57.789725999999916,54.68221299999999],[-57.78556100000003,54.679161000000079],[-57.713057999999933,54.643051000000128],[-57.700835999999981,54.637215000000083],[-57.693610999999976,54.634720000000073],[-57.676392000000021,54.630272000000105],[-57.660278000000005,54.628043999999932],[-57.642226999999991,54.628043999999932],[-57.626388999999961,54.629990000000021],[-57.577781999999956,54.638885000000073],[-57.574172999999973,54.640274000000034],[-57.569725000000005,54.644440000000145],[-57.567223000000013,54.648331000000042],[-57.559165999999948,54.655822999999998],[-57.545836999999949,54.661659000000043],[-57.539168999999902,54.662209000000075],[-57.456389999999999,54.650826000000052],[-57.450553999999954,54.649993999999936],[-57.444716999999969,54.647217000000069],[-57.355834999999956,54.590271000000087],[-57.352782999999874,54.587493999999992],[-57.347495999999921,54.579437000000041],[-57.346947,54.574714999999969],[-57.348610000000008,54.566940000000045],[-57.380828999999949,54.507499999999993],[-57.385276999999917,54.503326000000129],[-57.396949999999947,54.495827000000133],[-57.427222999999969,54.487770000000012],[-57.484726000000023,54.482491000000039],[-57.493057000000022,54.483330000000137],[-57.519447000000014,54.483879000000115],[-57.590836000000024,54.484160999999972],[-57.618056999999965,54.483604000000071],[-57.672774999999888,54.479988000000048],[-57.694999999999993,54.475548000000003],[-57.702224999999942,54.47304500000007],[-57.704169999999976,54.470543000000134],[-57.705275999999969,54.466933999999981],[-57.700554000000011,54.45915999999994],[-57.686942999999928,54.458885000000123],[-57.658332999999971,54.463051000000007],[-57.587775999999963,54.467208999999968],[-57.487777999999935,54.47304500000007],[-57.47222099999999,54.473602000000142],[-57.449996999999939,54.467491000000052],[-57.442497000000003,54.464996000000042],[-57.425277999999992,54.45915999999994],[-57.421111999999994,54.455826000000002],[-57.421669000000009,54.453605999999979],[-57.523330999999985,54.417213000000061],[-57.621666000000005,54.383605999999929],[-57.629439999999988,54.381660000000068],[-57.660827999999924,54.376937999999996],[-57.678336999999999,54.375267000000122],[-57.695273999999927,54.374992000000077],[-57.715552999999943,54.376937999999996],[-57.743056999999965,54.380821000000083],[-57.783332999999971,54.388329000000113],[-57.797226000000023,54.38888500000013],[-57.876105999999936,54.386658000000068],[-57.910278000000005,54.385269000000051],[-58.050277999999878,54.377487000000087],[-58.146392999999989,54.365273000000059],[-58.154166999999973,54.363327000000027],[-58.172501000000011,54.357498000000021],[-58.185271999999941,54.351661999999919],[-58.248055000000022,54.320274000000097],[-58.259726999999998,54.312766999999951],[-58.261947999999961,54.311104000000057],[-58.259170999999981,54.30971500000004],[-58.253333999999995,54.308884000000035],[-58.221107000000018,54.311661000000129],[-58.197495000000004,54.31638300000003],[-58.108337000000006,54.328049000000021],[-58.098609999999951,54.327217000000076],[-58.095832999999971,54.325828999999999],[-58.233886999999982,54.254166000000055],[-58.24722300000002,54.252777000000037],[-58.344161999999926,54.244438000000002],[-58.383056999999894,54.241104000000007],[-58.410278000000005,54.241661000000136],[-58.417220999999984,54.242493000000024],[-58.431388999999967,54.242218000000037],[-58.453888000000006,54.23721299999994],[-58.566108999999926,54.204163000000108],[-58.579169999999976,54.199996999999996],[-58.601394999999968,54.186104],[-58.611945999999989,54.178329000000076],[-58.628882999999973,54.169716000000108],[-58.6444469999999,54.165267999999969],[-58.692771999999991,54.151657],[-58.724715999999944,54.145271000000093],[-58.756949999999961,54.141106000000093],[-58.771110999999962,54.13999200000012],[-58.797782999999981,54.139717000000076],[-58.833611000000019,54.145827999999995],[-58.842773000000022,54.145827999999995],[-58.860001000000011,54.144714000000022],[-58.915276000000006,54.138603000000103],[-58.928336999999942,54.13638300000008],[-59.114165999999955,54.103881999999999],[-59.190551999999968,54.087212000000079],[-59.248336999999992,54.071937999999989],[-59.27944199999996,54.064438000000109],[-59.376105999999993,54.046943999999996],[-59.434440999999936,54.0472180000001],[-59.470275999999956,54.051659000000029],[-59.510001999999929,54.059433000000013],[-59.534446999999943,54.05832700000002],[-59.561385999999914,54.05332199999998],[-59.575561999999991,54.049438000000123],[-59.582221999999945,54.046387000000095],[-59.586945000000014,54.0430530000001],[-59.588608000000022,54.040549999999939],[-59.584723999999994,54.035271000000137],[-59.517220000000009,53.997214999999983],[-59.509726999999998,53.995544000000109],[-59.494445999999982,53.996383999999978],[-59.265839000000028,54.023048000000074],[-59.049445999999932,54.057495000000074],[-58.877220000000023,54.094993999999986],[-58.703055999999947,54.124161000000129],[-58.431113999999923,54.217209000000025],[-58.426392000000021,54.221931000000097],[-58.417502999999954,54.228043000000071],[-58.406386999999938,54.229713000000061],[-58.379439999999931,54.229988000000105],[-58.371940999999936,54.228043000000071],[-58.374442999999928,54.224434000000088],[-58.449722000000008,54.154434000000094],[-58.605003000000011,54.044158999999979],[-58.610282999999981,54.041663999999912],[-58.632499999999936,54.035271000000137],[-58.654998999999975,54.031661999999983],[-58.678054999999915,54.029160000000104],[-58.704445000000021,54.027214000000015],[-58.721663999999919,54.027489000000003],[-58.749167999999997,54.031105000000082],[-58.759170999999981,54.032767999999976],[-58.768058999999937,54.034995999999978],[-58.779723999999931,54.037773000000072],[-58.80750299999994,54.043327000000033],[-58.835830999999928,54.0472180000001],[-58.879997000000003,54.044998000000078],[-58.937499999999943,54.041663999999912],[-59.002501999999936,54.032494000000042],[-59.038611999999944,54.02693899999997],[-59.041388999999981,54.026100000000042],[-59.042777999999942,54.022766000000047],[-59.040557999999862,54.021751000000052],[-59.006950000000018,54.018051000000014],[-58.951942000000031,54.014717000000019],[-58.944159999999954,54.01527400000009],[-58.92583499999995,54.014717000000019],[-58.922500999999954,54.013885000000073],[-58.919448999999929,54.010826000000122],[-58.923057999999969,54.007216999999969],[-58.954169999999976,53.983879000000002],[-58.963057999999933,53.977767999999969],[-58.980826999999977,53.966385000000116],[-59.008338999999921,53.955268999999987],[-59.015838999999971,53.953323000000125],[-59.047782999999981,53.948326000000009],[-59.072226999999941,53.947487000000024],[-59.115279999999871,53.946381000000031],[-59.12222300000002,53.945267000000058],[-59.172774999999945,53.934990000000028],[-59.201392999999996,53.927489999999977],[-59.331946999999957,53.888329000000056],[-59.345551,53.883049000000142],[-59.363891999999908,53.872215000000097],[-59.369445999999982,53.867493000000024],[-59.393616000000009,53.8555530000001],[-59.43638599999997,53.837493999999992],[-59.463332999999977,53.830551000000014],[-59.480277999999998,53.82777400000009],[-59.527221999999995,53.822495000000117],[-59.543892000000028,53.8211060000001],[-59.596107000000018,53.819160000000011],[-59.62388599999997,53.82027400000004],[-59.635833999999988,53.820831000000112],[-59.698607999999979,53.829437000000041],[-59.716659999999933,53.831939999999975],[-59.728049999999996,53.835266000000047],[-59.755561999999941,53.838600000000042],[-59.798339999999939,53.843322999999998],[-59.807776999999874,53.84388000000007],[-59.825835999999981,53.842766000000097],[-59.852782999999988,53.839432000000102],[-59.872498000000007,53.833603000000096],[-59.877219999999966,53.83027600000014],[-59.880553999999961,53.825272000000041],[-59.989165999999955,53.779716000000121],[-60.082779000000016,53.762497000000053],[-60.121108999999933,53.625267000000065],[-60.11999499999996,53.611381999999992],[-60.11361699999992,53.602493000000095],[-60.110000999999954,53.598877000000073],[-60.105002999999954,53.594711000000132],[-60.087501999999915,53.583602999999982],[-60.068061999999998,53.573326000000009],[-60.064444999999978,53.569716999999969],[-60.063332000000003,53.565826000000072],[-60.064444999999978,53.560272000000111],[-60.069724999999949,53.555550000000039],[-60.075004999999919,53.553047000000049],[-60.133888000000013,53.528328000000101],[-60.138335999999981,53.528603000000089],[-60.347495999999978,53.626938000000109],[-60.358611999999994,53.634438000000046],[-60.361670999999944,53.639717000000019],[-60.364448999999979,53.648331000000042],[-60.368056999999965,53.652771000000087],[-60.382499999999936,53.662490999999989],[-60.390556000000004,53.665543000000071],[-60.503059000000007,53.705826000000116],[-60.511115999999959,53.708327999999995],[-60.560279999999977,53.718323000000112],[-60.648613000000012,53.737376999999981],[-60.670612000000006,53.740047000000061],[-60.705115999999975,53.744881000000021],[-60.75894900000003,53.761718999999971],[-60.769943000000012,53.765381000000104],[-60.856948999999986,53.792770000000019],[-60.887222000000008,53.751389000000074],[-60.880279999999914,53.713051000000007],[-60.834723999999937,53.721375000000023],[-60.757724999999994,53.713768000000016],[-60.747222999999963,53.71276499999999],[-60.654891999999961,53.698768999999913],[-60.644225999999946,53.696937999999989],[-60.537223999999924,53.678329000000019],[-60.511947999999961,53.669716000000051],[-60.446563999999967,53.644852000000128],[-60.431670999999994,53.639160000000118],[-60.360282999999981,53.606658999999979],[-60.354445999999996,53.603882000000112],[-60.342223999999931,53.596099999999979],[-60.334166999999979,53.589156999999943],[-60.323333999999988,53.581665000000044],[-60.298614999999927,53.568054000000075],[-60.278884999999946,53.558601000000067],[-60.253616000000022,53.549995000000138],[-60.103614999999934,53.500549000000092],[-60.106392000000028,53.457497000000046],[-60.123328999999956,53.456100000000106],[-60.138054000000011,53.453605999999979],[-60.202224999999999,53.433600999999953],[-60.40582999999998,53.364158999999972],[-60.413329999999974,53.357773000000009],[-60.412216000000001,53.349716000000058],[-60.404998999999975,53.334160000000111],[-60.395835999999974,53.331383000000017],[-60.391113000000018,53.331107999999972],[-60.301392000000021,53.336380000000133],[-60.230826999999977,53.343323000000112],[-60.216109999999901,53.345824999999991],[-60.203888000000006,53.349716000000058],[-60.198607999999865,53.350548000000003],[-60.188605999999993,53.350548000000003],[-60.18332700000002,53.349433999999974],[-60.176665999999898,53.346382000000062],[-60.175002999999947,53.343048000000067],[-60.174720999999977,53.338043000000027],[-60.180831999999896,53.329993999999999],[-60.190833999999938,53.321937999999932],[-60.202224999999999,53.313605999999936],[-60.208892999999989,53.310546999999985],[-60.283332999999914,53.289436000000137],[-60.295836999999949,53.286659000000043],[-60.333885000000009,53.280548000000124],[-60.367217999999923,53.27777100000003],[-60.389724999999999,53.27693899999997],[-60.418335000000013,53.269440000000145],[-60.416663999999969,53.268326000000002],[-60.398055999999997,53.265549000000078],[-60.316108999999926,53.264160000000061],[-60.289444000000003,53.263885000000073],[-60.133613999999966,53.283607000000131],[-60.024719000000005,53.354996000000142],[-59.953887999999949,53.406937000000028],[-59.931945999999925,53.42582700000014],[-59.84194199999996,53.476379000000065],[-59.821670999999981,53.471656999999993],[-59.806106999999997,53.471100000000092],[-59.798057999999969,53.472214000000065],[-59.789168999999958,53.474434000000088],[-59.785003999999958,53.477210999999954],[-59.783614999999998,53.481102000000021],[-59.78472899999997,53.485268000000133],[-59.799170999999944,53.491378999999995],[-59.823615999999959,53.49332400000003],[-59.858611999999994,53.496101000000124],[-59.89916999999997,53.516936999999928],[-59.901108000000022,53.519714000000022],[-59.898337999999967,53.52416199999999],[-59.893058999999994,53.528603000000089],[-59.875556999999958,53.534996000000035],[-59.855835000000013,53.536942000000124],[-59.847495999999978,53.536658999999986],[-59.80999799999995,53.529716000000008],[-59.773613000000012,53.517769000000044],[-59.763061999999934,53.515274000000034],[-59.755561999999941,53.514998999999989],[-59.740279999999984,53.515831000000105],[-59.621108999999933,53.527214000000129],[-59.605834999999956,53.529716000000008],[-59.560829000000012,53.540550000000053],[-59.53082999999998,53.548882000000049],[-59.517501999999979,53.553878999999938],[-59.478333000000021,53.572769000000108],[-59.329726999999991,53.65387700000008],[-59.162216000000001,53.671379000000115],[-59.079726999999934,53.680550000000096],[-59.074172999999917,53.683051999999975],[-59.023887999999999,53.713882000000012],[-59.01916499999993,53.719154000000117],[-59.010833999999932,53.744438000000116],[-59.010559000000001,53.746658000000139],[-59.018889999999999,53.749161000000129],[-59.035003999999958,53.74721500000004],[-59.041388999999981,53.748604],[-59.046111999999937,53.75277699999998],[-59.06527699999998,53.791107000000068],[-59.066390999999896,53.794998000000135],[-59.058334000000002,53.803322000000037],[-59.049445999999932,53.810822000000087],[-59.042777999999942,53.81499500000001],[-58.870276999999987,53.904709000000139],[-58.550277999999935,54.009163000000001],[-58.326110999999969,54.046271999999988],[-58.216942000000017,54.071770000000129],[-58.204612999999995,54.074604000000136],[-58.19377499999996,54.075939000000062],[-58.180446999999958,54.075436000000025],[-58.156780000000026,54.071434000000011],[-58.15060799999992,54.069438999999988],[-58.028610000000015,54.079720000000123],[-57.951942000000031,54.070831000000055],[-57.938605999999993,54.070273999999984],[-57.815552000000025,54.066101000000003],[-57.797501000000011,54.066101000000003],[-57.789443999999946,54.068603999999993],[-57.786391999999921,54.071662999999944],[-57.786117999999988,54.075271999999984],[-57.789443999999946,54.079720000000123],[-57.805556999999908,54.086654999999951],[-57.851668999999958,54.100273000000016],[-57.869720000000029,54.103050000000053],[-58.07650000000001,54.124489000000096],[-58.152495999999928,54.129158000000018],[-58.167163999999957,54.127827000000025],[-58.181503000000021,54.124660000000006],[-58.195830999999998,54.120159000000115],[-58.210834999999918,54.113995000000102],[-58.214668000000017,54.111828000000003],[-58.216994999999997,54.110493000000076],[-58.223000000000013,54.103992000000062],[-58.226832999999942,54.101826000000074],[-58.229831999999931,54.100822000000107],[-58.236834999999928,54.099327000000073],[-58.245166999999981,54.099158999999986],[-58.254332999999974,54.101322000000096],[-58.415276000000006,54.135269000000108],[-58.4183349999999,54.139717000000076],[-58.417220999999984,54.143051000000071],[-58.383613999999966,54.189712999999983],[-58.379439999999931,54.193877999999984],[-58.373885999999914,54.198326000000122],[-58.367500000000007,54.201934999999935],[-58.355559999999912,54.20638300000013],[-58.203613000000018,54.234161000000029],[-58.177779999999984,54.236938000000123],[-58.030829999999924,54.235550000000046],[-58.003058999999951,54.233879000000002],[-57.99361399999998,54.230819999999994],[-57.973609999999951,54.221656999999993],[-57.961112999999898,54.217766000000097],[-57.935271999999998,54.211662000000103],[-57.866660999999965,54.197769000000051],[-57.856392000000028,54.196098000000006],[-57.659163999999919,54.199432000000002],[-57.468329999999924,54.193877999999984],[-57.428336999999885,54.18249499999996],[-57.384170999999981,54.150543000000027],[-57.385559000000001,54.145827999999995],[-57.389998999999989,54.141106000000093],[-57.383613999999966,54.128875999999991],[-57.370833999999945,54.106384000000048],[-57.367774999999995,54.10193600000008],[-57.323333999999988,54.039719000000105],[-57.221106999999961,53.918326999999977],[-57.115279999999984,53.838600000000042],[-57.092773000000022,53.831664999999987],[-57.083611000000019,53.828605999999979],[-57.079726999999991,53.826660000000118],[-57.076392999999996,53.823051000000078],[-57.077498999999932,53.819442999999978],[-57.151389999999992,53.735824999999977],[-57.302498000000014,53.679161000000079],[-57.314720000000023,53.676383999999985],[-57.387504999999976,53.658325000000048],[-57.429169000000002,53.647491000000002],[-57.484169000000009,53.631660000000011],[-57.49111199999993,53.628876000000048],[-57.52305599999994,53.612495000000081],[-57.538894999999968,53.602218999999991],[-57.544448999999986,53.597771000000023],[-57.549995000000024,53.591934000000037],[-57.550551999999982,53.587494000000049],[-57.545279999999991,53.584717000000126],[-57.541114999999991,53.585266000000104],[-57.533332999999914,53.587494000000049],[-57.52777900000001,53.591377000000136],[-57.49361399999998,53.609436000000073],[-57.479720999999984,53.61332700000014],[-57.458054000000004,53.617493000000081],[-57.444716999999969,53.618599000000074],[-57.373610999999926,53.606658999999979],[-57.316665999999998,53.579720000000009],[-57.313613999999973,53.573608000000036],[-57.303054999999915,53.530823000000112],[-57.302498000000014,53.526382000000012],[-57.303329000000019,53.509437999999932],[-57.305557000000022,53.49971800000003],[-57.306664000000012,53.496384000000091],[-57.317779999999971,53.47554800000006],[-57.328887999999949,53.461937000000091],[-57.332503999999915,53.458328000000051],[-57.345832999999914,53.450546000000088],[-57.336945000000014,53.440269000000114],[-57.316390999999953,53.435822000000087],[-57.303329000000019,53.43332700000002],[-57.297501000000011,53.433052000000032],[-57.289169000000015,53.433875999999998],[-57.283332999999971,53.438598999999954],[-57.293616999999983,53.467766000000097],[-57.285277999999948,53.477485999999999],[-57.281386999999995,53.479430999999977],[-57.248610999999983,53.494156000000089],[-57.23750299999989,53.498604000000057],[-57.130279999999971,53.593880000000127],[-57.111389000000031,53.621658000000082],[-57.06138599999997,53.671379000000115],[-57.014724999999942,53.711380000000133],[-56.973610000000008,53.724434000000031],[-56.959442000000024,53.728325000000098],[-56.926391999999964,53.730270000000075],[-56.916663999999969,53.728600000000085],[-56.860832000000016,53.722488000000112],[-56.797226000000023,53.719986000000063],[-56.660827999999924,53.720543000000134],[-56.62222300000002,53.733604000000071],[-56.628608999999983,53.741936000000067],[-56.628333999999995,53.744156000000032],[-56.626105999999936,53.745827000000133],[-56.603332999999964,53.759163000000058],[-56.483611999999994,53.782494000000099],[-56.464691000000016,53.782272000000034],[-56.448333999999988,53.777771000000143],[-56.431670999999994,53.764442000000031],[-56.426948999999979,53.757216999999969],[-56.413886999999988,53.727768000000026],[-56.414443999999946,53.721931000000041],[-56.415275999999949,53.720543000000134],[-56.421669000000009,53.716933999999924],[-56.429169000000002,53.71527100000003],[-56.438048999999921,53.71527100000003],[-56.446944999999971,53.716933999999924],[-56.482773000000009,53.718048000000124],[-56.506393000000003,53.716933999999924],[-56.521666999999979,53.714714000000129],[-56.544448999999986,53.709717000000012],[-56.662215999999944,53.679993000000024],[-56.680283000000031,53.672768000000133],[-56.627220000000023,53.650826000000052],[-56.618057000000022,53.647491000000002],[-56.340552999999943,53.588325999999938],[-56.320281999999963,53.585266000000104],[-56.225554999999872,53.577217000000076],[-56.21665999999999,53.577217000000076],[-56.205832999999984,53.581665000000044],[-56.15582999999998,53.591660000000104],[-56.078613000000018,53.58387799999997],[-56.069167999999934,53.582771000000037],[-56.031386999999995,53.57638500000013],[-56.027221999999995,53.575272000000041],[-55.991385999999977,53.552216000000044],[-55.978881999999942,53.542221000000097],[-55.990836999999942,53.510277000000087],[-55.996947999999918,53.505272000000048],[-56.008780999999942,53.503666000000067],[-56.01294699999994,53.503993999999977],[-56.017444999999952,53.505996999999979],[-56.018611999999962,53.508495000000096],[-56.021110999999962,53.513054000000011],[-56.022498999999982,53.516388000000006],[-56.047501000000011,53.533607000000075],[-56.063332000000003,53.540833000000021],[-56.145836000000031,53.553047000000049],[-56.208892999999989,53.559433000000126],[-56.242500000000007,53.559990000000028],[-56.258338999999921,53.559158000000139],[-56.264724999999999,53.555550000000039],[-56.266113000000018,53.549995000000138],[-56.263335999999924,53.540276000000119],[-56.259170999999924,53.537773000000129],[-56.145553999999947,53.500000000000114],[-56.115279999999927,53.491936000000123],[-56.077498999999932,53.483330000000024],[-56.037780999999995,53.461655000000007],[-56.027442999999948,53.454326999999978],[-55.965552999999943,53.40915700000005],[-55.965836000000024,53.40554800000001],[-55.96944400000001,53.400542999999971],[-56.00417299999998,53.388045999999974],[-56.025275999999963,53.37971500000009],[-56.03167000000002,53.376099000000011],[-56.03833800000001,53.367493000000138],[-56.029998999999975,53.365273000000116],[-56.020835999999974,53.364158999999972],[-56.013061999999991,53.364440999999999],[-56.001396,53.366661000000022],[-55.988051999999982,53.369713000000104],[-55.981383999999935,53.373047000000099],[-55.969497999999874,53.380775000000028],[-55.959723999999937,53.390273999999977],[-55.953132999999923,53.392441000000019],[-55.938605999999936,53.395271000000037],[-55.925116999999943,53.396133000000134],[-55.912216000000001,53.394997000000103],[-55.893616000000009,53.389717000000076],[-55.881385999999964,53.382767000000001],[-55.808051999999975,53.340546000000018],[-55.807456999999943,53.284966000000111],[-55.745834000000002,53.249435000000119],[-55.747498000000007,53.143607999999972],[-55.749442999999985,53.139717000000076],[-55.754172999999923,53.134995000000004],[-55.833312999999919,53.097931000000017],[-55.879856000000018,53.073795000000018],[-55.91194200000001,53.028327999999988],[-55.926666000000012,53.023323000000119],[-55.934440999999936,53.021660000000054],[-55.943329000000006,53.021102999999925],[-55.964447000000007,53.021660000000054],[-55.990836999999942,53.024162000000103],[-56.008338999999978,53.02748900000006],[-56.025001999999972,53.033606999999961],[-56.034172000000012,53.036110000000122],[-56.056106999999997,53.038329999999974],[-56.160278000000005,53.033606999999961],[-56.165833000000021,53.032768000000033],[-56.166945999999996,53.029434000000037],[-56.165276000000006,53.024993999999992],[-56.040840000000003,53.005829000000062],[-55.958611000000019,52.99610100000001],[-55.949439999999981,52.994995000000017],[-55.889442000000031,52.969154000000117],[-55.885276999999974,52.966384999999946],[-55.834166999999979,52.921936000000017],[-55.80471799999998,52.877213000000097],[-55.803328999999962,52.839431999999931],[-55.803885999999977,52.831940000000031],[-55.808051999999975,52.82638500000013],[-55.841109999999958,52.827217000000019],[-55.879165999999941,52.824165000000107],[-55.973610000000008,52.810547000000099],[-55.987777999999992,52.806099000000131],[-56.060829000000012,52.766106000000093],[-55.964721999999938,52.681664000000069],[-55.96055599999994,52.679161000000136],[-55.950553999999897,52.677216000000101],[-55.933608999999933,52.675552000000096],[-55.918335000000013,52.677490000000034],[-55.874717999999973,52.68332700000002],[-55.786948999999993,52.683601000000124],[-55.779167000000029,52.682495000000074],[-55.77305599999994,52.679161000000136],[-55.768889999999942,52.674995000000024],[-55.740836999999999,52.646385000000009],[-55.73860899999994,52.64276899999993],[-55.739998000000014,52.639434999999935],[-55.757506999999919,52.614440999999999],[-55.769447000000014,52.608047000000113],[-55.792777999999998,52.60166200000009],[-55.888892999999996,52.608047000000113],[-55.898613000000012,52.609993000000031],[-55.939940999999976,52.628268999999989],[-55.958777999999995,52.635604999999941],[-56.032775999999956,52.654709000000025],[-56.048889000000031,52.656096999999932],[-56.075004999999919,52.655822999999998],[-56.108611999999937,52.655266000000097],[-56.122771999999941,52.651100000000042],[-56.123885999999857,52.647491000000002],[-56.119720000000029,52.643326000000002],[-56.112007000000006,52.641036999999983],[-56.099060000000009,52.641006000000118],[-56.071945000000028,52.644714000000135],[-56.06361400000003,52.644714000000135],[-56.054442999999992,52.643608000000086],[-55.982773000000009,52.622490000000028],[-55.974998000000028,52.619713000000104],[-55.970832999999914,52.615546999999992],[-55.972770999999966,52.610825000000091],[-55.985275000000001,52.602218999999991],[-56.039169000000015,52.584991000000059],[-56.155777,52.557438000000104],[-56.172611000000018,52.553608000000111],[-56.186110999999983,52.550938000000031],[-56.200779000000011,52.550938000000031],[-56.253058999999951,52.543884000000048],[-56.297500999999954,52.563606000000107],[-56.315552000000025,52.572219999999959],[-56.322501999999986,52.574715000000026],[-56.333327999999995,52.576942000000088],[-56.356391999999971,52.580276000000026],[-56.456389999999942,52.592765999999983],[-56.478607000000011,52.594437000000028],[-56.496871999999939,52.594147000000021],[-56.452782000000013,52.56888600000002],[-56.444160000000011,52.565826000000129],[-56.28055599999999,52.534996000000092],[-56.262221999999952,52.531662000000097],[-56.19755600000002,52.525105000000053],[-56.153556999999921,52.526103999999918],[-55.988892000000021,52.506386000000077],[-55.829726999999934,52.51249700000011],[-55.761390999999946,52.498878000000047],[-55.751395999999943,52.496101000000124],[-55.746947999999975,52.493881000000101],[-55.743057000000022,52.490829000000019],[-55.735001000000011,52.478599999999972],[-55.734169000000009,52.474709000000075],[-55.735832000000016,52.469154000000003],[-55.764450000000011,52.45388000000014],[-55.767501999999922,52.451103000000046],[-55.766395999999986,52.447769000000051],[-55.732772999999952,52.442215000000033],[-55.706107999999915,52.441658000000132],[-55.676666000000012,52.441658000000132],[-55.656661999999983,52.441933000000006],[-55.648612999999955,52.439712999999983],[-55.645554000000004,52.437492000000077],[-55.642775999999969,52.432770000000005],[-55.642775999999969,52.427773000000059],[-55.641669999999976,52.368881000000044],[-55.641944999999964,52.363883999999928],[-55.643332999999984,52.358330000000137],[-55.647780999999952,52.354164000000026],[-55.65444199999996,52.351661999999976],[-55.782501000000025,52.334160000000111],[-55.825004999999976,52.343048000000124],[-55.92861199999993,52.369438000000116],[-56.068335999999931,52.407210999999961],[-56.173614999999984,52.438881000000038],[-56.180556999999965,52.440826000000072],[-56.194442999999922,52.442215000000033],[-56.196945000000028,52.439987000000087],[-56.195273999999984,52.435822000000087],[-56.191382999999973,52.431107000000054],[-56.181388999999967,52.423050000000103],[-56.169448999999986,52.416100000000029],[-55.956664999999987,52.350272999999959],[-55.857779999999991,52.325271999999984],[-55.707222000000002,52.248329000000126],[-55.677222999999969,52.208327999999938],[-55.68638599999997,52.109436000000017],[-55.696945000000028,52.088326000000052],[-55.701667999999927,52.082214000000079],[-55.896666999999923,51.950828999999999],[-56.023330999999985,51.901932000000102],[-56.203330999999935,51.793326999999977],[-56.209723999999994,51.789719000000048],[-56.235832000000016,51.783607000000075],[-56.346663999999976,51.759720000000016],[-56.468886999999995,51.709434999999985],[-56.689720000000023,51.592216000000008],[-56.764450000000011,51.548607000000061],[-56.804169000000002,51.507773999999984],[-56.805832000000009,51.502219999999966],[-56.808891000000017,51.496384000000091],[-56.813613999999973,51.491661000000136],[-56.942771999999991,51.427489999999921],[-56.949721999999952,51.424713000000054],[-56.956947000000014,51.423050000000103],[-57.005561999999941,51.41944100000012],[-57.078056000000004,51.41443600000008],[-57.104239999999947,51.412674000000095],[-57.142226999999991,51.424164000000076],[-57.232215999999937,51.498604000000114],[-57.237777999999992,51.502219999999966],[-57.247222999999963,51.504166000000055],[-57.255561999999998,51.504439999999988],[-57.263617999999894,51.503608999999983],[-57.421386999999925,51.480545000000006],[-57.437774999999988,51.461105000000032],[-57.43638599999997,51.45638300000013],[-57.440833999999938,51.449997000000053],[-57.447495000000004,51.447487000000024],[-57.454720000000009,51.445541000000105],[-57.58666199999999,51.429718000000094],[-57.602225999999916,51.428047000000049],[-57.676665999999955,51.429993000000081],[-57.685828999999956,51.430824000000086],[-57.688605999999936,51.435547000000099],[-57.692497000000003,51.455268999999987],[-57.691939999999931,51.461105000000032],[-57.689437999999939,51.466385000000059],[-57.705275999999969,51.469437000000028],[-57.730826999999863,51.471099999999922],[-57.748054999999965,51.472214000000122],[-57.883888000000013,51.392493999999999],[-57.889998999999989,51.388885000000016],[-57.942771999999991,51.356102000000021],[-57.954720000000009,51.34804500000007],[-57.966110000000015,51.338599999999985],[-57.975554999999986,51.328330999999935],[-57.986664000000019,51.319442999999978],[-58.006950000000018,51.31249200000002],[-58.021384999999952,51.308884000000091],[-58.211387999999943,51.271659999999997],[-58.297225999999966,51.268599999999992],[-58.305556999999965,51.268599999999992],[-58.324448000000018,51.272217000000126],[-58.407776000000013,51.295547000000056],[-58.620551999999975,51.277214000000015],[-58.628051999999968,51.275551000000064],[-58.675003000000004,51.255271999999991],[-58.680000000000007,51.250000000000057],[-58.680556999999908,51.244156000000032],[-58.680000000000007,51.234161000000086],[-58.678336999999999,51.229431000000091],[-58.675559999999905,51.224991000000045],[-58.671111999999937,51.220824999999991],[-58.665549999999996,51.216934000000094],[-58.635833999999932,51.197769000000108],[-58.621383999999978,51.191100999999946],[-58.592223999999931,51.18471500000004],[-58.61333499999995,51.157494000000042],[-58.618606999999997,51.153046000000074],[-58.630554000000018,51.145828000000051],[-58.713615000000004,51.106102000000078],[-58.726944000000003,51.099998000000028],[-58.733329999999967,51.09804500000007],[-58.785278000000005,51.088042999999971],[-58.914718999999991,51.052490000000091],[-58.928054999999972,51.048607000000004],[-58.990836999999885,51.021935000000099],[-59.003333999999938,51.015549000000021],[-59.006110999999976,51.009719999999959],[-59.003616000000022,51.004440000000102],[-58.99888599999997,51.001106000000107],[-58.990279999999984,50.998046999999985],[-58.981383999999935,50.99721500000004],[-58.975272999999959,51.000832000000003],[-58.96832999999998,51.002495000000124],[-58.959441999999967,51.001663000000008],[-58.954720000000009,50.996658000000139],[-58.952498999999989,50.992493000000138],[-58.946662999999944,50.833878000000027],[-58.948051000000021,50.828331000000048],[-59.010559000000001,50.754166000000055],[-59.015282000000013,50.748604000000114],[-59.041672000000005,50.751389000000131],[-59.061385999999914,50.755554000000132],[-59.068335999999988,50.759163000000115],[-59.087218999999948,50.775268999999923],[-59.093055999999933,50.78943600000008],[-59.09444400000001,50.799438000000066],[-59.094718999999941,50.815269000000058],[-59.118889000000024,50.803604000000121],[-59.15582999999998,50.771103000000039],[-59.186385999999914,50.74221799999998],[-59.228881999999999,50.738327000000083],[-59.397223999999994,50.657211000000132],[-59.454444999999964,50.621933000000126],[-59.459723999999937,50.61721],[-59.51916499999993,50.552773000000002],[-59.570556999999951,50.493607000000054],[-59.580001999999922,50.482765000000029],[-59.585274000000027,50.478043000000127],[-59.591667000000029,50.475266000000033],[-59.598610000000008,50.473602000000028],[-59.733611999999937,50.444992000000013],[-59.778336000000024,50.438881000000094],[-59.803885999999977,50.438881000000094],[-59.810555000000022,50.437492000000134],[-59.816108999999926,50.433876000000055],[-59.821670999999981,50.429436000000067],[-59.872222999999963,50.381103999999993],[-59.881667999999934,50.371658000000025],[-59.881667999999934,50.366386000000091],[-59.858893999999964,50.329436999999984],[-59.853888999999924,50.326102999999989],[-59.844718999999998,50.324440000000095],[-59.837775999999963,50.326102999999989],[-59.834723999999881,50.338043000000084],[-59.834998999999982,50.343322999999998],[-59.830832999999984,50.349434000000088],[-59.824722000000008,50.351662000000033],[-59.815001999999993,50.349159000000043],[-59.813331999999946,50.344154000000003],[-59.817223000000013,50.33277099999998],[-59.827498999999989,50.323607999999979],[-59.833885000000009,50.319160000000011],[-59.860282999999981,50.310547000000042],[-59.905273000000022,50.291107000000068],[-60.005004999999983,50.248878000000104],[-60.114448999999922,50.233046999999942],[-60.147781000000009,50.274162000000103],[-60.184440999999993,50.279716000000121],[-60.236945999999989,50.268051000000014],[-60.291671999999949,50.245270000000005],[-60.298614999999927,50.243324000000143],[-60.324447999999961,50.244713000000104],[-60.360001000000011,50.250831999999946],[-60.404442000000017,50.251389000000074],[-60.458892999999989,50.251106000000107],[-60.48332999999991,50.250831999999946],[-60.491668999999945,50.250548999999978],[-60.498610999999926,50.248604],[-60.511672999999973,50.242493000000138],[-60.522223999999881,50.234718000000044],[-60.52694699999995,50.229156000000103],[-60.583611000000019,50.208327999999995],[-60.591666999999973,50.208046000000138],[-60.674445999999989,50.219986000000006],[-60.710555999999997,50.2227630000001],[-60.838607999999965,50.214995999999985],[-61.052222999999969,50.215546000000018],[-61.289443999999946,50.199158000000125],[-61.427779999999984,50.171379000000115],[-61.505561999999941,50.152489000000003],[-61.583610999999905,50.132492000000127],[-61.650832999999921,50.109993000000145],[-61.720832999999914,50.091934000000037],[-61.731612999999982,50.101936000000023],[-61.742106999999976,50.105270000000019],[-61.746277000000021,50.107269000000031],[-61.748280000000022,50.109940000000051],[-61.712104999999951,50.12226899999996],[-61.703780999999992,50.124771000000067],[-61.699443999999971,50.125435000000095],[-61.694442999999922,50.125435000000095],[-61.671386999999982,50.136940000000095],[-61.620551999999918,50.147491000000002],[-61.593055999999876,50.155266000000097],[-61.579726999999991,50.160820000000058],[-61.574447999999904,50.165543000000071],[-61.571945000000028,50.171661000000029],[-61.573891000000003,50.181664000000069],[-61.577224999999999,50.186104000000057],[-61.58916499999998,50.188880999999981],[-61.593612999999948,50.185546999999985],[-61.602225999999916,50.174438000000066],[-61.607779999999991,50.170829999999967],[-61.622222999999963,50.166100000000142],[-61.731833999999935,50.144268000000125],[-61.746997999999905,50.144431999999995],[-61.757503999999983,50.14527099999998],[-61.761832999999967,50.147269999999992],[-61.763663999999949,50.149768999999992],[-61.762999999999977,50.153271000000018],[-61.760665999999958,50.157097000000078],[-61.794448999999986,50.159431000000097],[-61.795279999999991,50.169991000000039],[-61.796950999999979,50.174713000000111],[-61.804442999999992,50.183326999999963],[-61.848884999999996,50.222488000000112],[-61.864723000000026,50.228600000000085],[-61.898338000000024,50.233604000000071],[-61.907218999999941,50.234160999999972],[-61.963332999999977,50.236107000000004],[-61.977218999999991,50.231934000000081],[-61.989723000000026,50.226379000000009],[-61.996666000000005,50.224158999999986],[-62.004172999999923,50.223045000000013],[-62.202498999999989,50.23443600000013],[-62.268889999999999,50.259720000000129],[-62.317779999999971,50.281380000000127],[-62.328056000000004,50.283882000000006],[-62.397498999999982,50.294441000000063],[-62.404167000000029,50.29222100000004],[-62.415549999999939,50.28472099999999],[-62.425560000000019,50.275269000000037],[-62.42999999999995,50.269714000000135],[-62.439994999999954,50.260551000000135],[-62.446105999999986,50.257500000000107],[-62.572226999999941,50.274712000000136],[-62.746947999999918,50.28472099999999],[-63.112502999999947,50.291382000000112],[-63.158332999999971,50.260277000000031],[-63.159163999999976,50.25471500000009],[-63.228607000000011,50.234718000000044],[-63.236663999999962,50.23443600000013],[-63.371940999999993,50.236655999999982],[-63.469443999999953,50.257216999999969],[-63.565552000000025,50.264159999999947],[-63.616660999999908,50.266663000000108],[-63.649726999999928,50.272766000000047],[-63.687499999999886,50.282494000000099],[-63.693885999999964,50.291939000000013],[-63.698607999999979,50.295272999999952],[-63.707503999999972,50.297775000000058],[-63.803328999999906,50.311661000000015],[-63.821388000000013,50.312209999999993],[-63.976104999999961,50.305549999999982],[-64.067229999999995,50.29222100000004],[-64.127776999999924,50.271935000000042],[-64.140563999999927,50.266937000000041],[-64.154175000000009,50.262497000000053],[-64.162215999999944,50.262214999999969],[-64.215285999999935,50.264999000000103],[-64.234726000000023,50.266937000000041],[-64.262787000000003,50.271660000000054],[-64.365279999999984,50.29222100000004],[-64.37388599999997,50.294998000000135],[-64.402221999999995,50.307495000000131],[-64.417770000000019,50.313048999999921],[-64.436661000000015,50.317772000000105],[-64.446105999999986,50.319160000000011],[-64.455001999999922,50.319442999999978],[-64.46305799999999,50.319160000000011],[-64.470839999999953,50.317772000000105],[-64.510009999999966,50.303046999999992],[-64.611938000000009,50.281380000000127],[-64.628052000000025,50.279160000000104],[-64.659438999999963,50.277214000000015],[-64.725006000000008,50.274436999999978],[-64.899993999999936,50.270828000000108],[-65.180557000000022,50.28555300000005],[-65.189986999999917,50.2866590000001],[-65.222777999999948,50.297775000000058],[-65.237503000000004,50.303879000000052],[-65.242492999999854,50.307769999999948],[-65.275009000000011,50.308044000000052],[-65.464447000000007,50.299437999999952],[-65.486663999999962,50.295272999999952],[-65.521666999999979,50.285828000000095],[-65.589995999999985,50.275269000000037],[-65.690552000000025,50.261108000000036],[-65.747771999999998,50.256943000000035],[-65.829453000000001,50.253326000000072],[-65.845839999999953,50.258888000000013],[-65.864440999999999,50.26888300000013],[-65.876389000000017,50.276382000000126],[-65.898055999999883,50.284995999999978],[-65.918059999999969,50.288329999999974],[-65.952498999999932,50.288887000000045],[-65.974166999999966,50.283882000000006],[-65.986937999999896,50.278328000000045],[-65.993057000000022,50.275269000000037],[-66.004180999999903,50.268326000000059],[-66.024718999999948,50.251389000000074],[-66.043334999999956,50.222214000000008],[-66.083327999999995,50.193603999999937],[-66.089721999999881,50.191375999999991],[-66.163329999999974,50.197212000000036],[-66.314163000000008,50.209717000000012],[-66.406386999999938,50.239989999999977],[-66.40695199999999,50.245270000000005],[-66.412215999999944,50.260551000000135],[-66.416945999999996,50.264442000000031],[-66.423049999999932,50.267768999999987],[-66.433318999999983,50.269714000000135],[-66.441665999999941,50.269157000000064],[-66.456389999999999,50.26638800000012],[-66.469727000000034,50.261939999999981],[-66.494720000000029,50.249435000000005],[-66.511948000000018,50.239158999999972],[-66.700835999999924,50.102493000000095],[-66.723327999999924,50.078331000000048],[-66.861937999999896,50.022491000000116],[-66.882492000000013,50.016662999999994],[-66.896118000000001,50.011940000000038],[-66.920273000000009,50.000275000000101],[-66.942489999999907,49.985825000000034],[-66.958617999999944,49.974709000000075],[-66.963622999999984,49.969154000000003],[-66.966399999999965,49.963326000000052],[-66.975280999999995,49.943603999999993],[-66.975829999999974,49.937767000000065],[-66.965560999999923,49.919441000000063],[-66.963332999999977,49.914711000000011],[-67.016402999999855,49.854712999999947],[-67.061385999999857,49.841377000000023],[-67.065276999999924,49.845543000000077],[-67.073897999999929,49.848045000000013],[-67.095839999999896,49.843605000000139],[-67.115829000000019,49.836655000000121],[-67.121658000000025,49.833327999999995],[-67.137222000000008,49.821381000000031],[-67.146666999999979,49.812492000000134],[-67.151397999999915,49.806937999999946],[-67.162216000000001,49.79055000000011],[-67.174164000000019,49.764717000000132],[-67.238892000000021,49.590546000000074],[-67.240828999999962,49.578880000000083],[-67.241378999999995,49.56749700000006],[-67.240828999999962,49.556655999999975],[-67.239990000000034,49.551659000000029],[-67.235000999999954,49.53555300000005],[-67.228881999999999,49.510277000000031],[-67.229171999999949,49.483047000000113],[-67.230834999999956,49.476936000000023],[-67.233886999999982,49.47026800000009],[-67.369155999999975,49.332771000000037],[-67.375,49.327217000000019],[-67.386123999999995,49.322220000000073],[-67.402785999999878,49.3211060000001],[-67.420273000000009,49.321663000000001],[-67.438599000000011,49.324440000000095],[-67.473617999999988,49.326660000000118],[-67.569732999999985,49.329994000000113],[-67.577498999999989,49.329163000000108],[-67.706389999999999,49.312767000000065],[-67.939163000000008,49.287773000000129],[-67.975280999999995,49.284996000000035],[-68.119720000000029,49.271660000000054],[-68.127212999999983,49.269440000000031],[-68.131942999999922,49.266106000000093],[-68.136397999999929,49.260550999999964],[-68.138900999999919,49.25471500000009],[-68.140563999999927,49.248604000000057],[-68.143889999999885,49.23054500000012],[-68.180832000000009,49.12193300000007],[-68.184997999999894,49.116104000000064],[-68.189712999999927,49.112212999999997],[-68.194992000000013,49.10833000000008],[-68.201110999999912,49.105552999999986],[-68.221663999999976,49.100273000000072],[-68.369445999999982,49.069443000000035],[-68.442489999999964,49.095543000000077],[-68.571395999999993,49.061104],[-68.59056099999998,49.054161000000022],[-68.606948999999929,49.042496000000142],[-68.626099000000011,49.023880000000133],[-68.696380999999974,48.939987000000087],[-68.876937999999996,48.85193600000008],[-69.047775000000001,48.773048000000074],[-69.06082200000003,48.767494000000056],[-69.064437999999996,48.762496999999996],[-69.084732000000031,48.72165700000005],[-69.089446999999893,48.709435000000042],[-69.093612999999948,48.691933000000006],[-69.096114999999941,48.674995000000138],[-69.099441999999897,48.663322000000107],[-69.106109999999944,48.644996999999989],[-69.111937999999896,48.63249200000007],[-69.123885999999914,48.614716000000101],[-69.142501999999922,48.594994000000042],[-69.14805599999994,48.591102999999976],[-69.15972899999997,48.58526599999999],[-69.166397000000018,48.583328000000051],[-69.184158000000025,48.584717000000069],[-69.201675000000023,48.588599999999985],[-69.218612999999948,48.589713999999958],[-69.226669000000015,48.588882000000069],[-69.231383999999935,48.585548000000074],[-69.236388999999917,48.581108000000029],[-69.265288999999939,48.541663999999969],[-69.279448999999943,48.515831000000048],[-69.282776000000013,48.504166000000112],[-69.283324999999934,48.493049999999982],[-69.282500999999968,48.482490999999982],[-69.292770000000019,48.457771000000093],[-69.301102000000014,48.446655000000135],[-69.432769999999948,48.307770000000005],[-69.437774999999988,48.303047000000049],[-69.454726999999991,48.291939000000013],[-69.597777999999948,48.207497000000046],[-69.672775000000001,48.14388300000013],[-69.683884000000035,48.137772000000041],[-69.691375999999991,48.137496999999996],[-69.80082699999997,48.153603000000032],[-69.810271999999941,48.155822999999998],[-69.734725999999966,48.113609000000054],[-69.730285999999978,48.10943600000013],[-69.732498000000021,48.103607000000125],[-69.786391999999864,47.994713000000047],[-69.839447000000007,47.907210999999961],[-69.925827000000027,47.773048000000074],[-69.93582200000003,47.764441999999974],[-70.002227999999945,47.711936999999978],[-70.015563999999983,47.702773999999977],[-70.071945000000028,47.674713000000054],[-70.077498999999989,47.672493000000088],[-70.091109999999958,47.669159000000093],[-70.132767000000001,47.644996999999989],[-70.179992999999968,47.608330000000024],[-70.190276999999924,47.599159000000043],[-70.202498999999989,47.583053999999947],[-70.206116000000009,47.576660000000118],[-70.208343999999897,47.570549000000028],[-70.209441999999967,47.553879000000109],[-70.207503999999915,47.533051],[-70.208618000000001,47.527214000000072],[-70.217223999999931,47.508330999999998],[-70.225554999999929,47.496384000000035],[-70.2308349999999,47.492493000000138],[-70.299727999999959,47.466933999999924],[-70.341674999999952,47.460548000000017],[-70.461944999999901,47.429993000000024],[-70.502501999999993,47.390830999999991],[-70.555831999999953,47.322769000000108],[-70.56639100000001,47.304161000000022],[-70.568618999999956,47.298049999999932],[-70.571120999999948,47.281104999999968],[-70.574172999999973,47.274437000000034],[-70.586120999999991,47.257773999999927],[-70.699431999999945,47.126099000000011],[-70.721664000000033,47.101387000000102],[-70.733063000000016,47.095543000000134],[-70.792496000000028,47.068329000000119],[-70.817504999999926,47.058884000000035],[-70.823623999999938,47.056938000000002],[-70.866942999999935,47.051383999999985],[-70.893341000000021,47.045273000000066],[-70.923049999999932,47.032211000000075],[-70.973617999999988,47.003326000000015],[-71.113616999999863,46.912491000000045],[-71.182495000000017,46.864158999999972],[-71.197495000000004,46.852493000000038],[-71.198607999999979,46.846382000000119],[-71.299164000000019,46.742218000000094],[-71.291945999999996,46.744156000000032],[-71.279723999999931,46.749161000000072],[-71.209441999999967,46.782494000000099],[-71.19888299999991,46.788887000000045],[-71.188888999999961,46.796661000000029],[-71.184432999999956,46.802773000000059],[-71.178329000000019,46.815269000000114],[-71.166396999999904,46.831108000000029],[-71.156112999999948,46.838882000000069],[-71.149993999999936,46.842491000000052],[-71.143615999999952,46.844711000000075],[-71.130554000000018,46.847487999999998],[-71.115279999999984,46.84887700000013],[-71.100280999999995,46.84887700000013],[-71.083327999999995,46.847487999999998],[-70.986937999999952,46.854164000000083],[-70.772232000000031,46.915825000000041],[-70.766402999999912,46.918884000000048],[-70.755004999999983,46.936652999999978],[-70.744445999999925,46.943320999999912],[-70.737502999999947,46.946098000000006],[-70.638061999999991,46.981658999999979],[-70.618880999999931,46.988045000000056],[-70.604996000000028,46.990273000000059],[-70.575012000000015,46.993324000000086],[-70.553328999999962,46.998047000000042],[-70.541381999999942,47.00249500000001],[-70.530288999999925,47.007773999999984],[-70.506957999999997,47.02027099999998],[-70.486389000000031,47.033607000000131],[-70.461120999999935,47.053604000000007],[-70.334166999999923,47.15554800000001],[-70.310271999999941,47.176659000000086],[-70.273055999999997,47.213608000000136],[-70.111114999999984,47.340546000000131],[-70.078888000000006,47.361106999999947],[-70.048888999999974,47.386107999999979],[-70.044158999999922,47.390830999999991],[-70.040833000000021,47.397217000000069],[-70.039992999999868,47.402771000000087],[-69.967498999999975,47.505829000000062],[-69.90194699999995,47.537216000000001],[-69.896392999999932,47.541107000000068],[-69.805832000000009,47.613052000000096],[-69.65943900000002,47.744713000000104],[-69.639998999999875,47.762772000000041],[-69.593063000000029,47.808884000000091],[-69.556655999999862,47.856384000000048],[-69.556380999999931,47.866661000000022],[-69.544158999999979,47.883605999999986],[-69.526672000000019,47.90415999999999],[-69.508057000000008,47.924438000000009],[-69.498885999999857,47.933875999999998],[-69.469727000000034,47.961937000000091],[-69.450561999999991,47.979155999999989],[-69.429169000000002,47.995270000000119],[-69.418335000000013,48.001389000000131],[-69.411666999999966,48.003326000000015],[-69.275283999999942,48.067772000000048],[-69.11610399999995,48.178604000000064],[-69.101943999999946,48.192764000000125],[-69.08666999999997,48.204994000000056],[-69.054168999999888,48.228600000000142],[-69.016402999999968,48.254165999999998],[-68.968613000000005,48.279990999999995],[-68.940552000000025,48.294998000000021],[-68.831679999999892,48.344711000000132],[-68.695267000000001,48.396385000000123],[-68.541381999999999,48.451385000000016],[-68.529448999999943,48.457214000000022],[-68.519164999999987,48.464157],[-68.513061999999877,48.469437000000084],[-68.496947999999918,48.490273000000116],[-68.473891999999978,48.515549000000135],[-68.469161999999869,48.520271000000037],[-68.453613000000018,48.532494000000099],[-68.434433000000013,48.541663999999969],[-68.422501000000011,48.545272999999952],[-68.407776000000013,48.548050000000046],[-68.375823999999852,48.546386999999925],[-68.368606999999997,48.547493000000145],[-68.354445999999996,48.551384000000041],[-68.348342999999886,48.554161000000136],[-68.336670000000026,48.561661000000015],[-68.283324999999991,48.600273000000016],[-68.236937999999952,48.625549000000035],[-68.211120999999935,48.636658000000125],[-68.193328999999892,48.643051000000071],[-68.179168999999945,48.646660000000111],[-68.15695199999999,48.64916199999999],[-68.125548999999978,48.648330999999985],[-68.111938000000009,48.651382000000012],[-67.973617999999988,48.695541000000105],[-67.709441999999854,48.793884000000105],[-67.531386999999995,48.859160999999972],[-67.209732000000031,48.935822000000087],[-67.087783999999999,48.960823000000119],[-67.067504999999983,48.966933999999981],[-67.015838999999971,48.986938000000123],[-66.991669000000002,48.999160999999958],[-66.960830999999985,49.011940000000038],[-66.922775000000001,49.026657000000057],[-66.916397000000018,49.028877000000023],[-66.722503999999958,49.08998900000006],[-66.421660999999915,49.162765999999976],[-66.306106999999997,49.186935000000119],[-66.225005999999951,49.200829000000056],[-66.089172000000019,49.218597000000045],[-66.074172999999973,49.219711000000018],[-65.832503999999915,49.231377000000009],[-65.678328999999962,49.245543999999995],[-65.496947999999975,49.261664999999994],[-65.447219999999959,49.262215000000026],[-65.394454999999994,49.259719999999959],[-65.359726000000023,49.256660000000124],[-64.996947999999918,49.220267999999919],[-64.916655999999989,49.20665699999995],[-64.825561999999934,49.187767000000008],[-64.805831999999953,49.18332700000002],[-64.795273000000009,49.176102000000128],[-64.791945999999939,49.171661000000029],[-64.774718999999948,49.159987999999998],[-64.763335999999924,49.154160000000047],[-64.748885999999914,49.148048000000074],[-64.731948999999986,49.142220000000009],[-64.660827999999867,49.123047000000042],[-64.641112999999962,49.118880999999988],[-64.606658999999922,49.117210000000114],[-64.58805799999999,49.112212999999997],[-64.376388999999961,48.997771999999998],[-64.235549999999989,48.910271000000023],[-64.221663999999976,48.898331000000098],[-64.21444699999995,48.889434999999992],[-64.208892999999989,48.880547000000035],[-64.152221999999938,48.764999000000046],[-64.152495999999985,48.759995000000117],[-64.158050999999944,48.75610400000005],[-64.167769999999962,48.758331000000055],[-64.208892999999989,48.782767999999976],[-64.213332999999977,48.786659000000043],[-64.229995999999971,48.797493000000088],[-64.244155999999975,48.803604000000007],[-64.290282999999931,48.821106000000043],[-64.298889000000031,48.823883000000137],[-64.315552000000025,48.828880000000026],[-64.377212999999927,48.846382000000062],[-64.395844000000011,48.851105000000075],[-64.512222000000008,48.87471000000005],[-64.530562999999916,48.87721300000004],[-64.548888999999917,48.878326000000072],[-64.543335000000013,48.873604],[-64.532775999999956,48.866936000000067],[-64.464447000000007,48.824440000000038],[-64.374161000000015,48.787773000000016],[-64.266662999999994,48.713326000000109],[-64.256957999999997,48.706099999999992],[-64.173049999999932,48.639435000000049],[-64.16194200000001,48.627487000000031],[-64.160004000000015,48.622765000000129],[-64.166945999999996,48.621376000000112],[-64.193053999999961,48.623604000000057],[-64.24110399999995,48.622215000000097],[-64.255004999999926,48.618599000000017],[-64.260833999999875,48.615828999999962],[-64.265288999999996,48.610825000000034],[-64.269729999999981,48.604713000000061],[-64.274718999999948,48.592766000000097],[-64.280563000000029,48.575271999999984],[-64.282500999999911,48.569160000000011],[-64.283324999999877,48.563605999999993],[-64.279174999999952,48.554161000000136],[-64.273330999999928,48.550545000000056],[-64.264174999999909,48.549164000000019],[-64.245834000000002,48.546661000000086],[-64.219161999999983,48.528327999999988],[-64.246384000000035,48.488044999999943],[-64.322509999999852,48.437210000000107],[-64.426392000000021,48.404160000000047],[-64.493057000000022,48.394440000000145],[-64.506667999999991,48.391663000000051],[-64.586945000000014,48.36832400000003],[-64.68638599999997,48.338326000000109],[-64.731383999999878,48.274712000000022],[-64.750290000000007,48.245827000000133],[-64.753890999999953,48.239989999999977],[-64.760559000000001,48.227211000000125],[-64.768065999999976,48.202774000000034],[-64.771392999999989,48.196381000000088],[-64.778610000000015,48.19499200000007],[-64.87332200000003,48.180550000000096],[-64.931670999999994,48.171661000000029],[-64.972503999999958,48.135269000000051],[-65.15306099999998,48.052216000000044],[-65.196654999999964,48.033607000000075],[-65.202788999999996,48.031380000000013],[-65.270003999999972,48.012771999999984],[-65.305832000000009,48.005554000000132],[-65.326950000000011,48.002220000000136],[-65.455565999999976,48.000274999999988],[-65.463897999999972,48.002777000000037],[-65.472778000000005,48.011383000000137],[-65.478607000000011,48.019714000000079],[-65.484726000000023,48.033882000000119],[-65.491104000000007,48.042496000000142],[-65.504181000000017,48.048882000000049],[-65.689162999999951,48.093879999999956],[-65.764449999999897,48.109993000000031],[-65.888900999999919,48.199158000000011],[-65.904175000000009,48.205826000000002],[-65.949996999999939,48.191101000000003],[-65.956389999999999,48.188881000000038],[-66.006957999999997,48.159156999999993],[-66.024718999999948,48.139160000000118],[-66.129714999999919,48.107216000000108],[-66.242767000000015,48.109161000000086],[-66.396392999999932,48.114998000000071],[-66.406386999999938,48.116385999999977],[-66.432495000000017,48.118599000000131],[-66.47084000000001,48.119438000000059],[-66.477782999999988,48.118049999999982],[-66.484160999999972,48.115546999999992],[-66.495543999999995,48.10943600000013],[-66.506392999999946,48.102218999999991],[-66.52555799999999,48.085548000000017],[-66.529998999999918,48.080551000000071],[-66.667220999999984,48.028328000000101],[-66.673614999999984,48.026099999999985],[-66.763717999999983,48.00622599999997],[-66.843703999999946,47.996650999999986],[-66.842498999999975,47.992218000000037],[-66.83666999999997,47.988884000000041],[-66.828888000000006,47.98721299999994],[-66.749999999999943,47.979988000000105],[-66.728881999999942,47.984436000000073],[-66.610824999999977,48.011107999999979],[-66.584731999999974,48.019440000000145],[-66.573333999999988,48.025826000000052],[-66.540558000000033,48.036385000000109],[-66.434433000000013,48.067497000000003],[-66.420273000000009,48.070549000000085],[-66.364165999999955,48.073326000000009],[-66.356658999999922,48.073326000000009],[-66.350829999999917,48.069717000000026],[-66.349990999999932,48.06471300000004],[-66.259170999999981,47.999435000000119],[-66.042220999999984,47.935822000000087],[-65.988892000000021,47.923881999999992],[-65.970276000000013,47.92083000000008],[-65.936935000000005,47.92083000000008],[-65.922225999999966,47.922768000000019],[-65.90695199999999,47.923325000000091],[-65.880279999999914,47.920547000000113],[-65.843886999999995,47.911377000000073],[-65.818619000000012,47.903877000000023],[-65.811385999999914,47.900825999999995],[-65.793609999999944,47.890831000000048],[-65.772780999999952,47.876380999999924],[-65.757506999999976,47.865273000000116],[-65.746383999999978,47.852775999999949],[-65.725005999999894,47.82749199999995],[-65.718613000000005,47.818886000000077],[-65.714447000000007,47.809433000000013],[-65.713622999999984,47.804161000000079],[-65.696944999999971,47.733047000000113],[-65.671936000000017,47.645828000000051],[-65.667770000000019,47.641380000000083],[-65.634734999999978,47.62082700000002],[-65.628326000000015,47.623046999999985],[-65.389998999999989,47.736107000000004],[-65.332779000000016,47.766937000000041],[-65.253890999999953,47.801659000000029],[-65.240829000000019,47.806655999999975],[-65.202788999999996,47.818603999999993],[-65.167496000000028,47.825271999999984],[-65.044723999999974,47.844436999999914],[-65.020844000000011,47.844993999999986],[-64.985000999999954,47.84137700000008],[-64.815552000000025,47.811104000000114],[-64.805557000000022,47.808884000000091],[-64.797226000000023,47.806381000000101],[-64.719161999999983,47.764441999999974],[-64.713332999999977,47.761108000000036],[-64.676665999999955,47.735550000000103],[-64.670273000000009,47.726936000000023],[-64.67332499999992,47.720268000000033],[-64.679442999999992,47.716659999999933],[-64.703612999999905,47.706940000000031],[-64.803328999999962,47.630547000000092],[-64.859725999999966,47.576660000000118],[-64.870093999999995,47.536293000000057],[-64.87110899999999,47.515831000000048],[-64.870270000000005,47.510826000000009],[-64.875548999999978,47.460823000000062],[-64.880828999999949,47.432495000000074],[-64.886397999999986,47.414154000000053],[-64.910004000000015,47.353049999999996],[-65.138061999999991,47.192215000000033],[-65.226944000000003,47.140831000000048],[-65.238327000000027,47.134720000000129],[-65.263335999999924,47.124435000000005],[-65.339721999999938,47.099433999999974],[-65.364165999999955,47.089714000000072],[-65.369994999999903,47.086655000000121],[-65.365279999999871,47.082771000000093],[-65.218886999999881,47.053604000000007],[-65.101105000000018,47.076942000000088],[-65.017226999999934,47.091377000000023],[-64.805557000000022,47.083054000000061],[-64.798614999999927,47.079993999999999],[-64.802779999999927,46.993049999999926],[-64.803328999999962,46.987495000000024],[-64.807220000000029,46.981658999999979],[-64.812209999999993,46.977768000000083],[-64.818068999999923,46.9741590000001],[-64.835830999999985,46.965827999999988],[-64.857223999999974,46.95277399999992],[-64.871933000000013,46.939430000000016],[-64.880279999999914,46.930549999999982],[-64.892226999999991,46.91443600000008],[-64.896117999999944,46.908882000000062],[-64.89916999999997,46.902489000000116],[-64.904998999999975,46.883606000000043],[-64.906386999999995,46.872490000000084],[-64.904998999999975,46.851105000000132],[-64.903609999999901,46.840827999999931],[-64.877212999999983,46.791107000000068],[-64.863891999999964,46.774436999999921],[-64.818068999999923,46.72165700000005],[-64.748610999999983,46.702773999999977],[-64.740279999999984,46.70249200000012],[-64.726394999999911,46.696381000000031],[-64.72084000000001,46.693047000000035],[-64.713332999999977,46.684158000000139],[-64.711120999999991,46.679993000000138],[-64.708617999999944,46.669991000000039],[-64.705001999999979,46.638329000000056],[-64.67332499999992,46.500832000000003],[-64.66194200000001,46.468048000000124],[-64.650833000000034,46.460548000000074],[-64.621933000000013,46.427216000000101],[-64.613616999999977,46.414435999999966],[-64.611938000000009,46.409714000000065],[-64.615004999999996,46.392494000000113],[-64.613051999999982,46.366104000000064],[-64.504181000000017,46.240273000000002],[-64.402221999999995,46.233047000000056],[-64.237503000000004,46.229155999999989],[-64.116942999999935,46.181938000000059],[-64.035552999999993,46.182213000000104],[-63.970832999999914,46.180549999999982],[-63.954444999999964,46.178046999999992],[-63.830283999999949,46.146385000000066],[-63.822226999999998,46.14388299999996],[-63.776389999999935,46.121101000000067],[-63.77305599999994,46.117493000000138],[-63.771111000000019,46.112769999999955],[-63.772498999999868,46.108046999999999],[-63.776947000000007,46.103325000000098],[-63.783057999999983,46.099716000000058],[-63.799445999999989,46.091377000000023],[-63.805557000000022,46.089157000000057],[-63.886391000000003,46.06082200000003],[-63.892501999999922,46.058884000000091],[-63.919448999999929,46.053047000000106],[-63.926948999999922,46.052490000000034],[-63.988608999999997,46.051933000000133],[-64.023330999999985,46.057495000000074],[-64.06806899999998,46.059433000000013],[-64.072509999999966,46.054710000000057],[-64.093886999999995,46.021659999999997],[-64.065001999999879,46.004715000000033],[-64.042785999999978,45.991898000000049],[-64.012512000000015,46.005829000000006],[-64.005279999999914,46.005554000000018],[-63.913054999999986,45.979987999999935],[-63.864166000000012,45.961105000000032],[-63.859443999999996,45.951934999999992],[-63.861389000000031,45.94582400000013],[-63.846106999999961,45.930824000000143],[-63.714721999999995,45.840546000000074],[-63.669998000000021,45.818054000000018],[-63.664161999999976,45.815268999999944],[-63.645836000000031,45.833328000000051],[-63.631667999999991,45.859436000000017],[-63.600280999999995,45.869986999999924],[-63.580558999999937,45.874435000000119],[-63.482498000000021,45.877213000000097],[-63.474441999999954,45.876938000000052],[-63.457221999999888,45.874160999999958],[-63.420279999999934,45.864997999999957],[-63.406661999999926,45.858887000000095],[-63.403884999999946,45.854439000000127],[-63.42861199999993,45.823607999999979],[-63.434440999999936,45.820831000000112],[-63.441108999999926,45.819442999999978],[-63.456107999999972,45.818886000000077],[-63.488051999999925,45.820831000000112],[-63.513335999999981,45.82416500000005],[-63.520835999999974,45.823883000000023],[-63.525832999999977,45.819992000000127],[-63.52666499999998,45.814438000000109],[-63.523612999999898,45.809989999999971],[-63.515556000000004,45.807213000000047],[-63.506950000000018,45.805824000000086],[-63.433608999999933,45.799438000000009],[-63.425560000000019,45.799164000000076],[-63.34332999999998,45.797492999999974],[-63.328338999999971,45.79833200000013],[-63.287223999999981,45.805549999999982],[-63.281113000000005,45.807769999999948],[-63.274170000000026,45.808883999999978],[-63.251113999999973,45.809714999999983],[-63.235000999999954,45.80860100000001],[-63.229439000000013,45.804993000000081],[-63.233329999999967,45.799438000000009],[-63.238892000000021,45.796386999999982],[-63.313889000000017,45.769440000000031],[-63.319725000000005,45.768051000000071],[-63.355835000000013,45.764442000000031],[-63.372222999999906,45.76638800000012],[-63.379997000000003,45.766106000000036],[-63.381942999999978,45.759995000000004],[-63.376663000000008,45.755829000000062],[-63.361114999999984,45.745543999999938],[-63.354445999999939,45.742493000000138],[-63.31361400000003,45.736938000000066],[-63.282501000000025,45.733330000000137],[-63.189719999999966,45.73443600000013],[-63.120833999999945,45.759438000000102],[-63.090552999999943,45.790276000000063],[-63.082779000000016,45.80332199999998],[-62.993888999999967,45.796386999999982],[-62.985275000000001,45.794998000000135],[-62.958336000000031,45.788887000000045],[-62.723610000000008,45.764160000000004],[-62.677779999999984,45.764160000000004],[-62.557220000000029,45.674713000000111],[-62.503890999999953,45.627487000000087],[-62.461944999999957,45.612495000000081],[-62.250281999999913,45.708327999999995],[-62.092772999999966,45.781105000000139],[-62.035003999999958,45.820831000000112],[-62.015006999999912,45.836655000000007],[-61.973327999999981,45.867210000000057],[-61.931388999999967,45.884720000000016],[-61.925559999999962,45.886107999999922],[-61.917503000000011,45.885551000000021],[-61.903052999999886,45.87943300000012],[-61.89805599999994,45.875267000000008],[-61.896110999999962,45.871101000000124],[-61.89805599999994,45.865273000000002],[-61.903327999999988,45.861382000000106],[-61.914718999999934,45.8555530000001],[-61.919448999999986,45.851105000000132],[-61.923332000000016,45.845543000000021],[-61.925559999999962,45.839432000000102],[-61.925277999999992,45.834434999999985],[-61.889998999999989,45.701385000000016],[-61.885558999999887,45.690544000000102],[-61.88138600000002,45.686653000000035],[-61.792228999999907,45.639160000000118],[-61.783332999999971,45.636658000000011],[-61.735000999999897,45.623322000000087],[-61.724998000000028,45.62082700000002],[-61.618056999999965,45.610550000000046],[-61.603888999999924,45.635269000000051],[-61.569999999999936,45.669991000000039],[-61.565001999999936,45.673882000000106],[-61.559165999999948,45.676659000000029],[-61.546111999999994,45.681106999999997],[-61.526107999999965,45.685265000000129],[-61.504447999999968,45.686935000000062],[-61.488892000000021,45.686935000000062],[-61.471382000000006,45.682495000000074],[-61.466110000000015,45.678878999999995],[-61.396392999999932,45.626656000000082],[-61.386947999999961,45.618880999999988],[-61.353427999999951,45.56971400000009],[-61.316146999999944,45.533173000000033],[-61.260001999999929,45.510277000000087],[-61.232356999999979,45.46119299999998],[-61.294167000000016,45.434714999999926],[-61.36500499999994,45.404160000000104],[-61.368057000000022,45.413879000000122],[-61.374717999999973,45.416938999999957],[-61.388610999999912,45.41415400000011],[-61.400832999999977,45.410820000000115],[-61.413329999999974,45.406937000000028],[-61.462219000000005,45.384438000000046],[-61.477492999999924,45.373047000000099],[-61.481666999999959,45.367767000000015],[-61.478881999999999,45.363327000000027],[-61.463889999999992,45.346939000000134],[-61.457222000000002,45.343605000000139],[-61.226386999999932,45.344154000000117],[-61.153327999999874,45.348327999999981],[-61.139441999999974,45.348877000000073],[-61.131667999999991,45.348327999999981],[-61.047225999999966,45.335548000000017],[-60.996391000000017,45.32749200000012],[-60.980552999999986,45.324440000000038],[-60.970551,45.321663000000115],[-60.966110000000015,45.318329000000119],[-60.964721999999995,45.313049000000035],[-60.96527900000001,45.295546999999999],[-60.970276000000013,45.269714000000079],[-61.050834999999893,45.231102000000078],[-61.0777819999999,45.219437000000028],[-61.090278999999953,45.215546000000131],[-61.109726000000023,45.210823000000119],[-61.123329000000012,45.208602999999925],[-61.139724999999942,45.210823000000119],[-61.142226999999991,45.215271000000087],[-61.222220999999934,45.23832700000014],[-61.267501999999979,45.246384000000091],[-61.313056999999901,45.242766999999958],[-61.323890999999946,45.236107000000118],[-61.360000999999954,45.209991000000059],[-61.373610999999926,45.196380999999974],[-61.373328999999956,45.191101000000117],[-61.365554999999972,45.188324000000023],[-61.349723999999981,45.186935000000005],[-61.340836000000024,45.184433000000126],[-61.344161999999869,45.178047000000049],[-61.34944200000001,45.174438000000009],[-61.355002999999954,45.171660999999915],[-61.384445000000028,45.15915700000005],[-61.397498999999982,45.156097000000045],[-61.450835999999924,45.145546000000081],[-61.458611000000019,45.144714000000022],[-61.543891999999971,45.141662999999994],[-61.638053999999954,45.120270000000062],[-61.724715999999944,45.091660000000047],[-61.898338000000024,45.024993999999992],[-62.026664999999923,44.984717999999987],[-62.087775999999963,44.97026800000009],[-62.286391999999921,44.928047000000049],[-62.391944999999964,44.908325000000048],[-62.476386999999875,44.895546000000138],[-62.521942000000024,44.850829999999974],[-62.546111999999937,44.821663000000001],[-62.641388000000006,44.809158000000082],[-62.795005999999887,44.780548000000067],[-62.801108999999997,44.778603000000089],[-62.813888999999961,44.750832000000003],[-62.809998000000007,44.734718000000044],[-62.851111999999944,44.718323000000112],[-62.928611999999873,44.733879000000115],[-63.012779000000023,44.773323000000005],[-63.020554000000004,44.773880000000077],[-63.055557000000022,44.772766000000104],[-63.0625,44.771378000000027],[-63.061942999999928,44.76638800000012],[-63.060279999999977,44.761664999999994],[-63.057502999999997,44.757217000000026],[-63.043616999999927,44.739989999999977],[-63.017776000000026,44.722488000000112],[-63.012504999999919,44.713326000000052],[-63.011948000000018,44.708046000000138],[-63.013618000000008,44.702774000000034],[-63.018332999999927,44.697487000000081],[-63.048339999999996,44.676102000000128],[-63.05471799999998,44.673325000000034],[-63.104445999999996,44.746658000000139],[-63.115279999999871,44.731377000000009],[-63.118331999999953,44.724991000000102],[-63.138335999999981,44.693047000000092],[-63.142776000000026,44.688599000000124],[-63.283057999999926,44.627212999999983],[-63.439994999999954,44.590828000000045],[-63.448883000000023,44.593048000000067],[-63.49500299999994,44.614715999999987],[-63.526336999999955,44.63610099999994],[-63.535167999999999,44.642769000000101],[-63.545334000000025,44.652107000000058],[-63.556999000000019,44.66160600000012],[-63.615836999999942,44.70249199999995],[-63.635001999999986,44.711380000000133],[-63.642775999999913,44.714157000000057],[-63.651107999999965,44.715546000000018],[-63.658332999999971,44.714995999999985],[-63.660552999999936,44.708328000000051],[-63.649444999999957,44.686104000000114],[-63.640556000000004,44.673050000000046],[-63.635559000000001,44.668884000000105],[-63.627776999999924,44.666382000000056],[-63.606110000000001,44.668884000000105],[-63.598610000000008,44.667770000000132],[-63.591942000000017,44.664711000000011],[-63.583611000000019,44.656936999999971],[-63.564223999999911,44.620769999999993],[-63.558220000000006,44.613266000000124],[-63.555388999999934,44.607769000000019],[-63.546059000000014,44.588604000000032],[-63.520835999999974,44.512771999999984],[-63.520279000000016,44.507773999999984],[-63.525276000000019,44.495270000000119],[-63.533332999999971,44.484993000000145],[-63.542777999999942,44.476379000000065],[-63.553054999999915,44.469711000000075],[-63.570838999999921,44.461937000000091],[-63.631110999999919,44.435822000000087],[-63.638610999999912,44.436935000000005],[-63.90694400000001,44.495270000000119],[-63.913611999999887,44.498604000000114],[-63.924171000000001,44.506103999999993],[-63.932502999999997,44.513329000000056],[-63.935555000000022,44.517494000000056],[-63.94388600000002,44.536110000000065],[-63.938605999999936,44.616104000000064],[-63.937774999999931,44.621658000000082],[-63.928054999999858,44.642220000000009],[-63.919166999999959,44.651657000000114],[-63.914443999999889,44.65554800000001],[-63.908607000000018,44.678047000000106],[-64.008347000000015,44.647491000000002],[-64.045272999999952,44.635826000000122],[-64.055266999999958,44.619438000000059],[-64.065551999999911,44.595268000000033],[-64.063888999999961,44.590545999999961],[-64.059158000000025,44.581665000000044],[-64.054992999999968,44.577773999999977],[-64.039443999999946,44.572495000000004],[-64.033614999999941,44.563049000000035],[-64.009170999999981,44.513329000000056],[-64.010009999999966,44.507773999999984],[-64.083069000000023,44.466660000000047],[-64.091949,44.46888000000007],[-64.110549999999989,44.478324999999984],[-64.121657999999968,44.485268000000133],[-64.125548999999978,44.510551000000021],[-64.123610999999926,44.527489000000116],[-64.119720000000029,44.53943600000008],[-64.121657999999968,44.544159000000093],[-64.127486999999917,44.552773000000116],[-64.135833999999988,44.560546999999929],[-64.146118000000001,44.568329000000062],[-64.170273000000009,44.586105000000032],[-64.200835999999981,44.576384999999959],[-64.305267000000015,44.533332999999971],[-64.337509000000011,44.411933999999974],[-64.346664000000033,44.362495000000138],[-64.346114999999998,44.357215999999994],[-64.329726999999934,44.328880000000026],[-64.311110999999926,44.319159999999954],[-64.303328999999962,44.316666000000055],[-64.295273000000009,44.316101000000003],[-64.290557999999976,44.31999200000007],[-64.292220999999984,44.324715000000026],[-64.299987999999928,44.32749200000012],[-64.305557000000022,44.330826000000116],[-64.309433000000013,44.335548000000017],[-64.307770000000005,44.340828000000101],[-64.301102000000014,44.341933999999924],[-64.273620999999878,44.330276000000083],[-64.260558999999944,44.324164999999994],[-64.239440999999943,44.294158999999922],[-64.253341999999918,44.27526899999998],[-64.258056999999951,44.269989000000123],[-64.283324999999877,44.253052000000082],[-64.319457999999997,44.264717000000019],[-64.355835000000013,44.273323000000119],[-64.391113000000018,44.253326000000015],[-64.428054999999915,44.228325000000041],[-64.432220000000029,44.223602000000028],[-64.444716999999912,44.190269000000001],[-64.616394000000014,44.133049000000142],[-64.61860699999994,44.071937999999989],[-64.666397000000018,43.990273000000116],[-64.671386999999982,43.986382000000049],[-64.732223999999917,43.951660000000004],[-64.738051999999925,43.949432000000058],[-64.745269999999948,43.948874999999987],[-64.776397999999972,43.950828999999999],[-64.80610699999994,43.950546000000031],[-64.812774999999931,43.949432000000058],[-64.818068999999923,43.946381000000031],[-64.832229999999925,43.926102000000128],[-64.881103999999993,43.838882000000126],[-64.906386999999995,43.800544999999943],[-65.030562999999972,43.704163000000051],[-65.066665999999941,43.696381000000088],[-65.242217999999923,43.679161000000136],[-65.325835999999867,43.674995000000024],[-65.375274999999874,43.575272000000098],[-65.449158000000011,43.55971500000004],[-65.453338999999971,43.554993000000138],[-65.475829999999974,43.505829000000006],[-65.481383999999991,43.464439000000027],[-65.496947999999975,43.490829000000019],[-65.548049999999932,43.556099000000017],[-65.559433000000013,43.568054000000075],[-65.568618999999956,43.570274000000097],[-65.575561999999991,43.569717000000026],[-65.584732000000031,43.560271999999941],[-65.591385000000002,43.549721000000034],[-65.603881999999999,43.534721000000104],[-65.612212999999997,43.526099999999985],[-65.617492999999968,43.523604999999975],[-65.646118000000001,43.511940000000038],[-65.67332499999992,43.506103999999993],[-65.712783999999999,43.498604000000114],[-65.720550999999944,43.499161000000015],[-65.72582999999986,43.50249500000001],[-65.777221999999995,43.562492000000134],[-65.783324999999934,43.571106000000043],[-65.783889999999985,43.576385000000016],[-65.781951999999933,43.587769000000094],[-65.778885000000002,43.599998000000085],[-65.773055999999997,43.612770000000125],[-65.771117999999944,43.624435000000005],[-65.769454999999937,43.64138000000014],[-65.768065999999919,43.658043000000021],[-65.768340999999964,43.668883999999991],[-65.769729999999868,43.679161000000136],[-65.77555799999999,43.688324000000136],[-65.868880999999988,43.786385000000053],[-65.907775999999956,43.821663000000058],[-65.912215999999887,43.825272000000041],[-65.918610000000001,43.828331000000048],[-65.932770000000005,43.827217000000019],[-65.938888999999961,43.824997000000053],[-65.942490000000021,43.819443000000035],[-65.956115999999895,43.776100000000099],[-65.968886999999995,43.719436999999971],[-65.971663999999976,43.71276899999998],[-65.975006000000008,43.707214000000079],[-65.983063000000016,43.697768999999994],[-66.013335999999867,43.691658000000132],[-66.020553999999947,43.69110100000006],[-66.029449,43.731659000000093],[-66.030562999999972,43.736107000000061],[-66.033614999999998,43.740273000000002],[-66.042220999999984,43.748046999999985],[-66.080841000000021,43.768051000000071],[-66.088607999999965,43.768326000000116],[-66.09445199999999,43.766106000000093],[-66.107772999999952,43.753326000000129],[-66.121658000000025,43.762215000000026],[-66.135559000000001,43.78943600000008],[-66.166945999999939,43.858603999999957],[-66.168059999999912,43.863051999999925],[-66.168059999999912,43.895546000000024],[-66.167495999999971,43.901382000000069],[-66.165832999999964,43.907211000000075],[-66.151947000000007,43.919159000000093],[-66.150283999999942,43.925270000000012],[-66.149993999999936,43.93082400000003],[-66.14916999999997,44.001106000000107],[-66.14973399999991,44.011108000000036],[-66.181945999999925,44.067497000000117],[-66.204453000000001,44.086655000000007],[-66.190552000000025,44.150543000000027],[-66.187774999999931,44.161934000000031],[-66.118606999999997,44.338043000000027],[-66.093886999999881,44.367493000000138],[-66.089995999999985,44.371658000000139],[-66.037505999999951,44.423325000000091],[-65.976943999999946,44.477485999999999],[-65.967223999999987,44.486107000000118],[-65.95666499999993,44.491661000000079],[-65.950286999999946,44.493050000000096],[-65.944442999999978,44.489716000000101],[-65.938048999999921,44.491104000000007],[-65.865828999999962,44.538886999999988],[-65.841674999999952,44.568604000000107],[-65.841384999999946,44.574164999999994],[-65.844451999999876,44.578331000000048],[-65.848891999999978,44.582213999999965],[-65.855270000000019,44.585823000000005],[-65.862777999999878,44.586936999999978],[-65.931106999999997,44.582213999999965],[-65.943053999999961,44.577773999999977],[-65.958617999999944,44.567497000000003],[-66.004456000000005,44.535827999999981],[-66.03472899999997,44.514717000000132],[-66.12332200000003,44.448875000000044],[-66.177779999999927,44.396660000000054],[-66.185821999999973,44.387214999999969],[-66.190552000000025,44.383330999999998],[-66.197220000000016,44.386108000000036],[-66.198607999999979,44.412766000000033],[-66.191100999999946,44.423325000000091],[-66.103058000000033,44.500000000000114],[-66.068068999999923,44.524994000000106],[-65.971663999999976,44.591934000000094],[-65.820220999999947,44.654434000000037],[-65.816726999999958,44.655768999999964],[-65.808722999999929,44.651936000000092],[-65.802895000000035,44.644604000000072],[-65.796394000000021,44.624268000000029],[-65.796897999999942,44.617603000000145],[-65.797897000000034,44.613937000000021],[-65.756957999999941,44.615273000000059],[-65.756393000000003,44.609993000000031],[-65.753066999999987,44.60582700000009],[-65.745270000000005,44.605552999999986],[-65.697220000000016,44.612495000000081],[-65.690276999999924,44.614440999999999],[-65.68499799999995,44.61693600000001],[-65.625274999999988,44.658882000000006],[-65.522507000000019,44.737769999999955],[-65.548614999999984,44.733879000000115],[-65.682616999999937,44.693156999999928],[-65.686278999999956,44.691825999999935],[-65.690276999999924,44.691162000000077],[-65.695441999999957,44.691825999999935],[-65.704116999999997,44.69499200000007],[-65.706116000000009,44.697654999999997],[-65.707114999999988,44.700489000000005],[-65.707450999999992,44.703487000000052],[-65.705947999999978,44.707489000000066],[-65.700942999999938,44.713157999999964],[-65.697937000000024,44.71549200000004],[-65.717772999999966,44.721931000000041],[-65.658339999999953,44.758605999999986],[-65.646956999999929,44.765273999999977],[-65.299987999999928,44.928329000000133],[-65.202498999999989,44.973877000000073],[-65.114166000000012,45.011665000000107],[-64.934158000000025,45.100273000000016],[-64.918059999999912,45.111107000000061],[-64.879439999999988,45.130820999999969],[-64.861938000000009,45.139717000000076],[-64.814712999999983,45.158043000000077],[-64.808608999999933,45.16027100000008],[-64.777221999999995,45.169990999999982],[-64.744995000000017,45.178329000000076],[-64.710830999999985,45.183876000000055],[-64.590285999999935,45.208046000000024],[-64.550551999999925,45.216660000000104],[-64.468886999999938,45.242766999999958],[-64.451400999999976,45.249435000000119],[-64.434432999999899,45.25750000000005],[-64.417770000000019,45.266663000000051],[-64.397506999999962,45.281105000000025],[-64.393889999999999,45.28694200000001],[-64.391952999999944,45.292770000000132],[-64.391113000000018,45.298332000000073],[-64.393065999999862,45.303322000000094],[-64.401671999999962,45.311104000000057],[-64.406951999999933,45.314438000000052],[-64.413895000000025,45.317497000000003],[-64.430832000000009,45.322220000000016],[-64.454726999999934,45.323608000000092],[-64.462218999999948,45.323051000000021],[-64.470839999999953,45.324440000000038],[-64.488051999999982,45.329162999999994],[-64.494719999999973,45.332214000000022],[-64.489165999999955,45.335266000000104],[-64.465835999999911,45.334717000000012],[-64.440552000000025,45.331665000000044],[-64.353057999999919,45.316101000000003],[-64.338333000000034,45.310271999999941],[-64.327498999999989,45.303322000000094],[-64.321395999999936,45.294715999999994],[-64.317779999999914,45.285271000000137],[-64.317229999999881,45.280273000000136],[-64.317779999999914,45.274437000000034],[-64.321944999999914,45.269714000000079],[-64.327498999999989,45.266936999999984],[-64.343062999999972,45.256103999999993],[-64.353333000000021,45.239159000000029],[-64.385833999999932,45.145546000000081],[-64.380279999999857,45.131104000000107],[-64.363891999999964,45.101386999999988],[-64.359725999999966,45.097487999999942],[-64.352218999999934,45.09804500000007],[-64.346953999999982,45.101105000000075],[-64.337219000000005,45.108604000000071],[-64.333892999999932,45.115272999999945],[-64.334441999999967,45.120270000000062],[-64.333327999999995,45.131660000000124],[-64.329178000000013,45.13638300000008],[-64.324387000000002,45.139343000000054],[-64.31138599999997,45.141380000000026],[-64.295836999999949,45.141380000000026],[-64.244155999999975,45.123877999999991],[-64.221114999999941,45.110549999999989],[-64.210280999999952,45.103607000000011],[-64.157226999999978,45.056938000000002],[-64.146956999999986,45.044441000000063],[-64.14555399999989,45.034720999999934],[-64.154449,44.98443600000013],[-64.156386999999938,44.978325000000041],[-64.116942999999935,45.009163000000058],[-64.114165999999955,45.046661000000029],[-64.121933000000013,45.058044000000052],[-64.136397999999929,45.074440000000038],[-64.141678000000013,45.078605999999979],[-64.162505999999894,45.092216000000008],[-64.188323999999909,45.104713000000004],[-64.192490000000021,45.108604000000071],[-64.198607999999865,45.11721],[-64.198882999999967,45.122490000000084],[-64.195830999999941,45.150543000000027],[-64.16361999999998,45.185265000000015],[-64.152785999999992,45.192764000000011],[-64.118331999999953,45.208885000000009],[-64.106110000000001,45.213326000000109],[-64.099990999999932,45.215271000000087],[-64.065826000000015,45.222214000000122],[-64.008057000000008,45.236381999999992],[-63.982215999999937,45.243049999999926],[-63.956664999999987,45.251388999999961],[-63.805831999999953,45.301933000000133],[-63.596107000000018,45.315544000000102],[-63.470832999999857,45.321663000000115],[-63.384170999999924,45.35083000000003],[-63.371940999999993,45.354996000000142],[-63.365554999999915,45.357773000000009],[-63.360832000000016,45.360824999999977],[-63.36860699999994,45.36360900000011],[-63.738892000000021,45.396660000000054],[-63.755561999999941,45.398048000000131],[-63.797226000000023,45.392768999999987],[-63.837775999999963,45.385551000000135],[-63.988051999999982,45.384438000000046],[-64.040558000000033,45.401100000000042],[-64.044998000000021,45.404434000000037],[-64.061110999999983,45.409714000000122],[-64.069732999999985,45.410271000000023],[-64.083618000000001,45.409430999999984],[-64.16332999999986,45.403877000000136],[-64.214721999999995,45.399719000000005],[-64.312774999999931,45.39138000000014],[-64.357772999999952,45.38110400000005],[-64.529998999999975,45.408043000000021],[-64.674164000000019,45.383049000000085],[-64.815825999999959,45.348602000000085],[-64.929442999999992,45.324440000000038],[-64.937209999999993,45.326942000000088],[-64.938048999999921,45.332214000000022],[-64.936661000000015,45.343323000000112],[-64.933318999999983,45.355553000000043],[-64.917769999999905,45.408599999999922],[-64.909163999999976,45.418052999999986],[-64.831389999999942,45.479155999999932],[-64.765563999999983,45.505554000000132],[-64.699157999999954,45.531104999999968],[-64.568893000000003,45.604163999999969],[-64.470550999999944,45.670273000000122],[-64.430282999999974,45.715546000000018],[-64.332229999999925,45.76888300000013],[-64.331680000000006,45.763611000000026],[-64.326110999999969,45.749435000000005],[-64.296660999999915,45.763328999999942],[-64.283066000000019,45.776656999999943],[-64.27555799999999,45.799995000000081],[-64.27305599999994,45.811661000000015],[-64.270003999999915,45.828880000000083],[-64.272933999999964,45.835754000000065],[-64.273620999999878,45.838599999999985],[-64.276671999999962,45.842766000000097],[-64.324722000000008,45.879990000000021],[-64.33277899999996,45.882767000000058],[-64.347778000000005,45.881934999999999],[-64.361388999999974,45.879158000000075],[-64.366942999999992,45.876380999999981],[-64.367766999999958,45.870544000000052],[-64.363327000000027,45.866661000000079],[-64.354720999999927,45.865547000000106],[-64.357498000000021,45.851105000000132],[-64.418059999999912,45.796104000000014],[-64.478332999999907,45.750549000000035],[-64.49722300000002,45.783882000000006],[-64.489990000000034,45.794998000000135],[-64.488051999999982,45.801102000000014],[-64.489165999999955,45.811378000000047],[-64.49221799999998,45.815543999999989],[-64.597335999999984,45.922104000000047],[-64.681945999999868,46.021659999999997],[-64.686935000000005,46.041382000000056],[-64.690551999999968,46.050827000000083],[-64.694991999999957,46.054710000000057],[-64.736937999999952,46.083878000000084],[-64.747498000000007,46.090546000000018],[-64.754456000000005,46.089157000000057],[-64.764450000000011,46.083054000000118],[-64.706389999999999,45.994713000000104],[-64.701949999999954,45.990829000000076],[-64.648009999999942,45.933047999999928],[-64.631171999999992,45.922718000000032],[-64.628998000000024,45.920383000000072],[-64.601180999999997,45.881550000000118],[-64.601180999999997,45.877384000000006],[-64.601340999999991,45.873881999999981],[-64.602844000000005,45.86721399999999],[-64.604507000000012,45.863552000000084],[-64.583069000000023,45.826942000000145],[-64.756392999999946,45.622489999999971],[-64.772506999999962,45.609993000000145],[-64.778335999999967,45.607216000000051],[-64.785827999999924,45.610275000000058],[-64.791381999999999,45.613609000000054],[-64.796660999999972,45.622489999999971],[-64.801665999999955,45.626381000000038],[-64.808334000000002,45.629715000000033],[-64.817229999999938,45.632492000000127],[-64.825287000000003,45.633331000000055],[-64.847504000000015,45.633331000000055],[-64.884445000000028,45.631660000000011],[-64.904175000000009,45.627769000000114],[-64.941375999999991,45.602218999999991],[-64.947219999999959,45.598045000000127],[-64.961945000000014,45.586105000000032],[-64.976395000000025,45.572494999999947],[-64.986663999999962,45.564437999999996],[-64.99722300000002,45.557213000000104],[-65.015015000000005,45.548882000000049],[-65.047501000000011,45.539161999999976],[-65.104445999999939,45.524994000000106],[-65.138335999999924,45.517769000000044],[-65.152221999999938,45.516106000000093],[-65.164444000000003,45.513054000000011],[-65.220551,45.493881000000101],[-65.326675000000023,45.457497000000046],[-65.339447000000007,45.452216999999962],[-65.368057000000022,45.437767000000065],[-65.394454999999994,45.419441000000063],[-65.421386999999925,45.402771000000087],[-65.53195199999999,45.342490999999995],[-65.883620999999948,45.209160000000054],[-65.889998999999989,45.207497000000103],[-65.903609999999958,45.205551000000014],[-65.910827999999981,45.205268999999987],[-65.918883999999935,45.206099999999992],[-65.98332199999993,45.219711000000132],[-65.989989999999977,45.223045000000127],[-66.09060699999992,45.295657999999946],[-66.092940999999939,45.297989000000086],[-66.094611999999984,45.300659000000053],[-66.091605999999956,45.303824999999961],[-66.083892999999932,45.34276600000004],[-66.078063999999927,45.345543000000077],[-66.05749499999996,45.348602000000085],[-66.045273000000009,45.353325000000041],[-66.029449,45.364158999999916],[-66.015288999999996,45.377769000000001],[-66.003066999999987,45.394997000000103],[-66.000838999999985,45.401100000000042],[-65.99722300000002,45.417770000000019],[-65.994445999999982,45.455550999999957],[-65.994445999999982,45.460823000000062],[-66.002501999999993,45.461662000000047],[-66.008346999999901,45.458885000000123],[-66.19027699999998,45.339432000000045],[-66.193329000000006,45.333603000000039],[-66.193329000000006,45.328331000000105],[-66.190552000000025,45.323883000000137],[-66.179169000000002,45.305823999999973],[-66.176102000000014,45.301933000000133],[-66.145279000000016,45.279160000000047],[-66.14166999999992,45.259769000000006],[-66.137000999999941,45.259270000000129],[-66.113997999999981,45.25877400000013],[-66.113509999999906,45.237770000000069],[-66.147232000000031,45.19221500000009],[-66.205565999999976,45.163878999999952],[-66.21665999999999,45.15915700000005],[-66.427779999999984,45.084991000000002],[-66.459732000000031,45.106102000000021],[-66.459732000000031,45.111382000000106],[-66.461120999999935,45.116104000000007],[-66.468063000000029,45.129714999999976],[-66.488891999999908,45.149994000000049],[-66.496384000000035,45.149719000000061],[-66.531386999999995,45.147217000000012],[-66.537505999999951,45.145271000000093],[-66.55999799999995,45.133330999999998],[-66.571395999999936,45.126656000000139],[-66.586120999999991,45.116936000000067],[-66.608046999999942,45.104164000000083],[-66.642226999999991,45.086380000000133],[-66.648055999999997,45.083603000000039],[-66.754729999999881,45.055550000000096],[-66.792496000000028,45.055267000000129],[-66.77694699999995,45.086380000000133],[-66.776107999999965,45.09137700000008],[-66.777785999999992,45.096100000000035],[-66.783065999999963,45.099716000000114],[-66.965560999999923,45.17943600000001],[-67.021941999999854,45.170273000000009],[-67.027221999999995,45.168052999999986],[-67.046386999999982,45.126938000000052],[-67.129439999999988,45.172217999999987],[-67.186934999999949,45.19221500000009],[-67.206542999999897,45.18303700000007],[-67.236114999999927,45.193877999999984],[-67.25306699999993,45.199432000000002],[-67.261123999999995,45.201103000000046],[-67.267775999999969,45.200546000000145],[-67.275009000000011,45.1988750000001],[-67.287215999999944,45.194153000000028],[-67.290557999999976,45.182770000000005],[-67.290282999999988,45.177489999999921],[-67.292220999999927,45.166100000000085],[-67.296386999999925,45.160820000000001],[-67.301391999999964,45.156937000000084],[-67.306655999999862,45.153320000000122],[-67.318893000000003,45.148605000000089],[-67.325561999999991,45.147491000000116],[-67.333069000000023,45.147491000000116],[-67.341948999999943,45.149994000000049],[-67.354172000000005,45.156097000000045],[-67.403884999999946,45.194435000000055],[-67.408050999999944,45.198325999999952],[-67.422500999999954,45.214996000000099],[-67.455275999999969,45.263054000000068],[-67.462783999999999,45.276099999999985],[-67.465011999999888,45.281105000000025],[-67.465285999999992,45.286385000000109],[-67.464172000000019,45.29193900000007],[-67.450561999999934,45.333054000000061],[-67.485001000000011,45.489159000000029],[-67.485275000000001,45.494438000000002],[-67.482772999999952,45.500274999999931],[-67.478881999999885,45.504439999999931],[-67.467772999999966,45.510826000000066],[-67.43638599999997,45.521378000000027],[-67.421936000000017,45.523323000000005],[-67.415832999999964,45.525269000000094],[-67.410827999999924,45.529990999999995],[-67.406951999999876,45.578049000000135],[-67.408889999999985,45.582214000000135],[-67.412505999999951,45.586936999999978],[-67.424163999999962,45.594711000000132],[-67.453888000000006,45.612495000000081],[-67.462219000000005,45.614715999999987],[-67.46945199999999,45.613051999999982],[-67.486114999999984,45.603607000000068],[-67.499999999999943,45.60166200000009],[-67.515015000000005,45.601105000000018],[-67.573897999999986,45.611664000000019],[-67.656661999999983,45.630546999999922],[-67.664443999999946,45.6336060000001],[-67.791107000000011,45.693047000000092],[-67.796660999999915,45.696098000000063],[-67.799164000000019,45.701102999999932],[-67.804442999999992,45.731377000000009],[-67.806380999999988,45.78472099999999],[-67.786666999999909,45.888329000000056],[-67.772507000000019,45.957496999999933],[-67.779174999999952,46.283332999999971],[-67.788894999999968,46.787773000000072],[-67.791671999999949,46.921379000000059],[-67.794998000000021,47.06999200000007],[-67.85972599999991,47.097488000000112],[-67.874161000000015,47.103607000000125],[-67.892226999999991,47.114440999999999],[-67.948607999999922,47.166382000000112],[-67.951400999999976,47.17083000000008],[-67.955841000000021,47.179993000000081],[-67.957229999999925,47.184989999999971],[-67.961944999999957,47.194153000000142],[-67.968886999999938,47.20277400000009],[-68.18582200000003,47.332771000000037],[-68.208617999999944,47.341660000000104],[-68.244995000000017,47.351936000000023],[-68.306655999999919,47.364440999999943],[-68.323059000000001,47.365829000000076],[-68.337219000000005,47.363609000000054],[-68.348891999999921,47.359992999999974],[-68.367766999999958,47.351105000000018],[-68.373046999999929,47.347214000000122],[-68.564712999999927,47.289719000000048],[-68.761948000000018,47.232764999999972],[-68.787505999999951,47.224709000000075],[-68.831679999999892,47.208884999999952],[-68.887786999999946,47.188042000000053],[-68.895279000000016,47.189987000000087],[-68.958618000000001,47.217209000000025],[-68.965285999999878,47.220543000000021],[-69.023894999999925,47.250274999999931],[-69.036117999999988,47.257217000000026],[-69.044998000000021,47.264442000000088],[-69.049164000000019,47.274437000000034],[-69.053054999999972,47.28943600000008],[-69.053588999999931,47.293777000000091],[-69.054992999999854,47.299438000000066],[-69.055266999999958,47.30471],[-69.056106999999997,47.336655000000064],[-69.055556999999965,47.347488000000055],[-69.052490000000034,47.380546999999979],[-69.049437999999952,47.392219999999952],[-69.045837000000006,47.398604999999975],[-69.043610000000001,47.404709000000025],[-69.039444000000003,47.416939000000127],[-69.038329999999974,47.422493000000088],[-69.039992999999981,47.427490000000034],[-69.048614999999984,47.435546999999985],[-69.055556999999965,47.438599000000124],[-69.123885999999914,47.458327999999995],[-69.132766999999944,47.459991000000116],[-69.232498000000021,47.471375000000023],[-69.239623999999992,47.464413000000093],[-69.305267000000015,47.40026899999998],[-69.423614999999984,47.283332999999971],[-69.653884999999946,47.055267000000129],[-69.712509000000011,46.996940999999993],[-69.84722899999997,46.862213000000111],[-69.992767000000015,46.715828000000045],[-70.009170999999867,46.698043999999982],[-70.026947000000007,46.587493999999992],[-70.038605000000018,46.509995000000004],[-70.044158999999922,46.474991000000102],[-70.047775000000001,46.453880000000083],[-70.050551999999982,46.438599000000124],[-70.06361400000003,46.424164000000019],[-70.068893000000003,46.419716000000051],[-70.075286999999946,46.417770000000132],[-70.081389999999999,46.417770000000132],[-70.088057999999876,46.414993000000038],[-70.119155999999975,46.393608000000086],[-70.200287000000003,46.336380000000077],[-70.242492999999911,46.279160000000047],[-70.287780999999939,46.203049000000135],[-70.305556999999908,46.078880000000083],[-70.3125,45.985825000000091],[-70.309722999999963,45.980820000000051],[-70.303329000000019,45.977767999999969],[-70.293883999999991,45.975548000000117],[-70.278335999999967,45.975266000000033],[-70.260559000000001,45.971374999999966],[-70.253615999999909,45.968323000000055],[-70.248336999999935,45.964714000000072],[-70.23971599999993,45.956657000000064],[-70.238051999999982,45.951934999999992],[-70.255004999999983,45.913048000000003],[-70.258895999999993,45.907493999999986],[-70.263335999999981,45.90277100000003],[-70.393889999999942,45.778046000000131],[-70.466659999999933,45.711937000000034],[-70.555267000000015,45.672768000000133],[-70.576949999999954,45.660820000000058],[-70.631942999999978,45.627769000000114],[-70.693054000000018,45.571938000000046],[-70.720276000000013,45.528328000000101],[-70.725280999999995,45.49971800000003],[-70.724715999999944,45.49471299999999],[-70.712783999999999,45.477768000000026],[-70.704726999999934,45.469154000000003],[-70.689437999999939,45.458046000000024],[-70.86860699999994,45.246101000000124],[-70.873046999999985,45.241379000000052],[-70.878600999999946,45.238601999999958],[-70.886123999999995,45.238045000000056],[-71.021118000000001,45.326660000000004],[-71.085128999999995,45.307708999999988],[-71.139998999999932,45.253052000000082],[-71.146392999999989,45.25249500000001],[-71.170272999999952,45.253883000000087],[-71.189163000000008,45.257773999999984],[-71.211669999999913,45.266105999999979],[-71.233063000000016,45.274993999999936],[-71.239715999999987,45.278046000000074],[-71.264449999999954,45.290833000000077],[-71.280562999999972,45.301933000000133],[-71.288604999999961,45.304436000000067],[-71.302779999999984,45.303047000000106],[-71.314712999999927,45.299438000000066],[-71.327498999999932,45.294441000000006],[-71.424438000000009,45.25],[-71.408614999999998,45.223045000000127],[-71.402221999999938,45.21915400000006],[-71.398894999999982,45.215546000000131],[-71.396118000000001,45.210548000000131],[-71.395843999999954,45.205268999999987],[-71.398620999999991,45.199432000000002],[-71.43249499999996,45.130272000000048],[-71.436110999999926,45.125267000000008],[-71.459166999999979,45.102776000000006],[-71.482772999999952,45.083878000000084],[-71.493056999999965,45.075271999999984],[-71.496383999999921,45.068886000000077],[-71.49888599999997,45.057213000000047],[-71.497222999999963,45.041663999999969],[-71.494155999999975,45.020546000000024],[-71.55471799999998,45.019989000000123],[-71.892776000000026,45.019157000000064],[-72.049987999999985,45.019440000000031],[-72.271652000000017,45.018775999999946],[-72.459166999999866,45.017494000000113],[-72.510283999999956,45.017212000000029],[-72.778884999999946,45.020828000000108],[-72.956389999999942,45.018326000000059],[-73.337173000000007,45.01186400000006],[-73.346114999999998,45.011383000000023],[-73.352997000000016,45.009421999999972],[-73.359267999999986,45.010063000000059],[-73.376662999999951,45.011108000000036],[-73.622771999999941,45.006660000000068],[-73.91164399999991,45.000000000000057],[-74.249161000000015,44.992218000000094],[-74.682021999999904,45.006714000000102],[-74.75111400000003,45.002220000000023],[-74.769729999999925,45.006386000000134],[-74.785827999999981,45.011383000000023],[-74.81220999999988,45.01776899999993],[-74.828887999999949,45.019157000000064],[-74.850280999999939,45.016663000000108],[-74.990829000000019,44.986655999999925],[-75.00140399999998,44.980545000000063],[-75.170546999999999,44.898604999999975],[-75.278060999999923,44.857216000000051],[-75.301666000000012,44.846656999999993],[-75.317779999999857,44.837212000000136],[-75.395843999999954,44.785827999999924],[-75.537216000000001,44.691376000000048],[-75.5625,44.673882000000106],[-75.618057000000022,44.634995000000117],[-75.628051999999968,44.627769000000001],[-75.682495000000017,44.588043000000027],[-75.736114999999927,44.546387000000038],[-75.801940999999999,44.491104000000007],[-75.81138599999997,44.483047000000056],[-75.820557000000008,44.474990999999989],[-75.824722000000008,44.469986000000119],[-75.828338999999971,44.446655000000078],[-75.834166999999979,44.43443300000007],[-75.841109999999901,44.423050000000103],[-75.849441999999954,44.414711000000068],[-75.864166000000012,44.402771000000143],[-75.879990000000021,44.393326000000059],[-75.904449,44.384995000000004],[-75.966109999999958,44.364158999999972],[-75.982177999999919,44.358864000000096],[-75.997771999999998,44.355270000000075],[-76.019454999999937,44.353325000000098],[-76.034728999999913,44.353050000000053],[-76.046950999999979,44.349716000000058],[-76.057769999999948,44.344993999999986],[-76.064437999999939,44.341377000000023],[-76.363373000000024,44.150992999999971],[-76.410278000000005,44.121101000000124],[-76.43472300000002,44.104713000000061],[-76.439986999999974,44.099434000000088],[-76.531386999999995,43.983046999999942],[-76.569457999999997,43.934157999999968],[-76.583618000000001,43.915824999999927],[-76.697494999999947,43.768600000000049],[-76.801940999999999,43.633605999999986],[-76.816955999999948,43.633049000000085],[-76.974166999999909,43.634438000000046],[-77.288329999999917,43.636658000000068],[-77.582779000000016,43.638603000000046],[-77.729996000000028,43.639160000000118],[-77.857773000000009,43.639434999999992],[-77.887222000000008,43.639434999999992],[-78.388061999999934,43.638329000000113],[-78.663054999999986,43.637497000000053],[-78.724715999999944,43.629433000000006],[-78.938323999999909,43.553878999999995],[-79.02806099999998,43.521934999999985],[-79.095275999999956,43.497771999999998],[-79.18472300000002,43.465546000000131],[-79.132216999999969,43.382492000000013],[-79.066787999999974,43.279400000000066],[-79.054169000000002,43.262496999999996],[-79.053328999999962,43.256660000000068],[-79.044997999999964,43.165543000000014],[-79.044723999999974,43.160545000000013],[-79.045836999999949,43.148880000000133],[-79.049438000000009,43.143883000000017],[-79.05972300000002,43.137215000000083],[-79.063613999999916,43.132210000000043],[-79.081115999999952,43.085548000000074],[-79.043334999999956,43.011664999999994],[-79.040832999999964,43.007774000000097],[-79.021666999999923,42.987213000000054],[-79.005843999999911,42.977211000000125],[-78.978606999999954,42.961380000000133],[-78.97193900000002,42.958046000000138],[-78.962783999999942,42.956383000000017],[-78.946655000000021,42.955551000000128],[-78.938599000000011,42.953322999999955],[-78.932770000000005,42.950829000000056],[-78.927490000000034,42.946937999999989],[-78.920273000000009,42.939156000000025],[-78.918335000000013,42.934715000000097],[-78.915282999999988,42.924164000000019],[-78.917220999999927,42.904991000000109],[-78.918335000000013,42.89888000000002],[-78.926665999999898,42.880546999999979],[-78.932219999999973,42.868324000000086],[-78.935271999999998,42.862495000000081],[-78.942490000000021,42.852493000000095],[-78.965835999999967,42.833602999999982],[-78.986937999999952,42.819992000000013],[-79.12110899999999,42.769157000000121],[-79.154448999999943,42.757217000000026],[-79.299437999999952,42.702492000000007],[-79.56645199999997,42.600708000000054],[-79.763427999999919,42.524703999999986],[-79.776672000000019,42.52027099999998],[-80.086120999999991,42.399994000000106],[-80.096953999999926,42.396385000000066],[-80.510283999999899,42.329163000000051],[-80.528548999999998,42.326617999999996],[-80.869155999999975,42.279160000000104],[-81.249161000000015,42.224991000000045],[-81.424437999999952,42.144997000000046],[-81.623610999999983,42.052773000000116],[-81.822234999999978,41.96027400000014],[-82.218062999999972,41.774437000000034],[-82.238891999999964,41.763885000000073],[-82.425277999999992,41.675551999999982],[-82.462783999999942,41.676102000000014],[-82.649993999999936,41.681938000000059],[-82.696654999999964,41.683875999999998],[-83.071944999999914,41.859717999999987],[-83.080841000000021,41.874992000000077],[-83.117415999999878,41.946194000000048],[-83.130828999999892,41.970543000000134],[-83.150283999999942,42.008330999999998],[-83.168609999999944,42.046104000000014],[-83.168335000000013,42.048050000000103],[-83.137222000000008,42.201385000000016],[-83.132492000000013,42.220824999999991],[-83.12332200000003,42.245827000000077],[-83.118056999999965,42.25777400000004],[-83.107772999999952,42.272766000000047],[-83.086959999999976,42.300545000000056],[-83.062209999999993,42.318603999999993],[-83.051940999999999,42.324715000000083],[-83.027221999999995,42.331940000000145],[-83.002227999999945,42.339157000000057],[-82.975829999999974,42.344711000000075],[-82.940551999999968,42.357498000000078],[-82.841384999999946,42.396941999999967],[-82.808884000000035,42.413322000000107],[-82.793609999999944,42.422768000000076],[-82.775283999999942,42.43721000000005],[-82.763061999999991,42.448600999999996],[-82.729996000000028,42.48333000000008],[-82.704453000000001,42.508331000000055],[-82.670273000000009,42.539993000000038],[-82.665282999999931,42.544158999999922],[-82.659103000000016,42.548195000000078],[-82.650756999999942,42.553642000000139],[-82.644973999999991,42.556411999999966],[-82.630553999999961,42.557495000000074],[-82.622222999999963,42.556656000000089],[-82.614166000000012,42.554710000000057],[-82.605835000000013,42.554161000000079],[-82.586394999999925,42.558601000000124],[-82.571670999999981,42.56888600000002],[-82.535827999999867,42.599434000000031],[-82.521392999999932,42.618881000000044],[-82.513335999999867,42.63638300000008],[-82.484726000000023,42.719154000000003],[-82.474716000000001,42.751663000000065],[-82.471114999999941,42.769989000000066],[-82.470551,42.782493999999986],[-82.47193900000002,42.793053000000043],[-82.473327999999924,42.797493000000031],[-82.480559999999912,42.812492000000134],[-82.481948999999929,42.823326000000009],[-82.481109999999944,42.829437000000098],[-82.464446999999893,42.898048000000074],[-82.462509000000011,42.904709000000025],[-82.418776999999977,43.018639000000064],[-82.404175000000009,43.049164000000076],[-82.322234999999978,43.21054799999996],[-82.252791999999943,43.346382000000119],[-82.228881999999942,43.391380000000026],[-82.146118000000001,43.553047000000106],[-82.130279999999971,43.585266000000104],[-82.214447000000007,43.952217000000132],[-82.331679999999949,44.460823000000119],[-82.430556999999965,44.882767000000115],[-82.543059999999969,45.355826999999977],[-82.629990000000021,45.396102999999982],[-82.665008999999998,45.411933999999917],[-82.954178000000013,45.54193900000007],[-83.050826999999913,45.585266000000047],[-83.11221299999994,45.612770000000069],[-83.270844000000011,45.683326999999963],[-83.500290000000007,45.784995999999978],[-83.597778000000005,45.827217000000019],[-83.523894999999982,45.918053000000043],[-83.487777999999992,45.961661999999933],[-83.447768999999994,46.011940000000095],[-83.474716000000001,46.036385000000109],[-83.483321999999987,46.043884000000105],[-83.566665999999998,46.098602000000085],[-83.577498999999989,46.105270000000075],[-83.596114999999998,46.114158999999972],[-83.610549999999932,46.119156000000089],[-83.627776999999867,46.123046999999929],[-83.663054999999872,46.126099000000067],[-83.830565999999862,46.126099000000067],[-83.846114999999941,46.124992000000134],[-83.883895999999936,46.102776000000119],[-83.888031000000012,46.096161000000109],[-83.892257999999913,46.092346000000134],[-83.898009999999942,46.08718900000008],[-83.917998999999952,46.073303000000124],[-83.923003999999935,46.070250999999985],[-83.936004999999966,46.065383999999995],[-83.942840999999987,46.066101000000003],[-83.952788999999996,46.068603999999993],[-83.958892999999932,46.071663000000115],[-83.962783999999999,46.075554000000011],[-84.076675000000023,46.203049000000135],[-84.089721999999938,46.220267999999976],[-84.099166999999909,46.232764999999972],[-84.105834999999956,46.247771999999998],[-84.15695199999999,46.391663000000108],[-84.15834000000001,46.396659999999997],[-84.160277999999948,46.424995000000024],[-84.154448999999943,46.445267000000115],[-84.149170000000026,46.457214000000079],[-84.139998999999989,46.474159000000043],[-84.121933000000013,46.498877999999991],[-84.118057000000022,46.512497000000053],[-84.118331999999953,46.518051000000071],[-84.119994999999903,46.523323000000005],[-84.12249799999995,46.527771000000143],[-84.126389000000017,46.531937000000084],[-84.132491999999957,46.53472099999999],[-84.192763999999954,46.546661000000086],[-84.408614999999884,46.508605999999986],[-84.428328999999962,46.503052000000025],[-84.434433000000013,46.500275000000101],[-84.454453000000001,46.486938000000066],[-84.459441999999967,46.482764999999915],[-84.463897999999972,46.478325000000098],[-84.474715999999944,46.463608000000079],[-84.479996000000028,46.46027400000014],[-84.486388999999974,46.458885000000123],[-84.494719999999973,46.458046000000138],[-84.512512000000015,46.45915999999994],[-84.529998999999975,46.461380000000133],[-84.565001999999993,46.466385000000002],[-84.775008999999955,46.653046000000074],[-84.787780999999995,46.68971300000004],[-84.806945999999925,46.748328999999956],[-84.825561999999877,46.806938000000059],[-84.83277899999996,46.829163000000051],[-84.856948999999986,46.902214000000072],[-84.872222999999963,46.909431000000041],[-84.917495999999971,46.928604000000121],[-85.354445999999996,47.111664000000076],[-85.464171999999905,47.157211000000132],[-85.738891999999964,47.270827999999995],[-85.839721999999938,47.31221000000005],[-86.014724999999942,47.383880999999917],[-86.051391999999964,47.39888000000002],[-86.466659999999933,47.567215000000033],[-86.568893000000003,47.608330000000024],[-86.884444999999971,47.734717999999987],[-87.201400999999976,47.860275000000115],[-87.341674999999952,47.915542999999957],[-87.444716999999969,47.955826000000002],[-88.188323999999966,48.244156000000089],[-88.368056999999908,48.31221000000005],[-88.645554000000004,48.264160000000004],[-88.691665999999941,48.255554000000075],[-88.974166999999909,48.139160000000118],[-89.323333999999988,47.993050000000096],[-89.356658999999979,47.979713000000061],[-89.447768999999937,48.003326000000015],[-89.493125999999961,48.003166000000078],[-89.556655999999975,48.001389000000131],[-89.573059000000001,48.001663000000065],[-89.57887299999993,48.00262500000008],[-89.583069000000023,48.003326000000015],[-89.598617999999931,48.006660000000011],[-89.603881999999999,48.00999500000006],[-89.608337000000006,48.014160000000061],[-89.614715999999987,48.016663000000051],[-89.750564999999995,48.029160000000047],[-89.760559000000001,48.029991000000052],[-89.838897999999972,48.01166500000005],[-89.862502999999947,48.000832000000059],[-89.888061999999991,47.991936000000123],[-89.895554000000004,47.989990000000034],[-89.903885000000002,47.989159000000029],[-89.911666999999966,47.991379000000052],[-89.982223999999974,48.016105999999979],[-89.993057000000022,48.02276599999999],[-90,48.030204999999967],[-90.000838999999985,48.031105000000025],[-90.032775999999956,48.069717000000026],[-90.056106999999997,48.100548000000117],[-90.059432999999956,48.104996000000085],[-90.065001999999936,48.10833000000008],[-90.081680000000006,48.111938000000009],[-90.12721299999987,48.119156000000032],[-90.146118000000001,48.121658000000082],[-90.156386999999938,48.122490000000028],[-90.279998999999975,48.113051999999982],[-90.740829000000019,48.090828000000045],[-90.758895999999993,48.094711000000018],[-90.769454999999937,48.099998000000085],[-90.778335999999967,48.107498000000021],[-90.838608000000022,48.184158000000025],[-90.841674999999952,48.191658000000132],[-90.843063000000029,48.205826000000002],[-90.83805799999999,48.208603000000039],[-90.833625999999924,48.209099000000094],[-90.829726999999991,48.212493999999936],[-90.829192999999975,48.214638000000093],[-90.828887999999949,48.221656999999936],[-90.830291999999929,48.225548000000003],[-90.832503999999915,48.227211000000125],[-90.849166999999909,48.233879000000115],[-90.868606999999997,48.237495000000138],[-90.898055999999883,48.236656000000039],[-90.928329000000019,48.228600000000142],[-90.969161999999926,48.214714000000129],[-91.126098999999954,48.154991000000109],[-91.14916999999997,48.144157000000064],[-91.192489999999964,48.114998000000071],[-91.232223999999974,48.087769000000094],[-91.24888599999997,48.079437000000098],[-91.269454999999994,48.07388300000008],[-91.283324999999991,48.071381000000031],[-91.311661000000015,48.069160000000124],[-91.325561999999991,48.069717000000026],[-91.34722899999997,48.068054000000075],[-91.381377999999984,48.061661000000129],[-91.392226999999934,48.056099000000017],[-91.418335000000013,48.041107000000011],[-91.462783999999942,48.057770000000062],[-91.573623999999995,48.093048000000067],[-91.645142000000021,48.098343000000114],[-91.6875,48.144714000000135],[-91.729720999999984,48.187209999999936],[-91.734160999999915,48.190543999999932],[-91.739715999999987,48.193321000000026],[-91.756957999999997,48.194434999999999],[-91.776107999999965,48.194153000000142],[-91.791672000000005,48.195267000000115],[-91.850554999999986,48.203880000000083],[-91.940276999999924,48.23054500000012],[-91.956589000000008,48.23663300000004],[-91.97084000000001,48.244437999999946],[-91.985824999999977,48.255829000000119],[-91.997771999999998,48.266662999999994],[-92.007232999999985,48.27915999999999],[-92.008895999999993,48.28276800000009],[-92.011123999999938,48.292496000000085],[-92.011672999999917,48.297493000000031],[-92.013335999999924,48.304993000000081],[-92.020554000000004,48.322769000000051],[-92.02806099999998,48.336105000000032],[-92.035552999999993,48.343605000000082],[-92.041945999999939,48.347771000000023],[-92.051940999999943,48.353882000000056],[-92.141678000000013,48.357216000000051],[-92.162216000000001,48.356658999999979],[-92.257232999999928,48.346939000000077],[-92.265014999999892,48.343605000000082],[-92.276107999999965,48.337493999999992],[-92.280288999999982,48.332771000000037],[-92.285827999999981,48.326103000000046],[-92.300551999999925,48.304993000000081],[-92.300827000000027,48.298050000000103],[-92.297225999999966,48.28943600000008],[-92.288604999999961,48.276100000000099],[-92.283614999999998,48.263885000000016],[-92.283065999999963,48.256660000000124],[-92.285552999999936,48.250549000000035],[-92.290282999999988,48.246658000000139],[-92.306716999999935,48.241592000000026],[-92.331680000000006,48.234160999999972],[-92.351943999999946,48.228325000000098],[-92.356658999999979,48.228600000000142],[-92.361664000000019,48.231102000000021],[-92.369155999999975,48.238883999999985],[-92.426392000000021,48.311661000000072],[-92.455275999999969,48.394157000000007],[-92.582229999999981,48.441375999999991],[-92.697768999999994,48.485268000000076],[-92.715285999999935,48.541382000000056],[-92.943054000000018,48.621101000000067],[-92.953063999999927,48.62332200000003],[-92.966109999999958,48.624991999999963],[-93.244995000000017,48.640549000000021],[-93.308883999999978,48.630272000000048],[-93.322509999999966,48.628044000000102],[-93.40834000000001,48.608604000000128],[-93.449996999999996,48.597214000000065],[-93.456664999999987,48.594994000000042],[-93.458618000000001,48.592491000000052],[-93.458618000000001,48.589432000000102],[-93.456116000000009,48.583054000000118],[-93.452788999999996,48.579436999999984],[-93.449721999999952,48.570549000000028],[-93.449996999999996,48.56749700000006],[-93.454177999999899,48.559714999999926],[-93.46055599999994,48.55332199999998],[-93.465835999999911,48.54972099999992],[-93.476394999999968,48.544158999999979],[-93.489440999999999,48.539718999999991],[-93.503066999999874,48.537498000000085],[-93.65695199999999,48.51527399999992],[-93.664444000000003,48.514999000000103],[-93.724166999999966,48.51388500000013],[-93.778610000000015,48.51638800000012],[-93.793059999999969,48.517768999999987],[-93.800277999999935,48.520271000000037],[-93.803604000000007,48.524712000000136],[-93.805557000000022,48.532211000000132],[-93.80972300000002,48.550270000000069],[-93.817779999999971,48.581940000000145],[-93.820007000000032,48.590546000000074],[-93.830001999999979,48.612770000000012],[-93.833327999999995,48.616386000000034],[-93.842498999999975,48.623604000000057],[-93.851944000000003,48.626938000000052],[-93.865554999999972,48.630272000000048],[-93.880553999999961,48.630272000000048],[-93.885283999999899,48.630272000000048],[-94.063888999999961,48.638046000000031],[-94.111937999999896,48.641106000000093],[-94.134170999999867,48.642769000000044],[-94.235275000000001,48.653046000000018],[-94.250564999999995,48.656097000000045],[-94.252791999999886,48.65776800000009],[-94.25418099999996,48.660545000000013],[-94.252228000000002,48.671379000000059],[-94.252228000000002,48.679993000000138],[-94.256667999999934,48.687767000000122],[-94.263061999999991,48.694153000000028],[-94.271117999999888,48.699158000000068],[-94.278610000000015,48.702492000000063],[-94.291107000000011,48.706099999999992],[-94.305832000000009,48.708328000000108],[-94.390563999999927,48.711105000000032],[-94.406112999999948,48.711105000000032],[-94.414169000000015,48.709991000000059],[-94.433318999999983,48.701934999999992],[-94.453613000000018,48.695824000000073],[-94.460555999999997,48.694435000000112],[-94.476395000000025,48.693878000000041],[-94.500838999999985,48.696938000000046],[-94.523894999999925,48.701934999999992],[-94.605835000000013,48.724433999999917],[-94.637221999999952,48.739159000000086],[-94.643616000000009,48.743049999999982],[-94.689986999999917,48.774712000000079],[-94.699996999999996,48.782767999999976],[-94.706664999999987,48.79055000000011],[-94.709441999999967,48.803047000000106],[-94.711120999999991,48.846382000000062],[-94.710007000000019,48.855270000000075],[-94.709075999999982,48.857948000000135],[-94.705001999999979,48.862770000000125],[-94.700287000000003,48.868881000000044],[-94.699722000000008,48.871101000000067],[-94.700287000000003,48.895271000000037],[-94.701675000000023,48.909714000000122],[-94.704178000000013,48.924438000000009],[-94.707503999999972,48.941932999999949],[-94.71665999999999,48.970543000000021],[-94.720550999999887,48.978874000000076],[-94.727218999999934,48.99221799999998],[-94.732773000000009,49.001663000000065],[-94.745270000000005,49.028603000000089],[-94.766952999999944,49.075554000000125],[-94.797774999999945,49.155822999999998],[-94.798889000000031,49.159156999999993],[-94.804717999999866,49.17971799999998],[-94.806655999999975,49.193603999999993],[-94.81527699999998,49.29332700000009],[-94.815552000000025,49.306099000000131],[-94.818344000000025,49.309989999999971],[-94.821944999999971,49.312767000000065],[-94.922775000000001,49.355827000000033],[-94.935927999999933,49.360297999999943],[-94.946380999999974,49.36221299999994],[-94.958617999999944,49.361664000000019],[-94.96556099999998,49.360275000000001],[-94.998610999999983,49.357498000000078],[-95.025833000000034,49.357498000000078],[-95.078063999999927,49.359161000000029],[-95.085662999999954,49.360023000000126],[-95.120834000000002,49.364998000000014],[-95.142501999999922,49.371658000000025],[-95.152785999999935,49.376656000000025],[-95.154174999999952,49.366386000000091],[-95.154448999999886,49.333328000000108],[-95.153960999999981,49.173332000000073],[-95.154174999999952,48.999435000000119],[-95.26655599999998,48.999977000000001],[-97.219940000000008,48.999718000000087],[-97.502791999999943,48.999435000000119],[-97.635833999999988,48.999435000000119],[-97.801940999999999,49.000000000000114],[-97.969161999999926,49.000274999999988],[-98.26916499999993,49.000274999999988],[-98.502227999999889,48.999435000000119],[-98.868606999999997,49.000000000000114],[-99.335555999999997,48.999435000000119],[-99.835555999999997,49.000000000000114],[-100.00222799999995,49.000000000000114],[-100.50195300000001,48.999718000000087],[-101.06916799999999,49.000000000000114],[-101.30222299999997,49.000274999999988],[-101.367233,48.998787000000107],[-101.46888699999994,48.999435000000119],[-102.16887699999995,49.000000000000114],[-102.33556399999998,48.999435000000119],[-102.53555299999994,49.000274999999988],[-102.76834099999996,48.999435000000119],[-103.03527800000001,48.999435000000119],[-103.16832699999992,48.999435000000119],[-103.26889,49.000000000000114],[-103.43554699999993,49.000274999999988],[-103.53527800000001,48.999435000000119],[-103.73528299999987,48.999435000000119],[-104.033096,49.000251999999989],[-104.13527699999986,48.999718000000087],[-104.33500699999996,48.999435000000119],[-104.83500700000002,48.999435000000119],[-105.00140399999998,48.999435000000119],[-105.26834100000002,49.000000000000114],[-105.70221699999996,48.999435000000119],[-105.93554699999999,48.999435000000119],[-106.03472899999991,48.999435000000119],[-106.13527699999997,48.999435000000119],[-106.26862299999993,48.999435000000119],[-106.46806300000003,48.999435000000119],[-106.73554999999993,48.999435000000119],[-107.33528100000001,49.000000000000114],[-107.43499800000001,49.000000000000114],[-107.63474300000001,48.999435000000119],[-107.73554999999993,48.999435000000119],[-107.80110199999996,48.999435000000119],[-108.16887700000001,48.999435000000119],[-108.33500699999996,48.999435000000119],[-108.53472899999997,48.999435000000119],[-108.6677699999999,48.999435000000119],[-108.83473200000003,48.999435000000119],[-109.33473200000003,48.999435000000119],[-109.63474299999996,48.999435000000119],[-109.801941,48.999435000000119],[-109.96777299999997,48.999718000000087],[-109.99965700000001,49.000603000000126],[-110.10138699999999,48.999435000000119],[-110.20111099999991,48.999435000000119],[-110.30166599999995,49.000000000000114],[-110.36776699999996,49.000000000000114],[-110.50110599999988,49.000000000000114],[-110.66777000000002,49.000000000000114],[-110.76862299999993,48.999435000000119],[-111.36833199999995,48.999435000000119],[-111.80110199999996,48.999435000000119],[-112.03472899999997,48.999435000000119],[-112.16832699999998,48.999435000000119],[-112.234734,49.000000000000114],[-112.33500699999996,49.000000000000114],[-112.43499799999995,49.000000000000114],[-112.53500399999996,49.000000000000114],[-112.60166900000002,49.000000000000114],[-112.93472300000002,49.000000000000114],[-113.03443900000002,49.000000000000114],[-113.23416099999997,48.999435000000119],[-113.36833200000001,48.999435000000119],[-113.567497,48.999435000000119],[-114.03443899999991,48.999435000000119],[-114.05985999999996,49.000603000000126],[-114.33500700000002,48.999435000000119],[-114.46749899999992,48.999435000000119],[-114.53472899999991,49.000000000000114],[-114.63390399999997,49.000000000000114],[-114.90110800000002,48.999435000000119],[-115.03415699999999,48.999435000000119],[-115.16750299999995,48.999435000000119],[-115.36805700000002,49.000000000000114],[-115.46806300000003,49.000000000000114],[-115.56723,49.000000000000114],[-115.60138699999987,48.999435000000119],[-115.734444,48.999435000000119],[-116.04833999999994,48.999718000000087],[-117.00140399999998,48.999718000000087],[-117.03662099999997,49.003128000000117],[-117.06722999999994,48.999718000000087],[-117.20084399999996,48.999435000000119],[-117.234734,49.000000000000114],[-117.30055199999993,49.000000000000114],[-117.567497,49.000000000000114],[-117.83444199999991,49.000000000000114],[-117.86749299999997,48.999435000000119],[-118.00083899999998,48.999435000000119],[-118.13417099999998,48.999435000000119],[-118.36805699999996,48.999435000000119],[-118.76777600000003,48.999435000000119],[-118.96749899999992,48.999435000000119],[-119.13417099999987,48.999435000000119],[-119.26722699999999,48.999435000000119],[-119.46777299999985,48.999435000000119],[-119.86749299999991,48.999435000000119],[-119.93415800000002,48.999435000000119],[-120.03415699999999,48.999435000000119],[-120.53472899999997,48.999435000000119],[-121.08497599999993,48.999718000000087],[-122.10056299999997,49.000000000000114],[-122.33389299999993,49.000000000000114],[-122.43360899999993,49.000000000000114],[-122.56667299999992,49.000000000000114],[-122.69999699999994,49.000000000000114],[-122.76030000000003,48.999435000000119],[-122.81360599999994,49.005272000000048],[-122.83112299999999,49.008606000000043],[-122.86250299999989,49.022217000000012],[-122.87777699999998,49.032211000000018],[-122.87970699999994,49.034438999999963],[-122.88110399999999,49.038605000000075],[-122.87748699999986,49.049438000000066],[-122.87609900000001,49.051383999999928],[-122.87249799999989,49.054436000000067],[-122.86416600000001,49.061661000000129],[-122.85888699999992,49.067497000000003],[-122.85804699999994,49.072769000000108],[-122.859444,49.077217000000076],[-122.86638599999998,49.081107999999972],[-122.87444299999999,49.083602999999982],[-122.89998600000001,49.087211999999965],[-122.91887700000001,49.087211999999965],[-122.94167299999992,49.082496999999933],[-123.02194199999997,49.051658999999972],[-123.03916900000002,49.042496000000142],[-123.04666099999997,49.033332999999971],[-123.048607,49.027214000000129],[-123.04833999999994,49.022491000000116],[-123.04778299999998,49.018326000000116],[-123.03916900000002,49.005272000000048],[-123.03431699999999,48.999435000000119],[-123.09374999999994,48.999435000000119],[-123.11332699999997,49.036658999999986],[-123.13890099999998,49.107216000000108],[-123.14835399999998,49.10833000000008],[-123.20500199999998,49.123603999999943],[-123.20973200000003,49.127212999999983],[-123.247772,49.265273999999977],[-123.24889399999995,49.273605000000032],[-123.24749800000001,49.275551000000121],[-123.09449799999993,49.283938999999975],[-123.00933800000001,49.281944000000067],[-122.94332900000001,49.284164000000089],[-122.92360699999995,49.28833000000003],[-122.91251399999999,49.29332700000009],[-122.87917299999998,49.339157000000114],[-122.87499999999994,49.351387000000045],[-122.85388199999994,49.429993000000138],[-122.85278299999999,49.436104000000057],[-122.85333300000002,49.438880999999924],[-122.86054999999993,49.447487000000024],[-122.87082700000002,49.457214000000022],[-122.87638899999996,49.455551000000071],[-122.87832600000002,49.449432000000058],[-122.876938,49.429993000000138],[-122.87721299999993,49.414992999999981],[-122.88110399999999,49.40277100000003],[-122.88583399999993,49.391936999999984],[-122.90139799999992,49.360550000000046],[-122.91555800000003,49.342216000000064],[-122.93138099999999,49.328049000000135],[-123.00538599999999,49.319549999999992],[-123.03671999999989,49.313217000000009],[-123.04521899999992,49.312550000000044],[-123.06339299999996,49.313217000000009],[-123.08023100000003,49.315547999999978],[-123.23638900000003,49.338882000000069],[-123.25418099999996,49.384720000000016],[-123.25666799999993,49.512772000000041],[-123.25334199999992,49.523048000000131],[-123.24722299999996,49.534995999999978],[-123.20162199999999,49.615715000000137],[-123.1558379999999,49.676102000000014],[-123.15416700000003,49.67943600000001],[-123.15222199999994,49.685547000000099],[-123.15361000000001,49.690269000000001],[-123.15972899999997,49.699158000000068],[-123.16471899999993,49.702217000000019],[-123.16777000000002,49.702217000000019],[-123.17027300000001,49.701103000000046],[-123.24194299999999,49.660544999999956],[-123.24804699999993,49.648605000000089],[-123.24804699999993,49.639717000000076],[-123.26677699999999,49.617378000000031],[-123.26594499999999,49.610382000000129],[-123.265106,49.607880000000023],[-123.26494600000001,49.603713999999968],[-123.26576999999997,49.598381000000131],[-123.26812000000001,49.595551000000114],[-123.27095799999995,49.593215999999984],[-123.27977799999991,49.590050000000019],[-123.34333800000002,49.561378000000047],[-123.38110399999999,49.556655999999975],[-123.39444699999996,49.551933000000133],[-123.43028299999997,49.538329999999974],[-123.48306300000002,49.516663000000108],[-123.49249299999997,49.509720000000129],[-123.495003,49.506943000000035],[-123.49610899999993,49.500275000000045],[-123.49416399999996,49.468596999999988],[-123.491669,49.463608000000022],[-123.48777799999993,49.46054799999996],[-123.47778299999993,49.455268999999987],[-123.47416699999997,49.450828999999999],[-123.47332799999992,49.441101000000117],[-123.47609699999998,49.421936000000017],[-123.47666899999996,49.419159000000093],[-123.48194899999993,49.409988000000112],[-123.48665599999993,49.406097000000045],[-123.506958,49.389435000000049],[-123.512787,49.386383000000137],[-123.51944699999996,49.383881000000088],[-123.52694700000001,49.382210000000043],[-123.53555299999994,49.381378000000097],[-123.54499800000002,49.383331000000055],[-123.60109699999987,49.397490999999945],[-123.60610999999994,49.399994000000106],[-123.67555199999998,49.425269999999955],[-123.77500900000001,49.458327999999995],[-123.85500299999995,49.468879999999956],[-123.86165599999993,49.46665999999999],[-123.88082899999995,49.466385000000116],[-123.88890100000003,49.468048000000067],[-123.89611799999994,49.470543000000077],[-123.95973200000003,49.510551000000135],[-123.96362299999993,49.513329000000113],[-123.98860200000001,49.541663999999969],[-124.06806899999992,49.633881000000031],[-124.07055700000001,49.638046000000031],[-124.07112099999995,49.644440000000088],[-124.07028199999991,49.649719000000061],[-124.05915800000002,49.671104000000014],[-124.03250100000002,49.713882000000126],[-124.02861000000001,49.71915400000006],[-124.021118,49.726379000000065],[-124.00527999999997,49.735825000000034],[-123.99833699999999,49.738884000000041],[-123.987213,49.743050000000096],[-123.97528099999994,49.745270000000119],[-123.95694700000001,49.746101000000124],[-123.94748700000002,49.744995000000131],[-123.94055199999997,49.742493000000024],[-123.93443299999996,49.739432999999963],[-123.92971799999992,49.735825000000034],[-123.876938,49.683327000000077],[-123.83306900000002,49.627486999999974],[-123.82917799999996,49.616936000000067],[-123.82444800000002,49.595825000000048],[-123.82277699999997,49.585548000000074],[-123.82333399999999,49.581383000000073],[-123.82224300000001,49.573051000000078],[-123.79972800000002,49.519440000000031],[-123.79444899999993,49.510277000000031],[-123.78971899999999,49.506660000000068],[-123.78250099999997,49.504166000000112],[-123.77639799999992,49.503882999999973],[-123.76972999999998,49.504715000000033],[-123.76640299999991,49.506660000000068],[-123.76390100000003,49.509438000000046],[-123.76139799999999,49.513329000000113],[-123.75389100000001,49.537773000000072],[-123.76862299999993,49.561935000000119],[-123.77139299999999,49.572220000000073],[-123.77223200000003,49.581940000000145],[-123.77027900000002,49.588043000000084],[-123.74017300000003,49.602599999999995],[-123.73733500000003,49.605270000000075],[-123.73517599999991,49.606937000000016],[-123.69599899999997,49.623604000000057],[-123.68683599999997,49.625603000000069],[-123.67283599999996,49.625271000000112],[-123.63890099999998,49.634995000000004],[-123.61501299999992,49.639160000000004],[-123.56331599999999,49.667213000000118],[-123.54695100000004,49.677215999999987],[-123.53751399999993,49.684990000000028],[-123.53362300000003,49.689712999999983],[-123.53167699999995,49.695541000000105],[-123.53222699999998,49.700546000000145],[-123.53388999999993,49.701934999999992],[-123.54167199999989,49.701103000000046],[-123.54998799999998,49.693877999999984],[-123.56054699999993,49.686935000000005],[-123.57195299999995,49.680824000000086],[-123.58556399999992,49.676102000000014],[-123.67578100000003,49.653046000000018],[-123.69061299999993,49.651051000000109],[-123.73978399999999,49.645882000000029],[-123.75010700000001,49.64521400000001],[-123.79666099999997,49.638328999999999],[-123.80387899999999,49.640831000000048],[-123.8125,49.647491000000116],[-123.93499800000001,49.768326000000002],[-123.93749999999989,49.77276599999999],[-123.93582200000003,49.778046000000074],[-123.93055699999996,49.785271000000137],[-123.91999800000002,49.792495999999971],[-123.88890100000003,49.819717000000026],[-123.88500999999997,49.823608000000092],[-123.88249199999996,49.82749200000012],[-123.87970699999994,49.832771000000093],[-123.87638900000002,49.842215999999951],[-123.87332200000003,49.864158999999916],[-123.87249799999995,49.87110100000001],[-123.872772,49.877212999999983],[-123.88500999999997,49.914993000000095],[-123.889183,49.922767999999962],[-123.89417300000002,49.92721599999993],[-123.90139799999992,49.928879000000052],[-123.91082799999998,49.930275000000108],[-123.920547,49.928604000000064],[-123.92999299999997,49.929718000000037],[-123.93720999999994,49.932213000000047],[-123.94193999999999,49.936104000000114],[-123.94860799999998,49.943877999999927],[-123.95472699999999,49.953049000000078],[-123.95889299999999,49.962212000000079],[-123.929779,49.985321000000056],[-123.929283,49.989493999999979],[-123.92544599999997,49.994156000000089],[-123.92044099999998,49.997325999999987],[-123.88160700000003,50.01499600000011],[-123.87343599999986,50.018326000000116],[-123.860771,50.021660000000111],[-123.85294299999998,50.022995000000037],[-123.84310199999999,50.023659000000123],[-123.80832699999996,50.040276000000119],[-123.79611199999994,50.04444100000012],[-123.75334199999998,50.07638500000013],[-123.74861099999998,50.080276000000026],[-123.74445300000002,50.086936999999921],[-123.74944299999999,50.09665700000005],[-123.82140399999997,50.152213999999958],[-123.83056599999998,50.156936999999971],[-123.846947,50.163321999999994],[-123.97778299999993,50.213882000000012],[-123.98500100000001,50.216103000000089],[-123.99054699999999,50.215828000000101],[-123.99109599999986,50.21166199999999],[-123.98832699999997,50.207496999999989],[-123.96056399999998,50.180550000000096],[-123.94695300000001,50.169441000000006],[-123.93720999999994,50.163321999999994],[-123.92388899999992,50.158600000000092],[-123.90583800000002,50.15638000000007],[-123.88806199999988,50.152489000000003],[-123.882767,50.150826000000052],[-123.87165800000002,50.145546000000024],[-123.80915799999997,50.099998000000085],[-123.8125,50.090546000000131],[-123.81639099999995,50.086105000000032],[-123.85716200000002,50.066883000000132],[-123.86933099999993,50.058048000000099],[-123.87499999999994,50.054214000000115],[-123.87899799999997,50.052380000000085],[-123.916,50.039883000000088],[-123.95465899999988,50.029217000000074],[-123.99526999999989,50.011664999999994],[-123.99916099999996,50.00638600000002],[-124,50.000275000000101],[-123.99916099999996,49.990547000000106],[-123.99526999999989,49.961662000000047],[-123.99249299999997,49.942764000000125],[-123.99109599999986,49.937209999999993],[-123.98860200000001,49.931664000000126],[-123.97972099999998,49.916663999999969],[-123.96721600000001,49.906380000000127],[-123.95140100000003,49.895828000000108],[-123.91972399999992,49.877769000000001],[-123.91471899999993,49.873878000000104],[-123.91111799999999,49.869713000000104],[-123.922234,49.834435000000099],[-123.92639199999996,49.825828999999999],[-123.97277799999989,49.80471],[-123.97833299999996,49.803047000000106],[-123.98581699999994,49.802772999999945],[-123.99194299999994,49.804436000000067],[-124.00418100000002,49.810546999999985],[-124.01012400000002,49.834602000000075],[-124.00862100000001,49.841938000000084],[-124.00728600000002,49.856769999999983],[-124.01806599999998,49.909156999999993],[-124.02166699999987,49.91415400000011],[-124.029449,49.920547000000056],[-124.037781,49.922493000000145],[-124.04222099999998,49.921379000000002],[-124.04472399999997,49.917496000000028],[-124.068893,49.878876000000105],[-124.07195299999995,49.873322000000087],[-124.07028199999991,49.869156000000032],[-124.06261399999988,49.846328999999912],[-124.05877700000002,49.841991000000007],[-124.05860899999999,49.838325999999995],[-124.06028000000003,49.835158999999976],[-124.08444199999991,49.799164000000133],[-124.09028599999999,49.795830000000137],[-124.14555399999995,49.779716000000008],[-124.17694099999989,49.773604999999975],[-124.18582199999997,49.77276599999999],[-124.2702789999999,49.768051000000128],[-124.40416700000003,49.763329000000056],[-124.41361999999998,49.763610999999969],[-124.42916899999994,49.766388000000006],[-124.43639400000001,49.768883000000073],[-124.51194800000002,49.796104000000071],[-124.52166699999992,49.804161000000079],[-124.52443699999998,49.808327000000133],[-124.52583300000003,49.813880999999981],[-124.52583300000003,49.831665000000044],[-124.52749599999987,49.837212000000022],[-124.53278399999999,49.844437000000084],[-124.57195299999995,49.874435000000005],[-124.59137699999997,49.883049000000085],[-124.63221699999997,49.899436999999921],[-124.702789,49.934989999999971],[-124.74194299999999,49.958328000000051],[-124.77306399999992,49.985825000000034],[-124.80332900000002,50.020271000000093],[-124.82556199999999,50.051384000000098],[-124.82972699999999,50.061935000000005],[-124.828056,50.066666000000112],[-124.82140400000003,50.069160000000068],[-124.81304899999992,50.067496999999946],[-124.80695300000002,50.06360600000005],[-124.76722699999988,50.036385000000053],[-124.70333900000003,49.995543999999995],[-124.66805999999991,50.07027400000004],[-124.61694299999999,50.179161000000079],[-124.60193599999997,50.234993000000031],[-124.60138699999993,50.238884000000098],[-124.60417200000001,50.243881000000044],[-124.63110399999999,50.279716000000121],[-124.63890100000003,50.286942000000067],[-124.665009,50.303879000000052],[-124.708618,50.318329000000006],[-124.71362299999987,50.321937999999989],[-124.71501199999994,50.327492000000007],[-124.65778399999994,50.386108000000092],[-124.65194699999989,50.389160000000061],[-124.62609899999995,50.398330999999985],[-124.60193599999997,50.40277100000003],[-124.58055100000001,50.399990000000116],[-124.57555400000001,50.39899400000013],[-124.57122800000002,50.397495000000106],[-124.54998799999993,50.393883000000017],[-124.53362300000003,50.395827999999995],[-124.51999699999999,50.399994000000106],[-124.43415800000002,50.431664000000012],[-124.42054699999994,50.43721000000005],[-124.39862099999999,50.450545999999974],[-124.38305700000001,50.462212000000136],[-124.36138900000003,50.479713000000118],[-124.35193600000002,50.487495000000081],[-124.34805299999999,50.492218000000037],[-124.34528399999988,50.497489999999971],[-124.34777800000001,50.50249500000001],[-124.35527000000002,50.504997000000117],[-124.36389200000002,50.503882999999917],[-124.378601,50.499161000000015],[-124.38445299999995,50.49610100000001],[-124.39388999999989,50.488884000000041],[-124.39778099999995,50.484161000000086],[-124.40055799999993,50.478874000000133],[-124.404449,50.4741590000001],[-124.40915699999999,50.470268000000033],[-124.42749000000003,50.462212000000136],[-124.51834099999991,50.432212999999933],[-124.58383199999997,50.414051000000029],[-124.58833300000003,50.41338300000001],[-124.59999800000003,50.413048000000003],[-124.71167000000003,50.375549000000092],[-124.73916599999995,50.351936000000137],[-124.80332900000002,50.317772000000105],[-124.81582600000002,50.312209999999993],[-124.83000199999992,50.30943300000007],[-124.85056299999991,50.309714999999983],[-124.93916299999995,50.325271999999984],[-125.06388900000002,50.317772000000105],[-125.07224299999996,50.319442999999978],[-125.07833900000003,50.322495000000117],[-125.08416699999998,50.329719999999952],[-125.08889799999997,50.346382000000119],[-125.08750900000001,50.357215999999994],[-125.05666399999996,50.476936000000023],[-125.05194099999989,50.480820000000051],[-125.04499799999996,50.48333000000008],[-125.02667199999996,50.483047000000113],[-125.01806599999998,50.484161000000086],[-124.97112299999998,50.498047000000042],[-124.96528599999999,50.50110600000005],[-124.88082900000001,50.560546999999985],[-124.85973399999989,50.585823000000062],[-124.858047,50.590546000000018],[-124.85444599999994,50.691376000000105],[-124.86888099999999,50.764998999999989],[-124.87805200000003,50.811377999999991],[-124.86749299999997,50.817771999999991],[-124.78943599999991,50.88110400000005],[-124.78694199999995,50.884438000000046],[-124.78751399999993,50.889160000000118],[-124.79998799999998,50.91304800000006],[-124.80277999999998,50.9180530000001],[-124.80583200000001,50.920830000000024],[-124.81916799999993,50.926384000000041],[-124.84999099999993,50.935265000000129],[-124.85417200000001,50.935547000000042],[-124.86138900000003,50.928879000000052],[-124.92443800000001,50.834717000000126],[-124.9449919999999,50.775268999999923],[-124.91221599999994,50.699431999999945],[-124.90139799999997,50.630271999999991],[-124.90194700000001,50.62471000000005],[-124.90361000000001,50.619987000000094],[-124.91111799999999,50.611382000000049],[-124.92887899999994,50.596382000000062],[-125.02694700000001,50.540833000000077],[-125.09944200000001,50.5],[-125.10417199999989,50.496941000000049],[-125.11277799999999,50.487495000000081],[-125.11694299999999,50.478043000000127],[-125.118607,50.471930999999984],[-125.11193800000001,50.452492000000063],[-125.11138899999997,50.447769000000108],[-125.11221299999994,50.44221500000009],[-125.11472299999997,50.436935000000005],[-125.11945300000002,50.432770000000005],[-125.12526700000001,50.429718000000094],[-125.17027299999995,50.412491000000102],[-125.17777999999998,50.41137700000013],[-125.1875,50.412491000000102],[-125.195831,50.414711000000068],[-125.20221699999991,50.417213000000004],[-125.20722999999998,50.420830000000137],[-125.24610899999993,50.462212000000136],[-125.33612099999993,50.479713000000118],[-125.40361000000001,50.473602000000028],[-125.42166099999992,50.465271000000143],[-125.44275699999997,50.459435000000042],[-125.46028099999995,50.457214000000135],[-125.48832700000003,50.45638300000013],[-125.54444899999993,50.490379000000132],[-125.54811099999995,50.492050000000006],[-125.54928599999994,50.494549000000006],[-125.54961399999996,50.497547000000054],[-125.54911799999996,50.501545000000135],[-125.53222700000003,50.62721300000004],[-125.51944700000001,50.647217000000126],[-125.51194800000002,50.657211000000132],[-125.50723299999999,50.661102000000028],[-125.50055699999996,50.663048000000117],[-125.48194899999999,50.664993000000095],[-125.46749899999998,50.668602000000135],[-125.45612299999999,50.674995000000081],[-125.45140100000003,50.678879000000109],[-125.42804699999999,50.705551000000014],[-125.42555199999998,50.710823000000119],[-125.43277,50.713882000000069],[-125.44360399999999,50.714157000000114],[-125.45889299999993,50.713608000000136],[-125.46639999999996,50.713051000000064],[-125.47332799999998,50.709159999999997],[-125.53778099999994,50.669991000000095],[-125.54723399999995,50.661933999999974],[-125.55832699999996,50.648048000000131],[-125.56388900000002,50.637214999999969],[-125.56806899999998,50.62721300000004],[-125.57167099999998,50.611382000000049],[-125.57224300000001,50.605270000000075],[-125.5849,50.571323000000064],[-125.58206899999999,50.56582300000008],[-125.58039099999996,50.563656000000037],[-125.5800549999999,50.559994000000074],[-125.58623499999999,50.536659000000043],[-125.610229,50.489326000000062],[-125.61238900000001,50.486492000000055],[-125.63722200000001,50.445540999999935],[-125.65167200000002,50.441375999999934],[-125.69249000000002,50.429993000000138],[-125.700287,50.428047000000049],[-125.70584099999996,50.427773000000116],[-125.71611000000001,50.432212999999933],[-125.84665699999994,50.502777000000094],[-125.86472300000003,50.495269999999948],[-125.93028299999992,50.473602000000028],[-125.95221700000002,50.468880000000127],[-125.968613,50.468880000000127],[-126.06331599999999,50.470825000000104],[-126.15915699999999,50.484992999999974],[-126.19332900000001,50.490273000000059],[-126.26777599999997,50.504997000000117],[-126.27500899999995,50.50750000000005],[-126.27916700000003,50.51166500000005],[-126.2808379999999,50.515830999999991],[-126.279449,50.520546000000024],[-126.27694700000001,50.524712000000079],[-126.22670699999998,50.536285000000021],[-126.18665299999998,50.548405000000059],[-126.18559999999997,50.566322000000014],[-126.23805199999998,50.591377000000023],[-126.25167799999991,50.609718000000044],[-126.26418299999995,50.615547000000049],[-126.27500899999995,50.627486999999974],[-126.27471899999995,50.631660000000068],[-126.266953,50.634720000000129],[-126.02006499999999,50.66188000000011],[-126.014725,50.662048000000141],[-125.90856200000002,50.664046999999982],[-125.73832699999997,50.682213000000104],[-125.69387799999993,50.704712000000029],[-125.62249799999995,50.750000000000114],[-125.61776700000001,50.754166000000055],[-125.54305999999991,50.863884000000098],[-125.53778099999994,50.87193300000007],[-125.51000999999997,50.921661000000029],[-125.50723299999999,50.926941000000113],[-125.50556899999998,50.93332700000002],[-125.50666799999993,50.945541000000048],[-125.50834699999996,50.951102999999989],[-125.55166600000001,51.042221000000097],[-125.56555200000003,51.056380999999988],[-125.58167999999995,51.072220000000129],[-125.59306299999997,51.07888000000014],[-125.610817,51.087769000000037],[-125.63390400000003,51.096939000000077],[-125.63722200000001,51.096382000000006],[-125.63890100000003,51.090271000000087],[-125.639183,51.077217000000019],[-125.63806199999999,51.06610100000006],[-125.58332799999999,50.974709000000018],[-125.61028299999987,50.89888000000002],[-125.69110099999995,50.771378000000084],[-125.73110999999989,50.735550000000046],[-125.81527699999987,50.707214000000079],[-125.96383700000001,50.688660000000084],[-126.12516799999997,50.678989000000115],[-126.13100400000002,50.678658000000098],[-126.133667,50.678825000000074],[-126.13799999999998,50.681827999999996],[-126.13917500000002,50.683495000000107],[-126.22222899999991,50.69110100000006],[-126.21362299999993,50.70388000000014],[-126.20889299999999,50.70777099999998],[-126.20333899999997,50.711104999999975],[-126.11165599999993,50.753883000000087],[-126.19888299999997,50.85582700000009],[-126.26944700000001,50.858047000000113],[-126.37609899999995,50.855270000000019],[-126.39750699999996,50.848602000000028],[-126.40306099999998,50.845268000000033],[-126.42166099999997,50.829437000000098],[-126.42748999999992,50.826103000000103],[-126.43415799999997,50.823608000000092],[-126.44304699999998,50.821663000000058],[-126.49333199999995,50.81638300000003],[-126.55277999999998,50.834717000000126],[-126.55695300000002,50.838882000000126],[-126.55972299999996,50.843880000000127],[-126.557503,50.876656000000082],[-126.55359599999991,50.881377999999984],[-126.53611799999999,50.898048000000074],[-126.531387,50.901932000000102],[-126.50110599999999,50.916099999999972],[-126.49445300000002,50.9180530000001],[-126.48332199999999,50.919158999999979],[-126.47471599999994,50.917496000000028],[-126.468613,50.914436000000137],[-126.46444700000001,50.910271000000137],[-126.45805399999995,50.907211000000075],[-126.36833200000001,50.901932000000102],[-126.35833700000001,50.901382000000069],[-126.24638400000003,50.898604999999975],[-126.22582999999997,50.898604999999975],[-126.21028100000001,50.902771000000087],[-126.20445299999994,50.90554800000001],[-126.18388399999992,50.918602000000078],[-126.17555199999993,50.92582700000014],[-126.17027299999995,50.936653000000035],[-126.17166099999997,50.946381000000088],[-126.17471299999988,50.950546000000088],[-126.17777999999998,50.951385000000016],[-126.181107,50.950829000000056],[-126.18888899999996,50.948875000000044],[-126.20028699999989,50.942490000000021],[-126.20500199999992,50.93832400000008],[-126.21556099999998,50.931106999999997],[-126.228882,50.926102000000128],[-126.24553700000001,50.923325000000034],[-126.30860899999999,50.925270000000012],[-126.412216,50.936104000000114],[-126.42639200000002,50.938599000000124],[-126.5625,50.907767999999976],[-126.56833599999993,50.903877000000136],[-126.58084099999996,50.898604999999975],[-126.66139199999998,50.868049999999982],[-126.67777999999998,50.866385999999977],[-126.72165699999994,50.876099000000011],[-126.80638099999999,50.909156999999993],[-126.81916799999999,50.915824999999984],[-126.90261799999996,50.905098000000066],[-126.90595199999996,50.90410200000008],[-126.91711399999997,50.903439000000105],[-127.01471700000002,50.903877000000136],[-127.04804999999993,50.910271000000137],[-127.08556399999998,50.921378999999945],[-127.112213,50.931106999999997],[-127.1641689999999,50.932495000000074],[-127.17639200000002,50.929161000000079],[-127.17999299999991,50.92582700000014],[-127.17804699999994,50.920273000000122],[-127.17166099999992,50.917496000000028],[-127.06276699999995,50.885269000000051],[-127.01883700000002,50.868267000000003],[-127.00765999999993,50.867939000000035],[-126.976158,50.870438000000036],[-126.97166400000003,50.869938000000047],[-126.96916999999991,50.869105999999931],[-126.96599600000002,50.86693600000001],[-126.96681999999998,50.864101000000062],[-127.01471700000002,50.819443000000092],[-127.02250700000002,50.817497000000003],[-127.03333299999997,50.817771999999991],[-127.047234,50.821663000000058],[-127.05776999999995,50.828048999999965],[-127.06166100000002,50.832213999999965],[-127.06696299999993,50.835823000000005],[-127.07333399999993,50.838882000000126],[-127.13276699999994,50.862212999999997],[-127.243607,50.896659999999997],[-127.33444199999997,50.906936999999971],[-127.39862099999993,50.926384000000041],[-127.43055699999991,50.940544000000102],[-127.53527800000001,51.000549000000035],[-127.53832999999997,51.005554000000075],[-127.53806299999997,51.008330999999998],[-127.502792,51.097487999999998],[-127.495003,51.0991590000001],[-127.47749299999992,51.097487999999998],[-127.43582199999997,51.082771000000037],[-127.40888999999987,51.071938000000046],[-127.39306599999992,51.064712999999983],[-127.38137799999998,51.059714999999983],[-127.3683319999999,51.055267000000015],[-127.354446,51.051659000000086],[-127.33056599999998,51.048331999999959],[-127.24249299999997,51.041382000000112],[-127.23610699999995,51.041107000000125],[-127.21861299999995,51.040832999999964],[-127.09612299999998,51.043883999999991],[-126.99873400000001,51.058883999999978],[-126.97956099999999,51.062881000000118],[-126.94840199999999,51.067050999999992],[-126.87339800000001,51.072883999999988],[-126.86672999999996,51.072716000000128],[-126.82656899999995,51.067050999999992],[-126.81689499999987,51.064716000000033],[-126.69167299999998,51.110550000000046],[-126.68694299999999,51.114716000000101],[-126.65278599999999,51.149994000000106],[-126.65139799999997,51.153320000000008],[-126.65110799999997,51.157494000000042],[-126.654449,51.185822000000144],[-126.65527299999997,51.187766999999951],[-126.65834000000001,51.192764000000068],[-126.66251399999993,51.194992000000013],[-126.67582700000003,51.193878000000041],[-126.67916899999994,51.192764000000068],[-126.68167099999994,51.188599000000067],[-126.68250299999994,51.176383999999985],[-126.68167099999994,51.172768000000076],[-126.68331899999998,51.165268000000026],[-126.68831599999999,51.157211000000075],[-126.69666299999994,51.14777400000014],[-126.71749899999998,51.132767000000115],[-126.84055299999989,51.094936000000075],[-126.84654999999992,51.093105000000094],[-126.85589599999997,51.092102000000068],[-126.927887,51.084938000000079],[-127.14111299999996,51.060272000000055],[-127.19249000000002,51.057213000000104],[-127.20667300000002,51.056380999999988],[-127.23832700000003,51.056938000000059],[-127.32668299999995,51.059714999999983],[-127.34084299999989,51.060822000000087],[-127.35916099999992,51.063323999999966],[-127.38861099999991,51.068054000000018],[-127.49273700000003,51.114883000000077],[-127.50985000000003,51.117359000000135],[-127.53376000000003,51.108082000000138],[-127.556107,51.099998000000028],[-127.63194299999998,51.091934000000037],[-127.64943699999998,51.092216000000064],[-127.66665599999988,51.095268000000033],[-127.67944299999988,51.101105000000132],[-127.78999299999992,51.165543000000014],[-127.79611199999994,51.197212000000036],[-127.79583700000001,51.202217000000076],[-127.787216,51.226097000000095],[-127.78472899999991,51.231376999999952],[-127.76194800000002,51.249435000000005],[-127.59973100000002,51.289435999999966],[-127.59306300000003,51.290833000000134],[-127.56555199999997,51.293052999999929],[-127.53999299999998,51.294441000000063],[-127.45140099999998,51.291939000000127],[-127.4036099999999,51.282494000000099],[-127.37554899999998,51.274437000000091],[-127.36472299999997,51.274162000000103],[-127.23110999999994,51.286110000000122],[-127.22222899999991,51.287216000000001],[-127.21444699999995,51.290549999999996],[-127.20388800000001,51.298607000000118],[-127.14334100000002,51.318329000000006],[-127.13305699999989,51.325554000000068],[-127.12693799999994,51.334991000000002],[-127.11776700000001,51.357498000000078],[-127.11110699999989,51.37721300000004],[-127.10973399999995,51.383330999999998],[-127.11028299999992,51.389717000000076],[-127.11582899999996,51.391662999999994],[-127.12249800000001,51.389160000000004],[-127.13054699999998,51.381934999999942],[-127.13417099999998,51.37721300000004],[-127.14417300000002,51.358046999999999],[-127.18250299999994,51.326942000000145],[-127.18804899999998,51.323607999999979],[-127.20834400000001,51.315826000000015],[-127.24749800000001,51.306380999999931],[-127.28056300000003,51.301102000000128],[-127.29055800000003,51.300545000000056],[-127.36749299999991,51.298881999999935],[-127.39584400000001,51.30221599999993],[-127.45221699999996,51.315826000000015],[-127.462784,51.341660000000047],[-127.55444299999999,51.332497000000046],[-127.57000699999998,51.328605999999979],[-127.75499699999989,51.319442999999978],[-127.76390100000003,51.319442999999978],[-127.77250699999996,51.3211060000001],[-127.77887699999997,51.324715000000083],[-127.78415699999994,51.333054000000118],[-127.78778099999994,51.34887700000013],[-127.78307299999994,51.356941000000006],[-127.77834300000001,51.361107000000061],[-127.74109599999997,51.380272000000048],[-127.72749299999998,51.385551000000021],[-127.69332899999995,51.390831000000048],[-127.68443300000001,51.390831000000048],[-127.65055799999999,51.408043000000077],[-127.55166600000001,51.468323000000055],[-127.51583900000003,51.519157000000007],[-127.51306199999993,51.529991000000052],[-127.512787,51.535552999999993],[-127.515289,51.5472180000001],[-127.521118,51.563880999999981],[-127.51640299999997,51.587769000000094],[-127.51500699999985,51.593880000000013],[-127.50890399999997,51.604712999999947],[-127.50055700000001,51.61360900000011],[-127.48805199999998,51.619438000000116],[-127.44444299999998,51.629990000000078],[-127.37609900000001,51.644997000000103],[-127.32584400000002,51.651382000000126],[-127.23332199999999,51.662490999999989],[-127.09584000000001,51.668052999999986],[-126.95344499999999,51.658325000000104],[-126.94693799999993,51.657657999999969],[-126.93778199999997,51.655327000000057],[-126.88377400000002,51.649494000000061],[-126.708054,51.641937000000041],[-126.66332999999986,51.64888000000002],[-126.65527299999997,51.651382000000126],[-126.620003,51.679993000000024],[-126.60694899999993,51.706940000000145],[-126.60527000000002,51.713051000000064],[-126.60582699999992,51.719436999999971],[-126.60777300000001,51.724990999999932],[-126.63555899999989,51.769714000000022],[-126.63944999999995,51.773880000000133],[-126.66027800000001,51.792221000000097],[-126.66528299999999,51.772491000000116],[-126.66665599999999,51.766388000000006],[-126.66251399999993,51.747215000000097],[-126.65387699999991,51.732491000000039],[-126.64362299999999,51.719154000000003],[-126.63999899999999,51.709991000000002],[-126.64138800000001,51.705269000000101],[-126.64388999999994,51.701102999999989],[-126.64750700000002,51.697768999999994],[-126.69304699999998,51.664711000000011],[-126.703056,51.664436000000023],[-126.91521499999999,51.682438000000047],[-126.96421799999996,51.686604000000102],[-126.97788199999997,51.690605000000062],[-127.05387899999988,51.697768999999994],[-127.07501199999996,51.697768999999994],[-127.14055599999995,51.694435000000055],[-127.27416999999997,51.68332700000002],[-127.3999859999999,51.669716000000051],[-127.41583300000002,51.665824999999984],[-127.42582699999997,51.666663999999969],[-127.43222000000003,51.66832700000009],[-127.43554699999987,51.671103999999957],[-127.43971299999993,51.674712999999997],[-127.44167299999992,51.680275000000108],[-127.42748999999998,51.731934000000138],[-127.364441,51.768326000000116],[-127.36193800000001,51.771660000000111],[-127.359444,51.777214000000072],[-127.33917200000002,51.839156999999943],[-127.33721899999989,51.851387000000045],[-127.33999599999999,51.861106999999947],[-127.34555099999994,51.864159000000086],[-127.35109699999992,51.863609000000054],[-127.35694899999999,51.860275000000058],[-127.44833399999987,51.777214000000072],[-127.57195299999989,51.706940000000145],[-127.58556399999986,51.677773000000059],[-127.54638699999992,51.627486999999917],[-127.55860899999999,51.543884000000105],[-127.56111099999998,51.538605000000132],[-127.57417299999997,51.518883000000073],[-127.58139,51.509437999999989],[-127.63583399999999,51.460548000000131],[-127.640289,51.458602999999925],[-127.65915699999999,51.457497000000103],[-127.70639,51.45638300000013],[-127.71639999999996,51.457214000000135],[-127.72389199999992,51.459435000000042],[-127.73029300000002,51.463051000000121],[-127.75473,51.479988000000105],[-127.75917099999992,51.484161000000029],[-127.76083399999993,51.48971599999993],[-127.75974300000001,51.494438000000059],[-127.74416400000001,51.498329000000126],[-127.712784,51.504439999999988],[-127.787216,51.560271999999941],[-127.87416099999996,51.663322000000051],[-127.87805200000003,51.673881999999992],[-127.88999899999999,51.798332000000016],[-127.88944999999995,51.807770000000005],[-127.886124,51.852218999999991],[-127.88474299999996,51.858604000000014],[-127.86971999999997,51.89527099999998],[-127.86609599999997,51.899993999999992],[-127.86165599999987,51.904160000000047],[-127.83306899999997,51.919991000000039],[-127.82055699999995,51.926659000000029],[-127.79638699999998,51.938599000000124],[-127.78971899999999,51.941101000000003],[-127.76611300000002,51.946937999999932],[-127.73805199999993,51.949715000000026],[-127.66443600000002,51.953880000000026],[-127.65527299999997,52.040276000000063],[-127.65387699999991,52.046386999999982],[-127.65139799999997,52.051659000000086],[-127.64527900000002,52.061934999999949],[-127.62943999999999,52.088326000000052],[-127.62581599999999,52.093047999999953],[-127.61749299999997,52.101936000000137],[-127.58029199999993,52.129158000000075],[-127.52555799999993,52.147217000000012],[-127.49944299999993,52.151657000000057],[-127.48055999999997,52.151099999999929],[-127.47721899999999,52.150543000000027],[-127.46528599999988,52.143883000000017],[-127.46140300000002,52.133049000000142],[-127.46250899999995,52.112495000000024],[-127.46611000000001,52.107773000000122],[-127.47556299999997,52.099716000000114],[-127.48249799999996,52.09693900000002],[-127.49833699999999,52.093322999999998],[-127.50834700000001,52.093322999999998],[-127.51834100000002,52.094436999999971],[-127.52722199999994,52.095825000000048],[-127.53500400000001,52.098877000000016],[-127.55277999999998,52.101105000000132],[-127.56276700000001,52.100829999999917],[-127.57167099999998,52.098877000000016],[-127.58444199999991,52.093605000000082],[-127.58889799999992,52.089714000000015],[-127.61416600000001,52.035828000000095],[-127.61332699999997,52.032494000000099],[-127.59416199999998,52.035553000000107],[-127.58612099999993,52.038048000000117],[-127.42083700000001,52.120270000000119],[-127.43360899999999,52.131659999999954],[-127.45056199999999,52.169159000000093],[-127.45249899999988,52.173882000000049],[-127.45305599999995,52.179993000000138],[-127.44972199999995,52.182770000000062],[-127.37609900000001,52.216934000000037],[-127.35417199999995,52.224709000000132],[-127.33138999999994,52.230270000000019],[-127.30027799999993,52.228325000000041],[-127.29110700000001,52.229431000000034],[-127.28443900000002,52.231934000000024],[-127.24526999999995,52.248878000000104],[-127.23944099999994,52.252220000000023],[-127.19304699999998,52.290833000000077],[-127.18582200000003,52.300270000000012],[-127.17749000000003,52.309715000000097],[-127.17166099999992,52.31249200000002],[-127.16361999999987,52.314156000000025],[-127.04276999999996,52.309158000000025],[-127.01251200000002,52.306381000000101],[-127.00499699999995,52.303604000000007],[-126.99861099999993,52.298607000000118],[-126.96444700000001,52.271659999999997],[-126.94526699999994,52.25610400000005],[-126.93804899999986,52.246941000000049],[-126.93611099999998,52.241379000000109],[-126.93554699999999,52.235268000000019],[-126.82749899999999,52.128044000000102],[-126.75195300000001,52.078605999999979],[-126.71193700000003,52.044441000000063],[-126.69415300000003,52.028877000000136],[-126.691101,52.023880000000077],[-126.68388399999998,51.999717999999973],[-126.67804699999994,51.990547000000049],[-126.67388899999997,51.986382000000049],[-126.66944899999999,51.983604000000071],[-126.66832699999998,51.985549999999932],[-126.66776999999996,51.991104000000121],[-126.66583300000002,52.031380000000127],[-126.66665599999999,52.036384999999996],[-126.66972399999997,52.041939000000013],[-126.73805199999987,52.113052000000096],[-126.76363399999991,52.13249200000007],[-126.81722999999988,52.166100000000085],[-126.83112299999999,52.17193599999996],[-126.85555999999997,52.178047000000049],[-126.86305199999993,52.181107000000111],[-126.88027999999986,52.190544000000045],[-126.90055799999999,52.205268999999987],[-126.90666199999993,52.215271000000143],[-126.94082600000002,52.303879000000052],[-126.94027699999998,52.31082200000003],[-126.93611099999998,52.32249500000006],[-126.932503,52.327217000000132],[-126.92083700000001,52.333603000000039],[-126.87361099999998,52.350830000000087],[-126.82084700000001,52.363883999999928],[-126.81416299999995,52.365273000000116],[-126.78888699999999,52.369987000000094],[-126.77667199999996,52.370270000000062],[-126.76194800000002,52.370543999999995],[-126.73638900000003,52.366386000000034],[-126.73166700000002,52.367767000000072],[-126.73249800000002,52.373877999999991],[-126.73665599999998,52.378044000000045],[-126.75167799999991,52.388328999999999],[-126.76363399999991,52.393326000000059],[-126.79277000000002,52.395546000000081],[-126.91027799999995,52.373877999999991],[-126.92610200000001,52.370827000000133],[-126.94110099999995,52.366386000000034],[-126.948036,52.363883999999928],[-126.95973199999997,52.357215999999994],[-126.96972699999998,52.34165999999999],[-126.97444200000001,52.337768999999923],[-126.98137699999995,52.33526599999999],[-127.00279199999994,52.334991000000116],[-127.08249699999993,52.334991000000116],[-127.14111299999996,52.348045000000013],[-127.15778399999999,52.352492999999981],[-127.18639400000001,52.380820999999969],[-127.22805800000003,52.453049000000135],[-127.23610699999995,52.505554000000132],[-127.23665599999998,52.51166500000005],[-127.23416099999997,52.517211999999972],[-127.19695299999995,52.549995000000138],[-127.18639400000001,52.557770000000062],[-127.08112299999993,52.613051999999982],[-127.07417299999997,52.616385999999977],[-127.05915800000002,52.620827000000077],[-127.00446299999999,52.626937999999996],[-126.99638399999998,52.62860100000006],[-126.989441,52.631935000000055],[-126.97972099999998,52.639434999999935],[-126.97609699999998,52.64388300000013],[-126.924713,52.714714000000129],[-126.92223399999995,52.718880000000013],[-126.92166099999997,52.725822000000107],[-126.92250100000001,52.731102000000021],[-126.966949,52.828606000000036],[-126.97112300000003,52.832771000000037],[-126.975281,52.835548000000131],[-126.98332199999987,52.837769000000037],[-127.01777599999991,52.845543000000021],[-127.02139299999993,52.82777400000009],[-127.01834100000002,52.823608000000036],[-127.00778199999996,52.808883999999978],[-126.98082699999992,52.724434000000031],[-126.98111,52.717491000000052],[-126.98528299999992,52.707497000000046],[-127.04250300000001,52.64777399999997],[-127.04737899999992,52.643462999999997],[-127.05561799999998,52.641815000000065],[-127.13445300000001,52.60943600000013],[-127.24054699999988,52.557770000000062],[-127.25723299999999,52.545830000000137],[-127.28083799999996,52.509162999999944],[-127.28222700000003,52.503052000000082],[-127.28028899999993,52.497489999999914],[-127.27610800000002,52.49332400000003],[-127.26528899999988,52.485550000000046],[-127.25805699999995,52.477211000000011],[-127.25834699999996,52.47304500000007],[-127.26194800000002,52.467491000000109],[-127.26666299999988,52.464157000000114],[-127.33345800000001,52.433895000000007],[-127.40082599999994,52.424431000000141],[-127.46541599999995,52.395477000000085],[-127.48935699999987,52.362072000000126],[-127.61165599999998,52.294716000000051],[-127.61833200000001,52.291939000000127],[-127.72138999999993,52.274712000000079],[-127.73055999999997,52.273604999999975],[-127.739441,52.27388000000002],[-127.74610899999999,52.276657000000114],[-127.75029000000001,52.281661999999983],[-127.80471799999998,52.248878000000104],[-127.84277299999997,52.2241590000001],[-127.84528399999999,52.219437000000028],[-127.85249299999987,52.209991000000059],[-127.85833699999995,52.206657000000064],[-127.86389200000002,52.207496999999933],[-127.86916399999996,52.211105000000032],[-127.87110899999999,52.216385000000116],[-127.87304699999999,52.223320000000001],[-127.90527299999991,52.27887700000008],[-127.86776700000001,52.494995000000074],[-127.86776700000001,52.500549000000092],[-127.86971999999997,52.506103999999993],[-127.87499999999994,52.510276999999917],[-127.88166799999999,52.51249700000011],[-127.89195299999994,52.513329000000056],[-127.89998599999996,52.50999500000006],[-127.92488899999995,52.443886000000134],[-127.92971799999992,52.427547000000004],[-127.92854299999999,52.424213000000009],[-127.92588000000001,52.421215000000132],[-127.916718,52.414879000000099],[-127.90905800000002,52.407382999999982],[-127.90589099999988,52.401549999999986],[-127.90538800000002,52.39788400000009],[-127.95694700000001,52.324440000000038],[-127.96389799999997,52.321663000000115],[-127.97277800000001,52.323326000000066],[-127.995003,52.330551000000128],[-128.00805699999989,52.336937000000034],[-128.01251200000002,52.341102999999919],[-128.05721999999997,52.394713999999965],[-128.05917399999998,52.400269000000094],[-128.06832899999995,52.447769000000051],[-128.06695599999995,52.45388000000014],[-128.05944799999992,52.470267999999976],[-128.05111699999992,52.478874000000076],[-128.0419619999999,52.487770000000012],[-128.03250100000002,52.495270000000119],[-128.00945999999999,52.508606000000043],[-127.97721899999999,52.519714000000079],[-127.96916199999993,52.521660000000111],[-127.96140300000002,52.519440000000145],[-127.95612299999993,52.515831000000105],[-127.89611799999994,52.542220999999984],[-127.89138800000001,52.546387000000038],[-127.88778699999995,52.551102000000071],[-127.87998999999991,52.574164999999994],[-127.87970699999994,52.579720000000066],[-127.88751200000002,52.577773999999977],[-128.0291749999999,52.541664000000083],[-128.04083300000002,52.535827999999981],[-128.09973099999991,52.503052000000082],[-128.1049349999999,52.492382000000077],[-128.11831699999999,52.465546000000074],[-128.14834599999995,52.422217999999987],[-128.22500599999989,52.330826000000116],[-128.23330699999997,52.321937999999989],[-128.27862499999998,52.280822999999998],[-128.28332499999993,52.276657000000114],[-128.28890999999999,52.273323000000119],[-128.29583700000001,52.270828000000108],[-128.30499299999997,52.269439999999975],[-128.39388999999989,52.291382000000056],[-128.32971199999992,52.380271999999991],[-128.29751599999992,52.400543000000027],[-128.29083300000002,52.401657],[-128.28085299999992,52.400825999999995],[-128.27416999999997,52.39804799999996],[-128.267517,52.396660000000054],[-128.260559,52.399161999999933],[-128.25585899999999,52.403320000000065],[-128.22442599999994,52.459717000000069],[-128.22192399999989,52.465271000000087],[-128.22055099999994,52.471375000000137],[-128.22109999999992,52.484436000000073],[-128.22860700000001,52.523048000000017],[-128.23055999999997,52.528328000000101],[-128.23831200000001,52.536658999999986],[-128.24221799999998,52.547775000000115],[-128.24194299999999,52.55471],[-128.23916600000001,52.566940000000102],[-128.18527199999988,52.671104000000128],[-128.14584399999995,52.719986000000063],[-128.120544,52.757217000000026],[-128.13165300000003,52.876381000000038],[-128.17001299999998,52.856658999999979],[-128.17501800000002,52.851935999999966],[-128.22305299999994,52.812492000000077],[-128.22888199999994,52.80860100000001],[-128.23525999999993,52.805824000000086],[-128.24972500000001,52.801384000000098],[-128.2744449999999,52.799438000000009],[-128.30029300000001,52.800270000000125],[-128.33999600000004,52.805549999999982],[-128.42611699999998,52.817497000000117],[-128.43612699999994,52.818886000000134],[-128.441101,52.822769000000051],[-128.48776199999986,52.873604000000114],[-128.49359100000004,52.882767000000115],[-128.495544,52.887496999999939],[-128.49887100000001,52.903602999999976],[-128.50640899999996,52.96305099999995],[-128.51556399999998,53.019988999999953],[-128.53973400000001,53.131934999999942],[-128.62554899999992,53.202217000000019],[-128.66140699999994,53.202217000000019],[-128.66082799999992,53.196938000000046],[-128.66305499999999,53.190826000000072],[-128.66723599999995,53.187492000000077],[-128.67666600000001,53.187767000000122],[-128.68527199999994,53.189430000000016],[-128.70111099999997,53.195541000000105],[-128.78832999999997,53.239715999999987],[-128.79473899999999,53.243324000000086],[-128.84887699999996,53.275826000000052],[-128.85888699999998,53.283607000000131],[-128.86639400000001,53.292220999999984],[-128.86944600000004,53.2972180000001],[-128.87832599999996,53.31638300000003],[-128.88558999999998,53.374378000000092],[-128.88798499999996,53.424965000000043],[-128.92186000000004,53.453601999999989],[-128.95916699999998,53.502777000000037],[-128.97332799999998,53.547493000000031],[-128.97277799999995,53.553047000000049],[-128.966095,53.556099000000131],[-128.80499299999997,53.569992000000013],[-128.79501300000004,53.568604000000107],[-128.78832999999997,53.564995000000067],[-128.78332499999999,53.561104],[-128.77972399999987,53.556938000000116],[-128.69250499999998,53.485268000000133],[-128.55862399999995,53.413879000000122],[-128.52362099999999,53.396660000000054],[-128.44601399999999,53.413158000000124],[-128.44517499999995,53.415993000000071],[-128.42950399999989,53.429824999999994],[-128.18972799999989,53.459991000000002],[-128.15945399999993,53.455826000000002],[-128.14862099999993,53.453605999999979],[-128.13192699999996,53.448875000000044],[-128.105255,53.440543999999989],[-128.09387199999998,53.433052000000032],[-128.07081600000004,53.394114999999942],[-128.03488200000004,53.369289000000038],[-128.00598099999996,53.34705699999995],[-127.95195000000001,53.326102999999932],[-127.94999699999988,53.321381000000031],[-127.951683,53.309990000000084],[-127.95388799999995,53.304161000000079],[-127.95694700000001,53.28138000000007],[-127.95527600000003,53.265830999999991],[-127.95111099999997,53.256386000000077],[-127.94611399999985,53.252220000000023],[-127.87526700000001,53.224433999999917],[-127.87027,53.222763000000043],[-127.868607,53.233879000000002],[-127.86776700000001,53.239715999999987],[-127.87138399999998,53.244155999999975],[-127.92259999999993,53.273685],[-127.93297599999994,53.293323999999927],[-127.92408,53.318153000000109],[-127.92593399999993,53.330750000000023],[-127.98805199999998,53.353881999999942],[-128.07165499999991,53.431380999999988],[-128.09387199999998,53.451935000000105],[-128.12692300000003,53.481102000000021],[-128.16528299999993,53.483879000000115],[-128.18331899999993,53.484161000000029],[-128.30139199999991,53.478324999999927],[-128.45187399999992,53.50332300000008],[-128.45339999999999,53.499656999999956],[-128.45640600000002,53.496822000000066],[-128.48156700000004,53.487987999999916],[-128.49021900000002,53.485325000000046],[-128.53340100000003,53.478324999999927],[-128.54457100000002,53.478992000000062],[-128.54937699999994,53.480823999999927],[-128.81304899999992,53.619155999999975],[-128.81664999999998,53.623322000000087],[-128.81805399999996,53.644714000000079],[-128.81750499999993,53.65026899999998],[-128.81390399999998,53.656936999999971],[-128.808899,53.661659000000043],[-128.78417999999988,53.675552000000096],[-128.77279699999997,53.733330000000137],[-128.79388399999988,53.764998999999932],[-128.79333500000001,53.770546000000081],[-128.79110699999995,53.776657],[-128.77056899999991,53.79583000000008],[-128.67767300000003,53.839775000000088],[-128.67384300000003,53.84160600000007],[-128.66551200000004,53.844608000000107],[-128.66067499999997,53.845439999999996],[-128.65583799999996,53.843605000000082],[-128.64482099999987,53.837105000000122],[-128.64166299999994,53.834770000000049],[-128.60360699999995,53.842216000000064],[-128.59387199999998,53.839714000000015],[-128.47720299999997,53.828605999999979],[-128.47137499999997,53.832497000000046],[-128.47555499999999,53.842216000000064],[-128.48275799999999,53.850829999999917],[-128.48944099999994,53.854163999999912],[-128.49887100000001,53.856941000000006],[-128.51000999999991,53.859161000000029],[-128.53030399999994,53.861664000000019],[-128.53832999999992,53.860275000000001],[-128.54501299999998,53.857216000000051],[-128.55306999999988,53.856102000000078],[-128.61726399999992,53.868546000000094],[-128.65962199999996,53.882885000000101],[-128.662598,53.885216000000014],[-128.66461200000003,53.888218000000109],[-128.67903099999995,53.907524000000024],[-128.67869599999995,53.910857999999962],[-128.66686999999996,53.92285900000013],[-128.66072099999997,53.928524000000095],[-128.6480709999999,53.949432000000058],[-128.63946499999997,53.96054799999996],[-128.59832799999998,54.02693899999997],[-128.60055499999993,54.031661999999983],[-128.60916099999997,54.03138000000007],[-128.61663799999997,54.029160000000104],[-128.67861899999997,54.00360900000004],[-128.68527199999994,54.000832000000116],[-128.68890399999998,53.994156000000032],[-128.69555699999989,53.976097000000095],[-128.72283899999991,53.944046000000071],[-128.72499099999999,53.940216000000078],[-128.72766100000001,53.936710000000062],[-128.73100299999993,53.933547999999917],[-128.79943799999995,53.87499200000002],[-128.91528299999999,53.787216000000001],[-128.93194600000004,53.774711999999965],[-128.98361199999994,53.762214999999969],[-129.10497999999995,53.72026800000009],[-129.11804199999989,53.714157000000057],[-129.12359599999996,53.710274000000084],[-129.21749899999992,53.64027400000009],[-129.232483,53.625824000000136],[-129.23803699999991,53.61332700000014],[-129.239441,53.601936000000023],[-129.23693800000001,53.537216000000058],[-129.23138399999999,53.500832000000059],[-129.23443599999996,53.461937000000091],[-129.23498499999999,53.456100000000106],[-129.23748799999993,53.433600999999953],[-129.27279699999997,53.379158000000018],[-129.30334499999992,53.384994999999947],[-129.33389299999999,53.397491000000059],[-129.35360700000001,53.407768000000033],[-129.51861600000001,53.514998999999989],[-129.62914999999987,53.587769000000037],[-129.686127,53.630272000000105],[-129.83084099999996,53.74721500000004],[-129.86111499999998,53.765273999999977],[-129.912781,53.79833200000013],[-130.04501300000004,53.883049000000142],[-130.05029300000001,53.886940000000038],[-130.099152,53.941933000000063],[-130.10137899999995,53.946655000000135],[-130.09136999999987,54.066101000000003],[-130.09082000000001,54.071662999999944],[-130.07693499999993,54.114441000000056],[-130.07333399999999,54.120827000000133],[-130.06500199999999,54.132209999999986],[-130.05166600000001,54.148605000000089],[-130.04666099999997,54.153320000000122],[-129.86361699999998,54.213051000000064],[-129.84887700000002,54.217491000000109],[-129.83194000000003,54.219436999999971],[-129.78205899999995,54.210601999999938],[-129.72637899999995,54.200771000000088],[-129.69738799999993,54.194435000000055],[-129.68756099999996,54.19093300000003],[-129.64416499999999,54.181938000000059],[-129.63333099999994,54.179993000000081],[-129.6141659999999,54.178917000000069],[-129.591949,54.185822000000087],[-129.47082499999999,54.235825000000034],[-129.47000100000002,54.23721299999994],[-129.47442599999999,54.239990000000034],[-129.48275799999988,54.243050000000096],[-129.51141399999989,54.244155999999975],[-129.51889,54.241936000000123],[-129.56140099999993,54.226935999999966],[-129.56777999999997,54.223877000000016],[-129.68238799999995,54.221602999999959],[-129.68823199999997,54.223099000000104],[-129.77654999999993,54.234767999999974],[-129.83666999999997,54.23832700000014],[-129.8549799999999,54.238045000000056],[-129.87136799999996,54.235268000000133],[-129.966949,54.206940000000031],[-129.97997999999995,54.200829000000113],[-129.99166899999989,54.192764000000011],[-130.03750600000001,54.173050000000103],[-130.10443099999998,54.154434000000094],[-130.11331200000001,54.153877000000023],[-130.122772,54.154434000000094],[-130.13110399999999,54.157210999999961],[-130.19168099999996,54.193321000000083],[-130.22805800000003,54.258606000000043],[-130.238586,54.294998000000078],[-130.2611389999999,54.342765999999983],[-130.27584799999994,54.349716000000058],[-130.28250100000002,54.346382000000062],[-130.332764,54.329720000000066],[-130.34887700000002,54.326942000000088],[-130.39138799999995,54.330276000000083],[-130.45166,54.336655000000121],[-130.45916699999998,54.338600000000099],[-130.48111,54.364715999999987],[-130.48388699999998,54.401657000000114],[-130.47637899999989,54.430550000000096],[-130.47360199999997,54.43582200000003],[-130.43362400000001,54.496658000000139],[-130.42999299999997,54.562492000000077],[-130.43972799999989,54.612212999999997],[-130.44055200000003,54.617493000000024],[-130.43859900000001,54.623604000000114],[-130.43277,54.627487000000031],[-130.42556799999994,54.629715000000033],[-130.41665599999993,54.630272000000105],[-130.40750099999997,54.62860100000006],[-130.39779699999997,54.626381000000038],[-130.38946499999992,54.62332200000003],[-130.37554899999992,54.616661000000136],[-130.33215299999995,54.578552000000002],[-130.28167699999995,54.528381000000024],[-130.22277799999989,54.471931000000041],[-130.06304899999986,54.339989000000116],[-130.05776999999995,54.336105000000089],[-130.03723100000002,54.326103000000103],[-130.02084400000001,54.319992000000013],[-129.99304199999989,54.31221000000005],[-129.98275799999993,54.311104000000057],[-129.96581999999995,54.313049000000035],[-129.95916699999998,54.316100999999946],[-129.95584099999985,54.322495000000004],[-129.95971700000001,54.326942000000088],[-129.96722399999993,54.328880000000026],[-129.98165900000004,54.324439999999981],[-129.99054000000001,54.32388300000008],[-130.02362099999993,54.335548000000017],[-130.0386049999999,54.341934000000094],[-130.04388399999999,54.345824999999991],[-130.14779699999997,54.44193300000012],[-130.31382799999994,54.586269000000073],[-130.36721799999992,54.635268999999994],[-130.37222299999996,54.644714000000079],[-130.374146,54.654991000000052],[-130.36859100000004,54.667770000000132],[-130.35861199999999,54.677490000000034],[-130.35278299999999,54.681381000000101],[-130.33972199999999,54.687492000000134],[-130.32501200000002,54.692214999999976],[-130.24386599999997,54.707771000000093],[-130.23553499999997,54.709160000000111],[-130.22582999999997,54.708885000000066],[-130.17193599999996,54.703606000000093],[-130.16195700000003,54.701103000000103],[-130.15362500000003,54.698326000000009],[-130.10110499999996,54.671660999999972],[-130.075287,54.657767999999976],[-130.06887800000004,54.648604999999975],[-130.06500199999999,54.644440000000145],[-130.054169,54.636658000000011],[-130.02694699999989,54.623047000000042],[-130.00058000000001,54.61471599999993],[-129.98083500000001,54.609993000000145],[-129.959991,54.607498000000135],[-129.91027800000001,54.605552999999929],[-129.968323,54.62193300000007],[-130.00445599999989,54.632767000000115],[-130.02807599999994,54.641936999999984],[-130.19473299999999,54.723320000000001],[-130.20166,54.72693600000008],[-130.20111099999986,54.732490999999982],[-130.17388899999992,54.846656999999993],[-130.17111199999999,54.851662000000033],[-130.16583300000002,54.856659000000093],[-130.16082799999998,54.861382000000106],[-130.05835000000002,54.952773999999977],[-130.04583700000001,54.959991000000059],[-130.03195199999993,54.965271000000143],[-129.94694499999991,54.970490000000098],[-129.9362789999999,54.971153000000072],[-129.92394999999993,54.970322000000067],[-129.91810599999985,54.968826000000092],[-129.90977499999997,54.964661000000092],[-129.90745500000003,54.962158000000102],[-129.65444899999994,54.980545000000006],[-129.646973,54.982765000000029],[-129.64028899999994,54.985825000000091],[-129.62249799999995,54.997772000000055],[-129.62499999999994,55.00249500000001],[-129.79998799999998,55.006942999999978],[-129.86608899999999,55.006660000000011],[-129.87527499999999,55.00610400000005],[-129.883331,55.004715000000033],[-129.90585299999998,54.997772000000055],[-129.91390999999993,54.996383999999921],[-129.96487400000001,55.003436999999963],[-129.97171000000003,55.004608000000076],[-129.97905000000003,55.008938000000057],[-129.98138399999993,55.011608000000138],[-129.98104899999993,55.014938000000143],[-129.9963679999999,55.024162000000047],[-129.97555499999993,55.066939999999931],[-129.96139500000004,55.093323000000112],[-129.95638999999989,55.098045000000013],[-129.84750399999996,55.210548000000074],[-129.72665399999988,55.338600000000099],[-129.66300999999999,55.412212000000011],[-129.64334099999996,55.434158000000025],[-129.63723800000002,55.438042000000053],[-129.62222299999996,55.442490000000021],[-129.60525499999994,55.445267000000115],[-129.58471700000001,55.443878000000097],[-129.54110700000001,55.438042000000053],[-129.52389500000004,55.439987000000031],[-129.50863599999997,55.444434999999999],[-129.48831199999995,55.453605999999922],[-129.47610499999996,55.461380000000133],[-129.47164899999996,55.467209000000139],[-129.47109999999992,55.472762999999986],[-129.47500600000001,55.47693600000008],[-129.48416099999997,55.478600000000085],[-129.62027,55.459434999999985],[-129.63696299999998,55.45665699999995],[-129.679123,55.473156000000131],[-129.68611099999998,55.467491000000052],[-129.69662500000004,55.45399100000003],[-129.69979899999993,55.450993000000096],[-129.70428500000003,55.449661000000049],[-129.70979299999993,55.450657000000035],[-129.71211199999999,55.453327000000115],[-129.71362299999993,55.456161000000122],[-129.78695700000003,55.566666000000112],[-129.78582800000004,55.50277699999998],[-129.779449,55.493607000000111],[-129.77224699999999,55.47943099999992],[-129.78030399999994,55.359717999999987],[-129.78250100000002,55.353607000000068],[-129.81390399999987,55.289719000000048],[-129.81750499999998,55.283332999999971],[-129.90695199999988,55.168052999999986],[-129.911407,55.162491000000045],[-129.92083699999995,55.151931999999988],[-130.02835099999999,55.036385000000109],[-130.06832900000001,54.996941000000049],[-130.07443199999994,54.992767000000015],[-130.08166499999999,54.990546999999992],[-130.09082000000001,54.989990000000091],[-130.10055499999999,54.990546999999992],[-130.10833699999995,54.992493000000081],[-130.11361699999992,54.996383999999921],[-130.12777700000004,55.013885000000073],[-130.16027799999995,55.069717000000026],[-130.16223099999996,55.079993999999999],[-130.1600039999999,55.086105000000089],[-130.11859099999998,55.142493999999942],[-130.11416599999995,55.148331000000098],[-130.08084099999991,55.184714999999983],[-130.06390399999998,55.195266999999944],[-130.04528799999997,55.204163000000051],[-130.03918499999992,55.208046000000024],[-129.948059,55.276382000000012],[-129.94387799999998,55.282211000000018],[-129.94473300000004,55.287216000000058],[-129.94888300000002,55.295830000000137],[-129.96054100000003,55.308884000000035],[-130.00863599999997,55.370827000000077],[-130.101654,55.556380999999988],[-130.10360700000001,55.566666000000112],[-130.12887599999999,55.722214000000122],[-130.12942499999997,55.732765000000029],[-130.12887599999999,55.738602000000014],[-130.12609900000001,55.750275000000045],[-130.12191799999994,55.762496999999996],[-130.11639400000001,55.774993999999992],[-130.11276199999998,55.781661999999983],[-130.10833699999995,55.787216000000001],[-130.09109499999994,55.799995000000024],[-130.07916299999999,55.808044000000052],[-130.06722999999994,55.815826000000015],[-130.0552669999999,55.823883000000137],[-130.03945899999997,55.838326000000052],[-129.96664399999992,55.912209000000018],[-129.962219,55.917770000000019],[-129.96417199999991,55.928329000000076],[-129.97137499999985,55.931663999999955],[-129.97970599999985,55.932213000000104],[-129.99499500000002,55.927773000000059],[-130.0019529999999,55.924713000000054],[-130.00500499999993,55.921661000000086],[-130.01507600000002,55.909179999999992],[-130.01419099999998,56.023880000000133],[-130.0147399999999,56.025826000000052],[-130.0538939999999,56.075554000000011],[-130.08859299999995,56.118049999999982],[-130.22915599999993,56.090271000000143],[-130.36526499999991,56.123878000000104],[-130.44750999999991,56.206383000000073],[-130.46194499999996,56.235268000000133],[-130.48471099999995,56.239433000000133],[-130.53277599999996,56.246384000000035],[-130.5607149999999,56.250000000000114],[-130.62719699999997,56.258606000000043],[-130.720551,56.325554000000125],[-130.75585899999999,56.353049999999996],[-130.77444500000001,56.366104000000064],[-130.84722899999997,56.374435000000119],[-130.92001300000004,56.382492000000127],[-131.05499299999997,56.398048000000074],[-131.07055699999995,56.403602999999976],[-131.12582399999997,56.424163999999962],[-131.1444699999999,56.434715000000097],[-131.16473400000001,56.445267000000058],[-131.20526100000001,56.465828000000101],[-131.22137499999997,56.472488000000112],[-131.290009,56.500548999999978],[-131.31445299999996,56.509994999999947],[-131.53945899999991,56.596656999999993],[-131.55777,56.602219000000105],[-131.57888800000001,56.603324999999927],[-131.61111499999998,56.602219000000105],[-131.81610099999995,56.594994000000042],[-131.82415800000001,56.59693900000002],[-131.82861299999996,56.600830000000087],[-131.85803199999987,56.718880000000127],[-131.86361699999992,56.786110000000122],[-131.86053500000003,56.797775000000001],[-131.86138899999997,56.79972100000009],[-132.10305800000003,56.866661000000022],[-132.09194899999994,56.893607999999972],[-132.06195100000002,56.959717000000069],[-132.03668199999993,57.013054000000011],[-132.02749600000004,57.036385000000053],[-132.22109999999992,57.068054000000075],[-132.316956,57.083878000000027],[-132.33694500000001,57.088325999999995],[-132.32611099999997,57.100548000000117],[-132.26806599999986,57.16304800000006],[-132.25473,57.17471299999994],[-132.226654,57.204711999999972],[-132.35415599999988,57.354439000000127],[-132.36972000000003,57.37082700000002],[-132.37914999999992,57.37943300000012],[-132.45111099999986,57.435265000000072],[-132.471924,57.451103000000103],[-132.4927669999999,57.46665999999999],[-132.50363200000004,57.474158999999986],[-132.61944599999998,57.583328000000051],[-132.75250199999994,57.709435000000042],[-132.76113899999996,57.717765999999926],[-132.76889,57.72665400000011],[-132.78222700000003,57.745270000000119],[-132.79110699999995,57.7586060000001],[-132.79583700000001,57.768883000000073],[-132.79611199999999,57.773879999999963],[-132.80722000000003,57.787773000000016],[-132.81362899999988,57.795546999999999],[-132.82138099999992,57.804436000000067],[-132.87304699999999,57.855270000000075],[-132.88165299999997,57.86360900000011],[-132.92861900000003,57.90554800000001],[-132.93777499999999,57.913322000000051],[-132.96472199999999,57.93332700000002],[-132.99499500000002,57.951660000000061],[-133.03332499999988,57.978874000000076],[-133.04388399999999,57.986938000000066],[-133.05306999999993,57.99471299999999],[-133.058044,57.999435000000062],[-133.070831,58.012215000000026],[-133.08749399999999,58.033332999999971],[-133.09500100000002,58.047775000000115],[-133.10415599999999,58.073051000000135],[-133.10720800000001,58.083328000000108],[-133.11111500000004,58.093323000000055],[-133.13696299999998,58.135826000000122],[-133.18472299999991,58.176102000000128],[-133.19500700000003,58.184158000000025],[-133.21139499999998,58.196381000000031],[-133.23361199999999,58.211380000000133],[-133.3061219999999,58.257216999999969],[-133.36111499999993,58.28054800000001],[-133.43029799999994,58.359993000000088],[-133.408905,58.400268999999923],[-133.38790899999998,58.4120640000001],[-133.42999299999991,58.459160000000054],[-133.55889899999994,58.528046000000074],[-133.73580900000002,58.644713999999965],[-133.80834999999996,58.709991000000002],[-133.82693499999999,58.726097000000038],[-134.08749399999999,58.808327000000133],[-134.23110999999989,58.851936000000023],[-134.245544,58.856941000000063],[-134.32000699999998,58.916099999999972],[-134.32556199999999,58.920830000000024],[-134.33221400000002,58.929718000000037],[-134.33221400000002,58.935265000000129],[-134.32556199999999,58.971100000000035],[-134.37942499999991,59.049164000000076],[-134.38613899999996,59.058044000000109],[-134.45556599999998,59.122489999999971],[-134.46139499999992,59.126656000000025],[-134.47500599999989,59.1336060000001],[-134.53222700000003,59.132210000000043],[-134.56640599999997,59.130547000000092],[-134.65084799999994,59.185546999999985],[-134.67166099999997,59.200272000000098],[-134.67529300000001,59.214714000000072],[-134.68804899999992,59.243324000000086],[-134.73889199999991,59.250275000000045],[-134.95193499999993,59.279991000000109],[-135.09167499999995,59.426940999999999],[-135.07971199999992,59.4447100000001],[-135.06332399999997,59.458046000000081],[-135.03973399999995,59.466934000000037],[-135.03057899999999,59.46804800000001],[-135.02111799999994,59.471099999999922],[-135.01779199999999,59.498878000000047],[-135.01501500000001,59.54055000000011],[-135.01446499999997,59.567497000000003],[-135.09722899999997,59.621376000000055],[-135.12027,59.621658000000139],[-135.13275099999998,59.622765000000072],[-135.1541749999999,59.62721300000004],[-135.17749000000003,59.636939999999981],[-135.33612099999999,59.726654000000053],[-135.47360199999997,59.801933000000076],[-135.50613399999997,59.793884000000048],[-135.82333399999999,59.705550999999957],[-135.94915800000001,59.669158999999979],[-136.07138099999997,59.657494000000099],[-136.12081899999998,59.651656999999943],[-136.16000399999996,59.646660000000054],[-136.20776399999988,59.639434999999992],[-136.31054700000004,59.612495000000138],[-136.34387200000003,59.602776000000119],[-136.34637499999991,59.600548000000003],[-136.29834,59.583603000000039],[-136.23916600000001,59.561377999999991],[-136.23388699999992,59.525826000000052],[-136.29305999999991,59.476097000000038],[-136.29998799999993,59.471099999999922],[-136.37164300000001,59.452492000000063],[-136.46362299999993,59.469711000000132],[-136.46417199999996,59.414153999999996],[-136.46249399999994,59.37221500000004],[-136.46249399999994,59.302490000000091],[-136.46276899999998,59.289436000000023],[-136.48083499999996,59.261939999999925],[-136.49221799999998,59.249718000000144],[-136.55835000000002,59.186377999999991],[-136.58389299999988,59.163321999999937],[-136.61138900000003,59.164711000000125],[-136.71972699999998,59.165268000000026],[-136.80889899999994,59.165268000000026],[-136.88833599999998,59.131934999999999],[-136.94195599999995,59.109436000000073],[-136.96972700000003,59.098328000000095],[-137.03308100000004,59.077492000000063],[-137.25167799999997,59.006104000000107],[-137.29611199999999,58.989989999999977],[-137.31417799999997,58.981102000000021],[-137.33889799999997,58.965546000000074],[-137.39279199999999,58.928329000000019],[-137.42028800000003,58.91415400000011],[-137.42749000000003,58.911377000000016],[-137.44500699999998,58.907494000000099],[-137.46554600000002,58.906096999999932],[-137.47805800000003,58.907211000000132],[-137.48803699999996,58.909156999999993],[-137.49581899999998,58.911934000000088],[-137.50167799999991,58.916382000000056],[-137.50500499999993,58.920273000000122],[-137.50750700000003,58.925552000000096],[-137.50723299999999,58.937767000000008],[-137.50527999999997,58.944153000000142],[-137.49722299999996,58.964157000000057],[-137.48776199999992,58.982490999999982],[-137.47970599999996,58.998046999999985],[-137.49914599999994,59.041382000000112],[-137.54528799999997,59.143051000000128],[-137.566101,59.186935000000062],[-137.59082000000001,59.238602000000014],[-137.91027800000001,59.408043000000077],[-138.11776699999996,59.516663000000051],[-138.30361900000003,59.613052000000039],[-138.49108899999993,59.708328000000051],[-138.5386049999999,59.732208000000071],[-138.615814,59.77416199999999],[-138.64724699999999,59.805550000000039],[-138.65472399999993,59.81471300000004],[-138.66363499999989,59.829162999999937],[-138.66610699999995,59.834435000000042],[-138.66915900000004,59.844994000000099],[-138.67501799999997,59.86693600000001],[-138.69027700000004,59.906936999999971],[-138.97192399999994,59.978600000000085],[-139.04779099999996,59.997490000000028],[-139.11639400000001,60.041382000000112],[-139.161407,60.07027400000004],[-139.18890399999987,60.088882000000069],[-139.183899,60.102219000000105],[-139.15527299999997,60.154991000000052],[-139.13363600000002,60.194435000000112],[-139.12527499999993,60.207771000000093],[-139.08221399999996,60.287498000000028],[-139.06500199999988,60.330276000000083],[-139.06640600000003,60.344153999999946],[-139.06805399999996,60.352219000000048],[-139.51947000000001,60.344711000000018],[-139.67666599999995,60.340546000000018],[-139.77166699999992,60.292496000000028],[-139.86639400000001,60.244438000000059],[-139.91305499999987,60.220824999999934],[-139.97943099999998,60.187767000000122],[-140.005585,60.193878000000041],[-140.45083599999992,60.309715000000097],[-140.471924,60.283882000000006],[-140.493042,60.25777400000004],[-140.50195299999996,60.244713000000104],[-140.52139299999993,60.222214000000122],[-140.94638099999997,60.297775000000001],[-140.995544,60.307213000000047],[-141.00058000000001,60.366661000000022],[-141.00112899999999,60.399436999999978],[-141.00030500000003,60.933051999999975],[-141.00167799999991,60.966384999999946],[-141.00030500000003,62.733046999999942],[-141.00140399999998,63.099998000000141],[-141.00195299999996,63.83277099999998],[-141.00030500000003,63.966385000000059],[-141.00030500000003,64.199706999999989],[-141.00195299999996,65.132751000000098],[-141.00030500000003,65.166092000000049],[-141.00030500000003,65.232758000000047],[-141.00195299999996,65.699416999999983],[-141.00195299999996,66.099425999999994],[-141.00167799999991,66.499419999999986],[-141.00085399999995,66.666382000000112],[-141.00058000000001,66.866089000000102],[-141.00167799999991,67.066376000000105],[-141.00222799999995,67.299149000000057],[-141.00058000000001,67.532486000000119],[-141,67.732758000000103],[-141.00195299999996,67.865814000000057],[-141.00195299999996,68.065811000000053],[-141.00195299999996,68.23275799999999],[-141.00167799999991,68.532761000000107],[-141.00085399999995,68.965546000000018],[-141.00058000000001,69.432479999999941],[-141.00085399999995,69.532211000000018],[-141.00299100000001,69.642365000000098],[-140.98220800000001,69.642761000000007],[-140.90945399999998,69.639160000000118],[-140.83306900000002,69.635269000000051],[-140.81610099999995,69.6336060000001],[-140.79528799999997,69.627197000000081],[-140.77001999999999,69.621643000000063],[-140.73831200000001,69.617751999999996],[-140.61554000000001,69.60832199999993],[-140.48831200000001,69.599425999999994],[-140.39611799999994,69.596099999999979],[-140.26141399999995,69.596649000000127],[-140.21887200000003,69.600815000000011],[-140.17944299999988,69.606369000000029],[-140.12914999999998,69.614990000000091],[-140.10055499999999,69.617477000000008],[-140.08471700000001,69.618042000000003],[-139.94387800000004,69.618865999999969],[-139.92639199999991,69.618590999999981],[-139.88833599999998,69.616653000000042],[-139.81054699999999,69.606644000000017],[-139.78112799999997,69.602203000000088],[-139.605255,69.575546000000031],[-139.57611099999986,69.570830999999998],[-139.67001299999998,69.579162999999994],[-139.68472299999996,69.581375000000037],[-139.77639799999997,69.599716000000001],[-139.7647399999999,69.590820000000065],[-139.75668299999995,69.586655000000064],[-139.73165899999998,69.581099999999992],[-139.60665899999992,69.559417999999994],[-139.573059,69.556091000000038],[-139.5350039999999,69.553863999999976],[-139.351654,69.53637700000013],[-139.14306599999998,69.510817999999915],[-139.11639400000001,69.505554000000132],[-139.10833699999995,69.501663000000065],[-139.10137899999995,69.491364000000033],[-139.09222399999999,69.481658999999979],[-139.069458,69.463318000000129],[-139.05584699999991,69.454987000000074],[-139.04806499999995,69.450821000000133],[-138.975281,69.414993000000095],[-138.95748900000001,69.407486000000006],[-138.93945299999996,69.399994000000049],[-138.88275099999993,69.384720000000129],[-138.83361799999994,69.373306000000071],[-138.79916399999991,69.364150999999993],[-138.76916499999999,69.35386699999998],[-138.75140399999998,69.346375000000023],[-138.64389,69.291367000000037],[-138.62164300000001,69.273041000000035],[-138.61639400000001,69.268326000000002],[-138.60720799999996,69.2586060000001],[-138.60498000000001,69.247482000000048],[-138.44998199999992,69.229156000000046],[-138.26916499999999,69.196365000000071],[-138.25390599999997,69.188309000000004],[-138.21887200000003,69.173309000000074],[-138.17721599999993,69.159988000000112],[-138.14334099999996,69.150818000000072],[-138.06332399999997,69.129424999999969],[-138.03945899999997,69.123596000000134],[-138.00112899999993,69.115265000000022],[-137.69638099999992,69.049712999999997],[-137.59445199999999,69.027771000000143],[-137.41915900000004,68.988876000000005],[-137.25500499999998,68.948318000000086],[-137.22610499999996,68.944977000000051],[-137.19222999999994,68.943863000000079],[-137.13027999999986,68.944977000000051],[-136.9786069999999,68.931931000000134],[-136.97332799999998,68.927200000000028],[-136.966095,68.923309000000131],[-136.95416299999994,68.920258000000103],[-136.78973399999995,68.881927000000076],[-136.74554399999994,68.875259000000085],[-136.68249499999996,68.871918000000051],[-136.65972899999997,68.874984999999981],[-136.64279199999993,68.878036000000009],[-136.63751199999996,68.884155000000021],[-136.63082900000001,68.889160000000061],[-136.61999500000002,68.891936999999984],[-136.52224699999999,68.909149000000014],[-136.50836199999998,68.910262999999986],[-136.47747800000002,68.910812000000135],[-136.42059299999994,68.9015500000001],[-136.39306599999992,68.897217000000069],[-136.35861199999999,68.893874999999923],[-136.25585899999999,68.889435000000105],[-136.14501999999999,68.885817999999972],[-136.09722899999991,68.88220200000012],[-136.02780199999989,68.873032000000023],[-135.98666399999996,68.864990000000091],[-135.85879499999993,68.838974000000064],[-135.83166499999999,68.831940000000031],[-135.54055799999992,68.752486999999974],[-135.519745,68.74581900000004],[-135.49194299999988,68.735259999999982],[-135.48498499999999,68.731094000000098],[-135.45388799999995,68.709427000000062],[-135.40695199999993,68.679977000000122],[-135.36554000000001,68.675812000000121],[-135.21054099999998,68.661377000000016],[-135.1600039999999,68.657211000000132],[-135.14752199999998,68.658874999999966],[-135.14639299999993,68.663879000000122],[-135.21444699999995,68.693038999999999],[-135.25363200000004,68.706940000000145],[-135.34359699999993,68.737762000000032],[-135.48193400000002,68.809418000000107],[-135.50613399999997,68.832488999999953],[-135.500854,68.838593000000003],[-135.48666399999996,68.839431999999988],[-135.45306399999998,68.838042999999971],[-135.43917799999991,68.835541000000092],[-135.40499899999998,68.831940000000031],[-135.341949,68.831664999999987],[-135.33804299999997,68.834991000000059],[-135.34973099999996,68.838042999999971],[-135.42166099999997,68.848877000000016],[-135.49472000000003,68.854979999999955],[-135.52835099999993,68.856368999999972],[-135.56054700000004,68.860260000000039],[-135.59527600000001,68.86943100000002],[-135.60443099999998,68.873032000000023],[-135.61886599999997,68.881362999999965],[-135.62359600000002,68.886107999999979],[-135.61389199999991,68.889435000000105],[-135.33581499999997,68.917755000000113],[-135.241669,68.926926000000094],[-135.22720299999997,68.925537000000077],[-135.21554600000002,68.922484999999995],[-135.20861799999994,68.918319999999994],[-135.19665499999991,68.909714000000065],[-135.19168100000002,68.904984000000013],[-135.18695100000002,68.90026899999998],[-135.12191799999999,68.893326000000002],[-134.97747799999996,68.878311000000053],[-134.95111099999997,68.88108799999992],[-134.91723599999995,68.898041000000035],[-134.89474499999994,68.912490999999932],[-134.87777700000004,68.920822000000044],[-134.85803199999998,68.927765000000022],[-134.845551,68.929428000000144],[-134.81723,68.925812000000064],[-134.80334499999998,68.923035000000027],[-134.74581899999998,68.907486000000063],[-134.70889299999999,68.892761000000121],[-134.66946399999989,68.873305999999957],[-134.64169299999992,68.856644000000017],[-134.49554399999994,68.75221300000004]],[[-93.519729999999925,63.839432000000102],[-93.339995999999985,63.80832700000002],[-93.329726999999934,63.809715000000097],[-93.217498999999975,63.838599999999985],[-93.216110000000015,63.843605000000025],[-93.225006000000008,63.847771000000137],[-93.236389000000031,63.847487999999942],[-93.267501999999922,63.84276600000004],[-93.278884999999946,63.842491000000052],[-93.291671999999949,63.844994000000042],[-93.333892999999932,63.859160999999972],[-93.343338000000017,63.863052000000039],[-93.357498000000021,63.871376000000112],[-93.441939999999931,63.921660999999915],[-93.448883000000023,63.925827000000027],[-93.449721999999952,63.930824000000086],[-93.452498999999989,63.954437000000041],[-93.451110999999969,63.959717000000126],[-93.443329000000006,63.965546000000131],[-93.433884000000035,63.968596999999988],[-93.423614999999927,63.970825000000104],[-93.413054999999986,63.971930999999927],[-93.389998999999932,63.971656999999993],[-93.36471599999993,63.967491000000109],[-93.27305599999994,63.928047000000049],[-93.12222300000002,63.892493999999999],[-92.960281000000009,63.855826999999977],[-92.841675000000009,63.83526599999999],[-92.65194699999995,63.787498000000028],[-92.549728000000016,63.81082200000003],[-92.540558000000033,63.814713000000097],[-92.530563000000029,63.816939999999988],[-92.507506999999976,63.816383000000087],[-92.583892999999989,63.829436999999984],[-92.606948999999872,63.829720000000123],[-92.619155999999919,63.831383000000073],[-92.669158999999979,63.839989000000003],[-92.706954999999937,63.846656999999936],[-92.935546999999985,63.904990999999995],[-92.942489999999964,63.90915700000005],[-92.956116000000009,63.932770000000005],[-92.965285999999992,63.936652999999922],[-93.218886999999995,63.979431000000034],[-93.266113000000018,63.981934000000024],[-93.276397999999972,63.979713000000061],[-93.288054999999986,63.980545000000006],[-93.301102000000014,63.983047000000056],[-93.436661000000015,64.015274000000034],[-93.612212999999997,64.093048000000067],[-93.627212999999983,64.106369000000029],[-93.635009999999909,64.115265000000136],[-93.635833999999988,64.120255000000043],[-93.689986999999917,64.156096999999988],[-93.751677999999913,64.188873000000058],[-93.761123999999882,64.192748999999992],[-93.773055999999997,64.19358799999992],[-93.779723999999987,64.189697000000024],[-93.776947000000007,64.184981999999991],[-93.665008999999941,64.087204000000042],[-93.660004000000015,64.083054000000061],[-93.604172000000005,64.044434000000138],[-93.654723999999931,63.992493000000024],[-93.731673999999998,63.987212999999997],[-93.759170999999924,63.984161000000029],[-93.770553999999947,63.957771000000037],[-93.654449,63.896660000000111],[-93.59973100000002,63.870270000000062],[-93.55360399999995,63.850548000000003],[-93.533324999999991,63.84276600000004],[-93.519729999999925,63.839432000000102]],[[-70.783065999999963,48.380547000000092],[-70.782501000000025,48.348045000000127],[-70.768065999999919,48.35054800000006],[-70.548049999999989,48.356383999999991],[-70.498885999999914,48.353324999999984],[-70.464172000000019,48.3491590000001],[-70.383057000000008,48.331108000000086],[-70.332229999999981,48.316666000000112],[-70.272780999999952,48.298332000000016],[-70.237777999999992,48.282493999999986],[-70.210007000000019,48.269714000000022],[-70.198607999999979,48.26249700000011],[-70.06138599999997,48.239989999999977],[-70.040833000000021,48.244437999999946],[-70.025833000000034,48.246101000000067],[-70.017501999999865,48.245270000000062],[-69.995543999999995,48.239989999999977],[-69.936935000000005,48.221931000000041],[-69.920546999999885,48.216385000000002],[-69.828339000000028,48.166382000000056],[-69.838333000000034,48.173881999999935],[-69.84722899999997,48.181938000000002],[-69.861938000000009,48.198875000000044],[-69.871933000000013,48.212493999999936],[-69.879439999999931,48.220825000000048],[-69.884170999999981,48.224159000000043],[-69.95944199999991,48.269440000000088],[-69.977218999999991,48.274436999999978],[-69.985549999999989,48.274994000000049],[-69.993332000000009,48.274712000000022],[-70.043610000000001,48.267211999999915],[-70.099990999999989,48.267211999999915],[-70.131942999999978,48.269714000000022],[-70.151108000000022,48.274436999999978],[-70.167770000000019,48.279990999999995],[-70.272507000000019,48.325554000000125],[-70.420273000000009,48.361381999999992],[-70.427779999999984,48.361107000000118],[-70.635009999999966,48.390549000000078],[-70.727782999999874,48.415825000000098],[-70.739165999999955,48.423049999999989],[-70.751952999999958,48.42849300000006],[-70.761397999999929,48.431938000000002],[-70.779998999999975,48.435546999999985],[-70.954726999999991,48.459717000000012],[-70.980559999999912,48.462212000000022],[-71.012221999999952,48.46166199999999],[-71.025283999999886,48.457496999999989],[-71.048614999999927,48.445267000000058],[-71.047774999999888,48.444434999999942],[-71.031386999999995,48.443320999999969],[-70.906386999999938,48.423325000000034],[-70.799987999999985,48.401657000000057],[-70.785552999999879,48.395828000000051],[-70.781386999999881,48.391936999999984],[-70.779449,48.386940000000095],[-70.783065999999963,48.380547000000092]],[[-108.13890100000003,71.981658999999979],[-108.15583799999996,71.980820000000051],[-108.17415599999998,71.983322000000101],[-108.18720999999999,71.986649000000057],[-108.18916300000001,71.99192800000003],[-108.19972199999995,72.050537000000077],[-108.19027699999998,72.055542000000116],[-108.1702729999999,72.064423000000033],[-108.16027799999995,72.062759000000028],[-108.13417099999992,72.056091000000094],[-108.07444799999996,72.034149000000014],[-108.06416299999995,72.030272999999966],[-108.06220999999999,72.02526899999998],[-108.06304899999998,72.019440000000145],[-108.069458,72.013046000000088],[-108.07721700000002,72.007217000000082],[-108.10526999999996,71.992751999999996],[-108.12526700000001,71.983871000000022],[-108.13890100000003,71.981658999999979]],[[-85.84722899999997,72.294144000000074],[-85.837218999999948,72.288879000000009],[-85.837218999999948,72.262771999999927],[-85.851669000000015,72.241364000000033],[-85.877486999999917,72.221649000000014],[-85.889175000000023,72.218047999999953],[-85.90834000000001,72.217758000000117],[-85.981110000000001,72.236373999999955],[-86.005844000000025,72.243591000000094],[-86.061110999999983,72.261658000000125],[-86.096389999999985,72.276382000000012],[-86.107223999999917,72.283875000000023],[-86.110001000000011,72.289703000000145],[-86.101395000000025,72.293594000000041],[-86.093338000000017,72.294708000000014],[-86.067229999999995,72.293869000000029],[-86.005004999999983,72.296646000000123],[-85.863891999999964,72.297211000000004],[-85.84722899999997,72.294144000000074]],[[-78.735000999999954,72.365540000000124],[-78.75389100000001,72.363312000000008],[-78.81220999999988,72.365265000000079],[-78.830840999999964,72.364990000000091],[-78.854172000000005,72.362197999999978],[-78.874435000000005,72.358871000000079],[-78.889450000000011,72.354706000000078],[-78.91332999999986,72.345535000000098],[-78.920836999999949,72.341370000000097],[-78.93499799999995,72.336380000000077],[-78.950286999999946,72.334991000000059],[-79.053054999999972,72.360809000000017],[-79.075561999999934,72.403046000000074],[-79.075012000000015,72.409714000000065],[-79.070847000000015,72.414993000000038],[-79.066665999999998,72.420258000000103],[-79.044448999999929,72.426651000000049],[-79.00140399999998,72.438309000000118],[-78.97084000000001,72.445250999999985],[-78.955565999999919,72.444427000000019],[-78.950561999999991,72.442199999999957],[-78.946655000000021,72.440262000000018],[-78.939986999999917,72.435806000000127],[-78.846953999999926,72.415543000000071],[-78.833892999999989,72.411926000000108],[-78.740829000000019,72.374419999999986],[-78.731673999999941,72.36943100000002],[-78.735000999999954,72.365540000000124]],[[-79.508056999999951,72.348602000000028],[-79.533889999999985,72.346099999999979],[-79.555832000000009,72.346939000000077],[-79.572234999999978,72.349152000000061],[-79.581954999999994,72.35165399999994],[-79.59445199999999,72.356934000000024],[-79.609436000000017,72.36692800000003],[-79.624160999999901,72.379425000000026],[-79.683318999999983,72.430542000000116],[-79.586120999999991,72.453872999999987],[-79.576675000000023,72.456100000000049],[-79.552489999999921,72.451096000000121],[-79.541381999999999,72.444977000000051],[-79.529174999999952,72.439697000000024],[-79.502791999999886,72.429977000000122],[-79.46945199999999,72.423035000000027],[-79.43638599999997,72.418319999999994],[-79.42971799999998,72.411652000000004],[-79.440552000000025,72.37052900000009],[-79.446654999999907,72.364990000000091],[-79.455565999999919,72.359985000000052],[-79.470275999999956,72.355545000000006],[-79.508056999999951,72.348602000000028]],[[-79.993606999999997,72.413315000000125],[-80.009445000000028,72.410538000000031],[-80.022232000000031,72.413605000000132],[-80.124435000000005,72.506653000000028],[-80.130554000000018,72.512497000000053],[-80.133330999999941,72.519440000000031],[-80.129989999999907,72.523041000000092],[-80.11999499999996,72.526931999999988],[-80.112502999999947,72.526931999999988],[-80.063613999999973,72.523880000000077],[-80.036941999999897,72.51638800000012],[-79.921936000000017,72.463318000000072],[-79.916397000000018,72.458037999999988],[-79.926940999999999,72.447754000000145],[-79.939162999999951,72.436645999999996],[-79.956954999999994,72.426086000000055],[-79.978881999999885,72.417755000000113],[-79.993606999999997,72.413315000000125]],[[-110.46916199999993,72.569152999999972],[-110.48137699999995,72.565811000000053],[-110.54415899999998,72.569152999999972],[-110.57195300000001,72.575546000000145],[-110.58833299999998,72.583878000000141],[-110.593887,72.588592999999946],[-110.593887,72.594147000000135],[-110.576683,72.594986000000119],[-110.53888699999993,72.594986000000119],[-110.51666299999999,72.593322999999998],[-110.50446299999999,72.590820000000008],[-110.48249799999991,72.583603000000096],[-110.47444200000001,72.579437000000041],[-110.46888699999994,72.574706999999989],[-110.46916199999993,72.569152999999972]],[[-110.35582699999998,72.601929000000098],[-110.37304699999993,72.601379000000065],[-110.39499699999993,72.603043000000071],[-110.46417199999991,72.613312000000121],[-110.49472000000003,72.619141000000127],[-110.46916199999993,72.621368000000018],[-110.450287,72.621368000000018],[-110.39862099999993,72.618041999999946],[-110.35888699999992,72.614990000000034],[-110.34500100000002,72.611923000000104],[-110.34500100000002,72.606094000000098],[-110.35582699999998,72.601929000000098]],[[-108.510559,72.602768000000083],[-108.51999699999993,72.598038000000031],[-108.53778099999994,72.599426000000108],[-108.593613,72.61775200000011],[-108.604446,72.621643000000006],[-108.61221299999994,72.625809000000118],[-108.6141659999999,72.631088000000091],[-108.61361699999986,72.636657999999954],[-108.60388199999994,72.639435000000049],[-108.51722699999999,72.642487000000017],[-108.49665800000002,72.641372999999987],[-108.49194299999999,72.636657999999954],[-108.49416400000001,72.631927000000019],[-108.510559,72.602768000000083]],[[-110.30722000000003,72.630813999999987],[-110.36389199999996,72.630813999999987],[-110.39695699999993,72.636383000000137],[-110.41082799999998,72.639435000000049],[-110.40028399999994,72.643600000000049],[-110.36000100000001,72.648880000000133],[-110.31500199999999,72.651932000000045],[-110.28083799999996,72.642211999999972],[-110.281113,72.636383000000137],[-110.28999299999992,72.631653000000085],[-110.30722000000003,72.630813999999987]],[[-109.215012,72.790268000000083],[-109.22749299999992,72.787200999999982],[-109.24833699999999,72.788040000000137],[-109.37277199999994,72.806091000000094],[-109.41694599999988,72.815262000000075],[-109.41944899999993,72.820541000000048],[-109.37832600000002,72.828598],[-109.33389299999999,72.834990999999945],[-109.32028200000002,72.8316650000001],[-109.31220999999994,72.827484000000027],[-109.22444200000001,72.811096000000134],[-109.21056399999998,72.8077550000001],[-109.21166999999997,72.796371000000022],[-109.215012,72.790268000000083]],[[-95.735000999999954,72.798874000000012],[-95.753615999999909,72.796097000000088],[-95.771392999999932,72.799149],[-95.835555999999997,72.831100000000049],[-95.854172000000005,72.853591999999992],[-95.850829999999974,72.858321999999987],[-95.810546999999929,72.876647999999989],[-95.791106999999954,72.880264000000068],[-95.774170000000026,72.880264000000068],[-95.769164999999987,72.878036000000122],[-95.763061999999877,72.872482000000105],[-95.735275000000001,72.859985000000108],[-95.720550999999944,72.848037999999974],[-95.716949,72.84387200000009],[-95.714171999999905,72.838593000000117],[-95.71362299999987,72.832214000000079],[-95.718886999999938,72.809418000000051],[-95.725005999999951,72.803314],[-95.735000999999954,72.798874000000012]],[[-96.754181000000017,72.721374999999966],[-96.77027899999996,72.719710999999961],[-96.955275999999969,72.734146000000067],[-96.96945199999999,72.737761999999975],[-96.977782999999988,72.745254999999986],[-97.011123999999938,72.775818000000129],[-97.010283999999899,72.776657000000114],[-96.921386999999982,72.835815000000082],[-96.911117999999931,72.841094999999996],[-96.798614999999984,72.881363000000022],[-96.757232999999928,72.892761000000064],[-96.737212999999997,72.895264000000054],[-96.725554999999986,72.89498900000001],[-96.713332999999921,72.893326000000059],[-96.688323999999966,72.883330999999998],[-96.692215000000033,72.862762000000032],[-96.666945999999996,72.811096000000134],[-96.651672000000019,72.804152999999985],[-96.642501999999979,72.797760000000039],[-96.639998999999989,72.791655999999989],[-96.639998999999989,72.786652000000004],[-96.641388000000006,72.782211000000075],[-96.728058000000033,72.730545000000063],[-96.741378999999995,72.725539999999967],[-96.754181000000017,72.721374999999966]],[[-95.756957999999997,72.892487000000131],[-95.777495999999985,72.891937000000098],[-95.795272999999952,72.89498900000001],[-95.808334000000002,72.907210999999961],[-95.824721999999952,72.965271000000087],[-95.786666999999966,73.012496999999939],[-95.761672999999973,73.004714999999976],[-95.757232999999928,73.001663000000065],[-95.756118999999956,72.998596000000134],[-95.743606999999997,72.987762000000089],[-95.702498999999989,72.933593999999971],[-95.708343999999954,72.917206000000078],[-95.735549999999989,72.900543000000027],[-95.744445999999925,72.895827999999995],[-95.756957999999997,72.892487000000131]],[[-95.733886999999982,73.128860000000032],[-95.718062999999972,73.118042000000059],[-95.715835999999911,73.11192299999999],[-95.71556099999998,73.105545000000063],[-95.717772999999966,73.10026600000009],[-95.726395000000025,73.088881999999955],[-95.729171999999949,73.071105999999986],[-95.724715999999944,73.059142999999949],[-95.728332999999907,73.054428000000144],[-95.745543999999938,73.049423000000047],[-95.775283999999999,73.05525200000011],[-95.787216000000001,73.061920000000043],[-95.799437999999952,73.072769000000108],[-95.822509999999966,73.083054000000061],[-95.859726000000023,73.090820000000122],[-95.893341000000021,73.095824999999991],[-95.893065999999976,73.100815000000011],[-95.891112999999962,73.101089000000115],[-95.885009999999909,73.104706000000078],[-95.881942999999978,73.108597000000145],[-95.874709999999993,73.114150999999993],[-95.865279999999927,73.119979999999998],[-95.863051999999982,73.125259000000142],[-95.865279999999927,73.131363000000022],[-95.868332000000009,73.136383000000023],[-95.868880999999988,73.140548999999965],[-95.854995999999971,73.140548999999965],[-95.840835999999967,73.136658000000068],[-95.828888000000006,73.129974000000004],[-95.822509999999966,73.124695000000031],[-95.818343999999968,73.125533999999959],[-95.814163000000008,73.131087999999977],[-95.807495000000017,73.135544000000095],[-95.790833000000021,73.139434999999992],[-95.776397999999915,73.140548999999965],[-95.763335999999981,73.139709000000096],[-95.74499499999996,73.136658000000068],[-95.738892000000021,73.133880999999974],[-95.733886999999982,73.128860000000032]],[[-96.808333999999945,72.926376000000118],[-96.915282999999931,72.917755000000056],[-96.955275999999969,72.920531999999923],[-96.968338000000017,72.923874000000069],[-96.990554999999972,72.931090999999981],[-97.017776000000026,72.940536000000066],[-97.032227000000034,72.946640000000059],[-97.061385999999914,72.963318000000129],[-97.089721999999995,72.981658999999979],[-97.105834999999956,72.99832200000003],[-97.111938000000009,73.004714999999976],[-97.136947999999961,73.045822000000044],[-97.139724999999885,73.051926000000037],[-97.141953000000001,73.064148000000046],[-97.142775999999969,73.075272000000098],[-97.141112999999962,73.085541000000148],[-97.127776999999924,73.095824999999991],[-97.069732999999985,73.136932000000002],[-97.059432999999956,73.142212000000029],[-97.045546999999999,73.147491000000059],[-97.003341999999975,73.159714000000065],[-96.946944999999971,73.172484999999995],[-96.904449,73.179977000000122],[-96.848052999999993,73.187484999999981],[-96.809433000000013,73.189148000000102],[-96.786391999999978,73.18803400000013],[-96.771941999999967,73.181655999999975],[-96.755279999999971,73.175812000000121],[-96.653060999999923,73.136383000000023],[-96.602218999999934,73.099152000000117],[-96.580841000000021,73.081100000000049],[-96.575011999999901,73.074997000000053],[-96.568619000000012,73.062195000000088],[-96.565826000000015,73.056091000000038],[-96.564712999999983,73.050537000000077],[-96.565552000000025,73.044708000000014],[-96.573623999999995,73.033325000000048],[-96.636672999999973,72.965820000000065],[-96.643341000000021,72.96138000000002],[-96.65834000000001,72.954163000000108],[-96.697219999999959,72.941650000000038],[-96.743057000000022,72.933593999999971],[-96.765014999999948,72.930817000000047],[-96.808333999999945,72.926376000000118]],[[-96.90583799999996,73.220825000000048],[-96.924712999999997,73.218048000000124],[-96.944991999999957,73.218322999999941],[-96.984725999999966,73.220535000000041],[-97.040833000000021,73.228591999999992],[-97.079177999999956,73.235259999999982],[-97.106948999999929,73.242203000000131],[-97.117767000000015,73.249145999999939],[-97.115279999999927,73.253052000000025],[-97.090285999999878,73.261932000000058],[-97.058043999999995,73.269150000000081],[-97.035004000000015,73.272766000000104],[-96.977492999999981,73.273880000000077],[-96.967772999999966,73.273315000000082],[-96.968338000000017,73.267487000000131],[-96.951400999999976,73.239426000000037],[-96.909164000000033,73.238312000000064],[-96.896118000000001,73.237762000000032],[-96.886672999999917,73.231094000000041],[-96.889174999999966,73.224991000000102],[-96.90583799999996,73.220825000000048]],[[-113.99749799999995,72.799423000000104],[-114.01112399999994,72.79664600000001],[-114.06806899999998,72.795822000000044],[-114.15167200000002,72.798035000000027],[-114.20861799999994,72.796936000000073],[-114.22416699999997,72.794983000000116],[-114.23581699999994,72.791655999999989],[-114.35138699999993,72.747482000000048],[-114.35749800000002,72.74136400000009],[-114.35637700000001,72.735809000000017],[-114.33444199999997,72.693588000000034],[-114.327789,72.688873000000001],[-114.36582900000002,72.66276600000009],[-114.45168299999995,72.623032000000023],[-114.46501199999994,72.6202550000001],[-114.49553699999996,72.616379000000052],[-114.53138699999988,72.614990000000034],[-114.576683,72.60914600000001],[-114.58999599999993,72.606368999999916],[-114.60472099999998,72.60165400000011],[-114.55832700000002,72.560806000000014],[-114.42666600000001,72.556090999999981],[-114.38527699999986,72.555251999999996],[-114.35138699999993,72.557479999999941],[-114.33999599999999,72.560806000000014],[-114.33029199999999,72.565262000000075],[-114.32584400000002,72.571930000000066],[-114.12805200000003,72.626083000000051],[-114.10305800000003,72.632202000000063],[-114.06276699999995,72.640274000000034],[-113.99027999999998,72.651382000000012],[-113.91027800000001,72.659148999999957],[-113.89306599999998,72.660262999999986],[-113.88333099999988,72.657486000000063],[-113.89046499999995,72.648048000000017],[-113.89222699999999,72.640822999999955],[-113.88054699999992,72.637207000000103],[-113.858047,72.635817999999915],[-113.80666399999996,72.639160000000061],[-113.76222199999995,72.646103000000039],[-113.70834400000001,72.656937000000084],[-113.67138699999992,72.666656000000103],[-113.61277799999988,72.683868000000132],[-113.58750899999995,72.689971999999955],[-113.54666099999997,72.698029000000133],[-113.51611300000002,72.701934999999992],[-113.50611900000001,72.699141999999995],[-113.52084400000001,72.688034000000016],[-113.55055199999987,72.675262000000032],[-113.57250999999991,72.667480000000069],[-113.61945299999996,72.653594999999996],[-113.64277599999991,72.646652000000017],[-113.68776699999995,72.631927000000019],[-113.70944199999991,72.624145999999996],[-113.72917200000001,72.615540000000067],[-113.73082699999998,72.609421000000054],[-113.72193900000002,72.60554499999995],[-113.69972200000001,72.604155999999989],[-113.68443299999996,72.606094000000098],[-113.65750100000002,72.611374000000012],[-113.46639999999996,72.665268000000026],[-113.44275700000003,72.672211000000004],[-113.43639400000001,72.67804000000001],[-113.43167099999999,72.684708000000001],[-113.41000399999996,72.729431000000034],[-113.41332999999992,72.734711000000118],[-113.41972399999997,72.739150999999936],[-113.43138099999999,72.742751999999996],[-113.44860799999992,72.744979999999998],[-113.53527799999995,72.748871000000065],[-113.58029199999987,72.751663000000121],[-113.59750399999996,72.754166000000112],[-113.60637699999995,72.758331000000112],[-113.60804699999994,72.769439999999975],[-113.59889199999998,72.782760999999937],[-113.58249699999999,72.793045000000006],[-113.38694800000002,72.907486000000006],[-113.33139,72.935257000000092],[-113.30277999999998,72.948868000000061],[-113.26862299999999,72.960266000000047],[-113.14862099999999,72.994705000000067],[-113.06276699999989,73.00749200000007],[-113.02806099999998,73.009430000000009],[-113.00695799999994,73.008881000000088],[-112.823059,72.998871000000008],[-112.81139400000001,72.9952550000001],[-112.79472399999997,72.982208000000071],[-112.78582799999998,72.978317000000004],[-112.77139299999993,72.975266000000033],[-112.75418100000002,72.972763000000043],[-112.708618,72.969711000000132],[-112.64362299999993,72.966934000000037],[-112.60082999999986,72.963607999999965],[-112.56360599999994,72.959152000000074],[-112.51500699999991,72.951096000000007],[-112.5,72.947922000000119],[-112.47165699999994,72.941925000000026],[-112.44583099999994,72.935257000000092],[-112.41388699999993,72.924149000000057],[-112.387787,72.911102000000028],[-112.37638900000002,72.907760999999994],[-112.36193800000001,72.904709000000082],[-112.34472700000003,72.902205999999921],[-112.27944899999994,72.896941999999967],[-112.23777799999999,72.895537999999988],[-112.14195299999994,72.896378000000027],[-112.09834299999989,72.894150000000025],[-112.06166099999996,72.889434999999992],[-111.94776899999999,72.870529000000147],[-111.78333299999997,72.834717000000012],[-111.67582699999997,72.814697000000024],[-111.65888999999999,72.8119200000001],[-111.59416199999998,72.806641000000127],[-111.54055799999998,72.799423000000104],[-111.52639799999997,72.796371000000022],[-111.23693799999995,72.726379000000122],[-111.22582999999997,72.7227630000001],[-111.22000100000002,72.718323000000055],[-111.20249899999999,72.67053199999998],[-111.20527599999997,72.664429000000041],[-111.26278699999995,72.579163000000108],[-111.27694699999989,72.567490000000078],[-111.45221699999996,72.477768000000026],[-111.52778599999999,72.44999700000011],[-111.65110800000002,72.40887500000008],[-111.675003,72.402206000000035],[-111.736107,72.395264000000111],[-111.76999699999993,72.393600000000106],[-111.78527799999995,72.391936999999984],[-111.81220999999999,72.386658000000011],[-111.859734,72.373306000000014],[-111.890289,72.360535000000084],[-111.89890299999996,72.355545000000006],[-111.90556299999997,72.349716000000001],[-111.90167200000002,72.346099999999979],[-111.86250299999995,72.330551000000071],[-111.85138699999999,72.326934999999992],[-111.66388699999999,72.276382000000012],[-111.50446299999999,72.311920000000043],[-111.44499200000001,72.328873000000101],[-111.42443799999995,72.337204000000042],[-111.41915899999998,72.343871999999976],[-111.43305999999995,72.346939000000077],[-111.45140100000003,72.346939000000077],[-111.487213,72.336655000000064],[-111.51944700000001,72.334152000000074],[-111.5616609999999,72.336655000000064],[-111.578056,72.339156999999943],[-111.58917200000002,72.342758000000003],[-111.60582699999998,72.350815000000011],[-111.61165599999998,72.361099000000024],[-111.609444,72.367203000000075],[-111.58833299999998,72.376373000000115],[-111.37444299999993,72.446640000000002],[-111.350281,72.453322999999955],[-111.3094329999999,72.460815000000082],[-111.29387700000001,72.462768999999923],[-111.26583899999997,72.465546000000018],[-111.24889400000001,72.466385000000002],[-111.22860699999995,72.465546000000018],[-111.20249899999999,72.46026599999999],[-111.21333300000003,72.446930000000009],[-111.23277299999995,72.4369200000001],[-111.24500299999994,72.433594000000085],[-111.27223200000003,72.428588999999988],[-111.30139200000002,72.404160000000047],[-111.27749599999993,72.369979999999941],[-111.11277799999993,72.335266000000104],[-111.09528399999994,72.379700000000014],[-111.09137699999997,72.401932000000102],[-111.00446299999999,72.46527100000003],[-110.8691639999999,72.473312000000078],[-110.82444799999996,72.479156000000103],[-110.80304699999999,72.485259999999926],[-110.82501200000002,72.503875999999934],[-110.83332799999999,72.519150000000025],[-110.827789,72.525818000000015],[-110.73805199999993,72.565536000000009],[-110.72749299999998,72.569716999999912],[-110.71528599999999,72.573044000000039],[-110.70140100000003,72.575546000000145],[-110.68083199999995,72.574706999999989],[-110.66610700000001,72.573044000000039],[-110.53527799999995,72.546646000000067],[-110.52639799999992,72.526931999999988],[-110.57501199999996,72.51388500000013],[-110.59445199999993,72.50471500000009],[-110.60166899999996,72.498871000000065],[-110.60193600000002,72.493317000000104],[-110.59361299999989,72.489150999999993],[-110.55249000000003,72.47387700000013],[-110.53083800000002,72.46665999999999],[-110.35056299999997,72.428040000000067],[-110.32861299999996,72.426086000000055],[-110.30999799999995,72.426086000000055],[-110.30387899999999,72.430542000000116],[-110.31194299999993,72.434708000000057],[-110.41027799999995,72.462204000000099],[-110.50334199999998,72.484985000000108],[-110.514183,72.488585999999998],[-110.52250700000002,72.492752000000053],[-110.52778599999999,72.497482000000105],[-110.53056299999992,72.502486999999974],[-110.52333099999998,72.508330999999998],[-110.39639299999999,72.552200000000084],[-110.38417099999998,72.555542000000003],[-110.36527999999998,72.555542000000003],[-110.34333800000002,72.55386400000009],[-110.32389799999993,72.551650999999936],[-110.31304899999998,72.547760000000039],[-110.22028399999994,72.51388500000013],[-110.20140100000003,72.505829000000062],[-110.15527299999997,72.480270000000075],[-110.06139399999995,72.437484999999924],[-110.05055199999993,72.433868000000018],[-110.03999299999998,72.438034000000073],[-110.02194199999991,72.447754000000145],[-109.99889400000001,72.455261000000121],[-109.97112300000003,72.46026599999999],[-109.95249899999999,72.459991000000116],[-109.91972399999986,72.454711999999972],[-109.81388900000002,72.428314],[-109.79666099999992,72.426926000000094],[-109.78278399999999,72.429428000000144],[-109.77806099999998,72.434708000000057],[-109.78582799999992,72.438873000000058],[-109.80583199999995,72.445526000000029],[-109.83029199999999,72.452208999999982],[-110.04250300000001,72.50471500000009],[-110.22305299999999,72.545822000000101],[-110.23665599999998,72.548874000000069],[-110.24777199999994,72.552765000000136],[-110.25583599999987,72.55693100000002],[-110.252792,72.56303400000013],[-110.24221799999992,72.566940000000045],[-110.22165699999994,72.566086000000041],[-110.12082699999996,72.560257000000036],[-110.10417200000001,72.557754999999986],[-110.09056099999998,72.55442800000003],[-110.06889299999995,72.546936000000073],[-110.03888699999987,72.535538000000088],[-110.02278099999995,72.527206000000092],[-110.00361599999991,72.519440000000031],[-109.97112300000003,72.508330999999998],[-109.90499899999998,72.487198000000092],[-109.88861099999986,72.484711000000004],[-109.80943300000001,72.491653000000099],[-109.79527300000001,72.49414100000007],[-109.78472899999997,72.498322000000144],[-109.78278399999999,72.503051999999968],[-109.94275700000003,72.604155999999989],[-109.95889299999993,72.612762000000089],[-110.09306300000003,72.65637200000009],[-110.11332699999997,72.657211000000018],[-110.17111199999999,72.648330999999985],[-110.18666100000002,72.646652000000017],[-110.22112299999998,72.645264000000054],[-110.241669,72.646103000000039],[-110.25556899999998,72.649429000000055],[-110.26666299999999,72.653046000000018],[-110.283073,72.66137700000013],[-110.28832999999992,72.666091999999992],[-110.29110700000001,72.671097000000032],[-110.20973200000003,72.71775800000006],[-110.20056199999999,72.7227630000001],[-110.18831599999999,72.726089000000115],[-110.17083699999995,72.726928999999984],[-110.078079,72.727065999999979],[-110.04167200000001,72.722488000000055],[-110.03056300000003,72.718596999999988],[-109.99804699999999,72.701934999999992],[-109.98693800000001,72.698318000000029],[-109.85221899999993,72.665817000000118],[-109.83277899999996,72.663315000000068],[-109.81723,72.664992999999981],[-109.77084399999995,72.716385000000116],[-109.77027900000002,72.722214000000122],[-109.78138699999994,72.725815000000011],[-109.80082700000003,72.728043000000127],[-109.81973299999993,72.728043000000127],[-110.03111299999995,72.747757000000036],[-110.17887899999994,72.769149999999968],[-110.17138699999998,72.774993999999992],[-110.16832699999986,72.781097000000102],[-110.17083699999995,72.786101999999971],[-110.17639199999996,72.790817000000004],[-110.21166999999997,72.818328999999949],[-110.24526999999995,72.823607999999979],[-110.32640099999992,72.826385000000016],[-110.36638599999998,72.827208999999982],[-110.47666899999996,72.834990999999945],[-110.493607,72.83776899999998],[-110.53555299999994,72.847214000000008],[-110.54666099999997,72.850815000000068],[-110.56331599999999,72.859145999999953],[-110.74276699999996,72.957214000000135],[-110.75389099999995,72.966385000000059],[-110.75666799999993,72.971374999999966],[-110.75389099999995,72.977768000000083],[-110.74804699999993,72.984421000000054],[-110.74082900000002,72.989975000000072],[-110.73166700000002,72.994980000000112],[-110.70834400000001,73.002487000000031],[-110.69415300000003,73.004990000000021],[-110.67832899999991,73.006653000000142],[-110.61860699999994,73.011383000000137],[-110.51139799999993,73.015274000000034],[-110.432503,73.014435000000105],[-110.39083899999997,73.012496999999939],[-110.16610700000001,72.996094000000085],[-110.05110199999996,72.984711000000061],[-109.91887700000001,72.96804800000001],[-109.65943899999996,72.924988000000042],[-109.63445299999995,72.918045000000063],[-109.61805700000002,72.909424000000115],[-109.618607,72.903869999999927],[-109.62943999999993,72.899719000000061],[-109.66111799999999,72.896652000000131],[-109.69471699999997,72.894440000000088],[-109.724716,72.890549000000021],[-109.73889200000002,72.888046000000031],[-109.75,72.883881000000031],[-109.75472999999994,72.878585999999984],[-109.74665799999997,72.874420000000043],[-109.65862300000003,72.844711000000018],[-109.379707,72.770538000000101],[-109.22778299999993,72.761658000000068],[-109.05110200000001,72.680267000000072],[-109.02999899999998,72.647217000000012],[-109.04915599999993,72.604155999999989],[-109.045547,72.572495000000117],[-109.04332699999998,72.567490000000078],[-109.02861000000001,72.565536000000009],[-108.88249200000001,72.564423000000147],[-108.86527999999998,72.564987000000087],[-108.85109699999998,72.567490000000078],[-108.84194899999994,72.572495000000117],[-108.81916799999993,72.591095000000053],[-108.72277800000001,72.582763999999941],[-108.70361300000002,72.58027600000014],[-108.67666600000001,72.573883000000023],[-108.64472999999987,72.562485000000038],[-108.62138399999998,72.549988000000042],[-108.61638599999998,72.54525799999999],[-108.58805799999993,72.505554000000075],[-108.58944700000001,72.494431000000077],[-108.59638999999993,72.482208000000014],[-108.60278299999999,72.475540000000024],[-108.61054999999993,72.469986000000063],[-108.62470999999994,72.457489000000066],[-108.63722200000001,72.444427000000019],[-108.64499699999993,72.426651000000049],[-108.65055799999999,72.403595000000053],[-108.66361999999998,72.362761999999975],[-108.66278099999994,72.346374999999966],[-108.65834000000001,72.336105000000032],[-108.52416999999997,72.199706999999989],[-108.45500199999998,72.157211000000132],[-108.44415300000003,72.161102000000028],[-108.42832900000002,72.158325000000104],[-108.41805999999997,72.154434000000037],[-108.404449,72.14694199999991],[-108.40222199999994,72.141663000000108],[-108.39890300000002,72.113602000000071],[-108.39472999999998,72.042755000000113],[-108.39527900000002,72.036926000000108],[-108.396118,72.03137200000009],[-108.31639099999995,71.984146000000067],[-108.20417799999996,71.963882000000126],[-108.19138299999992,71.960541000000092],[-108.18666100000002,71.955826000000059],[-108.18276999999995,71.945525999999916],[-108.18971299999998,71.933318999999983],[-108.19611399999997,71.92692599999998],[-108.23361199999999,71.899719000000061],[-108.28639199999992,71.860809000000131],[-108.28278399999999,71.792206000000022],[-108.28083800000002,71.786925999999994],[-108.24276700000001,71.718597000000045],[-108.23805199999998,71.713882000000012],[-108.23082699999992,71.709426999999948],[-108.22055099999994,71.705826000000116],[-108.20777900000002,71.70248400000014],[-108.19248999999996,71.699707000000046],[-108.17748999999998,71.701096000000064],[-108.14111300000002,71.710541000000148],[-108.13054699999992,71.714432000000045],[-108.10333300000002,71.719147000000078],[-108.08693700000003,71.719711000000018],[-108.066101,71.71775800000006],[-108.03639199999998,71.705826000000116],[-108.02194199999997,71.697204999999997],[-107.98805199999987,71.675537000000077],[-107.97609699999987,71.666381999999999],[-107.96694899999994,71.656936999999971],[-107.96777299999991,71.651382000000069],[-107.91583300000002,71.624984999999981],[-107.84528399999994,71.603867000000093],[-107.82888799999995,71.604431000000034],[-107.75334199999998,71.610260000000039],[-107.74109599999997,71.613312000000121],[-107.73194899999999,71.618042000000003],[-107.72416699999991,71.623871000000008],[-107.72609699999998,71.629149999999981],[-107.74054699999994,71.637496999999939],[-107.75028999999995,71.641373000000044],[-107.77583299999998,71.648041000000035],[-107.82472199999995,71.672759999999982],[-107.83194700000001,71.676926000000037],[-107.83640300000002,71.681656000000089],[-107.83833300000003,71.686920000000043],[-107.83750899999995,71.692474000000061],[-107.82305899999994,71.716934000000094],[-107.81527699999998,71.7227630000001],[-107.80444299999999,71.726653999999996],[-107.78943600000002,71.728043000000014],[-107.7519529999999,71.726653999999996],[-107.73665599999998,71.723602000000085],[-107.63027999999997,71.732208000000014],[-107.49472000000003,71.786377000000016],[-107.451683,71.857483000000059],[-107.36361699999992,71.871917999999994],[-107.34555099999994,71.871643000000006],[-107.29695099999998,71.874145999999939],[-107.28333299999997,71.876373000000001],[-107.27084400000001,71.879424999999969],[-107.26139799999999,71.884155000000135],[-107.25334199999998,71.889708999999982],[-107.25250199999994,71.895537999999988],[-107.25695799999994,71.900269000000094],[-107.264183,71.904434000000094],[-107.41805999999997,71.953873000000101],[-107.59638999999993,72.004439999999988],[-107.61389199999996,72.012496999999996],[-107.62581599999999,72.021652000000017],[-107.63027999999997,72.026382000000069],[-107.65139799999997,72.061096000000134],[-107.65334300000001,72.066375999999991],[-107.64943700000003,72.072495000000004],[-107.63999899999993,72.077208999999982],[-107.62609899999995,72.079437000000098],[-107.61389199999996,72.082764000000054],[-107.61000100000001,72.08859300000006],[-107.61193799999995,72.093872000000033],[-107.63527699999997,72.121917999999937],[-107.68138099999999,72.136108000000036],[-107.699997,72.138596000000007],[-107.729446,72.137207000000046],[-107.74333199999995,72.134994999999947],[-107.76027699999992,72.134430000000123],[-107.77887699999997,72.136658000000068],[-107.78083800000002,72.141937000000041],[-107.787216,72.184708000000114],[-107.77806099999992,72.208038000000045],[-107.843887,72.354156000000046],[-107.87748699999992,72.424423000000104],[-107.88639799999993,72.519713999999965],[-107.87693799999994,72.524428999999998],[-107.87165799999997,72.529709000000082],[-107.87666299999995,72.567215000000033],[-107.88054699999998,72.577484000000084],[-107.88555899999989,72.586655000000007],[-107.91555799999998,72.597214000000065],[-107.92887899999994,72.60054000000008],[-107.99082900000002,72.612487999999985],[-108.00418099999996,72.615814],[-108.01194800000002,72.619980000000112],[-108.025284,72.666091999999992],[-108.02639799999997,72.676926000000037],[-108.02667199999996,72.719986000000006],[-108.05110200000001,72.781372000000147],[-108.05803699999996,72.791092000000049],[-108.11193799999995,72.890823000000125],[-108.15194699999989,72.971100000000092],[-108.16528299999993,73.010817999999972],[-108.26363400000002,73.091934000000094],[-108.29361,73.120254999999986],[-108.29998799999998,73.135544000000095],[-108.295547,73.147491000000059],[-108.291946,73.153595000000053],[-108.28527799999995,73.159987999999998],[-108.26862299999999,73.171371000000022],[-108.23029299999996,73.187484999999981],[-108.18110699999994,73.201660000000061],[-108.16639700000002,73.203873000000044],[-108.13390400000003,73.206940000000145],[-108.11582900000002,73.207489000000066],[-108.07389799999993,73.205261000000121],[-108.02390300000002,73.201096000000121],[-107.93443300000001,73.187484999999981],[-107.91471899999993,73.184981999999991],[-107.89388999999994,73.183868000000018],[-107.87416099999996,73.183594000000085],[-107.86416599999995,73.188583000000051],[-107.87222300000002,73.192748999999935],[-107.90471600000001,73.204163000000051],[-107.94611399999991,73.214157000000057],[-108.01027699999997,73.226089000000002],[-108.05166599999995,73.236098999999911],[-108.08444199999997,73.247482000000105],[-108.11638599999992,73.264435000000049],[-108.15361000000001,73.302475000000129],[-108.08444199999997,73.349990999999989],[-108.07140399999992,73.353317000000061],[-108.05332899999996,73.353867000000093],[-107.99109599999991,73.351379000000122],[-107.94722000000002,73.348328000000095],[-107.77139299999999,73.323883000000023],[-107.675003,73.323318000000029],[-107.63110399999999,73.319991999999957],[-107.614441,73.31721500000009],[-107.40334300000001,73.270537999999988],[-107.33583099999987,73.248031999999967],[-107.24999999999994,73.217484000000013],[-107.21028099999995,73.201660000000061],[-107.18888900000002,73.194138000000123],[-107.172234,73.191086000000041],[-107.10582699999998,73.17942800000003],[-107.06973299999999,73.173874000000012],[-107.05027799999999,73.173598999999967],[-107.03694200000001,73.176651000000106],[-107.025284,73.180542000000003],[-107.01666299999999,73.186095999999964],[-107.01083399999999,73.191360000000145],[-107.02027899999996,73.200821000000133],[-107.05249000000003,73.212493999999936],[-107.09028599999994,73.223037999999974],[-107.11081699999994,73.231369000000086],[-107.11860699999994,73.23553499999997],[-107.12361099999998,73.240265000000022],[-107.11945300000002,73.246368000000132],[-107.03028899999998,73.29553199999998],[-107.01862299999999,73.299423000000047],[-106.88249199999996,73.312195000000031],[-106.86138899999997,73.310806000000014],[-106.76139799999999,73.293045000000063],[-106.75083899999993,73.289153999999996],[-106.74610899999999,73.284423999999944],[-106.74109599999991,73.268875000000037],[-106.72721899999993,73.254715000000147],[-106.69666299999994,73.237488000000099],[-106.66471899999999,73.226089000000002],[-106.65110800000002,73.222487999999942],[-106.63474300000001,73.219711000000075],[-106.60305800000003,73.216660000000047],[-106.58222999999998,73.21527100000003],[-106.39862099999993,73.149155000000064],[-106.24027999999998,73.085815000000082],[-106.06388899999996,73.047759999999982],[-106.04750100000001,73.044708000000014],[-106.02834300000001,73.044434000000081],[-105.94888300000002,73.053313999999943],[-105.91027799999989,73.058868000000132],[-105.87638899999996,73.058318999999983],[-105.85555999999997,73.056931000000077],[-105.84221600000001,73.053588999999988],[-105.83194699999996,73.049713000000111],[-105.82472200000001,73.045258000000047],[-105.82195299999995,73.034987999999942],[-105.82333399999999,73.029433999999981],[-105.83249699999999,73.017211999999972],[-105.82972699999993,73.006942999999978],[-105.82224299999996,73.002487000000031],[-105.80471799999998,72.994431000000134],[-105.79444899999993,72.990265000000079],[-105.76083399999999,72.976929000000098],[-105.737503,72.969436999999971],[-105.69776899999999,72.959152000000074],[-105.67859599999997,72.95637499999998],[-105.62917299999998,72.939972000000125],[-105.56220999999999,72.913040000000024],[-105.445831,72.838318000000072],[-105.32611099999991,72.746368000000075],[-105.32195299999995,72.741653000000042],[-105.32055700000001,72.736649000000057],[-105.32528699999995,72.730545000000063],[-105.33693700000003,72.726653999999996],[-105.35610999999994,72.727203000000088],[-105.37777699999998,72.729431000000034],[-105.39778100000001,72.737198000000035],[-105.41194200000001,72.745819000000097],[-105.41915899999992,72.750275000000045],[-105.42748999999992,72.759720000000073],[-105.43472300000002,72.764160000000118],[-105.46472199999994,72.775818000000129],[-105.47778299999999,72.779434000000037],[-105.49833699999994,72.780822999999998],[-105.51000999999997,72.776932000000102],[-105.45722999999992,72.702773999999977],[-105.44722000000002,72.698868000000061],[-105.38249200000001,72.681366000000025],[-105.35665899999998,72.674423000000047],[-105.29472399999997,72.631927000000019],[-105.23110999999994,72.543320000000051],[-105.19583099999988,72.482483000000059],[-105.19972199999995,72.460541000000148],[-105.20140100000003,72.454711999999972],[-105.20612299999993,72.448868000000118],[-105.21777299999991,72.444977000000051],[-105.23194899999993,72.447205000000054],[-105.26167299999992,72.458878000000027],[-105.27722199999994,72.462204000000099],[-105.29305999999997,72.460815000000082],[-105.301941,72.455261000000121],[-105.29778299999987,72.450546000000088],[-105.24137899999999,72.399718999999948],[-105.23029299999996,72.390549000000078],[-105.21665999999993,72.381927000000076],[-105.18998699999997,72.369705000000124],[-105.16055299999988,72.35775799999999],[-105.13999899999999,72.344711000000132],[-105.04415899999998,72.248032000000023],[-105.03639199999986,72.238586000000055],[-105.03362299999998,72.234711000000061],[-105.02443700000003,72.219986000000119],[-104.99166899999989,72.203323000000012],[-104.95749699999999,72.181366000000139],[-104.95527599999997,72.171097000000145],[-104.95722999999992,72.165543000000127],[-104.96167000000003,72.159424000000115],[-104.96916199999998,72.153046000000131],[-104.97805799999992,72.147491000000059],[-104.98805199999993,72.142761000000007],[-104.99973299999999,72.13888500000013],[-105.02999899999998,72.124695000000031],[-105.03751399999999,72.118317000000104],[-105.03639199999986,72.11303700000002],[-105.01862299999993,72.066939999999931],[-104.92944299999988,72.034149000000014],[-104.87193299999996,71.989975000000072],[-104.82917800000001,71.937195000000031],[-104.82444800000002,71.927475000000129],[-104.82028200000002,71.906647000000078],[-104.82556199999999,71.889708999999982],[-104.82250999999997,71.874145999999939],[-104.8186189999999,71.86914100000007],[-104.78999299999998,71.84137000000004],[-104.78333299999986,71.836929000000112],[-104.771118,71.833603000000096],[-104.70056199999999,71.829987000000017],[-104.68554699999993,71.826935000000105],[-104.67331699999994,71.823317999999972],[-104.66000400000001,71.81442300000009],[-104.53472899999986,71.719711000000018],[-104.37638900000002,71.598038000000031],[-104.36638600000003,71.588882000000126],[-104.35527000000002,71.574432000000002],[-104.35916099999997,71.563309000000004],[-104.36361699999998,71.557204999999954],[-104.37581599999993,71.544707999999957],[-104.383331,71.538315000000011],[-104.40167200000002,71.514435000000049],[-104.40361000000001,71.508605999999986],[-104.40194700000001,71.498322000000144],[-104.34416199999993,71.410811999999964],[-104.33332799999994,71.396378000000141],[-104.35722399999986,71.357483000000002],[-104.37165799999997,71.360809000000017],[-104.38918299999995,71.363602000000014],[-104.40805099999994,71.364990000000091],[-104.43804899999998,71.362761999999975],[-104.45056199999988,71.359711000000118],[-104.46167000000003,71.355820000000051],[-104.47138999999993,71.351089000000115],[-104.48860199999996,71.339980999999966],[-104.49333200000001,71.334152000000131],[-104.49694799999997,71.322769000000108],[-104.49500299999988,71.312485000000095],[-104.49137899999988,71.307480000000055],[-104.46250900000001,71.281097000000045],[-104.44972200000001,71.272217000000012],[-104.43888900000002,71.257767000000115],[-104.43971299999998,71.246933000000013],[-104.44055200000003,71.236098999999967],[-104.44444299999992,71.224990999999989],[-104.44888300000002,71.218872000000147],[-104.470551,71.199706999999989],[-104.49610899999999,71.183044000000109],[-104.52555799999999,71.168869000000029],[-104.55610699999994,71.155548000000067],[-104.57805599999995,71.148041000000092],[-104.59056099999998,71.145263999999997],[-104.62361099999987,71.133605999999986],[-104.64862099999999,71.11914100000007],[-104.60472099999998,71.079711999999972],[-104.58583099999998,71.066666000000055],[-104.57028199999996,71.05831900000004],[-104.53666699999997,71.044144000000131],[-104.48916600000001,71.024703999999986],[-104.45667300000002,71.013610999999969],[-104.33778399999994,70.979706000000078],[-104.23805199999998,70.964996000000099],[-104.22389199999998,70.961928999999998],[-104.122772,70.914703000000145],[-104.11665299999999,70.910262999999929],[-104.09999099999999,70.891372999999987],[-104.07640099999992,70.863037000000077],[-104.05277999999993,70.834427000000062],[-104.04583699999995,70.824996999999996],[-104.04277000000002,70.804153000000042],[-104.02887699999991,70.784988000000055],[-104.01583900000003,70.770827999999938],[-104.00029000000001,70.757216999999969],[-103.99416400000001,70.75277699999998],[-103.98528299999998,70.748871000000065],[-103.97138999999987,70.745529000000147],[-103.95472699999999,70.742752000000053],[-103.94027699999987,70.741653000000099],[-103.92443800000001,70.741928000000087],[-103.806107,70.723037999999974],[-103.73111,70.691649999999925],[-103.64083899999997,70.646652000000017],[-103.63417099999992,70.637206999999989],[-103.62470999999994,70.628036000000009],[-103.59889199999992,70.615814000000057],[-103.55638099999999,70.600815000000011],[-103.52333099999987,70.59304800000001],[-103.506958,70.590271000000143],[-103.49027999999998,70.587494000000049],[-103.47305299999999,70.586928999999998],[-103.44193999999999,70.587204000000042],[-103.39835399999993,70.590546000000131],[-103.34277299999997,70.59664900000007],[-103.32721699999991,70.59664900000007],[-103.30915799999997,70.595260999999994],[-103.26500699999997,70.581665000000044],[-103.239441,70.569443000000035],[-103.20472699999993,70.548035000000141],[-103.14972699999998,70.513885000000016],[-103.13276699999994,70.505829000000119],[-103.12165800000002,70.501938000000052],[-103.095551,70.498031999999967],[-103.01194799999996,70.492202999999961],[-102.97693600000002,70.489975000000015],[-102.96056399999998,70.489151000000049],[-102.93055699999996,70.490540000000067],[-102.92027299999995,70.494980000000055],[-102.91443599999991,70.500000000000114],[-102.915009,70.505264000000068],[-102.91832699999998,70.510268999999937],[-102.92388900000003,70.514435000000049],[-102.93250299999988,70.518600000000049],[-102.95722999999998,70.525543000000027],[-102.97528099999994,70.527205999999978],[-103.03028899999998,70.534988000000112],[-103.05526700000001,70.541931000000091],[-103.09973099999991,70.55664100000007],[-103.10833700000001,70.56053199999991],[-103.12609899999995,70.57388300000008],[-103.13999899999993,70.609421000000111],[-103.15556300000003,70.654984000000013],[-103.156113,70.659987999999998],[-103.15387699999997,70.665817000000004],[-103.14916999999991,70.67164600000001],[-103.13667299999992,70.674423000000104],[-103.12110899999999,70.674698000000092],[-103.10417200000001,70.673873999999955],[-103.08583099999998,70.672484999999995],[-103.06667299999998,70.669983000000059],[-103.0250089999999,70.660262999999986],[-103.00250199999999,70.652771000000087],[-102.85665899999992,70.597763000000043],[-102.84834299999994,70.593871999999976],[-102.84528399999999,70.588882000000126],[-102.83833300000003,70.574158000000068],[-102.83583099999998,70.548035000000141],[-102.74445300000002,70.494705000000067],[-102.61501299999992,70.460541000000035],[-102.60138699999999,70.457214000000079],[-102.52027899999996,70.438309000000118],[-102.45749699999988,70.426376000000118],[-102.40862299999998,70.417479999999955],[-102.33332799999999,70.397766000000047],[-102.281387,70.384155000000078],[-102.11749299999997,70.339432000000045],[-101.99610899999988,70.287201000000096],[-101.97972099999998,70.279160000000047],[-101.92555199999998,70.260544000000039],[-101.89334099999996,70.254439999999988],[-101.87666300000001,70.25360100000006],[-101.86138899999997,70.253876000000048],[-101.84916699999985,70.256653000000142],[-101.83805799999993,70.260268999999994],[-101.828056,70.264709000000039],[-101.82195299999995,70.269714000000079],[-101.81722999999988,70.281097000000102],[-101.81749699999995,70.286102000000142],[-101.80972300000002,70.297759999999982],[-101.79972800000002,70.302199999999971],[-101.71472199999999,70.308868000000132],[-101.69803599999995,70.308029000000033],[-101.68195300000002,70.304977000000065],[-101.59944200000001,70.275818000000129],[-101.58860800000002,70.271927000000062],[-101.58029199999993,70.267761000000121],[-101.58029199999993,70.262771999999984],[-101.58556399999998,70.256653000000142],[-101.60555999999997,70.247757000000036],[-101.63417099999998,70.233047000000056],[-101.64306599999998,70.227768000000083],[-101.65083300000003,70.221374999999966],[-101.65055799999993,70.210815000000025],[-101.64222699999993,70.196365000000071],[-101.62249799999995,70.162491000000045],[-101.61416599999995,70.153046000000018],[-101.55999800000001,70.113602000000071],[-101.55194099999994,70.109420999999998],[-101.53971899999999,70.106934000000138],[-101.52667200000002,70.108597000000032],[-101.39723200000003,70.139435000000049],[-101.39222699999999,70.150543000000027],[-101.37581599999999,70.177765000000136],[-101.358047,70.176086000000112],[-101.28666699999991,70.152480999999966],[-101.265289,70.14498900000001],[-101.25723299999999,70.140823000000125],[-101.25195300000001,70.13638300000008],[-101.23889200000002,70.133040999999992],[-101.22222899999991,70.131927000000019],[-101.14499699999999,70.15525800000006],[-101.13500999999997,70.159713999999951],[-101.12721299999998,70.166092000000106],[-101.12193300000001,70.171921000000111],[-101.11665299999993,70.183044000000109],[-101.12193300000001,70.192749000000049],[-101.11193800000001,70.19720500000011],[-101.09555099999994,70.196365000000071],[-101.03971899999999,70.183044000000109],[-100.99973299999999,70.172760000000096],[-100.98388699999992,70.164703000000145],[-100.97332799999998,70.155548000000067],[-100.97332799999998,70.145264000000054],[-100.97609699999992,70.134430000000009],[-100.96028099999995,70.053040000000067],[-100.92194399999988,69.965271000000143],[-100.88694800000002,69.884155000000021],[-100.870003,69.814423000000147],[-100.870003,69.788315000000011],[-100.87805200000003,69.771652000000131],[-100.89998600000001,69.753875999999991],[-100.92555199999998,69.721100000000035],[-100.92027300000001,69.711380000000133],[-100.92027300000001,69.701096000000121],[-100.92832899999996,69.684143000000006],[-100.93859900000001,69.672484999999995],[-100.94748699999997,69.666930999999977],[-100.95722999999992,69.662490999999989],[-100.96916199999998,69.659714000000065],[-101.06443799999994,69.648604999999975],[-101.28362300000003,69.663879000000065],[-101.31777999999991,69.667480000000126],[-101.32972699999988,69.669983000000116],[-101.34028599999999,69.678864000000033],[-101.43831599999993,69.769714000000022],[-101.45472699999993,69.798874000000069],[-101.46806299999997,69.823044000000095],[-101.47332799999998,69.832763999999997],[-101.468613,69.838882000000069],[-101.458618,69.843322999999998],[-101.43998699999997,69.853317000000004],[-101.43472300000002,69.859146000000067],[-101.41610700000001,69.886932000000115],[-101.41860999999989,69.891936999999984],[-101.42944299999994,69.906097000000045],[-101.44526699999994,69.909149000000014],[-101.45638999999994,69.905548000000124],[-101.46888699999994,69.893051000000128],[-101.47917199999995,69.881362999999908],[-101.51972999999992,69.828323000000069],[-101.53999299999998,69.79942299999999],[-101.54750100000001,69.78776600000009],[-101.55972299999996,69.764998999999989],[-101.56220999999999,69.754165999999998],[-101.56194299999999,69.74914600000011],[-101.564438,69.743317000000104],[-101.569458,69.737488000000099],[-101.60777300000001,69.705825999999945],[-101.65249599999999,69.6827550000001],[-101.69193999999999,69.680267000000129],[-101.69722000000002,69.684708000000057],[-101.75805699999995,69.717758000000117],[-101.76611300000002,69.721924000000001],[-101.77916700000003,69.725266000000147],[-101.85637700000001,69.743042000000116],[-101.87000299999994,69.74414100000007],[-101.88722200000001,69.733321999999987],[-101.89916999999997,69.73054500000012],[-101.91416900000002,69.73054500000012],[-101.92999299999997,69.733597000000032],[-101.94055200000003,69.737198000000092],[-101.94860799999998,69.741363999999976],[-101.962784,69.753052000000025],[-102.02306399999992,69.817764000000011],[-102.06555199999997,69.850540000000137],[-102.20667300000002,69.91304000000008],[-102.21749899999998,69.916930999999977],[-102.23029300000002,69.917205999999965],[-102.24082900000002,69.913315000000068],[-102.37581599999999,69.809418000000107],[-102.51027699999992,69.758040999999992],[-102.57640100000003,69.737488000000099],[-102.59249899999998,69.738312000000064],[-102.60582699999998,69.741653000000099],[-102.61638600000003,69.745255000000043],[-102.64890300000002,69.761658000000125],[-102.65972899999997,69.765273999999977],[-102.673317,69.76638800000012],[-102.68055700000002,69.759995000000004],[-102.67443800000001,69.750275000000101],[-102.65805099999994,69.736923000000047],[-102.60028099999994,69.69802900000002],[-102.59221600000001,69.693862999999908],[-102.57640100000003,69.691086000000041],[-102.55943299999996,69.68942300000009],[-102.53138699999994,69.691360000000145],[-102.52084400000001,69.695251000000042],[-102.50917099999998,69.69802900000002],[-102.49194299999994,69.696365000000014],[-102.48361199999988,69.692200000000014],[-102.47805800000003,69.682480000000112],[-102.49777199999988,69.595260999999994],[-102.50778199999996,69.564147999999989],[-102.51500699999985,69.559982000000105],[-102.525284,69.556366000000025],[-102.60305800000003,69.538315000000068],[-102.81304899999986,69.529709000000139],[-102.82861300000002,69.53276100000005],[-102.94387799999993,69.559417999999994],[-103.08528099999995,69.597214000000122],[-103.18666099999996,69.629425000000026],[-103.20556599999998,69.636932000000002],[-103.22471599999994,69.644714000000135],[-103.23277300000001,69.648604999999975],[-103.260559,69.665543000000071],[-103.27166699999998,69.674423000000104],[-103.32195300000001,69.692200000000014],[-103.41639699999996,69.706375000000094],[-103.43055699999996,69.705261000000121],[-103.47693600000002,69.693588000000091],[-103.48665599999998,69.684708000000057],[-103.50723299999999,69.617751999999996],[-103.5041809999999,69.613036999999963],[-103.33528100000001,69.574997000000053],[-103.08917200000002,69.521927000000005],[-103.07528699999995,69.523041000000148],[-103.05695300000002,69.520537999999988],[-103.04638699999998,69.516936999999984],[-103.03806299999997,69.512771999999984],[-103.03278399999999,69.508331000000055],[-103.02333099999998,69.493866000000082],[-103.01390099999998,69.474152000000004],[-102.99137899999999,69.424698000000035],[-102.99082899999996,69.419434000000024],[-103.00778199999996,69.326935000000049],[-103.01917300000002,69.282761000000107],[-103.02306399999998,69.271652000000017],[-103.04444899999999,69.252487000000087],[-103.07195299999995,69.238586000000112],[-103.11332700000003,69.223602000000028],[-103.12444299999999,69.220825000000104],[-103.16000399999996,69.213042999999971],[-103.17250099999995,69.211380000000077],[-103.19415299999997,69.204712000000086],[-103.204453,69.200821000000019],[-103.21140299999996,69.194427000000132],[-103.21444700000001,69.189697000000137],[-103.21777299999997,69.137207000000103],[-103.208618,69.122756999999979],[-103.20305599999989,69.11831699999999],[-103.19499199999996,69.114426000000094],[-103.18222000000003,69.111098999999967],[-103.141953,69.15776100000005],[-103.13390400000003,69.163315000000068],[-103.12444299999999,69.167755000000056],[-103.10500300000001,69.176085999999998],[-103.07417299999997,69.187485000000038],[-103.03721599999994,69.205826000000059],[-103.021118,69.216934000000037],[-103.00611900000001,69.228592000000106],[-102.99889399999989,69.234985000000052],[-102.98082699999992,69.259155000000078],[-102.96916199999993,69.271378000000084],[-102.95056199999999,69.290268000000083],[-102.94360399999999,69.29664600000001],[-102.87249799999995,69.360535000000141],[-102.84084299999995,69.383330999999998],[-102.829453,69.386108000000036],[-102.817497,69.383881000000031],[-102.80666400000001,69.379974000000061],[-102.79360999999994,69.376923000000033],[-102.76083399999993,69.374420000000043],[-102.74694799999997,69.375534000000016],[-102.72277799999995,69.380264000000068],[-102.51083399999999,69.439697000000081],[-102.50862100000001,69.445526000000086],[-102.48972300000003,69.469436999999971],[-102.47193900000002,69.479430999999977],[-102.46028100000001,69.482208000000071],[-102.31304899999998,69.49832200000003],[-102.29804999999999,69.498596000000134],[-102.09306300000003,69.487762000000089],[-102.05750299999988,69.483597000000088],[-102.04750100000001,69.479980000000126],[-101.95527599999997,69.43553200000008],[-101.94748699999997,69.431365999999969],[-101.93694299999999,69.422485000000052],[-101.93138099999999,69.412766000000033],[-101.93110699999994,69.407486000000006],[-101.93611099999998,69.401657],[-102.03527799999995,69.287200999999982],[-102.14890300000002,69.270264000000111],[-102.15943899999996,69.27388000000002],[-102.18776700000001,69.280272999999966],[-102.20140100000003,69.279160000000047],[-102.21278399999994,69.276382000000069],[-102.22972099999993,69.265549000000078],[-102.23194899999999,69.259720000000073],[-102.21721600000001,69.225266000000033],[-102.11972000000003,69.183043999999938],[-102.10665899999992,69.179703000000131],[-102.09361299999989,69.178588999999931],[-102.08112299999993,69.180267000000072],[-102.07167099999992,69.184982000000105],[-102.06416300000001,69.191360000000032],[-102.05943299999996,69.19720499999994],[-102.05721999999992,69.202773999999977],[-102.05750299999988,69.208038000000101],[-102.05444299999999,69.214431999999988],[-102.04499800000002,69.226089000000115],[-102.03666699999997,69.231658999999979],[-102.01666299999999,69.239975000000072],[-102.00611899999996,69.243590999999981],[-101.96305799999999,69.257216999999912],[-101.95140099999998,69.259995000000117],[-101.9385989999999,69.261931999999945],[-101.92194399999994,69.260269000000051],[-101.78500399999996,69.196365000000071],[-101.77055399999995,69.189147999999989],[-101.75472999999994,69.175812000000064],[-101.75195300000001,69.165543000000014],[-101.75167799999991,69.160537999999974],[-101.75389099999995,69.149719000000061],[-101.80638099999999,69.003876000000105],[-101.80860899999993,68.99803199999991],[-101.81806899999992,68.993591000000038],[-101.85138699999993,68.984420999999941],[-101.89916999999997,68.97526600000009],[-101.94888300000002,68.96775800000006],[-101.962784,68.96665999999999],[-101.97693600000002,68.96665999999999],[-101.993607,68.968323000000112],[-102.00140399999992,68.972488000000112],[-102.02223200000003,68.990265000000136],[-102.03250100000002,68.99414100000007],[-102.04778299999998,68.996933000000126],[-102.06220999999994,68.996933000000126],[-102.09665699999994,68.988585999999941],[-102.11305199999998,68.977767999999969],[-102.12609900000001,68.966385000000002],[-102.13082900000001,68.960265999999933],[-102.14502699999997,68.94766199999998],[-102.15638699999994,68.944702000000063],[-102.16972399999997,68.946091000000024],[-102.323624,68.937195000000088],[-102.38612399999994,68.925537000000077],[-102.38583399999993,68.920258000000103],[-102.39028899999994,68.914429000000098],[-102.39835399999987,68.90887500000008],[-102.48554999999999,68.871368000000018],[-102.53582799999998,68.864425999999924],[-102.58972199999999,68.860535000000084],[-102.60417200000001,68.860260000000039],[-102.61972000000003,68.861099000000024],[-102.63500999999991,68.863876000000118],[-102.64527900000002,68.867751999999996],[-102.76306199999999,68.877762000000075],[-102.81889299999995,68.834152000000074],[-102.89472999999992,68.799988000000042],[-102.99054699999999,68.794434000000081],[-103.00583599999999,68.795258000000047],[-103.047234,68.809707999999944],[-103.146118,68.840546000000131],[-103.16416899999996,68.84304800000001],[-103.19499199999996,68.844437000000028],[-103.208618,68.843596999999988],[-103.32084699999996,68.829712000000086],[-103.34111000000001,68.822220000000129],[-103.36000099999995,68.813872999999944],[-103.36805700000002,68.808318999999983],[-103.40306099999992,68.777205999999978],[-103.50917099999987,68.801375999999948],[-103.83583099999993,68.83638000000002],[-104.09472699999992,68.856644000000017],[-104.11028299999998,68.859421000000054],[-104.13834399999996,68.865540000000124],[-104.287781,68.901932000000102],[-104.40249599999999,68.931091000000094],[-104.43083199999995,68.9369200000001],[-104.445267,68.938873000000001],[-104.45749699999999,68.936645999999996],[-104.46167000000003,68.930542000000116],[-104.46305799999988,68.924987999999928],[-104.46250900000001,68.919708000000071],[-104.47444199999995,68.901657000000057],[-104.487503,68.888885000000073],[-104.50279199999989,68.877762000000075],[-104.51167299999992,68.873032000000023],[-104.52139299999999,68.869140999999956],[-104.54360999999989,68.863311999999951],[-104.583618,68.859711000000118],[-104.84999099999993,68.870254999999986],[-105.12917299999998,68.896378000000084],[-105.14472999999992,68.899155000000007],[-105.16610699999995,68.906097000000102],[-105.19332900000001,68.917480000000126],[-105.24889399999989,68.945526000000029],[-105.18305999999995,68.988312000000008],[-105.173317,68.991928000000087],[-105.14666699999998,68.992477000000008],[-105.128601,68.989975000000129],[-105.06471299999998,68.986923000000047],[-105.03916900000002,68.990265000000136],[-104.93639400000001,69.03054800000001],[-104.92887899999999,69.036102000000028],[-104.91610700000001,69.048874000000012],[-104.91166699999991,69.065811000000053],[-104.915009,69.070541000000048],[-104.92304999999999,69.074706999999989],[-104.93388399999998,69.078323000000012],[-105.06500199999999,69.104155999999989],[-105.08332799999999,69.106369000000086],[-105.09665699999999,69.105255000000113],[-105.122772,69.091095000000053],[-105.16027799999995,69.071930000000066],[-105.47361799999999,69.106934000000138],[-105.48055999999997,69.116652999999928],[-105.49249299999991,69.125259000000028],[-105.50695799999994,69.133606000000043],[-105.51528899999994,69.13749700000011],[-105.55387899999999,69.152480999999966],[-105.58056599999998,69.156372000000033],[-105.61694299999994,69.160812000000078],[-105.76806599999998,69.171371000000136],[-105.83029199999999,69.172211000000004],[-105.87416100000002,69.171097000000032],[-105.90222199999999,69.169144000000074],[-105.91443600000002,69.167205999999965],[-105.92555199999998,69.164153999999996],[-106.03888699999993,69.153869999999984],[-106.17777999999998,69.144150000000081],[-106.19360399999999,69.144714000000022],[-106.256958,69.154984000000127],[-106.28888699999999,69.160262999999929],[-106.39611799999994,69.17804000000001],[-106.40611299999995,69.180542000000059],[-106.41471899999999,69.184417999999937],[-106.41471899999999,69.195251000000098],[-106.41027799999995,69.217758000000003],[-106.40666199999998,69.223877000000073],[-106.3944469999999,69.23692299999999],[-106.38612399999994,69.241653000000042],[-106.37638899999996,69.24552900000009],[-106.30777,69.262206999999989],[-106.28832999999992,69.269989000000123],[-106.27362099999993,69.281372000000147],[-106.26777600000003,69.292206000000022],[-106.26889,69.297211000000061],[-106.31639100000001,69.386658000000068],[-106.49527,69.474426000000108],[-106.52139299999993,69.486098999999967],[-106.54138199999989,69.49331699999999],[-106.55499299999985,69.496368000000018],[-106.57112099999989,69.498870999999951],[-106.60221899999999,69.498870999999951],[-106.61444099999994,69.496643000000006],[-106.62554899999986,69.493591000000094],[-106.73306299999996,69.441650000000038],[-106.74027999999998,69.435806000000014],[-106.74388099999993,69.429703000000075],[-106.74553700000001,69.407760999999994],[-106.86277799999999,69.36914100000007],[-106.93083200000001,69.361649000000114],[-106.95500199999992,69.357208000000014],[-106.96611000000001,69.354156000000103],[-106.98554999999999,69.346100000000035],[-106.99249299999997,69.340546000000018],[-106.99722300000002,69.33526599999999],[-106.99833699999999,69.329711999999972],[-106.99694799999997,69.324432000000058],[-106.96528599999994,69.303040000000067],[-106.95749699999993,69.293319999999994],[-106.925003,69.23942599999998],[-106.92223399999995,69.228867000000093],[-106.929169,69.216660000000104],[-106.93611099999998,69.211105000000032],[-106.94444299999998,69.206375000000037],[-106.96362299999993,69.198318000000029],[-107.03999299999998,69.181091000000038],[-107.12832600000002,69.154434000000094],[-107.13806199999999,69.150543000000027],[-107.16221599999994,69.134430000000009],[-107.19167299999998,69.112487999999928],[-107.22666900000002,69.084152000000017],[-107.24889400000001,69.068054000000018],[-107.264183,69.057480000000112],[-107.27944899999994,69.046936000000073],[-107.304169,69.032485999999949],[-107.31360599999994,69.028595000000109],[-107.34221599999995,69.01887499999998],[-107.37444299999993,69.009430000000123],[-107.43167099999994,68.996368000000075],[-107.50334199999992,68.982758000000047],[-107.55387899999994,68.975540000000024],[-107.64611799999989,68.965546000000018],[-107.67388900000003,68.963608000000079],[-107.74610899999999,68.960815000000082],[-107.93749999999994,68.934981999999934],[-107.95584099999996,68.931046000000094],[-107.97693600000002,68.930542000000116],[-108.17555199999998,68.931091000000094],[-108.20944199999997,68.93331900000004],[-108.26444999999995,68.939148000000046],[-108.29833999999988,68.941360000000088],[-108.42804699999994,68.945816000000036],[-108.49221799999992,68.94747899999993],[-108.521118,68.946365000000128],[-108.53443900000002,68.944702000000063],[-108.54611199999994,68.942474000000061],[-108.56331599999993,68.933594000000028],[-108.56388900000002,68.927765000000022],[-108.55082699999997,68.919434000000138],[-108.54194599999994,68.915543000000071],[-108.53555299999999,68.911376999999959],[-108.531387,68.906647000000135],[-108.52971599999995,68.901382000000069],[-108.53028899999993,68.895828000000051],[-108.53555299999999,68.889160000000061],[-108.55139200000002,68.879425000000026],[-108.59722899999997,68.859146000000067],[-108.67443799999995,68.829437000000041],[-108.926941,68.744431000000134],[-108.93749999999994,68.741088999999988],[-108.97250400000001,68.733870999999965],[-109.10472099999998,68.710541000000035],[-109.19138299999992,68.697205000000054],[-109.23416099999997,68.694977000000108],[-109.26390099999998,68.694427000000076],[-109.31194299999999,68.695816000000093],[-109.345551,68.697754000000032],[-109.37416100000002,68.696365000000014],[-109.39998600000001,68.693313999999987],[-109.43472300000002,68.686095999999964],[-109.49137899999994,68.673308999999961],[-109.52306399999992,68.664993000000095],[-109.55359599999991,68.655258000000003],[-109.59722899999997,68.64387499999998],[-109.64362299999999,68.634430000000123],[-109.65638699999994,68.632751000000098],[-109.68331899999998,68.630539000000056],[-109.756958,68.628586000000098],[-109.97028399999999,68.627197000000081],[-110.12416099999996,68.627197000000081],[-110.16055299999994,68.630539000000056],[-110.19167299999998,68.630814000000044],[-110.22000099999997,68.629150000000038],[-110.24416400000001,68.625259000000142],[-110.26306199999999,68.617752000000053],[-110.27194199999997,68.613602000000014],[-110.27916700000003,68.608597000000145],[-110.295547,68.599426000000051],[-110.32917800000001,68.582214000000022],[-110.33917200000002,68.578872999999987],[-110.35082999999997,68.576385000000016],[-110.36361699999998,68.574707000000046],[-110.37777699999998,68.574158000000125],[-110.39138800000001,68.576660000000004],[-110.39806399999986,68.580826000000116],[-110.42027299999995,68.604156000000046],[-110.42722300000003,68.608321999999987],[-110.44082600000002,68.611099000000081],[-110.45889299999999,68.612761999999975],[-110.56111099999998,68.616653000000042],[-110.576683,68.616653000000042],[-110.58944699999989,68.614990000000148],[-110.60944399999994,68.608321999999987],[-110.61694299999994,68.603592000000106],[-110.63417099999987,68.59526100000005],[-110.65695199999999,68.590271000000143],[-110.68138099999999,68.586105000000089],[-110.89666699999998,68.55720500000001],[-110.92223399999995,68.553863999999976],[-110.950287,68.551926000000037],[-111.01363400000002,68.552765000000022],[-111.03195199999999,68.554428000000144],[-111.03859699999992,68.558594000000028],[-111.03500400000001,68.563873000000001],[-110.98332199999993,68.577773999999977],[-110.97193900000002,68.580276000000083],[-110.95777900000002,68.581100000000049],[-110.92555199999993,68.580276000000083],[-110.89723200000003,68.581940000000088],[-110.87165800000002,68.585266000000104],[-110.86028299999987,68.587769000000094],[-110.850281,68.591095000000109],[-110.84306299999997,68.596099999999979],[-110.84306299999997,68.601653999999996],[-110.84973099999996,68.605820000000051],[-110.86361699999992,68.608597000000145],[-111.01750199999998,68.598327999999981],[-111.03028899999998,68.596649000000127],[-111.05888399999998,68.585815000000082],[-111.068893,68.58248900000001],[-111.08029199999999,68.579987000000131],[-111.09306300000003,68.578323000000125],[-111.13527699999997,68.575821000000076],[-111.16639700000002,68.575821000000076],[-111.23249800000002,68.578049000000021],[-111.26750199999998,68.580551000000071],[-111.28362299999998,68.582764000000054],[-111.32000700000003,68.585815000000082],[-111.33693699999998,68.586655000000121],[-111.37917299999998,68.584152000000131],[-111.39195299999994,68.58248900000001],[-111.41166699999997,68.575546000000031],[-111.41665599999999,68.571106000000043],[-111.40527299999997,68.568054000000075],[-111.389183,68.56581099999994],[-111.29804999999999,68.557755000000043],[-111.25028999999989,68.55720500000001],[-111.23194899999999,68.555542000000116],[-111.21833800000002,68.552765000000022],[-111.20916699999998,68.549148999999943],[-111.204453,68.544708000000071],[-111.204453,68.538879000000009],[-111.21112099999999,68.526093000000117],[-111.21556099999992,68.519440000000145],[-111.22556299999997,68.516098],[-111.23805199999993,68.514435000000105],[-111.25361599999991,68.514435000000105],[-111.35861199999999,68.521652000000017],[-111.37470999999999,68.523604999999975],[-111.38834400000002,68.526382000000069],[-111.46806300000003,68.536926000000108],[-111.52278100000001,68.541656000000103],[-111.60056299999991,68.543594000000041],[-111.85109699999998,68.534149000000014],[-112.060272,68.523041000000035],[-112.21000700000002,68.513610999999969],[-112.23665599999987,68.510817999999972],[-112.35916099999997,68.501938000000109],[-112.40110799999997,68.499145999999996],[-112.50917099999992,68.498032000000023],[-112.63527699999992,68.483047000000056],[-112.63694800000002,68.476928999999927],[-112.64527900000002,68.472763000000043],[-112.67027299999995,68.469146999999964],[-112.72749299999992,68.465820000000065],[-112.77390299999996,68.465546000000131],[-112.80750299999994,68.466660000000104],[-113.05166600000001,68.464157000000114],[-113.091949,68.460266000000047],[-113.220551,68.45277400000009],[-113.25140399999992,68.452209000000096],[-113.26944699999996,68.453873000000101],[-113.297234,68.458602999999925],[-113.30444299999999,68.462769000000037],[-113.30943300000001,68.467209000000025],[-113.310272,68.473038000000031],[-113.30638099999993,68.479706000000022],[-113.29972800000002,68.484711000000061],[-113.29138199999994,68.489151000000106],[-113.26944699999996,68.494430999999963],[-113.256958,68.496094000000085],[-113.19360399999999,68.496368000000018],[-113.05166600000001,68.487487999999985],[-113.03778099999994,68.488312000000121],[-113.03388999999999,68.494980000000112],[-113.04360999999994,68.504166000000055],[-113.07250999999991,68.520538000000045],[-113.11805700000002,68.544434000000138],[-113.14138800000001,68.550537000000077],[-113.19721999999996,68.560256999999979],[-113.21333300000003,68.562195000000088],[-113.26888999999994,68.572220000000016],[-113.33416699999998,68.585541000000148],[-113.35777299999995,68.591369999999984],[-113.36721799999992,68.594986000000006],[-113.38166799999988,68.603043000000014],[-113.44304699999998,68.640548999999965],[-113.44833399999999,68.645263999999997],[-113.45111099999997,68.650269000000037],[-113.45249899999999,68.661652000000061],[-113.45084400000002,68.667755],[-113.52443700000003,68.724990999999932],[-113.66665599999999,68.802199999999914],[-113.676941,68.811096000000077],[-113.67887899999994,68.894714000000079],[-113.67722299999997,68.900818000000129],[-113.671944,68.906647000000135],[-113.62389400000001,68.93331900000004],[-113.60694899999993,68.942474000000061],[-113.58444199999997,68.948028999999963],[-113.57472199999995,68.951385000000016],[-113.569458,68.957214000000022],[-113.54583700000001,69.043045000000006],[-113.54499799999996,69.048035000000084],[-113.55471799999987,69.051376000000118],[-113.61501299999998,69.066376000000048],[-113.63221699999997,69.073883000000023],[-113.64723199999992,69.081940000000145],[-113.65778399999999,69.091095000000053],[-113.69611399999991,69.154709000000139],[-113.69220699999994,69.189423000000033],[-113.68083200000001,69.191925000000083],[-113.66583300000002,69.191086000000098],[-113.65583800000002,69.187485000000038],[-113.62193300000001,69.17804000000001],[-113.53888699999999,69.168594000000041],[-113.51972999999998,69.167205999999965],[-113.50862099999995,69.169708000000014],[-113.51363399999997,69.174423000000047],[-113.52111799999994,69.178588999999931],[-113.55359599999991,69.187195000000031],[-113.58000199999992,69.192474000000004],[-113.62332200000003,69.199707000000046],[-113.90888999999999,69.24192800000003],[-114.27555799999999,69.281936999999971],[-114.31139400000001,69.284987999999998],[-114.32888800000001,69.285538000000031],[-114.39277600000003,69.284149000000014],[-114.42138699999998,69.281936999999971],[-114.4472199999999,69.278046000000074],[-114.49249299999991,69.267212000000029],[-114.51834100000002,69.263321000000133],[-114.66972399999997,69.255829000000006],[-114.764183,69.252212999999983],[-115.08889799999992,69.244705000000124],[-115.25361599999991,69.245254999999986],[-115.40083299999998,69.256942999999978],[-115.64472999999998,69.273315000000139],[-115.79527299999995,69.282761000000107],[-115.92138699999992,69.290268000000083],[-115.95584099999996,69.292206000000022],[-115.96833799999996,69.294983000000116],[-115.9786069999999,69.298598999999967],[-115.98665599999998,69.302475000000015],[-116.00029000000001,69.310806000000127],[-116.00611900000001,69.315262000000018],[-116.016953,69.322220000000016],[-116.02694700000001,69.325546000000088],[-116.05638099999999,69.32998699999996],[-116.17527799999993,69.34165999999999],[-116.21945199999999,69.348327999999981],[-116.52583300000003,69.407486000000006],[-116.53859699999998,69.4102630000001],[-116.54888900000003,69.413605000000018],[-116.56527699999992,69.421371000000079],[-116.62970699999994,69.458878000000141],[-116.63137799999993,69.464706000000035],[-116.62666299999989,69.470535000000041],[-116.61888099999993,69.474990999999989],[-116.60777300000001,69.478043000000071],[-116.569458,69.48414600000001],[-116.56139400000001,69.488586000000055],[-116.55860899999993,69.4952550000001],[-116.57556199999993,69.555817000000104],[-116.58138999999989,69.560531999999967],[-116.591949,69.563873000000001],[-116.60472099999993,69.566665999999998],[-116.63667299999997,69.570267000000058],[-116.73388699999998,69.575546000000031],[-116.74999999999994,69.574997000000053],[-116.75945299999995,69.571381000000031],[-116.76611299999996,69.565177999999946],[-116.78138699999988,69.55720500000001],[-116.89750700000002,69.587494000000049],[-116.88054699999986,69.608871000000079],[-116.85193600000002,69.619705000000124],[-116.84612299999998,69.643051000000014],[-116.84750399999996,69.648604999999975],[-116.858047,69.651932000000102],[-116.96193700000003,69.679427999999973],[-116.987503,69.684981999999991],[-117.01777600000003,69.68942300000009],[-117.03500399999996,69.690810999999997],[-117.05027799999993,69.693038999999942],[-117.07584400000002,69.69859300000013],[-117.11805699999996,69.711654999999951],[-117.23889200000002,69.753052000000025],[-117.24749799999995,69.756943000000092],[-117.26917300000002,69.78166200000004],[-117.27278100000001,69.792755000000056],[-117.30777,69.844436999999971],[-117.36721799999992,69.919983000000059],[-117.42250099999995,69.972488000000055],[-117.43499799999995,69.981369000000029],[-117.43666099999996,69.98692299999999],[-117.43611099999993,69.993042000000059],[-117.41528299999993,70.009995000000117],[-117.38527699999997,70.028595000000053],[-117.35637700000001,70.039703000000031],[-117.32584400000002,70.049987999999985],[-117.28362300000003,70.063309000000118],[-117.25140399999992,70.072768999999994],[-117.23999000000003,70.075821000000133],[-117.19444299999998,70.087493999999936],[-117.16999800000002,70.092484000000013],[-117.12082700000002,70.102478000000019],[-117.08167999999995,70.108871000000136],[-117.01083399999993,70.116928000000144],[-116.87721299999998,70.129150000000095],[-116.58306899999997,70.156937000000084],[-116.236107,70.191360000000032],[-116.16639700000002,70.199997000000053],[-116.09999099999999,70.210266000000047],[-116.07167099999998,70.213608000000022],[-115.90834000000001,70.228867000000093],[-115.80194099999994,70.236649000000057],[-115.69360399999994,70.243866000000139],[-115.64695699999993,70.246643000000063],[-115.49665799999997,70.250549000000092],[-115.44833399999993,70.252487000000031],[-115.31471299999998,70.264160000000061],[-115.30139200000002,70.266388000000063],[-115.229446,70.273879999999963],[-115.16750299999995,70.27777100000003],[-115.08389299999999,70.279708999999968],[-115.03028899999998,70.279984000000013],[-114.86721799999998,70.28387500000008],[-114.80194099999989,70.286102000000142],[-114.74137899999999,70.290817000000004],[-114.71305799999988,70.293869000000086],[-114.65888999999999,70.301651000000049],[-114.61694299999994,70.30664100000007],[-114.58833299999992,70.309708000000001],[-114.54305999999997,70.313309000000061],[-114.511124,70.314696999999967],[-114.323624,70.316665999999998],[-114.254997,70.317215000000147],[-114.21833800000002,70.316085999999984],[-114.17832900000002,70.313599000000067],[-114.16082799999998,70.311645999999939],[-114.13527699999997,70.305816999999934],[-114.111107,70.293869000000086],[-114.09028599999994,70.286926000000108],[-114.057503,70.282486000000063],[-113.84166700000003,70.269440000000145],[-113.68388399999992,70.263046000000088],[-113.65055799999993,70.263610999999969],[-113.59166700000003,70.268600000000106],[-113.54943799999995,70.273315000000139],[-113.50556899999998,70.277481000000023],[-113.46000700000002,70.280548000000124],[-113.42804699999999,70.281662000000097],[-113.39138799999995,70.280548000000124],[-113.33332799999994,70.277206000000035],[-113.29611199999999,70.273879999999963],[-113.16832699999998,70.259155000000021],[-113.09084299999995,70.247481999999991],[-112.66665599999993,70.203873000000101],[-112.56471299999998,70.198318000000029],[-112.54804999999999,70.198593000000017],[-112.53278399999994,70.199416999999983],[-112.52084399999995,70.202209000000096],[-112.51722699999999,70.207488999999953],[-112.52749599999993,70.211105000000032],[-112.56304899999998,70.213608000000022],[-112.577789,70.216095000000053],[-112.58084100000002,70.221374999999966],[-112.57501200000002,70.227203000000088],[-112.56582599999996,70.231368999999972],[-112.55526700000001,70.234984999999995],[-112.54332699999992,70.237487999999985],[-112.295547,70.266663000000051],[-112.212784,70.265823000000012],[-112.195831,70.265823000000012],[-112.16388699999999,70.266936999999984],[-112.13834399999996,70.271378000000084],[-112.14584400000001,70.275543000000084],[-112.16306299999991,70.277481000000023],[-112.24249299999991,70.283600000000035],[-112.29695099999998,70.289154000000053],[-112.30471799999992,70.293319999999937],[-112.29723399999995,70.298325000000034],[-112.28333299999997,70.299988000000099],[-112.26666299999999,70.300262000000032],[-112.24833699999999,70.299423000000104],[-112.23111,70.297484999999938],[-112.10888699999992,70.277481000000023],[-111.92639199999996,70.252212999999927],[-111.91583300000002,70.255553999999961],[-111.90805099999989,70.260544000000039],[-111.89917000000003,70.264709000000039],[-111.88054699999998,70.270264000000111],[-111.86527999999993,70.271378000000084],[-111.84861799999993,70.271378000000084],[-111.743607,70.269440000000145],[-111.55555700000002,70.269714000000079],[-111.53888699999993,70.269989000000066],[-111.46806300000003,70.278320000000008],[-111.45445299999989,70.279984000000013],[-111.445267,70.284149000000014],[-111.44275699999992,70.290268000000026],[-111.487213,70.336929000000055],[-111.49472000000003,70.341094999999939],[-111.50723299999993,70.344147000000078],[-111.53694200000001,70.349426000000051],[-111.63110399999999,70.358321999999987],[-111.66471899999999,70.35803199999998],[-111.69387799999998,70.355545000000063],[-111.73528299999998,70.35026600000009],[-111.75055700000001,70.349426000000051],[-111.80387899999999,70.350815000000011],[-111.98055999999991,70.370818999999983],[-112.00083899999987,70.378036000000066],[-112.05387899999999,70.401093000000003],[-112.06166099999996,70.405258000000003],[-112.06973299999993,70.414993000000095],[-112.07250999999997,70.42025799999999],[-112.073059,70.431655999999975],[-112.07584400000002,70.436646000000053],[-112.08917200000002,70.451096000000121],[-112.11527999999998,70.474152000000004],[-112.14611799999994,70.490540000000067],[-112.156387,70.494141000000127],[-112.16915899999998,70.497208000000001],[-112.19915800000001,70.502213000000097],[-112.42722299999997,70.526382000000012],[-112.49553700000001,70.515274000000034],[-112.5,70.514740000000074],[-112.50945300000001,70.513611000000083],[-112.52806099999998,70.514160000000004],[-112.58612099999999,70.524994000000106],[-112.62193300000001,70.534424000000001],[-112.65278599999994,70.545258000000047],[-112.67083700000001,70.552765000000136],[-112.67859599999991,70.556931000000077],[-112.70973199999997,70.567490000000078],[-112.72805799999998,70.568329000000062],[-112.81471299999993,70.568054000000075],[-112.84861799999993,70.567764000000011],[-112.85610999999994,70.562758999999971],[-112.93749999999994,70.56721500000009],[-113.00083899999993,70.576659999999947],[-113.01611300000002,70.579163000000108],[-113.14222699999999,70.606093999999985],[-113.30304699999994,70.641936999999984],[-113.49221799999992,70.677200000000028],[-113.51112399999994,70.677765000000022],[-113.51999699999993,70.673598999999967],[-113.51917299999997,70.667755000000113],[-113.5227809999999,70.655547999999953],[-113.52834300000001,70.649719000000118],[-113.54055800000003,70.646942000000024],[-113.55444299999994,70.644989000000123],[-113.57140399999997,70.644714000000079],[-113.59166700000003,70.646103000000096],[-113.60722399999997,70.648604999999975],[-113.63054699999998,70.654984000000013],[-113.64917000000003,70.662766000000147],[-113.66528299999999,70.670822000000044],[-113.68388399999992,70.678314],[-113.72860700000001,70.691649999999925],[-113.76194800000002,70.696091000000024],[-113.88221699999997,70.710265999999933],[-113.93831599999993,70.71527100000003],[-113.97416699999991,70.715546000000018],[-113.98972299999997,70.714432000000045],[-114.015556,70.709991000000116],[-114.06833599999993,70.692474000000061],[-114.08944700000001,70.685256999999979],[-114.12082699999996,70.674698000000092],[-114.14362299999999,70.668594000000098],[-114.17111199999999,70.664703000000031],[-114.20834400000001,70.665817000000004],[-114.26194800000002,70.671371000000022],[-114.323059,70.675262000000089],[-114.37748699999997,70.675812000000121],[-114.40834000000001,70.673598999999967],[-114.4202729999999,70.670822000000044],[-114.43083200000001,70.667206000000022],[-114.44833399999999,70.658600000000092],[-114.45889299999999,70.655258000000117],[-114.49500299999994,70.646942000000024],[-114.54527299999995,70.636107999999979],[-114.57112100000001,70.631362999999965],[-114.64111299999996,70.622482000000048],[-114.98916599999995,70.603867000000093],[-115.13694800000002,70.598038000000088],[-115.25250199999994,70.601379000000122],[-115.38054699999998,70.604706000000078],[-115.39943700000003,70.604980000000012],[-115.88971700000002,70.595260999999994],[-115.921944,70.593596999999988],[-115.97609699999998,70.585266000000047],[-116.05555700000002,70.572220000000129],[-116.08556399999992,70.587769000000037],[-116.16251399999999,70.62303200000008],[-116.17111199999994,70.626923000000147],[-116.26363400000002,70.634720000000073],[-116.36389200000002,70.639160000000118],[-116.38082900000001,70.638885000000073],[-116.52999899999992,70.632477000000108],[-116.63221699999997,70.614990000000091],[-116.65583800000002,70.609146000000067],[-116.66915899999998,70.607208000000128],[-116.71501199999994,70.603043000000127],[-116.90110799999997,70.597214000000122],[-116.91972399999997,70.597488000000055],[-117.05972300000002,70.601379000000122],[-117.10056299999997,70.603317000000061],[-117.34584000000001,70.614990000000091],[-117.34973100000002,70.619980000000112],[-117.35861199999994,70.623871000000008],[-117.37666300000001,70.62553400000013],[-117.50556899999998,70.61692800000003],[-117.51528899999994,70.613311999999951],[-117.51806599999986,70.606368999999972],[-117.51862299999993,70.600266000000033],[-117.52500900000001,70.594985999999949],[-117.54360999999994,70.595260999999994],[-117.5594329999999,70.597214000000122],[-117.61305199999998,70.608597000000145],[-117.67111199999999,70.624419999999986],[-117.70472699999999,70.634155000000021],[-117.724716,70.641373000000044],[-117.73777799999993,70.65026899999998],[-117.74194299999994,70.655258000000117],[-117.741669,70.661376999999959],[-117.73944099999994,70.666930999999977],[-117.73473399999995,70.673035000000027],[-117.72222899999986,70.68331900000004],[-117.71417199999996,70.688034000000073],[-117.70944199999985,70.693863000000079],[-117.71140300000002,70.699707000000103],[-117.71806300000003,70.703872999999987],[-117.73581699999994,70.711655000000121],[-117.74694799999997,70.714995999999985],[-117.89806399999998,70.756104000000107],[-117.94554099999999,70.768599999999992],[-118.00890400000003,70.783051],[-118.04750100000001,70.791656000000046],[-118.09277299999997,70.804703000000075],[-118.13583399999999,70.818054000000018],[-118.16750300000001,70.828598000000056],[-118.18776700000001,70.836104999999975],[-118.20584099999996,70.843872000000147],[-118.26445000000001,70.871918000000051],[-118.28028899999993,70.879974000000118],[-118.30972300000002,70.897217000000012],[-118.31639100000001,70.901657000000057],[-118.32972699999993,70.910537999999974],[-118.40862299999998,70.970260999999994],[-118.41750300000001,70.980270000000019],[-118.41972399999986,70.985809000000017],[-118.41944899999993,70.99192800000003],[-118.415009,70.99803200000008],[-118.40862299999998,71.003326000000072],[-118.40055799999999,71.007766999999944],[-118.37082700000002,71.019149999999968],[-118.33944699999995,71.029433999999981],[-118.27250699999991,71.048874000000012],[-117.98055999999997,71.124420000000043],[-117.84973099999996,71.156937000000028],[-117.79666099999992,71.166382000000112],[-117.728882,71.169708000000128],[-117.69055199999997,71.169434000000024],[-117.640289,71.171921000000111],[-117.54305999999991,71.178589000000102],[-117.49445300000002,71.18193100000002],[-117.41665599999988,71.188873000000115],[-117.38722199999995,71.192474000000004],[-117.28859699999992,71.206649999999968],[-116.98528299999998,71.236098999999967],[-116.83666999999997,71.269149999999911],[-116.83332799999994,71.276093000000117],[-116.82472200000001,71.280548000000124],[-116.80055199999993,71.286102000000085],[-116.71333300000003,71.297211000000004],[-116.66972399999992,71.302765000000022],[-116.60166900000002,71.313873000000001],[-116.51777600000003,71.326384999999959],[-116.40583800000002,71.343048000000067],[-116.20889299999993,71.364150999999993],[-116.17722300000003,71.366653000000042],[-116.14195299999989,71.367751999999996],[-116.08556399999992,71.367477000000008],[-116.077789,71.365814000000057],[-116.05249000000003,71.356093999999985],[-115.81027199999994,71.362761999999975],[-115.77667200000002,71.36442599999998],[-115.76083399999993,71.365814000000057],[-115.74638399999998,71.368317000000047],[-115.73416099999986,71.371368000000075],[-115.72693599999997,71.376373000000115],[-115.72666900000002,71.381362999999965],[-115.73306299999996,71.385818000000029],[-115.74416400000001,71.389160000000118],[-115.75805700000001,71.391937000000041],[-115.79055800000003,71.396378000000141],[-115.84166700000003,71.394440000000031],[-115.85582699999992,71.392212000000029],[-115.885559,71.389160000000118],[-115.91915899999998,71.387206999999989],[-115.93360899999999,71.38888500000013],[-116.01777599999997,71.411101999999971],[-116.06471299999998,71.438583000000051],[-115.82805599999995,71.483046999999999],[-115.76306199999999,71.490265000000022],[-115.62082700000002,71.498596000000077],[-115.60472099999993,71.496094000000028],[-115.58444199999991,71.488876000000005],[-115.58416699999998,71.485259999999982],[-115.53555299999994,71.470261000000107],[-115.41555800000003,71.449707000000103],[-115.37832599999996,71.449707000000103],[-115.20028699999995,71.479430999999977],[-115.17527799999988,71.484985000000108],[-115.06667299999998,71.518600000000049],[-115.05750299999994,71.523041000000148],[-115.06194299999999,71.526657],[-115.08168000000001,71.527205999999921],[-115.11361699999998,71.524704000000042],[-115.15638699999994,71.518875000000037],[-115.17054699999994,71.516662999999994],[-115.24553700000001,71.500000000000114],[-115.26000999999997,71.498031999999967],[-115.32224300000001,71.492477000000065],[-115.44275699999992,71.488037000000077],[-115.45973200000003,71.489151000000049],[-115.53859699999998,71.50082400000008],[-115.54998799999998,71.504440000000102],[-115.55860899999999,71.508330999999998],[-115.55583199999995,71.513611000000083],[-115.54332699999986,71.516662999999994],[-115.53083800000002,71.519440000000088],[-115.51666299999999,71.521378000000027],[-115.51222199999989,71.53776600000009],[-115.61888099999987,71.555252000000053],[-115.65499899999992,71.55802900000009],[-115.70638999999994,71.555817000000047],[-115.79194599999994,71.543593999999985],[-115.87638900000002,71.53276100000005],[-115.965012,71.522216999999955],[-116.16027799999989,71.49971000000005],[-116.20805399999995,71.495818999999983],[-116.28250100000002,71.495528999999976],[-116.33389299999999,71.493317000000104],[-116.41361999999998,71.486648999999943],[-116.44360399999999,71.483322000000044],[-116.806107,71.436096000000134],[-116.98610699999995,71.427200000000028],[-117.17666600000001,71.404709000000025],[-117.20111099999997,71.398331000000098],[-117.21528599999994,71.396378000000141],[-117.328056,71.386108000000036],[-117.35944399999994,71.383331000000112],[-117.37721299999987,71.382751000000098],[-117.39835399999998,71.383880999999974],[-117.41221599999994,71.386383000000023],[-117.41665599999988,71.391373000000101],[-117.41610700000001,71.397766000000047],[-117.41306299999997,71.404434000000037],[-117.39083900000003,71.435257000000036],[-117.38110399999994,71.447205000000054],[-117.37832600000002,71.454163000000051],[-117.44776899999988,71.47387700000013],[-117.49445300000002,71.486923000000047],[-117.51750199999998,71.493317000000104],[-117.54583700000001,71.498871000000122],[-117.56276699999995,71.49971000000005],[-117.628601,71.467758000000117],[-117.63333099999994,71.461929000000112],[-117.63166799999999,71.456375000000094],[-117.62470999999999,71.451935000000105],[-117.61305199999998,71.44859300000013],[-117.59665699999999,71.446365000000014],[-117.55583200000001,71.445251000000042],[-117.5369419999999,71.443862999999908],[-117.506393,71.439148000000102],[-117.48332199999999,71.432480000000112],[-117.47888199999989,71.427475000000072],[-117.48194899999999,71.420532000000037],[-117.51722699999999,71.379425000000026],[-117.52749599999993,71.375809000000004],[-117.53943600000002,71.372757000000092],[-117.59416199999987,71.371643000000063],[-117.68138099999993,71.379700000000071],[-117.75666799999999,71.376083000000108],[-117.79444899999999,71.368042000000059],[-117.82749899999999,71.372208000000114],[-117.94833399999999,71.377762000000132],[-118.01500699999997,71.37303200000008],[-118.03278399999994,71.372482000000048],[-118.09084299999995,71.372757000000092],[-118.112213,71.37359600000002],[-118.18536399999999,71.379791000000125],[-118.24388099999999,71.389984000000084],[-118.25556899999998,71.393326000000002],[-118.28362300000003,71.404709000000025],[-118.29750099999995,71.413605000000132],[-118.31111099999993,71.428589000000045],[-118.31527699999992,71.439697000000024],[-118.31471299999998,71.452209000000039],[-118.30943300000001,71.465820000000008],[-118.28999299999992,71.481659000000093],[-118.28195199999988,71.486098999999911],[-118.2633439999999,71.49414100000007],[-118.21250900000001,71.513046000000031],[-118.20221699999996,71.516662999999994],[-118.19027699999998,71.519714000000022],[-118.17804699999994,71.522766000000104],[-118.12609900000001,71.533051000000057],[-118.08612099999988,71.540267999999969],[-118.05444299999999,71.543045000000063],[-117.83583099999998,71.554703000000075],[-117.70722999999998,71.54942299999999],[-117.68720999999994,71.549988000000042],[-117.675003,71.552765000000136],[-117.658051,71.561646000000053],[-117.65139799999992,71.566940000000045],[-117.65583800000002,71.571930000000123],[-117.66999800000002,71.574706999999989],[-117.87304699999993,71.611649],[-117.88722199999995,71.614151000000106],[-117.90888999999999,71.614990000000034],[-117.86361699999998,71.639435000000105],[-117.718887,71.659714000000008],[-117.70694700000001,71.662491000000102],[-117.69638099999992,71.666091999999992],[-117.70084399999996,71.671371000000136],[-117.715012,71.673874000000126],[-117.73665599999993,71.674988000000099],[-118.01000999999997,71.672484999999938],[-118.02778599999994,71.67164600000001],[-118.11665299999993,71.65277100000003],[-118.12693799999988,71.648880000000133],[-118.17278299999998,71.628036000000009],[-118.17749000000003,71.621918000000051],[-118.16388699999993,71.606933999999967],[-118.16639699999996,71.599990999999989],[-118.17666600000001,71.596374999999966],[-118.19082600000002,71.594146999999964],[-118.29998799999993,71.583328000000108],[-118.31777999999991,71.582763999999997],[-118.33444199999997,71.584717000000126],[-118.36527999999998,71.589431999999931],[-118.38639799999999,71.613602000000128],[-118.38612399999994,71.619705000000067],[-118.45500199999987,71.650818000000072],[-118.485817,71.655548000000124],[-118.56639099999995,71.662766000000147],[-118.60527000000002,71.664154000000053],[-118.84166700000003,71.664702999999975],[-118.85555999999997,71.662491000000102],[-118.86389199999996,71.658035000000041],[-118.90387699999997,71.614700000000028],[-118.90387699999997,71.608322000000101],[-118.88971699999996,71.599716000000001],[-118.88027999999991,71.595825000000104],[-118.86609599999997,71.586928999999998],[-118.8683319999999,71.580276000000026],[-118.88054699999998,71.577209000000096],[-118.89778099999995,71.57777400000009],[-118.90972899999991,71.581099999999992],[-119.05027799999999,71.626648000000102],[-119.07472200000001,71.644149999999968],[-119.08416699999998,71.654160000000047],[-119.10582699999998,71.685806000000071],[-119.12470999999999,71.730545000000063],[-119.13445300000001,71.76527399999992],[-119.13445300000001,71.783874999999966],[-119.10555999999991,71.876648000000046],[-119.10305800000003,71.883330999999998],[-119.09194899999994,71.902205999999978],[-119.08750900000001,71.908324999999991],[-118.945831,71.99136400000009],[-118.929169,72.000548999999921],[-118.86694299999999,72.023879999999963],[-118.84249899999998,72.029709000000025],[-118.80166599999995,72.037200999999925],[-118.76471699999996,72.046370999999965],[-118.73361199999999,72.057480000000055],[-118.72501399999987,72.0619200000001],[-118.71665999999999,72.066665999999998],[-118.71028099999995,72.071930000000009],[-118.70556599999992,72.077774000000034],[-118.703056,72.084717000000012],[-118.70749699999999,72.095824999999991],[-118.715012,72.10026600000009],[-118.71972700000003,72.105255000000056],[-118.71945199999999,72.111374000000069],[-118.71749899999998,72.116928000000087],[-118.69193999999999,72.130539000000056],[-118.58860800000002,72.176086000000112],[-118.57640100000003,72.179152999999985],[-118.56194299999999,72.181366000000139],[-118.545547,72.182754999999986],[-118.44248999999996,72.181655999999975],[-118.40583799999996,72.183044000000052],[-118.38945000000001,72.184708000000114],[-118.15722699999992,72.217758000000117],[-118.12832599999996,72.222214000000065],[-118.11945299999996,72.226654000000053],[-118.11277799999993,72.231934000000138],[-118.108047,72.237762000000089],[-118.10527000000002,72.244705000000067],[-118.10417199999995,72.263321000000076],[-118.12138400000003,72.308029000000147],[-118.13082899999995,72.318054000000075],[-118.14527899999996,72.326934999999992],[-118.16471899999993,72.334427000000119],[-118.176941,72.337769000000037],[-118.19193999999999,72.340546000000131],[-118.20916699999998,72.34248400000007],[-118.25140399999998,72.344711000000132],[-118.27166699999992,72.344711000000132],[-118.28832999999992,72.343323000000055],[-118.32528699999995,72.341934000000037],[-118.36416600000001,72.341370000000097],[-118.40695199999993,72.34248400000007],[-118.446663,72.345260999999994],[-118.49109599999997,72.353043000000127],[-118.52306399999992,72.363876000000118],[-118.55499299999997,72.380814000000044],[-118.56973299999999,72.389709000000039],[-118.58194700000001,72.399155000000007],[-118.58860800000002,72.416655999999989],[-118.58805799999999,72.435256999999979],[-118.58528100000001,72.441924999999969],[-118.573059,72.460815000000082],[-118.56833599999993,72.46665999999999],[-118.55027799999999,72.483321999999987],[-118.53694199999995,72.493866000000025],[-118.51972999999992,72.50277699999998],[-118.20722999999998,72.618591000000094],[-118.12554899999998,72.642487000000017],[-118.08306900000002,72.649719000000118],[-117.90361000000001,72.689697000000137],[-117.89083899999991,72.692749000000049],[-117.86888099999993,72.699997000000053],[-117.63305700000001,72.784987999999998],[-117.60193600000002,72.796936000000073],[-117.51944700000001,72.828873000000044],[-117.48999000000003,72.841369999999984],[-117.48111,72.845825000000048],[-117.46472199999994,72.85554500000012],[-117.43611099999993,72.876373000000001],[-117.42054699999994,72.894440000000088],[-117.40222199999999,72.903320000000122],[-117.37999000000002,72.910538000000088],[-117.35360699999995,72.916382000000112],[-117.32333399999993,72.92082199999993],[-117.30638099999993,72.921921000000111],[-117.24916099999996,72.923874000000069],[-117.12721299999998,72.932479999999998],[-116.95639,72.954163000000108],[-116.94138299999997,72.95637499999998],[-116.89972699999998,72.964157000000114],[-116.862503,72.972214000000065],[-116.83805799999999,72.978592000000049],[-116.775284,72.9952550000001],[-116.70722999999998,73.017211999999972],[-116.65972899999991,73.031097000000045],[-116.58750900000001,73.051376000000005],[-116.57417299999997,73.054153000000099],[-116.54167199999995,73.057480000000055],[-116.52416999999991,73.058868000000132],[-116.31916799999993,73.09165999999999],[-116.24221799999998,73.110260000000096],[-116.20195000000001,73.118590999999981],[-116.15556300000003,73.124695000000031],[-115.90055799999993,73.154160000000104],[-115.60973399999995,73.194138000000123],[-115.44082600000002,73.22387700000013],[-115.34638999999999,73.253326000000129],[-115.32305899999994,73.260269000000108],[-115.30915799999997,73.263046000000031],[-115.14917000000003,73.288315000000011],[-115.10221899999999,73.294144000000017],[-115.01418299999989,73.299988000000042],[-114.95111099999997,73.307754999999986],[-114.89417299999997,73.318054000000018],[-114.86638599999998,73.323608000000036],[-114.83056599999998,73.334152000000074],[-114.81054699999999,73.342758000000003],[-114.70722999999992,73.368042000000003],[-114.67555199999998,73.371918000000051],[-114.65778399999999,73.373032000000023],[-114.56166100000002,73.37553400000013],[-114.54083300000002,73.373595999999964],[-114.50527999999991,73.368866000000139],[-114.337784,73.343323000000055],[-114.30499299999991,73.338042999999971],[-114.27500899999995,73.332214000000135],[-114.22609699999987,73.318329000000062],[-114.19776899999999,73.306366000000025],[-114.16306299999997,73.289703000000145],[-114.11054999999999,73.263885000000016],[-114.05610699999994,73.233597000000032],[-114.01666299999994,73.206375000000094],[-113.96167000000003,73.153046000000131],[-113.95694700000001,73.142487000000074],[-113.95388799999989,73.125533999999959],[-113.95749699999999,73.113312000000008],[-113.99582700000002,73.077773999999977],[-114.00499699999995,73.064423000000033],[-114.03555299999999,73.004990000000021],[-114.04750100000001,72.954987000000074],[-114.05499299999997,72.883605999999986],[-114.05277999999998,72.872208000000001],[-114.04915599999998,72.867203000000131],[-114.0427699999999,72.862762000000032],[-114.02722199999999,72.854156000000103],[-113.98166700000002,72.834152000000017],[-113.96888699999994,72.82499700000011],[-113.96777299999997,72.819442999999978],[-113.96945199999999,72.813034000000073],[-113.97582999999992,72.807205000000067],[-113.985817,72.803040000000067],[-113.99749799999995,72.799423000000104]],[[-95.669723999999917,73.604980000000126],[-95.688598999999897,73.603317000000004],[-95.702498999999989,73.60554500000012],[-95.711670000000026,73.612198000000092],[-95.703887999999949,73.617477000000065],[-95.684157999999968,73.6202550000001],[-95.669997999999964,73.620529000000033],[-95.655563000000029,73.616652999999928],[-95.654998999999975,73.609984999999995],[-95.669723999999917,73.604980000000126]],[[-107.89555399999989,73.541367000000093],[-107.93055699999996,73.539428999999984],[-107.9519499999999,73.540268000000083],[-107.97193900000002,73.542755],[-108.00917099999992,73.548035000000084],[-108.02306399999998,73.551376000000118],[-108.07472200000001,73.576385000000073],[-108.08277899999996,73.580826000000002],[-108.08500700000002,73.585815000000139],[-108.08332799999999,73.597214000000065],[-108.07640099999992,73.603591999999992],[-108.066101,73.608597000000032],[-108.05444299999988,73.612487999999928],[-108.04083299999996,73.615540000000067],[-108.00750700000003,73.618591000000094],[-107.89943699999992,73.622756999999979],[-107.86277799999993,73.624145999999996],[-107.82444800000002,73.6244200000001],[-107.80444299999999,73.624145999999996],[-107.68110699999994,73.621367999999961],[-107.61472299999991,73.614700000000028],[-107.60056299999997,73.611374000000126],[-107.58944699999995,73.607758000000103],[-107.58473200000003,73.603043000000071],[-107.58249699999999,73.597762999999986],[-107.58473200000003,73.586655000000007],[-107.59194899999994,73.579987000000017],[-107.60221899999988,73.575271999999984],[-107.64527900000002,73.570267000000115],[-107.65722700000003,73.568603999999993],[-107.7491609999999,73.55581699999999],[-107.89555399999989,73.541367000000093]],[[-124.307503,73.556366000000139],[-124.33167999999995,73.556366000000139],[-124.343613,73.559981999999991],[-124.35193600000002,73.5711060000001],[-124.35861199999988,73.630264000000068],[-124.34612300000003,73.633606000000043],[-124.33138999999994,73.636383000000137],[-124.307503,73.632202000000063],[-124.30332900000002,73.626648000000046],[-124.29387700000001,73.622481999999934],[-124.28222700000003,73.618866000000082],[-124.26806599999992,73.616088999999988],[-124.21028100000001,73.611374000000126],[-124.19360399999994,73.60914600000001],[-124.17944299999994,73.606369000000086],[-124.16777000000002,73.603043000000071],[-124.14916999999997,73.594711000000075],[-124.12666300000001,73.580826000000002],[-124.11972000000003,73.575821000000133],[-124.11554699999988,73.570541000000048],[-124.11389199999996,73.564148000000102],[-124.12638899999996,73.560805999999957],[-124.307503,73.556366000000139]],[[-124.58473199999992,73.679153000000042],[-124.59944199999995,73.676376000000005],[-124.62361099999998,73.676650999999993],[-124.640556,73.678863999999976],[-124.70056199999993,73.689422999999977],[-124.72917199999995,73.694976999999994],[-124.73361199999999,73.700545999999974],[-124.72582999999992,73.705261000000007],[-124.71584299999995,73.709152000000074],[-124.70111099999997,73.711928999999998],[-124.68167099999999,73.713042999999971],[-124.66471899999999,73.710815000000025],[-124.66278099999994,73.706099999999992],[-124.64835399999998,73.704712000000086],[-124.61694299999999,73.699707000000046],[-124.57140399999992,73.691925000000083],[-124.564438,73.687195000000031],[-124.57224299999996,73.682479999999998],[-124.58473199999992,73.679153000000042]],[[-105.08944700000001,73.735260000000039],[-104.96028099999995,73.688582999999937],[-104.84306300000003,73.650818000000072],[-104.71140300000002,73.63081399999993],[-104.69167299999992,73.628310999999997],[-104.675003,73.624985000000095],[-104.58084100000002,73.600266000000147],[-104.53056300000003,73.581374999999923],[-104.51306199999999,73.573044000000039],[-104.49445300000002,73.559418000000051],[-104.49027999999998,73.554703000000018],[-104.48528299999998,73.544708000000128],[-104.48306299999996,73.534424000000115],[-104.512787,73.493042000000059],[-104.55583200000001,73.403320000000008],[-104.56639100000001,73.334717000000126],[-104.56833599999999,73.329163000000108],[-104.57333399999999,73.323044000000095],[-104.58138999999994,73.316666000000112],[-104.60193599999997,73.306366000000025],[-104.64916999999997,73.280823000000112],[-104.69499200000001,73.25221300000004],[-104.76000999999991,73.203873000000044],[-104.76500699999985,73.197754000000032],[-104.76390099999998,73.192474000000118],[-104.79415899999998,73.168045000000006],[-104.86805700000002,73.136658000000068],[-104.97556299999997,73.085266000000104],[-104.98332199999999,73.078872999999987],[-104.98805199999993,73.073043999999982],[-104.98388699999992,73.068054000000075],[-104.97749299999998,73.05304000000001],[-104.97361799999999,73.031662000000097],[-104.97860699999995,73.025543000000084],[-104.984734,73.020538000000045],[-104.99527,73.015823000000012],[-105.031677,73.004166000000055],[-105.0750119999999,72.997208000000057],[-105.08833300000003,72.994141000000127],[-105.13639799999993,72.978867000000037],[-105.14695699999999,72.974152000000004],[-105.22582999999997,72.933044000000109],[-105.30304699999994,72.951096000000007],[-105.31916799999999,72.954163000000108],[-105.33972199999999,72.955551000000014],[-105.354446,72.953323000000069],[-105.35610999999994,72.947754000000032],[-105.33139,72.910538000000088],[-105.32417299999997,72.906096999999988],[-105.279449,72.885543999999925],[-105.25361599999997,72.878585999999984],[-105.237503,72.875534000000016],[-105.21140300000002,72.868591000000038],[-105.20417799999996,72.864151000000049],[-105.26222199999989,72.848602000000085],[-105.27555799999993,72.845534999999984],[-105.28999299999987,72.847762999999986],[-105.38305699999995,72.866653000000099],[-105.43611099999993,72.896652000000131],[-105.44332900000001,72.90109300000006],[-105.45612299999999,72.915267999999969],[-105.458618,72.925536999999963],[-105.45694699999996,72.931366000000025],[-105.45834400000001,72.936371000000065],[-105.46250900000001,72.941360000000032],[-105.57472199999995,72.984421000000054],[-105.73277299999995,73.047759999999982],[-105.91388699999999,73.145538000000101],[-105.94638099999992,73.160263000000043],[-106.09249899999992,73.199706999999933],[-106.08194700000001,73.241088999999988],[-106.32195300000001,73.338882000000126],[-106.44776899999994,73.393051000000128],[-106.45556599999998,73.397491000000002],[-106.46611000000001,73.401382000000069],[-106.72028399999999,73.44999700000011],[-106.88137799999998,73.463318000000072],[-106.89806399999992,73.461929000000055],[-106.91610699999995,73.461380000000077],[-106.9375,73.462494000000106],[-107,73.469711000000018],[-107.016953,73.4727630000001],[-107.02749599999999,73.476379000000009],[-107.03555299999994,73.480820000000108],[-107.03415699999999,73.486374000000069],[-107.02583300000003,73.498596000000077],[-107.01834100000002,73.504990000000078],[-107.00974299999996,73.510544000000095],[-106.97112299999992,73.531661999999983],[-106.92944299999999,73.550537000000134],[-106.89334100000002,73.562484999999981],[-106.74526999999995,73.648041000000148],[-106.70028699999995,73.676085999999941],[-106.65805099999994,73.695251000000098],[-106.64584399999995,73.699141999999995],[-106.61833200000001,73.705261000000007],[-106.57224300000001,73.711928999999998],[-106.32721700000002,73.72665400000011],[-106.18554699999999,73.733597000000145],[-106.03916900000002,73.731368999999972],[-105.80055199999998,73.726928999999984],[-105.72666900000002,73.728592000000049],[-105.68028300000003,73.734985000000052],[-105.66639699999996,73.737761999999918],[-105.637787,73.74443100000002],[-105.61277799999993,73.752212999999983],[-105.58473200000003,73.758041000000048],[-105.569458,73.760269000000051],[-105.53527799999995,73.762771999999984],[-105.51666299999994,73.763321000000133],[-105.30387899999994,73.762206999999989],[-105.28388999999999,73.761658000000011],[-105.16999800000002,73.755554000000018],[-105.14862099999999,73.754166000000055],[-105.10749799999991,73.743590999999981],[-105.08944700000001,73.735260000000039]],[[-80.142226999999878,73.696640000000116],[-80.108611999999994,73.693863000000022],[-80.074448000000018,73.697479000000044],[-79.901397999999972,73.698318000000029],[-79.625548999999978,73.670821999999987],[-79.586120999999991,73.66276600000009],[-79.523055999999997,73.646652000000131],[-79.493056999999965,73.637772000000098],[-79.476394999999911,73.634154999999964],[-79.451949999999954,73.630539000000113],[-79.373610999999983,73.63081399999993],[-78.96166999999997,73.632750999999985],[-78.946105999999986,73.634720000000016],[-78.934433000000013,73.638596000000064],[-78.931106999999997,73.642487000000131],[-78.928878999999938,73.647491000000116],[-78.924164000000019,73.650269000000094],[-78.912505999999894,73.653869999999984],[-78.887787000000003,73.656647000000078],[-78.861389000000031,73.658324999999991],[-78.64416499999993,73.656647000000078],[-78.40834000000001,73.661652000000117],[-78.206664999999987,73.667755000000056],[-78.166397000000018,73.668045000000063],[-78.12777699999998,73.664703000000145],[-78.113327000000027,73.663040000000024],[-78.064437999999996,73.651932000000045],[-78.009734999999978,73.63749700000011],[-77.965285999999935,73.628310999999997],[-77.823058999999944,73.603867000000037],[-77.738601999999958,73.591933999999981],[-77.608046999999999,73.574158000000011],[-77.535004000000015,73.565536000000009],[-77.453887999999949,73.559708000000057],[-77.424437999999952,73.554703000000018],[-77.395554000000004,73.545822000000101],[-77.373046999999929,73.529709000000082],[-77.363327000000027,73.524703999999986],[-77.351394999999968,73.519988999999953],[-77.338333000000034,73.516663000000108],[-77.294723999999974,73.512772000000041],[-77.237212999999997,73.509994999999947],[-77.203063999999927,73.505554000000018],[-77.191939999999988,73.501389000000017],[-77.148620999999991,73.476379000000009],[-77.153610000000015,73.468048000000067],[-77.157226999999978,73.458603000000039],[-77.055266999999958,73.366379000000052],[-77.048888999999917,73.36192299999999],[-76.999435000000005,73.345825000000104],[-76.969726999999978,73.337203999999986],[-76.91361999999998,73.324432000000002],[-76.893340999999964,73.321105999999986],[-76.884170999999924,73.321655000000078],[-76.878875999999934,73.324158000000068],[-76.858611999999994,73.32638500000013],[-76.837219000000005,73.327209000000096],[-76.736389000000031,73.324706999999989],[-76.72193900000002,73.322495000000117],[-76.708054000000004,73.317764000000011],[-76.579726999999991,73.219711000000075],[-76.577498999999932,73.205551000000128],[-76.585006999999962,73.194427000000076],[-76.601944000000003,73.183319000000097],[-76.619720000000029,73.175812000000121],[-76.605270000000019,73.15914900000007],[-76.586945000000014,73.146378000000141],[-76.582229999999981,73.14387499999998],[-76.510559000000001,73.120254999999986],[-76.495543999999938,73.116928000000087],[-76.487502999999947,73.116089000000102],[-76.381942999999978,73.106093999999985],[-76.31361400000003,73.100540000000024],[-76.312499999999943,73.067490000000134],[-76.318068999999923,73.062759000000028],[-76.319457999999941,73.058318999999983],[-76.333068999999909,72.963607999999965],[-76.323059000000001,72.957214000000135],[-76.309433000000013,72.952484000000084],[-76.291671999999949,72.948868000000061],[-76.275283999999999,72.946640000000059],[-76.211945000000014,72.945526000000086],[-76.162216000000001,72.946365000000071],[-76.118606999999997,72.940262000000132],[-76.103607000000011,72.936371000000065],[-76.077224999999942,72.924988000000042],[-76.071670999999924,72.921097000000145],[-76.062209999999993,72.906937000000028],[-76.059432999999899,72.900818000000015],[-76.086394999999982,72.863602000000071],[-76.093886999999938,72.85803199999998],[-76.103881999999942,72.853043000000014],[-76.115279999999927,72.849426000000051],[-76.13110399999988,72.845534999999984],[-76.149993999999992,72.842209000000139],[-76.25140399999998,72.826385000000016],[-76.315552000000025,72.817214999999976],[-76.339721999999995,72.814987000000031],[-76.5625,72.812484999999981],[-76.581679999999949,72.812484999999981],[-76.601944000000003,72.813873000000058],[-76.618606999999884,72.816939999999988],[-76.634170999999981,72.820541000000048],[-76.662780999999995,72.829163000000051],[-76.681380999999931,72.831375000000094],[-76.72193900000002,72.833878000000084],[-76.740829000000019,72.833878000000084],[-76.767501999999922,72.833878000000084],[-76.891952999999944,72.830825999999945],[-76.937209999999993,72.830825999999945],[-77.084754999999973,72.839684000000148],[-77.101668999999958,72.84027100000003],[-77.143889999999942,72.841933999999981],[-77.226943999999946,72.846100000000035],[-77.265838999999914,72.849426000000051],[-77.314437999999939,72.85554500000012],[-77.365829000000019,72.864426000000037],[-77.40055799999999,72.870818999999983],[-77.416106999999954,72.874695000000088],[-77.447219999999959,72.879974000000061],[-77.522780999999952,72.886108000000092],[-77.704178000000013,72.897216999999955],[-77.723327999999981,72.896941999999967],[-77.860000999999954,72.893051000000071],[-77.904175000000009,72.891662999999994],[-77.997771999999941,72.888321000000019],[-78.107223999999917,72.88638300000008],[-78.236358999999993,72.893005000000016],[-78.273055999999997,72.890549000000021],[-78.297226000000023,72.887772000000098],[-78.486114999999984,72.86554000000001],[-78.62388599999997,72.848037999999974],[-78.865828999999962,72.804427999999973],[-79.047775000000001,72.771378000000141],[-79.161941999999897,72.750548999999978],[-79.209166999999923,72.744979999999998],[-79.296111999999994,72.737761999999975],[-79.359160999999972,72.733597000000145],[-79.382492000000013,72.733047000000113],[-79.400283999999999,72.733597000000145],[-79.429168999999945,72.735809000000017],[-79.543334999999956,72.74859600000002],[-79.62388599999997,72.763321000000133],[-79.927779999999927,72.842484000000013],[-79.972778000000005,72.854705999999965],[-79.998610999999983,72.86303700000002],[-80.009170999999924,72.872756999999922],[-80.120833999999945,72.978867000000037],[-80.151672000000019,73.011932000000115],[-80.181380999999931,73.043869000000086],[-80.181106999999997,73.050262000000032],[-80.164169000000015,73.061920000000043],[-80.147232000000031,73.071381000000031],[-80.134734999999921,73.084716999999955],[-80.131667999999991,73.08859300000006],[-80.128875999999991,73.09526100000005],[-80.122771999999998,73.11442599999998],[-80.110000999999954,73.179703000000018],[-80.114440999999999,73.186371000000008],[-80.134445000000028,73.209152000000017],[-80.143065999999919,73.216933999999981],[-80.15194699999995,73.222487999999942],[-80.216948999999943,73.243317000000104],[-80.238051999999982,73.24414100000007],[-80.415282999999931,73.24414100000007],[-80.61999499999996,73.264160000000004],[-80.760009999999909,73.274704000000042],[-80.797500999999954,73.276932000000045],[-80.876098999999954,73.32777399999992],[-80.876098999999954,73.338593000000003],[-80.872498000000007,73.424988000000099],[-80.820281999999963,73.489150999999993],[-80.80999799999995,73.644440000000088],[-80.857772999999952,73.74192800000003],[-80.771666999999923,73.749709999999993],[-80.683318999999983,73.755829000000006],[-80.560546999999872,73.76776099999995],[-80.434998000000007,73.766098000000056],[-80.37332200000003,73.761658000000011],[-80.353058000000033,73.759720000000073],[-80.320847000000015,73.753876000000048],[-80.30860899999999,73.75],[-80.29861499999987,73.745819000000097],[-80.265288999999996,73.730270000000019],[-80.223327999999924,73.715820000000065],[-80.192763999999954,73.707214000000135],[-80.15834000000001,73.699417000000039],[-80.142226999999878,73.696640000000116]],[[-73.354674999999929,68.329215999999974],[-73.328170999999998,68.328208999999958],[-73.31617,68.328712000000053],[-73.306830999999988,68.330544000000089],[-73.211670000000026,68.376923000000033],[-73.230559999999912,68.384155000000135],[-73.253066999999987,68.390823000000125],[-73.279448999999886,68.39498900000001],[-73.302779999999927,68.396102999999982],[-73.31806899999998,68.393051000000071],[-73.357498000000021,68.371368000000132],[-73.359725999999966,68.364989999999977],[-73.357773000000009,68.357483000000059],[-73.353057999999976,68.352478000000019],[-73.349166999999909,68.344986000000063],[-73.34722899999997,68.337494000000106],[-73.34944200000001,68.331100000000106],[-73.354674999999929,68.329215999999974],[-73.506667999999991,68.291367000000037],[-73.589721999999995,68.254715000000033],[-73.597777999999948,68.251937999999996],[-73.620834000000002,68.246093999999971],[-73.632216999999912,68.246643000000063],[-73.639724999999942,68.249709999999993],[-73.851668999999958,68.342209000000139],[-73.855834999999956,68.346649000000014],[-73.896117999999944,68.392211999999915],[-73.889449999999954,68.44470200000012],[-73.877486999999917,68.481093999999928],[-73.873610999999926,68.487762000000089],[-73.86721799999998,68.493042000000003],[-73.856110000000001,68.497481999999991],[-73.823623999999995,68.503326000000015],[-73.806655999999975,68.503876000000048],[-73.749999999999943,68.510817999999972],[-73.738891999999964,68.514999000000046],[-73.730285999999978,68.519989000000066],[-73.725829999999974,68.525818000000072],[-73.704726999999934,68.656647000000021],[-73.75389100000001,68.683594000000085],[-73.761397999999986,68.686371000000008],[-73.774719000000005,68.689697000000024],[-73.865828999999906,68.705826000000002],[-73.893889999999999,68.707764000000111],[-74.094161999999983,68.719986000000063],[-74.106109999999944,68.690536000000009],[-73.99221799999998,68.624695000000031],[-73.888061999999877,68.561645999999939],[-73.881667999999991,68.55664100000007],[-73.881667999999991,68.549713000000111],[-73.903609999999958,68.52777100000003],[-73.921386999999925,68.511932000000115],[-73.941939999999988,68.504715000000033],[-73.990279999999927,68.492751999999996],[-74.028335999999911,68.513610999999969],[-74.171660999999972,68.521652000000017],[-74.221114999999998,68.52526899999998],[-74.351395000000025,68.536926000000108],[-74.366104000000007,68.539154000000053],[-74.379439999999931,68.542205999999965],[-74.391112999999962,68.546371000000136],[-74.514175000000023,68.599991000000045],[-74.526397999999972,68.610809000000017],[-74.532776000000013,68.62164300000012],[-74.531676999999945,68.626373000000115],[-74.598891999999921,68.681930999999963],[-74.701950000000011,68.71887200000009],[-74.712218999999948,68.723038000000031],[-74.726105000000018,68.730270000000132],[-74.728333000000021,68.737198000000092],[-74.724715999999944,68.766097999999943],[-74.71945199999999,68.770537999999988],[-74.664168999999958,68.774155000000121],[-74.620833999999888,68.782486000000006],[-74.591949,68.788879000000009],[-74.576949999999954,68.793045000000063],[-74.565276999999924,68.802199999999914],[-74.546386999999982,68.822494999999947],[-74.548049999999989,68.828598000000113],[-74.551392000000021,68.830551000000014],[-74.604172000000005,68.841660000000104],[-74.634170999999924,68.846374999999966],[-74.648055999999997,68.847214000000122],[-74.666655999999932,68.845825000000104],[-74.678328999999962,68.842758000000003],[-74.687377999999967,68.835991000000035],[-74.718718999999965,68.824821000000043],[-74.723052999999936,68.822318999999993],[-74.721221999999955,68.821152000000041],[-74.71421799999996,68.82098400000001],[-74.705222999999933,68.821655000000078],[-74.689437999999939,68.819716999999969],[-74.671660999999972,68.818877999999984],[-74.660277999999892,68.81581100000011],[-74.639724999999999,68.807479999999998],[-74.633330999999941,68.79693600000013],[-74.635009999999966,68.793320000000108],[-74.648055999999997,68.789429000000041],[-74.665832999999964,68.786652000000117],[-74.771666999999979,68.774155000000121],[-74.917769999999962,68.801375999999948],[-74.913894999999968,68.81721500000009],[-74.837508999999955,68.840820000000065],[-74.787780999999995,68.854431000000034],[-74.764167999999984,68.872040000000027],[-74.74017299999997,68.872710999999981],[-74.72222899999997,68.934143000000006],[-74.862945999999909,68.954178000000013],[-74.872779999999977,68.955001999999979],[-74.887610999999993,68.954178000000013],[-74.898108999999977,68.952515000000062],[-74.920113000000015,68.946671000000038],[-74.935944000000006,68.942001000000005],[-75,68.937607000000071],[-75.005004999999926,68.929977000000065],[-75.033614999999884,68.926085999999998],[-75.042770000000019,68.928314],[-75.041945999999882,68.930267000000129],[-75.021118000000001,68.953049000000021],[-74.962340999999981,68.972824000000003],[-74.953002999999967,68.978484999999978],[-74.915337000000022,68.992821000000049],[-74.907668999999885,68.993988000000002],[-74.764724999999999,69.019440000000031],[-74.748336999999992,69.021378000000141],[-74.735000999999954,69.021927000000119],[-74.729445999999996,69.019440000000031],[-74.758057000000008,69.008880999999974],[-74.752228000000002,69.002486999999974],[-74.675003000000004,69.006943000000035],[-74.65834000000001,69.008330999999941],[-74.642776000000026,69.011658000000068],[-74.638061999999991,69.016098000000113],[-74.641113000000018,69.021378000000141],[-74.652495999999928,69.040267999999912],[-74.785827999999981,69.076385000000073],[-74.820846999999958,69.082214000000079],[-74.834166999999923,69.081664999999987],[-74.845839999999953,69.078598000000056],[-74.948607999999922,69.048874000000012],[-75.043334999999956,69.013321000000019],[-75.051940999999886,69.008605999999986],[-75.036117999999931,68.992203000000075],[-75.037780999999882,68.985809000000074],[-75.071395999999936,68.921097000000032],[-75.075561999999934,68.915817000000004],[-75.109160999999858,68.894989000000123],[-75.116394000000014,68.890823000000012],[-75.124161000000015,68.888046000000088],[-75.139724999999999,68.884720000000073],[-75.169998000000021,68.886383000000023],[-75.192490000000021,68.891663000000051],[-75.201950000000011,68.894440000000145],[-75.315826000000015,68.942200000000128],[-75.373885999999914,68.968872000000033],[-75.383330999999998,68.974426000000051],[-75.400283999999999,68.985535000000141],[-75.422500999999954,69.001937999999996],[-75.445830999999941,69.016937000000041],[-75.454452999999944,69.021102999999982],[-75.466399999999965,69.021378000000141],[-75.478881999999999,69.019714000000135],[-75.494155999999975,69.01638800000012],[-75.528335999999967,69.005829000000062],[-75.565552000000025,68.993591000000038],[-75.573623999999995,68.988585999999941],[-75.578612999999962,68.984146000000123],[-75.580841000000021,68.975540000000024],[-75.574172999999917,68.968323000000112],[-75.537780999999939,68.951096000000064],[-75.506957999999941,68.939696999999967],[-75.499724999999955,68.934708000000001],[-75.494995000000017,68.930267000000129],[-75.534163999999976,68.90387000000004],[-75.542770000000019,68.898879999999963],[-75.56527699999998,68.891373000000044],[-75.603881999999942,68.879700000000014],[-75.647780999999952,68.869140999999956],[-75.809158000000025,68.836928999999998],[-75.976104999999961,68.791092000000106],[-75.979445999999996,68.787201000000039],[-75.985001000000011,68.783875000000023],[-75.995543999999938,68.779434000000094],[-76.008620999999948,68.775543000000027],[-76.049437999999952,68.764435000000049],[-76.227218999999991,68.721100000000035],[-76.327224999999999,68.697478999999987],[-76.376098999999954,68.687484999999981],[-76.420546999999999,68.679152999999985],[-76.436385999999857,68.677200000000028],[-76.456664999999987,68.675262000000089],[-76.540282999999988,68.673308999999961],[-76.559432999999956,68.673035000000027],[-76.575561999999991,68.674149000000057],[-76.59056099999998,68.676376000000062],[-76.628875999999991,68.68691999999993],[-76.660827999999981,68.699416999999926],[-76.674164000000019,68.71026599999999],[-76.680283000000031,68.716094999999996],[-76.688599000000011,68.733597000000032],[-76.689437999999996,68.740540000000067],[-76.688048999999978,68.746933000000013],[-76.678604000000007,68.758330999999998],[-76.666945999999996,68.769150000000081],[-76.636947999999961,68.78166200000004],[-76.608611999999937,68.794144000000074],[-76.577498999999932,68.808318999999983],[-76.561385999999914,68.818054000000018],[-76.546111999999994,68.833054000000004],[-76.537216000000001,68.842209000000082],[-76.523055999999997,68.863876000000118],[-76.521666999999979,68.870254999999986],[-76.523894999999925,68.876373000000058],[-76.532775999999956,68.880538999999999],[-76.544158999999979,68.883041000000048],[-76.559432999999956,68.88499500000006],[-76.576674999999966,68.88499500000006],[-76.59333799999996,68.883331000000055],[-76.606658999999922,68.883041000000048],[-76.610000999999954,68.884720000000073],[-76.644164999999987,68.911102000000142],[-76.655562999999972,68.924698000000092],[-76.655562999999972,68.930542000000116],[-76.642775999999969,69.003876000000105],[-76.640563999999927,69.009155000000078],[-76.625548999999978,69.018326000000059],[-76.603607000000011,69.025818000000015],[-76.578338999999914,69.032211000000132],[-76.543335000000013,69.038315000000011],[-76.501403999999923,69.042755],[-76.422500999999954,69.050537000000134],[-76.368606999999997,69.055251999999996],[-76.348891999999921,69.054976999999951],[-76.33277899999996,69.05442800000003],[-76.240279999999927,69.048325000000091],[-76.208054000000004,69.044144000000017],[-76.140563999999927,69.034714000000122],[-76.124435000000005,69.031096999999988],[-76.114165999999955,69.027771000000143],[-76.091674999999952,69.011658000000068],[-76.080001999999922,69.006378000000041],[-76.068619000000012,69.003876000000105],[-75.996932999999956,69.003036000000066],[-75.969161999999983,69.010269000000108],[-75.904998999999918,69.036925999999994],[-75.813889000000017,69.067763999999954],[-75.655838000000017,69.080550999999957],[-75.637786999999946,69.079987000000017],[-75.619155999999919,69.081374999999923],[-75.6058349999999,69.08526599999999],[-75.598891999999978,69.089432000000102],[-75.593886999999938,69.099716000000114],[-75.569732999999928,69.15277100000003],[-75.569457999999997,69.158324999999991],[-75.571121000000005,69.163879000000009],[-75.591674999999952,69.22164900000007],[-75.603057999999976,69.238876000000118],[-75.619719999999973,69.249419999999986],[-75.669723999999917,69.271103000000096],[-75.759734999999978,69.304977000000122],[-75.783324999999991,69.313599000000124],[-75.956389999999885,69.366088999999931],[-75.970275999999956,69.36914100000007],[-76.168610000000001,69.411377000000073],[-76.202498999999932,69.413879000000122],[-76.241942999999935,69.413315000000011],[-76.298049999999989,69.407760999999994],[-76.417770000000019,69.44720500000011],[-76.607497999999964,69.529709000000139],[-76.637787000000003,69.546645999999953],[-76.641112999999962,69.554153000000099],[-76.641678000000013,69.557480000000055],[-76.626662999999951,69.581375000000037],[-76.61999499999996,69.586380000000077],[-76.611663999999962,69.591095000000109],[-76.489165999999898,69.648331000000042],[-76.477782999999988,69.652206000000035],[-76.459166999999979,69.654434000000037],[-76.442215000000033,69.653046000000074],[-76.347777999999948,69.64027400000009],[-76.261397999999986,69.626647999999932],[-76.226943999999946,69.637206999999989],[-76.186110999999983,69.659714000000065],[-76.182495000000017,69.663605000000132],[-76.187774999999988,69.665268000000083],[-76.226105000000018,69.664703000000031],[-76.295546999999942,69.660263000000043],[-76.376388999999961,69.671371000000022],[-76.388335999999924,69.673874000000012],[-76.397506999999962,69.678040000000067],[-76.399733999999853,69.684143000000006],[-76.450561999999934,69.690262000000075],[-76.537780999999939,69.696091000000081],[-76.551666000000012,69.695526000000029],[-76.634170999999981,69.683594000000085],[-76.641953000000001,69.679977000000122],[-76.638900999999976,69.673309000000131],[-76.631942999999922,69.669708000000071],[-76.616394000000014,69.667480000000126],[-76.581679999999949,69.666930999999977],[-76.557769999999948,69.673309000000131],[-76.542769999999905,69.674698000000149],[-76.530838000000017,69.672211000000061],[-76.517776000000026,69.662765999999976],[-76.522780999999952,69.65248100000008],[-76.535004000000015,69.638596000000007],[-76.553329000000019,69.625259000000142],[-76.561661000000015,69.620254999999986],[-76.683883999999978,69.56581100000011],[-76.691939999999988,69.563034000000016],[-76.707503999999972,69.559417999999994],[-76.730285999999978,69.560256999999922],[-76.844726999999921,69.576096000000064],[-77.136947999999961,69.626373000000115],[-77.18582200000003,69.637496999999996],[-77.191665999999941,69.639709000000039],[-77.200561999999991,69.646103000000096],[-77.200561999999991,69.64888000000002],[-77.194442999999922,69.657211000000075],[-77.164444000000003,69.676086000000055],[-77.155562999999972,69.680541999999946],[-77.144454999999994,69.682205000000067],[-76.949431999999945,69.695526000000029],[-76.939437999999939,69.679703000000018],[-76.929992999999968,69.677765000000079],[-76.896666999999979,69.679152999999985],[-76.868056999999965,69.684708000000057],[-76.829726999999934,69.695816000000036],[-76.820281999999963,69.699417000000096],[-76.80471799999998,69.708603000000039],[-76.793883999999991,69.718597000000045],[-76.791945999999996,69.721649000000014],[-76.781386999999995,69.743042000000116],[-76.781386999999995,69.748596000000077],[-76.835280999999952,69.815811000000053],[-76.851944000000003,69.813599000000011],[-76.933059999999898,69.809708000000114],[-77.026672000000019,69.811919999999986],[-77.150283999999999,69.816086000000098],[-77.293059999999855,69.828873000000101],[-77.308884000000035,69.830826000000002],[-77.310546999999985,69.835814999999968],[-77.307770000000005,69.840271000000087],[-77.297774999999888,69.851089000000059],[-77.28472899999997,69.860535000000027],[-77.25418099999996,69.87692300000009],[-77.243056999999965,69.881362999999908],[-77.208344000000011,69.886658000000011],[-77.116652999999928,69.901382000000012],[-76.992767000000015,69.927199999999971],[-76.981673999999941,69.931656000000089],[-76.974715999999944,69.935806000000071],[-76.980559999999969,69.938034000000016],[-76.992767000000015,69.940536000000122],[-77.002791999999943,69.940536000000122],[-77.125274999999931,69.925812000000064],[-77.141112999999962,69.922485000000108],[-77.164444000000003,69.915268000000026],[-77.188323999999909,69.906097000000045],[-77.226943999999946,69.894989000000066],[-77.260284000000013,69.887496999999939],[-77.438048999999921,69.857208000000071],[-77.508347000000015,69.826660000000118],[-77.455565999999976,69.798325000000091],[-77.444442999999978,69.789428999999984],[-77.449158000000011,69.784714000000122],[-77.551391999999964,69.747756999999922],[-77.559158000000025,69.744980000000055],[-77.574722000000008,69.741363999999976],[-77.597777999999948,69.739151000000049],[-77.608611999999937,69.740265000000022],[-77.615829000000019,69.741653000000099],[-77.626388999999904,69.744980000000055],[-77.637787000000003,69.753875999999991],[-77.645279000000016,69.760818000000086],[-77.649993999999992,69.769714000000022],[-77.668059999999969,69.836655000000064],[-77.691939999999931,69.963043000000027],[-77.695267000000001,69.98803700000002],[-77.694442999999922,70.000275000000045],[-77.693054000000018,70.00610400000005],[-77.68582200000003,70.023041000000092],[-77.678604000000007,70.034987999999998],[-77.672500999999954,70.045532000000094],[-77.669723999999974,70.052200000000028],[-77.667220999999984,70.062194999999974],[-77.665008999999941,70.088043000000084],[-77.665557999999976,70.106934000000138],[-77.668334999999956,70.113037000000077],[-77.673888999999974,70.11970500000001],[-77.671936000000017,70.177199999999914],[-77.672500999999954,70.180542000000059],[-77.678328999999962,70.187759000000142],[-77.685271999999998,70.191360000000032],[-77.810821999999973,70.24552900000009],[-77.884170999999981,70.2586060000001],[-77.892226999999878,70.258041000000048],[-78.133621000000005,70.215271000000087],[-78.239166000000012,70.203873000000101],[-78.345000999999911,70.19720500000011],[-78.351395000000025,70.197479000000044],[-78.364715999999987,70.201096000000007],[-78.401672000000019,70.212493999999992],[-78.405272999999966,70.214157000000114],[-78.480835000000013,70.288589000000002],[-78.406113000000005,70.326935000000049],[-78.396118000000001,70.328049000000021],[-78.389175000000023,70.332214000000022],[-78.398894999999925,70.336380000000077],[-78.425827000000027,70.3477630000001],[-78.436661000000015,70.351088999999945],[-78.486389000000031,70.356934000000081],[-78.504180999999903,70.35803199999998],[-78.521118000000001,70.357758000000047],[-78.536391999999978,70.356369000000029],[-78.55749499999996,70.351379000000009],[-78.573623999999995,70.345534999999984],[-78.579726999999878,70.343048000000067],[-78.583327999999995,70.336929000000055],[-78.581115999999952,70.334152000000131],[-78.569167999999991,70.325546000000031],[-78.564712999999983,70.320267000000058],[-78.56138599999997,70.314148000000046],[-78.564712999999983,70.310256999999979],[-78.578888000000006,70.309708000000001],[-78.655272999999909,70.346939000000134],[-78.662506000000008,70.350540000000024],[-78.704726999999934,70.374695000000031],[-78.74749799999995,70.438873000000058],[-78.858337000000006,70.453873000000044],[-78.903335999999911,70.449416999999926],[-78.944442999999865,70.450271999999984],[-79.031951999999933,70.454987000000017],[-79.070557000000008,70.469711000000075],[-79.095550999999887,70.493042000000116],[-79.100280999999995,70.49832200000003],[-79.081680000000006,70.529984000000127],[-79.068068999999923,70.536377000000073],[-78.893616000000009,70.590546000000131],[-78.879989999999964,70.594711000000132],[-78.860274999999888,70.59664900000007],[-78.832779000000016,70.594437000000028],[-78.821945000000028,70.589706000000092],[-78.815551999999911,70.57748400000014],[-78.816100999999946,70.573318000000029],[-78.815001999999879,70.571930000000123],[-78.806655999999975,70.564986999999974],[-78.788054999999929,70.556091000000038],[-78.766112999999905,70.550261999999975],[-78.733321999999987,70.547211000000004],[-78.718886999999938,70.547760000000096],[-78.720276000000013,70.549149000000114],[-78.84056099999998,70.634995000000117],[-78.851944000000003,70.638046000000088],[-78.861938000000009,70.637206999999989],[-78.868331999999953,70.63220200000012],[-78.867492999999968,70.628586000000041],[-78.868057000000022,70.624419999999986],[-78.871933000000013,70.621918000000051],[-78.879989999999964,70.621093999999914],[-78.912215999999944,70.621368000000018],[-78.965285999999935,70.632751000000042],[-78.976943999999946,70.635817999999972],[-78.994155999999975,70.643326000000002],[-78.999161000000015,70.651382000000069],[-79.000838999999928,70.662766000000147],[-78.994720000000029,70.672484999999995],[-79.000564999999995,70.676926000000094],[-79.009445000000028,70.679702999999961],[-79.025283999999999,70.680267000000129],[-79.041107000000011,70.678588999999988],[-79.057220000000029,70.672759999999982],[-79.152221999999995,70.627762000000075],[-79.158051,70.622208000000114],[-79.155838000000017,70.617476999999951],[-79.14973399999991,70.613037000000134],[-79.136948000000018,70.610809000000017],[-79.097778000000005,70.610260000000039],[-79.068068999999923,70.615540000000124],[-79.143889999999999,70.453873000000044],[-79.159728999999913,70.43803400000013],[-79.174164000000019,70.428040000000124],[-79.18472300000002,70.423599000000024],[-79.209731999999974,70.418045000000006],[-79.223891999999978,70.419434000000024],[-79.23582499999992,70.423309000000017],[-79.268889999999999,70.436371000000008],[-79.291106999999954,70.446930000000066],[-79.290557999999919,70.453598000000056],[-79.291945999999996,70.459717000000069],[-79.30221599999993,70.473602000000142],[-79.308333999999888,70.480270000000132],[-79.388061999999934,70.49275200000011],[-79.403610000000015,70.493316999999934],[-79.412780999999995,70.491652999999928],[-79.420546999999942,70.488876000000062],[-79.575561999999934,70.42942800000003],[-79.58555599999994,70.421371000000022],[-79.591110000000015,70.413605000000018],[-79.591384999999946,70.40914900000007],[-79.588897999999972,70.399428999999998],[-79.575835999999981,70.389984000000084],[-79.563613999999973,70.385544000000095],[-79.42361499999987,70.355820000000108],[-79.420546999999942,70.359710999999947],[-79.416107000000011,70.363602000000014],[-79.406661999999869,70.367477000000008],[-79.386948000000018,70.37164300000012],[-79.371657999999968,70.371093999999971],[-79.357772999999895,70.36970500000001],[-79.317229999999995,70.360260000000096],[-79.295837000000006,70.353043000000014],[-79.286666999999852,70.349716000000058],[-79.266112999999962,70.341094999999939],[-79.252791999999999,70.333327999999995],[-79.243057000000022,70.324707000000103],[-79.233321999999873,70.318603999999937],[-79.224715999999944,70.316085999999984],[-79.209441999999967,70.313309000000061],[-79.125823999999909,70.304703000000131],[-79.108886999999925,70.304977000000065],[-79.099730999999963,70.308594000000028],[-79.086670000000026,70.317764000000068],[-79.088333000000034,70.324707000000103],[-79.090560999999923,70.329437000000098],[-79.085830999999985,70.33859300000006],[-79.070847000000015,70.340820000000122],[-79.056655999999919,70.341369999999984],[-79.038895000000025,70.340546000000018],[-79.027221999999995,70.339432000000045],[-78.98832699999997,70.331375000000037],[-78.966659999999933,70.323318000000086],[-78.939162999999951,70.311096000000134],[-78.921660999999915,70.300812000000064],[-78.790558000000033,70.205551000000014],[-78.777221999999995,70.194976999999994],[-78.763061999999991,70.183593999999971],[-78.753066999999874,70.169434000000081],[-78.74888599999997,70.162201000000039],[-78.737502999999947,70.114989999999977],[-78.688599000000011,70.054977000000122],[-78.683060000000012,70.046371000000022],[-78.680282999999974,70.040268000000083],[-78.664168999999958,70.004166000000112],[-78.662506000000008,69.983047000000113],[-78.662506000000008,69.973037999999917],[-78.665008999999998,69.961380000000077],[-78.676392000000021,69.945250999999985],[-78.687774999999931,69.934417999999994],[-78.704177999999899,69.924148999999943],[-78.791945999999996,69.891098],[-78.84973100000002,69.886107999999979],[-79.06639100000001,69.878310999999997],[-79.17860399999995,69.883881000000088],[-79.200287000000003,69.884430000000009],[-79.37777699999998,69.886107999999979],[-79.408050999999944,69.88499500000006],[-79.474716000000001,69.878586000000041],[-79.526947000000007,69.871918000000051],[-79.540832999999964,69.868866000000139],[-79.553604000000007,69.864700000000028],[-79.563889000000017,69.859984999999995],[-79.576950000000011,69.855819999999994],[-79.604996000000028,69.849990999999989],[-79.636123999999938,69.848038000000031],[-79.682495000000017,69.848877000000016],[-79.694992000000013,69.851089000000059],[-79.707229999999981,69.855545000000006],[-79.773620999999991,69.885544000000039],[-79.780288999999982,69.890549000000078],[-79.786391999999978,69.897217000000012],[-79.796386999999925,69.908325000000048],[-79.801101999999958,69.915543000000014],[-79.800277999999992,69.917205999999965],[-79.803329000000019,69.927475000000015],[-79.833617999999944,69.949417000000039],[-79.891387999999949,69.973877000000073],[-80.053054999999915,69.997208000000114],[-80.168059999999969,70.006377999999984],[-80.196945000000028,70.008041000000105],[-80.232497999999964,70.007767000000001],[-80.263061999999934,70.002487000000087],[-80.27305599999994,69.999709999999993],[-80.292496000000028,69.98692299999999],[-80.307770000000005,69.981093999999985],[-80.31361400000003,69.980270000000019],[-80.326110999999912,69.980270000000019],[-80.336120999999991,69.982207999999957],[-80.434998000000007,70.004990000000078],[-80.45777899999996,70.013320999999962],[-80.466399999999965,70.018051000000014],[-80.47444200000001,70.024428999999998],[-80.485549999999932,70.029434000000037],[-80.547774999999945,70.04414399999996],[-80.561110999999983,70.046936000000073],[-80.577498999999875,70.048874000000012],[-80.597778000000005,70.048035000000027],[-80.652221999999938,70.038879000000065],[-80.669998000000021,70.039978000000076],[-80.787505999999951,70.050537000000134],[-80.906386999999995,70.070831000000055],[-81.06220999999988,70.085541000000035],[-81.225829999999974,70.09693900000002],[-81.285552999999993,70.095261000000107],[-81.378051999999968,70.092484000000013],[-81.429992999999968,70.093597000000102],[-81.462508999999955,70.09637500000008],[-81.603058000000033,70.113876000000005],[-81.698607999999922,70.128585999999984],[-81.711670000000026,70.130539000000113],[-81.728333000000021,70.132202000000007],[-81.745834000000002,70.1308140000001],[-81.756119000000012,70.12831099999994],[-81.763335999999924,70.123031999999967],[-81.761948000000018,70.117477000000065],[-81.737503000000004,70.093597000000102],[-81.718886999999881,70.079163000000051],[-81.709732000000031,70.074432000000115],[-81.687774999999874,70.067764000000125],[-81.670546999999942,70.065262000000075],[-81.625823999999966,70.062759000000085],[-81.558333999999888,70.056930999999963],[-81.539718999999934,70.053314],[-81.531113000000005,70.050812000000121],[-81.464721999999995,70.024703999999986],[-81.313613999999973,70.032211000000132],[-81.262221999999952,70.016388000000063],[-81.188599000000011,69.991089000000102],[-81.169723999999974,69.982483000000002],[-81.153335999999911,69.969986000000006],[-81.15306099999998,69.963608000000022],[-81.154174999999896,69.958327999999995],[-81.150283999999999,69.945815999999979],[-81.142775999999969,69.938034000000016],[-81.136123999999995,69.933043999999995],[-81.126389000000017,69.927765000000022],[-81.089721999999995,69.913879000000009],[-81.028335999999967,69.893600000000106],[-80.999999999999943,69.886107999999979],[-80.939986999999974,69.862762000000089],[-80.791381999999942,69.790542999999957],[-80.769164999999873,69.778045999999961],[-80.764175000000023,69.770537999999988],[-80.763061999999991,69.767212000000086],[-80.763061999999991,69.760818000000086],[-80.77555799999999,69.75221300000004],[-80.826110999999912,69.733597000000032],[-80.835555999999883,69.730270000000075],[-80.849441999999954,69.727203000000145],[-80.938889000000017,69.714705999999978],[-80.952498999999989,69.713882000000012],[-80.952224999999942,69.732758000000047],[-80.955841000000021,69.734420999999998],[-81.014449999999954,69.745529000000147],[-81.023055999999997,69.746094000000028],[-81.038054999999929,69.748596000000077],[-81.074172999999917,69.758040999999992],[-81.093063000000029,69.764434999999992],[-81.103058000000033,69.768326000000059],[-81.115554999999858,69.776931999999988],[-81.129439999999931,69.797760000000096],[-81.145843999999897,69.812485000000038],[-81.166945999999996,69.821380999999974],[-81.178878999999938,69.824996999999996],[-81.21665999999999,69.833603000000096],[-81.354445999999996,69.880264000000125],[-81.433059999999955,69.91304000000008],[-81.480559999999969,69.926926000000037],[-81.491942999999878,69.929703000000131],[-81.598891999999864,69.95248400000014],[-81.68249499999996,69.964431999999988],[-81.795273000000009,69.988586000000112],[-81.945540999999878,70.039978000000076],[-81.953887999999949,70.043868999999972],[-81.957229999999981,70.047211000000061],[-81.958618000000001,70.052765000000079],[-81.966659999999933,70.060532000000023],[-82.065001999999936,70.095825000000048],[-82.101104999999905,70.108032000000037],[-82.214447000000007,70.134995000000004],[-82.361663999999962,70.161377000000073],[-82.446655000000021,70.174988000000042],[-82.475006000000008,70.179428000000087],[-82.610001000000011,70.207214000000135],[-82.739165999999898,70.237762000000089],[-82.913894999999968,70.282761000000107],[-82.938888999999961,70.292205999999965],[-82.952224999999999,70.296370999999965],[-82.977782999999988,70.301926000000037],[-82.992766999999901,70.303588999999988],[-83.006957999999997,70.304703000000131],[-83.048049999999989,70.306931000000134],[-82.897781000000009,70.248595999999964],[-82.822234999999978,70.220825000000104],[-82.683608999999933,70.189972000000125],[-82.573623999999995,70.171646000000123],[-82.493880999999988,70.158875000000023],[-82.415282999999988,70.143051000000071],[-82.299727999999902,70.118866000000082],[-82.103058000000033,70.065262000000075],[-81.976395000000025,70.012206999999989],[-81.841674999999952,69.963318000000015],[-81.773330999999928,69.954162999999994],[-81.758056999999951,69.951660000000004],[-81.725006000000008,69.944138000000066],[-81.720001000000025,69.941085999999984],[-81.710830999999985,69.934142999999949],[-81.738327000000027,69.876083000000051],[-81.741378999999881,69.872757000000036],[-81.854171999999949,69.855545000000006],[-81.880279999999914,69.852478000000076],[-81.960281000000009,69.844146999999964],[-81.962783999999886,69.844711000000132],[-81.963333000000034,69.847487999999998],[-81.962508999999955,69.852768000000083],[-81.963333000000034,69.857757999999933],[-81.972503999999958,69.862487999999985],[-81.995270000000005,69.872481999999991],[-82.001677999999856,69.874694999999974],[-82.011123999999995,69.875809000000118],[-82.020003999999858,69.873871000000008],[-82.061661000000015,69.859421000000054],[-82.118880999999874,69.814697000000081],[-82.11860699999994,69.81053200000008],[-82.126098999999954,69.784988000000055],[-82.129715000000033,69.782486000000006],[-82.143340999999964,69.781372000000033],[-82.189986999999917,69.790267999999969],[-82.243606999999997,69.801650999999993],[-82.271392999999989,69.82638500000013],[-82.241668999999945,69.828048999999965],[-82.224441999999954,69.823608000000036],[-82.210280999999952,69.826096000000007],[-82.206664999999987,69.828598000000056],[-82.215011999999888,69.832763999999997],[-82.303054999999915,69.856644000000131],[-82.314163000000008,69.857483000000116],[-82.403609999999958,69.860260000000039],[-82.417769999999962,69.857757999999933],[-82.526397999999972,69.860809000000131],[-82.575012000000015,69.87081900000004],[-82.64416499999993,69.892487000000017],[-82.741378999999938,69.910248000000138],[-83.035278000000005,69.98803700000002],[-83.040832999999964,69.993042000000059],[-83.044448999999929,70.004166000000112],[-83.051392000000021,70.008605999999929],[-83.066665999999998,70.010818000000029],[-83.150283999999942,70.009720000000129],[-83.238892000000021,69.998871000000065],[-83.339171999999962,69.979431000000091],[-83.345276000000013,69.977203000000088],[-83.613891999999964,69.948868000000118],[-83.654175000000009,69.946365000000128],[-83.715285999999878,69.947754000000145],[-83.898620999999991,69.960815000000082],[-83.944716999999969,69.965820000000122],[-84.00167799999997,69.974152000000117],[-84.010833999999932,69.976653999999996],[-84.041672000000005,69.981369000000029],[-84.082779000000016,69.985260000000096],[-84.161666999999966,69.984985000000052],[-84.314162999999951,69.979706000000078],[-84.560546999999872,69.993866000000025],[-84.65695199999999,70.002487000000087],[-84.728606999999897,70.010269000000051],[-84.783889999999985,70.01887499999998],[-85.163054999999929,70.09137000000004],[-85.176102000000014,70.093048000000124],[-85.335280999999952,70.102478000000019],[-85.353881999999942,70.103317000000004],[-85.369155999999975,70.103591999999992],[-85.666397000000018,70.104705999999965],[-85.719727000000034,70.103591999999992],[-85.752501999999936,70.101929000000041],[-85.84722899999997,70.088882000000069],[-85.869445999999868,70.085541000000035],[-85.874999999999943,70.083328000000051],[-85.878051999999968,70.076935000000105],[-85.876099000000011,70.071930000000066],[-85.854720999999984,70.040817000000061],[-85.851669000000015,70.038315000000125],[-85.838333000000034,70.041931000000034],[-85.826950000000011,70.046371000000022],[-85.801940999999943,70.05442800000003],[-85.785278000000005,70.058319000000097],[-85.732772999999952,70.066939999999988],[-85.691665999999941,70.070541000000048],[-85.636397999999986,70.071930000000066],[-85.618057000000022,70.070831000000055],[-85.585555999999997,70.067490000000021],[-85.468833999999902,70.049263000000053],[-85.376937999999996,70.032211000000132],[-85.350280999999995,70.026382000000126],[-85.25140399999998,69.998322000000087],[-85.243056999999908,69.994979999999998],[-85.236114999999984,69.989150999999993],[-85.239440999999943,69.986649000000057],[-85.244995000000017,69.984421000000111],[-85.25778200000002,69.983871000000079],[-85.41339099999999,69.997429000000125],[-85.441230999999959,70.00093099999998],[-85.451224999999965,70.001769999999908],[-85.577498999999932,70.009995000000117],[-85.613892000000021,70.009995000000117],[-85.635009999999909,70.007491999999957],[-85.651947000000007,70.00360100000006],[-85.678328999999906,69.995254999999986],[-85.695267000000001,69.991363999999919],[-85.726943999999946,69.990539999999953],[-85.808334000000002,69.99859600000002],[-85.823333999999988,70.000275000000045],[-85.851944000000003,70.005554000000018],[-86.093063000000029,70.062484999999981],[-86.230835000000013,70.098602000000142],[-86.255004999999926,70.10554500000012],[-86.301940999999943,70.121643000000006],[-86.326400999999976,70.132202000000007],[-86.551940999999999,70.234984999999995],[-86.556106999999997,70.244705000000124],[-86.581115999999952,70.356934000000081],[-86.577224999999999,70.36554000000001],[-86.55860899999999,70.386932000000002],[-86.541945999999996,70.401382000000126],[-86.524170000000026,70.411652000000061],[-86.512787000000003,70.416382000000056],[-86.481109999999944,70.424698000000149],[-86.448333999999932,70.431655999999975],[-86.373046999999985,70.445816000000093],[-86.313048999999864,70.46276899999998],[-86.294997999999964,70.472762999999986],[-86.287506000000008,70.484420999999998],[-86.297774999999945,70.494141000000127],[-86.313889000000017,70.502777000000037],[-86.334441999999967,70.511658000000125],[-86.353607000000011,70.519440000000088],[-86.36221299999994,70.522765999999933],[-86.374709999999993,70.525269000000094],[-86.390839000000028,70.522217000000012],[-86.389998999999989,70.519989000000066],[-86.383895999999879,70.513611000000083],[-86.375548999999978,70.508881000000031],[-86.367767000000015,70.504715000000147],[-86.350280999999995,70.49832200000003],[-86.339721999999938,70.491652999999928],[-86.339447000000007,70.486374000000126],[-86.34056099999998,70.483870999999965],[-86.363327000000027,70.474152000000004],[-86.37388599999997,70.470261000000107],[-86.407501000000025,70.459991000000002],[-86.51568599999996,70.433640000000025],[-86.565001999999936,70.425537000000134],[-86.578338999999971,70.422211000000118],[-86.589721999999995,70.417479999999955],[-86.62777699999998,70.395538000000101],[-86.651397999999972,70.374695000000031],[-86.662216000000001,70.361099000000081],[-86.65943900000002,70.357208000000014],[-86.638335999999924,70.324432000000058],[-86.647232000000031,70.319443000000092],[-86.655563000000029,70.318878000000041],[-86.839721999999995,70.320267000000058],[-86.861938000000009,70.322220000000016],[-86.876099000000011,70.326096000000064],[-86.881103999999937,70.329711999999972],[-86.990554999999915,70.431655999999975],[-86.988892000000021,70.435532000000023],[-86.982497999999964,70.438873000000058],[-86.953613000000018,70.442474000000118],[-86.936935000000005,70.443313999999987],[-86.92471299999994,70.446091000000081],[-86.922775000000001,70.447754000000032],[-86.921386999999925,70.451660000000061],[-86.92193599999996,70.455550999999957],[-86.928329000000019,70.460541000000035],[-86.937209999999936,70.463608000000136],[-86.953338999999971,70.467209000000025],[-86.967772999999909,70.468048000000124],[-86.996384000000035,70.467484000000013],[-87.034164000000033,70.464157000000057],[-87.072509999999966,70.457489000000123],[-87.08944699999995,70.453323000000012],[-87.132767000000001,70.439148000000102],[-87.140563999999983,70.434981999999991],[-87.182220000000029,70.399428999999998],[-87.184998000000007,70.388596000000007],[-87.05749499999996,70.381653000000028],[-87.043883999999991,70.379974000000004],[-87.031676999999945,70.377472000000125],[-87.010558999999944,70.37164300000012],[-86.991378999999995,70.364150999999993],[-86.981109999999944,70.35803199999998],[-86.972777999999948,70.351929000000041],[-86.976395000000025,70.284714000000065],[-86.985824999999977,70.281662000000097],[-86.999434999999949,70.280548000000124],[-87.009170999999924,70.281097000000102],[-87.107498000000021,70.28804000000008],[-87.184433000000013,70.295532000000037],[-87.255004999999983,70.30664100000007],[-87.5625,70.322768999999937],[-87.673614999999984,70.319153000000085],[-87.669998000000021,70.298598999999967],[-87.643889999999999,70.295822000000044],[-87.628601000000003,70.29304500000012],[-87.61721799999998,70.289429000000098],[-87.610275000000001,70.284714000000065],[-87.613327000000027,70.281936999999971],[-87.62388599999997,70.278046000000074],[-87.704177999999956,70.257217000000082],[-87.77694699999995,70.24331699999999],[-87.796951000000035,70.240265000000079],[-87.833892999999989,70.238037000000134],[-87.8663939999999,70.238876000000062],[-87.914444000000003,70.24136400000009],[-87.923049999999989,70.242751999999996],[-87.935546999999985,70.24693300000007],[-88.012825000000021,70.277267000000109],[-88.088165000000004,70.285095000000126],[-88.138610999999912,70.296097000000032],[-88.250564999999938,70.321381000000031],[-88.263061999999934,70.325272000000098],[-88.264724999999942,70.328049000000021],[-88.256957999999997,70.333878000000027],[-88.214171999999962,70.351379000000009],[-88.20666499999993,70.352478000000133],[-88.061774999999955,70.329544000000055],[-88.05494699999997,70.327369999999974],[-88.050109999999904,70.325042999999994],[-88.038283999999919,70.315536000000122],[-88.030784999999923,70.314033999999992],[-88.02427699999987,70.313202000000103],[-87.994445999999982,70.31203499999998],[-87.916397000000018,70.301926000000037],[-87.901671999999905,70.304428000000144],[-87.888610999999969,70.308029000000033],[-87.879989999999964,70.311371000000122],[-87.882492000000013,70.316375999999991],[-87.889998999999989,70.321930000000009],[-87.914718999999991,70.331665000000044],[-88.083618000000001,70.378036000000066],[-88.111938000000009,70.384155000000078],[-88.166945999999996,70.394440000000031],[-88.374434999999949,70.432205000000124],[-88.439986999999917,70.438583000000051],[-88.579177999999956,70.450271999999984],[-88.670272999999952,70.453598000000056],[-88.679442999999992,70.453598000000056],[-88.693053999999961,70.455261000000121],[-88.797775000000001,70.489700000000028],[-88.897506999999962,70.53276100000005],[-88.914443999999889,70.546096999999975],[-88.985824999999863,70.608322000000101],[-89.00389100000001,70.624984999999981],[-89.009170999999981,70.636383000000023],[-88.999999999999943,70.645538000000045],[-88.999725000000012,70.651657000000057],[-89.005279999999914,70.656936999999971],[-89.076674999999966,70.696930000000009],[-89.105834999999956,70.707489000000066],[-89.118880999999988,70.711380000000133],[-89.143889999999942,70.717209000000139],[-89.203888000000006,70.737198000000035],[-89.261123999999995,70.759720000000129],[-89.285278000000005,70.769714000000135],[-89.330565999999919,70.791931000000034],[-89.369719999999973,70.814697000000081],[-89.374161000000015,70.819153000000142],[-89.448333999999988,70.902481000000023],[-89.447219999999902,70.906647000000078],[-89.443603999999937,70.910262999999929],[-89.432495000000017,70.915268000000026],[-89.416397000000018,70.918594000000041],[-89.371658000000025,70.925812000000064],[-89.298614999999927,70.933043999999995],[-89.222777999999948,70.935531999999967],[-89.20944199999991,70.939147999999989],[-89.205840999999964,70.942749000000049],[-89.188599000000011,70.960815000000025],[-89.195267000000001,70.968323000000055],[-89.205565999999919,70.973602000000028],[-89.270279000000016,70.983597000000145],[-89.315276999999924,70.991653000000042],[-89.340560999999923,70.997482000000048],[-89.354720999999927,71.001937999999939],[-89.49499499999996,71.0577550000001],[-89.549727999999959,71.088593000000117],[-89.491378999999938,71.092209000000139],[-89.469726999999978,71.091933999999924],[-89.228333000000021,71.072768999999994],[-89.216948999999943,71.06999200000007],[-89.208617999999944,71.063034000000073],[-89.215285999999935,71.056641000000127],[-89.218063000000029,71.050812000000121],[-89.212509000000011,71.045532000000037],[-89.203063999999983,71.03804000000008],[-89.196655000000021,71.035263000000043],[-89.178604000000007,71.031372000000147],[-89.134444999999971,71.026932000000102],[-89.117767000000015,71.026657000000114],[-89.100829999999917,71.027771000000087],[-89.076110999999969,71.030272999999966],[-89.039443999999946,71.035263000000043],[-88.979996000000028,71.041092000000049],[-88.904723999999987,71.045258000000103],[-88.689163000000008,71.046936000000017],[-88.617767000000015,71.044434000000138],[-88.490279999999984,71.031097000000102],[-88.478881999999942,71.029709000000025],[-88.43249499999996,71.021927000000062],[-88.380279999999971,71.011931999999945],[-88.369155999999975,71.007492000000127],[-88.365829000000019,71.001937999999939],[-88.36332699999997,70.99552900000009],[-88.362503000000004,70.990265000000136],[-88.362777999999992,70.984146000000067],[-88.360274999999945,70.977767999999969],[-88.356948999999986,70.972214000000122],[-88.343612999999948,70.961380000000077],[-88.332503999999972,70.957213999999965],[-88.318618999999899,70.95387299999993],[-88.289718999999934,70.950272000000098],[-88.260833999999988,70.947754000000089],[-88.025283999999942,70.930542000000059],[-87.999999999999886,70.929153000000099],[-87.968886999999881,70.928588999999931],[-87.930557000000022,70.929428000000087],[-87.912780999999995,70.931366000000025],[-87.857772999999895,70.941360000000032],[-87.798049999999932,70.949707000000046],[-87.752791999999999,70.953598000000113],[-87.699996999999996,70.955551000000071],[-87.664443999999946,70.954712000000086],[-87.62748699999986,70.95138500000013],[-87.610549999999932,70.949417000000039],[-87.559433000000013,70.947479000000101],[-87.43582200000003,70.944976999999994],[-87.371216000000004,70.944725000000119],[-87.353607000000011,70.945250999999928],[-87.345551,70.949417000000039],[-87.343063000000029,70.954162999999937],[-87.343613000000005,70.959427000000119],[-87.337783999999886,70.969986000000006],[-87.329177999999956,70.980545000000006],[-87.30860899999999,70.99552900000009],[-87.298889000000031,71],[-87.286117999999988,71.004166000000112],[-87.267226999999878,71.006942999999978],[-87.246947999999918,71.009155000000078],[-87.212508999999955,71.007492000000127],[-87.151397999999858,71],[-87.141388000000006,70.997757000000036],[-87.11610399999995,70.994705000000124],[-87.051392000000021,70.987761999999975],[-87.033614999999998,70.986649000000057],[-87.017501999999922,70.986649000000057],[-87.004180999999903,70.990265000000136],[-87.003066999999987,70.991089000000102],[-87.002791999999999,70.994141000000013],[-87.009734999999978,70.996093999999971],[-87.039444000000003,71.000823999999966],[-87.135009999999966,71.011383000000023],[-87.166397000000018,71.014435000000105],[-87.184433000000013,71.01527400000009],[-87.279175000000009,71.026932000000102],[-87.385833999999988,71.041930999999977],[-87.394729999999981,71.043594000000098],[-87.404723999999931,71.047211000000061],[-87.410827999999981,71.053314],[-87.472777999999948,71.074157999999954],[-87.572783999999956,71.09526100000005],[-87.701400999999976,71.123306000000071],[-87.712783999999999,71.126082999999994],[-87.760283999999956,71.143051000000071],[-87.848891999999864,71.184982000000048],[-87.851943999999946,71.191925000000026],[-87.852492999999981,71.19720500000011],[-87.848343,71.202209000000039],[-87.825286999999946,71.217209000000025],[-87.823059000000001,71.223601999999971],[-87.816665999999941,71.254714999999976],[-87.821945000000028,71.258331000000055],[-87.829452999999944,71.261932000000115],[-87.844161999999926,71.264160000000061],[-87.900283999999999,71.268600000000049],[-87.911666999999909,71.266936999999984],[-87.971938999999963,71.250274999999988],[-88.019729999999981,71.236098999999967],[-88.034163999999976,71.231658999999979],[-88.041945999999939,71.228867000000037],[-88.131103999999993,71.219147000000135],[-88.321670999999981,71.228592000000049],[-88.583618000000001,71.234984999999995],[-88.70666499999993,71.247756999999979],[-88.849990999999989,71.259720000000016],[-89.058043999999995,71.276382000000012],[-89.20666499999993,71.283325000000048],[-89.299163999999962,71.287491000000102],[-89.42860399999995,71.294434000000081],[-89.703888000000006,71.31581100000011],[-89.816665999999998,71.324997000000053],[-89.830001999999979,71.328872999999987],[-89.89973399999991,71.351379000000122],[-89.907227000000034,71.354706000000078],[-89.964721999999995,71.411377000000016],[-89.968613000000005,71.416931000000034],[-89.983063000000016,71.446930000000009],[-90.010558999999887,71.57777400000009],[-90.013061999999934,71.600266000000033],[-90.004729999999938,71.630813999999987],[-90.00306699999993,71.635817999999972],[-89.99722300000002,71.641373000000044],[-89.964721999999995,71.655822999999941],[-89.932769999999948,71.667755000000113],[-89.896117999999944,71.679977000000065],[-89.884734999999921,71.684708000000001],[-89.817504999999983,71.724701000000039],[-89.808334000000002,71.747757000000092],[-89.821395999999936,71.760269000000051],[-89.831389999999942,71.760269000000051],[-89.836120999999991,71.761658000000068],[-89.843062999999972,71.764434999999992],[-89.893615999999952,71.789428999999927],[-89.954453000000001,71.820541000000048],[-89.960281000000009,71.824158000000011],[-90.026672000000019,71.892761000000064],[-90.048614999999984,71.953873000000101],[-90.001113999999916,72.063034000000073],[-89.993057000000022,72.070540999999992],[-89.962783999999999,72.07748399999997],[-89.812209999999993,72.111923000000047],[-89.750838999999928,72.12303199999991],[-89.738891999999964,72.124985000000038],[-89.725829999999974,72.124695000000031],[-89.718886999999995,72.121917999999937],[-89.715835999999967,72.118591000000038],[-89.704726999999991,72.113312000000008],[-89.691665999999941,72.109985000000108],[-89.682494999999903,72.110535000000141],[-89.664718999999934,72.113312000000008],[-89.597503999999958,72.148331000000098],[-89.579726999999991,72.158874999999966],[-89.574721999999952,72.163605000000018],[-89.576674999999966,72.169144000000017],[-89.584732000000031,72.175811999999951],[-89.598891999999978,72.178040000000124],[-89.618057000000022,72.17886400000009],[-89.676665999999955,72.17692599999998],[-89.705841000000021,72.174697999999978],[-89.724716000000001,72.172485000000052],[-89.738891999999964,72.168593999999985],[-89.759445000000028,72.159988000000055],[-89.770553999999947,72.157485999999949],[-89.780563000000029,72.157485999999949],[-89.802489999999921,72.161925999999994],[-89.892226999999991,72.186919999999986],[-89.897232000000031,72.188583000000051],[-89.901397999999915,72.194137999999953],[-89.939437999999939,72.261932000000058],[-89.954177999999956,72.304977000000065],[-89.957503999999915,72.316086000000098],[-89.95666499999993,72.321655000000135],[-89.913329999999974,72.422211000000061],[-89.907500999999968,72.432205000000067],[-89.89056399999987,72.444977000000051],[-89.87249799999995,72.449142000000052],[-89.860275000000001,72.451096000000121],[-89.813613999999973,72.456650000000081],[-89.799438000000009,72.46026599999999],[-89.793609999999887,72.462768999999923],[-89.777221999999995,72.493866000000025],[-89.775283999999886,72.498596000000077],[-89.772506999999962,72.51998900000001],[-89.772781000000009,72.526093000000003],[-89.786666999999966,72.559982000000048],[-89.753890999999953,72.60554499999995],[-89.736937999999952,72.616652999999985],[-89.699996999999939,72.625259000000085],[-89.678329000000019,72.629424999999969],[-89.65695199999999,72.630264000000125],[-89.643616000000009,72.62692300000009],[-89.614715999999987,72.616089000000045],[-89.597503999999958,72.614700000000028],[-89.572784000000013,72.616928000000144],[-89.560546999999929,72.621918000000051],[-89.470550999999944,72.666091999999992],[-89.473617999999874,72.672485000000108],[-89.511947999999961,72.688873000000001],[-89.525283999999999,72.693863000000022],[-89.549164000000019,72.691085999999927],[-89.567504999999926,72.693039000000056],[-89.574721999999952,72.698868000000061],[-89.580001999999922,72.711105000000032],[-89.581389999999999,72.71775800000006],[-89.574721999999952,72.785263000000043],[-89.569457999999941,72.786925999999937],[-89.479445999999996,72.779709000000025],[-89.446380999999917,72.775542999999971],[-89.36471599999993,72.762206999999989],[-89.330565999999919,72.755829000000006],[-89.294158999999922,72.797211000000061],[-89.333327999999995,72.950546000000145],[-89.358337000000006,72.965271000000087],[-89.361388999999974,72.991652999999985],[-89.308883999999978,73.048324999999977],[-89.228333000000021,73.125809000000004],[-89.043335000000013,73.252486999999974],[-89.035827999999981,73.257492000000013],[-89.00028999999995,73.278320000000122],[-88.990554999999972,73.283599999999979],[-88.856948999999986,73.336105000000032],[-88.695830999999941,73.411926000000108],[-88.68360899999999,73.417480000000069],[-88.468062999999972,73.491928000000087],[-88.433318999999926,73.514159999999947],[-88.409164000000033,73.523605000000032],[-88.286391999999978,73.566939999999988],[-88.263061999999934,73.573883000000023],[-88.074721999999895,73.627762000000018],[-87.974441999999954,73.654709000000139],[-87.92332499999992,73.667755000000056],[-87.817229999999995,73.694427000000132],[-87.780288999999982,73.703048999999965],[-87.739990000000034,73.711380000000077],[-87.539444000000003,73.746643000000063],[-87.456664999999987,73.760269000000051],[-87.183608999999933,73.792755000000113],[-87.049438000000009,73.80831900000004],[-86.71665999999999,73.840820000000122],[-86.596663999999976,73.84526100000005],[-86.493057000000022,73.844437000000084],[-86.401397999999915,73.845824999999991],[-86.239440999999999,73.849152000000117],[-86.208618000000001,73.849991000000102],[-86.109160999999972,73.849991000000102],[-85.747771999999998,73.836380000000133],[-85.706664999999987,73.832214000000022],[-85.553054999999972,73.820830999999998],[-85.520003999999972,73.81999200000007],[-85.462508999999955,73.820830999999998],[-85.421936000000017,73.824158000000125],[-85.307770000000005,73.821106000000043],[-85.16332999999986,73.813309000000061],[-85.121108999999933,73.809981999999991],[-85.104995999999971,73.808029000000033],[-85.069457999999884,73.801926000000094],[-85.034728999999913,73.794708000000071],[-84.970001000000025,73.777771000000087],[-84.837783999999999,73.741652999999985],[-84.842772999999966,73.735809000000017],[-84.865554999999915,73.713318000000015],[-84.922501000000011,73.680267000000072],[-84.931380999999988,73.67553700000002],[-84.956116000000009,73.665267999999969],[-84.985000999999954,73.655823000000112],[-85.340835999999854,73.556366000000139],[-85.596389999999985,73.486649000000114],[-85.766402999999855,73.425262000000032],[-85.851104999999961,73.391098],[-85.930282999999974,73.355255],[-86.046660999999858,73.287201000000039],[-86.137787000000003,73.228867000000037],[-86.292220999999984,73.103317000000118],[-86.296386999999982,73.097488000000055],[-86.294448999999929,73.091095000000109],[-86.288895000000025,73.087204000000042],[-86.28443900000002,73.08248900000001],[-86.284163999999976,73.077208999999982],[-86.287216000000001,73.072495000000004],[-86.328339000000028,73.036651999999947],[-86.454452999999887,72.963607999999965],[-86.474716000000001,72.953323000000069],[-86.495269999999891,72.943314000000044],[-86.50556899999998,72.938309000000004],[-86.571120999999948,72.908875000000023],[-86.627212999999927,72.883605999999986],[-86.647506999999962,72.873306000000071],[-86.653610000000015,72.868866000000082],[-86.658339999999953,72.863602000000071],[-86.695540999999992,72.819153000000142],[-86.696654999999964,72.816666000000055],[-86.732773000000009,72.716095000000109],[-86.703339000000028,72.659148999999957],[-86.698333999999988,72.652205999999978],[-86.686935000000005,72.644714000000022],[-86.662216000000001,72.631653000000085],[-86.638335999999924,72.620529000000033],[-86.611389000000031,72.60914600000001],[-86.504181000000017,72.56860400000005],[-86.479720999999984,72.56053200000008],[-86.466110000000015,72.556365999999969],[-86.451401000000033,72.553040000000124],[-86.414443999999946,72.541656000000046],[-86.397232000000031,72.534988000000055],[-86.353057999999976,72.511658000000068],[-86.33805799999999,72.503051999999968],[-86.283066000000019,72.468323000000112],[-86.275832999999977,72.463318000000072],[-86.267776000000026,72.456375000000094],[-86.255004999999926,72.443588000000091],[-86.240829000000019,72.420258000000103],[-86.240829000000019,72.406647000000135],[-86.24610899999999,72.394989000000123],[-86.258057000000008,72.384430000000066],[-86.275283999999942,72.373871000000008],[-86.308043999999995,72.359146000000067],[-86.350829999999917,72.339156999999943],[-86.377776999999924,72.323608000000036],[-86.396117999999944,72.30914300000012],[-86.428054999999915,72.281937000000084],[-86.43582200000003,72.270264000000054],[-86.455276000000026,72.207214000000079],[-86.434432999999956,72.049987999999928],[-86.432495000000017,72.043319999999994],[-86.425827000000027,72.024993999999992],[-86.420546999999999,72.012771999999984],[-86.336670000000026,71.951934999999992],[-86.166107000000011,71.824996999999996],[-86.132766999999944,71.795822000000101],[-86.110549999999989,71.783051],[-86.078613000000018,71.775542999999971],[-86.051666000000012,71.771652000000074],[-86.024444999999957,71.765823000000069],[-85.947219999999959,71.726928999999984],[-85.905563000000029,71.699707000000046],[-85.871933000000013,71.676926000000037],[-85.500838999999985,71.511108000000092],[-85.391952999999944,71.481659000000093],[-85.374161000000015,71.47886699999998],[-85.228606999999954,71.465546000000074],[-84.948607999999979,71.421646000000067],[-84.93472300000002,71.418319999999994],[-84.929992999999968,71.414429000000098],[-84.859160999999972,71.321105999999986],[-84.838057999999933,71.29193099999992],[-84.834166999999979,71.285262999999986],[-84.83277899999996,71.278869999999984],[-84.833892999999932,71.274154999999951],[-84.835555999999997,71.271652000000017],[-84.848343,71.269440000000145],[-84.868606999999997,71.268875000000094],[-84.921660999999972,71.270828000000051],[-85.041945999999996,71.278594999999996],[-85.172500999999897,71.272490999999945],[-85.173888999999974,71.269989000000066],[-85.178329000000019,71.266388000000006],[-85.389998999999932,71.196640000000059],[-85.399993999999936,71.193862999999965],[-85.50028999999995,71.177200000000084],[-85.514724999999999,71.176086000000112],[-85.532501000000025,71.177200000000084],[-85.663054999999986,71.194427000000132],[-85.761397999999986,71.192200000000071],[-85.838333000000034,71.187485000000038],[-85.932769999999948,71.17886400000009],[-85.966659999999933,71.171097000000145],[-86.170836999999949,71.106934000000081],[-86.210830999999985,71.09387200000009],[-86.21444699999995,71.089705999999978],[-86.206954999999994,71.083878000000084],[-86.206115999999952,71.078049000000021],[-86.212783999999999,71.072768999999994],[-86.24888599999997,71.058594000000085],[-86.288605000000018,71.052200000000028],[-86.408051,71.035263000000043],[-86.450835999999924,71.031372000000147],[-86.517775999999969,71.031661999999983],[-86.643889999999999,71.019439999999975],[-86.749999999999943,71.007766999999944],[-86.770278999999903,71.004166000000112],[-86.785552999999993,71.000275000000045],[-86.798614999999984,70.996368000000075],[-86.819167999999877,70.98942599999998],[-86.820007000000032,70.988586000000112],[-86.806655999999975,70.983871000000079],[-86.75778200000002,70.97665399999994],[-86.713057999999933,70.974152000000061],[-86.601943999999946,70.97164900000007],[-86.547500999999954,70.978867000000093],[-86.430283000000031,70.988876000000118],[-86.292220999999984,71.000275000000045],[-86.270279000000016,71.002777000000094],[-86.224166999999852,71.014435000000105],[-86.026947000000007,71.071381000000088],[-85.832503999999915,71.127197000000137],[-85.802215999999987,71.135818000000029],[-85.779174999999952,71.139160000000004],[-85.670273000000009,71.148880000000077],[-85.650283999999999,71.149428999999998],[-85.505004999999983,71.158034999999927],[-85.411666999999966,71.17442299999999],[-85.391678000000013,71.174988000000042],[-85.288605000000018,71.159149000000127],[-85.274169999999913,71.15525800000006],[-85.110549999999989,71.161652000000061],[-85.042220999999927,71.181656000000032],[-85.037216000000001,71.183044000000109],[-84.99888599999997,71.187485000000038],[-84.961670000000026,71.188583000000108],[-84.944152999999972,71.187195000000031],[-84.875274999999988,71.172760000000096],[-84.849990999999989,71.154709000000082],[-84.84584000000001,71.147766000000104],[-84.87110899999999,71.073607999999922],[-84.875823999999852,71.06999200000007],[-84.879714999999919,71.069442999999922],[-84.904175000000009,71.078049000000021],[-84.935821999999973,71.092483999999956],[-84.950561999999934,71.09693900000002],[-84.966110000000015,71.10026600000009],[-84.9808349999999,71.101089000000002],[-85.00111400000003,71.100815000000068],[-85.142226999999934,71.086380000000133],[-85.146956999999986,71.082764000000054],[-85.112777999999935,71.079163000000051],[-85.061385999999914,71.076385000000016],[-84.99221799999998,71.077484000000027],[-84.976668999999902,71.075821000000076],[-84.960281000000009,71.072220000000016],[-84.92971799999998,71.004440000000045],[-84.926940999999943,70.988037000000134],[-84.930282999999974,70.981659000000036],[-84.941375999999991,70.970535000000098],[-84.950835999999981,70.965546000000131],[-84.963333000000034,70.955826000000059],[-84.975280999999995,70.945250999999928],[-84.976105000000018,70.933318999999983],[-84.970839999999953,70.927474999999959],[-84.964721999999938,70.922485000000108],[-84.958618000000001,70.919434000000081],[-84.941100999999946,70.918045000000063],[-84.814162999999951,70.919434000000081],[-84.798888999999974,70.921646000000123],[-84.793610000000001,70.926650999999993],[-84.748336999999992,70.975539999999967],[-84.748046999999985,70.988037000000134],[-84.771118000000001,71.037490999999989],[-84.803604000000007,71.047211000000061],[-84.819167999999991,71.057480000000112],[-84.827788999999996,71.068328999999949],[-84.829726999999878,71.073317999999915],[-84.828888000000006,71.079987000000017],[-84.826675000000023,71.085541000000148],[-84.801392000000021,71.148605000000032],[-84.766662999999994,71.197479000000044],[-84.770843999999954,71.254990000000021],[-84.781386999999938,71.261932000000115],[-84.786666999999909,71.267761000000121],[-84.793059999999969,71.278046000000018],[-84.796660999999915,71.297485000000108],[-84.797226000000023,71.303314000000114],[-84.762511999999901,71.406646999999964],[-84.749434999999949,71.416655999999989],[-84.731948999999929,71.424698000000149],[-84.720551,71.428314],[-84.693053999999961,71.434143000000006],[-84.678329000000019,71.435257000000036],[-84.660004000000015,71.431655999999975],[-84.653060999999923,71.431931000000134],[-84.571670999999924,71.440810999999997],[-84.557495000000017,71.444138000000123],[-84.547774999999945,71.447478999999987],[-84.539169000000015,71.451660000000061],[-84.531951999999933,71.456940000000145],[-84.526108000000022,71.46887200000009],[-84.526397999999915,71.478316999999947],[-84.530563000000029,71.492477000000065],[-84.533614999999941,71.502486999999974],[-84.546660999999972,71.527480999999966],[-84.554717999999923,71.541092000000106],[-84.561385999999914,71.549988000000042],[-84.564437999999939,71.552475000000129],[-84.610275000000001,71.562759000000142],[-84.636397999999929,71.570541000000105],[-84.648620999999991,71.57638500000013],[-84.65834000000001,71.583878000000141],[-84.654998999999975,71.608871000000022],[-84.653060999999923,71.612762000000089],[-84.642501999999979,71.622757000000036],[-84.625548999999978,71.633041000000048],[-84.610549999999989,71.641663000000051],[-84.604445999999996,71.646103000000039],[-84.606658999999922,71.649429000000112],[-84.625,71.665817000000004],[-84.628052000000025,71.668319999999937],[-84.635559000000001,71.670258000000103],[-84.649733999999967,71.672211000000004],[-84.710830999999928,71.676085999999998],[-84.77305599999994,71.678588999999988],[-84.782776000000013,71.678863999999976],[-84.827498999999989,71.675262000000032],[-84.867217999999923,71.66804500000012],[-84.886200000000031,71.654251000000102],[-84.926666000000012,71.636107999999979],[-84.975280999999995,71.644440000000145],[-85.097503999999958,71.655258000000117],[-85.176940999999999,71.656647000000135],[-85.196655000000021,71.655822999999941],[-85.230835000000013,71.659987999999942],[-85.263900999999976,71.665543000000071],[-85.279723999999987,71.668594000000041],[-85.291381999999999,71.672211000000004],[-85.570846999999958,71.77998400000007],[-85.579726999999991,71.784988000000055],[-85.573623999999938,71.790817000000061],[-85.557770000000005,71.79525799999999],[-85.543883999999935,71.795532000000094],[-85.458892999999989,71.79414399999996],[-85.449721999999952,71.796097000000088],[-85.436934999999949,71.800812000000121],[-85.432769999999948,71.806366000000139],[-85.431945999999982,71.814697000000024],[-85.434432999999899,71.818053999999961],[-85.551666000000012,71.896378000000027],[-85.559722999999963,71.900543000000027],[-85.744995000000017,71.941360000000032],[-85.845839999999896,71.962494000000049],[-85.900832999999977,71.969147000000021],[-85.939986999999974,71.973038000000088],[-85.963333000000034,71.974425999999994],[-86.002501999999993,71.978043000000127],[-86.022781000000009,71.980545000000006],[-86.026672000000019,71.981658999999979],[-86.039169000000015,71.988876000000118],[-86.043610000000001,71.99552900000009],[-86.050827000000027,72.011107999999979],[-86.047501000000011,72.013885000000073],[-85.981110000000001,72.028594999999996],[-85.778885000000002,72.026932000000102],[-85.538329999999974,72.059143000000006],[-85.509444999999914,72.068054000000132],[-85.495270000000005,72.078872999999987],[-85.440552000000025,72.132751000000098],[-85.449158000000011,72.158325000000104],[-85.481948999999929,72.173309000000017],[-85.50167799999997,72.184143000000063],[-85.502501999999993,72.251663000000065],[-85.49749799999995,72.255264000000125],[-85.48721299999994,72.260268999999994],[-85.291945999999882,72.25999500000006],[-85.271941999999967,72.259720000000016],[-85.029175000000009,72.25082400000008],[-85.013335999999981,72.250000000000114],[-84.936385999999914,72.235809000000131],[-84.919997999999964,72.232758000000103],[-84.867766999999958,72.220825000000048],[-84.861388999999917,72.217758000000117],[-84.847504000000015,72.205550999999957],[-84.839172000000019,72.194137999999953],[-84.815276999999924,72.181366000000139],[-84.803328999999906,72.177765000000079],[-84.710555999999997,72.151656999999943],[-84.612212999999997,72.141098000000113],[-84.595839999999953,72.137772000000041],[-84.512222000000008,72.114150999999993],[-84.286391999999978,72.028594999999996],[-84.275557999999933,72.023879999999963],[-84.269454999999994,72.020828000000051],[-84.261123999999995,72.016098000000056],[-84.258056999999894,72.011932000000115],[-84.25,71.998322000000087],[-84.239989999999921,71.973877000000016],[-84.236389000000031,71.961655000000064],[-84.230559999999855,71.95138500000013],[-84.225006000000008,71.945525999999916],[-84.218886999999995,71.940262000000132],[-84.208617999999888,71.93414300000012],[-84.194442999999978,71.930817000000047],[-84.184722999999963,71.930542000000059],[-84.178329000000019,71.932755000000043],[-84.172774999999945,71.937759000000142],[-84.168883999999878,71.944138000000009],[-84.158614999999998,71.977203000000088],[-84.164718999999877,72.021103000000096],[-84.171111999999994,72.024155000000007],[-84.218063000000029,72.044144000000131],[-84.270003999999915,72.051085999999998],[-84.285827999999981,72.054152999999928],[-84.319732999999871,72.0619200000001],[-84.346663999999976,72.069717000000026],[-84.357772999999952,72.076385000000016],[-84.379990000000021,72.108321999999987],[-84.380553999999961,72.123596000000077],[-84.456116000000009,72.133605999999986],[-84.473327999999981,72.135818000000029],[-84.613326999999913,72.163605000000018],[-84.652221999999938,72.17886400000009],[-84.72193900000002,72.213043000000084],[-84.933318999999926,72.284424000000001],[-84.935271999999941,72.289429000000041],[-84.917495999999971,72.299713000000054],[-84.829452999999944,72.348328000000095],[-84.816101000000003,72.352767999999912],[-84.801392000000021,72.354706000000078],[-84.769729999999981,72.356368999999972],[-84.715012000000002,72.355820000000051],[-84.661941999999954,72.354156000000046],[-84.565001999999993,72.348877000000073],[-84.521117999999944,72.350540000000137],[-84.500838999999928,72.353867000000093],[-84.48443599999996,72.358032000000094],[-84.436110999999926,72.374984999999981],[-84.433060000000012,72.378311000000053],[-84.442215000000033,72.383041000000048],[-84.453339000000028,72.382477000000108],[-84.471389999999928,72.379425000000026],[-84.571670999999924,72.361374000000012],[-84.864166000000012,72.36692800000003],[-84.872771999999998,72.36943100000002],[-84.876098999999954,72.372208000000114],[-84.875548999999921,72.394989000000123],[-84.870834000000002,72.400818000000129],[-84.857772999999952,72.405547999999953],[-84.836670000000026,72.408035000000041],[-84.817504999999983,72.406647000000135],[-84.800277999999992,72.406647000000135],[-84.786666999999909,72.40887500000008],[-84.768341000000021,72.444427000000019],[-84.767226999999934,72.447478999999987],[-84.768341000000021,72.451935000000049],[-84.771118000000001,72.457489000000066],[-84.776947000000007,72.458327999999995],[-84.791945999999996,72.45498699999996],[-84.918609999999944,72.425262000000089],[-85.008347000000015,72.399429000000112],[-85.021666999999979,72.394714000000079],[-85.144729999999925,72.359421000000111],[-85.339019999999948,72.406418000000031],[-85.370270000000005,72.414703000000031],[-85.515288999999996,72.458878000000027],[-85.535277999999948,72.469711000000018],[-85.610001000000011,72.53166200000004],[-85.618057000000022,72.540817000000061],[-85.61721799999998,72.545532000000094],[-85.613892000000021,72.550261999999975],[-85.598617999999931,72.555251999999996],[-85.508347000000015,72.561371000000008],[-85.486114999999927,72.564987000000087],[-85.478057999999976,72.568329000000006],[-85.473052999999993,72.571930000000066],[-85.475554999999986,72.575272000000041],[-85.481110000000001,72.577484000000084],[-85.499999999999943,72.58027600000014],[-85.559998000000007,72.582489000000123],[-85.623885999999914,72.586928999999941],[-85.641953000000001,72.592757999999947],[-85.654174999999952,72.598038000000031],[-85.664718999999934,72.60554499999995],[-85.703063999999927,72.634155000000021],[-85.705276000000026,72.637771999999984],[-85.70777899999996,72.646378000000084],[-85.70944199999991,72.73692299999999],[-85.688048999999978,72.893599999999992],[-85.68472300000002,72.898330999999928],[-85.679442999999992,72.903595000000109],[-85.592223999999987,72.959152000000074],[-85.581680000000006,72.964157000000114],[-85.570557000000008,72.966934000000037],[-85.549164000000019,72.969711000000132],[-85.499725000000012,72.974152000000004],[-85.481948999999929,72.974152000000004],[-85.378875999999934,72.971100000000092],[-85.283066000000019,72.964431999999931],[-85.257507000000032,72.960814999999968],[-85.127486999999974,72.940262000000132],[-85.077498999999932,72.929977000000008],[-85.015015000000005,72.916092000000106],[-84.96665999999999,72.904984000000127],[-84.93249499999996,72.896378000000027],[-84.874434999999949,72.885543999999925],[-84.819457999999997,72.880264000000068],[-84.707503999999972,72.869980000000055],[-84.668610000000001,72.867477000000065],[-84.61082499999992,72.861649000000114],[-84.504455999999948,72.846100000000035],[-84.437209999999993,72.833603000000039],[-84.404998999999918,72.826096000000121],[-84.389450000000011,72.822220000000016],[-84.320847000000015,72.800812000000121],[-84.291107000000011,72.791655999999989],[-84.257507000000032,72.785263000000043],[-84.188323999999966,72.774428999999941],[-83.991378999999938,72.745819000000097],[-83.97222899999997,72.744141000000013],[-83.958054000000004,72.746643000000063],[-83.955275999999913,72.748322000000087],[-83.953063999999927,72.752487000000087],[-83.956389999999999,72.754990000000078],[-83.989440999999999,72.76887499999998],[-84.040832999999964,72.77748100000008],[-84.073623999999995,72.781661999999983],[-84.108046999999942,72.785263000000043],[-84.218613000000005,72.794983000000116],[-84.246947999999975,72.79971299999994],[-84.291381999999942,72.812484999999981],[-84.311935000000005,72.820267000000115],[-84.335280999999952,72.829987000000017],[-84.419158999999922,72.853316999999947],[-84.528885000000002,72.882477000000051],[-84.577224999999942,72.892212000000086],[-84.652495999999985,72.899429000000055],[-84.706389999999999,72.905823000000055],[-84.74360699999994,72.910812000000021],[-84.760558999999944,72.914153999999996],[-84.791107000000011,72.921371000000079],[-84.855835000000013,72.937485000000038],[-84.870269999999948,72.942200000000071],[-85.059998000000007,72.996643000000006],[-85.223609999999951,73.014984000000027],[-85.513901000000033,73.019149999999911],[-85.535277999999948,73.021927000000005],[-85.537216000000001,73.028320000000008],[-85.47193900000002,73.098037999999917],[-85.447768999999937,73.120254999999986],[-85.44027699999998,73.125533999999959],[-85.429442999999935,73.130539000000056],[-85.415832999999964,73.135269000000051],[-85.406951999999933,73.136383000000023],[-85.395554000000004,73.135544000000095],[-85.379990000000021,73.133605999999929],[-85.37332200000003,73.130814000000044],[-85.369995000000017,73.128311000000053],[-85.363891999999964,73.120818999999926],[-85.35943599999996,73.113876000000118],[-85.358046999999942,73.109711000000118],[-85.333618000000001,73.092484000000127],[-85.300277999999935,73.078049000000021],[-85.256888999999944,73.071487000000104],[-85.248061999999948,73.068649000000107],[-85.240891000000033,73.066818000000126],[-85.188057000000015,73.059814000000074],[-85.175887999999986,73.058655000000101],[-85.166388999999981,73.060654000000113],[-85.171393999999964,73.066315000000088],[-85.152495999999985,73.072769000000108],[-85.186935000000005,73.096939000000134],[-85.226943999999946,73.115814000000057],[-85.229172000000005,73.12303200000008],[-85.227782999999988,73.129150000000038],[-85.223052999999993,73.134720000000129],[-85.213622999999984,73.13888500000013],[-85.191939999999988,73.141663000000108],[-85.148345999999947,73.141663000000108],[-85.089171999999962,73.137496999999996],[-85.053329000000019,73.13220200000012],[-85.003066999999874,73.121918000000107],[-84.988602000000014,73.116928000000087],[-84.921386999999982,73.098327999999924],[-84.904175000000009,73.09526100000005],[-84.829726999999878,73.085541000000148],[-84.772781000000009,73.081100000000049],[-84.556655999999975,73.064423000000033],[-84.212508999999955,73.040268000000026],[-84.077224999999942,73.03387500000008],[-83.92332499999992,73.033600000000035],[-83.867766999999901,73.029709000000139],[-83.84973100000002,73.027481000000023],[-83.832503999999972,73.024155000000007],[-83.761397999999929,73.006378000000097],[-83.718886999999995,72.989151000000106],[-83.634445000000028,72.982483000000116],[-83.633330999999941,72.983322000000101],[-83.634445000000028,72.986374000000012],[-83.648346000000004,72.991364000000033],[-83.692490000000021,73.005554000000132],[-83.776672000000019,73.031097000000045],[-83.879715000000033,73.051926000000037],[-83.913619999999923,73.058318999999983],[-83.93472300000002,73.061096000000077],[-83.955841000000021,73.06164600000011],[-83.974716000000001,73.060806000000071],[-84.039718999999991,73.056366000000082],[-84.05972300000002,73.056366000000082],[-84.095001000000025,73.058318999999983],[-84.197495000000004,73.068604000000107],[-84.236938000000009,73.081100000000049],[-84.248046999999985,73.083327999999995],[-84.275283999999999,73.086929000000055],[-84.433884000000035,73.106093999999985],[-84.531112999999948,73.110260000000096],[-84.547501000000011,73.111374000000069],[-84.584441999999967,73.115814000000057],[-84.736389000000031,73.137206999999989],[-84.789444000000003,73.145828000000108],[-84.865004999999883,73.163604999999961],[-84.912780999999939,73.175537000000134],[-84.942215000000033,73.181655999999975],[-84.985275000000001,73.190536000000009],[-85.020003999999972,73.196930000000066],[-85.058334000000002,73.200546000000088],[-85.100554999999986,73.201385000000073],[-85.138061999999934,73.204436999999984],[-85.170546999999942,73.210815000000139],[-85.17721599999993,73.213882000000069],[-85.184433000000013,73.21887200000009],[-85.188599000000011,73.223602000000142],[-85.188599000000011,73.228867000000037],[-85.138900999999976,73.299988000000042],[-85.134170999999981,73.305542000000059],[-85.115828999999962,73.314423000000147],[-85.077788999999882,73.329437000000041],[-85.017226999999991,73.348328000000095],[-84.979996000000028,73.35664399999996],[-84.808043999999938,73.388321000000133],[-84.78694200000001,73.388046000000088],[-84.756392999999946,73.381088000000091],[-84.741669000000002,73.376083000000051],[-84.72193900000002,73.362198000000149],[-84.712783999999942,73.348602000000028],[-84.694992000000013,73.326934999999992],[-84.685271999999998,73.319991999999957],[-84.654998999999975,73.305542000000059],[-84.424712999999997,73.232483000000059],[-84.408889999999985,73.228591999999992],[-84.392501999999922,73.226089000000002],[-84.377212999999927,73.224152000000004],[-84.355269999999905,73.223037999999974],[-84.33944699999995,73.226089000000002],[-84.347777999999948,73.232483000000059],[-84.413054999999986,73.272217000000012],[-84.451110999999969,73.288588999999945],[-84.460830999999985,73.291931000000091],[-84.48971599999993,73.299713000000054],[-84.563613999999973,73.313873000000115],[-84.576674999999909,73.317764000000011],[-84.586945000000014,73.323044000000095],[-84.597778000000005,73.330826000000059],[-84.653609999999958,73.387206999999933],[-84.656113000000005,73.390549000000078],[-84.652221999999938,73.393326000000002],[-84.642226999999934,73.397217000000069],[-84.625,73.401382000000069],[-84.583892999999989,73.409149000000014],[-84.434157999999968,73.435256999999979],[-84.284438999999963,73.461105000000089],[-84.229172000000005,73.47026100000005],[-84.194442999999978,73.474701000000039],[-84.171386999999925,73.47526600000009],[-84.113892000000021,73.469147000000078],[-83.751923000000033,73.427490000000034],[-83.724715999999944,73.41304000000008],[-83.717772999999966,73.405822999999998],[-83.719726999999978,73.399719000000118],[-83.724715999999944,73.393875000000094],[-83.728058000000033,73.381088000000091],[-83.720550999999944,73.365814000000057],[-83.712218999999948,73.351928999999927],[-83.702498999999875,73.339157000000114],[-83.689437999999939,73.323608000000036],[-83.665833000000021,73.307754999999986],[-83.657500999999968,73.303589000000102],[-83.648055999999997,73.300261999999975],[-83.630828999999949,73.297210999999947],[-83.613891999999964,73.296097000000145],[-83.600554999999929,73.297485000000052],[-83.593062999999972,73.301375999999948],[-83.590835999999911,73.307204999999954],[-83.591109999999958,73.313309000000004],[-83.594161999999983,73.325272000000041],[-83.624999999999943,73.415268000000026],[-83.633330999999941,73.428864000000033],[-83.642501999999979,73.439696999999967],[-83.652495999999985,73.445250999999985],[-83.663895000000025,73.449707000000103],[-83.679717999999923,73.453872999999987],[-83.696945000000028,73.457214000000022],[-83.754456000000005,73.463318000000072],[-83.810546999999929,73.470534999999984],[-83.954726999999934,73.492752000000053],[-83.978606999999954,73.49664300000012],[-83.993606999999997,73.500275000000045],[-84.00418099999996,73.504166000000112],[-84.006957999999941,73.509720000000129],[-83.996947999999975,73.51388500000013],[-83.979172000000005,73.518051000000014],[-83.740828999999962,73.567763999999954],[-83.577498999999989,73.59637500000008],[-83.445267000000001,73.615814],[-83.219161999999869,73.656647000000078],[-83.085280999999952,73.65776100000005],[-83.018340999999907,73.666091999999935],[-82.931106999999997,73.690536000000066],[-82.902221999999938,73.700272000000041],[-82.889998999999989,73.705261000000007],[-82.872771999999884,73.715546000000131],[-82.869720000000029,73.721099999999979],[-82.86332699999997,73.726089000000115],[-82.852782999999931,73.730270000000019],[-82.840835999999967,73.73275799999999],[-82.820846999999958,73.733597000000145],[-82.636123999999938,73.727767999999912],[-82.529998999999918,73.722214000000122],[-82.475006000000008,73.719985999999949],[-82.413894999999968,73.718871999999976],[-82.367492999999911,73.719147000000021],[-82.21945199999999,73.725266000000033],[-81.990828999999962,73.731368999999972],[-81.618057000000022,73.721099999999979],[-81.572509999999966,73.719711000000132],[-81.553878999999938,73.717209000000082],[-81.536666999999852,73.713882000000126],[-81.476105000000018,73.698029000000076],[-81.457229999999981,73.691086000000098],[-81.282500999999968,73.58027600000014],[-81.239715999999873,73.546936000000073],[-81.228881999999999,73.535538000000088],[-81.21945199999999,73.521378000000141],[-81.197494999999947,73.477203000000145],[-81.188323999999909,73.389709000000039],[-81.21166999999997,73.326096000000007],[-81.216109999999958,73.314697000000081],[-81.215835999999967,73.303863999999919],[-81.214172000000019,73.291931000000091],[-81.20944199999991,73.272766000000104],[-81.204726999999991,73.266662999999994],[-81.192490000000021,73.260543999999982],[-81.177490000000034,73.256378000000041],[-81.101668999999958,73.238312000000064],[-81.074448000000018,73.232208000000071],[-80.900283999999942,73.209427000000005],[-80.712783999999942,73.180267000000129],[-80.664718999999934,73.171097000000088],[-80.640839000000028,73.165543000000127],[-80.61721799999998,73.157760999999994],[-80.596389999999985,73.148041000000092],[-80.557769999999948,73.111374000000069],[-80.547501000000011,73.098037999999917],[-80.547774999999945,73.091369999999984],[-80.549437999999952,73.081940000000088],[-80.59333799999996,73.025818000000072],[-80.617492999999968,73.005554000000132],[-80.641388000000006,72.996094000000085],[-80.647507000000019,72.990540000000067],[-80.652221999999938,72.974700999999982],[-80.650833000000034,72.969146999999964],[-80.633895999999936,72.940536000000066],[-80.642501999999979,72.93553200000008],[-80.642775999999969,72.92886400000009],[-80.638335999999981,72.922760000000096],[-80.537216000000001,72.851089000000002],[-80.513901000000033,72.838882000000012],[-80.487777999999992,72.828598],[-80.440552000000025,72.818603999999993],[-80.405563000000029,72.813309000000118],[-80.349166999999966,72.806366000000139],[-80.333327999999938,72.803040000000067],[-80.319457999999941,72.799149],[-80.299987999999985,72.788040000000137],[-80.283614999999998,72.77748100000008],[-80.247498000000007,72.730545000000063],[-80.258056999999894,72.724425999999994],[-80.332229999999925,72.712494000000049],[-80.361664000000019,72.706099999999992],[-80.444991999999957,72.673599000000081],[-80.464721999999938,72.665268000000026],[-80.541381999999999,72.628860000000145],[-80.55610699999994,72.6202550000001],[-80.556380999999874,72.607208000000071],[-80.648620999999991,72.554977000000008],[-80.676391999999964,72.547211000000118],[-80.765288999999996,72.516937000000098],[-80.942489999999964,72.455261000000121],[-80.953887999999949,72.450546000000088],[-80.988327000000027,72.429703000000018],[-81.186935000000005,72.299149000000114],[-81.192490000000021,72.293594000000041],[-81.199722000000008,72.289153999999996],[-81.222504000000015,72.281662000000097],[-81.239166000000012,72.27777100000003],[-81.30471799999998,72.268326000000116],[-81.379439999999988,72.241652999999928],[-81.365279999999984,72.241652999999928],[-81.301392000000021,72.246094000000028],[-81.285827999999924,72.247208000000057],[-81.253066999999987,72.251938000000052],[-81.241942999999992,72.254439999999931],[-81.229720999999927,72.258606000000043],[-81.164169000000015,72.287201000000096],[-81.037506000000008,72.351089000000115],[-80.929442999999935,72.40026899999998],[-80.821670999999981,72.439148000000046],[-80.715012000000002,72.473037999999974],[-80.600554999999986,72.506653000000028],[-80.580291999999929,72.509995000000004],[-80.554442999999992,72.512497000000053],[-80.539443999999946,72.511658000000068],[-80.52555799999999,72.508040999999935],[-80.516402999999912,72.503875999999934],[-80.508895999999993,72.49664300000012],[-80.503066999999987,72.484985000000108],[-80.495270000000005,72.464157000000057],[-80.492767000000015,72.453049000000021],[-80.493606999999997,72.447205000000054],[-80.514174999999966,72.379700000000014],[-80.525009000000011,72.374146000000053],[-80.54222099999987,72.37052900000009],[-80.564437999999939,72.366653000000042],[-80.603058000000033,72.363037000000134],[-80.655562999999972,72.351928999999984],[-80.669158999999979,72.347214000000122],[-80.680556999999965,72.342209000000082],[-80.783324999999991,72.290267999999969],[-80.794158999999922,72.284714000000008],[-80.808333999999945,72.274155000000121],[-80.854172000000005,72.235535000000027],[-80.896956999999929,72.194427000000076],[-80.905563000000029,72.180542000000003],[-80.816665999999998,72.150542999999971],[-80.769454999999994,72.141663000000108],[-80.753890999999953,72.140548999999965],[-80.709732000000031,72.131927000000132],[-80.580840999999964,72.094437000000084],[-80.569457999999997,72.088318000000072],[-80.567229999999995,72.077208999999982],[-80.567229999999995,72.072768999999937],[-80.574172999999917,72.068329000000119],[-80.588333000000034,72.064148000000046],[-80.630554000000018,72.062195000000088],[-80.646118000000001,72.063309000000061],[-80.686661000000015,72.073043999999982],[-80.741942999999935,72.094147000000078],[-80.941100999999946,72.087494000000106],[-81.080291999999929,72.051651000000049],[-81.08666999999997,72.04664600000001],[-81.083327999999938,72.045532000000037],[-81.065001999999936,72.041655999999932],[-81.046660999999972,72.039978000000019],[-80.990554999999972,72.037766000000147],[-80.927215999999987,72.037766000000147],[-80.906386999999995,72.039978000000019],[-80.892226999999991,72.044144000000131],[-80.886397999999986,72.049713000000111],[-80.879439999999988,72.054152999999928],[-80.866652999999985,72.0577550000001],[-80.84722899999997,72.056641000000127],[-80.792770000000019,72.02777100000003],[-80.794158999999922,72.022491000000002],[-80.821395999999879,71.95637499999998],[-80.833327999999995,71.945815999999979],[-80.849441999999954,71.934707999999944],[-80.886123999999938,71.920821999999987],[-80.933318999999926,71.908875000000023],[-80.975005999999951,71.895827999999995],[-80.980834999999956,71.890273999999977],[-80.983611999999994,71.886383000000137],[-80.971664000000033,71.881653000000085],[-80.950287000000003,71.881088000000034],[-80.926392000000021,71.882750999999985],[-80.903610000000015,71.885268999999937],[-80.868056999999965,71.893051000000071],[-80.767226999999991,71.929428000000087],[-80.756119000000012,71.93414300000012],[-80.750290000000007,71.939697000000081],[-80.746947999999975,71.945251000000098],[-80.744720000000029,71.951934999999992],[-80.745834000000002,71.957488999999953],[-80.75556899999998,71.971099999999922],[-80.758346999999958,71.977768000000083],[-80.746947999999975,71.982483000000116],[-80.659164000000033,72.003052000000082],[-80.639449999999954,72.006377999999927],[-80.620543999999995,72.006103999999993],[-80.535277999999948,72.016098000000056],[-80.448883000000023,72.029160000000047],[-80.410552999999993,72.039429000000098],[-80.385009999999966,72.048325000000034],[-80.350554999999929,72.069153000000085],[-80.347777999999948,72.075272000000098],[-80.346663999999976,72.081100000000049],[-80.347228999999913,72.088318000000072],[-80.352492999999981,72.095534999999984],[-80.358611999999994,72.101379000000009],[-80.370269999999948,72.10803199999998],[-80.383056999999951,72.113312000000008],[-80.410278000000005,72.121368000000075],[-80.433884000000035,72.132751000000098],[-80.445540999999992,72.139709000000096],[-80.455275999999969,72.146652000000074],[-80.478607000000011,72.168593999999985],[-80.483321999999987,72.175261999999918],[-80.486938000000009,72.183044000000052],[-80.486664000000019,72.189423000000147],[-80.468062999999972,72.191925000000026],[-80.426940999999886,72.191086000000041],[-80.408614999999884,72.189148000000102],[-80.393616000000009,72.177200000000084],[-80.376663000000008,72.17442299999999],[-80.355559999999912,72.17442299999999],[-80.331389999999999,72.176086000000112],[-80.241103999999893,72.197754000000032],[-80.235274999999945,72.203323000000012],[-80.244445999999925,72.209717000000069],[-80.27305599999994,72.219147000000135],[-80.279723999999931,72.22554000000008],[-80.301665999999955,72.248596000000134],[-80.306380999999988,72.255264000000125],[-80.295546999999942,72.274429000000055],[-80.289718999999934,72.279984000000127],[-80.272231999999974,72.290267999999969],[-80.260833999999988,72.294983000000002],[-80.24221799999998,72.297485000000108],[-80.22444200000001,72.296371000000136],[-80.194153000000028,72.28776600000009],[-80.155838000000017,72.273605000000089],[-80.134734999999921,72.262771999999927],[-80.113051999999982,72.244141000000127],[-80.08555599999994,72.226654000000053],[-80.021392999999989,72.189697000000081],[-79.991668999999888,72.176651000000106],[-79.962783999999999,72.168868999999972],[-79.947220000000016,72.165267999999912],[-79.899733999999967,72.15554800000001],[-79.840285999999935,72.145263999999997],[-79.790557999999976,72.137772000000041],[-79.761123999999995,72.134155000000078],[-79.685546999999929,72.126372999999944],[-79.674437999999952,72.126647999999989],[-79.672501000000011,72.129700000000071],[-79.691665999999998,72.141663000000108],[-79.719161999999926,72.148331000000098],[-79.789992999999981,72.155823000000055],[-79.811110999999983,72.160263000000043],[-79.854995999999971,72.171097000000145],[-79.923889000000031,72.190536000000009],[-79.941101000000003,72.195816000000093],[-80.045546999999999,72.242477000000122],[-80.15194699999995,72.310531999999967],[-80.166396999999961,72.322220000000129],[-80.164443999999946,72.32748400000014],[-80.155562999999916,72.336928999999998],[-80.133620999999948,72.349716000000001],[-80.115279999999927,72.359421000000111],[-80.076400999999976,72.378859999999975],[-80.064712999999983,72.3836060000001],[-80.052215999999987,72.387771999999984],[-79.991942999999992,72.402771000000087],[-79.957229999999925,72.408325000000048],[-79.874434999999949,72.470534999999984],[-79.870834000000002,72.483046999999999],[-79.86332699999997,72.489699999999971],[-79.836944999999901,72.498596000000077],[-79.820847000000015,72.501389000000074],[-79.799164000000019,72.501389000000074],[-79.780562999999972,72.499420000000043],[-79.770844000000011,72.49664300000012],[-79.734160999999915,72.484420999999998],[-79.700561999999991,72.472488000000112],[-79.692215000000033,72.466933999999924],[-79.768638999999894,72.411766],[-79.687865999999985,72.384392000000105],[-79.595550999999944,72.334717000000126],[-79.638901000000033,72.289153999999996],[-79.668059999999912,72.280823000000112],[-79.705565999999976,72.273605000000089],[-79.720000999999968,72.269440000000088],[-79.731673999999998,72.264708999999982],[-79.759734999999921,72.250549000000092],[-79.768616000000009,72.2452550000001],[-79.774718999999891,72.239700000000028],[-79.775283999999999,72.233322000000044],[-79.769729999999925,72.225815000000125],[-79.75,72.215546000000074],[-79.732773000000009,72.212203999999986],[-79.712783999999999,72.211104999999975],[-79.701110999999969,72.215820000000008],[-79.565825999999959,72.275269000000094],[-79.485001000000011,72.325545999999974],[-79.355559999999912,72.399155000000007],[-79.342498999999975,72.40026899999998],[-79.329726999999991,72.397217000000069],[-79.243331999999953,72.374419999999986],[-79.182495000000017,72.358322000000101],[-79.146666999999979,72.345825000000104],[-79.113327000000027,72.331099999999992],[-79.082229999999925,72.313873000000001],[-79.012787000000003,72.273880000000133],[-78.945540999999935,72.199996999999996],[-78.943603999999993,72.193038999999999],[-78.946945000000028,72.186919999999986],[-79.036391999999978,72.069443000000092],[-79.136123999999938,72.007492000000127],[-79.145003999999972,72.002487000000087],[-79.156661999999983,71.997757000000036],[-79.206389999999942,71.986649000000057],[-79.229996000000028,71.980270000000019],[-79.233063000000016,71.976379000000122],[-79.203063999999983,71.961928999999998],[-79.19027699999998,71.958328000000108],[-79.176392000000021,71.955826000000059],[-79.161117999999931,71.954437000000041],[-79.138610999999912,71.955261000000007],[-79.123046999999929,71.958038000000101],[-79.099730999999963,71.967209000000082],[-79.090835999999854,71.972488000000055],[-79.072234999999921,71.974990999999989],[-79.061110999999926,71.975266000000033],[-79.026671999999962,71.970535000000098],[-78.81806899999998,71.935257000000092],[-78.768889999999999,71.92692599999998],[-78.722503999999901,71.918869000000029],[-78.683884000000035,71.909714000000008],[-78.65306099999998,71.893875000000037],[-78.639724999999999,71.884430000000009],[-78.625823999999852,71.879150000000095],[-78.585555999999997,71.865814],[-78.571395999999879,71.862762000000032],[-78.551392000000021,71.861098999999967],[-78.529174999999952,71.861649],[-78.511123999999995,71.864699999999971],[-78.503615999999965,71.868866000000082],[-78.508346999999901,71.876373000000001],[-78.595551,71.933318999999983],[-78.607498000000021,71.938583000000108],[-78.622222999999963,71.942200000000071],[-78.691375999999991,71.949707000000046],[-78.740554999999972,71.958038000000101],[-78.855559999999855,71.979706000000022],[-78.914444000000003,72.007767000000115],[-78.923614999999984,72.014999000000046],[-78.924438000000009,72.020538000000045],[-78.877486999999974,72.153320000000065],[-78.869445999999925,72.166656000000046],[-78.866104000000007,72.170532000000094],[-78.854445999999939,72.173035000000084],[-78.843613000000005,72.171097000000145],[-78.554442999999992,72.111374000000069],[-78.512221999999952,72.101089000000002],[-78.487777999999935,72.092484000000127],[-78.476105000000018,72.087204000000099],[-78.460830999999928,72.073318000000086],[-78.432770000000005,72.03804000000008],[-78.39527899999996,71.982483000000116],[-78.389998999999989,71.969437000000028],[-78.392775999999969,71.949997000000053],[-78.391678000000013,71.943587999999977],[-78.386672999999973,71.933318999999983],[-78.381942999999922,71.92804000000001],[-78.365279999999927,71.917480000000012],[-78.317779999999971,71.888321000000076],[-78.226669000000015,71.833054000000118],[-78.210830999999985,71.825821000000133],[-78.18499799999995,71.817490000000021],[-78.157607999999982,71.810577000000023],[-78.123046999999929,71.806366000000139],[-78.090560999999923,71.800812000000121],[-78.05972300000002,71.79414399999996],[-77.924437999999952,71.764709000000096],[-77.907775999999956,71.76638800000012],[-77.904448999999943,71.768051000000014],[-77.90695199999999,71.770538000000101],[-77.914169000000015,71.773605000000032],[-77.966659999999933,71.786652000000061],[-77.997498000000007,71.793319999999994],[-78.029723999999931,71.798874000000012],[-78.085830999999985,71.813309000000118],[-78.107223999999917,71.819153000000142],[-78.139998999999932,71.830551000000128],[-78.178878999999995,71.848602000000142],[-78.308884000000035,71.921096999999975],[-78.316665999999998,71.929428000000087],[-78.321395999999993,71.936920000000043],[-78.315001999999993,71.942474000000004],[-78.305266999999901,71.946930000000123],[-78.279175000000009,71.953598000000113],[-78.258895999999993,71.956650000000025],[-78.178878999999995,71.967209000000082],[-78.156951999999933,71.968323000000055],[-78.141677999999956,71.964157000000114],[-78.018616000000009,71.890823000000125],[-77.974716000000001,71.859984999999938],[-77.785552999999993,71.787490999999989],[-77.807769999999948,71.823044000000039],[-77.960006999999962,71.881653000000085],[-78.096953999999982,71.96804800000001],[-78.107223999999917,71.974152000000061],[-78.116393999999957,71.976928999999984],[-78.149733999999967,71.980545000000006],[-78.156386999999995,71.980545000000006],[-78.196105999999929,71.978592000000049],[-78.262222000000008,71.972763000000043],[-78.281386999999995,71.973877000000016],[-78.298614999999984,71.977478000000076],[-78.322509999999909,71.985809000000017],[-78.334166999999923,71.99136400000009],[-78.341110000000015,71.99859600000002],[-78.342498999999918,72.012771999999984],[-78.341674999999952,72.019149999999968],[-78.341674999999952,72.031936999999971],[-78.356948999999929,72.05831900000004],[-78.375548999999978,72.085815000000082],[-78.386672999999973,72.095534999999984],[-78.402221999999938,72.104980000000069],[-78.424437999999952,72.113602000000071],[-78.436935000000005,72.117477000000008],[-78.468886999999995,72.12414600000011],[-78.515014999999948,72.131363000000022],[-78.599990999999989,72.145263999999997],[-78.696654999999964,72.163605000000018],[-78.809998000000007,72.197205000000054],[-78.842498999999918,72.209152000000017],[-78.854720999999984,72.214432000000102],[-78.870834000000002,72.226654000000053],[-78.869155999999919,72.229706000000022],[-78.734725999999966,72.328598000000113],[-78.615829000000019,72.359146000000067],[-78.604172000000005,72.359421000000111],[-78.580565999999919,72.354156000000046],[-78.515839000000028,72.330551000000071],[-78.512511999999901,72.324432000000002],[-78.519164999999987,72.319153000000028],[-78.528335999999911,72.313873000000001],[-78.533324999999991,72.30914300000012],[-78.53694200000001,72.303314000000114],[-78.537780999999995,72.254715000000147],[-78.531386999999938,72.240265000000022],[-78.529174999999952,72.235535000000027],[-78.520843999999954,72.229155999999989],[-78.42193599999996,72.170822000000101],[-78.40834000000001,72.166382000000112],[-78.399733999999967,72.167206000000078],[-78.390839000000028,72.169982999999945],[-78.386123999999995,72.172485000000052],[-78.384170999999981,72.175537000000134],[-78.411117999999988,72.216660000000047],[-78.414718999999934,72.220535000000041],[-78.422775000000001,72.224152000000004],[-78.459732000000031,72.233871000000022],[-78.472777999999948,72.242477000000122],[-78.46833799999996,72.314986999999974],[-78.462783999999942,72.318878000000041],[-78.451110999999912,72.324158000000068],[-78.439437999999996,72.326660000000004],[-78.40834000000001,72.325821000000019],[-78.305266999999901,72.313309000000004],[-78.012512000000015,72.274994000000106],[-77.893615999999952,72.259430000000009],[-77.827498999999989,72.248596000000134],[-77.793883999999991,72.242202999999961],[-77.665282999999874,72.204712000000029],[-77.655272999999966,72.201385000000073],[-77.648620999999991,72.194137999999953],[-77.644454999999994,72.186646000000053],[-77.540833000000021,72.17692599999998],[-77.381103999999993,72.184982000000048],[-77.32417299999986,72.18609600000002],[-77.289444000000003,72.183319000000097],[-77.239989999999977,72.17442299999999],[-77.115828999999962,72.148331000000098],[-77.039443999999946,72.131653000000028],[-77.023330999999985,72.128860000000032],[-77.006118999999956,72.127472000000125],[-76.99722300000002,72.128036000000066],[-76.995833999999945,72.128860000000032],[-76.994719999999973,72.130539000000056],[-77.005004999999983,72.134430000000123],[-77.068619000000012,72.152206000000092],[-77.251677999999913,72.193313999999987],[-77.27806099999998,72.196930000000066],[-77.306945999999925,72.19802900000002],[-77.397232000000031,72.192748999999992],[-77.455840999999964,72.190811000000053],[-77.476944000000003,72.191360000000145],[-77.514175000000023,72.193862999999965],[-77.549987999999985,72.19802900000002],[-77.578888000000006,72.204163000000051],[-77.604172000000005,72.211929000000112],[-77.623885999999914,72.221100000000092],[-77.658614999999998,72.231658999999922],[-77.760833999999932,72.257217000000026],[-77.823058999999944,72.271927000000005],[-77.866104000000007,72.281097000000045],[-77.949996999999883,72.296097000000032],[-78.072509999999966,72.312485000000038],[-78.121384000000035,72.319716999999969],[-78.154723999999987,72.325545999999974],[-78.220001000000025,72.337769000000037],[-78.326950000000011,72.359146000000067],[-78.37388599999997,72.36943100000002],[-78.389175000000023,72.37303200000008],[-78.473327999999981,72.394989000000123],[-78.499161000000015,72.404709000000025],[-78.520843999999954,72.414993000000038],[-78.559158000000025,72.438034000000073],[-78.561110999999926,72.444977000000051],[-78.556655999999919,72.504440000000102],[-78.443053999999961,72.581939999999975],[-78.430556999999965,72.586655000000007],[-78.170273000000009,72.653594999999996],[-78.156386999999995,72.656937000000084],[-78.001677999999913,72.682480000000055],[-77.869994999999903,72.697479000000101],[-77.845001000000025,72.698868000000061],[-77.78083799999996,72.706940000000031],[-77.768616000000009,72.709427000000119],[-77.701401000000033,72.724701000000039],[-77.670273000000009,72.732208000000128],[-77.656951999999876,72.736099000000024],[-77.639998999999989,72.743865999999969],[-77.627486999999974,72.74859600000002],[-77.613892000000021,72.751663000000121],[-77.576401000000033,72.755554000000018],[-77.532226999999921,72.756943000000035],[-77.513625999999988,72.754715000000033],[-77.413054999999872,72.752212999999983],[-77.259734999999978,72.751663000000121],[-77.05581699999999,72.752861000000109],[-77.002501999999993,72.749419999999986],[-76.947219999999902,72.743865999999969],[-76.799728000000016,72.727478000000133],[-76.753066999999987,72.720534999999927],[-76.693053999999961,72.694702000000007],[-76.684997999999894,72.691085999999927],[-76.662505999999894,72.678588999999988],[-76.653609999999958,72.670821999999987],[-76.655272999999966,72.664429000000041],[-76.65972899999997,72.658324999999991],[-76.646118000000001,72.639708999999982],[-76.584732000000031,72.628585999999984],[-76.428328999999962,72.614151000000049],[-76.328339000000028,72.607483000000116],[-76.288329999999917,72.604980000000126],[-76.215285999999935,72.596100000000092],[-76.182219999999973,72.58998100000008],[-76.166945999999996,72.58638000000002],[-76.155562999999916,72.580826000000002],[-76.150283999999999,72.574158000000011],[-76.154723999999931,72.562485000000038],[-76.160552999999936,72.54942299999999],[-76.165833000000021,72.538315000000011],[-76.162506000000008,72.526093000000003],[-76.156112999999948,72.518051000000071],[-76.121657999999911,72.478317000000118],[-76.107773000000009,72.473037999999974],[-76.087783999999999,72.471648999999957],[-76.069457999999997,72.474991000000102],[-76.046386999999868,72.483597000000032],[-76.036941999999897,72.489426000000037],[-76.037780999999939,72.496368000000132],[-76.052215999999987,72.51138300000008],[-76.068619000000012,72.525818000000015],[-76.077224999999942,72.536377000000073],[-76.074172999999917,72.541656000000046],[-76.06471299999987,72.549988000000042],[-76.018889999999999,72.574431999999945],[-76.005843999999968,72.579163000000108],[-75.988601999999958,72.580826000000002],[-75.931945999999925,72.583603000000096],[-75.885284000000013,72.584152000000074],[-75.841948999999943,72.583053999999947],[-75.798888999999974,72.581939999999975],[-75.759170999999981,72.579163000000108],[-75.56806899999998,72.557479999999941],[-75.553328999999962,72.553589000000102],[-75.547226000000023,72.545532000000094],[-75.537780999999939,72.539703000000088],[-75.521117999999888,72.536102000000028],[-75.472228999999913,72.527480999999966],[-75.435271999999998,72.522491000000059],[-75.379439999999931,72.51638800000012],[-75.360001000000011,72.515548999999965],[-75.301666000000012,72.509720000000129],[-75.231673999999998,72.500549000000035],[-75.215285999999878,72.497482000000105],[-75.192490000000021,72.491928000000087],[-75.186661000000015,72.487488000000099],[-75.189163000000008,72.478317000000118],[-75.199158000000011,72.466933999999924],[-75.200287000000003,72.461929000000055],[-75.160277999999948,72.421097000000088],[-75.132492000000013,72.393600000000106],[-75.054169000000002,72.328873000000101],[-75.034164000000033,72.317490000000134],[-75,72.298369999999977],[-74.980559999999912,72.288315000000068],[-74.950835999999981,72.269989000000066],[-74.943603999999993,72.263321000000076],[-74.942490000000021,72.255829000000119],[-74.947494999999947,72.249710000000107],[-75.044997999999964,72.188308999999947],[-75.068068999999923,72.179152999999985],[-75.225280999999995,72.122482000000105],[-75.238326999999913,72.118317000000104],[-75.25306699999993,72.116378999999938],[-75.271666999999979,72.117203000000075],[-75.291381999999885,72.119431000000077],[-75.323623999999938,72.125534000000016],[-75.387511999999901,72.134430000000123],[-75.440552000000025,72.141098000000113],[-75.477782999999988,72.144714000000135],[-75.520003999999972,72.146102999999982],[-75.607498000000021,72.143326000000059],[-75.710006999999962,72.136658000000068],[-75.73332199999993,72.134155000000078],[-75.813889000000017,72.122482000000105],[-75.866652999999985,72.113876000000005],[-76.015015000000005,72.086655000000121],[-76.033324999999934,72.081100000000049],[-76.054717999999866,72.073043999999982],[-76.078063999999983,72.059417999999994],[-76.084166999999923,72.049713000000111],[-76.09973100000002,72.02887000000004],[-76.111938000000009,72.018050999999957],[-76.128052000000025,72.004166000000055],[-76.142226999999934,71.99331699999999],[-76.156386999999881,71.985260000000039],[-76.173614999999984,71.975540000000137],[-76.192490000000021,71.967758000000003],[-76.234726000000023,71.957488999999953],[-76.262511999999901,71.949707000000046],[-76.274445000000014,71.944427000000132],[-76.301665999999955,71.930542000000059],[-76.318344000000025,71.919983000000002],[-76.348052999999879,71.891662999999994],[-76.31082200000003,71.884720000000016],[-76.089721999999938,71.978867000000093],[-76.073058999999944,71.989425999999924],[-76.063323999999966,72],[-76.049727999999902,72.017761000000121],[-76.047501000000011,72.023604999999975],[-76.043609999999944,72.030272999999966],[-76.029448999999943,72.041091999999992],[-76.019729999999981,72.046097000000032],[-75.998610999999983,72.054152999999928],[-75.956115999999952,72.067215000000147],[-75.89445499999988,72.082214000000022],[-75.828338999999971,72.096939000000134],[-75.796660999999915,72.103591999999935],[-75.710555999999997,72.113312000000008],[-75.630554000000018,72.11970500000001],[-75.586120999999991,72.12164300000012],[-75.528335999999967,72.120818999999983],[-75.488051999999925,72.118866000000025],[-75.433060000000012,72.112761999999975],[-75.23332199999993,72.084152000000131],[-75.226105000000018,72.080276000000083],[-75.219451999999876,72.074432000000058],[-75.218886999999995,72.070267000000058],[-75.221114999999998,72.064696999999967],[-75.228881999999942,72.059143000000006],[-75.255279999999914,72.046097000000032],[-75.281676999999888,72.038589000000059],[-75.317504999999926,72.031661999999926],[-75.338332999999977,72.02887000000004],[-75.404174999999952,72.025543000000084],[-75.449432000000002,72.02526899999998],[-75.494155999999975,72.021378000000084],[-75.515015000000005,72.018326000000002],[-75.548049999999989,72.011107999999979],[-75.574172999999917,72.00360100000006],[-75.586670000000026,71.999146000000053],[-75.606383999999935,71.989425999999924],[-75.613892000000021,71.983871000000022],[-75.618880999999988,71.978592000000049],[-75.686661000000015,71.883040999999992],[-75.697495000000004,71.858322000000044],[-75.691375999999877,71.850266000000147],[-75.688048999999921,71.842758000000117],[-75.6875,71.839157000000057],[-75.692215000000033,71.833328000000051],[-75.802490000000034,71.750548999999978],[-75.830001999999979,71.736649000000114],[-75.872222999999906,71.721375000000023],[-75.898345999999947,71.714432000000045],[-75.934157999999968,71.711105000000089],[-75.953612999999962,71.710266000000104],[-75.997497999999894,71.709152000000131],[-76.040282999999931,71.709426999999948],[-76.067504999999869,71.706650000000081],[-76.079177999999956,71.704437000000098],[-76.090835999999911,71.702208999999982],[-76.096114999999998,71.697479000000101],[-76.095839999999953,71.693863000000079],[-76.085281000000009,71.691924999999912],[-75.901671999999962,71.701096000000064],[-75.880279999999971,71.70248400000014],[-75.846953999999982,71.708602999999982],[-75.819457999999941,71.716934000000094],[-75.794998000000021,71.725815000000011],[-75.787215999999944,71.730545000000063],[-75.675003000000004,71.810532000000023],[-75.654998999999975,71.826096000000121],[-75.580001999999865,71.906097000000045],[-75.570281999999963,71.917480000000012],[-75.565825999999959,71.929703000000075],[-75.567229999999938,71.937485000000038],[-75.570281999999963,71.941360000000032],[-75.574447999999961,71.953048999999965],[-75.571944999999971,71.958878000000141],[-75.569167999999991,71.963882000000126],[-75.558334000000002,71.97665400000011],[-75.538605000000018,71.986374000000012],[-75.513335999999924,71.995254999999986],[-75.498046999999929,71.999146000000053],[-75.476669000000015,72.000823999999966],[-75.414444000000003,71.999709999999993],[-75.371932999999899,71.997757000000036],[-75.349441999999897,71.998032000000023],[-75.327788999999939,71.999419999999986],[-75.24888599999997,72.012771999999984],[-75.197768999999937,72.023315000000139],[-75.174437999999952,72.031936999999971],[-75.158614999999941,72.041655999999932],[-75.150283999999942,72.0577550000001],[-75.135009999999966,72.080551000000071],[-75.129990000000021,72.086380000000133],[-75.119155999999862,72.096375000000023],[-75.109160999999858,72.101089000000002],[-75.093613000000005,72.10803199999998],[-75.081389999999942,72.11303700000002],[-75.051392000000021,72.121917999999937],[-75.035827999999924,72.125809000000004],[-75.012511999999958,72.12831100000011],[-75,72.128525000000025],[-74.98443599999996,72.127472000000125],[-74.951675000000023,72.123306000000071],[-74.835006999999962,72.10386699999998],[-74.801391999999964,72.098327999999981],[-74.764449999999954,72.094711000000018],[-74.65943900000002,72.091094999999939],[-74.625548999999921,72.091369999999984],[-74.535278000000005,72.089705999999978],[-74.316390999999953,72.082214000000022],[-74.297226000000023,72.080826000000116],[-74.260009999999966,72.076096000000064],[-74.244155999999862,72.073043999999982],[-74.233321999999987,72.067489999999964],[-74.218062999999972,72.058029000000033],[-74.177489999999921,72.031936999999971],[-74.122222999999963,71.983597000000088],[-74.117766999999958,71.969985999999949],[-74.119445999999982,71.955826000000059],[-74.166107000000011,71.874695000000088],[-74.171111999999937,71.868591000000038],[-74.184998000000007,71.855819999999937],[-74.229996000000028,71.822768999999994],[-74.243056999999965,71.818603999999993],[-74.263335999999981,71.815810999999997],[-74.403060999999923,71.80386400000009],[-74.43998699999986,71.801925999999924],[-74.460555999999997,71.802765000000079],[-74.477782999999931,71.804977000000122],[-74.50140399999998,71.809708000000057],[-74.513625999999874,71.818053999999961],[-74.570557000000008,71.809418000000051],[-74.604996000000028,71.784714000000122],[-74.678328999999962,71.745254999999986],[-74.696105999999929,71.738586000000112],[-74.71362299999987,71.735260000000096],[-74.885009999999909,71.708602999999982],[-75,71.711914000000036],[-75.046660999999915,71.716095000000109],[-75.090560999999923,71.718048000000067],[-75.136672999999973,71.716934000000094],[-75.158051,71.715271000000143],[-75.342772999999909,71.695815999999979],[-75.363892000000021,71.691360000000088],[-75.378600999999946,71.686920000000043],[-75.389998999999989,71.681091000000038],[-75.393889999999942,71.677475000000015],[-75.391953000000001,71.674698000000092],[-75.385009999999909,71.674423000000104],[-75.241942999999878,71.686096000000077],[-75.178329000000019,71.694138000000066],[-75.085007000000019,71.700821000000076],[-75.043610000000001,71.699707000000046],[-75.025008999999955,71.698029000000133],[-75.009170999999924,71.694977000000051],[-74.941101000000003,71.674698000000092],[-74.934158000000025,71.670822000000044],[-74.93360899999999,71.663879000000009],[-74.93638599999997,71.658035000000041],[-74.945540999999935,71.652481000000023],[-74.956115999999952,71.648331000000042],[-75.008895999999993,71.631927000000076],[-75.055557000000022,71.622481999999991],[-75.114166000000012,71.611098999999967],[-75.194152999999972,71.595535000000098],[-75.206954999999994,71.591934000000037],[-75.398345999999947,71.525269000000094],[-75.40972899999997,71.519714000000022],[-75.408339999999953,71.514708999999982],[-75.406386999999938,71.512207000000046],[-75.402221999999938,71.512497000000053],[-75.205276000000026,71.546371000000079],[-75,71.607238999999993],[-74.861114999999927,71.649429000000112],[-74.851668999999958,71.654984000000013],[-74.799437999999952,71.678863999999976],[-74.784163999999976,71.682755000000043],[-74.718337999999903,71.693588000000034],[-74.697768999999937,71.696365000000128],[-74.686661000000015,71.696365000000128],[-74.672774999999945,71.692474000000061],[-74.631942999999978,71.662491000000102],[-74.629714999999919,71.65277100000003],[-74.631942999999978,71.646378000000084],[-74.646392999999989,71.631927000000076],[-74.674437999999896,71.608322000000101],[-74.689712999999983,71.598038000000031],[-74.704726999999934,71.588042999999971],[-74.713057999999933,71.583878000000141],[-74.733886999999982,71.575546000000145],[-74.811934999999949,71.547760000000096],[-74.869720000000029,71.541656000000046],[-74.922500999999897,71.53776600000009],[-74.940276999999867,71.538040000000024],[-74.97084000000001,71.537201000000039],[-74.990279999999984,71.536652000000117],[-75,71.535583000000088],[-75.027221999999995,71.532486000000006],[-75.036666999999966,71.530548000000067],[-75.081389999999942,71.515273999999977],[-75.107773000000009,71.503052000000025],[-75.124709999999936,71.492477000000065],[-75.15194699999995,71.471649000000014],[-75.152221999999995,71.466094999999996],[-75.146117999999944,71.463608000000079],[-75.12777699999998,71.465820000000008],[-75.115554999999972,71.469986000000063],[-75.106110000000001,71.481934000000081],[-75.093886999999938,71.49275200000011],[-75.084731999999974,71.498322000000144],[-75.06138599999997,71.506378000000041],[-75.05082699999997,71.509720000000016],[-75.033324999999934,71.513046000000031],[-75,71.517899000000114],[-74.993056999999908,71.518875000000037],[-74.944153000000028,71.521652000000131],[-74.877486999999974,71.524155000000121],[-74.857223999999974,71.523605000000089],[-74.838332999999921,71.521926999999948],[-74.828338999999971,71.517211999999915],[-74.71665999999999,71.419144000000131],[-74.699431999999945,71.390823000000069],[-74.700561999999934,71.386658000000068],[-74.705565999999976,71.380814000000044],[-74.715285999999992,71.375809000000004],[-74.888335999999981,71.287201000000096],[-75.075012000000015,71.204437000000041],[-75.081389999999942,71.17942800000003],[-75.065001999999993,71.180817000000047],[-75,71.199341000000061],[-74.987503000000004,71.203873000000101],[-74.874160999999958,71.247756999999979],[-74.864440999999943,71.252487000000031],[-74.671660999999972,71.359985000000052],[-74.654448999999943,71.370254999999986],[-74.637511999999958,71.380538999999999],[-74.632216999999969,71.385818000000029],[-74.628051999999968,71.392487000000074],[-74.625823999999852,71.39888000000002],[-74.626098999999954,71.405822999999998],[-74.631103999999993,71.419433999999967],[-74.638061999999991,71.426651000000106],[-74.646956999999929,71.433044000000052],[-74.657227000000034,71.438583000000051],[-74.719726999999978,71.462494000000106],[-74.726944000000003,71.466094999999996],[-74.735549999999989,71.472487999999942],[-74.736388999999974,71.476654000000053],[-74.743057000000022,71.511932000000058],[-74.73611499999987,71.530548000000067],[-74.723891999999978,71.541931000000091],[-74.714172000000019,71.546646000000123],[-74.701675000000023,71.551086000000112],[-74.686385999999914,71.554977000000008],[-74.663895000000025,71.557204999999954],[-74.628875999999934,71.554703000000075],[-74.619995000000017,71.55802900000009],[-74.583618000000001,71.585815000000025],[-74.576401000000033,71.591370000000097],[-74.543883999999991,71.631362999999965],[-74.381942999999922,71.677199999999971],[-74.345550999999944,71.689423000000033],[-74.335555999999997,71.694138000000066],[-74.317779999999971,71.704437000000098],[-74.309432999999956,71.712204000000042],[-74.306945999999982,71.71775800000006],[-74.299437999999952,71.723877000000073],[-74.288604999999905,71.727478000000133],[-74.268341000000021,71.730270000000019],[-74.146956999999929,71.738875999999948],[-74.12470999999988,71.738875999999948],[-74.109160999999972,71.735809000000017],[-74.103058000000033,71.733321999999987],[-74.097777999999948,71.72886699999998],[-74.123885999999914,71.680817000000104],[-74.128875999999877,71.67164600000001],[-74.142226999999991,71.661652000000004],[-74.15055799999999,71.657486000000063],[-74.173049999999989,71.651093000000117],[-74.202788999999996,71.645828000000051],[-74.220276000000013,71.641663000000051],[-74.232773000000009,71.637496999999939],[-74.239440999999999,71.634155000000021],[-74.24888599999997,71.621643000000063],[-74.253066999999987,71.611649],[-74.254455999999948,71.60664399999996],[-74.254729999999995,71.603867000000093],[-74.252228000000002,71.58998100000008],[-74.249161000000015,71.582489000000123],[-74.243056999999965,71.569716999999969],[-74.218886999999938,71.556641000000013],[-74.180282999999974,71.538315000000011],[-74.168334999999956,71.533324999999991],[-74.156386999999995,71.532211000000018],[-74.150283999999886,71.533324999999991],[-74.148620999999935,71.537491000000045],[-74.151671999999962,71.544983000000002],[-74.165008999999998,71.555252000000053],[-74.146118000000001,71.637496999999939],[-74.039718999999934,71.722213999999951],[-74.019164999999987,71.73803700000002],[-74.014724999999942,71.741089000000102],[-73.996947999999975,71.751389000000017],[-73.977782999999931,71.759720000000129],[-73.964447000000007,71.763321000000019],[-73.928329000000019,71.769150000000025],[-73.748046999999929,71.776931999999988],[-73.718886999999938,71.776931999999988],[-73.61610399999995,71.773315000000025],[-73.604172000000005,71.772217000000126],[-73.593886999999995,71.769988999999953],[-73.589721999999995,71.763321000000019],[-73.589995999999985,71.756943000000035],[-73.591675000000009,71.751937999999996],[-73.598343,71.738312000000008],[-73.612503000000004,71.722213999999951],[-73.619995000000017,71.716095000000109],[-73.638061999999991,71.706375000000037],[-73.663329999999917,71.697204999999997],[-73.694442999999922,71.690262000000018],[-73.732772999999952,71.683868000000132],[-73.771117999999944,71.670822000000044],[-73.791381999999999,71.661102000000142],[-73.890839000000028,71.609421000000054],[-73.985549999999989,71.534149000000127],[-73.990279999999927,71.527480999999966],[-74.010833999999988,71.491363999999976],[-74.095275999999956,71.46276899999998],[-74.169997999999964,71.445816000000036],[-74.303878999999995,71.419433999999967],[-74.315826000000015,71.414429000000098],[-74.319167999999877,71.409424000000058],[-74.312209999999993,71.40554800000001],[-74.297226000000023,71.405822999999998],[-74.191665999999998,71.425537000000134],[-74.159163999999919,71.4327550000001],[-74.121384000000035,71.438583000000051],[-74.083617999999944,71.441086000000041],[-74.045836999999949,71.440810999999997],[-74.028610000000015,71.437759000000085],[-74.063889000000017,71.336929000000055],[-74.091675000000009,71.285537999999974],[-74.106383999999878,71.274704000000099],[-74.137787000000003,71.255828999999949],[-74.152221999999995,71.248032000000023],[-74.187774999999931,71.229430999999977],[-74.207503999999858,71.219711000000075],[-74.217223999999931,71.214996000000042],[-74.226669000000015,71.212203999999986],[-74.238327000000027,71.203873000000101],[-74.240829000000019,71.200821000000133],[-74.235000999999897,71.198317999999972],[-74.228881999999942,71.199416999999983],[-74.217772999999966,71.202209000000039],[-74.190825999999959,71.211104999999975],[-74.158339999999953,71.223877000000016],[-74.148055999999997,71.228592000000049],[-74.118332000000009,71.24331699999999],[-74.039444000000003,71.302199999999971],[-74.009444999999971,71.360809000000017],[-74.006957999999997,71.367203000000075],[-73.973327999999924,71.413605000000132],[-73.968612999999891,71.419433999999967],[-73.867767000000015,71.525818000000015],[-73.86221299999994,71.531096999999988],[-73.761672999999973,71.580826000000059],[-73.746947999999975,71.585266000000047],[-73.732772999999952,71.586928999999998],[-73.689162999999951,71.588042999999971],[-73.653610000000015,71.587493999999992],[-73.639724999999942,71.58638000000002],[-73.621932999999956,71.583328000000108],[-73.595000999999968,71.575272000000041],[-73.588608000000022,71.572220000000129],[-73.565001999999936,71.55192599999998],[-73.566665999999941,71.544144000000017],[-73.598343,71.528320000000122],[-73.615554999999915,71.520264000000054],[-73.619445999999982,71.515823000000125],[-73.630279999999971,71.456649999999911],[-73.635009999999909,71.359421000000111],[-73.622498000000007,71.356644000000017],[-73.61332699999997,71.355820000000051],[-73.594727000000034,71.35775799999999],[-73.540389999999945,71.37286400000005],[-73.518889999999942,71.379150000000038],[-73.517226999999934,71.379974000000004],[-73.516112999999962,71.385818000000029],[-73.515563999999927,71.39888000000002],[-73.513335999999981,71.413040000000137],[-73.50306699999993,71.424698000000149],[-73.496947999999918,71.428589000000045],[-73.477492999999924,71.436371000000008],[-73.446945000000028,71.440262000000075],[-73.428878999999995,71.435806000000127],[-73.384445000000028,71.391937000000041],[-73.380279999999914,71.385269000000051],[-73.385009999999966,71.381927000000132],[-73.500899999999945,71.337212000000022],[-73.590285999999935,71.304977000000065],[-73.615554999999915,71.296371000000136],[-73.623046999999872,71.291091999999992],[-73.635558999999944,71.279709000000139],[-73.663054999999986,71.254166000000055],[-73.678878999999995,71.238037000000077],[-73.712783999999999,71.177765000000136],[-73.717772999999966,71.164993000000095],[-73.718886999999938,71.159424000000115],[-73.716399999999965,71.14498900000001],[-73.713622999999984,71.137497000000053],[-73.713622999999984,71.130539000000056],[-73.71665999999999,71.118317000000104],[-73.728606999999954,71.098602000000085],[-73.735824999999977,71.093323000000112],[-73.745833999999888,71.088593000000117],[-73.760833999999932,71.084717000000012],[-73.77806099999998,71.0816650000001],[-73.797774999999945,71.078872999999987],[-73.842498999999918,71.074432000000115],[-73.87388599999997,71.069717000000082],[-73.890288999999996,71.064987000000031],[-73.898346000000004,71.057480000000112],[-73.895003999999972,71.052200000000028],[-73.886672999999973,71.049149],[-73.879439999999875,71.047759999999982],[-73.872771999999998,71.047484999999995],[-73.850554999999986,71.059981999999991],[-73.842223999999987,71.064148000000046],[-73.753066999999987,71.065810999999997],[-73.732772999999952,71.067764000000125],[-73.715835999999854,71.071655000000021],[-73.692764000000011,71.079436999999984],[-73.674438000000009,71.088318000000072],[-73.667220999999984,71.093597000000045],[-73.660552999999993,71.10386699999998],[-73.658339999999953,71.124985000000095],[-73.662505999999951,71.134995000000004],[-73.666655999999875,71.141662999999994],[-73.673614999999927,71.163039999999967],[-73.668883999999991,71.173035000000084],[-73.623610999999983,71.225540000000137],[-73.615829000000019,71.230270000000132],[-73.549164000000019,71.269989000000066],[-73.454726999999991,71.300262000000032],[-73.433884000000035,71.308594000000028],[-73.42860399999995,71.314423000000033],[-73.427779999999984,71.327208999999925],[-73.435271999999941,71.332214000000022],[-73.437774999999988,71.336380000000077],[-73.436110999999983,71.340545999999961],[-73.430282999999974,71.34165999999999],[-73.382216999999969,71.345260999999994],[-73.363051999999982,71.345824999999991],[-73.349730999999963,71.345260999999994],[-73.320847000000015,71.340820000000122],[-73.083617999999944,71.285812000000078],[-73.061110999999983,71.277481000000023],[-73.049437999999952,71.268325999999945],[-73.053878999999938,71.261658000000011],[-73.065001999999936,71.258331000000055],[-73.155562999999972,71.246643000000006],[-73.214721999999995,71.240814],[-73.230835000000013,71.238312000000121],[-73.249434999999949,71.233871000000022],[-73.266113000000018,71.224990999999989],[-73.271941999999854,71.220535000000041],[-73.263061999999991,71.205826000000002],[-73.252501999999936,71.195251000000098],[-73.244445999999982,71.188873000000115],[-73.235001000000011,71.173309000000017],[-73.235001000000011,71.162201000000039],[-73.238327000000027,71.157210999999961],[-73.247771999999998,71.144150000000025],[-73.256957999999884,71.133881000000031],[-73.294448999999929,71.092483999999956],[-73.311110999999926,71.080826000000116],[-73.327788999999996,71.072768999999994],[-73.379439999999988,71.05831900000004],[-73.426391999999908,71.047759999999982],[-73.446105999999986,71.041092000000049],[-73.450835999999924,71.035263000000043],[-73.451950000000011,71.029433999999981],[-73.446945000000028,71.024993999999992],[-73.377486999999917,70.980545000000006],[-73.369995000000017,70.985809000000017],[-73.17361499999987,71.156937000000028],[-73.168610000000001,71.170532000000094],[-73.177490000000034,71.185257000000036],[-73.183060000000012,71.191360000000032],[-73.188048999999978,71.199141999999938],[-73.185271999999998,71.205826000000002],[-73.180283000000031,71.211655000000007],[-73.172226000000023,71.216385000000059],[-73.142226999999934,71.224425999999937],[-73.115554999999915,71.230270000000132],[-73.101395000000025,71.231658999999979],[-73.079726999999991,71.231658999999979],[-73.067779999999857,71.230270000000132],[-73.045546999999885,71.225540000000137],[-73.027221999999881,71.227203000000031],[-73.011947999999961,71.234421000000054],[-73.004455999999948,71.239700000000028],[-72.99499499999996,71.249999999999943],[-72.981673999999941,71.267487000000017],[-72.952788999999996,71.311096000000077],[-72.951400999999976,71.316085999999984],[-72.959731999999974,71.355820000000051],[-72.963622999999927,71.362488000000042],[-72.970001000000025,71.369979999999998],[-72.978332999999907,71.376373000000115],[-72.989440999999999,71.391663000000108],[-72.993057000000022,71.397766000000047],[-72.993331999999953,71.401931999999931],[-72.988892000000021,71.40554800000001],[-72.975829999999917,71.40914900000007],[-72.897232000000031,71.416655999999989],[-72.858046999999942,71.413315000000125],[-72.836394999999925,71.413315000000125],[-72.765839000000028,71.423874000000012],[-72.759170999999924,71.426926000000094],[-72.757507000000032,71.431931000000134],[-72.758621000000005,71.437484999999981],[-72.764724999999942,71.451660000000061],[-72.76916499999993,71.459152000000017],[-72.679992999999911,71.524704000000042],[-72.649733999999967,71.536926000000051],[-72.61860699999994,71.559418000000107],[-72.61332699999997,71.565536000000066],[-72.610274999999888,71.571930000000123],[-72.608337000000006,71.583878000000141],[-72.61082499999992,71.595535000000098],[-72.608337000000006,71.60664399999996],[-72.593886999999995,71.642487000000017],[-72.583327999999881,71.651382000000069],[-72.580291999999929,71.653594999999996],[-72.573333999999932,71.656647000000135],[-72.557495000000017,71.660262999999986],[-72.538054999999929,71.660812000000135],[-72.523620999999991,71.65887500000008],[-72.503066999999874,71.65026899999998],[-72.474715999999944,71.642761000000121],[-72.444442999999978,71.636107999999979],[-72.301102000000014,71.612198000000149],[-72.152221999999938,71.58998100000008],[-71.847777999999948,71.546646000000123],[-71.689437999999996,71.524429000000055],[-71.670546999999999,71.522216999999955],[-71.635559000000001,71.517761000000064],[-71.58555599999994,71.509995000000004],[-71.554169000000002,71.503875999999991],[-71.455275999999913,71.473037999999974],[-71.444442999999922,71.468597000000045],[-71.435271999999998,71.463608000000079],[-71.295546999999942,71.384720000000129],[-71.241378999999995,71.349425999999994],[-71.12332200000003,71.271652000000017],[-71.119719999999973,71.264160000000061],[-71.122771999999998,71.257217000000082],[-71.128601000000003,71.251389000000131],[-71.147780999999952,71.241927999999973],[-71.169448999999986,71.233322000000044],[-71.206116000000009,71.220535000000041],[-71.221389999999985,71.216934000000037],[-71.234726000000023,71.212769000000037],[-71.324722000000008,71.177765000000136],[-71.340560999999866,71.170532000000094],[-71.342772999999909,71.166382000000112],[-71.346114999999941,71.155823000000055],[-71.349441999999897,71.149428999999998],[-71.415832999999907,71.093323000000112],[-71.452224999999999,71.068054000000132],[-71.46444699999995,71.062484999999981],[-71.470275999999956,71.061370999999951],[-71.48971599999993,71.0619200000001],[-71.551102000000014,71.064697000000024],[-71.608336999999949,71.068603999999993],[-71.640839000000028,71.073883000000137],[-71.714447000000007,71.088043000000084],[-71.812499999999943,71.104156000000103],[-71.848891999999921,71.108321999999987],[-71.868880999999874,71.109420999999998],[-71.890288999999882,71.109420999999998],[-71.910827999999924,71.107758000000047],[-72.069457999999997,71.075271999999984],[-72.08555599999994,71.070267000000115],[-72.09973100000002,71.063873000000058],[-72.110275000000001,71.052200000000028],[-72.113892000000021,71.047211000000061],[-72.114440999999999,71.043594000000098],[-72.113326999999913,71.037490999999989],[-72.107223999999974,71.030272999999966],[-72.09973100000002,71.020263999999941],[-72.101944000000003,71.016098000000056],[-72.165557999999919,70.968048000000067],[-72.179717999999923,70.962204000000042],[-72.200286999999946,70.961105000000032],[-72.235001000000011,70.961928999999998],[-72.261123999999995,70.959152000000131],[-72.27806099999998,70.955261000000064],[-72.290557999999976,70.951096000000064],[-72.297226000000023,70.947204999999997],[-72.317504999999983,70.930267000000072],[-72.319457999999997,70.925812000000064],[-72.317504999999983,70.918320000000108],[-72.31138599999997,70.911102000000085],[-72.313889000000017,70.899719000000061],[-72.320557000000008,70.888321000000076],[-72.325561999999877,70.882477000000051],[-72.334166999999979,70.878585999999984],[-72.514724999999999,70.844436999999971],[-72.534438999999907,70.841933999999981],[-72.653609999999958,70.82777400000009],[-72.654174999999896,70.820831000000112],[-72.511397999999872,70.827209000000039],[-72.476944000000003,70.833328000000051],[-72.401108000000022,70.849716000000114],[-72.356110000000001,70.860535000000027],[-72.302779999999927,70.867203000000018],[-72.264175000000023,70.866652999999985],[-72.25,70.863876000000062],[-72.184722999999963,70.844711000000075],[-72.172225999999966,70.840546000000074],[-72.16361999999998,70.83638000000002],[-72.162215999999887,70.829987000000017],[-72.363327000000027,70.686096000000134],[-72.381942999999978,70.677200000000028],[-72.459441999999967,70.65387000000004],[-72.475829999999917,70.649429000000112],[-72.499435000000005,70.646652000000017],[-72.542496000000028,70.644714000000079],[-72.578063999999983,70.641373000000044],[-72.597778000000005,70.63859599999995],[-72.609160999999972,70.636658000000011],[-72.615828999999962,70.633331000000055],[-72.623321999999973,70.628036000000009],[-72.569457999999884,70.609985000000052],[-72.551666000000012,70.608032000000094],[-72.503066999999874,70.629973999999947],[-72.490554999999972,70.634155000000021],[-72.371932999999956,70.654984000000013],[-72.342223999999931,70.662200999999925],[-72.326110999999912,70.667206000000022],[-72.306380999999988,70.677475000000015],[-72.277495999999871,70.698028999999963],[-72.264724999999942,70.70915199999996],[-72.248610999999983,70.726653999999996],[-72.245834000000002,70.733046999999999],[-72.236937999999896,70.743866000000025],[-72.229172000000005,70.749420000000043],[-72.210555999999997,70.758040999999935],[-72.185546999999929,70.76638800000012],[-72.155838000000017,70.773605000000032],[-72.136123999999995,70.776093000000003],[-72.004729999999995,70.786925999999994],[-71.896956999999929,70.80693100000002],[-71.818893000000003,70.823044000000039],[-71.689163000000008,70.850266000000147],[-71.543883999999991,70.872481999999991],[-71.354445999999939,70.882750999999985],[-71.287506000000008,70.906097000000045],[-71.289169000000015,70.908875000000023],[-71.289444000000003,70.913605000000075],[-71.208343999999954,71.004990000000078],[-71.185546999999872,71.019439999999975],[-71.162216000000001,71.028320000000008],[-70.895553999999947,71.099716000000058],[-70.836120999999935,71.114426000000037],[-70.799727999999959,71.118866000000025],[-70.771666999999979,71.118042000000059],[-70.755568999999923,71.11554000000001],[-70.724715999999944,71.10443099999992],[-70.635559000000001,71.072220000000016],[-70.613891999999964,71.062194999999917],[-70.604720999999927,71.056366000000082],[-70.601669000000015,71.053864000000033],[-70.591949,71.042480000000126],[-70.514724999999942,70.940536000000066],[-70.512511999999958,70.926085999999998],[-70.514450000000011,70.921097000000032],[-70.519729999999981,70.913879000000009],[-70.553604000000007,70.894989000000066],[-70.58944699999995,70.876083000000051],[-70.678878999999995,70.840546000000074],[-70.740828999999906,70.75471500000009],[-70.746947999999918,70.745529000000147],[-70.773330999999985,70.734420999999998],[-70.798888999999917,70.725540000000024],[-70.872498000000007,70.703872999999987],[-70.891112999999962,70.698868000000118],[-70.965835999999967,70.684143000000006],[-71.024445000000014,70.674987999999928],[-71.055267000000015,70.669144000000131],[-71.08277899999996,70.661652000000004],[-71.100554999999929,70.654984000000013],[-71.108611999999994,70.649993999999992],[-71.118056999999965,70.638885000000073],[-71.128051999999968,70.62052900000009],[-71.129439999999988,70.614151000000106],[-71.134445000000028,70.602767999999912],[-71.139998999999932,70.596374999999966],[-71.147780999999952,70.591095000000109],[-71.160277999999948,70.586928999999998],[-71.175277999999992,70.583602999999982],[-71.191665999999998,70.58248900000001],[-71.224715999999944,70.582214000000135],[-71.281676999999888,70.584152000000074],[-71.312499999999943,70.587204000000042],[-71.34584000000001,70.591660000000104],[-71.389724999999942,70.600540000000137],[-71.407501000000025,70.603043000000127],[-71.422775000000001,70.604980000000012],[-71.461944999999957,70.60775799999999],[-71.558608999999933,70.609421000000111],[-71.592772999999966,70.606934000000024],[-71.595550999999944,70.603867000000093],[-71.595839999999953,70.600540000000137],[-71.592498999999918,70.589706000000092],[-71.586670000000026,70.581665000000044],[-71.583892999999932,70.576096000000007],[-71.580291999999986,70.564697000000137],[-71.581954999999994,70.551376000000005],[-71.583618000000001,70.546371000000136],[-71.588057999999933,70.542755000000056],[-71.74360699999994,70.466933999999981],[-71.803054999999972,70.428314000000057],[-71.763061999999934,70.427200000000084],[-71.748046999999985,70.425811999999951],[-71.736389000000031,70.423035000000084],[-71.727218999999991,70.417479999999955],[-71.728058000000033,70.410538000000088],[-71.731673999999998,70.397217000000126],[-71.746384000000035,70.3477630000001],[-71.75556899999998,70.329162999999994],[-71.763061999999934,70.323318000000086],[-71.783065999999963,70.313873000000001],[-71.816665999999941,70.303040000000067],[-71.844161999999983,70.29664600000001],[-71.849730999999906,70.290817000000004],[-71.836944999999957,70.289978000000019],[-71.806945999999868,70.295822000000044],[-71.748046999999985,70.309708000000001],[-71.733611999999937,70.313873000000001],[-71.686385999999914,70.355820000000108],[-71.674712999999997,70.36970500000001],[-71.641678000000013,70.444977000000108],[-71.640288999999996,70.450546000000088],[-71.543335000000013,70.514708999999982],[-71.525283999999942,70.524704000000099],[-71.510009999999966,70.535812000000078],[-71.502501999999936,70.546096999999975],[-71.50167799999997,70.55304000000001],[-71.503341999999975,70.56053199999991],[-71.507506999999976,70.569153000000028],[-71.511672999999973,70.573318000000029],[-71.506957999999941,70.57638500000013],[-71.495543999999938,70.578873000000101],[-71.435271999999998,70.578598000000113],[-71.420273000000009,70.57748400000014],[-71.397781000000009,70.574432000000002],[-71.25306699999993,70.549713000000054],[-71.184998000000007,70.538040000000024],[-71.17582699999997,70.535812000000078],[-71.170272999999952,70.533324999999991],[-71.167769999999905,70.531937000000084],[-71.162506000000008,70.525269000000094],[-71.162216000000001,70.520537999999988],[-71.260558999999887,70.377762000000132],[-71.322509999999966,70.312759000000028],[-71.321670999999981,70.30664100000007],[-71.318343999999968,70.299988000000099],[-71.301101999999958,70.284987999999998],[-71.288894999999968,70.280822999999998],[-71.279998999999975,70.274993999999936],[-71.276947000000007,70.268326000000002],[-71.278335999999854,70.262771999999984],[-71.285278000000005,70.251388999999961],[-71.289169000000015,70.246094000000085],[-71.316955999999948,70.218596999999988],[-71.363051999999868,70.182204999999954],[-71.43472300000002,70.126923000000033],[-71.485275000000001,70.088318000000072],[-71.498046999999929,70.080551000000128],[-71.523055999999997,70.052200000000028],[-71.532776000000013,70.038589000000059],[-71.539168999999958,70.026382000000126],[-71.541107000000011,70.022217000000126],[-71.535827999999924,70.019714000000135],[-71.52806099999998,70.020263999999997],[-71.518065999999976,70.024993999999992],[-71.500290000000007,70.038315000000125],[-71.493606999999997,70.050537000000134],[-71.475829999999974,70.068054000000132],[-71.438048999999978,70.086655000000007],[-71.393616000000009,70.104430999999977],[-71.366652999999985,70.111923000000104],[-71.331680000000006,70.128585999999984],[-71.210555999999997,70.262206999999933],[-71.208892999999989,70.267761000000121],[-71.21305799999999,70.272491000000002],[-71.218886999999995,70.276382000000069],[-71.229720999999984,70.281097000000102],[-71.231948999999929,70.294983000000059],[-71.171660999999972,70.368042000000059],[-71.135833999999932,70.410538000000088],[-71.093062999999972,70.460541000000035],[-71.030563000000029,70.540543000000014],[-71.049987999999928,70.546371000000136],[-71.053054999999972,70.55304000000001],[-71.049438000000009,70.558868000000075],[-71.005843999999968,70.61692800000003],[-70.997222999999963,70.625808999999947],[-70.968886999999995,70.63220200000012],[-70.913054999999986,70.637771999999984],[-70.771117999999944,70.668869000000086],[-70.611937999999952,70.723602000000085],[-70.421660999999858,70.772217000000126],[-70.396956999999986,70.778320000000065],[-70.365279999999927,70.782486000000006],[-70.324721999999952,70.785812000000021],[-70.255004999999983,70.793868999999972],[-70.228881999999942,70.797211000000118],[-70.075012000000015,70.83027600000014],[-69.988051999999982,70.853592000000049],[-69.915833000000021,70.877472000000012],[-69.904723999999931,70.881363000000079],[-69.892775999999913,70.883331000000055],[-69.87388599999997,70.883331000000055],[-69.865279999999927,70.882477000000051],[-69.833618000000001,70.87692300000009],[-69.78443900000002,70.864700000000028],[-69.771117999999944,70.857483000000116],[-69.770554000000004,70.856094000000098],[-69.772506999999962,70.85054000000008],[-69.795837000000006,70.820541000000048],[-69.808884000000035,70.81109600000002],[-69.879439999999931,70.768051000000071],[-69.915557999999919,70.74914600000011],[-69.965285999999935,70.727767999999969],[-70.073897999999929,70.687484999999924],[-70.084732000000031,70.683594000000028],[-70.121658000000025,70.67164600000001],[-70.21055599999994,70.646103000000096],[-70.225554999999929,70.641936999999984],[-70.244995000000017,70.638321000000133],[-70.277221999999995,70.636107999999979],[-70.33805799999999,70.637496999999996],[-70.353332999999964,70.638885000000073],[-70.407775999999956,70.638885000000073],[-70.423324999999977,70.636932000000115],[-70.454726999999991,70.627762000000075],[-70.473052999999993,70.617203000000018],[-70.476943999999946,70.612197999999978],[-70.478881999999999,70.606644000000017],[-70.460555999999997,70.574158000000068],[-70.442764000000011,70.561920000000043],[-70.424164000000019,70.551926000000037],[-70.411391999999978,70.542205999999908],[-70.404723999999931,70.536377000000073],[-70.400283999999999,70.530273000000079],[-70.397507000000019,70.524155000000121],[-70.401672000000019,70.519150000000081],[-70.407775999999956,70.514160000000004],[-70.423324999999977,70.506943000000092],[-70.467223999999987,70.493866000000082],[-70.482223999999917,70.490540000000067],[-70.490829000000019,70.486649],[-70.494445999999982,70.484984999999995],[-70.49610899999999,70.479430999999977],[-70.488892000000021,70.476929000000098],[-70.477782999999988,70.47554000000008],[-70.459166999999979,70.47554000000008],[-70.441375999999934,70.477203000000031],[-70.309722999999963,70.498031999999967],[-70.316665999999998,70.528594999999939],[-70.320007000000032,70.536926000000051],[-70.331679999999949,70.548599000000081],[-70.348617999999931,70.559707999999944],[-70.371108999999933,70.573608000000036],[-70.344451999999933,70.613037000000134],[-70.158339999999953,70.615540000000124],[-70.092498999999975,70.612197999999978],[-70.023330999999985,70.610535000000084],[-69.99221799999998,70.645828000000051],[-69.987777999999935,70.649993999999992],[-69.978607000000011,70.653320000000008],[-69.875823999999909,70.677200000000028],[-69.775832999999977,70.682205000000067],[-69.651397999999972,70.725540000000024],[-69.649169999999913,70.731094000000041],[-69.644729999999981,70.741088999999931],[-69.638610999999969,70.746933000000126],[-69.619995000000017,70.758040999999935],[-69.569167999999934,70.771927000000119],[-69.53832999999986,70.778595000000109],[-69.469727000000034,70.790543000000127],[-69.451401000000033,70.791931000000034],[-69.242766999999958,70.782486000000006],[-69.226943999999946,70.77998400000007],[-69.215012000000002,70.776093000000003],[-69.190552000000025,70.766937000000041],[-69.131942999999978,70.737488000000099],[-68.958053999999947,70.688582999999994],[-68.928329000000019,70.681656000000089],[-68.664444000000003,70.626923000000147],[-68.61860699999994,70.62052900000009],[-68.582503999999972,70.617751999999996],[-68.549727999999959,70.613602000000014],[-68.515288999999996,70.609146000000067],[-68.484726000000023,70.604156000000046],[-68.390563999999983,70.582214000000135],[-68.325561999999934,70.566665999999941],[-68.313889000000017,70.563034000000016],[-68.293610000000001,70.551376000000005],[-68.284164000000033,70.540543000000014],[-68.279174999999952,70.531097000000045],[-68.279449,70.519440000000088],[-68.281386999999938,70.51249700000011],[-68.289718999999991,70.500000000000114],[-68.296111999999994,70.494141000000127],[-68.31361400000003,70.484711000000061],[-68.331680000000006,70.476379000000065],[-68.371932999999956,70.455826000000002],[-68.446654999999964,70.413040000000137],[-68.451400999999976,70.409424000000115],[-68.453613000000018,70.403870000000097],[-68.451950000000011,70.392212000000086],[-68.449158000000011,70.384155000000078],[-68.448607999999979,70.375259000000142],[-68.451675000000023,70.372482000000048],[-68.458618000000001,70.369431000000077],[-68.485000999999954,70.367752000000053],[-68.495270000000005,70.368590999999981],[-68.506393000000003,70.371093999999971],[-68.519454999999994,70.37414600000011],[-68.561385999999914,70.389709000000096],[-68.571121000000005,70.393326000000059],[-68.575835999999924,70.396102999999982],[-68.580840999999964,70.404160000000104],[-68.580565999999976,70.415817000000061],[-68.569732999999985,70.426376000000118],[-68.556106999999997,70.435257000000036],[-68.549987999999985,70.440811000000053],[-68.548049999999932,70.447754000000032],[-68.556945999999982,70.461929000000112],[-68.564712999999927,70.466385000000059],[-68.582503999999972,70.464432000000102],[-68.621657999999968,70.45277400000009],[-68.650833000000034,70.441925000000026],[-68.654174999999896,70.439148000000102],[-68.661666999999909,70.431090999999924],[-68.666655999999989,70.422211000000118],[-68.670273000000009,70.408874999999966],[-68.670836999999949,70.404160000000104],[-68.664444000000003,70.384994999999947],[-68.657226999999978,70.375809000000004],[-68.651947000000007,70.359420999999941],[-68.650557999999933,70.349991000000045],[-68.651107999999965,70.345824999999991],[-68.653884999999946,70.341369999999984],[-68.65695199999999,70.33859300000006],[-68.664169000000015,70.335541000000148],[-68.682495000000017,70.329437000000098],[-68.735549999999876,70.317764000000068],[-68.784164000000033,70.310256999999979],[-68.906951999999933,70.293869000000086],[-68.941375999999991,70.29304500000012],[-69.071945000000028,70.28804000000008],[-69.235001000000011,70.270264000000111],[-69.283889999999985,70.264709000000039],[-69.473891999999978,70.238876000000062],[-69.639998999999875,70.204712000000086],[-69.668059999999969,70.198593000000017],[-69.823897999999986,70.155823000000112],[-69.829453000000001,70.15415999999999],[-69.836120999999991,70.150543000000027],[-69.839721999999938,70.144150000000081],[-69.840835999999911,70.141937000000098],[-69.839721999999938,70.134430000000009],[-69.843062999999972,70.121917999999994],[-69.848891999999978,70.116088999999988],[-69.856948999999929,70.110809000000074],[-69.875823999999909,70.101929000000041],[-69.917769999999962,70.085541000000035],[-69.946655000000021,70.076385000000073],[-69.96833799999996,70.074706999999933],[-69.990279999999927,70.074432000000115],[-70.037780999999995,70.072220000000073],[-70.073059000000001,70.069153000000142],[-70.086120999999991,70.066666000000055],[-70.096953999999982,70.063309000000118],[-70.141387999999949,70.043319999999994],[-70.174438000000009,70.034987999999998],[-70.182769999999891,70.031096999999932],[-70.185546999999985,70.028046000000131],[-70.182769999999891,70.021378000000141],[-70.169997999999964,70.014434999999992],[-70.15449499999994,70.015160000000094],[-70.147506999999962,70.015488000000062],[-70.139502999999934,70.017159000000106],[-70.113327000000027,70.02388000000002],[-70.103058000000033,70.028595000000053],[-70.089995999999985,70.036102000000028],[-70.088897999999915,70.038315000000125],[-70.077498999999989,70.049712999999997],[-70.066955999999948,70.053589000000045],[-70.049987999999871,70.057205000000067],[-70.028610000000015,70.058868000000018],[-70.020279000000016,70.058594000000085],[-69.901107999999965,70.048325000000034],[-69.892226999999934,70.045822000000101],[-69.884734999999921,70.042755],[-69.853607000000011,70.029709000000025],[-69.83555599999994,70.020263999999997],[-69.827498999999989,70.014434999999992],[-69.820846999999958,70.008041000000105],[-69.813048999999921,69.99859600000002],[-69.812209999999993,69.991089000000102],[-69.815552000000025,69.984711000000118],[-69.822509999999909,69.981659000000036],[-69.837508999999955,69.978317000000118],[-69.851395000000025,69.978317000000118],[-69.897507000000019,69.983047000000113],[-69.93638599999997,69.98942599999998],[-69.963332999999977,69.991653000000042],[-69.981383999999991,69.991653000000042],[-70.00306699999993,69.989700000000084],[-70.057494999999903,69.981093999999985],[-70.098891999999921,69.973602000000085],[-70.164443999999889,69.961655000000121],[-70.218886999999938,69.941650000000095],[-70.223327999999981,69.938034000000016],[-70.223891999999978,69.929703000000131],[-70.218062999999972,69.925262000000032],[-70.216110000000015,69.92053199999998],[-70.220276000000013,69.915543000000014],[-70.228607000000011,69.911651999999947],[-70.291381999999999,69.889435000000105],[-70.384170999999981,69.860535000000027],[-70.401397999999972,69.859146000000067],[-70.422225999999966,69.860809000000131],[-70.432495000000017,69.862487999999985],[-70.443877999999927,69.860535000000027],[-70.450561999999991,69.857208000000071],[-70.467223999999987,69.844711000000132],[-70.468612999999948,69.842758000000003],[-70.460280999999952,69.841660000000104],[-70.436935000000005,69.839431999999931],[-70.412215999999944,69.837769000000037],[-70.396118000000001,69.837203999999986],[-70.384170999999981,69.837203999999986],[-70.372771999999884,69.838318000000129],[-70.355834999999956,69.841370000000097],[-70.343613000000005,69.845260999999937],[-70.255279999999914,69.879149999999981],[-70.192764000000011,69.907761000000107],[-70.136948000000018,69.933318999999983],[-70.126098999999954,69.940536000000122],[-70.098617999999988,69.953049000000021],[-70.076675000000023,69.958037999999988],[-70.059433000000013,69.959716999999955],[-69.978607000000011,69.964157],[-69.941939999999988,69.963043000000027],[-69.925003000000004,69.961105000000089],[-69.896956999999986,69.956100000000049],[-69.868057000000022,69.953323000000125],[-69.837508999999955,69.952773999999977],[-69.813109999999995,69.955429000000095],[-69.777221999999995,69.963608000000022],[-69.750838999999928,69.972488000000055],[-69.745543999999938,69.974701000000039],[-69.738051999999925,69.981369000000029],[-69.735549999999932,69.985535000000084],[-69.735275000000001,69.990539999999953],[-69.739440999999999,70.001389000000017],[-69.744155999999975,70.008041000000105],[-69.760009999999966,70.017487000000074],[-69.769454999999937,70.021378000000141],[-69.781112999999948,70.024993999999992],[-69.795546999999999,70.031661999999983],[-69.804717999999866,70.038879000000065],[-69.808884000000035,70.049712999999997],[-69.806945999999982,70.055251999999996],[-69.792770000000019,70.080826000000002],[-69.790282999999931,70.084991000000002],[-69.783889999999985,70.089432000000102],[-69.740829000000019,70.114151000000049],[-69.675826999999913,70.139708999999982],[-69.653335999999911,70.14498900000001],[-69.426101999999958,70.176086000000112],[-69.404175000000009,70.177765000000136],[-69.21945199999999,70.188309000000004],[-69.18249499999996,70.187195000000031],[-69.169997999999907,70.18609600000002],[-69.154723999999987,70.183318999999983],[-69.011123999999995,70.178314000000114],[-68.936934999999949,70.193039000000056],[-68.859160999999858,70.203048999999965],[-68.839172000000019,70.203598000000056],[-68.697220000000016,70.203873000000101],[-68.682770000000005,70.203598000000056],[-68.678329000000019,70.202484000000084],[-68.676391999999964,70.201660000000118],[-68.647507000000019,70.158324999999991],[-68.642501999999979,70.149429000000055],[-68.645003999999915,70.145264000000054],[-68.741378999999995,70.065262000000075],[-68.746658000000025,70.062484999999981],[-68.783066000000019,70.044433999999967],[-68.800551999999982,70.037490999999989],[-68.813323999999966,70.032760999999994],[-68.868056999999965,70.016937000000041],[-68.900283999999942,70.011658000000068],[-68.954453000000001,70.00471500000009],[-69.088608000000022,69.974991000000045],[-69.15306099999998,69.953049000000021],[-69.313109999999938,69.882294000000059],[-69.346114999999998,69.855545000000006],[-69.370543999999938,69.83998100000008],[-69.398055999999997,69.828598000000056],[-69.426940999999943,69.819716999999969],[-69.439712999999927,69.816376000000105],[-69.460555999999997,69.813309000000004],[-69.474716000000001,69.813599000000011],[-69.516953000000001,69.819992000000127],[-69.543335000000013,69.826934999999935],[-69.565826000000015,69.834152000000074],[-69.580841000000021,69.836928999999998],[-69.683884000000035,69.83998100000008],[-69.713897999999972,69.83998100000008],[-69.744995000000017,69.837769000000037],[-69.760009999999966,69.834991000000002],[-69.770844000000011,69.831940000000031],[-69.805832000000009,69.819992000000127],[-69.827788999999996,69.809418000000107],[-69.844161999999926,69.800261999999975],[-69.855834999999956,69.793593999999985],[-69.87249799999995,69.781096999999988],[-69.998046999999985,69.669983000000116],[-70,69.66415400000011],[-70.000838999999985,69.656097000000102],[-70.00140399999998,69.622757000000036],[-69.998885999999914,69.616089000000102],[-69.990554999999915,69.614990000000091],[-69.944442999999978,69.649719000000005],[-69.816956000000005,69.724426000000051],[-69.810821999999973,69.72886699999998],[-69.808334000000002,69.733046999999999],[-69.808334000000002,69.73803700000002],[-69.81471299999987,69.75471500000009],[-69.815001999999993,69.760269000000108],[-69.814163000000008,69.763884999999959],[-69.805557000000022,69.772491000000059],[-69.783066000000019,69.785812000000021],[-69.764724999999999,69.795531999999923],[-69.754455999999948,69.799712999999997],[-69.741942999999992,69.803589000000102],[-69.730835000000013,69.806090999999981],[-69.713333000000034,69.807479999999998],[-69.643065999999976,69.810806000000014],[-69.602782999999988,69.809708000000114],[-69.572783999999899,69.80442800000003],[-69.561110999999983,69.799988000000042],[-69.545273000000009,69.794434000000024],[-69.489989999999921,69.779709000000082],[-69.45666499999993,69.775818000000015],[-69.446655000000021,69.775543000000027],[-69.409163999999976,69.776381999999955],[-69.395844000000011,69.777771000000143],[-69.384734999999921,69.780823000000055],[-69.378051999999968,69.783875000000023],[-69.313889000000017,69.816376000000105],[-69.291381999999999,69.831099999999935],[-69.279448999999943,69.84248400000007],[-69.26916499999993,69.852768000000083],[-69.253066999999987,69.862198000000149],[-69.200561999999877,69.883606000000043],[-69.188048999999978,69.887771999999984],[-69.101943999999946,69.916091999999992],[-69.076674999999966,69.923874000000126],[-68.945540999999992,69.949997000000053],[-68.933884000000035,69.951096000000064],[-68.870270000000005,69.953049000000021],[-68.801940999999886,69.952208999999982],[-68.76666299999988,69.948868000000118],[-68.751953000000015,69.946639999999945],[-68.622817999999938,69.98240699999991],[-68.471664000000033,70.046646000000067],[-68.338333000000034,70.064148000000102],[-68.241378999999995,70.095825000000048],[-68.221389999999985,70.102768000000026],[-68.207229999999981,70.109420999999998],[-68.196380999999974,70.119431000000077],[-68.193603999999993,70.123596000000077],[-68.203338999999971,70.128860000000088],[-68.229445999999939,70.135269000000108],[-68.268616000000009,70.13749700000011],[-68.290832999999907,70.137207000000046],[-68.308333999999945,70.135269000000108],[-68.320557000000008,70.135543999999982],[-68.333618000000001,70.139160000000004],[-68.349166999999852,70.168045000000063],[-68.348617999999988,70.172760000000096],[-68.345275999999956,70.188034000000016],[-68.318618999999956,70.218596999999988],[-68.31361400000003,70.222214000000122],[-68.160004000000015,70.282761000000107],[-68.039443999999946,70.301376000000005],[-67.808043999999938,70.262496999999996],[-67.794723999999974,70.258881000000088],[-67.774170000000026,70.250549000000092],[-67.768065999999976,70.243866000000139],[-67.760009999999909,70.229706000000022],[-67.740554999999858,70.218872000000147],[-67.697219999999959,70.202209000000096],[-67.674437999999952,70.193587999999977],[-67.648055999999997,70.18609600000002],[-67.591674999999952,70.165267999999969],[-67.575561999999934,70.158324999999991],[-67.556945999999982,70.149155000000121],[-67.528335999999967,70.133881000000031],[-67.412215999999944,70.068878000000097],[-67.404723999999987,70.06442300000009],[-67.378052000000025,70.048035000000027],[-67.242492999999968,69.958327999999995],[-67.222778000000005,69.943863000000079],[-67.216949,69.937759000000028],[-67.152495999999985,69.817764000000011],[-67.148620999999991,69.810257000000092],[-67.127776999999867,69.726929000000041],[-67.193603999999993,69.721924000000001],[-67.371384000000035,69.714432000000045],[-67.391113000000018,69.713882000000012],[-67.406951999999876,69.714705999999978],[-67.436110999999926,69.719147000000078],[-67.499999999999943,69.731833999999992],[-67.602492999999924,69.750275000000101],[-67.761123999999995,69.778595000000109],[-67.77305599999994,69.779434000000094],[-67.81082200000003,69.778869999999927],[-67.99610899999999,69.774429000000055],[-68.013061999999991,69.771927000000119],[-68.087783999999999,69.756104000000107],[-68.208054000000004,69.715546000000018],[-68.216659999999933,69.71026599999999],[-68.222777999999948,69.704711999999972],[-68.228606999999897,69.691360000000145],[-68.230285999999978,69.684418000000051],[-68.24110399999995,69.674987999999985],[-68.31138599999997,69.633331000000112],[-68.323623999999995,69.628860000000032],[-68.329453000000001,69.627762000000132],[-68.352782999999988,69.626923000000147],[-68.496383999999978,69.625809000000004],[-68.518065999999919,69.626083000000108],[-68.620269999999891,69.637206999999989],[-68.64527899999996,69.641098000000056],[-68.839995999999985,69.616089000000102],[-68.980834999999956,69.589157],[-69.188599000000011,69.54193099999992],[-69.201110999999912,69.538040000000024],[-69.220001000000025,69.535812000000078],[-69.325012000000015,69.532486000000063],[-69.342772999999966,69.532486000000063],[-69.364165999999955,69.53776600000009],[-69.410277999999948,69.546097000000032],[-69.426940999999943,69.548035000000141],[-69.549438000000009,69.560531999999967],[-69.630829000000006,69.56721500000009],[-69.688889000000017,69.569443000000092],[-69.737777999999992,69.568329000000062],[-69.75111400000003,69.56721500000009],[-69.838608000000022,69.558868000000132],[-70.030837999999903,69.536102000000085],[-70.028610000000015,69.530823000000112],[-70.025283999999999,69.527481000000023],[-70.011123999999995,69.521103000000039],[-69.995543999999995,69.517211999999972],[-69.964721999999995,69.513885000000016],[-69.899444999999957,69.507217000000082],[-69.885833999999988,69.507217000000082],[-69.866942999999878,69.509430000000009],[-69.844161999999926,69.517487000000017],[-69.824448000000018,69.527205999999978],[-69.815826000000015,69.530548000000124],[-69.803878999999995,69.534988000000112],[-69.789443999999946,69.538589000000002],[-69.732773000000009,69.545258000000047],[-69.698607999999922,69.548324999999977],[-69.68499799999995,69.548874000000126],[-69.663329999999917,69.548324999999977],[-69.613891999999908,69.54304500000012],[-69.506957999999997,69.529433999999924],[-69.449996999999883,69.518875000000094],[-69.375823999999909,69.509720000000016],[-69.343062999999972,69.505828999999949],[-69.323333999999988,69.505264000000125],[-69.299987999999928,69.506103999999993],[-69.206664999999987,69.514998999999989],[-69.151671999999905,69.520264000000054],[-69.005844000000025,69.535812000000078],[-68.995270000000005,69.539703000000145],[-68.982223999999974,69.547211000000004],[-68.971389999999985,69.555817000000104],[-68.957229999999981,69.560531999999967],[-68.926101999999901,69.566665999999998],[-68.76945499999988,69.587494000000049],[-68.752501999999879,69.589431999999988],[-68.6683349999999,69.590820000000065],[-68.611938000000009,69.587494000000049],[-68.544723999999917,69.579987000000131],[-68.528060999999923,69.577208999999925],[-68.317229999999881,69.530273000000079],[-68.293334999999956,69.523604999999918],[-68.181945999999982,69.49832200000003],[-68.02555799999999,69.466095000000053],[-67.982223999999974,69.457489000000123],[-67.946105999999929,69.454712000000029],[-67.926392000000021,69.454163000000108],[-67.893340999999964,69.454437000000041],[-67.874161000000015,69.456649999999968],[-67.861937999999952,69.460266000000047],[-67.840835999999967,69.469436999999971],[-67.819457999999941,69.476929000000098],[-67.806945999999868,69.480819999999994],[-67.792220999999984,69.48414600000001],[-67.604996000000028,69.478043000000071],[-67.562209999999993,69.471924000000058],[-67.511672999999973,69.466095000000053],[-67.475829999999974,69.463042999999914],[-67.432770000000005,69.463318000000129],[-67.305266999999958,69.467209000000025],[-67.258347000000015,69.467484000000013],[-67.210006999999962,69.46138000000002],[-67.180832000000009,69.454712000000029],[-66.921111999999994,69.379150000000095],[-66.795546999999885,69.341094999999996],[-66.785277999999948,69.337204000000099],[-66.774444999999957,69.331940000000088],[-66.767226999999934,69.327484000000027],[-66.694992000000013,69.281661999999983],[-66.682769999999948,69.270264000000111],[-66.650283999999942,69.236374000000012],[-66.645844000000011,69.224991000000045],[-66.646666999999979,69.203598000000113],[-66.658614999999941,69.188309000000004],[-66.668335000000013,69.178314000000114],[-66.689437999999939,69.161926000000051],[-66.720001000000025,69.144150000000081],[-66.730559999999969,69.138885000000016],[-66.75306699999993,69.129424999999969],[-66.758620999999948,69.128036000000122],[-66.776107999999965,69.128860000000088],[-66.837219000000005,69.135818000000086],[-66.84944200000001,69.138321000000076],[-66.912780999999995,69.154984000000127],[-66.928328999999906,69.164153999999996],[-66.953339000000028,69.172211000000004],[-66.965285999999992,69.174423000000047],[-66.996947999999975,69.177764999999965],[-67.132767000000001,69.182479999999998],[-67.371932999999956,69.184417999999937],[-67.385558999999944,69.183868000000132],[-67.414718999999991,69.178314000000114],[-67.427215999999987,69.174423000000047],[-67.458892999999932,69.162491000000102],[-67.466109999999958,69.160812000000078],[-67.50556899999998,69.157486000000063],[-67.521117999999944,69.15776100000005],[-67.648620999999991,69.166931000000091],[-67.676391999999964,69.169434000000081],[-67.864166000000012,69.221924000000115],[-68.18447900000001,69.308014000000014],[-68.209732000000031,69.311370999999951],[-68.221663999999976,69.312194999999917],[-68.232772999999952,69.311370999999951],[-68.251953000000015,69.309708000000057],[-68.285278000000005,69.304428000000144],[-68.31082200000003,69.298598999999967],[-68.327498999999989,69.296097000000088],[-68.344161999999983,69.294708000000071],[-68.355835000000013,69.294144000000131],[-68.375548999999921,69.294708000000071],[-68.464721999999938,69.301651000000049],[-68.675277999999992,69.322220000000016],[-68.740279999999984,69.330551000000128],[-68.811935000000005,69.341933999999924],[-68.84445199999999,69.346100000000035],[-68.944716999999912,69.354980000000069],[-68.962783999999999,69.356369000000029],[-68.984436000000017,69.356934000000081],[-69.015015000000005,69.354980000000069],[-69.040282999999988,69.349716000000058],[-69.176665999999955,69.310806000000127],[-69.203063999999927,69.303040000000067],[-69.241378999999881,69.284149000000014],[-69.253890999999953,69.27526899999998],[-69.25778200000002,69.270264000000111],[-69.25167799999997,69.263610999999969],[-69.246947999999975,69.261107999999979],[-69.235001000000011,69.259720000000073],[-69.221938999999963,69.261658000000011],[-69.213057999999933,69.264709000000039],[-69.203339000000028,69.269989000000123],[-69.197768999999994,69.275542999999914],[-69.176392000000021,69.287490999999989],[-69.156386999999938,69.297484999999995],[-69.146118000000001,69.300537000000077],[-69.133330999999998,69.303314],[-69.013335999999981,69.327484000000027],[-68.956664999999873,69.331940000000088],[-68.941100999999946,69.332489000000066],[-68.921386999999868,69.331940000000088],[-68.658339999999896,69.300262000000089],[-68.537216000000001,69.285262999999986],[-68.504729999999995,69.280272999999966],[-68.330565999999919,69.27526899999998],[-68.251953000000015,69.27748100000008],[-68.230835000000013,69.277771000000087],[-68.198607999999979,69.274703999999986],[-68.172225999999966,69.269714000000079],[-68.159438999999963,69.266098000000056],[-68.14834599999989,69.261658000000011],[-68.139724999999885,69.257766999999944],[-68.088608000000022,69.228867000000093],[-68.083618000000001,69.225540000000137],[-68.077498999999875,69.21748400000007],[-68.081679999999949,69.211928999999998],[-68.091384999999946,69.205551000000071],[-68.103881999999999,69.202209000000096],[-68.129715000000033,69.197754000000089],[-68.163054999999929,69.199997000000053],[-68.263061999999991,69.211380000000077],[-68.410827999999924,69.221374999999966],[-68.549987999999985,69.226928999999984],[-68.643616000000009,69.229431000000034],[-68.664444000000003,69.228043000000127],[-68.689986999999917,69.223602000000028],[-68.839721999999938,69.214706000000092],[-68.923049999999989,69.220825000000104],[-68.967772999999966,69.221099999999979],[-68.948333999999875,69.214156999999943],[-68.93971299999987,69.211928999999998],[-68.913054999999986,69.20748900000001],[-68.862777999999992,69.201934999999992],[-68.80749499999996,69.198868000000061],[-68.788054999999986,69.198318000000029],[-68.767226999999991,69.199707000000046],[-68.737777999999992,69.203598000000113],[-68.704726999999991,69.209152000000074],[-68.65695199999999,69.210541000000092],[-68.618057000000022,69.209152000000074],[-68.515015000000005,69.20248400000014],[-68.502501999999993,69.198593000000074],[-68.505279999999914,69.195815999999979],[-68.513901000000033,69.191925000000083],[-68.690551999999968,69.141098],[-68.707229999999925,69.138321000000076],[-68.872771999999998,69.120529000000033],[-68.998046999999985,69.103591999999992],[-68.961670000000026,69.103867000000037],[-68.929717999999923,69.100266000000147],[-68.926940999999943,69.098328000000038],[-68.926666000000012,69.079987000000017],[-68.957779000000016,69.005264000000011],[-68.958892999999989,69.003052000000139],[-68.969161999999926,68.993591000000038],[-68.994155999999919,68.982483000000002],[-69.006118999999956,68.978317000000118],[-69.018889999999885,68.975815000000068],[-69.028885000000002,68.971375000000023],[-69.025833000000034,68.968597000000045],[-69.017501999999979,68.966385000000002],[-69.005568999999923,68.964705999999978],[-68.998046999999985,68.964995999999985],[-68.973052999999993,68.970824999999991],[-68.962783999999999,68.974701000000039],[-68.946380999999917,68.982483000000002],[-68.930557000000022,68.992752000000053],[-68.920272999999952,69.00277699999998],[-68.89416499999993,69.044982999999945],[-68.89416499999993,69.050537000000134],[-68.892226999999991,69.062194999999974],[-68.889724999999999,69.066376000000048],[-68.881942999999865,69.07777400000009],[-68.879165999999941,69.081374999999923],[-68.872497999999894,69.084991000000002],[-68.858336999999892,69.088318000000129],[-68.753615999999965,69.109711000000061],[-68.471114999999998,69.166381999999999],[-68.412780999999939,69.176926000000037],[-68.381377999999927,69.175262000000032],[-68.351394999999968,69.171646000000123],[-68.178329000000019,69.14665199999996],[-68.089447000000007,69.126082999999994],[-67.725280999999939,69.032211000000132],[-67.715012000000002,69.029160000000104],[-67.708054000000004,69.024704000000042],[-67.705840999999964,69.01638800000012],[-67.721114999999941,69.009720000000129],[-67.974715999999944,68.9727630000001],[-68.029448999999943,68.971375000000023],[-68.058884000000035,68.973602000000085],[-68.211120999999935,68.991928000000087],[-68.241378999999995,68.996933000000126],[-68.268065999999976,69.00277699999998],[-68.314162999999951,69.010544000000095],[-68.335007000000019,69.009155000000078],[-68.535552999999879,68.984146000000123],[-68.548614999999984,68.982208000000014],[-68.552779999999984,68.977203000000145],[-68.554717999999923,68.971100000000035],[-68.556106999999997,68.964157],[-68.545272999999952,68.959717000000012],[-68.440552000000025,68.9727630000001],[-68.337509000000011,68.985809000000074],[-68.320281999999963,68.986374000000069],[-68.303054999999972,68.985809000000074],[-68.290557999999976,68.982208000000014],[-68.285278000000005,68.977478000000133],[-68.28443900000002,68.974701000000039],[-68.264175000000023,68.964705999999978],[-68.196945000000028,68.94999700000011],[-68.186661000000015,68.947754000000145],[-68.169448999999986,68.946930000000009],[-68.152221999999938,68.946930000000009],[-68.116104000000007,68.94747899999993],[-68.081679999999949,68.94747899999993],[-68.064163000000008,68.946091000000024],[-68.048339999999996,68.943863000000079],[-68.039992999999981,68.941360000000088],[-67.974715999999944,68.865265000000079],[-67.972778000000005,68.859146000000067],[-67.977492999999981,68.855545000000006],[-67.986938000000009,68.854431000000034],[-68.006118999999899,68.854979999999955],[-68.082229999999981,68.862487999999985],[-68.129165999999998,68.867751999999996],[-68.18360899999999,68.878586000000041],[-68.242217999999866,68.889984000000027],[-68.256119000000012,68.892212000000029],[-68.289444000000003,68.894989000000123],[-68.37388599999997,68.897217000000069],[-68.475280999999995,68.899429000000112],[-68.489990000000034,68.897491000000002],[-68.491668999999945,68.896652000000017],[-68.488892000000021,68.893326000000002],[-68.48582499999992,68.89027400000009],[-68.477218999999934,68.886932000000115],[-68.463333000000034,68.885544000000039],[-68.43249499999996,68.883331000000055],[-68.373046999999929,68.88220200000012],[-68.353606999999954,68.88108799999992],[-68.293059999999969,68.874984999999981],[-68.266662999999994,68.869980000000112],[-68.179717999999923,68.851928999999984],[-68.133895999999936,68.837203999999986],[-68.008347000000015,68.816666000000112],[-67.972778000000005,68.811920000000043],[-67.955565999999976,68.810257000000092],[-67.916945999999939,68.808318999999983],[-67.886672999999917,68.808868000000075],[-67.861389000000031,68.805542000000059],[-67.778335999999911,68.786102000000085],[-67.771941999999967,68.78276100000005],[-67.771392999999932,68.781372000000033],[-67.774718999999948,68.77915999999999],[-67.803329000000019,68.774155000000121],[-67.820006999999976,68.772766000000104],[-67.857772999999952,68.771378000000027],[-67.872771999999998,68.771652000000131],[-67.915008999999998,68.774155000000121],[-67.944442999999922,68.778046000000018],[-68.076110999999969,68.80192599999998],[-68.170836999999892,68.814697000000081],[-68.352218999999934,68.832488999999953],[-68.426392000000021,68.839157000000114],[-68.546660999999972,68.84664900000007],[-68.565551999999968,68.847214000000122],[-68.58805799999999,68.846374999999966],[-68.606109999999887,68.842758000000003],[-68.610549999999989,68.839157000000114],[-68.611663999999962,68.835815000000025],[-68.604445999999939,68.83137499999998],[-68.593886999999995,68.827484000000084],[-68.557769999999948,68.821380999999974],[-68.52694699999995,68.795258000000047],[-68.602492999999924,68.794983000000002],[-68.678878999999938,68.796646000000123],[-68.795273000000009,68.799423000000047],[-68.807220000000029,68.800261999999975],[-68.900283999999942,68.80720500000001],[-68.967498999999918,68.814697000000081],[-68.995270000000005,68.819153000000028],[-69.00389100000001,68.822220000000129],[-69.015015000000005,68.827209000000096],[-69.105835000000013,68.848602000000028],[-69.25111400000003,68.872481999999991],[-69.28083799999996,68.875809000000118],[-69.323058999999944,68.876648000000102],[-69.361938000000009,68.874146000000053],[-69.378051999999968,68.871368000000018],[-69.389998999999989,68.867476999999951],[-69.398055999999997,68.862198000000149],[-69.394454999999994,68.85775799999999],[-69.379990000000021,68.854979999999955],[-69.36082499999992,68.854431000000034],[-69.331679999999949,68.856934000000024],[-69.279448999999943,68.855255],[-69.245543999999882,68.851379000000122],[-69.185546999999985,68.842209000000082],[-69.171111999999994,68.838882000000126],[-69.162215999999944,68.835815000000025],[-69.152221999999938,68.828048999999965],[-69.153884999999946,68.827209000000096],[-69.163054999999986,68.826096000000007],[-69.229996000000028,68.827209000000096],[-69.294158999999922,68.831940000000031],[-69.315001999999993,68.831664999999987],[-69.357773000000009,68.829163000000108],[-69.368606999999997,68.827209000000096],[-69.375548999999978,68.824997000000053],[-69.382767000000001,68.819153000000028],[-69.383895999999993,68.816376000000105],[-69.381377999999984,68.814986999999917],[-69.37110899999999,68.812759000000142],[-69.193603999999993,68.804153000000042],[-68.971114999999998,68.791931000000091],[-68.959166999999923,68.789703000000145],[-68.944992000000013,68.786926000000051],[-68.942490000000021,68.784988000000112],[-68.196380999999974,68.706940000000145],[-68.049437999999952,68.681655999999975],[-68.044998000000021,68.678314000000057],[-68.046111999999937,68.676376000000062],[-68.087508999999955,68.629425000000083],[-68.094451999999933,68.627762000000132],[-68.34445199999999,68.628586000000098],[-68.56220999999988,68.651931999999988],[-68.621933000000013,68.655823000000055],[-68.657776000000013,68.656372000000147],[-68.680283000000031,68.65554800000001],[-68.747771999999941,68.649155000000064],[-68.777785999999935,68.643051000000014],[-68.89416499999993,68.607208000000014],[-68.902495999999985,68.603592000000106],[-68.900283999999942,68.603043000000014],[-68.835830999999985,68.589157],[-68.804169000000002,68.589980999999966],[-68.757674999999949,68.600646999999981],[-68.749343999999951,68.602654000000143],[-68.735001000000011,68.607314999999971],[-68.711165999999992,68.621147000000121],[-68.679992999999911,68.630814000000044],[-68.647507000000019,68.635544000000095],[-68.62860099999989,68.635544000000095],[-68.594161999999926,68.633605999999986],[-68.563048999999921,68.629425000000083],[-68.533324999999991,68.624985000000038],[-68.481383999999935,68.614990000000148],[-68.475280999999995,68.61303700000002],[-68.470276000000013,68.609146000000123],[-68.46945199999999,68.606369000000029],[-68.483321999999987,68.596939000000134],[-68.50389100000001,68.589980999999966],[-68.519454999999994,68.585815000000082],[-68.533889999999928,68.583878000000027],[-68.605834999999956,68.578872999999987],[-68.648345999999947,68.577773999999977],[-68.660004000000015,68.578872999999987],[-68.682883999999945,68.575211000000024],[-68.69506100000001,68.574379000000135],[-68.707053999999971,68.57337200000012],[-68.712387000000035,68.572044000000005],[-68.716064000000017,68.569382000000019],[-68.716727999999932,68.568047000000035],[-68.707053999999971,68.5660400000001],[-68.696724000000017,68.565207999999984],[-68.656113000000005,68.559708000000001],[-68.460007000000019,68.562195000000088],[-68.447220000000016,68.563599000000067],[-68.435271999999941,68.567490000000134],[-68.427215999999987,68.571930000000009],[-68.422774999999945,68.576096000000064],[-68.420272999999895,68.579711999999915],[-68.419997999999964,68.585266000000104],[-68.416397000000018,68.591369999999984],[-68.396117999999944,68.593048000000067],[-68.337783999999999,68.593323000000112],[-68.244445999999982,68.588043000000027],[-68.215560999999866,68.585541000000148],[-68.136672999999973,68.572220000000016],[-68.06534599999992,68.545822000000044],[-67.920273000000009,68.534424000000001],[-67.866942999999992,68.509720000000073],[-67.809158000000025,68.531097000000102],[-67.673049999999932,68.561096000000077],[-67.664169000000015,68.562759000000028],[-67.643615999999952,68.562759000000028],[-67.539443999999946,68.550812000000064],[-67.52555799999999,68.548598999999911],[-67.500838999999928,68.538315000000068],[-67.492217999999923,68.527206000000035],[-67.493056999999965,68.523604999999975],[-67.502228000000002,68.514999000000046],[-67.510559000000001,68.511382999999967],[-67.51916499999993,68.509155000000021],[-67.543059999999912,68.506103999999993],[-67.607773000000009,68.503876000000048],[-67.621658000000025,68.5],[-67.628052000000025,68.496368000000018],[-67.634734999999921,68.486649],[-67.621383999999978,68.384429999999952],[-67.618606999999997,68.381088000000034],[-67.612502999999947,68.379424999999912],[-67.603332999999907,68.378860000000088],[-67.59445199999999,68.381363000000079],[-67.551102000000014,68.414428999999984],[-67.548339999999996,68.440262000000132],[-67.549437999999896,68.443863000000022],[-67.555832000000009,68.455261000000007],[-67.511123999999938,68.483322000000101],[-67.426102000000014,68.494430999999963],[-67.335555999999997,68.49693300000007],[-67.31639100000001,68.496094000000085],[-67.232497999999964,68.480545000000006],[-67.224166999999966,68.47665400000011],[-67.217498999999918,68.471924000000058],[-67.213622999999927,68.440811000000053],[-67.223052999999993,68.426086000000112],[-67.307770000000005,68.423309000000017],[-67.325835999999981,68.421371000000079],[-67.332779000000016,68.418869000000029],[-67.335830999999985,68.416092000000106],[-67.338608000000022,68.411926000000051],[-67.33805799999999,68.409988000000055],[-67.324448000000018,68.40776100000005],[-67.15695199999999,68.406372000000033],[-67.111938000000009,68.411926000000051],[-67.104996000000028,68.414153999999996],[-67.100554999999929,68.418320000000051],[-67.09722899999997,68.45138500000013],[-67.100280999999995,68.457214000000135],[-67.106658999999866,68.460541000000092],[-67.116652999999985,68.463607999999965],[-67.127212999999983,68.46804800000001],[-67.129990000000021,68.472763000000043],[-67.126937999999996,68.475540000000137],[-67.112777999999992,68.478867000000093],[-66.908050999999944,68.453873000000101],[-66.821395999999993,68.465271000000087],[-66.803054999999972,68.467209000000025],[-66.787506000000008,68.464996000000099],[-66.706954999999994,68.44470200000012],[-66.697768999999937,68.428039999999953],[-66.724166999999909,68.429153000000042],[-66.782775999999956,68.426086000000112],[-66.904998999999918,68.416382000000112],[-66.920546999999942,68.411102000000085],[-66.921660999999915,68.408324999999991],[-66.914168999999902,68.398880000000077],[-66.913054999999986,68.39498900000001],[-66.914444000000003,68.391937000000098],[-66.93638599999997,68.374420000000043],[-66.946654999999907,68.369980000000055],[-66.955001999999979,68.367477000000065],[-67.005843999999968,68.354430999999977],[-67.011123999999938,68.353591999999992],[-67.02416999999997,68.35386699999998],[-67.048889000000031,68.355820000000108],[-67.075561999999934,68.360535000000141],[-67.111388999999974,68.370255000000043],[-67.130279999999914,68.379700000000128],[-67.142226999999991,68.382750999999985],[-67.230559999999969,68.39498900000001],[-67.245543999999995,68.395827999999995],[-67.286391999999978,68.395827999999995],[-67.379715000000033,68.390823000000125],[-67.411117999999931,68.382750999999985],[-67.415557999999976,68.378036000000122],[-67.418883999999991,68.376373000000001],[-67.455565999999919,68.36775200000011],[-67.494719999999973,68.360809000000074],[-67.595276000000013,68.347762999999986],[-67.631667999999991,68.345261000000107],[-67.646117999999944,68.344711000000075],[-67.743880999999988,68.343322999999941],[-67.781386999999938,68.337204000000099],[-67.810546999999985,68.328598],[-67.832229999999925,68.320267000000115],[-67.849730999999963,68.309981999999991],[-67.865829000000019,68.29971299999994],[-67.87110899999999,68.292755],[-67.878326000000015,68.26527400000009],[-67.869720000000029,68.259995000000117],[-67.860001000000011,68.258331000000112],[-67.845551,68.258880999999974],[-67.833327999999938,68.261383000000023],[-67.826675000000023,68.264434999999935],[-67.820281999999906,68.268599999999935],[-67.818068999999923,68.274155000000064],[-67.821120999999948,68.284987999999998],[-67.820557000000008,68.289703000000031],[-67.815551999999968,68.292206000000022],[-67.752501999999993,68.318878000000097],[-67.745269999999891,68.320541000000048],[-67.597778000000005,68.323044000000039],[-67.583069000000023,68.308029000000033],[-67.572234999999978,68.273314999999968],[-67.576675000000023,68.268599999999935],[-67.583327999999995,68.265548999999965],[-67.591674999999952,68.263046000000145],[-67.616394000000014,68.258331000000112],[-67.646666999999979,68.25360100000006],[-67.662780999999995,68.252487000000087],[-67.689437999999996,68.24803200000008],[-67.695267000000001,68.242477000000008],[-67.694992000000013,68.241089000000102],[-67.690826000000015,68.239700000000084],[-67.679717999999923,68.238876000000118],[-67.666945999999996,68.239975000000129],[-67.579726999999934,68.251389000000017],[-67.570846999999901,68.253052000000139],[-67.551666000000012,68.258331000000112],[-67.546950999999979,68.260544000000095],[-67.539169000000015,68.265823000000069],[-67.533066000000019,68.271378000000141],[-67.531112999999948,68.278320000000065],[-67.535004000000015,68.285538000000031],[-67.541381999999999,68.288879000000065],[-67.546111999999937,68.294144000000131],[-67.544997999999964,68.296371000000022],[-67.540282999999931,68.29971299999994],[-67.523894999999982,68.308594000000085],[-67.494155999999975,68.321930000000009],[-67.401947000000007,68.352478000000019],[-67.394729999999981,68.354156000000103],[-67.385558999999944,68.354430999999977],[-67.243880999999988,68.358322000000044],[-67.232497999999964,68.357483000000059],[-67.182495000000017,68.349426000000108],[-67.130279999999914,68.340820000000008],[-67.078063999999927,68.331100000000106],[-67.016113000000018,68.318603999999993],[-67.011672999999917,68.316086000000041],[-67.018340999999964,68.311645999999996],[-67.032500999999968,68.309143000000006],[-67.152221999999995,68.299987999999985],[-67.235000999999954,68.291655999999989],[-67.303878999999938,68.258880999999974],[-67.319732999999985,68.249709999999993],[-67.327788999999939,68.243590999999981],[-67.333617999999944,68.237761999999975],[-67.337509000000011,68.232483000000002],[-67.338897999999915,68.227767999999969],[-67.33944699999995,68.221649000000127],[-67.33944699999995,68.205551000000071],[-67.335007000000019,68.200821000000019],[-67.327498999999932,68.18664600000011],[-67.327788999999939,68.181091000000038],[-67.338608000000022,68.171097000000032],[-67.34584000000001,68.166091999999992],[-67.37110899999999,68.153869999999984],[-67.387787000000003,68.146378000000084],[-67.398620999999878,68.143875000000094],[-67.412505999999951,68.143051000000128],[-67.430283000000031,68.144714000000079],[-67.456954999999994,68.149429000000112],[-67.477782999999988,68.154984000000013],[-67.513901000000033,68.162491000000102],[-67.528885000000002,68.165268000000026],[-67.567779999999971,68.169144000000074],[-67.581116000000009,68.168869000000086],[-67.598891999999978,68.164992999999981],[-67.598342999999943,68.162766000000147],[-67.575561999999934,68.154984000000013],[-67.544723999999917,68.14776599999999],[-67.480285999999978,68.134720000000016],[-67.466949,68.132202000000063],[-67.438048999999978,68.128036000000009],[-67.408050999999944,68.124984999999981],[-67.396956999999929,68.124694999999974],[-67.374161000000015,68.127472000000012],[-67.353881999999999,68.135268999999994],[-67.307770000000005,68.155548000000124],[-67.304168999999945,68.158600000000035],[-67.273894999999925,68.19081100000011],[-67.272781000000009,68.195525999999973],[-67.274718999999891,68.200546000000031],[-67.279175000000009,68.205261000000064],[-67.283614999999998,68.211929000000055],[-67.288894999999968,68.226379000000122],[-67.289444000000003,68.230820000000051],[-67.289444000000003,68.236374000000069],[-67.274718999999891,68.244141000000013],[-67.178878999999995,68.269989000000123],[-67.139724999999999,68.27998400000007],[-67.057769999999891,68.291092000000049],[-67.011397999999986,68.294983000000116],[-66.998336999999935,68.292480000000126],[-66.99110399999995,68.288879000000065],[-66.986114999999984,68.285538000000031],[-66.984160999999972,68.28054800000001],[-66.973617999999988,68.27388000000002],[-66.964721999999995,68.270263999999997],[-66.930572999999924,68.262482000000034],[-66.865828999999962,68.25],[-66.835830999999928,68.246368000000075],[-66.791672000000005,68.244705000000124],[-66.777495999999985,68.243317000000047],[-66.769729999999925,68.241089000000102],[-66.765839000000028,68.238586000000112],[-66.780288999999982,68.207764000000054],[-66.852218999999991,68.115265000000079],[-66.888900999999976,68.092758000000003],[-66.896666999999866,68.089432000000102],[-66.913894999999968,68.084152000000074],[-66.945830999999941,68.076096000000007],[-66.954452999999944,68.071930000000066],[-66.965560999999923,68.063873000000115],[-66.971114999999998,68.053314000000057],[-66.972777999999948,68.048599000000024],[-66.973327999999981,68.039428999999984],[-66.969727000000034,68.034149000000127],[-66.961120999999991,68.024994000000049],[-66.953612999999962,68.017212000000086],[-66.946654999999907,68.013611000000026],[-66.928054999999972,68.042755],[-66.921660999999915,68.049149000000057],[-66.836120999999935,68.095535000000041],[-66.748046999999985,68.131653000000142],[-66.709166999999923,68.141098],[-66.694442999999978,68.143051000000128],[-66.682769999999948,68.141373000000044],[-66.678878999999995,68.138885000000016],[-66.670837000000006,68.128860000000145],[-66.670272999999952,68.114151000000106],[-66.678054999999915,68.043320000000051],[-66.680557000000022,68.036925999999994],[-66.693053999999904,68.022217000000126],[-66.706389999999942,68.011658000000125],[-66.720839999999953,68.001663000000008],[-66.735000999999954,67.982208000000014],[-66.732773000000009,67.981934000000081],[-66.714721999999938,67.983597000000032],[-66.697219999999902,67.987488000000099],[-66.647232000000031,68.015548999999965],[-66.634734999999864,68.064147999999932],[-66.631942999999978,68.075821000000133],[-66.625548999999978,68.103317000000004],[-66.620270000000005,68.125809000000118],[-66.615554999999972,68.132477000000108],[-66.610549999999932,68.136932000000115],[-66.594726999999921,68.143051000000128],[-66.56138599999997,68.147490999999945],[-66.541945999999882,68.148330999999985],[-66.513625999999931,68.148330999999985],[-66.328887999999949,68.132202000000063],[-66.31527699999998,68.130264000000125],[-66.309432999999956,68.127472000000012],[-66.310546999999929,68.118591000000094],[-66.315001999999879,68.112487999999985],[-66.321121000000005,68.106934000000138],[-66.350280999999939,68.090271000000087],[-66.366394000000014,68.083328000000108],[-66.371657999999968,68.081664999999987],[-66.388610999999969,68.08137499999998],[-66.41361999999998,68.086104999999975],[-66.427779999999984,68.087493999999992],[-66.450561999999991,68.086928999999941],[-66.468612999999948,68.083054000000004],[-66.476104999999905,68.080551000000014],[-66.478606999999954,68.077209000000039],[-66.472228999999913,68.073044000000039],[-66.460555999999997,68.070541000000105],[-66.438048999999978,68.068054000000018],[-66.389998999999989,68.069443000000035],[-66.369445999999925,68.071655000000078],[-66.326110999999969,68.079163000000108],[-66.303878999999995,68.083878000000141],[-66.296660999999972,68.086104999999975],[-66.272780999999952,68.087769000000037],[-66.259170999999981,68.085814999999968],[-66.250838999999985,68.082214000000135],[-66.240279999999871,68.073317999999972],[-66.184157999999968,68.018875000000037],[-66.184433000000013,68.013321000000019],[-66.186385999999914,68.010818000000029],[-66.192764000000011,68.007217000000026],[-66.204177999999899,68.00471500000009],[-66.253066999999874,68.00221300000004],[-66.264175000000023,67.99971000000005],[-66.294448999999986,67.991653000000099],[-66.309722999999963,67.986099000000081],[-66.320846999999958,67.97886699999998],[-66.344451999999933,67.956650000000081],[-66.405838000000017,67.898041000000035],[-66.401397999999972,67.888596000000007],[-66.522232000000031,67.860809000000017],[-66.535278000000005,67.863602000000014],[-66.594161999999983,67.872482000000048],[-66.628601000000003,67.876648000000102],[-66.672501000000011,67.880264000000011],[-66.729445999999996,67.878859999999975],[-66.739715999999987,67.877762000000075],[-66.746947999999918,67.875259000000142],[-66.74499499999996,67.872757000000036],[-66.732223999999974,67.867203000000075],[-66.703063999999983,67.863602000000014],[-66.686934999999949,67.862761999999975],[-66.653885000000002,67.859421000000111],[-66.56138599999997,67.843048000000067],[-66.401397999999972,67.811096000000077],[-66.356658999999922,67.821381000000031],[-66.346389999999985,67.861099000000024],[-66.332779000000016,67.887772000000041],[-66.319457999999884,67.911102000000142],[-66.295837000000006,67.938309000000118],[-66.276672000000019,67.954436999999984],[-66.268615999999952,67.958037999999988],[-66.251952999999958,67.962494000000106],[-66.240554999999972,67.962768999999923],[-66.227492999999868,67.959991000000116],[-66.213897999999972,67.960815000000082],[-66.136948000000018,67.976089000000002],[-66.119995000000017,67.981369000000086],[-66.003219999999885,68.020492999999988],[-65.988723999999877,68.026145999999983],[-65.981383999999991,68.029984000000127],[-65.943603999999993,68.046097000000145],[-65.948607999999979,68.09248400000007],[-65.958617999999944,68.129424999999969],[-65.961945000000014,68.13749700000011],[-65.960555999999997,68.144440000000145],[-65.94749499999989,68.154160000000047],[-65.941665999999941,68.157211000000018],[-65.928329000000019,68.162201000000096],[-65.920837000000006,68.161926000000051],[-65.911941999999954,68.15887500000008],[-65.867492999999911,68.124694999999974],[-65.863892000000021,68.119431000000134],[-65.857773000000009,68.110260000000039],[-65.853607000000011,68.078048999999908],[-65.853607000000011,68.073317999999972],[-65.857773000000009,68.067215000000033],[-65.933837999999923,68.01226800000012],[-65.96032699999995,67.996429000000035],[-65.980835000000013,67.987267000000088],[-65.994330999999988,67.979767000000038],[-66.032226999999978,67.952484000000027],[-65.985824999999977,67.916655999999989],[-65.967223999999987,67.853317000000061],[-65.980835000000013,67.842758000000003],[-66.005004999999869,67.814986999999974],[-66.009734999999978,67.803314000000114],[-66.028884999999946,67.724426000000108],[-66.028884999999946,67.719436999999971],[-66.021941999999967,67.650269000000037],[-66.020003999999915,67.635269000000108],[-66.013061999999934,67.626923000000033],[-66.008621000000005,67.625534000000016],[-65.999724999999899,67.627472000000125],[-65.986663999999962,67.635269000000108],[-65.961394999999982,67.689697000000081],[-65.950286999999946,67.722487999999998],[-65.936935000000005,67.765549000000021],[-65.938598999999954,67.77609300000006],[-65.942490000000021,67.780823000000112],[-65.953888000000006,67.798324999999977],[-65.95666499999993,67.811920000000043],[-65.955840999999964,67.818329000000062],[-65.953338999999971,67.821381000000031],[-65.946105999999986,67.82638500000013],[-65.926391999999964,67.832763999999997],[-65.869155999999919,67.844147000000021],[-65.831679999999949,67.854431000000034],[-65.804169000000002,67.863602000000014],[-65.795272999999952,67.868042000000003],[-65.763625999999931,67.909987999999998],[-65.762222000000008,67.914703000000031],[-65.763901000000033,67.919708000000071],[-65.767226999999991,67.923035000000027],[-65.798889000000031,67.938309000000118],[-65.819732999999985,67.955551000000128],[-65.823623999999995,67.962768999999923],[-65.817779999999971,67.968048000000124],[-65.807769999999948,67.971100000000035],[-65.684433000000013,67.992477000000065],[-65.46305799999999,67.996368000000132],[-65.448607999999979,67.995529000000147],[-65.443603999999993,67.992203000000131],[-65.441939999999988,67.986923000000047],[-65.442490000000021,67.981369000000086],[-65.457503999999972,67.937194999999917],[-65.464447000000007,67.920822000000044],[-65.52027899999996,67.843048000000067],[-65.525833000000034,67.837769000000037],[-65.545273000000009,67.822220000000129],[-65.55860899999999,67.814423000000033],[-65.573623999999938,67.806931000000077],[-65.603881999999999,67.79693599999996],[-65.610549999999876,67.792755000000056],[-65.615829000000019,67.786102000000085],[-65.613891999999908,67.780823000000112],[-65.610001000000011,67.776382000000012],[-65.591948999999943,67.763046000000088],[-65.572509999999966,67.751663000000065],[-65.556945999999868,67.7452550000001],[-65.517501999999979,67.733047000000056],[-65.473617999999931,67.719711000000075],[-65.454726999999991,67.71276899999998],[-65.439712999999927,67.705551000000014],[-65.426391999999964,67.696365000000014],[-65.41361999999998,67.683593999999914],[-65.40695199999999,67.674988000000042],[-65.403609999999958,67.664703000000088],[-65.400283999999942,67.654434000000037],[-65.396392999999875,67.64498900000001],[-65.384734999999921,67.625809000000004],[-65.363892000000021,67.597488000000112],[-65.356658999999922,67.594711000000018],[-65.346389999999985,67.593323000000112],[-65.335281000000009,67.593597000000045],[-65.322784000000013,67.594986000000063],[-65.318344000000025,67.601089000000002],[-65.369155999999919,67.70277400000009],[-65.379165999999941,67.711655000000007],[-65.40264899999994,67.72322100000008],[-65.462508999999955,67.741928000000144],[-65.492492999999968,67.751663000000065],[-65.510833999999988,67.759155000000021],[-65.544448999999986,67.774155000000121],[-65.550551999999982,67.778320000000122],[-65.554442999999992,67.783051000000057],[-65.554442999999992,67.788040000000024],[-65.423614999999984,67.898041000000035],[-65.292495999999971,67.934143000000006],[-65.235275000000001,67.944702000000063],[-65.201401000000033,67.954436999999984],[-65.171660999999915,67.966094999999996],[-65.156386999999938,67.973602000000085],[-65.144164999999873,67.984145999999953],[-65.141387999999949,67.990265000000022],[-65.145553999999947,67.997208000000001],[-65.175827000000027,68.008881000000031],[-65.180831999999953,68.012207000000046],[-65.181106999999997,68.016662999999994],[-65.176665999999955,68.022491000000059],[-65.169158999999922,68.027206000000092],[-65.047775000000001,68.04942299999999],[-65.001113999999916,68.055542000000003],[-64.973052999999993,68.050261999999975],[-64.734160999999972,67.993866000000025],[-64.723617999999988,67.99054000000001],[-64.717498999999975,67.986374000000126],[-64.713622999999984,67.981659000000093],[-64.718063000000029,67.976654000000053],[-64.725554999999929,67.971648999999957],[-64.743332000000009,67.965819999999951],[-64.84722899999997,67.934981999999991],[-64.942490000000021,67.912490999999989],[-65.015288999999996,67.862488000000042],[-65.017775999999969,67.820830999999998],[-65.008347000000015,67.785262999999929],[-65.014175000000023,67.780273000000079],[-65.051101999999958,67.754439999999988],[-65.060546999999929,67.752213000000097],[-65.085280999999895,67.749145999999996],[-65.112212999999997,67.748032000000023],[-65.124434999999949,67.746368000000018],[-65.136123999999995,67.743591000000094],[-65.145553999999947,67.738876000000062],[-65.158339999999953,67.729706000000022],[-65.179992999999911,67.713608000000136],[-65.192489999999964,67.702209000000039],[-65.196380999999974,67.69720500000011],[-65.198607999999922,67.691649999999981],[-65.205001999999979,67.65914900000007],[-65.205565999999919,67.653595000000109],[-65.204178000000013,67.648331000000098],[-65.200286999999946,67.643875000000037],[-65.178328999999962,67.633605999999986],[-65.172500999999954,67.633605999999986],[-65.167220999999984,67.635818000000029],[-65.162780999999995,67.63888500000013],[-65.150283999999999,67.672211000000118],[-65.149733999999967,67.677765000000079],[-65.150283999999999,67.68193100000002],[-65.154174999999952,67.686646000000053],[-65.153335999999911,67.692200000000014],[-65.148894999999982,67.698317999999972],[-65.129715000000033,67.715820000000008],[-65.124161000000015,67.718047999999953],[-64.929717999999923,67.78776600000009],[-64.919723999999917,67.790817000000118],[-64.907227000000034,67.792205999999965],[-64.827224999999942,67.784714000000008],[-64.81639100000001,67.78137200000009],[-64.810546999999985,67.777205999999978],[-64.808884000000035,67.771927000000005],[-64.80749499999996,67.74275200000011],[-64.81610099999989,67.710541000000035],[-64.825835999999981,67.703049000000078],[-64.837509000000011,67.700271999999984],[-64.862777999999992,67.691649999999981],[-64.862502999999947,67.687484999999981],[-64.84944200000001,67.687194999999974],[-64.820557000000008,67.688308999999947],[-64.799728000000016,67.690811000000053],[-64.779448999999886,67.697754000000032],[-64.773055999999997,67.703598000000056],[-64.768616000000009,67.709427000000062],[-64.762221999999952,67.76249700000011],[-64.755843999999968,67.817764000000068],[-64.75,67.822769000000108],[-64.740829000000019,67.824707000000046],[-64.65306099999998,67.82887299999993],[-64.611938000000009,67.82638500000013],[-64.56806899999998,67.819992000000013],[-64.506957999999997,67.80720500000001],[-64.368880999999931,67.764160000000061],[-64.363327000000027,67.759430000000009],[-64.363891999999964,67.754439999999988],[-64.396117999999944,67.711929000000112],[-64.401397999999915,67.707764000000111],[-64.414718999999991,67.707214000000079],[-64.431380999999988,67.709717000000069],[-64.445266999999944,67.71138000000002],[-64.460006999999905,67.711655000000007],[-64.472503999999958,67.710266000000047],[-64.578338999999971,67.696930000000066],[-64.597228999999857,67.689697000000081],[-64.61721799999998,67.678589000000045],[-64.637221999999895,67.665267999999912],[-64.639175000000023,67.660538000000088],[-64.626389000000017,67.659714000000122],[-64.618332000000009,67.663040000000137],[-64.581389999999999,67.67442299999999],[-64.515839000000028,67.68609600000002],[-64.454177999999956,67.693314000000044],[-64.380828999999892,67.698029000000076],[-64.36250299999989,67.702484000000084],[-64.34722899999997,67.709991000000002],[-64.331389999999885,67.727203000000031],[-64.326400999999919,67.731094000000098],[-64.318068999999923,67.73414600000001],[-64.305557000000022,67.733597000000088],[-64.295273000000009,67.730270000000132],[-64.072784000000013,67.610260000000096],[-64.067779999999971,67.602477999999962],[-64.039718999999991,67.533600000000092],[-64.038604999999905,67.528595000000053],[-64.038895000000025,67.525818000000129],[-64.044998000000021,67.520828000000051],[-64.053054999999915,67.517487000000017],[-64.134734999999921,67.490265000000079],[-64.144729999999925,67.487197999999978],[-64.165282999999988,67.482482999999945],[-64.238601999999901,67.46748400000007],[-64.250838999999871,67.466095000000109],[-64.271941999999967,67.464996000000099],[-64.281113000000005,67.465546000000131],[-64.343886999999938,67.469985999999949],[-64.386948000000018,67.474425999999994],[-64.412216000000001,67.477478000000076],[-64.423049999999989,67.478043000000127],[-64.435546999999985,67.478592000000049],[-64.440552000000025,67.474991000000045],[-64.432220000000029,67.471099999999979],[-64.410004000000015,67.464156999999943],[-64.384734999999978,67.458328000000108],[-64.356948999999986,67.453873000000101],[-64.296660999999915,67.448029000000076],[-64.283614999999998,67.448029000000076],[-64.204452999999944,67.452209000000096],[-64.190551999999968,67.453323000000069],[-64.166945999999996,67.456940000000031],[-64.145003999999858,67.461655000000064],[-64.123321999999916,67.465271000000143],[-64.111114999999927,67.466660000000104],[-64.086394999999982,67.46748400000007],[-64.048049999999876,67.464156999999943],[-64.010833999999988,67.459717000000126],[-64.00111400000003,67.455826000000059],[-63.992653000000018,67.448624000000109],[-63.951110999999969,67.409988000000112],[-63.904166999999973,67.30581699999999],[-63.904166999999973,67.301651000000106],[-63.905829999999924,67.299712999999997],[-63.912773000000016,67.295532000000094],[-63.923889000000031,67.293320000000051],[-63.93721800000003,67.292755],[-64.022780999999952,67.30802900000009],[-64.055266999999958,67.311371000000008],[-64.084732000000031,67.313309000000118],[-64.181670999999938,67.312194999999974],[-64.217498999999975,67.313598999999954],[-64.339995999999985,67.319442999999978],[-64.530562999999916,67.33776899999998],[-64.740279999999984,67.356934000000138],[-64.757507000000032,67.358322000000044],[-64.788329999999917,67.35914600000001],[-64.797500999999954,67.356644000000131],[-64.80082699999997,67.352768000000026],[-64.798889000000031,67.350266000000147],[-64.788605000000018,67.34693900000002],[-64.73443599999996,67.333603000000096],[-64.721389999999928,67.331374999999923],[-64.687774999999988,67.327484000000027],[-64.441665999999998,67.303040000000124],[-64.402221999999995,67.299149000000057],[-64.372498000000007,67.297211000000118],[-64.344726999999921,67.297485000000052],[-64.283614999999998,67.299987999999985],[-64.258621000000005,67.299149000000057],[-64.24610899999999,67.298599000000024],[-64.23832699999997,67.296936000000073],[-64.231948999999986,67.293320000000051],[-64.233886999999868,67.288589000000115],[-64.248336999999992,67.279434000000037],[-64.306380999999988,67.262207000000046],[-64.325012000000015,67.257216999999969],[-64.356110000000001,67.250275000000045],[-64.392226999999991,67.24664300000012],[-64.419448999999929,67.247207999999944],[-64.509170999999981,67.254990000000078],[-64.536941999999954,67.256653000000028],[-64.550277999999992,67.25610400000005],[-64.668610000000001,67.238585999999941],[-64.724166999999966,67.22886699999998],[-64.779174999999952,67.218872000000033],[-64.790282999999931,67.21665999999999],[-64.799987999999928,67.213608000000079],[-64.80972300000002,67.210266000000104],[-64.81610099999989,67.206940000000088],[-64.813048999999978,67.201385000000016],[-64.808043999999995,67.198029000000133],[-64.801392000000021,67.195250999999985],[-64.783324999999934,67.190262000000018],[-64.772781000000009,67.189696999999967],[-64.758895999999993,67.19081099999994],[-64.71665999999999,67.200272000000098],[-64.655838000000017,67.217209000000139],[-64.46665999999999,67.229156000000046],[-64.425277999999935,67.228043000000014],[-64.350783999999976,67.234764000000098],[-64.287444999999991,67.238257999999973],[-64.267112999999995,67.241425000000049],[-64.232772999999952,67.251434000000017],[-64.169448999999986,67.260818000000029],[-64.158889999999928,67.262497000000053],[-64.114715999999987,67.267212000000086],[-64.010559000000001,67.275269000000037],[-63.976944000000003,67.277771000000087],[-63.969993999999986,67.27748100000008],[-63.965836000000024,67.275542999999971],[-63.962775999999963,67.272491000000059],[-63.962775999999963,67.270263999999997],[-63.975829999999917,67.251937999999996],[-63.993056999999965,67.228317000000118],[-63.998336999999935,67.221649000000127],[-64.013335999999981,67.212204000000042],[-64.021392999999989,67.208878000000027],[-64.045272999999952,67.204711999999972],[-64.05610699999994,67.204437000000098],[-64.088608000000022,67.207764000000054],[-64.220222000000035,67.201714000000038],[-64.467498999999918,67.167480000000069],[-64.501403999999923,67.161652000000004],[-64.545272999999952,67.152481000000023],[-64.575011999999958,67.144714000000079],[-64.584166999999923,67.142212000000029],[-64.611938000000009,67.132477000000108],[-64.658050999999944,67.113037000000134],[-64.680831999999953,67.09304800000001],[-64.686935000000005,67.087493999999992],[-64.689986999999917,67.083602999999925],[-64.692490000000021,67.078048999999965],[-64.700561999999991,67.018051000000071],[-64.701110999999912,67.012207000000046],[-64.700561999999991,67.008040999999992],[-64.696945000000028,67.003326000000129],[-64.691939999999988,67.000549000000035],[-64.683060000000012,67.000275000000101],[-64.660278000000005,67.003875999999991],[-64.638610999999969,67.008606000000043],[-64.628325999999959,67.012207000000046],[-64.623885999999914,67.018051000000071],[-64.619720000000029,67.028320000000122],[-64.618057000000022,67.039428999999984],[-64.618057000000022,67.044434000000081],[-64.619720000000029,67.049713000000054],[-64.618880999999988,67.055252000000053],[-64.615279999999927,67.066940000000045],[-64.609160999999972,67.081940000000031],[-64.604172000000005,67.088317999999958],[-64.597777999999892,67.093872000000147],[-64.583617999999888,67.103043000000127],[-64.547501000000011,67.118590999999924],[-64.527221999999881,67.124145999999996],[-64.506393000000003,67.129425000000026],[-64.474715999999944,67.13499500000006],[-64.229995999999971,67.164154000000053],[-64.087218999999948,67.179703000000131],[-64.008895999999993,67.178864000000033],[-63.995551999999975,67.179428000000144],[-63.971381999999949,67.182205000000067],[-63.96055599999994,67.184417999999994],[-63.929726000000016,67.192749000000106],[-63.919166999999959,67.196365000000128],[-63.912216000000001,67.200546000000031],[-63.86222099999992,67.225815000000011],[-63.80750299999994,67.239150999999993],[-63.797500999999954,67.240265000000136],[-63.561942999999985,67.236923000000047],[-63.546394000000021,67.235809000000074],[-63.469443999999953,67.228317000000118],[-63.458336000000031,67.226088999999945],[-63.450554000000011,67.222488000000112],[-63.449164999999994,67.219437000000084],[-63.449164999999994,67.214995999999985],[-63.450835999999981,67.179703000000131],[-63.453888000000006,67.169434000000138],[-63.529442000000017,67.104431000000034],[-63.53833800000001,67.100540000000137],[-63.604720999999984,67.075272000000041],[-63.613892000000021,67.072769000000051],[-63.648055999999883,67.066940000000045],[-63.672775000000001,67.063599000000011],[-63.712776000000019,67.054977000000008],[-63.722771000000023,67.05192599999998],[-63.731383999999991,67.048035000000084],[-63.744445999999982,67.041092000000106],[-63.779723999999987,67.017487000000131],[-63.795836999999949,67.006653000000085],[-63.806389000000024,66.99581900000004],[-63.807219999999973,66.988037000000077],[-63.801392000000021,66.979705999999965],[-63.781386999999938,66.963608000000136],[-63.772498999999868,66.958878000000084],[-63.769447000000014,66.97137500000008],[-63.768889999999942,66.976929000000041],[-63.771111000000019,66.980819999999937],[-63.772498999999868,66.986098999999911],[-63.773613000000012,66.991088999999988],[-63.773330999999985,66.996094000000028],[-63.770836000000031,67.001389000000074],[-63.767219999999952,67.006104000000107],[-63.756950000000018,67.014160000000004],[-63.750557000000015,67.017487000000131],[-63.734443999999939,67.024155000000121],[-63.698607999999979,67.038878999999952],[-63.680000000000007,67.045821999999987],[-63.650832999999977,67.052475000000129],[-63.638335999999981,67.054428000000087],[-63.600837999999953,67.057479999999998],[-63.565552000000025,67.062485000000038],[-63.535277999999948,67.070831000000112],[-63.497222999999963,67.085266000000047],[-63.40277900000001,67.144440000000145],[-63.396392999999989,67.152206000000035],[-63.39416499999993,67.156936999999971],[-63.393889999999942,67.161652000000004],[-63.398055999999997,67.165817000000004],[-63.416945999999882,67.180267000000072],[-63.419997999999964,67.185806000000071],[-63.421943999999883,67.194702000000007],[-63.420836999999949,67.200272000000098],[-63.417777999999998,67.206100000000049],[-63.409163999999919,67.21665999999999],[-63.351669000000015,67.268051000000014],[-63.340553,67.276657000000114],[-63.332503999999972,67.281937000000028],[-63.298888999999974,67.297760000000039],[-63.280555999999933,67.306366000000139],[-63.272498999999982,67.309418000000051],[-63.160277999999948,67.328323000000012],[-63.137222000000008,67.331100000000106],[-63.110282999999868,67.329987000000017],[-63.03972599999986,67.306090999999924],[-63.022498999999925,67.298035000000084],[-63.015006999999969,67.293593999999985],[-62.997779999999977,67.281372000000147],[-62.992774999999995,67.276382000000126],[-62.973884999999882,67.235535000000141],[-62.970832999999971,67.225815000000011],[-62.970832999999971,67.221375000000023],[-63.023055999999997,67.179428000000144],[-63.035834999999963,67.171097000000032],[-63.04472399999986,67.167205999999965],[-63.075561999999934,67.15887500000008],[-63.100554999999986,67.155548000000124],[-63.134170999999981,67.15277100000003],[-63.170279999999991,67.147217000000069],[-63.19027699999998,67.143326000000002],[-63.232497999999964,67.132202000000063],[-63.242500000000007,67.129149999999981],[-63.268889999999942,67.117477000000122],[-63.275832999999977,67.113312000000121],[-63.284447,67.105255],[-63.285278000000005,67.099716000000001],[-63.283614999999998,67.094986000000119],[-63.278052999999943,67.090820000000065],[-63.268607999999972,67.082488999999953],[-63.260833999999988,67.074158000000068],[-63.25389100000001,67.064697000000081],[-63.224716000000001,67.024704000000042],[-63.220276000000013,67.016937000000098],[-63.220276000000013,67.006104000000107],[-63.220832999999971,66.989699999999971],[-63.221381999999949,66.984984999999938],[-63.223884999999996,66.979430999999977],[-63.227776000000006,66.972762999999986],[-63.240836999999999,66.961655000000007],[-63.27777900000001,66.949706999999933],[-63.320557000000008,66.940262000000075],[-63.356109999999944,66.934708000000057],[-63.36860699999994,66.934708000000057],[-63.43638599999997,66.925537000000134],[-63.469993999999986,66.920532000000094],[-63.514724999999999,66.912490999999989],[-63.526138000000003,66.909271000000047],[-63.545554999999865,66.903595000000053],[-63.554442999999935,66.899719000000005],[-63.565552000000025,66.892487000000074],[-63.565552000000025,66.888046000000145],[-63.563613999999973,66.883605999999929],[-63.557502999999997,66.875809000000004],[-63.554717999999866,66.870254999999986],[-63.551392000000021,66.860535000000084],[-63.555557000000022,66.848877000000073],[-63.571944999999971,66.837494000000049],[-63.593329999999924,66.831665000000044],[-63.615004999999996,66.827208999999982],[-63.638892999999882,66.824432000000058],[-63.652221999999881,66.82388300000008],[-63.698607999999979,66.822495000000004],[-63.725273000000016,66.823043999999982],[-63.775832999999921,66.825821000000019],[-63.771384999999952,66.811096000000077],[-63.653053,66.802475000000015],[-63.624442999999928,66.801926000000037],[-63.598334999999906,66.80304000000001],[-63.587776000000019,66.804428000000144],[-63.548889000000031,66.812485000000095],[-63.539443999999946,66.814697000000137],[-63.535277999999948,66.81581100000011],[-63.488891999999964,66.828323000000125],[-63.478881999999942,66.835815000000082],[-63.476386999999932,66.839157],[-63.475272999999959,66.842484000000127],[-63.476944000000003,66.846939000000134],[-63.487220999999977,66.858871000000079],[-63.494719999999973,66.865539999999953],[-63.496947999999861,66.880814000000044],[-63.487220999999977,66.896942000000081],[-63.480826999999977,66.90248100000008],[-63.474441999999954,66.906096999999932],[-63.456107999999972,66.910811999999964],[-63.441665999999998,66.908325000000104],[-63.427223000000026,66.901382000000126],[-63.407218999999998,66.814423000000033],[-63.407776000000013,66.809708000000001],[-63.410278000000005,66.799988000000099],[-63.414718999999991,66.783325000000048],[-63.417777999999998,66.773040999999978],[-63.436110999999926,66.728043000000071],[-63.449439999999925,66.716095000000053],[-63.453056000000004,66.711655000000064],[-63.451941999999917,66.70637499999998],[-63.441939999999931,66.703048999999965],[-63.420279999999934,66.698868000000061],[-63.415276000000006,66.700546000000145],[-63.408332999999914,66.704437000000041],[-63.40277900000001,66.708878000000141],[-63.376663000000008,66.734146000000067],[-63.32028200000002,66.814148000000046],[-63.319450000000018,66.819992000000013],[-63.224716000000001,66.899428999999998],[-62.973884999999882,66.961104999999975],[-62.962501999999972,66.963882000000069],[-62.939994999999954,66.966660000000047],[-62.87222300000002,66.964432000000102],[-62.846946999999943,66.961929000000112],[-62.837776000000019,66.957764000000111],[-62.821114000000023,66.830276000000083],[-62.820557000000008,66.813599000000067],[-62.827498999999932,66.78804000000008],[-62.829726999999991,66.783325000000048],[-62.837501999999972,66.771927000000005],[-62.84332999999998,66.769149999999911],[-62.864448999999979,66.746094000000085],[-62.869995000000017,66.739700000000028],[-62.873055000000022,66.733597000000088],[-62.91194200000001,66.652771000000143],[-62.914444000000003,66.647216999999955],[-62.908050999999944,66.63998400000014],[-62.903052999999943,66.637207000000046],[-62.899726999999984,66.636658000000125],[-62.859169000000009,66.653045999999961],[-62.850280999999939,66.656937000000028],[-62.835274000000027,66.666382000000112],[-62.819999999999936,66.684418000000107],[-62.734168999999952,66.790816999999947],[-62.735831999999959,66.801651000000049],[-62.743331999999953,66.809982000000105],[-62.751113999999916,66.818054000000075],[-62.768058999999937,66.830551000000071],[-62.774170000000026,66.840546000000018],[-62.768332999999984,66.907760999999994],[-62.764449999999954,66.925262000000089],[-62.761115999999959,66.929152999999985],[-62.743057000000022,66.941924999999969],[-62.725273000000016,66.947478999999987],[-62.634170999999981,66.951385000000073],[-62.607779999999991,66.952209000000039],[-62.592223999999931,66.950821000000133],[-62.578612999999962,66.947754000000032],[-62.568892999999889,66.944138000000123],[-62.549994999999967,66.931655999999975],[-62.519996999999933,66.911102000000028],[-62.40277900000001,66.809417999999994],[-62.401389999999935,66.804977000000065],[-62.40193899999997,66.789154000000053],[-62.398613000000012,66.780272999999909],[-62.393332999999984,66.775818000000072],[-62.326950000000011,66.730270000000132],[-62.319450000000018,66.726379000000065],[-62.313332000000003,66.726929000000098],[-62.299171000000001,66.733047000000056],[-62.291388999999924,66.756378000000097],[-62.292777999999998,66.761658000000011],[-62.295837000000006,66.766388000000006],[-62.362220999999977,66.818329000000119],[-62.419448999999986,66.843323000000055],[-62.424720999999977,66.847488000000055],[-62.426948999999865,66.851378999999952],[-62.436942999999985,66.884430000000123],[-62.427222999999969,66.921097000000088],[-62.418891999999971,66.926651000000106],[-62.407501000000025,66.92942800000003],[-62.394721999999945,66.929152999999985],[-62.346946999999886,66.933594000000085],[-62.284728999999913,66.946091000000081],[-62.271666999999979,66.960815000000139],[-62.279723999999931,66.979156000000103],[-62.291388999999924,67.005829000000119],[-62.294448999999986,67.021378000000027],[-62.293616999999983,67.026382000000012],[-62.290282999999988,67.032486000000006],[-62.285277999999948,67.036102000000085],[-62.278609999999958,67.039428999999984],[-62.262504999999976,67.045258000000047],[-62.101394999999968,67.054703000000075],[-62.054442999999878,67.049149000000114],[-62.03194400000001,67.045258000000047],[-62.019721999999945,67.042206000000078],[-62.005561999999941,67.0352630000001],[-62.006950000000018,67.031937000000084],[-62.04999499999991,66.987198000000092],[-62.106110000000001,66.917206000000022],[-62.102225999999916,66.913040000000137],[-62.072226999999998,66.907486000000119],[-62.029723999999987,66.901657000000114],[-62.018889999999942,66.901657000000114],[-62.018607999999972,66.908035000000098],[-62.015006999999912,66.91415400000011],[-61.95666499999993,66.963882000000069],[-61.949722000000008,66.967208999999968],[-61.938605999999993,66.969436999999971],[-61.913329999999974,66.970825000000048],[-61.865554999999972,66.970825000000048],[-61.851395000000025,66.970535000000041],[-61.83805099999995,66.968597000000102],[-61.749725000000012,66.94802900000002],[-61.737220999999977,66.941086000000041],[-61.731941000000006,66.93691999999993],[-61.728881999999942,66.932205000000067],[-61.730826999999863,66.923874000000012],[-61.612777999999992,66.870818999999926],[-61.314163000000008,66.687195000000031],[-61.294723999999917,66.67442299999999],[-61.289443999999946,66.669983000000002],[-61.281386999999995,66.661102000000028],[-61.262504999999976,66.629425000000083],[-61.266662999999937,66.622756999999922],[-61.300277999999935,66.593597000000045],[-61.341667000000029,66.571930000000009],[-61.348052999999936,66.570541000000048],[-61.356666999999959,66.571106000000043],[-61.388335999999981,66.578598],[-61.400275999999963,66.577208999999982],[-61.409720999999934,66.572768999999994],[-61.425003000000004,66.559708000000057],[-61.447776999999974,66.538315000000125],[-61.46166999999997,66.543319999999994],[-61.54861499999987,66.547484999999995],[-61.584723999999994,66.547760000000039],[-61.598609999999951,66.550262000000089],[-61.618056999999965,66.557205000000067],[-61.623885999999914,66.566939999999988],[-61.631942999999978,66.586654999999951],[-61.638610999999969,66.595534999999984],[-61.643889999999999,66.599991000000102],[-61.669166999999959,66.616378999999995],[-61.691382999999973,66.62831100000011],[-61.72582999999986,66.643051000000071],[-61.734443999999996,66.645827999999995],[-61.950554000000011,66.67692599999998],[-62.015555999999947,66.671371000000079],[-62.12388599999997,66.626373000000001],[-62.050551999999982,66.624985000000095],[-62.018607999999972,66.640823000000125],[-61.990836999999999,66.648041000000092],[-61.979995999999971,66.648041000000092],[-61.950554000000011,66.646102999999982],[-61.830284000000006,66.621368000000132],[-61.796950999999979,66.611923000000047],[-61.788895000000025,66.608597000000032],[-61.75389100000001,66.588593000000117],[-61.576667999999984,66.487198000000035],[-61.575279000000023,66.48275799999999],[-61.576392999999996,66.477203000000088],[-61.583327999999938,66.471649000000127],[-61.59194199999996,66.46775800000006],[-61.614166000000012,66.463043000000027],[-61.635001999999929,66.459991000000059],[-61.731383999999935,66.451096000000064],[-61.844161999999926,66.446091000000024],[-61.857779999999934,66.447204999999997],[-61.869720000000029,66.445815999999979],[-61.956947000000014,66.424149000000114],[-61.976943999999946,66.417480000000069],[-61.985832000000016,66.413605000000075],[-61.986945999999932,66.410262999999986],[-61.978049999999996,66.403869999999984],[-61.96416499999998,66.401382000000012],[-61.934165999999891,66.400818000000072],[-61.755004999999983,66.407486000000063],[-61.578612999999905,66.415268000000026],[-61.569449999999904,66.415543000000014],[-61.557266000000027,66.413680999999997],[-61.545279999999991,66.409988000000112],[-61.466942000000017,66.371918000000051],[-61.462501999999972,66.369141000000127],[-61.463614999999891,66.365814],[-61.665276000000006,66.324996999999996],[-61.877494999999954,66.283324999999934],[-61.928885999999977,66.283874999999966],[-62.198883000000023,66.314148000000102],[-62.207503999999915,66.316666000000112],[-62.212218999999948,66.319442999999978],[-62.218055999999933,66.331939999999975],[-62.231941000000006,66.366089000000045],[-62.232215999999937,66.369705000000067],[-62.229439000000013,66.375259000000085],[-62.224998000000028,66.380264000000125],[-62.218604999999968,66.392487000000017],[-62.218329999999867,66.396652000000017],[-62.223610000000008,66.401093000000117],[-62.229996000000028,66.40415999999999],[-62.255279999999914,66.408324999999991],[-62.268889999999999,66.409424000000001],[-62.418610000000001,66.421097000000032],[-62.456107999999915,66.423874000000126],[-62.565833999999995,66.42804000000001],[-62.626662999999894,66.426085999999998],[-62.698883000000023,66.41276600000009],[-62.709723999999994,66.410537999999974],[-62.716110000000015,66.407211000000018],[-62.710281000000009,66.403594999999996],[-62.673614999999984,66.393600000000049],[-62.629996999999946,66.387771999999984],[-62.478049999999996,66.369980000000112],[-62.337501999999972,66.315811000000053],[-62.32028200000002,66.308319000000097],[-62.316108999999983,66.304977000000008],[-62.320556999999951,66.299712999999997],[-62.323616000000015,66.298035000000084],[-62.388892999999939,66.276093000000003],[-62.398338000000024,66.273041000000092],[-62.621940999999993,66.221375000000023],[-62.643615999999952,66.216933999999924],[-62.666945999999939,66.214432000000045],[-62.680832000000009,66.216933999999924],[-62.751944999999921,66.241088999999931],[-62.757225000000005,66.245255000000043],[-62.780555999999933,66.277771000000143],[-62.782218999999884,66.282486000000006],[-62.782218999999884,66.288879000000122],[-62.773330999999985,66.296936000000073],[-62.774170000000026,66.302765000000136],[-62.77944199999996,66.307205000000124],[-62.797225999999966,66.313873000000115],[-62.816665999999941,66.320831000000112],[-62.826110999999912,66.324158000000011],[-62.858894000000021,66.334152000000074],[-62.868057000000022,66.336104999999975],[-62.881110999999976,66.335815000000139],[-62.889998999999989,66.333328000000108],[-62.895003999999915,66.329712000000029],[-62.809440999999993,66.240814000000114],[-62.801391999999964,66.235259999999926],[-62.715003999999908,66.201660000000061],[-62.706107999999972,66.199707000000103],[-62.681389000000024,66.196930000000009],[-62.647223999999994,66.199707000000103],[-62.603614999999991,66.205261000000121],[-62.488051999999925,66.200271999999927],[-62.366660999999965,66.174987999999985],[-62.180557000000022,66.148604999999975],[-62.037505999999951,66.100815000000011],[-61.961112999999898,66.033875000000023],[-61.955001999999979,66.024155000000121],[-61.954445000000021,66.019150000000081],[-61.955832999999927,66.014998999999989],[-61.960280999999895,66.011932000000058],[-61.975554999999986,66.010543999999982],[-62.088889999999935,66.000274999999931],[-62.133614000000023,66.000000000000114],[-62.148055999999997,66.001389000000131],[-62.166388999999981,66.00749200000007],[-62.172501000000011,66.010543999999982],[-62.188889000000017,66.012207000000103],[-62.196663000000001,66.011108000000092],[-62.291672000000005,65.980270000000132],[-62.307776999999987,65.973876999999959],[-62.391669999999863,66.011383000000137],[-62.404715999999894,66.014708999999982],[-62.525276000000019,66.034149000000127],[-62.541388999999981,66.035537999999974],[-62.695549000000028,66.042205999999965],[-62.74111199999993,66.038315000000068],[-62.759726999999884,66.033051000000057],[-62.778885000000002,66.033324999999991],[-62.799995000000024,66.039703000000145],[-62.809165999999891,66.043869000000029],[-62.831672999999967,66.055542000000059],[-62.842223999999987,66.064147999999989],[-62.846946999999943,66.069153000000028],[-62.855003000000011,66.083054000000004],[-62.856667000000016,66.087494000000049],[-62.860001000000011,66.103043000000127],[-62.8663939999999,66.112761999999975],[-62.873329000000012,66.121368000000075],[-62.884170999999867,66.129973999999947],[-62.90555599999999,66.140823000000012],[-62.930557000000022,66.146942000000081],[-62.946945000000028,66.148604999999975],[-62.95944199999991,66.14888000000002],[-62.970551,66.148041000000035],[-63.013618000000008,66.138885000000073],[-63.041672000000005,66.130264000000011],[-63.061942999999928,66.120819000000097],[-63.060279999999977,66.116379000000109],[-63.039443999999889,66.113312000000008],[-63.006393000000003,66.11692800000003],[-62.892226999999934,66.076660000000004],[-62.889998999999989,66.066375999999934],[-62.885833999999988,66.056366000000025],[-62.875,66.047760000000096],[-62.862220999999863,66.039429000000041],[-62.841942000000017,66.027480999999966],[-62.826667999999927,66.020264000000054],[-62.815833999999938,66.016098],[-62.793616999999983,66.010818000000086],[-62.778885000000002,66.009720000000016],[-62.768332999999984,66.009720000000016],[-62.755561999999884,66.00999500000006],[-62.743889000000024,66.011383000000137],[-62.67472099999992,66.015549000000021],[-62.523055999999997,66.002213000000097],[-62.517219999999952,66.000549000000092],[-62.4183349999999,65.970535000000041],[-62.405555999999933,65.963043000000084],[-62.395003999999915,65.949996999999996],[-62.386664999999994,65.936646000000053],[-62.321114000000023,65.831100000000049],[-62.317222999999956,65.808029000000033],[-62.441665999999941,65.793594000000098],[-62.478881999999999,65.790817000000004],[-62.505279999999971,65.790817000000004],[-62.521384999999952,65.792480000000126],[-62.604171999999892,65.801085999999998],[-62.619995000000017,65.803040000000067],[-62.684440999999936,65.816375999999991],[-62.717773000000022,65.825272000000098],[-62.727218999999991,65.828598],[-62.729996000000028,65.831940000000088],[-62.75278499999996,65.853591999999935],[-62.80750299999994,65.88998400000014],[-62.829445000000021,65.899994000000049],[-62.857506000000001,65.911102000000028],[-62.864166000000012,65.911102000000028],[-62.870551999999918,65.90554800000001],[-62.871940999999936,65.901382000000126],[-62.87471800000003,65.887497000000053],[-62.87471800000003,65.883041000000105],[-62.760001999999986,65.816665999999998],[-62.746391000000017,65.809708000000001],[-62.736945999999932,65.80831900000004],[-62.719993999999929,65.809708000000001],[-62.658889999999985,65.791930999999977],[-62.597778000000005,65.771927000000062],[-62.582221999999888,65.765549000000078],[-62.575004999999976,65.761658000000011],[-62.569449999999961,65.757492000000127],[-62.568610999999919,65.752212999999927],[-62.569725000000005,65.746643000000063],[-62.579444999999964,65.728317000000061],[-62.583610999999962,65.723312000000021],[-62.587775999999963,65.720260999999994],[-62.59027900000001,65.719147000000021],[-62.59944200000001,65.718872000000147],[-62.612777999999992,65.72164900000007],[-62.621940999999993,65.725540000000137],[-62.67472099999992,65.735809000000017],[-62.823891000000003,65.761383000000023],[-62.833442999999875,65.752991000000009],[-62.833777999999882,65.74999200000002],[-62.828780999999879,65.744492000000093],[-62.799170999999887,65.711928999999998],[-62.788054999999929,65.708328000000108],[-62.726386999999988,65.71138000000002],[-62.698883000000023,65.710266000000047],[-62.681670999999994,65.708038000000101],[-62.662772999999902,65.701096000000007],[-62.59944200000001,65.675812000000008],[-62.59194199999996,65.671920999999941],[-62.589721999999938,65.668594000000041],[-62.595832999999857,65.652205999999978],[-62.602225999999973,65.640273999999977],[-62.611670999999944,65.624145999999939],[-62.617499999999893,65.614990000000034],[-62.628051999999968,65.601929000000098],[-62.645279000000016,65.587203999999929],[-62.653053,65.586104999999975],[-62.751113999999916,65.58526599999999],[-62.767220000000009,65.587493999999936],[-62.78472899999997,65.59137000000004],[-62.803054999999972,65.59887700000013],[-62.859726000000023,65.634720000000016],[-62.861389000000031,65.639160000000004],[-62.858611999999937,65.65525800000006],[-62.862503000000004,65.685257000000092],[-62.882998999999984,65.724152000000061],[-62.885001999999986,65.726973999999927],[-62.887999999999863,65.729652000000044],[-62.904167000000029,65.746368000000018],[-62.922500999999954,65.752212999999927],[-62.936110999999926,65.754990000000021],[-62.949439999999925,65.755263999999954],[-62.95944199999991,65.753876000000048],[-62.962219000000005,65.748322000000087],[-62.943610999999919,65.743042000000003],[-62.93472300000002,65.738876000000118],[-62.925277999999992,65.731093999999985],[-62.916663999999912,65.722214000000122],[-62.914444000000003,65.718323000000055],[-62.892226999999934,65.641937000000098],[-62.89166999999992,65.638321000000076],[-62.895836000000031,65.633040999999992],[-62.901389999999935,65.628036000000122],[-62.953330999999991,65.586929000000112],[-62.961670000000026,65.583054000000118],[-62.972220999999934,65.580826000000002],[-63.005004999999926,65.624985000000095],[-63.016113000000018,65.632750999999985],[-63.027495999999928,65.635818000000086],[-63.040282999999931,65.63749700000011],[-63.137779000000023,65.644150000000081],[-63.162498000000028,65.632477000000051],[-63.162406999999973,65.628868000000068],[-63.164443999999946,65.625534000000073],[-63.178611999999987,65.627472000000012],[-63.200279000000023,65.633330999999998],[-63.211945000000014,65.640549000000021],[-63.293891999999971,65.708878000000141],[-63.43638599999997,65.84526100000005],[-63.443054000000018,65.854705999999908],[-63.474167000000023,65.833054000000061],[-63.379165999999998,65.720260999999994],[-63.368332000000009,65.693863000000022],[-63.368332000000009,65.669434000000081],[-63.399726999999984,65.676375999999948],[-63.412215999999944,65.67804000000001],[-63.448607999999922,65.680817000000047],[-63.461944999999957,65.681090999999981],[-63.704720000000009,65.68220500000001],[-63.717216000000008,65.681656000000032],[-63.723609999999894,65.680267000000015],[-63.728607000000011,65.675812000000008],[-63.728881999999999,65.673035000000141],[-63.723609999999894,65.668869000000029],[-63.700553999999954,65.655823000000112],[-63.68360899999999,65.650818000000072],[-63.671669000000009,65.648330999999985],[-63.504723000000013,65.6308140000001],[-63.453330999999991,65.629700000000128],[-63.432502999999997,65.631927000000019],[-63.399726999999984,65.634155000000135],[-63.375,65.632202000000007],[-63.36860699999994,65.629150000000095],[-63.351669000000015,65.61775200000011],[-63.326667999999984,65.600815000000068],[-63.319999999999936,65.593322999999998],[-63.336661999999933,65.556930999999963],[-63.34332999999998,65.548325000000091],[-63.355003000000011,65.537766000000033],[-63.359726000000023,65.536102000000028],[-63.373610999999983,65.533874999999966],[-63.463332999999977,65.522766000000047],[-63.474715999999887,65.523605000000032],[-63.482215999999937,65.525269000000037],[-63.488608999999997,65.528320000000065],[-63.501396,65.536377000000016],[-63.523055999999997,65.550812000000121],[-63.532775999999899,65.558594000000085],[-63.541114999999934,65.570267000000115],[-63.541388999999867,65.574158000000011],[-63.546669000000009,65.581100000000106],[-63.561278999999956,65.585372999999947],[-63.567943999999954,65.590042000000096],[-63.572449000000006,65.591209000000049],[-63.581279999999992,65.591873000000078],[-63.589943000000005,65.591209000000049],[-63.595778999999993,65.589035000000081],[-63.608894000000021,65.589981000000023],[-63.618331999999953,65.541931000000034],[-63.616660999999908,65.537490999999989],[-63.612777999999878,65.533325000000104],[-63.601395000000025,65.530273000000022],[-63.530280999999945,65.512206999999989],[-63.43277699999993,65.484421000000111],[-63.391945000000021,65.472488000000112],[-63.362503000000004,65.463318000000015],[-63.309165999999948,65.445525999999973],[-63.301665999999898,65.441650000000095],[-63.295279999999991,65.436371000000122],[-63.290839999999946,65.431656000000089],[-63.292777999999998,65.428863999999976],[-63.393889999999942,65.425262000000032],[-63.409995999999921,65.426651000000049],[-63.468886999999938,65.439697000000137],[-63.495276999999987,65.450272000000098],[-63.502785000000017,65.454162999999994],[-63.521666999999979,65.461105000000089],[-63.532775999999899,65.464705999999978],[-63.553329000000019,65.468872000000033],[-63.568892999999946,65.471649000000127],[-63.583327999999995,65.4727630000001],[-63.64305899999988,65.473602000000085],[-63.65444199999996,65.472213999999951],[-63.655555999999933,65.470824999999991],[-63.654716000000008,65.464995999999985],[-63.627494999999954,65.455826000000116],[-63.563613999999973,65.435806000000071],[-63.483611999999994,65.404984000000013],[-63.335555999999997,65.30053700000002],[-63.335830999999985,65.295531999999923],[-63.424720999999977,65.229430999999977],[-63.472220999999934,65.196365000000014],[-63.418892000000028,65.145263999999997],[-63.376944999999978,65.110809000000017],[-63.424445999999932,65.049149000000114],[-63.464721999999938,65.018051000000128],[-63.527221999999995,64.971924000000058],[-63.528335999999967,64.967758000000003],[-63.546950999999979,64.887207000000046],[-63.653885000000002,64.911652000000061],[-63.659720999999934,64.939697000000081],[-63.747779999999977,64.962203999999986],[-63.824172999999973,64.984711000000061],[-63.828339000000028,65.010817999999915],[-63.825561999999877,65.012771999999984],[-63.720276000000013,65.030823000000112],[-63.669723999999917,65.034988000000112],[-63.659995999999978,65.03637700000013],[-63.655272999999966,65.03804000000008],[-63.658051,65.041091999999992],[-63.664718999999934,65.043594000000041],[-63.685554999999965,65.047759999999982],[-63.697776999999974,65.049423000000047],[-63.732215999999994,65.048874000000126],[-63.751944999999978,65.045258000000047],[-63.782218999999941,65.034149000000014],[-63.801940999999999,65.030273000000079],[-63.824447999999961,65.027481000000023],[-63.849723999999924,65.030273000000079],[-63.861114999999984,65.033325000000048],[-63.870551999999918,65.040816999999947],[-63.873885999999914,65.04553199999998],[-63.875556999999958,65.050262000000032],[-63.885559000000001,65.079987000000131],[-63.886116000000015,65.085815000000025],[-63.881667999999934,65.096939000000134],[-63.948607999999979,65.100540000000024],[-64.121108999999933,65.043869000000086],[-64.132491999999957,65.044434000000081],[-64.140839000000028,65.047211000000004],[-64.267226999999991,65.094147000000021],[-64.275833000000034,65.098877000000073],[-64.271118000000001,65.103317000000061],[-64.22193900000002,65.146942000000081],[-64.208892999999989,65.155258000000003],[-64.18582200000003,65.163879000000065],[-64.167220999999927,65.170532000000037],[-64.131103999999937,65.182480000000112],[-64.129715000000033,65.193588000000091],[-64.203613000000018,65.199707000000103],[-64.211944999999901,65.199996999999939],[-64.231383999999991,65.196930000000009],[-64.301940999999999,65.163040000000137],[-64.30999799999995,65.15914900000007],[-64.314712999999983,65.15248100000008],[-64.339172000000019,65.161377000000016],[-64.37332200000003,65.177200000000028],[-64.380828999999892,65.181091000000094],[-64.395844000000011,65.207214000000079],[-64.407227000000034,65.275818000000015],[-64.405272999999909,65.285537999999917],[-64.402785999999935,65.291092000000106],[-64.398620999999935,65.29693600000013],[-64.389724999999999,65.304428000000087],[-64.355835000000013,65.324996999999996],[-64.333327999999995,65.337203999999986],[-64.30999799999995,65.349990999999989],[-64.300551999999982,65.355819999999994],[-64.25556899999998,65.386382999999967],[-64.250838999999871,65.390823000000012],[-64.236389000000031,65.421920999999998],[-64.234160999999972,65.427199999999971],[-64.237212999999997,65.429977000000065],[-64.248885999999914,65.430542000000116],[-64.272781000000009,65.428588999999988],[-64.291107000000011,65.422484999999938],[-64.431380999999988,65.326934999999992],[-64.461670000000026,65.294983000000002],[-64.471664000000033,65.283324999999991],[-64.474715999999944,65.272491000000116],[-64.468886999999938,65.263885000000016],[-64.463897999999972,65.258881000000031],[-64.456954999999994,65.249420000000043],[-64.452498999999989,65.241653000000099],[-64.455565999999976,65.207214000000079],[-64.462218999999948,65.190810999999997],[-64.468337999999903,65.180267000000129],[-64.509734999999921,65.12052900000009],[-64.521117999999944,65.109146000000123],[-64.535004000000015,65.097214000000122],[-64.549987999999985,65.09275800000006],[-64.555556999999965,65.092209000000082],[-64.561934999999949,65.094986000000006],[-64.567504999999926,65.115814000000057],[-64.567504999999926,65.119979999999998],[-64.569457999999941,65.124419999999986],[-64.580001999999922,65.128860000000032],[-64.611389000000031,65.141937000000041],[-64.641112999999962,65.149993999999992],[-64.655272999999966,65.166092000000049],[-64.718338000000017,65.222487999999942],[-64.760284000000013,65.25221300000004],[-64.765014999999948,65.247756999999979],[-64.778335999999967,65.238585999999998],[-64.788329999999917,65.23414600000001],[-64.801102000000014,65.230820000000108],[-64.814712999999983,65.235259999999982],[-64.864440999999999,65.256653000000085],[-64.883895999999993,65.265273999999977],[-64.891113000000018,65.269150000000081],[-64.896666999999979,65.273315000000082],[-64.898346000000004,65.275818000000015],[-64.910552999999993,65.29942299999999],[-64.910827999999981,65.303589000000102],[-64.910004000000015,65.304977000000008],[-64.855887999999936,65.314545000000123],[-64.834228999999937,65.319046000000014],[-64.823387000000025,65.318214000000125],[-64.796111999999937,65.31860400000005],[-64.793883999999991,65.314697000000081],[-64.786391999999978,65.310806000000014],[-64.777221999999995,65.30914300000012],[-64.757171999999912,65.313095000000033],[-64.752173999999911,65.314255000000117],[-64.696105999999872,65.329712000000029],[-64.691101000000003,65.331940000000031],[-64.687209999999936,65.334991000000059],[-64.685271999999998,65.337493999999992],[-64.684433000000013,65.341095000000053],[-64.689162999999951,65.341660000000104],[-64.799728000000016,65.346939000000077],[-64.813613999999973,65.347214000000065],[-64.868056999999965,65.339706000000092],[-64.897780999999952,65.334152000000074],[-64.909163999999976,65.334717000000126],[-64.912216000000001,65.338042999999971],[-64.910552999999993,65.33998100000008],[-64.904723999999987,65.343596999999932],[-64.609160999999972,65.426376000000005],[-64.591110000000015,65.429703000000131],[-64.583892999999989,65.430267000000072],[-64.508347000000015,65.425812000000064],[-64.477218999999991,65.421097000000032],[-64.466400000000021,65.417480000000069],[-64.458343999999954,65.416656000000103],[-64.448607999999979,65.418319999999937],[-64.441939999999931,65.420258000000103],[-64.433608999999933,65.429153000000099],[-64.429992999999968,65.434417999999994],[-64.40943900000002,65.473877000000073],[-64.412780999999939,65.478592000000106],[-64.418335000000013,65.482758000000047],[-64.434432999999899,65.484146000000123],[-64.551940999999999,65.457764000000054],[-64.695267000000001,65.427765000000022],[-64.795273000000009,65.415268000000026],[-64.806655999999919,65.413879000000009],[-64.82417299999986,65.413315000000068],[-64.833618000000001,65.414429000000041],[-64.843886999999938,65.417205999999965],[-64.845550999999944,65.419434000000138],[-64.854996000000028,65.422759999999982],[-64.863891999999964,65.424698000000092],[-64.869719999999973,65.423874000000126],[-64.974166999999966,65.404708999999968],[-64.981110000000001,65.401932000000102],[-64.987502999999947,65.39776599999999],[-64.990279999999927,65.393875000000094],[-64.988602000000014,65.379424999999969],[-64.98582499999992,65.371368000000018],[-64.989715999999987,65.36831699999999],[-65.001113999999916,65.366652999999985],[-65.016112999999962,65.367203000000018],[-65.058883999999978,65.376648000000102],[-65.075012000000015,65.383041000000048],[-65.136123999999995,65.422484999999938],[-65.144164999999873,65.427765000000022],[-65.149993999999992,65.434143000000006],[-65.168883999999991,65.482758000000047],[-65.168059999999969,65.483871000000079],[-65.160003999999958,65.48803700000002],[-65.149445000000014,65.493042000000059],[-65.142501999999922,65.495818999999983],[-65.129990000000021,65.49859600000002],[-65.110274999999945,65.497482000000048],[-65.082503999999972,65.500548999999978],[-64.929717999999923,65.524703999999986],[-64.854445999999996,65.583603000000096],[-64.836944999999957,65.605819999999937],[-64.767226999999991,65.63998399999997],[-64.741669000000002,65.641662999999994],[-64.723052999999993,65.643600000000049],[-64.711944999999957,65.647217000000012],[-64.70944199999991,65.650543000000027],[-64.710007000000019,65.652205999999978],[-64.71444699999995,65.653320000000122],[-64.768340999999964,65.659988000000112],[-64.794723999999974,65.661926000000051],[-64.818618999999956,65.661926000000051],[-64.828063999999927,65.661102000000085],[-64.843886999999938,65.658034999999984],[-64.853333000000021,65.654709000000139],[-64.872222999999963,65.64498900000001],[-64.888901000000033,65.629150000000095],[-64.899993999999936,65.616378999999995],[-64.952498999999875,65.56442300000009],[-64.974166999999966,65.551376000000062],[-64.993606999999884,65.548035000000027],[-65.110274999999945,65.541092000000049],[-65.15306099999998,65.53915400000011],[-65.311110999999983,65.548874000000012],[-65.318344000000025,65.550537000000134],[-65.326400999999976,65.556366000000139],[-65.333327999999995,65.563599000000124],[-65.338607999999965,65.575546000000088],[-65.308334000000002,65.621094000000028],[-65.303328999999962,65.62831099999994],[-65.299987999999928,65.6308140000001],[-65.295837000000006,65.631653000000085],[-65.275283999999942,65.631363000000079],[-65.252228000000002,65.629974000000061],[-65.217772999999966,65.629974000000061],[-65.188599000000011,65.629974000000061],[-65.153884999999946,65.630264000000068],[-65.125823999999966,65.633330999999998],[-65.112503000000004,65.637207000000103],[-65.105835000000013,65.639435000000049],[-65.103881999999999,65.642487000000131],[-65.103881999999999,65.651932000000045],[-65.109436000000017,65.658875000000023],[-65.106948999999986,65.667205999999908],[-65.105835000000013,65.668594000000041],[-65.09973100000002,65.671920999999941],[-64.994445999999925,65.70138500000013],[-64.981383999999991,65.704712000000086],[-64.969726999999978,65.706650000000025],[-64.942215000000033,65.709152000000074],[-64.922501000000011,65.709427000000119],[-64.902495999999985,65.708602999999982],[-64.814712999999983,65.712769000000037],[-64.803328999999962,65.714157000000114],[-64.798339999999996,65.716385000000116],[-64.793609999999887,65.719985999999949],[-64.791381999999999,65.723312000000021],[-64.794997999999964,65.728043000000127],[-64.801940999999886,65.730270000000019],[-64.815552000000025,65.730545000000006],[-64.90695199999999,65.728867000000093],[-64.973052999999993,65.723602000000028],[-64.996947999999918,65.721374999999966],[-65.024719000000005,65.716934000000037],[-65.057219999999973,65.710266000000047],[-65.076110999999912,65.705551000000014],[-65.103058000000033,65.694427000000132],[-65.11610399999995,65.685257000000092],[-65.138610999999969,65.671096999999975],[-65.144454999999994,65.667480000000012],[-65.164168999999958,65.656937000000084],[-65.168334999999956,65.656097000000045],[-65.369994999999903,65.661102000000085],[-65.431380999999931,65.669144000000074],[-65.441665999999884,65.671646000000123],[-65.449996999999883,65.674988000000042],[-65.454452999999887,65.678314000000114],[-65.456954999999937,65.68220500000001],[-65.456389999999999,65.68553199999991],[-65.452498999999932,65.69081100000011],[-65.447768999999994,65.695251000000098],[-65.460281000000009,65.74136400000009],[-65.490279999999927,65.735809000000017],[-65.497771999999941,65.737487999999985],[-65.50556899999998,65.74331699999999],[-65.505004999999983,65.751663000000121],[-65.498885999999857,65.763046000000088],[-65.455276000000026,65.832489000000066],[-65.449158000000011,65.841094999999939],[-65.439437999999996,65.8477630000001],[-65.357223999999974,65.902480999999909],[-65.152221999999938,65.957764000000111],[-65.137787000000003,65.961104999999975],[-65.050277999999992,65.98054500000012],[-64.963897999999972,65.998596000000134],[-64.946105999999986,66.001389000000131],[-64.934722999999906,66.002213000000097],[-64.923049999999989,66.001389000000131],[-64.898346000000004,65.996933000000013],[-64.880828999999949,65.989975000000015],[-64.851104999999961,65.98054500000012],[-64.842223999999931,65.978043000000071],[-64.801392000000021,65.969436999999971],[-64.772506999999962,65.966095000000053],[-64.755004999999926,65.966095000000053],[-64.743332000000009,65.967484000000013],[-64.735001000000011,65.969436999999971],[-64.733886999999925,65.97554000000008],[-64.738601999999958,65.978867000000037],[-64.765014999999948,65.988037000000077],[-64.821670999999981,66.044708000000014],[-64.750838999999928,66.185532000000023],[-64.721663999999976,66.217483999999956],[-64.712219000000005,66.223602000000085],[-64.605834999999956,66.259155000000135],[-64.480559999999969,66.296371000000079],[-64.451950000000011,66.303589000000102],[-64.405563000000029,66.315811000000053],[-64.388610999999912,66.321655000000078],[-64.375548999999921,66.327209000000039],[-64.365829000000019,66.333053999999947],[-64.356383999999935,66.340546000000074],[-64.354172000000005,66.348038000000031],[-64.356383999999935,66.349715999999944],[-64.366104000000007,66.350815000000125],[-64.377486999999974,66.349990999999989],[-64.443877999999984,66.344711000000075],[-64.464721999999938,66.34304800000001],[-64.71444699999995,66.274994000000049],[-64.718886999999995,66.273315000000025],[-64.789168999999958,66.236374000000126],[-64.796111999999937,66.231659000000093],[-64.839995999999985,66.193313999999987],[-64.858046999999942,66.149993999999992],[-64.856658999999979,66.139984000000084],[-64.851944000000003,66.124984999999981],[-64.849730999999963,66.12052900000009],[-64.854171999999949,66.109711000000118],[-64.858886999999982,66.106093999999985],[-64.933884000000035,66.080276000000026],[-64.948607999999979,66.076934999999992],[-65.126098999999954,66.03776600000009],[-65.381942999999922,65.975815000000125],[-65.398055999999997,65.974700999999925],[-65.827788999999996,65.953049000000078],[-65.876389000000017,65.94802900000002],[-65.916106999999954,65.95109599999995],[-65.928054999999972,65.953873000000044],[-65.935546999999929,65.958328000000051],[-65.939712999999927,65.962493999999992],[-65.96305799999999,66.034424000000001],[-65.963897999999915,66.043869000000029],[-65.918883999999935,66.086105000000032],[-65.911666999999852,66.091660000000104],[-65.904175000000009,66.094437000000028],[-65.786117999999988,66.126373000000115],[-65.674712999999997,66.157486000000119],[-65.65055799999999,66.164429000000098],[-65.640838999999914,66.168319999999994],[-65.634170999999924,66.172484999999995],[-65.564162999999951,66.226929000000041],[-65.545546999999942,66.243317000000104],[-65.471114999999941,66.342484000000013],[-65.471663999999919,66.383606000000043],[-65.473617999999931,66.385817999999915],[-65.475829999999974,66.387771999999984],[-65.479172000000005,66.388046000000088],[-65.482773000000009,66.387771999999984],[-65.489715999999987,66.385817999999915],[-65.501677999999913,66.376373000000058],[-65.553878999999938,66.32777400000009],[-65.555831999999953,66.325272000000041],[-65.559433000000013,66.320541000000105],[-65.561660999999901,66.314423000000147],[-65.564437999999996,66.293593999999985],[-65.562774999999988,66.288315000000011],[-65.562774999999988,66.283324999999934],[-65.571670999999981,66.268326000000059],[-65.598891999999921,66.244979999999998],[-65.610549999999876,66.235809000000074],[-65.696944999999971,66.180542000000116],[-65.702498999999989,66.177475000000015],[-65.844161999999926,66.135817999999972],[-65.926940999999999,66.114700000000084],[-65.951950000000011,66.108871000000079],[-65.96833799999996,66.108032000000094],[-66.073623999999995,66.12052900000009],[-66.139174999999966,66.131362999999965],[-66.145003999999972,66.1336060000001],[-66.147232000000031,66.135269000000051],[-66.200835999999981,66.194977000000051],[-66.191100999999946,66.239974999999959],[-66.25111400000003,66.242203000000131],[-66.371384000000035,66.22526600000009],[-66.401947000000007,66.200821000000076],[-66.478333000000021,66.201660000000061],[-66.489715999999873,66.202774000000034],[-66.496947999999975,66.20498699999996],[-66.505004999999926,66.208878000000027],[-66.524445000000014,66.224152000000117],[-66.529998999999918,66.229156000000103],[-66.534164000000033,66.233046999999999],[-66.540832999999964,66.241653000000099],[-66.542770000000019,66.24664300000012],[-66.577498999999989,66.354430999999977],[-66.576110999999969,66.35914600000001],[-66.570007000000032,66.365540000000067],[-66.564162999999951,66.369141000000127],[-66.53694200000001,66.378035999999952],[-66.500564999999995,66.388046000000088],[-66.454726999999991,66.398041000000148],[-66.445267000000001,66.401382000000012],[-66.438323999999909,66.40415999999999],[-66.434433000000013,66.407211000000018],[-66.437209999999936,66.413315000000068],[-66.441939999999988,66.414429000000041],[-66.466109999999901,66.414992999999981],[-66.473617999999988,66.414429000000041],[-66.481383999999991,66.413040000000024],[-66.597778000000005,66.386932000000115],[-66.604996000000028,66.376373000000058],[-66.610001000000011,66.371368000000018],[-66.617492999999911,66.368591000000094],[-66.629990000000021,66.36775200000011],[-66.713897999999972,66.368866000000082],[-66.724166999999909,66.369431000000134],[-66.730834999999956,66.369980000000112],[-66.743057000000022,66.372756999999979],[-66.767775999999913,66.380539000000113],[-66.821670999999924,66.458037999999931],[-66.821670999999924,66.460815000000025],[-66.806380999999931,66.531936999999971],[-66.851943999999946,66.583328000000051],[-66.972228999999913,66.628860000000088],[-66.999724999999955,66.638321000000019],[-67.023055999999997,66.643326000000059],[-67.036117999999931,66.644714000000022],[-67.048889000000031,66.644714000000022],[-67.058884000000035,66.642761000000064],[-67.060546999999985,66.640273999999977],[-67.05610699999994,66.633605999999986],[-67.043334999999956,66.625809000000061],[-67.016662999999937,66.615265000000022],[-66.950561999999877,66.592209000000139],[-66.908339999999953,66.578049000000078],[-66.887511999999901,66.569442999999978],[-66.884170999999867,66.566086000000041],[-66.889450000000011,66.561096000000134],[-67.105559999999969,66.485809000000017],[-67.118331999999953,66.484985000000052],[-67.133620999999948,66.485809000000017],[-67.176940999999943,66.489700000000084],[-67.189712999999927,66.491653000000042],[-67.198607999999979,66.494141000000013],[-67.202224999999999,66.497208000000114],[-67.203887999999949,66.505264000000011],[-67.192215000000033,66.51527400000009],[-67.186110999999983,66.524428999999941],[-67.19027699999998,66.529160000000104],[-67.327224999999999,66.595825000000048],[-67.338332999999977,66.597762999999986],[-67.34584000000001,66.597214000000008],[-67.398620999999878,66.589157000000057],[-67.410003999999958,66.585540999999978],[-67.463622999999984,66.578873000000044],[-67.515015000000005,66.573607999999979],[-67.581116000000009,66.575271999999984],[-67.639724999999999,66.580551000000128],[-67.726943999999889,66.576660000000061],[-67.737212999999997,66.574158000000011],[-67.740828999999962,66.571106000000043],[-67.742767000000015,66.568328999999949],[-67.741942999999935,66.564148000000046],[-67.735001000000011,66.561371000000008],[-67.722777999999892,66.558029000000033],[-67.701110999999855,66.55581699999999],[-67.499999999999943,66.544838000000027],[-67.426102000000014,66.541367000000037],[-67.407776000000013,66.542206000000022],[-67.395843999999954,66.544708000000071],[-67.380553999999904,66.545822000000044],[-67.373885999999914,66.545822000000044],[-67.365829000000019,66.544434000000138],[-67.296386999999925,66.526093000000003],[-67.281676999999945,66.51887499999998],[-67.148620999999991,66.443863000000022],[-67.143889999999999,66.437759000000028],[-67.143615999999952,66.435531999999967],[-67.138061999999991,66.382202000000063],[-67.139724999999999,66.376648000000046],[-67.160827999999981,66.365540000000067],[-67.172501000000011,66.363876000000062],[-67.185271999999941,66.363602000000128],[-67.197768999999994,66.365814],[-67.291671999999892,66.399429000000055],[-67.337509000000011,66.418869000000086],[-67.338988999999913,66.422852000000091],[-67.343063000000029,66.426650999999993],[-67.350280999999939,66.428863999999976],[-67.365829000000019,66.429703000000131],[-67.389724999999942,66.430817000000104],[-67.406386999999995,66.429703000000131],[-67.410552999999993,66.425262000000032],[-67.410003999999958,66.420821999999987],[-67.383330999999998,66.401932000000045],[-67.378326000000015,66.398604999999918],[-67.36860699999994,66.394714000000022],[-67.31361400000003,66.376373000000058],[-67.288604999999961,66.368866000000082],[-67.240828999999962,66.358871000000022],[-67.195830999999998,66.354980000000126],[-67.188598999999954,66.352203000000031],[-67.133057000000008,66.313873000000115],[-67.125274999999988,66.30693100000002],[-67.126099000000011,66.305542000000003],[-67.129165999999941,66.303589000000102],[-67.139449999999954,66.301376000000118],[-67.162216000000001,66.298874000000069],[-67.183884000000035,66.297485000000052],[-67.194153000000028,66.297760000000039],[-67.208618000000001,66.299988000000042],[-67.226944000000003,66.304153000000042],[-67.240828999999962,66.304153000000042],[-67.254181000000017,66.302765000000136],[-67.261672999999973,66.299149000000057],[-67.282226999999978,66.275269000000037],[-67.297501000000011,66.276093000000003],[-67.399170000000026,66.292480000000012],[-67.413895000000025,66.296646000000067],[-67.450287000000003,66.316666000000112],[-67.453063999999927,66.320541000000105],[-67.453339000000028,66.322495000000117],[-67.494719999999973,66.356934000000138],[-67.526108000000022,66.382202000000063],[-67.5625,66.407486000000063],[-67.566665999999998,66.409424000000001],[-67.603057999999976,66.418594000000041],[-67.634170999999981,66.424698000000092],[-67.690826000000015,66.435256999999922],[-67.71305799999999,66.436096000000077],[-67.730285999999978,66.439971999999955],[-67.812499999999943,66.463043000000027],[-67.825286999999946,66.46775800000006],[-67.828612999999905,66.470824999999934],[-67.834732000000031,66.48332199999993],[-67.838607999999908,66.491653000000042],[-67.923614999999927,66.516098000000056],[-67.952498999999989,66.514709000000039],[-67.985824999999863,66.509720000000073],[-67.992767000000015,66.506943000000035],[-67.992767000000015,66.503876000000105],[-67.944716999999855,66.478867000000093],[-67.929169000000002,66.473038000000088],[-67.906113000000005,66.468048000000067],[-67.886948000000018,66.461928999999998],[-67.870269999999948,66.454712000000086],[-67.760558999999944,66.358032000000037],[-67.756392999999946,66.353317000000004],[-67.711120999999935,66.296936000000073],[-67.701401000000033,66.284714000000122],[-67.701674999999966,66.278320000000065],[-67.705565999999976,66.275269000000037],[-67.724716000000001,66.260818000000029],[-67.672225999999966,66.228317000000118],[-67.570556999999951,66.184143000000006],[-67.454453000000001,66.144714000000079],[-67.399993999999992,66.126373000000115],[-67.281386999999938,66.083054000000004],[-67.165008999999998,66.036926000000051],[-67.162506000000008,66.035262999999929],[-67.243522999999925,65.978301999999985],[-67.173049999999876,65.918593999999985],[-67.185821999999973,65.912200999999982],[-67.194442999999978,65.909714000000122],[-67.201674999999966,65.90914900000007],[-67.429992999999911,65.90554800000001],[-67.740554999999858,65.894150000000025],[-67.795273000000009,65.877197000000137],[-67.824172999999973,65.880814000000044],[-67.86471599999993,65.887772000000041],[-67.914444000000003,65.899155000000064],[-67.938599000000011,65.908035000000098],[-68.02694699999995,65.99275200000011],[-68.030563000000029,65.998032000000023],[-68.031386999999995,66.002213000000097],[-68.027221999999995,66.060806000000071],[-68.025832999999977,66.06581100000011],[-68.130828999999949,66.126648000000102],[-68.244720000000029,66.1827550000001],[-68.340285999999992,66.196930000000009],[-68.538054999999929,66.200821000000076],[-68.712783999999942,66.19859300000013],[-68.808334000000002,66.195816000000036],[-68.842498999999975,66.193313999999987],[-68.851394999999968,66.189972000000012],[-68.846389999999928,66.186645999999996],[-68.835281000000009,66.184981999999991],[-68.668610000000001,66.178864000000033],[-68.568343999999968,66.178588999999988],[-68.414718999999991,66.159424000000058],[-68.403610000000015,66.146378000000084],[-68.391113000000018,66.135269000000051],[-68.383330999999941,66.131087999999977],[-68.300277999999878,66.092758000000003],[-68.27806099999998,66.083602999999982],[-68.244155999999975,66.071105999999986],[-68.237777999999935,66.069992000000013],[-68.225554999999986,66.069992000000013],[-68.220551,66.073044000000095],[-68.218886999999995,66.081375000000037],[-68.22193900000002,66.085266000000104],[-68.229720999999984,66.092209000000082],[-68.244155999999975,66.099991000000045],[-68.246947999999975,66.112761999999975],[-68.220000999999968,66.128586000000041],[-68.202498999999932,66.128859999999975],[-68.194716999999969,66.127472000000068],[-68.157501000000025,66.117477000000008],[-68.134170999999981,66.109985000000052],[-68.118880999999988,66.103592000000106],[-68.047226000000023,66.064986999999974],[-68.048889000000031,66.00749200000007],[-68.051940999999943,65.996643000000006],[-68.05360399999995,65.991088999999988],[-68.064437999999939,65.984421000000054],[-68.12388599999997,65.963043000000084],[-68.134170999999981,65.963318000000129],[-68.173614999999984,65.969436999999971],[-68.196945000000028,65.973876999999959],[-68.210555999999997,65.979430999999977],[-68.27806099999998,66.014160000000061],[-68.304442999999878,66.028046000000018],[-68.323897999999929,66.003875999999991],[-68.333618000000001,65.93193100000002],[-68.332229999999925,65.92886400000009],[-68.325835999999981,65.916382000000112],[-68.321670999999981,65.911925999999994],[-68.304748999999958,65.908661000000052],[-68.287780999999995,65.907760999999994],[-68.260009999999909,65.911377000000016],[-68.194153000000028,65.921097000000145],[-68.156113000000005,65.929703000000018],[-68.150283999999999,65.930542000000003],[-68.142775999999969,65.929152999999985],[-68.139998999999989,65.927475000000072],[-68.136123999999995,65.922760000000039],[-68.134734999999921,65.913605000000018],[-68.13290399999994,65.834885000000043],[-68.139175000000023,65.817215000000147],[-68.147231999999974,65.798325000000034],[-68.033324999999934,65.776382000000069],[-68.023894999999868,65.77526899999998],[-68.003066999999987,65.778320000000008],[-67.923614999999927,65.793869000000086],[-67.886123999999882,65.804977000000065],[-67.821120999999948,65.768050999999957],[-67.870269999999948,65.689422999999977],[-67.942489999999964,65.618042000000116],[-67.989165999999898,65.61914100000007],[-68.058884000000035,65.568053999999961],[-68.027221999999995,65.558319000000097],[-68.012512000000015,65.557754999999929],[-68.011672999999973,65.558868000000018],[-67.998610999999983,65.566939999999988],[-67.98721299999994,65.571381000000088],[-67.971114999999998,65.575271999999984],[-67.956664999999987,65.571655000000021],[-67.951675000000023,65.568329000000006],[-67.953063999999927,65.557205000000124],[-67.955001999999979,65.55386400000009],[-68.020844000000011,65.49803200000008],[-68.027785999999935,65.491653000000042],[-68.030288999999982,65.487761999999975],[-68.030563000000029,65.484421000000111],[-68.025832999999977,65.481093999999985],[-68.022507000000019,65.480545000000063],[-68.00778200000002,65.485535000000084],[-67.941939999999931,65.525269000000037],[-67.922500999999954,65.538040000000137],[-67.860274999999945,65.584427000000062],[-67.730285999999978,65.636383000000137],[-67.712219000000005,65.640823000000125],[-67.652495999999985,65.651382000000012],[-67.466109999999958,65.674149000000114],[-67.428604000000007,65.676650999999993],[-67.402495999999928,65.677475000000129],[-67.396118000000001,65.676650999999993],[-67.382216999999912,65.673874000000069],[-67.328063999999983,65.662491000000045],[-67.319457999999941,65.659423999999944],[-67.280562999999972,65.642487000000131],[-67.275283999999999,65.637772000000098],[-67.256667999999991,65.615265000000022],[-67.25389100000001,65.611649],[-67.251677999999856,65.606934000000138],[-67.253341999999975,65.601654000000053],[-67.256667999999991,65.599152000000004],[-67.272781000000009,65.595261000000107],[-67.320557000000008,65.586929000000112],[-67.333327999999938,65.582489000000066],[-67.336120999999935,65.580826000000002],[-67.456664999999987,65.501937999999996],[-67.458892999999932,65.49803200000008],[-67.451400999999919,65.493590999999981],[-67.347504000000015,65.458602999999982],[-67.221389999999985,65.456375000000037],[-67.189986999999974,65.458037999999988],[-67.180832000000009,65.459152000000131],[-67.169158999999979,65.461380000000077],[-67.155563000000029,65.466934000000094],[-67.142226999999991,65.469147000000078],[-67.081679999999949,65.462494000000049],[-67.065552000000025,65.458602999999982],[-67.058608999999933,65.453597999999943],[-67.058043999999995,65.451385000000016],[-67.058334000000002,65.426651000000049],[-67.062774999999931,65.417480000000069],[-67.078339000000028,65.392211999999972],[-67.111114999999984,65.364700000000028],[-67.118056999999965,65.361922999999933],[-67.12388599999997,65.360535000000027],[-67.134445000000028,65.359711000000061],[-67.218063000000029,65.358597000000088],[-67.255568999999923,65.360535000000027],[-67.316101000000003,65.358597000000088],[-67.400833000000034,65.350266000000033],[-67.408889999999985,65.348328000000095],[-67.413619999999923,65.345825000000104],[-67.417770000000019,65.342209000000025],[-67.416107000000011,65.339157000000114],[-67.40943900000002,65.333328000000108],[-67.399993999999992,65.329712000000029],[-67.391113000000018,65.327209000000096],[-67.33666999999997,65.31721500000009],[-67.326674999999966,65.316940000000045],[-67.319167999999934,65.318054000000018],[-67.315826000000015,65.320541000000105],[-67.306655999999862,65.330276000000026],[-67.306106999999997,65.333602999999925],[-67.306945999999982,65.338042999999971],[-67.303878999999938,65.34248400000007],[-67.297501000000011,65.347487999999998],[-67.291381999999942,65.349716000000001],[-67.283614999999998,65.351089000000059],[-67.269164999999987,65.352203000000031],[-67.125548999999978,65.311919999999986],[-67.119995000000017,65.309982000000048],[-67.077788999999996,65.250275000000101],[-67.063889000000017,65.218322999999941],[-66.93472300000002,65.233871000000136],[-66.933060000000012,65.233597000000032],[-66.928878999999938,65.229705999999965],[-66.948883000000023,65.125259000000142],[-66.950835999999981,65.11692800000003],[-66.953339000000028,65.113036999999963],[-66.959166999999979,65.106644000000017],[-66.967498999999975,65.103866999999923],[-67.025283999999886,65.10832199999993],[-67.044158999999922,65.107483000000002],[-67.055557000000022,65.105255000000056],[-67.066665999999998,65.100815000000011],[-67.072234999999978,65.097214000000122],[-67.106110000000001,65.064147999999989],[-67.108611999999994,65.060256999999922],[-67.107773000000009,65.058868000000132],[-67.096114999999998,65.056091000000038],[-67.085830999999985,65.056366000000082],[-67.075012000000015,65.058029000000147],[-66.890563999999983,65.103317000000061],[-66.835555999999997,65.137206999999989],[-66.756393000000003,65.177200000000028],[-66.74749799999995,65.180542000000003],[-66.730285999999921,65.181366000000139],[-66.726105000000018,65.180267000000129],[-66.725554999999986,65.178040000000067],[-66.753341999999975,65.113312000000008],[-66.801666000000012,65.060806000000071],[-66.767501999999979,65.024429000000112],[-66.743057000000022,64.963042999999971],[-66.726944000000003,64.913879000000122],[-66.727492999999924,64.90525800000006],[-66.728057999999976,64.901657],[-66.733063000000016,64.888321000000019],[-66.739165999999955,64.859985000000108],[-66.735000999999954,64.824707000000103],[-66.734160999999915,64.820541000000048],[-66.698043999999868,64.761931999999945],[-66.694716999999912,64.761383000000023],[-66.687774999999988,64.762206999999989],[-66.654175000000009,64.771103000000096],[-66.641113000000018,64.775818000000129],[-66.632492000000013,64.781372000000147],[-66.638061999999991,64.785538000000031],[-66.676101999999901,64.876082999999994],[-66.696944999999971,65.03276100000005],[-66.694152999999972,65.037201000000096],[-66.688660000000027,65.038772999999935],[-66.673324999999977,65.038589000000002],[-66.660827999999981,65.037201000000096],[-66.618056999999965,65.030273000000079],[-66.535278000000005,65.010817999999915],[-66.530563000000029,65.00749200000007],[-66.49610899999999,64.983047000000056],[-66.488891999999908,64.957489000000123],[-66.496658000000025,64.945526000000086],[-66.495543999999995,64.938873000000115],[-66.491378999999995,64.934982000000048],[-66.486664000000019,64.932205000000124],[-66.478606999999954,64.929153000000042],[-66.388610999999969,64.913315000000011],[-66.379165999999998,64.912201000000039],[-66.368057000000022,64.913605000000018],[-66.363892000000021,64.917480000000012],[-66.361938000000009,64.923599000000024],[-66.36361699999992,64.928589000000102],[-66.334732000000031,64.934708000000114],[-66.177779999999927,64.880264000000068],[-66.148346000000004,64.868866000000025],[-66.177215999999987,64.796371000000022],[-66.18472300000002,64.784424000000058],[-66.191939999999931,64.77887000000004],[-66.199431999999945,64.774993999999992],[-66.203339000000028,64.77388000000002],[-66.213333000000034,64.75610400000005],[-66.219161999999983,64.726089000000115],[-66.218886999999938,64.69081100000011],[-66.212218999999948,64.685531999999967],[-66.18472300000002,64.681656000000032],[-66.166945999999939,64.681091000000038],[-66.161117999999931,64.682479999999998],[-66.15834000000001,64.68414300000012],[-66.151947000000007,64.689147999999989],[-66.147781000000009,64.695815999999979],[-66.147232000000031,64.70138500000013],[-66.147232000000031,64.704162999999937],[-66.150283999999942,64.71748400000007],[-66.14973399999991,64.733597000000145],[-66.145554000000004,64.740265000000136],[-66.136397999999986,64.754166000000112],[-66.116942999999992,64.781372000000147],[-66.091675000000009,64.809708000000057],[-66.080841000000021,64.819153000000085],[-66.058333999999945,64.832764000000054],[-66.037215999999944,64.844986000000063],[-66.020843999999954,64.849716000000058],[-66.011397999999986,64.848327999999981],[-66.011123999999995,64.846375000000023],[-66.008621000000005,64.78915400000011],[-66.009170999999867,64.778046000000074],[-66.012511999999901,64.699417000000039],[-65.899993999999992,64.673309000000074],[-65.846664000000033,64.676085999999998],[-65.852218999999991,64.680267000000072],[-65.861389000000031,64.689147999999989],[-65.889449999999954,64.719711000000132],[-65.899170000000026,64.73275799999999],[-65.958617999999944,64.877761999999962],[-65.95666499999993,64.886108000000092],[-65.953338999999971,64.888321000000019],[-65.941939999999988,64.890548999999965],[-65.931380999999931,64.89137299999993],[-65.92471299999994,64.89137299999993],[-65.838608000000022,64.882476999999994],[-65.727218999999934,64.843597000000045],[-65.717772999999966,64.84027100000003],[-65.674438000000009,64.818054000000132],[-65.664168999999958,64.80831900000004],[-65.661666999999966,64.804428000000144],[-65.660278000000005,64.799149],[-65.665008999999998,64.796936000000017],[-65.683318999999926,64.792206000000022],[-65.698333999999988,64.784714000000065],[-65.720275999999956,64.766663000000108],[-65.736114999999984,64.750275000000045],[-65.742492999999911,64.741089000000102],[-65.742766999999958,64.735260000000039],[-65.736938000000009,64.726089000000115],[-65.726944000000003,64.711380000000077],[-65.710830999999985,64.693039000000056],[-65.704726999999934,64.687485000000095],[-65.703063999999927,64.692200000000128],[-65.709441999999967,64.712769000000037],[-65.71055599999994,64.718596999999988],[-65.710007000000019,64.732208000000128],[-65.708618000000001,64.736099000000024],[-65.684157999999968,64.761107999999979],[-65.676102000000014,64.765548999999908],[-65.665282999999931,64.771378000000141],[-65.648055999999997,64.774993999999992],[-65.642776000000026,64.774993999999992],[-65.627212999999927,64.771103000000096],[-65.598891999999921,64.756377999999984],[-65.56639100000001,64.737488000000042],[-65.561110999999869,64.733047000000113],[-65.557495000000017,64.728317000000061],[-65.555831999999953,64.723312000000021],[-65.556380999999931,64.717758000000003],[-65.572234999999921,64.664153999999996],[-65.576675000000023,64.652481000000023],[-65.583327999999938,64.642761000000121],[-65.586394999999925,64.640274000000034],[-65.654723999999987,64.602478000000019],[-65.662505999999951,64.598328000000038],[-65.714172000000019,64.570541000000048],[-65.730835000000013,64.517761000000007],[-65.732223999999974,64.508040999999935],[-65.725554999999929,64.498031999999967],[-65.721664000000033,64.49414100000007],[-65.708344000000011,64.486649000000114],[-65.695540999999992,64.485809000000074],[-65.665008999999998,64.492203000000131],[-65.643340999999964,64.494979999999998],[-65.573333999999988,64.498596000000077],[-65.524718999999948,64.49971000000005],[-65.518065999999976,64.49971000000005],[-65.506392999999946,64.497482000000105],[-65.504181000000017,64.495818999999983],[-65.50556899999998,64.468872000000033],[-65.396117999999944,64.52137799999997],[-65.384170999999981,64.524155000000064],[-65.365828999999906,64.526931999999988],[-65.210555999999883,64.536102000000028],[-65.203888000000006,64.533874999999966],[-65.144454999999994,64.51138300000008],[-65.085006999999962,64.479705999999965],[-65.077788999999939,64.475815000000068],[-65.075835999999981,64.471375000000023],[-65.074172999999973,64.461929000000055],[-65.071670999999981,64.440810999999997],[-65.071945000000028,64.43081699999999],[-65.073623999999938,64.426086000000055],[-65.194991999999957,64.310257000000092],[-65.202498999999989,64.306366000000025],[-65.210830999999985,64.303863999999976],[-65.284728999999913,64.291656000000103],[-65.295272999999895,64.290267999999969],[-65.309433000000013,64.29136699999998],[-65.343337999999903,64.294983000000002],[-65.377212999999983,64.303314000000114],[-65.386397999999929,64.30664100000007],[-65.408889999999928,64.312485000000038],[-65.451674999999966,64.319992000000013],[-65.498885999999857,64.322769000000108],[-65.525008999999898,64.323318000000029],[-65.554168999999945,64.323318000000029],[-65.563323999999909,64.322494999999947],[-65.65583799999996,64.308868000000075],[-65.661666999999966,64.307479999999998],[-65.658339999999953,64.302765000000136],[-65.654449,64.300812000000008],[-65.61860699999994,64.293045000000063],[-65.601943999999946,64.293594000000041],[-65.591948999999943,64.296096999999975],[-65.572234999999921,64.298599000000081],[-65.505844000000025,64.302475000000129],[-65.465835999999967,64.30304000000001],[-65.434158000000025,64.299149000000114],[-65.422774999999945,64.296371000000136],[-65.250564999999995,64.208328000000051],[-65.24610899999999,64.204987000000017],[-65.242766999999958,64.200271999999984],[-65.265015000000005,64.17886400000009],[-65.16194200000001,64.138046000000145],[-65.049438000000009,64.072220000000016],[-65.053878999999938,64.067764000000068],[-65.060546999999929,64.064986999999974],[-65.093886999999995,64.052199999999971],[-65.103881999999999,64.049149],[-65.136672999999917,64.041367000000037],[-65.158339999999953,64.038315000000068],[-65.196105999999929,64.040268000000026],[-65.206115999999952,64.040268000000026],[-65.21665999999999,64.038589000000002],[-65.221389999999928,64.03637700000013],[-65.225554999999929,64.032761000000107],[-65.221938999999963,64.028594999999996],[-65.214172000000019,64.025543000000084],[-65.189986999999917,64.020264000000111],[-65.096663999999976,64.009155000000021],[-65.08805799999999,64.009430000000066],[-64.949158000000011,64.014999000000046],[-64.800551999999982,64.02777100000003],[-64.68638599999997,64.039154000000053],[-64.676940999999999,64.036652000000004],[-64.668059999999969,64.033051000000114],[-64.661117999999988,64.028594999999996],[-64.630554000000018,63.978324999999984],[-64.631377999999984,63.974709000000132],[-64.632766999999944,63.972763000000043],[-64.638335999999981,63.96915400000006],[-64.64805599999994,63.966934000000037],[-64.658889999999985,63.965546000000131],[-64.669998000000021,63.966385000000059],[-64.689437999999996,63.966103000000032],[-64.700561999999991,63.963882000000126],[-64.817504999999983,63.923607000000004],[-64.875274999999988,63.901100000000099],[-64.888901000000033,63.894996999999989],[-64.974715999999944,63.851936000000137],[-64.985000999999954,63.829163000000051],[-64.987502999999947,63.823051000000078],[-64.984160999999915,63.813881000000038],[-64.954177999999956,63.776382000000126],[-64.94888299999991,63.774437000000091],[-64.77806099999998,63.747772000000055],[-64.68360899999999,63.746383999999978],[-64.584441999999854,63.704711999999915],[-64.559432999999956,63.694153000000085],[-64.540282999999988,63.684433000000013],[-64.527495999999985,63.676941000000056],[-64.522507000000019,63.672768000000076],[-64.508347000000015,63.650826000000052],[-64.506667999999991,63.636940000000038],[-64.507506999999976,63.630821000000026],[-64.515015000000005,63.620270000000119],[-64.52194199999991,63.611938000000123],[-64.536666999999966,63.581108000000086],[-64.529449,63.534996000000035],[-64.522507000000019,63.514717000000076],[-64.50167799999997,63.443878000000097],[-64.49888599999997,63.429161000000079],[-64.495543999999938,63.327773999999977],[-64.510833999999988,63.307770000000062],[-64.588897999999858,63.321938000000102],[-64.608337000000006,63.32388300000008],[-64.61999499999996,63.323326000000009],[-64.62222300000002,63.322219999999959],[-64.624709999999993,63.318054000000075],[-64.61999499999996,63.313324000000023],[-64.614715999999987,63.30971500000004],[-64.587783999999942,63.299721000000034],[-64.577224999999999,63.296660999999972],[-64.566390999999953,63.293884000000048],[-64.525557999999933,63.290550000000053],[-64.500838999999985,63.289992999999981],[-64.488892000000021,63.288330000000087],[-64.482773000000009,63.285827999999981],[-64.481948999999872,63.282211000000018],[-64.531112999999948,63.249718000000087],[-64.538054999999929,63.248329000000069],[-64.658339999999953,63.249161000000015],[-64.767501999999922,63.32388300000008],[-64.826950000000011,63.45249199999995],[-64.850554999999929,63.510826000000009],[-64.942490000000021,63.632210000000043],[-64.955001999999922,63.640274000000034],[-64.973052999999993,63.646942000000024],[-64.99499499999996,63.652488999999946],[-65.046386999999925,63.662209000000075],[-65.06361400000003,63.668053000000043],[-65.070847000000015,63.671936000000017],[-65.166945999999996,63.747772000000055],[-65.166397000000018,63.773323000000119],[-65.153335999999911,63.771102999999925],[-65.150833000000034,63.772217000000126],[-65.154174999999952,63.776939000000027],[-65.15943900000002,63.781105000000082],[-65.204726999999934,63.80332199999998],[-65.293609999999944,63.812767000000065],[-65.298614999999927,63.81249200000002],[-65.301392000000021,63.81082200000003],[-65.303878999999995,63.806938000000002],[-65.300277999999935,63.799995000000024],[-65.281677000000002,63.788887000000045],[-65.215560999999923,63.75471500000009],[-65.15566999999993,63.725326999999993],[-65.135284000000013,63.715271000000143],[-65.053054999999972,63.638046000000088],[-65.039169000000015,63.574165000000107],[-65.069732999999985,63.568886000000134],[-65.085830999999928,63.563881000000094],[-65.091948999999943,63.559714999999983],[-65.099990999999932,63.547217999999987],[-65.102218999999991,63.541664000000026],[-65.102218999999991,63.536658999999929],[-65.099441999999897,63.526381999999955],[-65.026947000000007,63.399162000000103],[-64.965011999999945,63.369438000000059],[-64.952498999999875,63.362212999999997],[-64.942490000000021,63.353049999999996],[-64.909163999999976,63.280548000000124],[-64.901108000000022,63.237495000000024],[-64.908614999999941,63.235550000000046],[-64.921386999999925,63.235825000000034],[-65.046386999999925,63.248329000000069],[-65.068893000000003,63.252494999999954],[-65.082503999999972,63.260826000000066],[-65.103332999999964,63.27777100000003],[-65.114166000000012,63.284996000000092],[-65.123321999999973,63.288330000000087],[-65.136123999999995,63.290833000000021],[-65.141953000000001,63.28943600000008],[-65.148620999999991,63.286110000000065],[-65.146956999999873,63.281380000000013],[-65.083327999999938,63.20388000000014],[-65.057770000000005,63.174712999999997],[-65.054992999999911,63.172217999999987],[-65.046111999999994,63.171104000000014],[-65.016524999999945,63.171515999999997],[-64.998610999999926,63.176102000000014],[-64.944716999999912,63.183327000000077],[-64.920272999999952,63.184158000000082],[-64.911391999999921,63.180824000000086],[-64.811660999999958,63.137497000000053],[-64.797500999999954,63.130547000000035],[-64.783889999999985,63.12221500000004],[-64.755004999999926,63.099158999999986],[-64.753341999999918,63.096657000000107],[-64.762511999999958,63.0472180000001],[-64.771392999999989,62.98333000000008],[-64.703338999999971,62.953323000000069],[-64.696105999999872,62.952217000000076],[-64.676392000000021,62.941658000000018],[-64.645553999999947,62.921660999999972],[-64.634444999999971,62.912491000000102],[-64.627212999999983,62.90415999999999],[-64.626937999999939,62.899994000000106],[-64.629989999999964,62.897491000000116],[-64.638335999999981,62.894440000000088],[-64.733611999999994,62.878875999999991],[-64.769454999999937,62.862213000000111],[-64.855269999999962,62.865273000000002],[-64.881942999999865,62.867493000000024],[-64.903885000000002,62.872490000000084],[-64.923324999999977,62.878875999999991],[-65.005004999999983,62.90776800000009],[-65.162215999999944,62.943047000000035],[-65.225280999999995,62.954993999999942],[-65.236114999999984,62.957771000000037],[-65.243056999999965,62.961662000000103],[-65.248336999999935,62.965828000000045],[-65.25140399999998,62.970543000000077],[-65.255004999999926,62.979713000000118],[-65.254729999999995,62.985268000000019],[-65.26916499999993,62.959991000000059],[-65.194442999999922,62.878875999999991],[-65.190276999999924,62.875267000000008],[-65.175002999999947,62.862495000000024],[-65.153884999999946,62.84693900000002],[-65.14805599999994,62.843322999999998],[-65.129165999999998,62.83638000000002],[-65.115279999999984,62.828880000000083],[-64.984726000000023,62.714157],[-64.978332999999964,62.704711999999972],[-64.94888299999991,62.648604999999975],[-64.964721999999995,62.6336060000001],[-64.980834999999956,62.623604000000114],[-65.062774999999988,62.587494000000049],[-65.071120999999948,62.584435000000042],[-65.087219000000005,62.57888000000014],[-65.114715999999987,62.571663000000058],[-65.145003999999915,62.565826000000072],[-65.187499999999943,62.56221000000005],[-65.19776899999988,62.563048999999978],[-65.205001999999979,62.566101000000117],[-65.212219000000005,62.569992000000013],[-65.22084000000001,62.578331000000048],[-65.288605000000018,62.659987999999998],[-65.294997999999964,62.669441000000006],[-65.296660999999972,62.674163999999962],[-65.290558000000033,62.678878999999995],[-65.273894999999982,62.685265000000129],[-65.267776000000026,62.690269000000058],[-65.266952999999944,62.694434999999999],[-65.279175000000009,62.696654999999964],[-65.321121000000005,62.694434999999999],[-65.327498999999989,62.691658000000075],[-65.329726999999934,62.685546999999985],[-65.328063999999983,62.666100000000142],[-65.337218999999948,62.666664000000083],[-65.346953999999869,62.675827000000083],[-65.353881999999942,62.684433000000013],[-65.356658999999922,62.69499200000007],[-65.339721999999938,62.837493999999992],[-65.391952999999944,62.843605000000025],[-65.436661000000015,62.819442999999978],[-65.566665999999941,62.811661000000015],[-65.579178000000013,62.811934999999949],[-65.601943999999946,62.817772000000105],[-65.60943599999996,62.820831000000055],[-65.61610399999995,62.824715000000083],[-65.746947999999861,62.917770000000075],[-65.909438999999963,62.925827000000027],[-65.933318999999983,62.955826000000059],[-65.910278000000005,62.967765999999983],[-65.839721999999995,63.020828000000051],[-65.834731999999974,63.026382000000069],[-65.833327999999995,63.03138000000007],[-65.838333000000034,63.033333000000027],[-65.84973100000002,63.032767999999976],[-65.866394000000014,63.028602999999976],[-65.926101999999958,63.008331000000112],[-65.949722000000008,62.997772000000055],[-65.955001999999979,62.994155999999975],[-65.955565999999862,62.990829000000076],[-65.946380999999974,62.983047000000113],[-65.945830999999941,62.978874000000133],[-65.950561999999991,62.975822000000051],[-65.960830999999928,62.974433999999974],[-65.973891999999864,62.973877000000073],[-65.987212999999997,62.974709000000132],[-66.014450000000011,62.978874000000133],[-66.031386999999938,62.984717999999987],[-66.039718999999991,62.988602000000014],[-66.052215999999987,62.996658000000082],[-66.14973399999991,63.059990000000084],[-66.155563000000029,63.081383000000017],[-66.162780999999939,63.089989000000116],[-66.174438000000009,63.096382000000062],[-66.266952999999944,63.130820999999969],[-66.275832999999977,63.133881000000031],[-66.282501000000025,63.133330999999998],[-66.287780999999995,63.12971500000009],[-66.291945999999996,63.125267000000122],[-66.293335000000013,63.120543999999995],[-66.291381999999999,63.116104000000121],[-66.206954999999994,63.040833000000077],[-66.196654999999964,63.031661999999983],[-66.182769999999891,63.023604999999975],[-66.121658000000025,63.00110600000005],[-66.105559999999969,62.993880999999988],[-66.098343,62.990273000000059],[-66.091385000000002,62.983604000000014],[-66.089721999999881,62.978600000000029],[-66.097777999999948,62.952492000000063],[-66.103058000000033,62.946655000000135],[-66.107772999999952,62.943878000000041],[-66.11610399999995,62.940544000000045],[-66.135833999999932,62.936652999999978],[-66.147232000000031,62.936104],[-66.159163999999976,62.936652999999978],[-66.168883999999991,62.938881000000094],[-66.192215000000033,62.954437000000041],[-66.220839999999953,62.969437000000028],[-66.284728999999913,62.990273000000059],[-66.293883999999878,62.992767000000015],[-66.345000999999968,62.999161000000015],[-66.351668999999958,62.998603999999943],[-66.366104000000007,62.992493000000081],[-66.37860099999989,62.992493000000081],[-66.392775999999969,62.994995000000131],[-66.408889999999928,63.001938000000109],[-66.444442999999865,63.020546000000024],[-66.46444699999995,63.032211000000075],[-66.518340999999964,63.065269000000058],[-66.525283999999999,63.074715000000026],[-66.551940999999999,63.17943600000001],[-66.626388999999961,63.252220000000136],[-66.646666999999979,63.326384999999959],[-66.638335999999981,63.340271000000143],[-66.637512000000015,63.349998000000085],[-66.636948000000018,63.35833000000008],[-66.637786999999946,63.362770000000069],[-66.642776000000026,63.372489999999971],[-66.650832999999977,63.374992000000077],[-66.657500999999968,63.374435000000005],[-66.664169000000015,63.371658000000082],[-66.735549999999989,63.299438000000066],[-66.738602000000014,63.294159000000093],[-66.740828999999962,63.288048000000003],[-66.740279999999927,63.283607000000075],[-66.731110000000001,63.274712000000022],[-66.720550999999944,63.266388000000006],[-66.685546999999985,63.248046999999985],[-66.671386999999868,63.242767000000129],[-66.646956999999929,63.239159000000029],[-66.639174999999966,63.236107000000118],[-66.607498000000021,63.21027400000014],[-66.602492999999981,63.205269000000101],[-66.600280999999995,63.200829000000113],[-66.558334000000002,63.087212000000022],[-66.537780999999882,62.998047000000042],[-66.540282999999931,62.994155999999975],[-66.546660999999915,62.991379000000109],[-66.557220000000029,62.99193600000001],[-66.673049999999989,63.023048000000074],[-66.682220000000029,63.026382000000069],[-66.763061999999934,63.083054000000061],[-66.768065999999919,63.087768999999923],[-66.773894999999925,63.096382000000062],[-66.774444999999957,63.100548000000003],[-66.778885000000002,63.143607999999972],[-66.789169000000015,63.21138000000002],[-66.806655999999975,63.272491000000116],[-66.807495000000017,63.273323000000062],[-66.811661000000015,63.274437000000034],[-66.82028200000002,63.273323000000062],[-66.829177999999956,63.271660000000111],[-66.837783999999942,63.267769000000044],[-66.846953999999926,63.25750000000005],[-66.849166999999966,63.251389000000131],[-66.849166999999966,63.245544000000052],[-66.846114999999941,63.229713000000061],[-66.844727000000034,63.22665400000011],[-66.837219000000005,63.21804800000001],[-66.828338999999971,63.209159999999997],[-66.819457999999941,63.200272000000041],[-66.813888999999961,63.196098000000006],[-66.803878999999938,63.186378000000104],[-66.801391999999964,63.182495000000131],[-66.799727999999959,63.177490000000091],[-66.799437999999952,63.172492999999974],[-66.801666000000012,63.166382000000112],[-66.806655999999975,63.160545000000127],[-66.818343999999968,63.154159999999933],[-66.835555999999997,63.149161999999933],[-66.844161999999926,63.147217000000126],[-66.855270000000019,63.147217000000126],[-66.868332000000009,63.148880000000077],[-66.87777699999998,63.151931999999988],[-67.018340999999964,63.238883999999985],[-67.023894999999982,63.243050000000096],[-67.025008999999955,63.246658000000025],[-67.024445000000014,63.250274999999988],[-67.023055999999997,63.252777000000037],[-67.006393000000003,63.262215000000083],[-66.971114999999998,63.389717000000019],[-66.972777999999948,63.394997000000103],[-66.977782999999988,63.399719000000005],[-66.988891999999964,63.402489000000003],[-67.011123999999938,63.399993999999992],[-67.017226999999991,63.397217000000069],[-67.040832999999964,63.33554799999996],[-67.039168999999958,63.330551000000071],[-67.035827999999924,63.325272000000098],[-67.025008999999955,63.311104000000057],[-67.016113000000018,63.296660999999972],[-67.014174999999966,63.286385000000053],[-67.017226999999991,63.281105000000025],[-67.033324999999934,63.275268999999923],[-67.051940999999943,63.273323000000062],[-67.171111999999994,63.273880000000133],[-67.179717999999923,63.275551000000007],[-67.203887999999949,63.28527100000008],[-67.431670999999994,63.412765999999976],[-67.499999999999943,63.442764000000125],[-67.621658000000025,63.548881999999992],[-67.683318999999983,63.619438000000002],[-67.838897999999915,63.729713000000118],[-67.897506999999962,63.753052000000139],[-67.914718999999991,63.759438000000046],[-67.92332499999992,63.761108000000036],[-67.926102000000014,63.759163000000058],[-67.925277999999935,63.75471500000009],[-67.921386999999982,63.744438000000059],[-67.918059999999855,63.739159000000086],[-67.820006999999976,63.596382000000006],[-67.710555999999997,63.458603000000039],[-67.683318999999983,63.431664000000069],[-67.675003000000004,63.4180530000001],[-67.67193599999996,63.412490999999989],[-67.667769999999962,63.403046000000074],[-67.666396999999961,63.394439999999975],[-67.666655999999989,63.388046000000145],[-67.678329000000019,63.373047000000099],[-67.685271999999998,63.368880999999988],[-67.694442999999978,63.366385999999977],[-67.716659999999933,63.363884000000098],[-67.724166999999966,63.364159000000086],[-67.737212999999997,63.366385999999977],[-67.746384000000035,63.369438000000059],[-67.820557000000008,63.400269000000037],[-67.827224999999999,63.405266000000097],[-67.837509000000011,63.424164000000019],[-67.854445999999996,63.452774000000034],[-67.858046999999999,63.457497000000046],[-67.871658000000025,63.464714000000129],[-67.950835999999981,63.506660000000124],[-68.025283999999942,63.540832999999964],[-68.033324999999934,63.543883999999991],[-68.041381999999999,63.546104000000014],[-68.053054999999915,63.545273000000009],[-68.061661000000015,63.54332700000009],[-68.075561999999991,63.544159000000036],[-68.365829000000019,63.64527099999998],[-68.388610999999855,63.655548000000124],[-68.400283999999942,63.663879000000009],[-68.405563000000029,63.668602000000021],[-68.428328999999962,63.696381000000031],[-68.542769999999962,63.732490999999925],[-68.645843999999897,63.747490000000028],[-68.713622999999984,63.742493000000081],[-68.709732000000031,63.738045000000113],[-68.711394999999925,63.734717999999987],[-68.716109999999958,63.732207999999957],[-68.723617999999988,63.729713000000118],[-68.795546999999999,63.728600000000085],[-68.804442999999935,63.730270000000019],[-68.876099000000011,63.744713000000104],[-68.915833000000021,63.757216999999969],[-68.924437999999952,63.758888000000013],[-68.962508999999955,63.759163000000058],[-68.994720000000029,63.755554000000018],[-68.996947999999918,63.75360900000004],[-68.998336999999992,63.745270000000005],[-68.995270000000005,63.741379000000109],[-68.989715999999987,63.737495000000081],[-68.977782999999931,63.729713000000118],[-68.933059999999955,63.711936999999978],[-68.919448999999986,63.704993999999999],[-68.824722000000008,63.643883000000073],[-68.813048999999978,63.635551000000078],[-68.809433000000013,63.630821000000026],[-68.807220000000029,63.625824000000136],[-68.809433000000013,63.621658000000025],[-68.793334999999956,63.589157000000114],[-68.766113000000018,63.556656000000032],[-68.754729999999995,63.548607000000004],[-68.717772999999909,63.528603000000089],[-68.557769999999948,63.45249199999995],[-68.495833999999945,63.421378999999945],[-68.35943599999996,63.344710999999961],[-68.288605000000018,63.298332000000016],[-68.270553999999947,63.284996000000092],[-68.206389999999999,63.227211000000011],[-68.202498999999932,63.216933999999981],[-68.206389999999999,63.212493999999992],[-68.18638599999997,63.188324000000136],[-68.156113000000005,63.158324999999934],[-68.146118000000001,63.150269000000037],[-68.139175000000023,63.148605000000032],[-68.128601000000003,63.148048000000131],[-68.115554999999972,63.15248900000006],[-68.082779000000016,63.163605000000018],[-68.063888999999961,63.163605000000018],[-67.952224999999942,63.145546000000081],[-67.926392000000021,63.141106000000036],[-67.917495999999971,63.137214999999969],[-67.916655999999932,63.133049000000085],[-67.92332499999992,63.129433000000063],[-67.912780999999939,63.083327999999995],[-67.646117999999944,63.100272999999959],[-67.632767000000001,63.09887700000013],[-67.610275000000001,63.094154000000117],[-67.604996000000028,63.089989000000116],[-67.599990999999989,63.084434999999928],[-67.599990999999989,63.078880000000026],[-67.601944000000003,63.073326000000066],[-67.61500499999994,63.063605999999993],[-67.624160999999958,63.061104000000057],[-67.636123999999995,63.059715000000097],[-67.682219999999916,63.057770000000119],[-67.689712999999927,63.058044000000052],[-67.709166999999923,63.056655999999919],[-67.719451999999933,63.054993000000024],[-67.727492999999924,63.051659000000029],[-67.77305599999994,63.025826000000052],[-67.772507000000019,62.962212000000136],[-67.769729999999981,62.958327999999938],[-67.763625999999988,62.955551000000071],[-67.748046999999985,62.953049000000135],[-67.738602000000014,62.953323000000069],[-67.728058000000033,62.954993999999942],[-67.721831999999949,62.96265800000009],[-67.718841999999995,62.964493000000061],[-67.718169999999986,62.967327000000068],[-67.719329999999957,62.970490000000098],[-67.72444200000001,62.984161000000086],[-67.729995999999971,62.98832700000014],[-67.736938000000009,62.995544000000109],[-67.733886999999982,63.000832000000116],[-67.698043999999925,63.020828000000051],[-67.686934999999949,63.026657000000114],[-67.659438999999963,63.034164000000033],[-67.56527699999998,63.049438000000123],[-67.553054999999915,63.048607000000118],[-67.529998999999975,63.03694200000001],[-67.510559000000001,63.024712000000079],[-67.499999999999943,63.015549000000078],[-67.499724999999955,63.007773999999984],[-67.509170999999924,63.001938000000109],[-67.531386999999995,62.995269999999948],[-67.550551999999982,62.99193600000001],[-67.573333999999988,62.990273000000059],[-67.593613000000005,62.987495000000081],[-67.630828999999949,62.976379000000122],[-67.651397999999915,62.967490999999939],[-67.670997999999997,62.944323999999995],[-67.671829000000002,62.941322000000127],[-67.672667999999987,62.937996000000055],[-67.672775000000001,62.923324999999977],[-67.665833000000021,62.918884000000048],[-67.659164000000033,62.916664000000026],[-67.654921999999999,62.917282],[-67.648894999999925,62.921104000000071],[-67.646666999999979,62.925270000000125],[-67.638335999999981,62.931938000000116],[-67.572509999999909,62.963882000000126],[-67.566956000000005,62.965546000000131],[-67.470275999999956,62.985268000000019],[-67.462783999999999,62.985268000000019],[-67.39805599999994,62.967209000000082],[-67.194716999999912,62.870270000000062],[-67.048339999999996,62.771378000000141],[-67.012221999999952,62.73443600000013],[-66.95777899999996,62.681106999999997],[-66.913329999999917,62.669991000000039],[-66.824722000000008,62.679161000000079],[-66.813323999999852,62.679992999999968],[-66.741104000000007,62.673882000000106],[-66.733063000000016,62.671661000000029],[-66.726944000000003,62.668602000000021],[-66.728881999999942,62.666100000000142],[-66.735275000000001,62.662490999999932],[-66.744445999999925,62.660271000000137],[-66.752791999999999,62.656936999999971],[-66.760559000000001,62.653602999999976],[-66.768065999999919,62.648879999999963],[-66.773055999999883,62.643050999999957],[-66.775009000000011,62.636940000000095],[-66.773055999999883,62.632492000000127],[-66.606948999999986,62.604996000000085],[-66.425002999999947,62.445267000000115],[-66.359436000000017,62.447487000000137],[-66.351668999999958,62.444992000000127],[-66.349166999999966,62.441376000000048],[-66.327498999999932,62.384438000000046],[-66.330565999999976,62.379158000000018],[-66.337783999999886,62.374992000000077],[-66.426391999999964,62.349433999999974],[-66.435546999999929,62.349158999999986],[-66.458617999999944,62.35193600000008],[-66.469161999999983,62.35193600000008],[-66.475829999999974,62.348602000000085],[-66.478881999999999,62.343323000000112],[-66.478881999999999,62.338325999999995],[-66.476943999999946,62.335823000000005],[-66.470000999999968,62.332214000000022],[-66.374709999999993,62.286110000000065],[-66.329177999999956,62.267494000000056],[-66.318619000000012,62.264717000000132],[-66.355834999999956,62.307770000000062],[-66.359160999999972,62.312492000000134],[-66.363892000000021,62.323051000000021],[-66.361389000000031,62.326942000000088],[-66.355559999999855,62.331940000000088],[-66.351944000000003,62.334991000000116],[-66.332779000000016,62.341934000000094],[-66.3125,62.344993999999986],[-66.294158999999979,62.344711000000018],[-66.285552999999993,62.343605000000139],[-66.208343999999897,62.332214000000022],[-66.165282999999931,62.291381999999999],[-66.160277999999892,62.271378000000084],[-66.167220999999984,62.254439999999988],[-66.201950000000011,62.260551000000078],[-66.256667999999991,62.266105999999979],[-66.261397999999872,62.263054000000068],[-66.257232999999871,62.259720000000073],[-66.241104000000007,62.253326000000015],[-66.212508999999898,62.245270000000119],[-66.166397000000018,62.235267999999962],[-66.081680000000006,62.226379000000065],[-66.058608999999876,62.2241590000001],[-66.051940999999999,62.224709000000132],[-66.045836999999949,62.227485999999999],[-66.043610000000001,62.233604000000128],[-66.038895000000025,62.239432999999963],[-66.033889999999985,62.244995000000131],[-66.028610000000015,62.248604000000114],[-66.025008999999955,62.249718000000087],[-66.015014999999948,62.251389000000131],[-66,62.247771999999998],[-65.993057000000022,62.244155999999975],[-65.939437999999996,62.208602999999925],[-65.933059999999955,62.204163000000108],[-65.929168999999888,62.198044000000095],[-65.930556999999965,62.193321000000083],[-65.934432999999956,62.191657999999961],[-65.952788999999939,62.189156000000082],[-65.963332999999977,62.186935000000005],[-65.969161999999926,62.184714999999983],[-66.043610000000001,62.151657],[-66.050827000000027,62.147774000000084],[-66.132492000000013,62.089432000000045],[-66.110001000000011,62.017494000000113],[-66.041945999999996,61.958046000000081],[-66.035827999999924,61.952773999999977],[-66.033066000000019,61.95249200000012],[-66.019454999999994,61.954993999999999],[-66.003066999999987,61.962212000000022],[-65.999434999999949,61.963051000000121],[-65.992217999999866,61.962769000000094],[-65.988602000000014,61.958885000000066],[-65.949432000000002,61.912491000000102],[-65.946655000000021,61.906936999999914],[-65.946655000000021,61.899162000000047],[-65.948882999999967,61.89527099999998],[-65.955001999999979,61.890274000000034],[-65.961945000000014,61.886383000000137],[-65.97084000000001,61.883881000000088],[-66.057770000000005,61.869713000000047],[-66.066101000000003,61.868599000000074],[-66.275832999999977,61.858330000000024],[-66.287780999999995,61.858330000000024],[-66.395003999999858,61.87082700000002],[-66.404449,61.872765000000129],[-66.521666999999923,61.896942000000024],[-66.543334999999956,61.898880000000133],[-66.555557000000022,61.901382000000012],[-66.626099000000011,61.917213000000004],[-66.632767000000001,61.918884000000048],[-66.659163999999976,61.933601000000067],[-66.665282999999931,61.941375999999991],[-66.662216000000001,61.946655000000135],[-66.746947999999918,62.00777400000004],[-66.755568999999923,62.011108000000036],[-66.781386999999881,62.015549000000135],[-66.803329000000019,62.016937000000041],[-66.812774999999988,62.016663000000108],[-66.825835999999924,62.011940000000095],[-67.091949,62.030822999999998],[-67.104720999999984,62.032211000000132],[-67.254729999999938,62.078049000000078],[-67.345275999999899,62.119437999999946],[-67.463057999999933,62.139435000000049],[-67.499999999999943,62.138657000000137],[-67.731658999999922,62.158356000000026],[-67.757232999999928,62.160544999999956],[-67.798339999999939,62.166100000000085],[-68.003066999999987,62.213882000000126],[-68.113892000000021,62.216103000000032],[-68.233062999999902,62.219711000000132],[-68.256957999999997,62.220825000000104],[-68.269164999999873,62.223045000000127],[-68.299438000000009,62.232208000000128],[-68.325286999999946,62.234993000000145],[-68.401671999999962,62.239432999999963],[-68.46945199999999,62.242767000000129],[-68.519729999999925,62.244713000000047],[-68.548049999999932,62.248604000000114],[-68.564712999999927,62.251938000000109],[-68.615828999999962,62.263885000000073],[-68.722228999999913,62.302216000000044],[-68.725554999999872,62.30471],[-68.726943999999946,62.307770000000062],[-68.759170999999924,62.328049000000021],[-68.882216999999969,62.360550000000103],[-68.922501000000011,62.365547000000049],[-68.995833999999945,62.373322000000087],[-69.039000999999985,62.381355000000042],[-69.121384000000035,62.410820000000115],[-69.160003999999958,62.425270000000069],[-69.193054000000018,62.438042000000053],[-69.231673999999884,62.455269000000101],[-69.270554000000004,62.478325000000098],[-69.36082499999992,62.536385000000053],[-69.40834000000001,62.569992000000013],[-69.430556999999965,62.584160000000054],[-69.426666000000012,62.55443600000001],[-69.428329000000019,62.548332000000016],[-69.442215000000033,62.547493000000031],[-69.449721999999952,62.551102000000014],[-69.519164999999987,62.602493000000095],[-69.583892999999989,62.651932000000102],[-69.597228999999913,62.662490999999932],[-69.597504000000015,62.665268000000026],[-69.565551999999968,62.718048000000067],[-69.557219999999973,62.726379000000009],[-69.543335000000013,62.732765000000086],[-69.525557999999933,62.738044999999943],[-69.50389100000001,62.741378999999938],[-69.482497999999964,62.763611000000026],[-69.727492999999981,62.779991000000109],[-69.906386999999881,62.768599999999992],[-70.121932999999956,62.748878000000104],[-70.217498999999862,62.747772000000111],[-70.229171999999949,62.748878000000104],[-70.240279999999984,62.751389000000074],[-70.354995999999915,62.788329999999974],[-70.360000999999954,62.790276000000063],[-70.367767000000015,62.793883999999991],[-70.477782999999988,62.848328000000038],[-70.499434999999949,62.864441000000056],[-70.508056999999951,62.865828999999962],[-70.665558000000033,62.880547000000092],[-70.830291999999929,62.896660000000111],[-70.853332999999964,62.899994000000106],[-70.885558999999944,62.907211000000018],[-70.896118000000001,62.91443600000008],[-70.893065999999976,62.917770000000075],[-70.885833999999988,62.920546999999999],[-70.871384000000035,62.924713000000054],[-70.863616999999977,62.925552000000039],[-70.848343,62.924713000000054],[-70.847777999999892,62.947212000000036],[-70.974837999999977,62.989437000000009],[-70.977341000000024,62.983768000000055],[-71.013061999999991,62.989990000000091],[-71.060271999999941,62.981102000000078],[-71.071670999999981,62.979431000000034],[-71.120833999999945,62.979431000000034],[-71.135833999999932,62.980820000000051],[-71.152221999999995,62.985268000000019],[-71.156661999999983,62.989159000000086],[-71.156661999999983,62.999434999999949],[-71.136672999999973,63.028602999999976],[-71.118103000000019,63.032219000000055],[-71.091384999999946,63.029991000000052],[-71.020888999999954,63.044270000000097],[-71.013724999999965,63.043602000000021],[-71.007384999999942,63.043437999999981],[-71.003219999999942,63.044768999999974],[-70.863892000000021,63.112213000000054],[-70.856383999999991,63.139434999999992],[-70.908889999999985,63.17083000000008],[-70.920546999999942,63.168883999999991],[-70.952498999999989,63.162766000000033],[-70.971389999999928,63.158882000000006],[-70.976943999999946,63.15665400000006],[-70.990279999999984,63.148048000000131],[-70.997498000000007,63.141662999999937],[-71.001953000000015,63.128044000000045],[-71.002791999999999,63.123322000000144],[-71.00140399999998,63.118881000000044],[-70.993332000000009,63.112770000000125],[-70.990829000000019,63.108330000000137],[-70.989989999999977,63.102492999999981],[-70.993606999999997,63.098045000000013],[-71.029723999999987,63.071937999999989],[-71.041672000000005,63.069442999999922],[-71.127212999999983,63.071663000000115],[-71.138610999999912,63.073326000000066],[-71.195266999999944,63.031661999999983],[-71.195830999999998,63.026657000000114],[-71.198607999999979,63.019989000000123],[-71.208618000000001,63.01166500000005],[-71.232773000000009,63.001938000000109],[-71.243880999999988,63.00110600000005],[-71.255844000000025,63.001938000000109],[-71.262512000000015,63.004166000000112],[-71.40055799999999,63.051659000000029],[-71.408339999999953,63.055267000000129],[-71.413895000000025,63.060546999999985],[-71.421386999999982,63.071663000000115],[-71.454726999999934,63.10193600000008],[-71.465012000000002,63.103325000000098],[-71.605834999999956,63.134995000000004],[-71.624999999999943,63.140831000000048],[-71.70666499999993,63.174995000000081],[-71.713897999999972,63.179161000000136],[-71.770003999999915,63.25638600000002],[-71.794998000000021,63.326660000000004],[-71.795546999999942,63.384720000000073],[-71.805831999999953,63.382767000000001],[-72.009170999999981,63.391106000000036],[-72.063048999999921,63.396385000000009],[-72.076400999999976,63.398048000000074],[-72.083069000000023,63.400542999999971],[-72.141678000000013,63.436104000000114],[-72.146118000000001,63.439987000000031],[-72.145554000000004,63.44609800000012],[-72.126662999999951,63.450271999999984],[-72.023055999999997,63.448043999999982],[-71.933318999999926,63.443321000000026],[-71.825835999999981,63.435265000000129],[-71.785278000000005,63.431938000000002],[-71.748046999999985,63.428047000000106],[-71.711120999999935,63.422768000000133],[-71.683059999999955,63.419716000000051],[-71.634734999999921,63.419716000000051],[-71.61500499999994,63.422493000000145],[-71.59944200000001,63.42582700000014],[-71.411666999999909,63.485824999999977],[-71.316955999999948,63.530823000000055],[-71.227492999999924,63.598877000000016],[-71.229720999999984,63.604713000000061],[-71.234726000000023,63.608047000000056],[-71.245620999999971,63.610939000000087],[-71.261123999999995,63.612495000000024],[-71.295273000000009,63.612495000000024],[-71.306945999999982,63.611381999999935],[-71.323623999999938,63.605270000000132],[-71.328063999999983,63.602218999999934],[-71.331680000000006,63.598328000000038],[-71.333069000000023,63.583603000000096],[-71.332503999999972,63.581664999999987],[-71.328063999999983,63.576942000000031],[-71.325561999999991,63.571938000000046],[-71.326110999999912,63.570549000000028],[-71.331680000000006,63.565543999999989],[-71.335280999999895,63.564437999999996],[-71.379990000000021,63.565543999999989],[-71.407501000000025,63.567771999999934],[-71.414168999999958,63.570549000000028],[-71.416397000000018,63.572769000000051],[-71.378052000000025,63.595268000000033],[-71.367492999999968,63.601935999999966],[-71.363616999999977,63.607216000000051],[-71.362503000000004,63.61332700000014],[-71.377486999999974,63.632767000000115],[-71.396666999999923,63.635826000000066],[-71.407776000000013,63.635551000000078],[-71.411391999999978,63.634437999999989],[-71.418059999999969,63.629990000000021],[-71.452498999999989,63.604439000000127],[-71.441101000000003,63.590827999999988],[-71.439437999999996,63.588042999999971],[-71.446944999999914,63.580826000000002],[-71.455841000000021,63.57888000000014],[-71.470275999999956,63.578049000000135],[-71.561661000000015,63.580275999999969],[-71.576950000000011,63.581664999999987],[-71.580565999999976,63.583878000000141],[-71.581389999999942,63.59304800000001],[-71.583618000000001,63.649719000000118],[-71.569457999999997,63.675552000000039],[-71.562209999999993,63.685546999999985],[-71.581116000000009,63.714995999999985],[-71.585007000000019,63.71665999999999],[-71.615828999999906,63.722213999999951],[-71.629165999999941,63.723877000000073],[-71.638061999999877,63.721099999999979],[-71.660004000000015,63.706940000000088],[-71.664718999999877,63.703049000000021],[-71.667220999999927,63.697212000000036],[-71.700561999999991,63.696381000000031],[-71.823897999999872,63.78054800000001],[-71.830001999999979,63.784439000000077],[-71.891113000000018,63.80832700000002],[-71.904449,63.809989999999971],[-71.915558000000033,63.810271999999998],[-71.938599000000011,63.808044000000052],[-71.958344000000011,63.802490000000034],[-71.970550999999944,63.795830000000024],[-71.985549999999932,63.781937000000028],[-72.000564999999995,63.761383000000023],[-72.004181000000017,63.752776999999924],[-71.999725000000012,63.748328999999956],[-71.991104000000007,63.74610100000001],[-71.972778000000005,63.748047000000099],[-71.966949,63.75110600000005],[-71.954726999999934,63.76527400000009],[-71.946654999999964,63.770271000000037],[-71.939162999999951,63.772491000000059],[-71.934433000000013,63.772766000000047],[-71.853881999999999,63.761383000000023],[-71.848617999999988,63.759438000000046],[-71.843886999999995,63.755554000000018],[-71.879439999999988,63.681937999999946],[-71.882766999999944,63.678047000000049],[-71.920273000000009,63.655548000000124],[-71.933884000000035,63.649437000000034],[-71.963622999999984,63.649162000000047],[-72.051940999999943,63.67860399999995],[-72.154175000000009,63.735550000000103],[-72.169448999999986,63.748604],[-72.21305799999999,63.683876000000112],[-72.212783999999942,63.680550000000039],[-72.213897999999915,63.677772999999945],[-72.218886999999995,63.673882000000049],[-72.223891999999864,63.672218000000044],[-72.234160999999972,63.670273000000066],[-72.245269999999948,63.669715999999994],[-72.28694200000001,63.671660999999972],[-72.317504999999983,63.674164000000133],[-72.324172999999973,63.676658999999972],[-72.327498999999989,63.67971799999998],[-72.363891999999964,63.749435000000005],[-72.363616999999977,63.754440000000045],[-72.357772999999952,63.761383000000023],[-72.352782999999988,63.76527400000009],[-72.342498999999975,63.771378000000141],[-72.324722000000008,63.776939000000027],[-72.317779999999914,63.777771000000087],[-72.302779999999927,63.776657000000114],[-72.291381999999942,63.773605000000032],[-72.270003999999915,63.787216000000001],[-72.215012000000002,63.867767000000072],[-72.209732000000031,63.893051000000071],[-72.223052999999993,63.92943600000001],[-72.232772999999895,63.948325999999952],[-72.238892000000021,63.952492000000063],[-72.246384000000035,63.950272000000041],[-72.250564999999938,63.947769000000051],[-72.36471599999993,63.845543000000134],[-72.383056999999951,63.815543999999932],[-72.376388999999961,63.812209999999936],[-72.371658000000025,63.809158000000025],[-72.366942999999992,63.804710000000057],[-72.365554999999915,63.800270000000069],[-72.363051999999925,63.791107000000068],[-72.368056999999965,63.782494000000099],[-72.372771999999998,63.778603000000032],[-72.436110999999926,63.781661999999983],[-72.515838999999971,63.786384999999996],[-72.526397999999915,63.787773000000072],[-72.531386999999995,63.791107000000068],[-72.532227000000034,63.796661000000029],[-72.531386999999995,63.799438000000123],[-72.519729999999925,63.804710000000057],[-72.496658000000025,63.803604000000064],[-72.474166999999909,63.804710000000057],[-72.463897999999972,63.806655999999975],[-72.459731999999974,63.809158000000025],[-72.456116000000009,63.814438000000109],[-72.456954999999994,63.815826000000015],[-72.465011999999945,63.819160000000011],[-72.521117999999944,63.84027100000003],[-72.537216000000001,63.844154000000003],[-72.585555999999997,63.852776000000006],[-72.634734999999978,63.852493000000038],[-72.637512000000015,63.873604000000057],[-72.641112999999962,63.904434000000094],[-72.611663999999962,63.943046999999979],[-72.592772999999852,64.018051000000128],[-72.592772999999852,64.022217000000069],[-72.658339999999896,64.076660000000004],[-72.664718999999934,64.080551000000071],[-72.67471299999994,64.083327999999995],[-72.682495000000017,64.079711999999972],[-72.685546999999929,64.076385000000016],[-72.688048999999978,64.070540999999992],[-72.704726999999991,64.015549000000078],[-72.705841000000021,64.009155000000021],[-72.702498999999932,64.005553999999961],[-72.696945000000028,64.003052000000082],[-72.668335000000013,63.996101000000124],[-72.660004000000015,63.992493000000024],[-72.658614999999998,63.987770000000069],[-72.666396999999961,63.980545000000006],[-72.678878999999938,63.972488000000055],[-72.692490000000021,63.966660000000104],[-72.699722000000008,63.964439000000027],[-72.720000999999968,63.961105000000032],[-72.753341999999918,64.000274999999988],[-72.758346999999958,64.004166000000055],[-72.779449,64.010544000000039],[-72.836120999999991,64.019714000000079],[-72.931380999999988,64.052475000000015],[-72.94027699999998,64.058594000000028],[-72.941375999999991,64.063599000000067],[-72.93971299999987,64.067764000000068],[-72.933318999999983,64.076385000000016],[-72.925551999999868,64.084152000000131],[-72.919723999999917,64.086929000000055],[-72.911117999999931,64.08859300000006],[-72.888061999999991,64.086105000000089],[-72.878326000000015,64.086655000000121],[-72.874435000000005,64.08859300000006],[-72.870833999999945,64.093872000000033],[-72.868880999999931,64.099152000000117],[-72.868332000000009,64.108321999999987],[-72.897232000000031,64.156937000000028],[-72.905272999999909,64.164993000000095],[-72.911666999999966,64.168868999999972],[-73.223891999999921,64.31164600000011],[-73.271117999999888,64.283875000000023],[-73.267226999999991,64.273880000000133],[-73.270003999999972,64.265823000000125],[-73.273055999999997,64.26249700000011],[-73.279174999999952,64.258606000000043],[-73.339721999999938,64.258040999999992],[-73.365829000000019,64.261932000000058],[-73.380554000000018,64.268600000000049],[-73.384170999999981,64.272491000000116],[-73.386947999999904,64.277480999999966],[-73.417769999999905,64.371093999999914],[-73.415558000000033,64.445816000000036],[-73.326950000000011,64.476089000000002],[-73.167770000000019,64.576660000000118],[-73.164718999999934,64.579712000000029],[-73.164718999999934,64.60554499999995],[-73.165557999999976,64.607483000000116],[-73.169448999999872,64.609984999999995],[-73.296950999999922,64.656937000000084],[-73.302779999999927,64.658875000000023],[-73.309433000000013,64.658600000000035],[-73.342223999999931,64.644150000000081],[-73.346664000000033,64.641098],[-73.347504000000015,64.63499500000006],[-73.341110000000015,64.626083000000051],[-73.326110999999969,64.609984999999995],[-73.314437999999939,64.598038000000031],[-73.308043999999995,64.593322999999998],[-73.302215999999987,64.583878000000084],[-73.298614999999927,64.559418000000107],[-73.299163999999962,64.544982999999945],[-73.303328999999962,64.538315000000011],[-73.30749499999996,64.535812000000021],[-73.315276999999924,64.532211000000132],[-73.32417299999986,64.52998400000007],[-73.424164000000019,64.509995000000004],[-73.463333000000034,64.502486999999974],[-73.47222899999997,64.504440000000102],[-73.475829999999917,64.508040999999935],[-73.477218999999991,64.512207000000046],[-73.473052999999993,64.553589000000045],[-73.448714999999936,64.565422000000012],[-73.467223999999987,64.612762000000089],[-73.595000999999968,64.629699999999957],[-73.655563000000029,64.631653000000085],[-73.655563000000029,64.623596000000134],[-73.667496000000028,64.577209000000039],[-73.750289999999893,64.536377000000073],[-73.75389100000001,64.535263000000043],[-73.764450000000011,64.537491000000045],[-73.787780999999939,64.548035000000084],[-73.803054999999915,64.555251999999996],[-73.821121000000005,64.567490000000078],[-73.837783999999999,64.579712000000029],[-73.84944200000001,64.587493999999992],[-73.861388999999974,64.594436999999971],[-73.876662999999951,64.600815000000125],[-73.886947999999961,64.603592000000049],[-73.910277999999948,64.605819999999994],[-73.920272999999952,64.605255000000113],[-73.929442999999992,64.602203000000031],[-73.932495000000017,64.593597000000102],[-73.931106999999997,64.583878000000084],[-73.844726999999978,64.501937999999996],[-73.925551999999925,64.460265999999933],[-73.972777999999892,64.430267000000129],[-73.999434999999892,64.328048999999965],[-74.062774999999988,64.334427000000119],[-74.102218999999877,64.367476999999951],[-74.128051999999911,64.533051],[-74.127486999999974,64.534424000000115],[-74.105835000000013,64.535812000000021],[-74.082229999999925,64.534988000000055],[-74.065276999999924,64.533051],[-74.055557000000022,64.610535000000027],[-74.050551999999982,64.724991000000045],[-74.053878999999938,64.728592000000106],[-74.060546999999985,64.733322000000101],[-74.089721999999995,64.751099000000011],[-74.096114999999941,64.751389000000017],[-74.114440999999943,64.745819000000097],[-74.120543999999995,64.74192800000003],[-74.195266999999888,64.663040000000024],[-74.208892999999932,64.614151000000049],[-74.212783999999999,64.602768000000083],[-74.224715999999944,64.592484000000013],[-74.240279999999984,64.58027600000014],[-74.381942999999922,64.569992000000127],[-74.390288999999996,64.569716999999912],[-74.397507000000019,64.572220000000073],[-74.535278000000005,64.622208000000057],[-74.657500999999968,64.700272000000098],[-74.701675000000023,64.732483000000002],[-74.704177999999899,64.735535000000084],[-74.700835999999867,64.740265000000136],[-74.683318999999926,64.758331000000112],[-74.567504999999983,64.832764000000054],[-74.501113999999973,64.833603000000039],[-74.487777999999935,64.834152000000017],[-74.478881999999999,64.835815000000082],[-74.476395000000025,64.838882000000012],[-74.476943999999946,64.84165999999999],[-74.540557999999976,64.889160000000004],[-74.545836999999949,64.892212000000086],[-74.561110999999926,64.896102999999982],[-74.621932999999956,64.903869999999927],[-74.639998999999932,64.903595000000109],[-74.648620999999935,64.901382000000126],[-74.660277999999892,64.896378000000027],[-74.732773000000009,64.854705999999965],[-74.741378999999938,64.847488000000112],[-74.743057000000022,64.842209000000139],[-74.741942999999992,64.835815000000082],[-74.738892000000021,64.831375000000094],[-74.72222899999997,64.822220000000016],[-74.714721999999938,64.815535999999952],[-74.710007000000019,64.810532000000023],[-74.706664999999987,64.800537000000077],[-74.706664999999987,64.794983000000116],[-74.710830999999985,64.782761000000107],[-74.718886999999938,64.773604999999975],[-74.726394999999968,64.770828000000108],[-74.837219000000005,64.778595000000053],[-74.868332000000009,64.781936999999971],[-74.893341000000021,64.784714000000065],[-74.902221999999938,64.78804000000008],[-74.909164000000033,64.791367000000037],[-74.915833000000021,64.795822000000044],[-74.924438000000009,64.799149],[-74.944153000000028,64.803589000000045],[-74.955001999999979,64.804428000000144],[-74.975554999999872,64.801376000000062],[-74.985274999999945,64.795822000000044],[-74.985549999999876,64.790268000000083],[-74.982498000000021,64.785263000000043],[-74.978881999999999,64.781372000000147],[-74.963332999999977,64.773604999999975],[-74.834732000000031,64.716385000000116],[-74.733321999999987,64.685531999999967],[-74.694442999999978,64.676376000000005],[-74.675551999999982,64.670258000000047],[-74.660003999999958,64.663879000000009],[-74.613051999999925,64.640274000000034],[-74.545273000000009,64.602203000000031],[-74.512787000000003,64.583603000000096],[-74.475280999999939,64.561371000000008],[-74.470000999999968,64.557479999999941],[-74.47084000000001,64.555542000000003],[-74.513625999999874,64.533325000000104],[-74.520279000000016,64.532211000000132],[-74.585830999999985,64.480270000000075],[-74.685546999999985,64.391936999999984],[-74.685821999999973,64.371093999999914],[-74.797774999999945,64.380813999999987],[-74.974716000000001,64.416091999999992],[-74.985274999999945,64.418869000000086],[-75.010558999999944,64.429977000000122],[-75.056380999999988,64.452208999999982],[-75.142501999999979,64.483321999999987],[-75.174712999999997,64.492752000000053],[-75.182769999999948,64.492477000000065],[-75.188598999999954,64.489426000000037],[-75.188888999999904,64.483321999999987],[-75.187209999999993,64.473602000000085],[-75.182495000000017,64.468323000000112],[-75.177215999999987,64.464705999999978],[-75.151397999999915,64.460265999999933],[-75.146117999999944,64.457214000000022],[-75.14416499999993,64.453049000000021],[-75.15055799999999,64.447204999999997],[-75.154448999999943,64.444702000000063],[-75.199721999999952,64.428040000000067],[-75.207779000000016,64.427765000000022],[-75.21556099999998,64.428864000000033],[-75.224166999999909,64.432205000000067],[-75.295272999999952,64.46665999999999],[-75.323897999999986,64.481934000000081],[-75.332503999999972,64.490814000000114],[-75.344161999999926,64.49914600000011],[-75.34973100000002,64.50221300000004],[-75.381667999999991,64.513611000000026],[-75.409164000000033,64.522766000000104],[-75.479720999999927,64.53915399999994],[-75.490829000000019,64.539703000000088],[-75.566100999999946,64.549988000000042],[-75.666396999999961,64.563873000000115],[-75.693329000000006,64.569992000000127],[-75.703887999999949,64.572769000000051],[-75.721389999999985,64.579163000000051],[-75.736938000000009,64.586104999999975],[-75.74722300000002,64.594436999999971],[-75.763625999999988,64.604980000000126],[-75.773894999999925,64.608322000000044],[-75.796951000000035,64.612198000000149],[-75.824172999999973,64.611649],[-75.843063000000029,64.607758000000103],[-75.847228999999913,64.604430999999977],[-75.837219000000005,64.561371000000008],[-75.823623999999938,64.535812000000021],[-75.818893000000003,64.530823000000055],[-75.807495000000017,64.525269000000037],[-75.729172000000005,64.503051999999968],[-75.644729999999925,64.468872000000033],[-75.639449999999954,64.46527100000003],[-75.630554000000018,64.457214000000022],[-75.631667999999991,64.453598],[-75.636123999999938,64.449142000000052],[-75.641388000000006,64.448028999999963],[-75.696655000000021,64.43942300000009],[-75.708343999999954,64.437759000000028],[-75.727782999999931,64.442474000000061],[-75.746947999999975,64.453049000000021],[-75.765839000000028,64.46527100000003],[-75.77305599999994,64.467484000000127],[-75.874709999999993,64.486923000000047],[-75.895279000000016,64.48803700000002],[-75.908339999999953,64.487198000000035],[-75.920273000000009,64.484420999999998],[-75.922500999999954,64.481094000000041],[-75.910552999999993,64.478317000000118],[-75.875274999999988,64.47387700000013],[-75.857772999999952,64.468048000000067],[-75.720839999999953,64.383331000000055],[-75.717223999999987,64.379700000000014],[-75.718886999999995,64.374419999999986],[-75.723327999999924,64.369705000000124],[-75.726944000000003,64.367203000000018],[-75.83805799999999,64.369141000000013],[-75.861664000000019,64.371093999999914],[-75.950561999999934,64.399155000000007],[-76.043883999999991,64.368317000000047],[-76.253615999999965,64.35775799999999],[-76.264450000000011,64.319153000000028],[-76.214721999999995,64.314986999999974],[-76.205565999999976,64.313309000000004],[-76.196655000000021,64.310806000000071],[-76.188323999999852,64.306931000000077],[-76.189712999999927,64.301376000000005],[-76.197219999999959,64.29693600000013],[-76.205840999999964,64.294708000000014],[-76.300551999999982,64.278869999999984],[-76.484725999999966,64.266662999999994],[-76.493606999999997,64.268600000000049],[-76.503066999999987,64.275269000000094],[-76.506957999999941,64.284424000000001],[-76.505568999999923,64.289153999999996],[-76.503615999999909,64.291091999999935],[-76.502501999999936,64.295258000000047],[-76.506667999999934,64.297485000000108],[-76.541381999999999,64.304703000000075],[-76.591949,64.31053199999991],[-76.705840999999964,64.300812000000008],[-76.719451999999933,64.296646000000123],[-76.733886999999868,64.290543000000014],[-76.736664000000019,64.285812000000078],[-76.738892000000021,64.276382000000012],[-76.721663999999976,64.238312000000064],[-76.714721999999995,64.233870999999965],[-76.706115999999952,64.231369000000086],[-76.684722999999963,64.227768000000026],[-76.674438000000009,64.224990999999932],[-76.667220999999927,64.221924000000058],[-76.660278000000005,64.218322999999998],[-76.654723999999931,64.209152000000017],[-76.654723999999931,64.196640000000059],[-76.65834000000001,64.189972000000068],[-76.662215999999944,64.186646000000053],[-76.670546999999942,64.184143000000063],[-76.84722899999997,64.23054500000012],[-76.968337999999903,64.259720000000016],[-77.138335999999981,64.289429000000041],[-77.276108000000022,64.256378000000097],[-77.296111999999937,64.251938000000052],[-77.327498999999989,64.246367999999961],[-77.351944000000003,64.243866000000082],[-77.366104000000007,64.243866000000082],[-77.379990000000021,64.2452550000001],[-77.381377999999984,64.246643000000006],[-77.382216999999969,64.2494200000001],[-77.381377999999984,64.253601000000003],[-77.378875999999934,64.256943000000092],[-77.434158000000025,64.320267000000001],[-77.588332999999977,64.368317000000047],[-77.652221999999938,64.388046000000088],[-77.660278000000005,64.386383000000023],[-77.664444000000003,64.3836060000001],[-77.665832999999907,64.376923000000147],[-77.664718999999991,64.374146000000053],[-77.658889999999985,64.364990000000091],[-77.67971799999998,64.321105999999986],[-77.747222999999963,64.337769000000037],[-77.831389999999942,64.412490999999989],[-77.970276000000013,64.454436999999928],[-78.178054999999972,64.567490000000078],[-78.183318999999926,64.572495000000117],[-78.168578999999966,64.626197999999931],[-78.160552999999993,64.690536000000066],[-78.184433000000013,64.731093999999985],[-78.073623999999938,64.813599000000124],[-78.064437999999996,64.849426000000051],[-78.065276999999867,64.853591999999992],[-78.06639100000001,64.855820000000108],[-78.073623999999938,64.859420999999998],[-78.102492999999981,64.868866000000025],[-78.117217999999923,64.876082999999994],[-78.120834000000002,64.881088000000034],[-78.129715000000033,64.893875000000037],[-78.146118000000001,64.938309000000004],[-78.148055999999997,64.943862999999965],[-78.149733999999967,64.952209000000039],[-78.145279000000016,64.957489000000123],[-77.973052999999993,65.04136699999998],[-77.67971799999998,65.123306000000014],[-77.543610000000001,65.139709000000096],[-77.50306699999993,65.138596000000007],[-77.488326999999913,65.139434999999935],[-77.479720999999984,65.141098000000056],[-77.344726999999978,65.173309000000131],[-77.328612999999962,65.178864000000033],[-77.322783999999956,65.18331900000004],[-77.315825999999959,65.190536000000009],[-77.313048999999978,65.195816000000036],[-77.315552000000025,65.199417000000096],[-77.3824919999999,65.247482000000105],[-77.397232000000031,65.254990000000134],[-77.422774999999945,65.264435000000049],[-77.444716999999912,65.275543000000027],[-77.498046999999985,65.306641000000013],[-77.513061999999934,65.318877999999984],[-77.515015000000005,65.325820999999962],[-77.512222000000008,65.330551000000014],[-77.471114999999998,65.371368000000018],[-77.466949,65.375259000000085],[-77.461120999999878,65.379149999999981],[-77.452498999999875,65.380813999999987],[-77.438048999999921,65.379700000000014],[-77.41361999999998,65.371643000000063],[-77.402495999999985,65.369141000000127],[-77.345839999999896,65.358597000000088],[-77.337783999999999,65.357483000000116],[-77.323058999999944,65.357757999999933],[-77.30610699999994,65.359711000000061],[-77.295546999999999,65.361922999999933],[-77.291945999999939,65.363876000000062],[-77.287505999999951,65.367751999999996],[-77.287216000000001,65.375259000000085],[-77.289992999999924,65.378860000000145],[-77.295273000000009,65.383331000000055],[-77.319457999999997,65.393326000000002],[-77.326950000000011,65.395538000000045],[-77.341949,65.401657000000057],[-77.367492999999911,65.412491000000102],[-77.398620999999935,65.426651000000049],[-77.420272999999952,65.439972000000012],[-77.428329000000019,65.447754000000145],[-77.434432999999956,65.456940000000088],[-77.430556999999908,65.458878000000027],[-77.421660999999972,65.461380000000077],[-77.385559000000001,65.468048000000067],[-77.336670000000026,65.471375000000023],[-77.265288999999882,65.471923999999944],[-77.238051999999925,65.469437000000084],[-77.154449,65.445815999999979],[-77.134734999999978,65.439423000000033],[-77.124434999999892,65.434143000000006],[-77.115828999999962,65.429703000000131],[-77.111663999999962,65.426085999999998],[-77.111114999999927,65.421371000000136],[-77.106383999999991,65.413605000000075],[-77.09944200000001,65.409149000000014],[-77.08666999999997,65.407211000000075],[-76.962783999999999,65.407211000000075],[-76.956954999999994,65.410537999999974],[-76.952498999999989,65.414993000000038],[-76.956116000000009,65.421371000000136],[-76.955565999999976,65.422759999999982],[-76.951675000000023,65.425262000000032],[-76.944442999999978,65.427765000000022],[-76.920837000000006,65.429428000000144],[-76.849990999999989,65.428313999999943],[-76.824722000000008,65.425262000000032],[-76.626937999999939,65.398880000000133],[-76.361937999999952,65.342209000000025],[-76.235001000000011,65.312759000000142],[-76.164444000000003,65.296097000000145],[-76.072509999999909,65.277205999999921],[-75.96665999999999,65.255829000000119],[-75.953888000000006,65.255264000000068],[-75.925277999999935,65.257217000000026],[-75.920273000000009,65.258330999999998],[-75.912215999999944,65.257217000000026],[-75.898345999999947,65.253875999999991],[-75.805556999999965,65.229705999999965],[-75.785552999999936,65.224426000000108],[-75.769164999999987,65.21887200000009],[-75.765014999999892,65.216660000000047],[-75.760009999999909,65.210815000000139],[-75.741378999999995,65.173874000000012],[-75.739989999999921,65.168319999999994],[-75.570847000000015,65.120818999999926],[-75.528610000000015,65.108871000000079],[-75.475006000000008,65.086105000000089],[-75.46665999999999,65.082214000000022],[-75.457229999999925,65.074707000000046],[-75.446945000000028,65.06581100000011],[-75.428054999999972,65.048324999999977],[-75.424438000000009,65.043869000000086],[-75.410552999999936,65.024704000000099],[-75.415557999999976,64.977478000000076],[-75.420273000000009,64.972214000000065],[-75.428054999999972,64.968322999999998],[-75.496947999999975,64.940536000000066],[-75.507232999999985,64.938309000000004],[-75.51916499999993,64.936919999999986],[-75.533614999999941,64.936919999999986],[-75.557220000000029,64.940262000000132],[-75.634734999999921,64.94720500000011],[-75.654448999999943,64.946365000000071],[-75.663054999999929,64.945251000000098],[-75.667496000000028,64.940811000000053],[-75.601944000000003,64.867752000000053],[-75.594161999999983,64.860259999999926],[-75.587508999999898,64.856644000000074],[-75.56806899999998,64.850540000000024],[-75.555557000000022,64.848602000000085],[-75.461394999999925,64.811645999999996],[-75.389175000000023,64.736099000000024],[-75.373046999999985,64.714996000000099],[-75.316665999999941,64.719437000000028],[-75.308333999999888,64.721099999999979],[-75.298186999999984,64.725769000000128],[-75.294723999999974,64.728043000000127],[-75.291381999999885,64.733871000000079],[-75.289444000000003,64.739975000000072],[-75.291381999999885,64.74443100000002],[-75.30221599999993,64.751099000000011],[-75.310546999999929,64.754990000000078],[-75.329726999999991,64.761107999999979],[-75.333892999999989,64.763321000000133],[-75.344161999999926,64.772217000000069],[-75.373885999999914,64.833054000000118],[-75.357223999999917,64.897766000000104],[-75.422775000000001,64.890273999999977],[-75.451675000000023,64.875259000000028],[-75.460830999999985,64.87164300000012],[-75.469727000000034,64.869431000000077],[-75.55749499999996,64.87414600000011],[-75.563323999999966,64.877197000000137],[-75.565552000000025,64.879425000000083],[-75.567504999999983,64.883605999999986],[-75.56527699999998,64.886932000000058],[-75.473891999999921,64.935806000000014],[-75.390288999999996,64.979430999999977],[-75.384734999999978,64.981934000000138],[-75.376098999999897,64.983322000000044],[-75.363051999999982,64.98414600000001],[-75.353332999999964,64.983597000000088],[-75.344161999999926,64.981094000000098],[-75.335555999999997,64.977768000000083],[-75.264175000000023,64.966095000000053],[-75.196105999999986,65.068604000000107],[-75.189163000000008,65.079712000000086],[-75.185546999999872,65.091369999999927],[-75.186934999999949,65.101653999999996],[-75.192490000000021,65.105545000000063],[-75.196655000000021,65.107207999999957],[-75.212508999999955,65.109421000000111],[-75.225554999999986,65.109421000000111],[-75.240828999999962,65.10832199999993],[-75.259170999999981,65.102203000000088],[-75.263625999999988,65.0977630000001],[-75.265563999999927,65.09165999999999],[-75.262512000000015,65.080551000000071],[-75.260009999999852,65.072769000000108],[-75.261123999999995,65.059142999999949],[-75.263061999999934,65.052199999999971],[-75.279998999999975,65.035262999999986],[-75.299727999999959,65.024704000000099],[-75.348617999999931,65.003876000000048],[-75.360001000000011,65.003876000000048],[-75.367492999999968,65.006378000000097],[-75.373046999999985,65.009430000000009],[-75.378875999999991,65.016663000000051],[-75.379165999999998,65.021378000000084],[-75.381103999999937,65.025818000000072],[-75.402495999999871,65.055817000000104],[-75.410003999999958,65.063873000000001],[-75.425551999999982,65.077208999999925],[-75.441375999999991,65.089157],[-75.448043999999982,65.094147000000021],[-75.516402999999855,65.138596000000007],[-75.728058000000033,65.224151999999947],[-75.761947999999961,65.237762000000032],[-75.781676999999945,65.243042000000116],[-75.835555999999997,65.255264000000068],[-75.864166000000012,65.258330999999998],[-75.890563999999983,65.269150000000081],[-75.939712999999983,65.292480000000012],[-75.943877999999984,65.29525799999999],[-75.950835999999981,65.316376000000105],[-75.950287000000003,65.318329000000062],[-75.941101000000003,65.321380999999974],[-75.931106999999884,65.322220000000129],[-75.904449,65.322220000000129],[-75.873885999999914,65.320541000000105],[-75.857772999999952,65.319153000000028],[-75.603057999999976,65.295531999999923],[-75.592223999999931,65.287201000000039],[-75.575561999999934,65.278046000000018],[-75.566390999999896,65.274994000000049],[-75.555267000000015,65.273605000000089],[-75.495834000000002,65.269150000000081],[-75.48443599999996,65.268326000000116],[-75.211945000000014,65.250549000000035],[-75.186661000000015,65.251938000000052],[-75.153885000000002,65.256943000000092],[-75.114440999999999,65.266387999999949],[-75.101669000000015,65.271378000000027],[-75.093886999999938,65.274994000000049],[-75.083618000000001,65.286102000000085],[-75.081679999999892,65.292206000000078],[-75.070847000000015,65.330276000000026],[-75.090835999999911,65.355545000000006],[-75.109160999999858,65.379974000000118],[-75.110824999999977,65.384720000000073],[-75.111114999999984,65.388885000000073],[-75.110549999999932,65.391098],[-75.108046999999942,65.393051000000128],[-75.097778000000005,65.394989000000066],[-75.08277899999996,65.394989000000066],[-74.823623999999938,65.377472000000068],[-74.660552999999993,65.346374999999966],[-74.645844000000011,65.341370000000097],[-74.635009999999966,65.338593000000003],[-74.624161000000015,65.336655000000064],[-74.58944699999995,65.332489000000123],[-74.546660999999915,65.33137499999998],[-74.524445000000014,65.333328000000108],[-74.508621000000005,65.336655000000064],[-74.496947999999975,65.340820000000065],[-74.357773000000009,65.398604999999975],[-74.347838999999965,65.407181000000037],[-74.323897999999986,65.437759000000028],[-74.318892999999946,65.447204999999997],[-74.31527699999998,65.458037999999988],[-74.311385999999914,65.463882000000012],[-74.182770000000005,65.525269000000037],[-74.105835000000013,65.534988000000055],[-73.845276000000013,65.532211000000132],[-73.791381999999999,65.524428999999998],[-73.767776000000026,65.520828000000108],[-73.747222999999963,65.517487000000074],[-73.736937999999952,65.514709000000096],[-73.732772999999952,65.511932000000002],[-73.731383999999935,65.506943000000035],[-73.730835000000013,65.504166000000112],[-73.735001000000011,65.501662999999951],[-73.740279999999984,65.496933000000126],[-73.740829000000019,65.490814000000114],[-73.736937999999952,65.487761999999975],[-73.711670000000026,65.471099999999979],[-73.703063999999927,65.466934000000094],[-73.694152999999915,65.464432000000045],[-73.663895000000025,65.456940000000088],[-73.651397999999972,65.454711999999915],[-73.641113000000018,65.455261000000064],[-73.559997999999894,65.462494000000049],[-73.500564999999938,65.474426000000051],[-73.56361400000003,65.562194999999974],[-73.618332000000009,65.619705000000067],[-73.662215999999944,65.658599999999979],[-73.684157999999911,65.715271000000087],[-73.68499799999995,65.730545000000006],[-73.704726999999934,65.758041000000048],[-73.709731999999917,65.762496999999996],[-73.720550999999887,65.769440000000145],[-73.810821999999973,65.811096000000134],[-73.841110000000015,65.81999200000007],[-73.884170999999981,65.821930000000009],[-73.886123999999995,65.821381000000031],[-73.923614999999984,65.824432000000058],[-73.931670999999938,65.825546000000031],[-73.942490000000021,65.828323000000125],[-74.011947999999961,65.854705999999908],[-74.029174999999952,65.861923000000047],[-74.058043999999938,65.875534000000016],[-74.129439999999988,65.924697999999978],[-74.258895999999993,66.001663000000065],[-74.296950999999979,66.018326000000116],[-74.337783999999999,66.036652000000117],[-74.37388599999997,66.053863999999976],[-74.388061999999934,66.06164600000011],[-74.425551999999925,66.084717000000126],[-74.444992000000013,66.096939000000077],[-74.455565999999862,66.105820000000051],[-74.471389999999985,66.127197000000081],[-74.472777999999948,66.133041000000048],[-74.472504000000015,66.139160000000118],[-74.470000999999968,66.145828000000051],[-74.466110000000015,66.151932000000102],[-74.446655000000021,66.168594000000098],[-74.434432999999956,66.178314],[-74.406113000000005,66.195816000000036],[-74.366652999999928,66.214157000000057],[-74.342223999999987,66.22526600000009],[-74.316390999999953,66.235259999999926],[-74.306655999999975,66.238876000000005],[-74.187209999999993,66.269713999999965],[-74.077788999999939,66.300812000000008],[-73.86082499999992,66.388321000000076],[-73.744995000000017,66.437759000000028],[-73.666107000000011,66.471924000000115],[-73.606658999999979,66.495254999999986],[-73.529998999999975,66.522766000000047],[-73.460555999999997,66.544434000000138],[-73.444153000000028,66.551086000000055],[-73.430556999999908,66.55831900000004],[-73.420272999999952,66.571655000000021],[-73.418335000000013,66.579711999999972],[-73.418335000000013,66.584717000000012],[-73.416396999999961,66.589981000000023],[-73.400283999999942,66.611649000000114],[-73.396956999999986,66.61554000000001],[-73.379714999999976,66.632477000000051],[-73.351944000000003,66.649994000000049],[-73.328339000000028,66.6602630000001],[-73.296386999999982,66.665817000000061],[-73.267226999999991,66.672760000000096],[-73.108611999999937,66.723311999999964],[-73.00111400000003,66.815536000000122],[-72.87388599999997,66.931930999999963],[-72.852492999999981,66.968597000000102],[-72.837783999999999,66.998031999999967],[-72.831389999999885,67.013321000000076],[-72.831115999999952,67.018326000000116],[-72.828063999999927,67.024994000000049],[-72.824172999999973,67.029434000000094],[-72.806655999999919,67.037201000000039],[-72.791671999999949,67.043320000000051],[-72.738891999999908,67.063034000000016],[-72.716659999999933,67.06860400000005],[-72.68499799999995,67.076096000000007],[-72.626099000000011,67.084717000000126],[-72.550827000000027,67.082763999999997],[-72.525832999999977,67.083328000000108],[-72.464172000000019,67.08998100000008],[-72.43110699999994,67.096099999999922],[-72.399445000000014,67.103592000000049],[-72.368606999999997,67.112487999999985],[-72.351394999999968,67.119705000000124],[-72.337783999999999,67.126373000000058],[-72.315552000000025,67.139435000000105],[-72.282501000000025,67.161102000000142],[-72.276108000000022,67.166930999999977],[-72.258346999999901,67.24803199999991],[-72.28694200000001,67.290817000000061],[-72.363616999999977,67.353317000000004],[-72.436385999999914,67.472214000000122],[-72.481110000000001,67.609711000000004],[-72.48582499999992,67.623031999999967],[-72.490829000000019,67.62831100000011],[-72.49749799999995,67.633040999999935],[-72.508895999999993,67.63638300000008],[-72.597778000000005,67.639709000000096],[-72.666396999999961,67.684143000000063],[-72.676391999999964,67.693862999999965],[-72.677779999999984,67.699416999999983],[-72.675002999999947,67.70526099999995],[-72.668883999999935,67.710541000000035],[-72.661666999999909,67.714706000000035],[-72.613892000000021,67.735259999999982],[-72.596953999999926,67.740814],[-72.591948999999886,67.74331699999999],[-72.583327999999881,67.750274999999988],[-72.608886999999982,67.785812000000078],[-72.612503000000004,67.790268000000026],[-72.619445999999925,67.794708000000014],[-72.735001000000011,67.841659999999933],[-72.820007000000032,67.851089000000115],[-72.833327999999995,67.849991000000045],[-72.843886999999938,67.850815000000011],[-72.848052999999936,67.853592000000106],[-72.942215000000033,67.925262000000089],[-72.944442999999978,67.928040000000067],[-72.944992000000013,67.93081699999999],[-72.94387799999987,67.937759000000085],[-72.942490000000021,67.941085999999984],[-72.929992999999968,67.948867999999948],[-72.922774999999945,67.952774000000034],[-72.904175000000009,67.959717000000012],[-72.902495999999928,67.963882000000012],[-72.896117999999944,68.014160000000004],[-72.910552999999993,68.054153000000042],[-72.913895000000025,68.060806000000014],[-72.941100999999946,68.078323000000069],[-72.956954999999994,68.094986000000119],[-72.981110000000001,68.139160000000061],[-72.992767000000015,68.198593000000074],[-72.993880999999988,68.212204000000042],[-73.161117999999988,68.228866999999923],[-73.190276999999924,68.248871000000065],[-73.189437999999996,68.254715000000033],[-73.189986999999917,68.259430000000066],[-73.194716999999969,68.26527400000009],[-73.200835999999981,68.269714000000135],[-73.215560999999923,68.272766000000047],[-73.271117999999888,68.281936999999971],[-73.303328999999962,68.278434999999945],[-73.314499000000012,68.278434999999945],[-73.336670000000026,68.275604000000044],[-73.355186000000003,68.267830000000004],[-73.395554000000004,68.258605999999929],[-73.496108999999933,68.275542999999971],[-73.410004000000015,68.310806000000127],[-73.39916999999997,68.314987000000031],[-73.354674999999929,68.329215999999974]],[[-124.43055699999996,73.878586000000098],[-124.45028699999995,73.878586000000098],[-124.46721600000001,73.8808140000001],[-124.515289,73.89498900000001],[-124.53666699999991,73.902480999999909],[-124.54611199999999,73.906647000000021],[-124.55055199999998,73.912201000000039],[-124.55277999999993,73.916931000000034],[-124.53056299999997,73.917480000000012],[-124.5133439999999,73.916656000000046],[-124.43250299999994,73.912766000000033],[-124.42027300000001,73.90914900000007],[-124.41583300000002,73.90498400000007],[-124.40888999999993,73.900269000000037],[-124.40943899999996,73.893326000000059],[-124.42027300000001,73.882476999999994],[-124.43055699999996,73.878586000000098]],[[-99.804557999999929,73.889099000000101],[-99.732773000000009,73.849991000000102],[-99.71362299999987,73.846375000000023],[-99.589721999999881,73.837769000000094],[-99.531386999999938,73.831940000000088],[-99.493880999999988,73.825821000000076],[-99.480285999999978,73.821930000000009],[-99.235000999999897,73.737761999999918],[-99.115004999999996,73.74859600000002],[-98.97193900000002,73.750548999999921],[-98.829177999999956,73.751663000000121],[-98.756393000000003,73.75610400000005],[-98.71665999999999,73.766663000000051],[-98.688323999999966,73.772018000000116],[-98.641953000000001,73.777206000000035],[-98.514449999999954,73.787490999999989],[-98.424437999999952,73.793594000000098],[-98.290832999999964,73.801651000000049],[-98.207229999999925,73.80525200000011],[-98.190552000000025,73.803588999999988],[-98.179992999999911,73.804152999999928],[-98.134170999999867,73.809708000000057],[-98.095000999999968,73.815536000000122],[-98.071670999999924,73.819443000000092],[-97.976944000000003,73.84275800000006],[-97.960281000000009,73.846938999999963],[-97.948333999999988,73.851653999999996],[-97.943053999999904,73.856934000000081],[-97.942763999999954,73.862762000000032],[-97.941375999999991,73.868042000000059],[-97.936385999999914,73.87831100000011],[-97.918335000000013,73.890273999999977],[-97.90834000000001,73.894714000000135],[-97.887512000000015,73.899428999999998],[-97.805267000000015,73.911102000000028],[-97.788054999999986,73.912766000000033],[-97.761948000000018,73.911925999999994],[-97.581954999999937,73.893875000000037],[-97.562774999999988,73.890823000000069],[-97.544723999999917,73.886108000000036],[-97.529175000000009,73.879700000000071],[-97.520844000000011,73.873871000000065],[-97.514175000000023,73.867752000000053],[-97.50028999999995,73.861923000000047],[-97.471389999999985,73.857758000000047],[-97.456954999999994,73.857758000000047],[-97.39973399999991,73.858871000000136],[-97.357772999999952,73.862488000000099],[-97.34584000000001,73.864990000000148],[-97.327498999999989,73.865814000000114],[-97.260284000000013,73.860260000000096],[-97.223617999999931,73.856369000000029],[-96.972504000000015,73.744141000000013],[-96.962218999999891,73.738586000000112],[-96.955841000000021,73.732482999999945],[-96.937209999999993,73.703598000000113],[-96.932770000000005,73.692200000000071],[-96.93472300000002,73.686920000000043],[-96.963897999999972,73.63998399999997],[-96.968613000000005,73.633330999999998],[-96.988891999999964,73.624695000000088],[-97.001953000000015,73.6202550000001],[-97.184998000000007,73.562194999999974],[-97.202498999999932,73.557205000000124],[-97.436110999999926,73.525542999999971],[-97.623885999999857,73.538879000000122],[-97.638061999999934,73.538589000000115],[-97.641112999999962,73.533599999999922],[-97.668335000000013,73.483321999999987],[-97.667496000000028,73.479431000000091],[-97.663054999999929,73.4727630000001],[-97.654723999999931,73.466934000000094],[-97.638335999999981,73.460266000000104],[-97.623321999999973,73.456375000000037],[-97.607223999999974,73.454711999999972],[-97.579453000000001,73.454987000000131],[-97.562774999999988,73.459152000000131],[-97.534163999999976,73.473877000000073],[-97.522232000000031,73.478592000000106],[-97.50389100000001,73.483046999999942],[-97.437209999999993,73.491928000000087],[-97.417220999999984,73.493317000000047],[-97.401947000000007,73.493042000000059],[-97.232223999999917,73.474426000000051],[-97.197219999999959,73.469711000000018],[-97.183059999999955,73.464995999999985],[-97.172225999999966,73.460266000000104],[-97.166106999999954,73.454162999999994],[-97.157226999999921,73.395538000000045],[-97.150283999999999,73.389984000000027],[-97.169448999999986,73.35664399999996],[-97.17193599999996,73.352768000000083],[-97.183883999999921,73.350540000000137],[-97.207503999999972,73.348328000000095],[-97.236937999999896,73.348602000000028],[-97.243057000000022,73.354706000000022],[-97.375548999999921,73.347214000000122],[-97.645003999999858,73.318054000000018],[-97.660278000000005,73.316086000000098],[-97.708617999999944,73.304703000000075],[-97.841384999999889,73.273315000000082],[-97.84445199999999,73.268326000000116],[-97.848052999999936,73.254440000000102],[-97.847778000000005,73.249420000000043],[-97.848617999999988,73.244980000000055],[-97.86250299999989,73.233871000000136],[-97.983611999999994,73.181091000000094],[-98.029175000000009,73.165268000000083],[-98.076674999999966,73.151382000000126],[-98.112503000000004,73.142487000000074],[-98.151672000000019,73.131087999999977],[-98.202788999999996,73.110535000000084],[-98.222777999999948,73.099991000000045],[-98.229996000000028,73.090820000000122],[-98.231383999999878,73.085541000000148],[-98.235001000000011,73.079711999999915],[-98.240829000000019,73.075272000000098],[-98.319457999999997,73.050537000000077],[-98.365829000000019,73.037766000000147],[-98.450287000000003,73.020264000000111],[-98.459166999999923,72.99331699999999],[-98.453613000000018,72.898605000000089],[-98.450561999999991,72.874985000000095],[-98.445830999999998,72.865814000000114],[-98.438598999999954,72.860535000000141],[-98.428054999999915,72.856094000000041],[-98.419998000000021,72.858597000000032],[-98.413329999999974,72.864151000000049],[-98.403335999999967,72.881363000000022],[-98.403335999999967,72.887207000000046],[-98.405838000000017,72.891662999999994],[-98.402221999999995,72.897491000000059],[-98.397780999999952,72.902771000000143],[-98.388061999999991,72.908034999999927],[-98.266402999999855,72.972763000000043],[-98.255004999999926,72.977478000000076],[-98.227218999999877,72.987487999999985],[-98.176940999999999,72.998596000000134],[-97.99499499999996,73.037491000000102],[-97.980559999999969,73.039702999999975],[-97.864166000000012,73.047485000000108],[-97.846953999999982,73.048598999999911],[-97.684433000000013,73.033051000000114],[-97.668335000000013,73.03137200000009],[-97.527495999999985,73.011383000000137],[-97.442489999999964,72.999145999999996],[-97.299728000000016,72.969711000000132],[-97.283324999999991,72.963882000000069],[-97.229720999999984,72.943038999999999],[-97.225006000000008,72.939972000000125],[-97.258056999999951,72.883605999999986],[-97.266402999999968,72.878585999999984],[-97.265288999999996,72.84887700000013],[-97.203613000000018,72.825821000000076],[-97.081679999999949,72.77998400000007],[-97.030288999999982,72.74136400000009],[-97.023055999999997,72.732208000000128],[-97.023055999999997,72.727203000000088],[-97.029723999999987,72.716659999999933],[-97.079453000000001,72.701934999999992],[-97.105834999999956,72.696365000000128],[-97.134444999999914,72.688309000000061],[-97.161117999999988,72.67804000000001],[-97.170546999999885,72.673599000000081],[-97.179442999999992,72.667480000000069],[-97.183059999999955,72.661926000000051],[-97.19027699999998,72.640549000000021],[-97.198333999999932,72.609984999999995],[-97.196655000000021,72.604430999999977],[-97.185271999999998,72.601929000000098],[-97.165557999999919,72.60165400000011],[-97.09056099999998,72.605254999999943],[-97.081008999999938,72.605927000000122],[-97.07028200000002,72.608597000000088],[-97.042770000000019,72.623306000000127],[-97.035827999999981,72.628860000000145],[-97.005568999999866,72.644714000000022],[-96.982223999999974,72.655258000000117],[-96.968886999999938,72.660262999999986],[-96.915558000000033,72.678588999999988],[-96.611938000000009,72.74693300000007],[-96.517501999999922,72.714706000000092],[-96.52194199999991,72.674423000000047],[-96.459731999999917,72.607758000000103],[-96.405272999999966,72.559418000000107],[-96.374709999999993,72.534424000000115],[-96.336945000000014,72.500824000000023],[-96.325561999999991,72.488312000000064],[-96.30221599999993,72.433868000000018],[-96.297501000000011,72.42164600000001],[-96.298339999999939,72.415817000000004],[-96.538605000000018,72.343323000000055],[-96.668335000000013,72.309708000000001],[-96.696945000000028,72.310531999999967],[-96.738892000000021,72.321105999999986],[-96.776397999999972,72.323318000000029],[-96.831389999999999,72.323608000000036],[-96.868332000000009,72.321930000000123],[-96.871932999999956,72.321105999999986],[-96.864440999999943,72.317764000000068],[-96.771118000000001,72.298874000000069],[-96.668883999999878,72.27915999999999],[-96.578339000000028,72.278594999999996],[-96.561110999999983,72.275543000000027],[-96.554169000000002,72.263885000000016],[-96.487212999999883,72.136108000000036],[-96.485001000000011,72.129974000000004],[-96.483062999999959,72.11303700000002],[-96.487503000000004,72.101653999999996],[-96.498336999999935,72.090270999999973],[-96.508346999999958,72.084991000000116],[-96.521117999999944,72.079987000000131],[-96.537216000000001,72.07499700000011],[-96.557220000000029,72.071930000000009],[-96.721663999999919,72.052765000000022],[-96.77305599999994,72.053040000000067],[-96.789444000000003,72.052200000000028],[-96.866942999999992,72.041091999999992],[-96.853881999999999,72.036376999999959],[-96.828888000000006,72.030822999999998],[-96.672501000000011,72.012771999999984],[-96.635009999999966,72.013885000000073],[-96.618057000000022,72.018326000000002],[-96.609160999999915,72.024155000000007],[-96.600554999999986,72.02777100000003],[-96.567779999999971,72.033600000000092],[-96.521117999999944,72.038879000000065],[-96.501953000000015,72.038589000000059],[-96.488601999999958,72.034987999999998],[-96.489990000000034,72.018326000000002],[-96.490829000000019,72.012206999999989],[-96.493056999999965,72.001098999999954],[-96.502228000000002,71.975540000000137],[-96.505843999999968,71.969711000000132],[-96.512786999999889,71.964431999999988],[-96.522506999999962,71.959152000000074],[-96.554442999999935,71.949141999999995],[-96.565552000000025,71.946930000000123],[-96.573897999999986,71.948318000000029],[-96.589447000000007,71.954437000000041],[-96.602782999999988,71.958038000000101],[-96.617492999999911,71.959991000000059],[-96.638335999999981,71.957488999999953],[-96.73332199999993,71.928863999999976],[-96.749160999999958,71.923874000000069],[-96.761947999999961,71.918594000000041],[-96.764450000000011,71.914992999999981],[-96.761397999999929,71.909714000000008],[-96.749725000000012,71.903046000000018],[-96.736389000000031,71.899429000000055],[-96.724166999999966,71.898605000000089],[-96.700835999999924,71.899994000000106],[-96.64527899999996,71.917480000000012],[-96.607223999999974,71.92692599999998],[-96.565552000000025,71.93220500000001],[-96.522781000000009,71.934418000000107],[-96.509170999999924,71.933044000000109],[-96.503890999999953,71.931656000000032],[-96.491668999999888,71.926085999999941],[-96.49110399999995,71.919434000000081],[-96.493056999999965,71.914153999999996],[-96.525832999999977,71.868866000000082],[-96.557769999999948,71.829436999999984],[-96.570846999999901,71.819442999999978],[-96.579726999999934,71.814987000000031],[-96.591949,71.810805999999957],[-96.613327000000027,71.807205000000124],[-96.726668999999958,71.793593999999928],[-96.744720000000029,71.792206000000022],[-96.738051999999982,71.824996999999996],[-96.791381999999942,71.827774000000034],[-96.983611999999994,71.775817999999958],[-97.013061999999991,71.749146000000053],[-97.084166999999923,71.700272000000098],[-97.165008999999941,71.675537000000077],[-97.210006999999962,71.663605000000075],[-97.434433000000013,71.617751999999996],[-97.470550999999944,71.612487999999985],[-97.505004999999983,71.611649],[-97.656386999999938,71.614700000000028],[-97.696655000000021,71.619705000000067],[-97.713332999999977,71.623871000000008],[-97.726395000000025,71.628310999999997],[-97.787215999999944,71.644149999999968],[-97.974715999999944,71.660812000000135],[-97.988051999999982,71.661926000000108],[-98.035277999999948,71.653320000000008],[-98.053329000000019,71.648331000000042],[-98.072784000000013,71.641663000000051],[-98.112777999999935,71.636932000000115],[-98.131103999999937,71.638046000000088],[-98.178878999999938,71.641663000000051],[-98.196654999999907,71.643600000000106],[-98.207503999999972,71.646103000000039],[-98.218063000000029,71.649719000000118],[-98.240829000000019,71.659714000000008],[-98.252791999999886,71.666091999999992],[-98.331116000000009,71.708327999999995],[-98.349166999999909,71.718597000000045],[-98.3558349999999,71.7227630000001],[-98.359725999999966,71.728043000000014],[-98.359436000000017,71.733871000000079],[-98.333327999999995,71.787490999999989],[-98.325561999999934,71.798325000000091],[-98.321395999999936,71.803314000000057],[-98.315276999999924,71.809143000000063],[-98.279174999999952,71.834717000000069],[-98.259170999999924,71.844711000000075],[-98.228881999999999,71.862198000000092],[-98.211944999999957,71.878585999999984],[-98.208617999999944,71.884430000000009],[-98.209166999999979,71.889160000000004],[-98.221938999999963,71.89498900000001],[-98.255279999999971,71.902480999999966],[-98.267226999999991,71.90415999999999],[-98.282776000000013,71.899155000000121],[-98.291381999999999,71.894714000000022],[-98.450561999999991,71.79414399999996],[-98.462508999999955,71.783874999999966],[-98.477782999999931,71.767212000000086],[-98.488892000000021,71.749419999999986],[-98.49749799999995,71.733321999999987],[-98.49749799999995,71.721649000000127],[-98.493880999999988,71.713882000000012],[-98.381377999999984,71.653594999999996],[-98.367492999999911,71.647491000000002],[-98.179992999999911,71.571930000000123],[-98.041381999999885,71.530823000000055],[-98.037506000000008,71.526657],[-98.120543999999995,71.460540999999978],[-98.180831999999953,71.423598999999967],[-98.198043999999982,71.414703000000031],[-98.466110000000015,71.313309000000061],[-98.505568999999923,71.299149000000114],[-98.541381999999942,71.289429000000041],[-98.55471799999998,71.287201000000096],[-98.701675000000023,71.271927000000005],[-98.72084000000001,71.269989000000066],[-98.729720999999927,71.270538000000045],[-98.75111400000003,71.274154999999951],[-98.816390999999953,71.289154000000053],[-98.829453000000001,71.293869000000086],[-98.844726999999978,71.305542000000116],[-98.882216999999969,71.333878000000027],[-98.938323999999852,71.369141000000013],[-98.960281000000009,71.379974000000004],[-98.978881999999999,71.382476999999994],[-98.995543999999995,71.382751000000098],[-99.014724999999942,71.381653000000028],[-99.034438999999963,71.378860000000032],[-99.042770000000019,71.374419999999986],[-99.045546999999942,71.368590999999981],[-99.051392000000021,71.363036999999963],[-99.05972300000002,71.358597000000145],[-99.077498999999989,71.353592000000106],[-99.115829000000019,71.350540000000024],[-99.220839999999896,71.342209000000082],[-99.238051999999982,71.344986000000006],[-99.288054999999872,71.402771000000087],[-99.313323999999966,71.43942300000009],[-99.462783999999942,71.59304800000001],[-99.529723999999987,71.605255],[-99.558608999999876,71.613037000000134],[-99.574172999999973,71.619705000000067],[-99.578888000000006,71.622757000000036],[-99.591675000000009,71.635268999999994],[-99.676392000000021,71.72526600000009],[-99.677779999999927,71.729156000000046],[-99.677215999999987,71.736923000000047],[-99.674437999999896,71.742752000000053],[-99.673049999999989,71.749146000000053],[-99.673889000000031,71.753876000000105],[-99.676392000000021,71.758605999999986],[-99.678328999999962,71.760544000000095],[-99.842223999999987,71.834991000000002],[-99.959166999999979,71.854155999999932],[-99.977218999999991,71.855819999999937],[-100.05110200000001,71.865814],[-100.067497,71.870529000000033],[-100.10193599999997,71.884720000000016],[-100.31471299999993,71.979979999999955],[-100.32195299999989,71.984985000000052],[-100.33222999999998,71.997208000000057],[-100.33583099999993,72.006653000000142],[-100.579453,72.154434000000037],[-100.63445299999995,72.18553200000008],[-100.64417300000002,72.188308999999947],[-100.72000099999997,72.201660000000118],[-100.88527699999997,72.207764000000111],[-100.88999899999988,72.207489000000123],[-100.92388900000003,72.199416999999983],[-100.95140099999992,72.171097000000145],[-100.96777299999997,72.174149000000057],[-101.01334399999996,72.191086000000041],[-101.02084400000001,72.196365000000014],[-101.054169,72.231658999999922],[-101.05555700000002,72.236649],[-101.11776700000001,72.284424000000001],[-101.19444299999998,72.324432000000002],[-101.20861799999994,72.329712000000086],[-101.220551,72.332214000000135],[-101.23889200000002,72.33387799999997],[-101.27667200000002,72.328323000000069],[-101.32528699999995,72.314986999999974],[-101.395554,72.286926000000051],[-101.40416699999997,72.281372000000033],[-101.40972899999986,72.275543000000027],[-101.46945199999999,72.265549000000021],[-101.50917099999998,72.283051000000057],[-101.58556399999998,72.301376000000005],[-101.63474299999996,72.306931000000077],[-101.65638699999994,72.305252000000053],[-101.66416900000002,72.301650999999993],[-101.672234,72.292755000000056],[-101.68499799999989,72.28776600000009],[-101.69444299999986,72.288040000000024],[-101.77694700000001,72.299713000000054],[-101.83056599999992,72.319153000000028],[-101.84472699999992,72.324432000000002],[-101.88834399999996,72.358597000000145],[-101.94167299999987,72.451935000000049],[-101.98131599999999,72.478111000000126],[-102.08033799999993,72.516006000000118],[-102.22222899999991,72.542206000000078],[-102.25862100000001,72.549149000000057],[-102.37721299999998,72.577484000000084],[-102.46584299999995,72.604706000000022],[-102.6219329999999,72.664703000000145],[-102.73638899999992,72.719986000000006],[-102.74166899999989,72.724152000000061],[-102.75583599999993,72.761383000000023],[-102.76471699999996,72.784987999999998],[-102.76306199999999,72.790817000000004],[-102.75306699999999,72.811096000000134],[-102.74944299999999,72.817214999999976],[-102.74305699999996,72.82249500000006],[-102.73500100000001,72.826096000000121],[-102.69860799999992,72.836654999999951],[-102.66361999999992,72.853316999999947],[-102.64666699999992,72.864426000000037],[-102.61277799999993,72.896652000000131],[-102.59722899999991,72.913605000000018],[-102.59361299999995,72.919983000000002],[-102.59166699999997,72.925536999999963],[-102.59306300000003,72.931656000000032],[-102.59416199999998,72.942748999999992],[-102.593887,72.949141999999995],[-102.59166699999997,72.954987000000074],[-102.576683,72.979706000000022],[-102.56304899999998,72.991089000000045],[-102.51306199999993,73.026093000000117],[-102.50110599999994,73.030548000000124],[-102.38806199999999,73.062759000000028],[-102.36805699999996,73.067490000000134],[-102.27610800000002,73.08248900000001],[-102.24694799999997,73.083878000000027],[-102.13722199999989,73.086929000000055],[-102.08444199999985,73.084152000000131],[-102.014183,73.079711999999915],[-101.97083999999995,73.070540999999992],[-101.88417099999992,73.024704000000099],[-101.81777999999991,72.966660000000104],[-101.810272,72.960541000000035],[-101.75527999999997,72.930542000000059],[-101.74109599999991,72.924149000000057],[-101.67527799999999,72.909714000000122],[-101.59528399999994,72.902205999999921],[-101.52166699999998,72.87831100000011],[-101.50974299999996,72.871642999999949],[-101.40444899999989,72.782486000000119],[-101.41332999999997,72.748322000000087],[-101.37249800000001,72.727203000000088],[-101.36665299999999,72.725266000000033],[-101.29750099999995,72.709991000000059],[-101.03333299999997,72.689697000000137],[-100.91583299999996,72.688034000000016],[-100.88221699999991,72.689697000000137],[-100.82778899999994,72.705826000000059],[-100.81945799999994,72.710266000000104],[-100.81220999999994,72.715545999999961],[-100.81194299999999,72.719710999999961],[-100.79833999999994,72.743590999999981],[-100.70722999999998,72.755829000000006],[-100.53307299999994,72.751389000000017],[-100.50917099999992,72.749146000000053],[-100.49833699999994,72.74803200000008],[-100.47582999999997,72.742751999999996],[-100.44803599999995,72.735535000000084],[-100.43443300000001,72.73692299999999],[-100.41221599999994,72.74192800000003],[-100.34973100000002,72.770538000000101],[-100.34084300000001,72.774993999999992],[-100.33168000000001,72.78054800000001],[-100.314438,72.796371000000022],[-100.31555199999997,72.801376000000062],[-100.35077699999994,72.851326000000086],[-100.35160799999994,72.853660999999988],[-100.35711699999996,72.859154000000103],[-100.46916199999998,72.950272000000041],[-100.48638899999992,72.949141999999995],[-100.49889399999995,72.950546000000145],[-100.49973299999999,72.95637499999998],[-100.46305799999993,73.014709000000039],[-100.45194999999995,73.020538000000045],[-100.421944,73.034987999999942],[-100.36776700000001,73.046936000000017],[-100.35637700000001,73.049423000000047],[-100.34221600000001,73.044144000000074],[-100.31667299999992,73.034149000000014],[-100.30943299999996,73.028046000000074],[-100.31555199999997,73.022490999999945],[-100.34306300000003,73.013885000000073],[-100.3577729999999,73.010544000000039],[-100.38137799999998,72.949141999999995],[-100.32899499999991,72.891372999999987],[-100.31732899999992,72.888869999999997],[-100.28527800000001,72.873596000000077],[-100.21721599999995,72.876647999999989],[-100.196663,72.877762000000018],[-100.09638999999993,72.88638300000008],[-100.06722999999994,72.902205999999921],[-100.031387,72.934982000000048],[-100.04750099999995,72.957214000000135],[-100.11277799999999,73.025818000000072],[-100.16972399999992,73.078598000000113],[-100.23222399999997,73.134430000000123],[-100.24445299999996,73.136932000000002],[-100.25446299999999,73.137206999999989],[-100.28888699999993,73.135818000000029],[-100.32362399999994,73.133331000000112],[-100.345551,73.130264000000011],[-100.38249200000001,73.122757000000092],[-100.39138799999995,73.118317000000047],[-100.41443600000002,73.104706000000078],[-100.44275699999997,73.087204000000042],[-100.51862299999993,73.0977630000001],[-100.58667000000003,73.132751000000098],[-100.60193599999997,73.140823000000069],[-100.60777300000001,73.146378000000141],[-100.58612099999999,73.167480000000126],[-100.58000199999987,73.173035000000027],[-100.49082900000002,73.230819999999937],[-100.40666199999987,73.280273000000079],[-100.39778100000001,73.284713999999951],[-100.37832600000002,73.289978000000133],[-100.36110699999995,73.290267999999969],[-100.28138699999994,73.27915999999999],[-100.1347429999999,73.221100000000035],[-100.05332899999996,73.186371000000008],[-100.03751399999999,73.183868000000018],[-100.021118,73.183044000000052],[-100.00418099999996,73.183319000000097],[-99.841110000000015,73.191360000000145],[-99.801666000000012,73.195526000000029],[-99.771666999999979,73.201096000000121],[-99.77027899999996,73.203873000000044],[-99.771666999999979,73.208038000000045],[-99.786391999999921,73.212493999999936],[-99.811934999999949,73.215546000000074],[-99.84944200000001,73.21527100000003],[-99.886123999999995,73.213318000000072],[-99.925827000000027,73.214996000000042],[-99.945267000000001,73.216660000000047],[-99.96444699999995,73.219436999999971],[-100.07749899999999,73.251389000000074],[-100.09500100000002,73.257217000000026],[-100.15915699999994,73.289428999999984],[-100.19943199999994,73.31860400000005],[-100.27223199999992,73.358597000000088],[-100.32362399999994,73.3836060000001],[-100.33332799999994,73.388321000000133],[-100.358047,73.393326000000002],[-100.37389399999995,73.395828000000051],[-100.38417099999987,73.396378000000084],[-100.38806199999993,73.395538000000045],[-100.4058379999999,73.361374000000012],[-100.387787,73.338593000000003],[-100.56166099999996,73.286652000000117],[-100.583618,73.283599999999979],[-100.823059,73.260818000000086],[-100.84056099999992,73.259720000000016],[-100.88945000000001,73.264435000000049],[-100.97749299999998,73.280273000000079],[-101.30499299999991,73.361649000000057],[-101.31276700000001,73.371094000000085],[-101.31139400000001,73.382751000000042],[-101.31054699999999,73.392487000000017],[-101.31139400000001,73.398331000000042],[-101.31723,73.401657000000057],[-101.47055099999994,73.436096000000134],[-101.55832700000002,73.446640000000002],[-101.58084099999996,73.450272000000098],[-101.61665299999993,73.485260000000096],[-101.62138400000003,73.490265000000136],[-101.44055200000003,73.549149000000057],[-101.42748999999992,73.552200000000084],[-101.40083299999992,73.553589000000045],[-101.31582599999996,73.550811999999951],[-101.2808379999999,73.552475000000072],[-101.26888999999994,73.556090999999924],[-101.25974300000001,73.561646000000053],[-101.25527999999997,73.567763999999954],[-101.25222799999995,73.578873000000044],[-101.25306699999993,73.584991000000002],[-101.25110599999994,73.589706000000035],[-101.24194299999994,73.595261000000107],[-101.23082699999998,73.600266000000147],[-101.21721600000001,73.604155999999932],[-101.199432,73.60554500000012],[-100.92639200000002,73.600266000000147],[-100.90943900000002,73.599716000000114],[-100.890289,73.596100000000092],[-100.87748699999997,73.59027100000003],[-100.77084400000001,73.539978000000076],[-100.71749899999992,73.509155000000078],[-100.70667299999997,73.499420000000043],[-100.70221699999996,73.494431000000077],[-100.70140100000003,73.488585999999941],[-100.69721999999996,73.482483000000002],[-100.69110099999995,73.476929000000041],[-100.67278299999998,73.464432000000045],[-100.51834099999996,73.416930999999977],[-100.49973299999999,73.412490999999932],[-100.46472199999988,73.407211000000075],[-100.44444299999992,73.40637200000009],[-100.43055700000002,73.406936999999971],[-100.41722099999998,73.413315000000068],[-100.41500899999994,73.41804500000012],[-100.42971799999998,73.430267000000072],[-100.45500199999998,73.441924999999969],[-100.484734,73.451935000000049],[-100.50279199999989,73.45748900000001],[-100.531387,73.466094999999939],[-100.58389299999993,73.482208000000014],[-100.59221599999995,73.486374000000069],[-100.59861799999999,73.491089000000102],[-100.60611,73.497207999999944],[-100.61000099999995,73.503052000000139],[-100.610817,73.509155000000078],[-100.60804699999994,73.514999000000103],[-100.60388199999994,73.521102999999982],[-100.55915799999997,73.546097000000088],[-100.54387700000001,73.556366000000139],[-100.541382,73.562194999999974],[-100.54277000000002,73.573883000000023],[-100.54998799999993,73.594711000000075],[-100.55166600000001,73.598876999999959],[-100.573624,73.596649000000014],[-100.628601,73.593322999999998],[-100.76750199999998,73.603867000000037],[-100.89167799999996,73.619980000000055],[-100.91139199999998,73.622756999999979],[-100.91194200000001,73.625259000000028],[-100.91139199999998,73.630539000000113],[-100.87943999999999,73.635818000000086],[-100.86472300000003,73.641662999999994],[-100.86110699999995,73.645827999999995],[-100.85360699999995,73.662201000000039],[-100.858047,73.667205999999908],[-100.97444199999995,73.679153000000042],[-100.99194299999999,73.678863999999976],[-101.03333299999997,73.671371000000136],[-101.04695099999998,73.673035000000141],[-101.057503,73.676650999999993],[-101.11833199999995,73.723312000000021],[-101.120003,73.727203000000088],[-101.01390100000003,73.797211000000061],[-100.99749799999989,73.802475000000015],[-100.98222399999997,73.80581699999999],[-100.95973199999997,73.809143000000006],[-100.93804899999998,73.810256999999979],[-100.82861300000002,73.815536000000122],[-100.79527300000001,73.812484999999924],[-100.77583300000003,73.812195000000088],[-100.754997,73.812484999999924],[-100.73416099999997,73.815262000000018],[-100.71444700000001,73.820267000000058],[-100.69915800000001,73.826096000000064],[-100.66416900000002,73.844986000000063],[-100.64835399999993,73.848327999999981],[-100.554169,73.854705999999965],[-100.52999899999998,73.853591999999935],[-100.41777000000002,73.845534999999984],[-100.39555399999995,73.840820000000122],[-100.38945000000001,73.83859300000006],[-100.370003,73.828049000000021],[-100.34999099999993,73.818603999999993],[-100.33612099999993,73.814697000000024],[-100.06304899999998,73.764999000000046],[-99.865828999999962,73.837769000000094],[-99.857773000000009,73.84275800000006],[-99.870109999999954,73.861541999999986],[-99.869109999999921,73.867370999999991],[-99.869780999999932,73.870201000000009],[-99.877105999999912,73.876541000000032],[-99.886771999999951,73.8822100000001],[-99.892440999999963,73.883536999999933],[-99.961944999999957,73.873306000000071],[-99.971663999999976,73.868042000000059],[-99.988051999999925,73.856934000000081],[-99.990829000000019,73.851089000000002],[-99.997498000000007,73.845534999999984],[-100.00834699999996,73.841369999999984],[-100.02639799999997,73.836929000000055],[-100.04943800000001,73.832764000000054],[-100.13667299999997,73.827484000000027],[-100.175003,73.828049000000021],[-100.24944299999993,73.833878000000027],[-100.26139799999993,73.838318000000072],[-100.29972799999996,73.860260000000096],[-100.29695100000004,73.865814000000114],[-100.29222099999993,73.872208000000001],[-100.27860999999996,73.888596000000007],[-100.26583900000003,73.899994000000049],[-100.252792,73.905258000000003],[-100.24305700000002,73.907486000000006],[-100.14306599999992,73.929977000000008],[-100.12721299999993,73.933319000000097],[-100.104446,73.936371000000008],[-100.03751399999999,73.942473999999947],[-99.981109999999944,73.945816000000093],[-99.938599000000011,73.946091000000081],[-99.896956999999986,73.944138000000009],[-99.856109999999887,73.940811000000053],[-99.816100999999946,73.93609600000002],[-99.800827000000027,73.931655999999975],[-99.800551999999925,73.925812000000008],[-99.813323999999966,73.921371000000079],[-99.806220999999937,73.902100000000019],[-99.810058999999967,73.898766000000023],[-99.810889999999972,73.894928000000107],[-99.808227999999986,73.891937000000041],[-99.804557999999929,73.889099000000101]],[[-89.988892000000021,73.988312000000121],[-90.007781999999963,73.984984999999995],[-90.058043999999938,73.992477000000122],[-90.158614999999998,74.001389000000131],[-90.217772999999966,74.004439999999988],[-90.250290000000007,74.00999500000006],[-90.265015000000005,74.014708999999982],[-90.281112999999891,74.02165199999996],[-90.284728999999913,74.024994000000106],[-90.285003999999958,74.029709000000139],[-90.276397999999858,74.038589000000002],[-90.271117999999944,74.043320000000108],[-90.240554999999972,74.053863999999976],[-90.206115999999952,74.057755000000043],[-89.991942999999935,74.066665999999998],[-89.97193900000002,74.064697000000137],[-89.941375999999991,74.057479999999998],[-89.914443999999946,74.047485000000108],[-89.90194699999995,74.03776600000009],[-89.903885000000002,74.03137200000009],[-89.918609999999944,74.010543999999982],[-89.928329000000019,74.005554000000132],[-89.988892000000021,73.988312000000121]],[[-98.918610000000001,73.806091000000094],[-98.96166999999997,73.80525200000011],[-99.104172000000005,73.81442300000009],[-99.140838999999914,73.818054000000132],[-99.36361699999992,73.864426000000037],[-99.381942999999922,73.86914100000007],[-99.429717999999923,73.891662999999937],[-99.437499999999943,73.89694199999991],[-99.43638599999997,73.902206000000092],[-99.429717999999923,73.908035000000098],[-99.422501000000011,73.911102000000028],[-99.406113000000005,73.915267999999912],[-99.282500999999968,73.936919999999986],[-99.223891999999978,73.940262000000075],[-99.092772999999909,73.952209000000039],[-99.020279000000016,73.979706000000022],[-98.938048999999921,73.998596000000134],[-98.801666000000012,74.018051000000128],[-98.66194200000001,74.03137200000009],[-98.575835999999981,74.03137200000009],[-98.532501000000025,74.032211000000018],[-98.491942999999935,74.034148999999957],[-98.425277999999992,74.043869000000029],[-98.3558349999999,74.057479999999998],[-98.275832999999921,74.07388300000008],[-98.255004999999926,74.078598000000113],[-98.230285999999978,74.083327999999938],[-98.170836999999949,74.09248400000007],[-98.039992999999981,74.105820000000051],[-97.994445999999925,74.109421000000111],[-97.806106999999884,74.11943100000002],[-97.758346999999958,74.118590999999981],[-97.737212999999997,74.117477000000008],[-97.703613000000018,74.113876000000118],[-97.690826000000015,74.111374000000069],[-97.653609999999958,74.099991000000045],[-97.64805599999994,74.0977630000001],[-97.642226999999934,74.087204000000042],[-97.637787000000003,74.075546000000031],[-97.638335999999981,74.063873000000001],[-97.649444999999957,74.052474999999959],[-97.656661999999983,74.04693599999996],[-97.673324999999863,74.035537999999974],[-97.717223999999987,74.009720000000016],[-97.728058000000033,74.004166000000055],[-97.763625999999931,73.988312000000121],[-97.823058999999887,73.968597000000102],[-98.124161000000015,73.878586000000098],[-98.145003999999915,73.873596000000077],[-98.168334999999956,73.870818999999983],[-98.392776000000026,73.84526100000005],[-98.478881999999999,73.837494000000106],[-98.777221999999995,73.813599000000124],[-98.918610000000001,73.806091000000094]],[[-92.638061999999877,74.103043000000127],[-92.36860699999994,74.041091999999992],[-92.356948999999986,74.038040000000024],[-92.33444199999991,74.03137200000009],[-92.31138599999997,74.02165199999996],[-92.296951000000035,74.014435000000049],[-92.289444000000003,74.009155000000021],[-92.282775999999956,74.003325999999959],[-92.273620999999991,73.990540000000067],[-92.272781000000009,73.984421000000054],[-92.28195199999999,73.974990999999989],[-92.291107000000011,73.969711000000075],[-92.310546999999929,73.961104999999975],[-92.327788999999939,73.951385000000073],[-92.330001999999979,73.945526000000086],[-92.329726999999991,73.942473999999947],[-92.309433000000013,73.940811000000053],[-92.1324919999999,73.946365000000014],[-92.118606999999997,73.949142000000109],[-92.116652999999985,73.95109599999995],[-92.113327000000027,73.95637499999998],[-92.110000999999897,73.964706000000035],[-92.113051999999982,73.974426000000108],[-92.114440999999999,73.976654000000053],[-92.113051999999982,73.981368999999916],[-92.107773000000009,73.984711000000061],[-92.094161999999983,73.989151000000049],[-91.925551999999982,74.012771999999927],[-91.877212999999983,74.016936999999928],[-91.838332999999977,74.018875000000094],[-91.570847000000015,74.025818000000072],[-91.528335999999911,74.024429000000055],[-91.139998999999932,74.00999500000006],[-91.097504000000015,74.008331000000055],[-91.065001999999993,74.006103999999993],[-91.046951000000035,74.004166000000055],[-90.735549999999932,73.968322999999998],[-90.660003999999958,73.953873000000044],[-90.633056999999951,73.948317999999972],[-90.441375999999934,73.919708000000128],[-90.406661999999983,73.914703000000088],[-90.364440999999999,73.911652000000061],[-90.354720999999984,73.912201000000039],[-90.344955000000027,73.914368000000081],[-90.341674999999952,73.917206000000078],[-90.339721999999938,73.920532000000094],[-90.341110000000015,73.924149000000057],[-90.33555599999994,73.925812000000008],[-90.317779999999971,73.925261999999975],[-90.225006000000008,73.908599999999979],[-90.195830999999998,73.901931999999988],[-90.194442999999922,73.899719000000005],[-90.204178000000013,73.888321000000019],[-90.230285999999978,73.862198000000035],[-90.241942999999992,73.851929000000041],[-90.25140399999998,73.846649000000127],[-90.264450000000011,73.84165999999999],[-90.275283999999942,73.83859300000006],[-90.283066000000019,73.838318000000072],[-90.360000999999954,73.800812000000121],[-90.474716000000001,73.72164900000007],[-90.581389999999999,73.65776100000005],[-90.724715999999944,73.583054000000118],[-90.84973100000002,73.540268000000083],[-90.921386999999925,73.495255000000043],[-90.930283000000031,73.483871000000079],[-90.932219999999973,73.481934000000081],[-91.089172000000019,73.384155000000021],[-91.152221999999995,73.361099000000024],[-91.171386999999982,73.351089000000059],[-91.180557000000022,73.345825000000104],[-91.186385999999914,73.340271000000087],[-91.238602000000014,73.279984000000127],[-91.253066999999874,73.269150000000081],[-91.262222000000008,73.263885000000016],[-91.367767000000015,73.200821000000133],[-91.569457999999997,73.063309000000061],[-91.642776000000026,73.021103000000039],[-91.647506999999962,73.016663000000051],[-91.645003999999972,72.998032000000023],[-91.770844000000011,72.913040000000024],[-91.799727999999959,72.897216999999955],[-91.808333999999888,72.891937000000098],[-91.812774999999988,72.885818000000086],[-91.813048999999921,72.880264000000068],[-91.81138599999997,72.868042000000116],[-91.818893000000003,72.862198000000092],[-91.84973100000002,72.846100000000035],[-92.06610099999989,72.752487000000087],[-92.095839999999896,72.743042000000003],[-92.127486999999917,72.734421000000111],[-92.166396999999961,72.725539999999967],[-92.232223999999974,72.713043000000027],[-92.274718999999891,72.70748900000001],[-92.314437999999996,72.704987000000131],[-92.335280999999952,72.704437000000098],[-92.393340999999907,72.707213999999965],[-92.431106999999997,72.710541000000092],[-92.524719000000005,72.720534999999927],[-92.745269999999891,72.739975000000129],[-92.898346000000004,72.750275000000045],[-93.077498999999875,72.769439999999975],[-93.248885999999914,72.789703000000031],[-93.337783999999999,72.8077550000001],[-93.349166999999852,72.802475000000072],[-93.366652999999985,72.797760000000039],[-93.391952999999944,72.794144000000131],[-93.412216000000001,72.792206000000022],[-93.580001999999922,72.778046000000074],[-93.679992999999911,72.779709000000025],[-93.726104999999905,72.781097000000102],[-93.764450000000011,72.781372000000147],[-93.932769999999948,72.774155000000007],[-94.038604999999961,72.766388000000063],[-94.099166999999966,72.764160000000118],[-94.132492000000013,72.764709000000039],[-94.170546999999942,72.767487000000074],[-94.18249499999996,72.769439999999975],[-94.24610899999999,72.77388000000002],[-94.262786999999889,72.774155000000007],[-94.298049999999989,72.770263999999941],[-94.315552000000025,72.763046000000145],[-94.321944999999971,72.759430000000066],[-94.327498999999989,72.754440000000045],[-94.334441999999967,72.738036999999963],[-94.332779000000016,72.731934000000024],[-94.327498999999989,72.721649000000127],[-94.319457999999997,72.717484000000127],[-94.3125,72.715545999999961],[-94.297501000000011,72.713318000000015],[-94.26916499999993,72.719147000000021],[-94.265288999999939,72.723877000000073],[-94.263901000000033,72.729980000000012],[-94.258346999999958,72.732483000000002],[-94.236388999999917,72.734985000000052],[-94.160278000000005,72.729431000000034],[-94.103606999999897,72.718596999999988],[-94.09333799999996,72.714995999999928],[-94.001403999999923,72.704162999999994],[-93.985000999999954,72.70387299999993],[-93.886672999999973,72.704712000000086],[-93.839447000000007,72.717209000000082],[-93.798339999999996,72.702208999999925],[-93.823058999999887,72.653046000000018],[-93.817229999999938,72.642211999999972],[-93.801665999999955,72.634430000000009],[-93.786117999999931,72.629149999999981],[-93.76945499999988,72.624984999999981],[-93.75778200000002,72.623032000000023],[-93.686660999999901,72.622208000000057],[-93.674438000000009,72.618866000000082],[-93.589721999999995,72.58137499999998],[-93.568619000000012,72.570831000000112],[-93.49888599999997,72.521927000000119],[-93.463333000000034,72.462204000000099],[-93.466110000000015,72.451385000000016],[-93.46945199999999,72.439697000000024],[-93.628052000000025,72.341934000000037],[-93.64527899999996,72.337204000000042],[-93.666397000000018,72.333602999999982],[-93.688323999999909,72.331099999999992],[-93.748610999999983,72.329712000000086],[-93.767226999999991,72.327209000000096],[-93.787216000000001,72.322769000000108],[-93.801392000000021,72.317764000000068],[-93.819732999999928,72.30720500000001],[-93.827498999999989,72.301926000000037],[-93.913329999999974,72.241652999999928],[-93.925277999999935,72.233047000000056],[-94.014175000000023,72.163879000000122],[-94.036666999999852,72.142212000000086],[-94.040282999999988,72.137497000000053],[-94.043610000000001,72.131363000000022],[-94.045546999999885,72.126922999999977],[-94.044723999999974,72.115814000000114],[-94.042220999999927,72.106644000000074],[-94.043883999999935,72.096939000000134],[-94.048339999999939,72.091094999999939],[-94.054717999999923,72.085265999999933],[-94.066665999999941,72.076660000000004],[-94.080840999999964,72.066939999999931],[-94.091675000000009,72.061645999999996],[-94.127685999999926,72.056366000000082],[-94.143341000000021,72.057480000000055],[-94.172500999999954,72.0577550000001],[-94.186660999999958,72.055816999999934],[-94.198883000000023,72.052765000000022],[-94.188720999999987,72.045258000000103],[-94.19505300000003,72.042091000000084],[-94.198387000000025,72.03910100000013],[-94.199546999999995,72.036438000000032],[-94.196053000000006,72.032432999999969],[-94.188384999999982,72.030930000000126],[-94.172042999999917,72.029594000000088],[-94.149886999999921,72.029433999999981],[-94.137382999999886,72.031769000000111],[-94.130554000000018,72.033104000000037],[-94.125214000000028,72.035095000000126],[-94.091385000000002,72.037766000000147],[-94.06082200000003,72.035262999999986],[-94.029723999999931,71.999419999999986],[-94.063048999999921,71.978317000000061],[-94.082229999999981,71.976089000000115],[-94.191719000000035,71.994316000000083],[-94.353881999999942,72.018050999999957],[-94.371933000000013,72.019440000000145],[-94.418059999999912,72.02276599999999],[-94.449721999999952,72.023315000000139],[-94.743880999999931,72.011383000000023],[-94.780288999999982,72.006103999999993],[-94.825561999999991,71.997481999999991],[-94.902221999999881,71.989151000000106],[-95.121932999999956,71.966095000000053],[-95.161117999999931,71.964706000000092],[-95.17582699999997,71.966934000000037],[-95.20777899999996,71.988876000000118],[-95.213333000000034,71.99443100000002],[-95.206664999999987,72.097488000000112],[-95.204453000000001,72.102767999999969],[-95.196654999999964,72.106644000000074],[-95.039444000000003,72.131363000000022],[-94.981673999999998,72.139434999999992],[-94.929717999999923,72.143599999999992],[-94.899993999999992,72.144440000000031],[-94.868057000000022,72.145538000000101],[-94.752228000000002,72.153320000000065],[-94.760833999999932,72.15498400000007],[-94.80610699999994,72.15914900000007],[-94.839171999999905,72.158599999999979],[-94.961394999999982,72.155258000000003],[-95.027495999999985,72.14498900000001],[-95.12110899999999,72.136658000000068],[-95.139998999999932,72.135544000000095],[-95.158889999999985,72.135818000000029],[-95.171111999999937,72.139159999999947],[-95.206664999999987,72.180817000000047],[-95.211670000000026,72.187194999999974],[-95.213622999999984,72.193313999999987],[-95.214721999999938,72.200271999999984],[-95.214721999999938,72.20526099999995],[-95.203887999999893,72.221924000000058],[-95.191375999999991,72.2452550000001],[-95.171111999999937,72.283324999999991],[-95.133330999999885,72.46026599999999],[-95.200287000000003,72.524428999999998],[-95.226394999999968,72.53166200000004],[-95.283065999999906,72.535538000000088],[-95.316100999999946,72.539703000000088],[-95.321395999999993,72.546097000000145],[-95.344451999999933,72.58137499999998],[-95.346664000000033,72.587493999999992],[-95.345551,72.593322999999998],[-95.331679999999949,72.598328000000038],[-95.313323999999966,72.601089000000059],[-95.315826000000015,72.606368999999916],[-95.355559999999969,72.637771999999984],[-95.364440999999886,72.643326000000116],[-95.458617999999944,72.68220500000001],[-95.475554999999986,72.686371000000122],[-95.492766999999901,72.688034000000016],[-95.50556899999998,72.686371000000122],[-95.52555799999999,72.681656000000089],[-95.535827999999924,72.681366000000025],[-95.548614999999927,72.68220500000001],[-95.576110999999969,72.689971999999955],[-95.590560999999923,72.695525999999973],[-95.602218999999934,72.702208999999925],[-95.666106999999897,72.801376000000062],[-95.673614999999984,72.813873000000058],[-95.675551999999982,72.82499700000011],[-95.675277999999935,72.841094999999996],[-95.671936000000017,72.852478000000019],[-95.653885000000002,72.876923000000033],[-95.645844000000011,72.91276600000009],[-95.655563000000029,73.019989000000066],[-95.683318999999983,73.075821000000019],[-95.582503999999972,73.127762000000132],[-95.575012000000015,73.164993000000095],[-95.600540000000024,73.283905000000004],[-95.650832999999977,73.325272000000041],[-95.646666999999979,73.330826000000059],[-95.613616999999977,73.342758000000003],[-95.623610999999983,73.361099000000024],[-95.653610000000015,73.412490999999932],[-95.681670999999994,73.444138000000066],[-95.683884000000035,73.450272000000098],[-95.700287000000003,73.55386400000009],[-95.668364999999937,73.581787000000077],[-95.612563999999963,73.610976999999991],[-95.656059000000027,73.631866000000116],[-95.676085999999998,73.665061999999978],[-95.681945999999982,73.711928999999998],[-95.673049999999989,73.723312000000021],[-95.658889999999985,73.732482999999945],[-95.645844000000011,73.735535000000084],[-95.450835999999981,73.771103000000096],[-95.428329000000019,73.77276599999999],[-95.299727999999959,73.771103000000096],[-95.283614999999941,73.769149999999968],[-95.266402999999912,73.764160000000118],[-95.236938000000009,73.752212999999983],[-95.160278000000005,73.713042999999971],[-95.154723999999987,73.706940000000031],[-95.138335999999924,73.700821000000019],[-95.106948999999986,73.691925000000083],[-95.076401000000033,73.683318999999983],[-95.024170000000026,73.671646000000123],[-94.95666499999993,73.659149000000127],[-94.890563999999927,73.649155000000121],[-94.845550999999944,73.644150000000081],[-94.828613000000018,73.643051000000071],[-94.812209999999993,73.643326000000116],[-94.652221999999995,73.648605000000089],[-94.634170999999924,73.649429000000055],[-94.618056999999908,73.651382000000012],[-94.619155999999975,73.654434000000094],[-94.638061999999991,73.665817000000118],[-94.649445000000014,73.670821999999987],[-94.676392000000021,73.676650999999993],[-94.732773000000009,73.681366000000025],[-94.773055999999997,73.679977000000008],[-94.81471299999987,73.680817000000104],[-94.866104000000007,73.687195000000031],[-94.883330999999998,73.692200000000071],[-95.075561999999877,73.773315000000139],[-95.089172000000019,73.783325000000048],[-95.111937999999952,73.801086000000055],[-95.11610399999995,73.806641000000127],[-95.108046999999999,73.812195000000088],[-95.070847000000015,73.822768999999994],[-95.036666999999909,73.829436999999928],[-95.00556899999998,73.832489000000066],[-94.976668999999958,73.831100000000049],[-94.958054000000004,73.831940000000088],[-94.963332999999977,73.838318000000072],[-94.982497999999964,73.845534999999984],[-95.005004999999983,73.852767999999969],[-95.024445000000014,73.855255000000056],[-95.045546999999942,73.855545000000063],[-95.076675000000023,73.852477999999962],[-95.109160999999972,73.843597000000045],[-95.116393999999957,73.839157],[-95.127212999999927,73.825821000000076],[-95.136123999999938,73.823608000000092],[-95.154174999999952,73.823608000000092],[-95.263061999999991,73.862762000000032],[-95.304169000000002,73.8808140000001],[-95.311385999999914,73.885269000000108],[-95.323333999999932,73.89694199999991],[-95.327788999999882,73.90914900000007],[-95.329726999999991,73.919982999999945],[-95.326110999999969,73.944138000000009],[-95.324721999999952,73.952484000000084],[-95.319167999999877,73.964157000000114],[-95.298339999999996,73.980819999999994],[-95.245270000000005,74.010268999999994],[-95.227782999999988,74.014160000000061],[-95.220001000000025,74.014708999999982],[-95.192489999999964,74.008881000000088],[-95.174438000000009,74.008881000000088],[-95.040833000000021,74.026382000000012],[-94.90695199999999,74.047485000000108],[-94.850280999999995,74.058868000000132],[-94.80610699999994,74.068054000000075],[-94.787506000000008,74.072769000000108],[-94.755279999999914,74.087204000000042],[-94.745833999999945,74.092209000000082],[-94.732223999999974,74.095260999999994],[-94.618332000000009,74.090271000000143],[-94.460281000000009,74.094437000000028],[-94.436934999999949,74.095824999999934],[-94.42721599999993,74.100815000000011],[-94.421111999999994,74.105820000000051],[-94.412780999999995,74.115265000000136],[-94.406112999999948,74.118865999999969],[-94.392226999999991,74.121918000000107],[-94.217498999999975,74.131652999999972],[-94.177779999999927,74.1336060000001],[-94.093063000000029,74.136383000000023],[-93.992492999999911,74.138596000000007],[-93.951950000000011,74.138885000000073],[-93.914169000000015,74.136107999999979],[-93.90194699999995,74.133331000000112],[-93.758346999999958,74.096939000000134],[-93.761397999999986,74.129150000000038],[-93.759445000000028,74.139160000000118],[-93.754456000000005,74.144714000000079],[-93.730835000000013,74.154160000000047],[-93.690551999999968,74.162200999999982],[-93.641112999999962,74.167754999999943],[-93.583617999999888,74.170822000000044],[-93.515015000000005,74.173035000000027],[-93.431670999999994,74.172211000000061],[-93.327498999999989,74.169983000000116],[-93.243880999999988,74.164993000000038],[-93.028885000000002,74.149993999999992],[-92.979445999999996,74.145828000000108],[-92.796386999999982,74.124985000000038],[-92.638061999999877,74.103043000000127]],[[-98.657226999999978,74.29942299999999],[-98.746947999999975,74.298035000000084],[-98.810271999999941,74.298325000000091],[-98.831679999999949,74.299149000000057],[-98.859436000000017,74.301376000000118],[-98.86221299999994,74.302475000000129],[-98.864715999999987,74.304703000000075],[-98.863051999999982,74.307479999999998],[-98.857223999999974,74.311371000000065],[-98.752501999999936,74.334152000000074],[-98.718338000000017,74.336655000000007],[-98.630829000000006,74.34248400000007],[-98.616652999999985,74.341934000000037],[-98.585830999999985,74.338593000000003],[-98.573623999999938,74.334991000000002],[-98.535278000000005,74.328873000000101],[-98.521666999999979,74.324706999999989],[-98.511123999999995,74.318329000000006],[-98.515563999999927,74.314147999999932],[-98.525009000000011,74.31053200000008],[-98.568618999999899,74.304703000000075],[-98.657226999999978,74.29942299999999]],[[-120.14998600000001,74.272491000000059],[-119.86472300000003,74.237762000000032],[-119.84528399999999,74.235809000000074],[-119.79527299999995,74.234420999999998],[-119.72501399999993,74.233871000000136],[-119.60916099999997,74.233321999999987],[-119.63971699999996,74.193039000000113],[-119.65139799999997,74.181655999999919],[-119.67250099999995,74.165817000000004],[-119.69082599999996,74.156936999999971],[-119.70249899999999,74.153046000000074],[-119.72305299999994,74.144714000000079],[-119.79415899999998,74.115265000000136],[-119.80332900000002,74.110535000000084],[-119.82417299999992,74.094711000000132],[-119.833618,74.082763999999997],[-119.83612099999999,74.075821000000019],[-119.83277900000002,74.064147999999989],[-119.82721699999991,74.05914300000012],[-119.77916699999997,74.033875000000023],[-119.76806599999986,74.030273000000079],[-119.74481199999997,74.025513000000046],[-119.72860699999995,74.02915999999999],[-119.72609699999992,74.035812000000078],[-119.72638699999993,74.041931000000091],[-119.73777799999999,74.058029000000147],[-119.650284,74.118590999999981],[-119.51000999999991,74.209152000000017],[-119.50083899999998,74.213882000000012],[-119.48916599999995,74.217483999999956],[-119.46528599999994,74.221100000000035],[-119.44972199999995,74.221924000000001],[-119.25723299999999,74.218323000000112],[-119.18472300000002,74.216933999999924],[-119.16528299999987,74.214995999999985],[-119.14862099999999,74.212204000000099],[-119.137787,74.208603000000039],[-119.12110899999993,74.199707000000103],[-119.11554699999999,74.194977000000051],[-119.10193600000002,74.179428000000144],[-119.09638999999999,74.168319999999994],[-119.09084300000001,74.156936999999971],[-119.07055700000001,74.114700000000084],[-119.06527699999998,74.103317000000061],[-119.07084699999996,74.089980999999966],[-119.08084099999996,74.077773999999977],[-119.08805799999999,74.072769000000108],[-119.10166900000002,74.069716999999969],[-119.11972000000003,74.068054000000075],[-119.14723199999997,74.062195000000031],[-119.15222199999994,74.056091000000038],[-119.18720999999999,73.994141000000127],[-119.18720999999999,73.987762000000089],[-119.16750299999995,73.987198000000149],[-118.98889200000002,73.998032000000023],[-118.97305299999999,74.000274999999988],[-118.96362299999993,74.004990000000021],[-118.80777,74.090546000000131],[-118.80055199999998,74.095824999999934],[-118.79028299999993,74.10775799999999],[-118.78751399999999,74.114700000000084],[-118.79277000000002,74.125809000000004],[-118.79804999999999,74.130814000000044],[-118.80695299999996,74.133880999999974],[-118.82333399999999,74.136383000000023],[-118.83693699999992,74.139435000000105],[-118.84805299999994,74.143326000000002],[-118.86721799999998,74.151382000000069],[-118.88333099999994,74.166382000000056],[-118.88612399999994,74.171921000000054],[-118.88110399999999,74.178040000000067],[-118.84388699999994,74.188309000000118],[-118.72000100000002,74.212768999999923],[-118.67388899999997,74.219986000000063],[-118.60722399999997,74.228317000000118],[-118.50583599999999,74.239974999999959],[-118.17999299999991,74.272217000000126],[-118.12249799999995,74.275818000000015],[-118.10193600000002,74.276382000000126],[-118.031387,74.275269000000094],[-117.97361799999999,74.269150000000025],[-117.91860999999989,74.262207000000046],[-117.62832599999996,74.244980000000055],[-117.51251199999996,74.238585999999998],[-117.43859900000001,74.22943099999992],[-117.422234,74.226929000000041],[-117.37609899999995,74.218323000000112],[-117.28943599999997,74.199707000000103],[-117.15722700000003,74.167754999999943],[-116.82833899999997,74.072495000000004],[-116.78500400000001,74.059708000000001],[-116.735817,74.039703000000145],[-116.62249799999989,73.990814],[-116.52806099999998,73.949706999999989],[-116.441101,73.913605000000018],[-116.34805299999999,73.875534000000016],[-116.33805799999999,73.87164300000012],[-116.32778899999988,73.867752000000053],[-116.31471299999993,73.864426000000037],[-116.29888900000003,73.861649000000114],[-116.20805399999995,73.838318000000072],[-116.05583199999995,73.792755000000113],[-116.00556899999998,73.773315000000139],[-115.97638699999999,73.755554000000018],[-115.91443599999997,73.726379000000122],[-115.89444699999996,73.718596999999988],[-115.817497,73.698318000000029],[-115.603882,73.652205999999978],[-115.40222199999999,73.568329000000006],[-115.36694299999999,73.545822000000101],[-115.34889199999998,73.531937000000028],[-115.33194700000001,73.511658000000068],[-115.31500199999999,73.479705999999908],[-115.32305899999994,73.474426000000051],[-115.449432,73.426651000000049],[-115.46140300000002,73.42303499999997],[-115.69943199999989,73.368866000000139],[-115.83473199999997,73.33998100000008],[-115.862213,73.334427000000119],[-116.26750199999998,73.273041000000148],[-116.33556399999998,73.267211999999915],[-116.37249800000001,73.265549000000021],[-116.42500299999995,73.261658000000125],[-116.45612299999993,73.257492000000013],[-116.46945199999999,73.254715000000147],[-116.69304699999992,73.203873000000044],[-116.80943299999996,73.168045000000006],[-116.94803599999995,73.124985000000038],[-117.02639799999997,73.106934000000024],[-117.16915899999998,73.081940000000088],[-117.39388999999994,73.048598999999911],[-117.42639200000002,73.044983000000059],[-117.46610999999996,73.03637700000013],[-117.708054,72.977768000000083],[-117.83667000000003,72.938583000000108],[-117.891953,72.919983000000002],[-117.925003,72.908875000000023],[-117.97501399999993,72.896378000000027],[-118.01611300000002,72.888321000000019],[-118.11527999999993,72.870818999999983],[-118.21806300000003,72.854705999999965],[-118.27362099999999,72.844436999999914],[-118.314438,72.836104999999918],[-118.36609599999997,72.824432000000115],[-118.38999899999993,72.817764000000125],[-118.44444299999998,72.798874000000012],[-118.45333900000003,72.794434000000138],[-118.46000700000002,72.78915400000011],[-118.46472199999994,72.783325000000104],[-118.48528299999992,72.767487000000074],[-118.49610899999999,72.763610999999969],[-118.53472899999991,72.754715000000033],[-118.54943799999995,72.752487000000087],[-118.58528100000001,72.750275000000045],[-118.65805099999994,72.74803200000008],[-118.70861799999994,72.743590999999981],[-118.75306699999999,72.73692299999999],[-118.77861000000001,72.731093999999985],[-119.11444099999994,72.639435000000049],[-119.1375119999999,72.632477000000051],[-119.15888999999999,72.624984999999981],[-119.16750299999995,72.620529000000033],[-119.30943300000001,72.438873000000058],[-119.3163909999999,72.425812000000121],[-119.33000199999987,72.394149999999968],[-119.33249699999999,72.387206999999989],[-119.33000199999987,72.381653000000142],[-119.32501200000002,72.376648000000102],[-119.30999800000001,72.368042000000003],[-119.30277999999993,72.363037000000134],[-119.30248999999998,72.356644000000017],[-119.31111099999993,72.352203000000088],[-119.40444899999994,72.325545999999974],[-119.429169,72.319716999999969],[-119.51555599999989,72.305817000000104],[-119.62666300000001,72.278320000000122],[-119.65750099999991,72.267211999999972],[-119.67804699999999,72.259430000000009],[-119.760559,72.228867000000037],[-119.80139200000002,72.22137500000008],[-119.837784,72.219711000000075],[-119.97250399999996,72.221100000000092],[-120.12372599999998,72.232597000000112],[-120.13405599999999,72.233756999999969],[-120.13871799999998,72.236420000000066],[-120.13621499999994,72.239929000000132],[-120.12888299999992,72.241928000000144],[-120.14362299999993,72.2494200000001],[-120.12943999999999,72.251663000000065],[-120.12721299999993,72.258606000000043],[-120.12999000000002,72.264160000000061],[-120.13999899999993,72.267761000000064],[-120.15750099999997,72.269714000000022],[-120.17582699999997,72.268875000000094],[-120.24109599999997,72.26249700000011],[-120.25110599999999,72.258606000000043],[-120.25945299999995,72.246643000000006],[-120.26139799999987,72.239700000000028],[-120.25862099999995,72.23414600000001],[-120.23144500000001,72.214812999999992],[-120.225281,72.212479000000144],[-120.21028899999999,72.20881700000001],[-120.19810499999994,72.204322999999988],[-120.18894999999998,72.199150000000088],[-120.18578299999996,72.196151999999984],[-120.14527900000002,72.149994000000049],[-120.14499699999993,72.143599999999992],[-120.17582699999997,72.094437000000084],[-120.19415299999997,72.078323000000125],[-120.30526699999996,72.013046000000088],[-120.329453,71.999146000000053],[-120.34750399999996,71.990814000000057],[-120.38362100000001,71.981658999999979],[-120.41332999999986,71.971374999999966],[-120.423317,71.96748400000007],[-120.43916299999989,71.958328000000108],[-120.445267,71.953048999999965],[-120.4491579999999,71.946930000000123],[-120.45278899999994,71.934707999999944],[-120.45249899999993,71.927765000000136],[-120.44972200000001,71.922210999999947],[-120.439438,71.912201000000039],[-120.43167099999994,71.908034999999984],[-120.391953,71.893051000000071],[-120.38445300000001,71.888885000000016],[-120.37917299999998,71.883881000000031],[-120.38082900000001,71.87831099999994],[-120.41500899999994,71.776382000000126],[-120.42278299999998,71.764160000000118],[-120.42471299999994,71.757216999999969],[-120.42639199999996,71.74443100000002],[-120.423607,71.738875999999948],[-120.41332999999986,71.72886699999998],[-120.40805099999994,71.723877000000073],[-120.40055799999993,71.719437000000084],[-120.37998999999996,71.699707000000046],[-120.37748699999992,71.694138000000066],[-120.37693799999994,71.688034000000073],[-120.38082900000001,71.681931000000077],[-120.43611099999998,71.611922999999933],[-120.47305299999999,71.565536000000066],[-120.49665799999997,71.544144000000017],[-120.54332699999992,71.516662999999994],[-120.60166900000002,71.493591000000038],[-120.63639799999999,71.485535000000141],[-120.78028899999998,71.457214000000079],[-120.80750299999988,71.452484000000027],[-120.87721299999998,71.441360000000145],[-120.921944,71.435532000000023],[-121.13333099999994,71.409424000000058],[-121.33249699999993,71.386932000000002],[-121.39444700000001,71.380264000000011],[-121.42916899999994,71.378311000000053],[-121.44833399999999,71.379425000000026],[-121.59056099999998,71.396378000000141],[-121.60305799999998,71.399428999999998],[-121.59137699999991,71.402771000000087],[-121.57611099999997,71.404434000000037],[-121.54915599999993,71.40914900000007],[-121.53751399999999,71.412490999999989],[-121.53195199999993,71.417755],[-121.52861000000001,71.423874000000012],[-121.531677,71.429427999999973],[-121.53694200000001,71.434418000000051],[-121.54998799999993,71.443588000000091],[-121.56973299999999,71.451660000000061],[-121.59638999999999,71.456940000000145],[-121.63027999999991,71.460540999999978],[-121.66860999999994,71.46276899999998],[-121.70361300000002,71.460815000000139],[-121.74388099999999,71.453323000000012],[-121.75556899999998,71.450271999999984],[-121.77639799999997,71.443038999999942],[-121.81220999999994,71.426651000000106],[-121.82917800000001,71.418319999999994],[-121.84612299999998,71.409714000000065],[-121.90194700000001,71.378586000000098],[-121.96528599999999,71.34275800000006],[-122.07501199999996,71.286926000000051],[-122.12165799999991,71.267211999999972],[-122.14417300000002,71.260817999999915],[-122.21056399999986,71.24832200000003],[-122.25446299999999,71.242477000000122],[-122.29833999999994,71.236374000000012],[-122.35526999999996,71.227768000000083],[-122.43028299999997,71.214157000000114],[-122.50556899999992,71.197754000000032],[-122.593887,71.178040000000124],[-122.60500299999995,71.174988000000042],[-122.61638600000003,71.171646000000067],[-122.64584400000001,71.160538000000088],[-122.66221599999994,71.151931999999988],[-122.67832900000002,71.143326000000059],[-122.7069469999999,71.124420000000043],[-122.74249299999997,71.101089000000002],[-122.76999699999988,71.089157000000057],[-122.781113,71.086104999999918],[-122.79611199999988,71.084152000000017],[-122.84944199999995,71.0816650000001],[-123.07611099999986,71.079163000000051],[-123.09500099999997,71.079987000000017],[-123.1260989999999,71.083878000000084],[-123.162781,71.092758000000117],[-123.22332799999998,71.114150999999993],[-123.25945300000001,71.129700000000128],[-123.29305999999985,71.146102999999982],[-123.31696299999999,71.158599999999979],[-123.37027,71.188873000000115],[-123.3952789999999,71.207763999999941],[-123.42999299999997,71.236923000000104],[-123.44860799999998,71.257767000000115],[-123.46640000000002,71.285537999999974],[-123.51390099999998,71.349152000000061],[-123.56696299999993,71.406096999999932],[-123.63417099999992,71.472487999999942],[-123.66583299999996,71.496368000000132],[-123.67971799999998,71.505264000000068],[-123.84388699999994,71.583328000000108],[-123.88722200000001,71.623595999999964],[-123.89917000000003,71.633041000000048],[-123.94888299999997,71.658325000000048],[-123.97582999999997,71.670258000000103],[-124.01334400000002,71.685806000000071],[-124.02390300000002,71.689148000000046],[-124.07055700000001,71.701935000000049],[-124.11138900000003,71.709991000000116],[-124.13694800000002,71.714432000000045],[-124.38474299999996,71.75471500000009],[-124.458054,71.76638800000012],[-124.609734,71.788040000000137],[-124.65278599999994,71.79525799999999],[-124.67887899999999,71.800812000000121],[-124.700287,71.806366000000139],[-124.83194700000001,71.840820000000008],[-124.86665299999993,71.85054000000008],[-125.07694999999995,71.909149000000127],[-125.16000400000001,71.924683000000073],[-125.23638900000003,71.941910000000064],[-125.24722300000002,71.945511000000124],[-125.25361599999997,71.950255999999968],[-125.24472000000003,71.954422000000079],[-125.04804999999999,71.955536000000052],[-124.98029300000002,71.943587999999977],[-124.96945199999999,71.939972000000125],[-124.95388800000001,71.938034000000016],[-124.94275699999997,71.939972000000125],[-124.93804899999998,71.945525999999916],[-124.93554699999999,71.951659999999947],[-124.93971299999998,71.956940000000031],[-124.94833399999999,71.961105000000032],[-124.98777799999999,71.969711000000132],[-125.02278100000001,71.972504000000129],[-125.23277300000001,71.975524999999948],[-125.35221899999999,71.97468600000002],[-125.41639700000002,71.974135999999987],[-125.47833300000002,71.972763000000043],[-125.59111000000001,71.966385000000116],[-125.62666299999995,71.963608000000022],[-125.68639399999995,71.954987000000074],[-125.72165699999994,71.952209000000096],[-125.76139799999993,71.950821000000019],[-125.80139199999996,71.952209000000096],[-125.93582199999992,71.958602999999982],[-125.97361799999999,71.960541000000092],[-125.984444,71.963882000000126],[-125.99333200000001,71.96804800000001],[-125.997772,71.973602000000028],[-125.99333200000001,71.978867000000093],[-125.97778299999999,71.979706000000022],[-125.966949,71.976379000000122],[-125.90055799999999,71.962494000000049],[-125.88054699999992,71.963318000000015],[-125.84973099999991,71.967209000000082],[-125.80999799999995,71.975540000000137],[-125.787781,71.982208000000128],[-125.77887699999991,71.986374000000012],[-125.765289,71.996094000000085],[-125.75418100000002,72.006103999999993],[-125.74082899999996,72.022751000000028],[-125.73388699999998,72.034133999999995],[-125.724716,72.051926000000094],[-125.71777299999985,72.070540999999992],[-125.71528599999994,72.083603000000039],[-125.71528599999994,72.090270999999973],[-125.71749899999992,72.096375000000023],[-125.72165699999994,72.101929000000041],[-125.72833299999996,72.106644000000074],[-125.73944099999989,72.110260000000096],[-125.71444700000001,72.157485999999949],[-125.57389799999993,72.247467000000142],[-125.51445000000001,72.291076999999973],[-125.46777299999997,72.351074000000096],[-125.43221999999997,72.403580000000034],[-125.43666099999996,72.409134000000051],[-125.30055199999993,72.483307000000025],[-125.29110699999995,72.487183000000073],[-125.27971600000001,72.490524000000107],[-125.25787399999996,72.495125000000144],[-125.247772,72.49523899999997],[-125.17194399999994,72.513596000000064],[-125.1394499999999,72.524138999999991],[-125.02806099999998,72.566071000000079],[-125,72.605254999999943],[-124.94055199999997,72.70248400000014],[-124.97193899999991,72.755829000000006],[-125.02610800000002,72.821091000000081],[-124.95916699999998,72.856369000000086],[-124.89334100000002,72.873871000000122],[-124.87917299999998,72.876373000000001],[-124.801941,72.887497000000053],[-124.76695299999994,72.890823000000125],[-124.72749299999987,72.888596000000064],[-124.68804899999986,72.887497000000053],[-124.66944899999993,72.888884999999959],[-124.63667299999997,72.892761000000064],[-124.60611,72.897216999999955],[-124.591949,72.899994000000049],[-124.49722300000002,72.919707999999957],[-124.48554999999999,72.923035000000084],[-124.47582999999997,72.927200000000084],[-124.47305299999999,72.933318999999926],[-124.49305700000002,72.97164900000007],[-124.49722300000002,72.977203000000031],[-124.62138399999992,73.001389000000131],[-124.71250899999995,73.003876000000048],[-124.72609699999998,73.006653000000142],[-124.73777799999999,73.010268999999994],[-124.76972999999992,73.021378000000084],[-124.82417299999992,73.046097000000032],[-124.83332799999994,73.050262000000032],[-124.84916699999997,73.059417999999994],[-124.862503,73.068878000000041],[-124.86694299999994,73.074432000000058],[-124.86888099999999,73.080551000000071],[-124.86389200000002,73.086105000000089],[-124.79472399999992,73.134720000000129],[-124.78500400000001,73.13888500000013],[-124.71362299999987,73.149428999999998],[-124.59916699999985,73.227768000000026],[-124.58640299999996,73.238037000000077],[-124.57389799999993,73.248321999999973],[-124.56360599999988,73.259155000000135],[-124.50805699999995,73.32638500000013],[-124.44583099999994,73.411102000000142],[-124.44055199999997,73.416655999999932],[-124.43306000000001,73.421370999999965],[-124.40556299999997,73.434143000000006],[-124.30555699999991,73.478592000000106],[-124.29332699999998,73.481659000000036],[-124.252228,73.483596999999975],[-124.22833300000002,73.483321999999987],[-124.20916699999998,73.481659000000036],[-124.18998699999997,73.481659000000036],[-124.17304999999999,73.483596999999975],[-124.16055299999999,73.486923000000047],[-124.07000699999998,73.546097000000088],[-124.041946,73.582214000000079],[-124.03888699999993,73.586929000000112],[-124.07167099999998,73.61775200000011],[-124.0786129999999,73.622756999999979],[-124.07611099999991,73.643051000000071],[-124.073059,73.649155000000121],[-124.06777999999991,73.654709000000139],[-124.05526700000001,73.658034999999984],[-123.94554099999993,73.681656000000032],[-123.86138899999997,73.695815999999979],[-123.83389299999999,73.700272000000041],[-123.774719,73.764435000000105],[-123.80471799999987,73.796936000000017],[-123.83833300000003,73.821106000000043],[-123.84777800000001,73.825271999999927],[-123.93639399999995,73.840546000000018],[-123.95834399999995,73.841369999999984],[-123.98055999999991,73.840820000000122],[-124.01999699999999,73.838318000000072],[-124.06639100000001,73.839432000000045],[-124.08583099999998,73.841094999999996],[-124.13417099999992,73.848327999999981],[-124.16306299999985,73.854156000000103],[-124.19860799999992,73.864699999999971],[-124.21749899999986,73.872757000000092],[-124.36860699999988,74.014435000000049],[-124.41166699999991,74.056366000000025],[-124.42666600000001,74.109711000000118],[-124.43415800000002,74.134430000000066],[-124.600281,74.268326000000059],[-124.61805699999996,74.26638800000012],[-124.66082799999992,74.264708999999925],[-124.68083200000001,74.266098000000113],[-124.69304699999986,74.269440000000031],[-124.77500900000001,74.319152999999972],[-124.78415699999999,74.329987000000074],[-124.781387,74.336104999999975],[-124.77084400000001,74.340271000000087],[-124.75556899999992,74.342758000000003],[-124.69722000000002,74.347214000000065],[-124.40471600000001,74.369141000000127],[-124.10861199999999,74.392761000000121],[-123.89527899999996,74.396378000000084],[-123.85694899999987,74.399429000000112],[-123.676941,74.418320000000108],[-123.63834399999996,74.421371000000136],[-123.57444800000002,74.424149000000114],[-123.41887700000001,74.428314000000114],[-123.20584100000002,74.443039000000056],[-123.02250700000002,74.444702000000007],[-122.68998699999992,74.453872999999987],[-122.43804899999998,74.464995999999928],[-122.33750900000001,74.471099999999979],[-122.118607,74.49192800000003],[-122.06610099999995,74.49803200000008],[-121.93859900000001,74.518326000000002],[-121.76666299999999,74.539703000000031],[-121.73000299999995,74.543319999999994],[-121.65194699999995,74.548598999999967],[-121.61028299999992,74.550537000000134],[-121.56416300000001,74.551086000000055],[-121.51862299999993,74.548874000000012],[-121.31082200000003,74.531661999999983],[-121.25361599999997,74.525818000000129],[-121.13612399999994,74.506943000000035],[-121.08389299999993,74.493590999999981],[-121.05777,74.486649000000057],[-121.01112399999988,74.472214000000122],[-121.00222799999995,74.46775800000006],[-120.98998999999998,74.458037999999988],[-120.98055999999991,74.447479000000101],[-120.97693599999991,74.441925000000083],[-120.97556299999991,74.429703000000131],[-120.90638699999994,74.415268000000026],[-120.70584100000002,74.373596000000134],[-120.48166700000002,74.329987000000074],[-120.21721599999989,74.282486000000006],[-120.14998600000001,74.272491000000059]],[[-97.652785999999992,74.455826000000059],[-97.675551999999982,74.454987000000131],[-97.691939999999988,74.455261000000064],[-97.708892999999989,74.457214000000022],[-97.777221999999995,74.476379000000122],[-97.789444000000003,74.479980000000012],[-97.792495999999915,74.485809000000017],[-97.781386999999995,74.497208000000114],[-97.768616000000009,74.508041000000105],[-97.761672999999917,74.512496999999996],[-97.753890999999953,74.515548999999965],[-97.618057000000022,74.552200000000028],[-97.532227000000034,74.606369000000086],[-97.513625999999988,74.611374000000126],[-97.470001000000025,74.621094000000028],[-97.445830999999998,74.626082999999994],[-97.422774999999945,74.629424999999912],[-97.406951999999933,74.62831100000011],[-97.389724999999999,74.626373000000001],[-97.368056999999965,74.622756999999979],[-97.357772999999952,74.621368000000132],[-97.291381999999942,74.605255000000113],[-97.267226999999934,74.597214000000008],[-97.261672999999917,74.594711000000075],[-97.256957999999997,74.590546000000074],[-97.261948000000018,74.583878000000084],[-97.299987999999871,74.551376000000062],[-97.376098999999954,74.511658000000068],[-97.387511999999958,74.506377999999984],[-97.606383999999991,74.461929000000055],[-97.652785999999992,74.455826000000059]],[[-95.311110999999983,74.497757000000092],[-95.331389999999999,74.496093999999971],[-95.353332999999964,74.496368000000075],[-95.458892999999989,74.49859600000002],[-95.480559999999912,74.5],[-95.522781000000009,74.504990000000078],[-95.603057999999919,74.515548999999965],[-95.661666999999966,74.523605000000032],[-95.697768999999937,74.529709000000025],[-95.71665999999999,74.533874999999966],[-95.809432999999956,74.554427999999973],[-95.845000999999968,74.563873000000058],[-95.862212999999997,74.56999200000007],[-95.866394000000014,74.574158000000011],[-95.860549999999989,74.579163000000051],[-95.857497999999964,74.580551000000128],[-95.682495000000017,74.634995000000004],[-95.653885000000002,74.642211999999915],[-95.638061999999991,74.643326000000116],[-95.624161000000015,74.641662999999994],[-95.628601000000003,74.640823000000125],[-95.517501999999922,74.630264000000068],[-95.497498000000007,74.627197000000137],[-95.441101000000003,74.613876000000005],[-95.403609999999958,74.603316999999947],[-95.334441999999967,74.580825999999945],[-95.317779999999971,74.573883000000137],[-95.291945999999939,74.560257000000036],[-95.260283999999956,74.540543000000071],[-95.25111400000003,74.53414900000007],[-95.244995000000017,74.527771000000087],[-95.246383999999978,74.521652000000074],[-95.25111400000003,74.516098000000056],[-95.259170999999981,74.510544000000095],[-95.271117999999944,74.505554000000018],[-95.289443999999946,74.501389000000017],[-95.311110999999983,74.497757000000092]],[[-97.175827000000027,75.24414100000007],[-97.194442999999978,75.242752000000053],[-97.216110000000015,75.24470500000001],[-97.225006000000008,75.24803199999991],[-97.231948999999929,75.254440000000045],[-97.27806099999998,75.343597000000102],[-97.275283999999999,75.347487999999998],[-97.258056999999951,75.349426000000108],[-97.208617999999944,75.342209000000025],[-97.190551999999968,75.33526599999999],[-97.161666999999852,75.322220000000073],[-97.153060999999923,75.315262000000075],[-97.148894999999925,75.297760000000039],[-97.146956999999986,75.27998400000007],[-97.147507000000019,75.273880000000077],[-97.155838000000017,75.255264000000011],[-97.161666999999852,75.250000000000057],[-97.175827000000027,75.24414100000007]],[[-103.9175029999999,75.054977000000008],[-104.22917199999995,75.018051000000071],[-104.261124,75.018326000000116],[-104.45944199999991,75.028869999999984],[-104.662216,75.062485000000038],[-104.84722899999991,75.109146000000067],[-104.85722399999992,75.164703000000031],[-104.82000699999998,75.177765000000022],[-104.79998799999998,75.189423000000033],[-104.79305999999997,75.194702000000063],[-104.74472000000003,75.246093999999971],[-104.76862299999999,75.281937000000028],[-104.71083099999993,75.322220000000073],[-104.68222000000003,75.33776899999998],[-104.67360699999995,75.341660000000047],[-104.49722299999996,75.406372000000033],[-104.42804699999994,75.420821999999987],[-104.37777699999998,75.42804000000001],[-104.33000199999992,75.433043999999938],[-104.18222000000003,75.435531999999967],[-104.15177900000003,75.434555000000103],[-104.11416600000001,75.430267000000072],[-103.97112299999998,75.404434000000094],[-103.953056,75.399994000000106],[-103.935272,75.394989000000066],[-103.84805299999999,75.364990000000034],[-103.81054699999993,75.348602000000142],[-103.74166899999994,75.286102000000028],[-103.587219,75.169983000000059],[-103.58306899999997,75.164703000000031],[-103.59028599999999,75.159424000000058],[-103.60888699999992,75.149155000000007],[-103.7302929999999,75.099990999999989],[-103.76390100000003,75.088882000000126],[-103.79943799999995,75.077484000000084],[-103.81777999999997,75.072494999999947],[-103.88999899999999,75.058318999999983],[-103.9175029999999,75.054977000000008]],[[-100.17223399999995,75.601379000000009],[-100.15722700000003,75.589432000000045],[-100.15778399999994,75.584991000000116],[-100.17639200000002,75.57998699999996],[-100.23332199999993,75.569153000000085],[-100.383331,75.553588999999988],[-100.45417800000001,75.546371000000022],[-100.47972099999993,75.545822000000044],[-100.47556299999997,75.549987999999985],[-100.45749699999999,75.554152999999985],[-100.43195299999991,75.55831900000004],[-100.40666199999987,75.561370999999951],[-100.36110699999995,75.565535999999952],[-100.31777999999986,75.573043999999982],[-100.30332900000002,75.577484000000027],[-100.29361,75.584427000000005],[-100.30332900000002,75.58859300000006],[-100.31973299999999,75.590820000000122],[-100.33917199999996,75.591369999999984],[-100.36332699999997,75.59027100000003],[-100.52778599999994,75.577208999999982],[-100.74973299999994,75.558029000000033],[-100.86527999999998,75.547211000000061],[-100.88555899999994,75.545822000000044],[-100.90862300000003,75.546371000000022],[-100.950287,75.549713000000111],[-100.99445300000002,75.554977000000122],[-101.02333099999993,75.559981999999991],[-101.03333299999997,75.563034000000073],[-101.03943600000002,75.567215000000147],[-101.02583299999998,75.570540999999992],[-100.84277299999991,75.586929000000055],[-100.70249899999993,75.588882000000012],[-100.68055699999996,75.589432000000045],[-100.65583800000002,75.59165999999999],[-100.64167800000001,75.596100000000035],[-100.62027,75.606094000000041],[-100.59861799999999,75.610259999999926],[-100.51112399999994,75.61914100000007],[-100.39444700000001,75.623031999999967],[-100.27639799999997,75.623031999999967],[-100.23500099999995,75.623031999999967],[-100.21777299999997,75.621917999999994],[-100.204453,75.617477000000065],[-100.19499200000001,75.613312000000064],[-100.17223399999995,75.601379000000009]],[[-94.363892000000021,75.590820000000122],[-94.326950000000011,75.579711999999972],[-94.243880999999931,75.549713000000111],[-94.205275999999913,75.529709000000025],[-94.010283999999956,75.442200000000071],[-93.989715999999987,75.434982000000105],[-93.839721999999938,75.388046000000031],[-93.742492999999968,75.364426000000094],[-93.499160999999958,75.264709000000096],[-93.487502999999947,75.256653000000028],[-93.493331999999953,75.247207999999944],[-93.529175000000009,75.176376000000062],[-93.488892000000021,75.072494999999947],[-93.434157999999968,74.966385000000002],[-93.406386999999995,74.883605999999986],[-93.458053999999947,74.714996000000099],[-93.462508999999955,74.708602999999925],[-93.467772999999966,74.703048999999965],[-93.484726000000023,74.687759000000142],[-93.49610899999999,74.68193100000002],[-93.530563000000029,74.667755000000056],[-93.563323999999966,74.659424000000115],[-93.691665999999941,74.63998400000014],[-93.717223999999874,74.636932000000058],[-93.741378999999995,74.635543999999982],[-94.040282999999988,74.640823000000125],[-94.249999999999886,74.646378000000027],[-94.388061999999991,74.635269000000108],[-94.471114999999884,74.626648000000046],[-94.511947999999961,74.623306000000071],[-94.547500999999897,74.621368000000132],[-94.643340999999964,74.623596000000077],[-94.687774999999931,74.62831100000011],[-95.024718999999948,74.673035000000084],[-95.080001999999979,74.680817000000047],[-95.085830999999985,74.687195000000031],[-95.076949999999954,74.697479000000044],[-95.072783999999956,74.702209000000096],[-95.104445999999996,74.744141000000127],[-95.266402999999912,74.793319999999937],[-95.283324999999991,74.79803499999997],[-95.298339999999996,74.800262000000032],[-95.403335999999911,74.803863999999976],[-95.434158000000025,74.801376000000005],[-95.457503999999972,74.798324999999977],[-95.479172000000005,74.78804000000008],[-95.483062999999902,74.783325000000048],[-95.482772999999952,74.779433999999981],[-95.475554999999986,74.769989000000066],[-95.462219000000005,74.756653000000142],[-95.547226000000023,74.761107999999979],[-95.625823999999909,74.807480000000055],[-95.705565999999976,74.829987000000131],[-95.740828999999906,74.82388300000008],[-95.771392999999932,74.823608000000092],[-95.864166000000012,74.826096000000064],[-95.959473000000003,74.856369000000029],[-96.002501999999879,74.872757000000092],[-96.006667999999934,74.876923000000147],[-96.077224999999942,74.902771000000087],[-96.135283999999899,74.951096000000121],[-96.141678000000013,74.957214000000079],[-96.136948000000018,74.963043000000084],[-96.124709999999936,74.975815000000068],[-96.094726999999978,74.991364000000033],[-96.070847000000015,75.001938000000052],[-96.056380999999988,75.010268999999937],[-96.055557000000022,75.016097999999943],[-96.060546999999985,75.019440000000088],[-96.07417299999986,75.023605000000089],[-96.083068999999966,75.024429000000055],[-96.142226999999991,75.017761000000064],[-96.147507000000019,75.013611000000083],[-96.200835999999924,74.954712000000029],[-96.203339000000028,74.951660000000061],[-96.20666499999993,74.943038999999999],[-96.203887999999949,74.93691999999993],[-96.205840999999964,74.92025799999999],[-96.209732000000031,74.915543000000127],[-96.221389999999985,74.910263000000043],[-96.247771999999884,74.90554800000001],[-96.268341000000021,74.903870000000097],[-96.31527699999998,74.90248100000008],[-96.337219000000005,74.903595000000053],[-96.357497999999964,74.906647000000021],[-96.373610999999983,74.910263000000043],[-96.387221999999952,74.914703000000088],[-96.396666999999923,74.919708000000128],[-96.40306099999998,74.925812000000121],[-96.386123999999995,74.97387700000013],[-96.357497999999964,74.97137500000008],[-96.341385000000002,74.972487999999998],[-96.328063999999983,74.974701000000096],[-96.320557000000008,74.979430999999977],[-96.318343999999968,74.982208000000071],[-96.322234999999864,75.001389000000074],[-96.331115999999895,75.004715000000147],[-96.476669000000015,75.004440000000102],[-96.500838999999928,75.002777000000037],[-96.523055999999997,74.999145999999939],[-96.533889999999985,74.994705000000067],[-96.55972300000002,74.986098999999967],[-96.580291999999986,74.98414600000001],[-96.599990999999989,74.983322000000044],[-96.614165999999955,74.984984999999938],[-96.616942999999992,74.991088999999988],[-96.604720999999984,75.063309000000004],[-96.571395999999936,75.101089000000115],[-96.463057999999933,75.19331399999993],[-96.456389999999999,75.196930000000009],[-96.378600999999946,75.21665999999999],[-96.077788999999996,75.272491000000059],[-95.948043999999982,75.283325000000104],[-95.922500999999954,75.286102000000028],[-95.903335999999911,75.289978000000076],[-95.910552999999936,75.29525799999999],[-95.934433000000013,75.297211000000118],[-95.978058000000033,75.298874000000012],[-96.026671999999962,75.299149000000057],[-96.049987999999928,75.296936000000073],[-96.061935000000005,75.315262000000075],[-96.003615999999965,75.343047999999953],[-95.932494999999903,75.353043000000071],[-95.934714999999983,75.350173999999981],[-95.93472300000002,75.347762999999986],[-95.919998000000021,75.34693900000002],[-95.890288999999996,75.349152000000004],[-95.887443999999959,75.360268000000133],[-95.83677699999987,75.369926000000021],[-95.830780000000004,75.371429000000035],[-95.829781000000025,75.372589000000119],[-95.83061199999986,75.374428000000023],[-95.832786999999939,75.375923000000114],[-95.848274000000004,75.378432999999973],[-95.906775999999979,75.387428000000057],[-95.927779999999871,75.398041000000148],[-96.033324999999934,75.40109300000006],[-96.055267000000015,75.400818000000072],[-96.078887999999893,75.396103000000039],[-96.079178000000013,75.391098],[-96.083618000000001,75.385543999999982],[-96.099730999999963,75.380264000000125],[-96.126099000000011,75.37692300000009],[-96.151108000000022,75.374984999999924],[-96.175277999999992,75.379424999999969],[-96.178878999999995,75.384430000000009],[-96.161941999999954,75.395537999999988],[-96.14973399999991,75.400818000000072],[-96.135009999999966,75.406372000000033],[-96.095839999999896,75.417755000000056],[-96.0625,75.424988000000099],[-95.974166999999966,75.436096000000077],[-95.958344000000011,75.436371000000065],[-95.93638599999997,75.43414300000012],[-95.874160999999958,75.423874000000069],[-95.831046999999955,75.41531400000008],[-95.832549999999969,75.413651000000129],[-95.83322099999998,75.409988000000112],[-95.831046999999955,75.406982000000085],[-95.825881999999979,75.403320000000122],[-95.814383999999961,75.400322000000074],[-95.769553999999857,75.400322000000074],[-95.691100999999946,75.40525800000006],[-95.682495000000017,75.408324999999991],[-95.676102000000014,75.415817000000118],[-95.678328999999962,75.421920999999998],[-95.68472300000002,75.428314000000114],[-95.691665999999998,75.429703000000131],[-95.715835999999911,75.429153000000099],[-95.734160999999915,75.426085999999998],[-95.758620999999948,75.42553700000002],[-95.781677000000002,75.42804000000001],[-95.800551999999925,75.431656000000032],[-95.825011999999958,75.439972000000125],[-95.830001999999922,75.4433140000001],[-95.836945000000014,75.453598000000113],[-95.83805799999999,75.459152000000074],[-95.835555999999997,75.464431999999988],[-95.832229999999981,75.470535000000098],[-95.824172999999973,75.477767999999912],[-95.800551999999925,75.49136400000009],[-95.762222000000008,75.508041000000048],[-95.749725000000012,75.513321000000133],[-95.470000999999968,75.566939999999988],[-95.275283999999942,75.599426000000051],[-95.264175000000023,75.59387200000009],[-95.234436000000017,75.584717000000012],[-95.212783999999999,75.582489000000066],[-95.178604000000007,75.584427000000005],[-95.12470999999988,75.59526100000005],[-95.104172000000005,75.60026600000009],[-95.093338000000017,75.603591999999992],[-95.085830999999985,75.607208000000014],[-95.084166999999979,75.609146000000123],[-95.075286999999946,75.614426000000037],[-95.063323999999909,75.618866000000025],[-95.044448999999872,75.62164300000012],[-94.917769999999962,75.637207000000046],[-94.901672000000019,75.637497000000053],[-94.741378999999938,75.62414600000011],[-94.559722999999963,75.612488000000099],[-94.511123999999995,75.611099000000081],[-94.46556099999998,75.608321999999987],[-94.404175000000009,75.599152000000117],[-94.363892000000021,75.590820000000122]],[[-95.910003999999901,75.560256999999979],[-95.911117999999988,75.554152999999985],[-95.93472300000002,75.540543000000071],[-96.170837000000006,75.458038000000101],[-96.220276000000013,75.455551000000071],[-96.238892000000021,75.456650000000025],[-96.255004999999983,75.461380000000077],[-96.399170000000026,75.516388000000063],[-96.417220999999984,75.523315000000139],[-96.42471299999994,75.528595000000053],[-96.450995999999975,75.529991000000052],[-96.441161999999963,75.535987999999975],[-96.415832999999907,75.543648000000132],[-96.412659000000019,75.546150000000011],[-96.411666999999909,75.548819999999978],[-96.417992000000027,75.552658000000065],[-96.431167999999957,75.555489000000023],[-96.441832999999974,75.555664000000093],[-96.450995999999975,75.553154000000063],[-96.503837999999917,75.535156000000029],[-96.507995999999935,75.532982000000118],[-96.518165999999951,75.526320999999996],[-96.525161999999909,75.519325000000038],[-96.553603999999893,75.508880999999917],[-96.552215999999987,75.503326000000015],[-96.549437999999896,75.497208000000114],[-96.545546999999999,75.492203000000075],[-96.541107000000011,75.488037000000134],[-96.533324999999934,75.48275799999999],[-96.517501999999922,75.478043000000127],[-96.503341999999975,75.471374999999966],[-96.500564999999995,75.464996000000099],[-96.50418099999996,75.460266000000104],[-96.511948000000018,75.455826000000059],[-96.65834000000001,75.388596000000064],[-96.833617999999944,75.352478000000019],[-96.851104999999905,75.350266000000147],[-96.862212999999997,75.350815000000125],[-96.876098999999954,75.353591999999992],[-96.93249499999996,75.376082999999994],[-97.030838000000017,75.454437000000041],[-97.053054999999915,75.492203000000075],[-97.053054999999915,75.497208000000114],[-97.006957999999941,75.508331000000112],[-96.940825999999959,75.521652000000017],[-96.913619999999923,75.526382000000069],[-96.891677999999956,75.529160000000047],[-96.666945999999996,75.552765000000022],[-96.469382999999993,75.588425000000029],[-96.466552999999919,75.591933999999924],[-96.467727999999909,75.599091000000044],[-96.470054999999888,75.602264000000048],[-96.422500999999954,75.623596000000077],[-96.424438000000009,75.635544000000095],[-96.415008999999941,75.646941999999967],[-96.396392999999989,75.649994000000049],[-96.379715000000033,75.651093000000003],[-96.347228999999913,75.651382000000126],[-96.335555999999997,75.650818000000015],[-96.314437999999996,75.647766000000104],[-96.241104000000007,75.629974000000061],[-96.133330999999941,75.606644000000074],[-96.115829000000019,75.60386699999998],[-96.101944000000003,75.603591999999992],[-96.025436000000013,75.602844000000061],[-95.95777899999996,75.583603000000039],[-95.938889000000017,75.577484000000027],[-95.923888999999974,75.571655000000021],[-95.916397000000018,75.566375999999991],[-95.910003999999901,75.560256999999979]],[[-96.954453000000001,75.595534999999984],[-96.975005999999894,75.594711000000018],[-96.996658000000025,75.597762999999929],[-97.005004999999983,75.604431000000091],[-97.001953000000015,75.610809000000074],[-96.988601999999958,75.618042000000059],[-96.978607000000011,75.623031999999967],[-96.960830999999985,75.627472000000125],[-96.779449,75.6602630000001],[-96.751952999999958,75.664703000000088],[-96.729720999999984,75.665267999999969],[-96.720551,75.66415399999994],[-96.715835999999967,75.659988000000055],[-96.718886999999995,75.653870000000097],[-96.722305000000006,75.652954000000022],[-96.740279999999927,75.646941999999967],[-96.849166999999966,75.613312000000064],[-96.954453000000001,75.595534999999984]],[[-96.579177999999899,75.736923000000104],[-96.696655000000021,75.730819999999994],[-96.710555999999997,75.733597000000088],[-96.717223999999987,75.739700000000028],[-96.67860399999995,75.777481000000023],[-96.666945999999996,75.786652000000117],[-96.660827999999981,75.789429000000041],[-96.541107000000011,75.822219999999959],[-96.525283999999942,75.826384999999959],[-96.507506999999976,75.828323000000125],[-96.48443599999996,75.827208999999925],[-96.468062999999916,75.822495000000004],[-96.455841000000021,75.817764000000068],[-96.457503999999972,75.801085999999998],[-96.459166999999979,75.789429000000041],[-96.539718999999991,75.74331699999999],[-96.553603999999893,75.738586000000055],[-96.579177999999899,75.736923000000104]],[[-111.79998799999998,75.839157],[-111.823624,75.83859300000006],[-111.86582899999996,75.840545999999961],[-111.900284,75.843596999999988],[-111.91722099999993,75.846939000000134],[-111.92250100000001,75.852767999999969],[-111.91972399999997,75.85775799999999],[-111.90139799999997,75.863876000000118],[-111.85665899999992,75.867751999999996],[-111.79972799999996,75.871093999999971],[-111.61305199999993,75.881927000000132],[-111.59528399999999,75.882751000000098],[-111.58306899999991,75.881927000000132],[-111.5786129999999,75.879974000000004],[-111.58194699999996,75.876083000000108],[-111.59306300000003,75.87303200000008],[-111.62917299999992,75.856934000000024],[-111.64806399999998,75.851928999999984],[-111.75695799999994,75.841659999999933],[-111.79998799999998,75.839157]],[[-122.34084300000001,75.862761999999975],[-122.36277799999999,75.858032000000094],[-122.39862099999993,75.859421000000111],[-122.66471899999993,75.89387499999998],[-122.69167299999998,75.900269000000037],[-122.69360399999999,75.902206000000035],[-122.69554099999993,75.908035000000041],[-122.68277,75.911652000000004],[-122.633331,75.919708000000071],[-122.58222999999998,75.921921000000054],[-122.53751399999993,75.922484999999995],[-122.37917299999992,75.915817000000004],[-122.35305800000003,75.914429000000098],[-122.337784,75.911377000000016],[-122.32833900000003,75.905822999999998],[-122.32417299999997,75.899719000000005],[-122.33473200000003,75.869141000000013],[-122.34084300000001,75.862761999999975]],[[-121.09306299999997,75.726089000000059],[-121.1100009999999,75.724700999999982],[-121.14306599999992,75.725815000000125],[-121.27555799999993,75.747481999999991],[-121.28832999999997,75.752777000000037],[-121.28582799999998,75.758881000000088],[-121.27194199999997,75.770537999999988],[-121.26306199999993,75.774154999999951],[-121.11694299999999,75.795821999999987],[-121.04332699999992,75.808868000000132],[-121.02944899999989,75.811371000000122],[-121.01917299999997,75.818054000000075],[-121.01500699999997,75.824707000000046],[-121.00083899999993,75.856644000000017],[-120.99833699999988,75.867751999999996],[-121.00695799999988,75.879700000000071],[-121.01363399999997,75.884720000000073],[-121.04222099999998,75.894149999999968],[-121.04750099999995,75.899993999999992],[-121.04250299999995,75.90554800000001],[-121.03859699999998,75.908325000000104],[-120.997772,75.926376000000062],[-120.98000300000001,75.929427999999973],[-120.87777699999998,75.936096000000134],[-120.86776700000001,75.924698000000149],[-120.86776700000001,75.913315000000125],[-120.86972000000003,75.881087999999977],[-120.87110899999993,75.87553400000013],[-120.88474300000001,75.844986000000006],[-120.89835399999998,75.825821000000019],[-120.92111199999999,75.803314000000114],[-120.93804899999998,75.790543000000014],[-120.99388099999993,75.757767000000115],[-121.01862299999993,75.744431000000134],[-121.03278399999994,75.737762000000089],[-121.05248999999992,75.732758000000103],[-121.09306299999997,75.726089000000059]],[[-95.792769999999962,75.899719000000005],[-95.809432999999956,75.894714000000135],[-95.818893000000003,75.907211000000075],[-95.825561999999991,75.913315000000125],[-95.847777999999892,75.929427999999973],[-95.862503000000004,75.936096000000134],[-95.882492000000013,75.941086000000041],[-95.896956999999986,75.947753999999975],[-95.899993999999992,75.953873000000044],[-95.890839000000028,75.959427000000005],[-95.860001000000011,75.966660000000047],[-95.796660999999972,75.973312000000078],[-95.770554000000004,75.974991000000102],[-95.746947999999918,75.97387700000013],[-95.73582499999992,75.968323000000112],[-95.736938000000009,75.962494000000106],[-95.751952999999958,75.927475000000072],[-95.761947999999961,75.916092000000049],[-95.779723999999931,75.90498400000007],[-95.792769999999962,75.899719000000005]],[[-94.405563000000029,75.75082400000008],[-94.582778999999903,75.74581900000004],[-94.629165999999998,75.746094000000085],[-94.676102000000014,75.747756999999979],[-94.72084000000001,75.753876000000048],[-94.739440999999999,75.75749200000007],[-94.777495999999928,75.768600000000049],[-94.795272999999952,75.775818000000072],[-94.809157999999968,75.782486000000063],[-94.822234999999978,75.794144000000074],[-94.898894999999925,75.912765999999976],[-94.902785999999992,75.919434000000138],[-94.905272999999966,75.925537000000077],[-94.906112999999948,75.93081699999999],[-94.904449,75.9369200000001],[-94.89527899999996,75.942200000000014],[-94.879989999999964,75.945526000000029],[-94.865554999999972,75.947478999999987],[-94.813613999999973,75.950546000000088],[-94.737777999999992,75.952208999999982],[-94.699722000000008,75.955551000000128],[-94.53832999999986,75.986099000000081],[-94.481948999999929,75.974426000000051],[-94.466948999999886,75.968597000000045],[-94.453338999999914,75.961929000000112],[-94.449721999999952,75.955261000000121],[-94.443603999999993,75.938309000000118],[-94.420272999999952,75.868590999999981],[-94.410277999999948,75.86192299999999],[-94.370833999999945,75.842209000000082],[-94.322234999999978,75.814986999999974],[-94.305557000000022,75.80304000000001],[-94.287780999999939,75.783875000000023],[-94.288054999999986,75.777481000000023],[-94.291381999999999,75.772217000000012],[-94.296950999999979,75.766388000000006],[-94.310271999999941,75.761383000000137],[-94.326400999999976,75.757217000000082],[-94.353881999999942,75.753876000000048],[-94.405563000000029,75.75082400000008]],[[-103.137787,75.74275200000011],[-103.20667300000002,75.74275200000011],[-103.3011019999999,75.744705000000067],[-103.32389799999999,75.747208000000057],[-103.36888099999999,75.753876000000048],[-103.38082899999995,75.759430000000009],[-103.382767,75.765549000000021],[-103.31139399999995,75.805252000000053],[-103.07749899999999,75.890823000000069],[-103.05943300000001,75.896378000000141],[-103.03751399999993,75.901657000000114],[-103.01194799999996,75.906097000000102],[-102.98693800000001,75.909424000000058],[-102.69611399999997,75.946640000000002],[-102.59889199999986,75.953598],[-102.52278099999995,75.958038000000045],[-102.43360899999999,75.964157000000057],[-102.291382,75.977203000000145],[-102.21749899999998,75.985535000000141],[-102.19138299999997,75.989699999999971],[-102.16471899999993,75.99054000000001],[-102.07861300000002,75.97137500000008],[-101.98916599999995,75.950821000000076],[-101.98332199999987,75.945816000000036],[-101.98860200000001,75.934418000000051],[-102.020554,75.925537000000077],[-102.09472700000003,75.911652000000004],[-102.14639299999993,75.903320000000008],[-102.19638099999997,75.899719000000005],[-102.29638699999998,75.894989000000123],[-102.31916799999999,75.893051000000014],[-102.34665699999999,75.889434999999935],[-102.39417299999997,75.880814000000044],[-102.43055699999991,75.869979999999998],[-102.44082600000002,75.86442599999998],[-102.44943199999994,75.85832199999993],[-102.45584099999996,75.852478000000133],[-102.46000699999996,75.847214000000122],[-102.47165699999988,75.818329000000062],[-102.48277300000001,75.806366000000025],[-102.49694799999992,75.79553199999998],[-102.50917099999998,75.789429000000041],[-102.54527300000001,75.779709000000139],[-102.59028599999994,75.770537999999988],[-102.61165599999998,75.767211999999972],[-102.636124,75.764708999999982],[-102.86638599999998,75.753601000000003],[-103.015289,75.747208000000057],[-103.137787,75.74275200000011]],[[-122.81916799999999,76.06053200000008],[-122.78056300000003,76.057205000000124],[-122.68776700000001,76.059982000000048],[-122.66194200000001,76.05693100000002],[-122.64277599999997,76.052475000000129],[-122.63082900000001,76.046646000000123],[-122.72501399999987,76.023605000000089],[-122.88194299999998,76.011108000000092],[-122.89250199999998,76.013611000000026],[-122.89611799999994,76.026931999999988],[-122.89222699999999,76.031096999999988],[-122.85082999999997,76.057205000000124],[-122.81916799999999,76.06053200000008]],[[-102.38999899999993,76.083603000000096],[-102.37554899999998,76.079163000000108],[-102.37138399999998,76.079163000000108],[-102.36805699999996,76.077209000000096],[-102.3563769999999,76.075820999999962],[-102.35333300000002,76.073883000000023],[-102.33889799999997,76.069443000000035],[-102.33249699999999,76.065536000000066],[-102.32167099999998,76.053589000000102],[-102.31639100000001,76.036925999999994],[-102.31889299999989,76.031096999999988],[-102.319458,76.024704000000042],[-102.32972699999993,76.015823000000125],[-102.34388699999994,76.010269000000108],[-102.36582900000002,76.005829000000119],[-102.41665599999999,76.000275000000101],[-102.51722699999993,75.991088999999988],[-102.56777999999991,75.985535000000141],[-102.695267,75.973312000000078],[-102.71472199999988,75.97026100000005],[-102.73972299999997,75.968048000000124],[-102.79055800000003,75.961380000000133],[-102.81139399999995,75.959990999999945],[-102.93611099999998,75.94802900000002],[-103.01027699999997,75.943038999999942],[-103.08528099999995,75.935806000000127],[-103.15695199999993,75.925812000000121],[-103.21888699999994,75.920258000000103],[-103.26500699999997,75.914429000000098],[-103.28943600000002,75.913040000000137],[-103.33944700000001,75.908035000000041],[-103.37998999999996,75.906097000000102],[-103.39639299999993,75.904434000000037],[-103.43305999999995,75.903320000000008],[-103.45333899999997,75.901657000000114],[-103.52443699999998,75.89888000000002],[-103.59277299999997,75.897217000000069],[-103.61332700000003,75.895538000000101],[-103.63474300000001,75.891098000000056],[-103.65556300000003,75.888596000000007],[-103.69972199999989,75.887496999999996],[-103.72332799999987,75.889160000000118],[-103.77111799999994,75.896378000000141],[-103.81166100000002,75.899428999999941],[-103.88806199999993,75.898041000000035],[-103.90194700000001,75.898604999999975],[-103.91471899999993,75.90248100000008],[-103.91500899999994,75.907760999999937],[-103.91722099999993,75.913605000000132],[-103.92555199999998,75.919144000000131],[-103.93611099999998,75.924149],[-103.96472199999999,75.934418000000051],[-103.97165699999994,75.938309000000118],[-103.94220699999994,75.942749000000106],[-103.90194700000001,75.943862999999908],[-103.82556199999999,75.950821000000076],[-103.80248999999998,75.953873000000044],[-103.78527799999995,75.957489000000066],[-103.77139299999988,75.963043000000084],[-103.75834700000001,75.966660000000047],[-103.7083439999999,75.972488000000112],[-103.68776699999989,75.97387700000013],[-103.598343,75.977203000000145],[-103.57444799999996,75.976654000000053],[-103.55471799999998,75.975266000000147],[-103.52250699999991,75.97554000000008],[-103.49694799999997,75.979980000000069],[-103.474716,75.985259999999982],[-103.45694700000001,75.990814000000114],[-103.41306299999997,76.001663000000008],[-103.39138800000001,76.006104000000107],[-103.36582899999996,76.009429999999952],[-103.34028599999988,76.013884999999959],[-103.31500199999999,76.017212000000086],[-103.29028299999999,76.018599999999992],[-103.26363399999997,76.019440000000088],[-103.22138999999993,76.019150000000025],[-103.196663,76.020537999999988],[-103.17887899999999,76.024994000000049],[-103.15666199999993,76.036652000000061],[-103.13667299999992,76.041656000000046],[-103.120003,76.043320000000051],[-103.05110200000001,76.043593999999985],[-103.00639299999995,76.044707999999957],[-102.98110999999989,76.04693600000013],[-102.95556599999998,76.050261999999975],[-102.91555800000003,76.060257000000092],[-102.88971700000002,76.064423000000147],[-102.86833199999995,76.066940000000045],[-102.86028299999992,76.066666000000112],[-102.85582699999992,76.067764000000011],[-102.75666799999993,76.073044000000095],[-102.708618,76.077484000000084],[-102.68138099999999,76.079163000000108],[-102.65805099999994,76.082214000000135],[-102.60777299999995,76.085814999999968],[-102.53138699999994,76.089431999999931],[-102.46806300000003,76.090271000000087],[-102.42804699999999,76.089431999999931],[-102.40416699999997,76.087769000000037],[-102.39639299999999,76.086655000000064],[-102.38999899999993,76.083603000000096]],[[-118.31639100000001,75.57249500000006],[-118.35472099999993,75.558868000000018],[-118.58306900000002,75.499419999999986],[-118.60472099999998,75.496368000000075],[-118.7036129999999,75.503052000000082],[-118.72250400000001,75.504440000000045],[-118.82749899999999,75.532761000000107],[-118.87361099999998,75.547484999999995],[-118.87777699999998,75.553314],[-118.92804699999999,75.562759000000085],[-118.95305599999995,75.564697000000024],[-119.08194700000001,75.567764000000125],[-119.13082900000001,75.566939999999988],[-119.19695299999995,75.562484999999924],[-119.22250400000001,75.565262000000018],[-119.34028599999999,75.579436999999928],[-119.36749299999991,75.58415199999996],[-119.38333099999994,75.589157000000057],[-119.39527899999996,75.594711000000018],[-119.40583800000002,75.600540000000024],[-119.408051,75.605820000000108],[-119.40471600000001,75.611923000000047],[-119.39750700000002,75.618317000000104],[-119.37554899999998,75.631088000000034],[-119.27528399999994,75.674698000000035],[-119.18831599999987,75.702484000000084],[-119.11389200000002,75.720535000000041],[-118.95472699999999,75.778594999999996],[-118.78888699999999,75.843048000000067],[-118.762787,75.856934000000024],[-118.75834699999996,75.862198000000035],[-118.75334199999992,75.866379000000109],[-118.71694899999994,75.882751000000098],[-118.61916399999996,75.915543000000071],[-118.58139,75.924987999999985],[-118.56388899999996,75.928589000000045],[-118.40444899999994,75.960815000000082],[-118.36776699999996,75.966385000000002],[-118.34028599999999,75.967484000000013],[-118.19415300000003,75.967484000000013],[-118.16832699999998,75.968323000000112],[-118.15222199999994,75.97137500000008],[-118.13751200000002,75.979705999999965],[-118.13137799999998,75.985535000000141],[-118.13137799999998,75.991363999999976],[-118.12748699999992,75.997482000000105],[-118.10500299999995,76.023880000000077],[-118.08860800000002,76.029434000000094],[-118.07140400000003,76.034149000000127],[-118.03751399999987,76.038315000000011],[-117.99804699999993,76.039978000000133],[-117.95722999999992,76.043045000000063],[-117.93360899999993,76.047485000000052],[-117.89972699999998,76.057479999999998],[-117.88971699999996,76.060806000000014],[-117.88500999999997,76.066086000000098],[-117.89138799999995,76.072220000000129],[-117.89277600000003,76.077484000000084],[-117.88612399999988,76.079712000000029],[-117.77887699999991,76.108597000000088],[-117.72609699999998,76.115540000000067],[-117.70694700000001,76.117203000000018],[-117.662216,76.117751999999939],[-117.64111299999996,76.116652999999985],[-117.62304699999999,76.114426000000094],[-117.51944700000001,76.099716000000001],[-117.49166899999989,76.094986000000119],[-117.47138999999993,76.088882000000069],[-117.46389799999997,76.083054000000004],[-117.48916600000001,76.04693600000013],[-117.57305899999994,75.981934000000081],[-117.681107,75.921097000000088],[-117.70445299999989,75.916930999999977],[-117.74694799999997,75.910812000000135],[-117.77555799999993,75.89888000000002],[-117.83833299999998,75.859985000000052],[-117.93720999999999,75.785262999999986],[-117.94499199999996,75.77915999999999],[-117.95221700000002,75.771927000000005],[-117.95638999999994,75.765822999999955],[-117.95638999999994,75.75999500000006],[-117.97138999999993,75.728867000000037],[-118.01583899999997,75.699416999999983],[-118.06220999999999,75.685806000000014],[-118.096947,75.678589000000102],[-118.11389200000002,75.673874000000069],[-118.14277599999997,75.663879000000122],[-118.22193900000002,75.633881000000031],[-118.26363400000002,75.616928000000087],[-118.2675089999999,75.61285399999997],[-118.266953,75.609985000000108],[-118.26834099999991,75.59165999999999],[-118.31639100000001,75.57249500000006]],[[-78.926391999999964,75.875809000000004],[-78.914169000000015,75.87303200000008],[-78.904174999999896,75.867203000000075],[-78.881377999999984,75.853317000000061],[-78.876663000000008,75.849152000000061],[-78.879439999999931,75.844147000000021],[-78.897781000000009,75.839706000000092],[-78.921111999999994,75.837494000000049],[-79.048889000000031,75.836928999999998],[-79.067779999999971,75.840271000000143],[-79.072783999999956,75.844437000000028],[-79.068618999999956,75.848328000000095],[-79.05749499999996,75.853317000000061],[-79.042495999999915,75.858032000000094],[-79.021666999999923,75.867477000000008],[-79.031676999999945,75.870819000000097],[-79.05471799999998,75.872757000000036],[-79.268889999999999,75.875259000000142],[-79.319457999999941,75.87359600000002],[-79.343063000000029,75.871093999999971],[-79.361389000000031,75.86692800000003],[-79.408339999999953,75.852767999999969],[-79.420273000000009,75.848038000000088],[-79.428054999999972,75.842484000000127],[-79.458617999999944,75.810806000000071],[-79.598052999999936,75.861374000000069],[-79.620270000000005,75.862761999999975],[-79.705840999999964,75.860535000000084],[-79.726944000000003,75.861099000000024],[-79.739990000000034,75.86442599999998],[-79.752227999999889,75.878586000000098],[-79.580001999999979,75.945251000000042],[-79.567504999999983,75.949142000000109],[-79.396956999999986,76.001938000000052],[-79.375,76.005554000000075],[-79.272780999999952,76.028045999999961],[-79.137786999999946,76.077209000000096],[-79.129714999999976,76.082763999999997],[-79.121932999999956,76.088593000000003],[-79.113051999999925,76.100540000000137],[-79.091384999999889,76.114426000000094],[-79.081954999999994,76.116379000000052],[-78.923888999999974,76.121094000000085],[-78.904174999999896,76.119705000000067],[-78.893065999999976,76.115540000000067],[-78.821670999999924,76.098328000000038],[-78.805832000000009,76.09304800000001],[-78.798049999999876,76.08638000000002],[-78.799164000000019,76.079987000000074],[-78.825835999999924,76.05802900000009],[-78.833892999999989,76.052475000000129],[-78.845551,76.047485000000052],[-78.861389000000031,76.043320000000051],[-78.921660999999915,76.031937000000028],[-78.998610999999983,76.014998999999989],[-79.069732999999928,75.998322000000144],[-79.085007000000019,75.993866000000082],[-79.144729999999981,75.975266000000147],[-79.156112999999948,75.969986000000063],[-79.166655999999932,75.964157000000057],[-79.171936000000017,75.958878000000084],[-79.176392000000021,75.952774000000034],[-79.176940999999943,75.946365000000014],[-79.174437999999952,75.93942300000009],[-79.168335000000013,75.931931000000134],[-79.140288999999939,75.918868999999972],[-79.111938000000009,75.910263000000043],[-79.029449,75.888321000000133],[-79.010284000000013,75.884720000000073],[-78.989440999999943,75.881927000000132],[-78.943603999999993,75.878036000000066],[-78.926391999999964,75.875809000000004]],[[-94.843613000000005,76.122208000000057],[-94.831116000000009,76.09664900000007],[-94.870270000000005,76.068877999999984],[-94.889175000000023,76.05802900000009],[-94.905562999999916,76.05386400000009],[-94.92860399999995,76.051086000000112],[-95.006667999999991,76.047485000000052],[-95.027221999999938,76.047760000000096],[-95.048888999999974,76.050812000000008],[-95.062499999999943,76.056090999999981],[-95.086394999999925,76.068054000000018],[-95.101943999999946,76.07777400000009],[-95.139724999999999,76.107757999999933],[-95.14416499999993,76.111922999999933],[-95.147232000000031,76.116927999999973],[-95.146392999999989,76.118042000000003],[-95.12110899999999,76.118591000000094],[-95.09445199999999,76.113602000000128],[-95.076949999999954,76.108322000000101],[-95.060546999999985,76.105819999999994],[-95.030562999999972,76.104706000000022],[-95.013061999999934,76.105819999999994],[-94.992767000000015,76.109421000000054],[-94.854445999999996,76.136658000000011],[-94.843613000000005,76.122208000000057]],[[-81.327788999999996,76.147217000000012],[-81.338607999999965,76.146378000000084],[-81.452498999999875,76.155822999999941],[-81.462508999999955,76.15887500000008],[-81.456954999999994,76.163605000000075],[-81.415833000000021,76.176926000000037],[-81.378051999999968,76.184417999999994],[-81.348891999999978,76.187485000000095],[-81.294448999999929,76.187759000000028],[-81.267226999999991,76.187759000000028],[-81.221663999999976,76.185531999999967],[-81.203338999999971,76.181091000000038],[-81.201401000000033,76.177765000000022],[-81.208617999999944,76.172211000000004],[-81.306106999999884,76.151093000000117],[-81.327788999999996,76.147217000000012]],[[-102.53083800000002,76.223312000000021],[-102.52722199999994,76.216934000000094],[-102.53138699999994,76.211655000000121],[-102.58056599999986,76.152481000000023],[-102.636124,76.125534000000073],[-102.65055799999999,76.119980000000112],[-102.67138699999998,76.114151000000106],[-102.73665599999998,76.098601999999971],[-102.78056300000003,76.089706000000035],[-102.80638099999999,76.085541000000035],[-102.85777300000001,76.078873000000101],[-102.93360899999999,76.070831000000112],[-103.34221599999995,76.036652000000061],[-103.36472300000003,76.035812000000021],[-103.67999299999997,76.034149000000127],[-103.82000700000003,76.031372000000033],[-103.86638600000003,76.030823000000055],[-103.91443599999997,76.03166200000004],[-103.962219,76.034714000000122],[-103.97277799999995,76.039703000000088],[-103.92388899999997,76.040817000000061],[-103.87832599999996,76.043869000000029],[-103.86945299999996,76.047485000000052],[-103.88861099999997,76.049712999999997],[-103.98332199999999,76.057205000000124],[-104.06054699999999,76.062195000000031],[-104.08677699999998,76.06053200000008],[-104.08743999999996,76.05819699999995],[-104.13082899999989,76.056366000000025],[-104.39111300000002,76.078323000000069],[-104.40833999999995,76.082214000000135],[-104.47833300000002,76.135817999999972],[-104.48277299999995,76.142211999999972],[-104.46389799999992,76.15887500000008],[-104.45417800000001,76.164429000000041],[-104.31582600000002,76.208037999999988],[-104.29804999999993,76.212494000000049],[-104.27250700000002,76.216095000000109],[-104.24722300000002,76.218596999999988],[-104.17223399999995,76.224152000000117],[-104.14806399999986,76.2227630000001],[-104.07472200000001,76.222213999999951],[-103.9569469999999,76.233047000000113],[-103.91805999999997,76.239975000000129],[-103.85138699999999,76.250000000000057],[-103.59445199999999,76.26527400000009],[-103.33693699999998,76.27998400000007],[-103.13137799999993,76.303040000000067],[-103.11000100000001,76.304703000000018],[-103.05999799999995,76.306366000000139],[-102.86472299999997,76.311095999999964],[-102.81696299999999,76.312194999999974],[-102.765556,76.311645999999996],[-102.72693599999997,76.30581699999999],[-102.66915899999992,76.295822000000101],[-102.66555799999998,76.294708000000128],[-102.65222199999994,76.287766000000033],[-102.64277599999997,76.269989000000123],[-102.63362100000001,76.257491999999957],[-102.62554899999992,76.251937999999996],[-102.6036069999999,76.24552900000009],[-102.55832700000002,76.235809000000017],[-102.54055799999998,76.229431000000091],[-102.53083800000002,76.223312000000021]],[[-89.398894999999982,76.43553200000008],[-89.425003000000004,76.43553200000008],[-89.599166999999966,76.440262000000132],[-89.613616999999977,76.440811000000053],[-89.625548999999978,76.444976999999994],[-89.615004999999996,76.449141999999995],[-89.559158000000025,76.470535000000098],[-89.533065999999963,76.47665400000011],[-89.49499499999996,76.472488000000055],[-89.488327000000027,76.46804800000001],[-89.465835999999911,76.462203999999986],[-89.446380999999917,76.457763999999997],[-89.40834000000001,76.450546000000145],[-89.386123999999938,76.447754000000089],[-89.378051999999968,76.444138000000009],[-89.380553999999961,76.439147999999989],[-89.398894999999982,76.43553200000008]],[[-83.962783999999999,76.426375999999948],[-83.986114999999984,76.423309000000017],[-84.009170999999924,76.425812000000008],[-84.109436000000017,76.444427000000132],[-84.12388599999997,76.451096000000007],[-84.139449999999954,76.507217000000082],[-84.128052000000025,76.50999500000006],[-84.097503999999901,76.506653000000142],[-84.013625999999931,76.498032000000023],[-83.992492999999854,76.494980000000112],[-83.976944000000003,76.491089000000045],[-83.918334999999956,76.469437000000028],[-83.908050999999944,76.464996000000099],[-83.962783999999999,76.426375999999948]],[[-104.05387899999999,76.563034000000073],[-104.03388999999999,76.559708000000001],[-103.87888299999997,76.573608000000092],[-103.86860699999994,76.579162999999994],[-103.86665299999993,76.584991000000116],[-103.87138400000003,76.596649000000127],[-103.86721799999998,76.603043000000014],[-103.85944399999994,76.607208000000014],[-103.82640100000003,76.618317000000047],[-103.804169,76.621918000000107],[-103.78751399999993,76.620529000000147],[-103.58194699999996,76.547759999999982],[-103.58805799999993,76.541930999999977],[-103.59249899999998,76.535812000000135],[-103.59166700000003,76.53137200000009],[-103.587784,76.524993999999936],[-103.57028199999996,76.521103000000096],[-103.404449,76.494705000000124],[-103.38445299999995,76.492203000000018],[-103.32112100000001,76.494980000000112],[-103.24500299999994,76.485535000000027],[-103.05777,76.457763999999997],[-103.03666699999991,76.453873000000101],[-103.01418299999995,76.447754000000089],[-103.00805699999989,76.441650000000038],[-103.00446299999999,76.435257000000092],[-103.00446299999999,76.429977000000008],[-103.011124,76.423309000000017],[-103.01917300000002,76.418045000000063],[-103.02971599999989,76.412491000000045],[-103.0425029999999,76.406372000000033],[-103.098343,76.384720000000016],[-103.17250099999995,76.362762000000032],[-103.20472699999993,76.354705999999965],[-103.281387,76.336929000000112],[-103.37805200000003,76.325546000000088],[-103.55444299999999,76.310257000000036],[-103.70056199999993,76.304152999999985],[-103.75195299999996,76.303589000000045],[-103.848343,76.310257000000036],[-104.06194299999993,76.317490000000021],[-104.11165599999998,76.316376000000048],[-104.33500699999996,76.318603999999993],[-104.37888299999992,76.323317999999972],[-104.396118,76.327774000000034],[-104.40471599999995,76.333328000000051],[-104.404449,76.334427000000005],[-104.38971700000002,76.342758000000117],[-104.37581599999993,76.348328000000038],[-104.362213,76.352202999999975],[-104.34333799999996,76.354156000000103],[-104.32972699999999,76.358032000000037],[-104.328056,76.363876000000005],[-104.39111300000002,76.461105000000032],[-104.43388399999998,76.484984999999995],[-104.44888300000002,76.491089000000045],[-104.47332799999998,76.49331699999999],[-104.48249800000002,76.490540000000124],[-104.48361199999999,76.485808999999961],[-104.49749800000001,76.481093999999928],[-104.52278100000001,76.480545000000006],[-104.56388900000002,76.482208000000128],[-104.65888999999987,76.545822000000044],[-104.66583300000002,76.551651000000049],[-104.63722200000001,76.603317000000118],[-104.56304899999998,76.612761999999975],[-104.53666699999997,76.617203000000075],[-104.445267,76.635818000000029],[-104.40666199999987,76.645538000000101],[-104.37416100000002,76.655823000000055],[-104.35193600000002,76.660263000000043],[-104.31500199999994,76.663879000000122],[-104.26750199999998,76.667206000000022],[-104.21665999999999,76.668320000000051],[-104.13417099999998,76.669434000000024],[-104.05332899999996,76.664703000000088],[-104.031113,76.661652000000061],[-103.96333299999998,76.649994000000049],[-103.93971299999998,76.644714000000135],[-103.926941,76.638046000000145],[-103.9225009999999,76.633605999999986],[-103.92610200000001,76.621918000000107],[-103.93831599999999,76.610535000000141],[-103.95861799999994,76.599152000000117],[-104.02778599999988,76.579162999999994],[-104.051941,76.568878000000041],[-104.05387899999999,76.563034000000073]],[[-98.418059999999912,76.668320000000051],[-98.403885000000002,76.661377000000016],[-98.413939999999911,76.647491000000059],[-98.423606999999947,76.641486999999927],[-98.425780999999972,76.63848900000005],[-98.425277999999992,76.63564300000013],[-98.429169000000002,76.626922999999977],[-98.419723999999917,76.622482000000048],[-98.376099000000011,76.611923000000047],[-98.357773000000009,76.608321999999987],[-98.281386999999995,76.602203000000145],[-98.180557000000022,76.586929000000055],[-98.189712999999983,76.580276000000083],[-98.242766999999958,76.571655000000135],[-98.258621000000005,76.573318000000086],[-98.278335999999967,76.581100000000049],[-98.298339999999996,76.585266000000104],[-98.319457999999997,76.58859300000006],[-98.362502999999947,76.593323000000112],[-98.395554000000004,76.594437000000084],[-98.40194699999995,76.591934000000094],[-98.398894999999925,76.581375000000037],[-98.378051999999968,76.572220000000016],[-98.357773000000009,76.565536000000122],[-98.322784000000013,76.561096000000134],[-98.080565999999976,76.531097000000102],[-97.944442999999978,76.518051000000128],[-97.897780999999895,76.515823000000012],[-97.807770000000005,76.514435000000105],[-97.764450000000011,76.510544000000039],[-97.750290000000007,76.506942999999978],[-97.693328999999949,76.487762000000089],[-97.684722999999963,76.47164900000007],[-97.662215999999944,76.425261999999975],[-97.662505999999894,76.419434000000081],[-97.670273000000009,76.414992999999981],[-97.706954999999937,76.405548000000067],[-97.718886999999995,76.40109300000006],[-97.727218999999991,76.395537999999988],[-97.731673999999998,76.38998400000014],[-97.761397999999986,76.334991000000002],[-97.728881999999999,76.282760999999994],[-97.726104999999905,76.278320000000065],[-97.699432000000002,76.266663000000108],[-97.64805599999994,76.250275000000045],[-97.610549999999989,76.242203000000075],[-97.591674999999952,76.23692299999999],[-97.575561999999991,76.231369000000029],[-97.523055999999997,76.205826000000116],[-97.516952999999944,76.199997000000053],[-97.509170999999981,76.188873000000001],[-97.494994999999903,76.148880000000133],[-97.494445999999868,76.138885000000073],[-97.503066999999874,76.127472000000068],[-97.517776000000026,76.119141000000127],[-97.542496000000028,76.108322000000101],[-97.563323999999966,76.097487999999998],[-97.588333000000034,76.080826000000002],[-97.656386999999938,75.972762999999986],[-97.647507000000019,75.944427000000076],[-97.64555399999989,75.938873000000058],[-97.642226999999934,75.9327550000001],[-97.612503000000004,75.901932000000102],[-97.597778000000005,75.889434999999935],[-97.597778000000005,75.846939000000134],[-97.654174999999896,75.798324999999977],[-97.664169000000015,75.793320000000108],[-97.693603999999993,75.785812000000078],[-97.707503999999972,75.783324999999991],[-97.837219000000005,75.765549000000021],[-97.913329999999974,75.751663000000065],[-97.930557000000022,75.746933000000013],[-97.938598999999954,75.741364000000033],[-97.870543999999938,75.73054499999995],[-97.827224999999885,75.726929000000098],[-97.690276999999867,75.720535000000041],[-97.425551999999982,75.692200000000071],[-97.404448999999943,75.68803400000013],[-97.386672999999973,75.682754999999986],[-97.375823999999852,75.676376000000118],[-97.369995000000017,75.670822000000101],[-97.368606999999997,75.659424000000115],[-97.369155999999975,75.653320000000065],[-97.384734999999978,75.643326000000059],[-97.394454999999937,75.638321000000019],[-97.410003999999958,75.620818999999983],[-97.41194200000001,75.61554000000001],[-97.423889000000031,75.528595000000053],[-97.422501000000011,75.506377999999984],[-97.417495999999971,75.494705000000124],[-97.401397999999858,75.458602999999982],[-97.398055999999997,75.45248400000014],[-97.378326000000015,75.43414300000012],[-97.349730999999963,75.419983000000002],[-97.330565999999919,75.414153999999996],[-97.293883999999991,75.405548000000067],[-97.285003999999958,75.402205999999978],[-97.280837999999903,75.396941999999967],[-97.293334999999956,75.390823000000125],[-97.305557000000022,75.390274000000034],[-97.320557000000008,75.391098],[-97.341675000000009,75.393875000000094],[-97.441665999999998,75.414992999999981],[-97.469161999999983,75.422760000000096],[-97.484160999999915,75.429428000000087],[-97.49610899999999,75.442200000000071],[-97.49888599999997,75.469986000000006],[-97.496658000000025,75.478592000000106],[-97.573623999999882,75.513046000000145],[-97.711944999999901,75.566666000000055],[-97.728881999999999,75.570267000000058],[-97.744155999999975,75.571106000000043],[-97.762511999999958,75.568054000000132],[-97.818061999999884,75.54898100000014],[-97.827552999999909,75.545815000000005],[-97.827056999999911,75.539817999999968],[-97.821724000000017,75.537323000000129],[-97.811561999999924,75.535156000000029],[-97.802054999999996,75.53532400000006],[-97.801940999999999,75.524429000000112],[-97.789992999999924,75.51887499999998],[-97.774169999999913,75.508331000000112],[-97.758895999999993,75.496643000000063],[-97.748046999999872,75.484421000000111],[-97.744720000000029,75.478317000000061],[-97.743332000000009,75.471924000000115],[-97.745269999999948,75.466660000000104],[-97.756392999999946,75.462204000000042],[-97.783324999999877,75.45748900000001],[-97.80749499999996,75.456650000000025],[-97.835830999999985,75.460815000000025],[-97.840835999999854,75.464996000000099],[-97.845001000000025,75.469986000000006],[-97.855674999999906,75.484482000000014],[-97.85600299999993,75.487488000000042],[-97.858001999999885,75.494644000000051],[-97.859169000000009,75.497985999999969],[-97.86983499999991,75.501160000000084],[-97.882338999999945,75.503494000000103],[-97.90834000000001,75.513321000000133],[-97.932495000000017,75.512496999999996],[-97.951950000000011,75.507492000000127],[-98.041672000000005,75.483322000000101],[-98.043335000000013,75.481368999999972],[-97.985549999999989,75.457214000000135],[-97.957503999999915,75.44720499999994],[-97.933318999999983,75.448029000000133],[-97.911117999999931,75.446090999999967],[-97.782776000000013,75.428314000000114],[-97.774718999999948,75.423035000000141],[-97.793610000000001,75.413040000000024],[-97.808608999999933,75.408875000000023],[-97.934432999999899,75.407486000000063],[-97.984726000000023,75.408875000000023],[-98.004729999999881,75.413605000000075],[-98.028060999999923,75.413879000000009],[-98.019890000000032,75.407042999999987],[-98.028724999999895,75.404541000000108],[-98.032386999999915,75.400879000000145],[-98.029556000000014,75.398375999999985],[-98.021225000000015,75.39521000000002],[-97.96055599999994,75.384720000000016],[-97.920272999999952,75.38081399999993],[-97.901397999999915,75.379974000000061],[-97.884445000000028,75.376373000000058],[-97.872771999999998,75.37081900000004],[-97.876662999999894,75.364990000000034],[-97.887786999999946,75.360535000000027],[-97.910277999999948,75.356644000000131],[-97.926392000000021,75.35554500000012],[-97.990554999999972,75.355819999999994],[-98.042769999999962,75.35914600000001],[-98.070107000000007,75.364700000000028],[-98.070769999999982,75.367088000000081],[-98.074112000000014,75.369033999999942],[-98.082779000000016,75.370033000000035],[-98.107772999999895,75.371917999999994],[-98.124709999999993,75.367202999999961],[-98.136397999999986,75.361923000000104],[-98.141953000000001,75.356644000000131],[-98.153610000000015,75.345535000000041],[-98.165282999999988,75.334152000000017],[-98.164718999999934,75.329163000000051],[-98.129165999999998,75.30192599999998],[-98.120543999999995,75.297760000000039],[-98.101395000000025,75.291931000000034],[-98.064712999999927,75.285812000000021],[-97.913054999999986,75.264159999999947],[-97.87388599999997,75.270263999999997],[-97.755843999999911,75.229431000000091],[-97.74360699999994,75.224991000000102],[-97.735001000000011,75.207214000000022],[-97.736937999999952,75.204437000000098],[-97.759734999999978,75.188582999999994],[-97.676940999999999,75.164154000000053],[-97.62860099999989,75.151093000000117],[-97.602492999999924,75.147217000000069],[-97.597503999999958,75.149155000000007],[-97.605834999999956,75.158325000000048],[-97.614440999999886,75.162766000000147],[-97.613051999999982,75.164703000000031],[-97.597778000000005,75.164703000000031],[-97.578613000000018,75.15887500000008],[-97.567779999999971,75.152481000000023],[-97.567504999999926,75.147491000000002],[-97.582503999999915,75.137496999999996],[-97.619445999999925,75.118590999999924],[-97.639998999999989,75.116379000000052],[-97.746947999999975,75.111649000000057],[-97.843886999999938,75.110260000000039],[-97.86250299999989,75.111099000000024],[-97.881377999999927,75.11692800000003],[-98.024719000000005,75.162490999999932],[-98.033614999999998,75.17164600000001],[-98.034438999999963,75.181656000000089],[-98.02694699999995,75.187195000000088],[-98.02027899999996,75.196640000000002],[-98.019164999999987,75.201096000000064],[-98.025833000000034,75.210815000000082],[-98.041381999999885,75.216385000000002],[-98.061661000000015,75.22026100000005],[-98.085281000000009,75.2227630000001],[-98.098617999999931,75.2227630000001],[-98.146666999999866,75.180816999999934],[-98.146666999999866,75.163879000000065],[-98.145553999999947,75.159987999999998],[-98.136123999999995,75.154160000000047],[-98.121384000000035,75.147491000000002],[-98.081389999999999,75.130538999999999],[-98.039169000000015,75.116379000000052],[-98.025557999999933,75.113601999999958],[-98.00306699999993,75.112761999999918],[-97.981673999999941,75.110809000000017],[-97.966949,75.104155999999989],[-97.947219999999902,75.079987000000074],[-97.938888999999904,75.069716999999969],[-97.938598999999954,75.064986999999917],[-97.945830999999998,75.026657],[-97.949996999999996,75.021103000000039],[-97.960006999999905,75.017487000000131],[-97.982497999999907,75.015273999999977],[-98.00306699999993,75.015549000000021],[-98.02027899999996,75.018326000000116],[-98.108886999999982,75.022491000000116],[-98.259170999999924,75.022766000000104],[-98.276947000000007,75.022217000000012],[-98.300277999999935,75.021103000000039],[-98.369719999999973,75.014435000000049],[-98.444442999999978,75.004990000000134],[-98.46833799999996,75.003052000000025],[-98.634734999999978,74.992477000000065],[-98.723891999999921,74.989426000000037],[-98.785004000000015,74.994980000000055],[-98.985001000000011,75.000000000000114],[-99.066955999999948,74.996368000000132],[-99.354445999999882,74.984420999999998],[-99.376662999999951,74.98553499999997],[-99.394164999999987,74.988037000000077],[-99.406113000000005,74.993316999999934],[-99.393615999999952,75.027205999999978],[-99.387512000000015,75.03776600000009],[-99.335555999999997,75.070541000000105],[-99.299437999999952,75.092758000000003],[-99.28195199999999,75.102768000000083],[-99.27694699999995,75.108032000000094],[-99.272232000000031,75.115814000000057],[-99.281386999999995,75.122481999999991],[-99.308043999999995,75.122481999999991],[-99.325835999999924,75.11831699999999],[-99.34056099999998,75.113037000000134],[-99.445540999999935,75.058318999999983],[-99.482497999999964,75.03776600000009],[-99.496657999999968,75.026382000000012],[-99.5,75.020537999999988],[-99.496108999999933,75.014708999999982],[-99.480285999999978,75.009155000000135],[-99.445540999999935,75.003875999999991],[-99.432495000000017,75.000275000000101],[-99.42721599999993,74.996368000000132],[-99.426391999999964,74.991364000000033],[-99.538605000000018,74.974152000000004],[-99.562499999999943,74.972214000000065],[-99.602782999999988,74.971100000000035],[-99.619719999999973,74.97137500000008],[-99.701675000000023,74.973602000000142],[-99.990554999999915,74.984420999999998],[-100.05722000000003,74.986923000000104],[-100.14584400000001,74.991088999999988],[-100.21056399999998,74.997208000000001],[-100.25306699999993,75.002777000000037],[-100.34777799999995,75.016937000000098],[-100.36389200000002,75.021378000000027],[-100.38945000000001,75.031097000000045],[-100.39388999999994,75.037201000000039],[-100.396118,75.043594000000041],[-100.39750699999991,75.055542000000059],[-100.39723199999997,75.066666000000112],[-100.39472999999998,75.078323000000069],[-100.38583399999999,75.095535000000098],[-100.38054699999986,75.101928999999984],[-100.37805200000003,75.113311999999951],[-100.39806399999998,75.158600000000092],[-100.41221599999994,75.16804500000012],[-100.43250299999994,75.173598999999967],[-100.45333900000003,75.177200000000028],[-100.47693599999997,75.179428000000144],[-100.51112399999994,75.184143000000006],[-100.52834300000001,75.187759000000028],[-100.54444899999993,75.193039000000113],[-100.54695099999998,75.199417000000096],[-100.53859699999998,75.204711999999972],[-100.46333299999998,75.223602000000085],[-100.43859900000001,75.226653999999996],[-100.41722099999998,75.227478000000133],[-100.32528699999995,75.230545000000063],[-100.30222299999997,75.230820000000108],[-100.27999899999998,75.22886699999998],[-100.24833699999999,75.223877000000073],[-100.22556299999997,75.223037999999974],[-100.031387,75.226929000000041],[-100.00778200000002,75.228043000000014],[-99.990554999999915,75.231369000000029],[-99.987777999999992,75.236099000000081],[-99.995269999999948,75.239975000000129],[-100.00945300000001,75.242203000000075],[-100.11945300000002,75.248596000000077],[-100.20333900000003,75.253326000000072],[-100.22609699999998,75.254165999999941],[-100.314438,75.250824000000023],[-100.35417200000001,75.251663000000008],[-100.37554899999986,75.255264000000011],[-100.39388999999994,75.260269000000108],[-100.406113,75.266663000000108],[-100.40278599999999,75.272491000000059],[-100.33444199999991,75.274428999999998],[-100.31166100000002,75.277206000000092],[-100.29387700000001,75.281371999999976],[-100.279449,75.286652000000061],[-100.25805700000001,75.297760000000039],[-100.24445299999996,75.308868000000018],[-100.25723299999993,75.313308999999947],[-100.28222699999992,75.310257000000036],[-100.33277900000002,75.302200000000084],[-100.35944399999994,75.299712999999997],[-100.49999999999989,75.292480000000012],[-100.52306399999998,75.293045000000006],[-100.60888699999998,75.305817000000047],[-100.62249799999995,75.309143000000063],[-100.76555599999989,75.34637500000008],[-100.77887699999991,75.35054000000008],[-100.76888999999994,75.355255000000113],[-100.67639199999996,75.376648000000046],[-100.65222199999999,75.378585999999984],[-100.63305700000001,75.378036000000122],[-100.61805700000002,75.376648000000046],[-100.60221899999993,75.373596000000134],[-100.61833199999995,75.368866000000082],[-100.64389,75.364700000000028],[-100.67999299999997,75.361923000000104],[-100.69833399999993,75.356644000000131],[-100.68222000000003,75.350266000000147],[-100.63806199999999,75.345825000000048],[-100.61472299999997,75.346100000000092],[-100.59472699999998,75.347487999999998],[-100.44748699999991,75.369980000000055],[-100.43277,75.375259000000028],[-100.42832899999991,75.380539000000113],[-100.44055200000003,75.386658000000125],[-100.56527699999998,75.422211000000004],[-100.58444199999997,75.426376000000005],[-100.60694899999999,75.42804000000001],[-100.67555199999993,75.426926000000037],[-100.71694899999989,75.429153000000099],[-100.72305299999999,75.432479999999998],[-100.69776899999999,75.436371000000065],[-100.67331699999994,75.438582999999937],[-100.43388399999998,75.445815999999979],[-100.33972199999999,75.447479000000101],[-100.27084400000001,75.448593000000074],[-100.17666600000001,75.449141999999995],[-100.11138899999997,75.451096000000007],[-100.06276700000001,75.454437000000041],[-100.01194800000002,75.461380000000077],[-100.00917099999992,75.466095000000109],[-100.01944700000001,75.468596999999988],[-100.10056299999997,75.470535000000098],[-100.19193999999999,75.467758000000003],[-100.21528599999988,75.467758000000003],[-100.30695300000002,75.47164900000007],[-100.30555699999996,75.473602000000028],[-100.12999000000002,75.525818000000129],[-100.03415699999988,75.529433999999981],[-99.966948999999943,75.533325000000048],[-99.845000999999968,75.540817000000004],[-99.831389999999999,75.544144000000131],[-99.832229999999981,75.545532000000037],[-99.845000999999968,75.547484999999995],[-99.856383999999991,75.548035000000027],[-99.899993999999992,75.547484999999995],[-99.946655000000021,75.544708000000071],[-99.990279999999984,75.544434000000138],[-100.03859699999998,75.549149],[-100.03943600000002,75.554152999999985],[-100.02806099999998,75.557205000000067],[-99.823623999999938,75.58415199999996],[-99.800551999999925,75.586655000000121],[-99.756393000000003,75.588043000000027],[-99.736938000000009,75.587204000000099],[-99.712508999999955,75.589157000000057],[-99.672774999999945,75.606094000000041],[-99.667770000000019,75.611099000000081],[-99.685821999999973,75.613876000000005],[-99.790833000000021,75.616653000000099],[-99.84056099999998,75.612488000000099],[-99.863051999999982,75.614426000000037],[-99.862503000000004,75.618866000000025],[-99.823623999999938,75.651657],[-99.817504999999926,75.655258000000003],[-99.788054999999929,75.658324999999934],[-99.458617999999944,75.672485000000052],[-99.226669000000015,75.675537000000134],[-99.202498999999989,75.675537000000134],[-99.083617999999944,75.675812000000008],[-99.033066000000019,75.677200000000084],[-98.982773000000009,75.681090999999981],[-98.929717999999923,75.686371000000008],[-98.905562999999916,75.689972000000068],[-98.889998999999989,75.695251000000042],[-98.891388000000006,75.699141999999938],[-98.907775999999956,75.704712000000029],[-98.925827000000027,75.707489000000123],[-98.950286999999889,75.709991000000002],[-98.97193900000002,75.710266000000047],[-99.329453000000001,75.695251000000042],[-99.55749499999996,75.691925000000026],[-99.619995000000017,75.694138000000009],[-99.643889999999999,75.694138000000009],[-99.740828999999906,75.690811000000053],[-99.84973100000002,75.677475000000072],[-100.031677,75.664428999999984],[-100.256393,75.651657],[-100.37332199999997,75.654709000000082],[-100.39723199999997,75.654434000000037],[-100.54028299999993,75.645537999999931],[-100.62888299999997,75.634720000000129],[-100.65416699999997,75.631653000000028],[-100.80471799999998,75.614990000000148],[-100.82972699999999,75.61303700000002],[-101.22556299999991,75.587494000000106],[-101.24916100000002,75.587204000000099],[-101.30638099999999,75.591094999999996],[-101.37721299999993,75.59887700000013],[-101.38806199999999,75.60026600000009],[-101.47165699999999,75.602203000000145],[-101.4955369999999,75.601929000000041],[-101.74944299999999,75.574432000000058],[-101.89835399999998,75.556091000000094],[-101.97250399999996,75.548325000000034],[-101.99638399999998,75.547211000000061],[-102.06723,75.546097000000088],[-102.13639799999993,75.553314],[-102.15915699999999,75.554977000000122],[-102.20667300000002,75.553314],[-102.35193599999997,75.542206000000022],[-102.39916999999997,75.537200999999982],[-102.44860799999998,75.530547999999953],[-102.49916099999996,75.521103000000096],[-102.53415699999999,75.511383000000023],[-102.67304999999999,75.514709000000039],[-102.86694299999999,75.601089000000002],[-102.87805200000003,75.607758000000047],[-102.88194299999992,75.613312000000064],[-102.88390400000003,75.61914100000007],[-102.87777699999992,75.624695000000031],[-102.86054999999999,75.62831100000011],[-102.8125,75.631088000000034],[-102.79305999999991,75.630539000000056],[-102.70140100000003,75.628860000000032],[-102.68916299999995,75.670532000000094],[-102.58168000000001,75.71276899999998],[-102.56360599999999,75.718322999999998],[-102.53888699999993,75.72137499999991],[-102.37748699999992,75.729155999999989],[-102.35193599999997,75.729155999999989],[-102.31139400000001,75.72665400000011],[-102.26390100000003,75.721924000000058],[-102.16832699999992,75.709152000000074],[-102.15416700000003,75.706100000000106],[-102.07861300000002,75.688309000000004],[-102.05776999999995,75.690811000000053],[-102.03666699999997,75.694138000000009],[-102.01862299999999,75.699416999999983],[-102.00917099999998,75.703048999999908],[-102.00805700000001,75.704987000000074],[-102.09166699999997,75.721924000000058],[-102.120003,75.776382000000012],[-102.10185200000001,75.784247999999991],[-102.09361299999989,75.791091999999992],[-102.112213,75.793594000000041],[-102.23277299999995,75.786652000000117],[-102.28222700000003,75.781937000000084],[-102.32668299999995,75.779983999999956],[-102.34388699999994,75.781937000000084],[-102.36609599999997,75.789978000000019],[-102.37165800000002,75.795821999999987],[-102.37332200000003,75.801650999999993],[-102.37082700000002,75.807480000000055],[-102.36250299999995,75.818054000000075],[-102.33944700000001,75.834991000000059],[-102.31667299999998,75.846649000000127],[-102.29028299999993,75.857208000000128],[-102.26640299999997,75.86192299999999],[-102.16306299999997,75.878860000000032],[-102.13806199999993,75.881087999999977],[-101.864441,75.902206000000035],[-101.82640099999992,75.898331000000042],[-101.80526700000001,75.891937000000041],[-101.79943800000001,75.886658000000068],[-101.77194199999997,75.868590999999981],[-101.74833699999999,75.859146000000067],[-101.74109599999991,75.856934000000024],[-101.55638099999987,75.821105999999986],[-101.47028399999999,75.772217000000012],[-101.46888699999994,75.766388000000006],[-101.45973199999997,75.761107999999922],[-101.43859900000001,75.755554000000132],[-101.41416899999996,75.752487000000031],[-101.301941,75.746094000000085],[-101.254997,75.744705000000067],[-101.24416400000001,75.746933000000013],[-101.23388699999998,75.751389000000131],[-101.20249899999993,75.767211999999972],[-101.18221999999997,75.779709000000139],[-101.23110999999994,75.777205999999978],[-101.328056,75.774429000000055],[-101.34777799999995,75.774994000000106],[-101.35555999999991,75.779433999999924],[-101.35861199999999,75.784988000000112],[-101.35193599999991,75.790543000000014],[-101.34137699999997,75.796097000000032],[-101.326683,75.801650999999993],[-101.323624,75.807480000000055],[-101.32501200000002,75.813309000000061],[-101.33500700000002,75.825272000000098],[-101.34056099999992,75.830276000000026],[-101.35637700000001,75.843048000000067],[-101.36389199999996,75.8477630000001],[-101.37805199999997,75.851928999999984],[-101.39277600000003,75.854431000000034],[-101.40833999999995,75.855820000000051],[-101.42388900000003,75.856369000000029],[-101.48889199999996,75.854156000000046],[-101.52694699999995,75.85832199999993],[-101.537216,75.861374000000069],[-101.54638699999992,75.867477000000008],[-101.57917799999996,75.908600000000092],[-101.56500199999988,75.929703000000018],[-101.49665800000002,75.954987000000017],[-101.47778299999999,75.96026599999999],[-101.45221700000002,75.963608000000079],[-101.39417299999997,75.97554000000008],[-101.30915800000002,76.008330999999998],[-101.30277999999987,76.013046000000031],[-101.31582599999996,76.019150000000025],[-101.33556399999992,76.020827999999995],[-101.36971999999992,76.016937000000098],[-101.38249200000001,76.010818000000086],[-101.39195299999989,76.000549000000035],[-101.40833999999995,75.995529000000147],[-101.61721799999998,75.980820000000108],[-101.641953,75.979705999999965],[-101.67832900000002,75.979705999999965],[-101.68388399999998,75.980270000000075],[-101.728882,75.987488000000099],[-101.80638099999999,76.007492000000013],[-101.83249699999999,76.016662999999994],[-101.84889199999992,76.024704000000042],[-101.89362299999993,76.060257000000092],[-101.90055799999999,76.066666000000112],[-101.90722700000003,76.078598000000056],[-101.90862299999998,76.084427000000062],[-101.90750099999997,76.096100000000092],[-101.90222199999999,76.107757999999933],[-101.88861099999991,76.119141000000127],[-101.761124,76.174148999999943],[-101.71140300000002,76.184708000000001],[-101.685272,76.187759000000028],[-101.60833699999995,76.194427000000019],[-101.53362299999998,76.205261000000064],[-101.48860200000001,76.213608000000022],[-101.46556099999998,76.218872000000033],[-101.39611799999989,76.243317000000047],[-101.38500999999997,76.248871000000065],[-101.387787,76.251937999999996],[-101.44193999999993,76.241653000000042],[-101.49694799999992,76.233871000000079],[-101.69888299999997,76.219437000000084],[-101.74973299999999,76.215820000000122],[-101.77471899999995,76.215546000000018],[-102.051941,76.213608000000022],[-102.11444099999994,76.215546000000018],[-102.13305699999989,76.219986000000006],[-102.14835399999998,76.226653999999996],[-102.16583300000002,76.238312000000008],[-102.15972899999997,76.243042000000059],[-102.13362100000001,76.246368000000075],[-102.08222999999998,76.250824000000023],[-102.06388899999996,76.255264000000011],[-102.05803700000001,76.259155000000078],[-102.00110599999999,76.352768000000026],[-102.029449,76.3808140000001],[-102.051941,76.38638300000008],[-102.05332900000002,76.392211999999915],[-102.05082700000003,76.398041000000148],[-102.03999299999998,76.403595000000109],[-102.01862299999999,76.409423999999944],[-101.88583399999993,76.444976999999994],[-101.86221299999994,76.450272000000041],[-101.80832699999996,76.454163000000108],[-101.78333299999991,76.454437000000041],[-101.67111199999999,76.449141999999995],[-101.45667300000002,76.436371000000065],[-101.43472300000002,76.434418000000107],[-101.41166699999997,76.430817000000047],[-101.31582599999996,76.414428999999984],[-101.30249000000003,76.408324999999991],[-101.29138199999994,76.401657],[-101.28362300000003,76.396102999999982],[-101.27667200000002,76.389435000000049],[-101.24027999999993,76.371643000000006],[-101.22805800000003,76.366928000000144],[-101.20612299999993,76.361374000000126],[-101.13694799999996,76.350815000000068],[-101.06806899999998,76.331940000000145],[-101.05832700000002,76.326935000000105],[-101.09388699999994,76.283051],[-101.00446299999993,76.237761999999975],[-100.98111,76.235260000000096],[-100.92832899999996,76.225815000000011],[-100.91000399999996,76.222213999999951],[-100.86582900000002,76.212204000000042],[-100.783073,76.191085999999984],[-100.75110599999994,76.18220500000001],[-100.71056399999998,76.166381999999999],[-100.63027999999991,76.133331000000055],[-100.43998699999992,76.105255],[-100.31582600000002,76.051376000000118],[-100.30943299999996,76.048035000000084],[-100.13166799999993,75.952484000000027],[-100.047234,75.913879000000065],[-99.982498000000021,75.890548999999908],[-99.888335999999981,75.886383000000023],[-99.753615999999909,75.906372000000147],[-99.730834999999956,75.910538000000031],[-99.71556099999998,75.916092000000049],[-99.678328999999962,75.931366000000139],[-99.587783999999999,75.94999700000011],[-99.508621000000005,75.957489000000066],[-99.483611999999937,75.958603000000039],[-99.457503999999972,75.961380000000133],[-99.442490000000021,75.965819999999951],[-99.439437999999996,75.970534999999984],[-99.45461999999992,75.974808000000053],[-99.494445999999982,75.973602000000085],[-99.657776000000013,75.961380000000133],[-99.785277999999948,75.951385000000016],[-99.811110999999983,75.948317999999915],[-99.859436000000017,75.935256999999979],[-99.86332699999997,75.935532000000023],[-99.898620999999991,75.950271999999984],[-100.07749899999999,76.038879000000122],[-100.08249699999999,76.043869000000029],[-100.09221600000001,76.054977000000008],[-100.14222699999999,76.112198000000149],[-100.15278599999994,76.132477000000108],[-100.12499999999994,76.148880000000133],[-100.10388199999994,76.153320000000008],[-100.07167099999998,76.155822999999941],[-100.031113,76.155548000000124],[-100.01139799999999,76.15387000000004],[-99.868332000000009,76.139984000000027],[-99.730834999999956,76.117477000000122],[-99.680832000000009,76.118591000000094],[-99.650832999999977,76.127472000000068],[-99.609160999999972,76.135817999999972],[-99.556106999999997,76.141663000000051],[-99.502227999999945,76.146103000000039],[-99.483062999999902,76.146942000000024],[-99.429717999999923,76.15387000000004],[-99.414444000000003,76.158325000000048],[-99.421386999999925,76.160262999999986],[-99.445267000000001,76.16137700000013],[-99.498885999999914,76.157761000000107],[-99.548888999999974,76.153320000000008],[-99.668059999999912,76.139709000000039],[-99.693054000000018,76.138596000000121],[-99.716949,76.139709000000039],[-99.874434999999892,76.17053199999998],[-99.915833000000021,76.180267000000072],[-99.948882999999967,76.189697000000137],[-100.15028399999994,76.1933140000001],[-100.17832900000002,76.19081100000011],[-100.20140099999998,76.189972000000012],[-100.22556299999997,76.19081100000011],[-100.43888900000002,76.212494000000049],[-100.47222899999991,76.226378999999952],[-100.49861099999998,76.237761999999975],[-100.51278699999989,76.249146000000053],[-100.514183,76.254166000000112],[-100.51112399999994,76.259720000000129],[-100.49944299999999,76.26527400000009],[-100.465012,76.274993999999992],[-100.43804899999998,76.278870000000097],[-100.41665599999999,76.280272999999966],[-100.36638600000003,76.281661999999983],[-100.26917300000002,76.278595000000053],[-100.18276999999995,76.270828000000108],[-100.111107,76.266388000000063],[-99.895553999999947,76.274703999999986],[-99.86999499999996,76.275817999999958],[-99.844727000000034,76.280272999999966],[-99.848617999999931,76.283874999999966],[-100.03859699999998,76.318878000000097],[-100.27722199999994,76.378585999999984],[-100.30166600000001,76.382750999999985],[-100.32362399999994,76.384155000000135],[-100.35056299999991,76.384430000000009],[-100.37444299999999,76.382750999999985],[-100.48137700000001,76.373871000000122],[-100.55332899999996,76.371094000000028],[-100.67360699999995,76.371917999999994],[-100.69444299999998,76.374985000000095],[-100.95249899999999,76.474700999999982],[-100.97222899999997,76.485260000000039],[-100.98388699999992,76.494430999999963],[-100.98554999999993,76.499145999999996],[-100.98249800000002,76.504990000000021],[-100.962784,76.510268999999994],[-100.93943799999988,76.514435000000105],[-100.89277600000003,76.519440000000145],[-100.82972699999999,76.519714000000079],[-100.80526700000001,76.522217000000069],[-100.737213,76.531097000000102],[-100.72083999999995,76.546097000000032],[-100.72341899999998,76.551094000000148],[-100.72332799999992,76.556091000000038],[-100.71250899999995,76.560531999999967],[-100.65306099999992,76.576385000000016],[-100.45861799999994,76.613602000000014],[-100.383827,76.627502000000106],[-100.36389200000002,76.631087999999977],[-100.318893,76.635544000000095],[-100.21665999999988,76.643051000000014],[-100.19193999999999,76.642212000000086],[-100.05222300000003,76.631363000000022],[-99.981673999999998,76.622207999999944],[-99.911117999999988,76.61303700000002],[-99.885009999999909,76.610535000000141],[-99.837783999999886,76.608596999999975],[-99.811385999999914,76.609710999999947],[-99.796111999999994,76.613875999999948],[-99.795272999999952,76.618317000000047],[-99.770554000000004,76.627762000000132],[-99.741942999999992,76.632751000000098],[-99.725829999999917,76.634720000000129],[-99.684433000000013,76.633331000000112],[-99.588333000000034,76.623871000000065],[-99.569457999999997,76.620529000000147],[-99.366942999999935,76.526382000000069],[-99.256957999999941,76.470535000000098],[-99.260559000000001,76.464706000000092],[-99.255279999999914,76.453598000000056],[-99.184433000000013,76.415817000000118],[-99.163619999999923,76.409149000000127],[-99.12332200000003,76.400818000000015],[-99.099990999999989,76.398041000000148],[-99.079726999999991,76.397217000000012],[-99.066101000000003,76.398605000000089],[-99.06639100000001,76.404434000000094],[-99.083617999999944,76.416092000000106],[-99.110001000000011,76.426650999999993],[-99.118332000000009,76.433044000000109],[-99.137221999999952,76.451934999999992],[-99.133895999999993,76.456650000000025],[-99.122498000000007,76.461105000000032],[-98.994155999999975,76.471099999999922],[-98.980834999999956,76.47164900000007],[-98.955276000000026,76.469147000000021],[-98.946945000000028,76.463042999999971],[-98.948043999999925,76.45277399999992],[-98.950286999999889,76.446365000000071],[-98.943603999999993,76.440811000000053],[-98.925827000000027,76.43609600000002],[-98.906386999999881,76.433318999999983],[-98.882767000000001,76.431366000000025],[-98.857773000000009,76.431366000000025],[-98.846114999999998,76.43609600000002],[-98.856110000000001,76.463882000000126],[-98.865279999999927,76.469147000000021],[-98.898620999999991,76.481093999999928],[-98.953888000000006,76.499145999999996],[-99.038054999999986,76.529708999999968],[-99.050551999999982,76.536102000000142],[-99.051940999999999,76.539978000000019],[-99.027221999999938,76.601088999999945],[-98.999160999999958,76.604980000000012],[-98.971663999999976,76.607758000000047],[-98.86082499999992,76.61442599999998],[-98.714721999999938,76.614150999999993],[-98.611114999999984,76.610260000000096],[-98.589172000000019,76.611374000000069],[-98.56639100000001,76.613602000000014],[-98.538894999999968,76.616379000000109],[-98.518065999999976,76.621368000000075],[-98.511123999999995,76.625259000000142],[-98.489731000000006,76.644707000000096],[-98.48832699999997,76.650818000000015],[-98.546951000000035,76.658035000000098],[-98.591109999999901,76.661652000000061],[-98.595000999999968,76.659424000000115],[-98.592498999999975,76.653870000000097],[-98.598617999999988,76.651093000000003],[-98.623046999999872,76.647217000000126],[-98.674438000000009,76.64387499999998],[-98.744445999999982,76.64387499999998],[-98.814163000000008,76.653595000000053],[-98.851105000000018,76.661652000000061],[-98.857773000000009,76.663879000000122],[-98.855834999999956,76.67025799999999],[-98.852492999999924,76.671646000000067],[-98.821395999999936,76.676925999999924],[-98.733611999999994,76.682754999999986],[-98.712509000000011,76.683044000000052],[-98.504729999999938,76.681090999999924],[-98.480285999999921,76.679152999999985],[-98.439986999999974,76.673035000000084],[-98.418059999999912,76.668320000000051]],[[-99.996947999999975,76.734420999999998],[-99.976395000000025,76.733597000000032],[-99.86999499999996,76.736374000000126],[-99.819457999999884,76.738312000000064],[-99.748336999999992,76.74275200000011],[-99.720839999999953,76.74581900000004],[-99.693877999999984,76.747756999999979],[-99.646392999999989,76.748031999999967],[-99.622498000000007,76.7452550000001],[-99.528884999999946,76.72554000000008],[-99.447768999999994,76.706100000000106],[-99.430556999999965,76.699416999999926],[-99.433883999999978,76.69470200000012],[-99.52806099999998,76.67442299999999],[-99.556106999999997,76.670532000000094],[-99.581680000000006,76.67025799999999],[-99.626937999999996,76.673035000000084],[-99.657776000000013,76.677765000000079],[-99.733321999999987,76.702484000000027],[-99.888389999999902,76.718651000000136],[-99.900222999999926,76.72015399999998],[-99.915557999999976,76.72015399999998],[-100.01112399999988,76.719147000000135],[-100.02999899999992,76.715820000000008],[-100.05139200000002,76.715546000000074],[-100.09750400000001,76.717209000000025],[-100.12138399999998,76.719711000000075],[-100.128601,76.721924000000058],[-100.12805199999997,76.723038000000031],[-100.10193599999997,76.744705000000067],[-100.08277899999996,76.748031999999967],[-100.05526700000001,76.75082400000008],[-100.03778099999988,76.751389000000131],[-99.999434999999949,76.751099000000067],[-99.972228999999913,76.747208000000001],[-99.975006000000008,76.742477000000065],[-99.994155999999975,76.739151000000049],[-100.004997,76.735535000000027],[-99.996947999999975,76.734420999999998]],[[-120.88362100000001,76.739700000000028],[-120.886124,76.728591999999992],[-120.90334299999995,76.723876999999959],[-120.94499199999996,76.717758000000117],[-120.97000100000002,76.716660000000047],[-121.09084299999989,76.71887200000009],[-121.11749299999991,76.719711000000075],[-121.16000400000001,76.723312000000135],[-121.18110699999994,76.727203000000031],[-121.18472299999991,76.731094000000098],[-121.18167099999999,76.732208000000071],[-121.15666199999998,76.733597000000032],[-121.12832600000002,76.730819999999994],[-121.083618,76.729155999999932],[-121.05972300000002,76.731369000000086],[-121.05638099999999,76.732483000000059],[-121.01806599999998,76.751389000000131],[-120.99082900000002,76.754715000000147],[-120.97833300000002,76.755264000000068],[-120.91443599999997,76.754165999999998],[-120.89083900000003,76.749710000000107],[-120.88474300000001,76.745529000000033],[-120.88362100000001,76.739700000000028]],[[-101.38054699999992,76.553588999999988],[-101.40416699999997,76.552765000000022],[-101.45388799999989,76.554153000000099],[-101.54083300000002,76.560806000000071],[-101.56471299999993,76.563599000000067],[-101.62332199999992,76.572768999999937],[-101.68831599999999,76.586380000000077],[-101.57556199999999,76.614150999999993],[-101.52194199999991,76.623871000000065],[-101.38583399999993,76.642487000000074],[-101.31777999999991,76.642761000000007],[-101.21362299999993,76.651931999999988],[-101.05999800000001,76.685805999999957],[-101.04250300000001,76.690536000000009],[-101.03943600000002,76.696365000000014],[-101.04028299999993,76.702209000000039],[-101.03307299999994,76.708038000000045],[-101.00583599999993,76.71887200000009],[-100.98361199999999,76.724700999999925],[-100.95749699999999,76.729155999999932],[-100.90249599999993,76.736374000000126],[-100.74388099999999,76.753326000000129],[-100.69193999999999,76.754715000000147],[-100.53443900000002,76.757217000000026],[-100.50917099999992,76.756378000000097],[-100.484734,76.754715000000147],[-100.26888999999989,76.737198000000092],[-100.24889400000001,76.734711000000061],[-100.25917099999998,76.728591999999992],[-100.26666299999999,76.726379000000065],[-100.29305999999997,76.721924000000058],[-100.297234,76.721924000000058],[-100.31723,76.716660000000047],[-100.48721299999988,76.684418000000051],[-100.761124,76.635818000000029],[-100.92304999999999,76.610260000000096],[-101.19275699999997,76.571381000000031],[-101.27390300000002,76.560806000000071],[-101.326683,76.556366000000082],[-101.38054699999992,76.553588999999988]],[[-89.934432999999956,76.47665400000011],[-89.978881999999999,76.469711000000132],[-89.999725000000012,76.470260999999994],[-90.040833000000021,76.476928999999927],[-90.081680000000006,76.484984999999995],[-90.151108000000022,76.504439999999988],[-90.184433000000013,76.515274000000034],[-90.21444699999995,76.528594999999996],[-90.226669000000015,76.535538000000031],[-90.412216000000001,76.636108000000036],[-90.478058000000033,76.662200999999982],[-90.504456000000005,76.675261999999918],[-90.56361400000003,76.709991000000002],[-90.573333999999988,76.715820000000008],[-90.59445199999999,76.729705999999965],[-90.600280999999939,76.734984999999995],[-90.600829999999974,76.741088999999988],[-90.599990999999989,76.746643000000006],[-90.597777999999948,76.750000000000114],[-90.58666999999997,76.761383000000137],[-90.579178000000013,76.766937000000098],[-90.57028200000002,76.771927000000005],[-90.544448999999986,76.783051000000057],[-90.510284000000013,76.793320000000108],[-90.474716000000001,76.799713000000054],[-90.230559999999969,76.828048999999965],[-90.103058000000033,76.836105000000032],[-90.025283999999999,76.839156999999943],[-89.983063000000016,76.836928999999998],[-89.927779999999984,76.828873000000101],[-89.865279999999984,76.816086000000098],[-89.825835999999981,76.806091000000038],[-89.779448999999886,76.7852630000001],[-89.673888999999974,76.737487999999928],[-89.673888999999974,76.731369000000086],[-89.687774999999988,76.708878000000084],[-89.702224999999999,76.689697000000024],[-89.729445999999996,76.673309000000017],[-89.744155999999975,76.669434000000024],[-89.768065999999976,76.668045000000006],[-89.819732999999928,76.667206000000022],[-89.837218999999891,76.663040000000137],[-89.840835999999911,76.657211000000132],[-89.862777999999992,76.60386699999998],[-89.862502999999947,76.597488000000112],[-89.858336999999949,76.591094999999939],[-89.817504999999983,76.546936000000017],[-89.794448999999929,76.533325000000048],[-89.756119000000012,76.524703999999929],[-89.721663999999976,76.519714000000079],[-89.699157999999954,76.516936999999984],[-89.684433000000013,76.511658000000011],[-89.671386999999982,76.504166000000055],[-89.673888999999974,76.502212999999927],[-89.757507000000032,76.486099000000024],[-89.783614999999884,76.483047000000056],[-89.934432999999956,76.47665400000011]],[[-108.65110800000002,76.813599000000011],[-108.65110800000002,76.808868000000075],[-108.65527299999991,76.803863999999976],[-108.67804699999999,76.784988000000112],[-108.68443299999996,76.780548000000067],[-108.69055200000003,76.774429000000055],[-108.69249000000002,76.769989000000066],[-108.68831599999999,76.766098],[-108.67971799999992,76.763321000000076],[-108.66278099999994,76.761383000000137],[-108.596947,76.760818000000086],[-108.55248999999992,76.761383000000137],[-108.52722199999999,76.760268999999937],[-108.50389099999995,76.756103999999937],[-108.48889199999996,76.751663000000065],[-108.46333299999998,76.739151000000049],[-108.45500199999998,76.733322000000044],[-108.44638099999997,76.723602000000142],[-108.44220699999994,76.717758000000117],[-108.43804899999998,76.708038000000045],[-108.44193999999999,76.696365000000014],[-108.45889299999988,76.684708000000057],[-108.54472399999997,76.646378000000141],[-108.56555200000003,76.641663000000108],[-108.58667000000003,76.641663000000108],[-108.60749800000002,76.642487000000074],[-108.628601,76.645263999999997],[-108.65387699999997,76.647217000000126],[-108.68110699999994,76.647766000000047],[-108.70417799999996,76.646378000000141],[-108.72083999999995,76.642487000000074],[-108.72721899999999,76.638046000000145],[-108.72693600000002,76.634155000000078],[-108.69915800000001,76.605545000000063],[-108.69055200000003,76.600540000000024],[-108.62721299999998,76.575546000000031],[-108.61054999999993,76.569717000000026],[-108.58389299999993,76.477478000000076],[-108.58112299999999,76.439147999999989],[-108.55803699999996,76.408599999999979],[-108.475281,76.406937000000084],[-108.36389200000002,76.399994000000049],[-108.32888800000001,76.396652000000131],[-108.31861900000001,76.394150000000081],[-108.28971899999993,76.384430000000009],[-108.26917300000002,76.374985000000095],[-108.07749899999999,76.28054800000001],[-108.11472299999997,76.261383000000023],[-108.252228,76.196929999999952],[-108.33139,76.181931000000077],[-108.38027999999997,76.165268000000026],[-108.39222699999993,76.159424000000001],[-108.40862300000003,76.14776599999999],[-108.396118,76.046097000000145],[-108.35193600000002,76.048874000000069],[-108.02555799999999,76.062195000000031],[-108.00140399999998,76.063033999999959],[-107.916946,76.063033999999959],[-107.83833300000003,76.061371000000065],[-107.81220999999999,76.056090999999981],[-107.73665599999998,76.039428999999984],[-107.72471599999994,76.035538000000088],[-107.63834399999996,75.996368000000132],[-107.63249200000001,75.991088999999988],[-107.63305699999995,75.981369000000086],[-107.639183,75.976089000000002],[-107.65139799999997,75.97026100000005],[-107.78555299999999,75.919983000000116],[-107.84221599999995,75.899993999999992],[-107.90194700000001,75.896103000000096],[-107.91805999999997,75.891373000000101],[-107.93028300000003,75.885544000000039],[-108.031113,75.822495000000004],[-108.04361,75.802199999999971],[-108.02417000000003,75.783875000000023],[-108.02027900000002,75.780823000000112],[-108.00639299999995,75.779433999999924],[-107.9569469999999,75.784714000000008],[-107.91332999999986,75.789429000000041],[-107.87361099999993,75.798035000000141],[-107.82084699999996,75.829162999999994],[-107.77834300000001,75.854706000000078],[-107.75974299999996,75.869705000000124],[-107.75974299999996,75.874419999999986],[-107.739441,75.879150000000038],[-107.51555599999995,75.899993999999992],[-107.36945299999996,75.911652000000004],[-107.33750899999995,75.911377000000016],[-107.18666099999996,75.90387000000004],[-107.08000199999998,75.892761000000007],[-107.08583099999998,75.872482000000048],[-107.09028599999994,75.867477000000008],[-107.10500300000001,75.834717000000126],[-107.09805299999999,75.823043999999925],[-107.03167699999995,75.771103000000039],[-106.96362299999993,75.738586000000055],[-106.89666699999998,75.720261000000107],[-106.88027999999991,75.765822999999955],[-106.83056599999998,75.785812000000078],[-106.79444899999993,75.791656000000103],[-106.74471999999992,75.79553199999998],[-106.72277799999995,75.795821999999987],[-106.67944299999999,75.793594000000041],[-106.6558379999999,75.793594000000041],[-106.636124,75.794434000000081],[-106.61582899999996,75.797211000000004],[-106.62110899999993,75.803314000000114],[-106.6383439999999,75.806931000000077],[-106.67944299999999,75.812485000000095],[-106.72666900000002,75.813873000000001],[-106.78611799999993,75.813309000000061],[-106.829453,75.816665999999998],[-106.85082999999992,75.819992000000013],[-106.87000299999994,75.824997000000053],[-106.88890100000003,75.834717000000126],[-106.89584400000001,75.844437000000028],[-106.89666699999998,75.935256999999979],[-106.89611799999994,75.941086000000041],[-106.89334100000002,75.947478999999987],[-106.86971999999997,75.964157000000057],[-106.63890099999998,76.053040000000124],[-106.60610999999994,76.057754999999986],[-106.58583099999993,76.058593999999971],[-106.368607,76.055817000000047],[-106.33667000000003,76.054703000000075],[-106.30082699999997,76.051376000000118],[-106.01611299999996,76.019714000000022],[-105.93720999999999,76.010269000000108],[-105.89998600000001,76.005554000000075],[-105.837219,75.996932999999956],[-105.73500100000001,75.974991000000102],[-105.66832699999998,75.955551000000128],[-105.61945299999996,75.93942300000009],[-105.60637699999995,75.934708000000057],[-105.59528399999988,75.929703000000018],[-105.47888199999994,75.863036999999963],[-105.46528599999999,75.851928999999984],[-105.45333900000003,75.841659999999933],[-105.445831,75.830551000000071],[-105.40028399999989,75.694427000000076],[-105.38834399999996,75.656372000000033],[-105.391953,75.63888500000013],[-105.48750299999995,75.560806000000127],[-105.49638399999998,75.55525200000011],[-105.51666299999994,75.550537000000077],[-105.54083300000002,75.546936000000017],[-105.60444599999988,75.539978000000019],[-105.63667299999997,75.533600000000092],[-105.68582200000003,75.519440000000145],[-105.74082900000002,75.494979999999941],[-105.75140399999998,75.489700000000084],[-105.74804699999999,75.485809000000017],[-105.73693799999995,75.48275799999999],[-105.68666100000002,75.483047000000113],[-105.67166099999986,75.481093999999985],[-105.61138900000003,75.47164900000007],[-105.59277299999997,75.46748400000007],[-105.593613,75.462769000000037],[-105.64639299999993,75.365265000000022],[-105.65110799999997,75.359421000000054],[-105.66055299999994,75.349716000000114],[-105.72666900000002,75.31303400000013],[-105.7386019999999,75.309418000000051],[-105.76251199999996,75.304976999999951],[-105.79361,75.302200000000084],[-105.81304899999998,75.29942299999999],[-105.82140399999992,75.295822000000101],[-105.86694299999999,75.275818000000015],[-105.87526699999995,75.271102999999982],[-105.93776699999989,75.214432000000045],[-105.93888900000002,75.208603000000039],[-105.93582199999997,75.202774000000034],[-105.929169,75.197754000000145],[-105.89222699999999,75.190810999999997],[-105.87249800000001,75.171920999999998],[-105.876938,75.145828000000051],[-105.88527699999997,75.14027400000009],[-105.90499899999998,75.136383000000023],[-105.92582699999997,75.135268999999994],[-106.00361599999991,75.135544000000039],[-106.01889,75.133881000000088],[-106.07028200000002,75.106644000000017],[-106.07945299999989,75.096939000000077],[-106.07333399999993,75.087203999999986],[-106.01862299999999,75.074158000000068],[-106.00446299999999,75.068054000000018],[-105.99416399999996,75.062195000000031],[-105.99333199999995,75.055817000000047],[-106.011124,75.050812000000008],[-106.23528299999998,75.021378000000027],[-106.26000999999997,75.019150000000081],[-106.45500199999992,75.005829000000119],[-106.54554699999989,75.001663000000008],[-106.564438,75.00082400000008],[-106.66332999999992,75.004165999999998],[-106.72556299999997,75.00221300000004],[-106.77111799999989,74.996643000000006],[-106.78639199999998,74.991928000000144],[-106.78307299999994,74.989975000000015],[-106.78333299999997,74.986098999999967],[-106.78582799999992,74.98054500000012],[-106.79194599999994,74.975266000000147],[-106.807503,74.969711000000075],[-106.93055699999996,74.933594000000085],[-106.97222899999997,74.926086000000055],[-107.01000999999991,74.922484999999995],[-107.05110200000001,74.921646000000067],[-107.07362399999994,74.919983000000116],[-107.16000399999996,74.910538000000088],[-107.19722000000002,74.910812000000021],[-107.21584300000001,74.911925999999994],[-107.46417199999996,74.934418000000051],[-107.506958,74.939972000000068],[-107.63082900000001,74.961104999999975],[-107.66251399999999,74.966660000000047],[-107.68804899999998,74.976379000000065],[-107.69554099999999,74.982208000000071],[-107.72389199999998,75.016388000000006],[-107.72389199999998,75.020264000000054],[-107.71972699999998,75.02609300000006],[-107.704453,75.030823000000112],[-107.68138099999999,75.042480000000012],[-107.67944299999994,75.048599000000081],[-107.68110699999994,75.05304000000001],[-107.69499199999996,75.075272000000041],[-107.70584100000002,75.086105000000032],[-107.716949,75.090820000000065],[-107.739441,75.095825000000104],[-107.75834700000001,75.096939000000077],[-107.77333099999998,75.096099999999922],[-107.78307299999994,75.093596999999988],[-107.77999899999998,75.072220000000129],[-107.77084400000001,75.06581100000011],[-107.75778200000002,75.06053199999991],[-107.74500299999994,75.054153000000042],[-107.739441,75.048874000000069],[-107.73972299999997,75.043045000000063],[-107.74388099999993,75.037201000000039],[-107.77778599999999,75.029434000000094],[-107.89499699999999,75.003601000000003],[-107.94193999999999,74.93081699999999],[-107.95527600000003,74.928589000000045],[-107.97749299999998,74.927475000000072],[-108.02417000000003,74.929152999999985],[-108.13417099999992,74.927765000000079],[-108.21083099999987,74.923599000000024],[-108.37304699999999,74.910538000000088],[-108.3916779999999,74.911377000000016],[-108.43639400000001,74.915268000000083],[-108.45500199999998,74.918319999999994],[-108.52971599999995,74.936645999999996],[-108.54110700000001,74.940536000000009],[-108.548607,74.946365000000014],[-108.54795799999999,74.951653000000022],[-108.55055199999998,74.956375000000094],[-108.55999800000001,74.960815000000139],[-108.67971799999992,74.970261000000107],[-108.781113,74.979980000000069],[-108.80721999999997,74.983597000000032],[-108.80721999999997,74.984711000000004],[-108.79611199999999,74.985809000000131],[-108.74553699999996,74.984420999999998],[-108.63890100000003,74.981094000000098],[-108.614441,74.979705999999965],[-108.55999800000001,74.976379000000065],[-108.53028899999993,74.973312000000135],[-108.51139799999999,74.97554000000008],[-108.52667199999996,75.001663000000008],[-108.53056300000003,75.005554000000075],[-108.53806299999985,75.009430000000009],[-108.628601,75.046096999999975],[-108.65139799999992,75.053863999999976],[-108.79472399999997,75.069153000000028],[-108.83249699999993,75.069992000000013],[-108.92777999999993,75.05192599999998],[-108.94972200000001,75.040267999999969],[-109.00110599999999,75.004990000000134],[-109.11971999999997,74.979430999999977],[-109.34584000000001,74.944702000000063],[-109.36416600000001,74.939697000000024],[-109.39998600000001,74.918319999999994],[-109.40722700000003,74.912490999999989],[-109.40695199999993,74.908599999999922],[-109.420547,74.893051000000014],[-109.50805700000001,74.866379000000109],[-109.52278099999995,74.863312000000008],[-109.56861900000001,74.857758000000047],[-109.58721899999995,74.856644000000017],[-109.66139199999992,74.856369000000029],[-109.76944700000001,74.859421000000111],[-109.79750099999995,74.863602000000014],[-109.81111099999993,74.868042000000059],[-109.83361799999994,74.869704999999954],[-109.87249800000001,74.869141000000013],[-109.93472300000002,74.860809000000017],[-109.95500199999987,74.857208000000014],[-109.99471999999997,74.848327999999981],[-110.01640299999991,74.842209000000082],[-110.13971700000002,74.833054000000061],[-110.30444299999994,74.846375000000023],[-110.32501200000002,74.847488000000112],[-110.34555099999989,74.846939000000134],[-110.36000100000001,74.843872000000033],[-110.37053700000001,74.839980999999966],[-110.40416699999997,74.826660000000004],[-110.39620999999994,74.813689999999951],[-110.39666699999998,74.799423000000104],[-110.43666100000002,74.793319999999937],[-110.58999599999993,74.778046000000074],[-110.59137699999997,74.724152000000061],[-110.75666799999993,74.685257000000092],[-110.77250699999996,74.680817000000047],[-110.78639199999998,74.674698000000035],[-110.79638699999998,74.668869000000029],[-110.807503,74.657486000000006],[-110.83389299999993,74.651931999999988],[-110.98111,74.621368000000132],[-111.28056300000003,74.567764000000125],[-111.38722200000001,74.563034000000073],[-111.40915699999999,74.562759000000085],[-111.43055699999996,74.560532000000023],[-111.55888399999998,74.52748100000008],[-111.64250199999992,74.501389000000017],[-111.67722300000003,74.493317000000047],[-111.700287,74.49136400000009],[-111.82389799999999,74.48332199999993],[-111.94554099999993,74.474425999999994],[-111.98416099999997,74.468872000000033],[-112.087219,74.452208999999925],[-112.29305999999991,74.427765000000022],[-112.37053699999996,74.418594000000041],[-112.43831599999999,74.414429000000041],[-112.54194599999988,74.409424000000001],[-112.75306699999993,74.401382000000012],[-112.85694899999993,74.398330999999985],[-112.91999799999991,74.397490999999945],[-113.00890400000003,74.398040999999978],[-113.25723299999993,74.405258000000117],[-113.406113,74.413315000000068],[-113.42832899999996,74.414703000000145],[-113.47168699999997,74.41891499999997],[-113.64083900000003,74.437485000000095],[-113.69638099999997,74.446091000000024],[-113.84221600000001,74.479706000000078],[-113.94167299999998,74.50360100000006],[-114.05387899999999,74.530822999999998],[-114.12110899999993,74.549987999999985],[-114.29834,74.602768000000026],[-114.34861799999999,74.618866000000082],[-114.37470999999994,74.629150000000095],[-114.39695699999993,74.639160000000004],[-114.43804899999986,74.659424000000115],[-114.44360399999994,74.664153999999996],[-114.44776899999994,74.674698000000035],[-114.42859599999991,74.691925000000026],[-114.41972399999992,74.698029000000076],[-114.40750099999997,74.704163000000108],[-114.39444700000001,74.708328000000108],[-114.21444699999995,74.755554000000132],[-114.10166899999996,74.776657000000057],[-114.01027699999992,74.790543000000071],[-113.73166699999996,74.827208999999982],[-113.71000699999996,74.829711999999915],[-113.55695300000002,74.839157],[-113.41861,74.84275800000006],[-113.28278399999999,74.848602000000085],[-113.25334199999998,74.87359600000002],[-113.22269399999988,74.896469000000025],[-113.15194699999995,74.924987999999985],[-113.1205369999999,74.932480000000112],[-113.00750699999992,74.954163000000051],[-112.91111799999987,74.970825000000048],[-112.86749299999997,74.97554000000008],[-112.84528399999994,74.976929000000098],[-112.57224299999996,74.99275200000011],[-112.52416999999991,74.995529000000033],[-112.5,74.996010000000012],[-112.453056,74.996933000000013],[-112.37444299999993,74.998321999999973],[-112.01500699999991,75.002486999999974],[-111.962219,75.001389000000074],[-111.935272,74.998871000000122],[-111.89890299999996,74.994980000000055],[-111.86527999999993,74.988312000000064],[-111.84056099999998,74.986374000000126],[-111.76444999999995,74.981659000000093],[-111.75334199999998,74.981659000000093],[-111.718613,74.986649],[-111.62666300000001,75.003875999999991],[-111.58972199999999,75.006378000000041],[-111.55139200000002,75.011383000000137],[-111.53527800000001,75.014998999999989],[-111.28971899999999,75.086105000000032],[-111.02916700000003,75.171097000000032],[-110.920547,75.223602000000085],[-110.91361999999998,75.228591999999935],[-110.91278099999994,75.233871000000136],[-110.91750300000001,75.239699999999971],[-111.05249000000003,75.270263999999997],[-111.06806899999987,75.271927000000119],[-111.23082699999998,75.264159999999947],[-111.24889400000001,75.259155000000078],[-111.25195300000001,75.254165999999941],[-111.25083899999993,75.248596000000077],[-111.25167799999997,75.243042000000059],[-111.25611900000001,75.236649000000114],[-111.26112399999994,75.232208000000014],[-111.27778599999994,75.220534999999984],[-111.33416699999992,75.19747899999993],[-111.39167800000001,75.181091000000094],[-111.47501399999999,75.161652000000004],[-111.56082200000003,75.146103000000096],[-111.57721700000002,75.143600000000106],[-111.59612299999998,75.143326000000002],[-111.69526699999989,75.145828000000051],[-111.70584100000002,75.151093000000117],[-111.787216,75.166655999999932],[-111.958054,75.13499500000006],[-112.22833300000002,75.124694999999974],[-112.39055599999995,75.123032000000023],[-112.40972899999997,75.12359600000002],[-112.42916899999994,75.125259000000085],[-112.439438,75.128586000000041],[-112.44833399999999,75.133041000000048],[-112.47084000000001,75.146378000000084],[-112.46833800000002,75.151382000000069],[-112.46166999999997,75.154433999999981],[-112.45249899999999,75.155822999999998],[-112.41197199999993,75.159012000000075],[-112.36860699999994,75.169144000000131],[-112.35833700000001,75.173035000000027],[-112.29472399999992,75.198028999999963],[-112.29583700000001,75.202774000000034],[-112.33944700000001,75.223602000000085],[-112.39750700000002,75.241089000000102],[-112.40888999999993,75.240814000000114],[-112.4366609999999,75.230545000000063],[-112.46193700000003,75.218872000000033],[-112.46417200000002,75.213043000000027],[-112.46305799999999,75.208327999999995],[-112.45056199999999,75.204711999999972],[-112.43749999999994,75.198868000000118],[-112.43221999999997,75.19331399999993],[-112.43250299999994,75.1869200000001],[-112.44471699999997,75.18331900000004],[-112.46665999999999,75.179977000000065],[-112.56111099999993,75.178314],[-112.59249899999998,75.181656000000089],[-112.60888699999992,75.185256999999979],[-112.62554899999998,75.190810999999997],[-112.6347429999999,75.196365000000128],[-112.63722200000001,75.204987000000131],[-112.63694800000002,75.210541000000148],[-112.632767,75.215820000000122],[-112.61609599999997,75.223877000000073],[-112.59472699999998,75.230270000000075],[-112.58583099999998,75.239150999999993],[-112.59472699999998,75.250000000000057],[-112.61277799999999,75.259430000000123],[-112.65167200000002,75.275269000000037],[-112.66583300000002,75.278595000000109],[-112.679169,75.277771000000143],[-112.71305799999999,75.256104000000107],[-112.718887,75.250275000000045],[-112.735817,75.203323000000125],[-112.73416099999992,75.19747899999993],[-112.72888199999994,75.192749000000106],[-112.71584299999995,75.187195000000088],[-112.698036,75.177765000000022],[-112.68859899999995,75.171920999999998],[-112.699997,75.138321000000133],[-112.80695300000002,75.115814000000057],[-112.89417300000002,75.103317000000061],[-112.95667300000002,75.097214000000122],[-113.25446299999999,75.076096000000007],[-113.29888899999997,75.073044000000095],[-113.343887,75.072220000000129],[-113.610817,75.062759000000142],[-113.68083200000001,75.05192599999998],[-113.699432,75.051375999999948],[-113.89417299999997,75.052199999999914],[-113.91750299999995,75.053589000000102],[-113.94138299999986,75.056931000000077],[-113.950287,75.06053199999991],[-113.96888699999994,75.075272000000041],[-113.97305299999994,75.086655000000064],[-113.97305299999994,75.096374999999966],[-113.93138099999999,75.189148000000046],[-113.82055700000001,75.314423000000147],[-113.80583199999995,75.326660000000118],[-113.78278399999999,75.33776899999998],[-113.72805800000003,75.345825000000048],[-113.66055299999994,75.351379000000065],[-113.64222699999993,75.353591999999992],[-113.573624,75.366928000000144],[-113.34056099999992,75.413315000000068],[-113.38110399999999,75.418320000000108],[-113.47112300000003,75.427764999999965],[-113.577789,75.411652000000117],[-113.66027799999995,75.398605000000089],[-113.74445299999996,75.385818000000086],[-113.83389299999988,75.37692300000009],[-113.87138400000003,75.374145999999996],[-113.90222199999999,75.3744200000001],[-113.91139199999998,75.378036000000122],[-113.92111199999994,75.383881000000031],[-113.958618,75.411102000000085],[-113.98166700000002,75.431091000000038],[-113.98416099999992,75.437758999999971],[-113.99221799999998,75.448318000000029],[-114.02416999999997,75.461105000000032],[-114.04083300000002,75.463882000000126],[-114.06500199999988,75.466095000000109],[-114.08389299999999,75.464706000000092],[-114.08693699999998,75.462494000000049],[-114.08917199999996,75.458602999999982],[-114.093887,75.410812000000078],[-114.09166699999992,75.404984000000127],[-114.08583099999993,75.400269000000094],[-114.07778899999988,75.394150000000081],[-114.06610099999995,75.389160000000061],[-114.05638099999987,75.383330999999998],[-114.04472399999992,75.373032000000023],[-114.04055800000003,75.36775200000011],[-114.04055800000003,75.362198000000092],[-114.04750100000001,75.35054000000008],[-114.13751200000002,75.244979999999998],[-114.15805099999994,75.233321999999987],[-114.17083699999989,75.226929000000041],[-114.18666100000002,75.223312000000078],[-114.203056,75.221375000000023],[-114.22277799999995,75.2227630000001],[-114.26363399999991,75.229705999999908],[-114.28472899999997,75.234985000000108],[-114.319458,75.24470500000001],[-114.34638999999993,75.25471500000009],[-114.35082999999997,75.26638800000012],[-114.34916699999985,75.271378000000141],[-114.35109699999992,75.276093000000003],[-114.35888699999992,75.281371999999976],[-114.49999999999994,75.312194999999974],[-114.51278699999995,75.314697000000081],[-114.52806099999992,75.314423000000147],[-114.54276999999996,75.31303400000013],[-114.60973399999995,75.27998400000007],[-114.61527999999993,75.274994000000049],[-114.61138900000003,75.265273999999977],[-114.598343,75.261658000000068],[-114.57972699999999,75.263321000000019],[-114.57250999999997,75.264434999999992],[-114.54666099999997,75.266937000000041],[-114.49638399999998,75.265548999999965],[-114.46806299999997,75.262207000000046],[-114.44304699999986,75.257216999999969],[-114.41278099999994,75.24803199999991],[-114.39723200000003,75.238876000000005],[-114.30249000000003,75.1827550000001],[-114.297234,75.179152999999928],[-114.29472399999997,75.173309000000131],[-114.29804999999999,75.166655999999932],[-114.30860899999993,75.154709000000025],[-114.32112099999995,75.143326000000002],[-114.33528099999995,75.13108799999992],[-114.34944199999995,75.119140999999956],[-114.36749299999985,75.106934000000024],[-114.39499699999993,75.090546000000131],[-114.42971799999987,75.073044000000095],[-114.46640000000002,75.06053199999991],[-114.48332199999987,75.056090999999981],[-114.51889,75.050261999999975],[-114.60082999999997,75.038315000000011],[-114.72416699999997,75.011932000000058],[-114.76342799999998,75.002472000000012],[-114.825287,74.988037000000077],[-114.88861099999991,74.977478000000019],[-114.94915800000001,74.969986000000063],[-115.03222699999992,74.961655000000007],[-115.05082700000003,74.961104999999975],[-115.066101,74.961655000000007],[-115.16055299999999,74.979430999999977],[-115.18582200000003,74.985259999999982],[-115.195267,74.989975000000015],[-115.22609699999992,75.049713000000054],[-115.22638699999993,75.058318999999983],[-115.225281,75.064147999999989],[-115.21861299999995,75.070831000000112],[-115.21167000000003,75.07638500000013],[-115.199432,75.082763999999997],[-115.18331899999993,75.088882000000126],[-115.17415599999993,75.094147000000021],[-115.17304999999999,75.099990999999989],[-115.17278299999992,75.10775799999999],[-115.17832899999996,75.115814000000057],[-115.216949,75.167480000000126],[-115.23554999999993,75.174698000000092],[-115.24861099999998,75.178314],[-115.25695799999994,75.179977000000065],[-115.26083399999993,75.179977000000065],[-115.25611900000001,75.178040000000067],[-115.252228,75.173874000000126],[-115.25361599999991,75.164429000000098],[-115.256393,75.158035000000041],[-115.26139799999999,75.151932000000102],[-115.27916699999997,75.140823000000012],[-115.291382,75.134430000000066],[-115.33640300000002,75.116652999999985],[-115.35305799999998,75.111099000000024],[-115.37304699999999,75.105820000000051],[-115.38694799999996,75.102203000000088],[-115.40416700000003,75.098877000000016],[-115.42666600000001,75.098038000000088],[-115.451683,75.098877000000016],[-115.48361199999994,75.106093999999985],[-115.51944700000001,75.117751999999996],[-115.62389399999995,75.121368000000018],[-115.60472099999993,75.108597000000088],[-115.54888899999997,75.055817000000047],[-115.53971899999993,75.044434000000081],[-115.53751399999993,75.039429000000041],[-115.53751399999993,75.027205999999978],[-115.54527300000001,75.015823000000125],[-115.5516659999999,75.009155000000135],[-115.57472200000001,74.998321999999973],[-115.60249299999998,74.98553499999997],[-115.61833200000001,74.979155999999932],[-115.658051,74.967208999999968],[-115.67194399999988,74.964706000000035],[-115.69055200000003,74.964157000000057],[-115.73500100000001,74.967208999999968],[-115.75723299999999,74.969986000000063],[-115.84777800000001,74.98553499999997],[-116.16306299999991,75.040267999999969],[-116.27916699999997,75.099425999999994],[-116.28639199999992,75.13108799999992],[-116.27694699999995,75.135268999999994],[-116.26889,75.141373000000044],[-116.2455369999999,75.162766000000147],[-116.24109599999997,75.168869000000086],[-116.23860200000001,75.196930000000009],[-116.23916599999995,75.201385000000016],[-116.24694799999992,75.205261000000064],[-116.26834100000002,75.206100000000049],[-116.287216,75.205551000000071],[-116.52722199999999,75.184708000000001],[-116.56054699999999,75.179152999999928],[-116.58084100000002,75.174423000000104],[-116.59388699999994,75.170258000000103],[-116.60249299999998,75.164993000000038],[-116.618607,75.152481000000023],[-116.66332999999997,75.122481999999991],[-116.679169,75.117203000000018],[-116.69415299999997,75.116652999999985],[-116.71721599999995,75.116652999999985],[-117.16860999999994,75.157486000000063],[-117.38417099999992,75.178588999999988],[-117.41915899999992,75.182480000000055],[-117.45777899999996,75.188873000000001],[-117.47501399999993,75.192200000000128],[-117.66361999999998,75.239150999999993],[-117.67832900000002,75.244431000000077],[-117.68305999999995,75.248596000000077],[-117.68388400000003,75.253052000000139],[-117.67166099999997,75.288879000000122],[-117.666946,75.294144000000017],[-117.66194199999995,75.298035000000084],[-117.53666699999997,75.361649],[-117.45527599999997,75.400269000000094],[-117.42054699999994,75.413315000000068],[-117.35360699999995,75.437485000000038],[-117.32112099999995,75.448593000000074],[-117.26139799999993,75.468871999999976],[-117.24054699999999,75.473602000000028],[-117.218887,75.476379000000122],[-117.14666699999998,75.480270000000019],[-117.10305799999998,75.482208000000128],[-117.041382,75.483597000000145],[-116.89778100000001,75.482482999999945],[-116.87748699999997,75.481368999999972],[-116.75334199999998,75.479431000000034],[-116.13474300000001,75.476379000000122],[-116.11554699999994,75.476928999999984],[-116.02194199999997,75.484985000000052],[-115.97332799999998,75.492751999999996],[-115.92250100000001,75.503876000000048],[-115.81833599999987,75.529709000000025],[-115.68888900000002,75.56442300000009],[-115.64639299999999,75.573607999999922],[-115.61972000000003,75.578872999999987],[-115.56527699999987,75.583878000000027],[-115.53056299999997,75.584991000000116],[-115.50611900000001,75.587204000000099],[-115.46305799999999,75.591933999999924],[-115.36609599999997,75.602768000000026],[-115.28832999999997,75.620529000000147],[-115.28611799999993,75.624420000000043],[-115.27722199999999,75.630539000000056],[-115.26777600000003,75.635818000000029],[-115.20333900000003,75.657211000000132],[-115.18611099999993,75.662766000000033],[-115.09665699999994,75.687194999999974],[-115.08194700000001,75.689423000000147],[-115.07028200000002,75.689972000000068],[-115.04250300000001,75.689697000000081],[-114.99973299999994,75.690811000000053],[-114.99804699999999,75.695816000000093],[-115.00556899999992,75.698868000000004],[-115.02834300000001,75.701660000000118],[-115.05277999999998,75.703048999999908],[-115.07611099999991,75.702484000000084],[-115.10305800000003,75.700821000000133],[-115.14555399999995,75.694138000000009],[-115.21721600000001,75.679321000000073],[-115.27916699999997,75.667755],[-115.32472199999995,75.659988000000055],[-115.38305700000001,75.653870000000097],[-115.40194699999995,75.652480999999966],[-115.47193900000002,75.650269000000037],[-115.51888999999994,75.649994000000049],[-115.60637700000001,75.651093000000003],[-115.66750299999995,75.647217000000126],[-115.71444700000001,75.642487000000131],[-115.889183,75.614426000000037],[-116.09166700000003,75.580551000000128],[-116.108047,75.574157999999954],[-116.11916400000001,75.572768999999994],[-116.34750399999996,75.559143000000006],[-116.38971700000002,75.5577550000001],[-116.46028099999995,75.557480000000055],[-116.48610699999995,75.5577550000001],[-116.84361299999989,75.564987000000031],[-117.19499200000001,75.573607999999922],[-117.21556099999998,75.574707000000103],[-117.23277300000001,75.576935000000049],[-117.24276700000001,75.580551000000128],[-117.25,75.586105000000089],[-117.25110599999994,75.597488000000112],[-117.24833699999999,75.603043000000014],[-117.23999000000003,75.614990000000148],[-117.23361199999994,75.620529000000147],[-117.21362299999993,75.633330999999998],[-117.07805599999995,75.707214000000079],[-117.06443799999994,75.714157000000114],[-117.03971899999999,75.725815000000125],[-117.02362099999993,75.732483000000116],[-117.01666299999994,75.737198000000149],[-116.95556599999992,75.761932000000115],[-116.923317,75.774704000000099],[-116.88667299999992,75.786926000000051],[-116.86888099999999,75.790543000000014],[-116.85056299999991,75.79304500000012],[-116.81639099999995,75.796371000000136],[-116.76278699999995,75.799988000000099],[-116.71972699999998,75.801650999999993],[-116.58860799999997,75.803314000000114],[-116.53056300000003,75.802765000000022],[-116.32417299999992,75.804703000000131],[-116.10582699999998,75.806931000000077],[-116.03721599999994,75.809708000000001],[-115.82305899999994,75.827208999999925],[-115.80444299999994,75.829987000000131],[-115.79444899999999,75.834152000000131],[-115.78415699999994,75.845260999999994],[-115.77971600000001,75.852203000000088],[-115.76500699999997,75.854431000000034],[-115.74944299999999,75.854980000000012],[-115.73693800000001,75.854431000000034],[-115.72638699999993,75.853317000000061],[-115.69193999999993,75.848328000000095],[-115.67388900000003,75.844147000000021],[-115.65943900000002,75.839706000000092],[-115.62277199999994,75.834427000000119],[-115.59445199999999,75.833327999999995],[-115.50723299999993,75.834991000000059],[-115.40499899999998,75.838043000000027],[-115.38194299999992,75.839706000000092],[-115.36416599999995,75.844147000000021],[-115.35193599999997,75.852203000000088],[-115.31360599999994,75.855255],[-115.13945000000001,75.859421000000111],[-115.07277699999986,75.85775799999999],[-115.04998799999998,75.855820000000051],[-115.00083899999998,75.853317000000061],[-114.98082699999992,75.853043000000127],[-114.932503,75.856644000000017],[-114.91194199999995,75.859711000000118],[-114.83860799999997,75.874419999999986],[-114.817497,75.880814000000044],[-114.80444299999994,75.886932000000002],[-114.798607,75.892212000000029],[-114.80999800000001,75.899428999999941],[-114.82417299999986,75.904160000000104],[-114.83667000000003,75.905822999999998],[-114.88166799999993,75.907486000000119],[-114.90722700000003,75.906372000000147],[-115.01806599999992,75.89888000000002],[-115.06416299999989,75.894714000000135],[-115.10527000000002,75.888596000000007],[-115.22165699999999,75.880264000000011],[-115.29277000000002,75.878311000000053],[-115.39472999999992,75.877762000000132],[-115.54055799999998,75.881362999999965],[-115.68222000000003,75.888321000000133],[-115.74694799999986,75.889434999999935],[-115.83029199999993,75.887772000000041],[-115.86888099999999,75.884430000000066],[-116.00472999999994,75.868590999999981],[-116.05332899999991,75.865540000000124],[-116.10665899999998,75.864150999999936],[-116.13474300000001,75.86442599999998],[-116.15083299999992,75.864700000000084],[-116.48277299999995,75.873871000000065],[-116.62389400000001,75.881927000000132],[-116.64972699999998,75.884995000000117],[-116.67666600000001,75.889709000000039],[-116.69972199999995,75.894989000000123],[-116.71501199999994,75.900269000000037],[-116.72444200000001,75.906372000000147],[-116.73416099999992,75.922484999999995],[-116.73361199999999,75.928589000000045],[-116.73137699999995,75.945251000000042],[-116.72666899999996,75.951385000000016],[-116.71389799999997,75.956649999999911],[-116.69972199999995,75.959990999999945],[-116.67748999999998,75.963882000000012],[-116.63221699999997,75.969147000000078],[-116.58528099999995,75.971924000000001],[-116.56139400000001,75.972762999999986],[-116.53721599999994,75.972488000000112],[-116.51611300000002,75.971100000000035],[-116.48528299999998,75.966385000000002],[-116.470551,75.96887200000009],[-116.46193700000003,75.974991000000102],[-116.46833800000002,75.986374000000126],[-116.52834299999995,76.027480999999966],[-116.60221899999993,76.022216999999955],[-116.645554,76.023041000000092],[-116.66944899999999,76.025818000000015],[-116.6875,76.02915999999999],[-116.69888300000002,76.034424000000115],[-116.70556599999998,76.039153999999996],[-116.708618,76.043869000000029],[-116.70777900000002,76.049988000000042],[-116.70612299999999,76.05386400000009],[-116.70168299999995,76.059982000000048],[-116.69638099999992,76.064987000000087],[-116.64138800000001,76.113312000000121],[-116.53388999999999,76.153320000000008],[-116.51611300000002,76.157761000000107],[-116.34221599999995,76.183043999999995],[-116.29611199999999,76.188582999999994],[-116.21362299999998,76.194977000000051],[-116.16361999999992,76.197204999999997],[-116.08416699999998,76.198318000000086],[-116.05943300000001,76.198029000000133],[-115.95889299999999,76.194138000000066],[-115.90862300000003,76.191924999999912],[-115.86554699999999,76.188309000000061],[-115.81582600000002,76.186920000000043],[-115.64334099999996,76.186096000000077],[-115.59500100000002,76.187759000000028],[-115.44721999999996,76.186920000000043],[-115.32749899999999,76.184708000000001],[-115.27306399999998,76.18220500000001],[-115.154449,76.169434000000081],[-115.13027999999997,76.165816999999947],[-115.02166699999998,76.15637200000009],[-114.87554899999998,76.149719000000118],[-114.85109699999992,76.149429000000112],[-114.79077100000001,76.151077000000043],[-114.72833300000002,76.153046000000074],[-114.68499799999995,76.156097000000045],[-114.66972399999997,76.158325000000048],[-114.66251399999999,76.160537999999974],[-114.662781,76.161651999999947],[-114.68083199999995,76.164992999999981],[-114.70639,76.167205999999965],[-114.80082699999997,76.168594000000041],[-114.85056299999997,76.170258000000047],[-114.89862099999993,76.172485000000108],[-114.94499200000001,76.176085999999998],[-114.99305700000002,76.182480000000055],[-115.00974299999996,76.187485000000095],[-115.01444999999995,76.192749000000049],[-115.02250700000002,76.196929999999952],[-115.04527300000001,76.202208999999982],[-115.08944699999995,76.208878000000027],[-115.15972899999997,76.218596999999988],[-115.27223200000003,76.230270000000019],[-115.37304699999999,76.230820000000051],[-115.54943800000001,76.230545000000063],[-115.75666799999993,76.234146000000123],[-115.78195199999993,76.235260000000096],[-115.82721699999991,76.23942599999998],[-115.84777800000001,76.243042000000059],[-115.86665299999993,76.247482000000048],[-115.88194299999992,76.252776999999924],[-115.91471899999993,76.275269000000037],[-115.92166099999997,76.281096999999932],[-115.92500299999989,76.286652000000061],[-115.90943899999996,76.345535000000041],[-115.90139799999997,76.349991000000102],[-115.86054999999999,76.362488000000099],[-115.64835399999998,76.420258000000047],[-115.62638899999996,76.425812000000008],[-115.51471700000002,76.45138500000013],[-115.49973299999994,76.454712000000086],[-115.46665999999993,76.455826000000059],[-115.26944700000001,76.461105000000032],[-115.02139299999993,76.474700999999982],[-115.00167799999997,76.477203000000088],[-114.978882,76.481658999999979],[-114.95638999999994,76.487198000000149],[-114.94638099999992,76.492477000000122],[-114.93360899999999,76.504990000000021],[-114.92999299999997,76.510268999999994],[-114.91944899999999,76.514435000000105],[-114.89972699999987,76.516936999999984],[-114.74054699999988,76.517212000000029],[-114.71112099999999,76.516936999999984],[-114.70194999999995,76.515274000000034],[-114.69611399999991,76.511382999999967],[-114.69833399999999,76.507492000000127],[-114.720551,76.501099000000124],[-114.70694699999996,76.489700000000028],[-114.61028299999992,76.488312000000121],[-114.45140099999998,76.49693300000007],[-114.29361,76.480269999999962],[-114.25167799999991,76.474990999999989],[-114.20722999999987,76.46804800000001],[-114.17471299999994,76.460266000000047],[-114.14806399999998,76.45138500000013],[-114.13555899999989,76.446365000000071],[-114.11833199999995,76.435257000000092],[-114.11193800000001,76.429428000000087],[-114.10333299999996,76.418869000000029],[-114.096947,76.403595000000109],[-114.09111000000001,76.388885000000016],[-114.10611,76.35554500000012],[-114.11749299999997,76.353317000000004],[-114.12943999999993,76.31191999999993],[-114.05972299999996,76.21775800000006],[-113.99665800000002,76.192749000000049],[-113.98332199999999,76.190262000000018],[-113.9583439999999,76.188873000000001],[-113.94833399999999,76.189423000000033],[-113.70889299999999,76.203598000000113],[-113.685272,76.206100000000049],[-113.63890100000003,76.212769000000094],[-113.61609599999997,76.218323000000055],[-113.52443700000003,76.235809000000017],[-113.36501299999992,76.258605999999929],[-113.32333399999993,76.262772000000041],[-113.26055899999994,76.264434999999992],[-112.99916100000002,76.267487000000074],[-112.95667300000002,76.263611000000026],[-112.90972899999997,76.257491999999957],[-112.89222699999993,76.253876000000105],[-112.86860699999994,76.244704999999954],[-112.85888699999998,76.239975000000129],[-112.85305800000003,76.234146000000123],[-112.75055700000001,76.200546000000031],[-112.71721599999995,76.198318000000086],[-112.62138399999998,76.198318000000086],[-112.59028599999999,76.196639999999945],[-112.48194899999999,76.181366000000082],[-112.46278399999994,76.178313999999943],[-112.45388800000001,76.176376000000005],[-112.42500299999995,76.167755000000113],[-112.43138099999993,76.161926000000108],[-112.43859900000001,76.15887500000008],[-112.47721899999999,76.151382000000012],[-112.49416400000001,76.146652000000017],[-112.50389099999995,76.138596000000121],[-112.52610800000002,76.110535000000027],[-112.52806099999998,76.103867000000037],[-112.52278100000001,76.099152000000004],[-112.42278299999987,76.047211000000118],[-112.41332999999992,76.042480000000012],[-112.38555899999994,76.036652000000061],[-112.29888900000003,76.029434000000094],[-112.15416699999997,76.014998999999989],[-112.06861899999996,76.003326000000129],[-112.04332699999992,75.998871000000122],[-111.9786069999999,75.981369000000086],[-111.78443900000002,75.949707000000103],[-111.76390100000003,75.946930000000009],[-111.75279199999994,75.942749000000106],[-111.72778299999999,75.92164600000001],[-111.72666900000002,75.915817000000004],[-111.729446,75.911101999999971],[-111.736107,75.90498400000007],[-111.77749599999999,75.894714000000135],[-111.87138400000003,75.887496999999996],[-111.94444299999998,75.884995000000117],[-112.00945300000001,75.881652999999972],[-112.03472899999997,75.879974000000004],[-112.05222300000003,75.878036000000066],[-112.07501200000002,75.873871000000065],[-112.165009,75.851928999999984],[-112.17971799999998,75.848038000000088],[-112.18694299999993,75.844986000000006],[-112.22556299999997,75.811096000000077],[-112.218613,75.808029000000147],[-112.20834399999995,75.80664100000007],[-112.19248999999996,75.805817000000104],[-112.02834299999995,75.815261999999962],[-111.85861199999988,75.826934999999992],[-111.69082599999996,75.822769000000108],[-111.64499699999993,75.821655000000135],[-111.604446,75.826660000000004],[-111.53971899999993,75.838318000000015],[-111.49638400000003,75.839706000000092],[-111.47638699999999,75.839157],[-111.45195000000001,75.836655000000064],[-111.44499200000001,75.832213999999965],[-111.35527000000002,75.724426000000108],[-111.35388199999994,75.718597000000102],[-111.35500299999995,75.714432000000102],[-111.38971700000002,75.663039999999967],[-111.40834000000001,75.620818999999983],[-111.40722700000003,75.614990000000148],[-111.35360700000001,75.57249500000006],[-111.31861900000001,75.545258000000103],[-111.27139299999999,75.522491000000002],[-111.24722299999996,75.518051000000014],[-111.22165699999999,75.516936999999984],[-110.995003,75.529160000000047],[-110.97222899999997,75.532486000000119],[-110.89943700000003,75.550262000000089],[-110.79499799999996,75.565262000000018],[-110.77166699999992,75.566666000000055],[-110.54222099999993,75.568878000000097],[-110.49553699999996,75.569153000000085],[-110.47582999999992,75.568329000000119],[-110.45612299999999,75.565535999999952],[-110.43110699999994,75.554152999999985],[-110.42443799999995,75.548873999999955],[-110.42223399999995,75.545532000000037],[-110.33389299999993,75.539154000000053],[-110.19583099999994,75.539703000000031],[-110.06777999999997,75.540543000000071],[-109.97416699999991,75.537490999999989],[-109.75,75.529709000000025],[-109.55304699999999,75.521652000000017],[-109.30444299999999,75.514999000000046],[-109.25389100000001,75.514160000000118],[-109.18360899999999,75.5086060000001],[-109.07472199999995,75.498322000000087],[-108.93639400000001,75.47665399999994],[-108.89943699999998,75.476379000000122],[-108.89584399999995,75.477203000000088],[-108.891953,75.480270000000019],[-108.91639700000002,75.513321000000133],[-108.92443800000001,75.52388000000002],[-108.83612099999993,75.612762000000032],[-108.8269499999999,75.686646000000053],[-108.84277299999991,75.691359999999975],[-108.88194299999998,75.692200000000071],[-108.91332999999992,75.691086000000041],[-108.94499199999996,75.694976999999938],[-109.05832699999996,75.728043000000071],[-109.05860899999993,75.733047000000056],[-109.06276699999989,75.737762000000089],[-109.12638900000002,75.7494200000001],[-109.21000699999996,75.762771999999984],[-109.26555599999995,75.770264000000054],[-109.30526700000001,75.771103000000039],[-109.45221700000002,75.783051000000057],[-109.62943999999993,75.799988000000099],[-109.63751200000002,75.822769000000108],[-109.62805200000003,75.829162999999994],[-109.62638900000002,75.83248900000001],[-109.65722699999992,75.866379000000109],[-109.66361999999998,75.870819000000097],[-109.72972099999998,75.876647999999932],[-109.737503,75.876647999999932],[-109.845551,75.863036999999963],[-109.85722399999992,75.860809000000017],[-109.88390400000003,75.849991000000045],[-109.90778399999994,75.849991000000045],[-109.93639399999989,75.856644000000017],[-110.05555699999996,75.890548999999908],[-110.05583200000001,75.894439999999975],[-110.04055800000003,75.898604999999975],[-109.92610200000001,75.927765000000079],[-109.826683,75.930541999999946],[-109.69776899999999,75.940262000000075],[-109.672234,75.943862999999908],[-109.65666199999998,75.94802900000002],[-109.42138699999998,76.035812000000021],[-109.30499299999991,76.100540000000137],[-109.30943300000001,76.106094000000098],[-109.31360599999999,76.109146000000067],[-109.396118,76.133041000000048],[-109.69999699999994,76.218872000000033],[-109.72250400000001,76.222213999999951],[-109.80943300000001,76.234421000000111],[-109.83416699999998,76.236099000000024],[-109.85861199999999,76.235809000000017],[-109.882767,76.233871000000079],[-109.89666699999992,76.230270000000019],[-109.90222199999999,76.226089000000115],[-109.90167199999996,76.221099999999979],[-109.88305699999995,76.198868000000118],[-109.88667299999997,76.194977000000051],[-109.89666699999992,76.193588000000034],[-109.91944899999993,76.196639999999945],[-109.94055200000003,76.20248400000014],[-110.01471700000002,76.229706000000078],[-110.06833599999993,76.250000000000057],[-110.08528100000001,76.255829000000062],[-110.12332199999997,76.266098000000056],[-110.15306099999998,76.27388000000002],[-110.201683,76.285538000000031],[-110.24109599999991,76.290543000000127],[-110.26583900000003,76.291367000000093],[-110.33138999999989,76.290817000000061],[-110.35804699999994,76.292206000000022],[-110.372772,76.294433999999967],[-110.38362099999995,76.297760000000039],[-110.39306599999986,76.391937000000098],[-110.38527699999986,76.423035000000084],[-110.38390400000003,76.427475000000129],[-110.28943600000002,76.433044000000109],[-110.095551,76.454163000000108],[-109.80721999999997,76.490540000000124],[-109.74638400000003,76.505553999999961],[-109.71833799999996,76.515274000000034],[-109.70639,76.521103000000096],[-109.70694700000001,76.526093000000117],[-109.71140300000002,76.529984000000013],[-109.72416699999997,76.531662000000097],[-109.74916100000002,76.531662000000097],[-109.81111099999993,76.527206000000035],[-109.83222999999992,76.529160000000047],[-109.84722899999991,76.532486000000063],[-109.83750900000001,76.538879000000065],[-109.75527999999997,76.572768999999937],[-109.70667299999997,76.587494000000106],[-109.64666699999998,76.593323000000112],[-109.56082199999997,76.640823000000069],[-109.5097429999999,76.708328000000051],[-109.30277999999998,76.79693600000013],[-109.22277800000001,76.808029000000147],[-109.12777699999992,76.819443000000035],[-109.02583299999998,76.822769000000108],[-108.97444199999995,76.816086000000098],[-108.95084400000002,76.81164600000011],[-108.93582200000003,76.809417999999937],[-108.91887699999995,76.809417999999937],[-108.88945000000001,76.814147999999989],[-108.84500099999997,76.823608000000036],[-108.82195299999989,76.829987000000074],[-108.81331599999999,76.833878000000141],[-108.81360599999999,76.837769000000037],[-108.81582600000002,76.84304800000001],[-108.81388899999996,76.847488000000055],[-108.78859699999992,76.857208000000128],[-108.77362099999999,76.85775799999999],[-108.74804699999999,76.855820000000051],[-108.65556300000003,76.817490000000078],[-108.65110800000002,76.813599000000011]],[[-97.045272999999952,76.797760000000096],[-97.075287000000003,76.793320000000108],[-97.093886999999995,76.79693600000013],[-97.188598999999954,76.822769000000108],[-97.200561999999991,76.829437000000041],[-97.200835999999924,76.834152000000074],[-97.200835999999924,76.857482999999945],[-97.187499999999943,76.860260000000039],[-97.149170000000026,76.859711000000118],[-97.128875999999991,76.85775799999999],[-97.086945000000014,76.851089000000115],[-97.005004999999983,76.819716999999969],[-96.997222999999963,76.813309000000004],[-97.009170999999981,76.807479999999998],[-97.026397999999915,76.802475000000129],[-97.045272999999952,76.797760000000096]],[[-113.46610999999996,76.766388000000006],[-113.61361699999992,76.713043000000084],[-113.628601,76.708038000000045],[-113.65249599999999,76.704436999999984],[-113.67999299999985,76.704436999999984],[-113.70417799999996,76.706374999999923],[-113.78472899999997,76.717209000000025],[-113.83667000000003,76.719986000000063],[-113.889183,76.718597000000102],[-114.05471799999992,76.703598000000056],[-114.16194200000001,76.716933999999981],[-114.21444699999995,76.720535000000041],[-114.50110599999999,76.73414600000001],[-114.73416099999997,76.746643000000006],[-114.78694200000001,76.750274999999931],[-114.82501200000002,76.753601000000003],[-114.85888699999998,76.758040999999992],[-114.87304699999993,76.760818000000086],[-114.87526700000001,76.765549000000021],[-114.87581599999999,76.770827999999995],[-114.85526999999996,76.794434000000081],[-114.83721899999989,76.801650999999993],[-114.80444299999994,76.813309000000004],[-114.76666299999988,76.82388300000008],[-114.62416099999996,76.86192299999999],[-114.60637700000001,76.865814000000057],[-114.58583099999993,76.867476999999951],[-114.33693700000003,76.877197000000081],[-114.13834400000002,76.884430000000066],[-113.96221899999995,76.889984000000084],[-113.885559,76.891663000000051],[-113.80750299999994,76.889435000000105],[-113.7625119999999,76.884430000000066],[-113.73444399999994,76.879149999999981],[-113.49804699999993,76.833328000000108],[-113.48750299999989,76.827773999999977],[-113.44915799999995,76.777205999999978],[-113.45388800000001,76.772765999999933],[-113.46610999999996,76.766388000000006]],[[-109.06610099999995,76.900543000000084],[-109.07444800000002,76.894714000000079],[-109.12581599999987,76.898604999999975],[-109.22917200000001,76.906936999999971],[-109.254997,76.910812000000135],[-109.29888899999997,76.922211000000061],[-109.30777,76.928040000000067],[-109.30387899999994,76.933867999999961],[-109.28278399999999,76.937759000000028],[-109.256958,76.938873000000058],[-109.20527600000003,76.935256999999979],[-109.17944299999999,76.932480000000055],[-109.12721299999998,76.923873999999955],[-109.09249899999992,76.912200999999925],[-109.07695000000001,76.906097000000102],[-109.06610099999995,76.900543000000084]],[[-97.256392999999946,76.967484000000127],[-97.284164000000033,76.965820000000122],[-97.335007000000019,76.968048000000067],[-97.40943900000002,76.973037999999974],[-97.458618000000001,76.977203000000145],[-97.473052999999936,76.980545000000063],[-97.423889000000031,77.005829000000062],[-97.374709999999936,77.022491000000059],[-97.286117999999874,77.033325000000104],[-97.243057000000022,77.037491000000045],[-97.199158000000011,77.037766000000033],[-97.154723999999931,77.030273000000022],[-97.136672999999973,77.025542999999971],[-97.092223999999987,77.010818000000029],[-97.093063000000029,77.004990000000134],[-97.231109999999944,76.971375000000023],[-97.256392999999946,76.967484000000127]],[[-95.659728999999913,77.058868000000075],[-95.585555999999883,77.053314000000057],[-95.56082200000003,77.053589000000045],[-95.465285999999935,77.058319000000097],[-95.417769999999962,77.05693100000002],[-95.386672999999973,77.052475000000072],[-95.368331999999953,77.048599000000024],[-95.337218999999948,77.039978000000076],[-95.288054999999872,77.022491000000059],[-95.224715999999944,77.006378000000041],[-95.181945999999925,76.996368000000132],[-95.168334999999956,76.99414100000007],[-95.115829000000019,76.995818999999983],[-95,76.99054000000001],[-94.906386999999881,76.976089000000002],[-94.813888999999904,76.971375000000023],[-94.728606999999954,76.972762999999929],[-94.714172000000019,76.97387700000013],[-94.688599000000011,76.97526600000009],[-94.636123999999995,76.976929000000041],[-94.593063000000029,76.975540000000024],[-94.526397999999972,76.969437000000084],[-94.510009999999909,76.966094999999996],[-94.494155999999919,76.960265999999933],[-94.489715999999987,76.956100000000049],[-94.40194699999995,76.918319999999994],[-94.25778200000002,76.896378000000084],[-94.254729999999995,76.891373000000044],[-94.238891999999964,76.889435000000105],[-94.207229999999925,76.888046000000088],[-94.15972899999997,76.887496999999996],[-94.096389999999985,76.888885000000073],[-94.081680000000006,76.89027400000009],[-94.054992999999854,76.894714000000079],[-94.032226999999921,76.903320000000008],[-94.026107999999965,76.909149000000014],[-94.010559000000001,76.919144000000131],[-94.001113999999916,76.923598999999967],[-93.986663999999962,76.928864000000033],[-93.964721999999995,76.932480000000055],[-93.943603999999937,76.933867999999961],[-93.899993999999936,76.93331900000004],[-93.755004999999926,76.922484999999995],[-93.739166000000012,76.920822000000044],[-93.658339999999896,76.909987999999998],[-93.649445000000014,76.908035000000041],[-93.641953000000001,76.905258000000117],[-93.635833999999988,76.89888000000002],[-93.488602000000014,76.839706000000092],[-93.301392000000021,76.768600000000049],[-93.208054000000004,76.746933000000013],[-93.202788999999939,76.747481999999934],[-93.192214999999976,76.747208000000001],[-93.187499999999943,76.745529000000033],[-93.179717999999923,76.741088999999988],[-93.169723999999974,76.686919999999986],[-93.174438000000009,76.674987999999985],[-93.18638599999997,76.660812000000021],[-93.300277999999878,76.552199999999971],[-93.306655999999919,76.54664600000001],[-93.461394999999982,76.49832200000003],[-93.595276000000013,76.462493999999992],[-93.629989999999964,76.451934999999992],[-93.641953000000001,76.44720500000011],[-93.651947000000007,76.441650000000038],[-93.652221999999938,76.437759000000142],[-93.650283999999999,76.43553200000008],[-93.548339999999882,76.386108000000092],[-93.528609999999958,76.384720000000016],[-93.509445000000028,76.386658000000125],[-93.498336999999992,76.388885000000016],[-93.46362299999987,76.399429000000055],[-93.456954999999994,76.403595000000109],[-93.467399999999998,76.40792799999997],[-93.480559999999969,76.409927000000039],[-93.500838999999985,76.4102630000001],[-93.508895999999993,76.406647000000078],[-93.520554000000004,76.405823000000112],[-93.537780999999995,76.407486000000006],[-93.554992999999968,76.411377000000073],[-93.570846999999958,76.416382000000112],[-93.580565999999976,76.423035000000084],[-93.576401000000033,76.426650999999993],[-93.533065999999963,76.443039000000056],[-93.518889999999999,76.448318000000029],[-93.501403999999923,76.452209000000096],[-93.476562000000001,76.454772999999932],[-93.454223999999954,76.456436000000053],[-93.422226000000023,76.458328000000108],[-93.392776000000026,76.461655000000064],[-93.370270000000005,76.466385000000059],[-93.357223999999917,76.470535000000098],[-93.123610999999926,76.573043999999982],[-93.111114999999927,76.580276000000083],[-93.095276000000013,76.590546000000018],[-93.096953999999926,76.596649000000127],[-93.09973100000002,76.601653999999996],[-93.046386999999925,76.616089000000102],[-92.945830999999998,76.622482000000048],[-92.90306099999998,76.621918000000107],[-92.880279999999971,76.620818999999983],[-92.857223999999917,76.618317000000047],[-92.789718999999934,76.609146000000123],[-92.705276000000026,76.594437000000084],[-92.68360899999999,76.592484000000127],[-92.654998999999975,76.594711000000018],[-92.642501999999979,76.598037999999974],[-92.632767000000001,76.602478000000133],[-92.618057000000022,76.607483000000002],[-92.605834999999956,76.610535000000141],[-92.564437999999939,76.616089000000102],[-92.541106999999897,76.617752000000053],[-92.506393000000003,76.617477000000008],[-92.468338000000017,76.61303700000002],[-92.440825999999959,76.603317000000118],[-92.42111199999988,76.598037999999974],[-92.40055799999999,76.594986000000006],[-92.386948000000018,76.593872000000033],[-92.36860699999994,76.594437000000084],[-92.330840999999964,76.597214000000008],[-92.183318999999983,76.614699999999914],[-92.077498999999989,76.637207000000046],[-92.043609999999887,76.646942000000081],[-92.004332999999917,76.657897999999932],[-91.991942999999992,76.660812000000021],[-91.970001000000025,76.664428999999984],[-91.938599000000011,76.668320000000051],[-91.910003999999901,76.670532000000094],[-91.775557999999933,76.679703000000018],[-91.668609999999944,76.684708000000057],[-91.535827999999924,76.688873000000058],[-91.410552999999936,76.689148000000102],[-91.385283999999956,76.688309000000118],[-91.132767000000001,76.664428999999984],[-91.008895999999936,76.651657000000114],[-90.986114999999984,76.649155000000064],[-90.883895999999936,76.626647999999989],[-90.871383999999978,76.622757000000092],[-90.854720999999984,76.61554000000001],[-90.849990999999875,76.609146000000123],[-90.844161999999926,76.603592000000106],[-90.837218999999948,76.599152000000117],[-90.817779999999971,76.593597000000045],[-90.779998999999975,76.585815000000082],[-90.741104000000007,76.580551000000071],[-90.674438000000009,76.573318000000086],[-90.626388999999961,76.56999200000007],[-90.582503999999972,76.565262000000018],[-90.56361400000003,76.559708000000001],[-90.50306699999993,76.53137200000009],[-90.498610999999926,76.524993999999936],[-90.468613000000005,76.479155999999989],[-90.468063000000029,76.473038000000088],[-90.48332199999993,76.46804800000001],[-90.510833999999988,76.463882000000126],[-90.538054999999929,76.46138000000002],[-90.61610399999995,76.45637499999998],[-90.638335999999924,76.455826000000059],[-90.779175000000009,76.461105000000032],[-90.826400999999976,76.463042999999971],[-91.090560999999923,76.478043000000127],[-91.304169000000002,76.504166000000055],[-91.34973100000002,76.509430000000066],[-91.373885999999857,76.511107999999979],[-91.414718999999934,76.512771999999984],[-91.441101000000003,76.512771999999984],[-91.564162999999951,76.500823999999966],[-91.566665999999998,76.498871000000008],[-91.416396999999961,76.460266000000047],[-91.402495999999985,76.457488999999953],[-91.271117999999944,76.453873000000101],[-91.147506999999962,76.450821000000019],[-91.057219999999973,76.450546000000145],[-90.99110399999995,76.447754000000089],[-90.974166999999966,76.446091000000138],[-90.797774999999945,76.42692599999998],[-90.642226999999991,76.410537999999917],[-90.414443999999946,76.403046000000018],[-90.368331999999953,76.399994000000049],[-90.317229999999938,76.394714000000022],[-90.281386999999995,76.389160000000004],[-90.06361400000003,76.361648999999943],[-89.831389999999942,76.34027100000003],[-89.543883999999935,76.316939999999988],[-89.367766999999958,76.304152999999985],[-89.305557000000022,76.299149],[-89.292496000000028,76.296097000000088],[-89.230559999999912,76.272766000000047],[-89.217772999999909,76.266663000000108],[-89.208617999999944,76.260818000000029],[-89.201110999999912,76.254166000000112],[-89.192214999999976,76.242203000000075],[-89.192490000000021,76.236099000000024],[-89.198607999999865,76.22526600000009],[-89.209166999999979,76.221099999999979],[-89.295546999999942,76.197754000000145],[-89.326400999999919,76.189423000000033],[-89.349730999999963,76.183594000000028],[-89.378051999999968,76.180267000000072],[-89.588332999999921,76.165816999999947],[-89.831954999999994,76.160812000000078],[-89.888610999999912,76.166091999999992],[-89.904175000000009,76.168869000000086],[-89.976105000000018,76.173874000000126],[-90.37332200000003,76.181366000000082],[-90.397780999999952,76.180542000000116],[-90.416945999999996,76.178863999999976],[-90.438598999999954,76.175537000000077],[-90.453613000000018,76.17053199999998],[-90.455840999999964,76.167205999999965],[-90.455565999999976,76.165543000000014],[-90.438598999999954,76.162201000000096],[-90.414443999999946,76.159987999999942],[-90.256957999999941,76.146942000000024],[-90.22222899999997,76.144440000000145],[-90.151671999999905,76.141663000000051],[-90.064162999999894,76.136932000000115],[-90.048614999999984,76.132751000000042],[-90.06361400000003,76.127762000000075],[-90.085280999999895,76.1244200000001],[-90.110824999999977,76.124145999999996],[-90.308884000000035,76.138321000000076],[-90.448607999999979,76.154984000000013],[-90.666397000000018,76.166930999999977],[-90.786117999999988,76.171371000000136],[-90.937209999999936,76.180817000000104],[-91.112212999999883,76.191924999999912],[-91.204726999999934,76.212769000000094],[-91.219726999999978,76.218323000000055],[-91.256957999999941,76.227203000000088],[-91.274444999999957,76.230270000000019],[-91.423614999999984,76.253876000000105],[-91.445830999999941,76.256653000000028],[-91.571395999999936,76.26527400000009],[-91.59722899999997,76.264999000000103],[-91.613616999999977,76.262206999999989],[-91.599730999999963,76.25610400000005],[-91.579453000000001,76.251663000000121],[-91.416655999999989,76.22526600000009],[-91.332779000000016,76.214157],[-91.33666999999997,76.178588999999988],[-91.27194199999991,76.155822999999941],[-91.220276000000013,76.161651999999947],[-91.203339000000028,76.16137700000013],[-91.163329999999974,76.159714000000008],[-91.116652999999985,76.15637200000009],[-90.882491999999957,76.137207000000103],[-90.700287000000003,76.119431000000134],[-90.67971799999998,76.117203000000018],[-90.665008999999998,76.112198000000149],[-90.757506999999976,76.07638500000013],[-90.785277999999948,76.072769000000051],[-90.809432999999956,76.071930000000066],[-90.833618000000001,76.072769000000051],[-90.855270000000019,76.072220000000129],[-90.862502999999947,76.069992000000127],[-90.866104000000007,76.067215000000033],[-90.864715999999987,76.064987000000087],[-90.848891999999978,76.060806000000014],[-90.71578199999999,76.06343099999998],[-90.703605999999922,76.064926000000014],[-90.663940000000025,76.074265000000025],[-90.660941999999864,76.076431000000014],[-90.611664000000019,76.084717000000069],[-90.599166999999966,76.088042999999971],[-90.575012000000015,76.090271000000087],[-90.548339999999939,76.091370000000097],[-90.474166999999966,76.089706000000035],[-90.429442999999992,76.088318000000129],[-90.408614999999998,76.08638000000002],[-90.194442999999922,76.062759000000142],[-90.190552000000025,76.06109600000002],[-90.193877999999984,76.055251999999996],[-90.202498999999989,76.050261999999975],[-90.215012000000002,76.04582199999993],[-90.233886999999925,76.041092000000106],[-90.27416999999997,76.034424000000115],[-90.301666000000012,76.032486000000006],[-90.328613000000018,76.031372000000033],[-90.404723999999931,76.031096999999988],[-90.635947999999985,76.028152000000034],[-90.718452000000013,76.022658999999976],[-90.904175000000009,76.015549000000021],[-90.929168999999888,76.015549000000021],[-91.005279999999971,76.024994000000049],[-91.144729999999981,76.021102999999982],[-91.160827999999924,76.018051000000071],[-91.155272999999909,76.014160000000004],[-91.069732999999928,75.990265000000022],[-90.950286999999946,75.962204000000099],[-90.941939999999988,75.955551000000128],[-90.938598999999954,75.951385000000016],[-90.941939999999988,75.945526000000029],[-90.948882999999967,75.939972000000012],[-90.968063000000029,75.931091000000094],[-91.016953000000001,75.925537000000077],[-91.070557000000008,75.922484999999995],[-91.100280999999995,75.918594000000098],[-91.118880999999931,75.913879000000065],[-91.129439999999988,75.908600000000092],[-91.143340999999964,75.897217000000069],[-91.125823999999852,75.857483000000002],[-91.132492000000013,75.851928999999984],[-91.135833999999932,75.846099999999979],[-91.134170999999924,75.842484000000127],[-91.129990000000021,75.839157],[-91.107498000000021,75.840545999999961],[-91.091675000000009,75.843323000000055],[-91.079452999999944,75.848038000000088],[-91.053328999999906,75.881087999999977],[-90.939986999999974,75.915268000000083],[-90.903060999999923,75.924698000000149],[-90.895844000000011,75.927200000000028],[-90.886123999999995,75.931655999999975],[-90.847778000000005,75.952208999999982],[-90.833618000000001,75.96026599999999],[-90.827788999999996,75.966385000000002],[-90.805557000000022,75.985535000000141],[-90.793883999999991,75.99470500000001],[-90.777495999999985,75.996094000000028],[-90.755843999999968,75.994980000000055],[-90.717223999999931,75.989151000000049],[-90.569457999999941,75.979980000000069],[-90.48332199999993,75.980270000000075],[-90.464447000000007,75.978591999999992],[-90.444716999999969,75.974151999999947],[-90.433318999999983,75.97026100000005],[-90.429442999999992,75.968323000000112],[-90.434158000000025,75.963318000000072],[-90.442490000000021,75.959717000000012],[-90.49221799999998,75.945816000000036],[-90.519164999999987,75.936096000000134],[-90.526107999999965,75.930541999999946],[-90.528335999999911,75.925537000000077],[-90.531386999999938,75.913605000000132],[-90.531676999999945,75.903595000000053],[-90.529998999999862,75.898331000000042],[-90.521118000000001,75.895538000000101],[-90.504729999999938,75.895263999999941],[-90.496947999999975,75.897766000000047],[-90.34722899999997,75.949417000000096],[-90.342223999999987,75.953049000000078],[-90.337783999999999,75.963043000000084],[-90.339447000000007,75.968323000000112],[-90.256957999999941,75.966933999999981],[-90.118057000000022,75.941924999999969],[-90.114440999999943,75.947753999999975],[-90.102492999999981,75.961654999999951],[-90.072509999999966,75.995529000000147],[-90.060271999999998,76.00471500000009],[-90.052779999999984,76.007217000000026],[-90.037506000000008,76.009155000000135],[-90.015015000000005,76.010269000000108],[-89.966659999999877,76.008605999999986],[-89.947495000000004,76.007217000000026],[-89.929717999999923,76.00471500000009],[-89.924437999999952,76.00221300000004],[-89.909163999999976,75.964995999999985],[-89.825012000000015,75.943038999999942],[-89.687499999999943,75.899993999999992],[-89.689986999999917,75.894989000000123],[-89.702224999999999,75.879700000000071],[-89.70944199999991,75.874146000000053],[-89.724441999999954,75.863036999999963],[-89.750290000000007,75.846649000000127],[-89.772781000000009,75.836380000000077],[-89.778885000000002,75.831665000000044],[-89.782227000000034,75.825821000000019],[-89.776397999999972,75.792755000000056],[-89.775008999999955,75.787491000000102],[-89.765014999999948,75.785812000000078],[-89.738891999999964,75.786652000000117],[-89.692490000000021,75.796371000000136],[-89.68638599999997,75.802474999999959],[-89.688048999999978,75.804428000000087],[-89.689162999999951,75.809708000000001],[-89.685546999999985,75.814147999999989],[-89.61999499999996,75.853592000000106],[-89.611114999999927,75.857208000000128],[-89.587508999999955,75.859146000000067],[-89.558334000000002,75.857483000000002],[-89.439163000000008,75.845260999999994],[-89.422774999999945,75.841934000000094],[-89.410277999999948,75.829712000000086],[-89.392501999999979,75.821105999999986],[-89.37777699999998,75.816665999999998],[-89.320007000000032,75.803863999999976],[-89.277495999999928,75.798324999999977],[-89.201401000000033,75.786926000000051],[-89.172775000000001,75.780548000000124],[-89.164169000000015,75.774704000000099],[-89.160278000000005,75.768051000000128],[-89.160552999999936,75.755828999999949],[-89.166945999999996,75.7452550000001],[-89.253890999999953,75.631088000000034],[-89.262787000000003,75.627761999999962],[-89.275008999999955,75.627761999999962],[-89.336670000000026,75.627761999999962],[-89.543059999999969,75.610535000000141],[-89.649170000000026,75.61554000000001],[-89.763061999999991,75.577484000000027],[-89.765288999999882,75.575546000000088],[-89.739440999999943,75.573607999999922],[-89.722504000000015,75.574157999999954],[-89.681945999999868,75.57998699999996],[-89.649993999999992,75.587204000000099],[-89.605559999999912,75.589705999999978],[-89.588332999999921,75.58859300000006],[-89.550995,75.579711999999972],[-89.542496000000028,75.570540999999992],[-89.548614999999984,75.566085999999984],[-89.56806899999998,75.5619200000001],[-89.628325999999959,75.561370999999951],[-89.676392000000021,75.562194999999917],[-89.692490000000021,75.561096000000134],[-89.706954999999994,75.557480000000055],[-89.700835999999981,75.553040000000067],[-89.645553999999947,75.548325000000034],[-89.576674999999966,75.547759999999982],[-89.550827000000027,75.548873999999955],[-89.526397999999915,75.551926000000094],[-89.515015000000005,75.554152999999985],[-89.500564999999995,75.558868000000018],[-89.491942999999992,75.565535999999952],[-89.473617999999874,75.574707000000103],[-89.458618000000001,75.579436999999928],[-89.441665999999998,75.583327999999995],[-89.431670999999994,75.584427000000005],[-89.403335999999967,75.587204000000099],[-89.351669000000015,75.589157000000057],[-89.302215999999987,75.589157000000057],[-89.235824999999977,75.586655000000121],[-89.217223999999987,75.584991000000116],[-89.182770000000005,75.577208999999982],[-89.174438000000009,75.572768999999994],[-89.168335000000013,75.566666000000055],[-89.156386999999938,75.549713000000111],[-89.154998999999975,75.544434000000138],[-89.149170000000026,75.532211000000075],[-89.143065999999976,75.524429000000112],[-89.09973100000002,75.484146000000067],[-88.963897999999972,75.431931000000077],[-88.950561999999934,75.429703000000131],[-88.921386999999982,75.427199999999971],[-88.87110899999999,75.43414300000012],[-88.841675000000009,75.436371000000065],[-88.818618999999956,75.436920000000043],[-88.796951000000035,75.434982000000105],[-88.779723999999987,75.432479999999998],[-88.768889999999942,75.434708000000001],[-88.747771999999941,75.470825000000104],[-88.75,75.474991000000045],[-88.801392000000021,75.531372000000147],[-88.865829000000019,75.586105000000089],[-88.755004999999983,75.676650999999936],[-88.738892000000021,75.67942800000003],[-88.722777999999892,75.679153000000042],[-88.678329000000019,75.675261999999975],[-88.631667999999991,75.667206000000078],[-88.600829999999917,75.659424000000115],[-88.574172999999917,75.648880000000077],[-88.542770000000019,75.635818000000029],[-88.50778200000002,75.619431000000077],[-88.448883000000023,75.59526100000005],[-88.399445000000014,75.579162999999994],[-88.364166000000012,75.568878000000097],[-88.315826000000015,75.556366000000082],[-88.228881999999999,75.539429000000098],[-88.203613000000018,75.531097000000102],[-88.198882999999967,75.528595000000053],[-88.196945000000028,75.522766000000047],[-88.198607999999979,75.517212000000029],[-88.201401000000033,75.512206999999989],[-88.217498999999918,75.509720000000073],[-88.240828999999962,75.509155000000078],[-88.290833000000021,75.49693300000007],[-88.305831999999896,75.492203000000075],[-88.301391999999964,75.488037000000134],[-88.295273000000009,75.484985000000052],[-88.263061999999934,75.476089000000115],[-88.228881999999999,75.471099999999979],[-88.21305799999999,75.470535000000098],[-88.200835999999924,75.471924000000115],[-88.148055999999997,75.488876000000118],[-88.12249799999995,75.501099000000011],[-88.06806899999998,75.521927000000062],[-87.958054000000004,75.544144000000131],[-87.751403999999923,75.576660000000061],[-87.716110000000015,75.575271999999927],[-87.697768999999937,75.573607999999922],[-87.661391999999921,75.567215000000147],[-87.648346000000004,75.5619200000001],[-87.495543999999995,75.485809000000017],[-87.494995000000017,75.483871000000079],[-87.498885999999914,75.478043000000127],[-87.504729999999995,75.474425999999994],[-87.529998999999918,75.465271000000143],[-87.563889000000017,75.459152000000074],[-87.588607999999965,75.456375000000037],[-87.601394999999968,75.453323000000069],[-87.606383999999935,75.449707000000046],[-87.594726999999978,75.446365000000071],[-87.58277899999996,75.444702000000007],[-87.568344000000025,75.443588000000034],[-87.548614999999927,75.444427000000132],[-87.533614999999884,75.446090999999967],[-87.5,75.452209000000096],[-87.459732000000031,75.461380000000077],[-87.445830999999941,75.465271000000143],[-87.434433000000013,75.468871999999976],[-87.4183349999999,75.479706000000078],[-87.416397000000018,75.485260000000039],[-87.430283000000031,75.501099000000011],[-87.437774999999988,75.5086060000001],[-87.444442999999922,75.513885000000073],[-87.46665999999999,75.521103000000096],[-87.462783999999942,75.563034000000073],[-87.393065999999976,75.604156000000103],[-87.381103999999937,75.609420999999998],[-87.354720999999984,75.61303700000002],[-87.285552999999879,75.620255000000043],[-87.263335999999981,75.621094000000028],[-87.25111400000003,75.621094000000028],[-87.234160999999915,75.618317000000104],[-87.088057999999933,75.57998699999996],[-87.079178000000013,75.566666000000055],[-87.072783999999956,75.559981999999991],[-87.055267000000015,75.546936000000017],[-87.011948000000018,75.531372000000147],[-86.967498999999975,75.518326000000002],[-86.931106999999997,75.508041000000048],[-86.914444000000003,75.503876000000048],[-86.862777999999935,75.491653000000042],[-86.807495000000017,75.479156000000046],[-86.771117999999944,75.475540000000137],[-86.72222899999997,75.474991000000045],[-86.643340999999964,75.478043000000127],[-86.631103999999993,75.477767999999912],[-86.601943999999946,75.476379000000122],[-86.583892999999875,75.474701000000039],[-86.567504999999983,75.472214000000122],[-86.48332199999993,75.456650000000025],[-86.464721999999995,75.452773999999977],[-86.375548999999978,75.427475000000129],[-86.365554999999972,75.423309000000074],[-86.368880999999988,75.418320000000108],[-86.389175000000023,75.40776100000005],[-86.400283999999999,75.402205999999978],[-86.415282999999988,75.398880000000133],[-86.506392999999946,75.388046000000031],[-86.553878999999938,75.381363000000079],[-86.576675000000023,75.377197000000024],[-86.611114999999984,75.36831699999999],[-86.615279999999984,75.365540000000067],[-86.596663999999976,75.361649],[-86.544723999999974,75.35914600000001],[-86.520279000000016,75.360259999999982],[-86.491942999999935,75.362762000000089],[-86.376099000000011,75.376373000000058],[-86.358336999999949,75.379699999999957],[-86.245270000000005,75.401932000000045],[-86.198607999999922,75.416091999999935],[-86.169997999999964,75.418594000000041],[-86.082503999999972,75.421371000000136],[-86.031386999999938,75.422485000000108],[-85.833618000000001,75.416091999999935],[-85.680557000000022,75.408034999999984],[-85.674438000000009,75.418320000000108],[-85.908614999999941,75.460266000000104],[-86.006392999999889,75.472214000000122],[-86.109726000000023,75.481934000000024],[-86.124709999999993,75.485535000000084],[-86.138335999999924,75.489975000000072],[-86.149445000000014,75.496368000000075],[-86.154449,75.500823999999966],[-86.143065999999976,75.508041000000048],[-86.11332699999997,75.514999000000046],[-86.096953999999982,75.51776099999995],[-86.00389100000001,75.531372000000147],[-85.908614999999941,75.543868999999916],[-85.865554999999972,75.544708000000071],[-85.763061999999991,75.546097000000088],[-85.44387799999987,75.560256999999979],[-85.329178000000013,75.561096000000134],[-85.303328999999962,75.568878000000097],[-85.189986999999917,75.611923000000047],[-85.074172999999917,75.651931999999988],[-85.054442999999992,75.656096999999988],[-85.039169000000015,75.657760999999994],[-84.926940999999943,75.658874999999966],[-84.879165999999884,75.656937000000028],[-84.797226000000023,75.652771000000143],[-84.763061999999934,75.650269000000037],[-84.71833799999996,75.642761000000064],[-84.683883999999921,75.634430000000123],[-84.62249799999995,75.628036000000066],[-84.59973100000002,75.626647999999989],[-84.572234999999978,75.626373000000001],[-84.524719000000005,75.628036000000066],[-84.497497999999894,75.631653000000028],[-84.503066999999987,75.633330999999998],[-84.519454999999937,75.636108000000036],[-84.539992999999981,75.637772000000098],[-84.557220000000029,75.63888500000013],[-84.607773000000009,75.639160000000004],[-84.63110399999988,75.640548999999965],[-84.651107999999965,75.643599999999992],[-84.657226999999921,75.647491000000059],[-84.66361999999998,75.68609600000002],[-84.644454999999994,75.687194999999974],[-84.482773000000009,75.694427000000076],[-84.350554999999872,75.697754000000032],[-84.322783999999956,75.699141999999938],[-84.299164000000019,75.70277400000009],[-84.070556999999951,75.761932000000115],[-83.929442999999878,75.810806000000071],[-83.878150999999946,75.818962000000056],[-83.767226999999934,75.824158000000125],[-83.740554999999972,75.824432000000058],[-83.722503999999958,75.822495000000004],[-83.703887999999949,75.818329000000062],[-83.698043999999925,75.814423000000033],[-83.706389999999942,75.812195000000088],[-83.72193900000002,75.810806000000071],[-83.74888599999997,75.80664100000007],[-83.752228000000002,75.801376000000005],[-83.736938000000009,75.795258000000047],[-83.698607999999979,75.790268000000026],[-83.672774999999945,75.788879000000009],[-83.619995000000017,75.789429000000041],[-83.56610099999989,75.791656000000103],[-83.515288999999882,75.789703000000145],[-83.495269999999948,75.78637700000013],[-83.479720999999927,75.782211000000018],[-83.464721999999995,75.776093000000117],[-83.458344000000011,75.770264000000054],[-83.447768999999994,75.755828999999949],[-83.43360899999999,75.750274999999988],[-83.419158999999866,75.748870999999951],[-83.292220999999927,75.737762000000089],[-83.123610999999983,75.734421000000054],[-83.065276999999924,75.739151000000049],[-82.960007000000019,75.756103999999993],[-82.82028200000002,75.781937000000084],[-82.799437999999952,75.786102000000085],[-82.664718999999991,75.811371000000122],[-82.466400000000021,75.828048999999965],[-82.327224999999942,75.836928999999998],[-82.279175000000009,75.836655000000064],[-82.139998999999875,75.826934999999992],[-81.95666499999993,75.815261999999962],[-81.885559000000001,75.811096000000077],[-81.660827999999924,75.811371000000122],[-81.536941999999954,75.809417999999994],[-81.450561999999991,75.800812000000064],[-81.212509000000011,75.771378000000084],[-81.22084000000001,75.704712000000029],[-81.276671999999962,75.668320000000051],[-81.281677000000002,75.663605000000018],[-81.285278000000005,75.657486000000006],[-81.271118000000001,75.651382000000126],[-81.256957999999997,75.649719000000005],[-81.010009999999966,75.633330999999998],[-80.983886999999982,75.633330999999998],[-80.857772999999952,75.634995000000004],[-80.779998999999918,75.637772000000098],[-80.547226000000023,75.650818000000015],[-80.502501999999936,75.652206000000092],[-80.480559999999969,75.651093000000003],[-80.46665999999999,75.649428999999998],[-80.316955999999948,75.630539000000056],[-80.275283999999999,75.624985000000095],[-80.256119000000012,75.62164300000012],[-80.199158000000011,75.608871000000136],[-80.101944000000003,75.586929000000055],[-80.068344000000025,75.578872999999987],[-79.953612999999962,75.540268000000083],[-79.948607999999922,75.534149000000014],[-79.956115999999952,75.530822999999998],[-80.085006999999905,75.507766999999944],[-80.191665999999884,75.489975000000072],[-80.252501999999993,75.485809000000017],[-80.355269999999962,75.473877000000073],[-80.371932999999956,75.468871999999976],[-80.373046999999929,75.463042999999971],[-80.358337000000006,75.458602999999982],[-80.338607999999908,75.456375000000037],[-80.306655999999919,75.456099999999992],[-80.108046999999942,75.469147000000021],[-80.000289999999893,75.476928999999984],[-79.929168999999945,75.479706000000078],[-79.73332199999993,75.471924000000115],[-79.714721999999995,75.470535000000098],[-79.644164999999987,75.462494000000049],[-79.586394999999982,75.454712000000086],[-79.574721999999895,75.449997000000053],[-79.581954999999994,75.446365000000071],[-79.635559000000001,75.445815999999979],[-79.656386999999995,75.444138000000066],[-79.675551999999925,75.441360000000032],[-79.683059999999955,75.435806000000071],[-79.682495000000017,75.430817000000104],[-79.62222300000002,75.402480999999966],[-79.605559999999969,75.398041000000148],[-79.561660999999958,75.394989000000066],[-79.520003999999972,75.391098],[-79.503066999999987,75.388596000000064],[-79.488051999999925,75.383330999999998],[-79.486937999999952,75.379974000000061],[-79.488601999999958,75.362487999999928],[-79.510009999999966,75.338043000000084],[-79.527495999999928,75.322220000000073],[-79.539443999999889,75.317763999999954],[-79.563323999999966,75.31860400000005],[-79.596664000000033,75.316086000000041],[-79.610000999999897,75.310806000000014],[-79.61471599999993,75.305542000000003],[-79.611938000000009,75.298325000000091],[-79.587508999999898,75.287491000000045],[-79.570847000000015,75.283051],[-79.548889000000031,75.281096999999988],[-79.443084999999996,75.280190000000061],[-79.506957999999884,75.229980000000069],[-79.571121000000005,75.199142000000052],[-79.629439999999988,75.174987999999928],[-79.651672000000019,75.172484999999995],[-79.731948999999929,75.164703000000031],[-79.774170000000026,75.167205999999965],[-79.835555999999997,75.160262999999986],[-79.929442999999878,75.140549000000078],[-79.944152999999915,75.136383000000023],[-79.954726999999934,75.12692300000009],[-79.955841000000021,75.113876000000118],[-79.955275999999969,75.106644000000017],[-79.955841000000021,75.100266000000033],[-79.960555999999883,75.094711000000132],[-79.974166999999852,75.08998100000008],[-80.128875999999991,75.068054000000018],[-80.150832999999977,75.065536000000066],[-80.215012000000002,75.063309000000004],[-80.296111999999994,75.058868000000075],[-80.440552000000025,75.038040000000024],[-80.427489999999921,75.029984000000127],[-80.402495999999928,75.021103000000039],[-80.327498999999989,74.998596000000134],[-80.310546999999985,74.996368000000132],[-80.297225999999966,74.996643000000006],[-80.238892000000021,74.994431000000134],[-80.194442999999978,74.989975000000015],[-80.182219999999916,74.986649],[-80.173888999999917,74.982483000000059],[-80.184158000000025,74.979430999999977],[-80.216110000000015,74.976089000000002],[-80.243057000000022,74.973038000000031],[-80.258347000000015,74.969711000000075],[-80.271941999999967,74.964996000000042],[-80.278884999999946,74.959427000000062],[-80.278884999999946,74.957214000000079],[-80.274170000000026,74.951096000000121],[-80.266112999999962,74.946640000000059],[-80.240828999999962,74.946640000000059],[-80.033614999999941,74.974426000000108],[-80.026946999999893,74.979980000000069],[-80.013061999999991,74.986923000000104],[-79.975280999999995,74.9994200000001],[-79.942764000000011,75.006943000000092],[-79.919158999999922,75.010543999999982],[-79.795273000000009,75.027480999999966],[-79.776947000000007,75.028320000000122],[-79.716400000000021,75.028869999999984],[-79.692763999999954,75.028046000000018],[-79.613891999999964,75.01998900000001],[-79.59722899999997,75.017487000000131],[-79.582503999999915,75.014435000000049],[-79.505004999999926,74.998321999999973],[-79.501953000000015,74.99581900000004],[-79.507232999999985,74.993042000000116],[-79.535827999999924,74.991653000000099],[-79.555557000000022,74.987198000000092],[-79.551940999999943,74.981659000000093],[-79.464721999999995,74.933319000000097],[-79.442489999999907,74.921646000000067],[-79.426392000000021,74.917206000000022],[-79.391953000000001,74.911102000000028],[-79.35722399999986,74.907486000000119],[-79.338608000000022,74.903320000000065],[-79.334732000000031,74.899993999999992],[-79.333617999999944,74.896378000000141],[-79.333617999999944,74.894440000000031],[-79.335830999999928,74.889160000000118],[-79.370543999999995,74.876373000000115],[-79.390839000000028,74.872482000000048],[-79.501953000000015,74.859421000000111],[-79.530288999999925,74.857758000000047],[-79.580001999999979,74.858321999999987],[-79.732773000000009,74.836655000000121],[-79.851943999999946,74.818878000000041],[-79.860549999999989,74.814697000000137],[-79.880553999999904,74.813034000000073],[-79.930557000000022,74.813309000000061],[-80.06806899999998,74.836380000000077],[-80.25306699999993,74.870818999999983],[-80.274170000000026,74.881087999999977],[-80.28195199999999,74.889984000000084],[-80.293883999999935,74.919983000000116],[-80.293610000000001,74.926376000000062],[-80.296951000000035,74.931090999999924],[-80.306380999999988,74.939148000000102],[-80.321670999999981,74.937759000000085],[-80.335280999999952,74.933044000000052],[-80.362212999999997,74.923599000000024],[-80.386123999999882,74.913604999999961],[-80.396118000000001,74.908599999999922],[-80.413054999999986,74.897766000000047],[-80.416655999999932,74.89387499999998],[-80.416107000000011,74.88888500000013],[-80.361114999999984,74.868866000000025],[-80.347777999999948,74.864990000000148],[-80.329726999999991,74.861374000000069],[-80.296951000000035,74.856934000000081],[-80.261123999999995,74.852767999999969],[-80.224166999999966,74.849426000000051],[-80.18638599999997,74.843323000000112],[-80.153609999999958,74.836655000000121],[-80.108611999999994,74.824432000000058],[-80.097778000000005,74.820267000000058],[-80.101668999999958,74.789154000000053],[-80.159164000000033,74.730269999999962],[-80.191375999999934,74.698029000000076],[-80.156112999999948,74.636932000000058],[-80.148894999999925,74.631088000000034],[-80.146666999999979,74.626923000000033],[-80.149444999999957,74.622482000000105],[-80.161391999999921,74.612198000000092],[-80.231673999999998,74.578049000000078],[-80.248046999999985,74.576096000000121],[-80.253715999999997,74.576050000000066],[-80.339995999999985,74.580551000000128],[-80.385009999999966,74.5816650000001],[-80.454453000000001,74.580825999999945],[-80.468886999999938,74.579436999999984],[-80.488891999999964,74.575546000000088],[-80.591674999999952,74.56442300000009],[-80.753066999999987,74.563309000000118],[-80.844161999999983,74.562759000000085],[-80.951950000000011,74.566086000000041],[-80.974715999999944,74.566939999999988],[-80.994155999999919,74.569717000000082],[-81.029998999999975,74.576660000000061],[-81.049727999999959,74.579163000000051],[-81.069457999999884,74.579711999999972],[-81.219161999999983,74.571381000000088],[-81.269729999999981,74.566086000000041],[-81.287505999999951,74.563034000000073],[-81.510833999999988,74.514434999999935],[-81.670836999999949,74.478592000000106],[-81.759170999999924,74.461105000000089],[-81.785003999999958,74.457764000000054],[-81.810821999999973,74.456940000000088],[-81.854720999999984,74.459427000000119],[-82.060546999999929,74.475540000000024],[-82.081680000000006,74.477203000000088],[-82.101395000000025,74.479706000000078],[-82.327498999999989,74.510544000000095],[-82.511123999999995,74.527206000000035],[-82.557219999999973,74.514709000000096],[-82.574722000000008,74.511658000000068],[-82.592498999999975,74.510544000000095],[-82.615279999999984,74.511108000000036],[-82.74749799999995,74.518051000000014],[-82.783614999999941,74.520263999999997],[-82.871933000000013,74.538589000000059],[-82.914169000000015,74.549149],[-82.953613000000018,74.565810999999997],[-83.018340999999907,74.594436999999914],[-83.056380999999988,74.61554000000001],[-83.079726999999934,74.630264000000068],[-83.088607999999965,74.636658000000125],[-83.092498999999975,74.641372999999987],[-83.102218999999934,74.65415999999999],[-83.12388599999997,74.684982000000048],[-83.128051999999968,74.691925000000026],[-83.131942999999978,74.708328000000108],[-83.128051999999968,74.71748400000007],[-83.107772999999952,74.748032000000023],[-83.090835999999854,74.757767000000115],[-83.075012000000015,74.762206999999933],[-83.041381999999942,74.769989000000066],[-83.028884999999946,74.774993999999936],[-83.02305599999994,74.780548000000124],[-83.024170000000026,74.783325000000048],[-83.081680000000006,74.818054000000075],[-83.09584000000001,74.82388300000008],[-83.105269999999962,74.826660000000004],[-83.116104000000007,74.828597999999943],[-83.15583799999996,74.826935000000049],[-83.203063999999983,74.820830999999998],[-83.227782999999874,74.820540999999992],[-83.24888599999997,74.823608000000092],[-83.299727999999959,74.835541000000148],[-83.33666999999997,74.849426000000051],[-83.380829000000006,74.866379000000109],[-83.402221999999938,74.875259000000142],[-83.475554999999929,74.896652000000074],[-83.511397999999986,74.901657000000114],[-83.52806099999998,74.901657000000114],[-83.547500999999954,74.897491000000059],[-83.55972300000002,74.892487000000074],[-83.560546999999985,74.887206999999989],[-83.559433000000013,74.880814000000044],[-83.556945999999925,74.875259000000142],[-83.527221999999995,74.84526100000005],[-83.518616000000009,74.839432000000045],[-83.472504000000015,74.815262000000018],[-83.458617999999944,74.808028999999976],[-83.429992999999911,74.797484999999938],[-83.394164999999987,74.790268000000026],[-83.375274999999931,74.786926000000108],[-83.354995999999971,74.784424000000001],[-83.327498999999932,74.779160000000047],[-83.318893000000003,74.774993999999936],[-83.324172999999973,74.755264000000125],[-83.327498999999932,74.75],[-83.454726999999991,74.591094999999996],[-83.474441999999954,74.579711999999972],[-83.484160999999972,74.574996999999939],[-83.598891999999978,74.543594000000098],[-83.611664000000019,74.540817000000004],[-83.720839999999953,74.545532000000037],[-83.785552999999936,74.548598999999967],[-83.805556999999965,74.550812000000121],[-83.830840999999964,74.551376000000062],[-83.855270000000019,74.550812000000121],[-83.907501000000025,74.546936000000073],[-84.037780999999939,74.53414900000007],[-84.063323999999966,74.530822999999998],[-84.107498000000021,74.523314999999968],[-84.145844000000011,74.515548999999965],[-84.216400000000021,74.507216999999969],[-84.238892000000021,74.505554000000018],[-84.285552999999936,74.50360100000006],[-84.332778999999903,74.503876000000105],[-84.355835000000013,74.504440000000045],[-84.396118000000001,74.507492000000127],[-84.641678000000013,74.506943000000035],[-84.850280999999995,74.502212999999983],[-84.871384000000035,74.501389000000017],[-84.889450000000011,74.502212999999983],[-84.899445000000014,74.503326000000072],[-84.91194200000001,74.508041000000105],[-84.916655999999932,74.511108000000036],[-84.983063000000016,74.570541000000048],[-84.985275000000001,74.579163000000051],[-84.974715999999944,74.617477000000065],[-84.960281000000009,74.656937000000084],[-84.955001999999865,74.66276600000009],[-84.950835999999981,74.668869000000029],[-84.950835999999981,74.672760000000096],[-84.952498999999989,74.679153000000042],[-84.955565999999976,74.684708000000114],[-84.964172000000019,74.691925000000026],[-84.973327999999867,74.696091000000138],[-84.990554999999972,74.698029000000076],[-85.003341999999975,74.697479000000044],[-85.063888999999961,74.651657],[-85.072509999999966,74.641098000000113],[-85.044723999999917,74.612198000000092],[-85.037506000000008,74.541092000000049],[-85.036941999999954,74.535263000000043],[-85.038604999999961,74.528870000000097],[-85.043609999999944,74.523314999999968],[-85.074172999999917,74.508880999999974],[-85.087783999999886,74.504990000000078],[-85.104720999999984,74.501663000000121],[-85.125274999999931,74.49859600000002],[-85.21444699999995,74.49192800000003],[-85.259445000000028,74.490540000000124],[-85.353057999999976,74.49859600000002],[-85.363616999999977,74.501937999999996],[-85.369995000000017,74.509430000000066],[-85.363891999999964,74.537490999999989],[-85.365554999999972,74.544144000000131],[-85.370270000000005,74.552475000000072],[-85.468613000000005,74.658875000000023],[-85.474166999999909,74.664428999999984],[-85.482773000000009,74.671646000000123],[-85.49499499999996,74.679153000000042],[-85.504455999999948,74.683318999999926],[-85.520554000000004,74.688033999999959],[-85.527221999999881,74.688873000000115],[-85.543335000000013,74.686371000000065],[-85.549987999999985,74.68193100000002],[-85.524170000000026,74.598602000000142],[-85.520844000000011,74.593048000000124],[-85.509170999999981,74.579987000000017],[-85.486938000000009,74.561096000000134],[-85.481948999999929,74.554152999999985],[-85.479996000000028,74.547760000000039],[-85.479171999999949,74.541655999999989],[-85.480285999999921,74.537200999999982],[-85.50389100000001,74.520538000000101],[-85.527221999999881,74.510269000000051],[-85.542220999999927,74.505554000000018],[-85.560546999999929,74.501389000000017],[-85.580840999999964,74.498322000000087],[-85.604172000000005,74.495818999999926],[-86.013335999999981,74.479431000000091],[-86.059433000000013,74.478592000000106],[-86.082503999999972,74.479156000000046],[-86.120834000000002,74.482207999999957],[-86.123046999999872,74.48332199999993],[-86.122771999999941,74.489975000000129],[-86.101105000000018,74.511383000000023],[-86.085555999999997,74.529434000000037],[-86.079178000000013,74.53915400000011],[-86.077788999999939,74.545257999999933],[-86.082779000000016,74.555251999999939],[-86.153610000000015,74.60914600000001],[-86.177779999999927,74.615265000000022],[-86.197494999999947,74.615265000000022],[-86.215835999999854,74.610809000000074],[-86.224441999999954,74.607758000000047],[-86.235001000000011,74.601929000000041],[-86.240554999999972,74.59693900000002],[-86.242766999999958,74.59137000000004],[-86.23443599999996,74.581100000000106],[-86.227492999999981,74.575271999999984],[-86.223052999999936,74.562194999999974],[-86.232223999999974,74.540268000000083],[-86.235275000000001,74.535263000000043],[-86.244719999999973,74.52388000000002],[-86.278885000000002,74.508605999999929],[-86.332779000000016,74.490265000000136],[-86.399170000000026,74.479431000000091],[-86.423324999999977,74.478866999999923],[-86.443603999999993,74.481093999999985],[-86.462508999999955,74.485535000000084],[-86.633330999999998,74.526093000000003],[-86.664168999999958,74.534714000000065],[-86.69110099999989,74.544144000000131],[-86.708618000000001,74.551086000000055],[-86.720839999999896,74.558594000000085],[-86.759170999999981,74.586380000000133],[-86.762786999999946,74.591933999999981],[-86.761672999999973,74.598037999999974],[-86.751403999999866,74.60386699999998],[-86.74610899999999,74.608871000000136],[-86.75111400000003,74.613602000000071],[-86.766952999999944,74.616088999999988],[-86.785277999999948,74.616928000000144],[-86.799437999999952,74.615265000000022],[-86.801101999999958,74.611374000000126],[-86.800551999999925,74.552200000000028],[-86.797226000000023,74.543594000000098],[-86.794448999999986,74.539978000000076],[-86.705565999999976,74.500275000000045],[-86.693603999999937,74.468048000000067],[-86.905838000000017,74.460541000000092],[-87.225829999999917,74.466934000000094],[-87.27027899999996,74.468323000000055],[-87.304169000000002,74.471649000000127],[-87.320846999999958,74.476653999999996],[-87.352782999999931,74.495254999999986],[-87.474441999999954,74.475815000000011],[-87.508621000000005,74.46775800000006],[-87.527221999999995,74.465545999999961],[-87.574722000000008,74.461929000000055],[-87.669998000000021,74.459991000000059],[-87.710830999999928,74.460815000000025],[-87.732223999999974,74.466385000000116],[-87.755004999999983,74.479431000000091],[-87.848052999999993,74.476089000000115],[-87.903610000000015,74.472214000000122],[-88.036117999999931,74.476928999999984],[-88.263625999999988,74.483597000000145],[-88.356109999999944,74.489150999999993],[-88.496947999999861,74.497757000000092],[-88.517226999999991,74.499709999999993],[-88.529723999999987,74.501937999999996],[-88.535277999999948,74.50360100000006],[-88.539992999999981,74.50610400000005],[-88.571121000000005,74.549987999999985],[-88.570846999999958,74.556091000000094],[-88.560821999999973,74.593048000000124],[-88.542220999999984,74.616088999999988],[-88.406386999999995,74.736098999999967],[-88.347504000000015,74.784714000000008],[-88.484725999999966,74.857758000000047],[-88.528060999999866,74.901931999999988],[-88.537216000000001,74.906937000000028],[-88.547774999999945,74.907760999999994],[-88.557220000000029,74.906647000000021],[-88.56806899999998,74.901382000000126],[-88.664718999999934,74.844986000000006],[-88.675827000000027,74.836929000000055],[-88.74360699999994,74.78387500000008],[-88.749724999999899,74.77777100000003],[-88.752501999999993,74.768326000000002],[-88.75306699999993,74.756103999999993],[-88.749724999999899,74.749709999999936],[-88.748885999999914,74.741364000000033],[-88.749434999999949,74.726089000000059],[-88.753341999999918,74.714157000000114],[-88.811935000000005,74.672211000000118],[-88.821395999999993,74.666382000000112],[-88.835555999999997,74.661377000000073],[-88.848343,74.659149000000127],[-88.862212999999997,74.658875000000023],[-88.873885999999914,74.6602630000001],[-88.883056999999951,74.665267999999969],[-88.889724999999999,74.670531999999923],[-88.917220999999984,74.719711000000132],[-88.918059999999855,74.732483000000116],[-88.914168999999958,74.749145999999996],[-88.910278000000005,74.754990000000021],[-88.905563000000029,74.75999500000006],[-88.904174999999952,74.765549000000078],[-88.906386999999995,74.773041000000035],[-88.909728999999857,74.77777100000003],[-88.926940999999943,74.78387500000008],[-89.073623999999882,74.833878000000027],[-89.088608000000022,74.837204000000042],[-89.097778000000005,74.836105000000089],[-89.099166999999966,74.835266000000104],[-89.059998000000007,74.797484999999938],[-89.053329000000019,74.793594000000041],[-89.042769999999905,74.789702999999975],[-89.011123999999938,74.780822999999941],[-89.010283999999956,74.775543000000084],[-89.012786999999946,74.770538000000045],[-89.041381999999999,74.730269999999962],[-89.047501000000011,74.722487999999998],[-89.055832000000009,74.719146999999964],[-89.077788999999882,74.717209000000025],[-89.102218999999991,74.719437000000028],[-89.178878999999938,74.732208000000128],[-89.178878999999938,74.735260000000039],[-89.181106999999997,74.739700000000028],[-89.190551999999968,74.744430999999963],[-89.223052999999993,74.752487000000031],[-89.243057000000022,74.755264000000125],[-89.265014999999948,74.756378000000097],[-89.271118000000001,74.754715000000033],[-89.216400000000021,74.721100000000092],[-89.202498999999932,74.713882000000126],[-89.189712999999927,74.708602999999925],[-89.141112999999962,74.698029000000076],[-89.12249799999995,74.696091000000138],[-89.105270000000019,74.693039000000056],[-89.095839999999953,74.688033999999959],[-89.095839999999953,74.68193100000002],[-89.125,74.616928000000144],[-89.131942999999922,74.611374000000126],[-89.150557999999933,74.599716000000114],[-89.185271999999998,74.587494000000106],[-89.196945000000028,74.584427000000005],[-89.438889000000017,74.550812000000121],[-89.455001999999922,74.548598999999967],[-89.489715999999987,74.545532000000037],[-89.580565999999976,74.540268000000083],[-89.92860399999995,74.530822999999998],[-89.946105999999986,74.532211000000132],[-90.106658999999979,74.549422999999933],[-90.223891999999921,74.563599000000124],[-90.244995000000017,74.566939999999988],[-90.263335999999924,74.570541000000048],[-90.363051999999982,74.594711000000075],[-90.45666499999993,74.600815000000068],[-90.496384000000035,74.601654000000053],[-90.529998999999862,74.605255000000113],[-90.589721999999995,74.613312000000064],[-90.607223999999917,74.616378999999995],[-90.619995000000017,74.619980000000055],[-90.70805399999989,74.648041000000148],[-90.731673999999941,74.664153999999996],[-90.736938000000009,74.669434000000024],[-90.739440999999999,74.673874000000069],[-90.747771999999998,74.703048999999965],[-90.75111400000003,74.716385000000059],[-90.867492999999911,74.702484000000084],[-90.875823999999966,74.691925000000026],[-90.885559000000001,74.683593999999971],[-90.895614999999964,74.681137000000092],[-91.013625999999988,74.698868000000061],[-91.024718999999948,74.70277400000009],[-91.023620999999991,74.706940000000031],[-91.012221999999952,74.717209000000025],[-90.978332999999964,74.739700000000028],[-90.965012000000002,74.747757000000036],[-90.945830999999941,74.751389000000131],[-90.938598999999954,74.750823999999966],[-90.926101999999958,74.751663000000065],[-90.896118000000001,74.75749200000007],[-90.883895999999936,74.761658000000011],[-90.851395000000025,74.776093000000117],[-90.758057000000008,74.831100000000049],[-90.752791999999943,74.835815000000082],[-90.740829000000019,74.847488000000112],[-90.742492999999911,74.852767999999969],[-90.746658000000025,74.860535000000084],[-90.75778200000002,74.880814000000044],[-90.772232000000031,74.884995000000117],[-90.816956000000005,74.883605999999986],[-90.841110000000015,74.879425000000083],[-90.853881999999942,74.875259000000142],[-90.863892000000021,74.869979999999998],[-90.870270000000005,74.86442599999998],[-90.874435000000005,74.859146000000123],[-90.87388599999997,74.853043000000014],[-90.883330999999998,74.84165999999999],[-90.975006000000008,74.799423000000104],[-91,74.789702999999975],[-91.075286999999946,74.761107999999979],[-91.101943999999946,74.751099000000124],[-91.132767000000001,74.744430999999963],[-91.144729999999981,74.747481999999991],[-91.14416499999993,74.751389000000131],[-91.146666999999923,74.755554000000132],[-91.171660999999972,74.75749200000007],[-91.188599000000011,74.752777000000037],[-91.216110000000015,74.738876000000062],[-91.225829999999917,74.733597000000088],[-91.228881999999942,74.727768000000083],[-91.226944000000003,74.722487999999998],[-91.185271999999941,74.684708000000114],[-91.177489999999977,74.678039999999953],[-91.154998999999975,74.665542999999957],[-91.11471599999993,74.645827999999995],[-91.105835000000013,74.63998400000014],[-91.098052999999879,74.633330999999998],[-91.099730999999963,74.62831100000011],[-91.106658999999979,74.625809000000061],[-91.133056999999951,74.624420000000043],[-91.256393000000003,74.628585999999984],[-91.455841000000021,74.639708999999982],[-91.539992999999924,74.646378000000027],[-91.553328999999962,74.648330999999985],[-91.676101999999901,74.671921000000111],[-91.684998000000007,74.677765000000136],[-91.671660999999972,74.689697000000081],[-91.664169000000015,74.693314000000044],[-91.634170999999981,74.696091000000138],[-91.621932999999956,74.700272000000041],[-91.620270000000005,74.704987000000074],[-91.624435000000005,74.709991000000059],[-91.635833999999932,74.715271000000087],[-91.651671999999962,74.719986000000119],[-91.708618000000001,74.727478000000076],[-91.754181000000017,74.727768000000083],[-91.779449,74.725815000000125],[-91.798888999999917,74.722214000000065],[-91.811110999999983,74.71804800000001],[-91.812499999999886,74.713042999999971],[-91.80296299999992,74.706184000000007],[-91.798888999999917,74.699416999999983],[-91.815551999999968,74.69470200000012],[-91.833069000000023,74.696091000000138],[-91.851105000000018,74.698868000000061],[-91.866652999999928,74.702209000000096],[-91.876663000000008,74.706940000000031],[-91.875274999999931,74.711928999999998],[-91.859160999999972,74.721100000000092],[-91.892226999999934,74.750823999999966],[-91.961944999999957,74.764160000000061],[-91.998610999999983,74.773041000000035],[-92.015838999999971,74.778320000000008],[-92.045546999999999,74.789702999999975],[-92.05749499999996,74.79664600000001],[-92.063613999999973,74.803588999999988],[-92.065276999999924,74.80720500000001],[-92.06639100000001,74.813309000000061],[-92.05749499999996,74.82499700000011],[-92.051665999999955,74.830551000000071],[-92.043334999999956,74.836380000000077],[-92.01916499999993,74.846099999999979],[-92.013061999999991,74.851928999999984],[-92.008056999999951,74.863602000000014],[-92.006393000000003,74.888046000000145],[-92.013335999999924,74.908325000000104],[-92.015288999999939,74.913604999999961],[-92.043334999999956,74.951935000000105],[-92.048049999999989,74.958328000000051],[-92.063323999999966,74.963882000000069],[-92.091674999999896,74.971649000000014],[-92.1058349999999,74.976654000000053],[-92.164169000000015,74.998031999999967],[-92.209732000000031,75.038588999999945],[-92.228881999999999,75.071105999999986],[-92.225829999999917,75.07388300000008],[-92.21556099999998,75.07638500000013],[-92.186385999999914,75.08137499999998],[-92.152495999999985,75.083878000000141],[-92.111664000000019,75.081940000000031],[-92.046188000000029,75.084961000000078],[-92.029998999999918,75.08638000000002],[-92.012511999999958,75.095260999999994],[-92.010009999999966,75.101089000000115],[-92.051392000000021,75.146942000000024],[-92.055557000000022,75.15026899999998],[-92.070556999999894,75.153046000000074],[-92.083618000000001,75.153320000000008],[-92.105269999999962,75.151932000000102],[-92.193329000000006,75.143326000000002],[-92.325561999999991,75.151657000000057],[-92.490829000000019,75.213608000000079],[-92.468886999999938,75.284714000000122],[-92.428604000000007,75.394440000000088],[-92.388335999999924,75.441925000000083],[-92.328063999999983,75.489151000000106],[-92.220276000000013,75.546097000000088],[-92.210281000000009,75.551376000000062],[-92.199431999999945,75.553864000000033],[-92.155838000000017,75.556641000000127],[-92.100280999999995,75.562759000000085],[-92.085830999999985,75.564987000000031],[-92.069457999999997,75.568878000000097],[-92.056655999999975,75.573043999999982],[-92.013901000000033,75.589157000000057],[-92.005004999999926,75.594986000000063],[-92.008346999999958,75.661377000000073],[-92.043609999999887,75.68553200000008],[-92.05749499999996,75.691359999999975],[-92.089995999999985,75.700272000000041],[-92.137512000000015,75.721100000000092],[-92.156661999999983,75.731094000000098],[-92.174437999999952,75.744431000000134],[-92.175551999999925,75.750549000000092],[-92.139724999999999,75.778319999999951],[-92.119155999999919,75.789154000000053],[-92.112777999999992,75.794708000000014],[-92.104720999999984,75.805252000000053],[-92.100554999999929,75.823043999999925],[-92.103881999999942,75.841369999999927],[-92.105269999999962,75.847488000000055],[-92.108611999999994,75.858871000000079],[-92.113327000000027,75.863602000000014],[-92.129714999999976,75.876373000000115],[-92.138061999999991,75.879974000000004],[-92.151108000000022,75.883041000000105],[-92.172774999999945,75.885544000000039],[-92.215012000000002,75.888321000000133],[-92.23832699999997,75.891373000000101],[-92.317779999999914,75.90498400000007],[-92.336394999999868,75.908600000000092],[-92.408614999999998,75.928589000000045],[-92.433060000000012,75.936371000000008],[-92.444442999999922,75.941086000000041],[-92.583618000000001,76.008881000000031],[-92.635833999999988,76.104155999999989],[-92.635833999999988,76.109711000000061],[-92.637222000000008,76.115814],[-92.793883999999935,76.20748900000001],[-92.809433000000013,76.212494000000049],[-92.946654999999964,76.245818999999926],[-93.066956000000005,76.299149],[-93.076674999999909,76.316939999999988],[-93.057220000000029,76.326660000000061],[-93.054992999999968,76.332489000000066],[-93.056380999999874,76.338593000000117],[-93.059158000000025,76.34387200000009],[-93.071945000000028,76.353317000000004],[-93.083618000000001,76.358032000000037],[-93.115279999999927,76.363876000000005],[-93.138061999999934,76.366378999999995],[-93.186935000000005,76.368317000000104],[-93.212783999999942,76.368042000000116],[-93.239989999999977,76.366653000000099],[-93.315276999999924,76.360259999999982],[-93.345275999999956,76.356094000000041],[-93.381377999999927,76.34637500000008],[-93.449996999999996,76.326385000000073],[-93.561934999999949,76.297211000000061],[-93.587783999999886,76.292755],[-93.617492999999968,76.291092000000049],[-93.635833999999988,76.291655999999989],[-93.658339999999896,76.293868999999972],[-93.666397000000018,76.298598999999967],[-93.653335999999911,76.302765000000079],[-93.624434999999892,76.30581699999999],[-93.623610999999926,76.310806000000127],[-93.636123999999995,76.326660000000061],[-93.654174999999896,76.325821000000133],[-93.678878999999938,76.322220000000073],[-93.718886999999995,76.312484999999981],[-93.731383999999991,76.306930999999963],[-93.763901000000033,76.286377000000016],[-93.763901000000033,76.282211000000132],[-93.761948000000018,76.280272999999966],[-93.753890999999953,76.275817999999958],[-93.74110399999995,76.271927000000062],[-93.720551,76.267761000000007],[-93.697220000000016,76.26388500000013],[-93.78443900000002,76.253052000000139],[-93.954453000000001,76.257767000000001],[-93.956116000000009,76.257767000000001],[-93.958343999999954,76.257767000000001],[-94.097504000000015,76.259430000000123],[-94.118880999999988,76.261383000000023],[-94.134170999999867,76.264709000000096],[-94.141387999999949,76.269989000000123],[-94.151671999999905,76.274155000000064],[-94.168610000000001,76.278320000000065],[-94.212509000000011,76.280822999999998],[-94.470839999999953,76.281096999999932],[-94.641677999999956,76.293319999999994],[-94.780288999999982,76.288879000000065],[-94.789992999999981,76.283600000000092],[-94.803329000000019,76.278320000000065],[-94.838608000000022,76.268326000000059],[-95.029174999999952,76.236099000000024],[-95.354995999999915,76.234146000000123],[-95.376099000000011,76.234421000000111],[-95.386947999999961,76.235809000000017],[-95.388061999999934,76.283600000000092],[-95.374435000000005,76.297760000000039],[-95.366942999999935,76.301376000000062],[-95.357223999999974,76.302765000000079],[-95.343063000000029,76.300262000000089],[-95.31806899999998,76.290817000000061],[-95.279175000000009,76.281372000000147],[-95.258895999999993,76.282760999999994],[-95.118332000000009,76.298035000000027],[-95.092772999999909,76.302765000000079],[-95.075561999999877,76.307754999999929],[-95.069732999999928,76.313309000000118],[-95.066558999999984,76.319862000000001],[-95.058883999999978,76.324706999999933],[-95.010558999999944,76.331100000000106],[-94.983886999999982,76.332489000000066],[-94.958892999999989,76.332214000000079],[-94.915008999999884,76.329711999999972],[-94.866394000000014,76.325546000000088],[-94.84973100000002,76.323317999999972],[-94.84056099999998,76.319717000000082],[-94.849990999999875,76.31442300000009],[-94.862777999999878,76.309981999999991],[-94.861663999999962,76.306930999999963],[-94.843613000000005,76.303864000000033],[-94.828613000000018,76.306091000000094],[-94.808608999999933,76.311371000000008],[-94.802489999999977,76.315536000000009],[-94.80082699999997,76.321655000000021],[-94.814163000000008,76.329163000000051],[-94.834441999999967,76.334427000000005],[-94.894729999999925,76.341660000000047],[-94.965012000000002,76.347487999999942],[-95.132767000000001,76.361374000000126],[-95.274719000000005,76.372208000000001],[-95.299437999999952,76.372482000000105],[-95.326401000000033,76.37081900000004],[-95.331679999999949,76.365265000000022],[-95.341384999999946,76.359711000000004],[-95.388900999999976,76.351929000000041],[-95.399993999999992,76.353317000000004],[-95.447220000000016,76.365813999999943],[-95.645279000000016,76.384155000000135],[-95.668335000000013,76.386108000000092],[-95.715835999999911,76.392211999999915],[-95.737502999999947,76.393875000000037],[-95.851105000000018,76.40109300000006],[-95.995834000000002,76.436919999999986],[-96.081679999999892,76.478043000000127],[-96.106948999999986,76.494430999999963],[-96.104171999999949,76.5],[-96.099166999999909,76.505553999999961],[-96.09056099999998,76.510268999999994],[-96.065552000000025,76.521378000000084],[-96.052489999999921,76.524155000000007],[-95.997222999999963,76.519440000000145],[-95.944991999999957,76.518326000000002],[-95.806380999999931,76.516388000000063],[-95.778609999999958,76.518875000000094],[-95.694152999999972,76.545258000000103],[-95.680557000000022,76.550537000000077],[-95.657776000000013,76.561371000000122],[-95.593886999999938,76.593048000000067],[-95.584166999999979,76.598327999999981],[-95.587783999999999,76.603592000000106],[-95.599441999999954,76.605255000000056],[-95.619719999999973,76.606094000000041],[-95.638901000000033,76.604156000000046],[-95.660277999999948,76.599426000000051],[-95.696105999999986,76.584152000000131],[-95.695540999999992,76.580276000000083],[-95.696654999999964,76.574432000000058],[-95.712783999999999,76.568603999999937],[-95.759170999999981,76.553588999999988],[-95.780562999999916,76.548874000000126],[-95.992492999999968,76.54803499999997],[-96.016953000000001,76.549149],[-96.158614999999941,76.583327999999995],[-96.17860399999995,76.594147000000078],[-96.225280999999882,76.625809000000004],[-96.27027899999996,76.632751000000098],[-96.33944699999995,76.63220199999995],[-96.355835000000013,76.633041000000105],[-96.38137799999987,76.635818000000029],[-96.403335999999911,76.639709000000096],[-96.421386999999982,76.646102999999982],[-96.445830999999998,76.657211000000132],[-96.454178000000013,76.662490999999989],[-96.461394999999925,76.668593999999985],[-96.461120999999991,76.673599000000024],[-96.46444699999995,76.679703000000018],[-96.470275999999956,76.685532000000023],[-96.527785999999935,76.693038999999999],[-96.611938000000009,76.702484000000027],[-96.636123999999995,76.704436999999984],[-96.661666999999966,76.704712000000029],[-96.736938000000009,76.697205000000054],[-96.764175000000023,76.695526000000086],[-96.789718999999934,76.695816000000093],[-96.81639100000001,76.697478999999987],[-96.857772999999952,76.701935000000105],[-96.879990000000021,76.705826000000002],[-96.915832999999964,76.714432000000102],[-96.946654999999964,76.723602000000142],[-96.959166999999979,76.729155999999932],[-96.964447000000007,76.733322000000044],[-96.900283999999999,76.795258000000047],[-96.887221999999952,76.805542000000059],[-96.873885999999914,76.810806000000071],[-96.854995999999971,76.813034000000016],[-96.839721999999995,76.810257000000092],[-96.724716000000001,76.783324999999991],[-96.679717999999923,76.770264000000054],[-96.592498999999918,76.758881000000031],[-96.426102000000014,76.744705000000067],[-96.330291999999929,76.750274999999931],[-96.311935000000005,76.751389000000131],[-96.305556999999965,76.753875999999991],[-96.315551999999968,76.802475000000129],[-96.320557000000008,76.80664100000007],[-96.366942999999935,76.812758999999971],[-96.453612999999962,76.815262000000132],[-96.50111400000003,76.818054000000075],[-96.547226000000023,76.822769000000108],[-96.797500999999897,76.861374000000012],[-96.81361400000003,76.868042000000003],[-96.848891999999921,76.887496999999996],[-96.865829000000019,76.898041000000035],[-96.869155999999975,76.904160000000047],[-96.869445999999982,76.913879000000065],[-96.864166000000012,76.919708000000071],[-96.857772999999952,76.924987999999928],[-96.833617999999944,76.9327550000001],[-96.796386999999982,76.937484999999924],[-96.771941999999967,76.937759000000028],[-96.761123999999995,76.937759000000028],[-96.723891999999978,76.935256999999979],[-96.708054000000004,76.93331900000004],[-96.698607999999979,76.934143000000006],[-96.660827999999981,76.947204999999997],[-96.659163999999976,76.949142000000052],[-96.667769999999962,76.954436999999928],[-96.677779999999984,76.957764000000054],[-96.696945000000028,76.960541000000148],[-96.718886999999995,76.963043000000027],[-96.765288999999996,76.96527100000003],[-96.808333999999945,76.966094999999996],[-96.824447999999904,76.96775800000006],[-96.827788999999939,76.968872000000033],[-96.825561999999991,76.974426000000051],[-96.810271999999998,76.979156000000103],[-96.772034000000019,76.98101800000012],[-96.742034999999987,76.982208000000014],[-96.673324999999977,76.982208000000014],[-96.622771999999998,76.979980000000069],[-96.483611999999994,76.971100000000035],[-96.353881999999999,76.993042000000059],[-96.391113000000018,77.026931999999988],[-96.387787000000003,77.03054800000001],[-96.373321999999973,77.031937000000028],[-96.28472899999997,77.039428999999984],[-96.27305599999994,77.040267999999912],[-96.24499499999996,77.041931000000034],[-96.226105000000018,77.043045000000006],[-96.103057999999976,77.044708000000128],[-95.96665999999999,77.053040000000124],[-95.888061999999934,77.06109600000002],[-95.752501999999993,77.06860400000005],[-95.734726000000023,77.06860400000005],[-95.707503999999915,77.066940000000045],[-95.659728999999913,77.058868000000075]],[[-113.32888800000001,77.079987000000017],[-113.353882,77.077484000000084],[-113.40888999999999,77.078873000000044],[-113.45140099999992,77.081664999999987],[-113.49194299999999,77.085541000000035],[-113.49749799999989,77.088318000000129],[-113.49027999999998,77.092484000000013],[-113.34472700000003,77.127762000000018],[-113.33528099999995,77.126083000000051],[-113.31471299999998,77.11775200000011],[-113.29332699999986,77.107483000000116],[-113.28694200000001,77.09637500000008],[-113.29110700000001,77.08998100000008],[-113.30471799999998,77.085266000000047],[-113.32888800000001,77.079987000000017]],[[-113.77861000000001,77.104155999999989],[-113.80695299999991,77.104155999999989],[-113.85333300000002,77.10554499999995],[-113.88054699999992,77.108032000000037],[-113.90888999999999,77.113037000000077],[-113.92443800000001,77.118591000000094],[-113.93138099999999,77.1244200000001],[-113.93138099999999,77.129699999999957],[-113.92722300000003,77.135268999999994],[-113.92083700000001,77.141098],[-113.90110800000002,77.146378000000027],[-113.88082900000001,77.149719000000061],[-113.859444,77.151382000000012],[-113.798607,77.152481000000023],[-113.77417000000003,77.151657000000057],[-113.72250399999996,77.148041000000148],[-113.69915800000001,77.144714000000022],[-113.67555199999993,77.140274000000034],[-113.66443599999997,77.134720000000016],[-113.65778399999999,77.129149999999925],[-113.66416900000002,77.123032000000023],[-113.67916899999989,77.116928000000144],[-113.703056,77.111649],[-113.72778299999993,77.108032000000037],[-113.75306699999993,77.10554499999995],[-113.77861000000001,77.104155999999989]],[[-104.25250199999999,77.072769000000051],[-104.30277999999998,77.072220000000073],[-104.35417200000001,77.073883000000023],[-104.37721299999998,77.076660000000118],[-104.40222199999994,77.081100000000106],[-104.421944,77.087203999999986],[-104.43167099999994,77.098877000000016],[-104.42639200000002,77.116379000000052],[-104.42027300000001,77.122208000000057],[-104.40556299999997,77.127762000000018],[-104.31973299999999,77.151657000000057],[-104.30082700000003,77.15525800000006],[-104.27333099999998,77.159714000000008],[-104.18360899999993,77.167205999999965],[-104.11389199999996,77.166091999999992],[-104.07140399999997,77.16137700000013],[-104.06139400000001,77.158875000000023],[-104.031113,77.15109300000006],[-104.01972999999998,77.146103000000039],[-104.00110599999999,77.135818000000086],[-103.99889399999995,77.123870999999951],[-104.00945300000001,77.118042000000116],[-104.02416999999991,77.112487999999985],[-104.04778299999992,77.106934000000138],[-104.15028399999994,77.08638000000002],[-104.196663,77.077484000000084],[-104.25250199999999,77.072769000000051]],[[-95.22444200000001,77.167205999999965],[-95.245270000000005,77.164153999999996],[-95.291381999999999,77.164992999999981],[-95.314437999999996,77.166656000000103],[-95.362777999999935,77.171920999999998],[-95.419998000000021,77.181931000000077],[-95.572509999999852,77.213042999999971],[-95.613051999999925,77.221924000000115],[-95.634170999999924,77.228043000000127],[-95.638901000000033,77.232208000000128],[-95.639998999999932,77.237761999999975],[-95.636672999999973,77.239150999999936],[-95.631377999999927,77.239700000000084],[-95.608046999999885,77.240814000000057],[-95.511123999999995,77.243042000000003],[-95.438048999999978,77.24443100000002],[-95.387512000000015,77.240814000000057],[-95.37222300000002,77.238037000000134],[-95.356110000000001,77.236374000000069],[-95.31361400000003,77.229156000000046],[-95.244155999999919,77.213882000000126],[-95.216399999999965,77.201660000000004],[-95.206664999999987,77.189147999999989],[-95.206954999999994,77.177764999999965],[-95.214447000000007,77.172485000000108],[-95.22444200000001,77.167205999999965]],[[-90.933059999999955,77.254440000000045],[-90.909164000000033,77.251663000000121],[-90.815001999999993,77.240265000000136],[-90.772232000000031,77.231368999999972],[-90.736388999999974,77.220824999999934],[-90.718338000000017,77.207213999999965],[-90.713622999999984,77.200821000000019],[-90.724166999999909,77.183318999999983],[-90.731948999999986,77.177764999999965],[-90.779175000000009,77.156647000000078],[-90.811385999999914,77.14665199999996],[-90.83555599999994,77.142211999999972],[-90.868331999999953,77.138321000000076],[-90.899993999999992,77.136932000000058],[-90.978606999999897,77.137771999999927],[-91.049728000000016,77.145537999999988],[-91.18472300000002,77.163605000000075],[-91.221664000000033,77.170258000000047],[-91.238892000000021,77.174423000000047],[-91.262512000000015,77.18414300000012],[-91.286391999999921,77.196640000000116],[-91.295546999999999,77.203323000000069],[-91.297501000000011,77.207213999999965],[-91.299164000000019,77.217758000000003],[-91.277221999999995,77.227478000000133],[-91.24749799999995,77.235809000000017],[-91.189712999999983,77.24803200000008],[-91.162216000000001,77.251389000000017],[-91.107223999999917,77.254715000000033],[-91.084732000000031,77.254440000000045],[-91.072234999999921,77.253326000000072],[-91.057219999999973,77.254440000000045],[-90.987503000000004,77.254990000000078],[-90.933059999999955,77.254440000000045]],[[-116.35109699999998,77.539154000000053],[-116.20333900000003,77.519989000000066],[-116.09056099999992,77.491089000000045],[-116.073624,77.485535000000027],[-115.88027999999991,77.433319000000097],[-115.52055399999995,77.364426000000037],[-115.49526999999989,77.359420999999998],[-115.458054,77.348602000000085],[-115.44611399999985,77.343048000000124],[-115.389183,77.312194999999917],[-115.390289,77.306366000000082],[-115.54332699999986,77.265548999999908],[-115.59110999999996,77.259995000000117],[-115.61694299999999,77.258331000000112],[-115.66915899999992,77.256942999999978],[-115.69499199999996,77.255264000000011],[-115.77250700000002,77.247757000000036],[-115.81973299999999,77.237488000000042],[-115.83084099999991,77.233322000000101],[-115.85888699999998,77.220824999999934],[-115.87777699999992,77.215271000000143],[-115.94695299999989,77.20887799999997],[-116.112503,77.193863000000022],[-116.13806199999999,77.192200000000128],[-116.19055200000003,77.191650000000095],[-116.21777299999997,77.192749000000049],[-116.26917300000002,77.190261999999962],[-116.28056300000003,77.183594000000028],[-116.31416300000001,77.144440000000088],[-116.31973299999999,77.11775200000011],[-116.28028899999998,77.067215000000033],[-116.26917300000002,77.055817000000047],[-116.24249299999991,77.044144000000017],[-116.17360699999989,77.027206000000092],[-116.06388900000002,77.007492000000013],[-116.00583599999999,76.997482000000105],[-115.95028699999995,76.991363999999976],[-115.860817,76.979156000000103],[-115.75499699999995,76.960815000000082],[-115.73889199999996,76.955261000000064],[-115.73137700000001,76.949707000000103],[-115.72833300000002,76.943863000000079],[-115.729446,76.938034000000073],[-115.73222399999997,76.931656000000089],[-115.74610899999999,76.925262000000089],[-115.80695300000002,76.90637200000009],[-115.829453,76.900818000000129],[-115.85333299999996,76.897217000000069],[-115.90334300000001,76.893874999999923],[-115.92859599999997,76.893050999999957],[-115.98194899999993,76.895538000000045],[-116.06388900000002,76.902771000000087],[-116.11501299999992,76.909149000000014],[-116.25389100000001,76.932480000000055],[-116.306107,76.936096000000134],[-116.32721699999996,76.935532000000023],[-116.35166899999996,76.9327550000001],[-116.36527999999993,76.926376000000062],[-116.36721799999998,76.915543000000071],[-116.36332699999997,76.90887500000008],[-116.35555999999985,76.903320000000008],[-116.34612299999992,76.898331000000042],[-116.32972699999999,76.89276099999995],[-116.18360899999993,76.845825000000104],[-116.16388699999999,76.841660000000104],[-116.10749800000002,76.833602999999982],[-116.031113,76.820267000000001],[-116.00029000000001,76.811371000000065],[-115.89472999999992,76.703323000000012],[-115.89138800000001,76.697478999999987],[-115.89666699999998,76.691649999999981],[-116.07140400000003,76.625809000000004],[-116.09306299999992,76.619141000000013],[-116.11582900000002,76.61442599999998],[-116.16055299999999,76.611099000000081],[-116.23194899999999,76.603043000000014],[-116.25446299999999,76.598602000000085],[-116.32250999999997,76.581100000000049],[-116.37351999999993,76.581802000000039],[-116.73277300000001,76.572495000000004],[-116.75890399999992,76.56999200000007],[-116.97112299999998,76.548598999999967],[-116.99471999999992,76.545822000000044],[-117.01750199999992,76.542205999999965],[-117.03999299999992,76.537490999999932],[-117.05387899999999,76.533051000000114],[-117.06861900000001,76.526093000000117],[-117.07556199999993,76.520538000000045],[-117.07749899999999,76.514160000000061],[-117.07640099999998,76.508881000000088],[-117.07277699999997,76.503052000000082],[-117.05695299999996,76.491652999999985],[-117.04360999999989,76.48692299999999],[-117.01750199999992,76.482483000000116],[-117.00389099999995,76.477478000000076],[-116.98361199999999,76.454987000000074],[-116.94082599999996,76.386932000000058],[-116.93916299999995,76.380539000000113],[-116.93582200000003,76.351929000000041],[-116.93859900000001,76.34637500000008],[-117.09555099999994,76.295257999999933],[-117.13971700000002,76.286925999999994],[-117.31973299999999,76.257767000000001],[-117.345551,76.256377999999984],[-117.36888099999999,76.256943000000035],[-117.52390300000002,76.263611000000026],[-117.5750119999999,76.26887499999998],[-117.60305799999998,76.27388000000002],[-117.62304699999999,76.278870000000097],[-117.639183,76.28414900000007],[-117.65778399999999,76.293319999999994],[-117.64917000000003,76.305542000000003],[-117.64890299999996,76.311371000000008],[-117.65527299999997,76.317490000000021],[-117.67304999999993,76.322220000000073],[-117.69915800000001,76.324158000000011],[-117.72416699999997,76.324432000000115],[-117.87777699999998,76.341933999999981],[-117.889183,76.355819999999937],[-117.90139799999997,76.367203000000131],[-117.90695199999993,76.372208000000001],[-117.99722299999996,76.396941999999967],[-118.02139299999999,76.401932000000045],[-118.04444899999999,76.404984000000127],[-118.05999800000001,76.409149000000127],[-118.04750100000001,76.441650000000038],[-118.02749599999999,76.484711000000061],[-117.97332799999998,76.596375000000023],[-117.92832899999996,76.676651000000106],[-117.91915899999992,76.68803400000013],[-117.90666199999993,76.694137999999953],[-117.883331,76.700546000000088],[-117.86444099999994,76.704163000000051],[-117.84805299999999,76.708328000000051],[-117.81331599999999,76.719436999999971],[-117.79638699999998,76.725815000000125],[-117.78806299999997,76.732208000000071],[-117.73889200000002,76.772217000000012],[-117.73444399999994,76.778320000000122],[-117.73860200000001,76.784149000000127],[-117.79888899999997,76.817764000000011],[-117.81667299999998,76.821380999999974],[-117.84221600000001,76.82388300000008],[-117.86665299999999,76.822220000000129],[-117.88806199999999,76.818878000000041],[-117.90499899999992,76.812195000000031],[-117.91777000000002,76.799988000000042],[-117.92610200000001,76.788040000000024],[-117.96056399999998,76.769989000000066],[-118.00583599999993,76.761383000000137],[-118.02971600000001,76.758606000000043],[-118.08222999999998,76.756943000000092],[-118.10611,76.75749200000007],[-118.15695199999999,76.76249700000011],[-118.21362299999998,76.769150000000081],[-118.29361,76.773041000000148],[-118.319458,76.773041000000148],[-118.33750900000001,76.768326000000116],[-118.49500299999994,76.712203999999929],[-118.47471599999994,76.679703000000018],[-118.45973199999997,76.673874000000012],[-118.42887899999999,76.663879000000122],[-118.40306099999998,76.657760999999994],[-118.35804699999989,76.64888000000002],[-118.34137699999997,76.643599999999992],[-118.33473199999992,76.637497000000053],[-118.316101,76.574707000000103],[-118.50279199999994,76.509720000000073],[-118.52390299999996,76.503876000000048],[-118.54611199999999,76.5],[-118.57084699999996,76.499145999999996],[-118.59694699999989,76.5],[-118.62361099999993,76.501938000000109],[-118.65167200000002,76.505553999999961],[-118.67804699999994,76.50999500000006],[-118.70916699999998,76.519989000000066],[-118.71333299999998,76.525818000000129],[-118.71362299999998,76.531662000000097],[-118.72222899999991,76.537201000000096],[-118.73473399999995,76.542480000000069],[-118.76139799999999,76.546936000000017],[-118.81471299999998,76.553040000000067],[-118.84166700000003,76.554977000000065],[-118.94415299999997,76.518051000000128],[-118.96806300000003,76.505264000000125],[-118.97582999999992,76.498871000000008],[-118.97609699999998,76.496368000000018],[-118.97250399999996,76.491652999999985],[-118.96777299999997,76.488312000000121],[-118.95527600000003,76.483047000000056],[-118.93110699999994,76.479155999999989],[-118.82195300000001,76.471374999999966],[-118.68195300000002,76.445251000000098],[-118.64862099999999,76.428863999999919],[-118.612503,76.400269000000094],[-118.59416199999993,76.383881000000031],[-118.56610099999995,76.343048000000124],[-118.567497,76.336655000000007],[-118.58168000000001,76.324706999999933],[-118.62554899999998,76.294433999999967],[-118.63751200000002,76.288040000000137],[-118.65556299999997,76.28414900000007],[-118.67916899999994,76.282211000000132],[-118.70556599999992,76.281661999999983],[-118.78083799999996,76.282486000000119],[-118.82833900000003,76.281937000000028],[-118.87666299999989,76.27748100000008],[-118.89584400000001,76.272217000000126],[-118.91139199999992,76.265548999999965],[-118.91915899999998,76.259430000000123],[-118.92443799999995,76.252776999999924],[-118.942207,76.210541000000148],[-118.93776699999995,76.204711999999915],[-118.92331699999994,76.194138000000066],[-118.91278099999994,76.188034000000016],[-118.90471600000001,76.169144000000074],[-118.95527600000003,76.132477000000108],[-118.96501199999994,76.126648000000102],[-119.07584399999996,76.083328000000108],[-119.10109699999998,76.084152000000074],[-119.12470999999999,76.088042999999971],[-119.22972099999993,76.107208000000071],[-119.24526999999995,76.111374000000012],[-119.26000999999997,76.117203000000018],[-119.28250099999997,76.127472000000068],[-119.29943800000001,76.138596000000121],[-119.30832699999996,76.149994000000106],[-119.31054699999999,76.155258000000117],[-119.30583200000001,76.167755000000113],[-119.30082699999997,76.174423000000047],[-119.29499799999996,76.180267000000072],[-119.29527300000001,76.186096000000077],[-119.30166600000001,76.191360000000088],[-119.36916399999996,76.229706000000078],[-119.54915599999998,76.324158000000011],[-119.5864029999999,76.318603999999993],[-119.65499899999992,76.303040000000067],[-119.67527799999993,76.264160000000118],[-119.67500299999995,76.245818999999926],[-119.64555399999995,76.230545000000063],[-119.59445199999999,76.203049000000021],[-119.58583099999998,76.197479000000101],[-119.57277699999992,76.186371000000122],[-119.56806899999987,76.180542000000116],[-119.56582600000002,76.175262000000032],[-119.56696299999999,76.168869000000086],[-119.57277699999992,76.16304000000008],[-119.64334099999996,76.112487999999985],[-119.74527,76.116652999999985],[-119.76999699999993,76.116379000000052],[-119.79305999999991,76.114426000000094],[-119.80499299999997,76.108871000000022],[-119.79723399999995,76.104155999999989],[-119.7727809999999,76.099425999999937],[-119.74416400000001,76.097487999999998],[-119.64723200000003,76.081664999999987],[-119.62666300000001,76.076660000000118],[-119.50389100000001,76.040817000000061],[-119.49137899999999,76.035538000000088],[-119.47833299999996,76.024155000000121],[-119.47389199999998,76.018599999999992],[-119.47222899999997,76.000824000000023],[-119.47609699999998,75.982483000000059],[-119.48110999999989,75.970825000000048],[-119.48916599999995,75.965546000000018],[-119.50974299999996,75.960540999999978],[-119.53555299999994,75.962494000000106],[-119.54638699999998,75.968323000000112],[-119.56111099999998,75.97886699999998],[-119.57195299999995,75.984985000000108],[-119.58583099999998,75.989699999999971],[-119.612503,75.992477000000065],[-119.63694800000002,75.992203000000131],[-119.64890300000002,75.986649000000114],[-119.699997,75.94859300000013],[-119.70333900000003,75.942749000000106],[-119.6875,75.938309000000118],[-119.612503,75.910263000000043],[-119.81082199999997,75.86943100000002],[-119.870003,75.857483000000002],[-119.93554699999993,75.848328000000095],[-119.98000300000001,75.843323000000055],[-120.02583300000003,75.839980999999966],[-120.04915599999987,75.838882000000126],[-120.07640100000003,75.867203000000075],[-120.08500700000002,75.872757000000036],[-120.11416600000001,75.888321000000133],[-120.12805199999997,75.893051000000014],[-120.14916999999997,75.896378000000141],[-120.16639700000002,75.892487000000074],[-120.18028299999997,75.879974000000004],[-120.18331899999993,75.873871000000065],[-120.19722000000002,75.861374000000069],[-120.21501199999994,75.848602000000028],[-120.22582999999992,75.842209000000082],[-120.26972999999992,75.821930000000123],[-120.28888699999987,75.816085999999927],[-120.30915800000002,75.811096000000077],[-120.33222999999998,75.807480000000055],[-120.35555999999997,75.806366000000025],[-120.37805200000003,75.80664100000007],[-120.40387699999991,75.808318999999983],[-120.43028300000003,75.811096000000077],[-120.45445299999994,75.81581100000011],[-120.46694899999994,75.821105999999986],[-120.47582999999997,75.826660000000004],[-120.48528299999998,75.837769000000094],[-120.4886019999999,75.844147000000021],[-120.48972300000003,75.849991000000045],[-120.48832699999997,75.855545000000063],[-120.46305799999999,75.916382000000056],[-120.46000700000002,75.922484999999995],[-120.44860799999987,75.935532000000023],[-120.406113,75.954987000000017],[-120.40583800000002,75.97137500000008],[-120.43499799999989,76.003052000000025],[-120.45889299999999,76.011658000000125],[-120.46749899999998,76.012207000000046],[-120.53333299999991,76.003052000000025],[-120.56054699999999,75.991653000000099],[-120.56331599999993,75.985535000000141],[-120.57417299999997,75.979156000000103],[-120.59388699999994,75.978043000000014],[-120.61361699999998,75.981934000000081],[-120.64306599999986,75.992477000000065],[-120.696663,76.013884999999959],[-120.70722999999998,76.018875000000037],[-120.71611000000001,76.024429000000055],[-120.729446,76.039428999999984],[-120.75167799999997,76.099425999999937],[-120.75110599999999,76.105819999999994],[-120.74833699999999,76.111922999999933],[-120.74305700000002,76.117751999999939],[-120.73222399999997,76.124145999999996],[-120.71193699999998,76.129149999999981],[-120.72749299999992,76.158600000000035],[-120.85722399999986,76.196639999999945],[-120.88362100000001,76.198318000000086],[-120.90249599999999,76.196365000000128],[-120.95639,76.177765000000022],[-120.96806300000003,76.172211000000004],[-121.00890400000003,76.144149999999911],[-121.01251199999996,76.139160000000061],[-121.016953,76.121094000000085],[-121.02528399999989,76.073318000000029],[-121.02278100000001,76.059143000000063],[-120.99328600000001,76.026817000000108],[-120.97961399999997,76.019653000000119],[-120.970123,76.013489000000106],[-120.93195300000002,75.959990999999945],[-120.93306000000001,75.956940000000145],[-120.94583099999994,75.94859300000013],[-120.98082699999998,75.941649999999981],[-120.99944299999999,75.939697000000024],[-121.01445000000001,75.942749000000106],[-121.01722699999999,75.94802900000002],[-121.01112399999988,75.970825000000048],[-121.00055699999996,75.977203000000145],[-120.98610699999995,75.984145999999953],[-121.00761399999999,75.988982999999962],[-121.01527399999998,75.992149000000097],[-121.030441,75.992477000000065],[-121.09277299999997,75.993317000000104],[-121.11389199999996,75.991653000000099],[-121.25945299999995,75.964432000000045],[-121.26583900000003,75.958328000000051],[-121.271118,75.946091000000081],[-121.27887699999985,75.927765000000079],[-121.34861799999993,75.928040000000067],[-121.423317,75.933868000000018],[-121.43639400000001,75.939148000000046],[-121.422775,75.946465000000103],[-121.41665599999988,75.953049000000078],[-121.42415599999993,75.956649999999911],[-121.479446,75.976379000000009],[-121.58306899999997,76.003601000000117],[-121.59500100000002,76.005554000000075],[-121.83473200000003,76.034424000000115],[-122.13417099999998,76.036377000000073],[-122.14499699999999,76.030823000000055],[-122.14472999999992,75.996932999999956],[-122.16944899999999,75.978043000000014],[-122.33583099999998,75.942474000000118],[-122.37666300000001,75.933868000000018],[-122.41639700000002,75.928589000000045],[-122.442207,75.927475000000072],[-122.48916599999995,75.927200000000028],[-122.51666299999994,75.928314],[-122.56360599999999,75.931931000000134],[-122.67610200000001,75.951660000000061],[-122.69638099999997,75.955551000000128],[-122.72250400000001,75.96887200000009],[-122.728882,75.973037999999974],[-122.66915899999998,75.976929000000041],[-122.64943699999998,75.982208000000014],[-122.59111000000001,76.001663000000008],[-122.57640100000003,76.007492000000013],[-122.5625,76.014434999999992],[-122.47556299999997,76.104431000000034],[-122.47112300000003,76.110260000000039],[-122.47193899999996,76.114990000000034],[-122.48554999999993,76.1202550000001],[-122.49833699999994,76.120529000000033],[-122.60134900000003,76.115097000000048],[-122.62222300000002,76.111374000000012],[-122.67832900000002,76.111374000000012],[-122.69999699999994,76.112198000000149],[-122.70445299999994,76.114426000000094],[-122.69554099999993,76.117751999999939],[-122.58721899999995,76.134155000000021],[-122.50195299999996,76.136383000000137],[-122.48999000000003,76.141098],[-122.57417299999992,76.166091999999992],[-122.595551,76.170822000000044],[-122.62027,76.174423000000047],[-122.64666699999998,76.175812000000064],[-122.67027300000001,76.174423000000047],[-122.69360399999999,76.17053199999998],[-122.73361199999994,76.162491000000102],[-122.84277299999997,76.131088000000091],[-122.885559,76.104431000000034],[-122.90194699999995,76.098038000000031],[-122.92138699999987,76.092758000000003],[-123.01139799999993,76.083328000000108],[-123.037781,76.084717000000069],[-122.97917199999995,76.125809000000118],[-122.84861799999999,76.208878000000027],[-122.72112299999998,76.231369000000029],[-122.636124,76.264709000000096],[-122.63166799999999,76.270538000000101],[-122.63751200000002,76.288040000000137],[-122.64527899999996,76.299712999999997],[-122.63249199999996,76.329987000000017],[-122.62638900000002,76.336380000000133],[-122.61776700000001,76.342208999999968],[-122.59889199999998,76.348328000000038],[-122.57861300000002,76.353591999999992],[-122.39890300000002,76.396941999999967],[-122.30943300000001,76.408875000000023],[-122.01471699999996,76.432479999999998],[-121.826683,76.422760000000096],[-121.78195199999999,76.420258000000047],[-121.73805199999998,76.421097000000145],[-121.54998799999993,76.434708000000114],[-121.53307299999994,76.437195000000031],[-121.51445000000001,76.444138000000009],[-121.421944,76.493590999999924],[-121.31220999999994,76.572495000000004],[-121.30695300000002,76.578323000000125],[-121.31388899999996,76.589705999999978],[-121.30915800000002,76.593872000000033],[-121.21250899999995,76.649719000000005],[-121.118607,76.673309000000017],[-121.10109699999992,76.668320000000051],[-121.079453,76.668320000000051],[-121.05666399999996,76.671371000000022],[-120.923317,76.689972000000068],[-120.900284,76.693313999999987],[-120.88417099999998,76.698868000000004],[-120.86193800000001,76.711929000000112],[-120.84777799999989,76.724700999999925],[-120.83249699999993,76.731369000000086],[-120.81220999999994,76.737198000000092],[-120.76611299999996,76.743591000000094],[-120.66915899999998,76.751099000000067],[-120.64083899999997,76.748596000000134],[-120.62581599999999,76.746367999999961],[-120.60417200000001,76.746367999999961],[-120.58112299999999,76.7494200000001],[-120.40167200000002,76.797211000000004],[-120.38194299999992,76.804153000000042],[-120.36776700000001,76.810257000000092],[-120.36609599999997,76.813309000000004],[-120.36527999999993,76.836105000000032],[-120.09137699999997,77.003051999999968],[-120.06916799999999,77.008040999999935],[-120.03888699999999,77.013321000000019],[-120.02278100000001,77.015273999999977],[-119.99722300000002,77.01638800000012],[-119.97693600000002,77.013321000000019],[-119.96112099999993,77.009995000000004],[-119.94999699999994,77.012497000000053],[-119.92027299999995,77.023605000000032],[-119.83944700000001,77.05693100000002],[-119.83167999999995,77.06303400000013],[-119.83249699999999,77.069153000000142],[-119.83583099999987,77.075271999999984],[-119.83721899999995,77.079712000000029],[-119.83556399999998,77.085266000000047],[-119.825287,77.091095000000053],[-119.8125,77.096649000000014],[-119.77639799999992,77.106094000000098],[-119.60056299999991,77.145827999999995],[-119.43331899999998,77.173599000000081],[-119.41082799999998,77.178588999999931],[-119.389183,77.184417999999994],[-119.360817,77.203323000000069],[-119.354446,77.209152000000131],[-119.346947,77.221374999999966],[-119.34583999999995,77.227767999999969],[-119.33389299999993,77.239975000000072],[-119.31582599999996,77.258041000000105],[-119.29583700000001,77.276657000000114],[-119.26834099999996,77.28915400000011],[-119.25306699999999,77.295258000000103],[-119.22222899999991,77.306366000000082],[-119.20111099999991,77.313034000000073],[-119.15334299999995,77.325821000000076],[-119.11444099999994,77.327484000000027],[-119.08666999999997,77.326660000000061],[-119.00110599999988,77.321106000000043],[-118.94138299999992,77.319717000000082],[-118.91694599999994,77.32249500000006],[-118.89389,77.327484000000027],[-118.87000299999994,77.333878000000084],[-118.75723299999999,77.352478000000019],[-118.73249800000002,77.35554500000012],[-118.65110799999997,77.360535000000141],[-118.44972199999995,77.358871000000136],[-118.224716,77.356094000000041],[-118.19721999999996,77.354980000000069],[-118.16583300000002,77.355255000000056],[-118.14111299999996,77.35803199999998],[-118.12805200000003,77.364426000000037],[-118.12721299999998,77.369431000000077],[-118.125,77.372482000000105],[-118.10694899999993,77.378036000000122],[-118.08750899999995,77.379150000000095],[-117.91111799999993,77.386932000000058],[-117.86721799999992,77.388596000000064],[-117.85056299999991,77.384430000000123],[-117.781113,77.36303700000002],[-117.76806599999998,77.357758000000047],[-117.756958,77.351654000000053],[-117.75083899999998,77.346648999999957],[-117.73860200000001,77.341933999999924],[-117.72444200000001,77.338043000000084],[-117.61193800000001,77.327774000000034],[-117.45084400000002,77.312194999999917],[-117.27639799999997,77.28915400000011],[-117.02306399999998,77.290817000000004],[-117.01478600000002,77.296700000000044],[-117.01711999999992,77.300208999999938],[-117.02749599999993,77.310256999999979],[-117.06082199999997,77.326660000000061],[-117.10555999999997,77.339981000000023],[-117.11582900000002,77.34165999999999],[-117.11805699999996,77.338593000000117],[-117.1324919999999,77.333328000000051],[-117.15416699999997,77.332489000000066],[-117.16999800000002,77.335815000000082],[-117.18195300000002,77.34027100000003],[-117.18167099999999,77.346375000000023],[-117.17666600000001,77.352203000000145],[-117.15888999999987,77.358871000000136],[-117.14277600000003,77.361374000000126],[-117.11945300000002,77.359985000000108],[-117.06082199999997,77.353317000000118],[-117.00749999999994,77.343039999999974],[-116.94666299999994,77.329436999999984],[-116.87638900000002,77.318054000000132],[-116.848343,77.315810999999997],[-116.79583700000001,77.317490000000021],[-116.77887699999997,77.319153000000085],[-116.65167199999996,77.377761999999962],[-116.64835399999998,77.383330999999998],[-116.65167199999996,77.388046000000031],[-116.66278099999994,77.391662999999994],[-116.74137899999999,77.395263999999997],[-116.87082699999996,77.400818000000015],[-116.89917000000003,77.399428999999998],[-116.97582999999997,77.393326000000059],[-116.99471999999992,77.394440000000031],[-117.01112399999994,77.398880000000077],[-117.15306099999992,77.451660000000118],[-117.14998599999996,77.457214000000135],[-117.13890100000003,77.460541000000035],[-117.08306899999997,77.474425999999937],[-117.06667299999998,77.476929000000098],[-117.06139399999989,77.476089000000059],[-117.03833799999995,77.471001000000058],[-116.991669,77.466660000000104],[-116.91972399999997,77.470535000000041],[-116.89444700000001,77.473312000000135],[-116.78527799999995,77.499145999999996],[-116.75723299999993,77.511658000000011],[-116.76944699999996,77.516388000000006],[-116.85109699999998,77.516663000000051],[-116.87917299999987,77.517761000000121],[-116.9058379999999,77.520264000000111],[-116.926941,77.524704000000099],[-116.92054699999994,77.528594999999996],[-116.900284,77.532211000000018],[-116.875,77.534988000000112],[-116.83306900000002,77.533600000000035],[-116.75418100000002,77.534424000000001],[-116.64750699999996,77.537766000000147],[-116.58583099999998,77.540543000000014],[-116.53611799999993,77.544434000000081],[-116.48777799999999,77.550262000000032],[-116.35109699999998,77.539154000000053]],[[-85.285278000000005,77.587494000000049],[-85.259734999999978,77.586655000000121],[-85.235274999999945,77.586655000000121],[-85.107223999999974,77.581099999999992],[-85.011123999999938,77.57388300000008],[-84.995270000000005,77.569443000000092],[-84.822509999999966,77.505264000000125],[-84.813889000000017,77.497208000000057],[-84.824447999999961,77.491927999999973],[-84.843062999999916,77.487198000000149],[-84.934433000000013,77.470260999999937],[-84.960830999999985,77.466385000000059],[-85.027221999999995,77.459717000000069],[-85.095551,77.454437000000041],[-85.126937999999939,77.453048999999908],[-85.153609999999958,77.454437000000041],[-85.168335000000013,77.456939999999975],[-85.178604000000007,77.464157000000114],[-85.172500999999897,77.473601999999971],[-85.159164000000033,77.48414600000001],[-85.144729999999925,77.489426000000094],[-85.138610999999969,77.494980000000112],[-85.140839000000028,77.501663000000065],[-85.152785999999992,77.507767000000115],[-85.170273000000009,77.511658000000011],[-85.248885999999914,77.527481000000023],[-85.270843999999954,77.529984000000013],[-85.319732999999928,77.532211000000018],[-85.344161999999983,77.532211000000018],[-85.39916999999997,77.53387500000008],[-85.538329999999974,77.539978000000019],[-85.535552999999936,77.543869000000086],[-85.352218999999934,77.582764000000054],[-85.31138599999997,77.586655000000121],[-85.285278000000005,77.587494000000049]],[[-90.603058000000033,77.628311000000053],[-90.521118000000001,77.626083000000108],[-90.492492999999968,77.626083000000108],[-90.438598999999954,77.630538999999999],[-90.414443999999946,77.631087999999977],[-90.388061999999877,77.629425000000026],[-90.339172000000019,77.623871000000065],[-90.242492999999854,77.612488000000042],[-90.219161999999983,77.608871000000079],[-90.208892999999932,77.603042999999957],[-90.210007000000019,77.597488000000055],[-90.206664999999987,77.59165999999999],[-90.196654999999964,77.587204000000042],[-90.177779999999927,77.58248900000001],[-90.059722999999963,77.566375999999991],[-89.937209999999993,77.53276100000005],[-89.91722099999987,77.527205999999978],[-89.841109999999958,77.504166000000055],[-89.806655999999919,77.492477000000122],[-89.753615999999965,77.473038000000031],[-89.719161999999983,77.458328000000108],[-89.636123999999995,77.339157000000057],[-89.640288999999996,77.333328000000051],[-89.67471299999994,77.310256999999979],[-89.70777899999996,77.294144000000131],[-89.849730999999963,77.25],[-89.882767000000001,77.239975000000072],[-89.919998000000021,77.230270000000019],[-90,77.213814000000013],[-90.009170999999981,77.211928999999998],[-90.088897999999915,77.199707000000046],[-90.118057000000022,77.198593000000074],[-90.129165999999998,77.200546000000031],[-90.259170999999924,77.201096000000064],[-90.366942999999992,77.197754000000089],[-90.416655999999989,77.213042999999971],[-90.683318999999926,77.271927000000062],[-90.704726999999934,77.276382000000069],[-90.727218999999934,77.279984000000013],[-90.843063000000029,77.292754999999943],[-90.90972899999997,77.303040000000067],[-90.946655000000021,77.309418000000051],[-91.146666999999923,77.362198000000092],[-91.18249499999996,77.386932000000058],[-91.187209999999993,77.390273999999977],[-91.208892999999932,77.414993000000095],[-91.206954999999994,77.568604000000107],[-91.184433000000013,77.608597000000145],[-91.173614999999927,77.613036999999963],[-91.15834000000001,77.617203000000075],[-91.10943599999996,77.624985000000038],[-90.906386999999938,77.653046000000131],[-90.880828999999949,77.654434000000037],[-90.826400999999976,77.654434000000037],[-90.801666000000012,77.651657000000114],[-90.727492999999981,77.642212000000029],[-90.683608999999933,77.633331000000112],[-90.603058000000033,77.628311000000053]],[[-105.01027699999986,77.408034999999927],[-104.98665599999998,77.404434000000094],[-104.96193700000003,77.404434000000094],[-104.90805099999994,77.406937000000028],[-104.82584400000002,77.413605000000018],[-104.77166699999998,77.416656000000046],[-104.74109599999997,77.414428999999984],[-104.73277300000001,77.411377000000073],[-104.53832999999997,77.338318000000072],[-104.48889199999996,77.318603999999993],[-104.39555399999995,77.276382000000069],[-104.38834400000002,77.271378000000141],[-104.38137799999998,77.264435000000105],[-104.37998999999996,77.261931999999945],[-104.36554699999999,77.230270000000019],[-104.36749299999997,77.224425999999994],[-104.40499899999992,77.172485000000108],[-104.416946,77.161926000000051],[-104.43804899999998,77.150543000000027],[-104.47250400000001,77.13749700000011],[-104.5,77.133040999999992],[-104.52250699999996,77.130539000000113],[-104.74027999999993,77.108597000000088],[-104.79028299999999,77.108871000000022],[-104.83249699999993,77.113312000000121],[-104.85333300000002,77.117477000000122],[-104.86916400000001,77.123596000000134],[-104.883331,77.135543999999982],[-104.89250199999992,77.141936999999928],[-104.906387,77.147491000000116],[-104.92250099999995,77.152481000000023],[-104.945267,77.157211000000018],[-104.993607,77.164992999999981],[-105.04444899999993,77.171371000000136],[-105.09583999999995,77.176085999999998],[-105.11971999999997,77.176650999999993],[-105.13751200000002,77.176085999999998],[-105.15167200000002,77.171371000000136],[-105.24694799999997,77.193863000000022],[-105.40888999999999,77.281661999999983],[-105.41722099999998,77.284714000000065],[-105.45527599999997,77.291930999999977],[-105.48111,77.294983000000116],[-105.50666799999993,77.299149],[-105.531677,77.30525200000011],[-105.55027799999999,77.311645999999996],[-105.57195300000001,77.323317999999915],[-105.67916899999994,77.447479000000044],[-105.691101,77.497208000000057],[-105.83444199999997,77.610260000000096],[-105.85833700000001,77.626923000000147],[-105.878601,77.639709000000096],[-105.88890100000003,77.645263999999997],[-105.93083200000001,77.663040000000137],[-105.94776899999994,77.668868999999972],[-105.98000299999995,77.679427999999973],[-106.01471700000002,77.688583000000051],[-106.08361799999989,77.71026599999999],[-106.09166699999997,77.71527100000003],[-106.09472700000003,77.724151999999947],[-106.08917199999996,77.72886699999998],[-106.07945299999989,77.732758000000047],[-106.04055800000003,77.744980000000055],[-106.01222200000001,77.750549000000035],[-105.94167299999987,77.759720000000016],[-105.91388699999999,77.762497000000053],[-105.70056199999999,77.753600999999946],[-105.64890299999996,77.748596000000077],[-105.55248999999998,77.729430999999977],[-105.50666799999993,77.719711000000075],[-105.47028399999999,77.709152000000017],[-105.38971699999996,77.683868000000018],[-105.17360699999995,77.612198000000035],[-105.15695199999999,77.606093999999985],[-105.03971899999999,77.552199999999971],[-105.02778599999994,77.546371000000136],[-104.968613,77.514435000000049],[-104.95916699999998,77.508041000000048],[-104.94888300000002,77.496094000000085],[-104.94499199999996,77.484984999999995],[-104.946663,77.479155999999989],[-104.95249899999999,77.474425999999937],[-104.96749899999998,77.468872000000147],[-105.01027699999986,77.458603000000096],[-105.01194800000002,77.45277400000009],[-105.01806599999986,77.411925999999994],[-105.01027699999986,77.408034999999927]],[[-95.405838000000017,77.763885000000016],[-95.408889999999928,77.75221300000004],[-95.406113000000005,77.746094000000028],[-95.389724999999942,77.739426000000037],[-95.363892000000021,77.737198000000092],[-95.343886999999995,77.738037000000077],[-95.118606999999997,77.74971000000005],[-95.087783999999942,77.75221300000004],[-95.059433000000013,77.756653000000085],[-95.029174999999952,77.767211999999915],[-95.010833999999988,77.777771000000143],[-94.981673999999998,77.780823000000055],[-94.951674999999966,77.782486000000006],[-94.752228000000002,77.788589000000115],[-94.728881999999942,77.788315000000011],[-94.623321999999973,77.783599999999979],[-94.572783999999899,77.780548000000067],[-94.542220999999927,77.773880000000077],[-94.521118000000001,77.767761000000064],[-94.477492999999924,77.764708999999982],[-94.448607999999979,77.765273999999977],[-94.356658999999866,77.767487000000131],[-94.252501999999936,77.772216999999955],[-94.089995999999928,77.765823000000125],[-94.030288999999982,77.760543999999982],[-93.951110999999969,77.735535000000141],[-93.935821999999973,77.732483000000059],[-93.931380999999988,77.732483000000059],[-93.826675000000023,77.739426000000037],[-93.820007000000032,77.744980000000055],[-93.817779999999971,77.75082400000008],[-93.806655999999919,77.756378000000041],[-93.786666999999966,77.761108000000092],[-93.68638599999997,77.773880000000077],[-93.65695199999999,77.776657],[-93.629439999999931,77.77609300000006],[-93.546111999999994,77.770827999999995],[-93.241669000000002,77.733871000000136],[-93.233886999999868,77.732483000000059],[-93.17471299999994,77.704163000000051],[-93.101944000000003,77.662490999999989],[-93.106658999999922,77.660263000000043],[-93.14834599999989,77.645538000000101],[-93.164169000000015,77.64027400000009],[-93.196380999999974,77.637206999999989],[-93.222504000000015,77.638596000000007],[-93.249161000000015,77.641663000000108],[-93.277221999999938,77.643599999999935],[-93.303054999999972,77.643599999999935],[-93.35943599999996,77.635818000000029],[-93.379439999999988,77.630814000000044],[-93.390288999999939,77.625533999999959],[-93.397232000000031,77.619979999999998],[-93.486388999999974,77.54553199999998],[-93.502501999999993,77.503052000000082],[-93.477782999999988,77.492477000000122],[-93.474715999999944,77.487487999999985],[-93.474166999999909,77.476379000000065],[-93.475280999999995,77.47137499999991],[-93.480834999999956,77.466660000000104],[-93.537780999999995,77.445816000000093],[-93.553054999999915,77.440811000000053],[-93.570556999999951,77.437759000000142],[-93.906661999999983,77.433319000000097],[-93.933884000000035,77.433593999999971],[-94.25167799999997,77.455261000000007],[-94.319457999999997,77.468597000000102],[-94.345001000000025,77.472487999999998],[-94.468886999999995,77.476929000000098],[-94.801101999999901,77.480270000000132],[-95.032226999999978,77.469986000000119],[-95.123610999999983,77.463882000000069],[-95.204453000000001,77.460814999999968],[-95.252791999999943,77.460814999999968],[-95.294998000000021,77.466385000000059],[-95.346389999999985,77.469986000000119],[-95.477492999999981,77.473877000000016],[-95.532776000000013,77.473601999999971],[-95.726105000000018,77.470260999999937],[-95.823623999999938,77.466385000000059],[-95.838897999999858,77.462493999999992],[-95.864166000000012,77.462203999999986],[-95.889450000000011,77.464432000000102],[-96,77.479980000000126],[-96.061385999999857,77.491652999999985],[-96.083327999999995,77.497756999999979],[-96.099730999999963,77.504439999999988],[-96.259170999999981,77.571929999999952],[-96.318343999999968,77.598877000000073],[-96.328888000000006,77.604980000000012],[-96.255568999999923,77.689697000000024],[-96.241104000000007,77.694977000000108],[-96.194442999999978,77.704987000000017],[-96.077224999999942,77.726929000000041],[-95.934433000000013,77.753052000000025],[-95.918059999999969,77.755554000000075],[-95.897231999999974,77.757492000000013],[-95.869445999999925,77.757217000000026],[-95.848052999999993,77.755264000000068],[-95.742767000000015,77.762207000000046],[-95.630553999999961,77.771102999999982],[-95.583892999999932,77.779709000000082],[-95.570007000000032,77.784149000000127],[-95.566101000000003,77.78776600000009],[-95.565552000000025,77.792755000000056],[-95.552779999999927,77.796097000000145],[-95.528884999999946,77.801086000000112],[-95.49610899999999,77.805542000000059],[-95.465285999999935,77.80802900000009],[-95.427779999999984,77.803314000000057],[-95.418335000000013,77.798874000000069],[-95.410827999999981,77.792480000000012],[-95.40695199999999,77.787201000000039],[-95.404449,77.776381999999955],[-95.405838000000017,77.763885000000016]],[[-77.851944000000003,77.774429000000055],[-77.875274999999874,77.774429000000055],[-77.888061999999877,77.781372000000033],[-77.930556999999965,77.808868000000075],[-77.955001999999922,77.830276000000026],[-77.952224999999999,77.833054000000004],[-77.936385999999914,77.839157000000114],[-77.906386999999995,77.844437000000028],[-77.880279999999914,77.848038000000031],[-77.821121000000005,77.854431000000034],[-77.717772999999966,77.863037000000134],[-77.676102000000014,77.864700000000028],[-77.622771999999941,77.862762000000089],[-77.596389999999985,77.860808999999961],[-77.582779000000016,77.858032000000094],[-77.575286999999946,77.854980000000126],[-77.568619000000012,77.849716000000001],[-77.575561999999991,77.823608000000036],[-77.579178000000013,77.81860400000005],[-77.592772999999909,77.813309000000004],[-77.628052000000025,77.804153000000042],[-77.658889999999985,77.79693600000013],[-77.680557000000022,77.792755000000056],[-77.851944000000003,77.774429000000055]],[[-101.71140300000002,77.901657000000057],[-101.671944,77.893326000000002],[-101.62082699999996,77.884430000000066],[-101.52443700000003,77.869980000000112],[-101.450287,77.861098999999967],[-101.36833200000001,77.853867000000093],[-101.26555599999995,77.842758000000003],[-101.23777799999993,77.838882000000126],[-101.19138299999997,77.830826000000059],[-101.16139199999992,77.822769000000051],[-100.96056399999992,77.759155000000135],[-100.92639200000002,77.743317000000104],[-100.92555199999998,77.737198000000092],[-100.92887899999999,77.731369000000086],[-100.94055200000003,77.726929000000041],[-100.96472199999994,77.72554000000008],[-101.096947,77.719436999999914],[-101.21694899999994,77.721924000000001],[-101.26777599999997,77.725815000000068],[-101.31806899999992,77.726089000000002],[-101.50695799999994,77.724991000000102],[-101.53527799999995,77.723602000000142],[-101.56471299999993,77.720535000000041],[-101.58583099999993,77.71527100000003],[-101.593613,77.709427000000005],[-101.60582699999992,77.703873000000044],[-101.62249799999995,77.69859300000013],[-101.65222199999994,77.694427000000076],[-101.79888900000003,77.676376000000062],[-101.82640099999992,77.676086000000055],[-102.01695299999994,77.679703000000018],[-102.06777999999997,77.682205000000067],[-102.1416779999999,77.690810999999997],[-102.43639399999995,77.729705999999965],[-102.44444299999998,77.731934000000081],[-102.51083399999999,77.786102000000085],[-102.52971600000001,77.834152000000074],[-102.51806599999992,77.844146999999964],[-102.49889400000001,77.855545000000006],[-102.45889299999999,77.871094000000085],[-102.44249000000002,77.876648000000102],[-102.41665599999999,77.881927000000076],[-102.38778699999995,77.884155000000021],[-102.13999899999999,77.896378000000084],[-102.08389299999999,77.897217000000069],[-102.04915599999998,77.896942000000024],[-101.91583299999996,77.893875000000094],[-101.83194699999996,77.893875000000094],[-101.779449,77.896378000000084],[-101.74973299999999,77.899719000000118],[-101.71140300000002,77.901657000000057]],[[-114.07305899999994,77.981659000000036],[-113.9813769999999,77.934982000000105],[-113.97501399999993,77.931091000000038],[-113.97222899999997,77.925262000000032],[-113.97222899999997,77.919983000000059],[-113.9583439999999,77.914993000000038],[-113.92388900000003,77.910812000000135],[-113.89499699999993,77.908325000000048],[-113.84028599999999,77.906097000000102],[-113.72666899999996,77.896103000000039],[-113.70639,77.891663000000051],[-113.58556399999998,77.825820999999962],[-113.57861300000002,77.819991999999957],[-113.57611099999997,77.814147999999989],[-113.58750899999995,77.80802900000009],[-113.61916399999996,77.795821999999987],[-113.65972899999997,77.783324999999991],[-113.78832999999992,77.745255000000043],[-113.90833999999995,77.726379000000009],[-113.93472300000002,77.72387700000013],[-114.11444099999989,77.706649999999911],[-114.19304699999998,77.69802900000002],[-114.22305299999999,77.698868000000004],[-114.27722199999999,77.702209000000039],[-114.33112299999999,77.709717000000012],[-114.415009,77.731369000000086],[-114.514183,77.765273999999977],[-114.66251399999999,77.803863999999919],[-114.70916699999998,77.813599000000011],[-114.73029300000002,77.818877999999984],[-114.84834299999994,77.854706000000022],[-115.07721699999996,77.938582999999994],[-115.11138900000003,77.953872999999987],[-115.11501299999992,77.956375000000037],[-115.11609599999991,77.958327999999995],[-115.10833700000001,77.961380000000077],[-115.09084300000001,77.963608000000079],[-115.06054699999993,77.963882000000012],[-115.03388999999993,77.962204000000042],[-114.93028299999997,77.960541000000148],[-114.81973299999993,77.973037999999917],[-114.79778299999992,77.975540000000024],[-114.77749599999993,77.981659000000036],[-114.74027999999998,78.000000000000057],[-114.60582699999998,78.03054800000001],[-114.40083299999998,78.067490000000021],[-114.35500300000001,78.070541000000048],[-114.32694999999995,78.0711060000001],[-114.30332899999996,78.070541000000048],[-114.28694200000001,78.066086000000041],[-114.07305899999994,77.981659000000036]],[[-109.58805799999999,78.064697000000024],[-109.58056599999998,78.058319000000097],[-109.58112299999988,78.041367000000093],[-109.58528100000001,78.035538000000088],[-109.66972399999997,77.971649000000127],[-109.68305999999995,77.965820000000122],[-109.70556599999986,77.959991000000116],[-109.76027699999997,77.951096000000064],[-109.81527699999992,77.942749000000106],[-109.84249899999998,77.938873000000001],[-109.89750699999996,77.932755000000043],[-110.00723299999987,77.921371000000136],[-110.14499699999999,77.911926000000108],[-110.162781,77.906936999999971],[-110.16665599999999,77.901093000000117],[-110.19611399999991,77.896652000000017],[-110.22112299999998,77.893875000000094],[-110.24889399999995,77.893875000000094],[-110.48999000000003,77.883881000000088],[-110.62666300000001,77.873032000000023],[-110.65416700000003,77.871918000000051],[-110.79250299999995,77.870819000000097],[-110.846947,77.866379000000052],[-110.87389400000001,77.862198000000149],[-110.89584400000001,77.856093999999928],[-110.90139799999992,77.849716000000001],[-110.90471600000001,77.843872000000147],[-110.90360999999996,77.838042999999971],[-110.90028399999994,77.832763999999997],[-110.89444699999996,77.826934999999992],[-110.88639799999987,77.820831000000112],[-110.74388099999993,77.773605000000089],[-110.71556099999992,77.768875000000037],[-110.65888999999999,77.759720000000016],[-110.63110399999994,77.758040999999992],[-110.60138699999999,77.758881000000031],[-110.51972999999992,77.763321000000019],[-110.41583299999996,77.770827999999995],[-110.39306599999986,77.773041000000148],[-110.368607,77.776381999999955],[-110.28916899999996,77.782486000000006],[-110.16111799999999,77.784149000000127],[-110.13305700000001,77.780548000000067],[-110.10500299999995,77.774994000000049],[-110.09028599999994,77.769150000000081],[-110.08029199999993,77.763321000000019],[-110.04055800000003,77.637496999999996],[-110.08029199999993,77.563599000000067],[-110.08416699999992,77.557755000000043],[-110.09221599999995,77.551926000000037],[-110.11749299999997,77.539978000000019],[-110.20333899999997,77.511383000000137],[-110.22501399999987,77.505264000000125],[-110.27055399999995,77.49581900000004],[-110.29695100000004,77.491652999999985],[-110.502228,77.460266000000047],[-110.81500199999999,77.424988000000042],[-110.82749899999999,77.419144000000017],[-110.85082999999992,77.414428999999984],[-110.87721299999998,77.411377000000073],[-110.95639,77.407486000000006],[-111.00974299999996,77.406096999999988],[-111.06527699999998,77.406096999999988],[-111.11721799999992,77.408874999999966],[-111.172234,77.416092000000106],[-111.29998799999993,77.419144000000017],[-111.46305799999999,77.393051000000071],[-111.61833200000001,77.373871000000122],[-111.82501199999996,77.34887700000013],[-112.031113,77.324707000000103],[-112.05722000000003,77.323317999999915],[-112.083618,77.323043999999982],[-112.13694800000002,77.323317999999915],[-112.16639700000002,77.325271999999984],[-112.41306299999997,77.356094000000041],[-112.43888900000002,77.361099000000081],[-112.48222399999992,77.371094000000028],[-112.5,77.378235000000018],[-112.50778200000002,77.381363000000022],[-112.52139299999999,77.389434999999992],[-112.52333099999993,77.395263999999997],[-112.52694700000001,77.399719000000061],[-112.545547,77.415817000000061],[-112.587784,77.449141999999938],[-112.60109699999992,77.455261000000007],[-112.626938,77.459427000000062],[-112.65387699999997,77.458878000000141],[-112.68222000000003,77.456939999999975],[-112.69721999999996,77.455261000000007],[-112.73889200000002,77.445816000000093],[-112.764183,77.441650000000038],[-112.79083300000002,77.441086000000098],[-112.80249000000003,77.442474000000004],[-112.92887899999994,77.464157000000114],[-112.95777899999996,77.469436999999971],[-112.96389799999992,77.474152000000004],[-112.96806299999992,77.485809000000131],[-112.96806299999992,77.492203000000018],[-112.97028399999999,77.498032000000023],[-112.978882,77.503326000000015],[-112.99445300000002,77.508881000000088],[-113.01167299999997,77.512771999999984],[-113.03751399999999,77.515823000000012],[-113.06500199999999,77.517211999999972],[-113.14611799999994,77.517761000000121],[-113.17388900000003,77.519440000000145],[-113.198036,77.523880000000133],[-113.20472699999999,77.529433999999981],[-113.23805199999998,77.581375000000037],[-113.24027999999993,77.587204000000042],[-113.16251399999993,77.609146000000123],[-113.1875,77.739426000000037],[-113.20556599999998,77.744431000000077],[-113.26251200000002,77.755554000000075],[-113.283073,77.761108000000092],[-113.29444899999999,77.766662999999994],[-113.30387899999994,77.773041000000148],[-113.31054699999993,77.778595000000109],[-113.31500199999994,77.783875000000023],[-113.31973299999999,77.795531999999923],[-113.31973299999999,77.807204999999954],[-113.31749699999995,77.813033999999959],[-113.30638099999993,77.837203999999986],[-113.23473399999989,77.901657000000057],[-113.23082699999992,77.903594999999996],[-113.20973200000003,77.90887500000008],[-113.12721299999998,77.912201000000096],[-113.09973100000002,77.912766000000147],[-113.07167099999998,77.912201000000096],[-113.04666099999997,77.907761000000107],[-113.03971899999999,77.901932000000102],[-112.94360399999999,77.911926000000108],[-112.80499299999985,77.933043999999995],[-112.78333299999997,77.937195000000088],[-112.76666299999999,77.942474000000061],[-112.74194299999988,77.951660000000004],[-112.57444799999996,77.979431000000091],[-112.46694899999994,77.992477000000008],[-112.29499800000002,78.010544000000095],[-112.12526699999995,78.00610400000005],[-111.97944599999994,78.018599999999992],[-111.787216,78.033599999999922],[-111.77610800000002,78.028046000000131],[-111.756393,78.024428999999998],[-111.73055999999997,78.024155000000064],[-111.70556599999998,78.026931999999988],[-111.63221699999991,78.040817000000061],[-111.34583999999995,78.076935000000105],[-111.31833599999999,78.08027600000014],[-111.28832999999997,78.081940000000145],[-111.09333800000002,78.092484000000013],[-111.048607,78.093597000000102],[-111.02749599999999,78.093322999999998],[-110.99861099999993,78.090546000000074],[-110.99749799999995,78.084717000000069],[-111.00110599999994,78.079987000000017],[-110.995003,78.074158000000011],[-110.90334300000001,78.062194999999974],[-110.861107,78.061645999999996],[-110.83306899999997,78.06303400000013],[-110.80555700000002,78.065262000000075],[-110.78778099999994,78.0711060000001],[-110.77500899999995,78.076935000000105],[-110.77139299999999,78.082764000000111],[-110.76334399999996,78.088882000000069],[-110.74553700000001,78.094711000000075],[-110.72721899999988,78.097762999999986],[-110.67051700000002,78.101089000000002],[-110.54998799999998,78.106094000000098],[-110.46584299999995,78.108597000000032],[-110.23777799999999,78.110809000000131],[-110.10082999999992,78.108597000000032],[-109.95916699999987,78.104705999999965],[-109.78916899999996,78.099716000000114],[-109.67777999999998,78.091933999999981],[-109.65387699999985,78.088318000000129],[-109.60527000000002,78.0711060000001],[-109.58805799999999,78.064697000000024]],[[-101.65139799999997,78.144714000000022],[-101.67527799999999,78.144440000000088],[-101.859444,78.15525800000006],[-101.87917299999992,78.158324999999991],[-101.88194299999998,78.162201000000039],[-101.77610800000002,78.216385000000116],[-101.75334199999992,78.227203000000088],[-101.73137700000001,78.232483000000116],[-101.70722999999987,78.23275799999999],[-101.68472299999996,78.230545000000006],[-101.68167099999994,78.227478000000076],[-101.67250100000001,78.226089000000115],[-101.63362100000001,78.210815000000025],[-101.62277199999988,78.204712000000086],[-101.61582899999996,78.199416999999983],[-101.60360700000001,78.187485000000038],[-101.59999099999993,78.181090999999981],[-101.59861799999993,78.175261999999975],[-101.59973100000002,78.164429000000041],[-101.60527000000002,78.159149000000127],[-101.61305199999998,78.153594999999939],[-101.62581599999993,78.148041000000148],[-101.65139799999997,78.144714000000022]],[[-103.05695300000002,78.119705000000067],[-103.11444099999994,78.11775200000011],[-103.19444299999992,78.11914100000007],[-103.212784,78.120529000000033],[-103.23029300000002,78.123871000000122],[-103.25862099999995,78.134995000000004],[-103.27027900000002,78.141097999999943],[-103.27722199999999,78.146941999999967],[-103.28222700000003,78.15776100000005],[-103.27971600000001,78.163605000000075],[-103.274719,78.169983000000002],[-103.26750199999998,78.17553700000002],[-103.23916600000001,78.192200000000071],[-103.22721899999993,78.197754000000089],[-103.17027300000001,78.219985999999949],[-103.12470999999999,78.236649000000057],[-103.06276700000001,78.258041000000048],[-103.04138199999994,78.263610999999969],[-102.98693800000001,78.27276599999999],[-102.93415800000002,78.27276599999999],[-102.89750700000002,78.269149999999968],[-102.82556199999993,78.258881000000088],[-102.8125,78.255829000000006],[-102.79860699999995,78.250274999999988],[-102.78916899999996,78.24443100000002],[-102.78222700000003,78.238586000000055],[-102.78028899999993,78.23275799999999],[-102.77639799999986,78.215546000000131],[-102.77639799999986,78.210266000000047],[-102.781387,78.204987000000074],[-102.79332699999998,78.199416999999983],[-102.85527000000002,78.188872999999944],[-102.89806399999992,78.17804000000001],[-102.93195300000002,78.166931000000091],[-102.97721899999999,78.150269000000094],[-103.01777599999997,78.133606000000043],[-103.04167199999995,78.122208000000001],[-103.05695300000002,78.119705000000067]],[[-94.366652999999985,78.159149000000127],[-94.378051999999968,78.15776100000005],[-94.404448999999943,78.159988000000112],[-94.506118999999956,78.172760000000096],[-94.520003999999858,78.177475000000129],[-94.67111199999988,78.240814000000057],[-94.683060000000012,78.247208000000057],[-94.694152999999915,78.2586060000001],[-94.692215000000033,78.264709000000039],[-94.681106999999884,78.274155000000007],[-94.660827999999924,78.279160000000047],[-94.635558999999944,78.28387500000008],[-94.602218999999991,78.287200999999925],[-94.572234999999921,78.287766000000147],[-94.546386999999982,78.284424000000058],[-94.515014999999892,78.278046000000074],[-94.481948999999929,78.268326000000002],[-94.36111499999987,78.22164900000007],[-94.344726999999978,78.214706000000092],[-94.316665999999998,78.197479000000044],[-94.309433000000013,78.191086000000098],[-94.306945999999925,78.184982000000048],[-94.309157999999968,78.179153000000042],[-94.366652999999985,78.159149000000127]],[[-88.287215999999944,78.24331699999999],[-88.360001000000011,78.237761999999918],[-88.381942999999978,78.242476999999951],[-88.393616000000009,78.248871000000008],[-88.404723999999987,78.25999500000006],[-88.407500999999911,78.264435000000105],[-88.411117999999931,78.273879999999963],[-88.40972899999997,78.292205999999965],[-88.404449,78.298035000000027],[-88.235274999999888,78.42692599999998],[-88.113051999999982,78.45526099999995],[-88.09445199999999,78.456940000000145],[-88.070281999999963,78.454712000000029],[-88.061385999999914,78.452484000000084],[-88.052779999999927,78.445526000000086],[-88.049728000000016,78.444427000000076],[-88.043334999999956,78.436646000000053],[-88.044448999999929,78.42442299999999],[-88.044997999999964,78.421371000000079],[-88.046660999999972,78.418868999999972],[-88.057220000000029,78.407485999999949],[-88.166396999999961,78.308029000000033],[-88.187774999999988,78.291655999999932],[-88.245543999999995,78.252777000000094],[-88.255004999999983,78.247208000000057],[-88.287215999999944,78.24331699999999]],[[-109.64806399999992,78.588042999999971],[-109.569458,78.586380000000077],[-109.54998799999998,78.586655000000064],[-109.50055700000001,78.582763999999997],[-109.40527299999997,78.556931000000077],[-109.33416699999998,78.524155000000121],[-109.26055899999994,78.487198000000092],[-109.25556899999998,78.482483000000059],[-109.254997,78.478591999999992],[-109.26055899999994,78.455826000000002],[-109.31806899999992,78.35803199999998],[-109.32721700000002,78.352203000000145],[-109.40499899999992,78.306366000000082],[-109.42859599999997,78.303314],[-109.59583999999995,78.302765000000022],[-109.766953,78.294144000000131],[-109.82444799999996,78.293869000000086],[-109.85333300000002,78.29664600000001],[-109.882767,78.301376000000062],[-109.89306599999998,78.307205000000067],[-109.89835399999998,78.3119200000001],[-109.90862299999998,78.317764000000068],[-109.92610200000001,78.323043999999982],[-109.95527599999997,78.325821000000076],[-109.98388699999998,78.325546000000031],[-110.01251200000002,78.323608000000092],[-110.19638099999997,78.303864000000033],[-110.22444199999995,78.299987999999928],[-110.25250199999999,78.295822000000044],[-110.279449,78.284987999999998],[-110.29778299999992,78.281097000000102],[-110.354446,78.276657000000057],[-110.4119419999999,78.277206000000035],[-110.484734,78.284424000000058],[-110.57167099999992,78.289703000000031],[-110.65833999999995,78.29304500000012],[-110.71556099999992,78.292480000000126],[-110.78778099999994,78.306931000000134],[-110.85665899999987,78.327208999999982],[-110.85888699999998,78.337769000000094],[-110.97501399999999,78.363876000000005],[-111.00250199999999,78.368042000000059],[-111.14138799999995,78.386108000000036],[-111.16999799999996,78.384155000000078],[-111.27778599999994,78.372207999999944],[-111.27139299999999,78.346100000000035],[-111.30610699999994,78.321106000000043],[-111.41000400000001,78.277206000000035],[-111.42304999999993,78.272217000000069],[-111.43888899999996,78.268600000000106],[-111.46250899999995,78.267487000000017],[-111.50527999999997,78.266936999999984],[-111.57556199999999,78.270538000000045],[-111.65249599999993,78.27276599999999],[-111.73832700000003,78.27276599999999],[-111.76666299999994,78.271378000000084],[-111.79527299999995,78.271103000000096],[-111.82000700000003,78.273604999999975],[-111.86472300000003,78.296370999999965],[-111.88221699999997,78.306931000000134],[-111.88861099999997,78.312485000000095],[-111.89277599999997,78.318054000000132],[-111.89167800000001,78.322220000000016],[-111.91861,78.332764000000054],[-111.939438,78.338318000000072],[-112.13305700000001,78.36554000000001],[-112.21501199999994,78.365265000000136],[-112.43776700000001,78.354431000000091],[-112.58306899999997,78.343597000000045],[-112.68443299999996,78.331375000000037],[-112.73916599999995,78.323043999999982],[-112.78721599999989,78.310531999999967],[-112.89083900000003,78.292480000000126],[-112.94499199999996,78.28387500000008],[-113.02694700000001,78.27276599999999],[-113.05499299999997,78.271378000000084],[-113.14222699999999,78.268326000000002],[-113.16860999999994,78.268600000000106],[-113.18831599999999,78.269989000000123],[-113.21777299999985,78.27777100000003],[-113.27333099999998,78.296370999999965],[-113.28195199999999,78.299713000000111],[-113.287781,78.302475000000015],[-113.33249699999993,78.328872999999987],[-113.33416699999998,78.332764000000054],[-113.21611000000001,78.385269000000108],[-113.1241609999999,78.420822000000101],[-113.11527999999987,78.423035000000084],[-113.03832999999997,78.436919999999986],[-112.71167000000003,78.484711000000061],[-112.60749800000002,78.4994200000001],[-112.36305199999998,78.533324999999991],[-112.31166100000002,78.539977999999962],[-112.23805199999998,78.547211000000004],[-112.12970699999994,78.551926000000037],[-111.98805199999987,78.552764999999965],[-111.90360999999996,78.548874000000069],[-111.87304699999999,78.544434000000081],[-111.85305800000003,78.542755000000056],[-111.80972299999991,78.545258000000047],[-111.75250199999994,78.55053700000002],[-111.67777999999993,78.563034000000016],[-111.641953,78.574158000000068],[-111.60082999999997,78.585266000000104],[-111.57224299999996,78.588593000000003],[-111.45556599999998,78.592758000000003],[-111.39195299999994,78.61192299999999],[-111.378601,78.617751999999996],[-111.37998999999991,78.622757000000036],[-111.36305199999998,78.64276099999995],[-111.16055299999999,78.691649999999925],[-110.95612299999993,78.718323000000112],[-110.79110700000001,78.735259999999926],[-110.6375119999999,78.748596000000077],[-110.46028100000001,78.757492000000013],[-110.43055700000002,78.758605999999986],[-110.41055299999999,78.757767000000001],[-110.39527900000002,78.756104000000107],[-110.38445299999989,78.751389000000074],[-110.271118,78.727768000000026],[-110.16416900000002,78.70915199999996],[-110.07778899999988,78.694977000000051],[-109.99722300000002,78.683868000000018],[-109.86165599999998,78.666930999999977],[-109.85582699999998,78.660262999999986],[-109.86000100000001,78.654433999999981],[-109.86165599999998,78.649155000000007],[-109.86110699999995,78.643326000000002],[-109.85526999999996,78.637496999999996],[-109.67054699999989,78.591370000000097],[-109.64806399999992,78.588042999999971]],[[-74.306945999999982,78.676651000000049],[-74.334166999999923,78.675262000000089],[-74.36721799999998,78.676086000000055],[-74.419448999999986,78.681655999999919],[-74.614166000000012,78.702774000000034],[-74.704726999999934,78.722762999999929],[-74.710007000000019,78.727477999999962],[-74.710281000000009,78.731094000000041],[-74.706664999999987,78.737488000000099],[-74.645003999999972,78.772491000000059],[-74.632216999999969,78.777206000000092],[-74.615829000000019,78.778595000000109],[-74.591109999999958,78.778870000000097],[-74.555557000000022,78.776093000000003],[-74.356948999999929,78.755829000000062],[-74.312042000000019,78.750000000000057],[-74.28195199999999,78.746094000000028],[-74.192489999999964,78.729705999999965],[-74.167770000000019,78.719986000000063],[-74.163619999999923,78.716094999999996],[-74.172774999999888,78.711380000000133],[-74.236388999999974,78.687194999999917],[-74.256667999999934,78.6827550000001],[-74.28443900000002,78.678864000000033],[-74.306945999999982,78.676651000000049]],[[-96.768065999999976,78.684143000000006],[-96.708892999999989,78.6827550000001],[-96.645003999999972,78.686096000000134],[-96.613051999999982,78.685532000000023],[-96.585007000000019,78.68331900000004],[-96.533614999999941,78.676926000000094],[-96.510559000000001,78.672484999999995],[-96.466399999999965,78.661926000000108],[-96.395279000000016,78.640549000000078],[-96.379165999999998,78.634430000000066],[-96.356109999999944,78.627762000000075],[-96.315826000000015,78.618042000000003],[-96.293883999999935,78.615265000000079],[-96.265015000000005,78.618866000000139],[-96.235549999999989,78.627762000000075],[-96.202498999999875,78.630264000000011],[-96.184432999999956,78.628586000000041],[-96.167495999999971,78.623306000000014],[-96.158889999999872,78.617203000000075],[-96.152495999999985,78.611374000000012],[-96.216400000000021,78.560531999999967],[-96.178054999999915,78.518875000000094],[-96.009445000000028,78.492477000000122],[-95.857773000000009,78.494980000000055],[-95.820006999999919,78.502213000000097],[-95.746658000000025,78.514998999999989],[-95.71665999999999,78.519714000000022],[-95.68472300000002,78.521103000000039],[-95.652221999999995,78.521378000000027],[-95.601944000000003,78.519714000000022],[-95.537215999999944,78.514708999999982],[-95.481673999999998,78.508881000000031],[-95.407775999999956,78.497208000000057],[-95.206389999999942,78.461655000000007],[-95.086944999999957,78.437759000000085],[-94.895003999999972,78.395828000000108],[-94.877776999999924,78.391373000000101],[-94.86082499999992,78.384720000000129],[-94.831679999999949,78.364699999999971],[-94.829177999999956,78.358871000000136],[-94.830840999999907,78.352767999999969],[-94.837508999999955,78.347214000000008],[-94.853332999999907,78.341934000000094],[-94.941939999999988,78.316375999999991],[-94.966948999999943,78.311371000000122],[-95.096389999999928,78.290268000000026],[-95.36361699999992,78.24136400000009],[-95.388061999999934,78.236374000000012],[-95.399170000000026,78.231093999999985],[-95.398620999999991,78.226928999999984],[-95.388900999999976,78.222488000000055],[-95.368880999999988,78.218596999999988],[-95.345839999999953,78.217758000000003],[-95.255279999999914,78.21804800000001],[-95.227492999999981,78.216660000000104],[-95.130829000000006,78.194138000000009],[-95.113051999999925,78.188583000000108],[-95.106948999999986,78.185257000000092],[-95.108611999999994,78.179428000000087],[-95.111937999999952,78.174149000000114],[-95.111937999999952,78.167480000000012],[-95.106109999999944,78.161926000000051],[-95.089721999999995,78.154984000000127],[-95.068068999999923,78.148041000000148],[-94.98332199999993,78.133040999999992],[-94.90695199999999,78.117203000000131],[-94.889998999999989,78.108870999999965],[-94.886947999999961,78.102768000000026],[-94.911666999999852,78.055251999999996],[-95.011397999999986,77.991363999999919],[-95.043883999999935,77.974991000000045],[-95.057494999999903,77.969147000000078],[-95.085280999999952,77.958878000000027],[-95.100554999999929,77.953597999999943],[-95.112503000000004,77.951385000000016],[-95.137511999999958,77.950546000000031],[-95.162506000000008,77.953597999999943],[-95.186385999999857,77.957764000000054],[-95.211670000000026,77.961105000000089],[-95.236938000000009,77.964157],[-95.265838999999971,77.966095000000109],[-95.321395999999993,77.96775800000006],[-95.379989999999964,77.966384999999946],[-95.400283999999999,77.962769000000094],[-95.41332999999986,77.959426999999948],[-95.425551999999925,77.948029000000133],[-95.449722000000008,77.9433140000001],[-95.549728000000016,77.934143000000006],[-95.758057000000008,77.911926000000108],[-95.830840999999964,77.898880000000133],[-95.938599000000011,77.885817999999972],[-96.189437999999939,77.866089000000045],[-96.285552999999936,77.859421000000054],[-96.317504999999926,77.858322000000101],[-96.345551,77.858597000000088],[-96.365279999999984,77.859984999999995],[-96.386123999999995,77.862762000000089],[-96.404174999999952,77.868591000000094],[-96.41194200000001,77.874984999999981],[-96.410827999999924,77.880813999999987],[-96.405272999999966,77.886382999999967],[-96.410552999999993,77.890549000000078],[-96.416945999999996,77.893875000000094],[-96.43582200000003,77.898604999999975],[-96.456664999999987,77.901657000000057],[-96.541107000000011,77.897217000000069],[-96.734436000000017,77.872757000000036],[-96.735000999999954,77.86692800000003],[-96.710555999999997,77.855545000000006],[-96.696380999999917,77.850815000000125],[-96.667220999999927,77.849152000000061],[-96.585007000000019,77.856368999999972],[-96.558884000000035,77.859421000000054],[-96.539718999999991,77.864426000000094],[-96.516113000000018,77.869430999999963],[-96.491668999999888,77.870254999999929],[-96.515563999999983,77.845535000000098],[-96.542770000000019,77.841934000000037],[-96.628325999999959,77.840546000000131],[-96.68720999999988,77.840546000000131],[-96.71166999999997,77.839706000000092],[-96.734160999999972,77.835541000000092],[-96.748610999999926,77.830276000000026],[-96.829452999999944,77.789153999999996],[-96.849990999999989,77.787201000000039],[-96.880553999999961,77.786926000000051],[-96.900283999999999,77.788315000000011],[-96.907776000000013,77.790542999999957],[-96.912216000000001,77.793045000000063],[-96.933884000000035,77.797485000000052],[-97.014174999999966,77.804153000000042],[-97.057495000000017,77.805542000000059],[-97.072509999999909,77.804153000000042],[-97.096953999999926,77.803314000000057],[-97.102218999999991,77.807479999999998],[-97.119720000000029,77.865265000000079],[-97.11999499999996,77.870254999999929],[-97.107497999999964,77.876373000000058],[-97.081389999999942,77.886658000000011],[-97.015563999999983,77.904160000000047],[-97.002228000000002,77.908600000000035],[-96.99221799999998,77.914154000000053],[-96.992492999999911,77.918869000000086],[-96.994995000000017,77.921097000000032],[-97.142775999999969,77.934982000000105],[-97.281676999999945,77.948318000000086],[-97.30999799999995,77.951096000000064],[-97.354445999999996,77.962204000000042],[-97.380279999999971,77.969986000000006],[-97.431670999999994,77.986923000000047],[-97.454726999999934,77.992752000000053],[-97.503066999999874,78.002486999999917],[-97.572234999999978,78.012497000000053],[-97.602782999999931,78.015548999999965],[-97.673614999999984,78.021378000000141],[-97.75556899999998,78.025542999999971],[-97.766953000000001,78.028870000000097],[-97.77555799999999,78.034988000000055],[-97.666945999999996,78.088043000000084],[-97.647781000000009,78.090820000000008],[-97.618331999999953,78.091660000000047],[-97.567504999999926,78.089706000000035],[-97.513061999999991,78.086655000000007],[-97.43249499999996,78.080551000000128],[-97.323623999999995,78.076935000000105],[-97.297775000000001,78.076385000000073],[-97.024444999999901,78.074706999999933],[-96.997771999999998,78.075271999999984],[-96.910278000000005,78.079163000000051],[-96.887511999999958,78.083054000000118],[-96.855559999999912,78.104155999999932],[-96.856383999999991,78.108032000000037],[-96.870543999999995,78.133330999999998],[-96.885558999999944,78.138046000000031],[-96.983886999999925,78.150818000000072],[-97.059157999999968,78.15776100000005],[-97.138061999999934,78.165817000000118],[-97.164444000000003,78.168869000000029],[-97.184722999999963,78.172485000000108],[-97.194992000000013,78.17692599999998],[-97.200835999999924,78.183593999999971],[-97.212509000000011,78.189422999999977],[-97.299438000000009,78.204712000000086],[-97.321120999999948,78.207488999999953],[-97.349166999999966,78.208602999999982],[-97.407776000000013,78.207763999999997],[-97.635558999999944,78.206650000000025],[-97.829453000000001,78.219147000000021],[-97.849441999999954,78.234711000000118],[-97.817504999999983,78.23275799999999],[-97.773055999999997,78.238876000000118],[-97.763335999999924,78.24443100000002],[-97.777785999999878,78.25],[-97.867766999999958,78.279709000000025],[-97.881103999999993,78.283600000000092],[-97.904175000000009,78.28804000000008],[-97.930557000000022,78.290817000000004],[-98.012786999999946,78.296936000000017],[-98.054717999999923,78.301651000000049],[-98.068343999999968,78.308029000000033],[-98.070846999999958,78.313599000000067],[-98.043610000000001,78.389434999999992],[-98.148345999999947,78.403870000000097],[-98.172226000000023,78.40498400000007],[-98.198333999999988,78.408599999999979],[-98.347778000000005,78.443038999999999],[-98.366652999999985,78.449416999999983],[-98.388061999999991,78.467484000000013],[-98.410552999999993,78.490265000000022],[-98.411391999999921,78.4952550000001],[-98.410277999999948,78.508040999999992],[-98.308884000000035,78.533875000000023],[-98.171386999999982,78.529709000000139],[-98.054442999999992,78.533600000000035],[-98.022231999999917,78.53637700000013],[-98.019164999999987,78.542755000000056],[-98.028060999999923,78.563309000000004],[-98.042220999999927,78.569716999999969],[-98.080001999999922,78.582763999999997],[-98.115004999999996,78.593871999999976],[-98.139998999999989,78.599425999999994],[-98.169158999999922,78.603043000000127],[-98.235001000000011,78.619141000000013],[-98.315276999999924,78.64387499999998],[-98.326950000000011,78.650542999999914],[-98.328063999999927,78.652206000000035],[-98.371658000000025,78.719986000000063],[-98.366104000000007,78.763611000000026],[-98.36471599999993,78.768051000000071],[-98.17332499999992,78.812759000000142],[-98.144454999999994,78.816666000000112],[-98.06138599999997,78.818877999999984],[-97.777785999999878,78.815262000000075],[-97.65695199999999,78.811371000000008],[-97.59973100000002,78.807479999999941],[-97.488602000000014,78.796646000000067],[-97.461945000000014,78.792755],[-97.436934999999892,78.786925999999994],[-97.385559000000001,78.776931999999988],[-97.359160999999972,78.773041000000092],[-97.273620999999991,78.764434999999992],[-97.160278000000005,78.758881000000031],[-97.078063999999983,78.74971000000005],[-97.025283999999942,78.741928000000087],[-96.999725000000012,78.736923000000047],[-96.954726999999934,78.726379000000009],[-96.922500999999954,78.713318000000072],[-96.913895000000025,78.706940000000088],[-96.903884999999946,78.701660000000061],[-96.886397999999986,78.696640000000002],[-96.768065999999976,78.684143000000006]],[[-86.319457999999997,78.883606000000043],[-86.388061999999877,78.883041000000048],[-86.414718999999934,78.884430000000009],[-86.444442999999978,78.887207000000103],[-86.469161999999926,78.889708999999982],[-86.484436000000017,78.892761000000121],[-86.476943999999889,78.896378000000084],[-86.43638599999997,78.911102000000085],[-86.386672999999973,78.924988000000099],[-86.366104000000007,78.929703000000131],[-86.346114999999998,78.939697000000137],[-86.328613000000018,78.950821000000019],[-86.292770000000019,78.983047000000113],[-86.285277999999948,78.993317000000047],[-86.283614999999941,78.99803200000008],[-86.046951000000035,79.038589000000059],[-85.990828999999962,79.046936000000073],[-85.924437999999952,79.053864000000033],[-85.896117999999944,79.056931000000134],[-85.820007000000032,79.061371000000008],[-85.712509000000011,79.064148000000046],[-85.646118000000001,79.06442300000009],[-85.321395999999936,79.053864000000033],[-85.263335999999924,79.048874000000012],[-85.216109999999901,79.041367000000037],[-85.199722000000008,79.037490999999989],[-85.182495000000017,79.031372000000147],[-85.167220999999927,79.020828000000108],[-85.169448999999986,79.014709000000039],[-85.176391999999964,79.008880999999974],[-85.186661000000015,79.002777000000094],[-85.20944199999991,78.993590999999981],[-85.225829999999974,78.988586000000112],[-85.246947999999975,78.984146000000067],[-85.301392000000021,78.975266000000033],[-85.466110000000015,78.958327999999995],[-85.546660999999972,78.95248400000014],[-85.765563999999983,78.93414300000012],[-86.026947000000007,78.910262999999986],[-86.213897999999972,78.891663000000051],[-86.244995000000017,78.888321000000076],[-86.284163999999976,78.885268999999994],[-86.319457999999997,78.883606000000043]],[[-103.59388699999988,79.325821000000019],[-103.39835399999993,79.299988000000099],[-103.33556399999998,79.299988000000099],[-103.26251200000002,79.299988000000099],[-103.13999899999993,79.287766000000147],[-103.09777799999995,79.282486000000063],[-103.08361799999994,79.279433999999981],[-103.06806899999992,79.273880000000133],[-102.92111199999999,79.21748400000007],[-102.92666600000001,79.211105000000032],[-102.92639199999996,79.206649999999968],[-102.921944,79.200272000000041],[-102.90194699999995,79.172211000000118],[-102.89167800000001,79.166656000000046],[-102.87444299999987,79.164992999999924],[-102.76862299999993,79.138884999999959],[-102.620003,79.097214000000008],[-102.61165599999998,79.093048000000124],[-102.60582699999998,79.074432000000115],[-102.60637700000001,79.068054000000132],[-102.612213,79.056641000000127],[-102.654449,78.994141000000013],[-102.66555799999998,78.98275799999999],[-102.67582700000003,78.977478000000133],[-102.69860799999992,78.971924000000115],[-102.72084000000001,78.938309000000061],[-102.59500099999997,78.876648000000046],[-102.57945299999994,78.873032000000023],[-102.56082200000003,78.869705000000067],[-102.55082700000003,78.869431000000134],[-102.52887699999985,78.873032000000023],[-102.39195299999994,78.931656000000089],[-102.37638900000002,78.946365000000128],[-102.38054699999998,78.962769000000094],[-102.39806399999992,78.987198000000035],[-102.36305199999998,79.014999000000103],[-102.27944899999989,79.018051000000014],[-102.09361299999989,79.044144000000131],[-102.04943799999995,79.054427999999973],[-102.01500699999997,79.064987000000031],[-101.99333199999995,79.076096000000121],[-101.975281,79.080825999999945],[-101.942207,79.084717000000012],[-101.90249599999993,79.086380000000133],[-101.88194299999998,79.086104999999918],[-101.64890299999996,79.075821000000076],[-101.62805200000003,79.071930000000009],[-101.54194599999994,79.044708000000071],[-101.5202789999999,79.038315000000125],[-101.30803699999996,78.975815000000011],[-101.23166699999996,78.959427000000119],[-101.20472699999999,78.954162999999994],[-101.17666600000001,78.95387299999993],[-101.15222199999988,78.956650000000025],[-101.14334100000002,78.962494000000049],[-101.14472999999992,78.968323000000055],[-101.14083900000003,78.974152000000061],[-101.09388699999994,78.963608000000022],[-101.00556899999998,78.943039000000056],[-100.98665599999998,78.937195000000088],[-100.98528299999998,78.931366000000025],[-101.11694299999988,78.856934000000138],[-101.15278599999999,78.83998100000008],[-101.19304699999992,78.824431999999945],[-101.20056199999999,78.820831000000112],[-101.20333899999997,78.815811000000053],[-101.20084399999996,78.811919999999986],[-101.18639400000001,78.802765000000136],[-101.17278299999998,78.800537000000134],[-100.99194299999999,78.788879000000122],[-100.86389199999991,78.781372000000033],[-100.83056599999992,78.789703000000088],[-100.80055199999998,78.793320000000051],[-100.70556599999998,78.799712999999997],[-100.61389200000002,78.798035000000084],[-100.587784,78.799149000000057],[-100.55915799999997,78.80442800000003],[-100.55027799999993,78.809982000000048],[-100.53639199999998,78.815536000000009],[-100.52443700000003,78.818054000000018],[-100.35109699999998,78.828323000000012],[-100.34445199999993,78.826660000000118],[-100.32389799999999,78.802200000000084],[-100.32250999999997,78.797211000000118],[-100.33249699999993,78.782760999999994],[-100.32333399999993,78.778046000000131],[-100.283073,78.767761000000064],[-100.22778299999993,78.760544000000095],[-100.14334099999996,78.75221300000004],[-100.12416100000002,78.750000000000057],[-100.03250099999997,78.739426000000037],[-100.004997,78.735809000000074],[-99.952498999999989,78.725540000000024],[-99.93638599999997,78.719986000000063],[-99.896392999999932,78.695816000000036],[-99.893889999999942,78.693039000000113],[-99.893065999999976,78.6869200000001],[-99.913329999999917,78.679703000000018],[-99.972777999999948,78.659987999999998],[-100.0625,78.638885000000073],[-100.0625,78.635544000000039],[-100.01666299999988,78.616653000000042],[-99.988891999999908,78.613876000000118],[-99.96305799999999,78.614990000000091],[-99.90972899999997,78.623871000000008],[-99.853332999999964,78.633041000000048],[-99.817504999999926,78.630538999999999],[-99.573623999999995,78.595535000000098],[-99.550277999999878,78.590271000000143],[-99.533324999999991,78.583602999999982],[-99.529723999999987,78.578048999999965],[-99.534164000000033,78.572220000000129],[-99.661117999999931,78.485535000000027],[-99.670272999999895,78.479706000000022],[-99.684157999999968,78.474426000000108],[-99.712508999999955,78.469436999999971],[-99.777221999999995,78.46138000000002],[-99.831389999999999,78.450821000000133],[-99.859436000000017,78.442200000000014],[-99.867767000000015,78.437484999999981],[-99.865004999999996,78.434418000000051],[-99.821395999999993,78.427475000000072],[-99.801391999999964,78.420822000000101],[-99.786666999999966,78.414703000000088],[-99.776672000000019,78.408599999999979],[-99.761123999999995,78.396378000000141],[-99.753615999999909,78.389709000000096],[-99.748336999999992,78.383605999999986],[-99.749160999999958,78.372482000000105],[-99.778609999999958,78.332214000000022],[-99.797774999999945,78.308594000000028],[-99.799437999999952,78.303314],[-99.793883999999878,78.297211000000061],[-99.775832999999977,78.292480000000126],[-99.741378999999938,78.289978000000019],[-99.673049999999989,78.290817000000004],[-99.620543999999938,78.290268000000026],[-99.551102000000014,78.286102000000142],[-99.529449,78.282486000000063],[-99.514450000000011,78.277206000000035],[-99.479720999999984,78.249146000000053],[-99.447768999999994,78.224152000000061],[-99.428329000000019,78.211655000000064],[-99.413894999999968,78.205261000000007],[-99.398620999999991,78.199997000000053],[-99.188599000000011,78.133040999999992],[-98.989166000000012,78.073044000000039],[-98.969161999999926,78.068329000000006],[-98.945830999999885,78.061645999999996],[-98.945830999999885,78.05581699999999],[-98.962783999999942,78.009155000000078],[-98.971663999999976,77.997757000000092],[-98.980834999999956,77.992203000000075],[-98.998885999999914,77.986923000000047],[-99.021666999999866,77.981659000000036],[-99.081115999999952,77.971923999999944],[-99.094727000000034,77.966384999999946],[-99.099166999999966,77.960815000000082],[-99.098891999999921,77.954987000000131],[-99.078612999999905,77.925537000000077],[-99.069167999999991,77.913605000000075],[-99.041381999999942,77.900818000000072],[-99.022781000000009,77.894440000000145],[-99.013335999999981,77.888321000000133],[-99.022231999999974,77.882477000000108],[-99.238051999999982,77.837769000000037],[-99.396666999999979,77.824158000000068],[-99.525283999999999,77.813599000000011],[-99.549438000000009,77.812485000000038],[-99.713057999999933,77.810806000000014],[-99.853881999999999,77.792206000000078],[-99.859436000000017,77.786926000000051],[-99.876937999999939,77.781372000000033],[-99.90695199999999,77.778595000000109],[-100.21000699999996,77.809982000000048],[-100.32972699999999,77.825272000000041],[-100.49889399999995,77.85165400000011],[-100.60637699999995,77.879974000000118],[-100.75527999999997,77.955551000000071],[-100.78611799999999,77.974152000000117],[-100.81749699999995,77.999146000000053],[-100.82389799999999,78.004440000000045],[-100.83833299999998,78.022766000000047],[-100.83778399999994,78.034988000000055],[-100.83693700000003,78.040268000000083],[-100.83444199999991,78.04414399999996],[-100.82694999999995,78.048874000000012],[-100.853882,78.096649000000014],[-100.87581599999999,78.099990999999932],[-100.99861099999998,78.131653000000085],[-101.00974300000001,78.136658000000125],[-101.02194199999991,78.147766000000104],[-101.01889,78.156937000000084],[-101.01528899999994,78.16276600000009],[-101.01363399999997,78.173599000000081],[-101.01390100000003,78.184707999999944],[-101.02027900000002,78.189697000000081],[-101.03555299999999,78.196091000000138],[-101.06276699999995,78.198593000000017],[-101.08944700000001,78.198029000000076],[-101.23137700000001,78.183868000000075],[-101.28943599999997,78.182479999999998],[-101.31667299999998,78.184982000000048],[-101.34249899999998,78.189422999999977],[-101.41722099999998,78.208878000000141],[-101.432503,78.215271000000087],[-101.43138099999999,78.221374999999966],[-101.43276999999989,78.227478000000076],[-101.45638999999994,78.232208000000128],[-101.47416699999991,78.234711000000118],[-101.49665800000002,78.237198000000149],[-101.83332799999999,78.264999000000046],[-102.13305699999989,78.282761000000107],[-102.15750100000002,78.282486000000063],[-102.18221999999997,78.281097000000102],[-102.29888900000003,78.273315000000139],[-102.34722899999997,78.267761000000121],[-102.38890100000003,78.260817999999972],[-102.47138999999999,78.248871000000008],[-102.50167799999997,78.245819000000097],[-102.56139400000001,78.241089000000045],[-102.59056099999987,78.239700000000084],[-102.61860699999994,78.24136400000009],[-102.64527900000002,78.24552900000009],[-102.73222399999992,78.263885000000073],[-102.781387,78.276093000000117],[-102.79778299999998,78.282211000000075],[-102.80943300000001,78.288315000000125],[-102.8163909999999,78.294434000000138],[-102.81833599999999,78.300262000000032],[-102.81360599999994,78.310806000000127],[-102.80803700000001,78.316939999999931],[-102.74999999999989,78.338318000000072],[-102.736107,78.342484000000127],[-102.68639400000001,78.350540000000024],[-102.66583299999991,78.358596999999975],[-102.67083699999995,78.36303700000002],[-102.69499199999996,78.367752000000053],[-102.72250400000001,78.371368000000075],[-102.77778599999994,78.376372999999944],[-102.80610699999994,78.377762000000132],[-102.83583099999998,78.376372999999944],[-102.88999899999999,78.36914100000007],[-102.92027299999995,78.365814000000114],[-102.93804899999992,78.364699999999971],[-102.96694899999989,78.364150999999993],[-103.02443699999998,78.365265000000136],[-103.13390400000003,78.36914100000007],[-103.16388699999999,78.366928000000087],[-103.21417200000002,78.356644000000074],[-103.23832700000003,78.350540000000024],[-103.26471699999996,78.34526100000005],[-103.38110399999988,78.3316650000001],[-103.41111799999999,78.329437000000098],[-103.49804699999999,78.327774000000034],[-103.52749599999987,78.326385000000016],[-103.58473200000003,78.321930000000009],[-103.67999299999997,78.3119200000001],[-103.75110599999999,78.301376000000062],[-103.78195199999999,78.296097000000032],[-103.80803700000001,78.290543000000071],[-103.829453,78.284987999999998],[-103.87721299999998,78.272217000000069],[-103.89417300000002,78.252212999999927],[-103.89890299999996,78.245819000000097],[-103.91027800000001,78.241089000000045],[-103.93331899999998,78.237198000000149],[-103.96305799999999,78.233597000000088],[-103.99194299999999,78.233047000000056],[-104.02250699999996,78.234146000000067],[-104.04277000000002,78.23692299999999],[-104.06984699999987,78.242171999999982],[-104.08306899999997,78.244140999999956],[-104.110817,78.246643000000063],[-104.19027699999998,78.251663000000121],[-104.30471799999992,78.252212999999927],[-104.36361699999998,78.254439999999988],[-104.41251399999999,78.257767000000115],[-104.46749899999998,78.26527400000009],[-104.49445300000002,78.270538000000045],[-104.82055700000001,78.355820000000108],[-104.99194299999999,78.437759000000085],[-104.99999999999994,78.443862999999965],[-105.05055199999998,78.488037000000077],[-105.05139200000002,78.494431000000134],[-105.04305999999991,78.505829000000119],[-105.01194800000002,78.52165199999996],[-104.95361299999996,78.537491000000102],[-104.86860699999994,78.560531999999967],[-104.83139,78.569992000000013],[-104.806107,78.572495000000004],[-104.69638099999992,78.578873000000101],[-104.66665599999999,78.579712000000086],[-104.39778100000001,78.569992000000013],[-104.35500300000001,78.566375999999934],[-104.287781,78.555252000000053],[-104.26278699999995,78.549423000000047],[-104.21221899999995,78.539977999999962],[-104.1661069999999,78.53276100000005],[-104.14277600000003,78.529434000000094],[-104.08833300000003,78.524155000000121],[-104.03388999999999,78.519989000000066],[-103.93055699999996,78.516098],[-103.87110899999993,78.518051000000128],[-103.78250100000002,78.519714000000022],[-103.7225039999999,78.517211999999972],[-103.66583299999996,78.51249700000011],[-103.58860799999997,78.503875999999991],[-103.53333299999991,78.496367999999961],[-103.52362099999999,78.496094000000028],[-103.51834100000002,78.496933000000013],[-103.46584300000001,78.51748699999996],[-103.37805200000003,78.586105000000032],[-103.39998599999996,78.615540000000124],[-103.44666299999994,78.621368000000075],[-103.50611900000001,78.621368000000075],[-103.74082900000002,78.619705000000124],[-103.98554999999999,78.61692800000003],[-104.01000999999991,78.617203000000075],[-104.04215999999991,78.620681999999931],[-104.04222099999998,78.629973999999947],[-104.03278399999988,78.635269000000051],[-103.98916600000001,78.646103000000096],[-103.85193600000002,78.669434000000138],[-103.82611099999997,78.671921000000054],[-103.77223200000003,78.671097000000088],[-103.65834000000001,78.664993000000038],[-103.62888299999992,78.664429000000098],[-103.53943600000002,78.664993000000038],[-103.50917099999987,78.666382000000056],[-103.48361199999994,78.669144000000131],[-103.49082899999996,78.674987999999985],[-103.50306699999999,78.681091000000094],[-103.51306199999993,78.687484999999924],[-103.52778599999999,78.699417000000096],[-103.525284,78.705261000000121],[-103.51806599999998,78.710815000000082],[-103.48860200000001,78.715820000000122],[-103.439438,78.72026100000005],[-103.41221599999989,78.72026100000005],[-103.38861099999997,78.716933999999924],[-103.35804699999994,78.718597000000045],[-103.33389299999999,78.722488000000112],[-103.31916799999999,78.728591999999992],[-103.31639099999995,78.734420999999998],[-103.31889299999995,78.740264999999965],[-103.41665599999999,78.778870000000097],[-103.43916300000001,78.784988000000055],[-103.46806300000003,78.787491000000045],[-103.63971699999996,78.765273999999977],[-103.66915899999992,78.760544000000095],[-103.71056399999998,78.750000000000057],[-103.79611199999999,78.735809000000074],[-103.70249899999999,78.788315000000011],[-103.69526699999994,78.793868999999972],[-103.698036,78.799712999999997],[-103.72693599999997,78.802200000000084],[-103.86054999999999,78.806090999999981],[-103.87053699999996,78.806365999999969],[-103.886124,78.80442800000003],[-103.9083399999999,78.799149000000057],[-103.90556299999997,78.794144000000017],[-103.89639299999993,78.784714000000122],[-103.89083900000003,78.780273000000022],[-103.89527899999996,78.774994000000049],[-103.90527299999997,78.768875000000037],[-103.92916899999994,78.764998999999932],[-103.96056399999992,78.76138300000008],[-103.99109599999991,78.758881000000031],[-104.02166699999992,78.757492000000013],[-104.04943800000001,78.756378000000041],[-104.07389799999993,78.757767000000001],[-104.170547,78.765823000000069],[-104.19888300000002,78.770263999999997],[-104.21167000000003,78.776093000000003],[-104.21972699999998,78.782211000000132],[-104.21528599999999,78.793593999999985],[-104.16722099999998,78.816376000000105],[-104.13305700000001,78.827484000000084],[-104.04834,78.838882000000069],[-103.98665599999998,78.850265999999976],[-103.86054999999999,78.876648000000046],[-103.83139,78.886932000000115],[-103.82389799999999,78.892487000000017],[-103.82167099999992,78.898330999999985],[-103.82472199999995,78.903319999999951],[-103.86749299999997,78.916091999999992],[-103.96305799999999,78.929977000000065],[-103.98998999999998,78.932755000000043],[-104.00639299999995,78.935531999999967],[-104.029449,78.941650000000095],[-104.04750099999995,78.947754000000089],[-104.05332899999996,78.952208999999925],[-104.05387899999999,78.95748900000001],[-104.05222300000003,78.961380000000077],[-104.04778299999992,78.966659999999933],[-104.048607,78.971099999999979],[-104.05777,78.974152000000061],[-104.08112299999999,78.979431000000034],[-104.12943999999999,78.985809000000017],[-104.17859599999991,78.990265000000136],[-104.20361300000002,78.991653000000042],[-104.23388699999998,78.99192800000003],[-104.265556,78.988586000000112],[-104.45500199999998,78.956099999999992],[-104.47193899999996,78.950546000000031],[-104.51112399999994,78.910262999999986],[-104.53832999999997,78.881927000000019],[-104.56416300000001,78.864700000000028],[-104.57888799999989,78.858597000000088],[-104.78582799999998,78.806641000000013],[-104.81749699999995,78.802200000000084],[-104.87860099999995,78.798035000000084],[-104.90915699999999,78.796646000000067],[-104.96888699999994,78.797211000000118],[-104.98832700000003,78.798325000000091],[-105.01194800000002,78.803589000000102],[-105.02250699999996,78.809982000000048],[-105.02861000000001,78.815262000000075],[-105.02916699999997,78.821655000000078],[-105.02834300000001,78.832763999999941],[-105.01222200000001,78.844711000000075],[-104.83389299999999,78.926650999999993],[-104.68859899999995,78.993590999999981],[-104.67887899999999,78.999709999999993],[-104.674713,79.004990000000078],[-104.68110699999994,79.016663000000108],[-104.69415300000003,79.022766000000047],[-104.70805399999995,79.027771000000087],[-104.737213,79.031936999999971],[-104.90249599999993,79.04971299999994],[-104.98638899999997,79.043045000000006],[-105.01334399999996,79.038315000000125],[-105.09916699999991,79.02388000000002],[-105.12526700000001,79.021103000000096],[-105.15638699999988,79.019439999999975],[-105.39527900000002,79.011658000000068],[-105.42610200000001,79.011108000000036],[-105.48388699999998,79.013046000000145],[-105.51363399999997,79.016098000000056],[-105.54332699999998,79.020263999999941],[-105.5625,79.024428999999941],[-105.58138999999994,79.03054800000001],[-105.59084299999995,79.034424000000058],[-105.59944200000001,79.040268000000083],[-105.60665899999992,79.051926000000094],[-105.628601,79.161377000000073],[-105.62053699999996,79.172760000000096],[-105.48277300000001,79.306366000000082],[-105.45973199999997,79.324158000000125],[-105.43998699999997,79.329162999999994],[-105.40862299999992,79.328872999999987],[-105.38305699999995,79.326935000000049],[-105.33277899999996,79.319443000000092],[-105.19721999999996,79.299713000000111],[-105.16111799999999,79.297485000000108],[-105.12721299999998,79.297485000000108],[-105.10861199999999,79.298874000000126],[-105.01611300000002,79.310531999999967],[-104.95472699999993,79.315262000000018],[-104.85916099999997,79.319153000000085],[-104.74276700000001,79.322495000000004],[-104.58332799999999,79.329437000000098],[-104.54860699999989,79.331375000000037],[-104.49082900000002,79.339157],[-104.46083099999998,79.342209000000082],[-104.18167099999999,79.358871000000079],[-104.00723299999999,79.367752000000053],[-103.97778299999999,79.368866000000025],[-103.9491579999999,79.368042000000059],[-103.83500699999996,79.36442599999998],[-103.7225039999999,79.356934000000024],[-103.69526699999994,79.352203000000088],[-103.62053700000001,79.330551000000071],[-103.59388699999988,79.325821000000019]],[[-99.471663999999976,80.109711000000004],[-99.436661000000015,80.107208000000014],[-99.404723999999931,80.10803199999998],[-99.298049999999989,80.118866000000025],[-99.136672999999917,80.133040999999935],[-99.110549999999876,80.130539000000056],[-99.081680000000006,80.124695000000031],[-98.868880999999988,80.077774000000034],[-98.856658999999922,80.07249500000006],[-98.774719000000005,80.01527400000009],[-98.705841000000021,79.965820000000065],[-98.644164999999873,79.800261999999918],[-98.644164999999873,79.794144000000017],[-98.648620999999878,79.783599999999922],[-98.673049999999989,79.771927000000119],[-98.779175000000009,79.702208999999982],[-98.830001999999922,79.664429000000098],[-98.868057000000022,79.700821000000076],[-98.936110999999983,79.719711000000018],[-98.967772999999909,79.724152000000117],[-99.139998999999932,79.740814000000114],[-99.243056999999965,79.748596000000077],[-99.273620999999935,79.751389000000017],[-99.301391999999908,79.75471500000009],[-99.317229999999995,79.758605999999986],[-99.324448000000018,79.762497000000053],[-99.325561999999991,79.767487000000074],[-99.322509999999909,79.771378000000141],[-99.313048999999921,79.776093000000003],[-99.304717999999923,79.782211000000132],[-99.302779999999984,79.787490999999989],[-99.297501000000011,79.812759000000085],[-99.295837000000006,79.833328000000051],[-99.296386999999925,79.839157000000057],[-99.302215999999873,79.845261000000107],[-99.315826000000015,79.848602000000142],[-99.368880999999988,79.857758000000103],[-99.556655999999919,79.888885000000016],[-99.584441999999967,79.891937000000098],[-99.614166000000012,79.893326000000116],[-99.647781000000009,79.893051000000071],[-99.67971799999998,79.888046000000031],[-99.700835999999867,79.882750999999985],[-99.732223999999974,79.878860000000088],[-99.800827000000027,79.876648000000046],[-100.00556899999998,79.8744200000001],[-100.03582799999992,79.874695000000088],[-100.07028199999996,79.876923000000033],[-100.09777800000001,79.881088000000034],[-100.12110899999999,79.886658000000125],[-100.14389,79.893051000000071],[-100.15862299999998,79.898605000000089],[-100.17748999999998,79.909988000000112],[-100.17832900000002,79.915817000000118],[-100.19332900000001,80.03387500000008],[-100.08167999999989,80.084427000000005],[-100.06555200000003,80.089980999999966],[-100.02362099999993,80.099716000000058],[-99.827224999999999,80.143599999999992],[-99.795272999999952,80.147766000000104],[-99.759170999999981,80.149719000000005],[-99.726944000000003,80.150542999999971],[-99.625548999999921,80.148880000000077],[-99.599990999999989,80.145263999999997],[-99.593886999999881,80.139160000000004],[-99.571120999999948,80.132751000000098],[-99.471663999999976,80.109711000000004]],[[-99.155563000000029,80.174697999999978],[-99.127212999999927,80.168045000000006],[-99.113891999999964,80.163879000000122],[-99.138061999999991,80.162491000000045],[-99.160552999999993,80.163040000000137],[-99.184998000000007,80.167755],[-99.251952999999901,80.173035000000084],[-99.277495999999985,80.173035000000084],[-99.313613999999973,80.171097000000145],[-99.341384999999946,80.166092000000106],[-99.333069000000023,80.159424000000115],[-99.30360399999995,80.153870000000097],[-99.305556999999908,80.148331000000098],[-99.342498999999918,80.145538000000101],[-99.375274999999931,80.147217000000126],[-99.400557999999933,80.150818000000015],[-99.418059999999969,80.157211000000132],[-99.418335000000013,80.163040000000137],[-99.413329999999974,80.168868999999972],[-99.386947999999961,80.17886400000009],[-99.366942999999935,80.182205000000124],[-99.239165999999898,80.183868000000075],[-99.211944999999957,80.182205000000124],[-99.155563000000029,80.174697999999978]],[[-95.030837999999903,80.670258000000047],[-94.969451999999933,80.640274000000034],[-94.970551,80.635268999999994],[-94.981383999999991,80.631927000000076],[-95.006957999999997,80.626648000000046],[-95.190276999999924,80.608871000000022],[-95.226104999999961,80.60914600000001],[-95.453613000000018,80.629424999999969],[-95.611114999999984,80.648040999999978],[-95.676940999999943,80.653319999999951],[-95.711945000000014,80.654433999999981],[-95.749160999999958,80.653869999999984],[-95.788054999999929,80.652205999999978],[-95.823623999999938,80.648604999999918],[-95.86332699999997,80.645828000000051],[-96.061935000000005,80.656647000000078],[-96.118056999999965,80.660537999999974],[-96.14916999999997,80.664703000000145],[-96.139449999999954,80.669708000000014],[-96.076675000000023,80.683043999999995],[-96.028335999999967,80.687195000000088],[-96.006119000000012,80.688034000000016],[-95.491378999999995,80.699997000000053],[-95.424438000000009,80.699707000000046],[-95.200561999999934,80.697479000000101],[-95.166945999999939,80.695250999999985],[-95.128875999999934,80.691925000000083],[-95.096663999999976,80.688582999999994],[-95.062499999999943,80.682480000000055],[-95.065276999999924,80.680542000000116],[-95.045836999999949,80.676926000000037],[-95.030837999999903,80.670258000000047]],[[-92.727782999999931,81.305542000000059],[-92.530288999999982,81.284988000000112],[-92.21305799999999,81.245529000000033],[-92.148055999999997,81.236374000000126],[-92.124709999999936,81.232758000000103],[-92.052489999999921,81.218597000000102],[-91.955841000000021,81.196365000000014],[-91.858046999999999,81.167755],[-91.781677000000002,81.090271000000143],[-91.783889999999928,81.083602999999982],[-91.797501000000011,81.081665000000044],[-91.832503999999972,81.080276000000083],[-91.888061999999934,81.081940000000088],[-91.914444000000003,81.078049000000021],[-91.913894999999968,81.07499700000011],[-91.908614999999998,81.070540999999992],[-91.893341000000021,81.064986999999974],[-91.865828999999962,81.058594000000028],[-91.767226999999934,81.049148999999943],[-91.72222899999997,81.042205999999965],[-91.538895000000025,80.981658999999979],[-91.52555799999999,80.974990999999989],[-91.522781000000009,80.962769000000037],[-91.531676999999945,80.951096000000007],[-91.527221999999995,80.939697000000081],[-91.517776000000026,80.932754999999986],[-91.481673999999998,80.919434000000024],[-91.321121000000005,80.882750999999985],[-91.306106999999997,80.875534000000016],[-91.152221999999995,80.785538000000031],[-91.154998999999975,80.78054800000001],[-91.14916999999997,80.770263999999997],[-91.140563999999983,80.764709000000096],[-91.121658000000025,80.754715000000033],[-91.099441999999954,80.74803200000008],[-91.03472899999997,80.737488000000042],[-90.972777999999948,80.730270000000019],[-90.905272999999966,80.724425999999994],[-90.777221999999995,80.71775800000006],[-90.754181000000017,80.714995999999928],[-90.712783999999999,80.705551000000071],[-90.664718999999991,80.684708000000001],[-90.652495999999928,80.67804000000001],[-90.603881999999999,80.651382000000012],[-90.593612999999948,80.645264000000111],[-90.593063000000029,80.640823000000012],[-90.601943999999946,80.636107999999979],[-90.615829000000019,80.630264000000125],[-90.678054999999972,80.615540000000067],[-90.715835999999911,80.605545000000006],[-90.742492999999911,80.594711000000075],[-90.763061999999991,80.583603000000096],[-90.771666999999979,80.577484000000084],[-90.772780999999952,80.571930000000066],[-90.766402999999912,80.565536000000066],[-90.741378999999938,80.562195000000031],[-90.706116000000009,80.561371000000065],[-90.607223999999917,80.561371000000065],[-90.583069000000023,80.561371000000065],[-90.418059999999912,80.552200000000084],[-90.238891999999964,80.550536999999963],[-90.203339000000028,80.549712999999997],[-90.177215999999987,80.548874000000069],[-90.046386999999925,80.541656000000046],[-90.016402999999968,80.538039999999967],[-90,80.534591999999975],[-89.989990000000034,80.532486000000006],[-89.961394999999982,80.520263999999997],[-89.955565999999976,80.515548999999965],[-89.938598999999954,80.508330999999998],[-89.84056099999998,80.481369000000086],[-89.81639100000001,80.474991000000102],[-89.790282999999931,80.469437000000084],[-89.762511999999958,80.464995999999985],[-89.75111400000003,80.464432000000045],[-89.784163999999919,80.500824000000023],[-89.748336999999879,80.532760999999994],[-89.586945000000014,80.545532000000094],[-89.546111999999994,80.547485000000052],[-89.482773000000009,80.544983000000002],[-89.447219999999902,80.542480000000012],[-89.354172000000005,80.534988000000055],[-89.326400999999919,80.531937000000028],[-89.272781000000009,80.523315000000025],[-89.244995000000017,80.517212000000086],[-89.059158000000025,80.461380000000133],[-89.087508999999955,80.438583000000051],[-89.115279999999927,80.433868000000018],[-89.176101999999958,80.426651000000049],[-89.198333999999932,80.42164600000001],[-89.20944199999991,80.417754999999943],[-89.235001000000011,80.408035000000041],[-89.25,80.402206000000035],[-89.257232999999985,80.396942000000081],[-89.253615999999965,80.392761000000007],[-89.237212999999997,80.388596000000007],[-89.216948999999943,80.389709000000039],[-89.189712999999927,80.394149999999968],[-89.167496000000028,80.399155000000007],[-89.136123999999995,80.40248100000008],[-89.09973100000002,80.40248100000008],[-89.083327999999881,80.398331000000042],[-89.075835999999924,80.393051000000014],[-89.104995999999915,80.339431999999988],[-89.114165999999955,80.333327999999938],[-89.125274999999931,80.327773999999977],[-89.143616000000009,80.323318000000029],[-89.169158999999979,80.318054000000075],[-89.220275999999899,80.30914300000012],[-89.241942999999935,80.304153000000099],[-89.256667999999991,80.298599000000081],[-89.263900999999976,80.293320000000108],[-89.262221999999952,80.286652000000117],[-89.25140399999998,80.278320000000122],[-89.180496000000005,80.238174000000072],[-89.113892000000021,80.208038000000045],[-89.092223999999987,80.200821000000133],[-89.072784000000013,80.195526000000086],[-88.776672000000019,80.131363000000022],[-88.75,80.126647999999989],[-88.534728999999913,80.09887700000013],[-88.49888599999997,80.09887700000013],[-88.441939999999931,80.100540000000024],[-88.414718999999991,80.104980000000069],[-88.414444000000003,80.10803199999998],[-88.363051999999925,80.124420000000043],[-88.235274999999888,80.102477999999962],[-88.161941999999954,80.09165999999999],[-88.145554000000004,80.093872000000033],[-88.148346000000004,80.098037999999974],[-88.261397999999929,80.18803400000013],[-88.27305599999994,80.195526000000086],[-88.294158999999979,80.201385000000073],[-88.350829999999974,80.208878000000084],[-88.422775000000001,80.210541000000035],[-88.479996000000028,80.213608000000136],[-88.506957999999941,80.218322999999998],[-88.595276000000013,80.236923000000104],[-88.618057000000022,80.24331699999999],[-88.630279999999914,80.249145999999996],[-88.661391999999921,80.272491000000116],[-88.684432999999956,80.358597000000145],[-88.68582200000003,80.365540000000124],[-88.685271999999998,80.371643000000063],[-88.683059999999955,80.376923000000147],[-88.67721599999993,80.382751000000042],[-88.648894999999925,80.393600000000106],[-88.615279999999927,80.40387000000004],[-88.510284000000013,80.428864000000033],[-88.487777999999992,80.433868000000018],[-88.463333000000034,80.438034000000073],[-88.420546999999999,80.442200000000014],[-88.383895999999993,80.443588000000091],[-88.308333999999945,80.442749000000106],[-88.110549999999932,80.4327550000001],[-87.918883999999991,80.421097000000088],[-87.718613000000005,80.411102000000142],[-87.683884000000035,80.410263000000043],[-87.666396999999904,80.40387000000004],[-87.636123999999938,80.36692800000003],[-87.607498000000021,80.324158000000068],[-87.563889000000017,80.233322000000044],[-87.561935000000005,80.183593999999914],[-87.562774999999931,80.179153000000042],[-87.572234999999921,80.176086000000112],[-87.678054999999915,80.156371999999976],[-87.721389999999985,80.153046000000131],[-87.939162999999951,80.143875000000037],[-87.96665999999999,80.139434999999992],[-88.048889000000031,80.125809000000004],[-88.065552000000025,80.120818999999983],[-88.060546999999985,80.117477000000065],[-87.956664999999987,80.069717000000026],[-87.938048999999978,80.06442300000009],[-87.891387999999949,80.055542000000116],[-87.860001000000011,80.053588999999988],[-87.836120999999935,80.0577550000001],[-87.823059000000001,80.062484999999924],[-87.763061999999934,80.071106000000043],[-87.720000999999911,80.074707000000103],[-87.680557000000022,80.076385000000016],[-87.641678000000013,80.076385000000016],[-87.365004999999996,80.072768999999994],[-87.299987999999985,80.069443000000092],[-87.275557999999876,80.066939999999931],[-87.258620999999948,80.063873000000058],[-87.233321999999987,80.057480000000055],[-87.215285999999992,80.050537000000077],[-87.043334999999956,79.964996000000099],[-87.093612999999948,79.929428000000087],[-87.314437999999996,79.866088999999988],[-87.336120999999935,79.861374000000126],[-87.368332000000009,79.857208000000071],[-87.446655000000021,79.856094000000098],[-87.471938999999907,79.852478000000019],[-87.483062999999959,79.847214000000065],[-87.489440999999943,79.84137000000004],[-87.485549999999876,79.834991000000002],[-87.463622999999984,79.831374999999923],[-87.439162999999951,79.831940000000145],[-87.412780999999995,79.833328000000051],[-87.338608000000022,79.840820000000008],[-87.190826000000015,79.866088999999988],[-87.165558000000033,79.871094000000028],[-87.146956999999929,79.875534000000073],[-87.079726999999934,79.896103000000039],[-87.051392000000021,79.906647000000078],[-87.024718999999948,79.916091999999935],[-87.003066999999987,79.917755000000056],[-86.985824999999977,79.917755000000056],[-86.973891999999864,79.916381999999942],[-86.961394999999982,79.909988000000112],[-86.957779000000016,79.903594999999939],[-86.960555999999997,79.891372999999987],[-87.055557000000022,79.731934000000081],[-87.134170999999924,79.645264000000111],[-87.14416499999993,79.637771999999984],[-87.154998999999975,79.6336060000001],[-87.173049999999989,79.629149999999981],[-87.258620999999948,79.610260000000039],[-87.344451999999933,79.596374999999966],[-87.425551999999982,79.579163000000108],[-87.441665999999941,79.573883000000023],[-87.448043999999982,79.568329000000062],[-87.462509000000011,79.534713999999951],[-87.441939999999988,79.526382000000012],[-87.406661999999983,79.515823000000125],[-87.390563999999927,79.511108000000092],[-87.366394000000014,79.506378000000041],[-87.345276000000013,79.503052000000025],[-87.309998000000007,79.50221300000004],[-87.280563000000029,79.506943000000092],[-87.262786999999946,79.51138300000008],[-87.248336999999992,79.516937000000098],[-87.190552000000025,79.543593999999985],[-87.182769999999948,79.548874000000069],[-87.179992999999968,79.554153000000042],[-87.168883999999991,79.566376000000105],[-87.161117999999931,79.571655000000078],[-87.076675000000023,79.587493999999992],[-87.02555799999999,79.595535000000098],[-87.001113999999973,79.598877000000016],[-86.966659999999933,79.60165400000011],[-86.932495000000017,79.60165400000011],[-86.841384999999946,79.59304800000001],[-86.823623999999995,79.587769000000037],[-86.819732999999985,79.576096000000007],[-86.823897999999986,79.566086000000098],[-86.839721999999995,79.555817000000047],[-86.846389999999985,79.549988000000042],[-86.837783999999999,79.543320000000051],[-86.816665999999998,79.539703000000145],[-86.789992999999981,79.538878999999952],[-86.777221999999995,79.542206000000078],[-86.694991999999957,79.567490000000078],[-86.693329000000006,79.573608000000036],[-86.71055599999994,79.587203999999986],[-86.723891999999978,79.594437000000028],[-86.746383999999978,79.599990999999989],[-86.802489999999977,79.606093999999928],[-86.813048999999921,79.61192299999999],[-86.806380999999874,79.617751999999996],[-86.795272999999952,79.621643000000063],[-86.77694699999995,79.627472000000068],[-86.762222000000008,79.631653000000142],[-86.687209999999993,79.645264000000111],[-86.640838999999914,79.653320000000008],[-86.613051999999925,79.655822999999998],[-86.575012000000015,79.657211000000075],[-86.547775000000001,79.65637200000009],[-86.334166999999923,79.645538000000045],[-86.302779999999984,79.642761000000121],[-86.279448999999943,79.640274000000034],[-86.258895999999993,79.63499500000006],[-86.109160999999972,79.595260999999994],[-86.046111999999994,79.568877999999984],[-86.042220999999927,79.565536000000066],[-86.028060999999923,79.474701000000096],[-86.05471799999998,79.470535000000041],[-86.160552999999993,79.463608000000136],[-86.167496000000028,79.457764000000111],[-86.136123999999995,79.444702000000063],[-86.120834000000002,79.439972000000068],[-86.098891999999921,79.435806000000127],[-86.070847000000015,79.434143000000063],[-86.035004000000015,79.436371000000008],[-86.011947999999961,79.440262000000075],[-85.990554999999972,79.444977000000108],[-85.975829999999917,79.449142000000109],[-85.964171999999962,79.454436999999984],[-85.901108000000022,79.493591000000038],[-85.887222000000008,79.505264000000068],[-85.885283999999956,79.51138300000008],[-85.893341000000021,79.523315000000082],[-85.89916999999997,79.536377000000073],[-85.896666999999979,79.549149000000114],[-85.893341000000021,79.554703000000075],[-85.887786999999946,79.56109600000002],[-85.847504000000015,79.596374999999966],[-85.840285999999992,79.601928999999927],[-85.828339000000028,79.607483000000116],[-85.781386999999995,79.615540000000124],[-85.743606999999997,79.61692800000003],[-85.681945999999925,79.613312000000121],[-85.639175000000023,79.604155999999989],[-85.623885999999914,79.599152000000061],[-85.591385000000002,79.585266000000047],[-85.531112999999948,79.559418000000107],[-85.485000999999954,79.518600000000049],[-85.402221999999995,79.473602000000142],[-85.306655999999919,79.428314],[-85.27806099999998,79.415543000000127],[-85.150557999999933,79.38220200000012],[-85.130279999999971,79.378586000000098],[-85.039718999999877,79.350815000000011],[-84.93249499999996,79.300262000000032],[-84.920273000000009,79.293320000000108],[-84.904175000000009,79.276657000000057],[-84.904175000000009,79.267761000000121],[-84.909728999999857,79.263046000000088],[-84.93110699999994,79.258331000000055],[-85.099990999999932,79.239426000000094],[-85.158889999999928,79.231933999999967],[-85.211394999999868,79.223311999999964],[-85.232772999999952,79.218872000000147],[-85.248046999999872,79.213042999999971],[-85.260009999999909,79.207763999999997],[-85.271941999999967,79.19720500000011],[-85.280563000000029,79.192200000000071],[-85.297226000000023,79.187195000000031],[-85.591385000000002,79.15415999999999],[-85.779998999999918,79.131088000000034],[-85.877212999999983,79.121642999999949],[-86.00389100000001,79.111374000000126],[-86.158889999999985,79.103316999999947],[-86.271392999999989,79.095534999999984],[-86.341674999999952,79.088318000000072],[-86.422501000000011,79.075546000000088],[-86.485549999999989,79.063309000000118],[-86.550827000000027,79.048874000000012],[-86.55999799999995,79.044434000000138],[-86.555557000000022,79.042480000000126],[-86.550827000000027,79.035538000000031],[-86.552490000000034,79.029434000000037],[-86.55999799999995,79.012206999999989],[-86.587783999999942,78.983597000000145],[-86.598891999999921,78.978317000000061],[-86.614440999999943,78.973312000000021],[-86.676940999999886,78.959717000000126],[-86.702224999999942,78.955261000000064],[-86.741378999999938,78.951934999999992],[-86.765015000000005,78.953598000000113],[-86.785004000000015,78.957213999999965],[-86.808334000000002,78.967209000000082],[-86.903335999999854,79.009430000000066],[-86.916396999999961,79.016663000000108],[-86.926391999999964,79.035812000000135],[-86.930556999999965,79.047760000000039],[-86.940551999999968,79.053589000000045],[-86.949158000000011,79.057205000000067],[-86.965285999999935,79.057480000000112],[-86.98332199999993,79.056641000000127],[-86.989989999999977,79.047760000000039],[-87.004456000000005,78.987198000000035],[-87.002501999999993,78.981369000000029],[-86.986937999999952,78.949707000000046],[-86.979995999999971,78.9433140000001],[-86.966948999999943,78.936371000000122],[-86.950835999999981,78.929428000000087],[-86.942764000000011,78.922485000000108],[-86.937774999999988,78.91693099999992],[-86.952498999999932,78.906647000000078],[-86.97084000000001,78.896103000000039],[-86.997498000000007,78.882477000000051],[-87.021666999999923,78.873032000000023],[-87.052490000000034,78.862762000000089],[-87.179442999999935,78.830551000000014],[-87.282775999999956,78.810257000000036],[-87.328063999999983,78.794708000000128],[-87.353881999999999,78.78414900000007],[-87.529998999999918,78.6869200000001],[-87.532776000000013,78.669983000000116],[-87.543059999999969,78.664703000000031],[-87.572783999999956,78.654433999999981],[-87.591949,78.649718999999948],[-87.615829000000019,78.645264000000111],[-87.663054999999986,78.642487000000017],[-87.684432999999956,78.644989000000123],[-87.872771999999941,78.694977000000051],[-87.937774999999874,78.738312000000064],[-87.953612999999962,78.74971000000005],[-87.959166999999979,78.755264000000068],[-87.993880999999931,78.79525799999999],[-88.003341999999918,78.807205000000124],[-88.00140399999998,78.824158000000011],[-87.985275000000001,78.957213999999965],[-87.981673999999884,78.960541000000092],[-87.968338000000017,78.966385000000116],[-87.894164999999987,78.979706000000078],[-87.833617999999944,78.992203000000075],[-87.81361400000003,78.99693300000007],[-87.794448999999986,79.006943000000035],[-87.728881999999942,79.069442999999978],[-87.724715999999944,79.075821000000076],[-87.733886999999982,79.081100000000049],[-87.746108999999933,79.086104999999918],[-87.752791999999999,79.085540999999978],[-87.772780999999952,79.080825999999945],[-87.806380999999931,79.06999200000007],[-87.849166999999966,79.054977000000122],[-87.872771999999941,79.045258000000103],[-87.883330999999998,79.039978000000076],[-87.894454999999994,79.028320000000008],[-87.890288999999996,79.021652000000074],[-87.899993999999992,79.011108000000036],[-87.929442999999992,79.006943000000035],[-88.000564999999995,79.00360100000006],[-88.032776000000013,79.003876000000105],[-88.061385999999914,79.005829000000006],[-88.093886999999938,79.004440000000045],[-88.162506000000008,78.990540000000124],[-88.202498999999932,78.976379000000122],[-88.21305799999999,78.966095000000109],[-88.215285999999935,78.960815000000025],[-88.216659999999933,78.948318000000029],[-88.229720999999984,78.802200000000084],[-88.224716000000001,78.78915399999994],[-88.22222899999997,78.783324999999934],[-88.218063000000029,78.776931999999988],[-88.201110999999969,78.757216999999969],[-88.132216999999969,78.68081699999999],[-88.044158999999922,78.658600000000092],[-88.02416999999997,78.656647000000135],[-88.010833999999932,78.652771000000087],[-87.993056999999965,78.645264000000111],[-87.982772999999952,78.639435000000105],[-87.908614999999998,78.596939000000077],[-87.894729999999981,78.584717000000126],[-87.890839000000028,78.578323000000069],[-87.896956999999873,78.566375999999934],[-87.908339999999953,78.548599000000081],[-87.984725999999966,78.492202999999961],[-88.011948000000018,78.481369000000086],[-88.055832000000009,78.472762999999986],[-88.205276000000026,78.452484000000084],[-88.234160999999972,78.453598000000056],[-88.249160999999958,78.456649999999968],[-88.389450000000011,78.521378000000027],[-88.559432999999899,78.604156000000046],[-88.574721999999952,78.607208000000128],[-88.723052999999993,78.615814000000057],[-88.788605000000018,78.612761999999975],[-88.804168999999945,78.609711000000118],[-88.746108999999933,78.535812000000078],[-88.725006000000008,78.524155000000121],[-88.659164000000033,78.491088999999988],[-88.595276000000013,78.459991000000002],[-88.5625,78.44470200000012],[-88.552215999999987,78.437484999999981],[-88.543883999999991,78.426086000000112],[-88.535552999999993,78.413040000000137],[-88.536117999999931,78.406937000000028],[-88.538054999999986,78.401382000000126],[-88.541381999999999,78.396652000000074],[-88.553054999999915,78.385544000000095],[-88.561110999999983,78.379425000000083],[-88.570556999999951,78.373871000000065],[-88.614715999999987,78.348327999999981],[-88.663329999999974,78.321381000000031],[-88.672501000000011,78.316085999999984],[-88.704177999999956,78.271103000000096],[-88.710555999999997,78.261107999999979],[-88.713897999999858,78.254715000000033],[-88.71556099999998,78.249146000000053],[-88.716110000000015,78.243042000000003],[-88.721114999999941,78.231093999999985],[-88.726105000000018,78.225266000000033],[-88.75140399999998,78.196930000000123],[-88.776672000000019,78.176085999999941],[-88.78443900000002,78.169983000000002],[-88.793334999999956,78.164429000000041],[-88.817779999999914,78.154434000000094],[-88.847777999999948,78.151382000000012],[-88.978881999999942,78.165817000000118],[-89.002791999999943,78.169434000000081],[-89.065001999999879,78.184418000000107],[-89.079726999999991,78.189147999999989],[-89.115828999999962,78.200821000000019],[-89.227492999999981,78.245254999999986],[-89.259170999999924,78.262771999999984],[-89.265014999999948,78.268326000000002],[-89.275283999999999,78.281936999999971],[-89.353881999999885,78.339705999999978],[-89.364440999999999,78.344147000000078],[-89.381103999999993,78.3477630000001],[-89.518341000000021,78.392212000000086],[-89.676665999999955,78.447478999999987],[-89.803878999999995,78.494431000000134],[-89.819457999999997,78.500549000000092],[-89.891113000000018,78.552764999999965],[-89.921660999999972,78.578048999999965],[-89.945830999999998,78.599425999999994],[-89.95695499999988,78.605255],[-89.980559999999969,78.609711000000118],[-90.014724999999885,78.609421000000111],[-90.051391999999964,78.605820000000051],[-90.088332999999977,78.595825000000104],[-90.092498999999975,78.589980999999909],[-90.09973100000002,78.555252000000053],[-90.100829999999974,78.549713000000054],[-90.064712999999927,78.513321000000076],[-89.985000999999954,78.43609600000002],[-89.960555999999997,78.432480000000112],[-89.936110999999983,78.430267000000015],[-89.910004000000015,78.426086000000112],[-89.869995000000017,78.417755],[-89.80972300000002,78.404709000000082],[-89.785278000000005,78.398041000000092],[-89.774445000000014,78.39387499999998],[-89.748046999999929,78.380264000000011],[-89.615554999999858,78.300262000000032],[-89.606109999999944,78.293319999999994],[-89.461670000000026,78.17553700000002],[-89.455841000000021,78.169983000000002],[-89.452498999999989,78.162491000000045],[-89.461670000000026,78.158599999999979],[-89.476668999999958,78.153869999999984],[-89.507781999999963,78.149994000000106],[-89.530288999999982,78.148330999999985],[-89.549437999999952,78.148605000000089],[-89.563048999999921,78.149719000000061],[-89.59584000000001,78.156937000000084],[-89.61860699999994,78.163040000000024],[-89.631942999999978,78.168594000000041],[-89.639724999999942,78.173309000000074],[-89.644164999999987,78.179703000000075],[-89.646118000000001,78.184707999999944],[-89.646118000000001,78.19720500000011],[-89.64805599999994,78.202209000000096],[-89.654174999999952,78.209427000000119],[-89.657226999999978,78.212203999999986],[-89.673888999999974,78.217209000000082],[-89.700835999999981,78.219147000000021],[-89.748885999999914,78.217209000000082],[-89.783324999999934,78.214431999999988],[-89.847778000000005,78.213042999999971],[-89.886948000000018,78.215271000000087],[-89.911117999999988,78.218872000000147],[-89.929169000000002,78.223038000000088],[-89.955276000000026,78.233322000000101],[-89.960281000000009,78.238311999999951],[-89.961945000000014,78.243590999999924],[-89.959441999999967,78.254439999999988],[-89.955001999999922,78.260544000000039],[-89.980285999999921,78.27777100000003],[-90.023330999999985,78.298035000000027],[-90.060271999999998,78.308029000000033],[-90.172500999999954,78.331100000000049],[-90.186110999999926,78.333327999999995],[-90.213622999999984,78.335265999999933],[-90.242492999999854,78.336105000000089],[-90.27416999999997,78.334991000000116],[-90.34056099999998,78.331100000000049],[-90.411391999999921,78.324432000000058],[-90.478881999999999,78.321106000000043],[-90.507781999999963,78.320540999999992],[-90.59445199999999,78.322768999999937],[-90.620269999999948,78.325546000000031],[-90.667770000000019,78.32748399999997],[-90.729445999999996,78.326096000000064],[-90.744445999999982,78.323043999999982],[-90.748610999999983,78.320267000000058],[-90.73721299999994,78.314423000000033],[-90.715560999999923,78.309143000000006],[-90.622771999999941,78.291091999999992],[-90.598343,78.287490999999932],[-90.544998000000021,78.283051000000114],[-90.46166999999997,78.27887000000004],[-90.410277999999948,78.276657000000057],[-90.363327000000027,78.256942999999978],[-90.273894999999982,78.192200000000071],[-90.267501999999922,78.18664600000011],[-90.268889999999999,78.182755000000043],[-90.272781000000009,78.17692599999998],[-90.293883999999991,78.159988000000112],[-90.301102000000014,78.15525800000006],[-90.330291999999986,78.146103000000039],[-90.353881999999942,78.143326000000116],[-90.433884000000035,78.136383000000137],[-90.465012000000002,78.135268999999937],[-90.497771999999941,78.134995000000004],[-90.624434999999949,78.134430000000009],[-90.711120999999991,78.135818000000086],[-90.967223999999987,78.142761000000064],[-91.021392999999989,78.146103000000039],[-91.039718999999991,78.150269000000094],[-91.238387999999986,78.166594999999973],[-91.326674999999966,78.168594000000041],[-91.489715999999873,78.17692599999998],[-91.539992999999924,78.181366000000025],[-91.613891999999964,78.191925000000083],[-91.661941999999897,78.199707000000046],[-91.707229999999981,78.209427000000119],[-91.724715999999944,78.214706000000092],[-91.807770000000005,78.23275799999999],[-91.831389999999999,78.23692299999999],[-91.857497999999964,78.239700000000084],[-91.887511999999901,78.239425999999924],[-91.920273000000009,78.237198000000149],[-91.946380999999974,78.23275799999999],[-91.963332999999977,78.227768000000083],[-91.974441999999954,78.223312000000021],[-91.986114999999984,78.214706000000092],[-92.003066999999987,78.209717000000126],[-92.031113000000005,78.207488999999953],[-92.058334000000002,78.208878000000141],[-92.083327999999995,78.212494000000049],[-92.105559999999969,78.217758000000003],[-92.308333999999945,78.278594999999996],[-92.537216000000001,78.310531999999967],[-92.556655999999975,78.314696999999967],[-92.589447000000007,78.323608000000092],[-92.949431999999888,78.43193100000002],[-92.96665999999999,78.44358799999992],[-92.982498000000021,78.454436999999984],[-92.98721299999994,78.46026599999999],[-92.987502999999947,78.465546000000074],[-92.978881999999942,78.483322000000044],[-92.96665999999999,78.488586000000055],[-92.863891999999964,78.505264000000125],[-92.848617999999988,78.505554000000132],[-92.690551999999968,78.49581900000004],[-92.646392999999932,78.487487999999928],[-92.621933000000013,78.487198000000092],[-92.600554999999986,78.488037000000077],[-92.576675000000023,78.490540000000067],[-92.520279000000016,78.498596000000134],[-92.493606999999997,78.503325999999959],[-92.48721299999994,78.507767000000058],[-92.487777999999992,78.509430000000009],[-92.497771999999998,78.513046000000031],[-92.563323999999966,78.520537999999988],[-92.529448999999943,78.521378000000027],[-92.24722300000002,78.52777100000003],[-92.216659999999933,78.528046000000018],[-92.070847000000015,78.525543000000027],[-92.011123999999938,78.526657],[-91.949996999999939,78.530273000000079],[-91.918610000000001,78.534424000000001],[-91.726395000000025,78.530548000000067],[-91.682495000000017,78.52609300000006],[-91.660827999999981,78.526932000000045],[-91.646117999999944,78.529984000000127],[-91.636123999999938,78.533600000000035],[-91.632492000000013,78.539429000000041],[-91.635284000000013,78.546097000000032],[-91.647506999999962,78.560257000000092],[-91.657500999999968,78.563873000000001],[-91.670272999999952,78.56581100000011],[-91.945267000000001,78.572220000000129],[-92.151397999999915,78.579437000000041],[-92.351943999999946,78.586928999999998],[-92.557220000000029,78.594711000000132],[-92.58555599999994,78.596099999999979],[-92.604720999999984,78.598602000000028],[-92.697768999999994,78.614151000000106],[-92.733063000000016,78.62359600000002],[-92.757781999999963,78.628036000000009],[-92.806106999999997,78.6336060000001],[-92.828888000000006,78.631927000000076],[-92.907227000000034,78.62303200000008],[-92.935546999999985,78.618866000000139],[-92.935821999999973,78.614990000000091],[-92.941665999999998,78.608597000000145],[-92.955841000000021,78.603867000000093],[-92.991668999999945,78.599716000000001],[-93.176940999999999,78.586380000000077],[-93.210555999999997,78.584152000000074],[-93.242492999999968,78.582763999999997],[-93.271118000000001,78.584152000000074],[-93.28443900000002,78.587494000000049],[-93.434157999999968,78.6336060000001],[-93.771392999999989,78.750549000000035],[-93.813613999999973,78.765823000000069],[-93.802779999999927,78.770263999999997],[-93.684158000000025,78.782486000000006],[-93.650283999999999,78.784714000000122],[-93.589721999999995,78.783599999999979],[-93.534438999999963,78.778870000000097],[-93.429169000000002,78.767212000000086],[-93.376388999999961,78.760544000000095],[-93.351394999999968,78.756104000000107],[-93.299728000000016,78.748596000000077],[-93.24722300000002,78.741928000000087],[-93.190551999999968,78.736374000000126],[-93.163329999999974,78.735535000000141],[-93.09973100000002,78.737198000000092],[-93.054992999999968,78.739974999999959],[-93.04222099999987,78.745255000000043],[-93.039963,78.750000000000057],[-93.039443999999946,78.751099000000067],[-93.035277999999948,78.761932000000002],[-93.037780999999939,78.765823000000069],[-93.118880999999988,78.772491000000059],[-93.170273000000009,78.77998400000007],[-93.271941999999967,78.796097000000145],[-93.346389999999928,78.809982000000048],[-93.369155999999975,78.816086000000041],[-93.391388000000006,78.820831000000112],[-93.416397000000018,78.824996999999996],[-93.560546999999929,78.833328000000108],[-93.589721999999995,78.834717000000069],[-93.650283999999999,78.835541000000035],[-93.746947999999975,78.834991000000002],[-93.779723999999987,78.833603000000096],[-93.842772999999966,78.832489000000123],[-93.874709999999936,78.833603000000096],[-93.892501999999979,78.838042999999914],[-93.902221999999995,78.842484000000013],[-93.906386999999995,78.849152000000004],[-93.917495999999971,78.860535000000027],[-93.939437999999939,78.871643000000006],[-93.959441999999967,78.878310999999997],[-94.052490000000034,78.902481000000023],[-94.09584000000001,78.911102000000085],[-94.253066999999987,78.956940000000031],[-94.269729999999981,78.962204000000042],[-94.282227000000034,78.968872000000033],[-94.287506000000008,78.981093999999985],[-94.288605000000018,78.986374000000069],[-94.241378999999881,78.996643000000063],[-94.005279999999914,79.029709000000025],[-93.910277999999948,79.041930999999977],[-93.878051999999968,79.042480000000126],[-93.854720999999927,79.040543000000071],[-93.813889000000017,79.035538000000031],[-93.784164000000033,79.038040000000137],[-93.601943999999889,79.068328999999949],[-93.472778000000005,79.108871000000136],[-93.455565999999976,79.11970500000001],[-93.452498999999989,79.125534000000016],[-93.456664999999987,79.132202000000007],[-93.463333000000034,79.136932000000058],[-93.46055599999994,79.142761000000064],[-93.443054000000018,79.148041000000092],[-93.36610399999995,79.161377000000073],[-93.329726999999934,79.164428999999984],[-93.294997999999907,79.166931000000091],[-93.259170999999924,79.167480000000012],[-93.227782999999931,79.166931000000091],[-93.003066999999987,79.154434000000094],[-92.895553999999947,79.143875000000037],[-92.869720000000029,79.139708999999925],[-92.841109999999958,79.141098000000113],[-92.816101000000003,79.145537999999988],[-92.801392000000021,79.150269000000094],[-92.7933349999999,79.155823000000055],[-92.780288999999868,79.161102000000028],[-92.746947999999975,79.164153999999996],[-92.506957999999941,79.158324999999991],[-92.478606999999954,79.155823000000055],[-92.407500999999911,79.146102999999982],[-92.309433000000013,79.145264000000054],[-92.243057000000022,79.146941999999967],[-91.89805599999994,79.161377000000073],[-91.691939999999988,79.173309000000017],[-91.439162999999951,79.183593999999971],[-91.205275999999969,79.191925000000026],[-91.009170999999867,79.203048999999965],[-90.811934999999949,79.208038000000101],[-90.601669000000015,79.214157000000114],[-90.564162999999951,79.215546000000131],[-90.528335999999911,79.21748400000007],[-90.492767000000015,79.220825000000104],[-90.390839000000028,79.236374000000012],[-90.368331999999953,79.243042000000003],[-90.36326600000001,79.246811000000093],[-90.382216999999969,79.2494200000001],[-90.405563000000029,79.251938000000109],[-90.472778000000005,79.250823999999909],[-90.502227999999945,79.2494200000001],[-90.732223999999974,79.238312000000121],[-90.885833999999988,79.244141000000127],[-91.139998999999932,79.244431000000134],[-91.198883000000023,79.241364000000033],[-91.47084000000001,79.228867000000037],[-91.861114999999927,79.215271000000087],[-92.026397999999972,79.207489000000123],[-92.053604000000007,79.205261000000007],[-92.087783999999999,79.204163000000108],[-92.180832000000009,79.203048999999965],[-92.213897999999972,79.204163000000108],[-92.238892000000021,79.205551000000014],[-92.510284000000013,79.232757999999933],[-92.621933000000013,79.244431000000134],[-92.676666000000012,79.251389000000131],[-92.694716999999969,79.257217000000082],[-92.693053999999961,79.262207000000103],[-92.625548999999978,79.295258000000047],[-92.603881999999942,79.300812000000064],[-92.571944999999971,79.304153000000099],[-92.523330999999928,79.307755000000043],[-92.454453000000001,79.308594000000028],[-92.394729999999981,79.308594000000028],[-92.303329000000019,79.306366000000082],[-92.255004999999983,79.304428000000144],[-92.131377999999984,79.299988000000099],[-91.994995000000017,79.295258000000047],[-91.961944999999957,79.29553199999998],[-91.932494999999903,79.297211000000004],[-91.894164999999987,79.301085999999998],[-91.865279999999927,79.305542000000116],[-91.829452999999944,79.314697000000137],[-91.795546999999885,79.319153000000085],[-91.727492999999924,79.326096000000064],[-91.658889999999985,79.329987000000131],[-91.589721999999938,79.332214000000022],[-91.528884999999946,79.333054000000061],[-91.493880999999874,79.33248900000001],[-91.467498999999975,79.333602999999982],[-91.267776000000026,79.345824999999991],[-91.231673999999941,79.348037999999917],[-91.15834000000001,79.356093999999985],[-91.119995000000017,79.386383000000023],[-91.129165999999884,79.390823000000069],[-91.156386999999995,79.394440000000031],[-91.191100999999946,79.393326000000059],[-91.230559999999969,79.389434999999992],[-91.422225999999966,79.374146000000053],[-91.508621000000005,79.373306000000014],[-91.580841000000021,79.369141000000013],[-91.702224999999942,79.361374000000069],[-91.729720999999984,79.359421000000111],[-91.766662999999994,79.353317000000118],[-91.788329999999974,79.346375000000023],[-91.835281000000009,79.340820000000122],[-91.864715999999987,79.339431999999988],[-91.897781000000009,79.339157],[-92.150832999999977,79.344437000000084],[-92.18110699999994,79.345824999999991],[-92.210006999999962,79.348327999999924],[-92.290833000000021,79.358031999999923],[-92.351943999999946,79.362761999999975],[-92.41194200000001,79.36442599999998],[-92.510009999999966,79.364150999999993],[-92.561934999999949,79.365814000000057],[-92.571670999999867,79.37052900000009],[-92.577498999999989,79.379150000000038],[-92.567504999999869,79.384155000000078],[-92.479996000000028,79.404434000000037],[-92.462509000000011,79.406937000000028],[-92.41194200000001,79.411652000000061],[-92.31361400000003,79.418593999999928],[-92.243880999999988,79.426651000000106],[-92.228607000000011,79.431366000000139],[-92.227782999999931,79.435257000000036],[-92.228881999999999,79.438309000000118],[-92.234726000000023,79.441649999999981],[-92.241942999999935,79.444138000000123],[-92.259170999999981,79.446930000000066],[-92.283324999999991,79.449142000000109],[-92.33805799999999,79.453049000000078],[-92.419723999999974,79.457214000000079],[-92.580841000000021,79.452209000000039],[-92.605270000000019,79.450546000000088],[-92.634170999999981,79.445816000000036],[-92.679992999999968,79.437194999999974],[-92.774170000000026,79.417755],[-92.803054999999972,79.413040000000137],[-92.854445999999996,79.407760999999994],[-92.876098999999954,79.407760999999994],[-92.901671999999962,79.408874999999966],[-92.929442999999935,79.412490999999989],[-92.950835999999981,79.416382000000056],[-92.973327999999981,79.423598999999967],[-93.029175000000009,79.46026599999999],[-93.032775999999956,79.465546000000074],[-93.034728999999913,79.471649000000014],[-93.044723999999917,79.476089000000002],[-93.063048999999921,79.48054500000012],[-93.09056099999998,79.482208000000071],[-93.107223999999974,79.482208000000071],[-93.126662999999951,79.479980000000069],[-93.143889999999885,79.475815000000068],[-93.146666999999979,79.469986000000063],[-93.144454999999994,79.463882000000069],[-93.125,79.450821000000133],[-93.105834999999956,79.43942300000009],[-93.081389999999942,79.426376000000062],[-93.061110999999983,79.415817000000061],[-93.033614999999941,79.404434000000037],[-93.018889999999999,79.399719000000005],[-93.009170999999981,79.395263999999997],[-93.006957999999941,79.389160000000118],[-93.008347000000015,79.388046000000145],[-93.009445000000028,79.387206999999989],[-93.021392999999989,79.382751000000098],[-93.125,79.359711000000118],[-93.264175000000023,79.353592000000106],[-93.312499999999943,79.372757000000092],[-93.251113999999973,79.40498400000007],[-93.236114999999984,79.415268000000083],[-93.229720999999984,79.425537000000134],[-93.231383999999991,79.429977000000122],[-93.235001000000011,79.435257000000036],[-93.252501999999993,79.441924999999969],[-93.275833000000034,79.446640000000002],[-93.293334999999956,79.44802900000002],[-93.320007000000032,79.448317999999972],[-93.338057999999933,79.447205000000054],[-93.354445999999996,79.441360000000145],[-93.424437999999896,79.405258000000003],[-93.433059999999898,79.387496999999996],[-93.485275000000001,79.354156000000046],[-93.641387999999893,79.31164600000011],[-93.757507000000032,79.283600000000035],[-93.801940999999886,79.274704000000099],[-93.869995000000017,79.263885000000073],[-93.906661999999983,79.260544000000039],[-93.969726999999978,79.25749200000007],[-93.99722300000002,79.256942999999978],[-94.047225999999966,79.25749200000007],[-94.206954999999994,79.272490999999945],[-94.212219000000005,79.276657000000057],[-94.162780999999995,79.322220000000016],[-94.14805599999994,79.333602999999982],[-94.119720000000029,79.344711000000018],[-94.088608000000022,79.353592000000106],[-94.056380999999931,79.379700000000071],[-94.245834000000002,79.404160000000104],[-94.366652999999985,79.419708000000128],[-94.386123999999938,79.421371000000022],[-94.494720000000029,79.421371000000022],[-94.509170999999981,79.416382000000056],[-94.5,79.379700000000071],[-94.483063000000016,79.375809000000004],[-94.46305799999999,79.379150000000038],[-94.454453000000001,79.385544000000095],[-94.432769999999948,79.385544000000095],[-94.398055999999997,79.375259000000142],[-94.389998999999989,79.368866000000025],[-94.506667999999991,79.337204000000042],[-94.538054999999929,79.333602999999982],[-94.573623999999938,79.331100000000049],[-94.638900999999976,79.33248900000001],[-94.669997999999964,79.331375000000037],[-94.697495000000004,79.326660000000004],[-94.720001000000025,79.321655000000135],[-94.765015000000005,79.31164600000011],[-94.952498999999932,79.289978000000019],[-94.970000999999968,79.284714000000008],[-94.972777999999892,79.273880000000133],[-94.977218999999991,79.270264000000111],[-94.985824999999977,79.267487000000017],[-95.018616000000009,79.266936999999984],[-95.087555000000009,79.27075200000013],[-95.161666999999966,79.281097000000045],[-95.304992999999968,79.325821000000019],[-95.318619000000012,79.332214000000022],[-95.32028200000002,79.335266000000104],[-95.294448999999986,79.336655000000121],[-95.285004000000015,79.353042999999957],[-95.295837000000006,79.379425000000026],[-95.394164999999987,79.387496999999996],[-95.477218999999991,79.380814000000044],[-95.655563000000029,79.391663000000108],[-95.753341999999975,79.404434000000037],[-95.771666999999979,79.409714000000065],[-95.778609999999958,79.413040000000137],[-95.779449,79.425812000000121],[-95.736388999999974,79.537491000000045],[-95.657500999999968,79.553314000000114],[-95.636123999999938,79.557479999999998],[-95.565552000000025,79.55914300000012],[-95.309722999999963,79.569153000000028],[-95.170273000000009,79.575272000000041],[-95.051665999999955,79.582214000000135],[-94.839995999999871,79.597214000000122],[-94.802489999999977,79.600540000000137],[-94.699432000000002,79.612198000000149],[-94.40695199999999,79.667755000000113],[-94.360275000000001,79.677765000000022],[-94.329453000000001,79.688309000000061],[-94.282776000000013,79.757492000000013],[-94.28694200000001,79.762772000000041],[-94.298339999999996,79.76887499999998],[-94.318344000000025,79.778595000000053],[-94.335281000000009,79.780823000000055],[-94.361664000000019,79.781937000000028],[-94.384170999999981,79.778046000000131],[-94.577498999999932,79.735809000000074],[-94.592498999999975,79.731094000000041],[-94.596663999999976,79.725815000000011],[-94.601395000000025,79.713882000000012],[-94.608886999999925,79.708327999999995],[-94.748336999999935,79.678314],[-94.776671999999962,79.673598999999967],[-94.814437999999939,79.670258000000103],[-94.878325999999959,79.66804500000012],[-94.946380999999974,79.666930999999977],[-94.985001000000011,79.664993000000038],[-95.091675000000009,79.656936999999971],[-95.153610000000015,79.647491000000002],[-95.190825999999959,79.644149999999968],[-95.355559999999969,79.638321000000133],[-95.419998000000021,79.637496999999996],[-95.485274999999945,79.638046000000088],[-95.740828999999906,79.641373000000044],[-95.799437999999952,79.642487000000017],[-95.853332999999964,79.646103000000096],[-95.901107999999965,79.654433999999981],[-95.933060000000012,79.664429000000098],[-95.954726999999991,79.671920999999998],[-95.980835000000013,79.6827550000001],[-96.032227000000034,79.706940000000088],[-96.282501000000025,79.798874000000012],[-96.335555999999997,79.815536000000009],[-96.360824999999977,79.82249500000006],[-96.384170999999924,79.826385000000073],[-96.490554999999972,79.836104999999975],[-96.575561999999934,79.849990999999932],[-96.589447000000007,79.852478000000019],[-96.610549999999989,79.877762000000018],[-96.61500499999994,79.883881000000031],[-96.609436000000017,79.888596000000064],[-96.573623999999995,79.900269000000094],[-96.458618000000001,79.914429000000041],[-96.422775000000001,79.916091999999935],[-96.391387999999949,79.913879000000009],[-96.385009999999909,79.909714000000008],[-96.37777699999998,79.899155000000121],[-96.194716999999912,79.901382000000012],[-96.158889999999872,79.903046000000018],[-96.138061999999991,79.906372000000033],[-96.147780999999952,79.912491000000102],[-96.164718999999991,79.917205999999908],[-96.23332199999993,79.933043999999938],[-96.262512000000015,79.936920000000043],[-96.325561999999991,79.941360000000032],[-96.399170000000026,79.941086000000098],[-96.492766999999958,79.943314000000044],[-96.52416999999997,79.945251000000098],[-96.556655999999975,79.948868000000061],[-96.580565999999976,79.952773999999977],[-96.595839999999953,79.956940000000031],[-96.606658999999922,79.962204000000042],[-96.675003000000004,80.008331000000055],[-96.679442999999992,80.014435000000105],[-96.661941999999954,80.019989000000123],[-96.628052000000025,80.024429000000112],[-96.482772999999952,80.041091999999992],[-96.419158999999922,80.041930999999977],[-96.394164999999873,80.043869000000086],[-96.391677999999956,80.045822000000044],[-96.40583799999996,80.048325000000034],[-96.428878999999995,80.050537000000077],[-96.479172000000005,80.053864000000033],[-96.512222000000008,80.054977000000122],[-96.548614999999927,80.053314],[-96.582503999999915,80.048598999999967],[-96.599166999999909,80.044434000000138],[-96.627776999999924,80.039429000000098],[-96.676101999999958,80.041930999999977],[-96.698882999999967,80.046936000000017],[-96.737503000000004,80.058029000000033],[-96.781676999999945,80.076660000000061],[-96.801391999999964,80.086929000000055],[-96.802779999999984,80.090820000000122],[-96.748885999999857,80.134720000000129],[-96.734436000000017,80.139709000000096],[-96.711120999999935,80.14498900000001],[-96.675827000000027,80.145538000000101],[-96.410003999999958,80.13888500000013],[-96.381103999999937,80.13638300000008],[-96.351395000000025,80.132476999999994],[-96.322784000000013,80.127472000000125],[-96.163054999999872,80.093048000000067],[-96.077788999999996,80.078049000000021],[-96.017776000000026,80.070830999999998],[-95.847777999999892,80.053314],[-95.545836999999949,80.040543000000071],[-95.418883999999935,80.036652000000004],[-95.325011999999958,80.03387500000008],[-95.193877999999984,80.03137200000009],[-95.06361400000003,80.029984000000013],[-95.038054999999986,80.031936999999971],[-95.011672999999917,80.038879000000065],[-94.988892000000021,80.04304500000012],[-94.951110999999855,80.045532000000037],[-94.921386999999925,80.046371000000022],[-94.887512000000015,80.045822000000044],[-94.852782999999874,80.044144000000131],[-94.825835999999924,80.040543000000071],[-94.717772999999966,80.020828000000051],[-94.607498000000021,80.002777000000094],[-94.569457999999941,79.997208000000114],[-94.416945999999996,79.978867000000093],[-94.383620999999948,79.982482999999945],[-94.387786999999946,79.987761999999918],[-94.413894999999911,79.997757000000036],[-94.451674999999966,80.009720000000073],[-94.525557999999933,80.02276599999999],[-94.62110899999999,80.04304500000012],[-94.67111199999988,80.056931000000134],[-94.74888599999997,80.07998699999996],[-94.728881999999942,80.105545000000063],[-94.632766999999944,80.131088000000034],[-94.611937999999952,80.135544000000095],[-94.510558999999944,80.154434000000037],[-94.480559999999855,80.15914900000007],[-94.416396999999961,80.163605000000018],[-94.387222000000008,80.163315000000011],[-94.285827999999924,80.164993000000095],[-94.121108999999933,80.17025799999999],[-94.091675000000009,80.172485000000052],[-94.083892999999989,80.175537000000134],[-94.096389999999985,80.179153000000042],[-94.119995000000017,80.183044000000109],[-94.184433000000013,80.186646000000053],[-94.217772999999966,80.18803400000013],[-94.354171999999949,80.190811000000053],[-94.485000999999954,80.209991000000002],[-94.642226999999991,80.199996999999996],[-94.649993999999879,80.194427000000076],[-94.704453000000001,80.178040000000124],[-94.748336999999935,80.169434000000024],[-94.816956000000005,80.159714000000122],[-95.033324999999991,80.134995000000004],[-95.104996000000028,80.128860000000032],[-95.263625999999988,80.118317000000104],[-95.333618000000001,80.118042000000059],[-95.367767000000015,80.118317000000104],[-95.420273000000009,80.122482000000105],[-95.658889999999985,80.168593999999985],[-95.683884000000035,80.173874000000012],[-95.695830999999998,80.178314000000057],[-95.692215000000033,80.181090999999981],[-95.673889000000031,80.186371000000008],[-95.621658000000025,80.195251000000042],[-95.580841000000021,80.199706999999989],[-95.542770000000019,80.202209000000039],[-95.471114999999941,80.203598000000056],[-95.404175000000009,80.203598000000056],[-95.370543999999995,80.204712000000029],[-95.327788999999882,80.208603000000096],[-95.295837000000006,80.21276899999998],[-95.268341000000021,80.218047999999953],[-95.254455999999948,80.222214000000065],[-95.235000999999897,80.232208000000071],[-95.229996000000028,80.236098999999967],[-95.235000999999897,80.241088999999988],[-95.243331999999953,80.243591000000094],[-95.258895999999993,80.244980000000055],[-95.278060999999923,80.243866000000082],[-95.287216000000001,80.241088999999988],[-95.325561999999991,80.232208000000071],[-95.39834599999989,80.223602000000142],[-95.461394999999868,80.219986000000119],[-95.496947999999975,80.219436999999971],[-95.548339999999996,80.220261000000107],[-95.566955999999948,80.224152000000004],[-95.577498999999989,80.229430999999977],[-95.581389999999885,80.235535000000027],[-95.586394999999925,80.240540000000067],[-95.601944000000003,80.242203000000018],[-95.645844000000011,80.239700000000028],[-95.69027699999998,80.232483000000116],[-95.71055599999994,80.227768000000083],[-95.884170999999981,80.199142000000109],[-95.922500999999954,80.194138000000009],[-95.93360899999999,80.194427000000076],[-95.98443599999996,80.200271999999984],[-96.216659999999877,80.235809000000131],[-96.43499799999995,80.269714000000022],[-96.46444699999995,80.313034000000016],[-96.613892000000021,80.329987000000131],[-96.645844000000011,80.333054000000004],[-96.670272999999952,80.336928999999998],[-96.681670999999881,80.342209000000082],[-96.676101999999958,80.346939000000134],[-96.658051,80.352203000000088],[-96.634170999999981,80.357208000000128],[-96.604720999999984,80.362198000000035],[-96.592223999999987,80.362761999999975],[-96.440552000000025,80.356644000000017],[-96.408889999999985,80.353592000000106],[-96.363892000000021,80.342209000000082],[-96.254729999999938,80.335541000000092],[-96.232223999999974,80.334717000000126],[-96.216400000000021,80.338042999999971],[-96.221664000000033,80.343323000000055],[-96.255004999999983,80.354156000000046],[-96.277221999999938,80.359985000000052],[-96.280838000000017,80.36192299999999],[-96.268065999999919,80.367477000000008],[-96.240554999999972,80.37303200000008],[-96.080841000000021,80.387206999999989],[-96.047774999999888,80.389984000000084],[-95.978606999999954,80.388596000000007],[-95.732497999999907,80.372757000000036],[-95.697495000000004,80.369979999999941],[-95.636948000000018,80.364150999999936],[-95.61221299999994,80.360260000000039],[-95.566955999999948,80.352203000000088],[-95.542770000000019,80.345824999999934],[-95.513900999999976,80.340820000000065],[-95.48832699999997,80.338042999999971],[-95.460280999999952,80.336928999999998],[-95.440826000000015,80.338318000000015],[-95.436935000000005,80.341095000000109],[-95.453338999999971,80.373306000000014],[-95.458617999999944,80.378586000000041],[-95.468063000000029,80.38220200000012],[-95.498610999999983,80.383880999999974],[-95.564162999999951,80.385817999999972],[-95.624999999999943,80.391663000000108],[-95.653885000000002,80.396652000000074],[-95.694992000000013,80.406097000000102],[-95.721664000000033,80.412765999999976],[-95.852218999999991,80.454163000000051],[-95.957229999999925,80.504990000000134],[-96.020553999999947,80.567490000000078],[-96.027221999999995,80.574158000000068],[-96.024445000000014,80.578323000000069],[-96.006957999999884,80.582763999999941],[-95.979996000000028,80.584717000000069],[-95.941665999999941,80.58638000000002],[-95.671660999999972,80.584717000000069],[-95.536391999999978,80.590820000000008],[-95.498046999999872,80.59248400000007],[-95.423614999999984,80.593597000000102],[-95.318343999999911,80.590820000000008],[-95.246658000000025,80.58998100000008],[-95.172226000000023,80.59137000000004],[-95.132216999999969,80.593872000000147],[-95.067229999999995,80.601379000000065],[-95.030837999999903,80.603317000000004],[-94.99499499999996,80.603043000000071],[-94.962783999999942,80.599715999999944],[-94.902495999999985,80.586655000000007],[-94.846953999999926,80.574706999999989],[-94.823623999999995,80.569716999999969],[-94.77194199999991,80.561371000000065],[-94.752791999999943,80.559982000000048],[-94.696654999999964,80.55693100000002],[-94.658614999999998,80.555817000000047],[-94.554992999999911,80.55442800000003],[-94.374999999999943,80.557205000000124],[-94.230835000000013,80.556365999999969],[-94.010559000000001,80.54942299999999],[-93.968886999999995,80.540817000000061],[-93.968886999999995,80.536925999999994],[-93.966110000000015,80.530823000000055],[-93.958343999999954,80.52609300000006],[-93.89916999999997,80.519150000000025],[-93.866942999999992,80.518326000000059],[-93.839447000000007,80.518599999999992],[-93.786391999999978,80.525543000000027],[-93.783066000000019,80.529709000000082],[-93.790832999999964,80.534424000000115],[-93.810546999999985,80.541367000000093],[-93.894729999999868,80.565811000000053],[-93.949158000000011,80.578048999999908],[-93.973617999999931,80.581939999999975],[-94.005004999999983,80.585266000000047],[-94.093612999999948,80.593322999999998],[-94.308334000000002,80.606368999999972],[-94.437774999999988,80.605545000000006],[-94.457503999999915,80.600265999999976],[-94.484726000000023,80.598328000000038],[-94.524170000000026,80.598328000000038],[-94.543335000000013,80.599715999999944],[-94.561935000000005,80.605819999999994],[-94.660278000000005,80.651382000000012],[-94.669448999999929,80.65776100000005],[-94.672775000000001,80.663879000000009],[-94.670273000000009,80.669708000000014],[-94.662215999999944,80.675262000000032],[-94.650283999999999,80.681366000000082],[-94.628326000000015,80.685806000000071],[-94.596953999999982,80.690536000000122],[-94.553604000000007,80.694977000000051],[-94.514724999999942,80.696365000000128],[-94.439163000000008,80.697479000000101],[-94.331116000000009,80.693863000000022],[-94.231673999999884,80.692200000000128],[-94.199722000000008,80.693039000000056],[-94.117492999999968,80.698593000000074],[-94.088332999999977,80.701660000000004],[-94.075561999999991,80.706099999999992],[-94.076950000000011,80.709152000000131],[-94.086394999999982,80.713043000000027],[-94.108337000000006,80.718872000000033],[-94.140288999999996,80.721924000000115],[-94.304442999999935,80.733871000000079],[-94.423049999999876,80.734985000000052],[-94.449158000000011,80.730270000000019],[-94.491104000000007,80.726928999999984],[-94.549438000000009,80.724991000000045],[-94.65972899999997,80.72526600000009],[-94.694716999999969,80.726653999999996],[-94.722778000000005,80.728592000000106],[-94.895554000000004,80.747757000000092],[-95.035827999999867,80.768326000000002],[-95.037505999999951,80.771378000000141],[-95.03694200000001,80.776093000000003],[-95.033889999999985,80.778046000000131],[-95.025283999999999,80.801651000000106],[-95.243056999999965,80.787766000000033],[-95.282501000000025,80.786101999999971],[-95.334166999999923,80.788879000000065],[-95.442764000000011,80.79971299999994],[-95.475554999999986,80.803040000000067],[-95.501113999999973,80.806931000000134],[-95.524170000000026,80.812484999999981],[-95.534164000000033,80.818878000000097],[-95.526397999999972,80.833328000000051],[-95.500838999999871,80.838318000000072],[-95.44027699999998,80.846100000000035],[-95.371384000000035,80.853316999999947],[-95.212783999999999,80.868317000000104],[-95.170837000000006,80.875809000000061],[-95.150832999999921,80.881088000000034],[-95.146666999999923,80.883881000000031],[-95.170546999999999,80.884720000000016],[-95.300827000000027,80.885269000000108],[-95.41332999999986,80.885269000000108],[-95.468886999999995,80.890273999999977],[-95.481383999999991,80.894714000000022],[-95.484726000000023,80.899155000000121],[-95.474166999999966,80.904434000000094],[-95.460280999999952,80.909713999999951],[-95.422775000000001,80.920821999999987],[-95.334166999999923,80.934708000000114],[-95.311934999999949,80.939147999999989],[-95.283614999999941,80.949996999999996],[-95.267501999999979,80.96138000000002],[-95.259734999999921,80.973602000000028],[-95.257506999999976,80.979431000000034],[-95.259170999999981,80.984984999999995],[-95.255004999999983,80.996643000000063],[-95.241104000000007,81.006103999999993],[-95.220839999999896,81.011382999999967],[-95.183060000000012,81.019714000000079],[-94.943329000000006,81.048874000000126],[-94.814163000000008,81.054153000000099],[-94.663054999999986,81.048598999999911],[-94.572783999999899,81.038879000000009],[-94.546111999999994,81.033325000000048],[-94.493880999999988,81.017487000000017],[-94.495543999999995,80.995819000000097],[-94.504181000000017,80.990265000000079],[-94.509170999999981,80.984711000000061],[-94.508057000000008,80.979431000000034],[-94.492767000000015,80.972763000000043],[-94.472778000000005,80.969146999999964],[-94.434158000000025,80.965546000000131],[-94.408614999999941,80.965546000000131],[-94.365554999999972,80.968872000000147],[-94.344726999999978,80.974152000000061],[-94.330001999999865,80.979706000000022],[-94.143616000000009,81.015823000000012],[-94.071670999999924,81.024993999999936],[-93.908051,81.039429000000041],[-93.906386999999995,81.040543000000071],[-94.013335999999981,81.053588999999988],[-94.042220999999927,81.055542000000116],[-94.18249499999996,81.068054000000075],[-94.328612999999962,81.089432000000045],[-94.357498000000021,81.09526100000005],[-94.36221299999994,81.100540000000024],[-94.353607000000011,81.106093999999985],[-94.345550999999944,81.109421000000111],[-94.313048999999978,81.115539999999953],[-94.278335999999967,81.117203000000075],[-94.255279999999971,81.115539999999953],[-94.230835000000013,81.110535000000084],[-94.214721999999881,81.106369000000029],[-94.195830999999941,81.10026600000009],[-94.154723999999987,81.093872000000033],[-94.130279999999971,81.09275800000006],[-93.989715999999987,81.092484000000127],[-93.960830999999928,81.094147000000078],[-93.935271999999941,81.098327999999981],[-93.907227000000034,81.101653999999996],[-93.866394000000014,81.103043000000014],[-93.795273000000009,81.099426000000051],[-93.689437999999996,81.093048000000067],[-93.517226999999878,81.084426999999948],[-93.299987999999928,81.079711999999915],[-93.255844000000025,81.082764000000054],[-93.163054999999929,81.091934000000094],[-93.152221999999938,81.094711000000018],[-93.123321999999916,81.115265000000136],[-93.095550999999944,81.154160000000104],[-93.091674999999952,81.159988000000055],[-93.095839999999953,81.165268000000083],[-93.121108999999933,81.182754999999929],[-93.259734999999978,81.212203999999929],[-93.419448999999929,81.219986000000063],[-93.514724999999999,81.217758000000117],[-93.687499999999943,81.21026599999999],[-93.728333000000021,81.207214000000079],[-93.852218999999934,81.203049000000078],[-93.928878999999995,81.203873000000044],[-94.031386999999938,81.208878000000084],[-94.166397000000018,81.218048000000124],[-94.200561999999877,81.221100000000035],[-94.282227000000034,81.231094000000098],[-94.302489999999977,81.234984999999938],[-94.381667999999991,81.25082400000008],[-94.388061999999991,81.254990000000134],[-94.391388000000006,81.261108000000092],[-94.386123999999938,81.272766000000104],[-94.370270000000005,81.284714000000008],[-94.278610000000015,81.341934000000037],[-94.268616000000009,81.346099999999922],[-94.240829000000019,81.350814999999955],[-94.200561999999877,81.355545000000006],[-94.153884999999946,81.359711000000118],[-94.06806899999998,81.363311999999951],[-94.035278000000005,81.363311999999951],[-93.789444000000003,81.348038000000088],[-93.755004999999926,81.344711000000132],[-93.694442999999922,81.337494000000049],[-93.665833000000021,81.332763999999997],[-93.638900999999976,81.327209000000096],[-93.621933000000013,81.321655000000078],[-93.611389000000031,81.316376000000105],[-93.594451999999933,81.31053199999991],[-93.553329000000019,81.305542000000059],[-93.515288999999996,81.31053199999991],[-93.494994999999903,81.314697000000081],[-93.483063000000016,81.319716999999969],[-93.483611999999994,81.325272000000041],[-93.488051999999982,81.330551000000014],[-93.533324999999991,81.348602000000028],[-93.560546999999929,81.367751999999996],[-93.564712999999927,81.376648000000102],[-93.550551999999925,81.38108799999992],[-93.517501999999979,81.38499500000006],[-93.340285999999992,81.372208000000057],[-93.177490000000034,81.358597000000088],[-93.01556399999987,81.341370000000097],[-92.928054999999972,81.330826000000059],[-92.831680000000006,81.317764000000011],[-92.727782999999931,81.305542000000059]],[[-91.71833799999996,81.549149000000057],[-91.761672999999973,81.548035000000084],[-91.801391999999964,81.548599000000024],[-91.837509000000011,81.551086000000112],[-91.863616999999977,81.555251999999996],[-91.951110999999912,81.584152000000017],[-91.958617999999944,81.588882000000069],[-91.960555999999997,81.594986000000119],[-91.956115999999952,81.600815000000125],[-91.932494999999903,81.605819999999994],[-91.903884999999946,81.608322000000044],[-91.868332000000009,81.608597000000088],[-91.823897999999986,81.606934000000138],[-91.789444000000003,81.603317000000004],[-91.724715999999944,81.596100000000092],[-91.597778000000005,81.580550999999957],[-91.582229999999925,81.578049000000078],[-91.619995000000017,81.562484999999981],[-91.643615999999895,81.557480000000112],[-91.673614999999984,81.552765000000079],[-91.71833799999996,81.549149000000057]],[[-78.365828999999962,82.883605999999986],[-78.383330999999998,82.883605999999986],[-78.419448999999986,82.899155000000064],[-78.417220999999927,82.935532000000023],[-78.414718999999934,82.941925000000026],[-78.405838000000017,82.947754000000032],[-78.389724999999885,82.953323000000012],[-78.361663999999962,82.958603000000096],[-78.323333999999875,82.961929000000112],[-78.273894999999868,82.963043000000084],[-78.223617999999988,82.961104999999975],[-78.145279000000016,82.954712000000029],[-78.119720000000029,82.94859299999996],[-78.116942999999992,82.942200000000014],[-78.122498000000007,82.937194999999974],[-78.150833000000034,82.926925999999924],[-78.212783999999999,82.911377000000016],[-78.336394999999982,82.888046000000145],[-78.365828999999962,82.883605999999986]],[[-70.111937999999952,83.109421000000111],[-70.00140399999998,83.10775799999999],[-69.812209999999993,83.112197999999978],[-69.74888599999997,83.11192299999999],[-69.701675000000023,83.110535000000084],[-69.665008999999998,83.108322000000101],[-69.659164000000033,83.103043000000127],[-69.662215999999944,83.074158000000068],[-69.664168999999958,83.070830999999941],[-69.680557000000022,83.064986999999974],[-69.716109999999958,83.061096000000077],[-69.757506999999976,83.057755000000043],[-69.773894999999982,83.051926000000037],[-69.775283999999942,83.047760000000096],[-69.744445999999982,83.04553199999998],[-69.671936000000017,83.041091999999935],[-69.636123999999995,83.039703000000145],[-69.471389999999985,83.038879000000009],[-69.451110999999969,83.035812000000078],[-69.513335999999981,83.019714000000022],[-69.536117999999988,83.014435000000049],[-69.565001999999936,83.009995000000004],[-69.559722999999963,82.994141000000127],[-69.233062999999959,83.010268999999937],[-69.156386999999938,83.017487000000131],[-69.120543999999995,83.021652000000131],[-69.097777999999948,83.026657],[-69.06361400000003,83.038040000000024],[-69.015563999999927,83.040817000000118],[-68.983063000000016,83.036652000000117],[-68.975280999999995,83.028320000000122],[-68.973891999999978,83.015549000000021],[-68.977218999999991,83.001663000000065],[-68.902785999999935,82.988312000000064],[-68.708344000000011,82.978043000000071],[-68.665008999999941,82.980270000000132],[-68.630829000000006,82.985259999999982],[-68.626663000000008,82.986923000000104],[-68.579726999999991,82.996933000000013],[-68.550551999999925,83.001663000000065],[-68.514724999999999,83.005554000000132],[-68.46665999999999,83.008040999999992],[-68.404723999999987,83.008330999999998],[-68.358046999999885,83.006103999999937],[-68.316101000000003,83.003326000000129],[-68.190826000000015,82.994705000000067],[-68.154175000000009,82.991088999999988],[-68.142226999999934,82.983597000000032],[-68.155272999999966,82.972487999999998],[-68.177779999999984,82.959991000000002],[-68.188599000000011,82.946091000000081],[-68.176391999999964,82.938873000000058],[-68.145554000000004,82.934981999999991],[-68.09973100000002,82.933594000000085],[-68.06806899999998,82.935257000000036],[-68.054169000000002,82.938873000000058],[-67.881667999999934,82.958878000000084],[-67.666945999999996,82.969711000000075],[-67.61082499999992,82.96887200000009],[-67.544158999999979,82.962203999999929],[-67.50140399999998,82.957214000000079],[-67.499999999999943,82.957016000000067],[-67.476104999999961,82.953598000000056],[-67.410003999999958,82.946640000000059],[-67.327788999999939,82.940811000000053],[-67.241669000000002,82.936919999999986],[-67.196655000000021,82.93609600000002],[-67.136123999999938,82.936646000000053],[-67.116942999999992,82.941086000000041],[-67.122771999999998,82.949142000000109],[-67.121658000000025,82.955261000000121],[-67.113327000000027,82.959427000000062],[-67.092223999999931,82.961104999999975],[-67.041107000000011,82.959717000000069],[-66.964721999999995,82.954163000000051],[-66.939986999999917,82.950546000000088],[-66.938323999999909,82.947754000000032],[-66.818893000000003,82.935257000000036],[-66.653060999999866,82.936371000000008],[-66.330001999999922,82.933868000000018],[-66.301391999999964,82.93193100000002],[-66.299437999999952,82.92942800000003],[-66.347503999999958,82.898041000000092],[-66.369155999999919,82.888321000000019],[-66.81138599999997,82.815262000000018],[-66.841110000000015,82.810806000000071],[-66.876663000000008,82.807205000000067],[-66.959732000000031,82.800812000000064],[-67.138335999999981,82.78387500000008],[-67.31527699999998,82.764709000000039],[-67.386123999999995,82.757767000000115],[-67.45777899999996,82.752212999999927],[-67.499999999999943,82.749611000000129],[-67.597778000000005,82.743590999999924],[-67.644729999999925,82.741652999999985],[-67.799164000000019,82.731658999999979],[-67.914168999999958,82.719986000000119],[-68.041381999999999,82.703873000000101],[-68.081679999999949,82.700821000000019],[-68.134170999999981,82.698593000000017],[-68.234726000000023,82.696640000000116],[-68.276108000000022,82.69470199999995],[-68.356658999999979,82.688034000000016],[-68.424437999999896,82.679703000000075],[-68.633621000000005,82.648605000000089],[-68.655838000000017,82.643600000000049],[-68.672225999999966,82.637772000000098],[-68.667220999999984,82.632477000000051],[-68.642501999999979,82.628585999999984],[-68.573623999999938,82.628860000000088],[-68.465011999999945,82.639435000000049],[-68.424437999999896,82.641937000000098],[-68.325835999999981,82.645537999999988],[-67.934998000000007,82.658324999999991],[-67.812774999999988,82.659149000000127],[-67.606658999999922,82.655548000000067],[-67.518065999999862,82.65109300000006],[-67.47084000000001,82.652205999999978],[-67.430557000000022,82.655548000000067],[-67.381942999999978,82.66276600000009],[-67.328063999999983,82.677199999999914],[-67.275283999999999,82.68609600000002],[-67.245834000000002,82.689697000000081],[-67.210830999999928,82.693587999999977],[-66.997771999999998,82.712203999999986],[-66.900283999999999,82.719437000000028],[-66.670837000000006,82.740265000000079],[-66.657227000000034,82.744430999999963],[-66.638335999999981,82.748871000000008],[-66.122771999999998,82.813034000000073],[-66.086670000000026,82.816665999999998],[-65.810271999999941,82.840820000000122],[-65.767776000000026,82.843048000000067],[-65.724166999999909,82.843597000000045],[-65.546660999999915,82.838043000000027],[-65.467772999999852,82.833327999999995],[-65.454726999999991,82.829162999999994],[-65.481673999999998,82.816665999999998],[-65.495834000000002,82.8119200000001],[-65.527221999999938,82.797484999999938],[-65.518065999999976,82.789978000000019],[-65.511123999999995,82.786652000000004],[-65.458617999999888,82.779433999999981],[-65.430832000000009,82.777481000000023],[-65.197494999999947,82.764160000000061],[-65.164444000000003,82.763046000000088],[-65.154723999999987,82.765274000000034],[-65.167496000000028,82.769989000000066],[-65.259170999999924,82.781662000000097],[-65.327498999999989,82.789154000000053],[-65.339721999999938,82.791930999999977],[-65.353057999999976,82.797211000000004],[-65.34445199999999,82.801926000000037],[-65.221938999999963,82.832764000000054],[-65.102782999999931,82.848037999999974],[-65.110001000000011,82.852767999999969],[-65.128052000000025,82.856094000000041],[-65.172775000000001,82.858321999999987],[-65.272781000000009,82.861099000000081],[-65.30749499999996,82.86554000000001],[-65.289168999999958,82.873306000000014],[-65.258057000000008,82.877472000000125],[-65.104720999999984,82.891663000000108],[-64.982223999999974,82.901093000000003],[-64.884734999999921,82.905823000000055],[-64.83555599999994,82.906937000000028],[-64.729720999999927,82.904160000000104],[-64.68472300000002,82.901657000000114],[-64.655562999999972,82.896942000000081],[-64.664168999999902,82.89027399999992],[-64.678604000000007,82.884720000000129],[-64.713897999999915,82.876372999999944],[-64.751953000000015,82.875259000000142],[-64.790558000000033,82.875809000000004],[-64.829726999999934,82.877762000000132],[-64.890288999999939,82.878036000000066],[-64.922501000000011,82.876372999999944],[-64.936934999999949,82.871368000000075],[-64.923614999999984,82.864699999999914],[-64.883895999999993,82.861649000000114],[-64.839995999999985,82.861923000000047],[-64.746384000000035,82.860535000000141],[-64.723052999999993,82.856369000000029],[-64.710555999999997,82.852478000000133],[-64.713897999999915,82.846375000000023],[-64.722777999999948,82.840820000000122],[-64.742217999999923,82.834427000000005],[-64.750838999999928,82.828323000000125],[-64.737777999999992,82.822220000000016],[-64.706954999999994,82.813034000000073],[-64.64805599999994,82.799713000000111],[-64.478607000000011,82.764435000000105],[-64.445266999999944,82.761932000000115],[-64.418059999999912,82.761382999999967],[-64.412780999999939,82.762206999999933],[-64.398055999999997,82.766936999999984],[-64.328888000000006,82.787201000000096],[-64.18638599999997,82.819153000000085],[-64.139998999999989,82.828049000000021],[-64.103058000000033,82.831665000000044],[-64.059722999999963,82.833327999999995],[-63.972770999999966,82.834991000000116],[-63.672775000000001,82.834717000000012],[-63.623610999999926,82.833603000000039],[-63.529723999999987,82.828323000000125],[-63.490836999999942,82.825272000000098],[-63.43472300000002,82.816665999999998],[-63.389167999999927,82.804977000000065],[-63.382499999999993,82.798325000000034],[-63.382216999999912,82.767761000000121],[-63.397223999999994,82.761382999999967],[-63.479163999999855,82.739425999999924],[-63.510284000000013,82.732483000000116],[-63.525832999999977,82.730545000000006],[-63.590836000000024,82.733047000000056],[-63.666106999999954,82.731368999999972],[-63.819449999999961,82.721374999999966],[-63.834998999999982,82.719147000000021],[-63.850280999999995,82.715820000000065],[-63.764450000000011,82.715271000000087],[-63.67888599999992,82.717758000000003],[-63.65166499999998,82.714996000000099],[-63.540001000000018,82.694427000000132],[-63.502040999999906,82.682762000000082],[-63.422226000000023,82.665543000000014],[-63.286948999999993,82.654434000000094],[-63.254447999999968,82.650269000000094],[-63.232215999999994,82.64498900000001],[-63.226105000000018,82.640273999999977],[-63.235557999999855,82.633330999999998],[-63.255835999999988,82.627197000000137],[-63.287223999999981,82.624985000000095],[-63.339721999999995,82.623596000000077],[-63.376388999999961,82.619980000000055],[-63.380829000000006,82.615265000000022],[-63.369445999999982,82.61053499999997],[-63.347495999999978,82.604980000000069],[-63.315001999999936,82.601089000000002],[-63.272223999999937,82.598602000000142],[-63.229720999999984,82.597214000000008],[-63.11361699999992,82.597487999999942],[-63.071113999999966,82.59637500000008],[-63.033614999999941,82.594436999999971],[-62.99639099999996,82.59027100000003],[-62.96416499999998,82.585541000000035],[-62.942496999999946,82.5816650000001],[-62.926108999999997,82.576096000000121],[-62.930557000000022,82.56999200000007],[-62.960555999999997,82.557754999999929],[-63.059440999999936,82.511932000000002],[-63.08943899999997,82.466385000000116],[-63.119994999999903,82.463608000000022],[-63.243889000000024,82.457764000000054],[-63.285004000000015,82.454987000000131],[-63.346106999999904,82.449142000000052],[-63.366111999999987,82.444977000000051],[-63.369995000000017,82.438873000000001],[-63.328613000000018,82.437759000000028],[-63.277221999999938,82.439148000000046],[-63.148887999999999,82.446929999999952],[-63.071670999999981,82.451935000000049],[-63.015838999999971,82.459716999999955],[-62.990836999999885,82.467209000000082],[-62.920836999999949,82.491089000000102],[-62.823616000000015,82.504440000000045],[-62.678336999999999,82.516098000000056],[-62.553328999999962,82.524428999999998],[-62.506667999999877,82.526657000000114],[-62.286948999999993,82.528046000000131],[-62.24500299999994,82.528046000000131],[-62.171669000000009,82.525542999999971],[-62.171386999999982,82.521378000000141],[-62.322776999999974,82.511108000000036],[-62.333060999999987,82.504166000000112],[-62.353057999999976,82.486374000000069],[-62.352782999999931,82.481093999999985],[-62.300835000000006,82.482483000000002],[-62.264449999999954,82.485809000000017],[-62.21566799999988,82.491928000000087],[-62.212497999999869,82.495766000000003],[-62.098052999999936,82.502212999999983],[-61.884170999999981,82.492752000000053],[-61.691665999999998,82.48803700000002],[-61.582503999999972,82.482483000000002],[-61.530829999999867,82.478317000000118],[-61.5,82.474152000000117],[-61.448607999999979,82.464431999999988],[-61.326110999999969,82.439697000000137],[-61.28556100000003,82.430267000000072],[-61.170279999999877,82.395264000000111],[-61.141113000000018,82.383041000000048],[-61.131385999999907,82.377472000000068],[-61.11222099999992,82.363876000000062],[-61.098609999999951,82.350266000000033],[-61.076392999999996,82.320831000000112],[-61.078613000000018,82.301086000000112],[-61.084723999999994,82.293593999999985],[-61.107779999999934,82.267761000000064],[-61.130359999999996,82.252937000000088],[-61.135558999999944,82.247482000000105],[-61.15694400000001,82.235259999999982],[-61.193328999999949,82.223602000000085],[-61.281112999999948,82.202774000000034],[-61.306389000000024,82.197205000000054],[-61.388054000000011,82.18331900000004],[-61.43332700000002,82.176376000000062],[-61.463614999999891,82.172484999999995],[-61.534171999999899,82.165543000000071],[-61.599441999999954,82.160812000000135],[-61.804442999999992,82.146652000000074],[-61.86999499999996,82.106644000000017],[-61.885001999999986,82.100539999999967],[-62.077781999999956,82.053588999999988],[-62.126944999999978,82.043869000000086],[-62.25417299999998,82.019989000000066],[-62.278885000000002,82.015822999999955],[-62.313056999999958,82.01249700000011],[-62.356948999999929,82.010268999999994],[-62.513618000000008,82.004715000000147],[-62.570281999999963,81.976089000000059],[-62.944999999999993,81.922211000000118],[-63.040557999999976,81.909714000000122],[-63.292502999999897,81.877761999999962],[-63.387221999999952,81.867752000000053],[-63.656104999999968,81.837494000000106],[-63.715003999999965,81.820831000000055],[-63.761116000000015,81.811645999999996],[-63.817223000000013,81.804703000000018],[-63.849723999999924,81.801086000000055],[-63.925003000000004,81.795258000000103],[-63.962775999999963,81.792480000000126],[-64.010009999999966,81.790268000000083],[-64.053054999999915,81.789978000000019],[-64.086945000000014,81.791930999999977],[-64.111663999999962,81.794983000000116],[-64.131667999999991,81.799149],[-64.142226999999934,81.803040000000067],[-64.177779999999984,81.810532000000023],[-64.207503999999972,81.81442300000009],[-64.271666999999923,81.821655000000021],[-64.301392000000021,81.824157999999954],[-64.325287000000003,81.824707000000103],[-64.323623999999995,81.819153000000085],[-64.308043999999995,81.814697000000024],[-64.253066999999987,81.806091000000094],[-64.232772999999952,81.800537000000077],[-64.12388599999997,81.768326000000002],[-64.118057000000022,81.764435000000105],[-64.134734999999921,81.754715000000033],[-64.207779000000016,81.74192800000003],[-64.355269999999962,81.726379000000122],[-64.472503999999958,81.721374999999966],[-64.629439999999931,81.722488000000055],[-64.720001000000025,81.723877000000073],[-64.767776000000026,81.725815000000011],[-64.801665999999955,81.728317000000061],[-64.812209999999993,81.730820000000051],[-64.833892999999932,81.738876000000118],[-64.839721999999938,81.742203000000075],[-64.885559000000001,81.750823999999966],[-64.910004000000015,81.752777000000094],[-64.962218999999948,81.752212999999983],[-65.21665999999999,81.74552900000009],[-65.337508999999955,81.737761999999975],[-65.409728999999913,81.728317000000061],[-65.631377999999927,81.70248400000014],[-65.668334999999956,81.700821000000019],[-65.725554999999929,81.701660000000004],[-65.773330999999985,81.702773999999977],[-65.924437999999952,81.70138500000013],[-66.012221999999952,81.696930000000123],[-66.038605000000018,81.692474000000004],[-66.042220999999984,81.690536000000066],[-66.030288999999925,81.684982000000105],[-65.991378999999995,81.682755000000043],[-65.821944999999971,81.684417999999937],[-65.612503000000004,81.680817000000104],[-65.487777999999935,81.687485000000038],[-65.404175000000009,81.69081100000011],[-65.352492999999868,81.691925000000083],[-65.336670000000026,81.688034000000016],[-65.370833999999945,81.678863999999976],[-65.402221999999995,81.674423000000047],[-65.523620999999991,81.659714000000008],[-65.618056999999908,81.648605000000089],[-65.789443999999946,81.632202000000063],[-65.871657999999911,81.627197000000024],[-65.910278000000005,81.629699999999957],[-65.926391999999964,81.634154999999964],[-65.92721599999993,81.635543999999982],[-65.924437999999952,81.639708999999982],[-65.92721599999993,81.645827999999995],[-65.943328999999892,81.650543000000027],[-65.982223999999917,81.65277100000003],[-66.024718999999948,81.653046000000018],[-66.042770000000019,81.651657],[-66.064712999999983,81.647765999999933],[-66.085555999999997,81.642761000000064],[-66.101943999999946,81.637207000000103],[-66.140838999999971,81.620529000000033],[-66.172501000000011,81.618042000000116],[-66.218886999999938,81.616928000000144],[-66.355270000000019,81.617477000000122],[-66.393889999999942,81.619705000000067],[-66.439712999999983,81.62692300000009],[-66.478333000000021,81.628585999999984],[-66.575561999999934,81.626082999999994],[-66.727492999999924,81.6202550000001],[-66.804992999999854,81.615814],[-66.896392999999932,81.611923000000104],[-67.15695199999999,81.608032000000037],[-67.509170999999924,81.60054000000008],[-67.55972300000002,81.599152000000004],[-67.766662999999994,81.593047999999953],[-67.792770000000019,81.589706000000035],[-68.111389000000031,81.56303400000013],[-68.156661999999983,81.56109600000002],[-68.231383999999991,81.561371000000008],[-68.274718999999948,81.562759000000085],[-68.309433000000013,81.565536000000009],[-68.330565999999919,81.56860400000005],[-68.352492999999981,81.573044000000039],[-68.410277999999892,81.588043000000084],[-68.459731999999974,81.597487999999998],[-68.661391999999978,81.633330999999998],[-68.715285999999992,81.642211999999972],[-68.976944000000003,81.684417999999937],[-69.058883999999921,81.697479000000101],[-69.139998999999989,81.70887799999997],[-69.176392000000021,81.712494000000049],[-69.247222999999963,81.71748400000007],[-69.291381999999999,81.718871999999976],[-69.299438000000009,81.717209000000082],[-69.306655999999975,81.714431999999988],[-69.291381999999999,81.707763999999997],[-69.268065999999976,81.70248400000014],[-69.214172000000019,81.695251000000098],[-69.123610999999983,81.683868000000132],[-69.005279999999914,81.667480000000069],[-68.902221999999995,81.651382000000012],[-68.624709999999993,81.604430999999977],[-68.449158000000011,81.570831000000055],[-68.370833999999888,81.553589000000045],[-68.357772999999952,81.548325000000091],[-68.352492999999981,81.541656000000046],[-68.37332200000003,81.537766000000033],[-68.407500999999968,81.533874999999966],[-68.504455999999948,81.532211000000132],[-68.551391999999964,81.532760999999994],[-68.637512000000015,81.535538000000088],[-68.715285999999992,81.539703000000088],[-68.810821999999916,81.548599000000024],[-68.848891999999978,81.549149000000057],[-68.856948999999986,81.547760000000039],[-68.851944000000003,81.541656000000046],[-68.839172000000019,81.536925999999994],[-68.813048999999978,81.533325000000104],[-68.777495999999928,81.529709000000082],[-68.579452999999887,81.514434999999992],[-68.536666999999966,81.513321000000019],[-68.446654999999964,81.517487000000074],[-68.376098999999954,81.522766000000047],[-68.285827999999924,81.526931999999988],[-68.091949,81.529160000000104],[-68.051101999999958,81.53054800000001],[-68.011123999999938,81.533051],[-67.910003999999958,81.542206000000078],[-67.819732999999871,81.546936000000073],[-67.724716000000001,81.551086000000112],[-67.383651999999984,81.56088299999999],[-67.182495000000017,81.564697000000081],[-67.150283999999942,81.564987000000087],[-67.107773000000009,81.564987000000087],[-67.064712999999983,81.562759000000085],[-66.859726000000023,81.546646000000067],[-66.791381999999885,81.540817000000061],[-66.766112999999962,81.537491000000045],[-66.629990000000021,81.518051000000014],[-66.608611999999994,81.512772000000041],[-66.62388599999997,81.506378000000041],[-66.741104000000007,81.491928000000087],[-66.887787000000003,81.480545000000063],[-66.962783999999942,81.474991000000102],[-67.043334999999956,81.469711000000018],[-67.248336999999992,81.44999700000011],[-67.457503999999972,81.423035000000027],[-67.753890999999896,81.391663000000051],[-67.818344000000025,81.385268999999994],[-67.994719999999973,81.368042000000003],[-68.244720000000029,81.33998100000008],[-68.355835000000013,81.32388300000008],[-68.429169000000002,81.31164600000011],[-68.486938000000009,81.303863999999976],[-68.618057000000022,81.290543000000014],[-68.796951000000035,81.275269000000094],[-69.028609999999958,81.258606000000043],[-69.319457999999997,81.260268999999937],[-69.34056099999998,81.263885000000016],[-69.357773000000009,81.268326000000116],[-69.362777999999992,81.268875000000037],[-69.391388000000006,81.270537999999988],[-69.426940999999943,81.26998900000001],[-69.455565999999976,81.265823000000125],[-69.468886999999995,81.259995000000004],[-69.46305799999999,81.253326000000129],[-69.436934999999949,81.249145999999939],[-69.366652999999985,81.246368000000132],[-69.319457999999997,81.243591000000038],[-69.312209999999993,81.240540000000067],[-69.323897999999929,81.238037000000077],[-69.541671999999949,81.212493999999936],[-69.911941999999954,81.182480000000112],[-69.999434999999949,81.179977000000122],[-70.158339999999953,81.181366000000139],[-70.206389999999942,81.179703000000018],[-70.210007000000019,81.173874000000012],[-70.126098999999954,81.165543000000127],[-70.050551999999982,81.161652000000061],[-69.960281000000009,81.160538000000088],[-69.907227000000034,81.161652000000061],[-69.864440999999999,81.16415400000011],[-69.760009999999966,81.173035000000027],[-69.638061999999991,81.177475000000072],[-69.647506999999962,81.172484999999995],[-69.831954999999994,81.137206999999989],[-69.887786999999946,81.129150000000038],[-69.953063999999983,81.122208000000114],[-69.976943999999946,81.118866000000025],[-70.013061999999934,81.109146000000123],[-70.025283999999999,81.102767999999969],[-70.023330999999985,81.100815000000011],[-69.995269999999948,81.099426000000051],[-69.955565999999976,81.099426000000051],[-69.922225999999966,81.102203000000145],[-69.832229999999981,81.111649000000114],[-69.632492000000013,81.139160000000118],[-69.609726000000023,81.14387499999998],[-69.591675000000009,81.14888000000002],[-69.541671999999949,81.164428999999927],[-69.528335999999911,81.169434000000024],[-69.463333000000034,81.183044000000052],[-69.430556999999965,81.187194999999974],[-69.359436000000017,81.193313999999987],[-68.876099000000011,81.231094000000098],[-68.760833999999932,81.239426000000037],[-68.37388599999997,81.266662999999994],[-68.246947999999975,81.272766000000104],[-68.116652999999928,81.280273000000079],[-68.052779999999984,81.286102000000085],[-67.887221999999952,81.30304000000001],[-67.823623999999938,81.310257000000092],[-67.791107000000011,81.315536000000066],[-67.690826000000015,81.329437000000041],[-67.593062999999972,81.340271000000087],[-67.356658999999979,81.363601999999958],[-67.24749799999995,81.371918000000051],[-67.124160999999901,81.379700000000014],[-66.990554999999915,81.385544000000039],[-66.621383999999978,81.413879000000065],[-66.365828999999962,81.434708000000001],[-66.290282999999988,81.440262000000018],[-66.16972399999986,81.447754000000145],[-66.134170999999924,81.450821000000076],[-66.050827000000027,81.459152000000131],[-65.985549999999989,81.468048000000067],[-65.831679999999949,81.484711000000004],[-65.724715999999944,81.493866000000025],[-65.643616000000009,81.498871000000065],[-65.557495000000017,81.503052000000139],[-65.466400000000021,81.506378000000041],[-65.252791999999943,81.517212000000086],[-65.002791999999999,81.530823000000055],[-64.612503000000004,81.544982999999945],[-64.566390999999953,81.545532000000094],[-64.537780999999995,81.543593999999985],[-64.528060999999923,81.541656000000046],[-64.517501999999979,81.537491000000045],[-64.444152999999972,81.490814000000114],[-64.436385999999914,81.479431000000091],[-64.451110999999969,81.466934000000094],[-64.491942999999992,81.448868000000118],[-64.508620999999948,81.441924999999969],[-64.520844000000011,81.4369200000001],[-64.554169000000002,81.425812000000064],[-64.616652999999928,81.404984000000013],[-64.658889999999985,81.393050999999957],[-64.735274999999945,81.374146000000053],[-64.808608999999933,81.360535000000084],[-64.855835000000013,81.352768000000083],[-64.99499499999996,81.333328000000108],[-65.060271999999998,81.326096000000007],[-65.168059999999969,81.309982000000048],[-65.286391999999978,81.287201000000039],[-65.323623999999995,81.278046000000018],[-65.441375999999934,81.256378000000041],[-65.493057000000022,81.250549000000035],[-65.527785999999992,81.247481999999934],[-65.571670999999981,81.244980000000055],[-65.747771999999998,81.235809000000131],[-65.941101000000003,81.226379000000065],[-65.980559999999912,81.22387700000013],[-66.010284000000013,81.220261000000107],[-66.199721999999895,81.183868000000018],[-66.244445999999868,81.17442299999999],[-66.264449999999954,81.169434000000024],[-66.418335000000013,81.128860000000032],[-66.438048999999978,81.12359600000002],[-66.482772999999952,81.106934000000081],[-66.50418099999996,81.095534999999984],[-66.509445000000028,81.08859300000006],[-66.529723999999987,81.076096000000064],[-66.544723999999974,81.070540999999992],[-66.603333000000021,81.05525200000011],[-66.685821999999973,81.035812000000135],[-66.753341999999975,81.021927000000005],[-66.921111999999994,80.991089000000045],[-67.164443999999946,80.948593000000017],[-67.208618000000001,80.941925000000026],[-67.279175000000009,80.93553200000008],[-67.309158000000025,80.934418000000107],[-67.349441999999954,80.936371000000065],[-67.440825999999959,80.936646000000053],[-67.562209999999993,80.93553200000008],[-67.591384999999946,80.933044000000109],[-67.606658999999922,80.929977000000008],[-67.603607000000011,80.92442299999999],[-67.588333000000034,80.913878999999952],[-67.567779999999971,80.908599999999979],[-67.543335000000013,80.90415999999999],[-67.53083799999996,80.897491000000116],[-67.539992999999981,80.891098000000113],[-67.583618000000001,80.876648000000046],[-67.634445000000028,80.860809000000074],[-67.653609999999958,80.856369000000086],[-67.863891999999964,80.834152000000017],[-67.910278000000005,80.8119200000001],[-67.965835999999911,80.797484999999995],[-68.011397999999986,80.788315000000125],[-68.065552000000025,80.779160000000104],[-68.089447000000007,80.776093000000003],[-68.138335999999981,80.772491000000002],[-68.202788999999939,80.765823000000069],[-68.225280999999939,80.761383000000023],[-68.672500999999897,80.66693099999992],[-68.738891999999908,80.647217000000012],[-68.814712999999983,80.628586000000041],[-68.952498999999875,80.603043000000071],[-69.146666999999923,80.529709000000082],[-69.171111999999994,80.517487000000131],[-69.273055999999997,80.463882000000012],[-69.289168999999958,80.451660000000061],[-69.291381999999999,80.444138000000123],[-69.290558000000033,80.437194999999917],[-69.297774999999945,80.424698000000149],[-69.305557000000022,80.418319999999994],[-69.317504999999983,80.412490999999989],[-69.333892999999932,80.406647000000135],[-69.384734999999921,80.391937000000041],[-69.427489999999977,80.382751000000042],[-69.479720999999984,80.37553400000013],[-69.551102000000014,80.366379000000109],[-69.596389999999872,80.361099000000024],[-69.729720999999927,80.352767999999969],[-69.982772999999895,80.344986000000006],[-70.072783999999956,80.344437000000028],[-70.218886999999938,80.346374999999966],[-70.284438999999907,80.351089000000115],[-70.305266999999958,80.356093999999985],[-70.310821999999973,80.363037000000134],[-70.285827999999981,80.372482000000048],[-70.256393000000003,80.381362999999965],[-70.244155999999919,80.386658000000011],[-70.227782999999988,80.401382000000069],[-70.220001000000025,80.416930999999977],[-70.235000999999897,80.429703000000018],[-70.275283999999942,80.44802900000002],[-70.314163000000008,80.464432000000045],[-70.499434999999949,80.513884999999959],[-70.539992999999924,80.521927000000119],[-70.68110699999994,80.548035000000084],[-70.706116000000009,80.552475000000129],[-70.754729999999995,80.559418000000107],[-70.783065999999963,80.56303400000013],[-70.812499999999886,80.562759000000142],[-70.825286999999889,80.558593999999971],[-70.827498999999932,80.551376000000118],[-70.813048999999921,80.544983000000002],[-70.796111999999994,80.540543000000127],[-70.765288999999996,80.534424000000115],[-70.741668999999945,80.531372000000033],[-70.670837000000006,80.518051000000071],[-70.637786999999946,80.509155000000135],[-70.531386999999995,80.474426000000051],[-70.490554999999915,80.460815000000082],[-70.476669000000015,80.454436999999984],[-70.423324999999977,80.42164600000001],[-70.434722999999963,80.391663000000108],[-70.450561999999991,80.385817999999972],[-70.458892999999989,80.381362999999965],[-70.472228999999913,80.368042000000003],[-70.471389999999985,80.362488000000042],[-70.469161999999983,80.354980000000012],[-70.462219000000005,80.346939000000134],[-70.444153000000028,80.340271000000143],[-70.424164000000019,80.336105000000032],[-70.352492999999924,80.324707000000046],[-70.309998000000007,80.318054000000075],[-70.252791999999943,80.313309000000061],[-70.15055799999999,80.299149000000114],[-70.035278000000005,80.278320000000122],[-69.991103999999893,80.268875000000094],[-69.974166999999966,80.263046000000088],[-69.960555999999997,80.256378000000097],[-69.965285999999935,80.252213000000097],[-69.990828999999962,80.24331699999999],[-70.128326000000015,80.19720500000011],[-70.145554000000004,80.193587999999977],[-70.178604000000007,80.189148000000102],[-70.21665999999999,80.186371000000008],[-70.24888599999997,80.18609600000002],[-70.315001999999879,80.187484999999981],[-70.611388999999974,80.19720500000011],[-70.645554000000004,80.199142000000109],[-70.821121000000005,80.195526000000086],[-71.120833999999945,80.172485000000052],[-71.180556999999908,80.166656000000046],[-71.238326999999913,80.158874999999966],[-71.381942999999978,80.139160000000004],[-71.418610000000001,80.131088000000034],[-71.446105999999929,80.121368000000132],[-71.463057999999933,80.118042000000059],[-71.50111400000003,80.11554000000001],[-71.654448999999943,80.111374000000069],[-71.694442999999978,80.110809000000074],[-71.731948999999929,80.111923000000047],[-71.762787000000003,80.114426000000037],[-71.789992999999981,80.117752000000053],[-71.811660999999901,80.123596000000077],[-71.836120999999991,80.131927000000132],[-71.848052999999993,80.143875000000037],[-71.878600999999946,80.162491000000045],[-71.907776000000013,80.171371000000079],[-71.953339000000028,80.180542000000003],[-72.006393000000003,80.188583000000108],[-72.057220000000029,80.19470200000012],[-72.081116000000009,80.194138000000009],[-72.099990999999875,80.192748999999992],[-72.127776999999924,80.187759000000142],[-72.165282999999988,80.188873000000115],[-72.189163000000008,80.192200000000014],[-72.223327999999981,80.201660000000118],[-72.241378999999995,80.207489000000123],[-72.256392999999946,80.213882000000069],[-72.274445000000014,80.219711000000075],[-72.294448999999872,80.223312000000135],[-72.329726999999878,80.22554000000008],[-72.358886999999925,80.226089000000059],[-72.378051999999968,80.224700999999982],[-72.391113000000018,80.221649000000014],[-72.400283999999942,80.218597000000102],[-72.420837000000006,80.211104999999975],[-72.412506000000008,80.207214000000079],[-72.188598999999954,80.163879000000122],[-72.140839000000028,80.156937000000028],[-72.082779000000016,80.151656999999943],[-72.052489999999977,80.149719000000005],[-71.996947999999861,80.143051000000071],[-71.977218999999934,80.139434999999992],[-71.896956999999929,80.11554000000001],[-71.895553999999947,80.114150999999993],[-71.898055999999997,80.108597000000032],[-71.905272999999966,80.103591999999935],[-71.926102000000014,80.099991000000102],[-71.954726999999934,80.096375000000023],[-72.115554999999972,80.087494000000106],[-72.250564999999938,80.085541000000148],[-72.391677999999956,80.085541000000148],[-72.392226999999991,80.081940000000088],[-72.358337000000006,80.064987000000031],[-72.340560999999923,80.059143000000006],[-72.306380999999988,80.057480000000055],[-72.170272999999952,80.053864000000033],[-72.137787000000003,80.053588999999988],[-72.053054999999915,80.057480000000055],[-71.920836999999949,80.066375999999991],[-71.885833999999932,80.067215000000147],[-71.849730999999906,80.067764000000125],[-71.701950000000011,80.064148000000046],[-71.618057000000022,80.06442300000009],[-71.489166000000012,80.068878000000097],[-71.376098999999954,80.076935000000049],[-71.316665999999941,80.081940000000088],[-71.186385999999914,80.093872000000033],[-70.968063000000029,80.114990000000148],[-70.854720999999984,80.12831100000011],[-70.821121000000005,80.131088000000034],[-70.762512000000015,80.133330999999941],[-70.651671999999962,80.131363000000022],[-70.626663000000008,80.130539000000056],[-70.50778200000002,80.099716000000058],[-70.502227999999945,80.093048000000067],[-70.497498000000007,80.082764000000054],[-70.48832699999997,80.057205000000067],[-70.494995000000017,80.050812000000121],[-70.508346999999958,80.047759999999982],[-70.568068999999923,80.042755000000113],[-70.59722899999997,80.039429000000098],[-70.646666999999979,80.031936999999971],[-70.662216000000001,80.026657000000057],[-70.673049999999989,80.020828000000051],[-70.679717999999866,80.014435000000105],[-70.672774999999945,80.006377999999984],[-70.672501000000011,80.001389000000017],[-70.689712999999983,79.993317000000047],[-70.71945199999999,79.986374000000012],[-70.767226999999878,79.981658999999979],[-70.916107000000011,79.974425999999994],[-70.954178000000013,79.972763000000043],[-71.08555599999994,79.968596999999988],[-71.241669000000002,79.960815000000025],[-71.27027899999996,79.957214000000135],[-71.401108000000022,79.93553199999991],[-71.416397000000018,79.930267000000072],[-71.453612999999962,79.906372000000033],[-71.460555999999883,79.901382000000012],[-71.458892999999932,79.894989000000066],[-71.438599000000011,79.88998399999997],[-71.415832999999907,79.886658000000125],[-71.394454999999994,79.884995000000004],[-71.352782999999931,79.886932000000058],[-71.338608000000022,79.888596000000064],[-71.168335000000013,79.914153999999996],[-71.109725999999966,79.915267999999969],[-71.063048999999978,79.911652000000117],[-70.944716999999969,79.894150000000081],[-70.925827000000027,79.890274000000034],[-70.910278000000005,79.885818000000086],[-70.916397000000018,79.879424999999969],[-71.005843999999968,79.819717000000082],[-71.116652999999985,79.789703000000088],[-71.136123999999938,79.784988000000055],[-71.183884000000035,79.77748100000008],[-71.212783999999999,79.774428999999998],[-71.343612999999948,79.76388500000013],[-71.376098999999954,79.760818000000029],[-71.400283999999999,79.757492000000013],[-71.444442999999922,79.741653000000042],[-71.463333000000034,79.736923000000047],[-71.49110399999995,79.733321999999987],[-71.699158000000011,79.709991000000116],[-71.739440999999943,79.707214000000022],[-71.781113000000005,79.706100000000049],[-71.817504999999983,79.703597999999943],[-71.922500999999954,79.695525999999973],[-71.990279999999984,79.689148000000046],[-72.096664000000033,79.674988000000099],[-72.217772999999909,79.659987999999998],[-72.267226999999934,79.659149000000014],[-72.287215999999944,79.659987999999998],[-72.317779999999914,79.667205999999965],[-72.330841000000021,79.672484999999938],[-72.348052999999879,79.678040000000067],[-72.367217999999923,79.681656000000089],[-72.392226999999991,79.683594000000028],[-72.425003000000004,79.685531999999967],[-72.467223999999931,79.684708000000001],[-72.574172999999917,79.679153000000099],[-72.619445999999925,79.677765000000022],[-72.661391999999978,79.677199999999971],[-72.697220000000016,79.678040000000067],[-72.729995999999971,79.679703000000131],[-72.756119000000012,79.682205000000067],[-72.912780999999939,79.702208999999982],[-72.932769999999948,79.706375000000037],[-72.944442999999978,79.710266000000104],[-73.062774999999988,79.79942299999999],[-73.061110999999983,79.805251999999996],[-73.048614999999984,79.808319000000097],[-73.027495999999985,79.80693100000002],[-73.017226999999934,79.804703000000018],[-73.003341999999975,79.803040000000124],[-72.979171999999949,79.802200000000084],[-72.945830999999998,79.804152999999985],[-72.924437999999952,79.806366000000139],[-72.912216000000001,79.809418000000051],[-72.902495999999928,79.815262000000075],[-72.926392000000021,79.819442999999978],[-73.059158000000025,79.825546000000088],[-73.091675000000009,79.826385000000073],[-73.178328999999906,79.822768999999994],[-73.218063000000029,79.822768999999994],[-73.285003999999958,79.826096000000121],[-73.348617999999988,79.83027600000014],[-73.371383999999978,79.833054000000118],[-73.396956999999986,79.834991000000002],[-73.43360899999999,79.835815000000139],[-73.576401000000033,79.832764000000111],[-73.667770000000019,79.829712000000029],[-73.745270000000005,79.828323000000012],[-73.780288999999982,79.82777400000009],[-73.853332999999907,79.829163000000051],[-73.866942999999992,79.830826000000002],[-73.864715999999987,79.835815000000139],[-73.853607000000011,79.839706000000035],[-73.801666000000012,79.84637500000008],[-73.745543999999938,79.849152000000004],[-73.742492999999854,79.849990999999932],[-73.746947999999975,79.854155999999932],[-73.768615999999895,79.858870999999965],[-73.890839000000028,79.875259000000028],[-73.945830999999885,79.881653000000085],[-74.010284000000013,79.885818000000086],[-74.117492999999968,79.888885000000016],[-74.156951999999933,79.888885000000016],[-74.238891999999964,79.887207000000103],[-74.283614999999941,79.881363000000079],[-74.30610699999994,79.876923000000033],[-74.383621000000005,79.868591000000094],[-74.415282999999988,79.865265000000022],[-74.576401000000033,79.856934000000138],[-74.667495999999971,79.853591999999992],[-74.795272999999952,79.850815000000125],[-74.833069000000023,79.849152000000004],[-74.846389999999985,79.847214000000065],[-74.846114999999941,79.84387200000009],[-74.71665999999999,79.796936000000073],[-74.699431999999945,79.792755],[-74.683884000000035,79.789978000000076],[-74.654998999999975,79.788879000000122],[-74.488892000000021,79.791655999999989],[-74.444992000000013,79.794708000000128],[-74.392226999999934,79.800261999999918],[-74.351668999999958,79.802475000000072],[-74.309432999999956,79.803314000000057],[-74.236388999999974,79.801925999999924],[-74.106383999999878,79.795532000000094],[-73.951401000000033,79.784424000000115],[-73.714721999999938,79.76638800000012],[-73.510833999999988,79.756377999999984],[-73.384734999999921,79.748871000000065],[-73.366652999999985,79.718048000000067],[-73.360824999999863,79.712769000000094],[-73.295546999999999,79.688582999999994],[-73.256957999999884,79.678040000000067],[-73.206664999999987,79.663605000000132],[-73.188889000000017,79.658035000000041],[-73.174438000000009,79.651657000000057],[-73.168334999999956,79.646103000000096],[-73.126098999999897,79.569443000000035],[-73.125823999999966,79.558318999999983],[-73.128875999999991,79.554153000000042],[-73.135833999999988,79.549713000000054],[-73.148620999999991,79.543593999999985],[-73.163054999999986,79.538878999999952],[-73.180831999999953,79.534149000000127],[-73.247222999999963,79.520827999999995],[-73.296111999999937,79.512772000000098],[-73.353881999999942,79.505829000000119],[-73.446380999999917,79.499145999999939],[-73.657776000000013,79.496368000000132],[-73.693054000000018,79.496933000000013],[-73.729172000000005,79.498596000000077],[-73.758057000000008,79.500275000000101],[-73.779998999999975,79.503052000000025],[-73.791945999999939,79.506653000000085],[-73.817229999999938,79.515549000000021],[-73.837783999999999,79.527480999999966],[-73.863892000000021,79.540267999999969],[-73.876662999999951,79.544708000000014],[-73.916106999999954,79.552475000000129],[-73.950286999999889,79.555252000000053],[-73.965012000000002,79.554703000000075],[-73.988892000000021,79.55192599999998],[-74.001113999999973,79.545821999999987],[-74.000290000000007,79.541656000000046],[-73.996947999999975,79.535537999999917],[-73.989440999999943,79.528595000000109],[-73.968612999999891,79.516937000000098],[-73.959166999999923,79.508881000000031],[-73.949996999999939,79.493866000000082],[-73.949721999999952,79.479980000000069],[-73.953063999999983,79.472762999999986],[-73.961945000000014,79.466933999999981],[-73.98332199999993,79.455551000000128],[-73.998046999999985,79.451385000000073],[-74.023620999999991,79.446930000000066],[-74.081389999999999,79.440536000000009],[-74.11610399999995,79.43803400000013],[-74.160278000000005,79.436371000000008],[-74.198333999999988,79.436095999999964],[-74.544158999999922,79.43803400000013],[-74.617492999999854,79.438583000000051],[-74.673614999999927,79.444138000000123],[-74.688598999999897,79.446930000000066],[-74.931670999999938,79.498871000000122],[-74.932410999999888,79.504798999999991],[-74.941939999999988,79.510543999999982],[-74.96444699999995,79.513046000000031],[-74.987503000000004,79.509995000000004],[-75.043334999999956,79.49581900000004],[-75.060271999999884,79.490813999999943],[-75.059433000000013,79.483871000000136],[-74.995269999999948,79.453598],[-74.983062999999959,79.449706999999933],[-74.948882999999967,79.440810999999997],[-74.912215999999944,79.429703000000018],[-74.897231999999974,79.423308999999961],[-74.884444999999971,79.416092000000049],[-74.883056999999894,79.408325000000104],[-74.911117999999988,79.39387499999998],[-74.93499799999995,79.385269000000051],[-74.951949999999954,79.380264000000011],[-75,79.375488000000075],[-75.016953000000001,79.374146000000053],[-75.058334000000002,79.373871000000065],[-75.213897999999972,79.376373000000115],[-75.31361400000003,79.379974000000004],[-75.410278000000005,79.384155000000078],[-75.531386999999995,79.392487000000074],[-75.695266999999944,79.409987999999998],[-75.799728000000016,79.431366000000139],[-75.907776000000013,79.426086000000055],[-75.931380999999988,79.423598999999967],[-75.957503999999972,79.426086000000055],[-75.985275000000001,79.429703000000018],[-76.031386999999995,79.438309000000118],[-76.049164000000019,79.443038999999999],[-76.097503999999958,79.461929000000112],[-76.109160999999915,79.467758000000117],[-76.115279999999927,79.472487999999942],[-76.124160999999958,79.476379000000009],[-76.138610999999912,79.481369000000086],[-76.175827000000027,79.488876000000005],[-76.203888000000006,79.492477000000065],[-76.261123999999995,79.497756999999979],[-76.320281999999906,79.501389000000074],[-76.636123999999995,79.519440000000088],[-76.665282999999988,79.520827999999995],[-76.718338000000017,79.51998900000001],[-76.795273000000009,79.51138300000008],[-76.834441999999967,79.508881000000031],[-76.872771999999998,79.508606000000043],[-76.90583799999996,79.509720000000016],[-77.050277999999992,79.518600000000049],[-77.069732999999985,79.523880000000077],[-77.092772999999909,79.539703000000145],[-77.112212999999997,79.545258000000047],[-77.142501999999865,79.547485000000052],[-77.160552999999936,79.543593999999985],[-77.191375999999934,79.511108000000092],[-77.184433000000013,79.503600999999946],[-77.178604000000007,79.499710000000107],[-77.134444999999971,79.490265000000022],[-77.071670999999924,79.486923000000104],[-76.895554000000004,79.48054500000012],[-76.867217999999923,79.479705999999965],[-76.612503000000004,79.474701000000096],[-76.406386999999995,79.473602000000142],[-76.204726999999991,79.461380000000133],[-76.179168999999888,79.459717000000069],[-76.159438999999963,79.456375000000094],[-76.143341000000021,79.449996999999939],[-76.138061999999934,79.443313999999987],[-76.138901000000033,79.441086000000041],[-76.149993999999992,79.437759000000085],[-76.159164000000033,79.436095999999964],[-76.189986999999974,79.433319000000097],[-76.208054000000004,79.429703000000018],[-76.205565999999976,79.424698000000149],[-76.167496000000028,79.396102999999925],[-76.157501000000025,79.391663000000108],[-76.11721799999998,79.384430000000123],[-76.083327999999995,79.378860000000032],[-76.059157999999968,79.374985000000038],[-75.902221999999995,79.357207999999957],[-75.881942999999978,79.353317000000118],[-75.879165999999998,79.351378999999952],[-75.889998999999875,79.348037999999917],[-75.902785999999878,79.346099999999979],[-76.086670000000026,79.332214000000022],[-76.12332200000003,79.331100000000049],[-76.351104999999961,79.341934000000094],[-76.682770000000005,79.352767999999969],[-76.717772999999909,79.353317000000118],[-76.790557999999976,79.353317000000118],[-76.829178000000013,79.350815000000011],[-76.869719999999973,79.349426000000051],[-76.89416499999993,79.353317000000118],[-76.959441999999967,79.367203000000075],[-77.018889999999999,79.381927000000132],[-77.076401000000033,79.398331000000098],[-77.090285999999935,79.40554800000001],[-77.105559999999912,79.416092000000049],[-77.108337000000006,79.420822000000101],[-77.212509000000011,79.447754000000032],[-77.326400999999976,79.454163000000051],[-77.359160999999915,79.455551000000128],[-77.386123999999938,79.452774000000034],[-77.397507000000019,79.447205000000054],[-77.395003999999972,79.440262000000075],[-77.384445000000028,79.433044000000052],[-77.262221999999952,79.372482000000048],[-77.172500999999954,79.336380000000077],[-77.158614999999998,79.329162999999994],[-77.163894999999968,79.324707000000046],[-77.187774999999988,79.322769000000108],[-77.228058000000033,79.321655000000135],[-77.260559000000001,79.322769000000108],[-77.317229999999938,79.327773999999977],[-77.36721799999998,79.336105000000089],[-77.386397999999986,79.33859300000006],[-77.41361999999998,79.34165999999999],[-77.466110000000015,79.346099999999979],[-77.477782999999931,79.346099999999979],[-77.596114999999941,79.345824999999991],[-77.634170999999924,79.345534999999984],[-77.707503999999972,79.343323000000055],[-77.739990000000034,79.344437000000084],[-77.769729999999981,79.346375000000023],[-77.819732999999985,79.351653999999996],[-77.905272999999909,79.365265000000136],[-77.922501000000011,79.366379000000109],[-77.957229999999981,79.363876000000118],[-78.051391999999964,79.354706000000078],[-78.058883999999978,79.349426000000051],[-78.043610000000001,79.344437000000084],[-78.021392999999932,79.339980999999966],[-77.903335999999967,79.322495000000004],[-77.876099000000011,79.319717000000026],[-77.846114999999998,79.317764000000068],[-77.809998000000007,79.316665999999998],[-77.760009999999966,79.316375999999991],[-77.726944000000003,79.317490000000134],[-77.650833000000034,79.317764000000068],[-77.624434999999949,79.315536000000122],[-77.529175000000009,79.30525200000011],[-77.478607000000011,79.29664600000001],[-77.322234999999978,79.267487000000017],[-77.329178000000013,79.261383000000137],[-77.341384999999946,79.259430000000009],[-77.358046999999942,79.257767000000115],[-77.422226000000023,79.254714999999976],[-77.453063999999983,79.252487000000031],[-77.482223999999974,79.248871000000008],[-77.496947999999918,79.24581900000004],[-77.488051999999982,79.244980000000112],[-77.424712999999997,79.246094000000085],[-77.358336999999949,79.249999999999943],[-77.191939999999988,79.263885000000073],[-76.999725000000012,79.273315000000139],[-76.671386999999925,79.277481000000023],[-76.237777999999935,79.271103000000039],[-76.168059999999969,79.269989000000066],[-76.136123999999995,79.268600000000106],[-76.105834999999956,79.265823000000012],[-76.068619000000012,79.25749200000007],[-76.052779999999984,79.251099000000124],[-76.03443900000002,79.24581900000004],[-75.991942999999992,79.236374000000012],[-75.938889000000017,79.230270000000132],[-75.807495000000017,79.227768000000083],[-75.777221999999938,79.227478000000076],[-75.734436000000017,79.229431000000034],[-75.675277999999992,79.236374000000012],[-75.637786999999946,79.239426000000094],[-75.608336999999949,79.239975000000072],[-75.465012000000002,79.239975000000072],[-75.405837999999903,79.237487999999985],[-75.083068999999966,79.235260000000039],[-74.876099000000011,79.238037000000134],[-74.800277999999992,79.240540000000067],[-74.777221999999995,79.240265000000079],[-74.52555799999999,79.227203000000031],[-74.496947999999975,79.224990999999989],[-74.47084000000001,79.22164900000007],[-74.464721999999995,79.219986000000119],[-74.467223999999987,79.215546000000131],[-74.474166999999966,79.211928999999998],[-74.520279000000016,79.203048999999965],[-74.571944999999914,79.196091000000138],[-74.601944000000003,79.192748999999992],[-74.758057000000008,79.18553200000008],[-74.791945999999996,79.182754999999986],[-74.817504999999926,79.17886400000009],[-74.826950000000011,79.174149000000057],[-74.819167999999934,79.167755000000056],[-74.795546999999999,79.163605000000018],[-74.766952999999944,79.161377000000073],[-74.672501000000011,79.156937000000028],[-74.617492999999854,79.151381999999955],[-74.445830999999941,79.065810999999997],[-74.436661000000015,79.0577550000001],[-74.443053999999961,79.046936000000073],[-74.455276000000026,79.041655999999989],[-74.47193900000002,79.036652000000004],[-74.514450000000011,79.028595000000053],[-74.543883999999991,79.025269000000037],[-74.578339000000028,79.023314999999968],[-74.654175000000009,79.022217000000069],[-74.725005999999951,79.022766000000047],[-74.960007000000019,79.028320000000008],[-75.116104000000007,79.035812000000135],[-75.243057000000022,79.043045000000006],[-75.626662999999951,79.066086000000041],[-75.655563000000029,79.068328999999949],[-75.763335999999981,79.080551000000128],[-75.885284000000013,79.097488000000112],[-75.891387999999949,79.102203000000145],[-75.887221999999952,79.12831100000011],[-75.880829000000006,79.134995000000004],[-75.856658999999979,79.139708999999925],[-75.848617999999988,79.14498900000001],[-75.857772999999952,79.152205999999921],[-75.944442999999922,79.173035000000084],[-76.047774999999945,79.192200000000071],[-76.071670999999924,79.196091000000138],[-76.098052999999993,79.199141999999995],[-76.132767000000001,79.199706999999989],[-76.309433000000013,79.190811000000053],[-76.519164999999987,79.190262000000132],[-76.859160999999972,79.185257000000092],[-76.973327999999924,79.183318999999926],[-77.044998000000021,79.183318999999926],[-77.083069000000023,79.183593999999971],[-77.111663999999962,79.184982000000048],[-77.167496000000028,79.189972000000125],[-77.205001999999979,79.195251000000098],[-77.250564999999995,79.198029000000076],[-77.388901000000033,79.199706999999989],[-77.510833999999988,79.194976999999994],[-77.548049999999932,79.194427000000132],[-77.642501999999922,79.199706999999989],[-77.695267000000001,79.204712000000029],[-77.749999999999886,79.208328000000108],[-77.777495999999928,79.208878000000141],[-77.817504999999983,79.207763999999997],[-78.158889999999985,79.189972000000125],[-78.213622999999984,79.183593999999971],[-78.233321999999987,79.17886400000009],[-78.245833999999945,79.174698000000035],[-78.25389100000001,79.169983000000002],[-78.253066999999987,79.164428999999984],[-78.228607000000011,79.160538000000088],[-78.181670999999994,79.159424000000115],[-78.084732000000031,79.168045000000063],[-78.056106999999997,79.171921000000111],[-78.026397999999972,79.174698000000035],[-77.988892000000021,79.177475000000129],[-77.912216000000001,79.17942800000003],[-77.842772999999966,79.178589000000102],[-77.47193900000002,79.167755000000056],[-77.237777999999992,79.156937000000028],[-77.208617999999944,79.154709000000082],[-77.181106999999997,79.153869999999927],[-77.018615999999952,79.153595000000109],[-76.841949,79.153595000000109],[-76.706115999999952,79.153045999999961],[-76.639998999999989,79.15109300000006],[-76.61082499999992,79.149155000000121],[-76.484725999999966,79.136108000000092],[-76.430557000000022,79.132202000000007],[-76.319732999999928,79.124695000000088],[-76.260009999999909,79.121917999999994],[-76.233611999999937,79.121642999999949],[-76.191375999999934,79.123596000000077],[-76.15972899999997,79.122208000000001],[-76.136672999999973,79.11914100000007],[-76.081954999999994,79.099716000000114],[-76.085006999999905,79.093323000000112],[-76.099990999999875,79.08776899999998],[-76.116652999999928,79.083328000000051],[-76.146666999999979,79.077774000000034],[-76.170546999999885,79.075821000000076],[-76.210006999999962,79.074707000000103],[-76.265014999999948,79.074432000000115],[-76.360001000000011,79.078323000000012],[-76.515015000000005,79.085815000000082],[-76.575561999999991,79.089432000000045],[-76.637222000000008,79.090546000000018],[-76.676391999999964,79.089432000000045],[-76.828339000000028,79.082764000000111],[-76.996383999999978,79.074707000000103],[-77.073333999999932,79.070831000000055],[-77.152785999999992,79.066086000000041],[-77.223052999999993,79.060532000000023],[-77.326950000000011,79.051651000000106],[-77.355559999999969,79.048325000000034],[-77.429717999999923,79.037200999999982],[-77.449431999999945,79.032760999999937],[-77.464721999999995,79.027771000000087],[-77.49499499999996,79.017761000000007],[-77.529175000000009,79.018051000000014],[-77.693054000000018,79.033600000000092],[-77.719727000000034,79.036652000000004],[-77.742217999999923,79.041930999999977],[-77.783066000000019,79.062484999999981],[-77.799987999999928,79.066666000000055],[-77.84973100000002,79.069717000000082],[-77.919723999999917,79.068878000000097],[-78.035004000000015,79.065536000000009],[-78.103333000000021,79.066086000000041],[-78.135009999999966,79.067490000000021],[-78.165282999999931,79.06999200000007],[-78.214447000000007,79.075271999999984],[-78.234160999999858,79.078323000000012],[-78.289992999999981,79.083328000000051],[-78.351105000000018,79.086380000000133],[-78.425277999999992,79.083054000000118],[-78.671386999999982,79.071930000000009],[-78.818343999999968,79.069442999999978],[-78.860000999999954,79.067214999999976],[-78.891387999999893,79.063309000000118],[-78.879439999999931,79.060256999999979],[-78.692489999999964,79.058594000000085],[-78.588332999999977,79.059143000000006],[-78.405272999999966,79.064987000000031],[-78.283889999999985,79.066666000000055],[-78.236388999999974,79.064987000000031],[-78.15972899999997,79.051086000000055],[-78.108337000000006,79.04664600000001],[-78.070557000000008,79.04664600000001],[-77.966110000000015,79.049149],[-77.86111499999987,79.049149],[-77.829453000000001,79.048035000000027],[-77.799437999999896,79.045258000000103],[-77.785552999999993,79.041092000000049],[-77.708344000000011,79.013046000000145],[-77.703339000000028,79.006943000000035],[-77.71665999999999,79.003326000000072],[-77.796111999999937,78.988586000000112],[-77.835007000000019,78.979431000000034],[-77.946945000000028,78.951660000000004],[-77.946380999999917,78.945815999999979],[-77.952498999999932,78.939697000000137],[-78.040282999999988,78.906097000000045],[-78.147506999999962,78.865265000000079],[-78.282227000000034,78.80386400000009],[-78.289992999999981,78.799149000000057],[-78.297226000000023,78.788879000000122],[-78.296111999999937,78.783051],[-78.285552999999993,78.775818000000015],[-78.269454999999937,78.772491000000059],[-78.248046999999929,78.770263999999997],[-78.215560999999923,78.770537999999931],[-78.196105999999929,78.772217000000126],[-78.168334999999956,78.780823000000055],[-78.15972899999997,78.784988000000055],[-78.15943900000002,78.789978000000133],[-78.145843999999954,78.800812000000008],[-78.129439999999988,78.812194999999974],[-78.105269999999905,78.828598000000056],[-78.042769999999962,78.861649],[-78.029174999999896,78.867477000000122],[-77.902221999999995,78.91276600000009],[-77.887222000000008,78.917755000000056],[-77.75167799999997,78.95748900000001],[-77.711944999999957,78.966095000000109],[-77.689437999999996,78.968596999999988],[-77.526397999999972,78.979156000000046],[-77.370270000000005,78.984421000000111],[-77.258346999999958,78.986374000000069],[-77.177490000000034,78.989700000000084],[-77.107497999999964,78.99552900000009],[-77.078888000000006,78.998871000000065],[-77.026107999999965,79.006652999999972],[-76.960281000000009,79.012772000000041],[-76.75418099999996,79.027771000000087],[-76.710555999999997,79.028320000000008],[-76.683318999999983,79.027771000000087],[-76.424163999999962,79.022491000000002],[-76.361389000000031,79.019714000000135],[-75.98971599999993,78.99552900000009],[-75.732223999999974,78.969147000000021],[-75.720276000000013,78.965545999999961],[-75.769454999999994,78.939971999999955],[-75.781113000000005,78.934708000000001],[-75.796951000000035,78.929703000000131],[-75.825561999999991,78.926085999999998],[-75.858611999999937,78.923309000000074],[-75.896118000000001,78.920821999999987],[-76.095276000000013,78.910262999999986],[-76.25,78.902205999999978],[-76.287215999999944,78.899719000000118],[-76.315552000000025,78.896103000000039],[-76.335555999999997,78.891663000000051],[-76.375548999999921,78.882750999999985],[-76.415008999999998,78.873870999999951],[-76.446105999999929,78.863876000000062],[-76.456389999999942,78.857758000000103],[-76.460007000000019,78.851929000000098],[-76.458343999999897,78.844986000000119],[-76.440276999999924,78.839432000000102],[-76.41194200000001,78.837203999999986],[-76.394454999999937,78.840820000000008],[-76.391113000000018,78.843872000000147],[-76.37470999999988,78.851089000000059],[-76.344727000000034,78.858871000000022],[-76.330001999999979,78.861649],[-76.231673999999998,78.879149999999981],[-76.204726999999991,78.881088000000091],[-76.178329000000019,78.880264000000125],[-76.15834000000001,78.879149999999981],[-76.133330999999998,78.876648000000046],[-76.077498999999989,78.873032000000023],[-75.975006000000008,78.872756999999979],[-75.791671999999949,78.884155000000021],[-75.461120999999991,78.891372999999987],[-75.316101000000003,78.892211999999972],[-75.292220999999927,78.890274000000034],[-75.180557000000022,78.879149999999981],[-74.964721999999995,78.856094000000098],[-74.775009000000011,78.829987000000074],[-74.760559000000001,78.823607999999979],[-74.752791999999943,78.816940000000045],[-74.719726999999978,78.707489000000066],[-74.727218999999934,78.701385000000016],[-74.755844000000025,78.69802900000002],[-74.823059000000001,78.697478999999987],[-74.84333799999996,78.693039000000113],[-74.86999499999996,78.675812000000121],[-74.869445999999925,78.668594000000098],[-74.857773000000009,78.636107999999979],[-74.819457999999884,78.627472000000068],[-74.789992999999981,78.591370000000097],[-74.862212999999997,78.56721500000009],[-74.878052000000025,78.562485000000038],[-75.024169999999913,78.531937000000084],[-75.048049999999989,78.528046000000018],[-75.072509999999909,78.52777100000003],[-75.079453000000001,78.533875000000023],[-75.101394999999968,78.53776600000009],[-75.131377999999927,78.539153999999996],[-75.16722099999987,78.539703000000145],[-75.200287000000003,78.537491000000102],[-75.219726999999978,78.533051000000057],[-75.235275000000001,78.528046000000018],[-75.261672999999973,78.523315000000082],[-75.290557999999919,78.520537999999988],[-75.479445999999996,78.50999500000006],[-75.830001999999979,78.504715000000147],[-75.888335999999924,78.506103999999993],[-75.965011999999888,78.510818000000086],[-75.989990000000034,78.513885000000016],[-76.030563000000029,78.521103000000039],[-76.073058999999944,78.529709000000139],[-76.095550999999944,78.533600000000035],[-76.120270000000005,78.536652000000117],[-76.151107999999965,78.538589000000002],[-76.404448999999886,78.548035000000141],[-76.437209999999993,78.548599000000081],[-76.468886999999938,78.54553199999998],[-76.642775999999969,78.528320000000122],[-76.684433000000013,78.522217000000012],[-76.691101000000003,78.518875000000094],[-76.692764000000011,78.514708999999982],[-76.693603999999993,78.509720000000016],[-76.684997999999894,78.505829000000119],[-76.668335000000013,78.503875999999991],[-76.645844000000011,78.502777000000037],[-76.539992999999981,78.503325999999959],[-76.468338000000017,78.505264000000125],[-76.36471599999993,78.513321000000076],[-76.324722000000008,78.515274000000034],[-76.289444000000003,78.515549000000021],[-76.261948000000018,78.513611000000083],[-76.243057000000022,78.512207000000103],[-76.124999999999943,78.494141000000127],[-76.114165999999955,78.488312000000121],[-76.112777999999878,78.481094000000098],[-76.108886999999982,78.474990999999989],[-76.100554999999986,78.468322999999998],[-76.081679999999949,78.464432000000102],[-76.057495000000017,78.461929000000112],[-75.761123999999995,78.443862999999965],[-75.61721799999998,78.43803400000013],[-75.49888599999997,78.433044000000052],[-75.443603999999993,78.430542000000003],[-75.410827999999924,78.426651000000106],[-75.269729999999925,78.404160000000104],[-75.089995999999985,78.368866000000025],[-75.031386999999995,78.331375000000037],[-75.038329999999917,78.325546000000031],[-75.051940999999886,78.315810999999997],[-75.0625,78.309708000000001],[-75.086670000000026,78.306366000000082],[-75.189986999999974,78.299713000000111],[-75.22193900000002,78.300262000000032],[-75.246108999999933,78.303314],[-75.273055999999883,78.305542000000116],[-75.307495000000017,78.305542000000116],[-75.358611999999937,78.301651000000049],[-75.377212999999983,78.29664600000001],[-75.385009999999909,78.291367000000037],[-75.392226999999934,78.285262999999986],[-75.39805599999994,78.272491000000002],[-75.479172000000005,78.222214000000122],[-75.494155999999975,78.217209000000082],[-75.513335999999924,78.212769000000037],[-75.582503999999915,78.201096000000007],[-75.61361699999992,78.198029000000076],[-75.650283999999942,78.196930000000123],[-75.679442999999992,78.198318000000029],[-75.776397999999972,78.210541000000092],[-75.902495999999928,78.224152000000061],[-75.985549999999932,78.229979999999955],[-76.157227000000034,78.240540000000124],[-76.188888999999961,78.241089000000045],[-76.225829999999974,78.239975000000072],[-76.291945999999996,78.234421000000054],[-76.324447999999961,78.23275799999999],[-76.361389000000031,78.231658999999979],[-76.393065999999976,78.232208000000128],[-76.474715999999944,78.239425999999924],[-76.520278999999903,78.24552900000009],[-76.548049999999876,78.248322000000087],[-76.574172999999917,78.249709999999993],[-76.608336999999949,78.249419999999986],[-76.630554000000018,78.247757000000036],[-76.831680000000006,78.230820000000051],[-76.855269999999962,78.227478000000076],[-76.888061999999991,78.21804800000001],[-76.898620999999935,78.212494000000049],[-76.912216000000001,78.201096000000007],[-76.90834000000001,78.195525999999916],[-76.883330999999941,78.191925000000083],[-76.688599000000011,78.168869000000029],[-76.664444000000003,78.166092000000106],[-76.641678000000013,78.164429000000041],[-76.537780999999939,78.158324999999991],[-76.021392999999989,78.138046000000031],[-75.763900999999976,78.131653000000085],[-75.735549999999989,78.1308140000001],[-75.621933000000013,78.1244200000001],[-75.59722899999997,78.12081900000004],[-75.581389999999942,78.115814],[-75.575561999999934,78.107758000000103],[-75.575287000000003,78.101379000000065],[-75.588897999999972,78.089432000000102],[-75.599166999999909,78.083328000000051],[-75.692763999999954,78.039978000000076],[-75.707503999999915,78.034988000000055],[-75.723052999999993,78.030823000000055],[-75.761123999999995,78.022491000000059],[-75.809433000000013,78.008331000000112],[-75.838608000000022,77.998322000000087],[-75.922775000000001,77.956650000000081],[-75.965011999999888,77.973037999999917],[-75.984160999999858,77.977478000000133],[-76.157227000000034,78.012497000000053],[-76.214721999999995,78.01527399999992],[-76.246108999999933,78.015823000000069],[-76.276672000000019,78.012772000000041],[-76.303054999999972,78.009430000000123],[-76.444716999999912,77.988586000000112],[-76.466949,77.984710999999947],[-76.481383999999935,77.979706000000078],[-76.491942999999992,77.968597000000045],[-76.499725000000012,77.958327999999995],[-76.526108000000022,77.949142000000052],[-76.548339999999996,77.944977000000051],[-76.595839999999953,77.939697000000137],[-76.669998000000021,77.936371000000122],[-76.694442999999865,77.937195000000088],[-76.730559999999912,77.936096000000077],[-76.757232999999985,77.93331900000004],[-76.780288999999925,77.929977000000065],[-76.802490000000034,77.920258000000103],[-76.805557000000022,77.917205999999965],[-76.806945999999925,77.91304000000008],[-76.825287000000003,77.908325000000048],[-76.86221299999994,77.90277100000003],[-76.93110699999994,77.901382000000069],[-76.959731999999974,77.902481000000023],[-76.986114999999927,77.904708999999968],[-77.036391999999921,77.909714000000008],[-77.077788999999939,77.915817000000004],[-77.089171999999962,77.919708000000071],[-77.095276000000013,77.927199999999971],[-77.104172000000005,77.934417999999994],[-77.120269999999891,77.939148000000046],[-77.160003999999901,77.946091000000024],[-77.210830999999985,77.949142000000052],[-77.244445999999982,77.948593000000074],[-77.272232000000031,77.946365000000128],[-77.298339999999996,77.942749000000106],[-77.336120999999991,77.94081099999994],[-77.838897999999972,77.942749000000106],[-77.997498000000007,77.957214000000022],[-78.03694200000001,77.966384999999946],[-78.140838999999914,77.985260000000096],[-78.162216000000001,77.988312000000008],[-78.237502999999947,77.995818999999983],[-78.260833999999932,77.995254999999986],[-78.411391999999921,77.917755000000113],[-78.420837000000006,77.912491000000102],[-78.426391999999964,77.90637200000009],[-78.419723999999974,77.898880000000133],[-78.410552999999936,77.892211999999972],[-78.330840999999907,77.868591000000094],[-78.317107999999962,77.865814],[-78.282500999999968,77.862762000000089],[-78.260283999999899,77.861374000000012],[-78.173889000000031,77.859984999999995],[-78.139450000000011,77.857208000000128],[-77.97193900000002,77.807204999999954],[-77.958617999999888,77.802200000000084],[-77.947768999999994,77.796371000000079],[-77.940826000000015,77.765549000000021],[-77.940551999999968,77.759995000000004],[-77.981109999999887,77.701385000000073],[-77.920272999999952,77.669983000000116],[-77.882767000000001,77.661652000000004],[-77.862777999999992,77.656372000000147],[-77.742766999999958,77.622208000000114],[-77.724716000000001,77.613312000000008],[-77.718612999999948,77.605820000000051],[-77.723052999999936,77.599152000000061],[-77.730835000000013,77.597214000000122],[-77.87222300000002,77.568329000000119],[-77.952224999999999,77.555817000000104],[-77.958343999999954,77.529709000000139],[-77.944442999999978,77.511383000000137],[-77.946105999999986,77.504714999999976],[-77.948607999999979,77.501938000000109],[-77.981673999999998,77.486374000000012],[-77.99499499999996,77.481094000000098],[-78.256667999999934,77.381926999999962],[-78.303878999999995,77.373306000000071],[-78.690552000000025,77.315535999999952],[-78.741104000000007,77.309418000000051],[-78.777221999999995,77.307205000000067],[-78.806655999999975,77.307205000000067],[-78.834166999999923,77.30831900000004],[-78.839721999999995,77.310256999999979],[-78.833069000000023,77.314987000000031],[-78.786117999999988,77.335815000000082],[-78.733886999999982,77.362762000000032],[-78.726944000000003,77.367477000000065],[-78.725280999999995,77.371094000000028],[-78.727782999999988,77.375259000000028],[-78.764449999999954,77.3808140000001],[-78.784438999999907,77.3808140000001],[-78.816665999999998,77.378036000000122],[-78.841110000000015,77.374420000000043],[-78.861663999999962,77.370255000000043],[-78.89805599999994,77.360809000000074],[-78.920273000000009,77.350815000000068],[-78.939986999999917,77.338882000000012],[-78.948043999999982,77.332489000000066],[-78.955565999999919,77.328322999999955],[-78.968338000000017,77.323317999999915],[-79.00418099999996,77.313873000000058],[-79.083327999999995,77.299987999999985],[-79.139724999999999,77.293594000000098],[-79.171386999999868,77.290817000000004],[-79.207229999999981,77.288315000000125],[-79.270554000000004,77.286926000000108],[-79.321670999999924,77.288589000000059],[-79.373321999999973,77.29304499999995],[-79.493332000000009,77.304428000000144],[-79.631377999999984,77.316666000000055],[-79.653885000000002,77.318603999999993],[-79.712218999999948,77.318328999999949],[-79.83666999999997,77.306931000000134],[-79.860824999999977,77.303314],[-79.881942999999978,77.299713000000111],[-79.896118000000001,77.295822000000044],[-79.92332499999992,77.285263000000043],[-79.960555999999883,77.276932000000102],[-79.988327000000027,77.273604999999975],[-80.01916499999993,77.272217000000069],[-80.042495999999971,77.272766000000047],[-80.456116000000009,77.296097000000088],[-80.753341999999918,77.330551000000128],[-80.775833000000034,77.334427000000005],[-80.879714999999919,77.353043000000014],[-81.005568999999923,77.377197000000137],[-81.015288999999996,77.381363000000022],[-81.019454999999994,77.392761000000064],[-81.027221999999995,77.398041000000092],[-81.035277999999948,77.40109300000006],[-81.095276000000013,77.411925999999994],[-81.121108999999933,77.413605000000018],[-81.150833000000034,77.413605000000018],[-81.207778999999903,77.415817000000061],[-81.254729999999995,77.420532000000094],[-81.277495999999928,77.42442299999999],[-81.294448999999929,77.429153000000042],[-81.310546999999985,77.434982000000048],[-81.316665999999998,77.438873000000115],[-81.321121000000005,77.450272000000041],[-81.325287000000003,77.454987000000074],[-81.337509000000011,77.462769000000037],[-81.351669000000015,77.469711000000075],[-81.370543999999938,77.475540000000137],[-81.388901000000033,77.480819999999994],[-81.442215000000033,77.491364000000033],[-81.533889999999928,77.506942999999978],[-81.573623999999938,77.512771999999984],[-81.587783999999942,77.517487000000017],[-81.589721999999995,77.520828000000051],[-81.608337000000006,77.553588999999988],[-81.610549999999989,77.576096000000064],[-81.820281999999963,77.621918000000107],[-81.839721999999938,77.625809000000004],[-81.845001000000025,77.628860000000032],[-81.848617999999988,77.639434999999935],[-81.847778000000005,77.643326000000002],[-81.836670000000026,77.65498400000007],[-81.847503999999901,77.665817000000004],[-81.860000999999954,77.671371000000022],[-81.876662999999951,77.677475000000072],[-81.89527899999996,77.682480000000112],[-81.913894999999911,77.685532000000023],[-81.928329000000019,77.685806000000127],[-81.930283000000031,77.684981999999991],[-81.935546999999929,77.678040000000067],[-81.949158000000011,77.655258000000003],[-81.949431999999945,77.644989000000123],[-81.911391999999921,77.609421000000111],[-81.895844000000011,77.604156000000046],[-81.857223999999974,77.598877000000073],[-81.810271999999941,77.595260999999994],[-81.798049999999989,77.59165999999999],[-81.787506000000008,77.587494000000049],[-81.678054999999972,77.538315000000068],[-81.670546999999942,77.531662000000097],[-81.667220999999984,77.52526899999998],[-81.666945999999996,77.502213000000097],[-81.670836999999949,77.496094000000085],[-81.690276999999924,77.485260000000039],[-81.710555999999997,77.474990999999989],[-81.71945199999999,77.469986000000119],[-81.748046999999929,77.448029000000076],[-81.743606999999997,77.441086000000098],[-81.739440999999999,77.436371000000065],[-81.728881999999999,77.429977000000008],[-81.700561999999877,77.422760000000096],[-81.523620999999991,77.378036000000122],[-81.484726000000023,77.372208000000001],[-81.432220000000029,77.368042000000059],[-81.336670000000026,77.368591000000038],[-81.25140399999998,77.36914100000007],[-81.203888000000006,77.370529000000147],[-81.189986999999917,77.368042000000059],[-81.178054999999972,77.360259999999926],[-81.172775000000001,77.354705999999965],[-81.167769999999962,77.342758000000117],[-81.165833000000021,77.337204000000099],[-81.165833000000021,77.332764000000054],[-81.169448999999986,77.32249500000006],[-81.283889999999985,77.315262000000018],[-81.425003000000004,77.306366000000082],[-81.538329999999974,77.302765000000079],[-81.874999999999943,77.292480000000126],[-81.953887999999949,77.302200000000028],[-82.091948999999943,77.316376000000048],[-82.151397999999972,77.303864000000033],[-82.166107000000011,77.292480000000126],[-82.081680000000006,77.272766000000047],[-82.043335000000013,77.265548999999908],[-81.978881999999999,77.258331000000112],[-81.90695199999999,77.198318000000029],[-81.906577999999968,77.1933140000001],[-81.902221999999995,77.187195000000031],[-81.876099000000011,77.174698000000092],[-81.868057000000022,77.171646000000123],[-81.834166999999866,77.162491000000102],[-81.796660999999972,77.157486000000063],[-81.78694200000001,77.157486000000063],[-81.715835999999967,77.176926000000037],[-81.696654999999907,77.181366000000025],[-81.634444999999971,77.193863000000022],[-81.607497999999964,77.197479000000101],[-81.395003999999972,77.231659000000036],[-81.149170000000026,77.274703999999986],[-80.960281000000009,77.271378000000141],[-80.592772999999966,77.242477000000008],[-80.526397999999915,77.234985000000052],[-80.280288999999868,77.213608000000022],[-80.258621000000005,77.212204000000042],[-80.205840999999964,77.209427000000119],[-80.154998999999975,77.208037999999931],[-80.135833999999988,77.205826000000059],[-80.116104000000007,77.20138500000013],[-80.114715999999987,77.195525999999973],[-80.136947999999961,77.186096000000077],[-80.152785999999992,77.181656000000032],[-80.255004999999983,77.153320000000122],[-80.401671999999962,77.086655000000007],[-80.40972899999997,77.081100000000106],[-80.40972899999997,77.076660000000118],[-80.394454999999937,77.072769000000051],[-80.373046999999929,77.071380999999917],[-80.34584000000001,77.074996999999996],[-80.328063999999927,77.078323000000012],[-80.206954999999937,77.108597000000088],[-80.159438999999963,77.122756999999979],[-80.135009999999966,77.139435000000049],[-80.118606999999997,77.150818000000072],[-80.094726999999978,77.161102000000085],[-80.072509999999909,77.17053199999998],[-80.013335999999924,77.190536000000066],[-79.93582200000003,77.206650000000025],[-79.785278000000005,77.231368999999972],[-79.725829999999917,77.239975000000072],[-79.660277999999948,77.24443100000002],[-79.633057000000008,77.243317000000047],[-79.445540999999992,77.234421000000111],[-79.424163999999905,77.233047000000113],[-79.255004999999983,77.218596999999988],[-79.216949,77.209717000000126],[-79.041945999999882,77.161102000000085],[-79.033066000000019,77.156647000000078],[-79.02806099999998,77.150543000000027],[-79.003890999999953,77.103592000000049],[-79.005004999999926,77.09693900000002],[-79.013335999999924,77.09137000000004],[-79.029723999999987,77.086929000000112],[-79.132492000000013,77.053589000000045],[-79.328888000000006,76.978591999999935],[-79.365554999999915,76.963318000000072],[-79.376663000000008,76.957489000000066],[-79.391387999999949,76.947204999999997],[-79.395003999999915,76.940536000000122],[-79.393065999999976,76.934143000000006],[-79.386948000000018,76.927475000000015],[-79.37222300000002,76.923309000000131],[-79.34584000000001,76.91804500000012],[-79.317504999999926,76.917755000000113],[-79.244445999999925,76.924987999999928],[-79.193053999999904,76.929152999999928],[-79.005843999999911,76.936096000000134],[-78.980835000000013,76.936371000000122],[-78.954178000000013,76.935256999999979],[-78.886123999999995,76.926926000000094],[-78.870834000000002,76.922211000000061],[-78.866394000000014,76.918869000000086],[-78.910004000000015,76.886658000000011],[-78.915282999999988,76.839706000000092],[-78.748336999999935,76.822494999999947],[-78.721938999999963,76.821380999999974],[-78.712218999999948,76.823318000000029],[-78.708053999999947,76.824997000000053],[-78.56361400000003,76.906647000000135],[-78.566101000000003,76.913605000000132],[-78.567504999999983,76.927200000000028],[-78.562774999999874,76.933043999999995],[-78.553878999999938,76.938582999999994],[-78.547775000000001,76.941360000000088],[-78.384444999999914,76.99971000000005],[-78.344161999999926,77.007767000000001],[-78.32028200000002,77.011658000000068],[-78.292770000000019,77.014709000000096],[-78.196944999999971,77.019440000000031],[-78.140838999999914,77.01998900000001],[-78.087219000000005,77.017761000000007],[-78.07028200000002,77.014434999999992],[-77.896666999999979,76.955551000000128],[-77.886947999999961,76.947754000000145],[-77.881103999999993,76.940262000000018],[-77.779448999999943,76.79136699999998],[-77.789443999999946,76.78166200000004],[-77.813323999999966,76.692748999999992],[-77.813613999999973,76.687759000000085],[-77.813048999999864,76.68193100000002],[-77.804992999999968,76.675261999999918],[-77.769454999999937,76.658325000000104],[-77.78443900000002,76.650269000000037],[-77.810271999999941,76.640823000000069],[-77.841110000000015,76.633331000000112],[-77.861663999999905,76.629700000000071],[-77.918335000000013,76.62831100000011],[-77.947219999999959,76.629425000000083],[-77.985000999999954,76.632476999999994],[-78.013625999999988,76.630814000000044],[-78.027495999999985,76.626922999999977],[-78.089721999999995,76.609420999999941],[-78.097777999999948,76.606094000000041],[-78.178328999999962,76.566085999999984],[-78.186110999999926,76.559708000000001],[-78.206107999999972,76.53914600000013],[-78.256667999999934,76.506653000000142],[-78.364440999999999,76.462493999999992],[-78.377486999999917,76.458038000000101],[-78.435103999999967,76.453171000000111],[-78.443328999999892,76.452209000000096],[-78.473052999999993,76.451660000000118],[-78.519164999999987,76.456940000000031],[-78.552490000000034,76.464157000000114],[-78.607772999999952,76.486649000000057],[-78.61471599999993,76.489975000000072],[-78.619445999999982,76.496094000000085],[-78.616942999999992,76.498871000000008],[-78.615004999999883,76.5],[-78.611388999999917,76.49941999999993],[-78.597228999999913,76.505264000000125],[-78.591949,76.5086060000001],[-78.588332999999977,76.513046000000088],[-78.613327000000027,76.547759999999982],[-78.627212999999927,76.563873000000001],[-78.75111400000003,76.572220000000016],[-78.773330999999985,76.572768999999937],[-78.790558000000033,76.571655000000135],[-78.868331999999953,76.521103000000096],[-78.886947999999961,76.497208000000057],[-78.900833000000034,76.478867000000093],[-78.937774999999988,76.449997000000053],[-78.946655000000021,76.444976999999994],[-78.96945199999999,76.43414300000012],[-78.994155999999975,76.424423000000047],[-79.013061999999991,76.420258000000047],[-79.06138599999997,76.41276600000009],[-79.090285999999992,76.411377000000073],[-79.139174999999966,76.411652000000117],[-79.170837000000006,76.409988000000112],[-79.18971299999987,76.405823000000112],[-79.198043999999868,76.400269000000094],[-79.261123999999995,76.352202999999975],[-79.265563999999927,76.346100000000035],[-79.266402999999968,76.339432000000102],[-79.262786999999946,76.331940000000145],[-79.254181000000017,76.320267000000115],[-79.25306699999993,76.314697000000024],[-79.261123999999995,76.309143000000063],[-79.272780999999952,76.304152999999985],[-79.312774999999988,76.297484999999995],[-79.338608000000022,76.296371000000022],[-79.365828999999962,76.296646000000067],[-79.414168999999902,76.301086000000055],[-79.445540999999992,76.306641000000127],[-79.500838999999928,76.314148000000102],[-79.525283999999886,76.31442300000009],[-79.573623999999995,76.311645999999996],[-79.596664000000033,76.308594000000085],[-79.805556999999965,76.278320000000065],[-79.924438000000009,76.25360100000006],[-80.061385999999914,76.226928999999984],[-80.087218999999948,76.223602000000085],[-80.107223999999974,76.2227630000001],[-80.121658000000025,76.224426000000051],[-80.136123999999995,76.228317000000118],[-80.156386999999881,76.23692299999999],[-80.178329000000019,76.239700000000084],[-80.203613000000018,76.240539999999953],[-80.230285999999978,76.239975000000129],[-80.261123999999995,76.238312000000008],[-80.2933349999999,76.235260000000096],[-80.338332999999977,76.228317000000118],[-80.366942999999992,76.218048000000067],[-80.375548999999921,76.213043000000027],[-80.383056999999951,76.20748900000001],[-80.396666999999923,76.202208999999982],[-80.412216000000001,76.198029000000133],[-80.426940999999886,76.195525999999973],[-80.506957999999941,76.196365000000128],[-80.606383999999991,76.191650000000095],[-80.627486999999917,76.187195000000088],[-80.637787000000003,76.17053199999998],[-80.639724999999885,76.167480000000069],[-80.654175000000009,76.162491000000102],[-80.672501000000011,76.158325000000048],[-80.703338999999971,76.156647000000078],[-80.949996999999996,76.144989000000066],[-81.053329000000019,76.128036000000009],[-81.075835999999924,76.129149999999981],[-81.085830999999928,76.134155000000021],[-81.090285999999935,76.137496999999939],[-81.095551,76.212204000000042],[-81.047501000000011,76.249419999999986],[-81.041106999999954,76.25360100000006],[-81.026397999999915,76.258331000000112],[-80.903885000000002,76.312194999999974],[-80.783614999999998,76.374985000000095],[-80.769454999999994,76.384720000000016],[-80.761123999999995,76.394150000000081],[-80.760009999999909,76.40415999999999],[-80.763625999999874,76.411102000000085],[-80.771666999999923,76.419144000000017],[-80.78472899999997,76.423874000000069],[-80.991668999999945,76.483047000000056],[-81.188889000000017,76.518875000000094],[-81.275008999999955,76.533325000000048],[-81.304169000000002,76.510544000000039],[-81.337218999999891,76.494980000000112],[-81.351944000000003,76.490265000000079],[-81.388901000000033,76.481368999999972],[-81.411117999999988,76.477478000000076],[-81.460830999999928,76.471374999999966],[-81.492492999999911,76.469437000000028],[-81.521941999999967,76.468596999999988],[-81.636948000000018,76.468872000000147],[-81.71665999999999,76.470260999999994],[-81.788605000000018,76.474700999999982],[-81.879990000000021,76.483871000000022],[-82.039718999999934,76.509430000000066],[-82.05860899999999,76.513610999999969],[-82.075835999999981,76.518600000000106],[-82.083617999999944,76.523879999999963],[-82.03195199999999,76.553588999999988],[-81.985000999999954,76.578597999999943],[-81.981948999999929,76.584717000000012],[-81.993331999999953,76.590270999999973],[-82.045273000000009,76.603592000000106],[-82.056655999999862,76.609146000000123],[-82.049438000000009,76.612488000000042],[-81.953338999999914,76.631927000000132],[-81.873610999999869,76.645828000000108],[-81.851394999999968,76.649719000000005],[-81.814163000000008,76.658599999999922],[-81.790282999999931,76.667755],[-81.782227000000034,76.672760000000039],[-81.776947000000007,76.677475000000072],[-81.778885000000002,76.681090999999924],[-81.785827999999924,76.685532000000023],[-81.799163999999962,76.685805999999957],[-81.819457999999997,76.682754999999986],[-81.838057999999933,76.678314000000057],[-81.852782999999988,76.673599000000024],[-81.861938000000009,76.669144000000017],[-81.893341000000021,76.660812000000021],[-82.081115999999952,76.631087999999977],[-82.115554999999915,76.628860000000032],[-82.145553999999947,76.628036000000066],[-82.199996999999996,76.628586000000098],[-82.273330999999928,76.633331000000112],[-82.292495999999971,76.635544000000095],[-82.326950000000011,76.641373000000101],[-82.346114999999998,76.645538000000101],[-82.377486999999917,76.657485999999949],[-82.442490000000021,76.684981999999991],[-82.470276000000013,76.698868000000004],[-82.476668999999958,76.704712000000029],[-82.487212999999997,76.717758000000117],[-82.580291999999986,76.776382000000012],[-82.596114999999998,76.782486000000006],[-82.698607999999979,76.812485000000038],[-82.725005999999951,76.819153000000028],[-82.749725000000012,76.818604000000107],[-82.767226999999991,76.813309000000004],[-82.769729999999925,76.811096000000077],[-82.76556399999987,76.808318999999983],[-82.74610899999999,76.804153000000042],[-82.728333000000021,76.799149000000114],[-82.698607999999979,76.788589000000002],[-82.640563999999983,76.766388000000006],[-82.556106999999997,76.723038000000031],[-82.558333999999945,76.718322999999998],[-82.566665999999941,76.707489000000123],[-82.569457999999941,76.701385000000073],[-82.562499999999943,76.688873000000058],[-82.545546999999942,76.674149000000057],[-82.533324999999991,76.666382000000056],[-82.460555999999997,76.636108000000036],[-82.435271999999998,76.628036000000066],[-82.415008999999884,76.62303199999991],[-82.308884000000035,76.609420999999941],[-82.208054000000004,76.593048000000067],[-82.113891999999908,76.572220000000016],[-82.102218999999991,76.568878000000041],[-82.081115999999952,76.561096000000134],[-82.093886999999995,76.557205000000067],[-82.175002999999947,76.546936000000017],[-82.196944999999971,76.542755000000113],[-82.211394999999925,76.53804000000008],[-82.22222899999997,76.532761000000107],[-82.225280999999995,76.526657000000057],[-82.224715999999887,76.520264000000111],[-82.222504000000015,76.514435000000105],[-82.216399999999965,76.5086060000001],[-82.189437999999882,76.486649000000057],[-82.158050999999944,76.466095000000053],[-82.147232000000031,76.461105000000032],[-82.135558999999944,76.453323000000069],[-82.131377999999927,76.448593000000017],[-82.127212999999927,76.441650000000038],[-82.132216999999912,76.436919999999986],[-82.162505999999951,76.421921000000111],[-82.17971799999998,76.416931000000091],[-82.209441999999967,76.409988000000112],[-82.260284000000013,76.398605000000089],[-82.293335000000013,76.395827999999995],[-82.348342999999943,76.395537999999988],[-82.483063000000016,76.396378000000027],[-82.704453000000001,76.386932000000058],[-82.833327999999881,76.397766000000104],[-82.990554999999915,76.426650999999993],[-83.003615999999965,76.429153000000042],[-83.0625,76.450272000000041],[-83.099730999999963,76.463882000000126],[-83.102492999999981,76.469437000000028],[-83.096953999999982,76.475814999999955],[-83.08944699999995,76.480819999999994],[-83.065001999999993,76.491089000000045],[-83.061935000000005,76.497208000000057],[-83.075012000000015,76.532761000000107],[-83.084441999999967,76.546370999999965],[-83.110001000000011,76.579987000000131],[-83.116652999999985,76.586105000000089],[-83.198607999999979,76.619431000000077],[-83.338897999999858,76.66415400000011],[-83.384170999999981,76.730819999999994],[-83.365279999999927,76.740540000000067],[-83.358611999999937,76.746094000000028],[-83.355834999999956,76.752213000000097],[-83.362212999999997,76.756103999999937],[-83.379989999999964,76.758881000000031],[-83.400833000000034,76.759995000000004],[-83.410003999999901,76.757767000000058],[-83.497498000000007,76.723876999999959],[-83.518340999999964,76.713318000000129],[-83.523620999999935,76.706649999999968],[-83.523330999999928,76.700821000000133],[-83.520553999999947,76.695251000000042],[-83.515014999999948,76.689972000000068],[-83.499161000000015,76.676651000000106],[-83.352218999999991,76.612488000000042],[-83.331116000000009,76.603317000000118],[-83.316101000000003,76.598037999999974],[-83.298614999999984,76.593048000000067],[-83.278060999999923,76.588318000000072],[-83.254181000000017,76.579437000000098],[-83.246383999999978,76.572768999999937],[-83.207503999999915,76.505553999999961],[-83.184432999999899,76.424988000000042],[-83.188323999999966,76.419434000000081],[-83.202224999999942,76.414428999999984],[-83.223617999999874,76.410537999999917],[-83.256667999999991,76.407486000000006],[-83.285827999999981,76.406372000000033],[-83.439986999999917,76.411102000000085],[-83.619995000000017,76.423599000000081],[-83.691100999999946,76.428863999999919],[-83.710555999999997,76.433044000000109],[-83.735000999999954,76.444138000000009],[-83.734160999999915,76.449141999999995],[-83.735275000000001,76.455826000000059],[-83.740554999999972,76.462769000000037],[-83.756667999999991,76.468596999999988],[-83.893616000000009,76.501663000000065],[-83.985001000000011,76.520538000000045],[-84.018616000000009,76.529433999999981],[-84.033614999999941,76.534714000000065],[-84.046660999999972,76.542205999999965],[-84.058334000000002,76.553040000000067],[-84.058884000000035,76.558868000000132],[-84.061661000000015,76.585266000000104],[-84.070846999999901,76.616653000000042],[-84.086670000000026,76.62414600000011],[-84.101944000000003,76.629425000000083],[-84.118880999999988,76.633880999999974],[-84.138610999999912,76.637772000000041],[-84.261123999999995,76.65554800000001],[-84.284438999999963,76.657760999999994],[-84.31082200000003,76.658325000000104],[-84.319732999999871,76.656096999999988],[-84.324722000000008,76.653320000000065],[-84.330841000000021,76.647491000000059],[-84.313323999999909,76.641098000000113],[-84.256667999999991,76.628586000000098],[-84.220551,76.622207999999944],[-84.202498999999932,76.617203000000075],[-84.193053999999961,76.609985000000108],[-84.194442999999978,76.606934000000081],[-84.216948999999886,76.571655000000135],[-84.249725000000012,76.536926000000108],[-84.248336999999992,76.530548000000124],[-84.24499499999996,76.524993999999936],[-84.221114999999941,76.510817999999972],[-84.208617999999888,76.505264000000125],[-84.192490000000021,76.49941999999993],[-84.179717999999923,76.49192800000003],[-84.180832000000009,76.484984999999995],[-84.195540999999935,76.45637499999998],[-84.205565999999976,76.451096000000007],[-84.215835999999967,76.448029000000076],[-84.236938000000009,76.443587999999977],[-84.489166000000012,76.429153000000042],[-84.518615999999952,76.427765000000136],[-84.570846999999958,76.428863999999919],[-84.619720000000029,76.431656000000032],[-84.636947999999961,76.434418000000107],[-84.652785999999992,76.438034000000016],[-84.783889999999985,76.469986000000119],[-84.792770000000019,76.474990999999989],[-84.785278000000005,76.485260000000039],[-84.783889999999985,76.489975000000072],[-84.795273000000009,76.503876000000048],[-84.848891999999921,76.53637700000013],[-84.860001000000011,76.542755000000113],[-84.950561999999934,76.577773999999977],[-84.970550999999944,76.581940000000088],[-84.991378999999938,76.582764000000054],[-85.016402999999912,76.578872999999987],[-85.028335999999967,76.57499700000011],[-85.034163999999976,76.569153000000085],[-85.051391999999964,76.514160000000061],[-85.022507000000019,76.456099999999992],[-84.970276000000013,76.426086000000112],[-84.960281000000009,76.42053199999998],[-84.944442999999978,76.416931000000091],[-84.904175000000009,76.411926000000051],[-84.728058000000033,76.390273999999977],[-84.43638599999997,76.338593000000117],[-84.397506999999962,76.330551000000128],[-84.381377999999927,76.324706999999933],[-84.376098999999954,76.317764000000125],[-84.381942999999978,76.31191999999993],[-84.393889999999999,76.308029000000033],[-84.413054999999986,76.304703000000018],[-84.429169000000002,76.303040000000067],[-84.533614999999941,76.30581699999999],[-84.716659999999933,76.306930999999963],[-84.776397999999972,76.303314],[-84.898055999999997,76.288589000000059],[-84.928328999999962,76.286377000000016],[-85.174438000000009,76.280272999999966],[-85.232223999999917,76.295257999999933],[-85.36221299999994,76.303314],[-85.505004999999983,76.321930000000066],[-85.523055999999883,76.326660000000061],[-85.544448999999986,76.329987000000017],[-85.698333999999988,76.34887700000013],[-85.952498999999932,76.368591000000038],[-85.978058000000033,76.370528999999976],[-86.004181000000017,76.37081900000004],[-86.110274999999945,76.368317000000104],[-86.134734999999978,76.369431000000077],[-86.281677000000002,76.376923000000033],[-86.330565999999976,76.3808140000001],[-86.37222300000002,76.38638300000008],[-86.412216000000001,76.40776100000005],[-86.415008999999884,76.41276600000009],[-86.421386999999925,76.456940000000031],[-86.418610000000001,76.469147000000021],[-86.409728999999913,76.474700999999982],[-86.398055999999997,76.478867000000093],[-86.378875999999991,76.483871000000022],[-86.36082499999992,76.487762000000089],[-86.307769999999948,76.49552900000009],[-86.277785999999935,76.5],[-86.256119000000012,76.503876000000048],[-86.22222899999997,76.513321000000133],[-86.213057999999933,76.518600000000106],[-86.20777899999996,76.524429000000112],[-86.211944999999957,76.535262999999986],[-86.226104999999961,76.542755000000113],[-86.532776000000013,76.623306000000014],[-86.594161999999983,76.634994999999947],[-86.63034099999993,76.635132000000112],[-86.625823999999966,76.629425000000083],[-86.601104999999961,76.619979999999998],[-86.512512000000015,76.586929000000055],[-86.36221299999994,76.541655999999932],[-86.342223999999987,76.512206999999933],[-86.508056999999894,76.487762000000089],[-86.64916999999997,76.458878000000141],[-86.664718999999991,76.419708000000014],[-86.711120999999991,76.348037999999974],[-86.71665999999999,76.346100000000035],[-86.770554000000004,76.350815000000068],[-87.083327999999995,76.379424999999912],[-87.130829000000006,76.384155000000135],[-87.148346000000004,76.388321000000076],[-87.154998999999975,76.39498900000001],[-87.154175000000009,76.40109300000006],[-87.225280999999995,76.448029000000076],[-87.426665999999898,76.468596999999988],[-87.462783999999942,76.586929000000055],[-87.468886999999995,76.59165999999999],[-87.520279000000016,76.612488000000042],[-87.53694200000001,76.617477000000008],[-87.563613999999973,76.616379000000109],[-87.580001999999979,76.611374000000069],[-87.583618000000001,76.604980000000012],[-87.598617999999988,76.540817000000004],[-87.595550999999944,76.534149000000014],[-87.553604000000007,76.451096000000007],[-87.545273000000009,76.443587999999977],[-87.53694200000001,76.439147999999989],[-87.516953000000001,76.432479999999998],[-87.500290000000007,76.428863999999919],[-87.455276000000026,76.423874000000069],[-87.429992999999911,76.417755000000056],[-87.402495999999985,76.352768000000026],[-87.416397000000018,76.348037999999974],[-87.591384999999889,76.341094999999996],[-87.648894999999868,76.338043000000084],[-87.719726999999978,76.343048000000124],[-87.742767000000015,76.34637500000008],[-87.760559000000001,76.352202999999975],[-87.788604999999961,76.366378999999995],[-87.817229999999995,76.390549000000021],[-87.864166000000012,76.38998400000014],[-87.900833000000034,76.363037000000077],[-87.916945999999996,76.359711000000004],[-87.948333999999988,76.357758000000103],[-87.997771999999998,76.358322000000044],[-88.351104999999905,76.384995000000004],[-88.389998999999875,76.389708999999982],[-88.42971799999998,76.398041000000148],[-88.434433000000013,76.402205999999978],[-88.391953000000001,76.454163000000108],[-88.371932999999956,76.476089000000059],[-88.355835000000013,76.481093999999928],[-88.348617999999988,76.487198000000149],[-88.349441999999954,76.514435000000105],[-88.356658999999979,76.521103000000096],[-88.442764000000011,76.59165999999999],[-88.515288999999939,76.636108000000036],[-88.509170999999981,76.697478999999987],[-88.488601999999958,76.765274000000034],[-88.479720999999927,76.776932000000045],[-88.476669000000015,76.783324999999991],[-88.474715999999887,76.788879000000009],[-88.474715999999887,76.794983000000002],[-88.477782999999988,76.807755000000043],[-88.485275000000001,76.814422999999977],[-88.494719999999973,76.81721500000009],[-88.518889999999999,76.816086000000098],[-88.541945999999939,76.812758999999971],[-88.554442999999935,76.807479999999998],[-88.557220000000029,76.805817000000104],[-88.701950000000011,76.707489000000123],[-88.683318999999983,76.701935000000105],[-88.649733999999967,76.684143000000063],[-88.591949,76.642761000000007],[-88.584441999999967,76.635818000000029],[-88.495543999999938,76.552199999999971],[-88.489440999999999,76.503326000000015],[-88.496383999999978,76.497208000000057],[-88.571670999999924,76.473602000000028],[-88.593558999999971,76.455933000000016],[-88.60321799999997,76.449265000000025],[-88.608214999999973,76.442261000000144],[-88.607727000000011,76.439095000000009],[-88.608611999999994,76.416092000000106],[-88.59973100000002,76.409988000000112],[-88.597503999999958,76.405823000000112],[-88.608046999999942,76.399994000000049],[-88.631942999999922,76.397217000000012],[-88.656386999999881,76.398330999999985],[-88.67721599999993,76.401932000000045],[-88.689986999999974,76.408324999999991],[-88.693603999999993,76.414703000000145],[-88.693329000000006,76.420821999999987],[-88.684998000000007,76.432479999999998],[-88.678054999999972,76.441650000000038],[-88.659508000000017,76.478706000000102],[-88.646506999999986,76.489212000000009],[-88.640288999999996,76.558594000000028],[-88.644164999999987,76.565262000000018],[-88.651672000000019,76.571930000000009],[-88.660277999999948,76.577773999999977],[-88.688888999999961,76.591369999999984],[-88.710006999999962,76.594986000000006],[-88.733611999999937,76.593872000000033],[-88.740828999999962,76.587769000000094],[-88.791381999999942,76.513321000000133],[-88.795273000000009,76.479431000000034],[-88.786666999999909,76.473602000000028],[-88.781386999999938,76.466385000000059],[-88.783324999999991,76.460815000000025],[-88.799438000000009,76.449997000000053],[-88.901671999999962,76.408324999999991],[-88.921111999999937,76.40525800000006],[-88.947220000000016,76.40525800000006],[-88.994155999999919,76.409149000000127],[-89.166396999999961,76.424423000000047],[-89.213332999999977,76.429703000000075],[-89.231673999999998,76.433593999999971],[-89.353333000000021,76.479979999999955],[-89.407227000000034,76.515823000000012],[-89.490279999999927,76.557480000000055],[-89.499435000000005,76.54664600000001],[-89.515015000000005,76.541655999999932],[-89.541381999999999,76.541655999999932],[-89.667220999999984,76.564423000000033],[-89.676665999999955,76.567215000000147],[-89.679442999999992,76.571655000000135],[-89.614166000000012,76.616089000000102],[-89.603607000000011,76.621918000000107],[-89.571945000000028,76.631653000000028],[-89.528335999999967,76.640823000000069],[-89.480559999999969,76.649428999999998],[-89.443329000000006,76.658325000000104],[-89.431380999999988,76.663605000000018],[-89.415558000000033,76.67442299999999],[-89.411666999999966,76.680266999999958],[-89.434432999999899,76.724426000000108],[-89.47222899999997,76.784714000000008],[-89.496947999999918,76.820267000000001],[-89.514449999999954,76.835815000000025],[-89.529175000000009,76.847214000000122],[-89.533324999999991,76.853592000000049],[-89.521392999999932,76.858871000000079],[-89.417770000000019,76.886658000000011],[-89.279449,76.906936999999971],[-89.238892000000021,76.916091999999992],[-89.14805599999994,76.925537000000077],[-88.986938000000009,76.954436999999928],[-88.976104999999961,76.959991000000116],[-88.898894999999982,76.985535000000141],[-88.769164999999987,76.998871000000065],[-88.740279999999927,77.00277699999998],[-88.719451999999933,77.007492000000013],[-88.702788999999939,77.012207000000046],[-88.50111400000003,77.071655000000078],[-88.473327999999981,77.096649000000014],[-88.544723999999917,77.098038000000031],[-88.545837000000006,77.100266000000147],[-88.426392000000021,77.12081900000004],[-88.307219999999973,77.128860000000088],[-88.278335999999911,77.129699999999957],[-88.172501000000011,77.128035999999952],[-88.154175000000009,77.116088999999988],[-87.967223999999931,77.127472000000012],[-87.690552000000025,77.135268999999994],[-87.670272999999952,77.133606000000043],[-87.656951999999933,77.130264000000125],[-87.642501999999979,77.124984999999924],[-87.626937999999996,77.117477000000122],[-87.619719999999973,77.110809000000131],[-87.568892999999889,77.099426000000108],[-87.455841000000021,77.101929000000098],[-87.349166999999966,77.106094000000098],[-87.337783999999886,77.110259999999982],[-87.353607000000011,77.114700000000028],[-87.37222300000002,77.117203000000018],[-87.451401000000033,77.122756999999979],[-87.460555999999997,77.125534000000073],[-87.456664999999987,77.131927000000019],[-87.452224999999999,77.136383000000137],[-87.432219999999973,77.149719000000061],[-87.416107000000011,77.156647000000078],[-87.404174999999896,77.160812000000078],[-87.356383999999991,77.17553700000002],[-87.33666999999997,77.179153000000099],[-87.312774999999988,77.180817000000104],[-87.069167999999991,77.182755000000043],[-87.044448999999929,77.180542000000059],[-86.959166999999979,77.161926000000051],[-86.951674999999966,77.158324999999991],[-86.946945000000028,77.154433999999924],[-86.951949999999897,77.149994000000106],[-86.951401000000033,77.144714000000022],[-86.942490000000021,77.141936999999928],[-86.875274999999931,77.132202000000063],[-86.829177999999956,77.127762000000018],[-86.804442999999992,77.127197000000024],[-86.791381999999999,77.130813999999987],[-86.739990000000034,77.174149000000114],[-86.773620999999935,77.185806000000071],[-86.960006999999962,77.195815999999979],[-87.15055799999999,77.199417000000039],[-87.148055999999997,77.198029000000133],[-87.146956999999929,77.195815999999979],[-87.161117999999931,77.194426999999962],[-87.182769999999948,77.196930000000123],[-87.196105999999929,77.199997000000053],[-87.21055599999994,77.205261000000064],[-87.174437999999896,77.229431000000034],[-87.166945999999939,77.233871000000079],[-87.141388000000006,77.238037000000134],[-87.007232999999985,77.255829000000006],[-86.976669000000015,77.257492000000127],[-86.948882999999967,77.255554000000018],[-86.928329000000019,77.255264000000011],[-86.910552999999936,77.260269000000051],[-86.919158999999979,77.266098000000056],[-86.947494999999947,77.271652000000074],[-86.984436000000017,77.274703999999986],[-87.012221999999952,77.274993999999992],[-87.078063999999927,77.273604999999975],[-87.106110000000001,77.272217000000069],[-87.136672999999973,77.272217000000069],[-87.183884000000035,77.273604999999975],[-87.197495000000004,77.27526899999998],[-87.229171999999949,77.285538000000031],[-87.245270000000005,77.298325000000034],[-87.24888599999997,77.303314],[-87.108611999999994,77.338318000000072],[-87.09584000000001,77.34027100000003],[-87.068618999999956,77.342209000000139],[-87.037780999999995,77.342209000000139],[-86.962783999999942,77.339157000000057],[-86.934722999999963,77.338882000000012],[-86.900283999999999,77.342209000000139],[-86.845839999999953,77.349152000000117],[-86.829726999999991,77.353043000000014],[-86.838608000000022,77.357483000000059],[-86.851944000000003,77.360535000000141],[-86.963332999999977,77.366378999999995],[-87.064162999999951,77.366928000000087],[-87.091109999999958,77.366378999999995],[-87.241378999999938,77.356094000000041],[-87.263061999999877,77.351654000000053],[-87.280838000000017,77.34693900000002],[-87.294158999999979,77.34165999999999],[-87.326110999999969,77.333878000000084],[-87.358886999999982,77.331375000000094],[-87.391112999999962,77.330551000000128],[-87.416397000000018,77.330826000000116],[-87.695830999999998,77.35554500000012],[-87.711945000000014,77.359985000000108],[-87.715835999999911,77.363312000000064],[-87.775283999999999,77.415543000000127],[-87.780288999999982,77.421097000000145],[-87.78472899999997,77.429703000000075],[-87.775009000000011,77.441360000000032],[-87.748336999999992,77.451660000000118],[-87.730834999999956,77.45637499999998],[-87.669539999999984,77.469238000000018],[-87.65194699999995,77.474990999999989],[-87.642501999999979,77.480270000000132],[-87.646117999999944,77.486923000000104],[-87.694442999999978,77.537201000000096],[-87.711120999999878,77.541656000000103],[-87.868880999999988,77.578598000000113],[-88.063048999999978,77.618866000000025],[-88.162216000000001,77.626923000000147],[-88.180556999999965,77.631927000000132],[-88.200835999999924,77.642761000000007],[-88.214721999999995,77.650542999999971],[-88.223617999999931,77.662490999999989],[-88.223052999999993,77.667206000000022],[-88.221114999999884,77.672760000000039],[-88.162780999999995,77.758330999999998],[-88.06806899999998,77.820267000000001],[-87.835830999999928,77.840271000000087],[-87.640563999999983,77.862487999999985],[-87.294723999999917,77.898041000000035],[-87.231383999999935,77.898880000000133],[-87.174712999999997,77.897491000000002],[-86.876099000000011,77.8836060000001],[-86.824172999999917,77.879424999999969],[-86.651671999999962,77.860260000000039],[-86.46166999999997,77.836105000000032],[-86.422225999999966,77.830826000000059],[-86.377486999999917,77.822769000000051],[-86.222778000000005,77.794434000000024],[-86.198883000000023,77.786102000000085],[-85.986938000000009,77.711380000000133],[-85.975280999999882,77.705825999999945],[-85.884445000000028,77.632751000000098],[-85.718886999999995,77.472214000000065],[-85.715835999999967,77.467209000000025],[-85.717223999999931,77.462493999999992],[-85.727218999999877,77.451934999999935],[-85.748610999999983,77.446930000000066],[-85.76916499999993,77.443587999999977],[-85.775832999999921,77.439972000000068],[-85.795837000000006,77.423874000000069],[-85.794448999999929,77.419708000000128],[-85.776947000000007,77.421371000000079],[-85.551391999999964,77.458328000000108],[-85.530562999999916,77.461928999999941],[-85.493331999999953,77.430267000000015],[-85.436385999999914,77.404159999999933],[-85.39973399999991,77.395827999999995],[-85.376662999999894,77.392487000000131],[-85.299438000000009,77.387772000000098],[-85.270003999999915,77.386658000000125],[-85.155838000000017,77.387497000000053],[-84.973327999999867,77.377197000000137],[-84.954726999999934,77.374420000000043],[-84.9375,77.370818999999983],[-84.875274999999988,77.351654000000053],[-84.825286999999946,77.334152000000017],[-84.759170999999867,77.318328999999949],[-84.719727000000034,77.311645999999996],[-84.649444999999957,77.304428000000144],[-84.601944000000003,77.300537000000077],[-84.529175000000009,77.295822000000044],[-84.479445999999996,77.294434000000138],[-84.466399999999965,77.296371000000022],[-84.463333000000034,77.300262000000089],[-84.47444200000001,77.3119200000001],[-84.481948999999986,77.317764000000125],[-84.494719999999973,77.321106000000043],[-84.520279000000016,77.324157999999954],[-84.553878999999995,77.331375000000094],[-84.569167999999991,77.339705999999978],[-84.615004999999996,77.383040999999992],[-84.612777999999878,77.389160000000004],[-84.603881999999942,77.393599999999992],[-84.58555599999994,77.398041000000092],[-84.550277999999935,77.401382000000126],[-84.520844000000011,77.401657],[-84.49610899999999,77.399428999999998],[-84.470550999999944,77.396378000000027],[-84.429442999999935,77.388884999999959],[-84.386397999999986,77.383881000000031],[-84.33444199999991,77.383040999999992],[-84.27027899999996,77.384995000000004],[-84.153609999999958,77.39498900000001],[-84.061661000000015,77.398605000000032],[-84.005843999999968,77.397491000000059],[-83.985275000000001,77.395537999999931],[-83.949996999999996,77.388884999999959],[-83.868057000000022,77.376923000000033],[-83.793610000000001,77.36914100000007],[-83.531951999999933,77.346375000000023],[-83.505843999999968,77.344711000000018],[-83.478058000000033,77.344147000000078],[-83.464721999999995,77.348327999999981],[-83.463057999999876,77.349152000000117],[-83.46444699999995,77.35554500000012],[-83.472504000000015,77.387207000000046],[-83.553054999999972,77.393051000000071],[-83.654998999999975,77.395537999999931],[-83.711669999999913,77.404709000000082],[-83.728607000000011,77.408324999999934],[-83.778609999999958,77.423309000000017],[-83.822509999999966,77.442474000000004],[-83.833892999999989,77.448868000000004],[-83.835555999999997,77.455261000000007],[-83.824722000000008,77.460541000000035],[-83.801391999999964,77.464706000000035],[-83.768065999999919,77.466934000000037],[-83.682220000000029,77.46804800000001],[-83.620833999999945,77.471924000000058],[-83.593886999999938,77.475540000000137],[-83.426102000000014,77.499710000000107],[-83.389450000000011,77.507767000000115],[-83.36332699999997,77.518051000000128],[-83.216110000000015,77.577773999999977],[-83.011123999999995,77.665817000000004],[-82.895003999999858,77.717484000000013],[-82.674438000000009,77.836928999999998],[-82.655272999999852,77.847763000000043],[-82.541671999999949,77.920532000000037],[-82.526107999999965,77.961929000000055],[-82.577224999999999,78.003326000000072],[-82.590835999999967,78.011108000000036],[-82.591675000000009,78.017487000000074],[-82.579726999999878,78.022766000000047],[-82.56361400000003,78.027771000000087],[-82.538054999999986,78.031096999999988],[-82.497498000000007,78.03414900000007],[-82.470551,78.034714000000122],[-82.40972899999997,78.03414900000007],[-82.377486999999917,78.035812000000021],[-82.369445999999925,78.039428999999927],[-82.326110999999969,78.065262000000075],[-82.318619000000012,78.070831000000055],[-82.320007000000032,78.075821000000133],[-82.336120999999991,78.078873000000044],[-82.518341000000021,78.074158000000011],[-82.549438000000009,78.071930000000066],[-82.652221999999995,78.056090999999924],[-82.672500999999954,78.051651000000106],[-82.692489999999964,78.044983000000116],[-82.780288999999982,78.014999000000103],[-82.790282999999988,78.010544000000095],[-82.792769999999905,78.005829000000062],[-82.794158999999979,77.994979999999998],[-82.785277999999948,77.969986000000006],[-82.775283999999942,77.964157],[-82.735275000000001,77.947479000000101],[-82.728881999999942,77.939972000000012],[-82.728607000000011,77.929703000000131],[-82.736114999999984,77.924148999999943],[-82.769164999999987,77.914993000000038],[-82.852218999999991,77.896942000000024],[-82.949157999999898,77.874694999999974],[-83.123046999999929,77.780548000000067],[-83.156661999999926,77.744980000000055],[-83.185546999999985,77.716385000000002],[-83.192489999999964,77.710540999999978],[-83.200835999999867,77.705551000000128],[-83.386672999999917,77.616653000000042],[-83.427215999999987,77.600815000000011],[-83.527785999999935,77.572769000000108],[-83.648055999999997,77.540816999999947],[-83.735000999999954,77.518875000000094],[-83.873046999999985,77.49331699999999],[-83.898345999999947,77.490540000000067],[-83.920546999999942,77.491652999999985],[-84.143889999999999,77.509430000000009],[-84.192490000000021,77.515549000000078],[-84.229995999999971,77.521378000000084],[-84.386672999999917,77.528594999999996],[-84.419997999999964,77.52777100000003],[-84.452224999999942,77.524994000000106],[-84.483321999999987,77.521652000000017],[-84.500564999999995,77.518051000000128],[-84.555557000000022,77.51249700000011],[-84.579726999999991,77.51249700000011],[-84.760558999999944,77.519714000000079],[-84.779174999999952,77.522490999999945],[-84.858886999999925,77.542755000000113],[-84.869155999999975,77.562759000000028],[-84.87110899999999,77.569153000000085],[-84.866393999999957,77.574158000000125],[-84.837219000000005,77.583878000000027],[-84.815552000000025,77.588881999999955],[-84.773620999999991,77.5977630000001],[-84.707229999999981,77.609985000000052],[-84.665282999999988,77.618866000000025],[-84.627486999999917,77.628036000000066],[-84.520003999999972,77.664703000000031],[-84.441939999999931,77.706100000000106],[-84.429992999999968,77.718322999999941],[-84.428328999999962,77.722762999999986],[-84.431106999999884,77.726379000000009],[-84.443054000000018,77.736374000000126],[-84.486938000000009,77.750275000000101],[-84.495270000000005,77.751099000000067],[-84.503066999999987,77.74971000000005],[-84.48971599999993,77.746368000000132],[-84.483062999999959,77.74470500000001],[-84.475280999999995,77.738876000000005],[-84.476669000000015,77.728316999999947],[-84.486388999999974,77.711380000000133],[-84.499161000000015,77.699707000000103],[-84.520844000000011,77.689148000000102],[-84.533889999999985,77.684981999999991],[-84.547226000000023,77.68081699999999],[-84.715012000000002,77.639709000000096],[-84.922501000000011,77.601653999999996],[-84.952498999999989,77.601379000000122],[-84.972503999999901,77.606369000000029],[-85.158339999999896,77.641663000000108],[-85.298889000000031,77.660538000000031],[-85.310546999999985,77.664703000000031],[-85.348891999999921,77.72886699999998],[-85.348891999999921,77.733871000000136],[-85.335830999999985,77.738037000000077],[-85.190276999999867,77.779984000000127],[-85.054992999999968,77.79693600000013],[-85.05360399999995,77.830551000000014],[-85.144164999999987,77.817490000000078],[-85.297775000000001,77.797211000000118],[-85.328063999999927,77.79832499999992],[-85.381942999999978,77.807754999999986],[-85.400283999999942,77.813309000000004],[-85.402495999999928,77.819991999999957],[-85.400283999999942,77.83638000000002],[-85.389724999999999,77.841934000000037],[-85.353333000000021,77.855545000000006],[-85.325012000000015,77.866089000000045],[-85.281386999999995,77.87441999999993],[-85.231948999999986,77.881653000000142],[-85.207778999999903,77.883881000000088],[-84.925551999999982,77.891098],[-84.837219000000005,77.887496999999939],[-84.692490000000021,77.898604999999975],[-84.664444000000003,77.902206000000035],[-84.611114999999927,77.90387000000004],[-84.498154,77.900116000000082],[-84.428878999999995,77.896942000000024],[-84.385833999999932,77.891098],[-84.368056999999908,77.887206999999933],[-84.342772999999909,77.88499500000006],[-84.318618999999956,77.886932000000115],[-84.31361400000003,77.891936999999984],[-84.325012000000015,77.896103000000039],[-84.379715000000033,77.90637200000009],[-84.401671999999962,77.910262999999986],[-84.559432999999956,77.92303499999997],[-84.575561999999991,77.923874000000126],[-84.634444999999914,77.926926000000037],[-84.663054999999929,77.925262000000032],[-84.816665999999941,77.911652000000004],[-84.847228999999913,77.90887500000008],[-85.056945999999982,77.900543000000084],[-85.166396999999961,77.902206000000035],[-85.200561999999991,77.901657000000057],[-85.267501999999922,77.898041000000035],[-85.303604000000007,77.894714000000079],[-85.331680000000006,77.890823000000012],[-85.378051999999968,77.882202000000063],[-85.423049999999989,77.874694999999974],[-85.474715999999944,77.868591000000094],[-85.515288999999996,77.8836060000001],[-85.678878999999938,77.929428000000144],[-85.67971799999998,77.936645999999939],[-85.675277999999992,77.941650000000095],[-85.660278000000005,77.946639999999945],[-85.450561999999991,77.991089000000102],[-85.28694200000001,78.021652000000074],[-85.065551999999911,78.056366000000139],[-85.038894999999911,78.057205000000124],[-85.009734999999921,78.055251999999996],[-84.963057999999933,78.04414399999996],[-84.884170999999924,78.033051],[-84.816955999999948,78.026382000000126],[-84.788054999999986,78.024155000000064],[-84.761672999999917,78.023605000000032],[-84.726943999999946,78.025817999999958],[-84.708892999999989,78.029434000000037],[-84.695540999999935,78.033599999999922],[-84.688888999999961,78.03915400000011],[-84.673888999999974,78.04414399999996],[-84.654175000000009,78.048874000000012],[-84.575561999999991,78.067215000000033],[-84.547501000000011,78.0711060000001],[-84.524444999999901,78.072220000000073],[-84.360001000000011,78.070267000000115],[-84.328612999999905,78.070541000000048],[-84.307219999999973,78.07249500000006],[-84.288054999999929,78.075546000000088],[-84.292769999999962,78.078049000000078],[-84.299438000000009,78.079712000000029],[-84.323623999999938,78.082764000000111],[-84.410003999999958,78.086929000000112],[-84.532775999999899,78.085541000000035],[-84.557220000000029,78.083603000000096],[-84.623046999999985,78.071381000000088],[-84.673614999999984,78.064148000000102],[-84.736937999999896,78.058319000000097],[-84.765563999999983,78.056366000000139],[-84.798888999999974,78.055251999999996],[-84.855835000000013,78.056930999999963],[-84.881942999999978,78.059143000000063],[-84.993880999999988,78.074158000000011],[-85.077498999999932,78.090820000000008],[-85.094451999999933,78.097487999999998],[-85.087783999999886,78.103317000000004],[-84.994994999999903,78.163040000000024],[-84.901947000000007,78.170821999999987],[-84.829452999999944,78.168869000000029],[-84.793883999999991,78.171096999999975],[-84.761123999999995,78.174423000000047],[-84.708617999999944,78.182479999999998],[-84.688598999999954,78.187195000000031],[-84.657775999999956,78.19720500000011],[-84.63110399999988,78.199997000000053],[-84.549437999999952,78.19720500000011],[-84.430557000000022,78.186371000000065],[-84.315551999999968,78.173599000000081],[-84.284164000000033,78.166381999999942],[-84.222778000000005,78.158875000000023],[-84.201110999999969,78.156937000000084],[-84.173889000000031,78.15776100000005],[-84.127776999999924,78.171096999999975],[-84.126662999999951,78.179977000000008],[-84.453612999999962,78.214706000000092],[-84.479720999999927,78.216934000000037],[-84.506667999999934,78.217758000000003],[-84.693603999999993,78.217209000000082],[-84.722504000000015,78.216934000000037],[-84.777495999999871,78.210266000000047],[-84.877212999999927,78.193039000000056],[-84.909728999999857,78.191086000000098],[-84.937774999999931,78.192474000000004],[-84.951400999999976,78.195525999999916],[-84.968613000000005,78.202484000000084],[-84.973891999999978,78.208602999999982],[-84.970276000000013,78.214157000000114],[-84.967223999999931,78.21804800000001],[-84.956116000000009,78.232208000000128],[-84.942764000000011,78.243866000000139],[-84.83444199999991,78.314987000000031],[-84.815276999999924,78.321654999999964],[-84.792496000000028,78.32499700000011],[-84.731383999999991,78.325546000000031],[-84.658614999999998,78.329437000000098],[-84.629715000000033,78.333327999999995],[-84.605270000000019,78.337494000000106],[-84.585281000000009,78.341934000000094],[-84.575561999999991,78.346375000000023],[-84.572784000000013,78.350540000000024],[-84.571944999999971,78.355545000000063],[-84.575835999999924,78.361374000000069],[-84.581679999999949,78.366089000000102],[-84.601944000000003,78.368866000000025],[-84.630828999999949,78.364990000000148],[-84.667769999999962,78.348602000000085],[-84.684722999999963,78.344147000000078],[-84.707229999999981,78.341094999999939],[-84.735001000000011,78.340270999999973],[-84.772231999999974,78.342209000000139],[-84.815552000000025,78.349152000000117],[-84.866942999999992,78.36914100000007],[-84.865829000000019,78.372207999999944],[-84.785278000000005,78.501663000000065],[-84.782501000000025,78.505829000000119],[-84.774718999999948,78.509154999999964],[-84.759170999999867,78.514160000000061],[-84.738602000000014,78.518875000000094],[-84.724166999999966,78.524429000000055],[-84.704452999999944,78.534988000000112],[-84.625823999999966,78.584152000000074],[-84.619445999999925,78.588318000000015],[-84.61999499999996,78.590546000000131],[-84.638610999999969,78.594147000000021],[-84.661117999999988,78.59248400000007],[-84.675277999999992,78.588318000000015],[-84.838332999999977,78.516662999999994],[-84.846389999999928,78.511658000000125],[-84.978333000000021,78.414993000000095],[-84.974715999999944,78.358871000000136],[-84.970550999999944,78.353317000000118],[-84.964721999999938,78.348602000000085],[-84.961945000000014,78.343597000000045],[-84.96665999999999,78.338882000000012],[-85.043335000000013,78.299149],[-85.188048999999978,78.228317000000061],[-85.418335000000013,78.118866000000082],[-85.433318999999983,78.113876000000005],[-85.450835999999924,78.109984999999938],[-85.486114999999927,78.102478000000019],[-85.508057000000008,78.099152000000004],[-85.523055999999883,78.099426000000108],[-85.528060999999923,78.101929000000098],[-85.608886999999982,78.100815000000068],[-85.740829000000019,78.093048000000124],[-85.80471799999998,78.088882000000069],[-85.876662999999951,78.08166499999993],[-85.894164999999987,78.078049000000078],[-86.010283999999956,78.066086000000041],[-86.119995000000017,78.056366000000139],[-86.148345999999947,78.054703000000018],[-86.178054999999972,78.054977000000122],[-86.223327999999981,78.057480000000112],[-86.267226999999991,78.066376000000048],[-86.282227000000034,78.071655000000021],[-86.288329999999974,78.076385000000073],[-86.291381999999999,78.081375000000094],[-86.290558000000033,78.085815000000139],[-86.25140399999998,78.156647000000078],[-86.234160999999972,78.160537999999974],[-86.135558999999944,78.165543000000014],[-86.113051999999868,78.17053199999998],[-86.098052999999993,78.17553700000002],[-85.949996999999996,78.228317000000061],[-85.93110699999994,78.236649000000057],[-85.839995999999985,78.325821000000076],[-85.835281000000009,78.332214000000022],[-85.827224999999942,78.344147000000078],[-85.825561999999934,78.348602000000085],[-85.833068999999966,78.379974000000004],[-85.853333000000021,78.379150000000038],[-85.878051999999968,78.376922999999977],[-86.052779999999984,78.297484999999995],[-86.060271999999998,78.292480000000126],[-86.060546999999929,78.280548000000124],[-86.06527699999998,78.263610999999969],[-86.073623999999938,78.24859600000002],[-86.259170999999924,78.196365000000071],[-86.285277999999948,78.193314000000044],[-86.311110999999983,78.193314000000044],[-86.453613000000018,78.211928999999998],[-86.476668999999958,78.215820000000065],[-86.497771999999941,78.215546000000131],[-86.515014999999948,78.211655000000064],[-86.537215999999944,78.19470199999995],[-86.548888999999974,78.183044000000109],[-86.569457999999941,78.172210999999947],[-86.719726999999978,78.121917999999994],[-86.736938000000009,78.118042000000116],[-86.763061999999991,78.114990000000034],[-87.079726999999934,78.102768000000026],[-87.10943599999996,78.103043000000071],[-87.196654999999964,78.106094000000098],[-87.439712999999983,78.121643000000006],[-87.505843999999911,78.12831099999994],[-87.529174999999952,78.132202000000007],[-87.538605000000018,78.138046000000031],[-87.535003999999958,78.143051000000071],[-87.526671999999962,78.149155000000121],[-87.483886999999925,78.164429000000041],[-87.430556999999965,78.178314000000114],[-87.407501000000025,78.183044000000109],[-87.352218999999991,78.191086000000098],[-87.314163000000008,78.193863000000022],[-87.289992999999981,78.19470199999995],[-87.166945999999939,78.195525999999916],[-87.104996000000028,78.199141999999995],[-87.08944699999995,78.201934999999992],[-87.087219000000005,78.206099999999992],[-87.105835000000013,78.209427000000119],[-87.262222000000008,78.22665400000011],[-87.293609999999944,78.226089000000115],[-87.363892000000021,78.221099999999922],[-87.371657999999968,78.219437000000028],[-87.396118000000001,78.217209000000082],[-87.423049999999932,78.216095000000053],[-87.475554999999872,78.216385000000116],[-87.497771999999941,78.219711000000132],[-87.513335999999924,78.224990999999989],[-87.518616000000009,78.230545000000006],[-87.516953000000001,78.24136400000009],[-87.516113000000018,78.245819000000097],[-87.494445999999982,78.298598999999967],[-87.502501999999879,78.30525200000011],[-87.513061999999991,78.316375999999991],[-87.516402999999968,78.322768999999937],[-87.52555799999999,78.410263000000043],[-87.524718999999948,78.416382000000112],[-87.517226999999991,78.426376000000118],[-87.503066999999987,78.436646000000053],[-87.476943999999946,78.44802900000002],[-87.311385999999914,78.509154999999964],[-87.292220999999927,78.513885000000016],[-87.15834000000001,78.546371000000136],[-87.140563999999983,78.550262000000032],[-87.013061999999991,78.554153000000099],[-86.891112999999962,78.54553199999998],[-86.866394000000014,78.546371000000136],[-86.858336999999949,78.547760000000096],[-86.855834999999956,78.551650999999993],[-86.858886999999982,78.566375999999934],[-86.864440999999999,78.568878000000041],[-86.877776999999924,78.573044000000095],[-86.898620999999991,78.575821000000019],[-86.957779000000016,78.574997000000053],[-87.031676999999945,78.569153000000028],[-87.066101000000003,78.567490000000134],[-87.095275999999956,78.568604000000107],[-87.113051999999925,78.573044000000095],[-87.121658000000025,78.576934999999992],[-87.12388599999997,78.581099999999992],[-87.122498000000007,78.587204000000042],[-86.944716999999969,78.704711999999972],[-86.934432999999956,78.709991000000116],[-86.922501000000011,78.714705999999978],[-86.856948999999929,78.734985000000108],[-86.638901000000033,78.79942299999999],[-86.615829000000019,78.803040000000124],[-86.377212999999983,78.809982000000048],[-86.138061999999991,78.816666000000112],[-86.067504999999983,78.819716999999912],[-86.037215999999944,78.821380999999974],[-85.646666999999866,78.848602000000142],[-85.607497999999964,78.85165400000011],[-85.577498999999932,78.855819999999994],[-85.350280999999995,78.88749700000011],[-85.329726999999934,78.892211999999972],[-85.297500999999954,78.902205999999978],[-85.257507000000032,78.910537999999974],[-85.09973100000002,78.917755000000056],[-85.064163000000008,78.919144000000074],[-85.036117999999988,78.91693099999992],[-85.008895999999993,78.913315000000068],[-84.84584000000001,78.888885000000016],[-84.788329999999917,78.878035999999952],[-84.766402999999968,78.873032000000023],[-84.740554999999915,78.869980000000112],[-84.712783999999942,78.86775200000011],[-84.563323999999966,78.859984999999995],[-84.412216000000001,78.85554499999995],[-84.212783999999886,78.856934000000138],[-84.145003999999972,78.85554499999995],[-83.850829999999974,78.845261000000107],[-83.746947999999918,78.836928999999941],[-83.694442999999978,78.829712000000029],[-83.674437999999952,78.825546000000145],[-83.660004000000015,78.819992000000127],[-83.64056399999987,78.813873000000115],[-83.601944000000003,78.802200000000084],[-83.579726999999934,78.796371000000079],[-83.538329999999917,78.787201000000039],[-83.513061999999991,78.783874999999966],[-83.485824999999977,78.781372000000033],[-83.428604000000007,78.779159999999933],[-83.394164999999987,78.778870000000097],[-83.34584000000001,78.773605000000032],[-83.327498999999932,78.769713999999965],[-83.308334000000002,78.76388500000013],[-83.293610000000001,78.756104000000107],[-83.284926999999925,78.750000000000057],[-83.236938000000009,78.74054000000001],[-83.101394999999968,78.714432000000045],[-82.994720000000029,78.699707000000103],[-82.941939999999988,78.695526000000029],[-82.910827999999981,78.694702000000063],[-82.845000999999968,78.697478999999987],[-82.822509999999966,78.695250999999985],[-82.689712999999983,78.664154000000053],[-82.69638099999986,78.657761000000107],[-82.704453000000001,78.651932000000102],[-82.695540999999992,78.645264000000111],[-82.610549999999932,78.611374000000012],[-82.506957999999997,78.591095000000109],[-82.417220999999927,78.574158000000068],[-82.37388599999997,78.568604000000107],[-82.357497999999907,78.567490000000134],[-82.337783999999999,78.566665999999941],[-82.308334000000002,78.568878000000041],[-82.262222000000008,78.578048999999965],[-82.236938000000009,78.588318000000015],[-82.235549999999932,78.595825000000104],[-82.244719999999973,78.598877000000073],[-82.310271999999941,78.616653000000042],[-82.416655999999989,78.64276099999995],[-82.496384000000035,78.661926000000108],[-82.516953000000001,78.666930999999977],[-82.535278000000005,78.672759999999982],[-82.559433000000013,78.682205000000067],[-82.565552000000025,78.685256999999979],[-82.584732000000031,78.695526000000029],[-82.59445199999999,78.703049000000021],[-82.581954999999994,78.708327999999995],[-82.569167999999991,78.711380000000133],[-82.45666499999993,78.730820000000108],[-82.435546999999929,78.731659000000093],[-82.407775999999956,78.730820000000108],[-82.350554999999986,78.726089000000002],[-82.279723999999987,78.71775800000006],[-82.255279999999914,78.71665999999999],[-82.230835000000013,78.71775800000006],[-82.223327999999981,78.719711000000018],[-82.215011999999888,78.723037999999974],[-82.220550999999887,78.732208000000014],[-82.231948999999986,78.736374000000126],[-82.254729999999995,78.740814000000114],[-82.279175000000009,78.74414100000007],[-82.310821999999973,78.746933000000126],[-82.396392999999932,78.74914600000011],[-82.45666499999993,78.74914600000011],[-82.480835000000013,78.748322000000144],[-82.506119000000012,78.745818999999983],[-82.525557999999933,78.742203000000131],[-82.542770000000019,78.737198000000092],[-82.564437999999996,78.732758000000047],[-82.619155999999975,78.728043000000014],[-82.663619999999923,78.728043000000014],[-82.752501999999936,78.729705999999965],[-82.781386999999995,78.731094000000041],[-82.809722999999963,78.734146000000123],[-82.826950000000011,78.737488000000099],[-82.84333799999996,78.742203000000131],[-82.911666999999909,78.76638800000012],[-83.069732999999928,78.792206000000078],[-83.108611999999994,78.796646000000067],[-83.21055599999994,78.798874000000069],[-83.228607000000011,78.804153000000042],[-83.255844000000025,78.829987000000074],[-83.254729999999995,78.834991000000002],[-83.244445999999925,78.839432000000102],[-83.218337999999903,78.843597000000102],[-83.1875,78.847214000000065],[-83.085830999999985,78.85554499999995],[-83.056945999999925,78.856094000000098],[-82.991669000000002,78.85554499999995],[-82.811110999999983,78.848038000000031],[-82.67582699999997,78.842209000000025],[-82.65055799999999,78.838882000000069],[-82.621384000000035,78.837493999999992],[-82.462783999999942,78.833328000000108],[-82.429442999999992,78.833328000000108],[-82.289718999999991,78.837203999999986],[-82.254455999999948,78.840546000000074],[-82.112777999999992,78.857483000000116],[-82.079452999999944,78.859711000000061],[-81.947495000000004,78.865814],[-81.913894999999911,78.865814],[-81.764174999999966,78.859984999999995],[-81.749434999999949,78.858032000000037],[-81.740554999999915,78.855254999999943],[-81.767226999999991,78.853317000000004],[-81.824447999999961,78.853867000000037],[-81.838607999999965,78.851379000000065],[-81.833618000000001,78.846649000000014],[-81.820281999999963,78.845261000000107],[-81.741378999999881,78.839157000000114],[-81.712509000000011,78.839706000000035],[-81.699157999999954,78.842757999999947],[-81.660827999999924,78.877762000000018],[-81.656661999999869,78.883881000000088],[-81.65695199999999,78.888321000000076],[-81.666397000000018,78.895537999999988],[-81.68249499999996,78.900268999999923],[-81.734725999999966,78.90637200000009],[-81.753066999999987,78.912201000000096],[-81.755843999999968,78.91804500000012],[-81.698607999999922,78.973877000000073],[-81.690825999999959,78.980270000000019],[-81.683060000000012,78.984421000000111],[-81.553604000000007,79.024155000000007],[-81.486114999999927,79.041655999999989],[-81.477218999999991,79.047211000000061],[-81.486663999999962,79.052475000000072],[-81.50306699999993,79.059143000000006],[-81.521118000000001,79.061096000000134],[-81.548614999999984,79.061355999999989],[-81.617767000000015,79.051086000000055],[-81.865829000000019,79.013610999999969],[-81.910277999999948,79.004990000000078],[-81.928329000000019,79],[-81.961120999999935,78.98692299999999],[-81.97222899999997,78.982483000000002],[-81.974166999999966,78.979431000000034],[-81.999725000000012,78.960266000000104],[-82.092772999999909,78.918320000000108],[-82.110274999999945,78.913605000000075],[-82.34722899999997,78.894440000000088],[-82.50306699999993,78.882750999999985],[-82.559433000000013,78.884720000000016],[-82.681380999999988,78.903319999999951],[-82.813888999999961,78.923035000000141],[-82.839447000000007,78.926376000000005],[-82.924438000000009,78.934982000000105],[-83.063048999999978,78.939697000000137],[-83.126663000000008,78.941085999999927],[-83.264175000000023,78.939147999999989],[-83.514174999999966,78.930542000000059],[-83.570557000000008,78.929977000000065],[-83.637512000000015,78.930817000000104],[-83.694716999999912,78.934708000000001],[-83.787215999999887,78.942474000000061],[-83.812774999999988,78.945815999999979],[-84.034163999999976,78.956650000000025],[-84.165558000000033,78.956940000000031],[-84.200561999999991,78.957213999999965],[-84.259170999999981,78.959427000000119],[-84.328888000000006,78.965271000000143],[-84.367492999999968,78.972488000000055],[-84.386123999999882,78.977767999999969],[-84.429992999999968,78.987761999999975],[-84.473052999999936,78.99552900000009],[-84.573333999999875,79.009995000000117],[-84.651397999999972,79.019439999999975],[-84.679442999999992,79.021652000000074],[-84.726943999999946,79.027771000000087],[-84.748046999999985,79.031936999999971],[-84.766953000000001,79.037200999999982],[-84.779174999999952,79.04664600000001],[-84.789718999999991,79.064148000000046],[-84.789168999999958,79.069442999999978],[-84.783889999999985,79.074432000000115],[-84.651672000000019,79.114699999999971],[-84.544158999999979,79.141372999999987],[-84.528609999999901,79.143326000000059],[-84.503615999999909,79.144440000000088],[-84.473052999999936,79.143051000000071],[-84.163894999999911,79.12414600000011],[-84.135559000000001,79.121917999999994],[-84.075561999999934,79.10443099999992],[-84.0625,79.090546000000018],[-84.040558000000033,79.075447000000054],[-83.990279999999984,79.051651000000106],[-83.950561999999934,79.043594000000098],[-83.896392999999989,79.038040000000137],[-83.744720000000029,79.028046000000074],[-83.600554999999929,79.025269000000037],[-83.504456000000005,79.023604999999975],[-83.474716000000001,79.024155000000007],[-83.454726999999991,79.025542999999971],[-83.386123999999995,79.039429000000098],[-83.36860699999994,79.044434000000138],[-83.358611999999937,79.050812000000121],[-83.373610999999926,79.056366000000139],[-83.399445000000014,79.059708000000057],[-83.415557999999976,79.059981999999991],[-83.430831999999953,79.05831900000004],[-83.461670000000026,79.052200000000028],[-83.493880999999931,79.043319999999994],[-83.521118000000001,79.041367000000037],[-83.546111999999937,79.042480000000126],[-83.70666499999993,79.077774000000034],[-83.976394999999968,79.141098000000113],[-84.003615999999909,79.148605000000089],[-84.029998999999975,79.151657],[-84.029175000000009,79.156937000000028],[-84.018889999999999,79.161377000000073],[-84.005004999999926,79.166092000000106],[-83.952498999999989,79.180267000000015],[-83.939986999999917,79.18553200000008],[-83.933318999999926,79.191925000000026],[-83.941101000000003,79.216385000000059],[-83.956664999999987,79.221924000000058],[-83.979720999999927,79.22164900000007],[-84.016952999999944,79.213042999999971],[-84.043059999999912,79.203048999999965],[-84.051940999999943,79.198029000000076],[-84.067504999999983,79.192474000000004],[-84.086120999999991,79.188033999999959],[-84.121933000000013,79.184708000000114],[-84.158507999999983,79.183304000000135],[-84.193329000000006,79.183044000000109],[-84.303329000000019,79.186646000000053],[-84.326949999999954,79.188583000000108],[-84.323897999999872,79.19470200000012],[-84.316665999999941,79.200546000000145],[-84.31361400000003,79.206649999999968],[-84.335555999999997,79.252213000000097],[-84.34445199999999,79.258041000000048],[-84.362777999999992,79.264999000000046],[-84.401108000000022,79.27526899999998],[-84.428878999999995,79.290268000000026],[-84.452788999999996,79.328872999999987],[-84.452224999999942,79.34165999999999],[-84.446654999999964,79.353866999999923],[-84.446105999999929,79.358871000000079],[-84.484725999999966,79.406372000000147],[-84.503341999999975,79.413040000000137],[-84.581116000000009,79.433868000000018],[-84.606110000000001,79.43803400000013],[-84.660278000000005,79.444138000000123],[-84.709166999999979,79.451660000000061],[-84.821120999999948,79.473037999999974],[-84.882492000000013,79.486098999999911],[-84.896956999999929,79.492477000000065],[-84.96945199999999,79.537491000000045],[-84.972503999999901,79.542206000000078],[-85.022232000000031,79.611099000000024],[-85.028885000000002,79.615814000000057],[-85.050277999999992,79.621643000000063],[-85.068892999999946,79.626083000000051],[-85.25418099999996,79.667205999999965],[-85.372497999999894,79.684417999999994],[-85.493331999999953,79.700546000000031],[-85.551391999999964,79.705826000000116],[-85.615828999999962,79.708327999999995],[-85.684433000000013,79.709152000000131],[-85.763061999999991,79.705551000000071],[-85.94888299999991,79.708327999999995],[-86.203339000000028,79.735809000000074],[-86.387512000000015,79.747482000000048],[-86.415833000000021,79.750548999999978],[-86.445830999999885,79.754166000000112],[-86.47193900000002,79.759720000000129],[-86.486389000000031,79.763611000000026],[-86.49360699999994,79.768326000000059],[-86.502227999999945,79.775269000000037],[-86.47193900000002,79.890549000000021],[-86.460281000000009,79.919708000000014],[-86.450286999999889,79.931091000000038],[-86.43638599999997,79.942474000000004],[-86.424437999999952,79.948029000000076],[-86.389724999999999,79.958038000000101],[-86.36721799999998,79.962769000000037],[-86.300277999999935,79.968596999999988],[-86.263335999999924,79.969147000000021],[-86.230285999999978,79.96804800000001],[-86.083892999999989,79.95748900000001],[-85.885833999999988,79.941086000000098],[-85.819732999999928,79.938582999999937],[-85.785003999999958,79.938034000000016],[-85.711394999999925,79.937485000000038],[-85.65695199999999,79.938034000000016],[-85.519454999999994,79.924988000000042],[-85.460006999999905,79.910812000000078],[-85.416397000000018,79.901382000000012],[-85.389998999999932,79.897491000000116],[-85.365829000000019,79.896378000000027],[-85.308334000000002,79.900543000000027],[-85.289168999999958,79.904984000000127],[-85.275008999999955,79.909424000000001],[-85.262511999999958,79.914992999999981],[-85.255004999999926,79.920821999999987],[-85.271118000000001,79.923874000000069],[-85.440826000000015,79.938309000000004],[-85.640839000000028,79.962769000000037],[-86.190552000000025,80],[-86.301940999999943,79.998322000000087],[-86.341384999999946,79.99693300000007],[-86.413329999999974,79.99803200000008],[-86.442763999999954,79.999709999999993],[-86.466400000000021,80.003876000000048],[-86.482773000000009,80.0086060000001],[-86.565551999999968,80.035812000000135],[-86.579452999999944,80.04304500000012],[-86.642501999999922,80.098037999999974],[-86.658614999999884,80.117752000000053],[-86.65943900000002,80.128036000000066],[-86.65583799999996,80.135269000000108],[-86.514724999999942,80.299149000000114],[-86.493057000000022,80.304428000000087],[-86.46833799999996,80.308594000000028],[-86.434432999999956,80.312485000000095],[-86.345001000000025,80.319153000000028],[-86.11610399999995,80.333602999999982],[-86.076110999999912,80.333602999999982],[-85.897507000000019,80.333054000000004],[-85.745269999999948,80.320267000000001],[-85.717498999999975,80.316375999999934],[-85.671936000000017,80.306931000000077],[-85.616652999999928,80.298874000000126],[-85.509170999999981,80.285812000000078],[-85.479171999999949,80.28276100000005],[-85.354171999999892,80.273041000000148],[-85.290832999999964,80.268600000000049],[-85.256957999999997,80.267211999999972],[-85.095839999999953,80.262207000000103],[-84.9375,80.267211999999972],[-84.898346000000004,80.269440000000088],[-84.779174999999952,80.272491000000116],[-84.702498999999932,80.273315000000082],[-84.589721999999995,80.273605000000089],[-84.196655000000021,80.271378000000027],[-84.049437999999896,80.267761000000121],[-83.989440999999999,80.264435000000049],[-83.926392000000021,80.259720000000016],[-83.811110999999983,80.249145999999996],[-83.78195199999999,80.24581900000004],[-83.716110000000015,80.233871000000022],[-83.626389000000017,80.213608000000136],[-83.560821999999973,80.195816000000093],[-83.546386999999982,80.189423000000147],[-83.478058000000033,80.164428999999984],[-83.461394999999925,80.15914900000007],[-83.42471299999994,80.148331000000098],[-83.40306099999998,80.142212000000086],[-83.24499499999996,80.103591999999935],[-83.138901000000033,80.078323000000125],[-83.029723999999987,80.053314],[-82.89805599999994,80.02526899999998],[-82.803329000000019,80.006377999999984],[-82.736114999999984,79.992476999999951],[-82.605835000000013,79.964431999999988],[-82.283889999999985,79.893051000000071],[-82.15306099999998,79.858870999999965],[-82.101943999999946,79.839706000000035],[-82.091675000000009,79.834717000000069],[-82.062499999999943,79.816086000000041],[-82.046386999999982,79.801651000000106],[-81.976944000000003,79.735809000000074],[-81.981673999999998,79.723877000000073],[-81.978881999999999,79.718323000000112],[-81.916655999999989,79.703323000000125],[-81.853057999999976,79.693588000000034],[-81.799438000000009,79.686645999999939],[-81.767501999999922,79.684981999999934],[-81.733886999999925,79.686371000000122],[-81.68472300000002,79.675812000000064],[-81.6163939999999,79.623305999999957],[-81.61860699999994,79.61831699999999],[-81.628052000000025,79.614700000000028],[-81.651671999999905,79.610260000000039],[-81.678054999999972,79.607208000000128],[-81.687774999999874,79.608032000000094],[-81.694716999999969,79.609711000000061],[-81.709732000000031,79.615540000000124],[-81.734160999999972,79.619705000000124],[-81.748610999999983,79.621094000000085],[-81.767501999999922,79.62052900000009],[-81.777221999999995,79.619140999999956],[-81.785277999999892,79.614990000000091],[-81.786117999999931,79.609146000000067],[-81.782227000000034,79.604979999999955],[-81.768616000000009,79.600266000000033],[-81.750290000000007,79.594711000000132],[-81.728333000000021,79.589706000000092],[-81.706664999999987,79.586655000000064],[-81.675277999999992,79.584991000000059],[-81.639450000000011,79.584991000000059],[-81.605835000000013,79.588593000000003],[-81.578613000000018,79.59304800000001],[-81.56361400000003,79.597763000000043],[-81.544998000000021,79.609146000000067],[-81.509444999999914,79.624145999999996],[-81.495270000000005,79.629425000000026],[-81.476395000000025,79.634155000000021],[-81.457229999999981,79.636932000000115],[-81.424712999999997,79.636658000000011],[-81.368056999999965,79.634430000000066],[-81.279998999999918,79.628310999999997],[-81.253615999999965,79.624694999999974],[-81.013061999999877,79.598877000000016],[-80.69027699999998,79.56860400000005],[-80.630554000000018,79.564147999999989],[-80.598052999999993,79.566086000000098],[-80.589721999999995,79.568054000000018],[-80.591949,79.573608000000036],[-80.60861199999988,79.576096000000007],[-80.625274999999931,79.580826000000059],[-80.641953000000001,79.588042999999971],[-80.634170999999981,79.592758000000003],[-80.618606999999884,79.597214000000122],[-80.598052999999993,79.601379000000122],[-80.569167999999877,79.605255],[-80.50167799999997,79.61192299999999],[-80.100280999999995,79.644440000000145],[-80.056655999999975,79.646942000000024],[-80.025283999999942,79.647217000000069],[-79.972778000000005,79.644440000000145],[-79.93638599999997,79.644440000000145],[-79.904723999999987,79.646942000000024],[-79.892501999999922,79.649155000000007],[-79.761947999999961,79.695816000000036],[-79.751403999999923,79.701385000000016],[-79.768616000000009,79.701935000000049],[-80.041381999999999,79.697479000000101],[-80.356658999999979,79.685256999999979],[-80.389724999999999,79.68331900000004],[-80.432220000000029,79.677765000000022],[-80.473617999999988,79.669708000000071],[-80.516113000000018,79.664429000000098],[-80.618057000000022,79.654160000000047],[-80.658889999999928,79.652481000000023],[-80.795273000000009,79.648041000000035],[-80.827498999999989,79.648331000000042],[-80.910552999999993,79.651932000000102],[-80.942215000000033,79.653594999999996],[-80.955275999999969,79.658600000000035],[-80.958892999999932,79.664993000000038],[-80.970839999999953,79.671370999999965],[-80.978333000000021,79.67303499999997],[-81.076110999999969,79.688873000000001],[-81.171936000000017,79.703323000000125],[-81.227782999999988,79.709427000000005],[-81.291945999999882,79.713608000000079],[-81.385559000000001,79.713608000000079],[-81.424437999999952,79.712769000000094],[-81.519729999999925,79.730820000000108],[-81.569457999999941,79.819717000000082],[-81.582779000000016,79.836929000000112],[-81.587783999999942,79.841660000000047],[-81.59973100000002,79.851929000000098],[-81.608337000000006,79.858597000000032],[-81.631377999999984,79.872208000000001],[-81.651947000000007,79.882750999999985],[-81.65972899999997,79.888596000000064],[-81.665008999999941,79.897765999999933],[-81.663054999999986,79.903046000000018],[-81.643616000000009,79.909988000000112],[-81.540557999999919,79.922760000000096],[-81.515839000000028,79.924988000000042],[-81.416945999999939,79.927199999999971],[-81.402221999999995,79.932479999999998],[-81.400283999999942,79.937758999999971],[-81.420272999999952,79.943587999999977],[-81.557495000000017,79.960815000000025],[-81.589721999999995,79.962494000000049],[-81.639450000000011,79.962204000000042],[-81.643341000000021,79.962204000000042],[-81.710555999999997,79.964706000000092],[-81.743056999999965,79.966385000000116],[-81.833068999999966,79.973877000000016],[-82.005004999999983,79.993042000000003],[-82.168334999999956,80.013610999999969],[-82.191101000000003,80.018600000000106],[-82.285827999999981,80.046097000000088],[-82.34333799999996,80.063873000000058],[-82.359160999999915,80.069153000000085],[-82.619155999999975,80.150542999999971],[-82.948043999999982,80.247481999999991],[-83.12110899999999,80.292755000000056],[-83.166655999999932,80.301376000000005],[-83.186934999999949,80.30664100000007],[-83.201400999999976,80.313309000000061],[-83.203887999999949,80.318054000000075],[-83.196654999999964,80.320830999999998],[-83.166945999999939,80.326934999999992],[-83.131942999999978,80.330551000000071],[-82.942764000000011,80.345535000000098],[-82.854720999999984,80.350815000000011],[-82.787780999999939,80.352203000000088],[-82.706664999999987,80.352767999999969],[-82.579726999999878,80.358322000000101],[-82.273330999999928,80.377472000000068],[-82.031386999999938,80.398331000000042],[-81.987212999999997,80.40026899999998],[-81.899170000000026,80.401657000000114],[-81.882216999999969,80.401932000000102],[-81.673888999999974,80.406097000000102],[-81.334441999999967,80.420532000000037],[-81.204726999999991,80.427200000000028],[-81.079726999999991,80.436096000000134],[-80.98611499999987,80.443588000000091],[-80.835007000000019,80.452774000000034],[-80.660004000000015,80.460815000000082],[-80.481110000000001,80.462494000000106],[-80.412216000000001,80.460541000000148],[-80.367766999999958,80.462204000000099],[-80.336120999999991,80.465819999999951],[-80.318893000000003,80.470534999999984],[-80.306655999999919,80.47526600000009],[-80.294158999999866,80.486649000000114],[-80.297775000000001,80.488876000000005],[-80.312209999999936,80.491653000000099],[-80.343338000000017,80.49414100000007],[-80.354996000000028,80.498031999999967],[-80.357223999999917,80.501389000000074],[-80.227492999999924,80.519713999999965],[-80.195540999999935,80.523605000000032],[-80.153335999999967,80.526382000000126],[-80.116394000000014,80.527771000000143],[-80.058608999999933,80.527206000000092],[-79.940276999999924,80.528869999999927],[-79.558043999999995,80.536377000000073],[-79.490554999999915,80.539703000000088],[-79.339995999999928,80.549988000000042],[-79.232773000000009,80.553314000000057],[-79.190552000000025,80.55386400000009],[-79.011123999999995,80.553314000000057],[-78.815551999999911,80.555817000000047],[-78.592772999999966,80.562195000000031],[-78.46556099999998,80.563873000000115],[-78.345276000000013,80.564423000000147],[-78.098891999999921,80.562485000000038],[-78.063889000000017,80.564697000000081],[-78.038054999999929,80.567215000000033],[-78.015014999999948,80.586655000000007],[-78.013625999999988,80.591095000000053],[-78.019164999999987,80.594436999999971],[-78.030838000000017,80.596100000000092],[-78.088608000000022,80.596939000000077],[-78.357773000000009,80.60165400000011],[-78.741378999999938,80.60914600000001],[-78.851944000000003,80.612487999999985],[-78.925277999999992,80.616652999999985],[-78.981109999999944,80.616089000000045],[-79.114440999999999,80.612487999999985],[-79.255004999999983,80.605819999999994],[-79.347228999999913,80.601089000000059],[-79.392226999999934,80.599715999999944],[-79.565276999999924,80.596100000000092],[-79.634170999999981,80.595535000000041],[-79.86332699999997,80.603043000000071],[-79.934433000000013,80.606094000000098],[-79.960555999999883,80.608032000000037],[-79.960280999999952,80.614700000000028],[-79.907226999999978,80.623871000000008],[-79.847777999999948,80.631927000000076],[-79.559433000000013,80.669983000000059],[-79.353607000000011,80.696640000000116],[-79.291945999999996,80.703872999999987],[-79.172501000000011,80.713043000000027],[-78.990829000000019,80.729706000000078],[-78.809432999999956,80.746933000000126],[-78.62388599999997,80.769149999999968],[-78.585280999999952,80.772217000000069],[-78.50556899999998,80.77748100000008],[-78.236664000000019,80.793319999999994],[-77.894454999999994,80.813309000000118],[-77.805832000000009,80.818603999999993],[-77.733062999999959,80.825546000000088],[-77.639175000000023,80.83027600000014],[-77.287780999999939,80.83526599999999],[-76.926392000000021,80.841933999999981],[-76.845001000000025,80.841094999999996],[-76.729172000000005,80.838043000000084],[-76.681380999999931,80.838593000000117],[-76.590835999999967,80.842758000000117],[-76.556655999999975,80.84637500000008],[-76.511672999999973,80.854430999999977],[-76.484725999999966,80.86554000000001],[-76.485000999999897,80.871094000000028],[-76.490829000000019,80.874985000000095],[-76.526672000000019,80.88638300000008],[-76.621108999999933,80.900818000000015],[-76.656661999999983,80.898041000000148],[-76.699432000000002,80.891372999999987],[-76.738892000000021,80.888321000000019],[-76.797500999999954,80.886108000000092],[-76.841675000000009,80.885543999999982],[-77.168883999999935,80.886932000000058],[-77.201675000000023,80.887772000000098],[-77.308884000000035,80.893051000000071],[-77.428329000000019,80.903046000000018],[-77.454726999999991,80.90525800000006],[-77.581115999999895,80.911377000000073],[-77.766113000000018,80.906937000000084],[-77.980285999999921,80.90109300000006],[-78.421111999999994,80.879424999999912],[-78.836394999999982,80.85386699999998],[-78.869445999999925,80.852202999999975],[-78.885283999999956,80.853591999999992],[-78.896118000000001,80.854705999999965],[-78.908614999999998,80.858871000000136],[-78.922225999999966,80.866088999999988],[-78.93499799999995,80.875534000000016],[-78.93638599999997,80.881363000000079],[-78.930556999999965,80.981933999999967],[-78.928604000000007,80.990540000000067],[-78.839721999999995,81.016098],[-78.799987999999985,81.026382000000069],[-78.757781999999906,81.035537999999974],[-78.636672999999973,81.058594000000028],[-78.528884999999946,81.081940000000088],[-78.501113999999973,81.09165999999999],[-78.457503999999972,81.107758000000047],[-78.426101999999958,81.120818999999983],[-78.416396999999961,81.125259000000142],[-78.397231999999917,81.137497000000053],[-78.393065999999919,81.142761000000007],[-78.406386999999938,81.144988999999953],[-78.461945000000014,81.147491000000059],[-78.475280999999939,81.149719000000005],[-78.475829999999974,81.15248100000008],[-78.472777999999948,81.158325000000104],[-78.463622999999927,81.160812000000021],[-78.438598999999954,81.164703000000088],[-78.411391999999921,81.167479999999955],[-78.290833000000021,81.174698000000149],[-78.254729999999995,81.177765000000079],[-78.225005999999894,81.181930999999963],[-78.15943900000002,81.193862999999965],[-78.051102000000014,81.218597000000102],[-78.03694200000001,81.223312000000135],[-78.016662999999994,81.232758000000103],[-78.009170999999981,81.238585999999998],[-77.976943999999889,81.249145999999939],[-77.875274999999874,81.272766000000104],[-77.850829999999917,81.277205999999978],[-77.612503000000004,81.318877999999984],[-77.576949999999897,81.322494999999947],[-77.50306699999993,81.328323000000069],[-77.366394000000014,81.336105000000032],[-77.233611999999994,81.351089000000115],[-77.116942999999935,81.367751999999996],[-76.955275999999969,81.393874999999923],[-76.765014999999948,81.428588999999988],[-76.748610999999983,81.4327550000001],[-76.745269999999948,81.439148000000046],[-76.761123999999995,81.442749000000106],[-76.777785999999878,81.444427000000019],[-76.803328999999962,81.445526000000029],[-76.855835000000013,81.445526000000029],[-76.951110999999969,81.440536000000122],[-77.028609999999958,81.43331900000004],[-77.208617999999944,81.409424000000058],[-77.264450000000011,81.400818000000129],[-77.41722099999987,81.380538999999999],[-77.571395999999993,81.366652999999985],[-77.609726000000023,81.364425999999924],[-77.829177999999899,81.34248400000007],[-77.896117999999944,81.335541000000092],[-78.174163999999962,81.30053700000002],[-78.228333000000021,81.291656000000046],[-78.273620999999935,81.283599999999979],[-78.29222099999987,81.278320000000122],[-78.305557000000022,81.272766000000104],[-78.325835999999924,81.261383000000137],[-78.351944000000003,81.250275000000101],[-78.370270000000005,81.2452550000001],[-78.410004000000015,81.236374000000126],[-78.433883999999921,81.231934000000138],[-78.487212999999997,81.223038000000031],[-78.604996000000028,81.206375000000094],[-78.652495999999928,81.197205000000054],[-78.675277999999935,81.191925000000026],[-78.701950000000011,81.181655999999975],[-78.721114999999998,81.172211000000061],[-78.728333000000021,81.166382000000056],[-78.75111400000003,81.141663000000108],[-78.754181000000017,81.135818000000029],[-78.745833999999945,81.129150000000038],[-78.71665999999999,81.123306000000014],[-78.690552000000025,81.12164300000012],[-78.690825999999959,81.11943100000002],[-78.817504999999926,81.106093999999985],[-78.895019999999931,81.098999000000049],[-78.916945999999996,81.098037999999917],[-78.941375999999934,81.101088999999945],[-78.963622999999984,81.107758000000047],[-79.015014999999948,81.115539999999953],[-79.075287000000003,81.122757000000092],[-79.162780999999939,81.13220199999995],[-79.218062999999972,81.136932000000002],[-79.242767000000015,81.139984000000084],[-79.399170000000026,81.174698000000149],[-79.463622999999984,81.193313999999987],[-79.486114999999984,81.194977000000108],[-79.50167799999997,81.193588000000091],[-79.499434999999949,81.189972000000068],[-79.491669000000002,81.186095999999964],[-79.475829999999974,81.180542000000003],[-79.275283999999999,81.12359600000002],[-79.218886999999938,81.111099000000081],[-79.172501000000011,81.10386699999998],[-79.088837000000012,81.094757000000072],[-79.073623999999995,81.090820000000122],[-79.063613999999916,81.085541000000148],[-79.072783999999956,81.080826000000116],[-79.087783999999999,81.076660000000004],[-79.142226999999991,81.069153000000085],[-79.226944000000003,81.063034000000073],[-79.255279999999914,81.058868000000132],[-79.305266999999958,81.029984000000013],[-79.315826000000015,81.023880000000133],[-79.323623999999938,81.018326000000002],[-79.33666999999997,81.0086060000001],[-79.343886999999995,80.99832200000003],[-79.336945000000014,80.992203000000018],[-79.321120999999891,80.988586000000055],[-79.291381999999885,80.984984999999995],[-79.258347000000015,80.984421000000054],[-79.205275999999969,80.987762000000089],[-79.18472300000002,80.986374000000012],[-79.164718999999991,80.983047000000056],[-79.158889999999985,80.977768000000083],[-79.15834000000001,80.972763000000043],[-79.165282999999931,80.966660000000104],[-79.265288999999996,80.924149000000057],[-79.600829999999917,80.824432000000115],[-79.618056999999965,80.819442999999978],[-79.883621000000005,80.783325000000104],[-80.065552000000025,80.759720000000129],[-80.247498000000007,80.73692299999999],[-80.511123999999938,80.705826000000059],[-80.651947000000007,80.691925000000083],[-80.720551,80.684142999999949],[-80.855559999999969,80.663315000000068],[-80.919448999999929,80.655548000000124],[-80.956664999999987,80.651932000000045],[-81.336394999999925,80.623306000000127],[-81.533324999999991,80.607208000000071],[-81.575561999999991,80.604155999999989],[-81.808884000000035,80.59304800000001],[-81.966110000000015,80.579712000000029],[-82.353881999999942,80.556365999999969],[-82.434998000000007,80.553040000000124],[-82.798889000000031,80.539428999999984],[-82.881103999999937,80.536652000000061],[-82.956389999999999,80.536377000000073],[-83.027495999999928,80.538589000000115],[-83.096664000000033,80.541656000000046],[-83.151946999999893,80.546371000000079],[-83.165008999999998,80.55192599999998],[-83.170272999999895,80.564147999999932],[-83.168059999999912,80.576660000000118],[-83.165282999999931,80.589432000000102],[-83.161391999999864,80.601089000000059],[-83.156112999999948,80.606644000000131],[-83.146666999999979,80.612198000000149],[-83.096953999999982,80.639435000000049],[-83.078063999999927,80.644989000000066],[-83.056380999999988,80.649154999999951],[-82.773055999999997,80.68664600000011],[-82.527495999999985,80.703323000000125],[-82.431945999999982,80.708878000000027],[-82.250838999999928,80.716385000000116],[-82.216399999999965,80.719147000000021],[-82.135833999999875,80.729431000000091],[-82.025009000000011,80.746643000000063],[-81.948333999999932,80.759155000000078],[-81.908614999999941,80.767761000000007],[-81.762786999999889,80.810806000000127],[-81.758895999999993,80.813034000000073],[-81.767501999999922,80.821381000000088],[-81.943603999999993,80.833054000000118],[-81.961120999999935,80.833054000000118],[-81.996108999999933,80.83027600000014],[-82.05221599999993,80.822768999999994],[-82.099730999999906,80.813599000000124],[-82.146118000000001,80.803589000000045],[-82.193877999999984,80.796646000000067],[-82.332229999999981,80.781372000000147],[-82.513061999999934,80.763046000000145],[-82.526107999999965,80.752777000000094],[-82.535827999999867,80.747208000000114],[-82.543334999999956,80.74443100000002],[-82.567229999999995,80.740814000000057],[-82.601669000000015,80.738036999999963],[-82.940551999999968,80.714431999999988],[-83.311934999999949,80.687759000000028],[-83.356948999999929,80.685531999999967],[-83.516113000000018,80.701384999999959],[-83.541107000000011,80.704162999999994],[-83.547226000000023,80.706940000000088],[-83.569457999999997,80.739150999999993],[-83.5625,80.743866000000025],[-83.529723999999987,80.747482000000048],[-83.456664999999987,80.751099000000011],[-83.422500999999954,80.753876000000105],[-83.391387999999949,80.758041000000105],[-83.261947999999961,80.786377000000016],[-83.133057000000008,80.818878000000097],[-83.120270000000005,80.823317999999972],[-83.132492000000013,80.828598],[-83.158051,80.833603000000039],[-83.191100999999946,80.835815000000139],[-83.256957999999997,80.838593000000117],[-83.297225999999966,80.836104999999975],[-83.323333999999932,80.8316650000001],[-83.329177999999956,80.828323000000012],[-83.331954999999937,80.823883000000137],[-83.353881999999999,80.813599000000124],[-83.381377999999984,80.803864000000033],[-83.407226999999978,80.799422999999933],[-83.493332000000009,80.787766000000033],[-83.587218999999891,80.775269000000037],[-83.610549999999932,80.771652000000074],[-83.630828999999949,80.766937000000041],[-83.645554000000004,80.761658000000068],[-83.64916999999997,80.755554000000018],[-83.658889999999872,80.751937999999996],[-83.667769999999905,80.75],[-83.696655000000021,80.746643000000063],[-83.712783999999999,80.747757000000092],[-83.827498999999932,80.761383000000023],[-83.859160999999972,80.759155000000078],[-83.863892000000021,80.757492000000127],[-83.836394999999982,80.719710999999961],[-83.821670999999981,80.705826000000059],[-83.812499999999943,80.698318000000086],[-83.801391999999964,80.691925000000083],[-83.783065999999963,80.684142999999949],[-83.757232999999928,80.669708000000014],[-83.734436000000017,80.654160000000047],[-83.723327999999924,80.643875000000094],[-83.720000999999911,80.636658000000011],[-83.719726999999978,80.630813999999987],[-83.73582499999992,80.613037000000077],[-83.779175000000009,80.570831000000112],[-83.794723999999974,80.560257000000036],[-83.821120999999948,80.550536999999963],[-83.840560999999866,80.545532000000094],[-83.871108999999933,80.541367000000093],[-83.93472300000002,80.534424000000115],[-83.973327999999981,80.531937000000028],[-84.313323999999909,80.513611000000026],[-84.381103999999993,80.512207000000046],[-84.48971599999993,80.514434999999992],[-84.551392000000021,80.517761000000064],[-84.689437999999996,80.524994000000049],[-84.763625999999988,80.525818000000015],[-84.846664000000033,80.523315000000025],[-84.890563999999983,80.521102999999982],[-84.964447000000007,80.514434999999992],[-85.027221999999995,80.507217000000026],[-85.066956000000005,80.505264000000068],[-85.232772999999952,80.508881000000031],[-85.334731999999974,80.513611000000026],[-85.366652999999985,80.517487000000131],[-85.42582699999997,80.523041000000092],[-85.462218999999948,80.524994000000049],[-85.594727000000034,80.529159999999933],[-85.809433000000013,80.531937000000028],[-85.864165999999898,80.535538000000088],[-85.865829000000019,80.541367000000093],[-85.812774999999931,80.559143000000063],[-85.705841000000021,80.589706000000035],[-85.689162999999951,80.593872000000147],[-85.665008999999941,80.598601999999971],[-85.613051999999982,80.606368999999972],[-85.571945000000028,80.615265000000079],[-85.564712999999927,80.619431000000134],[-85.594451999999933,80.6202550000001],[-85.636397999999986,80.619141000000127],[-85.694716999999969,80.613602000000128],[-85.744719999999916,80.606368999999972],[-85.793059999999855,80.596939000000077],[-85.854720999999984,80.582214000000135],[-85.889724999999999,80.573044000000039],[-85.925277999999992,80.562485000000038],[-85.950606999999991,80.552947999999958],[-85.95666499999993,80.548325000000091],[-85.982773000000009,80.537491000000045],[-86.011947999999961,80.533324999999934],[-86.037215999999944,80.530823000000055],[-86.080840999999964,80.528320000000065],[-86.148345999999947,80.53166200000004],[-86.177490000000034,80.534149000000127],[-86.428329000000019,80.560257000000036],[-86.639998999999932,80.583054000000004],[-86.718062999999972,80.59304800000001],[-86.739165999999898,80.597487999999998],[-86.744995000000017,80.603043000000071],[-86.732498000000021,80.615265000000079],[-86.680282999999974,80.654984000000013],[-86.660003999999958,80.666091999999992],[-86.638061999999991,80.676651000000049],[-86.514724999999942,80.729431000000091],[-86.497771999999941,80.735260000000096],[-86.466110000000015,80.74552900000009],[-86.410004000000015,80.760818000000029],[-86.338333000000034,80.775542999999971],[-86.244719999999973,80.794144000000131],[-86.225554999999929,80.799149],[-86.174438000000009,80.81442300000009],[-86.050277999999992,80.856644000000074],[-85.964171999999962,80.886932000000058],[-85.846114999999998,80.928589000000102],[-85.828339000000028,80.93414300000012],[-85.77416999999997,80.948868000000061],[-85.698607999999922,80.962769000000037],[-85.605835000000013,80.975815000000125],[-85.556106999999997,80.981933999999967],[-85.003066999999874,81.028320000000008],[-84.928878999999995,81.030822999999941],[-84.726669000000015,81.031097000000102],[-84.404998999999918,81.043869000000086],[-84.368332000000009,81.046097000000032],[-84.20666499999993,81.060531999999967],[-84.119994999999903,81.067490000000134],[-84.025009000000011,81.070830999999998],[-83.908050999999944,81.071381000000031],[-83.823623999999938,81.073608000000092],[-83.529998999999918,81.090271000000143],[-83.31138599999997,81.103317000000118],[-83.15055799999999,81.120529000000147],[-83.12332200000003,81.12303200000008],[-83.053328999999962,81.123306000000014],[-82.943603999999993,81.120818999999983],[-82.869445999999925,81.121368000000075],[-82.826401000000033,81.12303200000008],[-82.785004000000015,81.125534000000016],[-82.760283999999956,81.129150000000038],[-82.738891999999964,81.133880999999974],[-82.707229999999981,81.144440000000031],[-82.688323999999966,81.148331000000098],[-82.64416499999993,81.151657000000114],[-82.599166999999966,81.152771000000087],[-82.531386999999938,81.149993999999992],[-82.50306699999993,81.147766000000047],[-82.466659999999933,81.148331000000098],[-82.37222300000002,81.174698000000149],[-82.364440999999999,81.17942800000003],[-82.389998999999989,81.180266999999958],[-82.420837000000006,81.17942800000003],[-82.484160999999972,81.169983000000116],[-82.52305599999994,81.166382000000056],[-82.565276999999924,81.166092000000049],[-82.665008999999998,81.17442299999999],[-82.828063999999983,81.173308999999961],[-82.866652999999928,81.169708000000128],[-82.894164999999987,81.165268000000083],[-82.926940999999999,81.161102000000028],[-82.962783999999942,81.158325000000104],[-83.14973399999991,81.151382000000126],[-83.453338999999971,81.13220199999995],[-83.757507000000032,81.113312000000008],[-84.116104000000007,81.0977630000001],[-84.372771999999941,81.092209000000082],[-84.58555599999994,81.086380000000077],[-84.797500999999954,81.078323000000125],[-85.065551999999911,81.066375999999991],[-85.211944999999901,81.056931000000077],[-85.25,81.05525200000011],[-85.291381999999999,81.054703000000131],[-85.404448999999943,81.057755000000043],[-85.482773000000009,81.058594000000028],[-85.572509999999966,81.05664100000007],[-85.681670999999938,81.049423000000104],[-85.75556899999998,81.041367000000037],[-85.817779999999971,81.032761000000107],[-85.988602000000014,81.006653000000142],[-86.143340999999907,80.978317000000061],[-86.30972300000002,80.940811000000053],[-86.351944000000003,80.930542000000059],[-87.061935000000005,80.727478000000133],[-87.076401000000033,80.7227630000001],[-87.083618000000001,80.716934000000094],[-87.079078999999979,80.707024000000104],[-87.080291999999986,80.699142000000052],[-87.121383999999921,80.677475000000015],[-87.180557000000022,80.649154999999951],[-87.215011999999945,80.638321000000076],[-87.240554999999972,80.634155000000021],[-87.273055999999997,80.630813999999987],[-87.315001999999936,80.629424999999969],[-87.458054000000004,80.627762000000075],[-87.489715999999873,80.627472000000012],[-87.559433000000013,80.627472000000012],[-87.594726999999978,80.628586000000041],[-87.628051999999968,80.632202000000063],[-87.777221999999938,80.648880000000133],[-87.864166000000012,80.659424000000001],[-87.954726999999878,80.671645999999953],[-88.139724999999999,80.685256999999922],[-88.17721599999993,80.686920000000043],[-88.196105999999986,80.688582999999994],[-88.22222899999997,80.691085999999984],[-88.348891999999921,80.708602999999982],[-88.406661999999926,80.716934000000094],[-88.488601999999958,80.731934000000024],[-88.566956000000005,80.74859600000002],[-88.706116000000009,80.772766000000047],[-88.967498999999862,80.808594000000085],[-89.034163999999976,80.816376000000048],[-89.125823999999966,80.825821000000076],[-89.290557999999976,80.849426000000108],[-89.334731999999917,80.857483000000059],[-89.382492000000013,80.86970500000001],[-89.398055999999997,80.876082999999994],[-89.450561999999934,80.903320000000122],[-89.462218999999948,80.909988000000055],[-89.466110000000015,80.914153999999996],[-89.462218999999948,80.919144000000017],[-89.442763999999897,80.923599000000024],[-89.380828999999892,80.933044000000109],[-89.235274999999945,80.948318000000029],[-89.18638599999997,80.953048999999965],[-88.905563000000029,80.977768000000083],[-88.858611999999994,80.981368999999972],[-88.766861000000006,80.986801000000014],[-88.590285999999992,80.996368000000018],[-88.513901000000033,80.99832200000003],[-88.283324999999991,81.002213000000097],[-88.089721999999938,81.003601000000003],[-88.011397999999986,81.003326000000015],[-87.826674999999966,80.998032000000023],[-87.755004999999983,80.994980000000112],[-87.689437999999939,80.990814],[-87.628051999999968,80.984711000000061],[-87.597504000000015,80.980819999999994],[-87.524169999999913,80.977203000000031],[-87.446380999999974,80.976928999999927],[-87.279448999999943,80.981933999999967],[-87.15943900000002,80.986922999999933],[-87.119719999999973,80.989700000000028],[-87.089172000000019,80.994141000000127],[-87.064712999999983,80.998871000000008],[-87.030562999999972,81.001938000000109],[-86.983062999999902,81.003876000000048],[-86.946105999999986,81.004166000000055],[-86.755004999999983,81.001099000000124],[-86.711670000000026,81.002487000000031],[-86.671936000000017,81.005264000000125],[-86.635559000000001,81.009430000000066],[-86.541945999999996,81.020264000000111],[-86.419448999999986,81.036102000000142],[-86.061110999999983,81.082764000000054],[-85.916396999999961,81.104980000000012],[-85.916396999999961,81.110260000000096],[-85.907227000000034,81.113875999999948],[-85.887512000000015,81.118866000000025],[-85.562774999999988,81.17942800000003],[-85.483063000000016,81.192748999999992],[-85.425277999999935,81.201660000000061],[-85.297500999999954,81.218597000000102],[-85.22193900000002,81.226379000000065],[-85.02027899999996,81.244980000000055],[-84.976394999999968,81.248596000000134],[-84.876388999999961,81.254715000000147],[-84.832503999999972,81.258330999999998],[-84.802490000000034,81.261658000000125],[-84.776108000000022,81.266097999999943],[-84.733886999999982,81.281097000000045],[-84.735549999999989,81.285537999999974],[-84.745834000000002,81.289429000000041],[-84.899993999999936,81.304977000000008],[-84.936660999999958,81.307755000000043],[-84.975554999999986,81.307479999999998],[-85.029175000000009,81.305817000000047],[-85.279174999999952,81.289978000000133],[-85.361388999999974,81.28276100000005],[-85.768340999999964,81.244705000000067],[-85.950561999999991,81.224701000000096],[-86.018341000000021,81.215820000000008],[-86.077498999999932,81.207489000000066],[-86.154174999999952,81.193313999999987],[-86.225006000000008,81.173874000000012],[-86.240829000000019,81.16914399999996],[-86.256957999999941,81.162766000000033],[-86.299437999999896,81.148605000000032],[-86.338333000000034,81.138596000000007],[-86.404998999999975,81.129700000000071],[-86.438048999999921,81.126083000000108],[-86.472777999999892,81.122757000000092],[-86.521118000000001,81.119704999999954],[-86.650833000000034,81.115814000000114],[-86.956389999999999,81.099426000000051],[-87.111388999999917,81.087769000000094],[-87.297225999999966,81.076935000000049],[-87.637512000000015,81.059417999999994],[-87.678878999999995,81.058594000000028],[-87.720000999999911,81.059417999999994],[-87.841385000000002,81.062759000000028],[-88.0625,81.069992000000013],[-88.217772999999852,81.071381000000031],[-88.339995999999985,81.069717000000026],[-88.43499799999995,81.064148000000046],[-88.571670999999924,81.054703000000131],[-88.65834000000001,81.051376000000005],[-88.740828999999962,81.049713000000111],[-88.889998999999932,81.051926000000037],[-88.964721999999938,81.049423000000104],[-89.041672000000005,81.041091999999992],[-89.210555999999997,81.026657000000057],[-89.25556899999998,81.023880000000133],[-89.341675000000009,81.020264000000111],[-89.629165999999998,81.009155000000021],[-89.746658000000025,81.008881000000088],[-89.787505999999951,81.009720000000073],[-89.820847000000015,81.010817999999972],[-89.87388599999997,81.016388000000006],[-90.011947999999961,81.033051000000114],[-90.06361400000003,81.039702999999975],[-90.095275999999899,81.044708000000071],[-90.149170000000026,81.054977000000065],[-90.19776899999988,81.069717000000026],[-90.210007000000019,81.07499700000011],[-90.338057999999933,81.151657000000114],[-90.351944000000003,81.167479999999955],[-90.325561999999934,81.181930999999963],[-90.277221999999995,81.197205000000054],[-90.102218999999991,81.230270000000132],[-90.043059999999969,81.239426000000037],[-90.011123999999995,81.241928000000144],[-89.972778000000005,81.24275200000011],[-89.870543999999938,81.242203000000131],[-89.74610899999999,81.236649],[-89.669158999999866,81.218048000000124],[-89.635009999999909,81.212203999999929],[-89.573059000000001,81.206940000000145],[-89.535004000000015,81.206100000000106],[-89.491104000000007,81.206375000000094],[-89.447219999999902,81.208328000000051],[-89.357223999999974,81.214432000000102],[-89.281386999999995,81.221649000000014],[-89.136672999999973,81.238876000000005],[-89.088333000000034,81.242477000000065],[-89.044448999999986,81.24275200000011],[-88.982223999999974,81.241928000000144],[-88.954178000000013,81.24275200000011],[-88.944152999999972,81.24414100000007],[-88.935821999999973,81.247756999999979],[-88.949721999999895,81.253601000000003],[-88.979445999999996,81.258330999999998],[-89.162215999999944,81.255829000000119],[-89.198607999999865,81.253326000000129],[-89.265014999999948,81.244431000000134],[-89.307220000000029,81.240540000000067],[-89.335280999999952,81.24275200000011],[-89.443603999999937,81.260543999999982],[-89.687774999999988,81.289978000000133],[-89.775008999999955,81.296371000000079],[-89.868056999999965,81.306090999999981],[-89.898620999999935,81.31053199999991],[-89.91722099999987,81.314422999999977],[-89.950287000000003,81.324158000000068],[-89.952498999999875,81.329437000000041],[-89.940552000000025,81.333328000000108],[-89.916396999999904,81.336928999999998],[-89.882216999999969,81.340271000000087],[-89.702224999999999,81.350266000000033],[-89.627212999999983,81.356644000000017],[-89.242492999999968,81.423035000000027],[-89.059158000000025,81.455551000000071],[-88.928328999999962,81.485535000000141],[-88.90943900000002,81.490814000000114],[-88.846953999999982,81.49971000000005],[-88.715835999999967,81.513045999999974],[-88.545272999999952,81.525269000000037],[-88.494995000000017,81.527206000000092],[-88.406113000000005,81.528320000000065],[-88.37110899999999,81.526931999999988],[-88.161391999999921,81.530273000000022],[-88.029998999999975,81.535812000000021],[-87.984160999999972,81.535812000000021],[-87.959732000000031,81.534714000000122],[-87.939437999999996,81.531661999999983],[-87.893699999999967,81.524712000000136],[-87.801391999999964,81.515548999999965],[-87.679442999999935,81.51388500000013],[-87.490279999999984,81.508880999999974],[-87.431380999999931,81.50471500000009],[-87.398894999999982,81.500824000000023],[-87.343063000000029,81.492752000000053],[-87.311110999999983,81.488876000000005],[-87.276672000000019,81.485809000000074],[-87.251403999999923,81.487488000000042],[-87.244719999999973,81.490265000000136],[-87.286391999999921,81.505554000000075],[-87.288329999999974,81.506104000000107],[-87.315551999999968,81.513321000000019],[-87.37860099999989,81.517212000000086],[-87.489166000000012,81.523315000000025],[-87.645844000000011,81.527480999999909],[-87.721664000000033,81.532211000000132],[-87.751952999999958,81.535263000000043],[-87.915008999999941,81.552765000000079],[-88.279449,81.579436999999984],[-88.306380999999931,81.581374999999923],[-88.352218999999991,81.579712000000029],[-88.392226999999991,81.57777400000009],[-88.446944999999971,81.572220000000073],[-88.552215999999987,81.558868000000018],[-88.642226999999934,81.551651000000106],[-88.669448999999986,81.550537000000134],[-88.769164999999987,81.551086000000112],[-88.849990999999989,81.550537000000134],[-88.900283999999886,81.548325000000091],[-88.998046999999985,81.540543000000127],[-89.073058999999944,81.532211000000132],[-89.145844000000011,81.523041000000092],[-89.282500999999911,81.505264000000011],[-89.548339999999882,81.477203000000145],[-89.585555999999997,81.473037999999974],[-89.710280999999952,81.455261000000064],[-90.011397999999929,81.416930999999977],[-90.370833999999945,81.375259000000085],[-90.443053999999961,81.366652999999985],[-90.467498999999918,81.367751999999996],[-90.500564999999938,81.371368000000018],[-90.535827999999981,81.37692300000009],[-90.553329000000019,81.38499500000006],[-90.525283999999999,81.388596000000121],[-90.517226999999934,81.389160000000061],[-90.478881999999999,81.394440000000145],[-90.481383999999991,81.396652000000017],[-90.487777999999935,81.398604999999975],[-90.516953000000001,81.402481000000023],[-90.643616000000009,81.416381999999999],[-90.678328999999962,81.417480000000126],[-90.746658000000025,81.422211000000061],[-90.779998999999975,81.425537000000077],[-90.811385999999914,81.429977000000065],[-90.841110000000015,81.435531999999967],[-90.854171999999949,81.440536000000122],[-90.856658999999922,81.444138000000066],[-90.853881999999942,81.450821000000076],[-90.848342999999943,81.454987000000131],[-90.80082699999997,81.464995999999985],[-90.770554000000004,81.469711000000018],[-90.583069000000023,81.497482000000105],[-90.540282999999988,81.501663000000008],[-90.312209999999993,81.531371999999976],[-90.130553999999904,81.564423000000147],[-89.874709999999936,81.599152000000004],[-89.797500999999954,81.602478000000019],[-89.674438000000009,81.601654000000053],[-89.632492000000013,81.604706000000022],[-89.597503999999958,81.614151000000049],[-89.585006999999962,81.619705000000067],[-89.585006999999962,81.625809000000061],[-89.601943999999889,81.627762000000018],[-89.798889000000031,81.629974000000061],[-89.868056999999965,81.630264000000125],[-89.914169000000015,81.628310999999997],[-89.962218999999948,81.625534000000073],[-90.069457999999941,81.633606000000043],[-90.111580000000004,81.656746000000112],[-90.204726999999934,81.686371000000065],[-90.271392999999989,81.697479000000101],[-90.296950999999979,81.698593000000074],[-90.330291999999986,81.696090999999967],[-90.353057999999976,81.690536000000066],[-90.36082499999992,81.685257000000092],[-90.355270000000019,81.673599000000081],[-90.337218999999948,81.662491000000102],[-90.354720999999984,81.651382000000012],[-90.511123999999995,81.65776100000005],[-90.604720999999927,81.664703000000145],[-90.638901000000033,81.668045000000063],[-90.678878999999995,81.668869000000029],[-90.718886999999938,81.666656000000103],[-90.734725999999966,81.660812000000078],[-90.74221799999998,81.655548000000067],[-90.763625999999931,81.645537999999988],[-90.779723999999987,81.641098],[-90.803878999999995,81.636108000000092],[-90.834731999999974,81.631363000000079],[-90.878052000000025,81.627472000000012],[-90.923888999999974,81.625259000000028],[-90.966948999999943,81.621094000000028],[-90.99110399999995,81.616088999999988],[-91.006957999999997,81.598876999999959],[-91.003341999999918,81.592209000000025],[-90.988602000000014,81.579436999999984],[-90.988602000000014,81.557754999999986],[-91.071670999999981,81.537200999999982],[-91.091949,81.533874999999966],[-91.104445999999996,81.534424000000115],[-91.113891999999964,81.539978000000076],[-91.236938000000009,81.543320000000051],[-91.313888999999961,81.53414900000007],[-91.401397999999972,81.526382000000126],[-91.446380999999974,81.524428999999998],[-91.463332999999977,81.526093000000003],[-91.467772999999909,81.527206000000092],[-91.452498999999932,81.531661999999983],[-91.428604000000007,81.536652000000061],[-91.411117999999988,81.541931000000034],[-91.406386999999938,81.547760000000039],[-91.444153000000028,81.583603000000096],[-91.474441999999954,81.588882000000069],[-91.654175000000009,81.605819999999994],[-91.74722300000002,81.60914600000001],[-91.85722399999986,81.612762000000089],[-91.878326000000015,81.614151000000049],[-91.900283999999999,81.616928000000144],[-91.938599000000011,81.625534000000073],[-91.948607999999922,81.631088000000091],[-91.956664999999987,81.658600000000035],[-91.949432000000002,81.662201000000096],[-91.926940999999999,81.664992999999981],[-91.902221999999938,81.666931000000091],[-91.867767000000015,81.663315000000068],[-91.838897999999858,81.658600000000035],[-91.801101999999958,81.658600000000035],[-91.770844000000011,81.663315000000068],[-91.73721299999994,81.686920000000043],[-91.725829999999917,81.706650000000025],[-91.723617999999874,81.72164900000007],[-91.485549999999989,81.769989000000123],[-91.386123999999995,81.77388000000002],[-91.351395000000025,81.770264000000111],[-91.287506000000008,81.761931999999945],[-91.255004999999983,81.759155000000078],[-91.212508999999898,81.759430000000066],[-91.053328999999906,81.761658000000011],[-91.03443900000002,81.763885000000073],[-91.033324999999991,81.76776099999995],[-91.05749499999996,81.772766000000047],[-91.090560999999923,81.777206000000035],[-91.117766999999958,81.784424000000058],[-91.140563999999983,81.791930999999977],[-91.152495999999928,81.798035000000027],[-91.147232000000031,81.803864000000033],[-91.137511999999958,81.808594000000085],[-91.101104999999961,81.818878000000097],[-91.051665999999955,81.828872999999987],[-91.001113999999973,81.832764000000054],[-90.852218999999991,81.842483999999956],[-90.727492999999981,81.841094999999996],[-90.704178000000013,81.843597000000045],[-90.689986999999917,81.848602000000085],[-90.686377999999991,81.853966000000014],[-90.678328999999962,81.858597000000032],[-90.635009999999966,81.868866000000025],[-90.610001000000011,81.873871000000065],[-90.565276999999867,81.878036000000066],[-90.436661000000015,81.887497000000053],[-90.338057999999933,81.893051000000071],[-90.245270000000005,81.896102999999982],[-90.154449,81.896652000000131],[-89.990828999999962,81.905548000000067],[-89.783324999999934,81.917206000000078],[-89.735824999999977,81.917480000000012],[-89.700835999999981,81.915543000000127],[-89.676940999999999,81.9102630000001],[-89.683051999999975,81.899437000000148],[-89.682494999999903,81.883330999999998],[-89.649445000000014,81.863312000000064],[-89.629989999999964,81.856369000000029],[-89.461394999999982,81.818054000000132],[-89.425003000000004,81.815262000000018],[-89.356383999999935,81.811096000000134],[-89.244720000000029,81.846375000000023],[-89.227218999999991,81.852203000000145],[-89.203223999999977,81.878036000000066],[-89.19923399999999,81.881537999999921],[-89.199059000000034,81.885208000000034],[-89.213218999999981,81.888382000000092],[-89.328063999999927,81.902206000000092],[-89.367217999999923,81.905548000000067],[-89.397506999999962,81.909424000000115],[-89.419158999999979,81.915543000000127],[-89.416945999999939,81.925812000000008],[-89.397780999999895,81.930817000000047],[-89.371658000000025,81.935806000000014],[-89.338897999999972,81.940262000000075],[-89.288895000000025,81.943038999999999],[-89.249724999999955,81.941086000000041],[-89.157393999999954,81.928368000000091],[-89.156218999999908,81.925201000000072],[-89.152556999999945,81.921371000000079],[-89.133057000000008,81.918533000000082],[-89.074721999999952,81.911652000000061],[-89.033324999999991,81.912201000000039],[-89.007232999999871,81.915543000000127],[-88.98971599999993,81.921097000000145],[-88.986388999999974,81.944976999999938],[-88.992767000000015,81.951385000000073],[-89.011947999999904,81.958603000000096],[-89.048339999999996,81.978043000000071],[-89.054442999999992,81.987487999999985],[-89.041106999999954,81.993041999999946],[-89.021117999999944,81.998032000000023],[-88.963897999999972,82.008041000000048],[-88.77305599999994,82.039429000000041],[-88.625548999999978,82.062759000000028],[-88.589721999999938,82.066665999999998],[-88.543059999999912,82.070540999999992],[-88.443054000000018,82.074997000000053],[-88.296660999999915,82.080276000000026],[-88.25,82.080826000000059],[-88.145003999999972,82.086928999999998],[-88.11361699999992,82.090545999999961],[-88.09973100000002,82.093048000000067],[-88.095001000000025,82.096374999999966],[-88.085281000000009,82.101379000000122],[-88.075561999999934,82.104980000000012],[-88.038329999999974,82.103867000000093],[-87.91194200000001,82.090820000000065],[-87.71833799999996,82.083878000000027],[-87.702224999999942,82.086928999999998],[-87.666396999999904,82.089431999999988],[-87.641952999999944,82.090271000000143],[-87.599730999999963,82.089157],[-87.50140399999998,82.084152000000131],[-87.402221999999938,82.07388300000008],[-87.352782999999931,82.06721500000009],[-87.333617999999888,82.063309000000061],[-87.271666999999979,82.047759999999926],[-87.230559999999969,82.036926000000051],[-87.195830999999998,82.026382000000012],[-87.183608999999933,82.022491000000116],[-87.174437999999896,82.014708999999982],[-87.173324999999977,82.011107999999922],[-87.178603999999893,82.007767000000115],[-87.197768999999937,82.002213000000097],[-87.232773000000009,81.99331699999999],[-87.258057000000008,81.989426000000094],[-87.299987999999985,81.979155999999989],[-87.314437999999996,81.973877000000016],[-87.309432999999956,81.967484000000013],[-87.265839000000028,81.958878000000141],[-87.169158999999979,81.945526000000086],[-87.101669000000015,81.937759000000142],[-87.063323999999909,81.934418000000107],[-86.939437999999996,81.918868999999972],[-86.877212999999983,81.909424000000115],[-86.828887999999949,81.897491000000059],[-86.804169000000002,81.893051000000071],[-86.768341000000021,81.890273999999977],[-86.726669000000015,81.891937000000098],[-86.726944000000003,81.897217000000126],[-86.734160999999915,81.902771000000143],[-86.745833999999945,81.906647000000021],[-86.834732000000031,81.927765000000136],[-86.86361699999992,81.933593999999971],[-86.919448999999986,81.942748999999992],[-87.066101000000003,81.954987000000074],[-87.098052999999936,81.958328000000108],[-87.127212999999927,81.963882000000069],[-87.130279999999857,81.968322999999998],[-87.00140399999998,82.036102000000085],[-86.987212999999997,82.039978000000019],[-86.931670999999938,82.049423000000047],[-86.892501999999979,82.054153000000099],[-86.84333799999996,82.05720500000001],[-86.791945999999939,82.058029000000147],[-86.583617999999944,82.053863999999976],[-86.356383999999991,82.053588999999988],[-86.27806099999998,82.050812000000064],[-86.239166000000012,82.048599000000081],[-86.202788999999996,82.04553199999998],[-86.169158999999922,82.041656000000103],[-86.016112999999962,82.016663000000051],[-85.960555999999997,82.00749200000007],[-85.914443999999946,81.997481999999991],[-85.815001999999993,81.973877000000016],[-85.767501999999922,81.961928999999941],[-85.731383999999878,81.949996999999996],[-85.628875999999991,81.916092000000106],[-85.467223999999987,81.867203000000131],[-85.422501000000011,81.857483000000059],[-85.379439999999988,81.856934000000081],[-85.371658000000025,81.859711000000004],[-85.37388599999997,81.863876000000005],[-85.385833999999932,81.874985000000095],[-85.398055999999997,81.881088000000034],[-85.441939999999988,81.893875000000037],[-85.469451999999876,81.899719000000005],[-85.566101000000003,81.924988000000042],[-85.654723999999987,81.950821000000133],[-85.731948999999986,81.983322000000044],[-85.729996000000028,81.987762000000089],[-85.726943999999946,81.990265000000079],[-85.693877999999984,81.994980000000112],[-85.650557999999933,81.99832200000003],[-85.559432999999956,82.001663000000065],[-85.258621000000005,81.996933000000013],[-85.217498999999975,81.995529000000033],[-85.188323999999909,81.99275200000011],[-85.165833000000021,81.985259999999982],[-85.160004000000015,81.979706000000022],[-85.140563999999927,81.966095000000053],[-85.096389999999985,81.945816000000093],[-85.018889999999999,81.919434000000024],[-84.984160999999915,81.911102000000028],[-84.879439999999988,81.887497000000053],[-84.838897999999915,81.882476999999994],[-84.816887000000008,81.885367999999914],[-84.821884000000011,81.888214000000062],[-84.844222999999886,81.894882000000052],[-84.863891999999964,81.900269000000037],[-84.915008999999998,81.918045000000006],[-84.994719999999973,81.948593000000017],[-85.025283999999942,81.960815000000139],[-85.037216000000001,81.966933999999981],[-85.048889000000031,81.974426000000108],[-85.066100999999946,81.987487999999985],[-85.055556999999965,81.990814],[-85.038329999999974,81.994141000000127],[-85.00111400000003,81.994141000000127],[-84.929169000000002,81.993041999999946],[-84.889174999999966,81.990265000000079],[-84.858886999999925,81.985259999999982],[-84.831680000000006,81.979430999999977],[-84.816665999999941,81.970825000000048],[-84.814437999999996,81.966385000000059],[-84.815276999999924,81.961104999999975],[-84.821945000000028,81.949141999999938],[-84.797606999999971,81.930870000000141],[-84.789267999999993,81.924698000000035],[-84.75144199999994,81.910538000000088],[-84.74227899999994,81.908378999999968],[-84.688598999999954,81.891937000000098],[-84.656113000000005,81.887772000000098],[-84.635283999999956,81.886108000000036],[-84.621933000000013,81.886932000000002],[-84.604996000000028,81.88998400000014],[-84.714721999999995,81.969986000000119],[-84.729720999999984,81.977203000000031],[-84.751677999999913,81.984711000000061],[-84.815276999999924,82.00082400000008],[-84.840835999999967,82.006103999999993],[-84.89973399999991,82.015274000000034],[-84.93249499999996,82.019440000000088],[-85.039992999999981,82.028594999999996],[-85.116942999999935,82.033051000000057],[-85.405838000000017,82.042205999999965],[-85.678328999999906,82.054428000000087],[-85.755843999999968,82.058868000000132],[-85.851669000000015,82.06721500000009],[-85.915833000000021,82.07748400000014],[-85.999725000000012,82.094147000000021],[-86.062209999999936,82.103867000000093],[-86.091109999999901,82.104431000000034],[-86.278885000000002,82.107208000000128],[-86.485001000000011,82.114150999999936],[-86.565551999999968,82.118865999999969],[-86.637511999999958,82.124419999999986],[-86.706116000000009,82.131927000000132],[-86.731383999999935,82.136383000000023],[-86.752228000000002,82.141098000000056],[-86.856658999999922,82.184708000000057],[-86.869155999999919,82.195251000000042],[-86.876099000000011,82.202208999999982],[-86.871933000000013,82.207764000000111],[-86.843613000000005,82.212494000000106],[-86.764174999999966,82.221649000000014],[-86.669448999999929,82.228316999999947],[-86.619445999999982,82.229705999999965],[-86.571670999999981,82.230270000000075],[-86.520003999999915,82.229705999999965],[-86.316665999999998,82.224701000000096],[-86.228881999999885,82.224701000000096],[-86.181106999999997,82.225266000000147],[-86.137787000000003,82.226929000000041],[-85.984436000000017,82.237488000000099],[-85.934158000000025,82.238876000000005],[-85.841384999999946,82.239151000000049],[-85.798889000000031,82.237762000000032],[-85.753890999999953,82.237488000000099],[-85.706115999999952,82.23803700000002],[-85.662215999999944,82.239699999999971],[-85.61999499999996,82.243591000000038],[-85.603881999999999,82.24914600000011],[-85.598891999999978,82.254440000000102],[-85.580565999999976,82.264434999999992],[-85.557770000000005,82.269440000000088],[-85.508347000000015,82.273041000000092],[-85.413895000000025,82.27609300000006],[-85.370833999999945,82.279984000000127],[-85.350554999999929,82.283875000000023],[-85.34722899999997,82.286377000000073],[-85.367492999999911,82.291092000000106],[-85.396392999999989,82.29693600000013],[-85.457229999999981,82.307479999999998],[-85.481673999999941,82.313599000000011],[-85.489990000000034,82.319716999999969],[-85.515015000000005,82.343322999999998],[-85.531677000000002,82.369705000000067],[-85.50167799999997,82.393600000000106],[-85.501403999999923,82.398880000000133],[-85.515288999999996,82.403320000000008],[-85.534164000000033,82.407486000000063],[-85.669448999999872,82.409424000000001],[-85.866942999999992,82.421920999999998],[-85.904998999999975,82.424988000000099],[-85.921111999999994,82.429977000000065],[-85.911941999999954,82.435806000000071],[-85.819732999999928,82.454437000000098],[-85.794723999999974,82.458602999999982],[-85.746947999999975,82.461380000000077],[-85.708617999999944,82.463608000000022],[-85.502501999999993,82.471099999999979],[-85.298614999999927,82.478042999999957],[-85.046950999999979,82.481934000000024],[-85.003066999999874,82.480820000000051],[-84.693877999999927,82.471375000000023],[-84.662780999999995,82.468596999999988],[-84.641678000000013,82.465546000000018],[-84.62222300000002,82.459152000000131],[-84.616394000000014,82.453598000000113],[-84.613326999999913,82.447204999999997],[-84.613326999999913,82.4433140000001],[-84.631377999999984,82.440262000000018],[-84.787780999999995,82.434982000000105],[-84.895279000000016,82.433594000000028],[-84.940552000000025,82.431931000000077],[-84.943877999999984,82.425812000000064],[-84.916655999999932,82.42053199999998],[-84.888610999999855,82.416930999999977],[-84.714721999999995,82.405822999999941],[-84.559722999999906,82.394989000000066],[-84.482498000000021,82.389435000000105],[-84.449996999999996,82.386107999999979],[-84.418334999999956,82.381088000000091],[-84.388061999999991,82.371094000000085],[-84.384170999999924,82.366089000000045],[-84.387221999999952,82.361649],[-84.378600999999946,82.356933999999967],[-84.34445199999999,82.352768000000083],[-84.303329000000019,82.355819999999994],[-84.228881999999999,82.363876000000062],[-84.180556999999965,82.368042000000003],[-84.146956999999986,82.369705000000067],[-84.095550999999944,82.371094000000085],[-84.047226000000023,82.371368000000018],[-83.961394999999925,82.368591000000094],[-83.876937999999939,82.364151000000106],[-83.841948999999943,82.361374000000012],[-83.767501999999979,82.353043000000071],[-83.606383999999935,82.33137499999998],[-83.516402999999968,82.316940000000045],[-83.384734999999978,82.282210999999961],[-83.36860699999994,82.276381999999955],[-83.360001000000011,82.269440000000088],[-83.360001000000011,82.263611000000026],[-83.369155999999975,82.251663000000008],[-83.371933000000013,82.24470500000001],[-83.371933000000013,82.239151000000049],[-83.344451999999933,82.227203000000145],[-83.308334000000002,82.218323000000112],[-83.24221799999998,82.204163000000051],[-83.184157999999968,82.194702000000063],[-83.130553999999961,82.184981999999991],[-83.083892999999932,82.175812000000121],[-83.022781000000009,82.159424000000058],[-83,82.151093000000003],[-82.976669000000015,82.138321000000133],[-82.953063999999983,82.119979999999998],[-82.95666499999993,82.109711000000118],[-82.958617999999944,82.104431000000034],[-82.968338000000017,82.098038000000088],[-82.978058000000033,82.093872000000033],[-83.001953000000015,82.089157],[-83.0625,82.080276000000026],[-83.126098999999954,82.072495000000004],[-83.128051999999968,82.06721500000009],[-83.111937999999952,82.065261999999962],[-83.076400999999919,82.061920000000043],[-82.974166999999966,82.064986999999974],[-82.888335999999981,82.072495000000004],[-82.797501000000011,82.077773999999977],[-82.758057000000008,82.076934999999992],[-82.674438000000009,82.073043999999925],[-82.636397999999986,82.070540999999992],[-82.421660999999972,82.066940000000102],[-82.284163999999976,82.066375999999991],[-82.199432000000002,82.064147999999989],[-82.122222999999906,82.058594000000028],[-82.055556999999965,82.050812000000064],[-81.963622999999927,82.037201000000096],[-81.926101999999958,82.034714000000008],[-81.889998999999989,82.034988000000112],[-81.878051999999968,82.03637700000013],[-81.884734999999921,82.041091999999992],[-81.924164000000019,82.058868000000132],[-81.966110000000015,82.071105999999986],[-82.020844000000011,82.082213999999965],[-82.05860899999999,82.084717000000126],[-82.102492999999981,82.085541000000092],[-82.243056999999965,82.084991000000059],[-82.417496000000028,82.087204000000042],[-82.546386999999982,82.090271000000143],[-82.58444199999991,82.09275800000006],[-82.619719999999916,82.096099999999979],[-82.651947000000007,82.100266000000033],[-82.676940999999943,82.10775799999999],[-82.683884000000035,82.118317000000047],[-82.688599000000011,82.126083000000108],[-82.697495000000004,82.131362999999965],[-82.717223999999931,82.142761000000007],[-82.731383999999935,82.149993999999992],[-82.772232000000031,82.163315000000125],[-82.860275000000001,82.187759000000085],[-82.886947999999961,82.193862999999908],[-82.94027699999998,82.203598],[-82.987503000000004,82.214995999999985],[-83.011397999999986,82.221649000000014],[-83.027785999999878,82.235259999999982],[-83.028884999999946,82.264998999999989],[-83.028884999999946,82.276657],[-83.02555799999999,82.283324999999991],[-83.019164999999873,82.288879000000122],[-82.990829000000019,82.292480000000012],[-82.735549999999932,82.286102000000028],[-82.693603999999937,82.284714000000122],[-82.654448999999886,82.282210999999961],[-82.621658000000025,82.278045999999961],[-82.508895999999936,82.258040999999992],[-82.452788999999939,82.249420000000043],[-82.286666999999966,82.229156000000103],[-82.263061999999991,82.222214000000008],[-82.211120999999991,82.204711999999972],[-82.160278000000005,82.193313999999987],[-82.101943999999946,82.183044000000052],[-82.011123999999995,82.168594000000098],[-81.918059999999912,82.15498400000007],[-81.608886999999982,82.118590999999981],[-81.425277999999935,82.0977630000001],[-81.353057999999976,82.091659999999933],[-81.249161000000015,82.081375000000037],[-81.150283999999999,82.068878000000041],[-81.091110000000015,82.059417999999994],[-80.868332000000009,82.03137200000009],[-80.640288999999996,82.018326000000116],[-80.43249499999996,81.997481999999991],[-80.225829999999974,81.986098999999967],[-80.153609999999958,81.981368999999916],[-80.085006999999905,81.973602000000142],[-80.035277999999948,81.963042999999914],[-79.883056999999951,81.924698000000035],[-79.610000999999897,81.851089000000002],[-79.589721999999938,81.844147000000078],[-79.587783999999999,81.838318000000072],[-79.577224999999942,81.828872999999987],[-79.564163000000008,81.825271999999927],[-79.53443900000002,81.820831000000055],[-79.492217999999923,81.819717000000026],[-79.244445999999925,81.816085999999984],[-79.229171999999949,81.816085999999984],[-79.452224999999999,81.88998400000014],[-79.489989999999977,81.900269000000037],[-79.521117999999888,81.905548000000067],[-79.579726999999934,81.913605000000018],[-79.670837000000006,81.927475000000072],[-79.844451999999933,81.97137499999991],[-79.837783999999942,82.007217000000082],[-79.832229999999868,82.013885000000016],[-79.853333000000021,82.018875000000094],[-79.880829000000006,82.021927000000005],[-79.916397000000018,82.023880000000133],[-80.213897999999858,82.032211000000018],[-80.331680000000006,82.038589000000002],[-80.368606999999997,82.041091999999992],[-80.624435000000005,82.061920000000043],[-80.657226999999921,82.064697000000137],[-80.725554999999986,82.071655000000135],[-80.791107000000011,82.079437000000098],[-80.822234999999921,82.083878000000027],[-80.878326000000015,82.094147000000021],[-80.922226000000023,82.103592000000106],[-80.948607999999979,82.110260000000096],[-80.962783999999999,82.116379000000109],[-80.975554999999986,82.12359600000002],[-80.975554999999986,82.127762000000132],[-80.956664999999987,82.137206999999989],[-80.931380999999988,82.142212000000029],[-80.89973399999991,82.146378000000141],[-80.874435000000005,82.151093000000003],[-80.868056999999965,82.15498400000007],[-80.909163999999976,82.156647000000135],[-81.051391999999964,82.154709000000025],[-81.171111999999994,82.156372000000147],[-81.253341999999918,82.159714000000065],[-81.324722000000008,82.164993000000038],[-81.423324999999977,82.176926000000094],[-81.799728000000016,82.222762999999986],[-81.825561999999934,82.226654000000053],[-81.887786999999946,82.23803700000002],[-82.170546999999999,82.286652000000061],[-82.454726999999991,82.328048999999965],[-82.513061999999934,82.337769000000037],[-82.625548999999921,82.359146000000067],[-82.679992999999968,82.37081900000004],[-82.711670000000026,82.382477000000108],[-82.722778000000005,82.388321000000076],[-82.7308349999999,82.395264000000111],[-82.732223999999974,82.401657000000057],[-82.728881999999942,82.408325000000048],[-82.710281000000009,82.419434000000081],[-82.698333999999988,82.424988000000099],[-82.539444000000003,82.497208000000114],[-82.520553999999947,82.502487000000087],[-82.498336999999992,82.506377999999984],[-82.458892999999989,82.508331000000112],[-82.406386999999881,82.509155000000078],[-82.316956000000005,82.506943000000035],[-82.091675000000009,82.501389000000017],[-81.669997999999907,82.492477000000008],[-81.541672000000005,82.496093999999971],[-81.542220999999927,82.504990000000078],[-81.713332999999977,82.51527400000009],[-81.75140399999998,82.516937000000041],[-81.84722899999997,82.515548999999965],[-81.880554000000018,82.517761000000007],[-81.927489999999977,82.522766000000047],[-81.966400000000021,82.528870000000097],[-82.263901000000033,82.576660000000061],[-82.321121000000005,82.589157000000057],[-82.343886999999938,82.595261000000107],[-82.390288999999996,82.611923000000104],[-82.394729999999925,82.617477000000065],[-82.392226999999934,82.622756999999979],[-82.38110399999988,82.634720000000016],[-82.371933000000013,82.639708999999982],[-82.354445999999996,82.645537999999988],[-82.335281000000009,82.650543000000027],[-82.288054999999986,82.659988000000112],[-82.255004999999926,82.664428999999984],[-82.215285999999992,82.668593999999985],[-82.154998999999918,82.671097000000145],[-82.060271999999998,82.669708000000014],[-81.97222899999997,82.666382000000112],[-81.931380999999931,82.663878999999952],[-81.543335000000013,82.637207000000046],[-81.432495000000017,82.629150000000095],[-81.359725999999966,82.62081900000004],[-81.30082699999997,82.611098999999911],[-81.136123999999995,82.578049000000078],[-80.989440999999999,82.547211000000061],[-80.949721999999952,82.538040000000137],[-80.891952999999944,82.532760999999994],[-80.581679999999949,82.543045000000006],[-80.578063999999983,82.546097000000088],[-80.599166999999966,82.55442800000003],[-80.87388599999997,82.629700000000128],[-80.994445999999925,82.650269000000094],[-81.049987999999985,82.660812000000078],[-81.077224999999999,82.666931000000091],[-81.097503999999958,82.672485000000052],[-81.124709999999993,82.686919999999986],[-81.223617999999988,82.715820000000065],[-81.305831999999953,82.733871000000022],[-81.449996999999996,82.755553999999961],[-81.508620999999948,82.764709000000039],[-81.573623999999938,82.788315000000068],[-81.58444199999991,82.794434000000138],[-81.585006999999962,82.800812000000064],[-81.571670999999924,82.806366000000082],[-81.556655999999975,82.811371000000122],[-81.536391999999921,82.816665999999998],[-81.514175000000023,82.821106000000043],[-81.473052999999993,82.82499700000011],[-81.411391999999921,82.827773999999977],[-81.359725999999966,82.827773999999977],[-81.022232000000031,82.821930000000009],[-80.977218999999934,82.820267000000058],[-80.801940999999999,82.812485000000095],[-80.500564999999995,82.797484999999938],[-80.418334999999956,82.792205999999965],[-80.381103999999993,82.788879000000065],[-80.318618999999956,82.779984000000013],[-80.2933349999999,82.774429000000112],[-80.15834000000001,82.727768000000083],[-80.138901000000033,82.719986000000119],[-80.139449999999954,82.715820000000065],[-80.178329000000019,82.699997000000053],[-80.182495000000017,82.69470199999995],[-80.181380999999931,82.687759000000142],[-80.160277999999948,82.681366000000025],[-80.070846999999901,82.665543000000014],[-80.003066999999987,82.656372000000033],[-79.941665999999998,82.649429000000055],[-79.861664000000019,82.644150000000081],[-79.817779999999914,82.644440000000088],[-79.800827000000027,82.646652000000131],[-79.803604000000007,82.649994000000049],[-79.822509999999966,82.65776100000005],[-79.848617999999988,82.663878999999952],[-79.966949,82.684708000000114],[-79.983321999999987,82.689147999999989],[-79.977492999999981,82.695815999999922],[-79.961394999999925,82.700821000000019],[-79.928604000000007,82.705551000000014],[-79.885833999999875,82.708602999999925],[-79.829726999999991,82.708878000000141],[-79.787505999999894,82.707763999999997],[-79.74749799999995,82.704987000000074],[-79.684158000000025,82.699706999999989],[-79.617492999999911,82.693039000000056],[-79.468338000000017,82.677475000000129],[-79.384734999999978,82.672760000000096],[-79.149993999999936,82.667755000000056],[-78.843613000000005,82.664992999999981],[-78.565552000000025,82.674698000000035],[-78.521118000000001,82.67692599999998],[-78.502791999999999,82.681090999999981],[-78.53195199999999,82.684418000000107],[-78.576675000000023,82.686919999999986],[-78.840835999999967,82.680817000000047],[-78.895003999999858,82.680267000000015],[-78.931945999999982,82.681656000000032],[-79.243057000000022,82.695251000000098],[-79.331680000000006,82.699706999999989],[-79.40306099999998,82.70637499999998],[-79.623046999999985,82.727768000000083],[-79.836944999999901,82.750549000000092],[-79.886948000000018,82.759430000000066],[-79.913329999999917,82.765274000000034],[-79.93638599999997,82.772217000000069],[-79.996947999999975,82.803314],[-79.975829999999974,82.808594000000028],[-79.942489999999964,82.811371000000122],[-79.692215000000033,82.818054000000075],[-79.674437999999952,82.820267000000058],[-79.67222599999991,82.823883000000137],[-79.673889000000031,82.824707000000103],[-79.847777999999948,82.834991000000116],[-79.896118000000001,82.835815000000082],[-80.006667999999934,82.834427000000005],[-80.110000999999954,82.834717000000012],[-80.15834000000001,82.835541000000148],[-80.194153000000028,82.838318000000072],[-80.219727000000034,82.84165999999999],[-80.277221999999938,82.850815000000011],[-80.393065999999976,82.875534000000016],[-80.430282999999974,82.887497000000053],[-80.42971799999998,82.894150000000025],[-80.398055999999997,82.899719000000005],[-80.095839999999953,82.937194999999974],[-79.904723999999987,82.951096000000121],[-79.793335000000013,82.957489000000123],[-79.458344000000011,82.974152000000004],[-79.414444000000003,82.975266000000147],[-79.370543999999995,82.974152000000004],[-79.177489999999977,82.951935000000105],[-79.073333999999988,82.901931999999988],[-79.064437999999882,82.895828000000108],[-79.066101000000003,82.889434999999992],[-78.928054999999972,82.898605000000032],[-78.825287000000003,82.928040000000124],[-78.780288999999982,82.93803400000013],[-78.756118999999956,82.942474000000118],[-78.719726999999978,82.946640000000059],[-78.671111999999937,82.945526000000086],[-78.631942999999978,82.941360000000145],[-78.546111999999994,82.926651000000106],[-78.521666999999923,82.921097000000088],[-78.503341999999918,82.913314999999955],[-78.501953000000015,82.907760999999994],[-78.504180999999903,82.901093000000003],[-78.521941999999967,82.889159999999947],[-78.538605000000018,82.876647999999989],[-78.557770000000005,82.860535000000141],[-78.553328999999906,82.853592000000106],[-78.53443900000002,82.8477630000001],[-78.500564999999938,82.845534999999984],[-78.341674999999952,82.850540000000024],[-78.175551999999982,82.827208999999982],[-78.14416499999993,82.823318000000086],[-78.109160999999972,82.825272000000098],[-78.106658999999979,82.831940000000088],[-78.128875999999877,82.836655000000121],[-78.194442999999922,82.845824999999991],[-78.223617999999988,82.851088999999945],[-78.241378999999938,82.858871000000079],[-78.238891999999964,82.865265000000136],[-78.108337000000006,82.893326000000059],[-78.080291999999986,82.898331000000098],[-77.986663999999962,82.909988000000055],[-77.949996999999883,82.91415400000011],[-77.863327000000027,82.921371000000022],[-77.813048999999864,82.92442299999999],[-77.768340999999964,82.922485000000052],[-77.708344000000011,82.916092000000049],[-77.688889000000017,82.912490999999989],[-77.616652999999985,82.902771000000087],[-77.528060999999923,82.891098000000113],[-77.467223999999987,82.883880999999974],[-77.405272999999909,82.878860000000032],[-77.319457999999997,82.873306000000014],[-77.128325999999959,82.863312000000008],[-77.108046999999999,82.859146000000123],[-77.089171999999962,82.852767999999969],[-76.96665999999999,82.804703000000131],[-76.959166999999923,82.774155000000007],[-76.941665999999998,82.768326000000002],[-76.898346000000004,82.766098],[-76.851104999999961,82.764999000000046],[-76.815552000000025,82.761107999999979],[-76.789168999999958,82.756377999999927],[-76.766662999999994,82.750823999999966],[-76.708617999999944,82.733047000000056],[-76.674438000000009,82.721374999999966],[-76.644164999999987,82.709152000000074],[-76.612503000000004,82.696091000000138],[-76.598052999999993,82.688873000000115],[-76.570556999999951,82.666656000000046],[-76.538329999999974,82.664153999999996],[-76.387221999999952,82.651382000000012],[-76.09333799999996,82.62081900000004],[-76.058884000000035,82.616928000000144],[-75.913895000000025,82.597487999999942],[-75.892226999999991,82.591933999999981],[-75.896392999999989,82.588318000000072],[-75.918610000000001,82.579987000000017],[-75.938323999999966,82.575821000000133],[-75.972778000000005,82.571381000000088],[-76.038895000000025,82.557205000000067],[-76.194716999999969,82.511108000000036],[-76.207503999999972,82.506377999999984],[-76.217772999999909,82.500548999999978],[-76.255279999999971,82.471924000000115],[-76.261002000000019,82.466552999999976],[-76.236937999999896,82.445250999999985],[-76.230835000000013,82.444702000000007],[-76.184158000000025,82.453872999999987],[-76.102782999999874,82.470534999999984],[-76.037780999999939,82.484421000000111],[-75.975006000000008,82.499709999999993],[-75.887221999999952,82.522217000000126],[-75.802779999999984,82.546371000000022],[-75.773894999999925,82.557205000000067],[-75.671386999999925,82.586929000000112],[-75.648055999999997,82.591660000000047],[-75.606383999999935,82.595825000000048],[-75.500838999999928,82.600266000000147],[-75.451675000000023,82.603317000000004],[-75.420273000000009,82.606934000000138],[-75.396118000000001,82.614699999999971],[-75.40972899999997,82.61914100000007],[-75.43472300000002,82.623871000000122],[-75.468886999999881,82.627762000000018],[-75.503615999999852,82.628860000000088],[-75.55749499999996,82.628585999999984],[-75.625548999999978,82.633040999999992],[-75.670546999999999,82.642761000000064],[-75.807495000000017,82.654709000000082],[-76.103057999999976,82.68609600000002],[-76.235824999999977,82.712203999999986],[-76.256392999999946,82.717209000000025],[-76.275557999999933,82.724425999999994],[-76.299987999999871,82.739700000000028],[-76.306655999999919,82.745819000000097],[-76.309158000000025,82.752777000000094],[-76.269454999999994,82.760817999999972],[-76.226395000000025,82.764435000000105],[-76.176391999999964,82.767212000000029],[-76.056945999999982,82.771652000000017],[-76.014724999999999,82.775818000000129],[-75.989440999999999,82.779984000000013],[-75.976104999999961,82.784714000000065],[-75.998336999999935,82.787490999999932],[-76.18638599999997,82.78387500000008],[-76.241378999999995,82.783600000000035],[-76.288605000000018,82.784714000000065],[-76.375274999999988,82.789154000000053],[-76.447495000000004,82.797484999999938],[-76.50167799999997,82.8077550000001],[-76.525283999999942,82.813873000000001],[-76.545272999999952,82.821106000000043],[-76.586394999999982,82.83859300000006],[-76.629165999999998,82.859710999999947],[-76.666655999999989,82.872482000000048],[-76.710830999999985,82.885818000000029],[-76.752791999999999,82.894988999999953],[-76.844161999999983,82.90914900000007],[-76.881942999999978,82.913605000000018],[-77.025832999999977,82.927765000000079],[-77.066390999999953,82.93081699999999],[-77.131667999999991,82.939972000000068],[-77.344726999999978,82.972487999999998],[-77.385283999999899,82.983046999999999],[-77.381377999999984,82.994431000000134],[-77.364440999999999,83.000000000000114],[-77.341949,83.005554000000132],[-77.276108000000022,83.020264000000054],[-77.252227999999945,83.025269000000094],[-77.222777999999948,83.030548000000067],[-77.183883999999978,83.033875000000023],[-77.134734999999978,83.032486000000006],[-77.137221999999895,83.028320000000122],[-77.171386999999982,83.017211999999972],[-77.169723999999974,83.013885000000016],[-77.135558999999944,83.011383000000137],[-76.863051999999925,83.010818000000086],[-76.559432999999956,83.011932000000058],[-76.360274999999945,83.021378000000027],[-76.266662999999994,83.02915999999999],[-76.20666499999993,83.036652000000117],[-76.113327000000027,83.05053700000002],[-76.079177999999956,83.053589000000102],[-76.028610000000015,83.054428000000087],[-75.979720999999927,83.05304000000001],[-75.948607999999922,83.051926000000037],[-75.580841000000021,83.038040000000024],[-75.313323999999909,83.027480999999966],[-75.046951000000035,83.041656000000103],[-75,83.043884000000048],[-74.956389999999999,83.04553199999998],[-74.797501000000011,83.043594000000041],[-74.706664999999987,83.041091999999935],[-74.43582200000003,83.027205999999978],[-74.408050999999887,83.024704000000099],[-74.279175000000009,83.009995000000004],[-74.172774999999888,82.991088999999988],[-74.084166999999979,82.972487999999998],[-74.018065999999976,82.956940000000145],[-73.879439999999875,82.897217000000126],[-73.851668999999958,82.866653000000042],[-73.817779999999971,82.852767999999969],[-73.607772999999952,82.81581099999994],[-73.548339999999939,82.806091000000038],[-73.281951999999933,82.766388000000063],[-73.247222999999963,82.761658000000011],[-73.160278000000005,82.751388999999961],[-73.075011999999958,82.745819000000097],[-72.949721999999952,82.738876000000062],[-72.906661999999983,82.735808999999961],[-72.835830999999985,82.728592000000049],[-72.75,82.714706000000092],[-72.700835999999981,82.703323000000069],[-72.672225999999966,82.698593000000017],[-72.633895999999936,82.694427000000132],[-72.603332999999964,82.695815999999922],[-72.594727000000034,82.697479000000044],[-72.49888599999997,82.718323000000055],[-72.502501999999936,82.724425999999994],[-72.648894999999925,82.746643000000063],[-72.716659999999933,82.755553999999961],[-72.912216000000001,82.776657000000057],[-72.983886999999982,82.78387500000008],[-73.027221999999881,82.786926000000108],[-73.211394999999925,82.813873000000001],[-73.257506999999919,82.825821000000076],[-73.401397999999915,82.874985000000038],[-73.420272999999952,82.890548999999965],[-73.430556999999908,82.893599999999992],[-73.460830999999928,82.898605000000032],[-73.49499499999996,82.90248100000008],[-73.577224999999999,82.908035000000098],[-73.607498000000021,82.913040000000137],[-73.633330999999998,82.918593999999985],[-73.65055799999999,82.925811999999951],[-73.644164999999873,82.932205000000124],[-73.634444999999971,82.936646000000053],[-73.619155999999975,82.941086000000041],[-73.261948000000018,83.007767000000058],[-73.033889999999928,83.036652000000117],[-72.948607999999979,83.055252000000053],[-72.927489999999977,83.067490000000078],[-72.650557999999933,83.096374999999966],[-72.59973100000002,83.096939000000077],[-72.57028200000002,83.092758000000003],[-72.568619000000012,83.087769000000037],[-72.556655999999975,83.079712000000086],[-72.523894999999925,83.076934999999992],[-72.477492999999868,83.076659999999947],[-72.424163999999962,83.079163000000108],[-72.407776000000013,83.083602999999982],[-72.393616000000009,83.089431999999988],[-72.365829000000019,83.094147000000021],[-72.336394999999925,83.097763000000043],[-72.226943999999946,83.101379000000122],[-72.111938000000009,83.101089000000115],[-72.005568999999866,83.099152000000061],[-71.831680000000006,83.097763000000043],[-71.712783999999886,83.098877000000016],[-71.611663999999905,83.096099999999979],[-71.581679999999949,83.091095000000109],[-71.596953999999869,83.085266000000047],[-71.654448999999943,83.068878000000041],[-71.696380999999917,83.057755000000043],[-71.75,83.043045000000063],[-71.775008999999898,83.032211000000018],[-71.7933349999999,83.020537999999988],[-71.794998000000021,83.013611000000083],[-71.792220999999984,83.00749200000007],[-71.778335999999911,83.001663000000065],[-71.567229999999938,82.941086000000041],[-71.493606999999997,82.932205000000124],[-71.33666999999997,82.914703000000088],[-71.219726999999978,82.914993000000095],[-71.144164999999987,82.908325000000104],[-71.084166999999979,82.900542999999971],[-71.018340999999964,82.891937000000041],[-70.952224999999999,82.883605999999986],[-70.871384000000035,82.881087999999977],[-70.835006999999962,82.883041000000105],[-70.84333799999996,82.889984000000084],[-70.857773000000009,82.897217000000126],[-70.904174999999952,82.908035000000098],[-70.961944999999957,82.918593999999985],[-71.080841000000021,82.937484999999981],[-71.306380999999931,82.982208000000071],[-71.472777999999948,83.001663000000065],[-71.497498000000007,83.007217000000026],[-71.489990000000034,83.014435000000049],[-71.474166999999852,83.019440000000088],[-71.425002999999947,83.029434000000094],[-71.125274999999988,83.087494000000049],[-70.887221999999895,83.098038000000088],[-70.694152999999972,83.103592000000049],[-70.585280999999952,83.103317000000061],[-70.470000999999968,83.107482999999945],[-70.37388599999997,83.113311999999951],[-70.260009999999966,83.113876000000118],[-70.160003999999958,83.111374000000012],[-70.111937999999952,83.109421000000111]]]} +} +] +} diff --git a/benchmark/data/citm_catalog.json b/benchmark/data/citm_catalog.json new file mode 100644 index 00000000000000..245fdbbedf478e --- /dev/null +++ b/benchmark/data/citm_catalog.json @@ -0,0 +1,50469 @@ +{ + "areaNames": { + "205705993": "Arrière-scène central", + "205705994": "1er balcon central", + "205705995": "2ème balcon bergerie cour", + "205705996": "2ème balcon bergerie jardin", + "205705998": "1er balcon bergerie jardin", + "205705999": "1er balcon bergerie cour", + "205706000": "Arrière-scène jardin", + "205706001": "Arrière-scène cour", + "205706002": "2ème balcon jardin", + "205706003": "2ème balcon cour", + "205706004": "2ème Balcon central", + "205706005": "1er balcon jardin", + "205706006": "1er balcon cour", + "205706007": "Orchestre central", + "205706008": "Orchestre jardin", + "205706009": "Orchestre cour", + "342752287": "Zone physique secrète" + }, + "audienceSubCategoryNames": { + "337100890": "Abonné" + }, + "blockNames": {}, + "events": { + "138586341": { + "description": null, + "id": 138586341, + "logo": null, + "name": "30th Anniversary Tour", + "subTopicIds": [ + 337184269, + 337184283 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604 + ] + }, + "138586345": { + "description": null, + "id": 138586345, + "logo": "/images/UE0AAAAACEKo6QAAAAZDSVRN", + "name": "Berliner Philharmoniker", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586349": { + "description": null, + "id": 138586349, + "logo": "/images/UE0AAAAACEKo7QAAAAZDSVRN", + "name": "Berliner Philharmoniker", + "subTopicIds": [ + 337184268, + 337184288, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586353": { + "description": null, + "id": 138586353, + "logo": "/images/UE0AAAAACEKo8QAAAAZDSVRN", + "name": "Pittsburgh Symphony Orchestra", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586357": { + "description": null, + "id": 138586357, + "logo": "/images/UE0AAAAACEKo9QAAAAhDSVRN", + "name": "Orchestre Philharmonique de Radio France", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586361": { + "description": null, + "id": 138586361, + "logo": "/images/UE0AAAAACEKo+QAAAAVDSVRN", + "name": "WDR Sinfonieorchester Köln", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586365": { + "description": null, + "id": 138586365, + "logo": "/images/UE0AAAAACEKo/QAAAAVDSVRN", + "name": "Alessandro - G.F. Haendel", + "subTopicIds": [ + 337184284, + 337184263, + 337184298, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586369": { + "description": null, + "id": 138586369, + "logo": "/images/UE0AAAAACEKpAQAAAAVDSVRN", + "name": "Orchestre Colonne", + "subTopicIds": [ + 337184268, + 337184288, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586373": { + "description": null, + "id": 138586373, + "logo": "/images/UE0AAAAACEKpBQAAAAdDSVRN", + "name": "Christophe", + "subTopicIds": [ + 337184280, + 337184297, + 337184283, + 337184262 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586377": { + "description": null, + "id": 138586377, + "logo": "/images/UE0AAAAACEKpCQAAAAVDSVRN", + "name": "Joshua Redman Quartet", + "subTopicIds": [ + 337184269, + 337184283, + 337184262 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586381": { + "description": null, + "id": 138586381, + "logo": "/images/UE0AAAAACEKpDQAAAAVDSVRN", + "name": "Orchestre Symphonique d'Etat de São Paulo", + "subTopicIds": [ + 337184268, + 337184288, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586385": { + "description": null, + "id": 138586385, + "logo": "/images/UE0AAAAACEKpEQAAAAVDSVRN", + "name": "Le génie italien", + "subTopicIds": [ + 337184284, + 337184298, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586389": { + "description": null, + "id": 138586389, + "logo": "/images/UE0AAAAACEKpFQAAAAVDSVRN", + "name": "Les Noces de Figaro - W.A. Mozart (version de concert)", + "subTopicIds": [ + 337184284, + 337184298, + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586393": { + "description": null, + "id": 138586393, + "logo": "/images/UE0AAAAACEKpGQAAAAhDSVRN", + "name": "Orchestre Pasdeloup", + "subTopicIds": [ + 337184268, + 337184288, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586397": { + "description": null, + "id": 138586397, + "logo": null, + "name": "The Saxophone Summit", + "subTopicIds": [ + 337184269, + 337184283, + 337184262 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586401": { + "description": null, + "id": 138586401, + "logo": "/images/UE0AAAAACEKpIQAAAAVDSVRN", + "name": "Patricia Petibon - Nouveau Monde", + "subTopicIds": [ + 337184263, + 337184298, + 337184283, + 337184292 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586405": { + "description": null, + "id": 138586405, + "logo": "/images/UE0AAAAACEKpJQAAAAVDSVRN", + "name": "Russian National Orchestra", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586409": { + "description": null, + "id": 138586409, + "logo": "/images/UE0AAAAACEKpKQAAAAZDSVRN", + "name": "Orchestre Philharmonique de Radio France", + "subTopicIds": [ + 337184268, + 337184288, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586413": { + "description": null, + "id": 138586413, + "logo": "/images/UE0AAAAACEKpLQAAAAVDSVRN", + "name": "Evgeny Kissin", + "subTopicIds": [ + 337184281, + 337184283, + 337184273 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586417": { + "description": null, + "id": 138586417, + "logo": "/images/UE0AAAAACEKpMQAAAAZDSVRN", + "name": "Bach, concertos pour piano", + "subTopicIds": [ + 337184281, + 337184283, + 337184273 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586421": { + "description": null, + "id": 138586421, + "logo": "/images/UE0AAAAACEKpNQAAAAVDSVRN", + "name": "Bach, concertos pour piano", + "subTopicIds": [ + 337184281, + 337184283, + 337184273 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586425": { + "description": null, + "id": 138586425, + "logo": null, + "name": "Orchestre National d'Île-de-France", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586429": { + "description": null, + "id": 138586429, + "logo": "/images/UE0AAAAACEKpPQAAAAVDSVRN", + "name": "Gewandhausorchester Leipzig", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586433": { + "description": null, + "id": 138586433, + "logo": "/images/UE0AAAAACEKpQQAAAAVDSVRN", + "name": "Gewandhausorchester Leipzig", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586437": { + "description": null, + "id": 138586437, + "logo": "/images/UE0AAAAACEKpRQAAAAVDSVRN", + "name": "Budapest Festival Orchestra", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586441": { + "description": null, + "id": 138586441, + "logo": "/images/UE0AAAAACEKpSQAAAAVDSVRN", + "name": "Orchestre National du Capitole de Toulouse", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586445": { + "description": null, + "id": 138586445, + "logo": "/images/UE0AAAAACEKpTQAAAAVDSVRN", + "name": "Gewandhausorchester Leipzig", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586449": { + "description": null, + "id": 138586449, + "logo": "/images/UE0AAAAACEKpUQAAAAVDSVRN", + "name": "Gewandhausorchester Leipzig", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586453": { + "description": null, + "id": 138586453, + "logo": "/images/UE0AAAAACEKpVQAAAAVDSVRN", + "name": "Remember Shakti", + "subTopicIds": [ + 337184269, + 337184283, + 337184262 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586457": { + "description": null, + "id": 138586457, + "logo": "/images/UE0AAAAACEKpWQAAAAVDSVRN", + "name": "Menahem Pressler - Quatuor Ebène", + "subTopicIds": [ + 337184281, + 337184283, + 337184273 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586461": { + "description": null, + "id": 138586461, + "logo": "/images/UE0AAAAACEKpXQAAAAZDSVRN", + "name": "Orchestre Philharmonique de Radio France", + "subTopicIds": [ + 337184268, + 337184288, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586465": { + "description": null, + "id": 138586465, + "logo": "/images/UE0AAAAACEKpYQAAAAVDSVRN", + "name": "Orquesta Buena Vista Social Club", + "subTopicIds": [ + 337184279, + 337184283, + 337184262 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586469": { + "description": null, + "id": 138586469, + "logo": "/images/UE0AAAAACEKpZQAAAAVDSVRN", + "name": "The Cleveland Orchestra", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586473": { + "description": null, + "id": 138586473, + "logo": "/images/UE0AAAAACEKpaQAAAAVDSVRN", + "name": "The Cleveland Orchestra", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586477": { + "description": null, + "id": 138586477, + "logo": "/images/UE0AAAAACEKpbQAAAAZDSVRN", + "name": "Orchestre Philharmonique du Luxembourg", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586481": { + "description": null, + "id": 138586481, + "logo": "/images/UE0AAAAACEKpcQAAAAVDSVRN", + "name": "Maurizio Pollini, piano", + "subTopicIds": [ + 337184281, + 337184283, + 337184273 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586485": { + "description": null, + "id": 138586485, + "logo": "/images/UE0AAAAACEKpdQAAAAZDSVRN", + "name": "Orchestre Philharmonique de Radio France", + "subTopicIds": [ + 337184288, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586501": { + "description": null, + "id": 138586501, + "logo": "/images/UE0AAAAACEKphQAAAAVDSVRN", + "name": "Antonio Meneses - Maria-João Pires", + "subTopicIds": [ + 337184268, + 337184283, + 337184273 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586505": { + "description": null, + "id": 138586505, + "logo": "/images/UE0AAAAACEKpiQAAAAVDSVRN", + "name": "Musiques pour la reine Caroline", + "subTopicIds": [ + 337184284, + 337184263, + 337184298, + 337184283, + 337184292 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586509": { + "description": null, + "id": 138586509, + "logo": null, + "name": "Orchestre National d'Île-de-France", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586513": { + "description": null, + "id": 138586513, + "logo": "/images/UE0AAAAACEKpkQAAAAVDSVRN", + "name": "Les Mystères d'Isis - W.A. Mozart (cersion de concert)", + "subTopicIds": [ + 337184284, + 337184298, + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586517": { + "description": null, + "id": 138586517, + "logo": "/images/UE0AAAAACEKplQAAAAdDSVRN", + "name": "Martha Argerich - Gidon Kremer", + "subTopicIds": [ + 337184281, + 337184283, + 337184273 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586521": { + "description": null, + "id": 138586521, + "logo": "/images/UE0AAAAACEKpmQAAAAVDSVRN", + "name": "Cecilia Bartoli - Mozart et la Vienne classique", + "subTopicIds": [ + 337184298, + 337184268, + 337184283, + 337184292 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586525": { + "description": null, + "id": 138586525, + "logo": "/images/UE0AAAAACEKpnQAAAAVDSVRN", + "name": "Orchestre Philharmonique de Radio France", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586529": { + "description": null, + "id": 138586529, + "logo": null, + "name": "Orchestre Pasdeloup", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586533": { + "description": null, + "id": 138586533, + "logo": "/images/UE0AAAAACEKppQAAAAVDSVRN", + "name": "Orchestre du Théâtre Mariinsky", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586537": { + "description": null, + "id": 138586537, + "logo": "/images/UE0AAAAACEKpqQAAAAVDSVRN", + "name": "Orchestre du Théâtre Mariinsky", + "subTopicIds": [ + 337184298, + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586541": { + "description": null, + "id": 138586541, + "logo": "/images/UE0AAAAACEKprQAAAAVDSVRN", + "name": "Orchestre du Théâtre Mariinsky", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586545": { + "description": null, + "id": 138586545, + "logo": "/images/UE0AAAAACEKpsQAAAAVDSVRN", + "name": "Academy of Saint Martin in the Fields", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586549": { + "description": null, + "id": 138586549, + "logo": "/images/UE0AAAAACEKptQAAAAVDSVRN", + "name": "Quatuor Hagen", + "subTopicIds": [ + 337184281, + 337184283, + 337184273 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586553": { + "description": null, + "id": 138586553, + "logo": "/images/UE0AAAAACEKpuQAAAAVDSVRN", + "name": "Quatuor Hagen", + "subTopicIds": [ + 337184281, + 337184283, + 337184273 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586557": { + "description": null, + "id": 138586557, + "logo": "/images/UE0AAAAACEKpvQAAAAVDSVRN", + "name": "Quatuor Hagen", + "subTopicIds": [ + 337184281, + 337184283, + 337184273 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586561": { + "description": null, + "id": 138586561, + "logo": "/images/UE0AAAAACEKpwQAAAAVDSVRN", + "name": "Sunwook Kim, piano", + "subTopicIds": [ + 337184281, + 337184283, + 337184273 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586565": { + "description": null, + "id": 138586565, + "logo": null, + "name": "Orchestre Colonne", + "subTopicIds": [ + 337184268, + 337184288, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586569": { + "description": null, + "id": 138586569, + "logo": "/images/UE0AAAAACEKpyQAAAAVDSVRN", + "name": "Orchestre Philharmonique de Radio France", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586581": { + "description": null, + "id": 138586581, + "logo": null, + "name": "Orchestre National de France", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586585": { + "description": null, + "id": 138586585, + "logo": "/images/UE0AAAAACEKp2QAAAAVDSVRN", + "name": "Messe en si mineur - J.S. Bach", + "subTopicIds": [ + 337184296, + 337184263, + 337184298, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586589": { + "description": null, + "id": 138586589, + "logo": null, + "name": "Le Messie - G.F. Haendel", + "subTopicIds": [ + 337184263, + 337184298, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586593": { + "description": null, + "id": 138586593, + "logo": "/images/UE0AAAAACEKp4QAAAAdDSVRN", + "name": "Orchestre National d'Île-de-France", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586597": { + "description": null, + "id": 138586597, + "logo": "/images/UE0AAAAACEKp5QAAAAVDSVRN", + "name": "Orchestre Philharmonique de Radio France", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586601": { + "description": null, + "id": 138586601, + "logo": "/images/UE0AAAAACEKp6QAAAAdDSVRN", + "name": "Orchestre Pasdeloup", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586605": { + "description": null, + "id": 138586605, + "logo": null, + "name": "Orchestre Colonne", + "subTopicIds": [ + 337184268, + 337184288, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586609": { + "description": null, + "id": 138586609, + "logo": null, + "name": "Ciné-concert - Le Cuirassé Potemkine", + "subTopicIds": [ + 337184267, + 337184262, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 107888604, + 324846100 + ] + }, + "138586613": { + "description": null, + "id": 138586613, + "logo": "/images/UE0AAAAACEKp9QAAAAVDSVRN", + "name": "Orchestre Philharmonique de Radio France", + "subTopicIds": [ + 337184268, + 337184288, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586617": { + "description": null, + "id": 138586617, + "logo": "/images/UE0AAAAACEKp+QAAAAVDSVRN", + "name": "London Symphony Orchestra", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586625": { + "description": null, + "id": 138586625, + "logo": null, + "name": "Orchestre National d'Île-de-France", + "subTopicIds": [ + 337184268, + 337184288, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586629": { + "description": null, + "id": 138586629, + "logo": "/images/UE0AAAAACEKqBQAAAAVDSVRN", + "name": "Orquesta Sinfonica Simón Bolívar de Venezuela", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586633": { + "description": null, + "id": 138586633, + "logo": "/images/UE0AAAAACEKqCQAAAAVDSVRN", + "name": "Orchestre Philharmonique de Radio France", + "subTopicIds": [ + 337184298, + 337184268, + 337184288, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586641": { + "description": null, + "id": 138586641, + "logo": "/images/UE0AAAAACEKqEQAAAAVDSVRN", + "name": "Edita Gruberova - Airs de concert", + "subTopicIds": [ + 337184284, + 337184298, + 337184283, + 337184292 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586645": { + "description": null, + "id": 138586645, + "logo": "/images/UE0AAAAACEKqFQAAAAdDSVRN", + "name": "Orchestre National d'Île-de-France", + "subTopicIds": [ + 337184268, + 337184288, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586649": { + "description": null, + "id": 138586649, + "logo": "/images/UE0AAAAACEKqGQAAAAZDSVRN", + "name": "Alexei Volodin, piano", + "subTopicIds": [ + 337184281, + 337184283, + 337184273 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586653": { + "description": null, + "id": 138586653, + "logo": null, + "name": "Sonya Yoncheva - Diva !", + "subTopicIds": [ + 337184284, + 337184263, + 337184298, + 337184283, + 337184292 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586657": { + "description": null, + "id": 138586657, + "logo": "/images/UE0AAAAACEKqIQAAAAVDSVRN", + "name": "Orchestre Philharmonique de Radio France", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586661": { + "description": null, + "id": 138586661, + "logo": null, + "name": "Le Ramayana balinais - L'Enlèvement de Sita", + "subTopicIds": [ + 337184279, + 337184283, + 337184262 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586667": { + "description": null, + "id": 138586667, + "logo": null, + "name": "Dave Holland & friends", + "subTopicIds": [ + 337184269, + 337184283, + 337184262 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586671": { + "description": null, + "id": 138586671, + "logo": "/images/UE0AAAAACEKqLwAAAAlDSVRN", + "name": "Boris Godounov - M.Moussorgski (version de concert)", + "subTopicIds": [ + 337184284, + 337184298, + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586675": { + "description": null, + "id": 138586675, + "logo": "/images/UE0AAAAACEKqMwAAAAVDSVRN", + "name": "Insula orchestra - Accentus", + "subTopicIds": [ + 337184298, + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586679": { + "description": null, + "id": 138586679, + "logo": "/images/UE0AAAAACEKqNwAAAAVDSVRN", + "name": "Orchestre Philharmonique de Radio France", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586687": { + "description": null, + "id": 138586687, + "logo": "/images/UE0AAAAACEKqPwAAAAVDSVRN", + "name": "Bryn Terfel - Héros légendaires", + "subTopicIds": [ + 337184284, + 337184298, + 337184283, + 337184292 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586691": { + "description": null, + "id": 138586691, + "logo": null, + "name": "Les Siècles", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586695": { + "description": null, + "id": 138586695, + "logo": "/images/UE0AAAAACEKqRwAAAAVDSVRN", + "name": "Gautier Capuçon - Frank Braley", + "subTopicIds": [ + 337184281, + 337184283, + 337184273 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586699": { + "description": null, + "id": 138586699, + "logo": null, + "name": "Festival Présences 2014 \"Paris Berlin\"", + "subTopicIds": [ + 337184288, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586703": { + "description": null, + "id": 138586703, + "logo": "/images/UE0AAAAACEKqTwAAAAZDSVRN", + "name": "Autour de Tristan", + "subTopicIds": [ + 337184284, + 337184298, + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586707": { + "description": null, + "id": 138586707, + "logo": "/images/UE0AAAAACEKqUwAAAAVDSVRN", + "name": "Orchestre du Théâtre Mariinsky", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586711": { + "description": null, + "id": 138586711, + "logo": "/images/UE0AAAAACEKqVwAAAAVDSVRN", + "name": "Orchestre du Théâtre Mariinsky", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586715": { + "description": null, + "id": 138586715, + "logo": "/images/UE0AAAAACEKqWwAAAAVDSVRN", + "name": "Orchestre du Théâtre Mariinsky", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586719": { + "description": null, + "id": 138586719, + "logo": "/images/UE0AAAAACEKqXwAAAAVDSVRN", + "name": "Etienne Daho et invités", + "subTopicIds": [ + 337184280, + 337184297, + 337184283, + 337184262 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586723": { + "description": null, + "id": 138586723, + "logo": null, + "name": "Fantasia in concert", + "subTopicIds": [ + 337184299, + 337184268, + 337184267, + 337184275, + 337184282 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846098, + 324846099, + 107888604, + 324846100 + ] + }, + "138586731": { + "description": null, + "id": 138586731, + "logo": "/images/UE0AAAAACEKqawAAAAVDSVRN", + "name": "Khatia Buniatishvili, piano", + "subTopicIds": [ + 337184281, + 337184283, + 337184273 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586735": { + "description": null, + "id": 138586735, + "logo": "/images/UE0AAAAACEKqbwAAAAVDSVRN", + "name": "Orchestre Philharmonique de Radio France", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586743": { + "description": null, + "id": 138586743, + "logo": null, + "name": "Guy Braunstein - Zvi Plesser - Sunwook Kim", + "subTopicIds": [ + 337184281, + 337184283, + 337184273 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586747": { + "description": null, + "id": 138586747, + "logo": "/images/UE0AAAAACEKqewAAAAVDSVRN", + "name": "Janine Jansen and friends", + "subTopicIds": [ + 337184281, + 337184283, + 337184273 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586751": { + "description": null, + "id": 138586751, + "logo": "/images/UE0AAAAACEKqfwAAAAVDSVRN", + "name": "Elena Bashkirova, piano", + "subTopicIds": [ + 337184281, + 337184283, + 337184273 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586755": { + "description": null, + "id": 138586755, + "logo": null, + "name": "Orchestre Philharmonique de Radio France", + "subTopicIds": [ + 337184284, + 337184298, + 337184288, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586759": { + "description": null, + "id": 138586759, + "logo": null, + "name": "San Francisco Symphony", + "subTopicIds": [ + 337184268, + 337184288, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586771": { + "description": null, + "id": 138586771, + "logo": null, + "name": "Passion selon saint Jean - J.S. Bach", + "subTopicIds": [ + 337184296, + 337184263, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586775": { + "description": null, + "id": 138586775, + "logo": null, + "name": "Yundi Li , piano", + "subTopicIds": [ + 337184281, + 337184283, + 337184273 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586779": { + "description": null, + "id": 138586779, + "logo": null, + "name": "Orchestre Philharmonique de Radio France", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586783": { + "description": null, + "id": 138586783, + "logo": null, + "name": "Orchestre Pasdeloup", + "subTopicIds": [ + 337184268, + 337184269, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586787": { + "description": null, + "id": 138586787, + "logo": null, + "name": "Orchestre du Conservatoire de Paris", + "subTopicIds": [ + 337184284, + 337184298, + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586795": { + "description": null, + "id": 138586795, + "logo": null, + "name": "Orchestre National d'Île-de-France", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586799": { + "description": null, + "id": 138586799, + "logo": null, + "name": "Orchestre Philharmonique de Radio France", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586803": { + "description": null, + "id": 138586803, + "logo": null, + "name": "Royal Concertgebouw Orchestra Amsterdam", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586807": { + "description": null, + "id": 138586807, + "logo": null, + "name": "Royal Concertgebouw Orchestra Amsterdam", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586811": { + "description": null, + "id": 138586811, + "logo": null, + "name": "Royal Concertgebouw Orchestra Amsterdam", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586815": { + "description": null, + "id": 138586815, + "logo": null, + "name": "Orchestre Philharmonique de Radio France", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586823": { + "description": null, + "id": 138586823, + "logo": null, + "name": "London Symphony Orchestra", + "subTopicIds": [ + 337184268, + 337184288, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586827": { + "description": null, + "id": 138586827, + "logo": null, + "name": "London Symphony Orchestra", + "subTopicIds": [ + 337184268, + 337184288, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586831": { + "description": null, + "id": 138586831, + "logo": null, + "name": "Le Concert des Nations - Jordi Savall", + "subTopicIds": [ + 337184263, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586835": { + "description": null, + "id": 138586835, + "logo": null, + "name": "Leonidas Kavakos - Yuja Wang", + "subTopicIds": [ + 337184281, + 337184283, + 337184273 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586839": { + "description": null, + "id": 138586839, + "logo": null, + "name": "Orchestre Philharmonique de Radio France", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586843": { + "description": null, + "id": 138586843, + "logo": null, + "name": "Quatuor Artemis - Gautier Capuçon", + "subTopicIds": [ + 337184281, + 337184283, + 337184273 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586847": { + "description": null, + "id": 138586847, + "logo": null, + "name": "Quatuor Artemis - Quatuor Ébène", + "subTopicIds": [ + 337184281, + 337184283, + 337184273 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586851": { + "description": null, + "id": 138586851, + "logo": null, + "name": "Quatuor Artemis - Elisabeth Leonskaja", + "subTopicIds": [ + 337184281, + 337184283, + 337184273 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586855": { + "description": null, + "id": 138586855, + "logo": null, + "name": "Russian National Orchestra", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586859": { + "description": null, + "id": 138586859, + "logo": null, + "name": "Passion selon saint Matthieu", + "subTopicIds": [ + 337184296, + 337184263, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586863": { + "description": null, + "id": 138586863, + "logo": null, + "name": "Les Arts Florissants - Concert de Pâques", + "subTopicIds": [ + 337184263, + 337184298, + 337184283, + 337184292 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586867": { + "description": null, + "id": 138586867, + "logo": null, + "name": "Orchestre Philharmonique de Radio France", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586871": { + "description": null, + "id": 138586871, + "logo": null, + "name": "Leylâ et Majnûn ou L'Amour mystique", + "subTopicIds": [ + 337184279, + 337184283, + 337184262 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586875": { + "description": null, + "id": 138586875, + "logo": null, + "name": "Stephen Kovacevich, piano", + "subTopicIds": [ + 337184281, + 337184283, + 337184273 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586879": { + "description": null, + "id": 138586879, + "logo": null, + "name": "Orchestra Mozart Bologna - Mahler Chamber Orchestra", + "subTopicIds": [ + 337184268, + 337184288, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586883": { + "description": null, + "id": 138586883, + "logo": null, + "name": "Ballet Royal du Cambodge", + "subTopicIds": [ + 337184279, + 337184283, + 337184262 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586889": { + "description": null, + "id": 138586889, + "logo": null, + "name": "MDR Sinfonieorchester Leipzig", + "subTopicIds": [ + 337184288, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586893": { + "description": null, + "id": 138586893, + "logo": null, + "name": "Orchestre Colonne", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586897": { + "description": null, + "id": 138586897, + "logo": null, + "name": "Elisabeth Leonskaja, piano", + "subTopicIds": [ + 337184281, + 337184283, + 337184273 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586901": { + "description": null, + "id": 138586901, + "logo": null, + "name": "Yuja Wang, piano", + "subTopicIds": [ + 337184281, + 337184283, + 337184273 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586905": { + "description": null, + "id": 138586905, + "logo": null, + "name": "Orchestre Philharmonique de Radio France", + "subTopicIds": [ + 337184268, + 337184288, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586909": { + "description": null, + "id": 138586909, + "logo": null, + "name": "Anne-Sophie Mutter - Lambert Orkis", + "subTopicIds": [ + 337184281, + 337184283, + 337184273 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586917": { + "description": null, + "id": 138586917, + "logo": null, + "name": "Orchestre National d'Île-de-France", + "subTopicIds": [ + 337184268, + 337184288, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586921": { + "description": null, + "id": 138586921, + "logo": null, + "name": "Orchestre Philharmonique de Radio France", + "subTopicIds": [ + 337184268, + 337184288, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586929": { + "description": null, + "id": 138586929, + "logo": null, + "name": "Orchestre Pasdeloup", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586933": { + "description": null, + "id": 138586933, + "logo": null, + "name": "Gilberto Gil", + "subTopicIds": [ + 337184279, + 337184283, + 337184262 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586937": { + "description": null, + "id": 138586937, + "logo": null, + "name": "Nelson Freire, piano", + "subTopicIds": [ + 337184281, + 337184283, + 337184273 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586941": { + "description": null, + "id": 138586941, + "logo": null, + "name": "Orchestre Philharmonique de Radio France", + "subTopicIds": [ + 337184268, + 337184288, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586945": { + "description": null, + "id": 138586945, + "logo": null, + "name": "Orfeo - C. Monteverdi (version de concert)", + "subTopicIds": [ + 337184284, + 337184263, + 337184298, + 337184283, + 337184292 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586949": { + "description": null, + "id": 138586949, + "logo": null, + "name": "Bamberger Symphoniker", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586953": { + "description": null, + "id": 138586953, + "logo": null, + "name": "Murray Perahia, piano", + "subTopicIds": [ + 337184281, + 337184283, + 337184273 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586957": { + "description": null, + "id": 138586957, + "logo": null, + "name": "Orchestre National du Capitole de Toulouse", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586961": { + "description": null, + "id": 138586961, + "logo": null, + "name": "Krystian Zimerman, piano", + "subTopicIds": [ + 337184281, + 337184283, + 337184273 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586965": { + "description": null, + "id": 138586965, + "logo": null, + "name": "Rafal Blechacz, piano", + "subTopicIds": [ + 337184281, + 337184283, + 337184273 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586969": { + "description": null, + "id": 138586969, + "logo": null, + "name": "Les Voyages musicaux de Marco Polo", + "subTopicIds": [ + 337184279, + 337184283, + 337184262 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586973": { + "description": null, + "id": 138586973, + "logo": null, + "name": "Orchestre National de Lyon", + "subTopicIds": [ + 337184298, + 337184268, + 337184283, + 337184292, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586977": { + "description": null, + "id": 138586977, + "logo": null, + "name": "Guy Braunstein - Zvi Plesser - Sunwook Kim", + "subTopicIds": [ + 337184281, + 337184283, + 337184273 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586981": { + "description": null, + "id": 138586981, + "logo": null, + "name": "La Bohème - G. Puccini (version de concert)", + "subTopicIds": [ + 337184284, + 337184298, + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586989": { + "description": null, + "id": 138586989, + "logo": null, + "name": "Otello - G. Verdi (version de concert)", + "subTopicIds": [ + 337184284, + 337184298, + 337184268, + 337184283, + 337184292 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586993": { + "description": null, + "id": 138586993, + "logo": null, + "name": "Staatskapelle Berlin", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "138586997": { + "description": null, + "id": 138586997, + "logo": null, + "name": "Staatskapelle Berlin", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "151183114": { + "description": null, + "id": 151183114, + "logo": null, + "name": "San Francisco Symphony", + "subTopicIds": [ + 337184298, + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "339420802": { + "description": null, + "id": 339420802, + "logo": null, + "name": "Lou Doillon", + "subTopicIds": [ + 337184280, + 337184283, + 337184262 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "339420805": { + "description": null, + "id": 339420805, + "logo": null, + "name": "Patrick Watson & Orchestre National d'Ile-de-France", + "subTopicIds": [ + 337184280, + 337184283, + 337184262 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "341069930": { + "description": null, + "id": 341069930, + "logo": "/images/UE0AAAAAFFRQagAAAAlDSVRN", + "name": "Orchestre de Paris", + "subTopicIds": [ + 337184268, + 337184288, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "341181232": { + "description": null, + "id": 341181232, + "logo": null, + "name": "Orchestre de Paris", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "341181233": { + "description": null, + "id": 341181233, + "logo": "/images/UE0AAAAAFFYDMQAAAAhDSVRN", + "name": "Orchestre de Paris", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "341181234": { + "description": null, + "id": 341181234, + "logo": "/images/UE0AAAAAFFYDMgAAAAdDSVRN", + "name": "Orchestre de Paris", + "subTopicIds": [ + 337184268, + 337184288, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "341181235": { + "description": null, + "id": 341181235, + "logo": "/images/UE0AAAAAFFYDMwAAAAZDSVRN", + "name": "Orchestre de Paris", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "341181236": { + "description": null, + "id": 341181236, + "logo": "/images/UE0AAAAAFFYDNAAAAAZDSVRN", + "name": "Orchestre de Paris", + "subTopicIds": [ + 337184268, + 337184288, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "341181237": { + "description": null, + "id": 341181237, + "logo": "/images/UE0AAAAAFFYDNQAAAAhDSVRN", + "name": "Paavo Järvi, direction", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "341181238": { + "description": null, + "id": 341181238, + "logo": "/images/UE0AAAAAFFYDNgAAAAdDSVRN", + "name": "Orchestre de Paris", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "341181239": { + "description": null, + "id": 341181239, + "logo": "/images/UE0AAAAAFFYDNwAAAAdDSVRN", + "name": "Orchestre de Paris", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "341181240": { + "description": null, + "id": 341181240, + "logo": "/images/UE0AAAAAFFYDOAAAAAhDSVRN", + "name": "Orchestre de Paris", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "341181241": { + "description": null, + "id": 341181241, + "logo": "/images/UE0AAAAAFFYDOQAAAAZDSVRN", + "name": "Orchestre de Paris", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "341181242": { + "description": null, + "id": 341181242, + "logo": "/images/UE0AAAAAFFYDOgAAAAdDSVRN", + "name": "Orchestre de Paris", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "341181243": { + "description": null, + "id": 341181243, + "logo": "/images/UE0AAAAAFFYDOwAAAAdDSVRN", + "name": "Concert anniversaire des 90 ans de Menahem Pressler", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "341181244": { + "description": null, + "id": 341181244, + "logo": "/images/UE0AAAAAFFYDPAAAAAZDSVRN", + "name": "Orchestre de Paris", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "341181245": { + "description": null, + "id": 341181245, + "logo": "/images/UE0AAAAAFFYDPQAAAAZDSVRN", + "name": "Orchestre de Paris", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "341181246": { + "description": null, + "id": 341181246, + "logo": null, + "name": "Orchestre de Paris", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "341181247": { + "description": null, + "id": 341181247, + "logo": null, + "name": "Orchestre de Paris", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "341181248": { + "description": null, + "id": 341181248, + "logo": "/images/UE0AAAAAFFYDQAAAAAZDSVRN", + "name": "Orchestre de Paris", + "subTopicIds": [ + 337184268, + 337184288, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "341181249": { + "description": null, + "id": 341181249, + "logo": "/images/UE0AAAAAFFYDQQAAAAdDSVRN", + "name": "Orchestre de Paris", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "341181250": { + "description": null, + "id": 341181250, + "logo": "/images/UE0AAAAAFFYDQgAAAAdDSVRN", + "name": "Orchestre de Paris", + "subTopicIds": [ + 337184268, + 337184288, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "341181251": { + "description": null, + "id": 341181251, + "logo": null, + "name": "Orchestre de Paris", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "341181252": { + "description": null, + "id": 341181252, + "logo": "/images/UE0AAAAAFFYDRAAAAAdDSVRN", + "name": "Orchestre de Paris", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "341181253": { + "description": null, + "id": 341181253, + "logo": null, + "name": "Orchestre de Paris", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "341181254": { + "description": null, + "id": 341181254, + "logo": "/images/UE0AAAAAFFYDRgAAAAlDSVRN", + "name": "Orchestre de Paris", + "subTopicIds": [ + 337184268, + 337184288, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "341181255": { + "description": null, + "id": 341181255, + "logo": null, + "name": "Orchestre de Paris", + "subTopicIds": [ + 337184268, + 337184288, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "341181256": { + "description": null, + "id": 341181256, + "logo": null, + "name": "Orchestre de Paris", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "341181257": { + "description": null, + "id": 341181257, + "logo": null, + "name": "Orchestre de Paris", + "subTopicIds": [ + 337184268, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "341181258": { + "description": null, + "id": 341181258, + "logo": null, + "name": "Orchestre de Paris", + "subTopicIds": [ + 337184268, + 337184288, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "341181259": { + "description": null, + "id": 341181259, + "logo": null, + "name": "14052122 JARVI / GOERNE / SOLBERG / CHŒUR", + "subTopicIds": [ + 337184268, + 337184288, + 337184283, + 337184275 + ], + "subjectCode": null, + "subtitle": null, + "topicIds": [ + 324846099, + 107888604, + 324846100 + ] + }, + "342742592": { + "description": null, + "id": 342742592, + "logo": null, + "name": "event secret 2", + "subTopicIds": [], + "subjectCode": null, + "subtitle": null, + "topicIds": [] + }, + "342742593": { + "description": null, + "id": 342742593, + "logo": null, + "name": "event secret 3", + "subTopicIds": [], + "subjectCode": null, + "subtitle": null, + "topicIds": [] + }, + "342742594": { + "description": null, + "id": 342742594, + "logo": null, + "name": "event secret 4", + "subTopicIds": [], + "subjectCode": null, + "subtitle": null, + "topicIds": [] + }, + "342742595": { + "description": null, + "id": 342742595, + "logo": null, + "name": "event secret 5", + "subTopicIds": [], + "subjectCode": null, + "subtitle": null, + "topicIds": [] + }, + "342742596": { + "description": null, + "id": 342742596, + "logo": null, + "name": "event secret 6", + "subTopicIds": [], + "subjectCode": null, + "subtitle": null, + "topicIds": [] + } + }, + "performances": [ + { + "eventId": 138586341, + "id": 339887544, + "logo": null, + "name": null, + "prices": [ + { + "amount": 90250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937295 + }, + { + "amount": 66500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937296 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937295 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937296 + } + ], + "seatMapImage": null, + "start": 1372701600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 339420802, + "id": 339430296, + "logo": null, + "name": null, + "prices": [ + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937295 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937296 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937295 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937296 + } + ], + "seatMapImage": null, + "start": 1372788000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 339420805, + "id": 339430301, + "logo": null, + "name": null, + "prices": [ + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937295 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937296 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937295 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937296 + } + ], + "seatMapImage": null, + "start": 1373220000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586345, + "id": 138586347, + "logo": "/images/UE0AAAAACEKo6QAAAAZDSVRN", + "name": null, + "prices": [ + { + "amount": 152000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937284 + }, + { + "amount": 104500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937285 + }, + { + "amount": 76000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937287 + }, + { + "amount": 52250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937288 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937283 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937284 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937285 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937287 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937288 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937283 + } + ], + "seatMapImage": null, + "start": 1377972000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586349, + "id": 138586351, + "logo": "/images/UE0AAAAACEKo7QAAAAZDSVRN", + "name": null, + "prices": [ + { + "amount": 152000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937284 + }, + { + "amount": 104500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937285 + }, + { + "amount": 76000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937287 + }, + { + "amount": 52250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937288 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937283 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937284 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937285 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937287 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937288 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937283 + } + ], + "seatMapImage": null, + "start": 1378044000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586353, + "id": 138586355, + "logo": "/images/UE0AAAAACEKo8QAAAAZDSVRN", + "name": null, + "prices": [ + { + "amount": 90250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937284 + }, + { + "amount": 71250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937285 + }, + { + "amount": 52250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937287 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937288 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937284 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937285 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937287 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937288 + } + ], + "seatMapImage": null, + "start": 1378490400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341069930, + "id": 341070133, + "logo": "/images/UE0AAAAAFFRQagAAAAlDSVRN", + "name": null, + "prices": [ + { + "amount": 80750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826016 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826017 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826015 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826018 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826016 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826017 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826015 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 340826018 + } + ], + "seatMapImage": null, + "start": 1378922400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341069930, + "id": 341070132, + "logo": "/images/UE0AAAAAFFRQagAAAAlDSVRN", + "name": null, + "prices": [ + { + "amount": 80750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826016 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826017 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826015 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826018 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826016 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826017 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826015 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 340826018 + } + ], + "seatMapImage": null, + "start": 1379008800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586357, + "id": 138586359, + "logo": "/images/UE0AAAAACEKo9QAAAAhDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086210 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086211 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086213 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086214 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086210 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086211 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086214 + } + ], + "seatMapImage": null, + "start": 1379095200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586361, + "id": 138586363, + "logo": "/images/UE0AAAAACEKo+QAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + } + ], + "seatMapImage": null, + "start": 1379440800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586365, + "id": 138586367, + "logo": "/images/UE0AAAAACEKo/QAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + } + ], + "seatMapImage": null, + "start": 1379959200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181254, + "id": 341181470, + "logo": "/images/UE0AAAAAFFYDRgAAAAlDSVRN", + "name": null, + "prices": [ + { + "amount": 80750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179212 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179213 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179214 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179215 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179212 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179214 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 341179215 + } + ], + "seatMapImage": null, + "start": 1380132000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181254, + "id": 341181469, + "logo": "/images/UE0AAAAAFFYDRgAAAAlDSVRN", + "name": null, + "prices": [ + { + "amount": 80750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179212 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179213 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179214 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179215 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179212 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179214 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 341179215 + } + ], + "seatMapImage": null, + "start": 1380218400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586369, + "id": 138586371, + "logo": "/images/UE0AAAAACEKpAQAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 19000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 14250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937282 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937282 + } + ], + "seatMapImage": null, + "start": 1380650400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181252, + "id": 341181467, + "logo": "/images/UE0AAAAAFFYDRAAAAAdDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179212 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179213 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179214 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179215 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179216 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179212 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179214 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 341179215 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179216 + } + ], + "seatMapImage": null, + "start": 1380736800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586373, + "id": 138586375, + "logo": "/images/UE0AAAAACEKpBQAAAAdDSVRN", + "name": null, + "prices": [ + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086196 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086197 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086196 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086197 + } + ], + "seatMapImage": null, + "start": 1380996000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586377, + "id": 138586379, + "logo": "/images/UE0AAAAACEKpCQAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086196 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086197 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086196 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086197 + } + ], + "seatMapImage": null, + "start": 1381082400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586381, + "id": 138586383, + "logo": "/images/UE0AAAAACEKpDQAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 80750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + } + ], + "seatMapImage": null, + "start": 1381168800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586385, + "id": 138586387, + "logo": "/images/UE0AAAAACEKpEQAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 80750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + } + ], + "seatMapImage": null, + "start": 1381255200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181234, + "id": 341181437, + "logo": "/images/UE0AAAAAFFYDMgAAAAdDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179212 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179213 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179214 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179215 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179216 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179212 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179214 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 341179215 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179216 + } + ], + "seatMapImage": null, + "start": 1381341600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181234, + "id": 341181436, + "logo": "/images/UE0AAAAAFFYDMgAAAAdDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179212 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179213 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179214 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179215 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179216 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179212 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179214 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 341179215 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179216 + } + ], + "seatMapImage": null, + "start": 1381428000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586389, + "id": 138586391, + "logo": "/images/UE0AAAAACEKpFQAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 80750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937284 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937285 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937287 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937288 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937284 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937285 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937287 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937288 + } + ], + "seatMapImage": null, + "start": 1381512600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586393, + "id": 138586395, + "logo": "/images/UE0AAAAACEKpGQAAAAhDSVRN", + "name": null, + "prices": [ + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937241 + }, + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937242 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937244 + }, + { + "amount": 16150, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937245 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937246 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937241 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937242 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937244 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937245 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937246 + } + ], + "seatMapImage": null, + "start": 1381586400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586397, + "id": 138586399, + "logo": null, + "name": null, + "prices": [ + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086196 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086197 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086196 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086197 + } + ], + "seatMapImage": null, + "start": 1381672800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586401, + "id": 138586403, + "logo": "/images/UE0AAAAACEKpIQAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + } + ], + "seatMapImage": null, + "start": 1381773600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586405, + "id": 138586407, + "logo": "/images/UE0AAAAACEKpJQAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 80750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + } + ], + "seatMapImage": null, + "start": 1381860000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181233, + "id": 341181435, + "logo": "/images/UE0AAAAAFFYDMQAAAAhDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179212 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179213 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179214 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179215 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179216 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179212 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179214 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 341179215 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179216 + } + ], + "seatMapImage": null, + "start": 1381946400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181237, + "id": 341181442, + "logo": "/images/UE0AAAAAFFYDNQAAAAhDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179212 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179213 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179214 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179215 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179216 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179212 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179214 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 341179215 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179216 + } + ], + "seatMapImage": null, + "start": 1382032800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586409, + "id": 138586411, + "logo": "/images/UE0AAAAACEKpKQAAAAZDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086210 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086211 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086213 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086214 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086210 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086211 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086214 + } + ], + "seatMapImage": null, + "start": 1382119200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586413, + "id": 138586415, + "logo": "/images/UE0AAAAACEKpLQAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 95000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937284 + }, + { + "amount": 76000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937285 + }, + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937287 + }, + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937288 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937283 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937284 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937285 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937287 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937288 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937283 + } + ], + "seatMapImage": null, + "start": 1382277600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586417, + "id": 138586419, + "logo": "/images/UE0AAAAACEKpMQAAAAZDSVRN", + "name": null, + "prices": [ + { + "amount": 80750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + } + ], + "seatMapImage": null, + "start": 1382378400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586421, + "id": 138586423, + "logo": "/images/UE0AAAAACEKpNQAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 80750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + } + ], + "seatMapImage": null, + "start": 1382464800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181238, + "id": 341181444, + "logo": "/images/UE0AAAAAFFYDNgAAAAdDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179212 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179213 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179214 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179215 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179216 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179212 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179214 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 341179215 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179216 + } + ], + "seatMapImage": null, + "start": 1382551200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181238, + "id": 341181443, + "logo": "/images/UE0AAAAAFFYDNgAAAAdDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179212 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179213 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179214 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179215 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179216 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179212 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179214 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 341179215 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179216 + } + ], + "seatMapImage": null, + "start": 1382637600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586425, + "id": 138586427, + "logo": null, + "name": null, + "prices": [ + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937235 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937236 + }, + { + "amount": 19000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937238 + }, + { + "amount": 14250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937239 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937240 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937235 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937236 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937238 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937239 + }, + { + "areas": [ + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937240 + } + ], + "seatMapImage": null, + "start": 1382724000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586429, + "id": 138586431, + "logo": "/images/UE0AAAAACEKpPQAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 80750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937284 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937285 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937287 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937288 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937284 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937285 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937287 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937288 + } + ], + "seatMapImage": null, + "start": 1382810400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586433, + "id": 138586435, + "logo": "/images/UE0AAAAACEKpQQAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 80750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937284 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937285 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937287 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937288 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937284 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937285 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937287 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937288 + } + ], + "seatMapImage": null, + "start": 1382886000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586437, + "id": 138586439, + "logo": "/images/UE0AAAAACEKpRQAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + } + ], + "seatMapImage": null, + "start": 1383073200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586441, + "id": 138586443, + "logo": "/images/UE0AAAAACEKpSQAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + } + ], + "seatMapImage": null, + "start": 1383246000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586445, + "id": 138586447, + "logo": "/images/UE0AAAAACEKpTQAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 80750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937284 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937285 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937287 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937288 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937284 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937285 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937287 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937288 + } + ], + "seatMapImage": null, + "start": 1383332400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586449, + "id": 138586451, + "logo": "/images/UE0AAAAACEKpUQAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 80750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937284 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937285 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937287 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937288 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937284 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937285 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937287 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937288 + } + ], + "seatMapImage": null, + "start": 1383418800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 342742592, + "id": 342742708, + "logo": null, + "name": null, + "prices": [ + { + "amount": 180500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 342752792 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 342752287, + "blockIds": [] + } + ], + "seatCategoryId": 342752792 + } + ], + "seatMapImage": null, + "start": 1383555600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 342742592, + "id": 342742709, + "logo": null, + "name": null, + "prices": [ + { + "amount": 180500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 342752792 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 342752287, + "blockIds": [] + } + ], + "seatCategoryId": 342752792 + } + ], + "seatMapImage": null, + "start": 1383562800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586453, + "id": 138586455, + "logo": "/images/UE0AAAAACEKpVQAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937295 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937296 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937295 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937296 + } + ], + "seatMapImage": null, + "start": 1383591600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 342742592, + "id": 342742710, + "logo": null, + "name": null, + "prices": [ + { + "amount": 180500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 342752792 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 342752287, + "blockIds": [] + } + ], + "seatCategoryId": 342752792 + } + ], + "seatMapImage": null, + "start": 1383642000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 342742592, + "id": 342742711, + "logo": null, + "name": null, + "prices": [ + { + "amount": 180500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 342752792 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 342752287, + "blockIds": [] + } + ], + "seatCategoryId": 342752792 + } + ], + "seatMapImage": null, + "start": 1383649200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 342742592, + "id": 342742712, + "logo": null, + "name": null, + "prices": [ + { + "amount": 180500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 342752792 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 342752287, + "blockIds": [] + } + ], + "seatCategoryId": 342752792 + } + ], + "seatMapImage": null, + "start": 1383728400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 342742592, + "id": 342742713, + "logo": null, + "name": null, + "prices": [ + { + "amount": 180500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 342752792 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 342752287, + "blockIds": [] + } + ], + "seatCategoryId": 342752792 + } + ], + "seatMapImage": null, + "start": 1383735600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 342742592, + "id": 342742714, + "logo": null, + "name": null, + "prices": [ + { + "amount": 180500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 342752792 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 342752287, + "blockIds": [] + } + ], + "seatCategoryId": 342752792 + } + ], + "seatMapImage": null, + "start": 1383814800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 342742592, + "id": 342742715, + "logo": null, + "name": null, + "prices": [ + { + "amount": 180500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 342752792 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 342752287, + "blockIds": [] + } + ], + "seatCategoryId": 342752792 + } + ], + "seatMapImage": null, + "start": 1383822000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586457, + "id": 138586459, + "logo": "/images/UE0AAAAACEKpWQAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + } + ], + "seatMapImage": null, + "start": 1383850800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586461, + "id": 138586463, + "logo": "/images/UE0AAAAACEKpXQAAAAZDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086210 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086211 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086213 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086214 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086210 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086211 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086214 + } + ], + "seatMapImage": null, + "start": 1383937200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586465, + "id": 138586467, + "logo": "/images/UE0AAAAACEKpYQAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086196 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086197 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086196 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086197 + } + ], + "seatMapImage": null, + "start": 1384110000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586469, + "id": 138586471, + "logo": "/images/UE0AAAAACEKpZQAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 90250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937289 + }, + { + "amount": 71250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937290 + }, + { + "amount": 52250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937292 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937293 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937289 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937290 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937292 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937293 + } + ], + "seatMapImage": null, + "start": 1384196400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586473, + "id": 138586475, + "logo": "/images/UE0AAAAACEKpaQAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 80750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + } + ], + "seatMapImage": null, + "start": 1384282800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586477, + "id": 138586479, + "logo": "/images/UE0AAAAACEKpbQAAAAZDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + } + ], + "seatMapImage": null, + "start": 1384369200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586481, + "id": 138586483, + "logo": "/images/UE0AAAAACEKpcQAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 95000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 76000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937282 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937282 + } + ], + "seatMapImage": null, + "start": 1384455600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586485, + "id": 138586487, + "logo": "/images/UE0AAAAACEKpdQAAAAZDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086210 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086211 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086213 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086214 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086210 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086211 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086214 + } + ], + "seatMapImage": null, + "start": 1384542000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586501, + "id": 138586503, + "logo": "/images/UE0AAAAACEKphQAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + } + ], + "seatMapImage": null, + "start": 1384801200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586505, + "id": 138586507, + "logo": "/images/UE0AAAAACEKpiQAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 80750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + } + ], + "seatMapImage": null, + "start": 1384887600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586509, + "id": 138586511, + "logo": null, + "name": null, + "prices": [ + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937235 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937236 + }, + { + "amount": 19000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937238 + }, + { + "amount": 14250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937239 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937240 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937235 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937236 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937238 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937239 + }, + { + "areas": [ + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937240 + } + ], + "seatMapImage": null, + "start": 1385146800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586513, + "id": 138586515, + "logo": "/images/UE0AAAAACEKpkQAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937284 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937285 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937287 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937288 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937284 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937285 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937287 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937288 + } + ], + "seatMapImage": null, + "start": 1385231400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586517, + "id": 138586519, + "logo": "/images/UE0AAAAACEKplQAAAAdDSVRN", + "name": null, + "prices": [ + { + "amount": 80750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937284 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937285 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937287 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937288 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937284 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937285 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937287 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937288 + } + ], + "seatMapImage": null, + "start": 1385305200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586521, + "id": 138586523, + "logo": "/images/UE0AAAAACEKpmQAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 152000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 104500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 76000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 52250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937282 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937282 + } + ], + "seatMapImage": null, + "start": 1385492400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181235, + "id": 341181439, + "logo": "/images/UE0AAAAAFFYDMwAAAAZDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826016 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826017 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826015 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826018 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826019 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826016 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826017 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826015 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 340826018 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826019 + } + ], + "seatMapImage": null, + "start": 1385665200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586525, + "id": 138586527, + "logo": "/images/UE0AAAAACEKpnQAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086210 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086211 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086213 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086214 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086210 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086211 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086214 + } + ], + "seatMapImage": null, + "start": 1385751600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586529, + "id": 138586531, + "logo": null, + "name": null, + "prices": [ + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937241 + }, + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937242 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937244 + }, + { + "amount": 16150, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937245 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937246 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937241 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937242 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937244 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937245 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937246 + } + ], + "seatMapImage": null, + "start": 1385823600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181235, + "id": 341181438, + "logo": "/images/UE0AAAAAFFYDMwAAAAZDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826016 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826017 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826015 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826018 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826019 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826016 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826017 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826015 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 340826018 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826019 + } + ], + "seatMapImage": null, + "start": 1385838000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586533, + "id": 138586535, + "logo": "/images/UE0AAAAACEKppQAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 80750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937284 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937285 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937287 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937288 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937284 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937285 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937287 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937288 + } + ], + "seatMapImage": null, + "start": 1385910000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586537, + "id": 138586539, + "logo": "/images/UE0AAAAACEKpqQAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 80750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + } + ], + "seatMapImage": null, + "start": 1386010800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586541, + "id": 138586543, + "logo": "/images/UE0AAAAACEKprQAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 80750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + } + ], + "seatMapImage": null, + "start": 1386097200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181236, + "id": 341181440, + "logo": "/images/UE0AAAAAFFYDNAAAAAZDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179212 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179213 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179214 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179215 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179216 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179212 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179214 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 341179215 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179216 + } + ], + "seatMapImage": null, + "start": 1386183600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181236, + "id": 341181441, + "logo": "/images/UE0AAAAAFFYDNAAAAAZDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179212 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179213 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179214 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179215 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179216 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179212 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179213 + }, + { + "areas": [ + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179214 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 341179215 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179216 + } + ], + "seatMapImage": null, + "start": 1386270000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586545, + "id": 138586547, + "logo": "/images/UE0AAAAACEKpsQAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 104500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937284 + }, + { + "amount": 76000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937285 + }, + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937287 + }, + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937288 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937283 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937284 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937285 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937287 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937288 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937283 + } + ], + "seatMapImage": null, + "start": 1386356400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586549, + "id": 138586551, + "logo": "/images/UE0AAAAACEKptQAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937284 + }, + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937285 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937287 + }, + { + "amount": 16150, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937288 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937283 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937284 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937285 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937287 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937288 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937283 + } + ], + "seatMapImage": null, + "start": 1386428400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586553, + "id": 138586555, + "logo": "/images/UE0AAAAACEKpuQAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937284 + }, + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937285 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937287 + }, + { + "amount": 16150, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937288 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937283 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937284 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937285 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937287 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937288 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937283 + } + ], + "seatMapImage": null, + "start": 1386442800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586557, + "id": 138586559, + "logo": "/images/UE0AAAAACEKpvQAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937284 + }, + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937285 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937287 + }, + { + "amount": 16150, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937288 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937283 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937284 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937285 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937287 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937288 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937283 + } + ], + "seatMapImage": null, + "start": 1386514800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 342742593, + "id": 342742716, + "logo": null, + "name": null, + "prices": [ + { + "amount": 180500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 342752792 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 342752287, + "blockIds": [] + } + ], + "seatCategoryId": 342752792 + } + ], + "seatMapImage": null, + "start": 1386579600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 342742593, + "id": 342742717, + "logo": null, + "name": null, + "prices": [ + { + "amount": 180500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 342752792 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 342752287, + "blockIds": [] + } + ], + "seatCategoryId": 342752792 + } + ], + "seatMapImage": null, + "start": 1386586800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586561, + "id": 138586563, + "logo": "/images/UE0AAAAACEKpwQAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 95000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 76000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937282 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937282 + } + ], + "seatMapImage": null, + "start": 1386615600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 342742593, + "id": 342742718, + "logo": null, + "name": null, + "prices": [ + { + "amount": 180500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 342752792 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 342752287, + "blockIds": [] + } + ], + "seatCategoryId": 342752792 + } + ], + "seatMapImage": null, + "start": 1386666000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 342742593, + "id": 342742719, + "logo": null, + "name": null, + "prices": [ + { + "amount": 180500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 342752792 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 342752287, + "blockIds": [] + } + ], + "seatCategoryId": 342752792 + } + ], + "seatMapImage": null, + "start": 1386673200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586565, + "id": 138586567, + "logo": null, + "name": null, + "prices": [ + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 19000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 14250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937282 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937282 + } + ], + "seatMapImage": null, + "start": 1386702000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 342742593, + "id": 342742720, + "logo": null, + "name": null, + "prices": [ + { + "amount": 180500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 342752792 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 342752287, + "blockIds": [] + } + ], + "seatCategoryId": 342752792 + } + ], + "seatMapImage": null, + "start": 1386752400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 342742593, + "id": 342742721, + "logo": null, + "name": null, + "prices": [ + { + "amount": 180500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 342752792 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 342752287, + "blockIds": [] + } + ], + "seatCategoryId": 342752792 + } + ], + "seatMapImage": null, + "start": 1386759600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181241, + "id": 341181449, + "logo": "/images/UE0AAAAAFFYDOQAAAAZDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179212 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179213 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179214 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179215 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179216 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179212 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179214 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 341179215 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179216 + } + ], + "seatMapImage": null, + "start": 1386788400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 342742593, + "id": 342742722, + "logo": null, + "name": null, + "prices": [ + { + "amount": 180500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 342752792 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 342752287, + "blockIds": [] + } + ], + "seatCategoryId": 342752792 + } + ], + "seatMapImage": null, + "start": 1386838800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 342742593, + "id": 342742723, + "logo": null, + "name": null, + "prices": [ + { + "amount": 180500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 342752792 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 342752287, + "blockIds": [] + } + ], + "seatCategoryId": 342752792 + } + ], + "seatMapImage": null, + "start": 1386846000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181241, + "id": 341181450, + "logo": "/images/UE0AAAAAFFYDOQAAAAZDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179212 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179213 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179214 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179215 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179216 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179212 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179214 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 341179215 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179216 + } + ], + "seatMapImage": null, + "start": 1386874800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586569, + "id": 138586571, + "logo": "/images/UE0AAAAACEKpyQAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086210 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086211 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086213 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086214 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086210 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086211 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086214 + } + ], + "seatMapImage": null, + "start": 1386961200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 342742594, + "id": 342742724, + "logo": null, + "name": null, + "prices": [ + { + "amount": 180500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 342752792 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 342752287, + "blockIds": [] + } + ], + "seatCategoryId": 342752792 + } + ], + "seatMapImage": null, + "start": 1387184400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 342742594, + "id": 342742725, + "logo": null, + "name": null, + "prices": [ + { + "amount": 180500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 342752792 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 342752287, + "blockIds": [] + } + ], + "seatCategoryId": 342752792 + } + ], + "seatMapImage": null, + "start": 1387191600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586581, + "id": 138586583, + "logo": null, + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341264860 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341264861 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341264863 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341264864 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341264860 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341264861 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341264863 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341264864 + } + ], + "seatMapImage": null, + "start": 1387220400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 342742594, + "id": 342742726, + "logo": null, + "name": null, + "prices": [ + { + "amount": 180500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 342752792 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 342752287, + "blockIds": [] + } + ], + "seatCategoryId": 342752792 + } + ], + "seatMapImage": null, + "start": 1387270800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 342742594, + "id": 342742727, + "logo": null, + "name": null, + "prices": [ + { + "amount": 180500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 342752792 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 342752287, + "blockIds": [] + } + ], + "seatCategoryId": 342752792 + } + ], + "seatMapImage": null, + "start": 1387278000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586585, + "id": 138586587, + "logo": "/images/UE0AAAAACEKp2QAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + } + ], + "seatMapImage": null, + "start": 1387306800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 342742594, + "id": 342742728, + "logo": null, + "name": null, + "prices": [ + { + "amount": 180500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 342752792 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 342752287, + "blockIds": [] + } + ], + "seatCategoryId": 342752792 + } + ], + "seatMapImage": null, + "start": 1387357200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 342742594, + "id": 342742729, + "logo": null, + "name": null, + "prices": [ + { + "amount": 180500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 342752792 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 342752287, + "blockIds": [] + } + ], + "seatCategoryId": 342752792 + } + ], + "seatMapImage": null, + "start": 1387364400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181250, + "id": 341181465, + "logo": "/images/UE0AAAAAFFYDQgAAAAdDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179212 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179213 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179214 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179215 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179216 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179212 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179214 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 341179215 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179216 + } + ], + "seatMapImage": null, + "start": 1387393200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 342742594, + "id": 342742730, + "logo": null, + "name": null, + "prices": [ + { + "amount": 180500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 342752792 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 342752287, + "blockIds": [] + } + ], + "seatCategoryId": 342752792 + } + ], + "seatMapImage": null, + "start": 1387443600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 342742594, + "id": 342742731, + "logo": null, + "name": null, + "prices": [ + { + "amount": 180500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 342752792 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 342752287, + "blockIds": [] + } + ], + "seatCategoryId": 342752792 + } + ], + "seatMapImage": null, + "start": 1387450800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586589, + "id": 138586591, + "logo": null, + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937284 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937285 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937287 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937288 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937284 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937285 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937287 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937288 + } + ], + "seatMapImage": null, + "start": 1387566000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586593, + "id": 138586595, + "logo": "/images/UE0AAAAACEKp4QAAAAdDSVRN", + "name": null, + "prices": [ + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937235 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937236 + }, + { + "amount": 19000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937238 + }, + { + "amount": 14250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937239 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937240 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937235 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937236 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937238 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937239 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937240 + } + ], + "seatMapImage": null, + "start": 1387724400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 342742595, + "id": 342742732, + "logo": null, + "name": null, + "prices": [ + { + "amount": 180500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 342752792 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 342752287, + "blockIds": [] + } + ], + "seatCategoryId": 342752792 + } + ], + "seatMapImage": null, + "start": 1387789200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 342742595, + "id": 342742733, + "logo": null, + "name": null, + "prices": [ + { + "amount": 180500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 342752792 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 342752287, + "blockIds": [] + } + ], + "seatCategoryId": 342752792 + } + ], + "seatMapImage": null, + "start": 1387796400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 342742595, + "id": 342742734, + "logo": null, + "name": null, + "prices": [ + { + "amount": 180500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 342752792 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 342752287, + "blockIds": [] + } + ], + "seatCategoryId": 342752792 + } + ], + "seatMapImage": null, + "start": 1387875600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 342742595, + "id": 342742735, + "logo": null, + "name": null, + "prices": [ + { + "amount": 180500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 342752792 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 342752287, + "blockIds": [] + } + ], + "seatCategoryId": 342752792 + } + ], + "seatMapImage": null, + "start": 1387882800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 342742595, + "id": 342742736, + "logo": null, + "name": null, + "prices": [ + { + "amount": 180500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 342752792 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 342752287, + "blockIds": [] + } + ], + "seatCategoryId": 342752792 + } + ], + "seatMapImage": null, + "start": 1387962000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 342742595, + "id": 342742737, + "logo": null, + "name": null, + "prices": [ + { + "amount": 180500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 342752792 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 342752287, + "blockIds": [] + } + ], + "seatCategoryId": 342752792 + } + ], + "seatMapImage": null, + "start": 1387969200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 342742595, + "id": 342742738, + "logo": null, + "name": null, + "prices": [ + { + "amount": 180500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 342752792 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 342752287, + "blockIds": [] + } + ], + "seatCategoryId": 342752792 + } + ], + "seatMapImage": null, + "start": 1388048400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 342742595, + "id": 342742739, + "logo": null, + "name": null, + "prices": [ + { + "amount": 180500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 342752792 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 342752287, + "blockIds": [] + } + ], + "seatCategoryId": 342752792 + } + ], + "seatMapImage": null, + "start": 1388055600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 342742596, + "id": 342742740, + "logo": null, + "name": null, + "prices": [ + { + "amount": 180500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 342752792 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 342752287, + "blockIds": [] + } + ], + "seatCategoryId": 342752792 + } + ], + "seatMapImage": null, + "start": 1388998800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 342742596, + "id": 342742741, + "logo": null, + "name": null, + "prices": [ + { + "amount": 180500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 342752792 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 342752287, + "blockIds": [] + } + ], + "seatCategoryId": 342752792 + } + ], + "seatMapImage": null, + "start": 1389006000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 342742596, + "id": 342742742, + "logo": null, + "name": null, + "prices": [ + { + "amount": 180500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 342752792 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 342752287, + "blockIds": [] + } + ], + "seatCategoryId": 342752792 + } + ], + "seatMapImage": null, + "start": 1389085200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 342742596, + "id": 342742743, + "logo": null, + "name": null, + "prices": [ + { + "amount": 180500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 342752792 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 342752287, + "blockIds": [] + } + ], + "seatCategoryId": 342752792 + } + ], + "seatMapImage": null, + "start": 1389092400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 342742596, + "id": 342742744, + "logo": null, + "name": null, + "prices": [ + { + "amount": 180500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 342752792 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 342752287, + "blockIds": [] + } + ], + "seatCategoryId": 342752792 + } + ], + "seatMapImage": null, + "start": 1389171600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 342742596, + "id": 342742745, + "logo": null, + "name": null, + "prices": [ + { + "amount": 180500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 342752792 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 342752287, + "blockIds": [] + } + ], + "seatCategoryId": 342752792 + } + ], + "seatMapImage": null, + "start": 1389178800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181245, + "id": 341181458, + "logo": "/images/UE0AAAAAFFYDPQAAAAZDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179212 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179213 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179214 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179215 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179216 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179212 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179214 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 341179215 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179216 + } + ], + "seatMapImage": null, + "start": 1389207600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 342742596, + "id": 342742746, + "logo": null, + "name": null, + "prices": [ + { + "amount": 180500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 342752792 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 342752287, + "blockIds": [] + } + ], + "seatCategoryId": 342752792 + } + ], + "seatMapImage": null, + "start": 1389258000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 342742596, + "id": 342742747, + "logo": null, + "name": null, + "prices": [ + { + "amount": 180500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 342752792 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 342752287, + "blockIds": [] + } + ], + "seatCategoryId": 342752792 + } + ], + "seatMapImage": null, + "start": 1389265200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181245, + "id": 341181457, + "logo": "/images/UE0AAAAAFFYDPQAAAAZDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179212 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179213 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179214 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179215 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179216 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179212 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179214 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 341179215 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179216 + } + ], + "seatMapImage": null, + "start": 1389294000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586597, + "id": 138586599, + "logo": "/images/UE0AAAAACEKp5QAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086210 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086211 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086213 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086214 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086210 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086211 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086214 + } + ], + "seatMapImage": null, + "start": 1389380400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586601, + "id": 138586603, + "logo": "/images/UE0AAAAACEKp6QAAAAdDSVRN", + "name": null, + "prices": [ + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937241 + }, + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937242 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937244 + }, + { + "amount": 16150, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937245 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937246 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937241 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937242 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937244 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937245 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937246 + } + ], + "seatMapImage": null, + "start": 1389452400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586605, + "id": 138586607, + "logo": null, + "name": null, + "prices": [ + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937284 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937285 + }, + { + "amount": 19000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937287 + }, + { + "amount": 14250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937288 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937283 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937284 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937285 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937287 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937288 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937283 + } + ], + "seatMapImage": null, + "start": 1389538800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586609, + "id": 138586611, + "logo": null, + "name": null, + "prices": [ + { + "amount": 15000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937314 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937314 + } + ], + "seatMapImage": null, + "start": 1389726000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181242, + "id": 341181451, + "logo": "/images/UE0AAAAAFFYDOgAAAAdDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179212 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179213 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179214 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179215 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179216 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179212 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179214 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 341179215 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179216 + } + ], + "seatMapImage": null, + "start": 1389812400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181242, + "id": 341181452, + "logo": "/images/UE0AAAAAFFYDOgAAAAdDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179212 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179213 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179214 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179215 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179216 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179212 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179213 + }, + { + "areas": [ + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179214 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 341179215 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179216 + } + ], + "seatMapImage": null, + "start": 1389898800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586613, + "id": 138586615, + "logo": "/images/UE0AAAAACEKp9QAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086210 + }, + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086211 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086213 + }, + { + "amount": 16150, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086214 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086215 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086210 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086211 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086214 + }, + { + "areas": [ + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086215 + } + ], + "seatMapImage": null, + "start": 1389985200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586617, + "id": 138586619, + "logo": "/images/UE0AAAAACEKp+QAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 90250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937284 + }, + { + "amount": 71250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937285 + }, + { + "amount": 52250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937287 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937288 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937284 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937285 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937287 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937288 + } + ], + "seatMapImage": null, + "start": 1390071600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586625, + "id": 138586627, + "logo": null, + "name": null, + "prices": [ + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937235 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937236 + }, + { + "amount": 19000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937238 + }, + { + "amount": 14250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937239 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937240 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937235 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937236 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937238 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937239 + }, + { + "areas": [ + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937240 + } + ], + "seatMapImage": null, + "start": 1390143600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586629, + "id": 138586631, + "logo": "/images/UE0AAAAACEKqBQAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 90250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937271 + }, + { + "amount": 71250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937272 + }, + { + "amount": 52250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937274 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937275 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937271 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937272 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937274 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937275 + } + ], + "seatMapImage": null, + "start": 1390159800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181239, + "id": 341181446, + "logo": "/images/UE0AAAAAFFYDNwAAAAdDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826016 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826017 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826015 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826018 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826019 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826016 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826017 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826015 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 340826018 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826019 + } + ], + "seatMapImage": null, + "start": 1390417200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181239, + "id": 341181445, + "logo": "/images/UE0AAAAAFFYDNwAAAAdDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826016 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826017 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826015 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826018 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826019 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826016 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826017 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826015 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 340826018 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826019 + } + ], + "seatMapImage": null, + "start": 1390503600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586633, + "id": 138586635, + "logo": "/images/UE0AAAAACEKqCQAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086210 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086211 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086213 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086214 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086210 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086211 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086214 + } + ], + "seatMapImage": null, + "start": 1390590000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586641, + "id": 138586643, + "logo": "/images/UE0AAAAACEKqEQAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 80750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937284 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937285 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937287 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937288 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937284 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937285 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937287 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937288 + } + ], + "seatMapImage": null, + "start": 1390676400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586645, + "id": 138586647, + "logo": "/images/UE0AAAAACEKqFQAAAAdDSVRN", + "name": null, + "prices": [ + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937235 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937236 + }, + { + "amount": 19000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937238 + }, + { + "amount": 14250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937239 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937240 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937235 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937236 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937238 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937239 + }, + { + "areas": [ + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937240 + } + ], + "seatMapImage": null, + "start": 1390748400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586649, + "id": 138586651, + "logo": "/images/UE0AAAAACEKqGQAAAAZDSVRN", + "name": null, + "prices": [ + { + "amount": 95000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 76000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937282 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937282 + } + ], + "seatMapImage": null, + "start": 1390849200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586653, + "id": 138586655, + "logo": null, + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + } + ], + "seatMapImage": null, + "start": 1390935600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181243, + "id": 341181453, + "logo": "/images/UE0AAAAAFFYDOwAAAAdDSVRN", + "name": null, + "prices": [ + { + "amount": 80750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179212 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179213 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179214 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179215 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179212 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179214 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 341179215 + } + ], + "seatMapImage": null, + "start": 1391022000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181243, + "id": 341181454, + "logo": "/images/UE0AAAAAFFYDOwAAAAdDSVRN", + "name": null, + "prices": [ + { + "amount": 80750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179212 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179213 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179214 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179215 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179212 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179214 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 341179215 + } + ], + "seatMapImage": null, + "start": 1391108400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586657, + "id": 138586659, + "logo": "/images/UE0AAAAACEKqIQAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086210 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086211 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086213 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086214 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086210 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086211 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086214 + } + ], + "seatMapImage": null, + "start": 1391194800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586661, + "id": 138586663, + "logo": null, + "name": null, + "prices": [ + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086196 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086197 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086196 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086197 + } + ], + "seatMapImage": null, + "start": 1391353200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586661, + "id": 138586665, + "logo": null, + "name": null, + "prices": [ + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086196 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086197 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086196 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086197 + } + ], + "seatMapImage": null, + "start": 1391367600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586667, + "id": 138586669, + "logo": null, + "name": null, + "prices": [ + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937295 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937296 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937295 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937296 + } + ], + "seatMapImage": null, + "start": 1391540400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586671, + "id": 138586673, + "logo": "/images/UE0AAAAACEKqLwAAAAlDSVRN", + "name": null, + "prices": [ + { + "amount": 80750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937289 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937290 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937292 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937293 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937289 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937290 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937292 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937293 + } + ], + "seatMapImage": null, + "start": 1391626800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586675, + "id": 138586677, + "logo": "/images/UE0AAAAACEKqMwAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + } + ], + "seatMapImage": null, + "start": 1391713200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586679, + "id": 138586681, + "logo": "/images/UE0AAAAACEKqNwAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086210 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086211 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086213 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086214 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086210 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086211 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086214 + } + ], + "seatMapImage": null, + "start": 1391799600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586687, + "id": 138586689, + "logo": "/images/UE0AAAAACEKqPwAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 90250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937284 + }, + { + "amount": 71250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937285 + }, + { + "amount": 52250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937287 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937288 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937284 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937285 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937287 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937288 + } + ], + "seatMapImage": null, + "start": 1391886000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586691, + "id": 138586693, + "logo": null, + "name": null, + "prices": [ + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937284 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937285 + }, + { + "amount": 19000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937287 + }, + { + "amount": 14250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937288 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937283 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937284 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937285 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937287 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937288 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937283 + } + ], + "seatMapImage": null, + "start": 1391958000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586695, + "id": 138586697, + "logo": "/images/UE0AAAAACEKqRwAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 16150, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937282 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937282 + } + ], + "seatMapImage": null, + "start": 1392145200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181240, + "id": 341181448, + "logo": "/images/UE0AAAAAFFYDOAAAAAhDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179212 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179213 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179214 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179215 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179216 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179212 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179214 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 341179215 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179216 + } + ], + "seatMapImage": null, + "start": 1392231600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181240, + "id": 341181447, + "logo": "/images/UE0AAAAAFFYDOAAAAAhDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179212 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179213 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179214 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179215 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179216 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179212 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179213 + }, + { + "areas": [ + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179214 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 341179215 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179216 + } + ], + "seatMapImage": null, + "start": 1392318000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586699, + "id": 138586701, + "logo": null, + "name": null, + "prices": [ + { + "amount": 15000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341264872 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341264872 + } + ], + "seatMapImage": null, + "start": 1392404400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586703, + "id": 138586705, + "logo": "/images/UE0AAAAACEKqTwAAAAZDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937284 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937285 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937287 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937288 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937284 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937285 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937287 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937288 + } + ], + "seatMapImage": null, + "start": 1392490800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586707, + "id": 138586709, + "logo": "/images/UE0AAAAACEKqUwAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 80750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937284 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937285 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937287 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937288 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937284 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937285 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937287 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937288 + } + ], + "seatMapImage": null, + "start": 1392562800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586711, + "id": 138586713, + "logo": "/images/UE0AAAAACEKqVwAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 80750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + } + ], + "seatMapImage": null, + "start": 1392663600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586715, + "id": 138586717, + "logo": "/images/UE0AAAAACEKqWwAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 80750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + } + ], + "seatMapImage": null, + "start": 1392750000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181248, + "id": 341181462, + "logo": "/images/UE0AAAAAFFYDQAAAAAZDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179212 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179213 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179214 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179215 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179216 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179212 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179214 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 341179215 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179216 + } + ], + "seatMapImage": null, + "start": 1392836400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586719, + "id": 138586721, + "logo": "/images/UE0AAAAACEKqXwAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086196 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086197 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086196 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086197 + } + ], + "seatMapImage": null, + "start": 1393095600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586723, + "id": 138586729, + "logo": null, + "name": null, + "prices": [ + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937307 + }, + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937308 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937310 + }, + { + "amount": 16150, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937311 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937312 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937307 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937308 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937310 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937311 + }, + { + "areas": [ + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937312 + } + ], + "seatMapImage": null, + "start": 1393678800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586723, + "id": 138586725, + "logo": null, + "name": null, + "prices": [ + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937307 + }, + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937308 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937310 + }, + { + "amount": 16150, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937311 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937312 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937307 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937308 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937310 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937311 + }, + { + "areas": [ + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937312 + } + ], + "seatMapImage": null, + "start": 1393693200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586723, + "id": 138586727, + "logo": null, + "name": null, + "prices": [ + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937307 + }, + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937308 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937310 + }, + { + "amount": 16150, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937311 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937312 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937307 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937308 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937310 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937311 + }, + { + "areas": [ + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937312 + } + ], + "seatMapImage": null, + "start": 1393754400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586731, + "id": 138586733, + "logo": "/images/UE0AAAAACEKqawAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 19000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 14250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937282 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937282 + } + ], + "seatMapImage": null, + "start": 1393959600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181249, + "id": 341181463, + "logo": "/images/UE0AAAAAFFYDQQAAAAdDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826016 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826017 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826015 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826018 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826019 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826016 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826017 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 340826015 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 340826018 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826019 + } + ], + "seatMapImage": null, + "start": 1394046000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181249, + "id": 341181464, + "logo": "/images/UE0AAAAAFFYDQQAAAAdDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826016 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826017 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826015 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826018 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826019 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826016 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826017 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 340826015 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 340826018 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826019 + } + ], + "seatMapImage": null, + "start": 1394132400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586735, + "id": 138586737, + "logo": "/images/UE0AAAAACEKqbwAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086210 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086211 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086213 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086214 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086210 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086211 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086214 + } + ], + "seatMapImage": null, + "start": 1394218800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586743, + "id": 138586745, + "logo": null, + "name": null, + "prices": [ + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937284 + }, + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937285 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937287 + }, + { + "amount": 16150, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937288 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937283 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937284 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937285 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937287 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937288 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937283 + } + ], + "seatMapImage": null, + "start": 1394305200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586747, + "id": 138586749, + "logo": "/images/UE0AAAAACEKqewAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937284 + }, + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937285 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937287 + }, + { + "amount": 16150, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937288 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937283 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937284 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937285 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937287 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937288 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937283 + } + ], + "seatMapImage": null, + "start": 1394377200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586751, + "id": 138586753, + "logo": "/images/UE0AAAAACEKqfwAAAAVDSVRN", + "name": null, + "prices": [ + { + "amount": 95000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 76000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937282 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937282 + } + ], + "seatMapImage": null, + "start": 1394478000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181244, + "id": 341181455, + "logo": "/images/UE0AAAAAFFYDPAAAAAZDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179212 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179213 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179214 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179215 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179216 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179212 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 341179214 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 341179215 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179216 + } + ], + "seatMapImage": null, + "start": 1394650800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181244, + "id": 341181456, + "logo": "/images/UE0AAAAAFFYDPAAAAAZDSVRN", + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179212 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179213 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179214 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179215 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179216 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179212 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 341179214 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 341179215 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179216 + } + ], + "seatMapImage": null, + "start": 1394737200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586755, + "id": 138586757, + "logo": null, + "name": null, + "prices": [ + { + "amount": 80750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341264866 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341264867 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341264869 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341264870 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341264866 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341264867 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341264869 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341264870 + } + ], + "seatMapImage": null, + "start": 1394823600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586759, + "id": 138586761, + "logo": null, + "name": null, + "prices": [ + { + "amount": 80750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + } + ], + "seatMapImage": null, + "start": 1395082800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 151183114, + "id": 151183116, + "logo": null, + "name": null, + "prices": [ + { + "amount": 90250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937289 + }, + { + "amount": 71250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937290 + }, + { + "amount": 52250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937292 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937293 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937289 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937290 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937292 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937293 + } + ], + "seatMapImage": null, + "start": 1395169200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586771, + "id": 138586773, + "logo": null, + "name": null, + "prices": [ + { + "amount": 80750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + } + ], + "seatMapImage": null, + "start": 1395255600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586775, + "id": 138586777, + "logo": null, + "name": null, + "prices": [ + { + "amount": 95000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 76000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937282 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937282 + } + ], + "seatMapImage": null, + "start": 1395342000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586779, + "id": 138586781, + "logo": null, + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086210 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086211 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086213 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086214 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086210 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086211 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086214 + } + ], + "seatMapImage": null, + "start": 1395428400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586783, + "id": 138586785, + "logo": null, + "name": null, + "prices": [ + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937241 + }, + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937242 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937244 + }, + { + "amount": 16150, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937245 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937246 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937241 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937242 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937244 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937245 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937246 + } + ], + "seatMapImage": null, + "start": 1395500400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586787, + "id": 138586789, + "logo": null, + "name": null, + "prices": [ + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937284 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937285 + }, + { + "amount": 19000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937287 + }, + { + "amount": 14250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937288 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937283 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937284 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937285 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937287 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937288 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937283 + } + ], + "seatMapImage": null, + "start": 1395514800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586795, + "id": 138586797, + "logo": null, + "name": null, + "prices": [ + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937235 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937236 + }, + { + "amount": 19000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937238 + }, + { + "amount": 14250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937239 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937240 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937235 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937236 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937238 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937239 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937240 + } + ], + "seatMapImage": null, + "start": 1395586800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181246, + "id": 341181459, + "logo": null, + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826016 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826017 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826015 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826018 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826019 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826016 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826017 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826015 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 340826018 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826019 + } + ], + "seatMapImage": null, + "start": 1395860400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181246, + "id": 341181460, + "logo": null, + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826016 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826017 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826015 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826018 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826019 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826016 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826017 + }, + { + "areas": [ + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826015 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 340826018 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826019 + } + ], + "seatMapImage": null, + "start": 1395946800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586799, + "id": 138586801, + "logo": null, + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086210 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086211 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086213 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086214 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086210 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086211 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086214 + } + ], + "seatMapImage": null, + "start": 1396033200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586803, + "id": 138586805, + "logo": null, + "name": null, + "prices": [ + { + "amount": 90250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937284 + }, + { + "amount": 71250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937285 + }, + { + "amount": 52250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937287 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937288 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937284 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937285 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937287 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937288 + } + ], + "seatMapImage": null, + "start": 1396191600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586807, + "id": 138586809, + "logo": null, + "name": null, + "prices": [ + { + "amount": 104500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 76000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937282 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937282 + } + ], + "seatMapImage": null, + "start": 1396288800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586811, + "id": 138586813, + "logo": null, + "name": null, + "prices": [ + { + "amount": 90250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 71250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 52250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + } + ], + "seatMapImage": null, + "start": 1396375200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181255, + "id": 341181472, + "logo": null, + "name": null, + "prices": [ + { + "amount": 80750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179212 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179213 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179214 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179215 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179212 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179214 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 341179215 + } + ], + "seatMapImage": null, + "start": 1396461600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181255, + "id": 341181471, + "logo": null, + "name": null, + "prices": [ + { + "amount": 80750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179212 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179213 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179214 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179215 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179212 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179214 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 341179215 + } + ], + "seatMapImage": null, + "start": 1396548000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586815, + "id": 138586817, + "logo": null, + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086210 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086211 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086213 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086214 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086210 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086211 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086214 + } + ], + "seatMapImage": null, + "start": 1396634400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586823, + "id": 138586825, + "logo": null, + "name": null, + "prices": [ + { + "amount": 80750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937284 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937285 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937287 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937288 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937284 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937285 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937287 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937288 + } + ], + "seatMapImage": null, + "start": 1396720800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586827, + "id": 138586829, + "logo": null, + "name": null, + "prices": [ + { + "amount": 80750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937284 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937285 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937287 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937288 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937284 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937285 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937287 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937288 + } + ], + "seatMapImage": null, + "start": 1396792800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586831, + "id": 138586833, + "logo": null, + "name": null, + "prices": [ + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 16150, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937282 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937282 + } + ], + "seatMapImage": null, + "start": 1396893600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586835, + "id": 138586837, + "logo": null, + "name": null, + "prices": [ + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 16150, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937282 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937282 + } + ], + "seatMapImage": null, + "start": 1396980000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181256, + "id": 341181473, + "logo": null, + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179212 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179213 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179214 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179215 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179216 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179212 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179214 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 341179215 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179216 + } + ], + "seatMapImage": null, + "start": 1397066400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181256, + "id": 341181474, + "logo": null, + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179212 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179213 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179214 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179215 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179216 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179212 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179214 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 341179215 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179216 + } + ], + "seatMapImage": null, + "start": 1397152800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586839, + "id": 138586841, + "logo": null, + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341264866 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341264867 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341264869 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341264870 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341264866 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341264867 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341264869 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341264870 + } + ], + "seatMapImage": null, + "start": 1397239200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586843, + "id": 138586845, + "logo": null, + "name": null, + "prices": [ + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937284 + }, + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937285 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937287 + }, + { + "amount": 16150, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937288 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937283 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937284 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937285 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937287 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937288 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937283 + } + ], + "seatMapImage": null, + "start": 1397311200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586847, + "id": 138586849, + "logo": null, + "name": null, + "prices": [ + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937284 + }, + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937285 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937287 + }, + { + "amount": 16150, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937288 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937283 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937284 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937285 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937287 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937288 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937283 + } + ], + "seatMapImage": null, + "start": 1397325600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586851, + "id": 138586853, + "logo": null, + "name": null, + "prices": [ + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937284 + }, + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937285 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937287 + }, + { + "amount": 16150, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937288 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937283 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937284 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937285 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937287 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937288 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937283 + } + ], + "seatMapImage": null, + "start": 1397397600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586855, + "id": 138586857, + "logo": null, + "name": null, + "prices": [ + { + "amount": 80750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + } + ], + "seatMapImage": null, + "start": 1397498400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586859, + "id": 138586861, + "logo": null, + "name": null, + "prices": [ + { + "amount": 80750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + } + ], + "seatMapImage": null, + "start": 1397584800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586863, + "id": 138586865, + "logo": null, + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + } + ], + "seatMapImage": null, + "start": 1397930400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181251, + "id": 341181466, + "logo": null, + "name": null, + "prices": [ + { + "amount": 80750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179212 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179213 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179214 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179215 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179212 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179214 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 341179215 + } + ], + "seatMapImage": null, + "start": 1398276000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181253, + "id": 341181468, + "logo": null, + "name": null, + "prices": [ + { + "amount": 80750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179212 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179213 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179214 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179215 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179212 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179214 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 341179215 + } + ], + "seatMapImage": null, + "start": 1398362400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586867, + "id": 138586869, + "logo": null, + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086210 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086211 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086213 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086214 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086210 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086211 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086214 + } + ], + "seatMapImage": null, + "start": 1398448800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586871, + "id": 138586873, + "logo": null, + "name": null, + "prices": [ + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086196 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086197 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086196 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086197 + } + ], + "seatMapImage": null, + "start": 1398607200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586875, + "id": 138586877, + "logo": null, + "name": null, + "prices": [ + { + "amount": 95000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 76000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937282 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937282 + } + ], + "seatMapImage": null, + "start": 1398708000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586879, + "id": 138586881, + "logo": null, + "name": null, + "prices": [ + { + "amount": 171000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 123500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 95000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 66500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937282 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937282 + } + ], + "seatMapImage": null, + "start": 1398794400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586883, + "id": 138586887, + "logo": null, + "name": null, + "prices": [ + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086196 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086197 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086196 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086197 + } + ], + "seatMapImage": null, + "start": 1399125600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586883, + "id": 138586885, + "logo": null, + "name": null, + "prices": [ + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086196 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086197 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086196 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086197 + } + ], + "seatMapImage": null, + "start": 1399140000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586889, + "id": 138586891, + "logo": null, + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937307 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937308 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937310 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937311 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937307 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937308 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937310 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937311 + } + ], + "seatMapImage": null, + "start": 1399312800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586893, + "id": 138586895, + "logo": null, + "name": null, + "prices": [ + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 19000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 14250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937282 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937282 + } + ], + "seatMapImage": null, + "start": 1399399200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181232, + "id": 341181434, + "logo": null, + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179212 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179213 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179214 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179215 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179216 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179212 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179214 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 341179215 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179216 + } + ], + "seatMapImage": null, + "start": 1399485600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586897, + "id": 138586899, + "logo": null, + "name": null, + "prices": [ + { + "amount": 95000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 76000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937282 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937282 + } + ], + "seatMapImage": null, + "start": 1399917600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586901, + "id": 138586903, + "logo": null, + "name": null, + "prices": [ + { + "amount": 95000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 76000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937282 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937282 + } + ], + "seatMapImage": null, + "start": 1400176800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586905, + "id": 138586907, + "logo": null, + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086210 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086211 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086213 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086214 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086210 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086211 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086214 + } + ], + "seatMapImage": null, + "start": 1400263200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586909, + "id": 138586911, + "logo": null, + "name": null, + "prices": [ + { + "amount": 80750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937284 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937285 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937287 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937288 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937284 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937285 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937287 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937288 + } + ], + "seatMapImage": null, + "start": 1400349600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586917, + "id": 138586919, + "logo": null, + "name": null, + "prices": [ + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937235 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937236 + }, + { + "amount": 19000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937238 + }, + { + "amount": 14250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937239 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937240 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937235 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937236 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937238 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937239 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937240 + } + ], + "seatMapImage": null, + "start": 1400421600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181259, + "id": 341181480, + "logo": null, + "name": null, + "prices": [ + { + "amount": 80750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826016 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826017 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826015 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826018 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826016 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826017 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826015 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 340826018 + } + ], + "seatMapImage": null, + "start": 1400695200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181259, + "id": 341181479, + "logo": null, + "name": null, + "prices": [ + { + "amount": 80750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826016 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826017 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826015 + }, + { + "amount": 28500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 340826018 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826016 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826017 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 340826015 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 340826018 + } + ], + "seatMapImage": null, + "start": 1400781600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586921, + "id": 138586923, + "logo": null, + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086210 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086211 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086213 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086214 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086210 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086211 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086214 + } + ], + "seatMapImage": null, + "start": 1400868000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586929, + "id": 138586931, + "logo": null, + "name": null, + "prices": [ + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937241 + }, + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937242 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937244 + }, + { + "amount": 16150, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937245 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937246 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937241 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937242 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937244 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937245 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937246 + } + ], + "seatMapImage": null, + "start": 1400940000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586933, + "id": 138586935, + "logo": null, + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086196 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086197 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086196 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086197 + } + ], + "seatMapImage": null, + "start": 1401026400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586937, + "id": 138586939, + "logo": null, + "name": null, + "prices": [ + { + "amount": 95000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 76000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937282 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937282 + } + ], + "seatMapImage": null, + "start": 1401127200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586941, + "id": 138586943, + "logo": null, + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341264860 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341264861 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341264863 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341264864 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341264860 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341264861 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341264863 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341264864 + } + ], + "seatMapImage": null, + "start": 1401472800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586945, + "id": 138586947, + "logo": null, + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + } + ], + "seatMapImage": null, + "start": 1401730200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586949, + "id": 138586951, + "logo": null, + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + } + ], + "seatMapImage": null, + "start": 1401818400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586953, + "id": 138586955, + "logo": null, + "name": null, + "prices": [ + { + "amount": 95000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 76000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937282 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937282 + } + ], + "seatMapImage": null, + "start": 1401904800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586957, + "id": 138586959, + "logo": null, + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + } + ], + "seatMapImage": null, + "start": 1401991200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586961, + "id": 138586963, + "logo": null, + "name": null, + "prices": [ + { + "amount": 95000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937284 + }, + { + "amount": 76000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937285 + }, + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937287 + }, + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937288 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937283 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937284 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937285 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937287 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937288 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937283 + } + ], + "seatMapImage": null, + "start": 1402077600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586965, + "id": 138586967, + "logo": null, + "name": null, + "prices": [ + { + "amount": 95000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 76000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937282 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937282 + } + ], + "seatMapImage": null, + "start": 1402423200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181258, + "id": 341181477, + "logo": null, + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179212 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179213 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179214 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179215 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179216 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179212 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179214 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 341179215 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179216 + } + ], + "seatMapImage": null, + "start": 1402509600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181258, + "id": 341181478, + "logo": null, + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179212 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179213 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179214 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179215 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179216 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179212 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179214 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 341179215 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179216 + } + ], + "seatMapImage": null, + "start": 1402596000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586969, + "id": 138586971, + "logo": null, + "name": null, + "prices": [ + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086196 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 339086197 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086196 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 339086197 + } + ], + "seatMapImage": null, + "start": 1402768800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586973, + "id": 138586975, + "logo": null, + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937284 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937285 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937287 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937288 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937284 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937285 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937287 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937288 + } + ], + "seatMapImage": null, + "start": 1402840800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586977, + "id": 138586979, + "logo": null, + "name": null, + "prices": [ + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 33250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 23750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 16150, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937282 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937282 + } + ], + "seatMapImage": null, + "start": 1402941600000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586981, + "id": 138586983, + "logo": null, + "name": null, + "prices": [ + { + "amount": 123500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937289 + }, + { + "amount": 85500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937290 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937292 + }, + { + "amount": 38000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937293 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937294 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937289 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937290 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937292 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937293 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937294 + } + ], + "seatMapImage": null, + "start": 1403028000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181257, + "id": 341181475, + "logo": null, + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179212 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179213 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179214 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179215 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179216 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179212 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179214 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 341179215 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179216 + } + ], + "seatMapImage": null, + "start": 1403114400000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181257, + "id": 341181476, + "logo": null, + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179212 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179213 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179214 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179215 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179216 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179212 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179214 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 341179215 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179216 + } + ], + "seatMapImage": null, + "start": 1403200800000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 341181247, + "id": 341181461, + "logo": null, + "name": null, + "prices": [ + { + "amount": 57000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179212 + }, + { + "amount": 42750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179213 + }, + { + "amount": 32300, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179214 + }, + { + "amount": 20900, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179215 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 341179216 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179212 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179213 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179214 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + } + ], + "seatCategoryId": 341179215 + }, + { + "areas": [ + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 341179216 + } + ], + "seatMapImage": null, + "start": 1403719200000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586989, + "id": 138586991, + "logo": null, + "name": null, + "prices": [ + { + "amount": 152000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937284 + }, + { + "amount": 104500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937285 + }, + { + "amount": 76000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937287 + }, + { + "amount": 52250, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937288 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937283 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937284 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937285 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937287 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937288 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937283 + } + ], + "seatMapImage": null, + "start": 1403892000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586993, + "id": 138586995, + "logo": null, + "name": null, + "prices": [ + { + "amount": 123500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 85500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 38000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937282 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937282 + } + ], + "seatMapImage": null, + "start": 1404324000000, + "venueCode": "PLEYEL_PLEYEL" + }, + { + "eventId": 138586997, + "id": 138586999, + "logo": null, + "name": null, + "prices": [ + { + "amount": 123500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937277 + }, + { + "amount": 85500, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937278 + }, + { + "amount": 61750, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937280 + }, + { + "amount": 38000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937281 + }, + { + "amount": 10000, + "audienceSubCategoryId": 337100890, + "seatCategoryId": 338937282 + } + ], + "seatCategories": [ + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937277 + }, + { + "areas": [ + { + "areaId": 205705999, + "blockIds": [] + }, + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937278 + }, + { + "areas": [ + { + "areaId": 205705998, + "blockIds": [] + }, + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205705995, + "blockIds": [] + }, + { + "areaId": 205705996, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205705993, + "blockIds": [] + }, + { + "areaId": 205706007, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937280 + }, + { + "areas": [ + { + "areaId": 205705994, + "blockIds": [] + }, + { + "areaId": 205706006, + "blockIds": [] + }, + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706001, + "blockIds": [] + }, + { + "areaId": 205706000, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937281 + }, + { + "areas": [ + { + "areaId": 205706005, + "blockIds": [] + }, + { + "areaId": 205706004, + "blockIds": [] + }, + { + "areaId": 205706003, + "blockIds": [] + }, + { + "areaId": 205706002, + "blockIds": [] + }, + { + "areaId": 205706009, + "blockIds": [] + }, + { + "areaId": 205706008, + "blockIds": [] + } + ], + "seatCategoryId": 338937282 + } + ], + "seatMapImage": null, + "start": 1404410400000, + "venueCode": "PLEYEL_PLEYEL" + } + ], + "seatCategoryNames": { + "338937235": "1ère catégorie", + "338937236": "2ème catégorie", + "338937238": "3ème catégorie", + "338937239": "4ème catégorie", + "338937240": "5ème catégorie", + "338937241": "1ère catégorie", + "338937242": "2ème catégorie", + "338937244": "3ème catégorie", + "338937245": "4ème catégorie", + "338937246": "5ème catégorie", + "338937271": "1ère catégorie", + "338937272": "2ème catégorie", + "338937274": "3ème catégorie", + "338937275": "4ème catégorie", + "338937277": "1ère catégorie", + "338937278": "2ème catégorie", + "338937280": "3ème catégorie", + "338937281": "4ème catégorie", + "338937282": "5ème catégorie", + "338937283": "5ème catégorie", + "338937284": "1ère catégorie", + "338937285": "2ème catégorie", + "338937287": "3ème catégorie", + "338937288": "4ème catégorie", + "338937289": "1ère catégorie", + "338937290": "2ème catégorie", + "338937292": "3ème catégorie", + "338937293": "4ème catégorie", + "338937294": "5ème catégorie", + "338937295": "1ère catégorie", + "338937296": "2ème catégorie", + "338937307": "1ère catégorie", + "338937308": "2ème catégorie", + "338937310": "3ème catégorie", + "338937311": "4ème catégorie", + "338937312": "5ème catégorie", + "338937314": "Catégorie unique", + "339086196": "1ère catégorie", + "339086197": "2ème catégorie", + "339086210": "1ère catégorie", + "339086211": "2ème catégorie", + "339086213": "3ème catégorie", + "339086214": "4ème catégorie", + "339086215": "5ème catégorie", + "340826015": "Catégorie 3", + "340826016": "Catégorie 1", + "340826017": "Catégorie 2", + "340826018": "Catégorie 4", + "340826019": "Catégorie 5", + "341179212": "CAT1", + "341179213": "CAT2", + "341179214": "CAT3", + "341179215": "CAT4", + "341179216": "CAT5", + "341264860": "1ère catégorie", + "341264861": "2ème catégorie", + "341264863": "3ème catégorie", + "341264864": "4ème catégorie", + "341264866": "1ère catégorie", + "341264867": "2ème catégorie", + "341264869": "3ème catégorie", + "341264870": "4ème catégorie", + "341264872": "1ère catégorie", + "342752792": "catétgorie unique" + }, + "subTopicNames": { + "337184262": "Musique amplifiée", + "337184263": "Musique baroque", + "337184267": "Ciné-concert", + "337184268": "Musique classique", + "337184269": "Jazz", + "337184273": "Musique de chambre", + "337184275": "Musique dirigée", + "337184279": "Musique du monde", + "337184280": "Pop/rock", + "337184281": "Musique de chambre", + "337184282": "Famille", + "337184283": "Concert", + "337184284": "Opéra (version de concert)", + "337184288": "Musique contemporaine", + "337184292": "Musique vocale", + "337184296": "Musique ancienne", + "337184297": "Chanson", + "337184298": "Voix", + "337184299": "famille" + }, + "subjectNames": {}, + "topicNames": { + "107888604": "Activité", + "324846098": "Type de public", + "324846099": "Genre", + "324846100": "Formations musicales" + }, + "topicSubTopics": { + "107888604": [ + 337184283, + 337184267 + ], + "324846098": [ + 337184299 + ], + "324846099": [ + 337184268, + 337184288, + 337184284, + 337184263, + 337184298, + 337184269, + 337184280, + 337184297, + 337184281, + 337184296, + 337184279 + ], + "324846100": [ + 337184275, + 337184262, + 337184292, + 337184273, + 337184282 + ] + }, + "venueNames": { + "PLEYEL_PLEYEL": "Salle Pleyel" + } +} \ No newline at end of file diff --git a/benchmark/data/twitter.json b/benchmark/data/twitter.json new file mode 100644 index 00000000000000..137fb516252d69 --- /dev/null +++ b/benchmark/data/twitter.json @@ -0,0 +1,15482 @@ +{ + "statuses": [ + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:15 +0000 2014", + "id": 505874924095815700, + "id_str": "505874924095815681", + "text": "@aym0566x \n\n名前:前田あゆみ\n第一印象:なんか怖っ!\n今の印象:とりあえずキモい。噛み合わない\n好きなところ:ぶすでキモいとこ😋✨✨\n思い出:んーーー、ありすぎ😊❤️\nLINE交換できる?:あぁ……ごめん✋\nトプ画をみて:照れますがな😘✨\n一言:お前は一生もんのダチ💖", + "source": "Twitter for iPhone", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": 866260188, + "in_reply_to_user_id_str": "866260188", + "in_reply_to_screen_name": "aym0566x", + "user": { + "id": 1186275104, + "id_str": "1186275104", + "name": "AYUMI", + "screen_name": "ayuu0123", + "location": "", + "description": "元野球部マネージャー❤︎…最高の夏をありがとう…❤︎", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 262, + "friends_count": 252, + "listed_count": 0, + "created_at": "Sat Feb 16 13:40:25 +0000 2013", + "favourites_count": 235, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 1769, + "lang": "en", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/497760886795153410/LDjAwR_y_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/497760886795153410/LDjAwR_y_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/1186275104/1409318784", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 0, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "aym0566x", + "name": "前田あゆみ", + "id": 866260188, + "id_str": "866260188", + "indices": [ + 0, + 9 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:14 +0000 2014", + "id": 505874922023837700, + "id_str": "505874922023837696", + "text": "RT @KATANA77: えっそれは・・・(一同) http://t.co/PkCJAcSuYK", + "source": "Twitter for iPhone", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 903487807, + "id_str": "903487807", + "name": "RT&ファボ魔のむっつんさっm", + "screen_name": "yuttari1998", + "location": "関西 ↓詳しいプロ↓", + "description": "無言フォローはあまり好みません ゲームと動画が好きですシモ野郎ですがよろしく…最近はMGSとブレイブルー、音ゲーをプレイしてます", + "url": "http://t.co/Yg9e1Fl8wd", + "entities": { + "url": { + "urls": [ + { + "url": "http://t.co/Yg9e1Fl8wd", + "expanded_url": "http://twpf.jp/yuttari1998", + "display_url": "twpf.jp/yuttari1998", + "indices": [ + 0, + 22 + ] + } + ] + }, + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 95, + "friends_count": 158, + "listed_count": 1, + "created_at": "Thu Oct 25 08:27:13 +0000 2012", + "favourites_count": 3652, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 10276, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/500268849275494400/AoXHZ7Ij_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/500268849275494400/AoXHZ7Ij_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/903487807/1409062272", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sat Aug 30 23:49:35 +0000 2014", + "id": 505864943636197400, + "id_str": "505864943636197376", + "text": "えっそれは・・・(一同) http://t.co/PkCJAcSuYK", + "source": "Twitter Web Client", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 77915997, + "id_str": "77915997", + "name": "(有)刀", + "screen_name": "KATANA77", + "location": "", + "description": "プリキュア好きのサラリーマンです。好きなプリキュアシリーズはハートキャッチ、最愛のキャラクターは月影ゆりさんです。 http://t.co/QMLJeFmfMTご質問、お問い合わせはこちら http://t.co/LU8T7vmU3h", + "url": null, + "entities": { + "description": { + "urls": [ + { + "url": "http://t.co/QMLJeFmfMT", + "expanded_url": "http://www.pixiv.net/member.php?id=4776", + "display_url": "pixiv.net/member.php?id=…", + "indices": [ + 58, + 80 + ] + }, + { + "url": "http://t.co/LU8T7vmU3h", + "expanded_url": "http://ask.fm/KATANA77", + "display_url": "ask.fm/KATANA77", + "indices": [ + 95, + 117 + ] + } + ] + } + }, + "protected": false, + "followers_count": 1095, + "friends_count": 740, + "listed_count": 50, + "created_at": "Mon Sep 28 03:41:27 +0000 2009", + "favourites_count": 3741, + "utc_offset": 32400, + "time_zone": "Tokyo", + "geo_enabled": true, + "verified": false, + "statuses_count": 19059, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://pbs.twimg.com/profile_background_images/808597451/45b82f887085d32bd4b87dfc348fe22a.png", + "profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/808597451/45b82f887085d32bd4b87dfc348fe22a.png", + "profile_background_tile": true, + "profile_image_url": "http://pbs.twimg.com/profile_images/480210114964504577/MjVIEMS4_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/480210114964504577/MjVIEMS4_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/77915997/1404661392", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "FFFFFF", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": false, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 82, + "favorite_count": 42, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [], + "media": [ + { + "id": 505864942575034400, + "id_str": "505864942575034369", + "indices": [ + 13, + 35 + ], + "media_url": "http://pbs.twimg.com/media/BwUxfC6CIAEr-Ye.jpg", + "media_url_https": "https://pbs.twimg.com/media/BwUxfC6CIAEr-Ye.jpg", + "url": "http://t.co/PkCJAcSuYK", + "display_url": "pic.twitter.com/PkCJAcSuYK", + "expanded_url": "http://twitter.com/KATANA77/status/505864943636197376/photo/1", + "type": "photo", + "sizes": { + "medium": { + "w": 600, + "h": 338, + "resize": "fit" + }, + "small": { + "w": 340, + "h": 192, + "resize": "fit" + }, + "thumb": { + "w": 150, + "h": 150, + "resize": "crop" + }, + "large": { + "w": 765, + "h": 432, + "resize": "fit" + } + } + } + ] + }, + "favorited": false, + "retweeted": false, + "possibly_sensitive": false, + "lang": "ja" + }, + "retweet_count": 82, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "KATANA77", + "name": "(有)刀", + "id": 77915997, + "id_str": "77915997", + "indices": [ + 3, + 12 + ] + } + ], + "media": [ + { + "id": 505864942575034400, + "id_str": "505864942575034369", + "indices": [ + 27, + 49 + ], + "media_url": "http://pbs.twimg.com/media/BwUxfC6CIAEr-Ye.jpg", + "media_url_https": "https://pbs.twimg.com/media/BwUxfC6CIAEr-Ye.jpg", + "url": "http://t.co/PkCJAcSuYK", + "display_url": "pic.twitter.com/PkCJAcSuYK", + "expanded_url": "http://twitter.com/KATANA77/status/505864943636197376/photo/1", + "type": "photo", + "sizes": { + "medium": { + "w": 600, + "h": 338, + "resize": "fit" + }, + "small": { + "w": 340, + "h": 192, + "resize": "fit" + }, + "thumb": { + "w": 150, + "h": 150, + "resize": "crop" + }, + "large": { + "w": 765, + "h": 432, + "resize": "fit" + } + }, + "source_status_id": 505864943636197400, + "source_status_id_str": "505864943636197376" + } + ] + }, + "favorited": false, + "retweeted": false, + "possibly_sensitive": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:14 +0000 2014", + "id": 505874920140591100, + "id_str": "505874920140591104", + "text": "@longhairxMIURA 朝一ライカス辛目だよw", + "source": "Twitter for iPhone", + "truncated": false, + "in_reply_to_status_id": 505874728897085440, + "in_reply_to_status_id_str": "505874728897085440", + "in_reply_to_user_id": 114188950, + "in_reply_to_user_id_str": "114188950", + "in_reply_to_screen_name": "longhairxMIURA", + "user": { + "id": 114786346, + "id_str": "114786346", + "name": "PROTECT-T", + "screen_name": "ttm_protect", + "location": "静岡県長泉町", + "description": "24 / XXX / @andprotector / @lifefocus0545 potato design works", + "url": "http://t.co/5EclbQiRX4", + "entities": { + "url": { + "urls": [ + { + "url": "http://t.co/5EclbQiRX4", + "expanded_url": "http://ap.furtherplatonix.net/index.html", + "display_url": "ap.furtherplatonix.net/index.html", + "indices": [ + 0, + 22 + ] + } + ] + }, + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 1387, + "friends_count": 903, + "listed_count": 25, + "created_at": "Tue Feb 16 16:13:41 +0000 2010", + "favourites_count": 492, + "utc_offset": 32400, + "time_zone": "Osaka", + "geo_enabled": false, + "verified": false, + "statuses_count": 12679, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/481360383253295104/4B9Rcfys_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/481360383253295104/4B9Rcfys_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/114786346/1403600232", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 0, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "longhairxMIURA", + "name": "miura desu", + "id": 114188950, + "id_str": "114188950", + "indices": [ + 0, + 15 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:14 +0000 2014", + "id": 505874919020699650, + "id_str": "505874919020699648", + "text": "RT @omo_kko: ラウワン脱出→友達が家に連んで帰ってって言うから友達ん家に乗せて帰る(1度も行ったことない田舎道)→友達おろして迷子→500メートルくらい続く変な一本道進む→墓地で行き止まりでUターン出来ずバックで500メートル元のところまで進まないといけない←今ここ", + "source": "Twitter for iPhone", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 392585658, + "id_str": "392585658", + "name": "原稿", + "screen_name": "chibu4267", + "location": "キミの部屋の燃えるゴミ箱", + "description": "RTしてTLに濁流を起こすからフォローしない方が良いよ 言ってることもつまらないし 詳細→http://t.co/ANSFlYXERJ 相方@1life_5106_hshd 葛西教徒その壱", + "url": "http://t.co/JTFjV89eaN", + "entities": { + "url": { + "urls": [ + { + "url": "http://t.co/JTFjV89eaN", + "expanded_url": "http://www.pixiv.net/member.php?id=1778417", + "display_url": "pixiv.net/member.php?id=…", + "indices": [ + 0, + 22 + ] + } + ] + }, + "description": { + "urls": [ + { + "url": "http://t.co/ANSFlYXERJ", + "expanded_url": "http://twpf.jp/chibu4267", + "display_url": "twpf.jp/chibu4267", + "indices": [ + 45, + 67 + ] + } + ] + } + }, + "protected": false, + "followers_count": 1324, + "friends_count": 1165, + "listed_count": 99, + "created_at": "Mon Oct 17 08:23:46 +0000 2011", + "favourites_count": 9542, + "utc_offset": 32400, + "time_zone": "Tokyo", + "geo_enabled": true, + "verified": false, + "statuses_count": 369420, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://pbs.twimg.com/profile_background_images/453106940822814720/PcJIZv43.png", + "profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/453106940822814720/PcJIZv43.png", + "profile_background_tile": true, + "profile_image_url": "http://pbs.twimg.com/profile_images/505731759216943107/pzhnkMEg_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/505731759216943107/pzhnkMEg_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/392585658/1362383911", + "profile_link_color": "5EB9FF", + "profile_sidebar_border_color": "FFFFFF", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": false, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sat Aug 30 16:51:09 +0000 2014", + "id": 505759640164892700, + "id_str": "505759640164892673", + "text": "ラウワン脱出→友達が家に連んで帰ってって言うから友達ん家に乗せて帰る(1度も行ったことない田舎道)→友達おろして迷子→500メートルくらい続く変な一本道進む→墓地で行き止まりでUターン出来ずバックで500メートル元のところまで進まないといけない←今ここ", + "source": "Twitter for iPhone", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 309565423, + "id_str": "309565423", + "name": "おもっこ", + "screen_name": "omo_kko", + "location": "", + "description": "ぱんすと", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 730, + "friends_count": 200, + "listed_count": 23, + "created_at": "Thu Jun 02 09:15:51 +0000 2011", + "favourites_count": 5441, + "utc_offset": 32400, + "time_zone": "Tokyo", + "geo_enabled": true, + "verified": false, + "statuses_count": 30012, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/499126939378929664/GLWpIKTW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/499126939378929664/GLWpIKTW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/309565423/1409418370", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 67, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "omo_kko", + "name": "おもっこ", + "id": 309565423, + "id_str": "309565423", + "indices": [ + 3, + 11 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:13 +0000 2014", + "id": 505874918198624260, + "id_str": "505874918198624256", + "text": "RT @thsc782_407: #LEDカツカツ選手権\n漢字一文字ぶんのスペースに「ハウステンボス」を収める狂気 http://t.co/vmrreDMziI", + "source": "Twitter for Android", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 753161754, + "id_str": "753161754", + "name": "ねこねこみかん*", + "screen_name": "nekonekomikan", + "location": "ソーダ水のあふれるビンの中", + "description": "猫×6、大学・高校・旦那各1と暮らしています。猫、子供、日常思った事をつぶやいています/今年の目標:読書、庭の手入れ、ランニング、手芸/猫*花*写真*詩*林ももこさん*鉄道など好きな方をフォローさせていただいています。よろしくお願いします♬", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 217, + "friends_count": 258, + "listed_count": 8, + "created_at": "Sun Aug 12 14:00:47 +0000 2012", + "favourites_count": 7650, + "utc_offset": 32400, + "time_zone": "Tokyo", + "geo_enabled": false, + "verified": false, + "statuses_count": 20621, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/470627990271848448/m83uy6Vc_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/470627990271848448/m83uy6Vc_normal.jpeg", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Fri Feb 28 16:04:13 +0000 2014", + "id": 439430848190742500, + "id_str": "439430848190742528", + "text": "#LEDカツカツ選手権\n漢字一文字ぶんのスペースに「ハウステンボス」を収める狂気 http://t.co/vmrreDMziI", + "source": "Twitter Web Client", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 82900665, + "id_str": "82900665", + "name": "[90]青葉台 芦 (第二粟屋) 屋", + "screen_name": "thsc782_407", + "location": "かんましき", + "description": "湯の街の元勃酩姦なんちゃら大 赤い犬の犬(外資系) 肥後で緑ナンバー屋さん勤め\nくだらないことしかつぶやかないし、いちいち訳のわからない記号を連呼するので相当邪魔になると思います。害はないと思います。のりものの画像とかたくさん上げます。さみしい。車輪のついたものならだいたい好き。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 587, + "friends_count": 623, + "listed_count": 30, + "created_at": "Fri Oct 16 15:13:32 +0000 2009", + "favourites_count": 1405, + "utc_offset": 32400, + "time_zone": "Tokyo", + "geo_enabled": true, + "verified": false, + "statuses_count": 60427, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "352726", + "profile_background_image_url": "http://pbs.twimg.com/profile_background_images/154137819/__813-1103.jpg", + "profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/154137819/__813-1103.jpg", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/493760276676620289/32oLiTtT_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/493760276676620289/32oLiTtT_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/82900665/1398865798", + "profile_link_color": "D02B55", + "profile_sidebar_border_color": "829D5E", + "profile_sidebar_fill_color": "99CC33", + "profile_text_color": "3E4415", + "profile_use_background_image": true, + "default_profile": false, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 3291, + "favorite_count": 1526, + "entities": { + "hashtags": [ + { + "text": "LEDカツカツ選手権", + "indices": [ + 0, + 11 + ] + } + ], + "symbols": [], + "urls": [], + "user_mentions": [], + "media": [ + { + "id": 439430848194936800, + "id_str": "439430848194936832", + "indices": [ + 41, + 63 + ], + "media_url": "http://pbs.twimg.com/media/BhksBzoCAAAJeDS.jpg", + "media_url_https": "https://pbs.twimg.com/media/BhksBzoCAAAJeDS.jpg", + "url": "http://t.co/vmrreDMziI", + "display_url": "pic.twitter.com/vmrreDMziI", + "expanded_url": "http://twitter.com/thsc782_407/status/439430848190742528/photo/1", + "type": "photo", + "sizes": { + "medium": { + "w": 600, + "h": 450, + "resize": "fit" + }, + "large": { + "w": 1024, + "h": 768, + "resize": "fit" + }, + "thumb": { + "w": 150, + "h": 150, + "resize": "crop" + }, + "small": { + "w": 340, + "h": 255, + "resize": "fit" + } + } + } + ] + }, + "favorited": false, + "retweeted": false, + "possibly_sensitive": false, + "lang": "ja" + }, + "retweet_count": 3291, + "favorite_count": 0, + "entities": { + "hashtags": [ + { + "text": "LEDカツカツ選手権", + "indices": [ + 17, + 28 + ] + } + ], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "thsc782_407", + "name": "[90]青葉台 芦 (第二粟屋) 屋", + "id": 82900665, + "id_str": "82900665", + "indices": [ + 3, + 15 + ] + } + ], + "media": [ + { + "id": 439430848194936800, + "id_str": "439430848194936832", + "indices": [ + 58, + 80 + ], + "media_url": "http://pbs.twimg.com/media/BhksBzoCAAAJeDS.jpg", + "media_url_https": "https://pbs.twimg.com/media/BhksBzoCAAAJeDS.jpg", + "url": "http://t.co/vmrreDMziI", + "display_url": "pic.twitter.com/vmrreDMziI", + "expanded_url": "http://twitter.com/thsc782_407/status/439430848190742528/photo/1", + "type": "photo", + "sizes": { + "medium": { + "w": 600, + "h": 450, + "resize": "fit" + }, + "large": { + "w": 1024, + "h": 768, + "resize": "fit" + }, + "thumb": { + "w": 150, + "h": 150, + "resize": "crop" + }, + "small": { + "w": 340, + "h": 255, + "resize": "fit" + } + }, + "source_status_id": 439430848190742500, + "source_status_id_str": "439430848190742528" + } + ] + }, + "favorited": false, + "retweeted": false, + "possibly_sensitive": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:13 +0000 2014", + "id": 505874918039228400, + "id_str": "505874918039228416", + "text": "【金一地区太鼓台】川関と小山の見分けがつかない", + "source": "twittbot.net", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2530194984, + "id_str": "2530194984", + "name": "川之江中高生あるある", + "screen_name": "kw_aru", + "location": "DMにてネタ提供待ってますよ", + "description": "川之江中高生の川之江中高生による川之江中高生のためのあるあるアカウントです。タイムリーなネタはお気に入りにあります。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 113, + "friends_count": 157, + "listed_count": 0, + "created_at": "Wed May 28 15:01:43 +0000 2014", + "favourites_count": 30, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 4472, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/471668359314948097/XbIyXiZK_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/471668359314948097/XbIyXiZK_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2530194984/1401289473", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 0, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:13 +0000 2014", + "id": 505874915338104800, + "id_str": "505874915338104833", + "text": "おはようございますん♪ SSDSのDVDが朝一で届いた〜(≧∇≦)", + "source": "TweetList!", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 428179337, + "id_str": "428179337", + "name": "サラ", + "screen_name": "sala_mgn", + "location": "東京都", + "description": "bot遊びと実況が主目的の趣味アカウント。成人済♀。時々TLお騒がせします。リフォ率低いですがF/Bご自由に。スパムはブロック![HOT]K[アニメ]タイバニ/K/薄桜鬼/トライガン/進撃[小説]冲方丁/森博嗣[漫画]内藤泰弘/高河ゆん[他]声優/演劇 ※@sano_bot1二代目管理人", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 104, + "friends_count": 421, + "listed_count": 2, + "created_at": "Sun Dec 04 12:51:18 +0000 2011", + "favourites_count": 3257, + "utc_offset": -36000, + "time_zone": "Hawaii", + "geo_enabled": false, + "verified": false, + "statuses_count": 25303, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "1A1B1F", + "profile_background_image_url": "http://pbs.twimg.com/profile_background_images/601682567/put73jtg48ytjylq00if.jpeg", + "profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/601682567/put73jtg48ytjylq00if.jpeg", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/3350624721/755920942e4f512e6ba489df7eb1147e_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/3350624721/755920942e4f512e6ba489df7eb1147e_normal.jpeg", + "profile_link_color": "2FC2EF", + "profile_sidebar_border_color": "181A1E", + "profile_sidebar_fill_color": "252429", + "profile_text_color": "666666", + "profile_use_background_image": true, + "default_profile": false, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 0, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:13 +0000 2014", + "id": 505874914897690600, + "id_str": "505874914897690624", + "text": "@ran_kirazuki そのようなお言葉を頂けるとは……!この雨太郎、誠心誠意を持って姉御の足の指の第一関節を崇め奉りとうございます", + "source": "Twitter for Android", + "truncated": false, + "in_reply_to_status_id": 505874276692406300, + "in_reply_to_status_id_str": "505874276692406272", + "in_reply_to_user_id": 531544559, + "in_reply_to_user_id_str": "531544559", + "in_reply_to_screen_name": "ran_kirazuki", + "user": { + "id": 2364828518, + "id_str": "2364828518", + "name": "雨", + "screen_name": "tear_dice", + "location": "変態/日常/創作/室町/たまに版権", + "description": "アイコンは兄さんから!", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 28, + "friends_count": 28, + "listed_count": 0, + "created_at": "Fri Feb 28 00:28:40 +0000 2014", + "favourites_count": 109, + "utc_offset": 32400, + "time_zone": "Seoul", + "geo_enabled": false, + "verified": false, + "statuses_count": 193, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "000000", + "profile_background_image_url": "http://pbs.twimg.com/profile_background_images/504434510675443713/lvW7ad5b.jpeg", + "profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/504434510675443713/lvW7ad5b.jpeg", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/505170142284640256/rnW4XeEJ_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/505170142284640256/rnW4XeEJ_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2364828518/1409087198", + "profile_link_color": "0D31BF", + "profile_sidebar_border_color": "000000", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": false, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 0, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "ran_kirazuki", + "name": "蘭ぴよの日常", + "id": 531544559, + "id_str": "531544559", + "indices": [ + 0, + 13 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:13 +0000 2014", + "id": 505874914591514600, + "id_str": "505874914591514626", + "text": "RT @AFmbsk: @samao21718 \n呼び方☞まおちゃん\n呼ばれ方☞あーちゃん\n第一印象☞平野から?!\n今の印象☞おとなっぽい!!\nLINE交換☞もってるん\\( ˆoˆ )/\nトプ画について☞楽しそうでいーな😳\n家族にするなら☞おねぇちゃん\n最後に一言☞全然会えない…", + "source": "Twitter for Android", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2179759316, + "id_str": "2179759316", + "name": "まお", + "screen_name": "samao21718", + "location": "埼玉 UK留学してました✈", + "description": "゚.*97line おさらに貢いでる系女子*.゜ DISH// ✯ 佐野悠斗 ✯ 読モ ✯ WEGO ✯ 嵐 I met @OTYOfficial in the London ;)", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 111, + "friends_count": 121, + "listed_count": 0, + "created_at": "Thu Nov 07 09:47:41 +0000 2013", + "favourites_count": 321, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 1777, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501535615351926784/c5AAh6Sz_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501535615351926784/c5AAh6Sz_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2179759316/1407640217", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sat Aug 30 14:59:49 +0000 2014", + "id": 505731620456771600, + "id_str": "505731620456771584", + "text": "@samao21718 \n呼び方☞まおちゃん\n呼ばれ方☞あーちゃん\n第一印象☞平野から?!\n今の印象☞おとなっぽい!!\nLINE交換☞もってるん\\( ˆoˆ )/\nトプ画について☞楽しそうでいーな😳\n家族にするなら☞おねぇちゃん\n最後に一言☞全然会えないねー今度会えたらいいな!", + "source": "Twitter for iPhone", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": 2179759316, + "in_reply_to_user_id_str": "2179759316", + "in_reply_to_screen_name": "samao21718", + "user": { + "id": 1680668713, + "id_str": "1680668713", + "name": "★Shiiiii!☆", + "screen_name": "AFmbsk", + "location": "埼玉", + "description": "2310*basketball#41*UVERworld*Pooh☪Bell +.。*弱さを知って強くなれ*゚", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 429, + "friends_count": 434, + "listed_count": 0, + "created_at": "Sun Aug 18 12:45:00 +0000 2013", + "favourites_count": 2488, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 6352, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/504643170886365185/JN_dlwUd_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/504643170886365185/JN_dlwUd_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/1680668713/1408805886", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 1, + "favorite_count": 1, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "samao21718", + "name": "まお", + "id": 2179759316, + "id_str": "2179759316", + "indices": [ + 0, + 11 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 1, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "AFmbsk", + "name": "★Shiiiii!☆", + "id": 1680668713, + "id_str": "1680668713", + "indices": [ + 3, + 10 + ] + }, + { + "screen_name": "samao21718", + "name": "まお", + "id": 2179759316, + "id_str": "2179759316", + "indices": [ + 12, + 23 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:10 +0000 2014", + "id": 505874905712189440, + "id_str": "505874905712189440", + "text": "一、常に身一つ簡素にして、美食を好んではならない", + "source": "twittbot.net", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 1330420010, + "id_str": "1330420010", + "name": "獨行道bot", + "screen_name": "dokkodo_bot", + "location": "", + "description": "宮本武蔵の自誓書、「獨行道」に記された二十一箇条をランダムにつぶやくbotです。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 4, + "friends_count": 5, + "listed_count": 1, + "created_at": "Sat Apr 06 01:19:55 +0000 2013", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 9639, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/3482551671/d9e749f7658b523bdd50b7584ed4ba6a_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/3482551671/d9e749f7658b523bdd50b7584ed4ba6a_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/1330420010/1365212335", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 0, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:10 +0000 2014", + "id": 505874903094939650, + "id_str": "505874903094939648", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "モテモテ大作戦★男子編", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2714526565, + "id_str": "2714526565", + "name": "モテモテ大作戦★男子編", + "screen_name": "mote_danshi1", + "location": "", + "description": "やっぱりモテモテ男子になりたい!自分を磨くヒントをみつけたい!応援してくれる人は RT & 相互フォローで みなさん、お願いします♪", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 664, + "friends_count": 1835, + "listed_count": 0, + "created_at": "Thu Aug 07 12:59:59 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 597, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/497368689386086400/7hqdKMzG_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/497368689386086400/7hqdKMzG_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2714526565/1407416898", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:10 +0000 2014", + "id": 505874902390276100, + "id_str": "505874902390276096", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "心に響くアツい名言集", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2699261263, + "id_str": "2699261263", + "name": "心に響くアツい名言集", + "screen_name": "kokoro_meigen11", + "location": "", + "description": "人生の格言は、人の心や人生を瞬時にに動かしてしまうことがある。\r\nそんな言葉の重みを味わおう。\r\n面白かったらRT & 相互フォローでみなさん、お願いします♪", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 183, + "friends_count": 1126, + "listed_count": 0, + "created_at": "Fri Aug 01 22:00:00 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 749, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/495328654126112768/1rKnNuWK_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/495328654126112768/1rKnNuWK_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2699261263/1406930543", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:10 +0000 2014", + "id": 505874902247677950, + "id_str": "505874902247677954", + "text": "RT @POTENZA_SUPERGT: ありがとうございます!“@8CBR8: @POTENZA_SUPERGT 13時半ごろ一雨きそうですが、無事全車決勝レース完走出来ること祈ってます! http://t.co/FzTyFnt9xH”", + "source": "jigtwi", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 1021030416, + "id_str": "1021030416", + "name": "narur", + "screen_name": "narur2", + "location": "晴れの国なのに何故か開幕戦では雨や雪や冰や霰が降る✨", + "description": "F1.GP2.Superformula.SuperGT.F3...\nスーパーGTが大好き♡車が好き!新幹線も好き!飛行機も好き!こっそり別アカです(๑´ㅂ`๑)♡*.+゜", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 257, + "friends_count": 237, + "listed_count": 2, + "created_at": "Wed Dec 19 01:14:41 +0000 2012", + "favourites_count": 547, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 55417, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://pbs.twimg.com/profile_background_images/462180217574789121/1Jf6m_2L.jpeg", + "profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/462180217574789121/1Jf6m_2L.jpeg", + "profile_background_tile": true, + "profile_image_url": "http://pbs.twimg.com/profile_images/444312241395863552/FKl40ebQ_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/444312241395863552/FKl40ebQ_normal.jpeg", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": false, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:05:11 +0000 2014", + "id": 505868866686169100, + "id_str": "505868866686169089", + "text": "ありがとうございます!“@8CBR8: @POTENZA_SUPERGT 13時半ごろ一雨きそうですが、無事全車決勝レース完走出来ること祈ってます! http://t.co/FzTyFnt9xH”", + "source": "Twitter for iPhone", + "truncated": false, + "in_reply_to_status_id": 505868690588303360, + "in_reply_to_status_id_str": "505868690588303360", + "in_reply_to_user_id": 333344408, + "in_reply_to_user_id_str": "333344408", + "in_reply_to_screen_name": "8CBR8", + "user": { + "id": 359324738, + "id_str": "359324738", + "name": "POTENZA_SUPERGT", + "screen_name": "POTENZA_SUPERGT", + "location": "", + "description": "ブリヂストンのスポーツタイヤ「POTENZA」のアカウントです。レースやタイヤの事などをつぶやきます。今シーズンも「チャンピオンタイヤの称号は譲らない」をキャッチコピーに、タイヤ供給チームを全力でサポートしていきますので、応援よろしくお願いします!なお、返信ができない場合もありますので、ご了承よろしくお願い致します。", + "url": "http://t.co/LruVPk5x4K", + "entities": { + "url": { + "urls": [ + { + "url": "http://t.co/LruVPk5x4K", + "expanded_url": "http://www.bridgestone.co.jp/sc/potenza/", + "display_url": "bridgestone.co.jp/sc/potenza/", + "indices": [ + 0, + 22 + ] + } + ] + }, + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 9612, + "friends_count": 308, + "listed_count": 373, + "created_at": "Sun Aug 21 11:33:38 +0000 2011", + "favourites_count": 26, + "utc_offset": -36000, + "time_zone": "Hawaii", + "geo_enabled": true, + "verified": false, + "statuses_count": 10032, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "131516", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme14/bg.gif", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme14/bg.gif", + "profile_background_tile": true, + "profile_image_url": "http://pbs.twimg.com/profile_images/1507885396/TW_image_normal.jpg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/1507885396/TW_image_normal.jpg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/359324738/1402546267", + "profile_link_color": "FF2424", + "profile_sidebar_border_color": "EEEEEE", + "profile_sidebar_fill_color": "EFEFEF", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": false, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 7, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "8CBR8", + "name": "CBR Rider #17 KEIHIN", + "id": 333344408, + "id_str": "333344408", + "indices": [ + 12, + 18 + ] + }, + { + "screen_name": "POTENZA_SUPERGT", + "name": "POTENZA_SUPERGT", + "id": 359324738, + "id_str": "359324738", + "indices": [ + 20, + 36 + ] + } + ], + "media": [ + { + "id": 505868690252779500, + "id_str": "505868690252779521", + "indices": [ + 75, + 97 + ], + "media_url": "http://pbs.twimg.com/media/BwU05MGCUAEY6Wu.jpg", + "media_url_https": "https://pbs.twimg.com/media/BwU05MGCUAEY6Wu.jpg", + "url": "http://t.co/FzTyFnt9xH", + "display_url": "pic.twitter.com/FzTyFnt9xH", + "expanded_url": "http://twitter.com/8CBR8/status/505868690588303360/photo/1", + "type": "photo", + "sizes": { + "medium": { + "w": 600, + "h": 399, + "resize": "fit" + }, + "thumb": { + "w": 150, + "h": 150, + "resize": "crop" + }, + "large": { + "w": 1024, + "h": 682, + "resize": "fit" + }, + "small": { + "w": 340, + "h": 226, + "resize": "fit" + } + }, + "source_status_id": 505868690588303360, + "source_status_id_str": "505868690588303360" + } + ] + }, + "favorited": false, + "retweeted": false, + "possibly_sensitive": false, + "lang": "ja" + }, + "retweet_count": 7, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "POTENZA_SUPERGT", + "name": "POTENZA_SUPERGT", + "id": 359324738, + "id_str": "359324738", + "indices": [ + 3, + 19 + ] + }, + { + "screen_name": "8CBR8", + "name": "CBR Rider #17 KEIHIN", + "id": 333344408, + "id_str": "333344408", + "indices": [ + 33, + 39 + ] + }, + { + "screen_name": "POTENZA_SUPERGT", + "name": "POTENZA_SUPERGT", + "id": 359324738, + "id_str": "359324738", + "indices": [ + 41, + 57 + ] + } + ], + "media": [ + { + "id": 505868690252779500, + "id_str": "505868690252779521", + "indices": [ + 96, + 118 + ], + "media_url": "http://pbs.twimg.com/media/BwU05MGCUAEY6Wu.jpg", + "media_url_https": "https://pbs.twimg.com/media/BwU05MGCUAEY6Wu.jpg", + "url": "http://t.co/FzTyFnt9xH", + "display_url": "pic.twitter.com/FzTyFnt9xH", + "expanded_url": "http://twitter.com/8CBR8/status/505868690588303360/photo/1", + "type": "photo", + "sizes": { + "medium": { + "w": 600, + "h": 399, + "resize": "fit" + }, + "thumb": { + "w": 150, + "h": 150, + "resize": "crop" + }, + "large": { + "w": 1024, + "h": 682, + "resize": "fit" + }, + "small": { + "w": 340, + "h": 226, + "resize": "fit" + } + }, + "source_status_id": 505868690588303360, + "source_status_id_str": "505868690588303360" + } + ] + }, + "favorited": false, + "retweeted": false, + "possibly_sensitive": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:09 +0000 2014", + "id": 505874901689851900, + "id_str": "505874901689851904", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "ここだけの本音★男子編", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2762136439, + "id_str": "2762136439", + "name": "ここだけの本音★男子編", + "screen_name": "danshi_honne1", + "location": "", + "description": "思ってるけど言えない!でもホントは言いたいこと、実はいっぱいあるんです! \r\nそんな男子の本音を、つぶやきます。 \r\nその気持わかるって人は RT & フォローお願いします♪", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 101, + "friends_count": 985, + "listed_count": 0, + "created_at": "Sun Aug 24 11:11:30 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 209, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/503500282840354816/CEv8UMay_normal.png", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/503500282840354816/CEv8UMay_normal.png", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2762136439/1408878822", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:09 +0000 2014", + "id": 505874900939046900, + "id_str": "505874900939046912", + "text": "RT @UARROW_Y: ようかい体操第一を踊る国見英 http://t.co/SXoYWH98as", + "source": "Twitter for iPhone", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2454426158, + "id_str": "2454426158", + "name": "ぴかりん", + "screen_name": "gncnToktTtksg", + "location": "", + "description": "銀魂/黒バス/進撃/ハイキュー/BLEACH/うたプリ/鈴木達央さん/神谷浩史さん 気軽にフォローしてください(^∇^)✨", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 1274, + "friends_count": 1320, + "listed_count": 17, + "created_at": "Sun Apr 20 07:48:53 +0000 2014", + "favourites_count": 2314, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 5868, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/457788684146716672/KCOy0S75_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/457788684146716672/KCOy0S75_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2454426158/1409371302", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:45 +0000 2014", + "id": 505871779949051900, + "id_str": "505871779949051904", + "text": "ようかい体操第一を踊る国見英 http://t.co/SXoYWH98as", + "source": "Twitter for Android", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 1261662588, + "id_str": "1261662588", + "name": "ゆう矢", + "screen_name": "UARROW_Y", + "location": "つくり出そう国影の波 広げよう国影の輪", + "description": "HQ!! 成人済腐女子。日常ツイート多いです。赤葦京治夢豚クソツイ含みます注意。フォローをお考えの際はプロフご一読お願い致します。FRBお気軽に", + "url": "http://t.co/LFX2XOzb0l", + "entities": { + "url": { + "urls": [ + { + "url": "http://t.co/LFX2XOzb0l", + "expanded_url": "http://twpf.jp/UARROW_Y", + "display_url": "twpf.jp/UARROW_Y", + "indices": [ + 0, + 22 + ] + } + ] + }, + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 265, + "friends_count": 124, + "listed_count": 12, + "created_at": "Tue Mar 12 10:42:17 +0000 2013", + "favourites_count": 6762, + "utc_offset": 32400, + "time_zone": "Tokyo", + "geo_enabled": true, + "verified": false, + "statuses_count": 55946, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/502095104618663937/IzuPYx3E_normal.png", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/502095104618663937/IzuPYx3E_normal.png", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/1261662588/1408618604", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 29, + "favorite_count": 54, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [ + { + "url": "http://t.co/SXoYWH98as", + "expanded_url": "http://twitter.com/UARROW_Y/status/505871779949051904/photo/1", + "display_url": "pic.twitter.com/SXoYWH98as", + "indices": [ + 15, + 37 + ] + } + ], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "possibly_sensitive": false, + "lang": "ja" + }, + "retweet_count": 29, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [ + { + "url": "http://t.co/SXoYWH98as", + "expanded_url": "http://twitter.com/UARROW_Y/status/505871779949051904/photo/1", + "display_url": "pic.twitter.com/SXoYWH98as", + "indices": [ + 29, + 51 + ] + } + ], + "user_mentions": [ + { + "screen_name": "UARROW_Y", + "name": "ゆう矢", + "id": 1261662588, + "id_str": "1261662588", + "indices": [ + 3, + 12 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "possibly_sensitive": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:09 +0000 2014", + "id": 505874900561580000, + "id_str": "505874900561580032", + "text": "今日は一高と三桜(・θ・)\n光梨ちゃんに会えないかな〜", + "source": "Twitter for iPhone", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 1366375976, + "id_str": "1366375976", + "name": "ゆいの", + "screen_name": "yuino1006", + "location": "", + "description": "さんおう 男バスマネ2ねん(^ω^)", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 270, + "friends_count": 260, + "listed_count": 0, + "created_at": "Sat Apr 20 07:02:08 +0000 2013", + "favourites_count": 1384, + "utc_offset": 32400, + "time_zone": "Irkutsk", + "geo_enabled": false, + "verified": false, + "statuses_count": 5202, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/505354401448349696/nxVFEQQ4_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/505354401448349696/nxVFEQQ4_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/1366375976/1399989379", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 0, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:09 +0000 2014", + "id": 505874899324248060, + "id_str": "505874899324248064", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "共感★絶対あるあるww", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2704420069, + "id_str": "2704420069", + "name": "共感★絶対あるあるww", + "screen_name": "kyoukan_aru", + "location": "", + "description": "みんなにもわかってもらえる、あるあるを見つけたい。\r\n面白かったらRT & 相互フォローでみなさん、お願いします♪", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 857, + "friends_count": 1873, + "listed_count": 0, + "created_at": "Sun Aug 03 15:50:40 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 682, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/495960812670836737/1LqkoyvU_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/495960812670836737/1LqkoyvU_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2704420069/1407081298", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:09 +0000 2014", + "id": 505874898493796350, + "id_str": "505874898493796352", + "text": "RT @assam_house: 泉田新潟県知事は、東電の申請書提出を容認させられただけで、再稼働に必要な「同意」はまだ与えていません。今まで柏崎刈羽の再稼働を抑え続けてきた知事に、もう一踏ん張りをお願いする意見を送って下さい。全国の皆様、お願いします!\nhttp://t.co…", + "source": "jigtwi for Android", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 960765968, + "id_str": "960765968", + "name": "さち", + "screen_name": "sachitaka_dears", + "location": "宮城県", + "description": "動物関連のアカウントです。サブアカウント@sachi_dears (さち ❷) もあります。『心あるものは皆、愛し愛されるために生まれてきた。そして愛情を感じながら生を全うするべきなんだ』", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 3212, + "friends_count": 3528, + "listed_count": 91, + "created_at": "Tue Nov 20 16:30:53 +0000 2012", + "favourites_count": 3180, + "utc_offset": 32400, + "time_zone": "Irkutsk", + "geo_enabled": false, + "verified": false, + "statuses_count": 146935, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/3659653229/5b698df67f5d105400e9077f5ea50e91_normal.png", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/3659653229/5b698df67f5d105400e9077f5ea50e91_normal.png", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Tue Aug 19 11:00:53 +0000 2014", + "id": 501685228427964400, + "id_str": "501685228427964417", + "text": "泉田新潟県知事は、東電の申請書提出を容認させられただけで、再稼働に必要な「同意」はまだ与えていません。今まで柏崎刈羽の再稼働を抑え続けてきた知事に、もう一踏ん張りをお願いする意見を送って下さい。全国の皆様、お願いします!\nhttp://t.co/9oH5cgpy1q", + "source": "twittbot.net", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 1104771276, + "id_str": "1104771276", + "name": "アッサム山中(殺処分ゼロに一票)", + "screen_name": "assam_house", + "location": "新潟県柏崎市", + "description": "アッサム山中の趣味用アカ。当分の間、選挙啓発用としても使っていきます。このアカウントがアッサム山中本人のものである事は @assam_yamanaka のプロフでご確認下さい。\r\n公選法に係る表示\r\n庶民新党 #脱原発 http://t.co/96UqoCo0oU\r\nonestep.revival@gmail.com", + "url": "http://t.co/AEOCATaNZc", + "entities": { + "url": { + "urls": [ + { + "url": "http://t.co/AEOCATaNZc", + "expanded_url": "http://www.assam-house.net/", + "display_url": "assam-house.net", + "indices": [ + 0, + 22 + ] + } + ] + }, + "description": { + "urls": [ + { + "url": "http://t.co/96UqoCo0oU", + "expanded_url": "http://blog.assam-house.net/datsu-genpatsu/index.html", + "display_url": "blog.assam-house.net/datsu-genpatsu…", + "indices": [ + 110, + 132 + ] + } + ] + } + }, + "protected": false, + "followers_count": 2977, + "friends_count": 3127, + "listed_count": 64, + "created_at": "Sat Jan 19 22:10:13 +0000 2013", + "favourites_count": 343, + "utc_offset": 32400, + "time_zone": "Irkutsk", + "geo_enabled": false, + "verified": false, + "statuses_count": 18021, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/378800000067217575/e0a85b440429ff50430a41200327dcb8_normal.png", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/378800000067217575/e0a85b440429ff50430a41200327dcb8_normal.png", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/1104771276/1408948288", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 2, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [ + { + "url": "http://t.co/9oH5cgpy1q", + "expanded_url": "http://www.pref.niigata.lg.jp/kouhou/info.html", + "display_url": "pref.niigata.lg.jp/kouhou/info.ht…", + "indices": [ + 111, + 133 + ] + } + ], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "possibly_sensitive": false, + "lang": "ja" + }, + "retweet_count": 2, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [ + { + "url": "http://t.co/9oH5cgpy1q", + "expanded_url": "http://www.pref.niigata.lg.jp/kouhou/info.html", + "display_url": "pref.niigata.lg.jp/kouhou/info.ht…", + "indices": [ + 139, + 140 + ] + } + ], + "user_mentions": [ + { + "screen_name": "assam_house", + "name": "アッサム山中(殺処分ゼロに一票)", + "id": 1104771276, + "id_str": "1104771276", + "indices": [ + 3, + 15 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "possibly_sensitive": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:09 +0000 2014", + "id": 505874898468630500, + "id_str": "505874898468630528", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "おしゃれ★ペアルック", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2708607692, + "id_str": "2708607692", + "name": "おしゃれ★ペアルック", + "screen_name": "osyare_pea", + "location": "", + "description": "ラブラブ度がアップする、素敵なペアルックを見つけて紹介します♪ 気に入ったら RT & 相互フォローで みなさん、お願いします♪", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 129, + "friends_count": 1934, + "listed_count": 0, + "created_at": "Tue Aug 05 07:09:31 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 641, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/496554257676382208/Zgg0bmNu_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/496554257676382208/Zgg0bmNu_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2708607692/1407222776", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:08 +0000 2014", + "id": 505874897633951740, + "id_str": "505874897633951745", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "LOVE ♥ ラブライブ", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745389137, + "id_str": "2745389137", + "name": "LOVE ♥ ラブライブ", + "screen_name": "love_live55", + "location": "", + "description": "とにかく「ラブライブが好きで~す♥」 \r\nラブライブファンには、たまらない内容ばかり集めています♪ \r\n気に入ったら RT & 相互フォローお願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 251, + "friends_count": 969, + "listed_count": 0, + "created_at": "Tue Aug 19 15:45:40 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 348, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501757482448850944/x2uPpqRx_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501757482448850944/x2uPpqRx_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745389137/1408463342", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:08 +0000 2014", + "id": 505874896795086850, + "id_str": "505874896795086848", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "恋する♡ドレスシリーズ", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2726346560, + "id_str": "2726346560", + "name": "恋する♡ドレスシリーズ", + "screen_name": "koisurudoress", + "location": "", + "description": "どれもこれも、見ているだけで欲しくなっちゃう♪ \r\n特別な日に着る素敵なドレスを見つけたいです。 \r\n着てみたいと思ったら RT & フォローお願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 314, + "friends_count": 1900, + "listed_count": 0, + "created_at": "Tue Aug 12 14:10:35 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 471, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/499199619465621504/fg7sVusT_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/499199619465621504/fg7sVusT_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2726346560/1407853688", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:08 +0000 2014", + "id": 505874895964626940, + "id_str": "505874895964626944", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "胸キュン♥動物図鑑", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2759192574, + "id_str": "2759192574", + "name": "胸キュン♥動物図鑑", + "screen_name": "doubutuzukan", + "location": "", + "description": "ふとした表情に思わずキュンとしてしまう♪ \r\nそんな愛しの動物たちの写真を見つけます。 \r\n気に入ったら RT & フォローを、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 80, + "friends_count": 959, + "listed_count": 1, + "created_at": "Sat Aug 23 15:47:36 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 219, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/503211559552688128/Ej_bixna_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/503211559552688128/Ej_bixna_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2759192574/1408809101", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:08 +0000 2014", + "id": 505874895079608300, + "id_str": "505874895079608320", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "ディズニー★パラダイス", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2719228561, + "id_str": "2719228561", + "name": "ディズニー★パラダイス", + "screen_name": "disney_para", + "location": "", + "description": "ディズニーのかわいい画像、ニュース情報、あるあるなどをお届けします♪\r\nディズニーファンは RT & フォローもお願いします♪", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 331, + "friends_count": 1867, + "listed_count": 0, + "created_at": "Sat Aug 09 12:01:32 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 540, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/498076922488696832/Ti2AEuOT_normal.png", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/498076922488696832/Ti2AEuOT_normal.png", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2719228561/1407585841", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:08 +0000 2014", + "id": 505874894135898100, + "id_str": "505874894135898112", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "生々しい風刺画", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2714772727, + "id_str": "2714772727", + "name": "生々しい風刺画", + "screen_name": "nama_fuushi", + "location": "", + "description": "深い意味が込められた「生々しい風刺画」を見つけます。\r\n考えさせられたら RT & 相互フォローでみなさん、お願いします", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 298, + "friends_count": 1902, + "listed_count": 1, + "created_at": "Thu Aug 07 15:04:45 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 595, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/497398363352875011/tS-5FPJB_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/497398363352875011/tS-5FPJB_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2714772727/1407424091", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:07 +0000 2014", + "id": 505874893347377150, + "id_str": "505874893347377152", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "嵐★大好きっ娘", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2721682579, + "id_str": "2721682579", + "name": "嵐★大好きっ娘", + "screen_name": "arashi_suki1", + "location": "", + "description": "なんだかんだ言って、やっぱり嵐が好きなんです♪\r\nいろいろ集めたいので、嵐好きな人に見てほしいです。\r\n気に入ったら RT & 相互フォローお願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 794, + "friends_count": 1913, + "listed_count": 2, + "created_at": "Sun Aug 10 13:43:56 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 504, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/498465364733198336/RO6wupdc_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/498465364733198336/RO6wupdc_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2721682579/1407678436", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:07 +0000 2014", + "id": 505874893154426900, + "id_str": "505874893154426881", + "text": "RT @Takashi_Shiina: テレビで「成人男性のカロリー摂取量は1900kcal」とか言ってて、それはいままさに私がダイエットのために必死でキープしようとしている量で、「それが普通なら人はいつ天一やココイチに行って大盛りを食えばいいんだ!」と思った。", + "source": "twicca", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 353516742, + "id_str": "353516742", + "name": "おしんこー@土曜西え41a", + "screen_name": "oshin_koko", + "location": "こたつ", + "description": "ROMって楽しんでいる部分もあり無言フォロー多めですすみません…。ツイート数多め・あらぶり多めなのでフォロー非推奨です。最近は早兵・兵部受け中心ですがBLNLなんでも好きです。地雷少ないため雑多に呟きます。腐・R18・ネタバレ有るのでご注意。他好きなジャンルはプロフ参照願います。 主催→@chounou_antholo", + "url": "http://t.co/mM1dG54NiO", + "entities": { + "url": { + "urls": [ + { + "url": "http://t.co/mM1dG54NiO", + "expanded_url": "http://twpf.jp/oshin_koko", + "display_url": "twpf.jp/oshin_koko", + "indices": [ + 0, + 22 + ] + } + ] + }, + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 479, + "friends_count": 510, + "listed_count": 43, + "created_at": "Fri Aug 12 05:53:13 +0000 2011", + "favourites_count": 3059, + "utc_offset": 32400, + "time_zone": "Tokyo", + "geo_enabled": false, + "verified": false, + "statuses_count": 104086, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "000000", + "profile_background_image_url": "http://pbs.twimg.com/profile_background_images/799871497/01583a031f83a45eba881c8acde729ee.jpeg", + "profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/799871497/01583a031f83a45eba881c8acde729ee.jpeg", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/484347196523835393/iHaYxm-2_normal.png", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/484347196523835393/iHaYxm-2_normal.png", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/353516742/1369039651", + "profile_link_color": "FF96B0", + "profile_sidebar_border_color": "FFFFFF", + "profile_sidebar_fill_color": "95E8EC", + "profile_text_color": "3C3940", + "profile_use_background_image": false, + "default_profile": false, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sat Aug 30 09:58:30 +0000 2014", + "id": 505655792733650940, + "id_str": "505655792733650944", + "text": "テレビで「成人男性のカロリー摂取量は1900kcal」とか言ってて、それはいままさに私がダイエットのために必死でキープしようとしている量で、「それが普通なら人はいつ天一やココイチに行って大盛りを食えばいいんだ!」と思った。", + "source": "Janetter", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 126573583, + "id_str": "126573583", + "name": "椎名高志", + "screen_name": "Takashi_Shiina", + "location": "BABEL(超能力支援研究局)", + "description": "漫画家。週刊少年サンデーで『絶対可憐チルドレン』連載中。TVアニメ『THE UNLIMITED 兵部京介』公式サイト>http://t.co/jVqBoBEc", + "url": "http://t.co/K3Oi83wM3w", + "entities": { + "url": { + "urls": [ + { + "url": "http://t.co/K3Oi83wM3w", + "expanded_url": "http://cnanews.asablo.jp/blog/", + "display_url": "cnanews.asablo.jp/blog/", + "indices": [ + 0, + 22 + ] + } + ] + }, + "description": { + "urls": [ + { + "url": "http://t.co/jVqBoBEc", + "expanded_url": "http://unlimited-zc.jp/index.html", + "display_url": "unlimited-zc.jp/index.html", + "indices": [ + 59, + 79 + ] + } + ] + } + }, + "protected": false, + "followers_count": 110756, + "friends_count": 61, + "listed_count": 8159, + "created_at": "Fri Mar 26 08:54:51 +0000 2010", + "favourites_count": 25, + "utc_offset": 32400, + "time_zone": "Tokyo", + "geo_enabled": false, + "verified": false, + "statuses_count": 27364, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "EDECE9", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme3/bg.gif", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme3/bg.gif", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/504597210772688896/Uvt4jgf5_normal.png", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/504597210772688896/Uvt4jgf5_normal.png", + "profile_link_color": "088253", + "profile_sidebar_border_color": "D3D2CF", + "profile_sidebar_fill_color": "E3E2DE", + "profile_text_color": "634047", + "profile_use_background_image": false, + "default_profile": false, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 221, + "favorite_count": 109, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 221, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "Takashi_Shiina", + "name": "椎名高志", + "id": 126573583, + "id_str": "126573583", + "indices": [ + 3, + 18 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:07 +0000 2014", + "id": 505874892567244800, + "id_str": "505874892567244801", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "下ネタ&笑変態雑学", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2762581922, + "id_str": "2762581922", + "name": "下ネタ&笑変態雑学", + "screen_name": "shimo_hentai", + "location": "", + "description": "普通の人には思いつかない、ちょっと変態チックな 笑える下ネタ雑学をお届けします。 \r\nおもしろかったら RT & フォローお願いします♪", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 37, + "friends_count": 990, + "listed_count": 0, + "created_at": "Sun Aug 24 14:13:20 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 212, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/503545991950114816/K9yQbh1Q_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/503545991950114816/K9yQbh1Q_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2762581922/1408889893", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:07 +0000 2014", + "id": 505874891778703360, + "id_str": "505874891778703360", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "超簡単★初心者英語", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2744544025, + "id_str": "2744544025", + "name": "超簡単★初心者英語", + "screen_name": "kantaneigo1", + "location": "", + "description": "すぐに使えるフレーズや簡単な会話を紹介します。 \r\n少しづつ練習して、どんどん使ってみよう☆ \r\n使ってみたいと思ったら RT & フォローお願いします♪", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 147, + "friends_count": 970, + "listed_count": 1, + "created_at": "Tue Aug 19 10:11:48 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 345, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501676136321929216/4MLpyHe3_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501676136321929216/4MLpyHe3_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2744544025/1408443928", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:07 +0000 2014", + "id": 505874891032121340, + "id_str": "505874891032121344", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "現代のハンドサイン", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2762816814, + "id_str": "2762816814", + "name": "現代のハンドサイン", + "screen_name": "ima_handsign", + "location": "", + "description": "イザという時や、困った時に、必ず役に立つハンドサインのオンパレードです♪ \r\n使ってみたくなったら RT & フォローお願いします♪", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 95, + "friends_count": 996, + "listed_count": 0, + "created_at": "Sun Aug 24 15:33:58 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 210, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/503566188253687809/7wtdp1AC_normal.png", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/503566188253687809/7wtdp1AC_normal.png", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2762816814/1408894540", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:07 +0000 2014", + "id": 505874890247782400, + "id_str": "505874890247782401", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "今日からアナタもイイ女♪", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2714167411, + "id_str": "2714167411", + "name": "今日からアナタもイイ女♪", + "screen_name": "anata_iionna", + "location": "", + "description": "みんなが知りたい イイ女の秘密を見つけます♪ いいな~と思ってくれた人は RT & 相互フォローで みなさん、お願いします♪", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 390, + "friends_count": 1425, + "listed_count": 0, + "created_at": "Thu Aug 07 09:27:59 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 609, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/497314455655436288/dz7P3-fy_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/497314455655436288/dz7P3-fy_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2714167411/1407404214", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:07 +0000 2014", + "id": 505874890218434560, + "id_str": "505874890218434560", + "text": "@kohecyan3 \n名前:上野滉平\n呼び方:うえの\n呼ばれ方:ずるかわ\n第一印象:過剰な俺イケメンですアピール\n今の印象:バーバリーの時計\n好きなところ:あの自信さ、笑いが絶えない\n一言:大学受かったの?応援してる〜(*^^*)!\n\n#RTした人にやる\nちょっとやってみる笑", + "source": "Twitter for iPhone", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": 2591363659, + "in_reply_to_user_id_str": "2591363659", + "in_reply_to_screen_name": "kohecyan3", + "user": { + "id": 2613282517, + "id_str": "2613282517", + "name": "K", + "screen_name": "kawazurukenna", + "location": "", + "description": "# I surprise even my self", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 113, + "friends_count": 185, + "listed_count": 0, + "created_at": "Wed Jul 09 09:39:13 +0000 2014", + "favourites_count": 157, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 242, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/502436858135973888/PcUU0lov_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/502436858135973888/PcUU0lov_normal.jpeg", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 0, + "favorite_count": 0, + "entities": { + "hashtags": [ + { + "text": "RTした人にやる", + "indices": [ + 119, + 128 + ] + } + ], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "kohecyan3", + "name": "上野滉平", + "id": 2591363659, + "id_str": "2591363659", + "indices": [ + 0, + 10 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:07 +0000 2014", + "id": 505874889392156700, + "id_str": "505874889392156672", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "IQ★力だめし", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2709308887, + "id_str": "2709308887", + "name": "IQ★力だめし", + "screen_name": "iq_tameshi", + "location": "", + "description": "解けると楽しい気分になれる問題を見つけて紹介します♪面白かったら RT & 相互フォローで みなさん、お願いします♪", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 443, + "friends_count": 1851, + "listed_count": 1, + "created_at": "Tue Aug 05 13:14:30 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 664, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/496646485266558977/W_W--qV__normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/496646485266558977/W_W--qV__normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2709308887/1407244754", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:06 +0000 2014", + "id": 505874888817532900, + "id_str": "505874888817532928", + "text": "第一三軍から2個師団が北へ移動中らしい     この調子では満州に陸軍兵力があふれかえる", + "source": "如月克己", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 1171299612, + "id_str": "1171299612", + "name": "如月 克己", + "screen_name": "kisaragi_katumi", + "location": "満州", + "description": "GパングのA型K月克己中尉の非公式botです。 主に七巻と八巻が中心の台詞をつぶやきます。 4/18.台詞追加しました/現在試運転中/現在軽い挨拶だけTL反応。/追加したい台詞や何おかしい所がありましたらDMやリプライで/フォロー返しは手動です/", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 65, + "friends_count": 63, + "listed_count": 0, + "created_at": "Tue Feb 12 08:21:38 +0000 2013", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 27219, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/3242847112/0ce536444c94cbec607229022d43a27a_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/3242847112/0ce536444c94cbec607229022d43a27a_normal.jpeg", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 0, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:06 +0000 2014", + "id": 505874888616181760, + "id_str": "505874888616181760", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "徳田有希★応援隊", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2766021865, + "id_str": "2766021865", + "name": "徳田有希★応援隊", + "screen_name": "tokuda_ouen1", + "location": "", + "description": "女子中高生に大人気ww いやされるイラストを紹介します。 \r\nみんなで RTして応援しよう~♪ \r\n「非公式アカウントです」", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 123, + "friends_count": 978, + "listed_count": 0, + "created_at": "Mon Aug 25 10:48:41 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 210, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/503857235802333184/YS0sDN6q_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/503857235802333184/YS0sDN6q_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2766021865/1408963998", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:06 +0000 2014", + "id": 505874887802511360, + "id_str": "505874887802511361", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "腐女子の☆部屋", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2744683982, + "id_str": "2744683982", + "name": "腐女子の☆部屋", + "screen_name": "fujyoshinoheya", + "location": "", + "description": "腐女子にしかわからないネタや、あるあるを見つけていきます。 \r\n他には、BL~萌えキュン系まで、腐のための画像を集めています♪ \r\n同じ境遇の人には、わかってもらえると思うので、気軽に RT & フォローお願いします☆", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 241, + "friends_count": 990, + "listed_count": 0, + "created_at": "Tue Aug 19 11:47:21 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 345, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501697365590306817/GLP_QH_b_normal.png", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501697365590306817/GLP_QH_b_normal.png", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2744683982/1408448984", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:06 +0000 2014", + "id": 505874887009767400, + "id_str": "505874887009767424", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "萌え芸術★ラテアート", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2763178045, + "id_str": "2763178045", + "name": "萌え芸術★ラテアート", + "screen_name": "moe_rate", + "location": "", + "description": "ここまで来ると、もはや芸術!! 見てるだけで楽しい♪ \r\nそんなラテアートを、とことん探します。 \r\nスゴイと思ったら RT & フォローお願いします♪", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 187, + "friends_count": 998, + "listed_count": 0, + "created_at": "Sun Aug 24 16:53:16 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 210, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/503586151764992000/RC80it20_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/503586151764992000/RC80it20_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2763178045/1408899447", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:06 +0000 2014", + "id": 505874886225448960, + "id_str": "505874886225448960", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "全部★ジャニーズ図鑑", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2724158970, + "id_str": "2724158970", + "name": "全部★ジャニーズ図鑑", + "screen_name": "zenbu_johnnys", + "location": "", + "description": "ジャニーズのカッコイイ画像、おもしろエピソードなどを発信します。\r\n「非公式アカウントです」\r\nジャニーズ好きな人は、是非 RT & フォローお願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 738, + "friends_count": 1838, + "listed_count": 0, + "created_at": "Mon Aug 11 15:50:08 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 556, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/498859581057945600/ncMKwdvC_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/498859581057945600/ncMKwdvC_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2724158970/1407772462", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:06 +0000 2014", + "id": 505874885810200600, + "id_str": "505874885810200576", + "text": "RT @naopisu_: 呼び方:\n呼ばれ方:\n第一印象:\n今の印象:\n好きなところ:\n家族にするなら:\n最後に一言:\n#RTした人にやる\n\nお腹痛くて寝れないからやるww\nだれでもどうぞ〜😏🙌", + "source": "Twitter for Android", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2347898072, + "id_str": "2347898072", + "name": "にたにた", + "screen_name": "syo6660129", + "location": "", + "description": "", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 64, + "friends_count": 70, + "listed_count": 1, + "created_at": "Mon Feb 17 04:29:46 +0000 2014", + "favourites_count": 58, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 145, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/485603672118669314/73uh_xRS_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/485603672118669314/73uh_xRS_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2347898072/1396957619", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sat Aug 30 14:19:31 +0000 2014", + "id": 505721480261300200, + "id_str": "505721480261300224", + "text": "呼び方:\n呼ばれ方:\n第一印象:\n今の印象:\n好きなところ:\n家族にするなら:\n最後に一言:\n#RTした人にやる\n\nお腹痛くて寝れないからやるww\nだれでもどうぞ〜😏🙌", + "source": "Twitter for iPhone", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 856045488, + "id_str": "856045488", + "name": "なおぴす", + "screen_name": "naopisu_", + "location": "Fujino 65th ⇢ Sagaso 12A(LJK", + "description": "\ もうすぐ18歳 “Only One”になる /", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 267, + "friends_count": 259, + "listed_count": 2, + "created_at": "Mon Oct 01 08:36:23 +0000 2012", + "favourites_count": 218, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 1790, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/496321592553525249/tuzX9ByR_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/496321592553525249/tuzX9ByR_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/856045488/1407118111", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 23, + "favorite_count": 1, + "entities": { + "hashtags": [ + { + "text": "RTした人にやる", + "indices": [ + 47, + 56 + ] + } + ], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 23, + "favorite_count": 0, + "entities": { + "hashtags": [ + { + "text": "RTした人にやる", + "indices": [ + 61, + 70 + ] + } + ], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "naopisu_", + "name": "なおぴす", + "id": 856045488, + "id_str": "856045488", + "indices": [ + 3, + 12 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:06 +0000 2014", + "id": 505874885474656260, + "id_str": "505874885474656256", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "爆笑★LINE あるある", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2709561589, + "id_str": "2709561589", + "name": "爆笑★LINE あるある", + "screen_name": "line_aru1", + "location": "", + "description": "思わず笑ってしまうLINEでのやりとりや、あるあるを見つけたいです♪面白かったら RT & 相互フォローで みなさん、お願いします♪", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 496, + "friends_count": 1875, + "listed_count": 1, + "created_at": "Tue Aug 05 15:01:30 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 687, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/496673793939492867/p1BN4YaW_normal.png", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/496673793939492867/p1BN4YaW_normal.png", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2709561589/1407251270", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:05 +0000 2014", + "id": 505874884627410940, + "id_str": "505874884627410944", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "全力★ミサワ的w発言", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2734455415, + "id_str": "2734455415", + "name": "全力★ミサワ的w発言!!", + "screen_name": "misawahatugen", + "location": "", + "description": "ウザすぎて笑えるミサワ的名言や、おもしろミサワ画像を集めています。 \r\nミサワを知らない人でも、いきなりツボにハマっちゃう内容をお届けします。 \r\nウザいwと思ったら RT & 相互フォローお願いします♪", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 144, + "friends_count": 1915, + "listed_count": 1, + "created_at": "Fri Aug 15 13:20:04 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 436, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/500271070834749444/HvengMe5_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/500271070834749444/HvengMe5_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2734455415/1408108944", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:05 +0000 2014", + "id": 505874883809521660, + "id_str": "505874883809521664", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "お宝ww有名人卒アル特集", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2708183557, + "id_str": "2708183557", + "name": "お宝ww有名人卒アル特集", + "screen_name": "otakara_sotuaru", + "location": "", + "description": "みんな昔は若かったんですね。今からは想像もつかない、あの有名人を見つけます。\r\n面白かったら RT & 相互フォローで みなさん、お願いします♪", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 286, + "friends_count": 1938, + "listed_count": 0, + "created_at": "Tue Aug 05 03:26:54 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 650, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/496499121276985344/hC8RoebP_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/496499121276985344/hC8RoebP_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2708183557/1407318758", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:05 +0000 2014", + "id": 505874883322970100, + "id_str": "505874883322970112", + "text": "レッドクリフのキャラのこと女装ってくそわろたwww朝一で面白かった( ˘ω゜)笑", + "source": "Twitter for iPhone", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 1620730616, + "id_str": "1620730616", + "name": "ひーちゃん@橘芋健ぴ", + "screen_name": "2nd_8hkr", + "location": "北の大地.95年組 ☞ 9/28.10/2(5).12/28", + "description": "THE SECOND/劇団EXILE/EXILE/二代目JSB ☞KENCHI.AKIRA.青柳翔.小森隼.石井杏奈☜ Big Love ♡ Respect ..... ✍ MATSU Origin✧ .た ち ば な '' い も '' け ん い ち ろ う さ んTEAM NACS 安田.戸次 Liebe !", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 109, + "friends_count": 148, + "listed_count": 0, + "created_at": "Thu Jul 25 16:09:29 +0000 2013", + "favourites_count": 783, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 9541, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/458760951060123648/Cocoxi-2_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/458760951060123648/Cocoxi-2_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/1620730616/1408681982", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 0, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:05 +0000 2014", + "id": 505874883067129860, + "id_str": "505874883067129857", + "text": "【状態良好】ペンタックス・デジタル一眼レフカメラ・K20D 入札数=38 現在価格=15000円 http://t.co/4WK1f6V2n6終了=2014年08月31日 20:47:53 #一眼レフ http://t.co/PcSaXzfHMW", + "source": "YahooAuction Degicame", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2278053589, + "id_str": "2278053589", + "name": "AuctionCamera", + "screen_name": "AuctionCamera", + "location": "", + "description": "Yahooオークションのデジカメカテゴリから商品を抽出するボットです。", + "url": "https://t.co/3sB1NDnd0m", + "entities": { + "url": { + "urls": [ + { + "url": "https://t.co/3sB1NDnd0m", + "expanded_url": "https://github.com/AKB428/YahooAuctionBot", + "display_url": "github.com/AKB428/YahooAu…", + "indices": [ + 0, + 23 + ] + } + ] + }, + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 5, + "friends_count": 24, + "listed_count": 0, + "created_at": "Sun Jan 05 20:10:56 +0000 2014", + "favourites_count": 1, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 199546, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/419927606146789376/vko-kd6Q_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/419927606146789376/vko-kd6Q_normal.jpeg", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 0, + "favorite_count": 0, + "entities": { + "hashtags": [ + { + "text": "一眼レフ", + "indices": [ + 95, + 100 + ] + } + ], + "symbols": [], + "urls": [ + { + "url": "http://t.co/4WK1f6V2n6", + "expanded_url": "http://atq.ck.valuecommerce.com/servlet/atq/referral?sid=2219441&pid=877510753&vcptn=auct/p/RJH492.PLqoLQQx1Jy8U9LE-&vc_url=http://page8.auctions.yahoo.co.jp/jp/auction/h192024356", + "display_url": "atq.ck.valuecommerce.com/servlet/atq/re…", + "indices": [ + 49, + 71 + ] + } + ], + "user_mentions": [], + "media": [ + { + "id": 505874882828046340, + "id_str": "505874882828046336", + "indices": [ + 101, + 123 + ], + "media_url": "http://pbs.twimg.com/media/BwU6hpPCEAAxnpq.jpg", + "media_url_https": "https://pbs.twimg.com/media/BwU6hpPCEAAxnpq.jpg", + "url": "http://t.co/PcSaXzfHMW", + "display_url": "pic.twitter.com/PcSaXzfHMW", + "expanded_url": "http://twitter.com/AuctionCamera/status/505874883067129857/photo/1", + "type": "photo", + "sizes": { + "large": { + "w": 600, + "h": 450, + "resize": "fit" + }, + "medium": { + "w": 600, + "h": 450, + "resize": "fit" + }, + "thumb": { + "w": 150, + "h": 150, + "resize": "crop" + }, + "small": { + "w": 340, + "h": 255, + "resize": "fit" + } + } + } + ] + }, + "favorited": false, + "retweeted": false, + "possibly_sensitive": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:05 +0000 2014", + "id": 505874882995826700, + "id_str": "505874882995826689", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "ヤバすぎる!!ギネス世界記録", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2762405780, + "id_str": "2762405780", + "name": "ヤバすぎる!!ギネス世界記録", + "screen_name": "yabai_giness", + "location": "", + "description": "世の中には、まだまだ知られていないスゴイ記録があるんです! \r\nそんなギネス世界記録を見つけます☆ \r\nどんどん友達にも教えてあげてくださいねww \r\nヤバイと思ったら RT & フォローを、お願いします♪", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 36, + "friends_count": 985, + "listed_count": 0, + "created_at": "Sun Aug 24 13:17:03 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 210, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/503531782919045121/NiIC25wL_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/503531782919045121/NiIC25wL_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2762405780/1408886328", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:05 +0000 2014", + "id": 505874882870009860, + "id_str": "505874882870009856", + "text": "すごく面白い夢見た。魔法科高校通ってて(別に一科二科の区別ない)クラスメイトにヨセアツメ面子や赤僕の拓也がいて、学校対抗合唱コンクールが開催されたり会場入りの際他校の妨害工作受けたり、拓也が連れてきてた実が人質に取られたりとにかくてんこ盛りだった楽しかった赤僕読みたい手元にない", + "source": "Twitter for Android", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 597357105, + "id_str": "597357105", + "name": "ふじよし", + "screen_name": "fuji_mark", + "location": "多摩動物公園", + "description": "成人腐女子", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 128, + "friends_count": 126, + "listed_count": 6, + "created_at": "Sat Jun 02 10:06:05 +0000 2012", + "favourites_count": 2842, + "utc_offset": 32400, + "time_zone": "Irkutsk", + "geo_enabled": false, + "verified": false, + "statuses_count": 10517, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "0099B9", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme4/bg.gif", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme4/bg.gif", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/503553738569560065/D_JW2dCJ_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/503553738569560065/D_JW2dCJ_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/597357105/1408864355", + "profile_link_color": "0099B9", + "profile_sidebar_border_color": "5ED4DC", + "profile_sidebar_fill_color": "95E8EC", + "profile_text_color": "3C3940", + "profile_use_background_image": true, + "default_profile": false, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 0, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:05 +0000 2014", + "id": 505874882228281340, + "id_str": "505874882228281345", + "text": "RT @oen_yakyu: ●継続試合(中京対崇徳)46回~ 9時~\n 〈ラジオ中継〉\n らじる★らじる→大阪放送局を選択→NHK-FM\n●決勝戦(三浦対中京or崇徳) 12時30分~\n 〈ラジオ中継〉\n らじる★らじる→大阪放送局を選択→NHK第一\n ※神奈川の方は普通のラ…", + "source": "twicca", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 18477566, + "id_str": "18477566", + "name": "Natit(なち)@そうだ、トップ行こう", + "screen_name": "natit_yso", + "location": "福岡市の端っこ", + "description": "ヤー・チャイカ。紫宝勢の末席くらいでQMAやってます。\r\n9/13(土)「九州杯」今年も宜しくお願いします!キーワードは「そうだ、トップ、行こう。」\r\nmore → http://t.co/ezuHyjF4Qy \r\n【旅の予定】9/20-22 関西 → 9/23-28 北海道ぐるり", + "url": "http://t.co/ll2yu78DGR", + "entities": { + "url": { + "urls": [ + { + "url": "http://t.co/ll2yu78DGR", + "expanded_url": "http://qma-kyushu.sakura.ne.jp/", + "display_url": "qma-kyushu.sakura.ne.jp", + "indices": [ + 0, + 22 + ] + } + ] + }, + "description": { + "urls": [ + { + "url": "http://t.co/ezuHyjF4Qy", + "expanded_url": "http://twpf.jp/natit_yso", + "display_url": "twpf.jp/natit_yso", + "indices": [ + 83, + 105 + ] + } + ] + } + }, + "protected": false, + "followers_count": 591, + "friends_count": 548, + "listed_count": 93, + "created_at": "Tue Dec 30 14:11:44 +0000 2008", + "favourites_count": 11676, + "utc_offset": 32400, + "time_zone": "Tokyo", + "geo_enabled": false, + "verified": false, + "statuses_count": 130145, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "131516", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme14/bg.gif", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme14/bg.gif", + "profile_background_tile": true, + "profile_image_url": "http://pbs.twimg.com/profile_images/1556202861/chibi-Leon_normal.jpg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/1556202861/chibi-Leon_normal.jpg", + "profile_link_color": "009999", + "profile_sidebar_border_color": "EEEEEE", + "profile_sidebar_fill_color": "EFEFEF", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": false, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sat Aug 30 23:12:39 +0000 2014", + "id": 505855649196953600, + "id_str": "505855649196953600", + "text": "●継続試合(中京対崇徳)46回~ 9時~\n 〈ラジオ中継〉\n らじる★らじる→大阪放送局を選択→NHK-FM\n●決勝戦(三浦対中京or崇徳) 12時30分~\n 〈ラジオ中継〉\n らじる★らじる→大阪放送局を選択→NHK第一\n ※神奈川の方は普通のラジオのNHK-FMでも", + "source": "Twitter Web Client", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2761692762, + "id_str": "2761692762", + "name": "三浦学苑軟式野球部応援団!", + "screen_name": "oen_yakyu", + "location": "", + "description": "兵庫県で開催される「もう一つの甲子園」こと全国高校軟式野球選手権大会に南関東ブロックから出場する三浦学苑軟式野球部を応援する非公式アカウントです。", + "url": "http://t.co/Cn1tPTsBGY", + "entities": { + "url": { + "urls": [ + { + "url": "http://t.co/Cn1tPTsBGY", + "expanded_url": "http://www.miura.ed.jp/index.html", + "display_url": "miura.ed.jp/index.html", + "indices": [ + 0, + 22 + ] + } + ] + }, + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 464, + "friends_count": 117, + "listed_count": 4, + "created_at": "Sun Aug 24 07:47:29 +0000 2014", + "favourites_count": 69, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 553, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/504299474445811712/zsxJUmL0_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/504299474445811712/zsxJUmL0_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2761692762/1409069337", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 7, + "favorite_count": 2, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 7, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "oen_yakyu", + "name": "三浦学苑軟式野球部応援団!", + "id": 2761692762, + "id_str": "2761692762", + "indices": [ + 3, + 13 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:05 +0000 2014", + "id": 505874882110824450, + "id_str": "505874882110824448", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "スマホに密封★アニメ画像", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2725976444, + "id_str": "2725976444", + "name": "スマホに密封★アニメ画像", + "screen_name": "sumahoanime", + "location": "", + "description": "なんともめずらしい、いろんなキャラがスマホに閉じ込められています。 \r\nあなたのスマホにマッチする画像が見つかるかも♪ \r\n気に入ったら是非 RT & フォローお願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 227, + "friends_count": 1918, + "listed_count": 0, + "created_at": "Tue Aug 12 11:27:54 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 527, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/499155646164393984/l5vSz5zu_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/499155646164393984/l5vSz5zu_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2725976444/1407843121", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:05 +0000 2014", + "id": 505874881297133600, + "id_str": "505874881297133568", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "アナタのそばの身近な危険", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2713926078, + "id_str": "2713926078", + "name": "アナタのそばの身近な危険", + "screen_name": "mijika_kiken", + "location": "", + "description": "知らないうちにやっている危険な行動を見つけて自分を守りましょう。 役に立つと思ったら RT & 相互フォローで みなさん、お願いします♪", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 301, + "friends_count": 1871, + "listed_count": 0, + "created_at": "Thu Aug 07 07:12:50 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 644, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/497279579245907968/Ftvms_HR_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/497279579245907968/Ftvms_HR_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2713926078/1407395683", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:04 +0000 2014", + "id": 505874880294682600, + "id_str": "505874880294682624", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "人気者♥デイジー大好き", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2726199583, + "id_str": "2726199583", + "name": "人気者♥デイジー大好き", + "screen_name": "ninkimono_daosy", + "location": "", + "description": "デイジーの想いを、代わりにつぶやきます♪ \r\nデイジーのかわいい画像やグッズも大好きw \r\n可愛いと思ったら RT & フォローお願いします。 \r\n「非公式アカウントです」", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 190, + "friends_count": 474, + "listed_count": 0, + "created_at": "Tue Aug 12 12:58:33 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 469, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/499178622494576640/EzWKdR_p_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/499178622494576640/EzWKdR_p_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2726199583/1407848478", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:04 +0000 2014", + "id": 505874879392919550, + "id_str": "505874879392919552", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "幸せ話でフル充電しよう", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2721453846, + "id_str": "2721453846", + "name": "幸せ話でフル充電しようww", + "screen_name": "shiawasehanashi", + "location": "", + "description": "私が聞いて心に残った感動エピソードをお届けします。\r\n少しでも多くの人へ届けたいと思います。\r\nいいなと思ったら RT & フォローお願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 302, + "friends_count": 1886, + "listed_count": 0, + "created_at": "Sun Aug 10 12:16:25 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 508, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/498444554916216832/ml8EiQka_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/498444554916216832/ml8EiQka_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2721453846/1407673555", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:04 +0000 2014", + "id": 505874879103520800, + "id_str": "505874879103520768", + "text": "RT @Ang_Angel73: 逢坂「くっ…僕の秘められし右目が…!」\n一同「……………。」", + "source": "Twitter for iPhone", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2571968509, + "id_str": "2571968509", + "name": "イイヒト", + "screen_name": "IwiAlohomora", + "location": "草葉の陰", + "description": "大人です。気軽に絡んでくれるとうれしいです! イラスト大好き!(≧∇≦) BF(仮)逢坂紘夢くんにお熱です! マンガも好き♡欲望のままにつぶやきますのでご注意を。雑食♡", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 156, + "friends_count": 165, + "listed_count": 14, + "created_at": "Tue Jun 17 01:18:34 +0000 2014", + "favourites_count": 11926, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 7234, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/504990074862178304/DoBvOb9c_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/504990074862178304/DoBvOb9c_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2571968509/1409106012", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:27:01 +0000 2014", + "id": 505874364596621300, + "id_str": "505874364596621313", + "text": "逢坂「くっ…僕の秘められし右目が…!」\n一同「……………。」", + "source": "Twitter for Android", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 1600750194, + "id_str": "1600750194", + "name": "臙脂", + "screen_name": "Ang_Angel73", + "location": "逢坂紘夢のそばに", + "description": "自由、気ままに。詳しくはツイプロ。アイコンはまめせろりちゃんからだよ☆~(ゝ。∂)", + "url": "http://t.co/kKCCwHTaph", + "entities": { + "url": { + "urls": [ + { + "url": "http://t.co/kKCCwHTaph", + "expanded_url": "http://twpf.jp/Ang_Angel73", + "display_url": "twpf.jp/Ang_Angel73", + "indices": [ + 0, + 22 + ] + } + ] + }, + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 155, + "friends_count": 154, + "listed_count": 10, + "created_at": "Wed Jul 17 11:44:31 +0000 2013", + "favourites_count": 2115, + "utc_offset": 32400, + "time_zone": "Irkutsk", + "geo_enabled": false, + "verified": false, + "statuses_count": 12342, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://pbs.twimg.com/profile_background_images/378800000027871001/aa764602922050b22bf9ade3741367dc.jpeg", + "profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/378800000027871001/aa764602922050b22bf9ade3741367dc.jpeg", + "profile_background_tile": true, + "profile_image_url": "http://pbs.twimg.com/profile_images/500293786287603713/Ywyh69eG_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/500293786287603713/Ywyh69eG_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/1600750194/1403879183", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "FFFFFF", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": false, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 2, + "favorite_count": 2, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 2, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "Ang_Angel73", + "name": "臙脂", + "id": 1600750194, + "id_str": "1600750194", + "indices": [ + 3, + 15 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:04 +0000 2014", + "id": 505874877933314050, + "id_str": "505874877933314048", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "秘密の本音♥女子編", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2762237088, + "id_str": "2762237088", + "name": "秘密の本音♥女子編", + "screen_name": "honne_jyoshi1", + "location": "", + "description": "普段は言えない「お・ん・なの建前と本音」をつぶやきます。 気になる あの人の本音も、わかるかも!? \r\nわかるって人は RT & フォローを、お願いします♪", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 123, + "friends_count": 988, + "listed_count": 0, + "created_at": "Sun Aug 24 12:27:07 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 211, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/503519190364332032/BVjS_XBD_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/503519190364332032/BVjS_XBD_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2762237088/1408883328", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:04 +0000 2014", + "id": 505874877148958700, + "id_str": "505874877148958721", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "美し過ぎる★色鉛筆アート", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2740047343, + "id_str": "2740047343", + "name": "美し過ぎる★色鉛筆アート", + "screen_name": "bi_iroenpitu", + "location": "", + "description": "ほんとにコレ色鉛筆なの~? \r\n本物と見間違える程のリアリティを御覧ください。 \r\n気に入ったら RT & 相互フォローお願いします♪", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 321, + "friends_count": 1990, + "listed_count": 0, + "created_at": "Sun Aug 17 16:15:05 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 396, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501039950972739585/isigil4V_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501039950972739585/isigil4V_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2740047343/1408292283", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:03 +0000 2014", + "id": 505874876465295360, + "id_str": "505874876465295361", + "text": "【H15-9-4】道路を利用する利益は反射的利益であり、建築基準法に基づいて道路一の指定がなされている私道の敷地所有者に対し、通行妨害行為の排除を求める人格的権利を認めることはできない。→誤。", + "source": "twittbot.net", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 1886570281, + "id_str": "1886570281", + "name": "行政法過去問", + "screen_name": "gyosei_goukaku", + "location": "", + "description": "行政書士の本試験問題の過去問(行政法分野)をランダムにつぶやきます。問題は随時追加中です。基本的に相互フォローします。※140字制限の都合上、表現は一部変えてあります。解説も文字数が可能であればなるべく…。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 1554, + "friends_count": 1772, + "listed_count": 12, + "created_at": "Fri Sep 20 13:24:29 +0000 2013", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 14565, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/378800000487791870/0e45e3c089c6b641cdd8d1b6f1ceb8a4_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/378800000487791870/0e45e3c089c6b641cdd8d1b6f1ceb8a4_normal.jpeg", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 0, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:03 +0000 2014", + "id": 505874876318511100, + "id_str": "505874876318511104", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "K点越えの発想力!!", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2744863153, + "id_str": "2744863153", + "name": "K点越えの発想力!!", + "screen_name": "kgoehassou", + "location": "", + "description": "いったいどうやったら、その領域にたどりつけるのか!? \r\nそんな思わず笑ってしまう別世界の発想力をお届けします♪ \r\nおもしろかったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 76, + "friends_count": 957, + "listed_count": 0, + "created_at": "Tue Aug 19 13:00:08 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 341, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501715651686178816/Fgpe0B8M_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501715651686178816/Fgpe0B8M_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2744863153/1408453328", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:03 +0000 2014", + "id": 505874875521581060, + "id_str": "505874875521581056", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "血液型の真実2", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2698625690, + "id_str": "2698625690", + "name": "血液型の真実", + "screen_name": "ketueki_sinjitu", + "location": "", + "description": "やっぱりそうだったのか~♪\r\n意外な、あの人の裏側を見つけます。\r\n面白かったらRT & 相互フォローでみなさん、お願いします♪", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 193, + "friends_count": 1785, + "listed_count": 1, + "created_at": "Fri Aug 01 16:11:40 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 769, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/495241446706790400/h_0DSFPG_normal.png", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/495241446706790400/h_0DSFPG_normal.png", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2698625690/1406911319", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:03 +0000 2014", + "id": 505874874712072200, + "id_str": "505874874712072192", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "やっぱり神が??を作る時", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2714868440, + "id_str": "2714868440", + "name": "やっぱり神が??を作る時", + "screen_name": "yahari_kamiga", + "location": "", + "description": "やっぱり今日も、神は何かを作ろうとしています 笑。 どうやって作っているのかわかったら RT & 相互フォローで みなさん、お願いします♪", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 243, + "friends_count": 1907, + "listed_count": 0, + "created_at": "Thu Aug 07 16:12:33 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 590, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/497416102108884992/NRMEbKaT_normal.png", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/497416102108884992/NRMEbKaT_normal.png", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2714868440/1407428237", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:03 +0000 2014", + "id": 505874874275864600, + "id_str": "505874874275864576", + "text": "RT @takuramix: 福島第一原発の構内地図がこちら。\nhttp://t.co/ZkU4TZCGPG\nどう見ても、1号機。\nRT @Lightworker19: 【大拡散】  福島第一原発 4号機 爆発動画 40秒~  http://t.co/lmlgp38fgZ", + "source": "ツイタマ", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 62525372, + "id_str": "62525372", + "name": "NANCY-MOON☆ひよこちゃん☆", + "screen_name": "nancy_moon_703", + "location": "JAPAN", + "description": "【無断転載禁止・コピペ禁止・非公式RT禁止】【必読!】⇒ http://t.co/nuUvfUVD 今現在活動中の東方神起YUNHO&CHANGMINの2人を全力で応援しています!!(^_-)-☆ ※東方神起及びYUNHO&CHANGMINを応援していない方・鍵付ユーザーのフォローお断り!", + "url": null, + "entities": { + "description": { + "urls": [ + { + "url": "http://t.co/nuUvfUVD", + "expanded_url": "http://goo.gl/SrGLb", + "display_url": "goo.gl/SrGLb", + "indices": [ + 29, + 49 + ] + } + ] + } + }, + "protected": false, + "followers_count": 270, + "friends_count": 328, + "listed_count": 4, + "created_at": "Mon Aug 03 14:22:24 +0000 2009", + "favourites_count": 3283, + "utc_offset": 32400, + "time_zone": "Tokyo", + "geo_enabled": false, + "verified": false, + "statuses_count": 180310, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "642D8B", + "profile_background_image_url": "http://pbs.twimg.com/profile_background_images/470849781397336064/ltM6EdFn.jpeg", + "profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/470849781397336064/ltM6EdFn.jpeg", + "profile_background_tile": true, + "profile_image_url": "http://pbs.twimg.com/profile_images/3699005246/9ba2e306518d296b68b7cbfa5e4ce4e6_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/3699005246/9ba2e306518d296b68b7cbfa5e4ce4e6_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/62525372/1401094223", + "profile_link_color": "FF0000", + "profile_sidebar_border_color": "FFFFFF", + "profile_sidebar_fill_color": "F065A8", + "profile_text_color": "080808", + "profile_use_background_image": true, + "default_profile": false, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sat Aug 30 21:21:33 +0000 2014", + "id": 505827689660313600, + "id_str": "505827689660313600", + "text": "福島第一原発の構内地図がこちら。\nhttp://t.co/ZkU4TZCGPG\nどう見ても、1号機。\nRT @Lightworker19: 【大拡散】  福島第一原発 4号機 爆発動画 40秒~  http://t.co/lmlgp38fgZ", + "source": "TweetDeck", + "truncated": false, + "in_reply_to_status_id": 505774460910043140, + "in_reply_to_status_id_str": "505774460910043136", + "in_reply_to_user_id": 238157843, + "in_reply_to_user_id_str": "238157843", + "in_reply_to_screen_name": "Lightworker19", + "user": { + "id": 29599253, + "id_str": "29599253", + "name": "タクラミックス", + "screen_name": "takuramix", + "location": "i7", + "description": "私の機能一覧:歌う、演劇、ネットワークエンジニア、ライター、プログラマ、翻訳、シルバーアクセサリ、……何をやってる人かは良くわからない人なので、「機能」が欲しい人は私にがっかりするでしょう。私って人間に御用があるなら別ですが。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 5136, + "friends_count": 724, + "listed_count": 335, + "created_at": "Wed Apr 08 01:10:58 +0000 2009", + "favourites_count": 21363, + "utc_offset": 32400, + "time_zone": "Tokyo", + "geo_enabled": false, + "verified": false, + "statuses_count": 70897, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/2049751947/takuramix1204_normal.jpg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/2049751947/takuramix1204_normal.jpg", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 1, + "favorite_count": 1, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [ + { + "url": "http://t.co/ZkU4TZCGPG", + "expanded_url": "http://www.tepco.co.jp/nu/fukushima-np/review/images/review1_01.gif", + "display_url": "tepco.co.jp/nu/fukushima-n…", + "indices": [ + 17, + 39 + ] + }, + { + "url": "http://t.co/lmlgp38fgZ", + "expanded_url": "http://youtu.be/gDXEhyuVSDk", + "display_url": "youtu.be/gDXEhyuVSDk", + "indices": [ + 99, + 121 + ] + } + ], + "user_mentions": [ + { + "screen_name": "Lightworker19", + "name": "Lightworker", + "id": 238157843, + "id_str": "238157843", + "indices": [ + 54, + 68 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "possibly_sensitive": false, + "lang": "ja" + }, + "retweet_count": 1, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [ + { + "url": "http://t.co/ZkU4TZCGPG", + "expanded_url": "http://www.tepco.co.jp/nu/fukushima-np/review/images/review1_01.gif", + "display_url": "tepco.co.jp/nu/fukushima-n…", + "indices": [ + 32, + 54 + ] + }, + { + "url": "http://t.co/lmlgp38fgZ", + "expanded_url": "http://youtu.be/gDXEhyuVSDk", + "display_url": "youtu.be/gDXEhyuVSDk", + "indices": [ + 114, + 136 + ] + } + ], + "user_mentions": [ + { + "screen_name": "takuramix", + "name": "タクラミックス", + "id": 29599253, + "id_str": "29599253", + "indices": [ + 3, + 13 + ] + }, + { + "screen_name": "Lightworker19", + "name": "Lightworker", + "id": 238157843, + "id_str": "238157843", + "indices": [ + 69, + 83 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "possibly_sensitive": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:03 +0000 2014", + "id": 505874873961308160, + "id_str": "505874873961308160", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "やっぱりアナ雪が好き♥", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2714052962, + "id_str": "2714052962", + "name": "やっぱりアナ雪が好き♥", + "screen_name": "anayuki_suki", + "location": "", + "description": "なんだかんだ言ってもやっぱりアナ雪が好きなんですよね~♪ \r\n私も好きって人は RT & 相互フォローで みなさん、お願いします♪", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 368, + "friends_count": 1826, + "listed_count": 1, + "created_at": "Thu Aug 07 08:29:13 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 670, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/497299646662705153/KMo3gkv7_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/497299646662705153/KMo3gkv7_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2714052962/1407400477", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "zh" + }, + "created_at": "Sun Aug 31 00:29:03 +0000 2014", + "id": 505874873759977500, + "id_str": "505874873759977473", + "text": "四川盆地江淮等地将有强降雨 开学日多地将有雨:   中新网8月31日电 据中央气象台消息,江淮东部、四川盆地东北部等地今天(31日)又将迎来一场暴雨或大暴雨天气。明天9月1日,是中小学生开学的日子。预计明天,内蒙古中部、... http://t.co/toQgVlXPyH", + "source": "twitterfeed", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2281979863, + "id_str": "2281979863", + "name": "News 24h China", + "screen_name": "news24hchn", + "location": "", + "description": "", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 719, + "friends_count": 807, + "listed_count": 7, + "created_at": "Wed Jan 08 10:56:04 +0000 2014", + "favourites_count": 0, + "utc_offset": 7200, + "time_zone": "Amsterdam", + "geo_enabled": false, + "verified": false, + "statuses_count": 94782, + "lang": "it", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://pbs.twimg.com/profile_background_images/452558963754561536/QPID3isM.jpeg", + "profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/452558963754561536/QPID3isM.jpeg", + "profile_background_tile": true, + "profile_image_url": "http://pbs.twimg.com/profile_images/439031926569979904/SlBH9iMg_normal.png", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/439031926569979904/SlBH9iMg_normal.png", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2281979863/1393508427", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "FFFFFF", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": false, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 0, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [ + { + "url": "http://t.co/toQgVlXPyH", + "expanded_url": "http://news24h.allnews24h.com/FX54", + "display_url": "news24h.allnews24h.com/FX54", + "indices": [ + 114, + 136 + ] + } + ], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "possibly_sensitive": false, + "lang": "zh" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:03 +0000 2014", + "id": 505874873248268300, + "id_str": "505874873248268288", + "text": "@Take3carnifex それは大変!一大事!命に関わります!\n是非うちに受診して下さい!", + "source": "Twitter for iPhone", + "truncated": false, + "in_reply_to_status_id": 505874353716600800, + "in_reply_to_status_id_str": "505874353716600832", + "in_reply_to_user_id": 535179785, + "in_reply_to_user_id_str": "535179785", + "in_reply_to_screen_name": "Take3carnifex", + "user": { + "id": 226897125, + "id_str": "226897125", + "name": "ひかり@hack", + "screen_name": "hikari_thirteen", + "location": "", + "description": "hackというバンドで、ギターを弾いています。 モンハンとポケモンが好き。 \nSPRING WATER リードギター(ヘルプ)\nROCK OUT レギュラーDJ", + "url": "http://t.co/SQLZnvjVxB", + "entities": { + "url": { + "urls": [ + { + "url": "http://t.co/SQLZnvjVxB", + "expanded_url": "http://s.ameblo.jp/hikarihikarimay", + "display_url": "s.ameblo.jp/hikarihikarimay", + "indices": [ + 0, + 22 + ] + } + ] + }, + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 296, + "friends_count": 348, + "listed_count": 3, + "created_at": "Wed Dec 15 10:51:51 +0000 2010", + "favourites_count": 33, + "utc_offset": 32400, + "time_zone": "Tokyo", + "geo_enabled": false, + "verified": false, + "statuses_count": 3293, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "131516", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme14/bg.gif", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme14/bg.gif", + "profile_background_tile": true, + "profile_image_url": "http://pbs.twimg.com/profile_images/378800000504584690/8ccba98eda8c0fd1d15a74e401f621d1_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/378800000504584690/8ccba98eda8c0fd1d15a74e401f621d1_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/226897125/1385551752", + "profile_link_color": "009999", + "profile_sidebar_border_color": "EEEEEE", + "profile_sidebar_fill_color": "EFEFEF", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": false, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 0, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "Take3carnifex", + "name": "Take3", + "id": 535179785, + "id_str": "535179785", + "indices": [ + 0, + 14 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:03 +0000 2014", + "id": 505874873223110660, + "id_str": "505874873223110656", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "今どき女子高生の謎w", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2744236873, + "id_str": "2744236873", + "name": "今どき女子高生の謎w", + "screen_name": "imadokijoshiko", + "location": "", + "description": "思わず耳を疑う男性の方の夢を壊してしまう、\r\n女子高生達のディープな世界を見てください☆ \r\nおもしろいと思ったら RT & 相互フォローでお願いします♪", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 79, + "friends_count": 973, + "listed_count": 0, + "created_at": "Tue Aug 19 07:06:47 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 354, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501627015980535808/avWBgkDh_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501627015980535808/avWBgkDh_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2744236873/1408432455", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:02 +0000 2014", + "id": 505874872463925250, + "id_str": "505874872463925248", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "私の理想の男性像", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2761782601, + "id_str": "2761782601", + "name": "私の理想の男性像", + "screen_name": "risou_dansei", + "location": "", + "description": "こんな男性♥ ほんとにいるのかしら!? \r\n「いたらいいのになぁ」っていう理想の男性像をを、私目線でつぶやきます。 \r\nいいなと思った人は RT & フォローお願いします♪", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 69, + "friends_count": 974, + "listed_count": 0, + "created_at": "Sun Aug 24 08:03:32 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 208, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/503452833719410688/tFU509Yk_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/503452833719410688/tFU509Yk_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2761782601/1408867519", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:02 +0000 2014", + "id": 505874871713157100, + "id_str": "505874871713157120", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "激アツ★6秒動画", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2725690658, + "id_str": "2725690658", + "name": "激アツ★6秒動画", + "screen_name": "gekiatu_6byou", + "location": "", + "description": "話題の6秒動画! \r\n思わず「ほんとかよっ」てツッコんでしまう内容のオンパレード! \r\nおもしろかったら、是非 RT & フォローお願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 195, + "friends_count": 494, + "listed_count": 0, + "created_at": "Tue Aug 12 08:17:29 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 477, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/499107997444886528/3rl6FrIk_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/499107997444886528/3rl6FrIk_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2725690658/1407832963", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:02 +0000 2014", + "id": 505874871616671740, + "id_str": "505874871616671744", + "text": "爆笑ww珍解答集!\n先生のツメの甘さと生徒のセンスを感じる一問一答だとFBでも話題!!\nうどん天下一決定戦ウィンドウズ9三重高校竹内由恵アナ花火保険\nhttp://t.co/jRWJt8IrSB http://t.co/okrAoxSbt0", + "source": "笑える博物館", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2748747362, + "id_str": "2748747362", + "name": "笑える博物館", + "screen_name": "waraeru_kan", + "location": "", + "description": "", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 19, + "friends_count": 10, + "listed_count": 0, + "created_at": "Wed Aug 20 11:11:04 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 15137, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://abs.twimg.com/sticky/default_profile_images/default_profile_4_normal.png", + "profile_image_url_https": "https://abs.twimg.com/sticky/default_profile_images/default_profile_4_normal.png", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": true, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 0, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [ + { + "url": "http://t.co/jRWJt8IrSB", + "expanded_url": "http://bit.ly/1qBa1nl", + "display_url": "bit.ly/1qBa1nl", + "indices": [ + 75, + 97 + ] + } + ], + "user_mentions": [], + "media": [ + { + "id": 505874871344066560, + "id_str": "505874871344066560", + "indices": [ + 98, + 120 + ], + "media_url": "http://pbs.twimg.com/media/BwU6g-dCcAALxAW.png", + "media_url_https": "https://pbs.twimg.com/media/BwU6g-dCcAALxAW.png", + "url": "http://t.co/okrAoxSbt0", + "display_url": "pic.twitter.com/okrAoxSbt0", + "expanded_url": "http://twitter.com/waraeru_kan/status/505874871616671744/photo/1", + "type": "photo", + "sizes": { + "small": { + "w": 340, + "h": 425, + "resize": "fit" + }, + "thumb": { + "w": 150, + "h": 150, + "resize": "crop" + }, + "large": { + "w": 600, + "h": 750, + "resize": "fit" + }, + "medium": { + "w": 600, + "h": 750, + "resize": "fit" + } + } + } + ] + }, + "favorited": false, + "retweeted": false, + "possibly_sensitive": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:02 +0000 2014", + "id": 505874871268540400, + "id_str": "505874871268540416", + "text": "@nasan_arai \n名前→なーさん\n第一印象→誰。(´・_・`)\n今の印象→れいら♡\nLINE交換できる?→してる(「・ω・)「\n好きなところ→可愛い優しい優しい優しい\n最後に一言→なーさん好き〜(´・_・`)♡GEM現場おいでね(´・_・`)♡\n\n#ふぁぼした人にやる", + "source": "Twitter for iPhone", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": 1717603286, + "in_reply_to_user_id_str": "1717603286", + "in_reply_to_screen_name": "nasan_arai", + "user": { + "id": 2417626784, + "id_str": "2417626784", + "name": "✩.ゆきଘ(*´꒳`)", + "screen_name": "Ymaaya_gem", + "location": "", + "description": "⁽⁽٩( ᐖ )۶⁾⁾ ❤︎ 武 田 舞 彩 ❤︎ ₍₍٩( ᐛ )۶₎₎", + "url": "http://t.co/wR0Qb76TbB", + "entities": { + "url": { + "urls": [ + { + "url": "http://t.co/wR0Qb76TbB", + "expanded_url": "http://twpf.jp/Ymaaya_gem", + "display_url": "twpf.jp/Ymaaya_gem", + "indices": [ + 0, + 22 + ] + } + ] + }, + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 198, + "friends_count": 245, + "listed_count": 1, + "created_at": "Sat Mar 29 16:03:06 +0000 2014", + "favourites_count": 3818, + "utc_offset": null, + "time_zone": null, + "geo_enabled": true, + "verified": false, + "statuses_count": 8056, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/505516858816987136/4gFGjHzu_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/505516858816987136/4gFGjHzu_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2417626784/1407764793", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 0, + "favorite_count": 0, + "entities": { + "hashtags": [ + { + "text": "ふぁぼした人にやる", + "indices": [ + 128, + 138 + ] + } + ], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "nasan_arai", + "name": "なーさん", + "id": 1717603286, + "id_str": "1717603286", + "indices": [ + 0, + 11 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:02 +0000 2014", + "id": 505874871218225150, + "id_str": "505874871218225152", + "text": "\"ソードマスター\"剣聖カミイズミ (CV:緑川光)-「ソードマスター」のアスタリスク所持者\n第一師団団長にして「剣聖」の称号を持つ剣士。イデアの剣の師匠。 \n敵味方からも尊敬される一流の武人。", + "source": "twittbot.net", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 1435517814, + "id_str": "1435517814", + "name": "俺、関係ないよ?", + "screen_name": "BDFF_LOVE", + "location": "ルクセンダルクorリングアベルさんの隣", + "description": "自分なりに生きる人、最後まであきらめないの。でも、フォローありがとう…。@ringo_BDFFLOVE ←は、妹です。時々、会話します。「現在BOTで、BDFFのこと呟くよ!」夜は、全滅 「BDFFプレイ中」詳しくは、ツイプロみてください!(絶対)", + "url": "http://t.co/5R4dzpbWX2", + "entities": { + "url": { + "urls": [ + { + "url": "http://t.co/5R4dzpbWX2", + "expanded_url": "http://twpf.jp/BDFF_LOVE", + "display_url": "twpf.jp/BDFF_LOVE", + "indices": [ + 0, + 22 + ] + } + ] + }, + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 1066, + "friends_count": 1799, + "listed_count": 6, + "created_at": "Fri May 17 12:33:23 +0000 2013", + "favourites_count": 1431, + "utc_offset": 32400, + "time_zone": "Irkutsk", + "geo_enabled": true, + "verified": false, + "statuses_count": 6333, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/505696320380612608/qvaxb_zx_normal.png", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/505696320380612608/qvaxb_zx_normal.png", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/1435517814/1409401948", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 0, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:02 +0000 2014", + "id": 505874871130136600, + "id_str": "505874871130136576", + "text": "闇「リンと付き合うに当たって歳の差以外にもいろいろ壁があったんだよ。愛し隊の妨害とか風紀厨の生徒会長とか…」\n一号「リンちゃんを泣かせたらシメるかんね!」\n二号「リンちゃんにやましい事したら×す…」\n執行部「不純な交際は僕が取り締まろうじゃないか…」\n闇「(消される)」", + "source": "twittbot.net", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2386208737, + "id_str": "2386208737", + "name": "闇未来Bot", + "screen_name": "StxRinFbot", + "location": "DIVAルーム", + "description": "ProjectDIVAのモジュール・ストレンジダーク×鏡音リンFutureStyleの自己満足非公式Bot マセレン仕様。CP要素あります。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 7, + "friends_count": 2, + "listed_count": 0, + "created_at": "Thu Mar 13 02:58:09 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 4876, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/443948925351755776/6rmljL5C_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/443948925351755776/6rmljL5C_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2386208737/1396259004", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 0, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:02 +0000 2014", + "id": 505874870933016600, + "id_str": "505874870933016576", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "絶品!!スイーツ天国", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2725681663, + "id_str": "2725681663", + "name": "絶品!!スイーツ天国", + "screen_name": "suitestengoku", + "location": "", + "description": "美味しそうなスイーツって、見てるだけで幸せな気分になれますね♪\r\nそんな素敵なスイーツに出会いたいです。\r\n食べたいと思ったら是非 RT & フォローお願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 401, + "friends_count": 1877, + "listed_count": 1, + "created_at": "Tue Aug 12 07:43:52 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 554, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/499099533507178496/g5dNpArt_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/499099533507178496/g5dNpArt_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2725681663/1407829743", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:02 +0000 2014", + "id": 505874870148669440, + "id_str": "505874870148669440", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "電車厳禁!!おもしろ話", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2699667800, + "id_str": "2699667800", + "name": "電車厳禁!!おもしろ話w", + "screen_name": "dengeki_omoro", + "location": "", + "description": "日常のオモシロくて笑える場面を探します♪\r\n面白かったらRT & 相互フォローでみなさん、お願いします♪", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 461, + "friends_count": 1919, + "listed_count": 0, + "created_at": "Sat Aug 02 02:16:32 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 728, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/495400387961036800/BBMb_hcG_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/495400387961036800/BBMb_hcG_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2699667800/1406947654", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:02 +0000 2014", + "id": 505874869339189250, + "id_str": "505874869339189249", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "笑えるwwランキング2", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2695745652, + "id_str": "2695745652", + "name": "笑えるwwランキング", + "screen_name": "wara_runk", + "location": "", + "description": "知ってると使えるランキングを探そう。\r\n面白かったらRT & 相互フォローでみなさん、お願いします♪", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 314, + "friends_count": 1943, + "listed_count": 1, + "created_at": "Thu Jul 31 13:51:57 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 737, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/494844659856728064/xBQfnm5J_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/494844659856728064/xBQfnm5J_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2695745652/1406815103", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:02 +0000 2014", + "id": 505874868533854200, + "id_str": "505874868533854209", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "スニーカー大好き★図鑑", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2707963890, + "id_str": "2707963890", + "name": "スニーカー大好き★図鑑", + "screen_name": "sunikar_daisuki", + "location": "", + "description": "スニーカー好きを見つけて仲間になろう♪\r\n気に入ったら RT & 相互フォローで みなさん、お願いします♪", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 394, + "friends_count": 1891, + "listed_count": 0, + "created_at": "Tue Aug 05 01:54:28 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 642, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/496474952631996416/f0C_u3_u_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/496474952631996416/f0C_u3_u_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2707963890/1407203869", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "zh" + }, + "created_at": "Sun Aug 31 00:29:01 +0000 2014", + "id": 505874867997380600, + "id_str": "505874867997380608", + "text": "\"@BelloTexto: ¿Quieres ser feliz? \n一\"No stalkees\" \n一\"No stalkees\" \n一\"No stalkees\" \n一\"No stalkees\" \n一\"No stalkees\" \n一\"No stalkees\".\"", + "source": "Twitter for Android", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2249378935, + "id_str": "2249378935", + "name": "Maggie Becerril ", + "screen_name": "maggdesie", + "location": "", + "description": "cambiando la vida de las personas.", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 120, + "friends_count": 391, + "listed_count": 0, + "created_at": "Mon Dec 16 21:56:49 +0000 2013", + "favourites_count": 314, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 1657, + "lang": "es", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/505093371665604608/K0x_LV2y_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/505093371665604608/K0x_LV2y_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2249378935/1409258479", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 0, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "BelloTexto", + "name": "Indirectas... ✉", + "id": 833083404, + "id_str": "833083404", + "indices": [ + 1, + 12 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "zh" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:01 +0000 2014", + "id": 505874867720183800, + "id_str": "505874867720183808", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "ザ・異性の裏の顔", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2719746578, + "id_str": "2719746578", + "name": "ザ・異性の裏の顔", + "screen_name": "iseiuragao", + "location": "", + "description": "異性について少し学ぶことで、必然的にモテるようになる!? 相手を理解することで見えてくるもの「それは・・・●●」 いい内容だと思ったら RT & フォローもお願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 238, + "friends_count": 1922, + "listed_count": 0, + "created_at": "Sat Aug 09 17:18:43 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 532, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/498157077726900224/tW8q4di__normal.png", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/498157077726900224/tW8q4di__normal.png", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2719746578/1407604947", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:01 +0000 2014", + "id": 505874866910687200, + "id_str": "505874866910687233", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "超w美女☆アルバム", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2744054334, + "id_str": "2744054334", + "name": "超w美女☆アルバム", + "screen_name": "bijyoalbum", + "location": "", + "description": "「おお~っ!いいね~」って、思わず言ってしまう、美女を見つけます☆ \r\nタイプだと思ったら RT & 相互フォローでお願いします♪", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 45, + "friends_count": 966, + "listed_count": 0, + "created_at": "Tue Aug 19 05:36:48 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 352, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501604413312491520/GP66eKWr_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501604413312491520/GP66eKWr_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2744054334/1408426814", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:01 +0000 2014", + "id": 505874866105376800, + "id_str": "505874866105376769", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "男に見せない女子の裏生態", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2744261238, + "id_str": "2744261238", + "name": "男に見せない女子の裏生態", + "screen_name": "jyoshiuraseitai", + "location": "", + "description": "男の知らない女子ならではのあるある☆ \r\nそんな生々しい女子の生態をつぶやきます。 \r\nわかる~って人は RT & フォローでお願いします♪", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 203, + "friends_count": 967, + "listed_count": 0, + "created_at": "Tue Aug 19 08:01:28 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 348, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501641354804346880/Uh1-n1LD_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501641354804346880/Uh1-n1LD_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2744261238/1408435630", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:01 +0000 2014", + "id": 505874865354584060, + "id_str": "505874865354584064", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "驚きの動物たちの生態", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2759403146, + "id_str": "2759403146", + "name": "驚きの動物たちの生態", + "screen_name": "soubutu_seitai", + "location": "", + "description": "「おお~っ」と 言われるような、動物の生態をツイートします♪ \r\n知っていると、あなたも人気者に!? \r\nおもしろかったら RT & フォローを、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 67, + "friends_count": 954, + "listed_count": 0, + "created_at": "Sat Aug 23 16:39:31 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 219, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/503220468128567296/Z8mGDIBS_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/503220468128567296/Z8mGDIBS_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2759403146/1408812130", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:01 +0000 2014", + "id": 505874864603820000, + "id_str": "505874864603820032", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "モテ女子★ファションの秘密", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2706659820, + "id_str": "2706659820", + "name": "モテ女子★ファションの秘密", + "screen_name": "mote_woman", + "location": "", + "description": "オシャレかわいい♥モテ度UPの注目アイテムを見つけます。\r\n気に入ったら RT & 相互フォローで みなさん、お願いします♪", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 217, + "friends_count": 1806, + "listed_count": 0, + "created_at": "Mon Aug 04 14:30:24 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 682, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/496303370936668161/s7xP8rTy_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/496303370936668161/s7xP8rTy_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2706659820/1407163059", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:00 +0000 2014", + "id": 505874863874007040, + "id_str": "505874863874007040", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "男女の違いを解明する", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2761896468, + "id_str": "2761896468", + "name": "男女の違いを解明する", + "screen_name": "danjyonotigai1", + "location": "", + "description": "意外と理解できていない男女それぞれの事情。 \r\n「えっ マジで!?」と驚くような、男女の習性をつぶやきます♪ ためになったら、是非 RT & フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 82, + "friends_count": 992, + "listed_count": 0, + "created_at": "Sun Aug 24 09:47:44 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 237, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/503479057380413441/zDLu5Z9o_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/503479057380413441/zDLu5Z9o_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2761896468/1408873803", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:00 +0000 2014", + "id": 505874862900924400, + "id_str": "505874862900924416", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "神レベル★極限の発想", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2744950735, + "id_str": "2744950735", + "name": "神レベル★極限の発想", + "screen_name": "kamihassou", + "location": "", + "description": "見ているだけで、本気がビシバシ伝わってきます! \r\n人生のヒントになるような、そんな究極の発想を集めています。 \r\nいいなと思ったら RT & 相互フォローで、お願いします♪", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 84, + "friends_count": 992, + "listed_count": 0, + "created_at": "Tue Aug 19 13:36:05 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 343, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501725053189226496/xZNOTYz2_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501725053189226496/xZNOTYz2_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2744950735/1408455571", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:00 +0000 2014", + "id": 505874862397591550, + "id_str": "505874862397591552", + "text": "@kaoritoxx そうよ!あたしはそう思うようにしておる。いま職場一やけとる気がする(°_°)!満喫幸せ焼け!!wあー、なるほどね!毎回そうだよね!ティアラちゃんみにいってるもんね♡五月と九月恐ろしい、、、\nハリポタエリアはいった??", + "source": "Twitter for iPhone", + "truncated": false, + "in_reply_to_status_id": 505838547308277760, + "in_reply_to_status_id_str": "505838547308277761", + "in_reply_to_user_id": 796000214, + "in_reply_to_user_id_str": "796000214", + "in_reply_to_screen_name": "kaoritoxx", + "user": { + "id": 2256249487, + "id_str": "2256249487", + "name": "はあちゃん@海賊同盟中", + "screen_name": "onepiece_24", + "location": "どえすえろぉたんの助手兼ね妹(願望)", + "description": "ONE PIECE愛しすぎて今年23ちゃい(歴14年目)ゾロ様に一途だったのにロー、このやろー。ロビンちゃんが幸せになればいい。ルフィは無条件にすき。ゾロビン、ローロビ、ルロビ♡usj、声優さん、コナン、進撃、クレしん、H x Hも好き♩", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 415, + "friends_count": 384, + "listed_count": 3, + "created_at": "Sat Dec 21 09:37:25 +0000 2013", + "favourites_count": 1603, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 9636, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501686340564418561/hMQFN4vD_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501686340564418561/hMQFN4vD_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2256249487/1399987924", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 0, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "kaoritoxx", + "name": "かおちゃん", + "id": 796000214, + "id_str": "796000214", + "indices": [ + 0, + 10 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:00 +0000 2014", + "id": 505874861973991400, + "id_str": "505874861973991424", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "恋愛仙人", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2698885082, + "id_str": "2698885082", + "name": "恋愛仙人", + "screen_name": "renai_sennin", + "location": "", + "description": "豊富でステキな恋愛経験を、シェアしましょう。\r\n面白かったらRT & 相互フォローでみなさん、お願いします♪", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 618, + "friends_count": 1847, + "listed_count": 1, + "created_at": "Fri Aug 01 18:09:38 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 726, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/495272204641132544/GNA18aOg_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/495272204641132544/GNA18aOg_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2698885082/1406917096", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:00 +0000 2014", + "id": 505874861881700350, + "id_str": "505874861881700353", + "text": "@itsukibot_ 一稀の俺のソーセージをペロペロする音はデカイ", + "source": "jigtwi", + "truncated": false, + "in_reply_to_status_id": 505871017428795400, + "in_reply_to_status_id_str": "505871017428795392", + "in_reply_to_user_id": 141170845, + "in_reply_to_user_id_str": "141170845", + "in_reply_to_screen_name": "itsukibot_", + "user": { + "id": 2184752048, + "id_str": "2184752048", + "name": "アンドー", + "screen_name": "55dakedayo", + "location": "", + "description": "", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 15, + "friends_count": 24, + "listed_count": 0, + "created_at": "Sat Nov 09 17:42:22 +0000 2013", + "favourites_count": 37249, + "utc_offset": 32400, + "time_zone": "Irkutsk", + "geo_enabled": false, + "verified": false, + "statuses_count": 21070, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://abs.twimg.com/sticky/default_profile_images/default_profile_3_normal.png", + "profile_image_url_https": "https://abs.twimg.com/sticky/default_profile_images/default_profile_3_normal.png", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": true, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 0, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "itsukibot_", + "name": "前田一稀", + "id": 141170845, + "id_str": "141170845", + "indices": [ + 0, + 11 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:00 +0000 2014", + "id": 505874861185437700, + "id_str": "505874861185437697", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "あの伝説の名ドラマ&名場面", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2706951979, + "id_str": "2706951979", + "name": "あの伝説の名ドラマ&名場面", + "screen_name": "densetunodorama", + "location": "", + "description": "誰にでも記憶に残る、ドラマの名場面があると思います。そんな感動のストーリーを、もう一度わかちあいたいです。\r\n「これ知ってる!」とか「あ~懐かしい」と思ったら RT & 相互フォローでみなさん、お願いします♪", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 300, + "friends_count": 1886, + "listed_count": 0, + "created_at": "Mon Aug 04 16:38:25 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 694, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/496335892152209408/fKzb8Nv3_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/496335892152209408/fKzb8Nv3_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2706951979/1407170704", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:29:00 +0000 2014", + "id": 505874860447260700, + "id_str": "505874860447260672", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "マジで食べたい♥ケーキ特集", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2724328646, + "id_str": "2724328646", + "name": "マジで食べたい♥ケーキ特集", + "screen_name": "tabetaicake1", + "location": "", + "description": "女性の目線から見た、美味しそうなケーキを探し求めています。\r\n見てるだけで、あれもコレも食べたくなっちゃう♪\r\n美味しそうだと思ったら、是非 RT & フォローお願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 158, + "friends_count": 1907, + "listed_count": 0, + "created_at": "Mon Aug 11 17:15:22 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 493, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/498881289844293632/DAa9No9M_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/498881289844293632/DAa9No9M_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2724328646/1407777704", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:28:59 +0000 2014", + "id": 505874859662925800, + "id_str": "505874859662925824", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "アディダス★マニア", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2704003662, + "id_str": "2704003662", + "name": "アディダス★マニア", + "screen_name": "adi_mania11", + "location": "", + "description": "素敵なアディダスのアイテムを見つけたいです♪\r\n気に入ってもらえたららRT & 相互フォローで みなさん、お願いします♪", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 340, + "friends_count": 1851, + "listed_count": 0, + "created_at": "Sun Aug 03 12:26:37 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 734, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/495911561781727235/06QAMVrR_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/495911561781727235/06QAMVrR_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2704003662/1407069046", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:28:59 +0000 2014", + "id": 505874858920513540, + "id_str": "505874858920513537", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "萌えペット大好き", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2719061228, + "id_str": "2719061228", + "name": "萌えペット大好き", + "screen_name": "moe_pet1", + "location": "", + "description": "かわいいペットを見るのが趣味です♥そんな私と一緒にいやされたい人いませんか?かわいいと思ったら RT & フォローもお願いします♪", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 289, + "friends_count": 1812, + "listed_count": 0, + "created_at": "Sat Aug 09 10:20:25 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 632, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/498051549537386496/QizThq7N_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/498051549537386496/QizThq7N_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2719061228/1407581287", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:28:59 +0000 2014", + "id": 505874858115219460, + "id_str": "505874858115219456", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "恋愛の教科書 ", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2744344514, + "id_str": "2744344514", + "name": "恋愛の教科書", + "screen_name": "renaikyoukasyo", + "location": "", + "description": "もっと早く知っとくべきだった~!知っていればもっと上手くいく♪ \r\n今すぐ役立つ恋愛についての雑学やマメ知識をお届けします。 \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 124, + "friends_count": 955, + "listed_count": 0, + "created_at": "Tue Aug 19 08:32:45 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 346, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501655512018997248/7SznYGWi_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501655512018997248/7SznYGWi_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2744344514/1408439001", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:28:59 +0000 2014", + "id": 505874857335074800, + "id_str": "505874857335074816", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "オモロすぎる★学生の日常", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2699365116, + "id_str": "2699365116", + "name": "オモロすぎる★学生の日常", + "screen_name": "omorogakusei", + "location": "", + "description": "楽しすぎる学生の日常を探していきます。\r\n面白かったらRT & 相互フォローでみなさん、お願いします♪", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 289, + "friends_count": 1156, + "listed_count": 2, + "created_at": "Fri Aug 01 23:35:18 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 770, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/495353473886478336/S-4B_RVl_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/495353473886478336/S-4B_RVl_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2699365116/1406936481", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:28:59 +0000 2014", + "id": 505874856605257700, + "id_str": "505874856605257728", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "憧れの★インテリア図鑑", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2721907602, + "id_str": "2721907602", + "name": "憧れの★インテリア図鑑", + "screen_name": "akogareinteria", + "location": "", + "description": "自分の住む部屋もこんなふうにしてみたい♪ \r\nそんな素敵なインテリアを、日々探していますw \r\nいいなと思ったら RT & 相互フォローお願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 298, + "friends_count": 1925, + "listed_count": 0, + "created_at": "Sun Aug 10 15:59:13 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 540, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/498499374423343105/Wi_izHvT_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/498499374423343105/Wi_izHvT_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2721907602/1407686543", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:28:59 +0000 2014", + "id": 505874856089378800, + "id_str": "505874856089378816", + "text": "天冥の標 VI 宿怨 PART1 / 小川 一水\nhttp://t.co/fXIgRt4ffH\n \n#キンドル #天冥の標VI宿怨PART1", + "source": "waromett", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 1953404612, + "id_str": "1953404612", + "name": "わろめっと", + "screen_name": "waromett", + "location": "", + "description": "たのしいついーとしょうかい", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 16980, + "friends_count": 16983, + "listed_count": 18, + "created_at": "Fri Oct 11 05:49:57 +0000 2013", + "favourites_count": 3833, + "utc_offset": 32400, + "time_zone": "Tokyo", + "geo_enabled": false, + "verified": false, + "statuses_count": 98655, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "352726", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme5/bg.gif", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme5/bg.gif", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/378800000578908101/14c4744c7aa34b1f8bbd942b78e59385_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/378800000578908101/14c4744c7aa34b1f8bbd942b78e59385_normal.jpeg", + "profile_link_color": "D02B55", + "profile_sidebar_border_color": "829D5E", + "profile_sidebar_fill_color": "99CC33", + "profile_text_color": "3E4415", + "profile_use_background_image": true, + "default_profile": false, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 0, + "favorite_count": 0, + "entities": { + "hashtags": [ + { + "text": "キンドル", + "indices": [ + 50, + 55 + ] + }, + { + "text": "天冥の標VI宿怨PART1", + "indices": [ + 56, + 70 + ] + } + ], + "symbols": [], + "urls": [ + { + "url": "http://t.co/fXIgRt4ffH", + "expanded_url": "http://j.mp/1kHBOym", + "display_url": "j.mp/1kHBOym", + "indices": [ + 25, + 47 + ] + } + ], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "possibly_sensitive": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "zh" + }, + "created_at": "Sun Aug 31 00:28:58 +0000 2014", + "id": 505874855770599400, + "id_str": "505874855770599425", + "text": "四川盆地江淮等地将有强降雨 开学日多地将有雨:   中新网8月31日电 据中央气象台消息,江淮东部、四川盆地东北部等地今天(31日)又将迎来一场暴雨或大暴雨天气。明天9月1日,是中小学生开学的日子。预计明天,内蒙古中部、... http://t.co/RNdqIHmTby", + "source": "twitterfeed", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 402427654, + "id_str": "402427654", + "name": "中国新闻", + "screen_name": "zhongwenxinwen", + "location": "", + "description": "中国的新闻,世界的新闻。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 2429, + "friends_count": 15, + "listed_count": 29, + "created_at": "Tue Nov 01 01:56:43 +0000 2011", + "favourites_count": 0, + "utc_offset": -28800, + "time_zone": "Alaska", + "geo_enabled": false, + "verified": false, + "statuses_count": 84564, + "lang": "zh-cn", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "709397", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme6/bg.gif", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme6/bg.gif", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/2700523149/5597e347b2eb880425faef54287995f2_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/2700523149/5597e347b2eb880425faef54287995f2_normal.jpeg", + "profile_link_color": "FF3300", + "profile_sidebar_border_color": "86A4A6", + "profile_sidebar_fill_color": "A0C5C7", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": false, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 0, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [ + { + "url": "http://t.co/RNdqIHmTby", + "expanded_url": "http://bit.ly/1tOdNsI", + "display_url": "bit.ly/1tOdNsI", + "indices": [ + 114, + 136 + ] + } + ], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "possibly_sensitive": false, + "lang": "zh" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:28:58 +0000 2014", + "id": 505874854877200400, + "id_str": "505874854877200384", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "LDH ★大好き応援団", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2700961603, + "id_str": "2700961603", + "name": "LDH ★大好き応援団", + "screen_name": "LDH_daisuki1", + "location": "", + "description": "LDHファンは、全員仲間です♪\r\n面白かったらRT & 相互フォローでみなさん、お願いします♪", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 458, + "friends_count": 1895, + "listed_count": 0, + "created_at": "Sat Aug 02 14:23:46 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 735, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/495578007298252800/FOZflgYu_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/495578007298252800/FOZflgYu_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2700961603/1406989928", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:28:58 +0000 2014", + "id": 505874854147407900, + "id_str": "505874854147407872", + "text": "RT @shiawaseomamori: 一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるの…", + "source": "マジ!?怖いアニメ都市伝説", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2719489172, + "id_str": "2719489172", + "name": "マジ!?怖いアニメ都市伝説", + "screen_name": "anime_toshiden1", + "location": "", + "description": "あなたの知らない、怖すぎるアニメの都市伝説を集めています。\r\n「え~知らなかったよww]」って人は RT & フォローお願いします♪", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 377, + "friends_count": 1911, + "listed_count": 1, + "created_at": "Sat Aug 09 14:41:15 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 536, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/498118027322208258/h7XOTTSi_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/498118027322208258/h7XOTTSi_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2719489172/1407595513", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:06 +0000 2014", + "id": 505871615125491700, + "id_str": "505871615125491712", + "text": "一に止まると書いて、正しいという意味だなんて、この年になるまで知りませんでした。 人は生きていると、前へ前へという気持ちばかり急いて、どんどん大切なものを置き去りにしていくものでしょう。本当に正しいことというのは、一番初めの場所にあるのかもしれません。 by神様のカルテ、夏川草介", + "source": "幸せの☆お守り", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2745121514, + "id_str": "2745121514", + "name": "幸せの☆お守り", + "screen_name": "shiawaseomamori", + "location": "", + "description": "自分が幸せだと周りも幸せにできる! \r\nそんな人生を精一杯生きるために必要な言葉をお届けします♪ \r\nいいなと思ったら RT & 相互フォローで、お願いします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 213, + "friends_count": 991, + "listed_count": 0, + "created_at": "Tue Aug 19 14:45:19 +0000 2014", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 349, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/501742437606244354/scXy81ZW_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2745121514/1408459730", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 58, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "shiawaseomamori", + "name": "幸せの☆お守り", + "id": 2745121514, + "id_str": "2745121514", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:28:58 +0000 2014", + "id": 505874854134820860, + "id_str": "505874854134820864", + "text": "@vesperia1985 おはよー!\n今日までなのですよ…!!明日一生来なくていい", + "source": "Twitter for iPhone", + "truncated": false, + "in_reply_to_status_id": 505868030329364500, + "in_reply_to_status_id_str": "505868030329364480", + "in_reply_to_user_id": 2286548834, + "in_reply_to_user_id_str": "2286548834", + "in_reply_to_screen_name": "vesperia1985", + "user": { + "id": 2389045190, + "id_str": "2389045190", + "name": "りいこ", + "screen_name": "riiko_dq10", + "location": "", + "description": "サマーエルフです、りいこです。えるおくんラブです!随時ふれぼしゅ〜〜(っ˘ω˘c )*日常のどうでもいいことも呟いてますがよろしくね〜", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 67, + "friends_count": 69, + "listed_count": 0, + "created_at": "Fri Mar 14 13:02:27 +0000 2014", + "favourites_count": 120, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 324, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/503906346815610881/BfSrCoBr_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/503906346815610881/BfSrCoBr_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2389045190/1409232058", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 0, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "vesperia1985", + "name": "ユーリ", + "id": 2286548834, + "id_str": "2286548834", + "indices": [ + 0, + 13 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:28:58 +0000 2014", + "id": 505874853778685950, + "id_str": "505874853778685952", + "text": "【映画パンフレット】 永遠の0 (永遠のゼロ) 監督 山崎貴 キャスト 岡田准一、三浦春馬、井上真央東宝(2)11点の新品/中古品を見る: ¥ 500より\n(この商品の現在のランクに関する正式な情報については、アートフレーム... http://t.co/4hbyB1rbQ7", + "source": "IFTTT", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 1319883571, + "id_str": "1319883571", + "name": "森林木工家具製作所", + "screen_name": "Furniturewood", + "location": "沖縄", + "description": "家具(かぐ、Furniture)は、家財道具のうち家の中に据え置いて利用する比較的大型の道具類、または元々家に作り付けられている比較的大型の道具類をさす。なお、日本の建築基準法上は、作り付け家具は、建築確認及び完了検査の対象となるが、後から置かれるものについては対象外である。", + "url": "http://t.co/V4oyL0xtZk", + "entities": { + "url": { + "urls": [ + { + "url": "http://t.co/V4oyL0xtZk", + "expanded_url": "http://astore.amazon.co.jp/furniturewood-22", + "display_url": "astore.amazon.co.jp/furniturewood-…", + "indices": [ + 0, + 22 + ] + } + ] + }, + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 677, + "friends_count": 743, + "listed_count": 1, + "created_at": "Mon Apr 01 07:55:14 +0000 2013", + "favourites_count": 0, + "utc_offset": 32400, + "time_zone": "Irkutsk", + "geo_enabled": false, + "verified": false, + "statuses_count": 17210, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/3460466135/c67d9df9b760787b9ed284fe80b1dd31_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/3460466135/c67d9df9b760787b9ed284fe80b1dd31_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/1319883571/1364804982", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 0, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [ + { + "url": "http://t.co/4hbyB1rbQ7", + "expanded_url": "http://ift.tt/1kT55bk", + "display_url": "ift.tt/1kT55bk", + "indices": [ + 116, + 138 + ] + } + ], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "possibly_sensitive": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:28:58 +0000 2014", + "id": 505874852754907140, + "id_str": "505874852754907136", + "text": "RT @siranuga_hotoke: ゴキブリは一世帯に平均して480匹いる。", + "source": "Twitter for iPhone", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 413944345, + "id_str": "413944345", + "name": "泥酔イナバウアー", + "screen_name": "Natade_co_co_21", + "location": "", + "description": "君の瞳にうつる僕に乾杯。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 298, + "friends_count": 300, + "listed_count": 4, + "created_at": "Wed Nov 16 12:52:46 +0000 2011", + "favourites_count": 3125, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 12237, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "FFF04D", + "profile_background_image_url": "http://pbs.twimg.com/profile_background_images/378800000115928444/9bf5fa13385cc80bfeb097e51af9862a.jpeg", + "profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/378800000115928444/9bf5fa13385cc80bfeb097e51af9862a.jpeg", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/500849752351600640/lMQqIzYj_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/500849752351600640/lMQqIzYj_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/413944345/1403511193", + "profile_link_color": "0099CC", + "profile_sidebar_border_color": "000000", + "profile_sidebar_fill_color": "F6FFD1", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": false, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sat Aug 30 23:24:23 +0000 2014", + "id": 505858599411666940, + "id_str": "505858599411666944", + "text": "ゴキブリは一世帯に平均して480匹いる。", + "source": "twittbot.net", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2243896200, + "id_str": "2243896200", + "name": "知らぬが仏bot", + "screen_name": "siranuga_hotoke", + "location": "奈良・京都辺り", + "description": "知らぬが仏な情報をお伝えします。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 3288, + "friends_count": 3482, + "listed_count": 7, + "created_at": "Fri Dec 13 13:16:35 +0000 2013", + "favourites_count": 0, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 1570, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/378800000866399372/ypy5NnPe_normal.png", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/378800000866399372/ypy5NnPe_normal.png", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/2243896200/1386997755", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 1, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + "retweet_count": 1, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [], + "user_mentions": [ + { + "screen_name": "siranuga_hotoke", + "name": "知らぬが仏bot", + "id": 2243896200, + "id_str": "2243896200", + "indices": [ + 3, + 19 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:28:58 +0000 2014", + "id": 505874852603908100, + "id_str": "505874852603908096", + "text": "RT @UARROW_Y: ようかい体操第一を踊る国見英 http://t.co/SXoYWH98as", + "source": "Twitter for iPhone", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 2463035136, + "id_str": "2463035136", + "name": "や", + "screen_name": "yae45", + "location": "", + "description": "きもちわるいことつぶやく用", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 4, + "friends_count": 30, + "listed_count": 0, + "created_at": "Fri Apr 25 10:49:20 +0000 2014", + "favourites_count": 827, + "utc_offset": 32400, + "time_zone": "Irkutsk", + "geo_enabled": false, + "verified": false, + "statuses_count": 390, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/505345820137234433/csFeRxPm_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/505345820137234433/csFeRxPm_normal.jpeg", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:16:45 +0000 2014", + "id": 505871779949051900, + "id_str": "505871779949051904", + "text": "ようかい体操第一を踊る国見英 http://t.co/SXoYWH98as", + "source": "Twitter for Android", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 1261662588, + "id_str": "1261662588", + "name": "ゆう矢", + "screen_name": "UARROW_Y", + "location": "つくり出そう国影の波 広げよう国影の輪", + "description": "HQ!! 成人済腐女子。日常ツイート多いです。赤葦京治夢豚クソツイ含みます注意。フォローをお考えの際はプロフご一読お願い致します。FRBお気軽に", + "url": "http://t.co/LFX2XOzb0l", + "entities": { + "url": { + "urls": [ + { + "url": "http://t.co/LFX2XOzb0l", + "expanded_url": "http://twpf.jp/UARROW_Y", + "display_url": "twpf.jp/UARROW_Y", + "indices": [ + 0, + 22 + ] + } + ] + }, + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 265, + "friends_count": 124, + "listed_count": 12, + "created_at": "Tue Mar 12 10:42:17 +0000 2013", + "favourites_count": 6762, + "utc_offset": 32400, + "time_zone": "Tokyo", + "geo_enabled": true, + "verified": false, + "statuses_count": 55946, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/502095104618663937/IzuPYx3E_normal.png", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/502095104618663937/IzuPYx3E_normal.png", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/1261662588/1408618604", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 29, + "favorite_count": 54, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [ + { + "url": "http://t.co/SXoYWH98as", + "expanded_url": "http://twitter.com/UARROW_Y/status/505871779949051904/photo/1", + "display_url": "pic.twitter.com/SXoYWH98as", + "indices": [ + 15, + 37 + ] + } + ], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "possibly_sensitive": false, + "lang": "ja" + }, + "retweet_count": 29, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [ + { + "url": "http://t.co/SXoYWH98as", + "expanded_url": "http://twitter.com/UARROW_Y/status/505871779949051904/photo/1", + "display_url": "pic.twitter.com/SXoYWH98as", + "indices": [ + 29, + 51 + ] + } + ], + "user_mentions": [ + { + "screen_name": "UARROW_Y", + "name": "ゆう矢", + "id": 1261662588, + "id_str": "1261662588", + "indices": [ + 3, + 12 + ] + } + ] + }, + "favorited": false, + "retweeted": false, + "possibly_sensitive": false, + "lang": "ja" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "zh" + }, + "created_at": "Sun Aug 31 00:28:57 +0000 2014", + "id": 505874848900341760, + "id_str": "505874848900341760", + "text": "RT @fightcensorship: 李克強總理的臉綠了!在前日南京青奧會閉幕式,觀眾席上一名貪玩韓國少年運動員,竟斗膽用激光筆射向中國總理李克強的臉。http://t.co/HLX9mHcQwe http://t.co/fVVOSML5s8", + "source": "Twitter for iPhone", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 889332218, + "id_str": "889332218", + "name": "民權初步", + "screen_name": "JoeyYoungkm", + "location": "km/cn", + "description": "经历了怎样的曲折才从追求“一致通过”发展到今天人们接受“过半数通过”,正是人们认识到对“一致”甚至是“基本一致”的追求本身就会变成一种独裁。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 313, + "friends_count": 46, + "listed_count": 0, + "created_at": "Thu Oct 18 17:21:17 +0000 2012", + "favourites_count": 24, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 15707, + "lang": "en", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/378800000563062033/a7e8274752ce36a6cd5bad971ec7d416_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/378800000563062033/a7e8274752ce36a6cd5bad971ec7d416_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/889332218/1388896916", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": true, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweeted_status": { + "metadata": { + "result_type": "recent", + "iso_language_code": "zh" + }, + "created_at": "Sat Aug 30 23:56:27 +0000 2014", + "id": 505866670356070400, + "id_str": "505866670356070401", + "text": "李克強總理的臉綠了!在前日南京青奧會閉幕式,觀眾席上一名貪玩韓國少年運動員,竟斗膽用激光筆射向中國總理李克強的臉。http://t.co/HLX9mHcQwe http://t.co/fVVOSML5s8", + "source": "Twitter Web Client", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 67661086, + "id_str": "67661086", + "name": "※范强※法特姗瑟希蒲※", + "screen_name": "fightcensorship", + "location": "Middle of Nowhere", + "description": "被人指责“封建”、“落后”、“保守”的代表,当代红卫兵攻击对象。致力于言论自由,人权; 倡导资讯公开,反对网络封锁。既不是精英分子,也不是意见领袖,本推言论不代表任何国家、党派和组织,也不标榜伟大、光荣和正确。", + "url": null, + "entities": { + "description": { + "urls": [] + } + }, + "protected": false, + "followers_count": 7143, + "friends_count": 779, + "listed_count": 94, + "created_at": "Fri Aug 21 17:16:22 +0000 2009", + "favourites_count": 364, + "utc_offset": 28800, + "time_zone": "Singapore", + "geo_enabled": false, + "verified": false, + "statuses_count": 16751, + "lang": "en", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "FFFFFF", + "profile_background_image_url": "http://pbs.twimg.com/profile_background_images/611138516/toeccqnahbpmr0sw9ybv.jpeg", + "profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/611138516/toeccqnahbpmr0sw9ybv.jpeg", + "profile_background_tile": true, + "profile_image_url": "http://pbs.twimg.com/profile_images/3253137427/3524557d21ef2c04871e985d4d136bdb_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/3253137427/3524557d21ef2c04871e985d4d136bdb_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/67661086/1385608347", + "profile_link_color": "ED1313", + "profile_sidebar_border_color": "FFFFFF", + "profile_sidebar_fill_color": "E0FF92", + "profile_text_color": "000000", + "profile_use_background_image": true, + "default_profile": false, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 4, + "favorite_count": 2, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [ + { + "url": "http://t.co/HLX9mHcQwe", + "expanded_url": "http://is.gd/H3OgTO", + "display_url": "is.gd/H3OgTO", + "indices": [ + 57, + 79 + ] + } + ], + "user_mentions": [], + "media": [ + { + "id": 505866668485386240, + "id_str": "505866668485386241", + "indices": [ + 80, + 102 + ], + "media_url": "http://pbs.twimg.com/media/BwUzDgbIIAEgvhD.jpg", + "media_url_https": "https://pbs.twimg.com/media/BwUzDgbIIAEgvhD.jpg", + "url": "http://t.co/fVVOSML5s8", + "display_url": "pic.twitter.com/fVVOSML5s8", + "expanded_url": "http://twitter.com/fightcensorship/status/505866670356070401/photo/1", + "type": "photo", + "sizes": { + "large": { + "w": 640, + "h": 554, + "resize": "fit" + }, + "medium": { + "w": 600, + "h": 519, + "resize": "fit" + }, + "thumb": { + "w": 150, + "h": 150, + "resize": "crop" + }, + "small": { + "w": 340, + "h": 294, + "resize": "fit" + } + } + } + ] + }, + "favorited": false, + "retweeted": false, + "possibly_sensitive": false, + "lang": "zh" + }, + "retweet_count": 4, + "favorite_count": 0, + "entities": { + "hashtags": [], + "symbols": [], + "urls": [ + { + "url": "http://t.co/HLX9mHcQwe", + "expanded_url": "http://is.gd/H3OgTO", + "display_url": "is.gd/H3OgTO", + "indices": [ + 78, + 100 + ] + } + ], + "user_mentions": [ + { + "screen_name": "fightcensorship", + "name": "※范强※法特姗瑟希蒲※", + "id": 67661086, + "id_str": "67661086", + "indices": [ + 3, + 19 + ] + } + ], + "media": [ + { + "id": 505866668485386240, + "id_str": "505866668485386241", + "indices": [ + 101, + 123 + ], + "media_url": "http://pbs.twimg.com/media/BwUzDgbIIAEgvhD.jpg", + "media_url_https": "https://pbs.twimg.com/media/BwUzDgbIIAEgvhD.jpg", + "url": "http://t.co/fVVOSML5s8", + "display_url": "pic.twitter.com/fVVOSML5s8", + "expanded_url": "http://twitter.com/fightcensorship/status/505866670356070401/photo/1", + "type": "photo", + "sizes": { + "large": { + "w": 640, + "h": 554, + "resize": "fit" + }, + "medium": { + "w": 600, + "h": 519, + "resize": "fit" + }, + "thumb": { + "w": 150, + "h": 150, + "resize": "crop" + }, + "small": { + "w": 340, + "h": 294, + "resize": "fit" + } + }, + "source_status_id": 505866670356070400, + "source_status_id_str": "505866670356070401" + } + ] + }, + "favorited": false, + "retweeted": false, + "possibly_sensitive": false, + "lang": "zh" + }, + { + "metadata": { + "result_type": "recent", + "iso_language_code": "ja" + }, + "created_at": "Sun Aug 31 00:28:56 +0000 2014", + "id": 505874847260352500, + "id_str": "505874847260352513", + "text": "【マイリスト】【彩りりあ】妖怪体操第一 踊ってみた【反転】 http://t.co/PjL9if8OZC #sm24357625", + "source": "ニコニコ動画", + "truncated": false, + "in_reply_to_status_id": null, + "in_reply_to_status_id_str": null, + "in_reply_to_user_id": null, + "in_reply_to_user_id_str": null, + "in_reply_to_screen_name": null, + "user": { + "id": 1609789375, + "id_str": "1609789375", + "name": "食いしん坊前ちゃん", + "screen_name": "2no38mae", + "location": "ニノと二次元の間", + "description": "ニコ動で踊り手やってます!!応援本当に嬉しいですありがとうございます!! ぽっちゃりだけど前向きに頑張る腐女子です。嵐と弱虫ペダルが大好き!【お返事】りぷ(基本は)”○” DM (同業者様を除いて)”×” 動画の転載は絶対にやめてください。 ブログ→http://t.co/8E91tqoeKX  ", + "url": "http://t.co/ulD2e9mcwb", + "entities": { + "url": { + "urls": [ + { + "url": "http://t.co/ulD2e9mcwb", + "expanded_url": "http://www.nicovideo.jp/mylist/37917495", + "display_url": "nicovideo.jp/mylist/37917495", + "indices": [ + 0, + 22 + ] + } + ] + }, + "description": { + "urls": [ + { + "url": "http://t.co/8E91tqoeKX", + "expanded_url": "http://ameblo.jp/2no38mae/", + "display_url": "ameblo.jp/2no38mae/", + "indices": [ + 125, + 147 + ] + } + ] + } + }, + "protected": false, + "followers_count": 560, + "friends_count": 875, + "listed_count": 11, + "created_at": "Sun Jul 21 05:09:43 +0000 2013", + "favourites_count": 323, + "utc_offset": null, + "time_zone": null, + "geo_enabled": false, + "verified": false, + "statuses_count": 3759, + "lang": "ja", + "contributors_enabled": false, + "is_translator": false, + "is_translation_enabled": false, + "profile_background_color": "F2C6E4", + "profile_background_image_url": "http://pbs.twimg.com/profile_background_images/378800000029400927/114b242f5d838ec7cb098ea5db6df413.jpeg", + "profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/378800000029400927/114b242f5d838ec7cb098ea5db6df413.jpeg", + "profile_background_tile": false, + "profile_image_url": "http://pbs.twimg.com/profile_images/487853237723095041/LMBMGvOc_normal.jpeg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/487853237723095041/LMBMGvOc_normal.jpeg", + "profile_banner_url": "https://pbs.twimg.com/profile_banners/1609789375/1375752225", + "profile_link_color": "FF9EDD", + "profile_sidebar_border_color": "FFFFFF", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "default_profile": false, + "default_profile_image": false, + "following": false, + "follow_request_sent": false, + "notifications": false + }, + "geo": null, + "coordinates": null, + "place": null, + "contributors": null, + "retweet_count": 0, + "favorite_count": 0, + "entities": { + "hashtags": [ + { + "text": "sm24357625", + "indices": [ + 53, + 64 + ] + } + ], + "symbols": [], + "urls": [ + { + "url": "http://t.co/PjL9if8OZC", + "expanded_url": "http://nico.ms/sm24357625", + "display_url": "nico.ms/sm24357625", + "indices": [ + 30, + 52 + ] + } + ], + "user_mentions": [] + }, + "favorited": false, + "retweeted": false, + "possibly_sensitive": false, + "lang": "ja" + } + ], + "search_metadata": { + "completed_in": 0.087, + "max_id": 505874924095815700, + "max_id_str": "505874924095815681", + "next_results": "?max_id=505874847260352512&q=%E4%B8%80&count=100&include_entities=1", + "query": "%E4%B8%80", + "refresh_url": "?since_id=505874924095815681&q=%E4%B8%80&include_entities=1", + "count": 100, + "since_id": 0, + "since_id_str": "0" + } +} \ No newline at end of file diff --git a/benchmark/encoder.rb b/benchmark/encoder.rb new file mode 100644 index 00000000000000..8d997b84cce909 --- /dev/null +++ b/benchmark/encoder.rb @@ -0,0 +1,53 @@ +require "benchmark/ips" +require "json" +require "oj" +require "rapidjson" + +if ENV["ONLY"] + RUN = ENV["ONLY"].split(/[,: ]/).map{|x| [x.to_sym, true] }.to_h + RUN.default = false +elsif ENV["EXCEPT"] + RUN = ENV["EXCEPT"].split(/[,: ]/).map{|x| [x.to_sym, false] }.to_h + RUN.default = true +else + RUN = Hash.new(true) +end + +def implementations(ruby_obj) + { + json: ["json", proc { JSON.dump(ruby_obj) }], + oj: ["oj", proc { Oj.dump(ruby_obj) }], + rapidjson: ["rapidjson", proc { RapidJSON.dump(ruby_obj) }], + } +end + +def benchmark_encoding(benchmark_name, ruby_obj, check_expected: true) + json_output = JSON.dump(ruby_obj) + puts "== Encoding #{benchmark_name} (#{json_output.bytesize} bytes)" + + Benchmark.ips do |x| + expected = ::JSON.dump(ruby_obj) if check_expected + implementations(ruby_obj).select { |name| RUN[name] }.values.each do |name, block| + begin + result = block.call + if check_expected && expected != result + puts "#{name} does not match expected output. Skipping" + next + end + rescue => error + puts "#{name} unsupported (#{error})" + next + end + x.report(name, &block) + end + x.compare!(order: :baseline) + end + puts +end + +benchmark_encoding "small nested array", [[1,2,3,4,5]]*10 +benchmark_encoding "small hash", { "username" => "jhawthorn", "id" => 123, "event" => "wrote json serializer" } +benchmark_encoding "twitter.json", JSON.load_file("#{__dir__}/data/twitter.json") +benchmark_encoding "citm_catalog.json", JSON.load_file("#{__dir__}/data/citm_catalog.json") +benchmark_encoding "canada.json", JSON.load_file("#{__dir__}/data/canada.json"), check_expected: false +benchmark_encoding "many #to_json calls", [{Object.new => Object.new, 12 => 54.3, Integer => Float, Time.now => Date.today}] * 20 diff --git a/benchmark/parser.rb b/benchmark/parser.rb new file mode 100644 index 00000000000000..1c26ed8d407789 --- /dev/null +++ b/benchmark/parser.rb @@ -0,0 +1,39 @@ +require "benchmark/ips" +require "json" +require "oj" +require "rapidjson" + +if ENV["ONLY"] + RUN = ENV["ONLY"].split(/[,: ]/).map{|x| [x.to_sym, true] }.to_h + RUN.default = false +elsif ENV["EXCEPT"] + RUN = ENV["EXCEPT"].split(/[,: ]/).map{|x| [x.to_sym, false] }.to_h + RUN.default = true +else + RUN = Hash.new(true) +end + +def benchmark_parsing(name, json_output) + puts "== Parsing #{name} (#{json_output.size} bytes)" + + Benchmark.ips do |x| + x.report("json") { JSON.parse(json_output) } if RUN[:json] + x.report("oj") { Oj.load(json_output) } if RUN[:oj] + x.report("oj strict") { Oj.strict_load(json_output) } if RUN[:oj] + x.report("Oj::Parser") { Oj::Parser.usual.parse(json_output) } if RUN[:oj] + x.report("rapidjson") { RapidJSON.parse(json_output) } if RUN[:rapidjson] + x.compare!(order: :baseline) + end + puts +end + +benchmark_parsing "small nested array", JSON.dump([[1,2,3,4,5]]*10) +benchmark_parsing "small hash", JSON.dump({ "username" => "jhawthorn", "id" => 123, "event" => "wrote json serializer" }) + +benchmark_parsing "test from oj", < Date: Tue, 8 Oct 2024 15:36:58 +0900 Subject: [PATCH 754/829] `rb_fix_mul_fix` needs internal/bits.h for `MUL_OVERFLOW_FIXNUM_P` --- common.mk | 1 + internal/fixnum.h | 1 + 2 files changed, 2 insertions(+) diff --git a/common.mk b/common.mk index 1d3766a8f4eafc..de7b553deee2ef 100644 --- a/common.mk +++ b/common.mk @@ -15743,6 +15743,7 @@ rjit_c.$(OBJEXT): $(hdrdir)/ruby/ruby.h rjit_c.$(OBJEXT): $(srcdir)/rjit_c.rb rjit_c.$(OBJEXT): $(top_srcdir)/internal/array.h rjit_c.$(OBJEXT): $(top_srcdir)/internal/basic_operators.h +rjit_c.$(OBJEXT): $(top_srcdir)/internal/bits.h rjit_c.$(OBJEXT): $(top_srcdir)/internal/class.h rjit_c.$(OBJEXT): $(top_srcdir)/internal/compile.h rjit_c.$(OBJEXT): $(top_srcdir)/internal/compilers.h diff --git a/internal/fixnum.h b/internal/fixnum.h index 8c251adef17085..b78e31460eee1a 100644 --- a/internal/fixnum.h +++ b/internal/fixnum.h @@ -10,6 +10,7 @@ */ #include "ruby/internal/config.h" /* for HAVE_LONG_LONG */ #include /* for CHAR_BIT */ +#include "internal/bits.h" /* for MUL_OVERFLOW_FIXNUM_P */ #include "internal/compilers.h" /* for __has_builtin */ #include "ruby/internal/stdbool.h" /* for bool */ #include "ruby/intern.h" /* for rb_big_mul */ From 9a90cd228466ec088d6f0da8d1aa065f03daa7c8 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Tue, 8 Oct 2024 15:41:28 +0900 Subject: [PATCH 755/829] Cast via `uintptr_t` function pointer between object pointer - ISO C forbids conversion of function pointer to object pointer type - ISO C forbids conversion of object pointer to function pointer type --- builtin.h | 2 +- compile.c | 2 +- coroutine/amd64/Context.h | 2 +- coroutine/arm32/Context.h | 2 +- coroutine/arm64/Context.h | 3 ++- coroutine/loongarch64/Context.h | 2 +- coroutine/riscv64/Context.h | 2 +- coroutine/win32/Context.h | 2 +- coroutine/win64/Context.h | 2 +- coroutine/x86/Context.h | 2 +- dln.c | 4 ++-- ext/-test-/fatal/invalid.c | 4 ++-- gc.c | 8 +++++--- include/ruby/internal/gc.h | 2 +- prism_compile.c | 2 +- rjit_c.c | 2 +- vm_insnhelper.c | 3 ++- vm_trace.c | 2 +- yjit.c | 6 +++--- 19 files changed, 29 insertions(+), 25 deletions(-) diff --git a/builtin.h b/builtin.h index 24aa7c2fdb2fca..f23c0a7dad6788 100644 --- a/builtin.h +++ b/builtin.h @@ -15,7 +15,7 @@ struct rb_builtin_function { #define RB_BUILTIN_FUNCTION(_i, _name, _fname, _arity) {\ .name = _i < 0 ? NULL : #_name, \ - .func_ptr = (void *)_fname, \ + .func_ptr = (void *)(uintptr_t)_fname, \ .argc = _arity, \ .index = _i, \ } diff --git a/compile.c b/compile.c index 5434a0cf05c019..6e78b075182742 100644 --- a/compile.c +++ b/compile.c @@ -9141,7 +9141,7 @@ compile_builtin_function_call(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NOD if (cconst) { typedef VALUE(*builtin_func0)(void *, VALUE); - VALUE const_val = (*(builtin_func0)bf->func_ptr)(NULL, Qnil); + VALUE const_val = (*(builtin_func0)(uintptr_t)bf->func_ptr)(NULL, Qnil); ADD_INSN1(ret, line_node, putobject, const_val); return COMPILE_OK; } diff --git a/coroutine/amd64/Context.h b/coroutine/amd64/Context.h index 44daa4e01a8861..65aa6383044973 100644 --- a/coroutine/amd64/Context.h +++ b/coroutine/amd64/Context.h @@ -69,7 +69,7 @@ static inline void coroutine_initialize( context->stack_pointer = (void**)((uintptr_t)top & ~0xF); *--context->stack_pointer = NULL; - *--context->stack_pointer = (void*)start; + *--context->stack_pointer = (void*)(uintptr_t)start; context->stack_pointer -= COROUTINE_REGISTERS; memset(context->stack_pointer, 0, sizeof(void*) * COROUTINE_REGISTERS); diff --git a/coroutine/arm32/Context.h b/coroutine/arm32/Context.h index 09410eb25dc4c4..7529dd2efc74a5 100644 --- a/coroutine/arm32/Context.h +++ b/coroutine/arm32/Context.h @@ -44,7 +44,7 @@ static inline void coroutine_initialize( char * top = (char*)stack + size; context->stack_pointer = (void**)((uintptr_t)top & ~0xF); - *--context->stack_pointer = (void*)start; + *--context->stack_pointer = (void*)(uintptr_t)start; context->stack_pointer -= COROUTINE_REGISTERS; memset(context->stack_pointer, 0, sizeof(void*) * COROUTINE_REGISTERS); diff --git a/coroutine/arm64/Context.h b/coroutine/arm64/Context.h index eb66fbea0f4a56..b6ca5b8dde385a 100644 --- a/coroutine/arm64/Context.h +++ b/coroutine/arm64/Context.h @@ -86,7 +86,8 @@ static inline void coroutine_initialize( context->stack_pointer -= COROUTINE_REGISTERS; memset(context->stack_pointer, 0, sizeof(void*) * COROUTINE_REGISTERS); - context->stack_pointer[0x98 / 8] = ptrauth_sign_instruction_addr((void*)start, (void*)top); + void *addr = (void*)(uintptr_t)start; + context->stack_pointer[0x98 / 8] = ptrauth_sign_instruction_addr(addr, (void*)top); } struct coroutine_context * coroutine_transfer(struct coroutine_context * current, struct coroutine_context * target); diff --git a/coroutine/loongarch64/Context.h b/coroutine/loongarch64/Context.h index 668c9a965e4174..82b85b36e9e411 100644 --- a/coroutine/loongarch64/Context.h +++ b/coroutine/loongarch64/Context.h @@ -36,7 +36,7 @@ static inline void coroutine_initialize( context->stack_pointer -= COROUTINE_REGISTERS; memset(context->stack_pointer, 0, sizeof(void*) * COROUTINE_REGISTERS); - context->stack_pointer[0x90 / 8] = (void*)start; + context->stack_pointer[0x90 / 8] = (void*)(uintptr_t)start; } struct coroutine_context * coroutine_transfer(struct coroutine_context * current, struct coroutine_context * target); diff --git a/coroutine/riscv64/Context.h b/coroutine/riscv64/Context.h index 9ce1140e0b826d..3660fb5577a43e 100644 --- a/coroutine/riscv64/Context.h +++ b/coroutine/riscv64/Context.h @@ -36,7 +36,7 @@ static inline void coroutine_initialize( context->stack_pointer -= COROUTINE_REGISTERS; memset(context->stack_pointer, 0, sizeof(void*) * COROUTINE_REGISTERS); - context->stack_pointer[0xc0 / 8] = (void*)start; + context->stack_pointer[0xc0 / 8] = (void*)(uintptr_t)start; } struct coroutine_context * coroutine_transfer(struct coroutine_context * current, struct coroutine_context * target); diff --git a/coroutine/win32/Context.h b/coroutine/win32/Context.h index 902fd1246f0876..243ae5a43b1420 100644 --- a/coroutine/win32/Context.h +++ b/coroutine/win32/Context.h @@ -45,7 +45,7 @@ static inline void coroutine_initialize( char * top = (char*)stack + size; context->stack_pointer = (void**)((uintptr_t)top & ~0xF); - *--context->stack_pointer = (void*)start; + *--context->stack_pointer = (void*)(uintptr_t)start; /* Windows Thread Information Block */ *--context->stack_pointer = (void*)0xFFFFFFFF; /* fs:[0] */ diff --git a/coroutine/win64/Context.h b/coroutine/win64/Context.h index d85ebf8e0e48c3..c5cab729f8230a 100644 --- a/coroutine/win64/Context.h +++ b/coroutine/win64/Context.h @@ -53,7 +53,7 @@ static inline void coroutine_initialize( /* Return address */ *--context->stack_pointer = 0; - *--context->stack_pointer = (void*)start; + *--context->stack_pointer = (void*)(uintptr_t)start; *--context->stack_pointer = (void*)coroutine_trampoline; /* Windows Thread Information Block */ diff --git a/coroutine/x86/Context.h b/coroutine/x86/Context.h index d98eaf6486165a..f33b338eabf2a7 100644 --- a/coroutine/x86/Context.h +++ b/coroutine/x86/Context.h @@ -45,7 +45,7 @@ static inline void coroutine_initialize( context->stack_pointer = (void**)((uintptr_t)top & ~0xF); *--context->stack_pointer = NULL; - *--context->stack_pointer = (void*)start; + *--context->stack_pointer = (void*)(uintptr_t)start; context->stack_pointer -= COROUTINE_REGISTERS; memset(context->stack_pointer, 0, sizeof(void*) * COROUTINE_REGISTERS); diff --git a/dln.c b/dln.c index db6ea5aa0fb03d..043815148bfe8f 100644 --- a/dln.c +++ b/dln.c @@ -437,7 +437,7 @@ dln_sym(void *handle, const char *symbol) #endif } -static void * +static uintptr_t dln_sym_func(void *handle, const char *symbol) { void *func = dln_sym(handle, symbol); @@ -453,7 +453,7 @@ dln_sym_func(void *handle, const char *symbol) #endif dln_loaderror("%s - %s", error, symbol); } - return func; + return (uintptr_t)func; } #define dln_sym_callable(rettype, argtype, handle, symbol) \ diff --git a/ext/-test-/fatal/invalid.c b/ext/-test-/fatal/invalid.c index f0726edb521152..393465416a0f6c 100644 --- a/ext/-test-/fatal/invalid.c +++ b/ext/-test-/fatal/invalid.c @@ -1,9 +1,9 @@ #include #if SIZEOF_LONG == SIZEOF_VOIDP -# define NUM2PTR(x) (void *)NUM2ULONG(x) +# define NUM2PTR(x) NUM2ULONG(x) #elif SIZEOF_LONG_LONG == SIZEOF_VOIDP -# define NUM2PTR(x) (void *)NUM2ULL(x) +# define NUM2PTR(x) NUM2ULL(x) #endif static VALUE diff --git a/gc.c b/gc.c index c4381e2315ddbb..c31da44df4cef3 100644 --- a/gc.c +++ b/gc.c @@ -2478,6 +2478,8 @@ rb_gc_mark_roots(void *objspace, const char **categoryp) #undef MARK_CHECKPOINT } +#define TYPED_DATA_REFS_OFFSET_LIST(d) (size_t *)(uintptr_t)RTYPEDDATA(d)->type->function.dmark + void rb_gc_mark_children(void *objspace, VALUE obj) { @@ -2597,7 +2599,7 @@ rb_gc_mark_children(void *objspace, VALUE obj) if (ptr) { if (RTYPEDDATA_P(obj) && gc_declarative_marking_p(RTYPEDDATA(obj)->type)) { - size_t *offset_list = (size_t *)RTYPEDDATA(obj)->type->function.dmark; + size_t *offset_list = TYPED_DATA_REFS_OFFSET_LIST(obj); for (size_t offset = *offset_list; offset != RUBY_REF_END; offset = *offset_list++) { gc_mark_internal(*(VALUE *)((char *)ptr + offset)); @@ -3254,7 +3256,7 @@ rb_gc_update_object_references(void *objspace, VALUE obj) void *const ptr = RTYPEDDATA_P(obj) ? RTYPEDDATA_GET_DATA(obj) : DATA_PTR(obj); if (ptr) { if (RTYPEDDATA_P(obj) && gc_declarative_marking_p(RTYPEDDATA(obj)->type)) { - size_t *offset_list = (size_t *)RTYPEDDATA(obj)->type->function.dmark; + size_t *offset_list = TYPED_DATA_REFS_OFFSET_LIST(obj); for (size_t offset = *offset_list; offset != RUBY_REF_END; offset = *offset_list++) { VALUE *ref = (VALUE *)((char *)ptr + offset); @@ -3926,7 +3928,7 @@ rb_raw_obj_info_buitin_type(char *const buff, const size_t buff_size, const VALU cme ? rb_id2name(cme->called_id) : "", cme ? (METHOD_ENTRY_INVALIDATED(cme) ? " [inv]" : "") : "", (void *)cme, - (void *)vm_cc_call(cc)); + (void *)(uintptr_t)vm_cc_call(cc)); break; } default: diff --git a/include/ruby/internal/gc.h b/include/ruby/internal/gc.h index 462f416af21cfd..5ab3bb266e242f 100644 --- a/include/ruby/internal/gc.h +++ b/include/ruby/internal/gc.h @@ -45,7 +45,7 @@ RBIMPL_SYMBOL_EXPORT_BEGIN() #define RUBY_REF_EDGE(s, p) offsetof(s, p) -#define RUBY_REFS_LIST_PTR(l) (RUBY_DATA_FUNC)(l) +#define RUBY_REFS_LIST_PTR(l) (RUBY_DATA_FUNC)(uintptr_t)(l) #define RUBY_REF_END SIZE_MAX #define RUBY_REFERENCES(t) static const size_t t[] #define RUBY_REFERENCES_START(t) RUBY_REFERENCES(t) = { diff --git a/prism_compile.c b/prism_compile.c index 5f5e0aa6fe7c41..aca358f8719989 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -3557,7 +3557,7 @@ retry:; if (cconst) { typedef VALUE(*builtin_func0)(void *, VALUE); - VALUE const_val = (*(builtin_func0)bf->func_ptr)(NULL, Qnil); + VALUE const_val = (*(builtin_func0)(uintptr_t)bf->func_ptr)(NULL, Qnil); PUSH_INSN1(ret, *node_location, putobject, const_val); return COMPILE_OK; } diff --git a/rjit_c.c b/rjit_c.c index e9863129a1c767..50eb263559d594 100644 --- a/rjit_c.c +++ b/rjit_c.c @@ -66,7 +66,7 @@ rjit_reserve_addr_space(uint32_t mem_size) // On Linux #if defined(MAP_FIXED_NOREPLACE) && defined(_SC_PAGESIZE) uint32_t const page_size = (uint32_t)sysconf(_SC_PAGESIZE); - uint8_t *const cfunc_sample_addr = (void *)&rjit_reserve_addr_space; + uint8_t *const cfunc_sample_addr = (void *)(uintptr_t)&rjit_reserve_addr_space; uint8_t *const probe_region_end = cfunc_sample_addr + INT32_MAX; // Align the requested address to page size uint8_t *req_addr = align_ptr(cfunc_sample_addr, page_size); diff --git a/vm_insnhelper.c b/vm_insnhelper.c index 543f31a3b1f56e..ea4ce49b63c305 100644 --- a/vm_insnhelper.c +++ b/vm_insnhelper.c @@ -7339,7 +7339,8 @@ vm_invoke_builtin_delegate(rb_execution_context_t *ec, rb_control_frame_t *cfp, for (int i=0; iargc; i++) { ruby_debug_printf(":%s ", rb_id2name(ISEQ_BODY(cfp->iseq)->local_table[i+start_index])); } - ruby_debug_printf("\n" "%s %s(%d):%p\n", RUBY_FUNCTION_NAME_STRING, bf->name, bf->argc, bf->func_ptr); + ruby_debug_printf("\n" "%s %s(%d):%p\n", RUBY_FUNCTION_NAME_STRING, bf->name, bf->argc, + (void *)(uintptr_t)bf->func_ptr); } if (bf->argc == 0) { diff --git a/vm_trace.c b/vm_trace.c index 7f3f3cd6f4facb..f7baf3b3092659 100644 --- a/vm_trace.c +++ b/vm_trace.c @@ -1760,7 +1760,7 @@ rb_postponed_job_preregister(unsigned int flags, rb_postponed_job_func_t func, v rb_postponed_job_queues_t *pjq = GET_VM()->postponed_job_queue; for (unsigned int i = 0; i < PJOB_TABLE_SIZE; i++) { /* Try and set this slot to equal `func` */ - rb_postponed_job_func_t existing_func = (rb_postponed_job_func_t)RUBY_ATOMIC_PTR_CAS(pjq->table[i], NULL, (void *)func); + rb_postponed_job_func_t existing_func = (rb_postponed_job_func_t)(uintptr_t)RUBY_ATOMIC_PTR_CAS(pjq->table[i].func, NULL, (void *)(uintptr_t)func); if (existing_func == NULL || existing_func == func) { /* Either this slot was NULL, and we set it to func, or, this slot was already equal to func. * In either case, clobber the data with our data. Note that concurrent calls to diff --git a/yjit.c b/yjit.c index dedd06dd2ddf19..93d8fe5c9f18be 100644 --- a/yjit.c +++ b/yjit.c @@ -272,7 +272,7 @@ rb_yjit_reserve_addr_space(uint32_t mem_size) // On Linux #if defined(MAP_FIXED_NOREPLACE) && defined(_SC_PAGESIZE) uint32_t const page_size = (uint32_t)sysconf(_SC_PAGESIZE); - uint8_t *const cfunc_sample_addr = (void *)&rb_yjit_reserve_addr_space; + uint8_t *const cfunc_sample_addr = (void *)(uintptr_t)&rb_yjit_reserve_addr_space; uint8_t *const probe_region_end = cfunc_sample_addr + INT32_MAX; // Align the requested address to page size uint8_t *req_addr = align_ptr(cfunc_sample_addr, page_size); @@ -583,7 +583,7 @@ rb_get_mct_argc(const rb_method_cfunc_t *mct) void * rb_get_mct_func(const rb_method_cfunc_t *mct) { - return (void*)mct->func; // this field is defined as type VALUE (*func)(ANYARGS) + return (void*)(uintptr_t)mct->func; // this field is defined as type VALUE (*func)(ANYARGS) } const rb_iseq_t * @@ -1139,7 +1139,7 @@ rb_yjit_compile_iseq(const rb_iseq_t *iseq, rb_execution_context_t *ec, bool jit // Compile a block version starting at the current instruction uint8_t *rb_yjit_iseq_gen_entry_point(const rb_iseq_t *iseq, rb_execution_context_t *ec, bool jit_exception); // defined in Rust - uint8_t *code_ptr = rb_yjit_iseq_gen_entry_point(iseq, ec, jit_exception); + uintptr_t code_ptr = (uintptr_t)rb_yjit_iseq_gen_entry_point(iseq, ec, jit_exception); if (jit_exception) { iseq->body->jit_exception = (rb_jit_func_t)code_ptr; From 49ccc31d906d26f980dcedf1197a2e18245ec50e Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Tue, 8 Oct 2024 15:44:40 +0900 Subject: [PATCH 756/829] Add a macro to initialize union `cfunc_type` ``` vm_insnhelper.c:2430:49: error: ISO C prohibits argument conversion to union type [-Wpedantic] 2430 | if (!vm_method_cfunc_is(cd_owner, cd, recv, rb_obj_equal)) { | ^~~~~~~~~~~~ vm_insnhelper.c:2448:42: error: ISO C prohibits argument conversion to union type [-Wpedantic] 2448 | if (cc && check_cfunc(vm_cc_cme(cc), rb_obj_equal)) { | ^~~~~~~~~~~~ ``` and so on. --- vm_insnhelper.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/vm_insnhelper.c b/vm_insnhelper.c index ea4ce49b63c305..d1c4d1ef46e0d1 100644 --- a/vm_insnhelper.c +++ b/vm_insnhelper.c @@ -2309,8 +2309,10 @@ typedef union { VALUE (*f15)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE); VALUE (*fm1)(int, union { VALUE *x; const VALUE *y; } __attribute__((__transparent_union__)), VALUE); } __attribute__((__transparent_union__)) cfunc_type; +# define make_cfunc_type(f) (cfunc_type){.anyargs = (VALUE (*)(ANYARGS))(f)} #else typedef VALUE (*cfunc_type)(ANYARGS); +# define make_cfunc_type(f) (cfunc_type)(f) #endif static inline int @@ -2344,6 +2346,9 @@ vm_method_cfunc_is(const rb_iseq_t *iseq, CALL_DATA cd, VALUE recv, cfunc_type f return check_cfunc(vm_cc_cme(cc), func); } +#define check_cfunc(me, func) check_cfunc(me, make_cfunc_type(func)) +#define vm_method_cfunc_is(iseq, cd, recv, func) vm_method_cfunc_is(iseq, cd, recv, make_cfunc_type(func)) + #define EQ_UNREDEFINED_P(t) BASIC_OP_UNREDEFINED_P(BOP_EQ, t##_REDEFINED_OP_FLAG) static inline bool From 1f39184bc7e564eefc9c6e09e038e20e112bef20 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Tue, 8 Oct 2024 16:12:10 +0900 Subject: [PATCH 757/829] Substitute `coroutine_transfer` with prefixed symbol in Makefile ``` coroutine/arm64/Context.S:31:57: error: invoking macro TOKEN_PASTE argument 1: empty macro arguments are undefined in ISO C90 [-Wpedantic] 31 | .global PREFIXED_SYMBOL(SYMBOL_PREFIX,coroutine_transfer) | ^ ``` --- coroutine/amd64/Context.S | 5 ++--- coroutine/arm32/Context.S | 7 +++---- coroutine/arm64/Context.S | 5 ++--- coroutine/loongarch64/Context.S | 5 ++--- coroutine/ppc/Context.S | 5 ++--- coroutine/ppc64/Context.S | 5 ++--- coroutine/ppc64le/Context.S | 7 +++---- coroutine/riscv64/Context.S | 5 ++--- coroutine/x86/Context.S | 5 ++--- template/Makefile.in | 4 +++- 10 files changed, 23 insertions(+), 30 deletions(-) diff --git a/coroutine/amd64/Context.S b/coroutine/amd64/Context.S index eebf9bf18efcc2..4b94d31f30839f 100644 --- a/coroutine/amd64/Context.S +++ b/coroutine/amd64/Context.S @@ -10,12 +10,11 @@ * one at the bottom of this file */ #define TOKEN_PASTE(x,y) x##y -#define PREFIXED_SYMBOL(prefix,name) TOKEN_PASTE(prefix,name) .text -.globl PREFIXED_SYMBOL(SYMBOL_PREFIX,coroutine_transfer) -PREFIXED_SYMBOL(SYMBOL_PREFIX,coroutine_transfer): +.globl PREFIXED_SYMBOL(coroutine_transfer) +PREFIXED_SYMBOL(coroutine_transfer): #if defined(__CET__) && (__CET__ & 0x01) != 0 /* IBT landing pad */ diff --git a/coroutine/arm32/Context.S b/coroutine/arm32/Context.S index 1850c4c4080602..945e4f82d5d61b 100644 --- a/coroutine/arm32/Context.S +++ b/coroutine/arm32/Context.S @@ -6,16 +6,15 @@ ## #define TOKEN_PASTE(x,y) x##y -#define PREFIXED_SYMBOL(prefix,name) TOKEN_PASTE(prefix,name) .file "Context.S" .text -.globl PREFIXED_SYMBOL(SYMBOL_PREFIX,coroutine_transfer) +.globl PREFIXED_SYMBOL(coroutine_transfer) .align 2 -.type PREFIXED_SYMBOL(SYMBOL_PREFIX,coroutine_transfer),%function +.type PREFIXED_SYMBOL(coroutine_transfer),%function .syntax unified -PREFIXED_SYMBOL(SYMBOL_PREFIX,coroutine_transfer): +PREFIXED_SYMBOL(coroutine_transfer): # Save caller state (8 registers + return address) push {r4-r11,lr} diff --git a/coroutine/arm64/Context.S b/coroutine/arm64/Context.S index 2391333caee064..11f6aa08108baa 100644 --- a/coroutine/arm64/Context.S +++ b/coroutine/arm64/Context.S @@ -6,7 +6,6 @@ ## #define TOKEN_PASTE(x,y) x##y -#define PREFIXED_SYMBOL(prefix,name) TOKEN_PASTE(prefix,name) #if defined(__APPLE__) #define x29 fp @@ -28,8 +27,8 @@ ## See "Providing protection for complex software" for more details about PAC/BTI ## https://developer.arm.com/architectures/learn-the-architecture/providing-protection-for-complex-software -.global PREFIXED_SYMBOL(SYMBOL_PREFIX,coroutine_transfer) -PREFIXED_SYMBOL(SYMBOL_PREFIX,coroutine_transfer): +.global PREFIXED_SYMBOL(coroutine_transfer) +PREFIXED_SYMBOL(coroutine_transfer): #if defined(__ARM_FEATURE_PAC_DEFAULT) && (__ARM_FEATURE_PAC_DEFAULT != 0) # paciasp (it also acts as BTI landing pad, so no need to insert BTI also) diff --git a/coroutine/loongarch64/Context.S b/coroutine/loongarch64/Context.S index 662f5dfb6c7af8..6e10cd032bea8d 100644 --- a/coroutine/loongarch64/Context.S +++ b/coroutine/loongarch64/Context.S @@ -1,11 +1,10 @@ #define TOKEN_PASTE(x,y) x##y -#define PREFIXED_SYMBOL(prefix,name) TOKEN_PASTE(prefix,name) .text .align 2 -.global PREFIXED_SYMBOL(SYMBOL_PREFIX,coroutine_transfer) -PREFIXED_SYMBOL(SYMBOL_PREFIX,coroutine_transfer): +.global PREFIXED_SYMBOL(coroutine_transfer) +PREFIXED_SYMBOL(coroutine_transfer): # Make space on the stack for caller registers addi.d $sp, $sp, -0xa0 diff --git a/coroutine/ppc/Context.S b/coroutine/ppc/Context.S index e2431a9250da21..f44b2419b4dfee 100644 --- a/coroutine/ppc/Context.S +++ b/coroutine/ppc/Context.S @@ -9,15 +9,14 @@ ; To add support for AIX, *BSD or *Linux, please make separate implementations. #define TOKEN_PASTE(x,y) x##y -#define PREFIXED_SYMBOL(prefix,name) TOKEN_PASTE(prefix,name) .machine ppc7400 ; = G4, Rosetta .text -.globl PREFIXED_SYMBOL(SYMBOL_PREFIX,coroutine_transfer) +.globl PREFIXED_SYMBOL(coroutine_transfer) .align 2 -PREFIXED_SYMBOL(SYMBOL_PREFIX,coroutine_transfer): +PREFIXED_SYMBOL(coroutine_transfer): ; Make space on the stack for caller registers ; (Should we rather use red zone? See libphobos example.) subi r1,r1,80 diff --git a/coroutine/ppc64/Context.S b/coroutine/ppc64/Context.S index f8561e0e7d0bee..20a47c61c6914e 100644 --- a/coroutine/ppc64/Context.S +++ b/coroutine/ppc64/Context.S @@ -8,15 +8,14 @@ ; To add support for AIX, *BSD or *Linux, please make separate implementations. #define TOKEN_PASTE(x,y) x##y -#define PREFIXED_SYMBOL(prefix,name) TOKEN_PASTE(prefix,name) .machine ppc64 ; = G5 .text -.globl PREFIXED_SYMBOL(SYMBOL_PREFIX,coroutine_transfer) +.globl PREFIXED_SYMBOL(coroutine_transfer) .align 2 -PREFIXED_SYMBOL(SYMBOL_PREFIX,coroutine_transfer): +PREFIXED_SYMBOL(coroutine_transfer): ; Make space on the stack for caller registers ; (Should we rather use red zone? See libphobos example.) subi r1,r1,160 diff --git a/coroutine/ppc64le/Context.S b/coroutine/ppc64le/Context.S index 61be9efcf0461a..cccd002be5a5ac 100644 --- a/coroutine/ppc64le/Context.S +++ b/coroutine/ppc64le/Context.S @@ -1,12 +1,11 @@ #define TOKEN_PASTE(x,y) x##y -#define PREFIXED_SYMBOL(prefix,name) TOKEN_PASTE(prefix,name) .text .align 2 -.globl PREFIXED_SYMBOL(SYMBOL_PREFIX,coroutine_transfer) -.type PREFIXED_SYMBOL(SYMBOL_PREFIX,coroutine_transfer), @function -PREFIXED_SYMBOL(SYMBOL_PREFIX,coroutine_transfer): +.globl PREFIXED_SYMBOL(coroutine_transfer) +.type PREFIXED_SYMBOL(coroutine_transfer), @function +PREFIXED_SYMBOL(coroutine_transfer): # Make space on the stack for caller registers addi 1,1,-152 diff --git a/coroutine/riscv64/Context.S b/coroutine/riscv64/Context.S index cc4e872f84b3dd..8e7fc74ffc1ee5 100644 --- a/coroutine/riscv64/Context.S +++ b/coroutine/riscv64/Context.S @@ -1,11 +1,10 @@ #define TOKEN_PASTE(x,y) x##y -#define PREFIXED_SYMBOL(prefix,name) TOKEN_PASTE(prefix,name) .text .align 2 -.global PREFIXED_SYMBOL(SYMBOL_PREFIX,coroutine_transfer) -PREFIXED_SYMBOL(SYMBOL_PREFIX,coroutine_transfer): +.global PREFIXED_SYMBOL(coroutine_transfer) +PREFIXED_SYMBOL(coroutine_transfer): # Make space on the stack for caller registers addi sp, sp, -0xd0 diff --git a/coroutine/x86/Context.S b/coroutine/x86/Context.S index f06a417084b4e2..b04e71aa1cbbfa 100644 --- a/coroutine/x86/Context.S +++ b/coroutine/x86/Context.S @@ -6,12 +6,11 @@ ## #define TOKEN_PASTE(x,y) x##y -#define PREFIXED_SYMBOL(prefix,name) TOKEN_PASTE(prefix,name) .text -.globl PREFIXED_SYMBOL(SYMBOL_PREFIX,coroutine_transfer) -PREFIXED_SYMBOL(SYMBOL_PREFIX,coroutine_transfer): +.globl PREFIXED_SYMBOL(coroutine_transfer) +PREFIXED_SYMBOL(coroutine_transfer): # Save caller registers pushl %ebp diff --git a/template/Makefile.in b/template/Makefile.in index 4cc0865ddcd56b..c4e2d6d542d44e 100644 --- a/template/Makefile.in +++ b/template/Makefile.in @@ -452,9 +452,11 @@ gc_impl.$(OBJEXT): gc/$(BUILTIN_GC).c probes.h @$(ECHO) compiling $< $(Q) $(CC) $(CFLAGS) $(XCFLAGS) $(CPPFLAGS) $(COUTFLAG)$@ -c $< +PREFIXED_SYMBOL = name +_PREFIXED_SYMBOL = TOKEN_PASTE($(SYMBOL_PREFIX),name) .$(ASMEXT).$(OBJEXT): @$(ECHO) assembling $< - $(Q) $(CC) $(CFLAGS) $(XCFLAGS) $(CPPFLAGS) $(COUTFLAG)$@ -DSYMBOL_PREFIX=$(SYMBOL_PREFIX) -c $< + $(Q) $(CC) $(CFLAGS) $(XCFLAGS) $(CPPFLAGS) $(COUTFLAG)$@ "-DPREFIXED_SYMBOL(name)=$($(SYMBOL_PREFIX)PREFIXED_SYMBOL)" -c $< .c.$(ASMEXT): @$(ECHO) translating $< From 8ba2c3109c0f80f285b8db2fed10d8f5f026c208 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Tue, 8 Oct 2024 21:25:15 +0900 Subject: [PATCH 758/829] Fix extra semicolon outside of a function in `NO_SANITIZE` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ``` internal/sanitizers.h:57:26: error: ISO C does not allow extra ‘;’ outside of a function [-Wpedantic] 57 | COMPILER_WARNING_PUSH; \ | ^ ``` and so many. Remove semicolons following pragma, and repeat the given declaration at the end to consume a semicolon following the macro call. As many `NO_SANITIZE` calls including bigdecimal that is a gem have a trailing semicolon, it was not able to move the semicolon inside `NO_SANITIZE`. --- internal/sanitizers.h | 7 ++++--- parser_st.c | 3 ++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/internal/sanitizers.h b/internal/sanitizers.h index 94f4e4165a6a0c..1cab12fb527388 100644 --- a/internal/sanitizers.h +++ b/internal/sanitizers.h @@ -54,10 +54,11 @@ # include "internal/warnings.h" # undef NO_SANITIZE # define NO_SANITIZE(x, y) \ - COMPILER_WARNING_PUSH; \ - COMPILER_WARNING_IGNORED(-Wattributes); \ + COMPILER_WARNING_PUSH \ + COMPILER_WARNING_IGNORED(-Wattributes) \ __attribute__((__no_sanitize__(x))) y; \ - COMPILER_WARNING_POP + COMPILER_WARNING_POP \ + y #endif #ifndef NO_SANITIZE diff --git a/parser_st.c b/parser_st.c index 17f669e7634f3e..c2340261226d91 100644 --- a/parser_st.c +++ b/parser_st.c @@ -154,7 +154,8 @@ nonempty_memcpy(void *dest, const void *src, size_t n) _Pragma("GCC diagnostic push") \ _Pragma("GCC diagnostic ignored \"-Wattributes\"") \ __attribute__((__no_sanitize__(x))) y; \ - _Pragma("GCC diagnostic pop") + _Pragma("GCC diagnostic pop") \ + y #endif #ifndef NO_SANITIZE From 02101f473b6d16d0b6d019442c41724e308f493b Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Tue, 8 Oct 2024 23:43:02 +0900 Subject: [PATCH 759/829] rdoc-srcdir: Adjust the version number in the title in .rdoc_options Other command line options are no longer needed usually. --- common.mk | 1 - tool/rdoc-srcdir | 6 ++++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/common.mk b/common.mk index de7b553deee2ef..3000a4931984c4 100644 --- a/common.mk +++ b/common.mk @@ -70,7 +70,6 @@ HTMLOUT = $(EXTOUT)/html CAPIOUT = doc/capi INSTALL_DOC_OPTS = --rdoc-output="$(RDOCOUT)" --html-output="$(HTMLOUT)" RDOC_GEN_OPTS = --no-force-update \ - --title "Documentation for Ruby $(RUBY_API_VERSION)" \ $(empty) INITOBJS = dmyext.$(OBJEXT) dmyenc.$(OBJEXT) diff --git a/tool/rdoc-srcdir b/tool/rdoc-srcdir index 10c63caf9eaae7..304deb67cec502 100755 --- a/tool/rdoc-srcdir +++ b/tool/rdoc-srcdir @@ -9,6 +9,12 @@ invoked = Dir.pwd Dir.chdir(File.dirname(__dir__)) options = RDoc::Options.load_options +options.title = options.title.sub(/Ruby \K.*version/) { + File.read("include/ruby/version.h") + .scan(/^ *# *define +RUBY_API_VERSION_(MAJOR|MINOR) +(\d+)/) + .sort # "MAJOR" < "MINOR", fortunately + .to_h.values.join(".") +} options.parse ARGV options.singleton_class.define_method(:finish) do From 044f6ba23dcee34103b64cc46e28976087188a63 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Tue, 8 Oct 2024 23:51:33 +0900 Subject: [PATCH 760/829] [DOC] Generate HTML documents in CI --- .github/workflows/check_misc.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/workflows/check_misc.yml b/.github/workflows/check_misc.yml index 7da7dd0af7496e..4ff38f1c1fb831 100644 --- a/.github/workflows/check_misc.yml +++ b/.github/workflows/check_misc.yml @@ -111,6 +111,18 @@ jobs: steps.diff.outputs.update }} + - name: Generate docs + id: docs + run: | + ruby -W0 --disable-gems -I./lib tool/rdoc-srcdir --op html . + echo htmlout=ruby-html-${GITHUB_SHA:0:10} >> $GITHUB_OUTPUT + + - name: Upload docs + uses: actions/upload-artifact@v4 + with: + path: html + name: ${{ steps.docs.outputs.htmlout }} + - uses: ./.github/actions/slack with: SLACK_WEBHOOK_URL: ${{ secrets.SIMPLER_ALERTS_URL }} # ruby-lang slack: ruby/simpler-alerts-bot From 45edfa73ce0306d43f87c62453b2ab46e5c4357d Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Mon, 7 Oct 2024 19:41:07 -0500 Subject: [PATCH 761/829] [DOC] Tweaks for Array#unshift --- array.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/array.c b/array.c index 0bd08028fcc957..a34409aaedc07e 100644 --- a/array.c +++ b/array.c @@ -1682,14 +1682,16 @@ ary_ensure_room_for_unshift(VALUE ary, int argc) /* * call-seq: - * array.unshift(*objects) -> self + * unshift(*objects) -> self + * prepend(*objects) -> self * * Prepends the given +objects+ to +self+: * * a = [:foo, 'bar', 2] * a.unshift(:bam, :bat) # => [:bam, :bat, :foo, "bar", 2] * - * Related: #push, #pop, #shift. + * Related: Array#shift; + * see also {Methods for Assigning}[rdoc-ref:Array@Methods+for+Assigning]. */ VALUE From a3208330135850c56b6e2e590491cb80bfc839df Mon Sep 17 00:00:00 2001 From: Burdette Lamar Date: Tue, 8 Oct 2024 10:10:49 -0500 Subject: [PATCH 762/829] [DOC] Tweaks for Array#pop (#11821) --- array.c | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/array.c b/array.c index a34409aaedc07e..9d6d2cf82ad711 100644 --- a/array.c +++ b/array.c @@ -1448,33 +1448,32 @@ rb_ary_pop(VALUE ary) /* * call-seq: - * array.pop -> object or nil - * array.pop(n) -> new_array + * pop -> object or nil + * pop(count) -> new_array * - * Removes and returns trailing elements. + * Removes and returns trailing elements of +self+. * - * When no argument is given and +self+ is not empty, - * removes and returns the last element: + * With no argument given, removes and returns the last element, if available; + * otherwise returns +nil+: * * a = [:foo, 'bar', 2] - * a.pop # => 2 - * a # => [:foo, "bar"] - * - * Returns +nil+ if the array is empty. + * a.pop # => 2 + * a # => [:foo, "bar"] + * [].pop # => nil * - * When a non-negative Integer argument +n+ is given and is in range, + * With non-negative integer argument +count+ given, + * returns a new array containing the trailing +count+ elements of +self+, as available: * - * removes and returns the last +n+ elements in a new +Array+: * a = [:foo, 'bar', 2] * a.pop(2) # => ["bar", 2] - * - * If +n+ is positive and out of range, - * removes and returns all elements: + * a # => [:foo] * * a = [:foo, 'bar', 2] * a.pop(50) # => [:foo, "bar", 2] + * a # => [] * - * Related: #push, #shift, #unshift. + * Related: Array#push; + * see also {Methods for Deleting}[rdoc-ref:Array@Methods+for+Deleting]. */ static VALUE From cb19dfca2c9b315d29c5303203d8d0d1bbbd8511 Mon Sep 17 00:00:00 2001 From: tomoya ishida Date: Wed, 9 Oct 2024 00:15:39 +0900 Subject: [PATCH 763/829] [ruby/irb] Change debug test workaround to use ENV RUBY_DEBUG_TEST_UI (https://github.com/ruby/irb/pull/1014) https://github.com/ruby/irb/commit/9933584754 --- lib/irb/input-method.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/irb/input-method.rb b/lib/irb/input-method.rb index 210d3da78955f6..38f05d771687f9 100644 --- a/lib/irb/input-method.rb +++ b/lib/irb/input-method.rb @@ -67,7 +67,9 @@ def initialize # # See IO#gets for more information. def gets - puts if @stdout.tty? # workaround for debug compatibility test + # Workaround for debug compatibility test https://github.com/ruby/debug/pull/1100 + puts if ENV['RUBY_DEBUG_TEST_UI'] + print @prompt line = @stdin.gets @line[@line_no += 1] = line From ded078c2c44e5a1f9f4191a7021cfe394ac93ba2 Mon Sep 17 00:00:00 2001 From: Alan Wu Date: Tue, 8 Oct 2024 11:44:59 -0400 Subject: [PATCH 764/829] YJIT: Fastpath for Module#name (#11819) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Module#name shows up as a top C method callee in lobsters so probably common enough. It's also easy to substitute thanks to rb_mod_name() already having no GC yield points. klass = BasicObject 50_000_000.times { klass.name } Benchmark 1: /.rubies/post/bin/ruby --yjit mod_name.rb Time (mean ± σ): 1.433 s ± 0.010 s [User: 1.410 s, System: 0.010 s] Range (min … max): 1.421 s … 1.449 s 10 runs Benchmark 2: /.rubies/mstr/bin/ruby --yjit mod_name.rb Time (mean ± σ): 1.491 s ± 0.012 s [User: 1.468 s, System: 0.010 s] Range (min … max): 1.470 s … 1.511 s 10 runs Summary /.rubies/post/bin/ruby --yjit mod_name.rb ran 1.04 ± 0.01 times faster than /.rubies/mstr/bin/ruby --yjit mod_name.rb --- variable.c | 3 +++ yjit/bindgen/src/main.rs | 1 + yjit/src/codegen.rs | 28 ++++++++++++++++++++++++++++ yjit/src/cruby_bindings.inc.rs | 1 + 4 files changed, 33 insertions(+) diff --git a/variable.c b/variable.c index 4e55427ff57494..bcdf2fb0701f39 100644 --- a/variable.c +++ b/variable.c @@ -97,6 +97,8 @@ rb_namespace_p(VALUE obj) * to not be anonymous. *permanent is set to 1 * if +classpath+ has no anonymous components. There is no builtin * Ruby level APIs that can change a permanent +classpath+. + * + * YJIT needs this function to not allocate. */ static VALUE classname(VALUE klass, bool *permanent) @@ -127,6 +129,7 @@ rb_mod_name0(VALUE klass, bool *permanent) VALUE rb_mod_name(VALUE mod) { + // YJIT needs this function to not allocate. bool permanent; return classname(mod, &permanent); } diff --git a/yjit/bindgen/src/main.rs b/yjit/bindgen/src/main.rs index ea60dd23b91f08..28e7ac3e9c7a63 100644 --- a/yjit/bindgen/src/main.rs +++ b/yjit/bindgen/src/main.rs @@ -378,6 +378,7 @@ fn main() { .allowlist_function("rb_attr_get") .allowlist_function("rb_ivar_defined") .allowlist_function("rb_ivar_get") + .allowlist_function("rb_mod_name") // From internal/vm.h .allowlist_var("rb_vm_insns_count") diff --git a/yjit/src/codegen.rs b/yjit/src/codegen.rs index 746a46903ccd3c..7e69ba32facbe8 100644 --- a/yjit/src/codegen.rs +++ b/yjit/src/codegen.rs @@ -5135,6 +5135,33 @@ fn jit_rb_mod_eqq( return true; } +// Substitution for rb_mod_name(). Returns the name of a module/class. +fn jit_rb_mod_name( + _jit: &mut JITState, + asm: &mut Assembler, + _ci: *const rb_callinfo, + _cme: *const rb_callable_method_entry_t, + _block: Option, + argc: i32, + _known_recv_class: Option, +) -> bool { + if argc != 0 { + return false; + } + + asm_comment!(asm, "Module#name"); + + // rb_mod_name() never allocates, so no preparation needed. + let name = asm.ccall(rb_mod_name as _, vec![asm.stack_opnd(0)]); + + let _ = asm.stack_pop(1); // pop self + // call-seq: mod.name -> string or nil + let ret = asm.stack_push(Type::Unknown); + asm.mov(ret, name); + + true +} + // Codegen for rb_obj_equal() // object identity comparison fn jit_rb_obj_equal( @@ -10373,6 +10400,7 @@ pub fn yjit_reg_method_codegen_fns() { yjit_reg_method(rb_mKernel, "eql?", jit_rb_obj_equal); yjit_reg_method(rb_cModule, "==", jit_rb_obj_equal); yjit_reg_method(rb_cModule, "===", jit_rb_mod_eqq); + yjit_reg_method(rb_cModule, "name", jit_rb_mod_name); yjit_reg_method(rb_cSymbol, "==", jit_rb_obj_equal); yjit_reg_method(rb_cSymbol, "===", jit_rb_obj_equal); yjit_reg_method(rb_cInteger, "==", jit_rb_int_equal); diff --git a/yjit/src/cruby_bindings.inc.rs b/yjit/src/cruby_bindings.inc.rs index ea4c14e512628b..147d30e2026076 100644 --- a/yjit/src/cruby_bindings.inc.rs +++ b/yjit/src/cruby_bindings.inc.rs @@ -1036,6 +1036,7 @@ extern "C" { pub fn rb_str_buf_append(dst: VALUE, src: VALUE) -> VALUE; pub fn rb_str_dup(str_: VALUE) -> VALUE; pub fn rb_str_intern(str_: VALUE) -> VALUE; + pub fn rb_mod_name(mod_: VALUE) -> VALUE; pub fn rb_ivar_get(obj: VALUE, name: ID) -> VALUE; pub fn rb_ivar_defined(obj: VALUE, name: ID) -> VALUE; pub fn rb_attr_get(obj: VALUE, name: ID) -> VALUE; From df973d956a7171300c75c5646996c28e1bba17d2 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Wed, 9 Oct 2024 00:36:12 +0900 Subject: [PATCH 765/829] [DOC] Fix typos --- NEWS.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/NEWS.md b/NEWS.md index a62c8800c2214e..96c167b369d94a 100644 --- a/NEWS.md +++ b/NEWS.md @@ -132,7 +132,7 @@ See GitHub releases like [GitHub Releases of Logger](https://github.com/ruby/log ## Compatibility issues * Error messages and backtrace displays have been changed. - * Use a single quote instead of a backtick as a opening quote. [[Feature #16495]] + * Use a single quote instead of a backtick as an opening quote. [[Feature #16495]] * Display a class name before a method name (only when the class has a permanent name). [[Feature #19117]] * `Kernel#caller`, `Thread::Backtrace::Location`'s methods, etc. are also changed accordingly. ``` @@ -142,7 +142,7 @@ See GitHub releases like [GitHub Releases of Logger](https://github.com/ruby/log New: test.rb:1:in 'Object#foo': undefined method 'time' for an instance of Integer - from test.rb:2:in `
' + from test.rb:2:in '
' ``` * `Hash#inspect` rendering have been changed. [[Bug #20433]] @@ -169,7 +169,7 @@ See GitHub releases like [GitHub Releases of Logger](https://github.com/ruby/log [[Feature #15554]] * Redefining some core methods that are specially optimized by the interpreter - and JIT like `String.freeze` or `Integer#+` now emits a performance class + and JIT like `String#freeze` or `Integer#+` now emits a performance class warning (`-W:performance` or `Warning[:performance] = true`). [[Feature #20429]] From bf4571c35d2b9e40cefa291fbdaba98d2bbb90c5 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Wed, 9 Oct 2024 00:47:21 +0900 Subject: [PATCH 766/829] [DOC] Adjust indents RDoc's current markdown implementation parses only 4-spaces as indentation, not 2-spaces. --- NEWS.md | 52 ++++++++++++++++++++++++++-------------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/NEWS.md b/NEWS.md index 96c167b369d94a..18d830fd4b12f3 100644 --- a/NEWS.md +++ b/NEWS.md @@ -37,25 +37,25 @@ Note: We're only listing outstanding class updates. * Exception - * Exception#set_backtrace now accepts arrays of `Thread::Backtrace::Location`. - `Kernel#raise`, `Thread#raise` and `Fiber#raise` also accept this new format. [[Feature #13557]] + * Exception#set_backtrace now accepts arrays of `Thread::Backtrace::Location`. + `Kernel#raise`, `Thread#raise` and `Fiber#raise` also accept this new format. [[Feature #13557]] * Range - * Range#size now raises TypeError if the range is not iterable. [[Misc #18984]] - * Range#step now consistently has a semantics of iterating by using `+` operator - for all types, not only numerics. [[Feature #18368]] + * Range#size now raises TypeError if the range is not iterable. [[Misc #18984]] + * Range#step now consistently has a semantics of iterating by using `+` operator + for all types, not only numerics. [[Feature #18368]] - ```ruby - (Time.utc(2022, 2, 24)..).step(24*60*60).take(3) - #=> [2022-02-24 00:00:00 UTC, 2022-02-25 00:00:00 UTC, 2022-02-26 00:00:00 UTC] - ``` + ```ruby + (Time.utc(2022, 2, 24)..).step(24*60*60).take(3) + #=> [2022-02-24 00:00:00 UTC, 2022-02-25 00:00:00 UTC, 2022-02-26 00:00:00 UTC] + ``` * RubyVM::AbstractSyntaxTree - * Add `RubyVM::AbstractSyntaxTree::Node#locations` method which returns location objects - associated with the AST node. [[Feature #20624]] - * Add `RubyVM::AbstractSyntaxTree::Location` class which holds location information. [[Feature #20624]] + * Add `RubyVM::AbstractSyntaxTree::Node#locations` method which returns location objects + associated with the AST node. [[Feature #20624]] + * Add `RubyVM::AbstractSyntaxTree::Location` class which holds location information. [[Feature #20624]] ## Stdlib updates @@ -132,22 +132,22 @@ See GitHub releases like [GitHub Releases of Logger](https://github.com/ruby/log ## Compatibility issues * Error messages and backtrace displays have been changed. - * Use a single quote instead of a backtick as an opening quote. [[Feature #16495]] - * Display a class name before a method name (only when the class has a permanent name). [[Feature #19117]] - * `Kernel#caller`, `Thread::Backtrace::Location`'s methods, etc. are also changed accordingly. - ``` - Old: - test.rb:1:in `foo': undefined method `time' for an instance of Integer - from test.rb:2:in `
' - - New: - test.rb:1:in 'Object#foo': undefined method 'time' for an instance of Integer - from test.rb:2:in '
' - ``` + * Use a single quote instead of a backtick as an opening quote. [[Feature #16495]] + * Display a class name before a method name (only when the class has a permanent name). [[Feature #19117]] + * `Kernel#caller`, `Thread::Backtrace::Location`'s methods, etc. are also changed accordingly. + ``` + Old: + test.rb:1:in `foo': undefined method `time' for an instance of Integer + from test.rb:2:in `
' + + New: + test.rb:1:in 'Object#foo': undefined method 'time' for an instance of Integer + from test.rb:2:in '
' + ``` * `Hash#inspect` rendering have been changed. [[Bug #20433]] - * Symbol keys are displayed using the modern symbol key syntax: `"{user: 1}"` - * Other keys now have spaces around `=>`: `'{"user" => 1}'`, while previously they didn't: `'{"user"=>1}'` + * Symbol keys are displayed using the modern symbol key syntax: `"{user: 1}"` + * Other keys now have spaces around `=>`: `'{"user" => 1}'`, while previously they didn't: `'{"user"=>1}'` ## Stdlib compatibility issues From eddcff26a31cbce99f968a71133899e12ceff198 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Wed, 9 Oct 2024 00:58:34 +0900 Subject: [PATCH 767/829] [DOC] Insert an empty line between nested lists Without an empty line, often results in weird layouts. --- NEWS.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/NEWS.md b/NEWS.md index 18d830fd4b12f3..4319c25f33b855 100644 --- a/NEWS.md +++ b/NEWS.md @@ -67,6 +67,7 @@ Note: We're only listing outstanding class updates. [[Feature #20497]] * win32/sspi.rb + * This library is now extracted from the Ruby repository to `ruby/win32-sspi`. [[Feature #20775]] @@ -132,9 +133,11 @@ See GitHub releases like [GitHub Releases of Logger](https://github.com/ruby/log ## Compatibility issues * Error messages and backtrace displays have been changed. + * Use a single quote instead of a backtick as an opening quote. [[Feature #16495]] * Display a class name before a method name (only when the class has a permanent name). [[Feature #19117]] * `Kernel#caller`, `Thread::Backtrace::Location`'s methods, etc. are also changed accordingly. + ``` Old: test.rb:1:in `foo': undefined method `time' for an instance of Integer @@ -146,6 +149,7 @@ See GitHub releases like [GitHub Releases of Logger](https://github.com/ruby/log ``` * `Hash#inspect` rendering have been changed. [[Bug #20433]] + * Symbol keys are displayed using the modern symbol key syntax: `"{user: 1}"` * Other keys now have spaces around `=>`: `'{"user" => 1}'`, while previously they didn't: `'{"user"=>1}'` From a081fe11f9c28be29cf8d990f3c0b7a23e437157 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Wed, 9 Oct 2024 01:01:04 +0900 Subject: [PATCH 768/829] [DOC] Split old and new backtrace displays --- NEWS.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index 4319c25f33b855..842fe943fa9663 100644 --- a/NEWS.md +++ b/NEWS.md @@ -138,12 +138,14 @@ See GitHub releases like [GitHub Releases of Logger](https://github.com/ruby/log * Display a class name before a method name (only when the class has a permanent name). [[Feature #19117]] * `Kernel#caller`, `Thread::Backtrace::Location`'s methods, etc. are also changed accordingly. - ``` Old: + ``` test.rb:1:in `foo': undefined method `time' for an instance of Integer from test.rb:2:in `
' + ``` New: + ``` test.rb:1:in 'Object#foo': undefined method 'time' for an instance of Integer from test.rb:2:in '
' ``` From 2c6317defb4f634fed3b4c2aad7adf529c6f7aa1 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Wed, 9 Oct 2024 01:06:16 +0900 Subject: [PATCH 769/829] [DOC] Enable cross references to classes and methods --- NEWS.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/NEWS.md b/NEWS.md index 842fe943fa9663..e11727d3c13f22 100644 --- a/NEWS.md +++ b/NEWS.md @@ -25,7 +25,7 @@ Note that each entry is kept to a minimum, see links for details. * Keyword arguments are no longer allowed in index assignment (e.g. `a[0, kw: 1] = 2`). [[Bug #20218]] -* `GC.config` added to allow setting configuration variables on the Garbage +* GC.config added to allow setting configuration variables on the Garbage Collector. [[Feature #20443]] * GC configuration parameter `rgengc_allow_full_mark` introduced. When `false` @@ -37,8 +37,8 @@ Note: We're only listing outstanding class updates. * Exception - * Exception#set_backtrace now accepts arrays of `Thread::Backtrace::Location`. - `Kernel#raise`, `Thread#raise` and `Fiber#raise` also accept this new format. [[Feature #13557]] + * Exception#set_backtrace now accepts arrays of Thread::Backtrace::Location. + Kernel#raise, Thread#raise and Fiber#raise also accept this new format. [[Feature #13557]] * Range @@ -53,15 +53,15 @@ Note: We're only listing outstanding class updates. * RubyVM::AbstractSyntaxTree - * Add `RubyVM::AbstractSyntaxTree::Node#locations` method which returns location objects + * Add RubyVM::AbstractSyntaxTree::Node#locations method which returns location objects associated with the AST node. [[Feature #20624]] - * Add `RubyVM::AbstractSyntaxTree::Location` class which holds location information. [[Feature #20624]] + * Add RubyVM::AbstractSyntaxTree::Location class which holds location information. [[Feature #20624]] ## Stdlib updates * Tempfile - * The keyword argument `anonymous: true` is implemented for `Tempfile.create`. + * The keyword argument `anonymous: true` is implemented for Tempfile.create. `Tempfile.create(anonymous: true)` removes the created temporary file immediately. So applications don't need to remove the file. [[Feature #20497]] @@ -136,7 +136,7 @@ See GitHub releases like [GitHub Releases of Logger](https://github.com/ruby/log * Use a single quote instead of a backtick as an opening quote. [[Feature #16495]] * Display a class name before a method name (only when the class has a permanent name). [[Feature #19117]] - * `Kernel#caller`, `Thread::Backtrace::Location`'s methods, etc. are also changed accordingly. + * Kernel#caller, Thread::Backtrace::Location's methods, etc. are also changed accordingly. Old: ``` @@ -150,7 +150,7 @@ See GitHub releases like [GitHub Releases of Logger](https://github.com/ruby/log from test.rb:2:in '
' ``` -* `Hash#inspect` rendering have been changed. [[Bug #20433]] +* Hash#inspect rendering have been changed. [[Bug #20433]] * Symbol keys are displayed using the modern symbol key syntax: `"{user: 1}"` * Other keys now have spaces around `=>`: `'{"user" => 1}'`, while previously they didn't: `'{"user"=>1}'` @@ -164,7 +164,7 @@ See GitHub releases like [GitHub Releases of Logger](https://github.com/ruby/log ## Implementation improvements -* `Array#each` is rewritten in Ruby for better performance [[Feature #20182]]. +* Array#each is rewritten in Ruby for better performance [[Feature #20182]]. ## JIT @@ -175,7 +175,7 @@ See GitHub releases like [GitHub Releases of Logger](https://github.com/ruby/log [[Feature #15554]] * Redefining some core methods that are specially optimized by the interpreter - and JIT like `String#freeze` or `Integer#+` now emits a performance class + and JIT like String#freeze or Integer#+ now emits a performance class warning (`-W:performance` or `Warning[:performance] = true`). [[Feature #20429]] From bb57f7d20bfa9d5c7c3c9c2d28aa67eac079ee5f Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Wed, 9 Oct 2024 01:10:33 +0900 Subject: [PATCH 770/829] [DOC] Link win32-sspi upstream URL --- NEWS.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/NEWS.md b/NEWS.md index e11727d3c13f22..db53752b9f645e 100644 --- a/NEWS.md +++ b/NEWS.md @@ -68,7 +68,7 @@ Note: We're only listing outstanding class updates. * win32/sspi.rb - * This library is now extracted from the Ruby repository to `ruby/win32-sspi`. + * This library is now extracted from the Ruby repository to [ruby/win32-sspi]. [[Feature #20775]] The following default gems are updated. @@ -126,7 +126,11 @@ The following bundled gems are promoted from default gems. * csv 3.3.0 * repl_type_completor 0.1.7 -See GitHub releases like [GitHub Releases of Logger](https://github.com/ruby/logger/releases) or changelog for details of the default gems or bundled gems. +See GitHub releases like [GitHub Releases of Logger] or changelog for +details of the default gems or bundled gems. + +[ruby/win32-sspi]: https://github.com/ruby/win32-sspi +[GitHub Releases of Logger]: https://github.com/ruby/logger/releases ## Supported platforms From de50c4bd42099a70b06bfa6a7f9fa9a2532a93df Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Wed, 9 Oct 2024 01:18:09 +0900 Subject: [PATCH 771/829] [DOC] Use RIGHT SINGLE QUOTATION MARK Ideally, RDoc would be expected to replace U+0027 APOSTROPHE with U+2019 RIGHT SINGLE QUOTATION MARK, as well as the case the preceeding word is not a class name; but a boundary of attributes is treated as a word boundary currently. Although I'm not sure if this is a bug of RDoc, use that mark meanwhile. --- NEWS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index db53752b9f645e..8752d393100459 100644 --- a/NEWS.md +++ b/NEWS.md @@ -140,7 +140,7 @@ details of the default gems or bundled gems. * Use a single quote instead of a backtick as an opening quote. [[Feature #16495]] * Display a class name before a method name (only when the class has a permanent name). [[Feature #19117]] - * Kernel#caller, Thread::Backtrace::Location's methods, etc. are also changed accordingly. + * Kernel#caller, Thread::Backtrace::Location’s methods, etc. are also changed accordingly. Old: ``` From 7c304e316f2135b4a0f8d381c3302aa8ff808dc5 Mon Sep 17 00:00:00 2001 From: Burdette Lamar Date: Tue, 8 Oct 2024 12:37:19 -0500 Subject: [PATCH 772/829] [DOC] Tweaks for Array#product (#11823) --- array.c | 67 ++++++++++++++++++++++++++------------------------------- 1 file changed, 30 insertions(+), 37 deletions(-) diff --git a/array.c b/array.c index 9d6d2cf82ad711..2a03c1b04565ea 100644 --- a/array.c +++ b/array.c @@ -7467,62 +7467,55 @@ rb_ary_repeated_combination(VALUE ary, VALUE num) /* * call-seq: - * array.product(*other_arrays) -> new_array - * array.product(*other_arrays) {|combination| ... } -> self + * product(*other_arrays) -> new_array + * product(*other_arrays) {|combination| ... } -> self * - * Computes and returns or yields all combinations of elements from all the Arrays, + * Computes all combinations of elements from all the arrays, * including both +self+ and +other_arrays+: * * - The number of combinations is the product of the sizes of all the arrays, * including both +self+ and +other_arrays+. * - The order of the returned combinations is indeterminate. * - * When no block is given, returns the combinations as an +Array+ of Arrays: + * With no block given, returns the combinations as an array of arrays: * - * a = [0, 1, 2] - * a1 = [3, 4] - * a2 = [5, 6] - * p = a.product(a1) - * p.size # => 6 # a.size * a1.size - * p # => [[0, 3], [0, 4], [1, 3], [1, 4], [2, 3], [2, 4]] - * p = a.product(a1, a2) - * p.size # => 12 # a.size * a1.size * a2.size - * p # => [[0, 3, 5], [0, 3, 6], [0, 4, 5], [0, 4, 6], [1, 3, 5], [1, 3, 6], [1, 4, 5], [1, 4, 6], [2, 3, 5], [2, 3, 6], [2, 4, 5], [2, 4, 6]] - * - * If any argument is an empty +Array+, returns an empty +Array+. - * - * If no argument is given, returns an +Array+ of 1-element Arrays, - * each containing an element of +self+: - * - * a.product # => [[0], [1], [2]] + * p = [0, 1].product([2, 3]) + * # => [[0, 2], [0, 3], [1, 2], [1, 3]] + * p.size # => 4 + * p = [0, 1].product([2, 3], [4, 5]) + * # => [[0, 2, 4], [0, 2, 5], [0, 3, 4], [0, 3, 5], [1, 2, 4], [1, 2, 5], [1, 3, 4], [1, 3,... + * p.size # => 8 * - * When a block is given, yields each combination as an +Array+; returns +self+: + * If +self+ or any argument is empty, returns an empty array: * - * a.product(a1) {|combination| p combination } + * [].product([2, 3], [4, 5]) # => [] + * [0, 1].product([2, 3], []) # => [] * - * Output: + * If no argument is given, returns an array of 1-element arrays, + * each containing an element of +self+: * - * [0, 3] - * [0, 4] - * [1, 3] - * [1, 4] - * [2, 3] - * [2, 4] + * a.product # => [[0], [1], [2]] * - * If any argument is an empty +Array+, does not call the block: + * With a block given, calls the block with each combination; returns +self+: * - * a.product(a1, a2, []) {|combination| fail 'Cannot happen' } + * p = [] + * [0, 1].product([2, 3]) {|combination| p.push(combination) } + * p # => [[0, 2], [0, 3], [1, 2], [1, 3]] * - * If no argument is given, yields each element of +self+ as a 1-element +Array+: + * If +self+ or any argument is empty, does not call the block: * - * a.product {|combination| p combination } + * [].product([2, 3], [4, 5]) {|combination| fail 'Cannot happen' } + * # => [] + * [0, 1].product([2, 3], []) {|combination| fail 'Cannot happen' } + * # => [0, 1] * - * Output: + * If no argument is given, calls the block with each element of +self+ as a 1-element array: * - * [0] - * [1] - * [2] + * p = [] + * [0, 1].product {|combination| p.push(combination) } + * p # => [[0], [1]] * + * Related: see {Methods for Combining}[rdoc-ref:Array@Methods+for+Combining]. */ static VALUE From abd01d616aaeae7ad93838b75610bec6de0c6dc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Tue, 8 Oct 2024 11:59:42 +0200 Subject: [PATCH 773/829] [rubygems/rubygems] Don't modify ENV when installing realworld gems https://github.com/rubygems/rubygems/commit/b75319aa96 --- spec/bundler/support/helpers.rb | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/spec/bundler/support/helpers.rb b/spec/bundler/support/helpers.rb index 145008ab42a5db..32e32c0a75bb04 100644 --- a/spec/bundler/support/helpers.rb +++ b/spec/bundler/support/helpers.rb @@ -388,10 +388,8 @@ def realworld_system_gems(*gems) opts = gems.last.is_a?(Hash) ? gems.pop : {} path = opts.fetch(:path, system_gem_path) - with_gem_path_as(path) do - gems.each do |gem| - gem_command "install --no-document #{gem}" - end + gems.each do |gem| + gem_command "install --no-document --install-dir #{path} #{gem}" end end From 6bd79e53cd7dcfa17b77b1b080ded3fc577221bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Tue, 8 Oct 2024 12:34:55 +0200 Subject: [PATCH 774/829] [rubygems/rubygems] Pass `--verbose` to realworld gem installation In case it gives us some useful debugging output when it fails. https://github.com/rubygems/rubygems/commit/d781416483 --- spec/bundler/support/helpers.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/bundler/support/helpers.rb b/spec/bundler/support/helpers.rb index 32e32c0a75bb04..abd162bc352cc9 100644 --- a/spec/bundler/support/helpers.rb +++ b/spec/bundler/support/helpers.rb @@ -389,7 +389,7 @@ def realworld_system_gems(*gems) path = opts.fetch(:path, system_gem_path) gems.each do |gem| - gem_command "install --no-document --install-dir #{path} #{gem}" + gem_command "install --no-document --verbose --install-dir #{path} #{gem}" end end From cfcc7522d44680b959e08b31c6e3af36fdaaa152 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Tue, 8 Oct 2024 13:54:50 +0200 Subject: [PATCH 775/829] [rubygems/rubygems] Remove more unnecessary ENV modifications https://github.com/rubygems/rubygems/commit/457b25df1a --- spec/bundler/support/helpers.rb | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/spec/bundler/support/helpers.rb b/spec/bundler/support/helpers.rb index abd162bc352cc9..959720ed05b5db 100644 --- a/spec/bundler/support/helpers.rb +++ b/spec/bundler/support/helpers.rb @@ -290,18 +290,16 @@ def system_gems(*gems) options = gems.last.is_a?(Hash) ? gems.pop : {} install_dir = options.fetch(:path, system_gem_path) default = options.fetch(:default, false) - with_gem_path_as(install_dir) do - gem_repo = options.fetch(:gem_repo, gem_repo1) - gems.each do |g| - gem_name = g.to_s - if gem_name.start_with?("bundler") - version = gem_name.match(/\Abundler-(?.*)\z/)[:version] if gem_name != "bundler" - with_built_bundler(version) {|gem_path| install_gem(gem_path, install_dir, default) } - elsif %r{\A(?:[a-zA-Z]:)?/.*\.gem\z}.match?(gem_name) - install_gem(gem_name, install_dir, default) - else - install_gem("#{gem_repo}/gems/#{gem_name}.gem", install_dir, default) - end + gems.each do |g| + gem_name = g.to_s + if gem_name.start_with?("bundler") + version = gem_name.match(/\Abundler-(?.*)\z/)[:version] if gem_name != "bundler" + with_built_bundler(version) {|gem_path| install_gem(gem_path, install_dir, default) } + elsif %r{\A(?:[a-zA-Z]:)?/.*\.gem\z}.match?(gem_name) + install_gem(gem_name, install_dir, default) + else + gem_repo = options.fetch(:gem_repo, gem_repo1) + install_gem("#{gem_repo}/gems/#{gem_name}.gem", install_dir, default) end end end From 9e121ef985ef6892ac492876fa7345aa92df2f54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Tue, 8 Oct 2024 17:47:46 +0200 Subject: [PATCH 776/829] [rubygems/rubygems] Give `gem install` commands more time https://github.com/rubygems/rubygems/commit/44f3ae4bc8 --- spec/bundler/support/helpers.rb | 6 ++++++ spec/bundler/support/subprocess.rb | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/spec/bundler/support/helpers.rb b/spec/bundler/support/helpers.rb index 959720ed05b5db..411d634bbf0303 100644 --- a/spec/bundler/support/helpers.rb +++ b/spec/bundler/support/helpers.rb @@ -186,6 +186,12 @@ def gem_command(command, options = {}) env = options[:env] || {} env["RUBYOPT"] = opt_add(opt_add("-r#{spec_dir}/support/hax.rb", env["RUBYOPT"]), ENV["RUBYOPT"]) options[:env] = env + + # Sometimes `gem install` commands hang at dns resolution, which has a + # default timeout of 60 seconds. When that happens, the timeout for a + # command is expired too. So give `gem install` commands a bit more time. + options[:timeout] = 120 + output = sys_exec("#{Path.gem_bin} #{command}", options) stderr = last_command.stderr raise stderr if stderr.include?("WARNING") && !allowed_rubygems_warning?(stderr) diff --git a/spec/bundler/support/subprocess.rb b/spec/bundler/support/subprocess.rb index ade18e7805f77b..a4842166b98269 100644 --- a/spec/bundler/support/subprocess.rb +++ b/spec/bundler/support/subprocess.rb @@ -34,7 +34,7 @@ def sh(cmd, options = {}) dir = options[:dir] env = options[:env] || {} - command_execution = CommandExecution.new(cmd.to_s, working_directory: dir, timeout: 60) + command_execution = CommandExecution.new(cmd.to_s, working_directory: dir, timeout: options[:timeout] || 60) require "open3" require "shellwords" From 015d9ebaec8c564e79e2e808d002eb68341a4020 Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Tue, 8 Oct 2024 15:23:41 -0500 Subject: [PATCH 777/829] [DOC] Tweaks for Array#rassoc --- array.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/array.c b/array.c index 2a03c1b04565ea..451b19be6e8eff 100644 --- a/array.c +++ b/array.c @@ -5119,17 +5119,19 @@ rb_ary_assoc(VALUE ary, VALUE key) /* * call-seq: - * array.rassoc(obj) -> found_array or nil + * rassoc(object) -> found_array or nil * - * Returns the first element in +self+ that is an +Array+ - * whose second element == +obj+: + * Returns the first element +ele+ in +self+ such that +ele+ is an array + * and ele[1] == object: * * a = [{foo: 0}, [2, 4], [4, 5, 6], [4, 5]] * a.rassoc(4) # => [2, 4] + * a.rassoc(5) # => [4, 5, 6] * * Returns +nil+ if no such element is found. * - * Related: #assoc. + * Related: Array#assoc; + * see also {Methods for Fetching}[rdoc-ref:Array@Methods+for+Fetching]. */ VALUE From 0469d169e248dcd2b110dfa5073c9f495fce97d0 Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Tue, 8 Oct 2024 15:37:49 -0500 Subject: [PATCH 778/829] [DOC] Tweaks for Array#reject --- array.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/array.c b/array.c index 451b19be6e8eff..e30b7edb158354 100644 --- a/array.c +++ b/array.c @@ -4367,21 +4367,19 @@ rb_ary_reject_bang(VALUE ary) /* * call-seq: - * array.reject {|element| ... } -> new_array - * array.reject -> new_enumerator + * reject {|element| ... } -> new_array + * reject -> new_enumerator * - * Returns a new +Array+ whose elements are all those from +self+ + * With a block given, returns a new array whose elements are all those from +self+ * for which the block returns +false+ or +nil+: * * a = [:foo, 'bar', 2, 'bat'] * a1 = a.reject {|element| element.to_s.start_with?('b') } * a1 # => [:foo, 2] * - * Returns a new Enumerator if no block given: - * - * a = [:foo, 'bar', 2] - * a.reject # => # + * With no block given, returns a new Enumerator. * + * Related: {Methods for Fetching}[rdoc-ref:Array@Methods+for+Fetching]. */ static VALUE @@ -8612,6 +8610,7 @@ rb_ary_deconstruct(VALUE ary) * as determined by a given block. * - #sample: Returns one or more random elements. * - #shuffle: Returns elements in a random order. + * - #reject: Returns an array containing elements not rejected by a given block. * * === Methods for Assigning * From 65494d3cc6fbe5b25431021ac155b7aba3a1dff3 Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Tue, 8 Oct 2024 15:44:36 -0500 Subject: [PATCH 779/829] [DOC] Tweaks for Array#reject! --- array.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/array.c b/array.c index e30b7edb158354..a08a8faf3ae774 100644 --- a/array.c +++ b/array.c @@ -4338,10 +4338,11 @@ ary_reject_bang(VALUE ary) /* * call-seq: - * array.reject! {|element| ... } -> self or nil - * array.reject! -> new_enumerator + * reject! {|element| ... } -> self or nil + * reject! -> new_enumerator * - * Removes each element for which the block returns a truthy value. + * With a block given, calls the block with each element of +self+; + * removes each element for which the block returns a truthy value. * * Returns +self+ if any elements removed: * @@ -4350,11 +4351,9 @@ ary_reject_bang(VALUE ary) * * Returns +nil+ if no elements removed. * - * Returns a new Enumerator if no block given: - * - * a = [:foo, 'bar', 2] - * a.reject! # => # + * With no block given, returns a new Enumerator. * + * Related: see {Methods for Deleting}[rdoc-ref:Array@Methods+for+Deleting]. */ static VALUE From 3fc1495c305bca14ab30d458e74dcc42424195d1 Mon Sep 17 00:00:00 2001 From: John Bampton Date: Wed, 9 Oct 2024 03:36:17 +1000 Subject: [PATCH 780/829] Fix spelling --- error.c | 4 ++-- file.c | 4 ++-- lib/bundler/dsl.rb | 14 +++++++------- range.c | 2 +- struct.c | 2 +- thread_pthread.c | 2 +- weakmap.c | 2 +- 7 files changed, 15 insertions(+), 15 deletions(-) diff --git a/error.c b/error.c index 5256521acdc950..d266f8fd9b2245 100644 --- a/error.c +++ b/error.c @@ -1690,7 +1690,7 @@ check_order_keyword(VALUE opt) * "\tfrom t.rb:11:in `foo'", * "\tfrom t.rb:12:in `
'"] * - * An overrriding method should be careful with ANSI code enhancements; + * An overriding method should be careful with ANSI code enhancements; * see {Messages}[rdoc-ref:exceptions.md@Messages]. */ @@ -1774,7 +1774,7 @@ exc_message(VALUE exc) * - +:error_highlight+. * - +:syntax_suggest+. * - * An overrriding method should also be careful with ANSI code enhancements; + * An overriding method should also be careful with ANSI code enhancements; * see {Messages}[rdoc-ref:exceptions.md@Messages]. */ diff --git a/file.c b/file.c index 1ba2eae98fac91..8edb0a3284669d 100644 --- a/file.c +++ b/file.c @@ -5457,14 +5457,14 @@ test_check(int n, int argc, VALUE *argv) * | 'o' | Whether the entity is owned by the caller's effective uid. | * | 'O' | Like 'o', but uses the real uid (not the effective uid). | * | 'p' | Whether the entity is a FIFO device (named pipe). | - * | 'r' | Whether the entity is readable by the caller's effecive uid/gid. | + * | 'r' | Whether the entity is readable by the caller's effective uid/gid. | * | 'R' | Like 'r', but uses the real uid/gid (not the effective uid/gid). | * | 'S' | Whether the entity is a socket. | * | 'u' | Whether the entity's setuid bit is set. | * | 'w' | Whether the entity is writable by the caller's effective uid/gid. | * | 'W' | Like 'w', but uses the real uid/gid (not the effective uid/gid). | * | 'x' | Whether the entity is executable by the caller's effective uid/gid. | - * | 'X' | Like 'x', but uses the real uid/gid (not the effecive uid/git). | + * | 'X' | Like 'x', but uses the real uid/gid (not the effective uid/git). | * | 'z' | Whether the entity exists and is of length zero. | * * - This test operates only on the entity at `path0`, diff --git a/lib/bundler/dsl.rb b/lib/bundler/dsl.rb index aad87596529757..24a9a7683a3d4a 100644 --- a/lib/bundler/dsl.rb +++ b/lib/bundler/dsl.rb @@ -589,21 +589,21 @@ def to_s trace_line = backtrace.find {|l| l.include?(dsl_path) } || trace_line return m unless trace_line - line_numer = trace_line.split(":")[1].to_i - 1 - return m unless line_numer + line_number = trace_line.split(":")[1].to_i - 1 + return m unless line_number lines = contents.lines.to_a indent = " # " indicator = indent.tr("#", ">") - first_line = line_numer.zero? - last_line = (line_numer == (lines.count - 1)) + first_line = line_number.zero? + last_line = (line_number == (lines.count - 1)) m << "\n" m << "#{indent}from #{trace_line.gsub(/:in.*$/, "")}\n" m << "#{indent}-------------------------------------------\n" - m << "#{indent}#{lines[line_numer - 1]}" unless first_line - m << "#{indicator}#{lines[line_numer]}" - m << "#{indent}#{lines[line_numer + 1]}" unless last_line + m << "#{indent}#{lines[line_number - 1]}" unless first_line + m << "#{indicator}#{lines[line_number]}" + m << "#{indent}#{lines[line_number + 1]}" unless last_line m << "\n" unless m.end_with?("\n") m << "#{indent}-------------------------------------------\n" end diff --git a/range.c b/range.c index 4af5d4943ec3c8..7ddb9908f6e55b 100644 --- a/range.c +++ b/range.c @@ -493,7 +493,7 @@ range_step(int argc, VALUE *argv, VALUE range) const VALUE e_num_p = rb_obj_is_kind_of(e, rb_cNumeric); // For backward compatibility reasons (conforming to behavior before 3.4), String/Symbol // supports both old behavior ('a'..).step(1) and new behavior ('a'..).step('a') - // Hence the additional conversion/addional checks. + // Hence the additional conversion/additional checks. const VALUE str_b = rb_check_string_type(b); const VALUE sym_b = SYMBOL_P(b) ? rb_sym2str(b) : Qnil; diff --git a/struct.c b/struct.c index 3e2dff161fd198..1509a230514ff0 100644 --- a/struct.c +++ b/struct.c @@ -1640,7 +1640,7 @@ rb_struct_dig(int argc, VALUE *argv, VALUE self) * * * Note that member-less \Data is acceptable and might be a useful technique - * for defining several homogenous data classes, like + * for defining several homogeneous data classes, like * * class HTTPFetcher * Response = Data.define(:body) diff --git a/thread_pthread.c b/thread_pthread.c index c9a5c60bd56725..c92fd52a663471 100644 --- a/thread_pthread.c +++ b/thread_pthread.c @@ -1320,7 +1320,7 @@ void rb_ractor_sched_sleep(rb_execution_context_t *ec, rb_ractor_t *cr, rb_unblock_function_t *ubf) { // ractor lock of cr is acquired - // r is sleeping statuss + // r is sleeping status rb_thread_t * volatile th = rb_ec_thread_ptr(ec); struct rb_thread_sched *sched = TH_SCHED(th); cr->sync.wait.waiting_thread = th; // TODO: multi-thread diff --git a/weakmap.c b/weakmap.c index a9d0a6a12b0967..3ca8927a9907e0 100644 --- a/weakmap.c +++ b/weakmap.c @@ -1113,7 +1113,7 @@ wkmap_inspect(VALUE self) * end * * This will result in +make_value+ returning the same object for same set of attributes - * always, but the values that aren't needed anymore woudn't be sitting in the cache forever. + * always, but the values that aren't needed anymore wouldn't be sitting in the cache forever. */ void From 5840b4363f41955d114f8840f9b30d105f8b0922 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Wed, 9 Oct 2024 10:05:19 +0900 Subject: [PATCH 781/829] [DOC] Use the recent RDoc always to generate the doc of ruby itself --- tool/rdoc-srcdir | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tool/rdoc-srcdir b/tool/rdoc-srcdir index 304deb67cec502..03e51716500b29 100755 --- a/tool/rdoc-srcdir +++ b/tool/rdoc-srcdir @@ -1,5 +1,6 @@ -#!ruby +#!ruby -W0 +$:.unshift(File.expand_path("../lib", __dir__)) require 'rdoc/rdoc' # Make only the output directory relative to the invoked directory. From 09d5f3c1430f39017c33c09e785f9263be0f6d47 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Wed, 9 Oct 2024 10:28:59 +0900 Subject: [PATCH 782/829] [DOC] Generate document HTMLs only when document commit/PR --- .github/workflows/check_misc.yml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.github/workflows/check_misc.yml b/.github/workflows/check_misc.yml index 4ff38f1c1fb831..738a6869025fc1 100644 --- a/.github/workflows/check_misc.yml +++ b/.github/workflows/check_misc.yml @@ -114,14 +114,24 @@ jobs: - name: Generate docs id: docs run: | - ruby -W0 --disable-gems -I./lib tool/rdoc-srcdir --op html . + ruby -W0 --disable-gems -I./lib tool/rdoc-srcdir -q --op html . echo htmlout=ruby-html-${GITHUB_SHA:0:10} >> $GITHUB_OUTPUT + # Generate only when document commit/PR + if: >- + ${{false + || contains(github.event.head_commit.message, '[DOC]') + || contains(github.event.head_commit.message, 'Document') + || contains(github.event.pull_request.title, '[DOC]') + || contains(github.event.pull_request.title, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Documentation') + }} - name: Upload docs uses: actions/upload-artifact@v4 with: path: html name: ${{ steps.docs.outputs.htmlout }} + if: ${{ steps.docs.outcome == 'success' }} - uses: ./.github/actions/slack with: From 589f1978d8c368b8eccf34453463ad46a58d36da Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Wed, 9 Oct 2024 10:57:18 +0900 Subject: [PATCH 783/829] mingw environment can't bind free port with 10 times. We should omit it instead of test failure. ``` 1) Error: TestResolvDNS#test_multiple_servers_with_timeout_and_truncated_tcp_fallback: Errno::EACCES: Permission denied - bind(2) for "127.0.0.1" port 59677 D:/a/ruby/ruby/src/test/resolv/test_dns.rb:78:in 'TCPServer#initialize' D:/a/ruby/ruby/src/test/resolv/test_dns.rb:78:in 'TCPServer.new' D:/a/ruby/ruby/src/test/resolv/test_dns.rb:78:in 'TestResolvDNS#with_udp_and_tcp' D:/a/ruby/ruby/src/test/resolv/test_dns.rb:711:in 'TestResolvDNS#test_multiple_servers_with_timeout_and_truncated_tcp_fallback' 2) Error: TestResolvDNS#test_query_ipv4_address_truncated_tcp_fallback: Errno::EACCES: Permission denied - bind(2) for "127.0.0.1" port 59689 D:/a/ruby/ruby/src/test/resolv/test_dns.rb:78:in 'TCPServer#initialize' D:/a/ruby/ruby/src/test/resolv/test_dns.rb:78:in 'TCPServer.new' D:/a/ruby/ruby/src/test/resolv/test_dns.rb:78:in 'TestResolvDNS#with_udp_and_tcp' D:/a/ruby/ruby/src/test/resolv/test_dns.rb:223:in 'TestResolvDNS#test_query_ipv4_address_truncated_tcp_fallback' ``` --- test/resolv/test_dns.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/resolv/test_dns.rb b/test/resolv/test_dns.rb index 9b79fdf9d07ae0..743511c8fb88f1 100644 --- a/test/resolv/test_dns.rb +++ b/test/resolv/test_dns.rb @@ -89,7 +89,7 @@ def with_udp_and_tcp(host, port) u = nil retry end - raise + omit "Could not find a free port after 10 retries" end # If we get to this point, we have a valid t & u socket From 75c3c0b0afec49b5e5b760a1aaa422396bbbc26c Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Wed, 9 Oct 2024 12:05:36 +0900 Subject: [PATCH 784/829] Update NEWS entry for repl_type_completor --- NEWS.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/NEWS.md b/NEWS.md index 8752d393100459..80d251b424bb6a 100644 --- a/NEWS.md +++ b/NEWS.md @@ -124,6 +124,9 @@ The following bundled gems are promoted from default gems. * nkf 0.2.0 * syslog 0.1.2 * csv 3.3.0 + +The following bundled gems are added. + * repl_type_completor 0.1.7 See GitHub releases like [GitHub Releases of Logger] or changelog for From ed11a244ddde725eb2b30a4482575f58105b7dc0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Oct 2024 02:52:17 +0000 Subject: [PATCH 785/829] Bump actions/cache in /.github/actions/setup/directories Bumps [actions/cache](https://github.com/actions/cache) from 4.1.0 to 4.1.1. - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/2cdf405574d6ef1f33a1d12acccd3ae82f47b3f2...3624ceb22c1c5a301c8db4169662070a689d9ea8) --- updated-dependencies: - dependency-name: actions/cache dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/actions/setup/directories/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/setup/directories/action.yml b/.github/actions/setup/directories/action.yml index 0ca1d9ea27be73..521f1dfe94c75b 100644 --- a/.github/actions/setup/directories/action.yml +++ b/.github/actions/setup/directories/action.yml @@ -93,7 +93,7 @@ runs: path: ${{ inputs.srcdir }} fetch-depth: ${{ inputs.fetch-depth }} - - uses: actions/cache@2cdf405574d6ef1f33a1d12acccd3ae82f47b3f2 # v4.1.0 + - uses: actions/cache@3624ceb22c1c5a301c8db4169662070a689d9ea8 # v4.1.1 with: path: ${{ inputs.srcdir }}/.downloaded-cache key: downloaded-cache From bd85e88d3190556fc59ad9665b8e6f6715331696 Mon Sep 17 00:00:00 2001 From: Kazuhiro NISHIYAMA Date: Wed, 9 Oct 2024 12:55:28 +0900 Subject: [PATCH 786/829] Support `The following bundled gems are added.` --- .github/workflows/bundled_gems.yml | 7 ++++--- tool/update-NEWS-gemlist.rb | 17 ++++++++++++++--- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/.github/workflows/bundled_gems.yml b/.github/workflows/bundled_gems.yml index 7d452ea8761e87..da2c7028c2e00c 100644 --- a/.github/workflows/bundled_gems.yml +++ b/.github/workflows/bundled_gems.yml @@ -46,10 +46,11 @@ jobs: - name: Download previous gems list run: | - data=bundled_gems.json mkdir -p .downloaded-cache - ln -s .downloaded-cache/$data . - curl -O -R -z ./$data https://stdgems.org/$data + for data in bundled_gems.json default_gems.json; do + ln -s .downloaded-cache/$data . + curl -O -R -z ./$data https://stdgems.org/$data + done - name: Update bundled gems list id: bundled_gems diff --git a/tool/update-NEWS-gemlist.rb b/tool/update-NEWS-gemlist.rb index 8e4d39046b9502..e1535eb400bc7e 100755 --- a/tool/update-NEWS-gemlist.rb +++ b/tool/update-NEWS-gemlist.rb @@ -15,13 +15,18 @@ item[$1 || "* "] end end -ARGV.each do |type| - last = JSON.parse(File.read("#{type}_gems.json"))['gems'].filter_map do |g| + +load_gems_json = ->(type) do + JSON.parse(File.read("#{type}_gems.json"))['gems'].filter_map do |g| v = g['versions'].values_at(*prevs).compact.first g = g['gem'] g = 'RubyGems' if g == 'rubygems' [g, v] if v end.to_h +end + +ARGV.each do |type| + last = load_gems_json[type] changed = File.foreach("gems/#{type}_gems").filter_map do |l| next if l.start_with?("#") g, v = l.split(" ", 3) @@ -32,7 +37,13 @@ update[changed, type] or next if added and !added.empty? if type == 'bundled' - update[added, type, 'promoted from default gems'] or next + default_gems = load_gems_json['default'] + promoted = {} + added.delete_if do |k, v| + default_gems.key?(k) && promoted[k] = v + end + update[added, type, 'added'] + update[promoted, type, 'promoted from default gems'] or next else update[added, type, 'added'] or next end From 3e98abc49dce62bb6a9ba009d8ecc0c551993d49 Mon Sep 17 00:00:00 2001 From: git Date: Wed, 9 Oct 2024 03:56:47 +0000 Subject: [PATCH 787/829] Update bundled gems list at bd85e88d3190556fc59ad9665b8e6f [ci skip] --- NEWS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index 80d251b424bb6a..02cf8902ab3682 100644 --- a/NEWS.md +++ b/NEWS.md @@ -125,7 +125,7 @@ The following bundled gems are promoted from default gems. * syslog 0.1.2 * csv 3.3.0 -The following bundled gems are added. +The following bundled gem is added. * repl_type_completor 0.1.7 From fc2efc2bdb5e8f48b83757d8de1ae90750150e84 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Fri, 4 Oct 2024 14:36:45 +0900 Subject: [PATCH 788/829] Added win32-registry --- tool/sync_default_gems.rb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tool/sync_default_gems.rb b/tool/sync_default_gems.rb index 4a7a2dcb8050e3..a7ad331c999894 100755 --- a/tool/sync_default_gems.rb +++ b/tool/sync_default_gems.rb @@ -18,6 +18,7 @@ module SyncDefaultGems "net-http": "ruby/net-http", "net-protocol": "ruby/net-protocol", "open-uri": "ruby/open-uri", + "win32-registry": "ruby/win32-registry", English: "ruby/English", benchmark: "ruby/benchmark", cgi: "ruby/cgi", @@ -396,6 +397,11 @@ def sync_default_gems(gem) rm_rf("ext/win32/resolv/lib") # Clean up empty directory cp_r("#{upstream}/test/resolv", "test") `git checkout ext/win32/resolv/depend` + when "win32-registry" + rm_rf(%w[ext/win32/lib/win32/registry.rb test/win32/test_registry.rb]) + cp_r("#{upstream}/lib/win32/registry.rb", "ext/win32/lib/win32") + cp_r("#{upstream}/test/win32/test_registry.rb", "test/win32") + cp_r("#{upstream}/win32-registry.gemspec", "ext/win32") else sync_lib gem, upstream end @@ -426,6 +432,7 @@ def check_prerelease_version(gem) "ext/#{gem}/#{gem}.gemspec", "ext/#{gem.split("-").join("/")}/#{gem}.gemspec", "lib/#{gem.split("-").first}/#{gem}.gemspec", + "ext/#{gem.split("-").first}/#{gem}.gemspec", "lib/#{gem.split("-").join("/")}/#{gem}.gemspec", ].find{|gemspec| File.exist?(gemspec)} spec = Gem::Specification.load(gemspec) From 4eda289a13c61347c28cbb327d07e5064583904d Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Fri, 4 Oct 2024 14:37:09 +0900 Subject: [PATCH 789/829] Sync from ruby/win32-registry --- ext/win32/lib/win32/registry.rb | 20 +-- ext/win32/win32-registry.gemspec | 29 +++++ test/win32/test_registry.rb | 209 ++++++++++++++++++++++++++----- 3 files changed, 220 insertions(+), 38 deletions(-) create mode 100644 ext/win32/win32-registry.gemspec diff --git a/ext/win32/lib/win32/registry.rb b/ext/win32/lib/win32/registry.rb index c801b1327b3886..e84653d9459455 100644 --- a/ext/win32/lib/win32/registry.rb +++ b/ext/win32/lib/win32/registry.rb @@ -69,11 +69,7 @@ module Win32 WCHAR_NUL = "\0".encode(WCHAR).freeze WCHAR_CR = "\r".encode(WCHAR).freeze WCHAR_SIZE = WCHAR_NUL.bytesize - begin - LOCALE = Encoding.find(Encoding.locale_charmap) - rescue ArgumentError - LOCALE = Encoding::UTF_8 - end + LOCALE = Encoding::UTF_8 class Registry @@ -567,9 +563,16 @@ def close end # - # Enumerate values. + # Enumerate all values in this registry path. + # + # For each value it yields key, type and data. + # + # key is a String which contains name of key. + # type is a type contant kind of Win32::Registry::REG_* + # data is the value of this key. # def each_value + return enum_for(:each_value) unless block_given? index = 0 while true begin @@ -600,13 +603,16 @@ def values end # - # Enumerate subkeys. + # Enumerate all subkeys. + # + # For each subkey it yields subkey and wtime. # # subkey is String which contains name of subkey. # wtime is last write time as FILETIME (64-bit integer). # (see Registry.wtime2time) # def each_key + return enum_for(:each_key) unless block_given? index = 0 while true begin diff --git a/ext/win32/win32-registry.gemspec b/ext/win32/win32-registry.gemspec new file mode 100644 index 00000000000000..b6df247574a3f5 --- /dev/null +++ b/ext/win32/win32-registry.gemspec @@ -0,0 +1,29 @@ +# frozen_string_literal: true +Gem::Specification.new do |spec| + spec.name = "win32-registry" + spec.version = "0.0.1" + spec.authors = ["U.Nakamura"] + spec.email = ["usa@garbagecollect.jp"] + + spec.summary = %q{Provides an interface to the Windows Registry in Ruby} + spec.description = spec.summary + spec.homepage = "https://github.com/ruby/win32-registry" + spec.required_ruby_version = ">= 2.6.0" + + spec.metadata["homepage_uri"] = spec.homepage + spec.metadata["source_code_uri"] = spec.homepage + + # Specify which files should be added to the gem when it is released. + # The `git ls-files -z` loads the files in the RubyGem that have been added into git. + spec.files = Dir.chdir(__dir__) do + `git ls-files -z`.split("\x0").reject do |f| + (File.expand_path(f) == __FILE__) || + f.start_with?(*%w[bin/ test/ spec/ features/ .git .github appveyor Gemfile]) + end + end + spec.bindir = "exe" + spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) } + spec.require_paths = ["lib"] + + spec.add_dependency "fiddle", "~> 1.0" +end diff --git a/test/win32/test_registry.rb b/test/win32/test_registry.rb index 02cafc09b0878f..8a98405a79ec1e 100644 --- a/test/win32/test_registry.rb +++ b/test/win32/test_registry.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + if /mswin|mingw|cygwin/ =~ RUBY_PLATFORM begin require 'win32/registry' @@ -10,7 +12,19 @@ if defined?(Win32::Registry) class TestWin32Registry < Test::Unit::TestCase COMPUTERNAME = 'SYSTEM\\CurrentControlSet\\Control\\ComputerName\\ComputerName' - VOLATILE_ENVIRONMENT = 'Volatile Environment' + + private def backslachs(path) + path.gsub("/", "\\") + end + + TEST_REGISTRY_KEY = "SOFTWARE/ruby-win32-registry-test/" + + def setup + Win32::Registry::HKEY_CURRENT_USER.open(backslachs(File.dirname(TEST_REGISTRY_KEY))) do |reg| + reg.delete_key File.basename(TEST_REGISTRY_KEY), true + end + rescue Win32::Registry::Error + end def test_predefined assert_predefined_key Win32::Registry::HKEY_CLASSES_ROOT @@ -24,6 +38,38 @@ def test_predefined assert_predefined_key Win32::Registry::HKEY_DYN_DATA end + def test_open_no_block + Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY)).close + + reg = Win32::Registry::HKEY_CURRENT_USER.open(backslachs(TEST_REGISTRY_KEY), Win32::Registry::KEY_ALL_ACCESS) + assert_kind_of Win32::Registry, reg + assert_equal true, reg.open? + assert_equal false, reg.created? + reg["test"] = "abc" + reg.close + assert_raise(Win32::Registry::Error) do + reg["test"] = "abc" + end + end + + def test_open_with_block + Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY)).close + + regs = [] + Win32::Registry::HKEY_CURRENT_USER.open(backslachs(TEST_REGISTRY_KEY), Win32::Registry::KEY_ALL_ACCESS) do |reg| + regs << reg + assert_equal true, reg.open? + assert_equal false, reg.created? + reg["test"] = "abc" + end + + assert_equal 1, regs.size + assert_kind_of Win32::Registry, regs[0] + assert_raise(Win32::Registry::Error) do + regs[0]["test"] = "abc" + end + end + def test_class_open name1, keys1 = Win32::Registry.open(Win32::Registry::HKEY_LOCAL_MACHINE, "SYSTEM") do |reg| assert_predicate reg, :open? @@ -46,32 +92,145 @@ def test_read end end - def test_create + def test_create_volatile desired = Win32::Registry::KEY_ALL_ACCESS option = Win32::Registry::REG_OPTION_VOLATILE - Win32::Registry::HKEY_CURRENT_USER.open(VOLATILE_ENVIRONMENT, desired) do |reg| - v = self.class.unused_value(reg) - begin - reg.create(v, desired, option) {} - ensure - reg.delete_key(v, true) - end + Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY), desired) do |reg| + reg.create("volkey", desired, option) {} + reg.delete_key("volkey", true) + end + end + + def test_create_no_block + reg = Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY)) + assert_kind_of Win32::Registry, reg + assert_equal true, reg.open? + assert_equal true, reg.created? + reg["test"] = "abc" + reg.close + assert_equal false, reg.open? + assert_raise(Win32::Registry::Error) do + reg["test"] = "abc" + end + end + + def test_create_with_block + regs = [] + Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY)) do |reg| + regs << reg + reg["test"] = "abc" + assert_equal true, reg.open? + assert_equal true, reg.created? + end + + assert_equal 1, regs.size + assert_kind_of Win32::Registry, regs[0] + assert_equal false, regs[0].open? + assert_raise(Win32::Registry::Error) do + regs[0]["test"] = "abc" end end def test_write desired = Win32::Registry::KEY_ALL_ACCESS - Win32::Registry::HKEY_CURRENT_USER.open(VOLATILE_ENVIRONMENT, desired) do |reg| - v = self.class.unused_value(reg) - begin - reg.write_s(v, "data") - assert_equal [Win32::Registry::REG_SZ, "data"], reg.read(v) - reg.write_i(v, 0x5fe79027) - assert_equal [Win32::Registry::REG_DWORD, 0x5fe79027], reg.read(v) - ensure - reg.delete(v) + Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY), desired) do |reg| + reg.write_s("key1", "data") + assert_equal [Win32::Registry::REG_SZ, "data"], reg.read("key1") + reg.write_i("key2", 0x5fe79027) + assert_equal [Win32::Registry::REG_DWORD, 0x5fe79027], reg.read("key2") + end + end + + def test_accessors + Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY)) do |reg| + assert_kind_of Integer, reg.hkey + assert_kind_of Win32::Registry, reg.parent + assert_equal "HKEY_CURRENT_USER", reg.parent.name + assert_equal "SOFTWARE\\ruby-win32-registry-test\\", reg.keyname + assert_equal Win32::Registry::REG_CREATED_NEW_KEY, reg.disposition + end + end + + def test_name + Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY)) do |reg| + assert_equal "HKEY_CURRENT_USER\\SOFTWARE\\ruby-win32-registry-test\\", reg.name + end + end + + def test_keys + Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY)) do |reg| + reg.create("key1") + assert_equal ["key1"], reg.keys + end + end + + def test_each_key + keys = [] + Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY)) do |reg| + reg.create("key1") + reg.each_key { |*a| keys << a } + end + assert_equal [2], keys.map(&:size) + assert_equal ["key1"], keys.map(&:first) + assert_in_delta Win32::Registry.time2wtime(Time.now), keys[0][1], 10_000_000_000, "wtime should roughly match Time.now" + end + + def test_each_key_enum + keys = nil + Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY)) do |reg| + reg.create("key1") + reg.create("key2") + reg.create("key3") + reg["value1"] = "abcd" + keys = reg.each_key.to_a + end + assert_equal 3, keys.size + assert_equal [2, 2, 2], keys.map(&:size) + assert_equal ["key1", "key2", "key3"], keys.map(&:first) + end + + def test_values + Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY)) do |reg| + reg.create("key1") + reg["value1"] = "abcd" + assert_equal ["abcd"], reg.values + end + end + + def test_each_value + vals = [] + Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY)) do |reg| + reg.create("key1") + reg["value1"] = "abcd" + reg.each_value { |*a| vals << a } + end + assert_equal [["value1", Win32::Registry::REG_SZ, "abcd"]], vals + end + + def test_each_value_enum + vals = nil + Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY)) do |reg| + reg.create("key1") + reg["value1"] = "abcd" + reg["value2"] = 42 + vals = reg.each_value.to_a + end + assert_equal [["value1", Win32::Registry::REG_SZ, "abcd"], + ["value2", Win32::Registry::REG_DWORD, 42]], vals + end + + def test_utf8_encoding + keys = [] + Win32::Registry::HKEY_CURRENT_USER.create(backslachs(TEST_REGISTRY_KEY)) do |reg| + reg.create("abc EUR") + reg.create("abc €") + reg.each_key do |subkey| + keys << subkey end end + + assert_equal [Encoding::UTF_8] * 2, keys.map(&:encoding) + assert_equal ["abc EUR", "abc €"], keys end private @@ -79,19 +238,7 @@ def test_write def assert_predefined_key(key) assert_kind_of Win32::Registry, key assert_predicate key, :open? - assert_not_predicate key, :created? - end - - class << self - def unused_value(reg, prefix = "Test_", limit = 100, fail: true) - limit.times do - v = + rand(0x100000).to_s(36) - reg.read(v) - rescue - return v - end - omit "Unused value not found in #{reg}" if fail - end + refute_predicate key, :created? end end end From fc08f726214761feb3e5002c769b458848ea4ee3 Mon Sep 17 00:00:00 2001 From: git Date: Wed, 9 Oct 2024 04:56:31 +0000 Subject: [PATCH 790/829] Update default gems list at 4eda289a13c61347c28cbb327d07e5 [ci skip] --- NEWS.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/NEWS.md b/NEWS.md index 02cf8902ab3682..481bb7548f1427 100644 --- a/NEWS.md +++ b/NEWS.md @@ -59,6 +59,10 @@ Note: We're only listing outstanding class updates. ## Stdlib updates +The following default gem is added. + +* win32-registry 0.0.1 + * Tempfile * The keyword argument `anonymous: true` is implemented for Tempfile.create. From 83456d1e9aeb66ec64365343b38af66c83b4bce8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Tue, 8 Oct 2024 23:55:12 +0200 Subject: [PATCH 791/829] [rubygems/rubygems] Fix plugin command loading The `LoadError` needs to be ignored because command may have been defined and registered from a rubygems_plugin.rb file. https://github.com/rubygems/rubygems/commit/31f13d449b --- lib/rubygems/command_manager.rb | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/rubygems/command_manager.rb b/lib/rubygems/command_manager.rb index 4d54d1d49d5633..15834ce4dd0c09 100644 --- a/lib/rubygems/command_manager.rb +++ b/lib/rubygems/command_manager.rb @@ -232,9 +232,14 @@ def load_and_instantiate(command_name) const_name = command_name.capitalize.gsub(/_(.)/) { $1.upcase } << "Command" begin - require "rubygems/commands/#{command_name}_command" + begin + require "rubygems/commands/#{command_name}_command" + rescue LoadError + # it may have been defined from a rubygems_plugin.rb file + end + Gem::Commands.const_get(const_name).new - rescue StandardError, LoadError => e + rescue StandardError => e alert_error clean_text("Loading command: #{command_name} (#{e.class})\n\t#{e}") ui.backtrace e end From 73834f11fa22ab963df064f7a6fe34c6a0488468 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Mon, 7 Oct 2024 17:31:42 +0200 Subject: [PATCH 792/829] [rubygems/rubygems] Fix `Gem::Specification#gem_dir` losing custom source for some reason https://github.com/rubygems/rubygems/commit/f8f589b1b8 --- lib/bundler/rubygems_ext.rb | 7 +++++++ lib/rubygems/specification.rb | 8 -------- spec/bundler/runtime/setup_spec.rb | 15 +++++++++++++++ 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/lib/bundler/rubygems_ext.rb b/lib/bundler/rubygems_ext.rb index 67f830d4f3fbc8..a3f70e9a3caf29 100644 --- a/lib/bundler/rubygems_ext.rb +++ b/lib/bundler/rubygems_ext.rb @@ -123,6 +123,13 @@ def extension_dir end end + # Can be removed once RubyGems 3.5.21 support is dropped + remove_method :gem_dir if method_defined?(:gem_dir, false) + + def gem_dir + full_gem_path + end + unless const_defined?(:LATEST_RUBY_WITHOUT_PATCH_VERSIONS) LATEST_RUBY_WITHOUT_PATCH_VERSIONS = Gem::Version.new("2.1") diff --git a/lib/rubygems/specification.rb b/lib/rubygems/specification.rb index e5541e57b12d24..4753186a838df9 100644 --- a/lib/rubygems/specification.rb +++ b/lib/rubygems/specification.rb @@ -1912,14 +1912,6 @@ def full_name @full_name ||= super end - ## - # Work around old bundler versions removing my methods - # Can be removed once RubyGems can no longer install Bundler 2.5 - - def gem_dir # :nodoc: - super - end - def gems_dir @gems_dir ||= File.join(base_dir, "gems") end diff --git a/spec/bundler/runtime/setup_spec.rb b/spec/bundler/runtime/setup_spec.rb index fc574f31962182..58f22931096a23 100644 --- a/spec/bundler/runtime/setup_spec.rb +++ b/spec/bundler/runtime/setup_spec.rb @@ -706,6 +706,21 @@ def clean_load_path(lp) expect(out).to be_empty end + it "has gem_dir pointing to local repo" do + build_lib "foo", "1.0", path: bundled_app + + install_gemfile <<-G + source "https://gem.repo1" + gemspec + G + + run <<-R + puts Gem.loaded_specs['foo'].gem_dir + R + + expect(out).to eq(bundled_app.to_s) + end + it "does not load all gemspecs" do install_gemfile <<-G source "https://gem.repo1" From 9f812522f521bf4f3d550a84233a05d23e7dd5ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Tue, 8 Oct 2024 21:25:23 +0200 Subject: [PATCH 793/829] [rubygems/rubygems] Allow `gem pristine` to reset default gems too https://github.com/rubygems/rubygems/commit/c9e665eb8a --- lib/rubygems/commands/pristine_command.rb | 8 +++----- test/rubygems/test_gem_commands_pristine_command.rb | 3 ++- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/lib/rubygems/commands/pristine_command.rb b/lib/rubygems/commands/pristine_command.rb index 999c9fef0f4cf0..96e48df4e61aa3 100644 --- a/lib/rubygems/commands/pristine_command.rb +++ b/lib/rubygems/commands/pristine_command.rb @@ -134,11 +134,8 @@ def execute say "Restoring gems to pristine condition..." - specs.each do |spec| - if spec.default_gem? - say "Skipped #{spec.full_name}, it is a default gem" - next - end + specs.group_by(&:full_name_with_location).values.each do |grouped_specs| + spec = grouped_specs.find {|s| !s.default_gem? } || grouped_specs.first if options.key? :skip if options[:skip].include? spec.name @@ -188,6 +185,7 @@ def execute env_shebang: env_shebang, build_args: spec.build_args, bin_dir: bin_dir, + install_as_default: spec.default_gem?, } if options[:only_executables] diff --git a/test/rubygems/test_gem_commands_pristine_command.rb b/test/rubygems/test_gem_commands_pristine_command.rb index b8b39133ff2ecc..190f78c79f39c3 100644 --- a/test/rubygems/test_gem_commands_pristine_command.rb +++ b/test/rubygems/test_gem_commands_pristine_command.rb @@ -642,7 +642,8 @@ def test_execute_default_gem assert_equal( [ "Restoring gems to pristine condition...", - "Skipped default-2.0.0.0, it is a default gem", + "Cached gem for default-2.0.0.0 not found, attempting to fetch...", + "Skipped default-2.0.0.0, it was not found from cache and remote sources", ], @ui.output.split("\n") ) From dee15211c154cc70409a6010883140f259d1c483 Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Wed, 9 Oct 2024 17:17:37 +1300 Subject: [PATCH 794/829] Update `BasicSocket` to use `rb_io_blocking_region`. --- ext/socket/basicsocket.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/socket/basicsocket.c b/ext/socket/basicsocket.c index 8af8374ecf93f5..2fcae8eb54f37c 100644 --- a/ext/socket/basicsocket.c +++ b/ext/socket/basicsocket.c @@ -597,7 +597,7 @@ rsock_bsock_send(int argc, VALUE *argv, VALUE socket) rb_io_wait(socket, RB_INT2NUM(RUBY_IO_WRITABLE), Qnil); #endif - ssize_t n = (ssize_t)BLOCKING_REGION_FD(func, &arg); + ssize_t n = (ssize_t)rb_io_blocking_region(fptr, func, &arg); if (n >= 0) return SSIZET2NUM(n); From d78bf437083229842925c45f4190d29773026e1b Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Wed, 9 Oct 2024 17:19:05 +1300 Subject: [PATCH 795/829] Update `UNIXSocket` to use `rb_io_blocking_region`. --- ext/socket/unixsocket.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/socket/unixsocket.c b/ext/socket/unixsocket.c index a8475e3e6090a4..b08e3bb708c91d 100644 --- a/ext/socket/unixsocket.c +++ b/ext/socket/unixsocket.c @@ -288,7 +288,7 @@ unix_send_io(VALUE sock, VALUE val) #endif arg.fd = fptr->fd; - while ((int)BLOCKING_REGION_FD(sendmsg_blocking, &arg) == -1) { + while ((int)rb_io_blocking_region(fptr, sendmsg_blocking, &arg) == -1) { if (!rb_io_wait_writable(arg.fd)) rsock_sys_fail_path("sendmsg(2)", fptr->pathv); } @@ -390,7 +390,7 @@ unix_recv_io(int argc, VALUE *argv, VALUE sock) #endif arg.fd = fptr->fd; - while ((int)BLOCKING_REGION_FD(recvmsg_blocking, &arg) == -1) { + while ((int)rb_io_blocking_region(fptr, recvmsg_blocking, &arg) == -1) { int e = errno; if (e == EMSGSIZE && !(gc_reason & GC_REASON_EMSGSIZE)) { /* FreeBSD gets here when we're out of FDs */ From 823f29a36edd25136999d5a649eaff5e4a41481c Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Wed, 9 Oct 2024 17:20:33 +1300 Subject: [PATCH 796/829] Update `IPSocket` to use `rb_io_descriptor` and `rb_io_mode`. --- ext/socket/ipsocket.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/ext/socket/ipsocket.c b/ext/socket/ipsocket.c index 0c1362025846c1..d94584c90baae1 100644 --- a/ext/socket/ipsocket.c +++ b/ext/socket/ipsocket.c @@ -274,16 +274,13 @@ ip_inspect(VALUE sock) static VALUE ip_addr(int argc, VALUE *argv, VALUE sock) { - rb_io_t *fptr; union_sockaddr addr; socklen_t len = (socklen_t)sizeof addr; int norevlookup; - GetOpenFile(sock, fptr); - if (argc < 1 || !rsock_revlookup_flag(argv[0], &norevlookup)) - norevlookup = fptr->mode & FMODE_NOREVLOOKUP; - if (getsockname(fptr->fd, &addr.addr, &len) < 0) + norevlookup = rb_io_mode(sock) & FMODE_NOREVLOOKUP; + if (getsockname(rb_io_descriptor(sock), &addr.addr, &len) < 0) rb_sys_fail("getsockname(2)"); return rsock_ipaddr(&addr.addr, len, norevlookup); } @@ -315,16 +312,13 @@ ip_addr(int argc, VALUE *argv, VALUE sock) static VALUE ip_peeraddr(int argc, VALUE *argv, VALUE sock) { - rb_io_t *fptr; union_sockaddr addr; socklen_t len = (socklen_t)sizeof addr; int norevlookup; - GetOpenFile(sock, fptr); - if (argc < 1 || !rsock_revlookup_flag(argv[0], &norevlookup)) - norevlookup = fptr->mode & FMODE_NOREVLOOKUP; - if (getpeername(fptr->fd, &addr.addr, &len) < 0) + norevlookup = rb_io_mode(sock) & FMODE_NOREVLOOKUP; + if (getpeername(rb_io_descriptor(sock), &addr.addr, &len) < 0) rb_sys_fail("getpeername(2)"); return rsock_ipaddr(&addr.addr, len, norevlookup); } From 5eee2698661eb4d6afbfd6db4a3e6318b5eefad1 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Wed, 9 Oct 2024 17:55:49 +0900 Subject: [PATCH 797/829] Make mkconfig.rb string literals frozen --- tool/mkconfig.rb | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tool/mkconfig.rb b/tool/mkconfig.rb index 55e781a28e5764..a83a3563f9d3c6 100755 --- a/tool/mkconfig.rb +++ b/tool/mkconfig.rb @@ -1,4 +1,5 @@ #!./miniruby -s +# frozen-string-literal: true # This script, which is run when ruby is built, generates rbconfig.rb by # parsing information from config.status. rbconfig.rb contains build @@ -169,8 +170,8 @@ def vars.expand(val, config = self) val.replace(newval) unless newval == val val end -prefix = vars.expand(vars["prefix"] ||= "") -rubyarchdir = vars.expand(vars["rubyarchdir"] ||= "") +prefix = vars.expand(vars["prefix"] ||= +"") +rubyarchdir = vars.expand(vars["rubyarchdir"] ||= +"") relative_archdir = rubyarchdir.rindex(prefix, 0) ? rubyarchdir[prefix.size..-1] : rubyarchdir puts %[\ @@ -257,14 +258,14 @@ module RbConfig v_others.compact! if $install_name - if install_name and vars.expand("$(RUBY_INSTALL_NAME)") == $install_name + if install_name and vars.expand(+"$(RUBY_INSTALL_NAME)") == $install_name $install_name = install_name end v_fast << " CONFIG[\"ruby_install_name\"] = \"" + $install_name + "\"\n" v_fast << " CONFIG[\"RUBY_INSTALL_NAME\"] = \"" + $install_name + "\"\n" end if $so_name - if so_name and vars.expand("$(RUBY_SO_NAME)") == $so_name + if so_name and vars.expand(+"$(RUBY_SO_NAME)") == $so_name $so_name = so_name end v_fast << " CONFIG[\"RUBY_SO_NAME\"] = \"" + $so_name + "\"\n" From 48410af53c83a0c351004c5f661571108f84391b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Mon, 7 Oct 2024 22:33:53 +0200 Subject: [PATCH 798/829] [rubygems/rubygems] Fix a `gem install` crash during "done installing" hooks It would happen when the gem is already installed to multiple GEM_PATHS. RubyGems was removing duplicate specs without considering the potentially different `base_dir`. That was causing the gem to be misidentified as not already installed, and a nil specification getting returned from the installer as a result, causing the crash. Solve it by making sure `Gem::Specification.all` really iterates through all the different specifications in all GEM_PATHs. https://github.com/rubygems/rubygems/commit/0d8c208f65 --- lib/rubygems/specification_record.rb | 2 +- .../rubygems/test_gem_dependency_installer.rb | 43 +++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/lib/rubygems/specification_record.rb b/lib/rubygems/specification_record.rb index 664d5062651492..d838fcea26912a 100644 --- a/lib/rubygems/specification_record.rb +++ b/lib/rubygems/specification_record.rb @@ -30,7 +30,7 @@ def initialize(dirs) # Returns the list of all specifications in the record def all - @all ||= Gem.loaded_specs.values | stubs.map(&:to_spec) + @all ||= Gem.loaded_specs.values + stubs.map(&:to_spec) end ## diff --git a/test/rubygems/test_gem_dependency_installer.rb b/test/rubygems/test_gem_dependency_installer.rb index 8999723ba1e2dd..8378d85bdf75b9 100644 --- a/test/rubygems/test_gem_dependency_installer.rb +++ b/test/rubygems/test_gem_dependency_installer.rb @@ -819,6 +819,49 @@ def test_install_reinstall assert_equal %w[a-1], inst.installed_gems.map(&:full_name) end + def test_install_dual_repository_and_done_installing_hooks + util_setup_gems + + FileUtils.mv @a1_gem, @tempdir + FileUtils.mv @b1_gem, @tempdir + inst = nil + + # Make sure gem is installed to standard GEM_HOME + + Dir.chdir @tempdir do + inst = Gem::DependencyInstaller.new install_dir: @gemhome + inst.install "b" + end + + # and also to an additional GEM_PATH + + gemhome2 = "#{@gemhome}2" + + Dir.chdir @tempdir do + inst = Gem::DependencyInstaller.new install_dir: gemhome2 + inst.install "b" + end + + # Now install the local gem with the additional GEM_PATH + + ENV["GEM_HOME"] = @gemhome + ENV["GEM_PATH"] = [@gemhome, gemhome2].join File::PATH_SEPARATOR + Gem.clear_paths + + Gem.done_installing do |installer, specs| + done_installing_ran = true + refute_nil installer + assert_equal [@b1], specs + end + + Dir.chdir @tempdir do + inst = Gem::DependencyInstaller.new + inst.install "b-1.gem" + end + + assert_equal %w[b-1], inst.installed_gems.map(&:full_name) + end + def test_install_remote util_setup_gems From 67d6e89b0b6d7dd7d6454ace7734157ee51f3f79 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Wed, 9 Oct 2024 19:09:17 +0900 Subject: [PATCH 799/829] Added byroot to JSON maintainer [Misc #20746] --- doc/maintainers.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/maintainers.md b/doc/maintainers.md index e31ac2553126f7..fa2c24140b4944 100644 --- a/doc/maintainers.md +++ b/doc/maintainers.md @@ -348,6 +348,7 @@ have commit right, others don't. #### ext/json * NARUSE, Yui (naruse) * Hiroshi SHIBATA (hsbt) +* Jean Boussier (byroot) * https://github.com/ruby/json * https://rubygems.org/gems/json From 3031bf6bd46c56f90f1944e41dcb4a5fb9948e40 Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Wed, 9 Oct 2024 21:50:16 +1300 Subject: [PATCH 800/829] Update `UDPSocket#send` to use `rb_io_blocking_region`. --- ext/socket/udpsocket.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ext/socket/udpsocket.c b/ext/socket/udpsocket.c index 5224e48a96a1fd..8aada76b26dc81 100644 --- a/ext/socket/udpsocket.c +++ b/ext/socket/udpsocket.c @@ -156,6 +156,7 @@ udp_send_internal(VALUE v) struct addrinfo *res; rb_io_check_closed(fptr = arg->fptr); + for (res = arg->res->ai; res; res = res->ai_next) { retry: arg->sarg.fd = fptr->fd; @@ -166,7 +167,7 @@ udp_send_internal(VALUE v) rb_io_wait(fptr->self, RB_INT2NUM(RUBY_IO_WRITABLE), Qnil); #endif - ssize_t n = (ssize_t)BLOCKING_REGION_FD(rsock_sendto_blocking, &arg->sarg); + ssize_t n = (ssize_t)rb_io_blocking_region(fptr, rsock_sendto_blocking, &arg->sarg); if (n >= 0) return RB_SSIZE2NUM(n); From 04ddb7e8084aa2fdb07ca4da2b4369cca275c1d9 Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Wed, 9 Oct 2024 21:52:30 +1300 Subject: [PATCH 801/829] Update `Socket#accept` to use `rb_io_blocking_region`. --- ext/socket/init.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/socket/init.c b/ext/socket/init.c index 0e312b540e88cf..ab847cb2679fa7 100644 --- a/ext/socket/init.c +++ b/ext/socket/init.c @@ -719,7 +719,7 @@ rsock_s_accept(VALUE klass, VALUE io, struct sockaddr *sockaddr, socklen_t *len) #ifdef RSOCK_WAIT_BEFORE_BLOCKING rb_io_wait(fptr->self, RB_INT2NUM(RUBY_IO_READABLE), Qnil); #endif - peer = (int)BLOCKING_REGION_FD(accept_blocking, &accept_arg); + peer = (int)rb_io_blocking_region(fptr, accept_blocking, &accept_arg); if (peer < 0) { int error = errno; From 438ef21a9b50815f645a324e3d8950750467fd29 Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Wed, 9 Oct 2024 21:55:20 +1300 Subject: [PATCH 802/829] Update `Socket#recvfrom` to use `rb_io_blocking_region`. --- ext/socket/init.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ext/socket/init.c b/ext/socket/init.c index ab847cb2679fa7..90870fec6915a8 100644 --- a/ext/socket/init.c +++ b/ext/socket/init.c @@ -107,6 +107,7 @@ rsock_send_blocking(void *data) } struct recvfrom_arg { + rb_io_t *fptr; int fd, flags; VALUE str; size_t length; @@ -151,7 +152,7 @@ recvfrom_locktmp(VALUE v) { struct recvfrom_arg *arg = (struct recvfrom_arg *)v; - return rb_thread_io_blocking_region(recvfrom_blocking, arg, arg->fd); + return rb_io_blocking_region(arg->fptr, recvfrom_blocking, arg); } int @@ -192,6 +193,7 @@ rsock_s_recvfrom(VALUE socket, int argc, VALUE *argv, enum sock_recv_type from) rb_raise(rb_eIOError, "recv for buffered IO"); } + arg.fptr = fptr; arg.fd = fptr->fd; arg.alen = (socklen_t)sizeof(arg.buf); arg.str = str; From 3aa044f10c1db1608974ba4bc282c7dd1c9db3f5 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Wed, 9 Oct 2024 20:45:18 +0900 Subject: [PATCH 803/829] [Bug #20791] Set LIBRUBY_RELATIVE on mswin --- win32/Makefile.sub | 1 + 1 file changed, 1 insertion(+) diff --git a/win32/Makefile.sub b/win32/Makefile.sub index 6ca909f61bad2b..6dbb7316f717d8 100644 --- a/win32/Makefile.sub +++ b/win32/Makefile.sub @@ -1081,6 +1081,7 @@ s,@RUBY_SO_NAME@,$(RUBY_SO_NAME),;t t s,@LIBRUBY_A@,$$(RUBY_SO_NAME)-static.lib,;t t s,@LIBRUBY_SO@,$$(RUBY_SO_NAME).dll,;t t s,@LIBRUBY_ALIASES@,$(LIBRUBY_ALIASES),;t t +s,@LIBRUBY_RELATIVE@,$(LIBRUBY_RELATIVE),;t t s,@LIBRUBY@,$$(RUBY_SO_NAME).lib,;t t s,@LIBRUBYARG@,$$(LIBRUBYARG_SHARED),;t t s,@LIBRUBYARG_STATIC@,$$(LIBRUBY_A) $$(MAINLIBS),;t t From d10e09b7e345c803c16e05ac3e75eb23749d4024 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Wed, 9 Oct 2024 12:28:57 +0200 Subject: [PATCH 804/829] [rubygems/rubygems] Add `Gem::Specification#gem_dir` back If old Bundler versions that unconditionally try to remove this method are run with RubyGems versions _without_ this method, Bundler crashes because it tries to remove a method that does not exist. We need to wait until RubyGems cannot install any Bundler versions that unconditionally remove this method. https://github.com/rubygems/rubygems/commit/98804d261d --- lib/rubygems/specification.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/rubygems/specification.rb b/lib/rubygems/specification.rb index 4753186a838df9..e5541e57b12d24 100644 --- a/lib/rubygems/specification.rb +++ b/lib/rubygems/specification.rb @@ -1912,6 +1912,14 @@ def full_name @full_name ||= super end + ## + # Work around old bundler versions removing my methods + # Can be removed once RubyGems can no longer install Bundler 2.5 + + def gem_dir # :nodoc: + super + end + def gems_dir @gems_dir ||= File.join(base_dir, "gems") end From 615a0872167e274d720d7d6bc3fe9a0f34bb44cf Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Wed, 9 Oct 2024 08:35:32 -0400 Subject: [PATCH 805/829] [ruby/json] Restore the simple standlone benchmark for iterating https://github.com/ruby/json/commit/7b68800991 --- benchmark/data/ohai.json | 1216 ++++++++++++++++++++++++++++++++++++++ benchmark/standalone.rb | 41 ++ 2 files changed, 1257 insertions(+) create mode 100644 benchmark/data/ohai.json create mode 100644 benchmark/standalone.rb diff --git a/benchmark/data/ohai.json b/benchmark/data/ohai.json new file mode 100644 index 00000000000000..584bdbd08563b0 --- /dev/null +++ b/benchmark/data/ohai.json @@ -0,0 +1,1216 @@ +{ + "command": { + "ps": "ps -ef" + }, + "kernel": { + "modules": { + "org.virtualbox.kext.VBoxDrv": { + "size": 118784, + "version": "2.2.0", + "index": "114", + "refcount": "3" + }, + "com.cisco.nke.ipsec": { + "size": 454656, + "version": "2.0.1", + "index": "111", + "refcount": "0" + }, + "com.apple.driver.AppleAPIC": { + "size": 12288, + "version": "1.4", + "index": "26", + "refcount": "0" + }, + "com.apple.driver.AirPort.Atheros": { + "size": 593920, + "version": "318.8.3", + "index": "88", + "refcount": "0" + }, + "com.apple.driver.AppleIntelCPUPowerManagement": { + "size": 102400, + "version": "59.0.1", + "index": "22", + "refcount": "0" + }, + "com.apple.iokit.IOStorageFamily": { + "size": 98304, + "version": "1.5.5", + "index": "44", + "refcount": "9" + }, + "com.apple.iokit.IOATAPIProtocolTransport": { + "size": 16384, + "version": "1.5.2", + "index": "52", + "refcount": "0" + }, + "com.apple.iokit.IOPCIFamily": { + "size": 65536, + "version": "2.5", + "index": "17", + "refcount": "18" + }, + "com.apple.driver.AppleHPET": { + "size": 12288, + "version": "1.3", + "index": "33", + "refcount": "0" + }, + "com.apple.driver.AppleUSBHub": { + "size": 49152, + "version": "3.2.7", + "index": "47", + "refcount": "0" + }, + "com.apple.iokit.IOFireWireFamily": { + "size": 258048, + "version": "3.4.6", + "index": "49", + "refcount": "2" + }, + "com.apple.driver.AppleUSBComposite": { + "size": 16384, + "version": "3.2.0", + "index": "60", + "refcount": "1" + }, + "com.apple.driver.AppleIntelPIIXATA": { + "size": 36864, + "version": "2.0.0", + "index": "41", + "refcount": "0" + }, + "com.apple.driver.AppleSmartBatteryManager": { + "size": 28672, + "version": "158.6.0", + "index": "32", + "refcount": "0" + }, + "com.apple.filesystems.udf": { + "size": 233472, + "version": "2.0.2", + "index": "119", + "refcount": "0" + }, + "com.apple.iokit.IOSMBusFamily": { + "size": 12288, + "version": "1.1", + "index": "27", + "refcount": "2" + }, + "com.apple.iokit.IOACPIFamily": { + "size": 16384, + "version": "1.2.0", + "index": "18", + "refcount": "10" + }, + "foo.tap": { + "size": 24576, + "version": "1.0", + "index": "113", + "refcount": "0" + }, + "com.vmware.kext.vmx86": { + "size": 864256, + "version": "2.0.4", + "index": "104", + "refcount": "0" + }, + "com.apple.iokit.CHUDUtils": { + "size": 28672, + "version": "200", + "index": "98", + "refcount": "0" + }, + "org.virtualbox.kext.VBoxNetAdp": { + "size": 8192, + "version": "2.2.0", + "index": "117", + "refcount": "0" + }, + "com.apple.filesystems.autofs": { + "size": 45056, + "version": "2.0.1", + "index": "109", + "refcount": "0" + }, + "com.vmware.kext.vmnet": { + "size": 36864, + "version": "2.0.4", + "index": "108", + "refcount": "0" + }, + "com.apple.driver.AppleACPIButtons": { + "size": 16384, + "version": "1.2.4", + "index": "30", + "refcount": "0" + }, + "com.apple.driver.AppleFWOHCI": { + "size": 139264, + "version": "3.7.2", + "index": "50", + "refcount": "0" + }, + "com.apple.iokit.IOSCSIArchitectureModelFamily": { + "size": 102400, + "version": "2.0.5", + "index": "51", + "refcount": "4" + }, + "com.apple.iokit.IOSCSIBlockCommandsDevice": { + "size": 90112, + "version": "2.0.5", + "index": "57", + "refcount": "1" + }, + "com.apple.driver.AppleACPIPCI": { + "size": 12288, + "version": "1.2.4", + "index": "31", + "refcount": "0" + }, + "com.apple.security.seatbelt": { + "size": 98304, + "version": "107.10", + "index": "25", + "refcount": "0" + }, + "com.apple.driver.AppleUpstreamUserClient": { + "size": 16384, + "version": "2.7.2", + "index": "100", + "refcount": "0" + }, + "com.apple.kext.OSvKernDSPLib": { + "size": 12288, + "version": "1.1", + "index": "79", + "refcount": "1" + }, + "com.apple.iokit.IOBDStorageFamily": { + "size": 20480, + "version": "1.5", + "index": "58", + "refcount": "1" + }, + "com.apple.iokit.IOGraphicsFamily": { + "size": 118784, + "version": "1.7.1", + "index": "70", + "refcount": "5" + }, + "com.apple.iokit.IONetworkingFamily": { + "size": 90112, + "version": "1.6.1", + "index": "82", + "refcount": "4" + }, + "com.apple.iokit.IOATAFamily": { + "size": 53248, + "version": "2.0.0", + "index": "40", + "refcount": "2" + }, + "com.apple.iokit.IOUSBHIDDriver": { + "size": 20480, + "version": "3.2.2", + "index": "63", + "refcount": "2" + }, + "org.virtualbox.kext.VBoxUSB": { + "size": 28672, + "version": "2.2.0", + "index": "115", + "refcount": "0" + }, + "com.vmware.kext.vmioplug": { + "size": 24576, + "version": "2.0.4", + "index": "107", + "refcount": "0" + }, + "com.apple.security.TMSafetyNet": { + "size": 12288, + "version": "3", + "index": "23", + "refcount": "0" + }, + "com.apple.iokit.IONDRVSupport": { + "size": 57344, + "version": "1.7.1", + "index": "71", + "refcount": "3" + }, + "com.apple.BootCache": { + "size": 20480, + "version": "30.3", + "index": "20", + "refcount": "0" + }, + "com.apple.iokit.IOUSBUserClient": { + "size": 8192, + "version": "3.2.4", + "index": "46", + "refcount": "1" + }, + "com.apple.iokit.IOSCSIMultimediaCommandsDevice": { + "size": 90112, + "version": "2.0.5", + "index": "59", + "refcount": "0" + }, + "com.apple.driver.AppleIRController": { + "size": 20480, + "version": "110", + "index": "78", + "refcount": "0" + }, + "com.apple.driver.AudioIPCDriver": { + "size": 16384, + "version": "1.0.5", + "index": "81", + "refcount": "0" + }, + "org.virtualbox.kext.VBoxNetFlt": { + "size": 16384, + "version": "2.2.0", + "index": "116", + "refcount": "0" + }, + "com.apple.driver.AppleLPC": { + "size": 12288, + "version": "1.2.11", + "index": "73", + "refcount": "0" + }, + "com.apple.iokit.CHUDKernLib": { + "size": 20480, + "version": "196", + "index": "93", + "refcount": "2" + }, + "com.apple.iokit.CHUDProf": { + "size": 49152, + "version": "207", + "index": "97", + "refcount": "0" + }, + "com.apple.NVDAResman": { + "size": 2478080, + "version": "5.3.6", + "index": "90", + "refcount": "2" + }, + "com.apple.driver.AppleACPIEC": { + "size": 20480, + "version": "1.2.4", + "index": "28", + "refcount": "0" + }, + "foo.tun": { + "size": 24576, + "version": "1.0", + "index": "118", + "refcount": "0" + }, + "com.apple.iokit.IOSerialFamily": { + "size": 36864, + "version": "9.3", + "index": "102", + "refcount": "1" + }, + "com.apple.GeForce": { + "size": 622592, + "version": "5.3.6", + "index": "96", + "refcount": "0" + }, + "com.apple.iokit.IOCDStorageFamily": { + "size": 32768, + "version": "1.5", + "index": "55", + "refcount": "3" + }, + "com.apple.driver.AppleUSBEHCI": { + "size": 73728, + "version": "3.2.5", + "index": "39", + "refcount": "0" + }, + "com.apple.nvidia.nv50hal": { + "size": 2445312, + "version": "5.3.6", + "index": "91", + "refcount": "0" + }, + "com.apple.driver.AppleSMBIOS": { + "size": 16384, + "version": "1.1.1", + "index": "29", + "refcount": "0" + }, + "com.apple.driver.AppleBacklight": { + "size": 16384, + "version": "1.4.4", + "index": "72", + "refcount": "0" + }, + "com.apple.driver.AppleACPIPlatform": { + "size": 253952, + "version": "1.2.4", + "index": "19", + "refcount": "3" + }, + "com.apple.iokit.SCSITaskUserClient": { + "size": 24576, + "version": "2.0.5", + "index": "54", + "refcount": "0" + }, + "com.apple.iokit.IOHIDFamily": { + "size": 233472, + "version": "1.5.3", + "index": "21", + "refcount": "7" + }, + "com.apple.driver.DiskImages": { + "size": 65536, + "version": "195.2.2", + "index": "101", + "refcount": "0" + }, + "com.apple.iokit.IODVDStorageFamily": { + "size": 24576, + "version": "1.5", + "index": "56", + "refcount": "2" + }, + "com.apple.driver.XsanFilter": { + "size": 20480, + "version": "2.7.91", + "index": "53", + "refcount": "0" + }, + "com.apple.driver.AppleEFIRuntime": { + "size": 12288, + "version": "1.2.0", + "index": "35", + "refcount": "1" + }, + "com.apple.driver.AppleRTC": { + "size": 20480, + "version": "1.2.3", + "index": "34", + "refcount": "0" + }, + "com.apple.iokit.IOFireWireIP": { + "size": 36864, + "version": "1.7.6", + "index": "83", + "refcount": "0" + }, + "com.vmware.kext.vmci": { + "size": 45056, + "version": "2.0.4", + "index": "106", + "refcount": "0" + }, + "com.apple.iokit.IO80211Family": { + "size": 126976, + "version": "215.1", + "index": "87", + "refcount": "1" + }, + "com.apple.nke.applicationfirewall": { + "size": 32768, + "version": "1.0.77", + "index": "24", + "refcount": "0" + }, + "com.apple.iokit.IOAHCIBlockStorage": { + "size": 69632, + "version": "1.2.0", + "index": "48", + "refcount": "0" + }, + "com.apple.driver.AppleUSBUHCI": { + "size": 57344, + "version": "3.2.5", + "index": "38", + "refcount": "0" + }, + "com.apple.iokit.IOAHCIFamily": { + "size": 24576, + "version": "1.5.0", + "index": "42", + "refcount": "2" + }, + "com.apple.driver.AppleAHCIPort": { + "size": 53248, + "version": "1.5.2", + "index": "43", + "refcount": "0" + }, + "com.apple.driver.AppleEFINVRAM": { + "size": 24576, + "version": "1.2.0", + "index": "36", + "refcount": "0" + }, + "com.apple.iokit.IOUSBFamily": { + "size": 167936, + "version": "3.2.7", + "index": "37", + "refcount": "13" + }, + "com.apple.driver.AppleUSBMergeNub": { + "size": 12288, + "version": "3.2.4", + "index": "61", + "refcount": "0" + } + }, + "machine": "i386", + "name": "Darwin", + "os": "Darwin", + "version": "Darwin Kernel Version 9.6.0: Mon Nov 24 17:37:00 PST 2008; root:xnu-1228.9.59~1\/RELEASE_I386", + "release": "9.6.0" + }, + "platform_version": "10.5.6", + "platform": "mac_os_x", + "ipaddress": "192.168.88.1", + "keys": { + "ssh": { + "host_dsa_public": "private", + "host_rsa_public": "private" + } + }, + "network": { + "settings": { + "net.inet6.ip6.forwarding": "0", + "net.inet.ip.dummynet.debug": "0", + "net.inet.ip.rtexpire": "10", + "net.inet6.ipsec6.esp_trans_deflev": "1", + "net.inet.tcp.tcbhashsize": "4096", + "net.key.esp_auth": "0", + "net.inet6.ip6.hlim": "64", + "net.inet.ip.fw.dyn_fin_lifetime": "1", + "net.inet.ip.fw.dyn_udp_lifetime": "10", + "net.inet.icmp.bmcastecho": "1", + "net.athforceBias": "2 2", + "net.athbgscan": "1 1", + "net.inet.tcp.reass.maxsegments": "2048", + "net.inet6.ip6.auto_flowlabel": "1", + "net.inet6.ip6.rtmaxcache": "128", + "net.inet.tcp.sendspace": "131072", + "net.inet.tcp.keepinit": "75000", + "net.inet.ip.dummynet.max_chain_len": "16", + "net.inet.tcp.rfc1644": "0", + "net.inet.ip.fw.curr_dyn_buckets": "256", + "net.inet.ip.dummynet.ready_heap": "0", + "net.inet.ip.portrange.first": "49152", + "net.inet.tcp.background_io_trigger": "5", + "net.link.ether.inet.host_down_time": "20", + "net.inet6.ipsec6.def_policy": "1", + "net.inet6.ipsec6.ecn": "0", + "net.inet.ip.fastforwarding": "0", + "net.athaddbaignore": "0 0", + "net.inet6.ip6.v6only": "0", + "net.inet.tcp.sack": "1", + "net.inet6.ip6.rtexpire": "3600", + "net.link.ether.inet.proxyall": "0", + "net.inet6.ip6.keepfaith": "0", + "net.key.spi_trycnt": "1000", + "net.link.ether.inet.prune_intvl": "300", + "net.inet.tcp.ecn_initiate_out": "0", + "net.inet.ip.fw.dyn_rst_lifetime": "1", + "net.local.stream.sendspace": "8192", + "net.inet.tcp.socket_unlocked_on_output": "1", + "net.inet.ip.fw.verbose_limit": "0", + "net.local.dgram.recvspace": "4096", + "net.inet.ipsec.debug": "0", + "net.link.ether.inet.log_arp_warnings": "0", + "net.inet.tcp.ecn_negotiate_in": "0", + "net.inet.tcp.rfc3465": "1", + "net.inet.tcp.icmp_may_rst": "1", + "net.link.ether.inet.sendllconflict": "0", + "net.inet.ipsec.ah_offsetmask": "0", + "net.key.blockacq_count": "10", + "net.inet.tcp.delayed_ack": "3", + "net.inet.ip.fw.verbose": "2", + "net.inet.ip.fw.dyn_count": "0", + "net.inet.tcp.slowlink_wsize": "8192", + "net.inet6.ip6.fw.enable": "1", + "net.inet.ip.portrange.hilast": "65535", + "net.inet.icmp.maskrepl": "0", + "net.link.ether.inet.apple_hwcksum_rx": "1", + "net.inet.tcp.drop_synfin": "1", + "net.key.spi_maxval": "268435455", + "net.inet.ipsec.ecn": "0", + "net.inet.ip.fw.dyn_keepalive": "1", + "net.key.int_random": "60", + "net.key.debug": "0", + "net.inet.ip.dummynet.curr_time": "0", + "net.inet.udp.blackhole": "0", + "net.athaggrqmin": "1 1", + "net.athppmenable": "1 1", + "net.inet.ip.fw.dyn_syn_lifetime": "20", + "net.inet.tcp.keepidle": "7200000", + "net.inet6.ip6.tempvltime": "604800", + "net.inet.tcp.recvspace": "358400", + "net.inet.tcp.keepintvl": "75000", + "net.inet.udp.maxdgram": "9216", + "net.inet.ip.maxchainsent": "0", + "net.inet.ipsec.esp_net_deflev": "1", + "net.inet6.icmp6.nd6_useloopback": "1", + "net.inet.tcp.slowstart_flightsize": "1", + "net.inet.ip.fw.debug": "0", + "net.inet.ip.linklocal.in.allowbadttl": "1", + "net.key.spi_minval": "256", + "net.inet.ip.forwarding": "0", + "net.inet.tcp.v6mssdflt": "1024", + "net.key.larval_lifetime": "30", + "net.inet6.ip6.fw.verbose_limit": "0", + "net.inet.ip.dummynet.red_lookup_depth": "256", + "net.inet.tcp.pcbcount": "36", + "net.inet.ip.fw.dyn_ack_lifetime": "300", + "net.inet.ip.portrange.lowlast": "600", + "net.athCCAThreshold": "28 28", + "net.link.ether.inet.useloopback": "1", + "net.athqdepth": "0 0", + "net.inet.ip.ttl": "64", + "net.inet.ip.rtmaxcache": "128", + "net.inet.ipsec.bypass": "0", + "net.inet6.icmp6.nd6_debug": "0", + "net.inet.ip.use_route_genid": "1", + "net.inet6.icmp6.rediraccept": "1", + "net.inet.ip.fw.static_count": "1", + "net.inet6.ip6.fw.debug": "0", + "net.inet.udp.pcbcount": "104", + "net.inet.ipsec.esp_randpad": "-1", + "net.inet6.icmp6.nd6_maxnudhint": "0", + "net.inet.tcp.always_keepalive": "0", + "net.inet.udp.checksum": "1", + "net.link.ether.inet.keep_announcements": "1", + "net.athfixedDropThresh": "150 150", + "net.inet6.ip6.kame_version": "20010528\/apple-darwin", + "net.inet.ip.fw.dyn_max": "4096", + "net.inet.udp.log_in_vain": "0", + "net.inet6.icmp6.nd6_mmaxtries": "3", + "net.inet.ip.rtminexpire": "10", + "net.inet.ip.fw.dyn_buckets": "256", + "net.inet6.ip6.accept_rtadv": "0", + "net.inet6.ip6.rr_prune": "5", + "net.key.ah_keymin": "128", + "net.inet.ip.redirect": "1", + "net.inet.tcp.sack_globalmaxholes": "65536", + "net.inet.ip.keepfaith": "0", + "net.inet.ip.dummynet.expire": "1", + "net.inet.ip.gifttl": "30", + "net.inet.ip.portrange.last": "65535", + "net.inet.ipsec.ah_net_deflev": "1", + "net.inet6.icmp6.nd6_delay": "5", + "net.inet.tcp.packetchain": "50", + "net.inet6.ip6.hdrnestlimit": "50", + "net.inet.tcp.newreno": "0", + "net.inet6.ip6.dad_count": "1", + "net.inet6.ip6.auto_linklocal": "1", + "net.inet6.ip6.temppltime": "86400", + "net.inet.tcp.strict_rfc1948": "0", + "net.athdupie": "1 1", + "net.inet.ip.dummynet.red_max_pkt_size": "1500", + "net.inet.ip.maxfrags": "2048", + "net.inet.tcp.log_in_vain": "0", + "net.inet.tcp.rfc1323": "1", + "net.inet.ip.subnets_are_local": "0", + "net.inet.ip.dummynet.search_steps": "0", + "net.inet.icmp.icmplim": "250", + "net.link.ether.inet.apple_hwcksum_tx": "1", + "net.inet6.icmp6.redirtimeout": "600", + "net.inet.ipsec.ah_cleartos": "1", + "net.inet6.ip6.log_interval": "5", + "net.link.ether.inet.max_age": "1200", + "net.inet.ip.fw.enable": "1", + "net.inet6.ip6.redirect": "1", + "net.athaggrfmax": "28 28", + "net.inet.ip.maxfragsperpacket": "128", + "net.inet6.ip6.use_deprecated": "1", + "net.link.generic.system.dlil_input_sanity_check": "0", + "net.inet.tcp.sack_globalholes": "0", + "net.inet.tcp.reass.cursegments": "0", + "net.inet6.icmp6.nodeinfo": "3", + "net.local.inflight": "0", + "net.inet.ip.dummynet.hash_size": "64", + "net.inet.ip.dummynet.red_avg_pkt_size": "512", + "net.inet.ipsec.dfbit": "0", + "net.inet.tcp.reass.overflows": "0", + "net.inet.tcp.rexmt_thresh": "2", + "net.inet6.ip6.maxfrags": "8192", + "net.inet6.ip6.rtminexpire": "10", + "net.inet6.ipsec6.esp_net_deflev": "1", + "net.inet.tcp.blackhole": "0", + "net.key.esp_keymin": "256", + "net.inet.ip.check_interface": "0", + "net.inet.tcp.minmssoverload": "0", + "net.link.ether.inet.maxtries": "5", + "net.inet.tcp.do_tcpdrain": "0", + "net.inet.ipsec.esp_port": "4500", + "net.inet6.ipsec6.ah_net_deflev": "1", + "net.inet.ip.dummynet.extract_heap": "0", + "net.inet.tcp.path_mtu_discovery": "1", + "net.inet.ip.intr_queue_maxlen": "50", + "net.inet.ipsec.def_policy": "1", + "net.inet.ip.fw.autoinc_step": "100", + "net.inet.ip.accept_sourceroute": "0", + "net.inet.raw.maxdgram": "8192", + "net.inet.ip.maxfragpackets": "1024", + "net.inet.ip.fw.one_pass": "0", + "net.appletalk.routermix": "2000", + "net.inet.tcp.tcp_lq_overflow": "1", + "net.link.generic.system.ifcount": "9", + "net.link.ether.inet.send_conflicting_probes": "1", + "net.inet.tcp.background_io_enabled": "1", + "net.inet6.ipsec6.debug": "0", + "net.inet.tcp.win_scale_factor": "3", + "net.key.natt_keepalive_interval": "20", + "net.inet.tcp.msl": "15000", + "net.inet.ip.portrange.hifirst": "49152", + "net.inet.ipsec.ah_trans_deflev": "1", + "net.inet.tcp.rtt_min": "1", + "net.inet6.ip6.defmcasthlim": "1", + "net.inet6.icmp6.nd6_prune": "1", + "net.inet6.ip6.fw.verbose": "0", + "net.inet.ip.portrange.lowfirst": "1023", + "net.inet.tcp.maxseg_unacked": "8", + "net.local.dgram.maxdgram": "2048", + "net.key.blockacq_lifetime": "20", + "net.inet.tcp.sack_maxholes": "128", + "net.inet6.ip6.maxfragpackets": "1024", + "net.inet6.ip6.use_tempaddr": "0", + "net.athpowermode": "0 0", + "net.inet.udp.recvspace": "73728", + "net.inet.tcp.isn_reseed_interval": "0", + "net.inet.tcp.local_slowstart_flightsize": "8", + "net.inet.ip.dummynet.searches": "0", + "net.inet.ip.intr_queue_drops": "0", + "net.link.generic.system.multi_threaded_input": "1", + "net.inet.raw.recvspace": "8192", + "net.inet.ipsec.esp_trans_deflev": "1", + "net.key.prefered_oldsa": "0", + "net.local.stream.recvspace": "8192", + "net.inet.tcp.sockthreshold": "64", + "net.inet6.icmp6.nd6_umaxtries": "3", + "net.pstimeout": "20 20", + "net.inet.ip.sourceroute": "0", + "net.inet.ip.fw.dyn_short_lifetime": "5", + "net.inet.tcp.minmss": "216", + "net.inet6.ip6.gifhlim": "0", + "net.athvendorie": "1 1", + "net.inet.ip.check_route_selfref": "1", + "net.inet6.icmp6.errppslimit": "100", + "net.inet.tcp.mssdflt": "512", + "net.inet.icmp.log_redirect": "0", + "net.inet6.ipsec6.ah_trans_deflev": "1", + "net.inet6.ipsec6.esp_randpad": "-1", + "net.inet.icmp.drop_redirect": "0", + "net.inet.icmp.timestamp": "0", + "net.inet.ip.random_id": "1" + }, + "interfaces": { + "vmnet1": { + "flags": [ + "UP", + "BROADCAST", + "SMART", + "RUNNING", + "SIMPLEX", + "MULTICAST" + ], + "addresses": [ + { + "broadcast": "192.168.88.255", + "netmask": "255.255.255.0", + "family": "inet", + "address": "192.168.88.1" + }, + { + "family": "lladdr", + "address": "private" + } + ], + "number": "1", + "mtu": "1500", + "type": "vmnet", + "encapsulation": "Ethernet" + }, + "stf0": { + "flags": [ + + ], + "number": "0", + "mtu": "1280", + "type": "stf", + "encapsulation": "6to4" + }, + "vboxnet0": { + "flags": [ + "BROADCAST", + "RUNNING", + "SIMPLEX", + "MULTICAST" + ], + "addresses": [ + { + "family": "lladdr", + "address": "private" + } + ], + "number": "0", + "mtu": "1500", + "type": "vboxnet", + "encapsulation": "Ethernet" + }, + "lo0": { + "flags": [ + "UP", + "LOOPBACK", + "RUNNING", + "MULTICAST" + ], + "addresses": [ + { + "scope": "Link", + "prefixlen": "64", + "family": "inet6", + "address": "fe80::1" + }, + { + "netmask": "255.0.0.0", + "family": "inet", + "address": "127.0.0.1" + }, + { + "scope": "Node", + "prefixlen": "128", + "family": "inet6", + "address": "::1" + }, + { + "scope": "Node", + "prefixlen": "128", + "family": "inet6", + "address": "private" + } + ], + "number": "0", + "mtu": "16384", + "type": "lo", + "encapsulation": "Loopback" + }, + "vboxn": { + "counters": { + "tx": { + "bytes": "0", + "packets": "0", + "collisions": "0", + "compressed": 0, + "carrier": 0, + "drop": 0, + "errors": "0", + "overrun": 0 + }, + "rx": { + "bytes": "0", + "packets": "0", + "compressed": 0, + "drop": 0, + "errors": "0", + "overrun": 0, + "frame": 0, + "multicast": 0 + } + } + }, + "gif0": { + "flags": [ + "POINTOPOINT", + "MULTICAST" + ], + "number": "0", + "mtu": "1280", + "type": "gif", + "encapsulation": "IPIP" + }, + "vmnet": { + "counters": { + "tx": { + "bytes": "0", + "packets": "0", + "collisions": "0", + "compressed": 0, + "carrier": 0, + "drop": 0, + "errors": "0", + "overrun": 0 + }, + "rx": { + "bytes": "0", + "packets": "0", + "compressed": 0, + "drop": 0, + "errors": "0", + "overrun": 0, + "frame": 0, + "multicast": 0 + } + } + }, + "vmnet8": { + "flags": [ + "UP", + "BROADCAST", + "SMART", + "RUNNING", + "SIMPLEX", + "MULTICAST" + ], + "addresses": [ + { + "broadcast": "192.168.237.255", + "netmask": "255.255.255.0", + "family": "inet", + "address": "192.168.237.1" + }, + { + "family": "lladdr", + "address": "private" + } + ], + "number": "8", + "mtu": "1500", + "type": "vmnet", + "encapsulation": "Ethernet" + }, + "en0": { + "status": "inactive", + "flags": [ + "UP", + "BROADCAST", + "SMART", + "RUNNING", + "SIMPLEX", + "MULTICAST" + ], + "addresses": [ + { + "family": "lladdr", + "address": "private" + } + ], + "number": "0", + "mtu": "1500", + "media": { + "supported": [ + { + "autoselect": { + "options": [ + + ] + } + }, + { + "10baseT\/UTP": { + "options": [ + "half-duplex" + ] + } + }, + { + "10baseT\/UTP": { + "options": [ + "full-duplex" + ] + } + }, + { + "10baseT\/UTP": { + "options": [ + "full-duplex", + "hw-loopback" + ] + } + }, + { + "10baseT\/UTP": { + "options": [ + "full-duplex", + "flow-control" + ] + } + }, + { + "100baseTX": { + "options": [ + "half-duplex" + ] + } + }, + { + "100baseTX": { + "options": [ + "full-duplex" + ] + } + }, + { + "100baseTX": { + "options": [ + "full-duplex", + "hw-loopback" + ] + } + }, + { + "100baseTX": { + "options": [ + "full-duplex", + "flow-control" + ] + } + }, + { + "1000baseT": { + "options": [ + "full-duplex" + ] + } + }, + { + "1000baseT": { + "options": [ + "full-duplex", + "hw-loopback" + ] + } + }, + { + "1000baseT": { + "options": [ + "full-duplex", + "flow-control" + ] + } + }, + { + "none": { + "options": [ + + ] + } + } + ], + "selected": [ + { + "autoselect": { + "options": [ + + ] + } + } + ] + }, + "type": "en", + "counters": { + "tx": { + "bytes": "342", + "packets": "0", + "collisions": "0", + "compressed": 0, + "carrier": 0, + "drop": 0, + "errors": "0", + "overrun": 0 + }, + "rx": { + "bytes": "0", + "packets": "0", + "compressed": 0, + "drop": 0, + "errors": "0", + "overrun": 0, + "frame": 0, + "multicast": 0 + } + }, + "encapsulation": "Ethernet" + }, + "en1": { + "status": "active", + "flags": [ + "UP", + "BROADCAST", + "SMART", + "RUNNING", + "SIMPLEX", + "MULTICAST" + ], + "addresses": [ + { + "scope": "Link", + "prefixlen": "64", + "family": "inet6", + "address": "private" + }, + { + "broadcast": "192.168.1.255", + "netmask": "255.255.255.0", + "family": "inet", + "address": "192.168.1.4" + }, + { + "family": "lladdr", + "address": "private" + } + ], + "number": "1", + "mtu": "1500", + "media": { + "supported": [ + { + "autoselect": { + "options": [ + + ] + } + } + ], + "selected": [ + { + "autoselect": { + "options": [ + + ] + } + } + ] + }, + "type": "en", + "counters": { + "tx": { + "bytes": "449206298", + "packets": "7041789", + "collisions": "0", + "compressed": 0, + "carrier": 0, + "drop": 0, + "errors": "95", + "overrun": 0 + }, + "rx": { + "bytes": "13673879120", + "packets": "19966002", + "compressed": 0, + "drop": 0, + "errors": "1655893", + "overrun": 0, + "frame": 0, + "multicast": 0 + } + }, + "arp": { + "192.168.1.7": "private" + }, + "encapsulation": "Ethernet" + }, + "fw0": { + "status": "inactive", + "flags": [ + "UP", + "BROADCAST", + "SMART", + "RUNNING", + "SIMPLEX", + "MULTICAST" + ], + "addresses": [ + { + "family": "lladdr", + "address": "private" + } + ], + "number": "0", + "mtu": "4078", + "media": { + "supported": [ + { + "autoselect": { + "options": [ + "full-duplex" + ] + } + } + ], + "selected": [ + { + "autoselect": { + "options": [ + "full-duplex" + ] + } + } + ] + }, + "type": "fw", + "counters": { + "tx": { + "bytes": "346", + "packets": "0", + "collisions": "0", + "compressed": 0, + "carrier": 0, + "drop": 0, + "errors": "0", + "overrun": 0 + }, + "rx": { + "bytes": "0", + "packets": "0", + "compressed": 0, + "drop": 0, + "errors": "0", + "overrun": 0, + "frame": 0, + "multicast": 0 + } + }, + "encapsulation": "1394" + } + } + }, + "fqdn": "local.local", + "ohai_time": 1240624355.08575, + "domain": "local", + "os": "darwin", + "platform_build": "9G55", + "os_version": "9.6.0", + "hostname": "local", + "macaddress": "private", + "languages": { + "ruby": { + "target_os": "darwin9.0", + "platform": "universal-darwin9.0", + "host_vendor": "apple", + "target_vendor": "apple", + "target_cpu": "i686", + "host_os": "darwin9.0", + "host_cpu": "i686", + "version": "1.8.6", + "host": "i686-apple-darwin9.0", + "target": "i686-apple-darwin9.0", + "release_date": "2008-03-03" + } + } +} diff --git a/benchmark/standalone.rb b/benchmark/standalone.rb new file mode 100644 index 00000000000000..deeb45dcee49ee --- /dev/null +++ b/benchmark/standalone.rb @@ -0,0 +1,41 @@ +require 'benchmark/ips' + +$:.unshift File.expand_path('../ext', __dir__) +$:.unshift File.expand_path('../lib', __dir__) + +bench, mode = ARGV + +if mode == 'pure' + require 'json/pure' +else + require 'json/ext' +end + +bench_dump = bench == 'dump' +if bench_dump + p JSON.generator +else + p JSON.parser +end + +str = File.read("#{__dir__}/data/ohai.json") +obj = JSON.load(str) + +Benchmark.ips do |x| + unless RUBY_ENGINE == 'ruby' + x.warmup = 5 + x.iterations = 5 + end + + if bench_dump + x.report('JSON.dump(obj)') do # max_nesting: false, allow_nan: true + JSON.dump(obj) + end + else + x.report('JSON.load(str)') do # max_nesting: false, allow_nan: true, allow_blank: true, create_additions: true + JSON.load(str) + end + end + + x.compare! +end From e50754fcfaeb80bef93f043c13895ce386ddb18c Mon Sep 17 00:00:00 2001 From: Vinicius Stock Date: Tue, 8 Oct 2024 10:47:08 -0400 Subject: [PATCH 806/829] [ruby/prism] Avoid breaking code units offset on binary encoding https://github.com/ruby/prism/commit/25a4cf6794 Co-authored-by: Kevin Newton --- lib/prism/parse_result.rb | 2 +- test/prism/ruby/location_test.rb | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/lib/prism/parse_result.rb b/lib/prism/parse_result.rb index ae026b42ac0447..aea5dee9fafa4d 100644 --- a/lib/prism/parse_result.rb +++ b/lib/prism/parse_result.rb @@ -90,7 +90,7 @@ def character_column(byte_offset) # concept of code units that differs from the number of characters in other # encodings, it is not captured here. def code_units_offset(byte_offset, encoding) - byteslice = (source.byteslice(0, byte_offset) or raise).encode(encoding) + byteslice = (source.byteslice(0, byte_offset) or raise).encode(encoding, invalid: :replace, undef: :replace) if encoding == Encoding::UTF_16LE || encoding == Encoding::UTF_16BE byteslice.bytesize / 2 diff --git a/test/prism/ruby/location_test.rb b/test/prism/ruby/location_test.rb index fc80a5b875d7c2..e360a0db724127 100644 --- a/test/prism/ruby/location_test.rb +++ b/test/prism/ruby/location_test.rb @@ -140,6 +140,25 @@ def test_code_units assert_equal 7, location.end_code_units_column(Encoding::UTF_32LE) end + def test_code_units_handles_binary_encoding_with_multibyte_characters + # If the encoding is set to binary and the source contains multibyte + # characters, we avoid breaking the code unit offsets, but they will + # still be incorrect. + + program = Prism.parse(<<~RUBY).value + # -*- encoding: binary -*- + + 😀 + 😀 + RUBY + + # first 😀 + location = program.statements.body.first.receiver.location + + assert_equal 4, location.end_code_units_column(Encoding::UTF_8) + assert_equal 4, location.end_code_units_column(Encoding::UTF_16LE) + assert_equal 4, location.end_code_units_column(Encoding::UTF_32LE) + end + def test_chop location = Prism.parse("foo").value.location From 1c762d95664796275460025b37379753c0ac8e36 Mon Sep 17 00:00:00 2001 From: ydah Date: Wed, 9 Oct 2024 22:16:19 +0900 Subject: [PATCH 807/829] [Bug #20789] Fix an invalid syntax error when `->a=1...{}` https://bugs.ruby-lang.org/issues/20789 --- parse.y | 2 +- test/ruby/test_syntax.rb | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/parse.y b/parse.y index b532c5ff7d14a4..47854476b42921 100644 --- a/parse.y +++ b/parse.y @@ -11043,7 +11043,7 @@ parser_yylex(struct parser_params *p) SET_LEX_STATE(EXPR_BEG); if ((c = nextc(p)) == '.') { if ((c = nextc(p)) == '.') { - if (p->ctxt.in_argdef || IS_LABEL_POSSIBLE() || lambda_beginning_p()) { + if (p->ctxt.in_argdef || IS_LABEL_POSSIBLE()) { SET_LEX_STATE(EXPR_ENDARG); return tBDOT3; } diff --git a/test/ruby/test_syntax.rb b/test/ruby/test_syntax.rb index 16bb914e3f452b..811a21937e0422 100644 --- a/test/ruby/test_syntax.rb +++ b/test/ruby/test_syntax.rb @@ -1975,6 +1975,7 @@ def test_argument_forwarding assert_valid_syntax('def nil(...) end') assert_valid_syntax('def true(...) end') assert_valid_syntax('def false(...) end') + assert_valid_syntax('->a=1...{}') unexpected = /unexpected \.{3}/ assert_syntax_error('iter do |...| end', /unexpected/) assert_syntax_error('iter {|...|}', /unexpected/) From 2e2a5e4ff945ca8c17eae6c3b6b2b8b7d3dcdf69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Wed, 9 Oct 2024 15:43:08 +0200 Subject: [PATCH 808/829] [rubygems/rubygems] Remove unused variable https://github.com/rubygems/rubygems/commit/b31f33d55c --- test/rubygems/test_gem_dependency_installer.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/test/rubygems/test_gem_dependency_installer.rb b/test/rubygems/test_gem_dependency_installer.rb index 8378d85bdf75b9..56b84160c4d0e4 100644 --- a/test/rubygems/test_gem_dependency_installer.rb +++ b/test/rubygems/test_gem_dependency_installer.rb @@ -849,7 +849,6 @@ def test_install_dual_repository_and_done_installing_hooks Gem.clear_paths Gem.done_installing do |installer, specs| - done_installing_ran = true refute_nil installer assert_equal [@b1], specs end From e39e582594feaeb40722b2921e8feb562d94269b Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Wed, 9 Oct 2024 10:34:42 -0400 Subject: [PATCH 809/829] [ruby/prism] Attempt to assume binary is UTF-8 https://github.com/ruby/prism/commit/343197e4ff --- lib/prism/parse_result.rb | 29 +++++++++++++++++-- prism/templates/lib/prism/serialize.rb.erb | 11 ++++++++ test/prism/ruby/location_test.rb | 33 +++++++++++++++------- 3 files changed, 61 insertions(+), 12 deletions(-) diff --git a/lib/prism/parse_result.rb b/lib/prism/parse_result.rb index aea5dee9fafa4d..e3ba7e7c8e95c4 100644 --- a/lib/prism/parse_result.rb +++ b/lib/prism/parse_result.rb @@ -12,6 +12,21 @@ class Source def self.for(source, start_line = 1, offsets = []) if source.ascii_only? ASCIISource.new(source, start_line, offsets) + elsif source.encoding == Encoding::BINARY + source.force_encoding(Encoding::UTF_8) + + if source.valid_encoding? + new(source, start_line, offsets) + else + # This is an extremely niche use case where the file is marked as + # binary, contains multi-byte characters, and those characters are not + # valid UTF-8. In this case we'll mark it as binary and fall back to + # treating everything as a single-byte character. This _may_ cause + # problems when asking for code units, but it appears to be the + # cleanest solution at the moment. + source.force_encoding(Encoding::BINARY) + ASCIISource.new(source, start_line, offsets) + end else new(source, start_line, offsets) end @@ -89,6 +104,12 @@ def character_column(byte_offset) # This method is tested with UTF-8, UTF-16, and UTF-32. If there is the # concept of code units that differs from the number of characters in other # encodings, it is not captured here. + # + # We purposefully replace invalid and undefined characters with replacement + # characters in this conversion. This happens for two reasons. First, it's + # possible that the given byte offset will not occur on a character + # boundary. Second, it's possible that the source code will contain a + # character that has no equivalent in the given encoding. def code_units_offset(byte_offset, encoding) byteslice = (source.byteslice(0, byte_offset) or raise).encode(encoding, invalid: :replace, undef: :replace) @@ -130,8 +151,12 @@ def find_line(byte_offset) # Specialized version of Prism::Source for source code that includes ASCII # characters only. This class is used to apply performance optimizations that - # cannot be applied to sources that include multibyte characters. Sources that - # include multibyte characters are represented by the Prism::Source class. + # cannot be applied to sources that include multibyte characters. + # + # In the extremely rare case that a source includes multi-byte characters but + # is marked as binary because of a magic encoding comment and it cannot be + # eagerly converted to UTF-8, this class will be used as well. This is because + # at that point we will treat everything as single-byte characters. class ASCIISource < Source # Return the character offset for the given byte offset. def character_offset(byte_offset) diff --git a/prism/templates/lib/prism/serialize.rb.erb b/prism/templates/lib/prism/serialize.rb.erb index 62108ec28a34f0..1c1cf6e22d3d63 100644 --- a/prism/templates/lib/prism/serialize.rb.erb +++ b/prism/templates/lib/prism/serialize.rb.erb @@ -20,10 +20,21 @@ module Prism def self.load(input, serialized) input = input.dup source = Source.for(input) + loader = Loader.new(source, serialized) result = loader.load_result input.force_encoding(loader.encoding) + + # This is an extremely niche use-case where the file was marked as binary + # but it contained UTF-8-encoded characters. In that case we will actually + # put it back to UTF-8 to give the location APIs the best chance of being + # correct. + if !input.ascii_only? && input.encoding == Encoding::BINARY + input.force_encoding(Encoding::UTF_8) + input.force_encoding(Encoding::BINARY) unless input.valid_encoding? + end + result end diff --git a/test/prism/ruby/location_test.rb b/test/prism/ruby/location_test.rb index e360a0db724127..3d3e7dd5623ef4 100644 --- a/test/prism/ruby/location_test.rb +++ b/test/prism/ruby/location_test.rb @@ -140,23 +140,36 @@ def test_code_units assert_equal 7, location.end_code_units_column(Encoding::UTF_32LE) end - def test_code_units_handles_binary_encoding_with_multibyte_characters - # If the encoding is set to binary and the source contains multibyte - # characters, we avoid breaking the code unit offsets, but they will - # still be incorrect. - + def test_code_units_binary_valid_utf8 program = Prism.parse(<<~RUBY).value # -*- encoding: binary -*- 😀 + 😀 RUBY - # first 😀 - location = program.statements.body.first.receiver.location + receiver = program.statements.body.first.receiver + assert_equal "😀".b.to_sym, receiver.name + + location = receiver.location + assert_equal 1, location.end_code_units_column(Encoding::UTF_8) + assert_equal 2, location.end_code_units_column(Encoding::UTF_16LE) + assert_equal 1, location.end_code_units_column(Encoding::UTF_32LE) + end - assert_equal 4, location.end_code_units_column(Encoding::UTF_8) - assert_equal 4, location.end_code_units_column(Encoding::UTF_16LE) - assert_equal 4, location.end_code_units_column(Encoding::UTF_32LE) + def test_code_units_binary_invalid_utf8 + program = Prism.parse(<<~RUBY).value + # -*- encoding: binary -*- + + \x90 + \x90 + RUBY + + receiver = program.statements.body.first.receiver + assert_equal "\x90".b.to_sym, receiver.name + + location = receiver.location + assert_equal 1, location.end_code_units_column(Encoding::UTF_8) + assert_equal 1, location.end_code_units_column(Encoding::UTF_16LE) + assert_equal 1, location.end_code_units_column(Encoding::UTF_32LE) end def test_chop From 6dac070aa2aca748917b6cc44dc28c29f5558e52 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Wed, 9 Oct 2024 22:41:01 +0900 Subject: [PATCH 810/829] Add `--with-parser` configure option --- configure.ac | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/configure.ac b/configure.ac index d099b626796af1..ca578f8e9f4246 100644 --- a/configure.ac +++ b/configure.ac @@ -4560,6 +4560,17 @@ AS_IF([test x"$enable_rubygems" = xno], [ ]) AC_SUBST(USE_RUBYGEMS) +m4_define(available_parsers, [parse.y, prism]) +with_parser=prism +AC_ARG_WITH(parser, + AS_HELP_STRING([--with-parser=PARSER], + [specify default parser; PARSER is one of ]m4_join([, ],available_parsers))) +AS_CASE([$with_parser], +m4_foreach(parser, [available_parsers], + parser[,][AC_DEFINE_UNQUOTED(RB_DEFAULT_PARSER, RB_DEFAULT_PARSER_[]AS_TR_CPP(parser)),]) + [AC_MSG_ERROR([Unknown parser: $with_parser])] +) + arch_hdrdir="${EXTOUT}/include/${arch}/ruby" AS_MKDIR_P("${arch_hdrdir}") config_h="${arch_hdrdir}/config.h" From 377d02285342bedcb0e4901ce53848b6b877b633 Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Wed, 9 Oct 2024 11:15:58 -0500 Subject: [PATCH 811/829] [DOC] Tweaks for Array#reverse --- array.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/array.c b/array.c index a08a8faf3ae774..520d3f0bb8928c 100644 --- a/array.c +++ b/array.c @@ -3140,14 +3140,13 @@ rb_ary_reverse_bang(VALUE ary) /* * call-seq: - * array.reverse -> new_array + * reverse -> new_array * - * Returns a new +Array+ with the elements of +self+ in reverse order: + * Returns a new array containing the elements of +self+ in reverse order: * - * a = ['foo', 'bar', 'two'] - * a1 = a.reverse - * a1 # => ["two", "bar", "foo"] + * [0, 1, 2].reverse # => [2, 1, 0] * + * Related: see {Methods for Combining}[rdoc-ref:Array@Methods+for+Combining]. */ static VALUE @@ -8662,6 +8661,7 @@ rb_ary_deconstruct(VALUE ary) * - #difference: Returns an array containing all elements of +self+ that are not found * in any of the given arrays.. * - #product: Returns or yields all combinations of elements from +self+ and given arrays. + * - #reverse: Returns an array containing all elements of +self+ in reverse order. * * === Methods for Iterating * From 1962be267cb3e7ea946f34967f42f48a01558084 Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Wed, 9 Oct 2024 11:33:22 -0500 Subject: [PATCH 812/829] [DOC] Tweaks for Array#reverse! --- array.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/array.c b/array.c index 520d3f0bb8928c..a4c600a4726afd 100644 --- a/array.c +++ b/array.c @@ -3123,13 +3123,16 @@ rb_ary_reverse(VALUE ary) /* * call-seq: - * array.reverse! -> self + * reverse! -> self * - * Reverses +self+ in place: + * Reverses the order of the elements of +self+; + * returns +self+: * - * a = ['foo', 'bar', 'two'] - * a.reverse! # => ["two", "bar", "foo"] + * a = [0, 1, 2] + * a.reverse! # => [2, 1, 0] + * a # => [2, 1, 0] * + * Related: see {Methods for Assigning}[rdoc-ref:Array@Methods+for+Assigning]. */ static VALUE From f7fdf6cc36ce42594e21765c8ca00f4e10505a6b Mon Sep 17 00:00:00 2001 From: BurdetteLamar Date: Wed, 9 Oct 2024 12:33:19 -0500 Subject: [PATCH 813/829] [DOC] Tweaks for Array#rindex --- array.c | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/array.c b/array.c index a4c600a4726afd..d4788ff33437fb 100644 --- a/array.c +++ b/array.c @@ -2129,20 +2129,20 @@ rb_ary_index(int argc, VALUE *argv, VALUE ary) /* * call-seq: - * array.rindex(object) -> integer or nil - * array.rindex {|element| ... } -> integer or nil - * array.rindex -> new_enumerator + * rindex(object) -> integer or nil + * rindex {|element| ... } -> integer or nil + * rindex -> new_enumerator * * Returns the index of the last element for which object == element. * - * When argument +object+ is given but no block, returns the index of the last such element found: + * With argument +object+ given, returns the index of the last such element found: * * a = [:foo, 'bar', 2, 'bar'] * a.rindex('bar') # => 3 * * Returns +nil+ if no such object found. * - * When a block is given but no argument, calls the block with each successive element; + * With a block given, calls the block with each successive element; * returns the index of the last element for which the block returns a truthy value: * * a = [:foo, 'bar', 2, 'bar'] @@ -2150,14 +2150,9 @@ rb_ary_index(int argc, VALUE *argv, VALUE ary) * * Returns +nil+ if the block never returns a truthy value. * - * When neither an argument nor a block is given, returns a new Enumerator: + * When neither an argument nor a block is given, returns a new Enumerator. * - * a = [:foo, 'bar', 2, 'bar'] - * e = a.rindex - * e # => # - * e.each {|element| element == 'bar' } # => 3 - * - * Related: #index. + * Related: see {Methods for Querying}[rdoc-ref:Array@Methods+for+Querying]. */ static VALUE From d0bff661d65451065cc1132db25a2da2ecc87feb Mon Sep 17 00:00:00 2001 From: Matt Valentine-House Date: Wed, 9 Oct 2024 20:58:28 +0100 Subject: [PATCH 814/829] Remove unused timeout in parsey CI. This is unset and has no fallback. it's causing an error in the CI output Error: An error occurred when attempting to determine the step timeout. Error: The template is not valid. .github/workflows/parsey.yml (Line: 78, Col: 26): Unexpected value '' --- .github/workflows/parsey.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/parsey.yml b/.github/workflows/parsey.yml index fce8f94035855b..f9b3a868da1848 100644 --- a/.github/workflows/parsey.yml +++ b/.github/workflows/parsey.yml @@ -75,7 +75,6 @@ jobs: - name: make ${{ matrix.test_task }} run: make -s ${{ matrix.test_task }} RUN_OPTS="$RUN_OPTS" SPECOPTS="$SPECOPTS" - timeout-minutes: ${{ matrix.timeout }} env: RUBY_TESTOPTS: ${{ matrix.testopts }} EXCLUDES: '../src/test/.excludes-parsey' From a838f980f599d95ccf344157f7074e997af31f48 Mon Sep 17 00:00:00 2001 From: Koichi Sasada Date: Thu, 10 Oct 2024 06:01:49 +0900 Subject: [PATCH 815/829] `me->defined_class` should be T_CLASS/T_ICLASS `me->defined_class` will be used for ancestor searching so that it should be T_CLASS or T_ICLASS. This patch will resoleve https://github.com/ruby/ruby/pull/11715 --- vm_method.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/vm_method.c b/vm_method.c index bda3837f747354..4eb074bbd81c53 100644 --- a/vm_method.c +++ b/vm_method.c @@ -759,6 +759,9 @@ static rb_method_entry_t * rb_method_entry_alloc(ID called_id, VALUE owner, VALUE defined_class, rb_method_definition_t *def, bool complement) { if (def) method_definition_addref(def, complement); + VM_ASSERT(!defined_class || + NIL_P(defined_class) || // negative cache + RB_TYPE_P(defined_class, T_CLASS) || RB_TYPE_P(defined_class, T_ICLASS)); rb_method_entry_t *me = IMEMO_NEW(rb_method_entry_t, imemo_ment, defined_class); *((rb_method_definition_t **)&me->def) = def; me->called_id = called_id; @@ -874,8 +877,9 @@ make_method_entry_refined(VALUE owner, rb_method_entry_t *me) rb_vm_check_redefinition_opt_method(me, me->owner); struct rb_method_entry_struct *orig_me = - rb_method_entry_alloc(me->called_id, me->owner, - me->defined_class ? me->defined_class : owner, + rb_method_entry_alloc(me->called_id, + me->owner, + me->defined_class, me->def, true); METHOD_ENTRY_FLAGS_COPY(orig_me, me); From a392ee1437efbaa84edf3412bb96a5d667a08387 Mon Sep 17 00:00:00 2001 From: Samuel Giddins Date: Mon, 7 Oct 2024 09:02:40 -0700 Subject: [PATCH 816/829] Update vendored net-http Signed-off-by: Samuel Giddins --- .../lib/net/http/persistent.rb | 54 ++++++++++++++++--- lib/bundler/vendor/uri/lib/uri/common.rb | 2 + lib/bundler/vendor/uri/lib/uri/version.rb | 2 +- lib/rubygems/vendor/net-http/lib/net/http.rb | 2 +- lib/rubygems/vendor/uri/lib/uri/common.rb | 2 + lib/rubygems/vendor/uri/lib/uri/version.rb | 2 +- tool/bundler/vendor_gems.rb | 4 +- 7 files changed, 55 insertions(+), 13 deletions(-) diff --git a/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb b/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb index c15b3463301e8b..cfc0f48197d95c 100644 --- a/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +++ b/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb @@ -68,6 +68,8 @@ # #verify_callback :: For server certificate verification # #verify_depth :: Depth of certificate verification # #verify_mode :: How connections should be verified +# #verify_hostname :: Use hostname verification for server certificate +# during the handshake # # == Proxies # @@ -174,7 +176,7 @@ class Gem::Net::HTTP::Persistent ## # The version of Gem::Net::HTTP::Persistent you are using - VERSION = '4.0.2' + VERSION = '4.0.4' ## # Error class for errors raised by Gem::Net::HTTP::Persistent. Various @@ -449,6 +451,21 @@ def self.detect_idle_timeout uri, max = 10 attr_reader :verify_mode + ## + # HTTPS verify_hostname. + # + # If a client sets this to true and enables SNI with SSLSocket#hostname=, + # the hostname verification on the server certificate is performed + # automatically during the handshake using + # OpenSSL::SSL.verify_certificate_identity(). + # + # You can set +verify_hostname+ as true to use hostname verification + # during the handshake. + # + # NOTE: This works with Ruby > 3.0. + + attr_reader :verify_hostname + ## # Creates a new Gem::Net::HTTP::Persistent. # @@ -508,6 +525,7 @@ def initialize name: nil, proxy: nil, pool_size: DEFAULT_POOL_SIZE @verify_callback = nil @verify_depth = nil @verify_mode = nil + @verify_hostname = nil @cert_store = nil @generation = 0 # incremented when proxy Gem::URI changes @@ -607,13 +625,23 @@ def connection_for uri return yield connection rescue Errno::ECONNREFUSED - address = http.proxy_address || http.address - port = http.proxy_port || http.port + if http.proxy? + address = http.proxy_address + port = http.proxy_port + else + address = http.address + port = http.port + end raise Error, "connection refused: #{address}:#{port}" rescue Errno::EHOSTDOWN - address = http.proxy_address || http.address - port = http.proxy_port || http.port + if http.proxy? + address = http.proxy_address + port = http.proxy_port + else + address = http.address + port = http.port + end raise Error, "host down: #{address}:#{port}" ensure @@ -948,8 +976,10 @@ def ssl connection connection.min_version = @min_version if @min_version connection.max_version = @max_version if @max_version - connection.verify_depth = @verify_depth - connection.verify_mode = @verify_mode + connection.verify_depth = @verify_depth + connection.verify_mode = @verify_mode + connection.verify_hostname = @verify_hostname if + @verify_hostname != nil && connection.respond_to?(:verify_hostname=) if OpenSSL::SSL::VERIFY_PEER == OpenSSL::SSL::VERIFY_NONE and not Object.const_defined?(:I_KNOW_THAT_OPENSSL_VERIFY_PEER_EQUALS_VERIFY_NONE_IS_WRONG) then @@ -1058,6 +1088,15 @@ def verify_mode= verify_mode reconnect_ssl end + ## + # Sets the HTTPS verify_hostname. + + def verify_hostname= verify_hostname + @verify_hostname = verify_hostname + + reconnect_ssl + end + ## # SSL verification callback. @@ -1070,4 +1109,3 @@ def verify_callback= callback require_relative 'persistent/connection' require_relative 'persistent/pool' - diff --git a/lib/bundler/vendor/uri/lib/uri/common.rb b/lib/bundler/vendor/uri/lib/uri/common.rb index 93f4f226add5e5..89044da0362dac 100644 --- a/lib/bundler/vendor/uri/lib/uri/common.rb +++ b/lib/bundler/vendor/uri/lib/uri/common.rb @@ -19,6 +19,8 @@ module Bundler::URI Parser = RFC2396_Parser RFC3986_PARSER = RFC3986_Parser.new Ractor.make_shareable(RFC3986_PARSER) if defined?(Ractor) + RFC2396_PARSER = RFC2396_Parser.new + Ractor.make_shareable(RFC2396_PARSER) if defined?(Ractor) # Bundler::URI::Parser.new DEFAULT_PARSER = Parser.new diff --git a/lib/bundler/vendor/uri/lib/uri/version.rb b/lib/bundler/vendor/uri/lib/uri/version.rb index 1fa1c7c09abceb..ac94e15221898a 100644 --- a/lib/bundler/vendor/uri/lib/uri/version.rb +++ b/lib/bundler/vendor/uri/lib/uri/version.rb @@ -1,6 +1,6 @@ module Bundler::URI # :stopdoc: - VERSION_CODE = '001300'.freeze + VERSION_CODE = '001301'.freeze VERSION = VERSION_CODE.scan(/../).collect{|n| n.to_i}.join('.').freeze # :startdoc: end diff --git a/lib/rubygems/vendor/net-http/lib/net/http.rb b/lib/rubygems/vendor/net-http/lib/net/http.rb index 7b15c3cf548156..1a7074819d33a3 100644 --- a/lib/rubygems/vendor/net-http/lib/net/http.rb +++ b/lib/rubygems/vendor/net-http/lib/net/http.rb @@ -722,7 +722,7 @@ class HTTPHeaderSyntaxError < StandardError; end class HTTP < Protocol # :stopdoc: - VERSION = "0.4.0" + VERSION = "0.4.1" HTTPVersion = '1.1' begin require 'zlib' diff --git a/lib/rubygems/vendor/uri/lib/uri/common.rb b/lib/rubygems/vendor/uri/lib/uri/common.rb index 921fb9dd28c0a5..da2651084cdb5f 100644 --- a/lib/rubygems/vendor/uri/lib/uri/common.rb +++ b/lib/rubygems/vendor/uri/lib/uri/common.rb @@ -19,6 +19,8 @@ module Gem::URI Parser = RFC2396_Parser RFC3986_PARSER = RFC3986_Parser.new Ractor.make_shareable(RFC3986_PARSER) if defined?(Ractor) + RFC2396_PARSER = RFC2396_Parser.new + Ractor.make_shareable(RFC2396_PARSER) if defined?(Ractor) # Gem::URI::Parser.new DEFAULT_PARSER = Parser.new diff --git a/lib/rubygems/vendor/uri/lib/uri/version.rb b/lib/rubygems/vendor/uri/lib/uri/version.rb index 3c80c334d46aa1..080744095c7e84 100644 --- a/lib/rubygems/vendor/uri/lib/uri/version.rb +++ b/lib/rubygems/vendor/uri/lib/uri/version.rb @@ -1,6 +1,6 @@ module Gem::URI # :stopdoc: - VERSION_CODE = '001300'.freeze + VERSION_CODE = '001301'.freeze VERSION = VERSION_CODE.scan(/../).collect{|n| n.to_i}.join('.').freeze # :startdoc: end diff --git a/tool/bundler/vendor_gems.rb b/tool/bundler/vendor_gems.rb index 9bb3d3b037afb6..4b7cdb67be40f7 100644 --- a/tool/bundler/vendor_gems.rb +++ b/tool/bundler/vendor_gems.rb @@ -4,8 +4,8 @@ gem "fileutils", "1.7.2" gem "molinillo", github: "cocoapods/molinillo" -gem "net-http", "0.4.0" -gem "net-http-persistent", "4.0.2" +gem "net-http", "0.4.1" +gem "net-http-persistent", "4.0.4" gem "net-protocol", "0.2.2" gem "optparse", "0.4.0" gem "pub_grub", github: "jhawthorn/pub_grub" From a47f153d9d951166f8442e3b2c7036505385a953 Mon Sep 17 00:00:00 2001 From: Sutou Kouhei Date: Mon, 7 Oct 2024 11:03:10 +0900 Subject: [PATCH 817/829] Import JRuby implementation (#147) Fix GH-104 lib/fiddle/jruby.rb is based on https://github.com/jruby/jruby/blob/master/lib/ruby/stdlib/fiddle/jruby.rb . Here are changes for it: * Move `Fiddle::TYPE_*` to `Fiddle::Types::*` * Add `Fiddle::Types::VARIADIC` * Add `Fiddle::Types::CONST_STRING` * Add `Fiddle::Types::BOOL` * Add `Fiddle::Types::INT8_T` * Add `Fiddle::Types::UINT8_T` * Add `Fiddle::Types::INT16_T` * Add `Fiddle::Types::UINT16_T` * Add `Fiddle::Types::INT32_T` * Add `Fiddle::Types::UINT32_T` * Add `Fiddle::Types::INT64_T` * Add `Fiddle::Types::UINT64_T` * Add more `Fiddle::ALIGN_*` for the above new `Fiddle::Types::*` * Add more `Fiddle::SIZEOF_*` for the above new `Fiddle::Types::*` * Add support for specifying type as not only `Fiddle::Types::*` but also `Symbol` like `:int` * Add support for variable size arguments in `Fiddle::Function` * Add `Fiddle::Closure#free` * Add `Fiddle::Closure#freed?` * Add `Fiddle::Error` as base the error class * Add `Fiddle::Pointer#call_free` and stop using `FFI::AutoPointer` in `Fiddle::Pointer` * Add support for `Fiddle::Pointer.malloc {}` `Fiddle::Pointer` * Add support for `Fiddle::Pointer#free=` * Add `Fiddle::Pointer#freed?` * Use binary string not C string for `Fiddle::Pointer#[]` * Add `Fiddle::Handle.sym_defined?` * Add `Fiddle::Handle#sym_defined?` * Add `Fiddle::Handle::DEFAULT` * Add `Fiddle::ClearedReferenceError` * Add no-op `Fiddle::Pinned` Some features are still "not implemented". So there are some "omit"s for JRuby in tests. --- ext/fiddle/extconf.rb | 5 + ext/fiddle/fiddle.gemspec | 2 + ext/fiddle/lib/fiddle.rb | 43 ++- ext/fiddle/lib/fiddle/jruby.rb | 600 ++++++++++++++++++++++++++++++++ ext/fiddle/lib/fiddle/pack.rb | 6 + ext/fiddle/lib/fiddle/ruby.rb | 1 + ext/fiddle/lib/fiddle/struct.rb | 33 +- test/fiddle/helper.rb | 11 +- test/fiddle/test_closure.rb | 31 +- test/fiddle/test_fiddle.rb | 4 + test/fiddle/test_func.rb | 59 ++-- test/fiddle/test_function.rb | 26 ++ test/fiddle/test_handle.rb | 30 +- test/fiddle/test_import.rb | 15 +- test/fiddle/test_pointer.rb | 39 ++- 15 files changed, 835 insertions(+), 70 deletions(-) create mode 100644 ext/fiddle/lib/fiddle/jruby.rb create mode 100644 ext/fiddle/lib/fiddle/ruby.rb diff --git a/ext/fiddle/extconf.rb b/ext/fiddle/extconf.rb index 2d85b3eea5215f..6b0ea753fc373b 100644 --- a/ext/fiddle/extconf.rb +++ b/ext/fiddle/extconf.rb @@ -1,6 +1,11 @@ # frozen_string_literal: true require 'mkmf' +if RUBY_ENGINE == "jruby" + File.write('Makefile', dummy_makefile("").join) + return +end + # :stopdoc: def gcc? diff --git a/ext/fiddle/fiddle.gemspec b/ext/fiddle/fiddle.gemspec index fc3cbfabc7005a..65de7a30af95fd 100644 --- a/ext/fiddle/fiddle.gemspec +++ b/ext/fiddle/fiddle.gemspec @@ -40,7 +40,9 @@ Gem::Specification.new do |spec| "lib/fiddle/cparser.rb", "lib/fiddle/function.rb", "lib/fiddle/import.rb", + "lib/fiddle/jruby.rb", "lib/fiddle/pack.rb", + "lib/fiddle/ruby.rb", "lib/fiddle/struct.rb", "lib/fiddle/types.rb", "lib/fiddle/value.rb", diff --git a/ext/fiddle/lib/fiddle.rb b/ext/fiddle/lib/fiddle.rb index 6137c487c67887..b1c6cd08bf6c41 100644 --- a/ext/fiddle/lib/fiddle.rb +++ b/ext/fiddle/lib/fiddle.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -require 'fiddle.so' +require "fiddle/#{RUBY_ENGINE}" require 'fiddle/closure' require 'fiddle/function' require 'fiddle/version' @@ -10,36 +10,63 @@ module Fiddle # Returns the last win32 +Error+ of the current executing +Thread+ or nil # if none def self.win32_last_error - Thread.current[:__FIDDLE_WIN32_LAST_ERROR__] + if RUBY_ENGINE == 'jruby' + errno = FFI.errno + errno == 0 ? nil : errno + else + Thread.current[:__FIDDLE_WIN32_LAST_ERROR__] + end end # Sets the last win32 +Error+ of the current executing +Thread+ to +error+ def self.win32_last_error= error - Thread.current[:__FIDDLE_WIN32_LAST_ERROR__] = error + if RUBY_ENGINE == 'jruby' + FFI.errno = error || 0 + else + Thread.current[:__FIDDLE_WIN32_LAST_ERROR__] = error + end end # Returns the last win32 socket +Error+ of the current executing # +Thread+ or nil if none def self.win32_last_socket_error - Thread.current[:__FIDDLE_WIN32_LAST_SOCKET_ERROR__] + if RUBY_ENGINE == 'jruby' + errno = FFI.errno + errno == 0 ? nil : errno + else + Thread.current[:__FIDDLE_WIN32_LAST_SOCKET_ERROR__] + end end # Sets the last win32 socket +Error+ of the current executing # +Thread+ to +error+ def self.win32_last_socket_error= error - Thread.current[:__FIDDLE_WIN32_LAST_SOCKET_ERROR__] = error + if RUBY_ENGINE == 'jruby' + FFI.errno = error || 0 + else + Thread.current[:__FIDDLE_WIN32_LAST_SOCKET_ERROR__] = error + end end end # Returns the last +Error+ of the current executing +Thread+ or nil if none def self.last_error - Thread.current[:__FIDDLE_LAST_ERROR__] + if RUBY_ENGINE == 'jruby' + errno = FFI.errno + errno == 0 ? nil : errno + else + Thread.current[:__FIDDLE_LAST_ERROR__] + end end # Sets the last +Error+ of the current executing +Thread+ to +error+ def self.last_error= error - Thread.current[:__DL2_LAST_ERROR__] = error - Thread.current[:__FIDDLE_LAST_ERROR__] = error + if RUBY_ENGINE == 'jruby' + FFI.errno = error || 0 + else + Thread.current[:__DL2_LAST_ERROR__] = error + Thread.current[:__FIDDLE_LAST_ERROR__] = error + end end # call-seq: dlopen(library) => Fiddle::Handle diff --git a/ext/fiddle/lib/fiddle/jruby.rb b/ext/fiddle/lib/fiddle/jruby.rb new file mode 100644 index 00000000000000..9ad61d4d9d1d5b --- /dev/null +++ b/ext/fiddle/lib/fiddle/jruby.rb @@ -0,0 +1,600 @@ +# This is part of JRuby's FFI-based fiddle implementation. + +require 'ffi' + +module Fiddle + def self.malloc(size) + Fiddle::Pointer.malloc(size) + end + + def self.free(ptr) + Fiddle::Pointer::LibC::FREE.call(ptr) + nil + end + + def self.dlwrap(val) + Pointer.to_ptr(val) + end + + module Types + VOID = 0 + VOIDP = 1 + CHAR = 2 + UCHAR = -CHAR + SHORT = 3 + USHORT = -SHORT + INT = 4 + UINT = -INT + LONG = 5 + ULONG = -LONG + LONG_LONG = 6 + ULONG_LONG = -LONG_LONG + FLOAT = 7 + DOUBLE = 8 + VARIADIC = 9 + CONST_STRING = 10 + BOOL = 11 + INT8_T = CHAR + UINT8_T = UCHAR + if FFI::Type::Builtin::SHORT.size == 2 + INT16_T = SHORT + UINT16_T = USHORT + elsif FFI::Type::Builtin::INT.size == 2 + INT16_T = INT + UINT16_T = UINT + end + if FFI::Type::Builtin::SHORT.size == 4 + INT32_T = SHORT + UINT32_T = USHORT + elsif FFI::Type::Builtin::INT.size == 4 + INT32_T = INT + UINT32_T = UINT + elsif FFI::Type::Builtin::LONG.size == 4 + INT32_T = LONG + UINT32_T = ULONG + end + if FFI::Type::Builtin::INT.size == 8 + INT64_T = INT + UINT64_T = UINT + elsif FFI::Type::Builtin::LONG.size == 8 + INT64_T = LONG + UINT64_T = ULONG + else + INT64_T = LONG_LONG + UINT64_T = ULONG_LONG + end + + # FIXME: platform specific values + SSIZE_T = INT64_T + SIZE_T = -SSIZE_T + PTRDIFF_T = SSIZE_T + INTPTR_T = INT64_T + UINTPTR_T = -INTPTR_T + end + + WINDOWS = FFI::Platform.windows? + + module JRuby + FFITypes = { + 'c' => FFI::Type::INT8, + 'h' => FFI::Type::INT16, + 'i' => FFI::Type::INT32, + 'l' => FFI::Type::LONG, + 'f' => FFI::Type::FLOAT32, + 'd' => FFI::Type::FLOAT64, + 'p' => FFI::Type::POINTER, + 's' => FFI::Type::STRING, + + Types::VOID => FFI::Type::Builtin::VOID, + Types::VOIDP => FFI::Type::Builtin::POINTER, + Types::CHAR => FFI::Type::Builtin::CHAR, + Types::UCHAR => FFI::Type::Builtin::UCHAR, + Types::SHORT => FFI::Type::Builtin::SHORT, + Types::USHORT => FFI::Type::Builtin::USHORT, + Types::INT => FFI::Type::Builtin::INT, + Types::UINT => FFI::Type::Builtin::UINT, + Types::LONG => FFI::Type::Builtin::LONG, + Types::ULONG => FFI::Type::Builtin::ULONG, + Types::LONG_LONG => FFI::Type::Builtin::LONG_LONG, + Types::ULONG_LONG => FFI::Type::Builtin::ULONG_LONG, + Types::FLOAT => FFI::Type::Builtin::FLOAT, + Types::DOUBLE => FFI::Type::Builtin::DOUBLE, + Types::BOOL => FFI::Type::Builtin::BOOL, + Types::CONST_STRING => FFI::Type::Builtin::POINTER, + Types::VARIADIC => FFI::Type::Builtin::VARARGS, + } + + def self.__ffi_type__(dl_type) + if dl_type.is_a?(Symbol) + dl_type = Types.const_get(dl_type.to_s.upcase) + end + if !dl_type.is_a?(Integer) && dl_type.respond_to?(:to_int) + dl_type = dl_type.to_int + end + ffi_type = FFITypes[dl_type] + ffi_type = FFITypes[-dl_type] if ffi_type.nil? && dl_type.is_a?(Integer) && dl_type < 0 + raise TypeError.new("cannot convert #{dl_type} to ffi") unless ffi_type + ffi_type + end + end + + class Function + DEFAULT = "default" + STDCALL = "stdcall" + + def initialize(ptr, args, return_type, abi = DEFAULT, kwargs = nil) + if kwargs.nil? + if abi.kind_of? Hash + kwargs = abi + abi = DEFAULT + end + end + @name = kwargs[:name] if kwargs.kind_of? Hash + @ptr, @args, @return_type, @abi = ptr, args, return_type, abi + raise TypeError.new "invalid argument types" unless args.is_a?(Array) + + ffi_return_type = Fiddle::JRuby::__ffi_type__(@return_type) + ffi_args = @args.map { |t| Fiddle::JRuby.__ffi_type__(t) } + pointer = FFI::Pointer.new(ptr.to_i) + options = {convention: @abi} + if ffi_args.last == FFI::Type::Builtin::VARARGS + @function = FFI::VariadicInvoker.new( + pointer, + ffi_args, + ffi_return_type, + options + ) + else + @function = FFI::Function.new(ffi_return_type, ffi_args, pointer, options) + end + end + + def call(*args, &block); + if @function.is_a?(FFI::VariadicInvoker) + n_fixed_args = @args.size - 1 + n_fixed_args.step(args.size - 1, 2) do |i| + if args[i] == :const_string || args[i] == Types::CONST_STRING + args[i + 1] = String.try_convert(args[i + 1]) || args[i + 1] + end + args[i] = Fiddle::JRuby.__ffi_type__(args[i]) + end + end + result = @function.call(*args, &block) + result = Pointer.new(result) if result.is_a?(FFI::Pointer) + result + end + end + + class Closure + def initialize(ret, args, abi = Function::DEFAULT) + raise TypeError.new "invalid argument types" unless args.is_a?(Array) + + @ctype, @args = ret, args + ffi_args = @args.map { |t| Fiddle::JRuby.__ffi_type__(t) } + if ffi_args.size == 1 && ffi_args[0] == FFI::Type::Builtin::VOID + ffi_args = [] + end + @function = FFI::Function.new( + Fiddle::JRuby.__ffi_type__(@ctype), + ffi_args, + self, + :convention => abi + ) + @freed = false + end + + def to_i + @function.to_i + end + + def free + return if @freed + @function.free + @freed = true + end + + def freed? + @freed + end + end + + class Error < StandardError; end + class DLError < Error; end + class ClearedReferenceError < Error; end + + class Pointer + attr_reader :ffi_ptr + extend FFI::DataConverter + native_type FFI::Type::Builtin::POINTER + + def self.to_native(value, ctx) + if value.is_a?(Pointer) + value.ffi_ptr + + elsif value.is_a?(Integer) + FFI::Pointer.new(value) + + elsif value.is_a?(String) + value + end + end + + def self.from_native(value, ctx) + self.new(value) + end + + def self.to_ptr(value) + if value.is_a?(String) + cptr = Pointer.malloc(value.bytesize) + cptr.ffi_ptr.put_string(0, value) + cptr + + elsif value.is_a?(Array) + raise NotImplementedError, "array ptr" + + elsif value.respond_to?(:to_ptr) + ptr = value.to_ptr + case ptr + when Pointer + ptr + when FFI::Pointer + Pointer.new(ptr) + else + raise DLError.new("to_ptr should return a Fiddle::Pointer object, was #{ptr.class}") + end + + else + Pointer.new(value) + end + end + + class << self + alias [] to_ptr + end + + def []=(*args, value) + if args.size == 2 + if value.is_a?(Integer) + value = self.class.new(value) + end + if value.is_a?(Fiddle::Pointer) + value = value.to_str(args[1]) + end + + @ffi_ptr.put_bytes(args[0], value, 0, args[1]) + elsif args.size == 1 + if value.is_a?(Fiddle::Pointer) + value = value.to_str(args[0] + 1) + else + value = value.chr + end + + @ffi_ptr.put_bytes(args[0], value, 0, 1) + end + rescue FFI::NullPointerError + raise DLError.new("NULL pointer access") + end + + def initialize(addr, size = nil, free = nil) + ptr = if addr.is_a?(FFI::Pointer) + addr + + elsif addr.is_a?(Integer) + FFI::Pointer.new(addr) + + elsif addr.respond_to?(:to_ptr) + fiddle_ptr = addr.to_ptr + if fiddle_ptr.is_a?(Pointer) + fiddle_ptr.ffi_ptr + elsif fiddle_ptr.is_a?(FFI::AutoPointer) + addr.ffi_ptr + elsif fiddle_ptr.is_a?(FFI::Pointer) + fiddle_ptr + else + raise DLError.new("to_ptr should return a Fiddle::Pointer object, was #{fiddle_ptr.class}") + end + elsif addr.is_a?(IO) + raise NotImplementedError, "IO ptr isn't supported" + end + + @size = size ? size : ptr.size + @free = free + @ffi_ptr = ptr + @freed = false + end + + module LibC + extend FFI::Library + ffi_lib FFI::Library::LIBC + MALLOC = attach_function :malloc, [ :size_t ], :pointer + REALLOC = attach_function :realloc, [ :pointer, :size_t ], :pointer + FREE = attach_function :free, [ :pointer ], :void + end + + def self.malloc(size, free = nil) + if block_given? and free.nil? + message = "a free function must be supplied to #{self}.malloc " + + "when it is called with a block" + raise ArgumentError, message + end + + pointer = new(LibC.malloc(size), size, free) + if block_given? + begin + yield(pointer) + ensure + pointer.call_free + end + else + pointer + end + end + + def null? + @ffi_ptr.null? + end + + def to_ptr + @ffi_ptr + end + + def size + defined?(@layout) ? @layout.size : @size + end + + def free + @free + end + + def free=(free) + @free = free + end + + def call_free + return if @free.nil? + return if @freed + if @free == RUBY_FREE + LibC::FREE.call(@ffi_ptr) + else + @free.call(@ffi_ptr) + end + @freed = true + end + + def freed? + @freed + end + + def size=(size) + @size = size + end + + def [](index, length = nil) + if length + ffi_ptr.get_bytes(index, length) + else + ffi_ptr.get_char(index) + end + rescue FFI::NullPointerError + raise DLError.new("NULL pointer dereference") + end + + def to_i + ffi_ptr.to_i + end + alias to_int to_i + + # without \0 + def to_s(len = nil) + if len + ffi_ptr.get_string(0, len) + else + ffi_ptr.get_string(0) + end + rescue FFI::NullPointerError + raise DLError.new("NULL pointer access") + end + + def to_str(len = nil) + if len + ffi_ptr.read_string(len) + else + ffi_ptr.read_string(@size) + end + rescue FFI::NullPointerError + raise DLError.new("NULL pointer access") + end + + def to_value + raise NotImplementedError, "to_value isn't supported" + end + + def inspect + "#<#{self.class.name} ptr=#{to_i.to_s(16)} size=#{@size} free=#{@free.inspect}>" + end + + def +(delta) + self.class.new(to_i + delta, @size - delta) + end + + def -(delta) + self.class.new(to_i - delta, @size + delta) + end + + def <=>(other) + return unless other.is_a?(Pointer) + diff = self.to_i - other.to_i + return 0 if diff == 0 + diff > 0 ? 1 : -1 + end + + def eql?(other) + return unless other.is_a?(Pointer) + self.to_i == other.to_i + end + + def ==(other) + eql?(other) + end + + def ptr + Pointer.new(ffi_ptr.get_pointer(0)) + end + + def +@ + ptr + end + + def -@ + ref + end + + def ref + cptr = Pointer.malloc(FFI::Type::POINTER.size, RUBY_FREE) + cptr.ffi_ptr.put_pointer(0, ffi_ptr) + cptr + end + end + + class Handle + RTLD_GLOBAL = FFI::DynamicLibrary::RTLD_GLOBAL + RTLD_LAZY = FFI::DynamicLibrary::RTLD_LAZY + RTLD_NOW = FFI::DynamicLibrary::RTLD_NOW + + def initialize(libname = nil, flags = RTLD_LAZY | RTLD_GLOBAL) + @lib = FFI::DynamicLibrary.open(libname, flags) rescue LoadError + raise DLError.new("Could not open #{libname}") unless @lib + + @open = true + + begin + yield(self) + ensure + self.close + end if block_given? + end + + def close + raise DLError.new("closed handle") unless @open + @open = false + 0 + end + + def self.sym(func) + DEFAULT.sym(func) + end + + def sym(func) + raise TypeError.new("invalid function name") unless func.is_a?(String) + raise DLError.new("closed handle") unless @open + address = @lib.find_function(func) + raise DLError.new("unknown symbol #{func}") if address.nil? || address.null? + address.to_i + end + + def self.sym_defined?(func) + DEFAULT.sym_defined?(func) + end + + def sym_defined?(func) + raise TypeError.new("invalid function name") unless func.is_a?(String) + raise DLError.new("closed handle") unless @open + address = @lib.find_function(func) + !address.nil? && !address.null? + end + + def self.[](func) + self.sym(func) + end + + def [](func) + sym(func) + end + + def enable_close + @enable_close = true + end + + def close_enabled? + @enable_close + end + + def disable_close + @enable_close = false + end + + DEFAULT = new + end + + class Pinned + def initialize(object) + @object = object + end + + def ref + if @object.nil? + raise ClearedReferenceError, "`ref` called on a cleared object" + end + @object + end + + def clear + @object = nil + end + + def cleared? + @object.nil? + end + end + + RUBY_FREE = Fiddle::Pointer::LibC::FREE.address + NULL = Fiddle::Pointer.new(0) + + ALIGN_VOIDP = Fiddle::JRuby::FFITypes[Types::VOIDP].alignment + ALIGN_CHAR = Fiddle::JRuby::FFITypes[Types::CHAR].alignment + ALIGN_SHORT = Fiddle::JRuby::FFITypes[Types::SHORT].alignment + ALIGN_INT = Fiddle::JRuby::FFITypes[Types::INT].alignment + ALIGN_LONG = Fiddle::JRuby::FFITypes[Types::LONG].alignment + ALIGN_LONG_LONG = Fiddle::JRuby::FFITypes[Types::LONG_LONG].alignment + ALIGN_INT8_T = Fiddle::JRuby::FFITypes[Types::INT8_T].alignment + ALIGN_INT16_T = Fiddle::JRuby::FFITypes[Types::INT16_T].alignment + ALIGN_INT32_T = Fiddle::JRuby::FFITypes[Types::INT32_T].alignment + ALIGN_INT64_T = Fiddle::JRuby::FFITypes[Types::INT64_T].alignment + ALIGN_FLOAT = Fiddle::JRuby::FFITypes[Types::FLOAT].alignment + ALIGN_DOUBLE = Fiddle::JRuby::FFITypes[Types::DOUBLE].alignment + ALIGN_BOOL = Fiddle::JRuby::FFITypes[Types::BOOL].alignment + ALIGN_SIZE_T = Fiddle::JRuby::FFITypes[Types::SIZE_T].alignment + ALIGN_SSIZE_T = ALIGN_SIZE_T + ALIGN_PTRDIFF_T = Fiddle::JRuby::FFITypes[Types::PTRDIFF_T].alignment + ALIGN_INTPTR_T = Fiddle::JRuby::FFITypes[Types::INTPTR_T].alignment + ALIGN_UINTPTR_T = Fiddle::JRuby::FFITypes[Types::UINTPTR_T].alignment + + SIZEOF_VOIDP = Fiddle::JRuby::FFITypes[Types::VOIDP].size + SIZEOF_CHAR = Fiddle::JRuby::FFITypes[Types::CHAR].size + SIZEOF_UCHAR = Fiddle::JRuby::FFITypes[Types::UCHAR].size + SIZEOF_SHORT = Fiddle::JRuby::FFITypes[Types::SHORT].size + SIZEOF_USHORT = Fiddle::JRuby::FFITypes[Types::USHORT].size + SIZEOF_INT = Fiddle::JRuby::FFITypes[Types::INT].size + SIZEOF_UINT = Fiddle::JRuby::FFITypes[Types::UINT].size + SIZEOF_LONG = Fiddle::JRuby::FFITypes[Types::LONG].size + SIZEOF_ULONG = Fiddle::JRuby::FFITypes[Types::ULONG].size + SIZEOF_LONG_LONG = Fiddle::JRuby::FFITypes[Types::LONG_LONG].size + SIZEOF_ULONG_LONG = Fiddle::JRuby::FFITypes[Types::ULONG_LONG].size + SIZEOF_INT8_T = Fiddle::JRuby::FFITypes[Types::INT8_T].size + SIZEOF_UINT8_T = Fiddle::JRuby::FFITypes[Types::UINT8_T].size + SIZEOF_INT16_T = Fiddle::JRuby::FFITypes[Types::INT16_T].size + SIZEOF_UINT16_T = Fiddle::JRuby::FFITypes[Types::UINT16_T].size + SIZEOF_INT32_T = Fiddle::JRuby::FFITypes[Types::INT32_T].size + SIZEOF_UINT32_T = Fiddle::JRuby::FFITypes[Types::UINT32_T].size + SIZEOF_INT64_T = Fiddle::JRuby::FFITypes[Types::INT64_T].size + SIZEOF_UINT64_T = Fiddle::JRuby::FFITypes[Types::UINT64_T].size + SIZEOF_FLOAT = Fiddle::JRuby::FFITypes[Types::FLOAT].size + SIZEOF_DOUBLE = Fiddle::JRuby::FFITypes[Types::DOUBLE].size + SIZEOF_BOOL = Fiddle::JRuby::FFITypes[Types::BOOL].size + SIZEOF_SIZE_T = Fiddle::JRuby::FFITypes[Types::SIZE_T].size + SIZEOF_SSIZE_T = SIZEOF_SIZE_T + SIZEOF_PTRDIFF_T = Fiddle::JRuby::FFITypes[Types::PTRDIFF_T].size + SIZEOF_INTPTR_T = Fiddle::JRuby::FFITypes[Types::INTPTR_T].size + SIZEOF_UINTPTR_T = Fiddle::JRuby::FFITypes[Types::UINTPTR_T].size + SIZEOF_CONST_STRING = Fiddle::JRuby::FFITypes[Types::VOIDP].size +end diff --git a/ext/fiddle/lib/fiddle/pack.rb b/ext/fiddle/lib/fiddle/pack.rb index 81088f402b1c27..b41e36e8e26608 100644 --- a/ext/fiddle/lib/fiddle/pack.rb +++ b/ext/fiddle/lib/fiddle/pack.rb @@ -41,6 +41,12 @@ module PackInfo # :nodoc: all when SIZEOF_LONG PACK_MAP[TYPE_BOOL] = PACK_MAP[TYPE_ULONG] end + if RUBY_ENGINE == "jruby" and WINDOWS and [0].pack("l!").size == 8 + # JRuby's 'l!' pack string doesn't use 32-bit on Windows. + # See https://github.com/jruby/jruby/issues/8357 for details + PACK_MAP[TYPE_LONG] = PACK_MAP[TYPE_INT] + PACK_MAP[TYPE_ULONG] = PACK_MAP[TYPE_UINT] + end SIZE_MAP = { TYPE_VOIDP => SIZEOF_VOIDP, diff --git a/ext/fiddle/lib/fiddle/ruby.rb b/ext/fiddle/lib/fiddle/ruby.rb new file mode 100644 index 00000000000000..ee5a9a937979c6 --- /dev/null +++ b/ext/fiddle/lib/fiddle/ruby.rb @@ -0,0 +1 @@ +require "fiddle.so" diff --git a/ext/fiddle/lib/fiddle/struct.rb b/ext/fiddle/lib/fiddle/struct.rb index 6d05bbd7421c24..e4c2c79ac59b01 100644 --- a/ext/fiddle/lib/fiddle/struct.rb +++ b/ext/fiddle/lib/fiddle/struct.rb @@ -290,15 +290,28 @@ def CStructEntity.alignment(types) # Allocates a C struct with the +types+ provided. # # See Fiddle::Pointer.malloc for memory management issues. - def CStructEntity.malloc(types, func = nil, size = size(types), &block) + def CStructEntity.malloc(types, func = nil, size = size(types)) + if block_given? and func.nil? + message = "a free function must be supplied to #{self}.malloc " + + "when it is called with a block" + raise ArgumentError, message + end + + pointer = Pointer.malloc(size) + begin + struct = new(pointer, types, func) + rescue + pointer.free = func + pointer.call_free + raise + end if block_given? - super(size, func) do |struct| - struct.set_ctypes types - yield struct + begin + yield(struct) + ensure + struct.call_free end else - struct = super(size, func) - struct.set_ctypes types struct end end @@ -505,6 +518,14 @@ def []=(*args) def to_s() # :nodoc: super(@size) end + + def +(delta) + Pointer.new(to_i + delta, @size - delta) + end + + def -(delta) + Pointer.new(to_i - delta, @size + delta) + end end # A pointer to a C union diff --git a/test/fiddle/helper.rb b/test/fiddle/helper.rb index e470f5a2764396..eae39a6efa51b1 100644 --- a/test/fiddle/helper.rb +++ b/test/fiddle/helper.rb @@ -4,11 +4,19 @@ require 'test/unit' require 'fiddle' +puts("Fiddle::VERSION: #{Fiddle::VERSION}") + # FIXME: this is stolen from DL and needs to be refactored. libc_so = libm_so = nil -case RUBY_PLATFORM +if RUBY_ENGINE == "jruby" + # "jruby ... [x86_64-linux]" -> "x86_64-linux" + ruby_platform = RUBY_DESCRIPTION.split(" ").last[1..-2] +else + ruby_platform = RUBY_PLATFORM +end +case ruby_platform when /cygwin/ libc_so = "cygwin1.dll" libm_so = "cygwin1.dll" @@ -147,6 +155,7 @@ end if !libc_so || !libm_so + require "envutil" ruby = EnvUtil.rubybin # When the ruby binary is 32-bit and the host is 64-bit, # `ldd ruby` outputs "not a dynamic executable" message. diff --git a/test/fiddle/test_closure.rb b/test/fiddle/test_closure.rb index abb6bdbd32a90f..787a9b635a37a4 100644 --- a/test/fiddle/test_closure.rb +++ b/test/fiddle/test_closure.rb @@ -8,6 +8,8 @@ module Fiddle class TestClosure < Fiddle::TestCase def teardown super + # We can't use ObjectSpace with JRuby. + return if RUBY_ENGINE == "jruby" # Ensure freeing all closures. # See https://github.com/ruby/fiddle/issues/102#issuecomment-1241763091 . not_freed_closures = [] @@ -31,19 +33,6 @@ def test_argument_errors end end - def test_type_symbol - Closure.create(:int, [:void]) do |closure| - assert_equal([ - TYPE_INT, - [TYPE_VOID], - ], - [ - closure.instance_variable_get(:@ctype), - closure.instance_variable_get(:@args), - ]) - end - end - def test_call closure_class = Class.new(Closure) do def call @@ -69,6 +58,11 @@ def call thing end def test_const_string + if RUBY_ENGINE == "jruby" + omit("Closure with :const_string works but " + + "Function with :const_string doesn't work with JRuby") + end + closure_class = Class.new(Closure) do def call(string) @return_string = "Hello! #{string}" @@ -94,7 +88,12 @@ def call(bool) end def test_free - Closure.create(:int, [:void]) do |closure| + closure_class = Class.new(Closure) do + def call + 10 + end + end + closure_class.create(:int, [:void]) do |closure| assert(!closure.freed?) closure.free assert(closure.freed?) @@ -115,6 +114,10 @@ def test_block_caller end def test_memsize_ruby_dev_42480 + if RUBY_ENGINE == "jruby" + omit("We can't use ObjectSpace with JRuby") + end + require 'objspace' n = 10000 n.times do diff --git a/test/fiddle/test_fiddle.rb b/test/fiddle/test_fiddle.rb index 9bddb056c90c08..b247ae15cb9c84 100644 --- a/test/fiddle/test_fiddle.rb +++ b/test/fiddle/test_fiddle.rb @@ -6,6 +6,10 @@ class TestFiddle < Fiddle::TestCase def test_nil_true_etc + if RUBY_ENGINE == "jruby" + omit("Fiddle::Q* aren't supported with JRuby") + end + assert_equal Fiddle::Qtrue, Fiddle.dlwrap(true) assert_equal Fiddle::Qfalse, Fiddle.dlwrap(false) assert_equal Fiddle::Qnil, Fiddle.dlwrap(nil) diff --git a/test/fiddle/test_func.rb b/test/fiddle/test_func.rb index df79539e76c936..5d69cc5f11ad3d 100644 --- a/test/fiddle/test_func.rb +++ b/test/fiddle/test_func.rb @@ -26,6 +26,10 @@ def test_sin end def test_string + if RUBY_ENGINE == "jruby" + omit("Function that returns string doesn't work with JRuby") + end + under_gc_stress do f = Function.new(@libc['strcpy'], [TYPE_VOIDP, TYPE_VOIDP], TYPE_VOIDP) buff = +"000" @@ -82,6 +86,8 @@ def call(x, y) assert_equal("1349", buff, bug4929) end ensure + # We can't use ObjectSpace with JRuby. + return if RUBY_ENGINE == "jruby" # Ensure freeing all closures. # See https://github.com/ruby/fiddle/issues/102#issuecomment-1241763091 . not_freed_closures = [] @@ -113,37 +119,36 @@ def test_snprintf :variadic, ], :int) - output_buffer = " " * 1024 - output = Pointer[output_buffer] + Pointer.malloc(1024, Fiddle::RUBY_FREE) do |output| + written = snprintf.call(output, + output.size, + "int: %d, string: %.*s, const string: %s\n", + :int, -29, + :int, 4, + :voidp, "Hello", + :const_string, "World") + assert_equal("int: -29, string: Hell, const string: World\n", + output[0, written]) - written = snprintf.call(output, - output.size, - "int: %d, string: %.*s, const string: %s\n", - :int, -29, - :int, 4, - :voidp, "Hello", - :const_string, "World") - assert_equal("int: -29, string: Hell, const string: World\n", - output_buffer[0, written]) - - string_like_class = Class.new do - def initialize(string) - @string = string - end + string_like_class = Class.new do + def initialize(string) + @string = string + end - def to_str - @string + def to_str + @string + end end + written = snprintf.call(output, + output.size, + "string: %.*s, const string: %s, uint: %u\n", + :int, 2, + :voidp, "Hello", + :const_string, string_like_class.new("World"), + :int, 29) + assert_equal("string: He, const string: World, uint: 29\n", + output[0, written]) end - written = snprintf.call(output, - output.size, - "string: %.*s, const string: %s, uint: %u\n", - :int, 2, - :voidp, "Hello", - :const_string, string_like_class.new("World"), - :int, 29) - assert_equal("string: He, const string: World, uint: 29\n", - output_buffer[0, written]) end def test_rb_memory_view_available_p diff --git a/test/fiddle/test_function.rb b/test/fiddle/test_function.rb index 2bd67c9da1cdf7..658874bfb4ff71 100644 --- a/test/fiddle/test_function.rb +++ b/test/fiddle/test_function.rb @@ -16,6 +16,8 @@ def setup end def teardown + # We can't use ObjectSpace with JRuby. + return if RUBY_ENGINE == "jruby" # Ensure freeing all closures. # See https://github.com/ruby/fiddle/issues/102#issuecomment-1241763091 . not_freed_closures = [] @@ -36,6 +38,10 @@ def test_name end def test_need_gvl? + if RUBY_ENGINE == "jruby" + omit("rb_str_dup() doesn't exit in JRuby") + end + libruby = Fiddle.dlopen(nil) rb_str_dup = Function.new(libruby['rb_str_dup'], [:voidp], @@ -103,6 +109,10 @@ def call one end def test_last_error + if RUBY_ENGINE == "jruby" + omit("Fiddle.last_error doesn't work with JRuby") + end + func = Function.new(@libc['strcpy'], [TYPE_VOIDP, TYPE_VOIDP], TYPE_VOIDP) assert_nil Fiddle.last_error @@ -135,6 +145,10 @@ def test_win32_last_socket_error end def test_strcpy + if RUBY_ENGINE == "jruby" + omit("Function that returns string doesn't work with JRuby") + end + f = Function.new(@libc['strcpy'], [TYPE_VOIDP, TYPE_VOIDP], TYPE_VOIDP) buff = +"000" str = f.call(buff, "123") @@ -149,6 +163,10 @@ def call_proc(string_to_copy) end def test_function_as_proc + if RUBY_ENGINE == "jruby" + omit("Function that returns string doesn't work with JRuby") + end + f = Function.new(@libc['strcpy'], [TYPE_VOIDP, TYPE_VOIDP], TYPE_VOIDP) buff, str = call_proc("123", &f) assert_equal("123", buff) @@ -156,6 +174,10 @@ def test_function_as_proc end def test_function_as_method + if RUBY_ENGINE == "jruby" + omit("Function that returns string doesn't work with JRuby") + end + f = Function.new(@libc['strcpy'], [TYPE_VOIDP, TYPE_VOIDP], TYPE_VOIDP) klass = Class.new do define_singleton_method(:strcpy, &f) @@ -194,6 +216,10 @@ def test_nogvl_poll end def test_no_memory_leak + if RUBY_ENGINE == "jruby" + omit("rb_obj_frozen_p() doesn't exist in JRuby") + end + if respond_to?(:assert_nothing_leaked_memory) rb_obj_frozen_p_symbol = Fiddle.dlopen(nil)["rb_obj_frozen_p"] rb_obj_frozen_p = Fiddle::Function.new(rb_obj_frozen_p_symbol, diff --git a/test/fiddle/test_handle.rb b/test/fiddle/test_handle.rb index 042e517e354333..ebd126c94e3a96 100644 --- a/test/fiddle/test_handle.rb +++ b/test/fiddle/test_handle.rb @@ -9,11 +9,19 @@ class TestHandle < TestCase include Fiddle def test_to_i + if RUBY_ENGINE == "jruby" + omit("Fiddle::Handle#to_i is unavailable with JRuby") + end + handle = Fiddle::Handle.new(LIBC_SO) assert_kind_of Integer, handle.to_i end def test_to_ptr + if RUBY_ENGINE == "jruby" + omit("Fiddle::Handle#to_i is unavailable with JRuby") + end + handle = Fiddle::Handle.new(LIBC_SO) ptr = handle.to_ptr assert_equal ptr.to_i, handle.to_i @@ -26,6 +34,10 @@ def test_static_sym_unknown end def test_static_sym + if RUBY_ENGINE == "jruby" + omit("We can't assume static symbols with JRuby") + end + begin # Linux / Darwin / FreeBSD refute_nil Fiddle::Handle.sym('dlopen') @@ -90,6 +102,10 @@ def test_dlopen_returns_handle end def test_initialize_noargs + if RUBY_ENGINE == "jruby" + omit("rb_str_new() doesn't exist in JRuby") + end + handle = Handle.new refute_nil handle['rb_str_new'] end @@ -117,6 +133,10 @@ def test_disable_close end def test_file_name + if RUBY_ENGINE == "jruby" + omit("Fiddle::Handle::NEXT doesn't exist with JRuby") + end + file_name = Handle.new(LIBC_SO).file_name if file_name assert_kind_of String, file_name @@ -135,6 +155,10 @@ def test_file_name end def test_NEXT + if RUBY_ENGINE == "jruby" + omit("Fiddle::Handle::NEXT doesn't exist with JRuby") + end + begin # Linux / Darwin # @@ -173,9 +197,13 @@ def test_NEXT end unless /mswin|mingw/ =~ RUBY_PLATFORM def test_DEFAULT + if Fiddle::WINDOWS + omit("Fiddle::Handle::DEFAULT doesn't have malloc() on Windows") + end + handle = Handle::DEFAULT refute_nil handle['malloc'] - end unless /mswin|mingw/ =~ RUBY_PLATFORM + end def test_dlerror # FreeBSD (at least 7.2 to 7.2) calls nsdispatch(3) when it calls diff --git a/test/fiddle/test_import.rb b/test/fiddle/test_import.rb index 090ace620db863..26190325ecdfeb 100644 --- a/test/fiddle/test_import.rb +++ b/test/fiddle/test_import.rb @@ -149,11 +149,15 @@ def test_type_constants def test_unsigned_result() d = (2 ** 31) + 1 - r = LIBC.strtoul(d.to_s, 0, 0) + r = LIBC.strtoul(d.to_s, nil, 0) assert_equal(d, r) end def test_io() + if RUBY_ENGINE == "jruby" + omit("BUILD_RUBY_PLATFORM doesn't exist in JRuby") + end + if( RUBY_PLATFORM != BUILD_RUBY_PLATFORM ) || !defined?(LIBC.fprintf) return end @@ -329,11 +333,12 @@ def test_struct_nested_struct_replace_array_element_nil() def test_struct_nested_struct_replace_array_element_hash() LIBC::StructNestedStruct.malloc(Fiddle::RUBY_FREE) do |s| + s.vertices[0] = nil s.vertices[0] = { position: { x: 10, y: 100, - } + }, } assert_equal({ "position" => { @@ -450,7 +455,7 @@ def test_struct() s.buff = "012345\377" assert_equal([0,1,2,3,4], s.num) assert_equal(?a.ord, s.c) - assert_equal([?0.ord,?1.ord,?2.ord,?3.ord,?4.ord,?5.ord,?\377.ord], s.buff) + assert_equal([?0.ord,?1.ord,?2.ord,?3.ord,?4.ord,?5.ord,"\xFF".ord], s.buff) end end @@ -467,6 +472,10 @@ def test_gettimeofday() end def test_strcpy() + if RUBY_ENGINE == "jruby" + omit("Function that returns string doesn't work with JRuby") + end + buff = +"000" str = LIBC.strcpy(buff, "123") assert_equal("123", buff) diff --git a/test/fiddle/test_pointer.rb b/test/fiddle/test_pointer.rb index 30236be7f6454b..f17c8338f5e6cc 100644 --- a/test/fiddle/test_pointer.rb +++ b/test/fiddle/test_pointer.rb @@ -11,19 +11,22 @@ def dlwrap arg end def test_can_read_write_memory - # Allocate some memory - address = Fiddle.malloc(Fiddle::SIZEOF_VOIDP) + if RUBY_ENGINE == "jruby" + omit("Fiddle::Pointer.{read,write} don't exist in JRuby") + end - bytes_to_write = Fiddle::SIZEOF_VOIDP.times.to_a.pack("C*") + # Allocate some memory + Fiddle::Pointer.malloc(Fiddle::SIZEOF_VOIDP, Fiddle::RUBY_FREE) do |pointer| + address = pointer.to_i + bytes_to_write = Fiddle::SIZEOF_VOIDP.times.to_a.pack("C*") - # Write to the memory - Fiddle::Pointer.write(address, bytes_to_write) + # Write to the memory + Fiddle::Pointer.write(address, bytes_to_write) - # Read the bytes out again - bytes = Fiddle::Pointer.read(address, Fiddle::SIZEOF_VOIDP) - assert_equal bytes_to_write, bytes - ensure - Fiddle.free address + # Read the bytes out again + bytes = Fiddle::Pointer.read(address, Fiddle::SIZEOF_VOIDP) + assert_equal bytes_to_write, bytes + end end def test_cptr_to_int @@ -110,6 +113,10 @@ def test_plus end def test_inspect + if RUBY_ENGINE == "jruby" + omit("Fiddle::Pointer#inspect is incompatible on JRuby") + end + ptr = Pointer.new(0) inspect = ptr.inspect assert_match(/size=#{ptr.size}/, inspect) @@ -125,6 +132,10 @@ def test_to_ptr_string end def test_to_ptr_io + if RUBY_ENGINE == "jruby" + omit("Fiddle::Pointer.to_ptr(IO) isn't supported with JRuby") + end + Pointer.malloc(10, Fiddle::RUBY_FREE) do |buf| File.open(__FILE__, 'r') do |f| ptr = Pointer.to_ptr f @@ -172,6 +183,10 @@ def test_cmp end def test_ref_ptr + if RUBY_ENGINE == "jruby" + omit("Fiddle.dlwrap([]) isn't supported with JRuby") + end + ary = [0,1,2,4,5] addr = Pointer.new(dlwrap(ary)) assert_equal addr.to_i, addr.ref.ptr.to_i @@ -180,6 +195,10 @@ def test_ref_ptr end def test_to_value + if RUBY_ENGINE == "jruby" + omit("Fiddle.dlwrap([]) isn't supported with JRuby") + end + ary = [0,1,2,4,5] addr = Pointer.new(dlwrap(ary)) assert_equal ary, addr.to_value From d7fc90d21378fb94c743f302cf068b218ca71680 Mon Sep 17 00:00:00 2001 From: Sutou Kouhei Date: Mon, 7 Oct 2024 16:30:55 +0900 Subject: [PATCH 818/829] [ruby/fiddle] test jruby: fix a typo https://github.com/ruby/fiddle/commit/5bc55e0533 --- test/fiddle/test_function.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/fiddle/test_function.rb b/test/fiddle/test_function.rb index 658874bfb4ff71..b6ae8c14bcb514 100644 --- a/test/fiddle/test_function.rb +++ b/test/fiddle/test_function.rb @@ -39,7 +39,7 @@ def test_name def test_need_gvl? if RUBY_ENGINE == "jruby" - omit("rb_str_dup() doesn't exit in JRuby") + omit("rb_str_dup() doesn't exist in JRuby") end libruby = Fiddle.dlopen(nil) From da3c4087235d883ce3265b274a695baf3809768f Mon Sep 17 00:00:00 2001 From: Sutou Kouhei Date: Mon, 7 Oct 2024 16:31:05 +0900 Subject: [PATCH 819/829] [ruby/fiddle] test jruby: fix a wrong message https://github.com/ruby/fiddle/commit/00b3521f5e --- test/fiddle/test_handle.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/fiddle/test_handle.rb b/test/fiddle/test_handle.rb index ebd126c94e3a96..fedb557e90c6fa 100644 --- a/test/fiddle/test_handle.rb +++ b/test/fiddle/test_handle.rb @@ -134,7 +134,7 @@ def test_disable_close def test_file_name if RUBY_ENGINE == "jruby" - omit("Fiddle::Handle::NEXT doesn't exist with JRuby") + omit("Fiddle::Handle#file_name doesn't exist in JRuby") end file_name = Handle.new(LIBC_SO).file_name From f1a94a497b8491b41a3d058557ea10995c10f71a Mon Sep 17 00:00:00 2001 From: Sutou Kouhei Date: Mon, 7 Oct 2024 16:31:17 +0900 Subject: [PATCH 820/829] [ruby/fiddle] test jruby: fix a typo https://github.com/ruby/fiddle/commit/d76c87b804 --- test/fiddle/test_handle.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/fiddle/test_handle.rb b/test/fiddle/test_handle.rb index fedb557e90c6fa..c952a7ef17f80c 100644 --- a/test/fiddle/test_handle.rb +++ b/test/fiddle/test_handle.rb @@ -156,7 +156,7 @@ def test_file_name def test_NEXT if RUBY_ENGINE == "jruby" - omit("Fiddle::Handle::NEXT doesn't exist with JRuby") + omit("Fiddle::Handle::NEXT doesn't exist in JRuby") end begin From 133bacc0dcf4261ac3ebe0de5f367c88a51ce2f0 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Thu, 10 Oct 2024 10:54:26 +0900 Subject: [PATCH 821/829] Rename win32-sspi to net-http-sspi --- NEWS.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NEWS.md b/NEWS.md index 481bb7548f1427..89aad671870881 100644 --- a/NEWS.md +++ b/NEWS.md @@ -72,7 +72,7 @@ The following default gem is added. * win32/sspi.rb - * This library is now extracted from the Ruby repository to [ruby/win32-sspi]. + * This library is now extracted from the Ruby repository to [ruby/net-http-sspi]. [[Feature #20775]] The following default gems are updated. @@ -136,7 +136,7 @@ The following bundled gem is added. See GitHub releases like [GitHub Releases of Logger] or changelog for details of the default gems or bundled gems. -[ruby/win32-sspi]: https://github.com/ruby/win32-sspi +[ruby/net-http-sspi]: https://github.com/ruby/net-http-sspi [GitHub Releases of Logger]: https://github.com/ruby/logger/releases ## Supported platforms From 6f6735898aefd73089247c625ce221350afb39b6 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Thu, 10 Oct 2024 11:29:57 +0900 Subject: [PATCH 822/829] Cast via `uintptr_t` function pointer between object pointer --- .../load/resolve_symbol_resolver/resolve_symbol_resolver.c | 7 ++++--- vm_insnhelper.c | 6 ++++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/ext/-test-/load/resolve_symbol_resolver/resolve_symbol_resolver.c b/ext/-test-/load/resolve_symbol_resolver/resolve_symbol_resolver.c index a856319cfb652c..6cc07cc1f84b14 100644 --- a/ext/-test-/load/resolve_symbol_resolver/resolve_symbol_resolver.c +++ b/ext/-test-/load/resolve_symbol_resolver/resolve_symbol_resolver.c @@ -5,6 +5,7 @@ typedef VALUE(*target_func)(VALUE); static target_func rst_any_method; +#define resolve_func(file, name) (target_func)(uintptr_t)rb_ext_resolve_symbol(file, name) VALUE rsr_any_method(VALUE klass) { @@ -15,7 +16,7 @@ VALUE rsr_try_resolve_fname(VALUE klass) { target_func rst_something_missing = - (target_func) rb_ext_resolve_symbol("-test-/load/resolve_symbol_missing", "rst_any_method"); + resolve_func("-test-/load/resolve_symbol_missing", "rst_any_method"); if (rst_something_missing == NULL) { // This should be done in Init_*, so the error is LoadError rb_raise(rb_eLoadError, "symbol not found: missing fname"); @@ -27,7 +28,7 @@ VALUE rsr_try_resolve_sname(VALUE klass) { target_func rst_something_missing = - (target_func)rb_ext_resolve_symbol("-test-/load/resolve_symbol_target", "rst_something_missing"); + resolve_func("-test-/load/resolve_symbol_target", "rst_something_missing"); if (rst_something_missing == NULL) { // This should be done in Init_*, so the error is LoadError rb_raise(rb_eLoadError, "symbol not found: missing sname"); @@ -43,7 +44,7 @@ Init_resolve_symbol_resolver(void) * If the module and methods are defined before raising LoadError, retrying `require "this.so"` will * cause re-defining those methods (and will be warned). */ - rst_any_method = (target_func)rb_ext_resolve_symbol("-test-/load/resolve_symbol_target", "rst_any_method"); + rst_any_method = resolve_func("-test-/load/resolve_symbol_target", "rst_any_method"); if (rst_any_method == NULL) { rb_raise(rb_eLoadError, "resolve_symbol_target is not loaded"); } diff --git a/vm_insnhelper.c b/vm_insnhelper.c index d1c4d1ef46e0d1..695332272743b6 100644 --- a/vm_insnhelper.c +++ b/vm_insnhelper.c @@ -3023,7 +3023,8 @@ vm_call_single_noarg_leaf_builtin(rb_execution_context_t *ec, rb_control_frame_t { const struct rb_builtin_function *bf = calling->cc->aux_.bf; cfp->sp -= (calling->argc + 1); - return builtin_invoker0(ec, calling->recv, NULL, (rb_insn_func_t)bf->func_ptr); + rb_insn_func_t func_ptr = (rb_insn_func_t)(uintptr_t)bf->func_ptr; + return builtin_invoker0(ec, calling->recv, NULL, func_ptr); } VALUE rb_gen_method_name(VALUE owner, VALUE name); // in vm_backtrace.c @@ -7325,7 +7326,8 @@ invoke_bf(rb_execution_context_t *ec, rb_control_frame_t *reg_cfp, const struct { const bool canary_p = ISEQ_BODY(reg_cfp->iseq)->builtin_attrs & BUILTIN_ATTR_LEAF; // Verify an assumption of `Primitive.attr! :leaf` SETUP_CANARY(canary_p); - VALUE ret = (*lookup_builtin_invoker(bf->argc))(ec, reg_cfp->self, argv, (rb_insn_func_t)bf->func_ptr); + rb_insn_func_t func_ptr = (rb_insn_func_t)(uintptr_t)bf->func_ptr; + VALUE ret = (*lookup_builtin_invoker(bf->argc))(ec, reg_cfp->self, argv, func_ptr); CHECK_CANARY(canary_p, BIN(invokebuiltin)); return ret; } From 51fdd2c6ca1c96740cb202770c559acb791b3f12 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Thu, 10 Oct 2024 11:30:37 +0900 Subject: [PATCH 823/829] Move directives outside `rb_ary_new3` call MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This function may be a macro for optimization, which will be expanded to `rb_ary_new_from_values`. ``` ext/socket/ancdata.c: In function ‘bsock_recvmsg_internal’: ext/socket/ancdata.c:1648:1: error: embedding a directive within macro arguments is not portable 1648 | #if defined(HAVE_STRUCT_MSGHDR_MSG_CONTROL) | ^ ext/socket/ancdata.c:1650:1: error: embedding a directive within macro arguments is not portable 1650 | #else | ^ ext/socket/ancdata.c:1652:1: error: embedding a directive within macro arguments is not portable 1652 | #endif | ^ ``` --- ext/socket/ancdata.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ext/socket/ancdata.c b/ext/socket/ancdata.c index 6ef040b692f338..f1e9e425248d3e 100644 --- a/ext/socket/ancdata.c +++ b/ext/socket/ancdata.c @@ -1643,14 +1643,14 @@ bsock_recvmsg_internal(VALUE sock, rb_obj_reveal(dat_str, rb_cString); } - ret = rb_ary_new3(3, dat_str, - rsock_io_socket_addrinfo(sock, mh.msg_name, mh.msg_namelen), #if defined(HAVE_STRUCT_MSGHDR_MSG_CONTROL) - INT2NUM(mh.msg_flags) + VALUE msg_flags = INT2NUM(mh.msg_flags); #else - Qnil + VALUE msg_flags = Qnil; #endif - ); + ret = rb_ary_new3(3, dat_str, + rsock_io_socket_addrinfo(sock, mh.msg_name, mh.msg_namelen), + msg_flags); #if defined(HAVE_STRUCT_MSGHDR_MSG_CONTROL) family = rsock_getfamily(fptr); From a985695b9e7f58552cfa6b8700c4dabc137e41e8 Mon Sep 17 00:00:00 2001 From: Yusuke Endoh Date: Thu, 10 Oct 2024 11:48:06 +0900 Subject: [PATCH 824/829] Make test_hash_symbol_colon_key pass on LANG=en_US It failed on a platform with LANG=en_US ``` 1) Failure: PPTestModule::PPSingleLineTest#test_hash_symbol_colon_key [/home/chkbuild/chkbuild/tmp/build/20241010T010005Z/ruby/test/test_pp.rb:207]: <"{a: 1, a!: 1, a?: 1, \u3042: 1}"> expected but was <"{a: 1, a!: 1, a?: 1, \"\\u3042\": 1}">. ``` --- test/test_pp.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/test_pp.rb b/test/test_pp.rb index 57a38768547939..e650fca4bc6026 100644 --- a/test/test_pp.rb +++ b/test/test_pp.rb @@ -199,12 +199,14 @@ def test_hash def test_hash_symbol_colon_key omit if RUBY_VERSION < "3.4." - no_quote = "{a: 1, a!: 1, a?: 1, \u{3042}: 1}" + no_quote = "{a: 1, a!: 1, a?: 1}" + unicode_quote = "{\u{3042}: 1}" quote0 = '{"": 1}' quote1 = '{"0": 1, "!": 1, "%": 1, "&": 1, "*": 1, "+": 1, "-": 1, "/": 1, "<": 1, ">": 1, "^": 1, "`": 1, "|": 1, "~": 1}' quote2 = '{"@a": 1, "$a": 1, "+@": 1, "a=": 1, "[]": 1}' quote3 = '{"a\"b": 1, "@@a": 1, "<=>": 1, "===": 1, "[]=": 1}' assert_equal(no_quote, PP.singleline_pp(eval(no_quote), ''.dup)) + assert_equal({ "\u3042": 1 }.inspect, PP.singleline_pp(eval(unicode_quote), ''.dup)) assert_equal(quote0, PP.singleline_pp(eval(quote0), ''.dup)) assert_equal(quote1, PP.singleline_pp(eval(quote1), ''.dup)) assert_equal(quote2, PP.singleline_pp(eval(quote2), ''.dup)) From 5792bd7149a30f7f43a739199d84603cc579f4e5 Mon Sep 17 00:00:00 2001 From: Thomas Marshall Date: Tue, 8 Oct 2024 17:30:51 +0100 Subject: [PATCH 825/829] Emit warning for other method redefinition types MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit ensures warnings about `object_id` and `__send__` method redefinitions are emitted for other method types such as aliases, procs, and attr readers—anything except C functions. --- test/ruby/test_object.rb | 31 +++++++++++++++++++++++-------- vm_method.c | 2 +- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/test/ruby/test_object.rb b/test/ruby/test_object.rb index 37c09596a2346f..3afad0ef4356dd 100644 --- a/test/ruby/test_object.rb +++ b/test/ruby/test_object.rb @@ -480,15 +480,30 @@ def o.foo; 2; end end def test_redefine_method_which_may_case_serious_problem - assert_in_out_err([], <<-INPUT, [], %r"warning: redefining 'object_id' may cause serious problems$") - $VERBOSE = false - def (Object.new).object_id; end - INPUT + %w(object_id __send__).each do |m| + assert_in_out_err([], <<-INPUT, [], %r"warning: redefining '#{m}' may cause serious problems$") + $VERBOSE = false + def (Object.new).#{m}; end + INPUT - assert_in_out_err([], <<-INPUT, [], %r"warning: redefining '__send__' may cause serious problems$") - $VERBOSE = false - def (Object.new).__send__; end - INPUT + assert_in_out_err([], <<-INPUT, [], %r"warning: redefining '#{m}' may cause serious problems$") + $VERBOSE = false + Class.new.define_method(:#{m}) {} + INPUT + + assert_in_out_err([], <<-INPUT, [], %r"warning: redefining '#{m}' may cause serious problems$") + $VERBOSE = false + Class.new.attr_reader(:#{m}) + INPUT + + assert_in_out_err([], <<-INPUT, [], %r"warning: redefining '#{m}' may cause serious problems$") + $VERBOSE = false + Class.new do + def foo; end + alias #{m} foo + end + INPUT + end bug10421 = '[ruby-dev:48691] [Bug #10421]' assert_in_out_err([], <<-INPUT, ["1"], [], bug10421) diff --git a/vm_method.c b/vm_method.c index 4eb074bbd81c53..e436538f566b57 100644 --- a/vm_method.c +++ b/vm_method.c @@ -1062,7 +1062,7 @@ rb_method_entry_make(VALUE klass, ID mid, VALUE defined_class, rb_method_visibil } /* check mid */ if (mid == object_id || mid == id__send__) { - if (type == VM_METHOD_TYPE_ISEQ && search_method(klass, mid, 0)) { + if (type != VM_METHOD_TYPE_CFUNC && search_method(klass, mid, 0)) { rb_warn("redefining '%s' may cause serious problems", rb_id2name(mid)); } } From a1db8dbe166d82d7238b3d375344799e057dab2b Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Thu, 10 Oct 2024 13:20:45 +0900 Subject: [PATCH 826/829] Commented out to print fiddle version --- test/fiddle/helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/fiddle/helper.rb b/test/fiddle/helper.rb index eae39a6efa51b1..037768cdb42f26 100644 --- a/test/fiddle/helper.rb +++ b/test/fiddle/helper.rb @@ -4,7 +4,7 @@ require 'test/unit' require 'fiddle' -puts("Fiddle::VERSION: #{Fiddle::VERSION}") +# puts("Fiddle::VERSION: #{Fiddle::VERSION}") # FIXME: this is stolen from DL and needs to be refactored. From e00b746b7578ed7b2f168cb7bc867ef3c8cbca69 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Thu, 10 Oct 2024 13:23:07 +0900 Subject: [PATCH 827/829] Suppress warnings with `RUBYPOT=-w` ``` -:3: warning: assigned but unused variable - var -:3: warning: assigned but unused variable - var -:3: warning: assigned but unused variable - var -:3: warning: assigned but unused variable - var -:3: warning: assigned but unused variable - var -:3: warning: assigned but unused variable - var ``` --- test/ruby/test_syntax.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/ruby/test_syntax.rb b/test/ruby/test_syntax.rb index 811a21937e0422..7a6c66d7824d41 100644 --- a/test/ruby/test_syntax.rb +++ b/test/ruby/test_syntax.rb @@ -2248,11 +2248,11 @@ def test_defined_in_short_circuit_if_condition conds.each do |cond| code = %Q{ def my_method - var = nil + var = "there" if #{cond} - "here" + var = "here" end - raise + raise var end begin my_method From c77f0b91342935f661c6e5ba0f6f5c19427da174 Mon Sep 17 00:00:00 2001 From: Yuta Saito Date: Wed, 9 Oct 2024 21:46:15 +0900 Subject: [PATCH 828/829] [Bug #20631] Workaround for macOS 15.0 fork crash macOS 15.0 24A5331b seems to have a weird issue that `CFStringCreateWithBytesNoCopy` does not return `NSTaggedPointerString` instance for the first call. This issue is fixed in macOS 15.1 but we need to workaround it for macOS 15.0. --- file.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/file.c b/file.c index 8edb0a3284669d..585dd906658690 100644 --- a/file.c +++ b/file.c @@ -310,8 +310,16 @@ rb_CFString_class_initialize_before_fork(void) const char small_str[] = "/"; long len = sizeof(small_str) - 1; CFStringRef s; - CFMutableStringRef m = mutable_CFString_new(&s, small_str, len); - mutable_CFString_release(m, s); + /* + * Touch `CFStringCreateWithBytesNoCopy` *twice* because the implementation + * shipped with macOS 15.0 24A5331b does not return `NSTaggedPointerString` + * instance for the first call (totally not sure why). CoreFoundation + * shipped with macOS 15.1 does not have this issue. + */ + for (int i = 0; i < 2; i++) { + CFMutableStringRef m = mutable_CFString_new(&s, small_str, len); + mutable_CFString_release(m, s); + } } # endif /* HAVE_WORKING_FORK */ From 63f94e12fb371fdba41a8233e56f752a1a579c5e Mon Sep 17 00:00:00 2001 From: Yuta Saito Date: Thu, 10 Oct 2024 13:01:33 +0900 Subject: [PATCH 829/829] Revert "TestProcess#test_daemon_noclose is only working with macOS 15.1 beta, we should skip with macOS 15.0" This reverts commit 3830bca5edd6964131971866c80107c89fac5362. --- test/ruby/test_process.rb | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/ruby/test_process.rb b/test/ruby/test_process.rb index e055cb9db88428..6e8ba484a49ac9 100644 --- a/test/ruby/test_process.rb +++ b/test/ruby/test_process.rb @@ -1874,8 +1874,6 @@ def test_daemon_default end def test_daemon_noclose - pend "macOS 15.0 is not working with this test" if macos?(15, 0) - data = IO.popen("-", "r+") do |f| break f.read if f Process.daemon(false, true)